示例#1
0
def gen_enantio_and_correlate(xcc,
                              symbols,
                              masses=None,
                              fconnect=1.3,
                              pp=False):
    # generate list of masses
    if masses is None: masses = fncs.symbols2masses(symbols)
    # xcc1: center and reorient
    xcc1 = center_and_orient(xcc, None, None, masses)[0]
    # xcc2: xcc for enantiomer
    xcc2 = generate_enantio(xcc1)
    xcc2 = center_and_orient(xcc2, None, None, masses)[0]
    # correlate enantiomer
    dcorr = correlate_enantio(xcc1, xcc2, symbols, fconnect=fconnect, pp=pp)
    # non-assigned?
    if get_not_assigned(dcorr) != 0: return None
    # Generate xcc for enantiomer
    try:
        xcc_enantio = [0.0 for ii in range(len(xcc))]
        for node2, node1 in dcorr.items():
            xcc_enantio[3 * node1:3 * node1 + 3] = xcc2[3 * node2:3 * node2 +
                                                        3]
        return xcc_enantio
    except:
        return None
示例#2
0
def correlate(symbols_t,xcc_t,symbols_0,xcc_0,fconnect=1.3):
    '''
    reference geometry: symbols_0,xcc_0
    target    geometry: symbols_t,xcc_t
    '''
    # prepare reference geometry
    masses_0 = fncs.symbols2masses(symbols_0)
    xcc_0    = center_and_orient(xcc_0,None,None,masses_0)[0]
    # prepare target geometry
    masses_t = fncs.symbols2masses(symbols_t)
    xcc_t    = center_and_orient(xcc_t,None,None,masses_t)[0]
    # correlate enantiomer
    dcorr = correlate_xccs(xcc_t,symbols_t,xcc_0,symbols_0,fconnect=fconnect,pp=False)
    # non-assigned?
    if get_num_of_not_assigned(dcorr) != 0: return None
    # Re-order xcc_t
    symbols,xcc = reorder_xcc(symbols_t,xcc_t,dcorr)
    return symbols,xcc
示例#3
0
    def setup(self, mu=1.0 / AMU, projgrad=False):
        self._mu = mu
        # derivated magnitudes (again, in case sth was modified)
        # for example, when set from gts and masses are added latter
        self.genderivates()
        # shift to center of mass and reorientate molecule
        idata = (self._xcc, self._gcc, self._Fcc, self._masses)
        self._xcc, self._gcc, self._Fcc = fncs.center_and_orient(*idata)
        # symmetry
        self.calc_pgroup(force=False)
        # Generate mass-scaled arrays
        self._xms = fncs.cc2ms_x(self._xcc, self._masses, self._mu)
        self._gms = fncs.cc2ms_g(self._gcc, self._masses, self._mu)
        self._Fms = fncs.cc2ms_F(self._Fcc, self._masses, self._mu)
        #-------------#
        # Atomic case #
        #-------------#
        if self._natoms == 1:
            self._nvdof = 0
            self._linear = False
            #self._xms      = list(self._xcc)
            #self._gms      = list(self._gcc)
            #self._Fms      = list(self._Fcc)
            self._ccfreqs = []
            self._ccFevals = []
            self._ccFevecs = []
        #----------------#
        # Molecular case #
        #----------------#
        else:
            # Calculate inertia
            self._itensor = fncs.get_itensor_matrix(self._xcc, self._masses)
            self._imoms, self._rotTs, self._rtype, self._linear = \
                    fncs.get_itensor_evals(self._itensor)
            # Vibrational degrees of freedom
            if self._linear: self._nvdof = 3 * self._natoms - 5
            else: self._nvdof = 3 * self._natoms - 6
            # calculate frequencies
            if self._Fcc is None: return
            if len(self._Fcc) == 0: return
            if self._ccfreqs is not None: return

            v0 = self._gms if projgrad else None
            data = fncs.calc_ccfreqs(self._Fcc,
                                     self._masses,
                                     self._xcc,
                                     self._mu,
                                     v0=v0)
            self._ccfreqs, self._ccFevals, self._ccFevecs = data
            # Scale frequencies
            self._ccfreqs = fncs.scale_freqs(self._ccfreqs, self._fscal)