4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-1999
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://md.chem.rug.nl/~gmx
27 * GRowing Old MAkes el Chrono Sweat
29 static char *SRCID_ewald_c
= "$Id$";
38 #include "ewald_util.h"
39 #include "shift_util.h"
50 /* the other routines are in complex.h */
51 static t_complex
conjmul(t_complex a
,t_complex b
)
55 c
.re
= a
.re
*b
.re
+ a
.im
*b
.im
;
56 c
.im
= a
.im
*b
.re
- a
.re
*b
.im
;
64 static void tabulate_eir(int natom
,rvec x
[],int kmax
,cvec
**eir
,rvec lll
)
69 printf("Go away! kmax = %d\n",kmax
);
73 for(i
=0; (i
<natom
); i
++) {
74 for(m
=0; (m
<3); m
++) {
79 for(m
=0; (m
<3); m
++) {
80 eir
[1][i
][m
].re
= cos(x
[i
][m
]*lll
[m
]);
81 eir
[1][i
][m
].im
= sin(x
[i
][m
]*lll
[m
]);
83 for(j
=2; (j
<kmax
); j
++)
85 eir
[j
][i
][m
] = cmul(eir
[j
-1][i
][m
],eir
[1][i
][m
]);
92 real
do_ewald(FILE *log
, bool bVerbose
,
95 real charge
[], rvec box
,
96 t_commrec
*cr
, t_nsborder
*nsb
,
97 matrix lrvir
, real ewaldcoeff
)
99 static bool bFirst
= TRUE
;
100 static int nx
,ny
,nz
,kmax
;
102 static t_complex
*tab_xy
,*tab_qxyz
;
103 real factor
=-1.0/(4*ewaldcoeff
*ewaldcoeff
);
106 int lowiy
,lowiz
,ix
,iy
,iz
,n
;
107 real tmp
,cs
,ss
,ak
,akv
,mx
,my
,mz
,m2
;
111 fprintf(log
,"Will do ordinary reciprocal space Ewald sum.\n");
115 fatal_error(0,"No parallel Ewald. Use PME instead.\n");
121 kmax
= max(nx
,max(ny
,nz
));
124 snew(eir
[n
],HOMENR(nsb
));
125 snew(tab_xy
,HOMENR(nsb
));
126 snew(tab_qxyz
,HOMENR(nsb
));
132 /* make tables for the structure factor parts */
133 tabulate_eir(HOMENR(nsb
),x
,kmax
,eir
,lll
);
138 for(ix
=0;ix
<nx
;ix
++) {
140 for(iy
=lowiy
;iy
<ny
;iy
++) {
143 for(n
=0;n
<HOMENR(nsb
);n
++)
144 tab_xy
[n
]=cmul(eir
[ix
][n
][XX
],eir
[iy
][n
][YY
]);
146 for(n
=0;n
<HOMENR(nsb
);n
++)
147 tab_xy
[n
]=conjmul(eir
[ix
][n
][XX
],eir
[-iy
][n
][YY
]);
148 for(iz
=lowiz
;iz
<nz
;iz
++) {
150 m2
=mx
*mx
+my
*my
+mz
*mz
;
151 ak
=exp(m2
*factor
)/m2
;
152 akv
=2.0*ak
*(1.0/m2
-factor
);
154 for(n
=0;n
<HOMENR(nsb
);n
++)
155 tab_qxyz
[n
]=rcmul(charge
[n
],cmul(tab_xy
[n
],eir
[iz
][n
][ZZ
]));
157 for(n
=0;n
<HOMENR(nsb
);n
++)
158 tab_qxyz
[n
]=rcmul(charge
[n
],conjmul(tab_xy
[n
],eir
[-iz
][n
][ZZ
]));
161 for(n
=0;n
<HOMENR(nsb
);n
++) {
165 energy
+=ak
*(cs
*cs
+ss
*ss
);
166 tmp
=akv
*(cs
*cs
+ss
*ss
);
167 lrvir
[XX
][XX
]-=tmp
*mx
*mx
;
168 lrvir
[XX
][YY
]-=tmp
*mx
*my
;
169 lrvir
[XX
][ZZ
]-=tmp
*mx
*mz
;
170 lrvir
[YY
][YY
]-=tmp
*my
*my
;
171 lrvir
[YY
][ZZ
]-=tmp
*my
*mz
;
172 lrvir
[ZZ
][ZZ
]-=tmp
*mz
*mz
;
173 for(n
=0;n
<HOMENR(nsb
);n
++) {
174 tmp
=ak
*(cs
*tab_qxyz
[n
].im
-ss
*tab_qxyz
[n
].re
);
184 tmp
=4.0*M_PI
/(box
[XX
]*box
[YY
]*box
[ZZ
])*ONE_4PI_EPS0
;
185 for(n
=0;n
<HOMENR(nsb
);n
++) {
190 lrvir
[XX
][XX
]=-0.5*tmp
*(lrvir
[XX
][XX
]+energy
);
191 lrvir
[XX
][YY
]=-0.5*tmp
*(lrvir
[XX
][YY
]);
192 lrvir
[XX
][ZZ
]=-0.5*tmp
*(lrvir
[XX
][ZZ
]);
193 lrvir
[YY
][YY
]=-0.5*tmp
*(lrvir
[YY
][YY
]+energy
);
194 lrvir
[YY
][ZZ
]=-0.5*tmp
*(lrvir
[YY
][ZZ
]);
195 lrvir
[ZZ
][ZZ
]=-0.5*tmp
*(lrvir
[ZZ
][ZZ
]+energy
);
197 lrvir
[YY
][XX
]=lrvir
[XX
][YY
];
198 lrvir
[ZZ
][XX
]=lrvir
[XX
][ZZ
];
199 lrvir
[ZZ
][YY
]=lrvir
[YY
][ZZ
];