00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "alglue.h"
00011
00012
00013 int ALGLUEFrame::initglue()
00014 {
00015
00016
00017
00018 int i;
00019 double c, phi, dphi, d2phi;
00020 double rho, drho, d2rho, rsq, r;
00021 double glue, dglue, d2glue;
00022
00023
00024
00025
00026 rcutoff=5.5580544182;
00027 rmin=rcutoff-5.0;
00028 rsqmin=rmin*rmin;
00029 deltarsq=(rcutoff*rcutoff-rsqmin)/(NGRID-1);
00030 invdeltarsq=1./deltarsq;
00031 coordmax=1.2;
00032 deltacoord=coordmax/(NGRID-1);
00033 invdeltacoord=1./deltacoord;
00034
00035 for(i=0;i<NGRID;i++)
00036 {
00037 rsq=rsqmin+i*deltarsq;
00038 r=sqrt(rsq);
00039 v2(r,&phi,&dphi,&d2phi);
00040 rh(r,&rho,&drho,&d2rho);
00041 phitab[i]=phi;
00042 dphitab[i]=-dphi/r;
00043 rhotab[i]=rho;
00044 drhotab[i]=-drho/r;
00045 }
00046
00047 for(i=0;i<NGRID;i++)
00048 {
00049 c=i*deltacoord;
00050 uu(c,&glue,&dglue,&d2glue);
00051 utab[i]=glue;
00052 dutab[i]=dglue;
00053 }
00054 _RLIST = 1.1 * rcutoff;
00055 _SKIN = _RLIST - rcutoff;
00056
00057 return 0;
00058 }
00059
00060 int ALGLUEFrame::al_glue()
00061 {
00062 int i, j, k, jpt;
00063 Vector3 sij,rij,fij;
00064 double r2ij;
00065 double rcutoff_sq, rk, weight, rho, phi, dphi, drho;
00066
00067 refreshneighborlist();
00068
00069 rcutoff_sq = rcutoff*rcutoff;
00070
00071 for(i=0;i<_NP;i++)
00072 {
00073 _F[i].clear(); _EPOT_IND[i]=0;
00074 coord[i]=0;
00075 }
00076 _EPOT=0;
00077 _VIRIAL.clear();
00078
00079 for(j=0;j<_NP*_NNM;j++)
00080 {
00081
00082
00083 }
00084
00085
00086
00087
00088 for(i=0;i<_NP;i++)
00089 {
00090
00091 for(j=0;j<nn[i];j++)
00092 {
00093
00094 jpt=nindex[i][j];
00095 if(i>=jpt) continue;
00096 sij=_SR[jpt]-_SR[i];
00097 sij.subint();
00098 rij=_H*sij;
00099 r2ij=rij.norm2();
00100
00101
00102
00103 if(r2ij>=rcutoff_sq) continue;
00104
00105 rk=(r2ij-rsqmin)*invdeltarsq;
00106 k=(int)floor(rk);
00107 if(k<0) k=0;
00108 weight=rk-k;
00109 rho=weight*rhotab[k+1]+(1-weight)*rhotab[k];
00110 coord[i]+=rho;
00111 coord[jpt]+=rho;
00112
00113 }
00114 }
00115
00116 for(i=0;i<_NP;i++)
00117 {
00118 rk=coord[i]*invdeltacoord;
00119 k=(int)floor(rk);
00120 if(k>=NGRID-1) k=NGRID-2;
00121 weight=rk-k;
00122 _EPOT_IND[i]=weight*utab[k+1]+(1-weight)*utab[k];
00123 _EPOT+=_EPOT_IND[i];
00124 deru[i]=weight*dutab[k+1]+(1-weight)*dutab[k];
00125
00126
00127
00128 }
00129
00130
00131
00132 for(i=0;i<_NP;i++)
00133 {
00134 for(j=0;j<nn[i];j++)
00135 {
00136 jpt=nindex[i][j];
00137 if(i>=jpt) continue;
00138
00139 sij=_SR[jpt]-_SR[i];
00140 sij.subint();
00141 rij=_H*sij;
00142
00143
00144 r2ij=rij.norm2();
00145 if(r2ij>=rcutoff_sq) continue;
00146
00147 rk=(r2ij-rsqmin)*invdeltarsq;
00148 k=(int)floor(rk);
00149 if(k<0) k=0;
00150 weight = rk-k;
00151 phi=weight*phitab[k+1]+(1.0-weight)*phitab[k];
00152 _EPOT_IND[i]+=0.5*phi;
00153 _EPOT_IND[jpt]+=0.5*phi;
00154 _EPOT+=phi;
00155 dphi=weight*dphitab[k+1]+(1.0-weight)*dphitab[k];
00156 drho=weight*drhotab[k+1]+(1.0-weight)*drhotab[k];
00157 dphi+=(deru[i]+deru[jpt])*drho;
00158
00159 fij=rij*dphi;
00160 _F[i]-=fij;
00161 _F[jpt]+=fij;
00162
00163 if(!(fixed[i]||fixed[jpt]))
00164 _VIRIAL.addnvv(dphi,rij,rij);
00165 else if(!(fixed[i]&&fixed[jpt]))
00166 _VIRIAL.addnvv(0.5*dphi,rij,rij);
00167 }
00168 }
00169
00170
00171
00172 return 0;
00173 }
00174
00175
00176 void ALGLUEFrame::Alloc()
00177 {
00178 MDPARALLELFrame::Alloc();
00179 int size;
00180 size=_NP*allocmultiple;
00181
00182
00183 Realloc(deru,double,size);
00184 Realloc(coord,double,size);
00185
00186 }
00187
00188 void ALGLUEFrame::potential()
00189 {
00190 al_glue();
00191 }
00192
00193 void ALGLUEFrame::initvars()
00194 {
00195
00196 MDPARALLELFrame::initvars();
00197 initglue();
00198 }
00199
00200 void ALGLUEFrame::initparser()
00201 {
00202 MDPARALLELFrame::initparser();
00203 }
00204
00205 int ALGLUEFrame::exec(char *name)
00206 {
00207 if(MDPARALLELFrame::exec(name)==0) return 0;
00208 return -1;
00209 }
00210
00211 #ifdef _TEST
00212
00213
00214 class ALGLUEFrame sim;
00215
00216
00217 #include "main.cpp"
00218
00219 #endif//_TEST