| /* { dg-do compile } */ |
| /* { dg-options "-w -O3 -mcpu=cortex-a53" } */ |
| typedef struct __sFILE __FILE; |
| typedef __FILE FILE; |
| typedef int atom_id; |
| typedef float real; |
| typedef real rvec[3]; |
| typedef real matrix[3][3]; |
| enum { |
| ebCGS,ebMOLS,ebSBLOCKS,ebNR |
| }; |
| enum { |
| efepNO, efepYES, efepNR |
| }; |
| enum { |
| esolNO, esolMNO, esolWATER, esolWATERWATER, esolNR |
| }; |
| typedef struct { |
| int nr; |
| atom_id *index; |
| atom_id *a; |
| } t_block; |
| enum { |
| F_LJ, |
| F_LJLR, |
| F_SR, |
| F_LR, |
| F_DVDL, |
| }; |
| typedef struct { |
| t_block excl; |
| } t_atoms; |
| typedef struct { |
| t_atoms atoms; |
| t_block blocks[ebNR]; |
| } t_topology; |
| typedef struct { |
| } t_nsborder; |
| extern FILE *debug; |
| typedef struct { |
| } t_nrnb; |
| typedef struct { |
| int nri,maxnri; |
| int nrj,maxnrj; |
| int maxlen; |
| int solvent; |
| int *gid; |
| int *jindex; |
| atom_id *jjnr; |
| int *nsatoms; |
| } t_nblist; |
| typedef struct { |
| int nrx,nry,nrz; |
| } t_grid; |
| typedef struct { |
| } t_commrec; |
| enum { eNL_VDWQQ, eNL_VDW, eNL_QQ, |
| eNL_VDWQQ_FREE, eNL_VDW_FREE, eNL_QQ_FREE, |
| eNL_VDWQQ_SOLMNO, eNL_VDW_SOLMNO, eNL_QQ_SOLMNO, |
| eNL_VDWQQ_WATER, eNL_QQ_WATER, |
| eNL_VDWQQ_WATERWATER, eNL_QQ_WATERWATER, |
| eNL_NR }; |
| typedef struct { |
| real rlist,rlistlong; |
| real rcoulomb_switch,rcoulomb; |
| real rvdw_switch,rvdw; |
| int efep; |
| int cg0,hcg; |
| int *solvent_type; |
| int *mno_index; |
| rvec *cg_cm; |
| t_nblist nlist_sr[eNL_NR]; |
| t_nblist nlist_lr[eNL_NR]; |
| int bTwinRange; |
| rvec *f_twin; |
| int *eg_excl; |
| } t_forcerec; |
| typedef struct { |
| real *chargeA,*chargeB,*chargeT; |
| int *bPerturbed; |
| int *typeA,*typeB; |
| unsigned short *cTC,*cENER,*cACC,*cFREEZE,*cXTC,*cVCM; |
| } t_mdatoms; |
| enum { egCOUL, egLJ, egBHAM, egLR, egLJLR, egCOUL14, egLJ14, egNR }; |
| typedef struct { |
| real *ee[egNR]; |
| } t_grp_ener; |
| typedef struct { |
| t_grp_ener estat; |
| } t_groups; |
| typedef unsigned long t_excl; |
| static void reset_nblist(t_nblist *nl) |
| { |
| nl->nri = 0; |
| nl->nrj = 0; |
| nl->maxlen = 0; |
| if (nl->maxnri > 0) { |
| nl->gid[0] = -1; |
| if (nl->maxnrj > 1) { |
| nl->jindex[0] = 0; |
| nl->jindex[1] = 0; |
| } |
| } |
| } |
| static void reset_neighbor_list(t_forcerec *fr,int bLR,int eNL) |
| { |
| reset_nblist(&(fr->nlist_lr[eNL])); |
| } |
| static void close_i_nblist(t_nblist *nlist) |
| { |
| int nri = nlist->nri; |
| int len; |
| nlist->jindex[nri+1] = nlist->nrj; |
| len=nlist->nrj - nlist->jindex[nri]; |
| if (nlist->solvent==esolMNO) |
| len *= nlist->nsatoms[3*nri]; |
| if(len > nlist->maxlen) |
| nlist->maxlen = len; |
| } |
| static void close_nblist(t_nblist *nlist) |
| { |
| if (nlist->maxnri > 0) { |
| int nri = nlist->nri; |
| if ((nlist->jindex[nri+1] > nlist->jindex[nri]) && |
| (nlist->gid[nri] != -1)) { |
| nlist->nri++; |
| nlist->jindex[nri+2] = nlist->nrj; |
| } |
| } |
| } |
| static void close_neighbor_list(t_forcerec *fr,int bLR,int eNL) |
| { |
| close_nblist(&(fr->nlist_lr[eNL])); |
| } |
| static void add_j_to_nblist(t_nblist *nlist,atom_id j_atom) |
| { |
| int nrj=nlist->nrj; |
| nlist->jjnr[nrj] = j_atom; |
| nlist->nrj ++; |
| } |
| static void put_in_list(int bHaveLJ[], |
| int ngid,t_mdatoms *md, |
| int icg,int jgid,int nj,atom_id jjcg[], |
| atom_id index[], |
| t_excl bExcl[],int shift, |
| t_forcerec *fr,int bLR, |
| int bVDWOnly,int bCoulOnly) |
| { |
| t_nblist *vdwc,*vdw,*coul; |
| t_nblist *vdwc_ww=((void *)0),*coul_ww=((void *)0); |
| t_nblist *vdwc_free=((void *)0),*vdw_free=((void *)0),*coul_free=((void *)0); |
| int i,j,jcg,igid,gid,ind_ij; |
| atom_id jj,jj0,jj1,i_atom; |
| int i0,nicg,len; |
| int *type,*typeB; |
| unsigned short *cENER; |
| real *charge,*chargeB; |
| real qi,qiB,qq,rlj; |
| int bWater,bMNO,bFree,bFreeJ,bNotEx,*bPert; |
| charge = md->chargeA; |
| chargeB = md->chargeB; |
| type = md->typeA; |
| typeB = md->typeB; |
| cENER = md->cENER; |
| bPert = md->bPerturbed; |
| i0 = index[icg]; |
| nicg = index[icg+1]-i0; |
| bMNO = (fr->solvent_type[icg] == esolMNO); |
| if (bLR) { |
| if (bWater) { |
| vdw = &fr->nlist_lr[eNL_VDW]; |
| coul = &fr->nlist_lr[eNL_QQ_WATER]; |
| vdwc_ww = &fr->nlist_lr[eNL_VDWQQ_WATERWATER]; |
| } else if(bMNO) { |
| vdwc = &fr->nlist_lr[eNL_VDWQQ_SOLMNO]; |
| } |
| if (fr->efep != efepNO) { |
| vdw_free = &fr->nlist_lr[eNL_VDW_FREE]; |
| coul_free = &fr->nlist_lr[eNL_QQ_FREE]; |
| } |
| } |
| else { |
| if (bWater) { |
| } else if(bMNO) { |
| vdwc = &fr->nlist_sr[eNL_VDWQQ_SOLMNO]; |
| } |
| if (fr->efep != efepNO) { |
| vdwc_free = &fr->nlist_sr[eNL_VDWQQ_FREE]; |
| } |
| } |
| if (fr->efep==efepNO) { |
| if (bWater) { |
| igid = cENER[i_atom]; |
| gid = ((igid < jgid) ? (igid*ngid+jgid) : (jgid*ngid+igid)); |
| if (!bCoulOnly && !bVDWOnly) { |
| new_i_nblist(vdwc,bLR ? F_LJLR : F_LJ,i_atom,shift,gid,((void *)0)); |
| new_i_nblist(vdwc_ww,bLR ? F_LJLR : F_LJ,i_atom,shift,gid,((void *)0)); |
| } |
| if (!bCoulOnly) |
| new_i_nblist(vdw,bLR ? F_LJLR : F_LJ,i_atom,shift,gid,((void *)0)); |
| if (!bVDWOnly) { |
| new_i_nblist(coul,bLR ? F_LR : F_SR,i_atom,shift,gid,((void *)0)); |
| new_i_nblist(coul_ww,bLR ? F_LR : F_SR,i_atom,shift,gid,((void *)0)); |
| } |
| for(j=0; (j<nj); j++) { |
| jcg=jjcg[j]; |
| if (jcg==icg) |
| jj0 = index[jcg]; |
| if (bWater && (fr->solvent_type[jcg] == esolWATER)) { |
| if (bVDWOnly) |
| add_j_to_nblist(vdw,jj0); |
| else { |
| add_j_to_nblist(coul_ww,jj0); |
| add_j_to_nblist(vdwc_ww,jj0); |
| } |
| } else { |
| jj1 = index[jcg+1]; |
| if (bCoulOnly) { |
| for(jj=jj0; (jj<jj1); jj++) { |
| if (fabs(charge[jj]) > 1.2e-38) |
| add_j_to_nblist(coul,jj); |
| } |
| } else if (bVDWOnly) { |
| for(jj=jj0; (jj<jj1); jj++) |
| if (bHaveLJ[type[jj]]) |
| add_j_to_nblist(vdw,jj); |
| } else { |
| for(jj=jj0; (jj<jj1); jj++) { |
| if (bHaveLJ[type[jj]]) { |
| if (fabs(charge[jj]) > 1.2e-38) |
| add_j_to_nblist(vdwc,jj); |
| add_j_to_nblist(vdw,jj); |
| } else if (fabs(charge[jj]) > 1.2e-38) |
| add_j_to_nblist(coul,jj); |
| } |
| } |
| } |
| } |
| close_i_nblist(vdw); |
| close_i_nblist(coul); |
| close_i_nblist(vdwc); |
| close_i_nblist(coul_ww); |
| close_i_nblist(vdwc_ww); |
| } else if (bMNO) { |
| igid = cENER[i_atom]; |
| gid = ((igid < jgid) ? (igid*ngid+jgid) : (jgid*ngid+igid)); |
| if (!bCoulOnly && !bVDWOnly) |
| new_i_nblist(vdwc,bLR ? F_LJLR : F_LJ,i_atom,shift,gid, |
| &(fr->mno_index[icg*3])); |
| if (!bCoulOnly) |
| new_i_nblist(vdw,bLR ? F_LR : F_SR,i_atom,shift,gid, |
| &(fr->mno_index[icg*3])); |
| if (!bVDWOnly) |
| new_i_nblist(coul,bLR ? F_LR : F_SR,i_atom,shift,gid, |
| &(fr->mno_index[icg*3])); |
| for(j=0; (j<nj); j++) { |
| jcg=jjcg[j]; |
| if (jcg == icg) |
| jj0 = index[jcg]; |
| jj1=index[jcg+1]; |
| for(jj=jj0; (jj<jj1); jj++) { |
| if (bCoulOnly) { |
| if (fabs(charge[jj]) > 1.2e-38) |
| add_j_to_nblist(coul,jj); |
| } else if (bVDWOnly) { |
| if (bHaveLJ[type[jj]]) |
| add_j_to_nblist(vdw,jj); |
| } else { |
| if (bHaveLJ[type[jj]]) { |
| if (fabs(charge[jj]) > 1.2e-38) |
| add_j_to_nblist(vdwc,jj); |
| add_j_to_nblist(vdw,jj); |
| } else if (fabs(charge[jj]) > 1.2e-38) |
| add_j_to_nblist(coul,jj); |
| } |
| } |
| close_i_nblist(vdw); |
| close_i_nblist(coul); |
| close_i_nblist(vdwc); |
| } |
| } else { |
| for(i=0; i<nicg; i++) { |
| igid = cENER[i_atom]; |
| gid = ((igid < jgid) ? (igid*ngid+jgid) : (jgid*ngid+igid)); |
| qi = charge[i_atom]; |
| if (!bCoulOnly && !bVDWOnly) |
| new_i_nblist(vdwc,bLR ? F_LJLR : F_LJ,i_atom,shift,gid,((void *)0)); |
| if (!bCoulOnly) |
| new_i_nblist(vdw,bLR ? F_LR : F_SR,i_atom,shift,gid,((void *)0)); |
| if (!bVDWOnly) |
| new_i_nblist(coul,bLR ? F_LR : F_SR,i_atom,shift,gid,((void *)0)); |
| if (!(bVDWOnly || fabs(qi)<1.2e-38) || !(bCoulOnly || !bHaveLJ[type[i_atom]])) { |
| for(j=0; (j<nj); j++) { |
| jcg=jjcg[j]; |
| if (jcg == icg) |
| jj0 = i0 + i + 1; |
| else |
| jj0 = index[jcg]; |
| jj1=index[jcg+1]; |
| for(jj=jj0; jj<jj1; jj++) { |
| bNotEx = !((int) ((bExcl)[((atom_id) (jj))] & (1<<((atom_id) (i))))); |
| if (bNotEx) { |
| if (bCoulOnly) { |
| if (fabs(charge[jj]) > 1.2e-38) |
| add_j_to_nblist(coul,jj); |
| } else if (bVDWOnly) { |
| if (bHaveLJ[type[jj]]) |
| add_j_to_nblist(vdw,jj); |
| } else { |
| if (bHaveLJ[type[jj]]) { |
| if (fabs(qi) > 1.2e-38 && (fabs(charge[jj]) > 1.2e-38)) |
| add_j_to_nblist(vdwc,jj); |
| add_j_to_nblist(vdw,jj); |
| } else if (fabs(qi) > 1.2e-38 && (fabs(charge[jj]) > 1.2e-38)) |
| add_j_to_nblist(coul,jj); |
| } |
| } |
| } |
| } |
| } |
| close_i_nblist(vdw); |
| close_i_nblist(coul); |
| close_i_nblist(vdwc); |
| } |
| } |
| } else { |
| for(i=0; i<nicg; i++) { |
| igid = cENER[i_atom]; |
| gid = ((igid < jgid) ? (igid*ngid+jgid) : (jgid*ngid+igid)); |
| qi = charge[i_atom]; |
| qiB = chargeB[i_atom]; |
| if (!bCoulOnly && !bVDWOnly) |
| new_i_nblist(vdwc,bLR ? F_LJLR : F_LJ,i_atom,shift,gid, |
| bMNO ? &(fr->mno_index[icg*3]) : ((void *)0)); |
| if (!bCoulOnly) |
| new_i_nblist(vdw,bLR ? F_LR : F_SR,i_atom,shift,gid, |
| bMNO ? &(fr->mno_index[icg*3]) : ((void *)0)); |
| new_i_nblist(coul,bLR ? F_LR : F_SR,i_atom,shift,gid, |
| bMNO ? &(fr->mno_index[icg*3]) : ((void *)0)); |
| new_i_nblist(vdw_free,F_DVDL,i_atom,shift,gid,((void *)0)); |
| new_i_nblist(coul_free,F_DVDL,i_atom,shift,gid,((void *)0)); |
| new_i_nblist(vdwc_free,F_DVDL,i_atom,shift,gid,((void *)0)); |
| if (!(bVDWOnly || (fabs(qi)<1.2e-38 && fabs(qiB)<1.2e-38)) || |
| !(bCoulOnly || (!bHaveLJ[type[i_atom]] && !bHaveLJ[typeB[i_atom]]))) { |
| for(j=0; (j<nj); j++) { |
| jcg=jjcg[j]; |
| if (jcg == icg) |
| jj0 = i0 + i + 1; |
| else |
| jj0 = index[jcg]; |
| jj1=index[jcg+1]; |
| bFree = bPert[i_atom]; |
| for(jj=jj0; (jj<jj1); jj++) { |
| bFreeJ = bFree || bPert[jj]; |
| if ((!bWater && !bMNO) || i==0 || bFreeJ) { |
| bNotEx = !((int) ((bExcl)[((atom_id) (jj))] & (1<<((atom_id) (i))))); |
| if (bNotEx) { |
| if (bFreeJ) { |
| if (bCoulOnly) |
| add_j_to_nblist(coul_free,jj); |
| else if (bVDWOnly) |
| add_j_to_nblist(vdw_free,jj); |
| add_j_to_nblist(vdwc_free,jj); |
| } else if (bCoulOnly) { |
| add_j_to_nblist(coul,jj); |
| } else if (bVDWOnly) { |
| if (bHaveLJ[type[jj]]) |
| add_j_to_nblist(vdw,jj); |
| } else { |
| if (bHaveLJ[type[jj]]) { |
| if (fabs(qi) > 1.2e-38 && (fabs(charge[jj]) > 1.2e-38)) |
| add_j_to_nblist(vdwc,jj); |
| add_j_to_nblist(vdw,jj); |
| } else if (fabs(qi) > 1.2e-38 && (fabs(charge[jj]) > 1.2e-38)) |
| add_j_to_nblist(coul,jj); |
| } |
| } |
| } |
| } |
| } |
| } |
| close_i_nblist(vdw); |
| close_i_nblist(coul); |
| close_i_nblist(vdwc); |
| if (bWater && (i==0)) { |
| close_i_nblist(coul_ww); |
| close_i_nblist(vdwc_ww); |
| } |
| close_i_nblist(vdw_free); |
| close_i_nblist(coul_free); |
| close_i_nblist(vdwc_free); |
| } |
| } |
| } |
| static void setexcl(atom_id start,atom_id end,t_block *excl,int b, |
| t_excl bexcl[]) |
| { |
| atom_id i,k; |
| if (b) { |
| for(i=start; i<end; i++) { |
| for(k=excl->index[i]; k<excl->index[i+1]; k++) { |
| (bexcl)[((atom_id) (excl->a[k]))] |= (1<<((atom_id) (i-start))); |
| } |
| } |
| } |
| } |
| int calc_naaj(int icg,int cgtot) |
| { |
| int naaj; |
| if ((cgtot % 2) == 1) { |
| naaj = 1+(cgtot/2); |
| } |
| else if ((cgtot % 4) == 0) { |
| if (icg < cgtot/2) { |
| if ((icg % 2) == 0) |
| naaj=1+(cgtot/2); |
| } |
| else { |
| if ((icg % 2) == 1) |
| naaj=1+(cgtot/2); |
| } |
| } |
| else { |
| if ((icg % 2) == 0) |
| naaj=1+(cgtot/2); |
| else |
| naaj=cgtot/2; |
| } |
| return naaj; |
| } |
| static void get_dx(int Nx,real gridx,real grid_x,real rc2,real x, |
| int *dx0,int *dx1,real *dcx2) |
| { |
| real dcx,tmp; |
| int xgi,xgi0,xgi1,i; |
| xgi = (int)(Nx+x*grid_x)-Nx; |
| if (xgi < 0) { |
| *dx0 = 0; |
| *dx1 = -1; |
| } else if (xgi >= Nx) { |
| *dx0 = Nx; |
| *dx1 = Nx-1; |
| } else { |
| dcx2[xgi] = 0; |
| *dx0 = xgi; |
| xgi0 = xgi-1; |
| *dx1 = xgi; |
| xgi1 = xgi+1; |
| } |
| for(i=xgi0; i>=0; i--) { |
| dcx = (i+1)*gridx-x; |
| tmp = dcx*dcx; |
| if (tmp >= rc2) |
| *dx0 = i; |
| dcx2[i] = tmp; |
| } |
| for(i=xgi1; i<Nx; i++) { |
| dcx = i*gridx-x; |
| tmp = dcx*dcx; |
| if (tmp >= rc2) |
| *dx1 = i; |
| dcx2[i] = tmp; |
| } |
| } |
| static void do_longrange(FILE *log,t_commrec *cr,t_topology *top,t_forcerec *fr, |
| int ngid,t_mdatoms *md,int icg, |
| int jgid,int nlr, |
| atom_id lr[],t_excl bexcl[],int shift, |
| rvec x[],rvec box_size,t_nrnb *nrnb, |
| real lambda,real *dvdlambda, |
| t_groups *grps,int bVDWOnly,int bCoulOnly, |
| int bDoForces,int bHaveLJ[]) |
| { |
| int i; |
| for(i=0; (i<eNL_NR); i++) { |
| if ((fr->nlist_lr[i].nri > fr->nlist_lr[i].maxnri-32) || bDoForces) { |
| close_neighbor_list(fr,1,i); |
| do_fnbf(log,cr,fr,x,fr->f_twin,md, |
| grps->estat.ee[egLJLR],grps->estat.ee[egLR],box_size, |
| nrnb,lambda,dvdlambda,1,i); |
| reset_neighbor_list(fr,1,i); |
| } |
| } |
| if (!bDoForces) { |
| put_in_list(bHaveLJ,ngid,md,icg,jgid,nlr,lr,top->blocks[ebCGS].index, |
| bexcl,shift,fr, |
| 1,bVDWOnly,bCoulOnly); |
| } |
| } |
| static int ns5_core(FILE *log,t_commrec *cr,t_forcerec *fr,int cg_index[], |
| matrix box,rvec box_size,int ngid, |
| t_topology *top,t_groups *grps, |
| t_grid *grid,rvec x[],t_excl bexcl[],int *bExcludeAlleg, |
| t_nrnb *nrnb,t_mdatoms *md, |
| real lambda,real *dvdlambda, |
| int bHaveLJ[]) |
| { |
| static atom_id **nl_lr_ljc,**nl_lr_one,**nl_sr=((void *)0); |
| static int *nlr_ljc,*nlr_one,*nsr; |
| static real *dcx2=((void *)0),*dcy2=((void *)0),*dcz2=((void *)0); |
| t_block *cgs=&(top->blocks[ebCGS]); |
| unsigned short *gid=md->cENER; |
| int tx,ty,tz,dx,dy,dz,cj; |
| int dx0,dx1,dy0,dy1,dz0,dz1; |
| int Nx,Ny,Nz,shift=-1,j,nrj,nns,nn=-1; |
| real gridx,gridy,gridz,grid_x,grid_y,grid_z; |
| int icg=-1,iicg,cgsnr,i0,nri,naaj,min_icg,icg_naaj,jjcg,cgj0,jgid; |
| int bVDWOnly,bCoulOnly; |
| rvec xi,*cgcm; |
| real r2,rs2,rvdw2,rcoul2,rm2,rl2,XI,YI,ZI,dcx,dcy,dcz,tmp1,tmp2; |
| int *i_eg_excl; |
| int use_twinrange,use_two_cutoffs; |
| cgsnr = cgs->nr; |
| rs2 = ((fr->rlist)*(fr->rlist)); |
| if (fr->bTwinRange) { |
| rvdw2 = ((fr->rvdw)*(fr->rvdw)); |
| rcoul2 = ((fr->rcoulomb)*(fr->rcoulomb)); |
| } else { |
| } |
| rm2 = (((rvdw2) < (rcoul2)) ? (rvdw2) : (rcoul2) ); |
| rl2 = (((rvdw2) > (rcoul2)) ? (rvdw2) : (rcoul2) ); |
| use_twinrange = (rs2 < rm2); |
| use_two_cutoffs = (rm2 < rl2); |
| bVDWOnly = (rvdw2 > rcoul2); |
| bCoulOnly = !bVDWOnly; |
| if (nl_sr == ((void *)0)) { |
| (nl_sr)=save_calloc("nl_sr","ns.c",1341, (ngid),sizeof(*(nl_sr))); |
| (nsr)=save_calloc("nsr","ns.c",1343, (ngid),sizeof(*(nsr))); |
| (nlr_ljc)=save_calloc("nlr_ljc","ns.c",1344, (ngid),sizeof(*(nlr_ljc))); |
| (nlr_one)=save_calloc("nlr_one","ns.c",1345, (ngid),sizeof(*(nlr_one))); |
| if (use_twinrange) |
| (nl_lr_ljc)=save_calloc("nl_lr_ljc","ns.c",1349, (ngid),sizeof(*(nl_lr_ljc))); |
| if (use_two_cutoffs) |
| (nl_lr_one)=save_calloc("nl_lr_one","ns.c",1353, (ngid),sizeof(*(nl_lr_one))); |
| for(j=0; (j<ngid); j++) { |
| (nl_sr[j])=save_calloc("nl_sr[j]","ns.c",1356, (1024),sizeof(*(nl_sr[j]))); |
| if (use_twinrange) |
| (nl_lr_ljc[j])=save_calloc("nl_lr_ljc[j]","ns.c",1358, (1024),sizeof(*(nl_lr_ljc[j]))); |
| if (use_two_cutoffs) |
| (nl_lr_one[j])=save_calloc("nl_lr_one[j]","ns.c",1360, (1024),sizeof(*(nl_lr_one[j]))); |
| } |
| if (debug) |
| fprintf(debug,"ns5_core: rs2 = %g, rvdw2 = %g, rcoul2 = %g (nm^2)\n", |
| rs2,rvdw2,rcoul2); |
| } |
| cgcm = fr->cg_cm; |
| Nx = grid->nrx; |
| Ny = grid->nry; |
| if (dcx2 == ((void *)0)) { |
| (dcx2)=save_calloc("dcx2","ns.c",1379, (Nx*2),sizeof(*(dcx2))); |
| (dcy2)=save_calloc("dcy2","ns.c",1380, (Ny*2),sizeof(*(dcy2))); |
| (dcz2)=save_calloc("dcz2","ns.c",1381, (Nz*2),sizeof(*(dcz2))); |
| } |
| gridx = box[0][0]/grid->nrx; |
| gridy = box[1][1]/grid->nry; |
| gridz = box[2][2]/grid->nrz; |
| grid_x = 1/gridx; |
| grid_y = 1/gridy; |
| grid_z = 1/gridz; |
| for(iicg=fr->cg0; (iicg < fr->hcg); iicg++) { |
| icg = cg_index[iicg]; |
| if (icg != iicg) |
| fatal_error(0,"icg = %d, iicg = %d, file %s, line %d",icg,iicg,"ns.c", |
| 1408); |
| if(bExcludeAlleg[icg]) |
| i_eg_excl = fr->eg_excl + ngid*gid[cgs->index[icg]]; |
| setexcl(cgs->index[icg],cgs->index[icg+1],&top->atoms.excl,1,bexcl); |
| naaj = calc_naaj(icg,cgsnr); |
| icg_naaj = icg+naaj; |
| for (tz=-1; tz<=1; tz++) { |
| ZI = cgcm[icg][2]+tz*box[2][2]; |
| get_dx(Nz,gridz,grid_z,rcoul2,ZI,&dz0,&dz1,dcz2); |
| if (dz0 > dz1) |
| for (ty=-1; ty<=1; ty++) { |
| YI = cgcm[icg][1]+ty*box[1][1]+tz*box[2][1]; |
| get_dx(Ny,gridy,grid_y,rcoul2,YI,&dy0,&dy1,dcy2); |
| for (tx=-1; tx<=1; tx++) { |
| get_dx(Nx,gridx,grid_x,rcoul2,XI,&dx0,&dx1,dcx2); |
| shift=((2*1 +1)*((2*1 +1)*((tz)+1)+(ty)+1)+(tx)+1); |
| for (dx=dx0; (dx<=dx1); dx++) { |
| for (dy=dy0; (dy<=dy1); dy++) { |
| for (dz=dz0; (dz<=dz1); dz++) { |
| if (tmp2 > dcz2[dz]) { |
| for (j=0; (j<nrj); j++) { |
| if (((jjcg >= icg) && (jjcg < icg_naaj)) || |
| ((jjcg < min_icg))) { |
| if (r2 < rl2) { |
| if (!i_eg_excl[jgid]) { |
| if (r2 < rs2) { |
| if (nsr[jgid] >= 1024) { |
| put_in_list(bHaveLJ,ngid,md,icg,jgid, |
| nsr[jgid],nl_sr[jgid], |
| cgs->index, bexcl, |
| shift,fr,0,0,0); |
| } |
| } else if (r2 < rm2) { |
| } else if (use_two_cutoffs) { |
| if (nlr_one[jgid] >= 1024) { |
| do_longrange(log,cr,top,fr,ngid,md,icg,jgid, |
| nlr_one[jgid], |
| nl_lr_one[jgid],bexcl,shift,x, |
| box_size,nrnb, |
| lambda,dvdlambda,grps, |
| bVDWOnly,bCoulOnly,0, |
| bHaveLJ); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| int search_neighbors(FILE *log,t_forcerec *fr, |
| rvec x[],matrix box, |
| t_topology *top,t_groups *grps, |
| t_commrec *cr,t_nsborder *nsb, |
| t_nrnb *nrnb,t_mdatoms *md, |
| real lambda,real *dvdlambda) |
| { |
| static t_grid *grid=((void *)0); |
| static t_excl *bexcl; |
| static int *bHaveLJ; |
| static int *cg_index=((void *)0),*slab_index=((void *)0); |
| static int *bExcludeAlleg; |
| rvec box_size; |
| int i,j,m,ngid; |
| int nsearch; |
| nsearch = ns5_core(log,cr,fr,cg_index,box,box_size,ngid,top,grps, |
| grid,x,bexcl,bExcludeAlleg,nrnb,md,lambda,dvdlambda,bHaveLJ); |
| } |