def half_e1(mol, mo_coeffs, swapfile, intor='int2e_spinor', aosym='s4', comp=None, max_memory=MAX_MEMORY, ioblk_size=IOBLK_SIZE, verbose=logger.WARN, ao2mopt=None): time0 = (time.clock(), time.time()) log = logger.new_logger(mol, verbose) ijsame = iden_coeffs(mo_coeffs[0], mo_coeffs[1]) nmoi = mo_coeffs[0].shape[1] nmoj = mo_coeffs[1].shape[1] nao = mo_coeffs[0].shape[0] aosym = outcore._stand_sym_code(aosym) if aosym in ('s1', 's2kl', 'a2kl'): nao_pair = nao * nao else: nao_pair = _count_naopair(mol, nao) nij_pair = nmoi * nmoj if ijsame and aosym in ('s4', 's2ij', 'a2ij', 'a4ij', 'a4kl', 'a4'): log.debug('i-mo == j-mo') moij = numpy.asarray(mo_coeffs[0], order='F') ijshape = (0, nmoi, 0, nmoi) else: moij = numpy.asarray(numpy.hstack((mo_coeffs[0],mo_coeffs[1])), order='F') ijshape = (0, nmoi, nmoi, nmoi+nmoj) e1buflen, mem_words, iobuf_words, ioblk_words = \ guess_e1bufsize(max_memory, ioblk_size, nij_pair, nao_pair, comp) # The buffer to hold AO integrals in C code aobuflen = int((mem_words - iobuf_words) // (nao*nao*comp)) shranges = outcore.guess_shell_ranges(mol, (aosym not in ('s1', 's2ij', 'a2ij')), aobuflen, e1buflen, mol.ao_loc_2c(), False) if ao2mopt is None: # if intor == 'int2e_spinor': # ao2mopt = _ao2mo.AO2MOpt(mol, intor, 'CVHFnr_schwarz_cond', # 'CVHFsetnr_direct_scf') # elif intor == 'int2e_spsp1_spinor': # elif intor == 'int2e_spsp1spsp2_spinor': # else: # ao2mopt = _ao2mo.AO2MOpt(mol, intor) ao2mopt = _ao2mo.AO2MOpt(mol, intor) log.debug('step1: tmpfile %.8g MB', nij_pair*nao_pair*16/1e6) log.debug('step1: (ij,kl) = (%d,%d), mem cache %.8g MB, iobuf %.8g MB', nij_pair, nao_pair, mem_words*16/1e6, iobuf_words*16/1e6) fswap = h5py.File(swapfile, 'w') for icomp in range(comp): g = fswap.create_group(str(icomp)) # for h5py old version tao = numpy.asarray(mol.tmap(), dtype=numpy.int32) # transform e1 ti0 = log.timer('Initializing ao2mo.outcore.half_e1', *time0) nstep = len(shranges) for istep,sh_range in enumerate(shranges): log.debug('step 1 [%d/%d], AO [%d:%d], len(buf) = %d', \ istep+1, nstep, *(sh_range[:3])) buflen = sh_range[2] iobuf = numpy.empty((comp,buflen,nij_pair), dtype=numpy.complex) nmic = len(sh_range[3]) p0 = 0 for imic, aoshs in enumerate(sh_range[3]): log.debug1(' fill iobuf micro [%d/%d], AO [%d:%d], len(aobuf) = %d', \ imic+1, nmic, *aoshs) buf = _ao2mo.r_e1(intor, moij, ijshape, aoshs, mol._atm, mol._bas, mol._env, tao, aosym, comp, ao2mopt) iobuf[:,p0:p0+aoshs[2]] = buf p0 += aoshs[2] ti2 = log.timer('gen AO/transform MO [%d/%d]'%(istep+1,nstep), *ti0) e2buflen, chunks = guess_e2bufsize(ioblk_size, nij_pair, buflen) for icomp in range(comp): dset = fswap.create_dataset('%d/%d'%(icomp,istep), (nij_pair,iobuf.shape[1]), 'c16', chunks=None) for col0, col1 in prange(0, nij_pair, e2buflen): dset[col0:col1] = lib.transpose(iobuf[icomp,:,col0:col1]) ti0 = log.timer('transposing to disk', *ti2) fswap.close() return swapfile
def half_e1(mol, mo_coeffs, swapfile, intor='cint2e', aosym='s4', comp=1, max_memory=4000, ioblk_size=256, verbose=logger.WARN, ao2mopt=None): time0 = (time.clock(), time.time()) if isinstance(verbose, logger.Logger): log = verbose else: log = logger.Logger(mol.stdout, verbose) ijsame = iden_coeffs(mo_coeffs[0], mo_coeffs[1]) nmoi = mo_coeffs[0].shape[1] nmoj = mo_coeffs[1].shape[1] nao = mo_coeffs[0].shape[0] aosym = _stand_sym_code(aosym) if aosym in ('s1', 's2kl', 'a2kl'): nao_pair = nao * nao else: nao_pair = guess_nao_pair(mol, nao) nij_pair = nmoi * nmoj if ijsame and aosym in ('s4', 's2ij', 'a2ij', 'a4ij', 'a4kl', 'a4'): log.debug('i-mo == j-mo') moij = numpy.asarray(mo_coeffs[0], order='F') ijshape = (0, nmoi, 0, nmoi) else: moij = numpy.asarray(numpy.hstack((mo_coeffs[0],mo_coeffs[1])), order='F') ijshape = (0, nmoi, nmoi, nmoi+nmoj) e1buflen, mem_words, iobuf_words, ioblk_words = \ guess_e1bufsize(max_memory, ioblk_size, nij_pair, nao_pair, comp) # The buffer to hold AO integrals in C code aobuflen = int((mem_words - iobuf_words) // (nao*nao*comp)) shranges = outcore.guess_shell_ranges(mol, (aosym not in ('s1', 's2kl', 'a2kl')), aobuflen, e1buflen, mol.ao_loc_2c(), False) if ao2mopt is None: # if intor == 'cint2e': # ao2mopt = _ao2mo.AO2MOpt(mol, intor, 'CVHFnr_schwarz_cond', # 'CVHFsetnr_direct_scf') # elif intor == 'cint2e_spsp1': # elif intor == 'cint2e_spsp1spsp2': # else: # ao2mopt = _ao2mo.AO2MOpt(mol, intor) ao2mopt = _ao2mo.AO2MOpt(mol, intor) log.debug('step1: tmpfile %.8g MB', nij_pair*nao_pair*16/1e6) log.debug('step1: (ij,kl) = (%d,%d), mem cache %.8g MB, iobuf %.8g MB', nij_pair, nao_pair, mem_words*16/1e6, iobuf_words*16/1e6) fswap = h5py.File(swapfile, 'w') for icomp in range(comp): g = fswap.create_group(str(icomp)) # for h5py old version tao = numpy.asarray(mol.tmap(), dtype=numpy.int32) # transform e1 ti0 = log.timer('Initializing ao2mo.outcore.half_e1', *time0) nstep = len(shranges) for istep,sh_range in enumerate(shranges): log.debug('step 1 [%d/%d], AO [%d:%d], len(buf) = %d', \ istep+1, nstep, *(sh_range[:3])) buflen = sh_range[2] iobuf = numpy.empty((comp,buflen,nij_pair), dtype=numpy.complex) nmic = len(sh_range[3]) p0 = 0 for imic, aoshs in enumerate(sh_range[3]): log.debug1(' fill iobuf micro [%d/%d], AO [%d:%d], len(aobuf) = %d', \ imic+1, nmic, *aoshs) buf = _ao2mo.r_e1(intor, moij, ijshape, aoshs, mol._atm, mol._bas, mol._env, tao, aosym, comp, ao2mopt) iobuf[:,p0:p0+aoshs[2]] = buf p0 += aoshs[2] ti2 = log.timer('gen AO/transform MO [%d/%d]'%(istep+1,nstep), *ti0) e2buflen, chunks = guess_e2bufsize(ioblk_size, nij_pair, buflen) for icomp in range(comp): dset = fswap.create_dataset('%d/%d'%(icomp,istep), (nij_pair,iobuf.shape[1]), 'c16', chunks=None) for col0, col1 in prange(0, nij_pair, e2buflen): dset[col0:col1] = pyscf.lib.transpose(iobuf[icomp,:,col0:col1]) ti0 = log.timer('transposing to disk', *ti2) fswap.close() return swapfile