forked from comp-chem/NWChem-C
Added some scf files
This commit is contained in:
parent
b08f9320db
commit
02608cf25a
2 changed files with 174 additions and 0 deletions
32
src/ddscf/comp4_ext.c
Normal file
32
src/ddscf/comp4_ext.c
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
#include <stdio.h>
|
||||
#include "bitops_decls.h"
|
||||
#include "bitops_funcs.h"
|
||||
|
||||
void comp4_extract(int* m, int i, double s, int nb_per_i) {
|
||||
|
||||
int v; // Value after compression
|
||||
|
||||
#if defined(CRAY)
|
||||
int vv, vvv;
|
||||
#endif
|
||||
|
||||
int index, nbits;
|
||||
double fast[] = {0.0, 1.0e-13, 1.0e-12, 1.0e-11, 1.0e-10, 1.0e-9,
|
||||
1.0e-8, 1.0e-7, 1.0e-6, 1.0e-5, 1.0e-4, 1.0e-3, 1.0e-2,
|
||||
1.0e-1, 1.0e0, 1.0e1};
|
||||
|
||||
v = 15;
|
||||
index = (i - 1)/(2*nb_per_i) + 1;
|
||||
nbits = 4*(i - (index-1)*(2*nb_per_i) - 1);
|
||||
#if defined(CRAY)
|
||||
vvv = shiftl(v, nbits);
|
||||
vv = shiftr(iand(m(index), vvv), nbits);
|
||||
v = iand(vv,15);
|
||||
#else
|
||||
v = iand(ishft(iand(m(index), ishft(v, nbits)), -nbits),15);
|
||||
#endif
|
||||
|
||||
s = fast(v);
|
||||
// printf('%d -> %d %d %d %0.4f');
|
||||
|
||||
}
|
||||
142
src/ddscf/fock_2e_file.c
Normal file
142
src/ddscf/fock_2e_file.c
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
#include "util.h"
|
||||
#include "cscfps.h"
|
||||
#include "cfock.h"
|
||||
#include <bool.h>
|
||||
#include <math.h>
|
||||
|
||||
void fock_2e_from_file(int geom, int basis, int nfock, int ablklen,
|
||||
double jfac[nfock], double kfac[nfock], double tol2e, bool oskel,
|
||||
double dij[nfock*ablklen], double dik[nfock*ablklen], double dli[nfock*ablklen],
|
||||
double djk[nfock*ablklen], double dlj[nfock*ablklen], double dlk[nfock*ablklen],
|
||||
double fij[nfock*ablklen], double fik[nfock*ablklen], double fli[nfock*ablklen],
|
||||
double fjk[nfock*ablklen], double flj[nfock*ablklen], double flk[nfock*ablklen],
|
||||
double tmp, int vg_dens[nfock], int vg_fock[nfock]) {
|
||||
|
||||
//$Id$
|
||||
|
||||
/*Accumulate the contribution to the fock matrices from
|
||||
integrals store in the integral file. Simply read thru
|
||||
the file getting a range of indices, fetch the corresponding
|
||||
density matrix blocks and then read the integrals in that
|
||||
block.
|
||||
*/
|
||||
|
||||
double den_tol, denmax, dtol2e;
|
||||
int ilo, jlo, klo, llo;
|
||||
int ihi, jhi, khi, lhi;
|
||||
int ijk_prev[3][2];
|
||||
int blklen;
|
||||
|
||||
bool int2e_get_bf_range, int2e_file_read;
|
||||
|
||||
if (oscfps) pstat_on(ps_fock_io);
|
||||
|
||||
den_tol = fmax(tol2e*0.01, 1e-300); // To avoid a hard zero
|
||||
|
||||
ijk_prev[0][0] = -1;
|
||||
ijk_prev[1][0] = -1;
|
||||
ijk_prev[2][0] = -1;
|
||||
ijk_prev[0][1] = -1;
|
||||
ijk_prev[1][1] = -1;
|
||||
ijk_prev[2][1] = -1;
|
||||
|
||||
blklen = nfock*ablklen;
|
||||
dfill(blklen, 0.0e0, fij, 1);
|
||||
dfill(blklen, 0.0e0, fik, 1);
|
||||
dfill(blklen, 0.0e0, fli, 1);
|
||||
dfill(blklen, 0.0e0, fjk, 1);
|
||||
dfill(blklen, 0.0e0, flj, 1);
|
||||
dfill(blklen, 0.0e0, flk, 1);
|
||||
|
||||
// Loop over blocks of integral labels
|
||||
|
||||
while (int2e_get_bf_range(ilo,ihi,jlo,jhi,klo,khi,llo,lhi)) {
|
||||
// Get matrices for this block of labels
|
||||
fock_init_cmul(ihi-ilo+1,jhi-jlo+1,lhi-llo+1);
|
||||
fock_2e_cache_dens_fock(
|
||||
ilo, jlo, klo, llo,
|
||||
ihi, jhi, khi, lhi,
|
||||
ijk_prev,
|
||||
nfock, vg_dens, vg_fock,
|
||||
jfac, kfac,
|
||||
dij, dik, dli, djk, dlj, dlk,
|
||||
fij, fik, fli, fjk, flj, flk,
|
||||
tmp);
|
||||
|
||||
fock_density_screen(nfock,
|
||||
ilo, jlo, klo, llo,
|
||||
ihi, jhi, khi, lhi,
|
||||
ilo, jlo, klo, llo,
|
||||
ihi, jhi, khi, lhi,
|
||||
dij, dik, dli, djk, dlj, dlk, denmax)
|
||||
|
||||
dtol2e = min(dentolmax, den_tol/max(1e-10,denmax), den_tol/max(1e-10,denmax**2))
|
||||
|
||||
call int2e_file_fock_block(nfock, dtol2e,
|
||||
dij, dik, dli, djk, dlj, dlk,
|
||||
fij, fik, fli, fjk, flj, flk)
|
||||
|
||||
// Update F blocks
|
||||
|
||||
call fock_upd_blk(nfock, vg_fock,
|
||||
llo, lhi, ilo, ihi, kfac, fli, tmp)
|
||||
call fock_upd_blk(nfock, vg_fock,
|
||||
llo, lhi, jlo, jhi, kfac, flj, tmp)
|
||||
call fock_upd_blk(nfock, vg_fock,
|
||||
llo, lhi, klo, khi, jfac, flk, tmp)
|
||||
}
|
||||
|
||||
if (ijk_prev[0][0]) != -1) {
|
||||
fock_upd_blk(nfock, vg_fock,
|
||||
ijk_prev[0][0]), ijk_prev[0][1]),
|
||||
ijk_prev(2,1), ijk_prev(2,2),
|
||||
jfac, fij, tmp)
|
||||
fock_upd_blk(nfock, vg_fock,
|
||||
ijk_prev(2,1), ijk_prev(2,2),
|
||||
ijk_prev(3,1), ijk_prev(3,2),
|
||||
kfac, fjk, tmp )
|
||||
fock_upd_blk( nfock, vg_fock,
|
||||
ijk_prev(1,1), ijk_prev(1,2),
|
||||
ijk_prev(3,1), ijk_prev(3,2),
|
||||
kfac, fik, tmp )
|
||||
}
|
||||
|
||||
if (oscfps) pstat_off(ps_fock_io);
|
||||
|
||||
}
|
||||
|
||||
void fock_2e_rep_from_file(int geom, int basis, int nfock, int nbf,
|
||||
double jfac[nfock], double kfac[nfock], double tol2e, bool oskel,
|
||||
double dens[nfock][nbf*nbf], fock[nfock][nbf*nbf]) {
|
||||
|
||||
double den_tol, denmax;
|
||||
int ilo, jlo, klo, llo;
|
||||
int ihi, jhi, khi, lhi, i, j;
|
||||
|
||||
bool int2e_get_bf_range, int2e_file_read;
|
||||
int idamax;
|
||||
|
||||
if (oscfps) pstat_on(ps_fock_io);
|
||||
|
||||
denmax = 0.0;
|
||||
for (i = 0; i < nfock; i++) {
|
||||
j = idamax(nbf*nbf, dens[i][0], nfock);
|
||||
denmax = max(denmax, abs(dens[i][j]);
|
||||
}
|
||||
// return if DM is null (e.g imaginary part of RTTDFT DM at t=0)
|
||||
if (denmax < 1e-12) return;
|
||||
den_tol = min(dentolmax,tol2e/denmax,tol2e/denmax**2) // Threshold to screen integs only
|
||||
|
||||
if (ga_nodeid() == 0 && util_print('fockfile',print_debug)) {
|
||||
printf("fockfile: tols %d %d %d %d", tol2e, dentolmax, denmax, den_tol);
|
||||
}
|
||||
|
||||
fock_init_cmul(nbf,nbf,nbf) // lookup table for f build
|
||||
|
||||
// Loop over blocks of integral labels
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue