Merge "Merge release-5-0 into master"
[alexxy/gromacs.git] / src / gromacs / mdlib / force.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5  * Copyright (c) 2001-2004, The GROMACS development team.
6  * Copyright (c) 2013,2014, by the GROMACS development team, led by
7  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8  * and including many others, as listed in the AUTHORS file in the
9  * top-level source directory and at http://www.gromacs.org.
10  *
11  * GROMACS is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public License
13  * as published by the Free Software Foundation; either version 2.1
14  * of the License, or (at your option) any later version.
15  *
16  * GROMACS is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with GROMACS; if not, see
23  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
25  *
26  * If you want to redistribute modifications to GROMACS, please
27  * consider that scientific software is very special. Version
28  * control is crucial - bugs must be traceable. We will be happy to
29  * consider code for inclusion in the official distribution, but
30  * derived work must not be called official GROMACS. Details are found
31  * in the README & COPYING files - if they are missing, get the
32  * official version at http://www.gromacs.org.
33  *
34  * To help us fund GROMACS development, we humbly ask that you cite
35  * the research papers on the package. Check out http://www.gromacs.org.
36  */
37 #ifdef HAVE_CONFIG_H
38 #include <config.h>
39 #endif
40
41 #include <assert.h>
42 #include <math.h>
43 #include <string.h>
44
45 #include "typedefs.h"
46 #include "macros.h"
47 #include "macros.h"
48 #include "physics.h"
49 #include "force.h"
50 #include "nonbonded.h"
51 #include "names.h"
52 #include "network.h"
53 #include "pbc.h"
54 #include "ns.h"
55 #include "nrnb.h"
56 #include "bondf.h"
57 #include "mshift.h"
58 #include "txtdump.h"
59 #include "coulomb.h"
60 #include "pme.h"
61 #include "mdrun.h"
62 #include "domdec.h"
63 #include "qmmm.h"
64 #include "gmx_omp_nthreads.h"
65
66 #include "gromacs/legacyheaders/types/commrec.h"
67 #include "gromacs/math/vec.h"
68 #include "gromacs/timing/wallcycle.h"
69 #include "gromacs/utility/fatalerror.h"
70 #include "gromacs/utility/smalloc.h"
71
72 void ns(FILE              *fp,
73         t_forcerec        *fr,
74         matrix             box,
75         gmx_groups_t      *groups,
76         gmx_localtop_t    *top,
77         t_mdatoms         *md,
78         t_commrec         *cr,
79         t_nrnb            *nrnb,
80         gmx_bool           bFillGrid,
81         gmx_bool           bDoLongRangeNS)
82 {
83     char   *ptr;
84     int     nsearch;
85
86
87     if (!fr->ns.nblist_initialized)
88     {
89         init_neighbor_list(fp, fr, md->homenr);
90     }
91
92     if (fr->bTwinRange)
93     {
94         fr->nlr = 0;
95     }
96
97     nsearch = search_neighbours(fp, fr, box, top, groups, cr, nrnb, md,
98                                 bFillGrid, bDoLongRangeNS);
99     if (debug)
100     {
101         fprintf(debug, "nsearch = %d\n", nsearch);
102     }
103
104     /* Check whether we have to do dynamic load balancing */
105     /*if ((nsb->nstDlb > 0) && (mod(step,nsb->nstDlb) == 0))
106        count_nb(cr,nsb,&(top->blocks[ebCGS]),nns,fr->nlr,
107        &(top->idef),opts->ngener);
108      */
109     if (fr->ns.dump_nl > 0)
110     {
111         dump_nblist(fp, cr, fr, fr->ns.dump_nl);
112     }
113 }
114
115 static void reduce_thread_forces(int n, rvec *f,
116                                  tensor vir_q, tensor vir_lj,
117                                  real *Vcorr_q, real *Vcorr_lj,
118                                  real *dvdl_q, real *dvdl_lj,
119                                  int nthreads, f_thread_t *f_t)
120 {
121     int t, i;
122
123     /* This reduction can run over any number of threads */
124 #pragma omp parallel for num_threads(gmx_omp_nthreads_get(emntBonded)) private(t) schedule(static)
125     for (i = 0; i < n; i++)
126     {
127         for (t = 1; t < nthreads; t++)
128         {
129             rvec_inc(f[i], f_t[t].f[i]);
130         }
131     }
132     for (t = 1; t < nthreads; t++)
133     {
134         *Vcorr_q  += f_t[t].Vcorr_q;
135         *Vcorr_lj += f_t[t].Vcorr_lj;
136         *dvdl_q   += f_t[t].dvdl[efptCOUL];
137         *dvdl_lj  += f_t[t].dvdl[efptVDW];
138         m_add(vir_q, f_t[t].vir_q, vir_q);
139         m_add(vir_lj, f_t[t].vir_lj, vir_lj);
140     }
141 }
142
143 void gmx_print_sepdvdl(FILE *fplog, const char *s, real v, real dvdlambda)
144 {
145     fprintf(fplog, "  %-30s V %12.5e  dVdl %12.5e\n", s, v, dvdlambda);
146 }
147
148 void do_force_lowlevel(FILE       *fplog,   gmx_int64_t step,
149                        t_forcerec *fr,      t_inputrec *ir,
150                        t_idef     *idef,    t_commrec  *cr,
151                        t_nrnb     *nrnb,    gmx_wallcycle_t wcycle,
152                        t_mdatoms  *md,
153                        rvec       x[],      history_t  *hist,
154                        rvec       f[],
155                        rvec       f_longrange[],
156                        gmx_enerdata_t *enerd,
157                        t_fcdata   *fcd,
158                        gmx_localtop_t *top,
159                        gmx_genborn_t *born,
160                        t_atomtypes *atype,
161                        gmx_bool       bBornRadii,
162                        matrix     box,
163                        t_lambda   *fepvals,
164                        real       *lambda,
165                        t_graph    *graph,
166                        t_blocka   *excl,
167                        rvec       mu_tot[],
168                        int        flags,
169                        float      *cycles_pme)
170 {
171     int         i, j;
172     int         donb_flags;
173     gmx_bool    bDoEpot, bSepDVDL, bSB;
174     int         pme_flags;
175     matrix      boxs;
176     rvec        box_size;
177     t_pbc       pbc;
178     char        buf[22];
179     double      clam_i, vlam_i;
180     real        dvdl_dum[efptNR], dvdl_nb[efptNR], lam_i[efptNR];
181     real        dvdl_q, dvdl_lj;
182
183 #ifdef GMX_MPI
184     double  t0 = 0.0, t1, t2, t3; /* time measurement for coarse load balancing */
185 #endif
186
187 #define PRINT_SEPDVDL(s, v, dvdlambda) if (bSepDVDL) { gmx_print_sepdvdl(fplog, s, v, dvdlambda); }
188
189     set_pbc(&pbc, fr->ePBC, box);
190
191     /* reset free energy components */
192     for (i = 0; i < efptNR; i++)
193     {
194         dvdl_nb[i]  = 0;
195         dvdl_dum[i] = 0;
196     }
197
198     /* Reset box */
199     for (i = 0; (i < DIM); i++)
200     {
201         box_size[i] = box[i][i];
202     }
203
204     bSepDVDL = (fr->bSepDVDL && do_per_step(step, ir->nstlog));
205     debug_gmx();
206
207     /* do QMMM first if requested */
208     if (fr->bQMMM)
209     {
210         enerd->term[F_EQM] = calculate_QMMM(cr, x, f, fr);
211     }
212
213     if (bSepDVDL)
214     {
215         fprintf(fplog, "Step %s: non-bonded V and dVdl for node %d:\n",
216                 gmx_step_str(step, buf), cr->nodeid);
217     }
218
219     /* Call the short range functions all in one go. */
220
221 #ifdef GMX_MPI
222     /*#define TAKETIME ((cr->npmenodes) && (fr->timesteps < 12))*/
223 #define TAKETIME FALSE
224     if (TAKETIME)
225     {
226         MPI_Barrier(cr->mpi_comm_mygroup);
227         t0 = MPI_Wtime();
228     }
229 #endif
230
231     if (ir->nwall)
232     {
233         /* foreign lambda component for walls */
234         real dvdl_walls = do_walls(ir, fr, box, md, x, f, lambda[efptVDW],
235                                    enerd->grpp.ener[egLJSR], nrnb);
236         PRINT_SEPDVDL("Walls", 0.0, dvdl_walls);
237         enerd->dvdl_lin[efptVDW] += dvdl_walls;
238     }
239
240     /* If doing GB, reset dvda and calculate the Born radii */
241     if (ir->implicit_solvent)
242     {
243         wallcycle_sub_start(wcycle, ewcsNONBONDED);
244
245         for (i = 0; i < born->nr; i++)
246         {
247             fr->dvda[i] = 0;
248         }
249
250         if (bBornRadii)
251         {
252             calc_gb_rad(cr, fr, ir, top, x, &(fr->gblist), born, md, nrnb);
253         }
254
255         wallcycle_sub_stop(wcycle, ewcsNONBONDED);
256     }
257
258     where();
259     /* We only do non-bonded calculation with group scheme here, the verlet
260      * calls are done from do_force_cutsVERLET(). */
261     if (fr->cutoff_scheme == ecutsGROUP && (flags & GMX_FORCE_NONBONDED))
262     {
263         donb_flags = 0;
264         /* Add short-range interactions */
265         donb_flags |= GMX_NONBONDED_DO_SR;
266
267         /* Currently all group scheme kernels always calculate (shift-)forces */
268         if (flags & GMX_FORCE_FORCES)
269         {
270             donb_flags |= GMX_NONBONDED_DO_FORCE;
271         }
272         if (flags & GMX_FORCE_VIRIAL)
273         {
274             donb_flags |= GMX_NONBONDED_DO_SHIFTFORCE;
275         }
276         if (flags & GMX_FORCE_ENERGY)
277         {
278             donb_flags |= GMX_NONBONDED_DO_POTENTIAL;
279         }
280         if (flags & GMX_FORCE_DO_LR)
281         {
282             donb_flags |= GMX_NONBONDED_DO_LR;
283         }
284
285         wallcycle_sub_start(wcycle, ewcsNONBONDED);
286         do_nonbonded(fr, x, f, f_longrange, md, excl,
287                      &enerd->grpp, nrnb,
288                      lambda, dvdl_nb, -1, -1, donb_flags);
289
290         /* If we do foreign lambda and we have soft-core interactions
291          * we have to recalculate the (non-linear) energies contributions.
292          */
293         if (fepvals->n_lambda > 0 && (flags & GMX_FORCE_DHDL) && fepvals->sc_alpha != 0)
294         {
295             for (i = 0; i < enerd->n_lambda; i++)
296             {
297                 for (j = 0; j < efptNR; j++)
298                 {
299                     lam_i[j] = (i == 0 ? lambda[j] : fepvals->all_lambda[j][i-1]);
300                 }
301                 reset_foreign_enerdata(enerd);
302                 do_nonbonded(fr, x, f, f_longrange, md, excl,
303                              &(enerd->foreign_grpp), nrnb,
304                              lam_i, dvdl_dum, -1, -1,
305                              (donb_flags & ~GMX_NONBONDED_DO_FORCE) | GMX_NONBONDED_DO_FOREIGNLAMBDA);
306                 sum_epot(&(enerd->foreign_grpp), enerd->foreign_term);
307                 enerd->enerpart_lambda[i] += enerd->foreign_term[F_EPOT];
308             }
309         }
310         wallcycle_sub_stop(wcycle, ewcsNONBONDED);
311         where();
312     }
313
314     /* If we are doing GB, calculate bonded forces and apply corrections
315      * to the solvation forces */
316     /* MRS: Eventually, many need to include free energy contribution here! */
317     if (ir->implicit_solvent)
318     {
319         wallcycle_sub_start(wcycle, ewcsBONDED);
320         calc_gb_forces(cr, md, born, top, x, f, fr, idef,
321                        ir->gb_algorithm, ir->sa_algorithm, nrnb, &pbc, graph, enerd);
322         wallcycle_sub_stop(wcycle, ewcsBONDED);
323     }
324
325 #ifdef GMX_MPI
326     if (TAKETIME)
327     {
328         t1          = MPI_Wtime();
329         fr->t_fnbf += t1-t0;
330     }
331 #endif
332
333     if (fepvals->sc_alpha != 0)
334     {
335         enerd->dvdl_nonlin[efptVDW] += dvdl_nb[efptVDW];
336     }
337     else
338     {
339         enerd->dvdl_lin[efptVDW] += dvdl_nb[efptVDW];
340     }
341
342     if (fepvals->sc_alpha != 0)
343
344     /* even though coulomb part is linear, we already added it, beacuse we
345        need to go through the vdw calculation anyway */
346     {
347         enerd->dvdl_nonlin[efptCOUL] += dvdl_nb[efptCOUL];
348     }
349     else
350     {
351         enerd->dvdl_lin[efptCOUL] += dvdl_nb[efptCOUL];
352     }
353
354     if (bSepDVDL)
355     {
356         real V_short_range    = 0;
357         real dvdl_short_range = 0;
358
359         for (i = 0; i < enerd->grpp.nener; i++)
360         {
361             V_short_range +=
362                 (fr->bBHAM ?
363                  enerd->grpp.ener[egBHAMSR][i] :
364                  enerd->grpp.ener[egLJSR][i])
365                 + enerd->grpp.ener[egCOULSR][i] + enerd->grpp.ener[egGB][i];
366         }
367         dvdl_short_range = dvdl_nb[efptVDW] + dvdl_nb[efptCOUL];
368         PRINT_SEPDVDL("VdW and Coulomb SR particle-p.",
369                       V_short_range,
370                       dvdl_short_range);
371     }
372     debug_gmx();
373
374
375     if (debug)
376     {
377         pr_rvecs(debug, 0, "fshift after SR", fr->fshift, SHIFTS);
378     }
379
380     /* Shift the coordinates. Must be done before bonded forces and PPPM,
381      * but is also necessary for SHAKE and update, therefore it can NOT
382      * go when no bonded forces have to be evaluated.
383      */
384
385     /* Here sometimes we would not need to shift with NBFonly,
386      * but we do so anyhow for consistency of the returned coordinates.
387      */
388     if (graph)
389     {
390         shift_self(graph, box, x);
391         if (TRICLINIC(box))
392         {
393             inc_nrnb(nrnb, eNR_SHIFTX, 2*graph->nnodes);
394         }
395         else
396         {
397             inc_nrnb(nrnb, eNR_SHIFTX, graph->nnodes);
398         }
399     }
400     /* Check whether we need to do bondeds or correct for exclusions */
401     if (fr->bMolPBC &&
402         ((flags & GMX_FORCE_BONDED)
403          || EEL_RF(fr->eeltype) || EEL_FULL(fr->eeltype) || EVDW_PME(fr->vdwtype)))
404     {
405         /* Since all atoms are in the rectangular or triclinic unit-cell,
406          * only single box vector shifts (2 in x) are required.
407          */
408         set_pbc_dd(&pbc, fr->ePBC, cr->dd, TRUE, box);
409     }
410     debug_gmx();
411
412     if (flags & GMX_FORCE_BONDED)
413     {
414         wallcycle_sub_start(wcycle, ewcsBONDED);
415         calc_bonds(fplog, cr->ms,
416                    idef, x, hist, f, fr, &pbc, graph, enerd, nrnb, lambda, md, fcd,
417                    DOMAINDECOMP(cr) ? cr->dd->gatindex : NULL, atype, born,
418                    flags,
419                    fr->bSepDVDL && do_per_step(step, ir->nstlog), step);
420
421         /* Check if we have to determine energy differences
422          * at foreign lambda's.
423          */
424         if (fepvals->n_lambda > 0 && (flags & GMX_FORCE_DHDL) &&
425             idef->ilsort != ilsortNO_FE)
426         {
427             if (idef->ilsort != ilsortFE_SORTED)
428             {
429                 gmx_incons("The bonded interactions are not sorted for free energy");
430             }
431             for (i = 0; i < enerd->n_lambda; i++)
432             {
433                 reset_foreign_enerdata(enerd);
434                 for (j = 0; j < efptNR; j++)
435                 {
436                     lam_i[j] = (i == 0 ? lambda[j] : fepvals->all_lambda[j][i-1]);
437                 }
438                 calc_bonds_lambda(fplog, idef, x, fr, &pbc, graph, &(enerd->foreign_grpp), enerd->foreign_term, nrnb, lam_i, md,
439                                   fcd, DOMAINDECOMP(cr) ? cr->dd->gatindex : NULL);
440                 sum_epot(&(enerd->foreign_grpp), enerd->foreign_term);
441                 enerd->enerpart_lambda[i] += enerd->foreign_term[F_EPOT];
442             }
443         }
444         debug_gmx();
445
446         wallcycle_sub_stop(wcycle, ewcsBONDED);
447     }
448
449     where();
450
451     *cycles_pme = 0;
452     clear_mat(fr->vir_el_recip);
453     clear_mat(fr->vir_lj_recip);
454
455     /* Do long-range electrostatics and/or LJ-PME, including related short-range
456      * corrections.
457      */
458     if (EEL_FULL(fr->eeltype) || EVDW_PME(fr->vdwtype))
459     {
460         real Vlr               = 0, Vcorr = 0;
461         real dvdl_long_range   = 0;
462         int  status            = 0;
463         real Vlr_q             = 0, Vlr_lj = 0, Vcorr_q = 0, Vcorr_lj = 0;
464         real dvdl_long_range_q = 0, dvdl_long_range_lj = 0;
465
466         bSB = (ir->nwall == 2);
467         if (bSB)
468         {
469             copy_mat(box, boxs);
470             svmul(ir->wall_ewald_zfac, boxs[ZZ], boxs[ZZ]);
471             box_size[ZZ] *= ir->wall_ewald_zfac;
472         }
473
474         if (EEL_PME_EWALD(fr->eeltype) || EVDW_PME(fr->vdwtype))
475         {
476             real dvdl_long_range_correction_q   = 0;
477             real dvdl_long_range_correction_lj  = 0;
478             /* With the Verlet scheme exclusion forces are calculated
479              * in the non-bonded kernel.
480              */
481             /* The TPI molecule does not have exclusions with the rest
482              * of the system and no intra-molecular PME grid
483              * contributions will be calculated in
484              * gmx_pme_calc_energy.
485              */
486             if ((ir->cutoff_scheme == ecutsGROUP && fr->n_tpi == 0) ||
487                 ir->ewald_geometry != eewg3D ||
488                 ir->epsilon_surface != 0)
489             {
490                 int nthreads, t;
491
492                 wallcycle_sub_start(wcycle, ewcsEWALD_CORRECTION);
493
494                 if (fr->n_tpi > 0)
495                 {
496                     gmx_fatal(FARGS, "TPI with PME currently only works in a 3D geometry with tin-foil boundary conditions");
497                 }
498
499                 nthreads = gmx_omp_nthreads_get(emntBonded);
500 #pragma omp parallel for num_threads(nthreads) schedule(static)
501                 for (t = 0; t < nthreads; t++)
502                 {
503                     int     s, e, i;
504                     rvec   *fnv;
505                     tensor *vir_q, *vir_lj;
506                     real   *Vcorrt_q, *Vcorrt_lj, *dvdlt_q, *dvdlt_lj;
507                     if (t == 0)
508                     {
509                         fnv       = fr->f_novirsum;
510                         vir_q     = &fr->vir_el_recip;
511                         vir_lj    = &fr->vir_lj_recip;
512                         Vcorrt_q  = &Vcorr_q;
513                         Vcorrt_lj = &Vcorr_lj;
514                         dvdlt_q   = &dvdl_long_range_correction_q;
515                         dvdlt_lj  = &dvdl_long_range_correction_lj;
516                     }
517                     else
518                     {
519                         fnv       = fr->f_t[t].f;
520                         vir_q     = &fr->f_t[t].vir_q;
521                         vir_lj    = &fr->f_t[t].vir_lj;
522                         Vcorrt_q  = &fr->f_t[t].Vcorr_q;
523                         Vcorrt_lj = &fr->f_t[t].Vcorr_lj;
524                         dvdlt_q   = &fr->f_t[t].dvdl[efptCOUL];
525                         dvdlt_lj  = &fr->f_t[t].dvdl[efptVDW];
526                         for (i = 0; i < fr->natoms_force; i++)
527                         {
528                             clear_rvec(fnv[i]);
529                         }
530                         clear_mat(*vir_q);
531                         clear_mat(*vir_lj);
532                     }
533                     *dvdlt_q  = 0;
534                     *dvdlt_lj = 0;
535
536                     ewald_LRcorrection(fr->excl_load[t], fr->excl_load[t+1],
537                                        cr, t, fr,
538                                        md->chargeA,
539                                        md->nChargePerturbed ? md->chargeB : NULL,
540                                        md->sqrt_c6A,
541                                        md->nTypePerturbed ? md->sqrt_c6B : NULL,
542                                        md->sigmaA,
543                                        md->nTypePerturbed ? md->sigmaB : NULL,
544                                        md->sigma3A,
545                                        md->nTypePerturbed ? md->sigma3B : NULL,
546                                        ir->cutoff_scheme != ecutsVERLET,
547                                        excl, x, bSB ? boxs : box, mu_tot,
548                                        ir->ewald_geometry,
549                                        ir->epsilon_surface,
550                                        fnv, *vir_q, *vir_lj,
551                                        Vcorrt_q, Vcorrt_lj,
552                                        lambda[efptCOUL], lambda[efptVDW],
553                                        dvdlt_q, dvdlt_lj);
554                 }
555                 if (nthreads > 1)
556                 {
557                     reduce_thread_forces(fr->natoms_force, fr->f_novirsum,
558                                          fr->vir_el_recip, fr->vir_lj_recip,
559                                          &Vcorr_q, &Vcorr_lj,
560                                          &dvdl_long_range_correction_q,
561                                          &dvdl_long_range_correction_lj,
562                                          nthreads, fr->f_t);
563                 }
564                 wallcycle_sub_stop(wcycle, ewcsEWALD_CORRECTION);
565             }
566
567             if (EEL_PME_EWALD(fr->eeltype) && fr->n_tpi == 0)
568             {
569                 Vcorr_q += ewald_charge_correction(cr, fr, lambda[efptCOUL], box,
570                                                    &dvdl_long_range_correction_q,
571                                                    fr->vir_el_recip);
572             }
573
574             PRINT_SEPDVDL("Ewald excl./charge/dip. corr.", Vcorr_q, dvdl_long_range_correction_q);
575             PRINT_SEPDVDL("Ewald excl. corr. LJ", Vcorr_lj, dvdl_long_range_correction_lj);
576             enerd->dvdl_lin[efptCOUL] += dvdl_long_range_correction_q;
577             enerd->dvdl_lin[efptVDW]  += dvdl_long_range_correction_lj;
578
579             if ((EEL_PME(fr->eeltype) || EVDW_PME(fr->vdwtype)) && (cr->duty & DUTY_PME))
580             {
581                 /* Do reciprocal PME for Coulomb and/or LJ. */
582                 assert(fr->n_tpi >= 0);
583                 if (fr->n_tpi == 0 || (flags & GMX_FORCE_STATECHANGED))
584                 {
585                     pme_flags = GMX_PME_SPREAD | GMX_PME_SOLVE;
586                     if (EEL_PME(fr->eeltype))
587                     {
588                         pme_flags     |= GMX_PME_DO_COULOMB;
589                     }
590                     if (EVDW_PME(fr->vdwtype))
591                     {
592                         pme_flags |= GMX_PME_DO_LJ;
593                     }
594                     if (flags & GMX_FORCE_FORCES)
595                     {
596                         pme_flags |= GMX_PME_CALC_F;
597                     }
598                     if (flags & GMX_FORCE_VIRIAL)
599                     {
600                         pme_flags |= GMX_PME_CALC_ENER_VIR;
601                     }
602                     if (fr->n_tpi > 0)
603                     {
604                         /* We don't calculate f, but we do want the potential */
605                         pme_flags |= GMX_PME_CALC_POT;
606                     }
607                     wallcycle_start(wcycle, ewcPMEMESH);
608                     status = gmx_pme_do(fr->pmedata,
609                                         0, md->homenr - fr->n_tpi,
610                                         x, fr->f_novirsum,
611                                         md->chargeA, md->chargeB,
612                                         md->sqrt_c6A, md->sqrt_c6B,
613                                         md->sigmaA, md->sigmaB,
614                                         bSB ? boxs : box, cr,
615                                         DOMAINDECOMP(cr) ? dd_pme_maxshift_x(cr->dd) : 0,
616                                         DOMAINDECOMP(cr) ? dd_pme_maxshift_y(cr->dd) : 0,
617                                         nrnb, wcycle,
618                                         fr->vir_el_recip, fr->ewaldcoeff_q,
619                                         fr->vir_lj_recip, fr->ewaldcoeff_lj,
620                                         &Vlr_q, &Vlr_lj,
621                                         lambda[efptCOUL], lambda[efptVDW],
622                                         &dvdl_long_range_q, &dvdl_long_range_lj, pme_flags);
623                     *cycles_pme = wallcycle_stop(wcycle, ewcPMEMESH);
624                     if (status != 0)
625                     {
626                         gmx_fatal(FARGS, "Error %d in reciprocal PME routine", status);
627                     }
628                     /* We should try to do as little computation after
629                      * this as possible, because parallel PME synchronizes
630                      * the nodes, so we want all load imbalance of the
631                      * rest of the force calculation to be before the PME
632                      * call.  DD load balancing is done on the whole time
633                      * of the force call (without PME).
634                      */
635                 }
636                 if (fr->n_tpi > 0)
637                 {
638                     if (EVDW_PME(ir->vdwtype))
639                     {
640
641                         gmx_fatal(FARGS, "Test particle insertion not implemented with LJ-PME");
642                     }
643                     /* Determine the PME grid energy of the test molecule
644                      * with the PME grid potential of the other charges.
645                      */
646                     gmx_pme_calc_energy(fr->pmedata, fr->n_tpi,
647                                         x + md->homenr - fr->n_tpi,
648                                         md->chargeA + md->homenr - fr->n_tpi,
649                                         &Vlr_q);
650                 }
651                 PRINT_SEPDVDL("PME mesh", Vlr_q + Vlr_lj, dvdl_long_range_q+dvdl_long_range_lj);
652             }
653         }
654
655         if (!EEL_PME(fr->eeltype) && EEL_PME_EWALD(fr->eeltype))
656         {
657             Vlr_q = do_ewald(ir, x, fr->f_novirsum,
658                              md->chargeA, md->chargeB,
659                              box_size, cr, md->homenr,
660                              fr->vir_el_recip, fr->ewaldcoeff_q,
661                              lambda[efptCOUL], &dvdl_long_range_q, fr->ewald_table);
662             PRINT_SEPDVDL("Ewald long-range", Vlr_q, dvdl_long_range_q);
663         }
664
665         /* Note that with separate PME nodes we get the real energies later */
666         enerd->dvdl_lin[efptCOUL] += dvdl_long_range_q;
667         enerd->dvdl_lin[efptVDW]  += dvdl_long_range_lj;
668         enerd->term[F_COUL_RECIP]  = Vlr_q + Vcorr_q;
669         enerd->term[F_LJ_RECIP]    = Vlr_lj + Vcorr_lj;
670         if (debug)
671         {
672             fprintf(debug, "Vlr_q = %g, Vcorr_q = %g, Vlr_corr_q = %g\n",
673                     Vlr_q, Vcorr_q, enerd->term[F_COUL_RECIP]);
674             pr_rvecs(debug, 0, "vir_el_recip after corr", fr->vir_el_recip, DIM);
675             pr_rvecs(debug, 0, "fshift after LR Corrections", fr->fshift, SHIFTS);
676             fprintf(debug, "Vlr_lj: %g, Vcorr_lj = %g, Vlr_corr_lj = %g\n",
677                     Vlr_lj, Vcorr_lj, enerd->term[F_LJ_RECIP]);
678             pr_rvecs(debug, 0, "vir_lj_recip after corr", fr->vir_lj_recip, DIM);
679         }
680     }
681     else
682     {
683         /* Is there a reaction-field exclusion correction needed? */
684         if (EEL_RF(fr->eeltype) && eelRF_NEC != fr->eeltype)
685         {
686             /* With the Verlet scheme, exclusion forces are calculated
687              * in the non-bonded kernel.
688              */
689             if (ir->cutoff_scheme != ecutsVERLET)
690             {
691                 real dvdl_rf_excl      = 0;
692                 enerd->term[F_RF_EXCL] =
693                     RF_excl_correction(fr, graph, md, excl, x, f,
694                                        fr->fshift, &pbc, lambda[efptCOUL], &dvdl_rf_excl);
695
696                 enerd->dvdl_lin[efptCOUL] += dvdl_rf_excl;
697                 PRINT_SEPDVDL("RF exclusion correction",
698                               enerd->term[F_RF_EXCL], dvdl_rf_excl);
699             }
700         }
701     }
702     where();
703     debug_gmx();
704
705     if (debug)
706     {
707         print_nrnb(debug, nrnb);
708     }
709     debug_gmx();
710
711 #ifdef GMX_MPI
712     if (TAKETIME)
713     {
714         t2 = MPI_Wtime();
715         MPI_Barrier(cr->mpi_comm_mygroup);
716         t3          = MPI_Wtime();
717         fr->t_wait += t3-t2;
718         if (fr->timesteps == 11)
719         {
720             fprintf(stderr, "* PP load balancing info: node %d, step %s, rel wait time=%3.0f%% , load string value: %7.2f\n",
721                     cr->nodeid, gmx_step_str(fr->timesteps, buf),
722                     100*fr->t_wait/(fr->t_wait+fr->t_fnbf),
723                     (fr->t_fnbf+fr->t_wait)/fr->t_fnbf);
724         }
725         fr->timesteps++;
726     }
727 #endif
728
729     if (debug)
730     {
731         pr_rvecs(debug, 0, "fshift after bondeds", fr->fshift, SHIFTS);
732     }
733
734 }
735
736 void init_enerdata(int ngener, int n_lambda, gmx_enerdata_t *enerd)
737 {
738     int i, n2;
739
740     for (i = 0; i < F_NRE; i++)
741     {
742         enerd->term[i]         = 0;
743         enerd->foreign_term[i] = 0;
744     }
745
746
747     for (i = 0; i < efptNR; i++)
748     {
749         enerd->dvdl_lin[i]     = 0;
750         enerd->dvdl_nonlin[i]  = 0;
751     }
752
753     n2 = ngener*ngener;
754     if (debug)
755     {
756         fprintf(debug, "Creating %d sized group matrix for energies\n", n2);
757     }
758     enerd->grpp.nener         = n2;
759     enerd->foreign_grpp.nener = n2;
760     for (i = 0; (i < egNR); i++)
761     {
762         snew(enerd->grpp.ener[i], n2);
763         snew(enerd->foreign_grpp.ener[i], n2);
764     }
765
766     if (n_lambda)
767     {
768         enerd->n_lambda = 1 + n_lambda;
769         snew(enerd->enerpart_lambda, enerd->n_lambda);
770     }
771     else
772     {
773         enerd->n_lambda = 0;
774     }
775 }
776
777 void destroy_enerdata(gmx_enerdata_t *enerd)
778 {
779     int i;
780
781     for (i = 0; (i < egNR); i++)
782     {
783         sfree(enerd->grpp.ener[i]);
784     }
785
786     for (i = 0; (i < egNR); i++)
787     {
788         sfree(enerd->foreign_grpp.ener[i]);
789     }
790
791     if (enerd->n_lambda)
792     {
793         sfree(enerd->enerpart_lambda);
794     }
795 }
796
797 static real sum_v(int n, real v[])
798 {
799     real t;
800     int  i;
801
802     t = 0.0;
803     for (i = 0; (i < n); i++)
804     {
805         t = t + v[i];
806     }
807
808     return t;
809 }
810
811 void sum_epot(gmx_grppairener_t *grpp, real *epot)
812 {
813     int i;
814
815     /* Accumulate energies */
816     epot[F_COUL_SR]  = sum_v(grpp->nener, grpp->ener[egCOULSR]);
817     epot[F_LJ]       = sum_v(grpp->nener, grpp->ener[egLJSR]);
818     epot[F_LJ14]     = sum_v(grpp->nener, grpp->ener[egLJ14]);
819     epot[F_COUL14]   = sum_v(grpp->nener, grpp->ener[egCOUL14]);
820     epot[F_COUL_LR]  = sum_v(grpp->nener, grpp->ener[egCOULLR]);
821     epot[F_LJ_LR]    = sum_v(grpp->nener, grpp->ener[egLJLR]);
822     /* We have already added 1-2,1-3, and 1-4 terms to F_GBPOL */
823     epot[F_GBPOL]   += sum_v(grpp->nener, grpp->ener[egGB]);
824
825 /* lattice part of LR doesnt belong to any group
826  * and has been added earlier
827  */
828     epot[F_BHAM]     = sum_v(grpp->nener, grpp->ener[egBHAMSR]);
829     epot[F_BHAM_LR]  = sum_v(grpp->nener, grpp->ener[egBHAMLR]);
830
831     epot[F_EPOT] = 0;
832     for (i = 0; (i < F_EPOT); i++)
833     {
834         if (i != F_DISRESVIOL && i != F_ORIRESDEV)
835         {
836             epot[F_EPOT] += epot[i];
837         }
838     }
839 }
840
841 void sum_dhdl(gmx_enerdata_t *enerd, real *lambda, t_lambda *fepvals)
842 {
843     int    i, j, index;
844     double dlam;
845
846     enerd->dvdl_lin[efptVDW] += enerd->term[F_DVDL_VDW];  /* include dispersion correction */
847     enerd->term[F_DVDL]       = 0.0;
848     for (i = 0; i < efptNR; i++)
849     {
850         if (fepvals->separate_dvdl[i])
851         {
852             /* could this be done more readably/compactly? */
853             switch (i)
854             {
855                 case (efptMASS):
856                     index = F_DKDL;
857                     break;
858                 case (efptCOUL):
859                     index = F_DVDL_COUL;
860                     break;
861                 case (efptVDW):
862                     index = F_DVDL_VDW;
863                     break;
864                 case (efptBONDED):
865                     index = F_DVDL_BONDED;
866                     break;
867                 case (efptRESTRAINT):
868                     index = F_DVDL_RESTRAINT;
869                     break;
870                 default:
871                     index = F_DVDL;
872                     break;
873             }
874             enerd->term[index] = enerd->dvdl_lin[i] + enerd->dvdl_nonlin[i];
875             if (debug)
876             {
877                 fprintf(debug, "dvdl-%s[%2d]: %f: non-linear %f + linear %f\n",
878                         efpt_names[i], i, enerd->term[index], enerd->dvdl_nonlin[i], enerd->dvdl_lin[i]);
879             }
880         }
881         else
882         {
883             enerd->term[F_DVDL] += enerd->dvdl_lin[i] + enerd->dvdl_nonlin[i];
884             if (debug)
885             {
886                 fprintf(debug, "dvd-%sl[%2d]: %f: non-linear %f + linear %f\n",
887                         efpt_names[0], i, enerd->term[F_DVDL], enerd->dvdl_nonlin[i], enerd->dvdl_lin[i]);
888             }
889         }
890     }
891
892     /* Notes on the foreign lambda free energy difference evaluation:
893      * Adding the potential and ekin terms that depend linearly on lambda
894      * as delta lam * dvdl to the energy differences is exact.
895      * For the constraints this is not exact, but we have no other option
896      * without literally changing the lengths and reevaluating the energies at each step.
897      * (try to remedy this post 4.6 - MRS)
898      * For the non-bonded LR term we assume that the soft-core (if present)
899      * no longer affects the energy beyond the short-range cut-off,
900      * which is a very good approximation (except for exotic settings).
901      * (investigate how to overcome this post 4.6 - MRS)
902      */
903     if (fepvals->separate_dvdl[efptBONDED])
904     {
905         enerd->term[F_DVDL_BONDED] += enerd->term[F_DVDL_CONSTR];
906     }
907     else
908     {
909         enerd->term[F_DVDL] += enerd->term[F_DVDL_CONSTR];
910     }
911     enerd->term[F_DVDL_CONSTR] = 0;
912
913     for (i = 0; i < fepvals->n_lambda; i++)
914     {
915         /* note we are iterating over fepvals here!
916            For the current lam, dlam = 0 automatically,
917            so we don't need to add anything to the
918            enerd->enerpart_lambda[0] */
919
920         /* we don't need to worry about dvdl_lin contributions to dE at
921            current lambda, because the contributions to the current
922            lambda are automatically zeroed */
923
924         for (j = 0; j < efptNR; j++)
925         {
926             /* Note that this loop is over all dhdl components, not just the separated ones */
927             dlam = (fepvals->all_lambda[j][i]-lambda[j]);
928             enerd->enerpart_lambda[i+1] += dlam*enerd->dvdl_lin[j];
929             if (debug)
930             {
931                 fprintf(debug, "enerdiff lam %g: (%15s), non-linear %f linear %f*%f\n",
932                         fepvals->all_lambda[j][i], efpt_names[j],
933                         (enerd->enerpart_lambda[i+1] - enerd->enerpart_lambda[0]),
934                         dlam, enerd->dvdl_lin[j]);
935             }
936         }
937     }
938 }
939
940
941 void reset_foreign_enerdata(gmx_enerdata_t *enerd)
942 {
943     int  i, j;
944
945     /* First reset all foreign energy components.  Foreign energies always called on
946        neighbor search steps */
947     for (i = 0; (i < egNR); i++)
948     {
949         for (j = 0; (j < enerd->grpp.nener); j++)
950         {
951             enerd->foreign_grpp.ener[i][j] = 0.0;
952         }
953     }
954
955     /* potential energy components */
956     for (i = 0; (i <= F_EPOT); i++)
957     {
958         enerd->foreign_term[i] = 0.0;
959     }
960 }
961
962 void reset_enerdata(t_forcerec *fr, gmx_bool bNS,
963                     gmx_enerdata_t *enerd,
964                     gmx_bool bMaster)
965 {
966     gmx_bool bKeepLR;
967     int      i, j;
968
969     /* First reset all energy components, except for the long range terms
970      * on the master at non neighbor search steps, since the long range
971      * terms have already been summed at the last neighbor search step.
972      */
973     bKeepLR = (fr->bTwinRange && !bNS);
974     for (i = 0; (i < egNR); i++)
975     {
976         if (!(bKeepLR && bMaster && (i == egCOULLR || i == egLJLR)))
977         {
978             for (j = 0; (j < enerd->grpp.nener); j++)
979             {
980                 enerd->grpp.ener[i][j] = 0.0;
981             }
982         }
983     }
984     for (i = 0; i < efptNR; i++)
985     {
986         enerd->dvdl_lin[i]    = 0.0;
987         enerd->dvdl_nonlin[i] = 0.0;
988     }
989
990     /* Normal potential energy components */
991     for (i = 0; (i <= F_EPOT); i++)
992     {
993         enerd->term[i] = 0.0;
994     }
995     /* Initialize the dVdlambda term with the long range contribution */
996     /* Initialize the dvdl term with the long range contribution */
997     enerd->term[F_DVDL]            = 0.0;
998     enerd->term[F_DVDL_COUL]       = 0.0;
999     enerd->term[F_DVDL_VDW]        = 0.0;
1000     enerd->term[F_DVDL_BONDED]     = 0.0;
1001     enerd->term[F_DVDL_RESTRAINT]  = 0.0;
1002     enerd->term[F_DKDL]            = 0.0;
1003     if (enerd->n_lambda > 0)
1004     {
1005         for (i = 0; i < enerd->n_lambda; i++)
1006         {
1007             enerd->enerpart_lambda[i] = 0.0;
1008         }
1009     }
1010     /* reset foreign energy data - separate function since we also call it elsewhere */
1011     reset_foreign_enerdata(enerd);
1012 }