def __init__(self, mol, intor, prescreen='CVHFnoscreen', qcondname=None): intor = ascint3(intor) self._this = ctypes.POINTER(_vhf._CVHFOpt)() #print self._this.contents, expect ValueError: NULL pointer access self._intor = intor c_atm = numpy.asarray(mol._atm, dtype=numpy.int32, order='C') c_bas = numpy.asarray(mol._bas, dtype=numpy.int32, order='C') c_env = numpy.asarray(mol._env, dtype=numpy.double, order='C') natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) self._cintopt = make_cintopt(c_atm, c_bas, c_env, intor) libao2mo.CVHFinit_optimizer(ctypes.byref(self._this), c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) self._this.contents.fprescreen = _fpointer(prescreen) if prescreen != 'CVHFnoscreen' and intor in ('int2e_sph', 'int2e_cart'): # for int2e_sph, qcondname is 'CVHFsetnr_direct_scf' ao_loc = make_loc(c_bas, self._intor) fsetqcond = getattr(libao2mo, qcondname) fsetqcond(self._this, getattr(libao2mo, intor), self._cintopt, ao_loc.ctypes.data_as(ctypes.c_void_p), c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p))
def __init__(self, mol, intor, prescreen='CVHFnoscreen', qcondname=None): intor = ascint3(intor) self._this = ctypes.POINTER(_vhf._CVHFOpt)() #print self._this.contents, expect ValueError: NULL pointer access self._intor = intor c_atm = numpy.asarray(mol._atm, dtype=numpy.int32, order='C') c_bas = numpy.asarray(mol._bas, dtype=numpy.int32, order='C') c_env = numpy.asarray(mol._env, dtype=numpy.double, order='C') natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) self._cintopt = make_cintopt(c_atm, c_bas, c_env, intor) libao2mo.CVHFinit_optimizer(ctypes.byref(self._this), c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) self._this.contents.fprescreen = _fpointer(prescreen) if prescreen != 'CVHFnoscreen' and intor in ('int2e_sph', 'int2e_cart'): # for int2e_sph, qcondname is 'CVHFsetnr_direct_scf' ao_loc = make_loc(c_bas, intor) fsetqcond = getattr(libao2mo, qcondname) fsetqcond(self._this, getattr(libao2mo, intor), self._cintopt, ao_loc.ctypes.data_as(ctypes.c_void_p), c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p))
def r_e1(intor, mo_coeff, orbs_slice, sh_range, atm, bas, env, tao, aosym='s1', comp=1, ao2mopt=None, out=None): assert(aosym in ('s4', 's2ij', 's2kl', 's1', 'a2ij', 'a2kl', 'a4ij', 'a4kl', 'a4')) intor = ascint3(intor) mo_coeff = numpy.asfortranarray(mo_coeff) i0, i1, j0, j1 = orbs_slice icount = i1 - i0 jcount = j1 - j0 ij_count = icount * jcount c_atm = numpy.asarray(atm, dtype=numpy.int32) c_bas = numpy.asarray(bas, dtype=numpy.int32) c_env = numpy.asarray(env) natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) klsh0, klsh1, nkl = sh_range if icount <= jcount: fmmm = _fpointer('AO2MOmmm_r_iltj') else: fmmm = _fpointer('AO2MOmmm_r_igtj') if out is None: out = numpy.empty((comp,nkl,ij_count), dtype=numpy.complex) else: out = numpy.ndarray((comp,nkl,nao_pair), dtype=numpy.complex, buffer=out) if out.size == 0: return out if ao2mopt is not None: cao2mopt = ao2mopt._this cintopt = ao2mopt._cintopt cintor = ao2mopt._intor else: cao2mopt = lib.c_null_ptr() cintor = _fpointer(intor) cintopt = make_cintopt(c_atm, c_bas, c_env, intor) tao = numpy.asarray(tao, dtype=numpy.int32) ao_loc = make_loc(bas, 'spinor') fdrv = getattr(libao2mo, 'AO2MOr_e1_drv') fill = _fpointer('AO2MOfill_r_' + aosym) ftrans = _fpointer('AO2MOtranse1_r_' + aosym) fdrv(cintor, fill, ftrans, fmmm, out.ctypes.data_as(ctypes.c_void_p), mo_coeff.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(klsh0), ctypes.c_int(klsh1-klsh0), ctypes.c_int(nkl), ctypes.c_int(comp), (ctypes.c_int*4)(*orbs_slice), tao.ctypes.data_as(ctypes.c_void_p), ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, cao2mopt, c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) return out
def r_e1(intor, mo_coeff, orbs_slice, sh_range, atm, bas, env, tao, aosym='s1', comp=1, ao2mopt=None, out=None): assert(aosym in ('s4', 's2ij', 's2kl', 's1', 'a2ij', 'a2kl', 'a4ij', 'a4kl', 'a4')) intor = ascint3(intor) mo_coeff = numpy.asfortranarray(mo_coeff) i0, i1, j0, j1 = orbs_slice icount = i1 - i0 jcount = j1 - j0 ij_count = icount * jcount c_atm = numpy.asarray(atm, dtype=numpy.int32) c_bas = numpy.asarray(bas, dtype=numpy.int32) c_env = numpy.asarray(env) natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) klsh0, klsh1, nkl = sh_range if icount <= jcount: fmmm = _fpointer('AO2MOmmm_r_iltj') else: fmmm = _fpointer('AO2MOmmm_r_igtj') out = numpy.ndarray((comp,nkl,ij_count), dtype=numpy.complex, buffer=out) if out.size == 0: return out if ao2mopt is not None: cao2mopt = ao2mopt._this cintopt = ao2mopt._cintopt intor = ao2mopt._intor else: cao2mopt = lib.c_null_ptr() cintopt = make_cintopt(c_atm, c_bas, c_env, intor) cintor = _fpointer(intor) tao = numpy.asarray(tao, dtype=numpy.int32) ao_loc = make_loc(bas, 'spinor') fdrv = getattr(libao2mo, 'AO2MOr_e1_drv') fill = _fpointer('AO2MOfill_r_' + aosym) ftrans = _fpointer('AO2MOtranse1_r_' + aosym) fdrv(cintor, fill, ftrans, fmmm, out.ctypes.data_as(ctypes.c_void_p), mo_coeff.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(klsh0), ctypes.c_int(klsh1-klsh0), ctypes.c_int(nkl), ctypes.c_int(comp), (ctypes.c_int*4)(*orbs_slice), tao.ctypes.data_as(ctypes.c_void_p), ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, cao2mopt, c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) return out
def __init__(self, mol, intor, prescreen='CVHFnoscreen', qcondname=None, dmcondname=None): intor = ascint3(intor) self._this = ctypes.POINTER(_CVHFOpt)() #print self._this.contents, expect ValueError: NULL pointer access self._intor = intor self._cintopt = pyscf.lib.c_null_ptr() self._dmcondname = dmcondname self.init_cvhf_direct(mol, intor, prescreen, qcondname)
def nr_e1fill(intor, sh_range, atm, bas, env, aosym='s1', comp=1, ao2mopt=None, out=None): assert (aosym in ('s4', 's2ij', 's2kl', 's1')) intor = ascint3(intor) c_atm = numpy.asarray(atm, dtype=numpy.int32, order='C') c_bas = numpy.asarray(bas, dtype=numpy.int32, order='C') c_env = numpy.asarray(env, order='C') natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) ao_loc = make_loc(bas, intor) nao = ao_loc[-1] klsh0, klsh1, nkl = sh_range if aosym in ('s4', 's2ij'): nao_pair = nao * (nao + 1) // 2 else: nao_pair = nao * nao if out is None: out = numpy.empty((comp, nkl, nao_pair)) else: out = numpy.ndarray((comp, nkl, nao_pair), buffer=out) if out.size == 0: return out if ao2mopt is not None: cao2mopt = ao2mopt._this cintopt = ao2mopt._cintopt intor = ao2mopt._intor else: cao2mopt = lib.c_null_ptr() cintopt = make_cintopt(c_atm, c_bas, c_env, intor) cintor = _fpointer(intor) fdrv = getattr(libao2mo, 'AO2MOnr_e1fill_drv') fill = _fpointer('AO2MOfill_nr_' + aosym) fdrv(cintor, fill, out.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(klsh0), ctypes.c_int(klsh1 - klsh0), ctypes.c_int(nkl), ctypes.c_int(comp), ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, cao2mopt, c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) return out
def nr_e1fill(intor, sh_range, atm, bas, env, aosym='s1', comp=1, ao2mopt=None, out=None): assert(aosym in ('s4', 's2ij', 's2kl', 's1')) intor = ascint3(intor) c_atm = numpy.asarray(atm, dtype=numpy.int32, order='C') c_bas = numpy.asarray(bas, dtype=numpy.int32, order='C') c_env = numpy.asarray(env, order='C') natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) ao_loc = make_loc(bas, intor) nao = ao_loc[-1] klsh0, klsh1, nkl = sh_range if aosym in ('s4', 's2ij'): nao_pair = nao * (nao+1) // 2 else: nao_pair = nao * nao out = numpy.ndarray((comp,nkl,nao_pair), buffer=out) if out.size == 0: return out if ao2mopt is not None: cao2mopt = ao2mopt._this cintopt = ao2mopt._cintopt intor = ao2mopt._intor else: cao2mopt = lib.c_null_ptr() cintopt = make_cintopt(c_atm, c_bas, c_env, intor) cintor = _fpointer(intor) fdrv = getattr(libao2mo, 'AO2MOnr_e1fill_drv') fill = _fpointer('AO2MOfill_nr_' + aosym) fdrv(cintor, fill, out.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(klsh0), ctypes.c_int(klsh1-klsh0), ctypes.c_int(nkl), ctypes.c_int(comp), ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, cao2mopt, c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) return out
def rdirect_bindm(intor, aosym, jkdescript, dms, ncomp, atm, bas, env, vhfopt=None, shls_slice=None): assert (aosym in ('s8', 's4', 's2ij', 's2kl', 's1', 'a4ij', 'a4kl', 'a2ij', 'a2kl')) intor = ascint3(intor) c_atm = numpy.asarray(atm, dtype=numpy.int32, order='C') c_bas = numpy.asarray(bas, dtype=numpy.int32, order='C') c_env = numpy.asarray(env, dtype=numpy.double, order='C') natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) if isinstance(dms, numpy.ndarray) and dms.ndim == 2: n_dm = 1 nao = dms.shape[0] dms = (numpy.asarray(dms, order='C', dtype=numpy.complex128), ) else: n_dm = len(dms) nao = dms[0].shape[0] dms = numpy.asarray(dms, order='C', dtype=numpy.complex128) if isinstance(jkdescript, str): njk = 1 jkdescript = (jkdescript, ) else: njk = len(jkdescript) assert (njk == n_dm) if vhfopt is None: cintor = _fpointer(intor) cintopt = make_cintopt(c_atm, c_bas, c_env, intor) cvhfopt = pyscf.lib.c_null_ptr() else: vhfopt.set_dm(dms, atm, bas, env) cvhfopt = vhfopt._this cintopt = vhfopt._cintopt cintor = getattr(libcvhf, vhfopt._intor) fdrv = getattr(libcvhf, 'CVHFr_direct_drv') dotsym = _INTSYMAP[aosym] fdot = _fpointer('CVHFdot_r' + dotsym) if shls_slice is None: shls_slice = (0, c_bas.shape[0]) * 4 else: raise NotImplementedError ao_loc = make_loc(bas, intor) unpackas = _INTUNPACKMAP_R[aosym] descr_sym = [x.split('->') for x in jkdescript] fjk = (ctypes.c_void_p * (n_dm))() dm1 = (ctypes.c_void_p * (n_dm))() for i, (dmsym, vsym) in enumerate(descr_sym): f1 = _fpointer('CVHFr%s_%s_%s' % (unpackas, dmsym, vsym)) dm1[i] = dms[i].ctypes.data_as(ctypes.c_void_p) fjk[i] = f1 vjk = numpy.empty((njk, ncomp, nao, nao), dtype=numpy.complex) fdrv(cintor, fdot, fjk, dm1, vjk.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(n_dm), ctypes.c_int(ncomp), (ctypes.c_int * 8)(*shls_slice), ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, cvhfopt, c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) if ncomp == 1: vjk = vjk.reshape(njk, nao, nao) if njk == 1: vjk = vjk.reshape(vjk.shape[1:]) return vjk
def direct_bindm(intor, aosym, jkdescript, dms, ncomp, atm, bas, env, vhfopt=None, shls_slice=None): assert (aosym in ('s8', 's4', 's2ij', 's2kl', 's1', 'aa4', 'a4ij', 'a4kl', 'a2ij', 'a2kl')) intor = ascint3(intor) c_atm = numpy.asarray(atm, dtype=numpy.int32, order='C') c_bas = numpy.asarray(bas, dtype=numpy.int32, order='C') c_env = numpy.asarray(env, dtype=numpy.double, order='C') natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) if isinstance(dms, numpy.ndarray) and dms.ndim == 2: n_dm = 1 nao = dms.shape[0] dms = (numpy.asarray(dms, order='C'), ) else: n_dm = len(dms) nao = dms[0].shape[0] dms = [numpy.asarray(dm, order='C') for dm in dms] if isinstance(jkdescript, str): njk = 1 jkdescript = (jkdescript, ) else: njk = len(jkdescript) assert (njk == n_dm) if vhfopt is None: cintor = _fpointer(intor) cintopt = make_cintopt(c_atm, c_bas, c_env, intor) cvhfopt = pyscf.lib.c_null_ptr() else: vhfopt.set_dm(dms, atm, bas, env) cvhfopt = vhfopt._this cintopt = vhfopt._cintopt cintor = getattr(libcvhf, vhfopt._intor) fdrv = getattr(libcvhf, 'CVHFnr_direct_drv') dotsym = _INTSYMAP[aosym] fdot = _fpointer('CVHFdot_nr' + dotsym) if shls_slice is None: shls_slice = (0, c_bas.shape[0]) * 4 ao_loc = make_loc(bas, intor) vjk = [] descr_sym = [x.split('->') for x in jkdescript] fjk = (ctypes.c_void_p * (n_dm))() dmsptr = (ctypes.c_void_p * (n_dm))() vjkptr = (ctypes.c_void_p * (n_dm))() for i, (dmsym, vsym) in enumerate(descr_sym): if dmsym in ('ij', 'kl', 'il', 'kj'): sys.stderr.write( 'not support DM description %s, transpose to %s\n' % (dmsym, dmsym[::-1])) dmsym = dmsym[::-1] f1 = _fpointer('CVHFnr%s_%s_%s' % (aosym, dmsym, vsym)) assert (dms[i].shape == get_dims(dmsym, shls_slice, ao_loc)) vshape = (ncomp, ) + get_dims(vsym[-2:], shls_slice, ao_loc) vjk.append(numpy.empty(vshape)) dmsptr[i] = dms[i].ctypes.data_as(ctypes.c_void_p) vjkptr[i] = vjk[i].ctypes.data_as(ctypes.c_void_p) fjk[i] = f1 shls_slice = (ctypes.c_int * 8)(*shls_slice) fdrv(cintor, fdot, fjk, dmsptr, vjkptr, ctypes.c_int(n_dm), ctypes.c_int(ncomp), shls_slice, ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, cvhfopt, c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) if ncomp == 1: vjk = [v.reshape(v.shape[1:]) for v in vjk] if njk == 1: vjk = vjk[0] return vjk
def intor_cross(intor, cell1, cell2, comp=1, hermi=0, kpts=None, kpt=None): r'''1-electron integrals from two cells like .. math:: \langle \mu | intor | \nu \rangle, \mu \in cell1, \nu \in cell2 ''' intor = moleintor.ascint3(intor) if kpts is None: if kpt is not None: kpts_lst = np.reshape(kpt, (1, 3)) else: kpts_lst = np.zeros((1, 3)) else: kpts_lst = np.reshape(kpts, (-1, 3)) nkpts = len(kpts_lst) atm, bas, env = conc_env(cell1._atm, cell1._bas, cell1._env, cell2._atm, cell2._bas, cell2._env) atm = np.asarray(atm, dtype=np.int32) bas = np.asarray(bas, dtype=np.int32) env = np.asarray(env, dtype=np.double) natm = len(atm) nbas = len(bas) shls_slice = (0, cell1.nbas, cell1.nbas, nbas) ao_loc = moleintor.make_loc(bas, intor) ni = ao_loc[shls_slice[1]] - ao_loc[shls_slice[0]] nj = ao_loc[shls_slice[3]] - ao_loc[shls_slice[2]] out = np.empty((nkpts, comp, ni, nj), dtype=np.complex128) if hermi == 0: aosym = 's1' else: aosym = 's2' fill = getattr(libpbc, 'PBCnr2c_fill_k' + aosym) fintor = getattr(moleintor.libcgto, intor) intopt = lib.c_null_ptr() Ls = cell1.get_lattice_Ls(rcut=max(cell1.rcut, cell2.rcut)) expkL = np.asarray(np.exp(1j * np.dot(kpts_lst, Ls.T)), order='C') drv = libpbc.PBCnr2c_drv drv(fintor, fill, out.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(nkpts), ctypes.c_int(comp), ctypes.c_int(len(Ls)), Ls.ctypes.data_as(ctypes.c_void_p), expkL.ctypes.data_as(ctypes.c_void_p), (ctypes.c_int * 4)(*(shls_slice[:4])), ao_loc.ctypes.data_as(ctypes.c_void_p), intopt, atm.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(natm), bas.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(nbas), env.ctypes.data_as(ctypes.c_void_p)) mat = [] for k, kpt in enumerate(kpts_lst): v = out[k] if hermi != 0: for ic in range(comp): lib.hermi_triu(v[ic], hermi=hermi, inplace=True) if comp == 1: v = v[0] if abs(kpt).sum() < 1e-9: # gamma_point v = v.real mat.append(v) if kpts is None or np.shape(kpts) == (3, ): # A single k-point mat = mat[0] return mat
def direct_bindm(intor, aosym, jkdescript, dms, ncomp, atm, bas, env, vhfopt=None, cintopt=None, shls_slice=None): assert (aosym in ('s8', 's4', 's2ij', 's2kl', 's1', 'aa4', 'a4ij', 'a4kl', 'a2ij', 'a2kl')) intor = ascint3(intor) c_atm = numpy.asarray(atm, dtype=numpy.int32, order='C') c_bas = numpy.asarray(bas, dtype=numpy.int32, order='C') c_env = numpy.asarray(env, dtype=numpy.double, order='C') natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) if isinstance(dms, numpy.ndarray) and dms.ndim == 2: dms = dms[numpy.newaxis, :, :] n_dm = len(dms) nao = dms[0].shape[0] dms = [numpy.asarray(dm, order='C') for dm in dms] if isinstance(jkdescript, str): jkdescripts = (jkdescript, ) else: jkdescripts = jkdescript njk = len(jkdescripts) assert (njk == n_dm) if vhfopt is None: cintor = _fpointer(intor) cvhfopt = lib.c_null_ptr() else: vhfopt.set_dm(dms, atm, bas, env) cvhfopt = vhfopt._this cintopt = vhfopt._cintopt cintor = getattr(libcvhf, vhfopt._intor) if cintopt is None: cintopt = make_cintopt(c_atm, c_bas, c_env, intor) fdrv = getattr(libcvhf, 'CVHFnr_direct_drv') dotsym = _INTSYMAP[aosym] fdot = _fpointer('CVHFdot_nr' + dotsym) if shls_slice is None: shls_slice = (0, c_bas.shape[0]) * 4 ao_loc = make_loc(bas, intor) vjk = [] descr_sym = [x.split('->') for x in jkdescripts] fjk = (ctypes.c_void_p * (n_dm))() dmsptr = (ctypes.c_void_p * (n_dm))() vjkptr = (ctypes.c_void_p * (n_dm))() for i, (dmsym, vsym) in enumerate(descr_sym): f1 = _fpointer('CVHFnr%s_%s_%s' % (aosym, dmsym, vsym)) if dms[i].shape != get_dims(dmsym, shls_slice, ao_loc): raise RuntimeError( 'dm[%d] shape %s is inconsistent with the ' 'shls_slice shape %s' % (i, dms[i].shape, get_dims(dmsym, shls_slice, ao_loc))) vshape = (ncomp, ) + get_dims(vsym[-2:], shls_slice, ao_loc) vjk.append(numpy.empty(vshape)) dmsptr[i] = dms[i].ctypes.data_as(ctypes.c_void_p) vjkptr[i] = vjk[i].ctypes.data_as(ctypes.c_void_p) fjk[i] = f1 shls_slice = (ctypes.c_int * 8)(*shls_slice) fdrv(cintor, fdot, fjk, dmsptr, vjkptr, ctypes.c_int(n_dm), ctypes.c_int(ncomp), shls_slice, ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, cvhfopt, c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) if ncomp == 1: vjk = [v.reshape(v.shape[1:]) for v in vjk] if isinstance(jkdescript, str): vjk = vjk[0] return vjk
def rdirect_bindm(intor, aosym, jkdescript, dms, ncomp, atm, bas, env, vhfopt=None, cintopt=None, shls_slice=None): assert(aosym in ('s8', 's4', 's2ij', 's2kl', 's1', 'a4ij', 'a4kl', 'a2ij', 'a2kl')) intor = ascint3(intor) c_atm = numpy.asarray(atm, dtype=numpy.int32, order='C') c_bas = numpy.asarray(bas, dtype=numpy.int32, order='C') c_env = numpy.asarray(env, dtype=numpy.double, order='C') natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) if isinstance(dms, numpy.ndarray) and dms.ndim == 2: dms = dms[numpy.newaxis,:,:] n_dm = len(dms) nao = dms[0].shape[0] dms = numpy.asarray(dms, order='C', dtype=numpy.complex128) if isinstance(jkdescript, str): jkdescript = (jkdescript,) njk = len(jkdescript) assert(njk == n_dm) if vhfopt is None: cintor = _fpointer(intor) cvhfopt = lib.c_null_ptr() else: vhfopt.set_dm(dms, atm, bas, env) cvhfopt = vhfopt._this cintopt = vhfopt._cintopt cintor = getattr(libcvhf, vhfopt._intor) if cintopt is None: cintopt = make_cintopt(c_atm, c_bas, c_env, intor) fdrv = getattr(libcvhf, 'CVHFr_direct_drv') dotsym = _INTSYMAP[aosym] fdot = _fpointer('CVHFdot_r'+dotsym) if shls_slice is None: shls_slice = (0, c_bas.shape[0])*4 else: raise NotImplementedError ao_loc = make_loc(bas, intor) unpackas = _INTUNPACKMAP_R[aosym] descr_sym = [x.split('->') for x in jkdescript] fjk = (ctypes.c_void_p*(n_dm))() dm1 = (ctypes.c_void_p*(n_dm))() for i, (dmsym, vsym) in enumerate(descr_sym): f1 = _fpointer('CVHFr%s_%s_%s'%(unpackas, dmsym, vsym)) dm1[i] = dms[i].ctypes.data_as(ctypes.c_void_p) fjk[i] = f1 vjk = numpy.empty((njk,ncomp,nao,nao), dtype=numpy.complex) fdrv(cintor, fdot, fjk, dm1, vjk.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(n_dm), ctypes.c_int(ncomp), (ctypes.c_int*8)(*shls_slice), ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, cvhfopt, c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) if ncomp == 1: vjk = vjk.reshape(njk,nao,nao) if njk == 1: vjk = vjk.reshape(vjk.shape[1:]) return vjk
def direct_bindm(intor, aosym, jkdescript, dms, ncomp, atm, bas, env, vhfopt=None, cintopt=None, shls_slice=None): assert(aosym in ('s8', 's4', 's2ij', 's2kl', 's1', 'aa4', 'a4ij', 'a4kl', 'a2ij', 'a2kl')) intor = ascint3(intor) c_atm = numpy.asarray(atm, dtype=numpy.int32, order='C') c_bas = numpy.asarray(bas, dtype=numpy.int32, order='C') c_env = numpy.asarray(env, dtype=numpy.double, order='C') natm = ctypes.c_int(c_atm.shape[0]) nbas = ctypes.c_int(c_bas.shape[0]) if isinstance(dms, numpy.ndarray) and dms.ndim == 2: dms = dms[numpy.newaxis,:,:] n_dm = len(dms) nao = dms[0].shape[0] dms = [numpy.asarray(dm, order='C') for dm in dms] if isinstance(jkdescript, str): jkdescripts = (jkdescript,) else: jkdescripts = jkdescript njk = len(jkdescripts) assert(njk == n_dm) if vhfopt is None: cintor = _fpointer(intor) cvhfopt = lib.c_null_ptr() else: vhfopt.set_dm(dms, atm, bas, env) cvhfopt = vhfopt._this cintopt = vhfopt._cintopt cintor = getattr(libcvhf, vhfopt._intor) if cintopt is None: cintopt = make_cintopt(c_atm, c_bas, c_env, intor) fdrv = getattr(libcvhf, 'CVHFnr_direct_drv') dotsym = _INTSYMAP[aosym] fdot = _fpointer('CVHFdot_nr'+dotsym) if shls_slice is None: shls_slice = (0, c_bas.shape[0])*4 ao_loc = make_loc(bas, intor) vjk = [] descr_sym = [x.split('->') for x in jkdescripts] fjk = (ctypes.c_void_p*(n_dm))() dmsptr = (ctypes.c_void_p*(n_dm))() vjkptr = (ctypes.c_void_p*(n_dm))() for i, (dmsym, vsym) in enumerate(descr_sym): f1 = _fpointer('CVHFnr%s_%s_%s'%(aosym, dmsym, vsym)) assert(dms[i].shape == get_dims(dmsym, shls_slice, ao_loc)) vshape = (ncomp,) + get_dims(vsym[-2:], shls_slice, ao_loc) vjk.append(numpy.empty(vshape)) dmsptr[i] = dms[i].ctypes.data_as(ctypes.c_void_p) vjkptr[i] = vjk[i].ctypes.data_as(ctypes.c_void_p) fjk[i] = f1 shls_slice = (ctypes.c_int*8)(*shls_slice) fdrv(cintor, fdot, fjk, dmsptr, vjkptr, ctypes.c_int(n_dm), ctypes.c_int(ncomp), shls_slice, ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, cvhfopt, c_atm.ctypes.data_as(ctypes.c_void_p), natm, c_bas.ctypes.data_as(ctypes.c_void_p), nbas, c_env.ctypes.data_as(ctypes.c_void_p)) if ncomp == 1: vjk = [v.reshape(v.shape[1:]) for v in vjk] if isinstance(jkdescript, str): vjk = vjk[0] return vjk