61 # define F77TREEPEFORCE VF77_MANGLE(treepeforce, TREEPEFORCE) 62 # define F77DIRECT_ENG_FORCE VF77_MANGLE(direct_eng_force, DIRECT_ENG_FORCE) 63 # define F77CLEANUP VF77_MANGLE(mycleanup, MYCLEANUP) 64 # define F77TREE_COMPP VF77_MANGLE(mytree_compp, MYTREE_COMP) 65 # define F77TREE_COMPFP VF77_MANGLE(mytree_compfp, MYTREE_COMPFP) 66 # define F77CREATE_TREE VF77_MANGLE(mycreate_tree, MYCREATE_TREE) 67 # define F77INITLEVELS VF77_MANGLE(myinitlevels, MYINITLEVELS) 68 # define F77SETUP VF77_MANGLE(mysetup, MYSETUP) 76 # define FMM_DIST_TOL VSMALL 90 # define FMM_THETA 0.5 94 # define FMM_MAXPARNODE 150 102 # define FMM_MINLEVEL 50000 106 # define FMM_MAXLEVEL 0 117 VPRIVATE
int treesetup(
Vgreen *thee);
126 VPRIVATE
int treecleanup(
Vgreen *thee);
135 VPRIVATE
int treecalc(
Vgreen *thee,
double *xtar,
double *ytar,
double *ztar,
136 double *qtar,
int numtars,
double *tpengtar,
double *x,
double *y,
137 double *z,
double *q,
int numpars,
double *fx,
double *fy,
double *fz,
138 int iflag,
int farrdim,
int arrdim);
140 #if !defined(VINLINE_VGREEN) 144 VASSERT(thee != VNULL);
150 if (thee == VNULL)
return 0;
151 return Vmem_bytes(thee->
vmem);
160 thee = (
Vgreen *)Vmem_malloc(VNULL, 1,
sizeof(
Vgreen) );
161 VASSERT( thee != VNULL);
169 VASSERT( thee != VNULL );
172 thee->
vmem = Vmem_ctor(
"APBS:VGREEN");
175 if (alist == VNULL) {
176 Vnm_print(2,
"Vgreen_ctor2: got null pointer to Valist object!\n");
183 if (!treesetup(thee)) {
184 Vnm_print(2,
"Vgreen_ctor2: Error setting up FMM tree!\n");
193 if ((*thee) != VNULL) {
195 Vmem_free(VNULL, 1,
sizeof(
Vgreen), (
void **)thee);
205 Vmem_dtor(&(thee->
vmem));
210 double *z,
double *val,
double kappa) {
212 Vnm_print(2,
"Error -- Vgreen_helmholtz not implemented yet!\n");
217 double *z,
double *gradx,
double *grady,
double *gradz,
double kappa) {
219 Vnm_print(2,
"Error -- Vgreen_helmholtzD not implemented yet!\n");
225 double *y,
double *z,
double *val) {
228 double *apos, charge, dist, dx, dy, dz, scale;
229 double *q, qtemp, fx, fy, fz;
233 Vnm_print(2,
"Vgreen_coulomb: Got NULL thee!\n");
237 for (ipos=0; ipos<npos; ipos++) val[ipos] = 0.0;
243 for (ipos=0; ipos<npos; ipos++) {
244 dx = apos[0] - x[ipos];
245 dy = apos[1] - y[ipos];
246 dz = apos[2] - z[ipos];
247 dist = VSQRT(VSQR(dx) + VSQR(dy) + VSQR(dz));
248 if (dist > VSMALL) val[ipos] += (charge/dist);
253 for (ipos=0; ipos<npos; ipos++) val[ipos] = val[ipos]*scale;
259 double *z,
double *val) {
262 double *apos, charge, dist, dx, dy, dz, scale;
263 double *q, qtemp, fx, fy, fz;
267 Vnm_print(2,
"Vgreen_coulomb: Got NULL thee!\n");
271 for (ipos=0; ipos<npos; ipos++) val[ipos] = 0.0;
279 q = Vmem_malloc(thee->
vmem, npos,
sizeof(
double));
281 Vnm_print(2,
"Vgreen_coulomb: Error allocating charge array!\n");
287 for (ipos=0; ipos<npos; ipos++) q[ipos] = 1.0;
290 treecalc(thee, x, y, z, q, npos, val, thee->
xp, thee->
yp, thee->
zp,
291 thee->
qp, thee->
np, &fx, &fy, &fz, 1, 1, thee->
np);
295 if (npos > 1) Vmem_free(thee->
vmem, npos,
sizeof(
double), (
void **)&q);
298 for (ipos=0; ipos<npos; ipos++) val[ipos] = val[ipos]*scale;
311 double *x,
double *y,
double *z,
double *pot,
double *gradx,
312 double *grady,
double *gradz) {
315 double *apos, charge, dist, dist2, idist3, dy, dz, dx, scale;
320 Vnm_print(2,
"Vgreen_coulombD: Got VNULL thee!\n");
324 for (ipos=0; ipos<npos; ipos++) {
335 for (ipos=0; ipos<npos; ipos++) {
336 dx = apos[0] - x[ipos];
337 dy = apos[1] - y[ipos];
338 dz = apos[2] - z[ipos];
339 dist2 = VSQR(dx) + VSQR(dy) + VSQR(dz);
342 idist3 = 1.0/(dist*dist2);
343 gradx[ipos] -= (charge*dx*idist3);
344 grady[ipos] -= (charge*dy*idist3);
345 gradz[ipos] -= (charge*dz*idist3);
346 pot[ipos] += (charge/dist);
352 for (ipos=0; ipos<npos; ipos++) {
353 gradx[ipos] = gradx[ipos]*scale;
354 grady[ipos] = grady[ipos]*scale;
355 gradz[ipos] = gradz[ipos]*scale;
356 pot[ipos] = pot[ipos]*scale;
363 double *z,
double *pot,
double *gradx,
double *grady,
double *gradz) {
366 double *apos, charge, dist, dist2, idist3, dy, dz, dx, scale;
371 Vnm_print(2,
"Vgreen_coulombD: Got VNULL thee!\n");
375 for (ipos=0; ipos<npos; ipos++) {
387 q = Vmem_malloc(thee->
vmem, npos,
sizeof(
double));
389 Vnm_print(2,
"Vgreen_coulomb: Error allocating charge array!\n");
395 for (ipos=0; ipos<npos; ipos++) q[ipos] = 1.0;
398 treecalc(thee, x, y, z, q, npos, pot, thee->
xp, thee->
yp, thee->
zp,
399 thee->
qp, thee->
np, gradx, grady, gradz, 2, npos, thee->
np);
402 if (npos > 1) Vmem_free(thee->
vmem, npos,
sizeof(
double), (
void **)&q);
404 gradx, grady, gradz);
407 for (ipos=0; ipos<npos; ipos++) {
408 gradx[ipos] = gradx[ipos]*scale;
409 grady[ipos] = grady[ipos]*scale;
410 gradz[ipos] = gradz[ipos]*scale;
411 pot[ipos] = pot[ipos]*scale;
419 gradx, grady, gradz);
425 VPRIVATE
int treesetup(
Vgreen *thee) {
429 double dist_tol = FMM_DIST_TOL;
430 int iflag = FMM_IFLAG;
431 double order = FMM_ORDER;
432 int theta = FMM_THETA;
433 int shrink = FMM_SHRINK;
434 int maxparnode = FMM_MAXPARNODE;
435 int minlevel = FMM_MINLEVEL;
436 int maxlevel = FMM_MAXLEVEL;
440 double xyzminmax[6], *pos;
444 Vnm_print(0,
"treesetup: Initializing FMM particle arrays...\n");
447 thee->
xp = (
double *)Vmem_malloc(thee->
vmem, thee->
np,
sizeof(
double));
448 if (thee->
xp == VNULL) {
449 Vnm_print(2,
"Vgreen_ctor2: Failed to allocate %d*sizeof(double)!\n",
454 thee->
yp = (
double *)Vmem_malloc(thee->
vmem, thee->
np,
sizeof(
double));
455 if (thee->
yp == VNULL) {
456 Vnm_print(2,
"Vgreen_ctor2: Failed to allocate %d*sizeof(double)!\n",
461 thee->
zp = (
double *)Vmem_malloc(thee->
vmem, thee->
np,
sizeof(
double));
462 if (thee->
zp == VNULL) {
463 Vnm_print(2,
"Vgreen_ctor2: Failed to allocate %d*sizeof(double)!\n",
468 thee->
qp = (
double *)Vmem_malloc(thee->
vmem, thee->
np,
sizeof(
double));
469 if (thee->
qp == VNULL) {
470 Vnm_print(2,
"Vgreen_ctor2: Failed to allocate %d*sizeof(double)!\n",
474 for (i=0; i<thee->
np; i++) {
477 thee->
xp[i] = pos[0];
478 thee->
yp[i] = pos[1];
479 thee->
zp[i] = pos[2];
483 Vnm_print(0,
"treesetup: Setting things up...\n");
484 F77SETUP(thee->
xp, thee->
yp, thee->
zp, &(thee->
np), &order, &theta, &iflag,
485 &dist_tol, xyzminmax, &(thee->
np));
488 Vnm_print(0,
"treesetup: Initializing levels...\n");
489 F77INITLEVELS(&minlevel, &maxlevel);
491 Vnm_print(0,
"treesetup: Creating tree...\n");
492 F77CREATE_TREE(&one, &(thee->
np), thee->
xp, thee->
yp, thee->
zp, thee->
qp,
493 &shrink, &maxparnode, xyzminmax, &level, &(thee->
np));
499 Vnm_print(2,
"treesetup: Error! APBS not linked with treecode!\n");
505 VPRIVATE
int treecleanup(
Vgreen *thee) {
509 Vmem_free(thee->
vmem, thee->
np,
sizeof(
double), (
void **)&(thee->
xp));
510 Vmem_free(thee->
vmem, thee->
np,
sizeof(
double), (
void **)&(thee->
yp));
511 Vmem_free(thee->
vmem, thee->
np,
sizeof(
double), (
void **)&(thee->
zp));
512 Vmem_free(thee->
vmem, thee->
np,
sizeof(
double), (
void **)&(thee->
qp));
519 Vnm_print(2,
"treecleanup: Error! APBS not linked with treecode!\n");
525 VPRIVATE
int treecalc(
Vgreen *thee,
double *xtar,
double *ytar,
double *ztar,
526 double *qtar,
int numtars,
double *tpengtar,
double *x,
double *y,
527 double *z,
double *q,
int numpars,
double *fx,
double *fy,
double *fz,
528 int iflag,
int farrdim,
int arrdim) {
531 int i, level, err, maxlevel, minlevel, one;
536 F77TREE_COMPFP(xtar, ytar, ztar, qtar, &numtars, tpengtar, x, y, z, q,
537 fx, fy, fz, &numpars, &farrdim, &arrdim);
539 F77TREE_COMPP(xtar, ytar, ztar, qtar, &numtars, tpengtar, &farrdim, x,
540 y, z, q, &numpars, &arrdim);
548 Vnm_print(2,
"treecalc: Error! APBS not linked with treecode!\n");
VPUBLIC unsigned long int Vgreen_memChk(Vgreen *thee)
Return the memory used by this structure (and its contents) in bytes.
VPUBLIC void Vgreen_dtor2(Vgreen *thee)
FORTRAN stub to destruct the Green's function oracle.
Contains public data members for Vgreen class/module.
Contains declarations for class Vgreen.
VPUBLIC int Vgreen_coulomb_direct(Vgreen *thee, int npos, double *x, double *y, double *z, double *val)
Get the Coulomb's Law Green's function (solution to Laplace's equation) integrated over the atomic po...
VPUBLIC int Vgreen_helmholtzD(Vgreen *thee, int npos, double *x, double *y, double *z, double *gradx, double *grady, double *gradz, double kappa)
Get the gradient of Green's function for Helmholtz's equation integrated over the atomic point charge...
VPUBLIC int Valist_getNumberAtoms(Valist *thee)
Get number of atoms in the list.
VPUBLIC int Vgreen_coulomb(Vgreen *thee, int npos, double *x, double *y, double *z, double *val)
Get the Coulomb's Law Green's function (solution to Laplace's equation) integrated over the atomic po...
VPUBLIC Valist * Vgreen_getValist(Vgreen *thee)
Get the atom list associated with this Green's function object.
VPUBLIC Vgreen * Vgreen_ctor(Valist *alist)
Construct the Green's function oracle.
VPUBLIC int Vgreen_ctor2(Vgreen *thee, Valist *alist)
FORTRAN stub to construct the Green's function oracle.
VPUBLIC int Vgreen_coulombD_direct(Vgreen *thee, int npos, double *x, double *y, double *z, double *pot, double *gradx, double *grady, double *gradz)
Get gradient of the Coulomb's Law Green's function (solution to Laplace's equation) integrated over t...
VPUBLIC Vatom * Valist_getAtom(Valist *thee, int i)
Get pointer to particular atom in list.
VPUBLIC int Vgreen_coulombD(Vgreen *thee, int npos, double *x, double *y, double *z, double *pot, double *gradx, double *grady, double *gradz)
Get gradient of the Coulomb's Law Green's function (solution to Laplace's equation) integrated over t...
VPUBLIC int Vgreen_helmholtz(Vgreen *thee, int npos, double *x, double *y, double *z, double *val, double kappa)
Get the Green's function for Helmholtz's equation integrated over the atomic point charges...
VPUBLIC double * Vatom_getPosition(Vatom *thee)
Get atomic position.
Contains public data members for Vatom class/module.
VPUBLIC void Vgreen_dtor(Vgreen **thee)
Destruct the Green's function oracle.
Container class for list of atom objects.
#define Vunit_eps0
Vacuum permittivity.
VPUBLIC double Vatom_getCharge(Vatom *thee)
Get atomic charge.
#define Vunit_ec
Charge of an electron in C.