2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014,2015,2016,2017,2018, 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.
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.
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.
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.
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.
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.
47 #include "gromacs/commandline/filenm.h"
48 #include "gromacs/domdec/domdec_struct.h"
49 #include "gromacs/fileio/gmxfio.h"
50 #include "gromacs/fileio/xvgr.h"
51 #include "gromacs/gmxlib/network.h"
52 #include "gromacs/gmxlib/nrnb.h"
53 #include "gromacs/linearalgebra/nrjac.h"
54 #include "gromacs/math/functions.h"
55 #include "gromacs/math/utilities.h"
56 #include "gromacs/math/vec.h"
57 #include "gromacs/math/vectypes.h"
58 #include "gromacs/mdlib/broadcaststructs.h"
59 #include "gromacs/mdlib/constr.h"
60 #include "gromacs/mdlib/groupcoord.h"
61 #include "gromacs/mdlib/mdrun.h"
62 #include "gromacs/mdlib/sim_util.h"
63 #include "gromacs/mdlib/update.h"
64 #include "gromacs/mdtypes/commrec.h"
65 #include "gromacs/mdtypes/edsamhistory.h"
66 #include "gromacs/mdtypes/inputrec.h"
67 #include "gromacs/mdtypes/md_enums.h"
68 #include "gromacs/mdtypes/observableshistory.h"
69 #include "gromacs/mdtypes/state.h"
70 #include "gromacs/pbcutil/pbc.h"
71 #include "gromacs/topology/mtop_lookup.h"
72 #include "gromacs/topology/topology.h"
73 #include "gromacs/utility/cstringutil.h"
74 #include "gromacs/utility/fatalerror.h"
75 #include "gromacs/utility/gmxassert.h"
76 #include "gromacs/utility/smalloc.h"
79 /* enum to identify the type of ED: none, normal ED, flooding */
81 eEDnone, eEDedsam, eEDflood, eEDnr
84 /* enum to identify operations on reference, average, origin, target structures */
86 eedREF, eedAV, eedORI, eedTAR, eedNR
92 int neig; /* nr of eigenvectors */
93 int *ieig; /* index nrs of eigenvectors */
94 real *stpsz; /* stepsizes (per eigenvector) */
95 rvec **vec; /* eigenvector components */
96 real *xproj; /* instantaneous x projections */
97 real *fproj; /* instantaneous f projections */
98 real radius; /* instantaneous radius */
99 real *refproj; /* starting or target projections */
100 /* When using flooding as harmonic restraint: The current reference projection
101 * is at each step calculated from the initial refproj0 and the slope. */
102 real *refproj0, *refprojslope;
108 t_eigvec mon; /* only monitored, no constraints */
109 t_eigvec linfix; /* fixed linear constraints */
110 t_eigvec linacc; /* acceptance linear constraints */
111 t_eigvec radfix; /* fixed radial constraints (exp) */
112 t_eigvec radacc; /* acceptance radial constraints (exp) */
113 t_eigvec radcon; /* acceptance rad. contraction constr. */
120 gmx_bool bHarmonic; /* Use flooding for harmonic restraint on
122 gmx_bool bConstForce; /* Do not calculate a flooding potential,
123 instead flood with a constant force */
132 rvec *forces_cartesian;
133 t_eigvec vecs; /* use flooding for these */
137 /* This type is for the average, reference, target, and origin structure */
138 typedef struct gmx_edx
140 int nr; /* number of atoms this structure contains */
141 int nr_loc; /* number of atoms on local node */
142 int *anrs; /* atom index numbers */
143 int *anrs_loc; /* local atom index numbers */
144 int nalloc_loc; /* allocation size of anrs_loc */
145 int *c_ind; /* at which position of the whole anrs
146 * array is a local atom?, i.e.
147 * c_ind[0...nr_loc-1] gives the atom index
148 * with respect to the collective
149 * anrs[0...nr-1] array */
150 rvec *x; /* positions for this structure */
151 rvec *x_old; /* Last positions which have the correct PBC
152 representation of the ED group. In
153 combination with keeping track of the
154 shift vectors, the ED group can always
156 real *m; /* masses */
157 real mtot; /* total mass (only used in sref) */
158 real *sqrtm; /* sqrt of the masses used for mass-
159 * weighting of analysis (only used in sav) */
165 int nini; /* total Nr of atoms */
166 gmx_bool fitmas; /* true if trans fit with cm */
167 gmx_bool pcamas; /* true if mass-weighted PCA */
168 int presteps; /* number of steps to run without any
169 * perturbations ... just monitoring */
170 int outfrq; /* freq (in steps) of writing to edo */
171 int maxedsteps; /* max nr of steps per cycle */
173 /* all gmx_edx datasets are copied to all nodes in the parallel case */
174 struct gmx_edx sref; /* reference positions, to these fitting
176 gmx_bool bRefEqAv; /* If true, reference & average indices
177 * are the same. Used for optimization */
178 struct gmx_edx sav; /* average positions */
179 struct gmx_edx star; /* target positions */
180 struct gmx_edx sori; /* origin positions */
182 t_edvecs vecs; /* eigenvectors */
183 real slope; /* minimal slope in acceptance radexp */
185 t_edflood flood; /* parameters especially for flooding */
186 struct t_ed_buffer *buf; /* handle to local buffers */
187 struct edpar *next_edi; /* Pointer to another ED group */
191 typedef struct gmx_edsam
193 int eEDtype; /* Type of ED: see enums above */
194 FILE *edo; /* output file pointer */
204 rvec old_transvec, older_transvec, transvec_compact;
205 rvec *xcoll; /* Positions from all nodes, this is the
206 collective set we work on.
207 These are the positions of atoms with
208 average structure indices */
209 rvec *xc_ref; /* same but with reference structure indices */
210 ivec *shifts_xcoll; /* Shifts for xcoll */
211 ivec *extra_shifts_xcoll; /* xcoll shift changes since last NS step */
212 ivec *shifts_xc_ref; /* Shifts for xc_ref */
213 ivec *extra_shifts_xc_ref; /* xc_ref shift changes since last NS step */
214 gmx_bool bUpdateShifts; /* TRUE in NS steps to indicate that the
215 ED shifts for this ED group need to
220 /* definition of ED buffer structure */
223 struct t_fit_to_ref * fit_to_ref;
224 struct t_do_edfit * do_edfit;
225 struct t_do_edsam * do_edsam;
226 struct t_do_radcon * do_radcon;
230 /* Function declarations */
231 static void fit_to_reference(rvec *xcoll, rvec transvec, matrix rotmat, t_edpar *edi);
232 static void translate_and_rotate(rvec *x, int nat, rvec transvec, matrix rotmat);
233 static real rmsd_from_structure(rvec *x, struct gmx_edx *s);
234 static int read_edi_file(const char *fn, t_edpar *edi, int nr_mdatoms);
235 static void crosscheck_edi_file_vs_checkpoint(gmx_edsam_t ed, edsamhistory_t *EDstate);
236 static void init_edsamstate(gmx_edsam_t ed, edsamhistory_t *EDstate);
237 static void write_edo_legend(gmx_edsam_t ed, int nED, const gmx_output_env_t *oenv);
238 /* End function declarations */
240 /* Define formats for the column width in the output file */
241 const char EDcol_sfmt[] = "%17s";
242 const char EDcol_efmt[] = "%17.5e";
243 const char EDcol_ffmt[] = "%17f";
245 /* Define a formats for reading, otherwise cppcheck complains for scanf without width limits */
246 const char max_ev_fmt_d[] = "%7d"; /* Number of eigenvectors. 9,999,999 should be enough */
247 const char max_ev_fmt_lf[] = "%12lf";
248 const char max_ev_fmt_dlf[] = "%7d%12lf";
249 const char max_ev_fmt_dlflflf[] = "%7d%12lf%12lf%12lf";
250 const char max_ev_fmt_lelele[] = "%12le%12le%12le";
252 /* Do we have to perform essential dynamics constraints or possibly only flooding
253 * for any of the ED groups? */
254 static gmx_bool bNeedDoEdsam(t_edpar *edi)
256 return edi->vecs.mon.neig
257 || edi->vecs.linfix.neig
258 || edi->vecs.linacc.neig
259 || edi->vecs.radfix.neig
260 || edi->vecs.radacc.neig
261 || edi->vecs.radcon.neig;
265 /* Multiple ED groups will be labeled with letters instead of numbers
266 * to avoid confusion with eigenvector indices */
267 static char get_EDgroupChar(int nr_edi, int nED)
275 * nr_edi = 2 -> B ...
277 return 'A' + nr_edi - 1;
281 /* Does not subtract average positions, projection on single eigenvector is returned
282 * used by: do_linfix, do_linacc, do_radfix, do_radacc, do_radcon
283 * Average position is subtracted in ed_apply_constraints prior to calling projectx
285 static real projectx(t_edpar *edi, rvec *xcoll, rvec *vec)
291 for (i = 0; i < edi->sav.nr; i++)
293 proj += edi->sav.sqrtm[i]*iprod(vec[i], xcoll[i]);
300 /* Specialized: projection is stored in vec->refproj
301 * -> used for radacc, radfix, radcon and center of flooding potential
302 * subtracts average positions, projects vector x */
303 static void rad_project(t_edpar *edi, rvec *x, t_eigvec *vec)
308 /* Subtract average positions */
309 for (i = 0; i < edi->sav.nr; i++)
311 rvec_dec(x[i], edi->sav.x[i]);
314 for (i = 0; i < vec->neig; i++)
316 vec->refproj[i] = projectx(edi, x, vec->vec[i]);
317 rad += gmx::square((vec->refproj[i]-vec->xproj[i]));
319 vec->radius = sqrt(rad);
321 /* Add average positions */
322 for (i = 0; i < edi->sav.nr; i++)
324 rvec_inc(x[i], edi->sav.x[i]);
329 /* Project vector x, subtract average positions prior to projection and add
330 * them afterwards to retain the unchanged vector. Store in xproj. Mass-weighting
332 static void project_to_eigvectors(rvec *x, /* The positions to project to an eigenvector */
333 t_eigvec *vec, /* The eigenvectors */
344 /* Subtract average positions */
345 for (i = 0; i < edi->sav.nr; i++)
347 rvec_dec(x[i], edi->sav.x[i]);
350 for (i = 0; i < vec->neig; i++)
352 vec->xproj[i] = projectx(edi, x, vec->vec[i]);
355 /* Add average positions */
356 for (i = 0; i < edi->sav.nr; i++)
358 rvec_inc(x[i], edi->sav.x[i]);
363 /* Project vector x onto all edi->vecs (mon, linfix,...) */
364 static void project(rvec *x, /* positions to project */
365 t_edpar *edi) /* edi data set */
367 /* It is not more work to subtract the average position in every
368 * subroutine again, because these routines are rarely used simultaneously */
369 project_to_eigvectors(x, &edi->vecs.mon, edi);
370 project_to_eigvectors(x, &edi->vecs.linfix, edi);
371 project_to_eigvectors(x, &edi->vecs.linacc, edi);
372 project_to_eigvectors(x, &edi->vecs.radfix, edi);
373 project_to_eigvectors(x, &edi->vecs.radacc, edi);
374 project_to_eigvectors(x, &edi->vecs.radcon, edi);
378 static real calc_radius(t_eigvec *vec)
384 for (i = 0; i < vec->neig; i++)
386 rad += gmx::square((vec->refproj[i]-vec->xproj[i]));
389 return rad = sqrt(rad);
394 static void dump_edi_positions(FILE *out, struct gmx_edx *s, const char name[])
399 fprintf(out, "#%s positions:\n%d\n", name, s->nr);
405 fprintf(out, "#index, x, y, z");
408 fprintf(out, ", sqrt(m)");
410 for (i = 0; i < s->nr; i++)
412 fprintf(out, "\n%6d %11.6f %11.6f %11.6f", s->anrs[i], s->x[i][XX], s->x[i][YY], s->x[i][ZZ]);
415 fprintf(out, "%9.3f", s->sqrtm[i]);
423 static void dump_edi_eigenvecs(FILE *out, t_eigvec *ev,
424 const char name[], int length)
429 fprintf(out, "#%s eigenvectors:\n%d\n", name, ev->neig);
430 /* Dump the data for every eigenvector: */
431 for (i = 0; i < ev->neig; i++)
433 fprintf(out, "EV %4d\ncomponents %d\nstepsize %f\nxproj %f\nfproj %f\nrefproj %f\nradius %f\nComponents:\n",
434 ev->ieig[i], length, ev->stpsz[i], ev->xproj[i], ev->fproj[i], ev->refproj[i], ev->radius);
435 for (j = 0; j < length; j++)
437 fprintf(out, "%11.6f %11.6f %11.6f\n", ev->vec[i][j][XX], ev->vec[i][j][YY], ev->vec[i][j][ZZ]);
444 static void dump_edi(t_edpar *edpars, const t_commrec *cr, int nr_edi)
450 sprintf(fn, "EDdump_rank%d_edi%d", cr->nodeid, nr_edi);
451 out = gmx_ffopen(fn, "w");
453 fprintf(out, "#NINI\n %d\n#FITMAS\n %d\n#ANALYSIS_MAS\n %d\n",
454 edpars->nini, edpars->fitmas, edpars->pcamas);
455 fprintf(out, "#OUTFRQ\n %d\n#MAXLEN\n %d\n#SLOPECRIT\n %f\n",
456 edpars->outfrq, edpars->maxedsteps, edpars->slope);
457 fprintf(out, "#PRESTEPS\n %d\n#DELTA_F0\n %f\n#TAU\n %f\n#EFL_NULL\n %f\n#ALPHA2\n %f\n",
458 edpars->presteps, edpars->flood.deltaF0, edpars->flood.tau,
459 edpars->flood.constEfl, edpars->flood.alpha2);
461 /* Dump reference, average, target, origin positions */
462 dump_edi_positions(out, &edpars->sref, "REFERENCE");
463 dump_edi_positions(out, &edpars->sav, "AVERAGE" );
464 dump_edi_positions(out, &edpars->star, "TARGET" );
465 dump_edi_positions(out, &edpars->sori, "ORIGIN" );
467 /* Dump eigenvectors */
468 dump_edi_eigenvecs(out, &edpars->vecs.mon, "MONITORED", edpars->sav.nr);
469 dump_edi_eigenvecs(out, &edpars->vecs.linfix, "LINFIX", edpars->sav.nr);
470 dump_edi_eigenvecs(out, &edpars->vecs.linacc, "LINACC", edpars->sav.nr);
471 dump_edi_eigenvecs(out, &edpars->vecs.radfix, "RADFIX", edpars->sav.nr);
472 dump_edi_eigenvecs(out, &edpars->vecs.radacc, "RADACC", edpars->sav.nr);
473 dump_edi_eigenvecs(out, &edpars->vecs.radcon, "RADCON", edpars->sav.nr);
475 /* Dump flooding eigenvectors */
476 dump_edi_eigenvecs(out, &edpars->flood.vecs, "FLOODING", edpars->sav.nr);
478 /* Dump ed local buffer */
479 fprintf(out, "buf->do_edfit =%p\n", (void*)edpars->buf->do_edfit );
480 fprintf(out, "buf->do_edsam =%p\n", (void*)edpars->buf->do_edsam );
481 fprintf(out, "buf->do_radcon =%p\n", (void*)edpars->buf->do_radcon );
492 static void do_edfit(int natoms, rvec *xp, rvec *x, matrix R, t_edpar *edi)
494 /* this is a copy of do_fit with some modifications */
495 int c, r, n, j, i, irot;
496 double d[6], xnr, xpc;
501 struct t_do_edfit *loc;
504 if (edi->buf->do_edfit != nullptr)
511 snew(edi->buf->do_edfit, 1);
513 loc = edi->buf->do_edfit;
517 snew(loc->omega, 2*DIM);
518 snew(loc->om, 2*DIM);
519 for (i = 0; i < 2*DIM; i++)
521 snew(loc->omega[i], 2*DIM);
522 snew(loc->om[i], 2*DIM);
526 for (i = 0; (i < 6); i++)
529 for (j = 0; (j < 6); j++)
531 loc->omega[i][j] = 0;
536 /* calculate the matrix U */
538 for (n = 0; (n < natoms); n++)
540 for (c = 0; (c < DIM); c++)
543 for (r = 0; (r < DIM); r++)
551 /* construct loc->omega */
552 /* loc->omega is symmetric -> loc->omega==loc->omega' */
553 for (r = 0; (r < 6); r++)
555 for (c = 0; (c <= r); c++)
557 if ((r >= 3) && (c < 3))
559 loc->omega[r][c] = u[r-3][c];
560 loc->omega[c][r] = u[r-3][c];
564 loc->omega[r][c] = 0;
565 loc->omega[c][r] = 0;
570 /* determine h and k */
571 jacobi(loc->omega, 6, d, loc->om, &irot);
575 fprintf(stderr, "IROT=0\n");
578 index = 0; /* For the compiler only */
580 for (j = 0; (j < 3); j++)
583 for (i = 0; (i < 6); i++)
592 for (i = 0; (i < 3); i++)
594 vh[j][i] = M_SQRT2*loc->om[i][index];
595 vk[j][i] = M_SQRT2*loc->om[i+DIM][index];
600 for (c = 0; (c < 3); c++)
602 for (r = 0; (r < 3); r++)
604 R[c][r] = vk[0][r]*vh[0][c]+
611 for (c = 0; (c < 3); c++)
613 for (r = 0; (r < 3); r++)
615 R[c][r] = vk[0][r]*vh[0][c]+
624 static void rmfit(int nat, rvec *xcoll, const rvec transvec, matrix rotmat)
631 * The inverse rotation is described by the transposed rotation matrix */
632 transpose(rotmat, tmat);
633 rotate_x(xcoll, nat, tmat);
635 /* Remove translation */
636 vec[XX] = -transvec[XX];
637 vec[YY] = -transvec[YY];
638 vec[ZZ] = -transvec[ZZ];
639 translate_x(xcoll, nat, vec);
643 /**********************************************************************************
644 ******************** FLOODING ****************************************************
645 **********************************************************************************
647 The flooding ability was added later to edsam. Many of the edsam functionality could be reused for that purpose.
648 The flooding covariance matrix, i.e. the selected eigenvectors and their corresponding eigenvalues are
649 read as 7th Component Group. The eigenvalues are coded into the stepsize parameter (as used by -linfix or -linacc).
651 do_md clls right in the beginning the function init_edsam, which reads the edi file, saves all the necessary information in
652 the edi structure and calls init_flood, to initialise some extra fields in the edi->flood structure.
654 since the flooding acts on forces do_flood is called from the function force() (force.c), while the other
655 edsam functionality is hooked into md via the update() (update.c) function acting as constraint on positions.
657 do_flood makes a copy of the positions,
658 fits them, projects them computes flooding_energy, and flooding forces. The forces are computed in the
659 space of the eigenvectors and are then blown up to the full cartesian space and rotated back to remove the
660 fit. Then do_flood adds these forces to the forcefield-forces
661 (given as parameter) and updates the adaptive flooding parameters Efl and deltaF.
663 To center the flooding potential at a different location one can use the -ori option in make_edi. The ori
664 structure is projected to the system of eigenvectors and then this position in the subspace is used as
665 center of the flooding potential. If the option is not used, the center will be zero in the subspace,
666 i.e. the average structure as given in the make_edi file.
668 To use the flooding potential as restraint, make_edi has the option -restrain, which leads to inverted
669 signs of alpha2 and Efl, such that the sign in the exponential of Vfl is not inverted but the sign of
670 Vfl is inverted. Vfl = Efl * exp (- .../Efl/alpha2*x^2...) With tau>0 the negative Efl will grow slowly
671 so that the restraint is switched off slowly. When Efl==0 and inverted flooding is ON is reached no
672 further adaption is applied, Efl will stay constant at zero.
674 To use restraints with harmonic potentials switch -restrain and -harmonic. Then the eigenvalues are
675 used as spring constants for the harmonic potential.
676 Note that eq3 in the flooding paper (J. Comp. Chem. 2006, 27, 1693-1702) defines the parameter lambda \
677 as the inverse of the spring constant, whereas the implementation uses lambda as the spring constant.
679 To use more than one flooding matrix just concatenate several .edi files (cat flood1.edi flood2.edi > flood_all.edi)
680 the routine read_edi_file reads all of theses flooding files.
681 The structure t_edi is now organized as a list of t_edis and the function do_flood cycles through the list
682 calling the do_single_flood() routine for every single entry. Since every state variables have been kept in one
683 edi there is no interdependence whatsoever. The forces are added together.
685 To write energies into the .edr file, call the function
686 get_flood_enx_names(char**, int *nnames) to get the Header (Vfl1 Vfl2... Vfln)
688 get_flood_energies(real Vfl[],int nnames);
691 - one could program the whole thing such that Efl, Vfl and deltaF is written to the .edr file. -- i dont know how to do that, yet.
693 Maybe one should give a range of atoms for which to remove motion, so that motion is removed with
694 two edsam files from two peptide chains
697 static void write_edo_flood(t_edpar *edi, FILE *fp, real rmsd)
702 /* Output how well we fit to the reference structure */
703 fprintf(fp, EDcol_ffmt, rmsd);
705 for (i = 0; i < edi->flood.vecs.neig; i++)
707 fprintf(fp, EDcol_efmt, edi->flood.vecs.xproj[i]);
709 /* Check whether the reference projection changes with time (this can happen
710 * in case flooding is used as harmonic restraint). If so, output the
711 * current reference projection */
712 if (edi->flood.bHarmonic && edi->flood.vecs.refprojslope[i] != 0.0)
714 fprintf(fp, EDcol_efmt, edi->flood.vecs.refproj[i]);
717 /* Output Efl if we are doing adaptive flooding */
718 if (0 != edi->flood.tau)
720 fprintf(fp, EDcol_efmt, edi->flood.Efl);
722 fprintf(fp, EDcol_efmt, edi->flood.Vfl);
724 /* Output deltaF if we are doing adaptive flooding */
725 if (0 != edi->flood.tau)
727 fprintf(fp, EDcol_efmt, edi->flood.deltaF);
729 fprintf(fp, EDcol_efmt, edi->flood.vecs.fproj[i]);
734 /* From flood.xproj compute the Vfl(x) at this point */
735 static real flood_energy(t_edpar *edi, gmx_int64_t step)
737 /* compute flooding energy Vfl
738 Vfl = Efl * exp( - \frac {kT} {2Efl alpha^2} * sum_i { \lambda_i c_i^2 } )
739 \lambda_i is the reciprocal eigenvalue 1/\sigma_i
740 it is already computed by make_edi and stored in stpsz[i]
742 Vfl = - Efl * 1/2(sum _i {\frac 1{\lambda_i} c_i^2})
749 /* Each time this routine is called (i.e. each time step), we add a small
750 * value to the reference projection. This way a harmonic restraint towards
751 * a moving reference is realized. If no value for the additive constant
752 * is provided in the edi file, the reference will not change. */
753 if (edi->flood.bHarmonic)
755 for (i = 0; i < edi->flood.vecs.neig; i++)
757 edi->flood.vecs.refproj[i] = edi->flood.vecs.refproj0[i] + step * edi->flood.vecs.refprojslope[i];
762 /* Compute sum which will be the exponent of the exponential */
763 for (i = 0; i < edi->flood.vecs.neig; i++)
765 /* stpsz stores the reciprocal eigenvalue 1/sigma_i */
766 sum += edi->flood.vecs.stpsz[i]*(edi->flood.vecs.xproj[i]-edi->flood.vecs.refproj[i])*(edi->flood.vecs.xproj[i]-edi->flood.vecs.refproj[i]);
769 /* Compute the Gauss function*/
770 if (edi->flood.bHarmonic)
772 Vfl = -0.5*edi->flood.Efl*sum; /* minus sign because Efl is negative, if restrain is on. */
776 Vfl = edi->flood.Efl != 0 ? edi->flood.Efl*std::exp(-edi->flood.kT/2/edi->flood.Efl/edi->flood.alpha2*sum) : 0;
783 /* From the position and from Vfl compute forces in subspace -> store in edi->vec.flood.fproj */
784 static void flood_forces(t_edpar *edi)
786 /* compute the forces in the subspace of the flooding eigenvectors
787 * by the formula F_i= V_{fl}(c) * ( \frac {kT} {E_{fl}} \lambda_i c_i */
790 real energy = edi->flood.Vfl;
793 if (edi->flood.bHarmonic)
795 for (i = 0; i < edi->flood.vecs.neig; i++)
797 edi->flood.vecs.fproj[i] = edi->flood.Efl* edi->flood.vecs.stpsz[i]*(edi->flood.vecs.xproj[i]-edi->flood.vecs.refproj[i]);
802 for (i = 0; i < edi->flood.vecs.neig; i++)
804 /* if Efl is zero the forces are zero if not use the formula */
805 edi->flood.vecs.fproj[i] = edi->flood.Efl != 0 ? edi->flood.kT/edi->flood.Efl/edi->flood.alpha2*energy*edi->flood.vecs.stpsz[i]*(edi->flood.vecs.xproj[i]-edi->flood.vecs.refproj[i]) : 0;
811 /* Raise forces from subspace into cartesian space */
812 static void flood_blowup(t_edpar *edi, rvec *forces_cart)
814 /* this function lifts the forces from the subspace to the cartesian space
815 all the values not contained in the subspace are assumed to be zero and then
816 a coordinate transformation from eigenvector to cartesian vectors is performed
817 The nonexistent values don't have to be set to zero explicitly, they would occur
818 as zero valued summands, hence we just stop to compute this part of the sum.
820 for every atom we add all the contributions to this atom from all the different eigenvectors.
822 NOTE: one could add directly to the forcefield forces, would mean we wouldn't have to clear the
823 field forces_cart prior the computation, but we compute the forces separately
824 to have them accessible for diagnostics
831 forces_sub = edi->flood.vecs.fproj;
834 /* Calculate the cartesian forces for the local atoms */
836 /* Clear forces first */
837 for (j = 0; j < edi->sav.nr_loc; j++)
839 clear_rvec(forces_cart[j]);
842 /* Now compute atomwise */
843 for (j = 0; j < edi->sav.nr_loc; j++)
845 /* Compute forces_cart[edi->sav.anrs[j]] */
846 for (eig = 0; eig < edi->flood.vecs.neig; eig++)
848 /* Force vector is force * eigenvector (compute only atom j) */
849 svmul(forces_sub[eig], edi->flood.vecs.vec[eig][edi->sav.c_ind[j]], dum);
850 /* Add this vector to the cartesian forces */
851 rvec_inc(forces_cart[j], dum);
857 /* Update the values of Efl, deltaF depending on tau and Vfl */
858 static void update_adaption(t_edpar *edi)
860 /* this function updates the parameter Efl and deltaF according to the rules given in
861 * 'predicting unimolecular chemical reactions: chemical flooding' M Mueller et al,
864 if ((edi->flood.tau < 0 ? -edi->flood.tau : edi->flood.tau ) > 0.00000001)
866 edi->flood.Efl = edi->flood.Efl+edi->flood.dt/edi->flood.tau*(edi->flood.deltaF0-edi->flood.deltaF);
867 /* check if restrain (inverted flooding) -> don't let EFL become positive */
868 if (edi->flood.alpha2 < 0 && edi->flood.Efl > -0.00000001)
873 edi->flood.deltaF = (1-edi->flood.dt/edi->flood.tau)*edi->flood.deltaF+edi->flood.dt/edi->flood.tau*edi->flood.Vfl;
878 static void do_single_flood(
886 gmx_bool bNS) /* Are we in a neighbor searching step? */
889 matrix rotmat; /* rotation matrix */
890 matrix tmat; /* inverse rotation */
891 rvec transvec; /* translation vector */
893 struct t_do_edsam *buf;
896 buf = edi->buf->do_edsam;
899 /* Broadcast the positions of the AVERAGE structure such that they are known on
900 * every processor. Each node contributes its local positions x and stores them in
901 * the collective ED array buf->xcoll */
902 communicate_group_positions(cr, buf->xcoll, buf->shifts_xcoll, buf->extra_shifts_xcoll, bNS, x,
903 edi->sav.nr, edi->sav.nr_loc, edi->sav.anrs_loc, edi->sav.c_ind, edi->sav.x_old, box);
905 /* Only assembly REFERENCE positions if their indices differ from the average ones */
908 communicate_group_positions(cr, buf->xc_ref, buf->shifts_xc_ref, buf->extra_shifts_xc_ref, bNS, x,
909 edi->sref.nr, edi->sref.nr_loc, edi->sref.anrs_loc, edi->sref.c_ind, edi->sref.x_old, box);
912 /* If bUpdateShifts was TRUE, the shifts have just been updated in get_positions.
913 * We do not need to update the shifts until the next NS step */
914 buf->bUpdateShifts = FALSE;
916 /* Now all nodes have all of the ED/flooding positions in edi->sav->xcoll,
917 * as well as the indices in edi->sav.anrs */
919 /* Fit the reference indices to the reference structure */
922 fit_to_reference(buf->xcoll, transvec, rotmat, edi);
926 fit_to_reference(buf->xc_ref, transvec, rotmat, edi);
929 /* Now apply the translation and rotation to the ED structure */
930 translate_and_rotate(buf->xcoll, edi->sav.nr, transvec, rotmat);
932 /* Project fitted structure onto supbspace -> store in edi->flood.vecs.xproj */
933 project_to_eigvectors(buf->xcoll, &edi->flood.vecs, edi);
935 if (FALSE == edi->flood.bConstForce)
937 /* Compute Vfl(x) from flood.xproj */
938 edi->flood.Vfl = flood_energy(edi, step);
940 update_adaption(edi);
942 /* Compute the flooding forces */
946 /* Translate them into cartesian positions */
947 flood_blowup(edi, edi->flood.forces_cartesian);
949 /* Rotate forces back so that they correspond to the given structure and not to the fitted one */
950 /* Each node rotates back its local forces */
951 transpose(rotmat, tmat);
952 rotate_x(edi->flood.forces_cartesian, edi->sav.nr_loc, tmat);
954 /* Finally add forces to the main force variable */
955 for (i = 0; i < edi->sav.nr_loc; i++)
957 rvec_inc(force[edi->sav.anrs_loc[i]], edi->flood.forces_cartesian[i]);
960 /* Output is written by the master process */
961 if (do_per_step(step, edi->outfrq) && MASTER(cr))
963 /* Output how well we fit to the reference */
966 /* Indices of reference and average structures are identical,
967 * thus we can calculate the rmsd to SREF using xcoll */
968 rmsdev = rmsd_from_structure(buf->xcoll, &edi->sref);
972 /* We have to translate & rotate the reference atoms first */
973 translate_and_rotate(buf->xc_ref, edi->sref.nr, transvec, rotmat);
974 rmsdev = rmsd_from_structure(buf->xc_ref, &edi->sref);
977 write_edo_flood(edi, edo, rmsdev);
982 /* Main flooding routine, called from do_force */
983 extern void do_flood(const t_commrec *cr,
984 const t_inputrec *ir,
997 /* Write time to edo, when required. Output the time anyhow since we need
998 * it in the output file for ED constraints. */
999 if (MASTER(cr) && do_per_step(step, edi->outfrq))
1001 fprintf(ed->edo, "\n%12f", ir->init_t + step*ir->delta_t);
1004 if (ed->eEDtype != eEDflood)
1011 /* Call flooding for one matrix */
1012 if (edi->flood.vecs.neig)
1014 do_single_flood(ed->edo, x, force, edi, step, box, cr, bNS);
1016 edi = edi->next_edi;
1021 /* Called by init_edi, configure some flooding related variables and structures,
1022 * print headers to output files */
1023 static void init_flood(t_edpar *edi, gmx_edsam_t ed, real dt)
1028 edi->flood.Efl = edi->flood.constEfl;
1032 if (edi->flood.vecs.neig)
1034 /* If in any of the ED groups we find a flooding vector, flooding is turned on */
1035 ed->eEDtype = eEDflood;
1037 fprintf(stderr, "ED: Flooding %d eigenvector%s.\n", edi->flood.vecs.neig, edi->flood.vecs.neig > 1 ? "s" : "");
1039 if (edi->flood.bConstForce)
1041 /* We have used stpsz as a vehicle to carry the fproj values for constant
1042 * force flooding. Now we copy that to flood.vecs.fproj. Note that
1043 * in const force flooding, fproj is never changed. */
1044 for (i = 0; i < edi->flood.vecs.neig; i++)
1046 edi->flood.vecs.fproj[i] = edi->flood.vecs.stpsz[i];
1048 fprintf(stderr, "ED: applying on eigenvector %d a constant force of %g\n",
1049 edi->flood.vecs.ieig[i], edi->flood.vecs.fproj[i]);
1057 /*********** Energy book keeping ******/
1058 static void get_flood_enx_names(t_edpar *edi, char** names, int *nnames) /* get header of energies */
1067 srenew(names, count);
1068 sprintf(buf, "Vfl_%d", count);
1069 names[count-1] = gmx_strdup(buf);
1070 actual = actual->next_edi;
1077 static void get_flood_energies(t_edpar *edi, real Vfl[], int nnames)
1079 /*fl has to be big enough to capture nnames-many entries*/
1088 Vfl[count-1] = actual->flood.Vfl;
1089 actual = actual->next_edi;
1092 if (nnames != count-1)
1094 gmx_fatal(FARGS, "Number of energies is not consistent with t_edi structure");
1097 /************* END of FLOODING IMPLEMENTATION ****************************/
1101 /* This function opens the ED input and output files, reads in all datasets it finds
1102 * in the input file, and cross-checks whether the .edi file information is consistent
1103 * with the essential dynamics data found in the checkpoint file (if present).
1104 * gmx make_edi can be used to create an .edi input file.
1106 static gmx_edsam_t ed_open(
1108 ObservablesHistory *oh,
1109 const char *ediFileName,
1110 const char *edoFileName,
1112 const gmx_output_env_t *oenv,
1113 const t_commrec *cr)
1118 /* Allocate space for the ED data structure */
1121 /* We want to perform ED (this switch might later be upgraded to eEDflood) */
1122 ed->eEDtype = eEDedsam;
1128 // If we start from a checkpoint file, we already have an edsamHistory struct
1129 if (oh->edsamHistory == nullptr)
1131 oh->edsamHistory = std::unique_ptr<edsamhistory_t>(new edsamhistory_t {});
1133 edsamhistory_t *EDstate = oh->edsamHistory.get();
1135 /* Read the edi input file: */
1136 nED = read_edi_file(ediFileName, ed->edpar, natoms);
1138 /* Make sure the checkpoint was produced in a run using this .edi file */
1139 if (EDstate->bFromCpt)
1141 crosscheck_edi_file_vs_checkpoint(ed, EDstate);
1147 init_edsamstate(ed, EDstate);
1149 /* The master opens the ED output file */
1152 ed->edo = gmx_fio_fopen(edoFileName, "a+");
1156 ed->edo = xvgropen(edoFileName,
1157 "Essential dynamics / flooding output",
1159 "RMSDs (nm), projections on EVs (nm), ...", oenv);
1161 /* Make a descriptive legend */
1162 write_edo_legend(ed, EDstate->nED, oenv);
1169 /* Broadcasts the structure data */
1170 static void bc_ed_positions(const t_commrec *cr, struct gmx_edx *s, int stype)
1172 snew_bc(cr, s->anrs, s->nr ); /* Index numbers */
1173 snew_bc(cr, s->x, s->nr ); /* Positions */
1174 nblock_bc(cr, s->nr, s->anrs );
1175 nblock_bc(cr, s->nr, s->x );
1177 /* For the average & reference structures we need an array for the collective indices,
1178 * and we need to broadcast the masses as well */
1179 if (stype == eedAV || stype == eedREF)
1181 /* We need these additional variables in the parallel case: */
1182 snew(s->c_ind, s->nr ); /* Collective indices */
1183 /* Local atom indices get assigned in dd_make_local_group_indices.
1184 * There, also memory is allocated */
1185 s->nalloc_loc = 0; /* allocation size of s->anrs_loc */
1186 snew_bc(cr, s->x_old, s->nr); /* To be able to always make the ED molecule whole, ... */
1187 nblock_bc(cr, s->nr, s->x_old); /* ... keep track of shift changes with the help of old coords */
1190 /* broadcast masses for the reference structure (for mass-weighted fitting) */
1191 if (stype == eedREF)
1193 snew_bc(cr, s->m, s->nr);
1194 nblock_bc(cr, s->nr, s->m);
1197 /* For the average structure we might need the masses for mass-weighting */
1200 snew_bc(cr, s->sqrtm, s->nr);
1201 nblock_bc(cr, s->nr, s->sqrtm);
1202 snew_bc(cr, s->m, s->nr);
1203 nblock_bc(cr, s->nr, s->m);
1208 /* Broadcasts the eigenvector data */
1209 static void bc_ed_vecs(const t_commrec *cr, t_eigvec *ev, int length, gmx_bool bHarmonic)
1213 snew_bc(cr, ev->ieig, ev->neig); /* index numbers of eigenvector */
1214 snew_bc(cr, ev->stpsz, ev->neig); /* stepsizes per eigenvector */
1215 snew_bc(cr, ev->xproj, ev->neig); /* instantaneous x projection */
1216 snew_bc(cr, ev->fproj, ev->neig); /* instantaneous f projection */
1217 snew_bc(cr, ev->refproj, ev->neig); /* starting or target projection */
1219 nblock_bc(cr, ev->neig, ev->ieig );
1220 nblock_bc(cr, ev->neig, ev->stpsz );
1221 nblock_bc(cr, ev->neig, ev->xproj );
1222 nblock_bc(cr, ev->neig, ev->fproj );
1223 nblock_bc(cr, ev->neig, ev->refproj);
1225 snew_bc(cr, ev->vec, ev->neig); /* Eigenvector components */
1226 for (i = 0; i < ev->neig; i++)
1228 snew_bc(cr, ev->vec[i], length);
1229 nblock_bc(cr, length, ev->vec[i]);
1232 /* For harmonic restraints the reference projections can change with time */
1235 snew_bc(cr, ev->refproj0, ev->neig);
1236 snew_bc(cr, ev->refprojslope, ev->neig);
1237 nblock_bc(cr, ev->neig, ev->refproj0 );
1238 nblock_bc(cr, ev->neig, ev->refprojslope);
1243 /* Broadcasts the ED / flooding data to other nodes
1244 * and allocates memory where needed */
1245 static void broadcast_ed_data(const t_commrec *cr, gmx_edsam_t ed, int numedis)
1251 /* Master lets the other nodes know if its ED only or also flooding */
1252 gmx_bcast(sizeof(ed->eEDtype), &(ed->eEDtype), cr);
1254 snew_bc(cr, ed->edpar, 1);
1255 /* Now transfer the ED data set(s) */
1257 for (nr = 0; nr < numedis; nr++)
1259 /* Broadcast a single ED data set */
1262 /* Broadcast positions */
1263 bc_ed_positions(cr, &(edi->sref), eedREF); /* reference positions (don't broadcast masses) */
1264 bc_ed_positions(cr, &(edi->sav ), eedAV ); /* average positions (do broadcast masses as well) */
1265 bc_ed_positions(cr, &(edi->star), eedTAR); /* target positions */
1266 bc_ed_positions(cr, &(edi->sori), eedORI); /* origin positions */
1268 /* Broadcast eigenvectors */
1269 bc_ed_vecs(cr, &edi->vecs.mon, edi->sav.nr, FALSE);
1270 bc_ed_vecs(cr, &edi->vecs.linfix, edi->sav.nr, FALSE);
1271 bc_ed_vecs(cr, &edi->vecs.linacc, edi->sav.nr, FALSE);
1272 bc_ed_vecs(cr, &edi->vecs.radfix, edi->sav.nr, FALSE);
1273 bc_ed_vecs(cr, &edi->vecs.radacc, edi->sav.nr, FALSE);
1274 bc_ed_vecs(cr, &edi->vecs.radcon, edi->sav.nr, FALSE);
1275 /* Broadcast flooding eigenvectors and, if needed, values for the moving reference */
1276 bc_ed_vecs(cr, &edi->flood.vecs, edi->sav.nr, edi->flood.bHarmonic);
1278 /* Set the pointer to the next ED group */
1281 snew_bc(cr, edi->next_edi, 1);
1282 edi = edi->next_edi;
1288 /* init-routine called for every *.edi-cycle, initialises t_edpar structure */
1289 static void init_edi(const gmx_mtop_t *mtop, t_edpar *edi)
1292 real totalmass = 0.0;
1295 /* NOTE Init_edi is executed on the master process only
1296 * The initialized data sets are then transmitted to the
1297 * other nodes in broadcast_ed_data */
1299 /* evaluate masses (reference structure) */
1300 snew(edi->sref.m, edi->sref.nr);
1302 for (i = 0; i < edi->sref.nr; i++)
1306 edi->sref.m[i] = mtopGetAtomMass(mtop, edi->sref.anrs[i], &molb);
1310 edi->sref.m[i] = 1.0;
1313 /* Check that every m > 0. Bad things will happen otherwise. */
1314 if (edi->sref.m[i] <= 0.0)
1316 gmx_fatal(FARGS, "Reference structure atom %d (sam.edi index %d) has a mass of %g.\n"
1317 "For a mass-weighted fit, all reference structure atoms need to have a mass >0.\n"
1318 "Either make the covariance analysis non-mass-weighted, or exclude massless\n"
1319 "atoms from the reference structure by creating a proper index group.\n",
1320 i, edi->sref.anrs[i]+1, edi->sref.m[i]);
1323 totalmass += edi->sref.m[i];
1325 edi->sref.mtot = totalmass;
1327 /* Masses m and sqrt(m) for the average structure. Note that m
1328 * is needed if forces have to be evaluated in do_edsam */
1329 snew(edi->sav.sqrtm, edi->sav.nr );
1330 snew(edi->sav.m, edi->sav.nr );
1331 for (i = 0; i < edi->sav.nr; i++)
1333 edi->sav.m[i] = mtopGetAtomMass(mtop, edi->sav.anrs[i], &molb);
1336 edi->sav.sqrtm[i] = sqrt(edi->sav.m[i]);
1340 edi->sav.sqrtm[i] = 1.0;
1343 /* Check that every m > 0. Bad things will happen otherwise. */
1344 if (edi->sav.sqrtm[i] <= 0.0)
1346 gmx_fatal(FARGS, "Average structure atom %d (sam.edi index %d) has a mass of %g.\n"
1347 "For ED with mass-weighting, all average structure atoms need to have a mass >0.\n"
1348 "Either make the covariance analysis non-mass-weighted, or exclude massless\n"
1349 "atoms from the average structure by creating a proper index group.\n",
1350 i, edi->sav.anrs[i] + 1, edi->sav.m[i]);
1354 /* put reference structure in origin */
1355 get_center(edi->sref.x, edi->sref.m, edi->sref.nr, com);
1359 translate_x(edi->sref.x, edi->sref.nr, com);
1361 /* Init ED buffer */
1366 static void check(const char *line, const char *label)
1368 if (!strstr(line, label))
1370 gmx_fatal(FARGS, "Could not find input parameter %s at expected position in edsam input-file (.edi)\nline read instead is %s", label, line);
1375 static int read_checked_edint(FILE *file, const char *label)
1377 char line[STRLEN+1];
1380 fgets2 (line, STRLEN, file);
1382 fgets2 (line, STRLEN, file);
1383 sscanf (line, max_ev_fmt_d, &idum);
1388 static int read_edint(FILE *file, gmx_bool *bEOF)
1390 char line[STRLEN+1];
1395 eof = fgets2 (line, STRLEN, file);
1401 eof = fgets2 (line, STRLEN, file);
1407 sscanf (line, max_ev_fmt_d, &idum);
1413 static real read_checked_edreal(FILE *file, const char *label)
1415 char line[STRLEN+1];
1419 fgets2 (line, STRLEN, file);
1421 fgets2 (line, STRLEN, file);
1422 sscanf (line, max_ev_fmt_lf, &rdum);
1423 return (real) rdum; /* always read as double and convert to single */
1427 static void read_edx(FILE *file, int number, int *anrs, rvec *x)
1430 char line[STRLEN+1];
1434 for (i = 0; i < number; i++)
1436 fgets2 (line, STRLEN, file);
1437 sscanf (line, max_ev_fmt_dlflflf, &anrs[i], &d[0], &d[1], &d[2]);
1438 anrs[i]--; /* we are reading FORTRAN indices */
1439 for (j = 0; j < 3; j++)
1441 x[i][j] = d[j]; /* always read as double and convert to single */
1447 static void scan_edvec(FILE *in, int nr, rvec *vec)
1449 char line[STRLEN+1];
1454 for (i = 0; (i < nr); i++)
1456 fgets2 (line, STRLEN, in);
1457 sscanf (line, max_ev_fmt_lelele, &x, &y, &z);
1465 static void read_edvec(FILE *in, int nr, t_eigvec *tvec, gmx_bool bReadRefproj, gmx_bool *bHaveReference)
1468 double rdum, refproj_dum = 0.0, refprojslope_dum = 0.0;
1469 char line[STRLEN+1];
1472 tvec->neig = read_checked_edint(in, "NUMBER OF EIGENVECTORS");
1475 snew(tvec->ieig, tvec->neig);
1476 snew(tvec->stpsz, tvec->neig);
1477 snew(tvec->vec, tvec->neig);
1478 snew(tvec->xproj, tvec->neig);
1479 snew(tvec->fproj, tvec->neig);
1480 snew(tvec->refproj, tvec->neig);
1483 snew(tvec->refproj0, tvec->neig);
1484 snew(tvec->refprojslope, tvec->neig);
1487 for (i = 0; (i < tvec->neig); i++)
1489 fgets2 (line, STRLEN, in);
1490 if (bReadRefproj) /* ONLY when using flooding as harmonic restraint */
1492 nscan = sscanf(line, max_ev_fmt_dlflflf, &idum, &rdum, &refproj_dum, &refprojslope_dum);
1493 /* Zero out values which were not scanned */
1497 /* Every 4 values read, including reference position */
1498 *bHaveReference = TRUE;
1501 /* A reference position is provided */
1502 *bHaveReference = TRUE;
1503 /* No value for slope, set to 0 */
1504 refprojslope_dum = 0.0;
1507 /* No values for reference projection and slope, set to 0 */
1509 refprojslope_dum = 0.0;
1512 gmx_fatal(FARGS, "Expected 2 - 4 (not %d) values for flooding vec: <nr> <spring const> <refproj> <refproj-slope>\n", nscan);
1514 tvec->refproj[i] = refproj_dum;
1515 tvec->refproj0[i] = refproj_dum;
1516 tvec->refprojslope[i] = refprojslope_dum;
1518 else /* Normal flooding */
1520 nscan = sscanf(line, max_ev_fmt_dlf, &idum, &rdum);
1523 gmx_fatal(FARGS, "Expected 2 values for flooding vec: <nr> <stpsz>\n");
1526 tvec->ieig[i] = idum;
1527 tvec->stpsz[i] = rdum;
1528 } /* end of loop over eigenvectors */
1530 for (i = 0; (i < tvec->neig); i++)
1532 snew(tvec->vec[i], nr);
1533 scan_edvec(in, nr, tvec->vec[i]);
1539 /* calls read_edvec for the vector groups, only for flooding there is an extra call */
1540 static void read_edvecs(FILE *in, int nr, t_edvecs *vecs)
1542 gmx_bool bHaveReference = FALSE;
1545 read_edvec(in, nr, &vecs->mon, FALSE, &bHaveReference);
1546 read_edvec(in, nr, &vecs->linfix, FALSE, &bHaveReference);
1547 read_edvec(in, nr, &vecs->linacc, FALSE, &bHaveReference);
1548 read_edvec(in, nr, &vecs->radfix, FALSE, &bHaveReference);
1549 read_edvec(in, nr, &vecs->radacc, FALSE, &bHaveReference);
1550 read_edvec(in, nr, &vecs->radcon, FALSE, &bHaveReference);
1554 /* Check if the same atom indices are used for reference and average positions */
1555 static gmx_bool check_if_same(struct gmx_edx sref, struct gmx_edx sav)
1560 /* If the number of atoms differs between the two structures,
1561 * they cannot be identical */
1562 if (sref.nr != sav.nr)
1567 /* Now that we know that both stuctures have the same number of atoms,
1568 * check if also the indices are identical */
1569 for (i = 0; i < sav.nr; i++)
1571 if (sref.anrs[i] != sav.anrs[i])
1576 fprintf(stderr, "ED: Note: Reference and average structure are composed of the same atom indices.\n");
1582 static int read_edi(FILE* in, t_edpar *edi, int nr_mdatoms, const char *fn)
1585 const int magic = 670;
1588 /* Was a specific reference point for the flooding/umbrella potential provided in the edi file? */
1589 gmx_bool bHaveReference = FALSE;
1592 /* the edi file is not free format, so expect problems if the input is corrupt. */
1594 /* check the magic number */
1595 readmagic = read_edint(in, &bEOF);
1596 /* Check whether we have reached the end of the input file */
1602 if (readmagic != magic)
1604 if (readmagic == 666 || readmagic == 667 || readmagic == 668)
1606 gmx_fatal(FARGS, "Wrong magic number: Use newest version of make_edi to produce edi file");
1608 else if (readmagic != 669)
1610 gmx_fatal(FARGS, "Wrong magic number %d in %s", readmagic, fn);
1614 /* check the number of atoms */
1615 edi->nini = read_edint(in, &bEOF);
1616 if (edi->nini != nr_mdatoms)
1618 gmx_fatal(FARGS, "Nr of atoms in %s (%d) does not match nr of md atoms (%d)", fn, edi->nini, nr_mdatoms);
1621 /* Done checking. For the rest we blindly trust the input */
1622 edi->fitmas = read_checked_edint(in, "FITMAS");
1623 edi->pcamas = read_checked_edint(in, "ANALYSIS_MAS");
1624 edi->outfrq = read_checked_edint(in, "OUTFRQ");
1625 edi->maxedsteps = read_checked_edint(in, "MAXLEN");
1626 edi->slope = read_checked_edreal(in, "SLOPECRIT");
1628 edi->presteps = read_checked_edint(in, "PRESTEPS");
1629 edi->flood.deltaF0 = read_checked_edreal(in, "DELTA_F0");
1630 edi->flood.deltaF = read_checked_edreal(in, "INIT_DELTA_F");
1631 edi->flood.tau = read_checked_edreal(in, "TAU");
1632 edi->flood.constEfl = read_checked_edreal(in, "EFL_NULL");
1633 edi->flood.alpha2 = read_checked_edreal(in, "ALPHA2");
1634 edi->flood.kT = read_checked_edreal(in, "KT");
1635 edi->flood.bHarmonic = read_checked_edint(in, "HARMONIC");
1636 if (readmagic > 669)
1638 edi->flood.bConstForce = read_checked_edint(in, "CONST_FORCE_FLOODING");
1642 edi->flood.bConstForce = FALSE;
1644 edi->sref.nr = read_checked_edint(in, "NREF");
1646 /* allocate space for reference positions and read them */
1647 snew(edi->sref.anrs, edi->sref.nr);
1648 snew(edi->sref.x, edi->sref.nr);
1649 snew(edi->sref.x_old, edi->sref.nr);
1650 edi->sref.sqrtm = nullptr;
1651 read_edx(in, edi->sref.nr, edi->sref.anrs, edi->sref.x);
1653 /* average positions. they define which atoms will be used for ED sampling */
1654 edi->sav.nr = read_checked_edint(in, "NAV");
1655 snew(edi->sav.anrs, edi->sav.nr);
1656 snew(edi->sav.x, edi->sav.nr);
1657 snew(edi->sav.x_old, edi->sav.nr);
1658 read_edx(in, edi->sav.nr, edi->sav.anrs, edi->sav.x);
1660 /* Check if the same atom indices are used for reference and average positions */
1661 edi->bRefEqAv = check_if_same(edi->sref, edi->sav);
1664 read_edvecs(in, edi->sav.nr, &edi->vecs);
1665 read_edvec(in, edi->sav.nr, &edi->flood.vecs, edi->flood.bHarmonic, &bHaveReference);
1667 /* target positions */
1668 edi->star.nr = read_edint(in, &bEOF);
1669 if (edi->star.nr > 0)
1671 snew(edi->star.anrs, edi->star.nr);
1672 snew(edi->star.x, edi->star.nr);
1673 edi->star.sqrtm = nullptr;
1674 read_edx(in, edi->star.nr, edi->star.anrs, edi->star.x);
1677 /* positions defining origin of expansion circle */
1678 edi->sori.nr = read_edint(in, &bEOF);
1679 if (edi->sori.nr > 0)
1683 /* Both an -ori structure and a at least one manual reference point have been
1684 * specified. That's ambiguous and probably not intentional. */
1685 gmx_fatal(FARGS, "ED: An origin structure has been provided and a at least one (moving) reference\n"
1686 " point was manually specified in the edi file. That is ambiguous. Aborting.\n");
1688 snew(edi->sori.anrs, edi->sori.nr);
1689 snew(edi->sori.x, edi->sori.nr);
1690 edi->sori.sqrtm = nullptr;
1691 read_edx(in, edi->sori.nr, edi->sori.anrs, edi->sori.x);
1700 /* Read in the edi input file. Note that it may contain several ED data sets which were
1701 * achieved by concatenating multiple edi files. The standard case would be a single ED
1702 * data set, though. */
1703 static int read_edi_file(const char *fn, t_edpar *edi, int nr_mdatoms)
1706 t_edpar *curr_edi, *last_edi;
1711 /* This routine is executed on the master only */
1713 /* Open the .edi parameter input file */
1714 in = gmx_fio_fopen(fn, "r");
1715 fprintf(stderr, "ED: Reading edi file %s\n", fn);
1717 /* Now read a sequence of ED input parameter sets from the edi file */
1720 while (read_edi(in, curr_edi, nr_mdatoms, fn) )
1724 /* Since we arrived within this while loop we know that there is still another data set to be read in */
1725 /* We need to allocate space for the data: */
1727 /* Point the 'next_edi' entry to the next edi: */
1728 curr_edi->next_edi = edi_read;
1729 /* Keep the curr_edi pointer for the case that the next group is empty: */
1730 last_edi = curr_edi;
1731 /* Let's prepare to read in the next edi data set: */
1732 curr_edi = edi_read;
1736 gmx_fatal(FARGS, "No complete ED data set found in edi file %s.", fn);
1739 /* Terminate the edi group list with a NULL pointer: */
1740 last_edi->next_edi = nullptr;
1742 fprintf(stderr, "ED: Found %d ED group%s.\n", edi_nr, edi_nr > 1 ? "s" : "");
1744 /* Close the .edi file again */
1751 struct t_fit_to_ref {
1752 rvec *xcopy; /* Working copy of the positions in fit_to_reference */
1755 /* Fit the current positions to the reference positions
1756 * Do not actually do the fit, just return rotation and translation.
1757 * Note that the COM of the reference structure was already put into
1758 * the origin by init_edi. */
1759 static void fit_to_reference(rvec *xcoll, /* The positions to be fitted */
1760 rvec transvec, /* The translation vector */
1761 matrix rotmat, /* The rotation matrix */
1762 t_edpar *edi) /* Just needed for do_edfit */
1764 rvec com; /* center of mass */
1766 struct t_fit_to_ref *loc;
1769 /* Allocate memory the first time this routine is called for each edi group */
1770 if (nullptr == edi->buf->fit_to_ref)
1772 snew(edi->buf->fit_to_ref, 1);
1773 snew(edi->buf->fit_to_ref->xcopy, edi->sref.nr);
1775 loc = edi->buf->fit_to_ref;
1777 /* We do not touch the original positions but work on a copy. */
1778 for (i = 0; i < edi->sref.nr; i++)
1780 copy_rvec(xcoll[i], loc->xcopy[i]);
1783 /* Calculate the center of mass */
1784 get_center(loc->xcopy, edi->sref.m, edi->sref.nr, com);
1786 transvec[XX] = -com[XX];
1787 transvec[YY] = -com[YY];
1788 transvec[ZZ] = -com[ZZ];
1790 /* Subtract the center of mass from the copy */
1791 translate_x(loc->xcopy, edi->sref.nr, transvec);
1793 /* Determine the rotation matrix */
1794 do_edfit(edi->sref.nr, edi->sref.x, loc->xcopy, rotmat, edi);
1798 static void translate_and_rotate(rvec *x, /* The positions to be translated and rotated */
1799 int nat, /* How many positions are there? */
1800 rvec transvec, /* The translation vector */
1801 matrix rotmat) /* The rotation matrix */
1804 translate_x(x, nat, transvec);
1807 rotate_x(x, nat, rotmat);
1811 /* Gets the rms deviation of the positions to the structure s */
1812 /* fit_to_structure has to be called before calling this routine! */
1813 static real rmsd_from_structure(rvec *x, /* The positions under consideration */
1814 struct gmx_edx *s) /* The structure from which the rmsd shall be computed */
1820 for (i = 0; i < s->nr; i++)
1822 rmsd += distance2(s->x[i], x[i]);
1825 rmsd /= (real) s->nr;
1832 void dd_make_local_ed_indices(gmx_domdec_t *dd, struct gmx_edsam *ed)
1837 if (ed->eEDtype != eEDnone)
1839 /* Loop over ED groups */
1843 /* Local atoms of the reference structure (for fitting), need only be assembled
1844 * if their indices differ from the average ones */
1847 dd_make_local_group_indices(dd->ga2la, edi->sref.nr, edi->sref.anrs,
1848 &edi->sref.nr_loc, &edi->sref.anrs_loc, &edi->sref.nalloc_loc, edi->sref.c_ind);
1851 /* Local atoms of the average structure (on these ED will be performed) */
1852 dd_make_local_group_indices(dd->ga2la, edi->sav.nr, edi->sav.anrs,
1853 &edi->sav.nr_loc, &edi->sav.anrs_loc, &edi->sav.nalloc_loc, edi->sav.c_ind);
1855 /* Indicate that the ED shift vectors for this structure need to be updated
1856 * at the next call to communicate_group_positions, since obviously we are in a NS step */
1857 edi->buf->do_edsam->bUpdateShifts = TRUE;
1859 /* Set the pointer to the next ED group (if any) */
1860 edi = edi->next_edi;
1866 static inline void ed_unshift_single_coord(matrix box, const rvec x, const ivec is, rvec xu)
1877 xu[XX] = x[XX]-tx*box[XX][XX]-ty*box[YY][XX]-tz*box[ZZ][XX];
1878 xu[YY] = x[YY]-ty*box[YY][YY]-tz*box[ZZ][YY];
1879 xu[ZZ] = x[ZZ]-tz*box[ZZ][ZZ];
1883 xu[XX] = x[XX]-tx*box[XX][XX];
1884 xu[YY] = x[YY]-ty*box[YY][YY];
1885 xu[ZZ] = x[ZZ]-tz*box[ZZ][ZZ];
1890 static void do_linfix(rvec *xcoll, t_edpar *edi, gmx_int64_t step)
1897 /* loop over linfix vectors */
1898 for (i = 0; i < edi->vecs.linfix.neig; i++)
1900 /* calculate the projection */
1901 proj = projectx(edi, xcoll, edi->vecs.linfix.vec[i]);
1903 /* calculate the correction */
1904 add = edi->vecs.linfix.refproj[i] + step*edi->vecs.linfix.stpsz[i] - proj;
1906 /* apply the correction */
1907 add /= edi->sav.sqrtm[i];
1908 for (j = 0; j < edi->sav.nr; j++)
1910 svmul(add, edi->vecs.linfix.vec[i][j], vec_dum);
1911 rvec_inc(xcoll[j], vec_dum);
1917 static void do_linacc(rvec *xcoll, t_edpar *edi)
1924 /* loop over linacc vectors */
1925 for (i = 0; i < edi->vecs.linacc.neig; i++)
1927 /* calculate the projection */
1928 proj = projectx(edi, xcoll, edi->vecs.linacc.vec[i]);
1930 /* calculate the correction */
1932 if (edi->vecs.linacc.stpsz[i] > 0.0)
1934 if ((proj-edi->vecs.linacc.refproj[i]) < 0.0)
1936 add = edi->vecs.linacc.refproj[i] - proj;
1939 if (edi->vecs.linacc.stpsz[i] < 0.0)
1941 if ((proj-edi->vecs.linacc.refproj[i]) > 0.0)
1943 add = edi->vecs.linacc.refproj[i] - proj;
1947 /* apply the correction */
1948 add /= edi->sav.sqrtm[i];
1949 for (j = 0; j < edi->sav.nr; j++)
1951 svmul(add, edi->vecs.linacc.vec[i][j], vec_dum);
1952 rvec_inc(xcoll[j], vec_dum);
1955 /* new positions will act as reference */
1956 edi->vecs.linacc.refproj[i] = proj + add;
1961 static void do_radfix(rvec *xcoll, t_edpar *edi)
1964 real *proj, rad = 0.0, ratio;
1968 if (edi->vecs.radfix.neig == 0)
1973 snew(proj, edi->vecs.radfix.neig);
1975 /* loop over radfix vectors */
1976 for (i = 0; i < edi->vecs.radfix.neig; i++)
1978 /* calculate the projections, radius */
1979 proj[i] = projectx(edi, xcoll, edi->vecs.radfix.vec[i]);
1980 rad += gmx::square(proj[i] - edi->vecs.radfix.refproj[i]);
1984 ratio = (edi->vecs.radfix.stpsz[0]+edi->vecs.radfix.radius)/rad - 1.0;
1985 edi->vecs.radfix.radius += edi->vecs.radfix.stpsz[0];
1987 /* loop over radfix vectors */
1988 for (i = 0; i < edi->vecs.radfix.neig; i++)
1990 proj[i] -= edi->vecs.radfix.refproj[i];
1992 /* apply the correction */
1993 proj[i] /= edi->sav.sqrtm[i];
1995 for (j = 0; j < edi->sav.nr; j++)
1997 svmul(proj[i], edi->vecs.radfix.vec[i][j], vec_dum);
1998 rvec_inc(xcoll[j], vec_dum);
2006 static void do_radacc(rvec *xcoll, t_edpar *edi)
2009 real *proj, rad = 0.0, ratio = 0.0;
2013 if (edi->vecs.radacc.neig == 0)
2018 snew(proj, edi->vecs.radacc.neig);
2020 /* loop over radacc vectors */
2021 for (i = 0; i < edi->vecs.radacc.neig; i++)
2023 /* calculate the projections, radius */
2024 proj[i] = projectx(edi, xcoll, edi->vecs.radacc.vec[i]);
2025 rad += gmx::square(proj[i] - edi->vecs.radacc.refproj[i]);
2029 /* only correct when radius decreased */
2030 if (rad < edi->vecs.radacc.radius)
2032 ratio = edi->vecs.radacc.radius/rad - 1.0;
2036 edi->vecs.radacc.radius = rad;
2039 /* loop over radacc vectors */
2040 for (i = 0; i < edi->vecs.radacc.neig; i++)
2042 proj[i] -= edi->vecs.radacc.refproj[i];
2044 /* apply the correction */
2045 proj[i] /= edi->sav.sqrtm[i];
2047 for (j = 0; j < edi->sav.nr; j++)
2049 svmul(proj[i], edi->vecs.radacc.vec[i][j], vec_dum);
2050 rvec_inc(xcoll[j], vec_dum);
2057 struct t_do_radcon {
2061 static void do_radcon(rvec *xcoll, t_edpar *edi)
2064 real rad = 0.0, ratio = 0.0;
2065 struct t_do_radcon *loc;
2070 if (edi->buf->do_radcon != nullptr)
2077 snew(edi->buf->do_radcon, 1);
2079 loc = edi->buf->do_radcon;
2081 if (edi->vecs.radcon.neig == 0)
2088 snew(loc->proj, edi->vecs.radcon.neig);
2091 /* loop over radcon vectors */
2092 for (i = 0; i < edi->vecs.radcon.neig; i++)
2094 /* calculate the projections, radius */
2095 loc->proj[i] = projectx(edi, xcoll, edi->vecs.radcon.vec[i]);
2096 rad += gmx::square(loc->proj[i] - edi->vecs.radcon.refproj[i]);
2099 /* only correct when radius increased */
2100 if (rad > edi->vecs.radcon.radius)
2102 ratio = edi->vecs.radcon.radius/rad - 1.0;
2104 /* loop over radcon vectors */
2105 for (i = 0; i < edi->vecs.radcon.neig; i++)
2107 /* apply the correction */
2108 loc->proj[i] -= edi->vecs.radcon.refproj[i];
2109 loc->proj[i] /= edi->sav.sqrtm[i];
2110 loc->proj[i] *= ratio;
2112 for (j = 0; j < edi->sav.nr; j++)
2114 svmul(loc->proj[i], edi->vecs.radcon.vec[i][j], vec_dum);
2115 rvec_inc(xcoll[j], vec_dum);
2122 edi->vecs.radcon.radius = rad;
2128 static void ed_apply_constraints(rvec *xcoll, t_edpar *edi, gmx_int64_t step)
2133 /* subtract the average positions */
2134 for (i = 0; i < edi->sav.nr; i++)
2136 rvec_dec(xcoll[i], edi->sav.x[i]);
2139 /* apply the constraints */
2142 do_linfix(xcoll, edi, step);
2144 do_linacc(xcoll, edi);
2147 do_radfix(xcoll, edi);
2149 do_radacc(xcoll, edi);
2150 do_radcon(xcoll, edi);
2152 /* add back the average positions */
2153 for (i = 0; i < edi->sav.nr; i++)
2155 rvec_inc(xcoll[i], edi->sav.x[i]);
2160 /* Write out the projections onto the eigenvectors. The order of output
2161 * corresponds to ed_output_legend() */
2162 static void write_edo(t_edpar *edi, FILE *fp, real rmsd)
2167 /* Output how well we fit to the reference structure */
2168 fprintf(fp, EDcol_ffmt, rmsd);
2170 for (i = 0; i < edi->vecs.mon.neig; i++)
2172 fprintf(fp, EDcol_efmt, edi->vecs.mon.xproj[i]);
2175 for (i = 0; i < edi->vecs.linfix.neig; i++)
2177 fprintf(fp, EDcol_efmt, edi->vecs.linfix.xproj[i]);
2180 for (i = 0; i < edi->vecs.linacc.neig; i++)
2182 fprintf(fp, EDcol_efmt, edi->vecs.linacc.xproj[i]);
2185 for (i = 0; i < edi->vecs.radfix.neig; i++)
2187 fprintf(fp, EDcol_efmt, edi->vecs.radfix.xproj[i]);
2189 if (edi->vecs.radfix.neig)
2191 fprintf(fp, EDcol_ffmt, calc_radius(&edi->vecs.radfix)); /* fixed increment radius */
2194 for (i = 0; i < edi->vecs.radacc.neig; i++)
2196 fprintf(fp, EDcol_efmt, edi->vecs.radacc.xproj[i]);
2198 if (edi->vecs.radacc.neig)
2200 fprintf(fp, EDcol_ffmt, calc_radius(&edi->vecs.radacc)); /* acceptance radius */
2203 for (i = 0; i < edi->vecs.radcon.neig; i++)
2205 fprintf(fp, EDcol_efmt, edi->vecs.radcon.xproj[i]);
2207 if (edi->vecs.radcon.neig)
2209 fprintf(fp, EDcol_ffmt, calc_radius(&edi->vecs.radcon)); /* contracting radius */
2213 /* Returns if any constraints are switched on */
2214 static int ed_constraints(gmx_bool edtype, t_edpar *edi)
2216 if (edtype == eEDedsam || edtype == eEDflood)
2218 return (edi->vecs.linfix.neig || edi->vecs.linacc.neig ||
2219 edi->vecs.radfix.neig || edi->vecs.radacc.neig ||
2220 edi->vecs.radcon.neig);
2226 /* Copies reference projection 'refproj' to fixed 'refproj0' variable for flooding/
2227 * umbrella sampling simulations. */
2228 static void copyEvecReference(t_eigvec* floodvecs)
2233 if (nullptr == floodvecs->refproj0)
2235 snew(floodvecs->refproj0, floodvecs->neig);
2238 for (i = 0; i < floodvecs->neig; i++)
2240 floodvecs->refproj0[i] = floodvecs->refproj[i];
2245 /* Call on MASTER only. Check whether the essential dynamics / flooding
2246 * groups of the checkpoint file are consistent with the provided .edi file. */
2247 static void crosscheck_edi_file_vs_checkpoint(gmx_edsam_t ed, edsamhistory_t *EDstate)
2249 t_edpar *edi = nullptr; /* points to a single edi data set */
2253 if (nullptr == EDstate->nref || nullptr == EDstate->nav)
2255 gmx_fatal(FARGS, "Essential dynamics and flooding can only be switched on (or off) at the\n"
2256 "start of a new simulation. If a simulation runs with/without ED constraints,\n"
2257 "it must also continue with/without ED constraints when checkpointing.\n"
2258 "To switch on (or off) ED constraints, please prepare a new .tpr to start\n"
2259 "from without a checkpoint.\n");
2264 while (edi != nullptr)
2266 /* Check number of atoms in the reference and average structures */
2267 if (EDstate->nref[edinum] != edi->sref.nr)
2269 gmx_fatal(FARGS, "The number of reference structure atoms in ED group %c is\n"
2270 "not the same in .cpt (NREF=%d) and .edi (NREF=%d) files!\n",
2271 get_EDgroupChar(edinum+1, 0), EDstate->nref[edinum], edi->sref.nr);
2273 if (EDstate->nav[edinum] != edi->sav.nr)
2275 gmx_fatal(FARGS, "The number of average structure atoms in ED group %c is\n"
2276 "not the same in .cpt (NREF=%d) and .edi (NREF=%d) files!\n",
2277 get_EDgroupChar(edinum+1, 0), EDstate->nav[edinum], edi->sav.nr);
2279 edi = edi->next_edi;
2283 if (edinum != EDstate->nED)
2285 gmx_fatal(FARGS, "The number of essential dynamics / flooding groups is not consistent.\n"
2286 "There are %d ED groups in the .cpt file, but %d in the .edi file!\n"
2287 "Are you sure this is the correct .edi file?\n", EDstate->nED, edinum);
2292 /* The edsamstate struct stores the information we need to make the ED group
2293 * whole again after restarts from a checkpoint file. Here we do the following:
2294 * a) If we did not start from .cpt, we prepare the struct for proper .cpt writing,
2295 * b) if we did start from .cpt, we copy over the last whole structures from .cpt,
2296 * c) in any case, for subsequent checkpoint writing, we set the pointers in
2297 * edsamstate to the x_old arrays, which contain the correct PBC representation of
2298 * all ED structures at the last time step. */
2299 static void init_edsamstate(gmx_edsam_t ed, edsamhistory_t *EDstate)
2305 snew(EDstate->old_sref_p, EDstate->nED);
2306 snew(EDstate->old_sav_p, EDstate->nED);
2308 /* If we did not read in a .cpt file, these arrays are not yet allocated */
2309 if (!EDstate->bFromCpt)
2311 snew(EDstate->nref, EDstate->nED);
2312 snew(EDstate->nav, EDstate->nED);
2315 /* Loop over all ED/flooding data sets (usually only one, though) */
2317 for (nr_edi = 1; nr_edi <= EDstate->nED; nr_edi++)
2319 /* We always need the last reference and average positions such that
2320 * in the next time step we can make the ED group whole again
2321 * if the atoms do not have the correct PBC representation */
2322 if (EDstate->bFromCpt)
2324 /* Copy the last whole positions of reference and average group from .cpt */
2325 for (i = 0; i < edi->sref.nr; i++)
2327 copy_rvec(EDstate->old_sref[nr_edi-1][i], edi->sref.x_old[i]);
2329 for (i = 0; i < edi->sav.nr; i++)
2331 copy_rvec(EDstate->old_sav [nr_edi-1][i], edi->sav.x_old [i]);
2336 EDstate->nref[nr_edi-1] = edi->sref.nr;
2337 EDstate->nav [nr_edi-1] = edi->sav.nr;
2340 /* For subsequent checkpoint writing, set the edsamstate pointers to the edi arrays: */
2341 EDstate->old_sref_p[nr_edi-1] = edi->sref.x_old;
2342 EDstate->old_sav_p [nr_edi-1] = edi->sav.x_old;
2344 edi = edi->next_edi;
2349 /* Adds 'buf' to 'str' */
2350 static void add_to_string(char **str, char *buf)
2355 len = strlen(*str) + strlen(buf) + 1;
2361 static void add_to_string_aligned(char **str, char *buf)
2363 char buf_aligned[STRLEN];
2365 sprintf(buf_aligned, EDcol_sfmt, buf);
2366 add_to_string(str, buf_aligned);
2370 static void nice_legend(const char ***setname, int *nsets, char **LegendStr, const char *value, const char *unit, char EDgroupchar)
2372 char tmp[STRLEN], tmp2[STRLEN];
2375 sprintf(tmp, "%c %s", EDgroupchar, value);
2376 add_to_string_aligned(LegendStr, tmp);
2377 sprintf(tmp2, "%s (%s)", tmp, unit);
2378 (*setname)[*nsets] = gmx_strdup(tmp2);
2383 static void nice_legend_evec(const char ***setname, int *nsets, char **LegendStr, t_eigvec *evec, char EDgroupChar, const char *EDtype)
2389 for (i = 0; i < evec->neig; i++)
2391 sprintf(tmp, "EV%dprj%s", evec->ieig[i], EDtype);
2392 nice_legend(setname, nsets, LegendStr, tmp, "nm", EDgroupChar);
2397 /* Makes a legend for the xvg output file. Call on MASTER only! */
2398 static void write_edo_legend(gmx_edsam_t ed, int nED, const gmx_output_env_t *oenv)
2400 t_edpar *edi = nullptr;
2402 int nr_edi, nsets, n_flood, n_edsam;
2403 const char **setname;
2405 char *LegendStr = nullptr;
2410 fprintf(ed->edo, "# Output will be written every %d step%s\n", ed->edpar->outfrq, ed->edpar->outfrq != 1 ? "s" : "");
2412 for (nr_edi = 1; nr_edi <= nED; nr_edi++)
2414 fprintf(ed->edo, "#\n");
2415 fprintf(ed->edo, "# Summary of applied con/restraints for the ED group %c\n", get_EDgroupChar(nr_edi, nED));
2416 fprintf(ed->edo, "# Atoms in average structure: %d\n", edi->sav.nr);
2417 fprintf(ed->edo, "# monitor : %d vec%s\n", edi->vecs.mon.neig, edi->vecs.mon.neig != 1 ? "s" : "");
2418 fprintf(ed->edo, "# LINFIX : %d vec%s\n", edi->vecs.linfix.neig, edi->vecs.linfix.neig != 1 ? "s" : "");
2419 fprintf(ed->edo, "# LINACC : %d vec%s\n", edi->vecs.linacc.neig, edi->vecs.linacc.neig != 1 ? "s" : "");
2420 fprintf(ed->edo, "# RADFIX : %d vec%s\n", edi->vecs.radfix.neig, edi->vecs.radfix.neig != 1 ? "s" : "");
2421 fprintf(ed->edo, "# RADACC : %d vec%s\n", edi->vecs.radacc.neig, edi->vecs.radacc.neig != 1 ? "s" : "");
2422 fprintf(ed->edo, "# RADCON : %d vec%s\n", edi->vecs.radcon.neig, edi->vecs.radcon.neig != 1 ? "s" : "");
2423 fprintf(ed->edo, "# FLOODING : %d vec%s ", edi->flood.vecs.neig, edi->flood.vecs.neig != 1 ? "s" : "");
2425 if (edi->flood.vecs.neig)
2427 /* If in any of the groups we find a flooding vector, flooding is turned on */
2428 ed->eEDtype = eEDflood;
2430 /* Print what flavor of flooding we will do */
2431 if (0 == edi->flood.tau) /* constant flooding strength */
2433 fprintf(ed->edo, "Efl_null = %g", edi->flood.constEfl);
2434 if (edi->flood.bHarmonic)
2436 fprintf(ed->edo, ", harmonic");
2439 else /* adaptive flooding */
2441 fprintf(ed->edo, ", adaptive");
2444 fprintf(ed->edo, "\n");
2446 edi = edi->next_edi;
2449 /* Print a nice legend */
2451 LegendStr[0] = '\0';
2452 sprintf(buf, "# %6s", "time");
2453 add_to_string(&LegendStr, buf);
2455 /* Calculate the maximum number of columns we could end up with */
2458 for (nr_edi = 1; nr_edi <= nED; nr_edi++)
2460 nsets += 5 +edi->vecs.mon.neig
2461 +edi->vecs.linfix.neig
2462 +edi->vecs.linacc.neig
2463 +edi->vecs.radfix.neig
2464 +edi->vecs.radacc.neig
2465 +edi->vecs.radcon.neig
2466 + 6*edi->flood.vecs.neig;
2467 edi = edi->next_edi;
2469 snew(setname, nsets);
2471 /* In the mdrun time step in a first function call (do_flood()) the flooding
2472 * forces are calculated and in a second function call (do_edsam()) the
2473 * ED constraints. To get a corresponding legend, we need to loop twice
2474 * over the edi groups and output first the flooding, then the ED part */
2476 /* The flooding-related legend entries, if flooding is done */
2478 if (eEDflood == ed->eEDtype)
2481 for (nr_edi = 1; nr_edi <= nED; nr_edi++)
2483 /* Always write out the projection on the flooding EVs. Of course, this can also
2484 * be achieved with the monitoring option in do_edsam() (if switched on by the
2485 * user), but in that case the positions need to be communicated in do_edsam(),
2486 * which is not necessary when doing flooding only. */
2487 nice_legend(&setname, &nsets, &LegendStr, "RMSD to ref", "nm", get_EDgroupChar(nr_edi, nED) );
2489 for (i = 0; i < edi->flood.vecs.neig; i++)
2491 sprintf(buf, "EV%dprjFLOOD", edi->flood.vecs.ieig[i]);
2492 nice_legend(&setname, &nsets, &LegendStr, buf, "nm", get_EDgroupChar(nr_edi, nED));
2494 /* Output the current reference projection if it changes with time;
2495 * this can happen when flooding is used as harmonic restraint */
2496 if (edi->flood.bHarmonic && edi->flood.vecs.refprojslope[i] != 0.0)
2498 sprintf(buf, "EV%d ref.prj.", edi->flood.vecs.ieig[i]);
2499 nice_legend(&setname, &nsets, &LegendStr, buf, "nm", get_EDgroupChar(nr_edi, nED));
2502 /* For flooding we also output Efl, Vfl, deltaF, and the flooding forces */
2503 if (0 != edi->flood.tau) /* only output Efl for adaptive flooding (constant otherwise) */
2505 sprintf(buf, "EV%d-Efl", edi->flood.vecs.ieig[i]);
2506 nice_legend(&setname, &nsets, &LegendStr, buf, "kJ/mol", get_EDgroupChar(nr_edi, nED));
2509 sprintf(buf, "EV%d-Vfl", edi->flood.vecs.ieig[i]);
2510 nice_legend(&setname, &nsets, &LegendStr, buf, "kJ/mol", get_EDgroupChar(nr_edi, nED));
2512 if (0 != edi->flood.tau) /* only output deltaF for adaptive flooding (zero otherwise) */
2514 sprintf(buf, "EV%d-deltaF", edi->flood.vecs.ieig[i]);
2515 nice_legend(&setname, &nsets, &LegendStr, buf, "kJ/mol", get_EDgroupChar(nr_edi, nED));
2518 sprintf(buf, "EV%d-FLforces", edi->flood.vecs.ieig[i]);
2519 nice_legend(&setname, &nsets, &LegendStr, buf, "kJ/mol/nm", get_EDgroupChar(nr_edi, nED));
2522 edi = edi->next_edi;
2523 } /* End of flooding-related legend entries */
2527 /* Now the ED-related entries, if essential dynamics is done */
2529 for (nr_edi = 1; nr_edi <= nED; nr_edi++)
2531 if (bNeedDoEdsam(edi)) /* Only print ED legend if at least one ED option is on */
2533 nice_legend(&setname, &nsets, &LegendStr, "RMSD to ref", "nm", get_EDgroupChar(nr_edi, nED) );
2535 /* Essential dynamics, projections on eigenvectors */
2536 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.mon, get_EDgroupChar(nr_edi, nED), "MON" );
2537 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.linfix, get_EDgroupChar(nr_edi, nED), "LINFIX");
2538 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.linacc, get_EDgroupChar(nr_edi, nED), "LINACC");
2539 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.radfix, get_EDgroupChar(nr_edi, nED), "RADFIX");
2540 if (edi->vecs.radfix.neig)
2542 nice_legend(&setname, &nsets, &LegendStr, "RADFIX radius", "nm", get_EDgroupChar(nr_edi, nED));
2544 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.radacc, get_EDgroupChar(nr_edi, nED), "RADACC");
2545 if (edi->vecs.radacc.neig)
2547 nice_legend(&setname, &nsets, &LegendStr, "RADACC radius", "nm", get_EDgroupChar(nr_edi, nED));
2549 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.radcon, get_EDgroupChar(nr_edi, nED), "RADCON");
2550 if (edi->vecs.radcon.neig)
2552 nice_legend(&setname, &nsets, &LegendStr, "RADCON radius", "nm", get_EDgroupChar(nr_edi, nED));
2555 edi = edi->next_edi;
2556 } /* end of 'pure' essential dynamics legend entries */
2557 n_edsam = nsets - n_flood;
2559 xvgr_legend(ed->edo, nsets, setname, oenv);
2562 fprintf(ed->edo, "#\n"
2563 "# Legend for %d column%s of flooding plus %d column%s of essential dynamics data:\n",
2564 n_flood, 1 == n_flood ? "" : "s",
2565 n_edsam, 1 == n_edsam ? "" : "s");
2566 fprintf(ed->edo, "%s", LegendStr);
2573 /* Init routine for ED and flooding. Calls init_edi in a loop for every .edi-cycle
2574 * contained in the input file, creates a NULL terminated list of t_edpar structures */
2575 gmx_edsam_t init_edsam(
2576 const char *ediFileName,
2577 const char *edoFileName,
2578 const gmx_mtop_t *mtop,
2579 const t_inputrec *ir,
2580 const t_commrec *cr,
2581 gmx::Constraints *constr,
2582 const t_state *globalState,
2583 ObservablesHistory *oh,
2584 const gmx_output_env_t *oenv,
2587 t_edpar *edi = nullptr; /* points to a single edi data set */
2589 int nED = 0; /* Number of ED data sets */
2590 rvec *x_pbc = nullptr; /* positions of the whole MD system with pbc removed */
2591 rvec *xfit = nullptr, *xstart = nullptr; /* dummy arrays to determine initial RMSDs */
2592 rvec fit_transvec; /* translation ... */
2593 matrix fit_rotmat; /* ... and rotation from fit to reference structure */
2594 rvec *ref_x_old = nullptr; /* helper pointer */
2599 fprintf(stderr, "ED: Initializing essential dynamics constraints.\n");
2601 if (oh->edsamHistory != nullptr && oh->edsamHistory->bFromCpt && !gmx_fexist(ediFileName) )
2603 gmx_fatal(FARGS, "The checkpoint file you provided is from an essential dynamics or flooding\n"
2604 "simulation. Please also set the .edi file on the command line with -ei.\n");
2608 /* Open input and output files, allocate space for ED data structure */
2609 gmx_edsam_t ed = ed_open(mtop->natoms, oh, ediFileName, edoFileName, bAppend, oenv, cr);
2610 GMX_RELEASE_ASSERT(constr != nullptr, "Must have valid constraints object");
2611 constr->saveEdsamPointer(ed);
2613 /* Needed for initializing radacc radius in do_edsam */
2616 /* The input file is read by the master and the edi structures are
2617 * initialized here. Input is stored in ed->edpar. Then the edi
2618 * structures are transferred to the other nodes */
2621 /* Initialization for every ED/flooding group. Flooding uses one edi group per
2622 * flooding vector, Essential dynamics can be applied to more than one structure
2623 * as well, but will be done in the order given in the edi file, so
2624 * expect different results for different order of edi file concatenation! */
2626 while (edi != nullptr)
2628 init_edi(mtop, edi);
2629 init_flood(edi, ed, ir->delta_t);
2630 edi = edi->next_edi;
2634 /* The master does the work here. The other nodes get the positions
2635 * not before dd_partition_system which is called after init_edsam */
2638 edsamhistory_t *EDstate = oh->edsamHistory.get();
2640 if (!EDstate->bFromCpt)
2642 /* Remove PBC, make molecule(s) subject to ED whole. */
2643 snew(x_pbc, mtop->natoms);
2644 copy_rvecn(as_rvec_array(globalState->x.data()), x_pbc, 0, mtop->natoms);
2645 do_pbc_first_mtop(nullptr, ir->ePBC, globalState->box, mtop, x_pbc);
2647 /* Reset pointer to first ED data set which contains the actual ED data */
2649 GMX_ASSERT(nullptr != edi,
2650 "The pointer to the essential dynamics parameters is undefined");
2653 /* Loop over all ED/flooding data sets (usually only one, though) */
2654 for (int nr_edi = 1; nr_edi <= EDstate->nED; nr_edi++)
2656 /* For multiple ED groups we use the output frequency that was specified
2657 * in the first set */
2660 edi->outfrq = ed->edpar->outfrq;
2663 /* Extract the initial reference and average positions. When starting
2664 * from .cpt, these have already been read into sref.x_old
2665 * in init_edsamstate() */
2666 if (!EDstate->bFromCpt)
2668 /* If this is the first run (i.e. no checkpoint present) we assume
2669 * that the starting positions give us the correct PBC representation */
2670 for (i = 0; i < edi->sref.nr; i++)
2672 copy_rvec(x_pbc[edi->sref.anrs[i]], edi->sref.x_old[i]);
2675 for (i = 0; i < edi->sav.nr; i++)
2677 copy_rvec(x_pbc[edi->sav.anrs[i]], edi->sav.x_old[i]);
2681 /* Now we have the PBC-correct start positions of the reference and
2682 average structure. We copy that over to dummy arrays on which we
2683 can apply fitting to print out the RMSD. We srenew the memory since
2684 the size of the buffers is likely different for every ED group */
2685 srenew(xfit, edi->sref.nr );
2686 srenew(xstart, edi->sav.nr );
2689 /* Reference indices are the same as average indices */
2690 ref_x_old = edi->sav.x_old;
2694 ref_x_old = edi->sref.x_old;
2696 copy_rvecn(ref_x_old, xfit, 0, edi->sref.nr);
2697 copy_rvecn(edi->sav.x_old, xstart, 0, edi->sav.nr);
2699 /* Make the fit to the REFERENCE structure, get translation and rotation */
2700 fit_to_reference(xfit, fit_transvec, fit_rotmat, edi);
2702 /* Output how well we fit to the reference at the start */
2703 translate_and_rotate(xfit, edi->sref.nr, fit_transvec, fit_rotmat);
2704 fprintf(stderr, "ED: Initial RMSD from reference after fit = %f nm",
2705 rmsd_from_structure(xfit, &edi->sref));
2706 if (EDstate->nED > 1)
2708 fprintf(stderr, " (ED group %c)", get_EDgroupChar(nr_edi, EDstate->nED));
2710 fprintf(stderr, "\n");
2712 /* Now apply the translation and rotation to the atoms on which ED sampling will be performed */
2713 translate_and_rotate(xstart, edi->sav.nr, fit_transvec, fit_rotmat);
2715 /* calculate initial projections */
2716 project(xstart, edi);
2718 /* For the target and origin structure both a reference (fit) and an
2719 * average structure can be provided in make_edi. If both structures
2720 * are the same, make_edi only stores one of them in the .edi file.
2721 * If they differ, first the fit and then the average structure is stored
2722 * in star (or sor), thus the number of entries in star/sor is
2723 * (n_fit + n_av) with n_fit the size of the fitting group and n_av
2724 * the size of the average group. */
2726 /* process target structure, if required */
2727 if (edi->star.nr > 0)
2729 fprintf(stderr, "ED: Fitting target structure to reference structure\n");
2731 /* get translation & rotation for fit of target structure to reference structure */
2732 fit_to_reference(edi->star.x, fit_transvec, fit_rotmat, edi);
2734 translate_and_rotate(edi->star.x, edi->star.nr, fit_transvec, fit_rotmat);
2735 if (edi->star.nr == edi->sav.nr)
2739 else /* edi->star.nr = edi->sref.nr + edi->sav.nr */
2741 /* The last sav.nr indices of the target structure correspond to
2742 * the average structure, which must be projected */
2743 avindex = edi->star.nr - edi->sav.nr;
2745 rad_project(edi, &edi->star.x[avindex], &edi->vecs.radcon);
2749 rad_project(edi, xstart, &edi->vecs.radcon);
2752 /* process structure that will serve as origin of expansion circle */
2753 if ( (eEDflood == ed->eEDtype) && (FALSE == edi->flood.bConstForce) )
2755 fprintf(stderr, "ED: Setting center of flooding potential (0 = average structure)\n");
2758 if (edi->sori.nr > 0)
2760 fprintf(stderr, "ED: Fitting origin structure to reference structure\n");
2762 /* fit this structure to reference structure */
2763 fit_to_reference(edi->sori.x, fit_transvec, fit_rotmat, edi);
2765 translate_and_rotate(edi->sori.x, edi->sori.nr, fit_transvec, fit_rotmat);
2766 if (edi->sori.nr == edi->sav.nr)
2770 else /* edi->sori.nr = edi->sref.nr + edi->sav.nr */
2772 /* For the projection, we need the last sav.nr indices of sori */
2773 avindex = edi->sori.nr - edi->sav.nr;
2776 rad_project(edi, &edi->sori.x[avindex], &edi->vecs.radacc);
2777 rad_project(edi, &edi->sori.x[avindex], &edi->vecs.radfix);
2778 if ( (eEDflood == ed->eEDtype) && (FALSE == edi->flood.bConstForce) )
2780 fprintf(stderr, "ED: The ORIGIN structure will define the flooding potential center.\n");
2781 /* Set center of flooding potential to the ORIGIN structure */
2782 rad_project(edi, &edi->sori.x[avindex], &edi->flood.vecs);
2783 /* We already know that no (moving) reference position was provided,
2784 * therefore we can overwrite refproj[0]*/
2785 copyEvecReference(&edi->flood.vecs);
2788 else /* No origin structure given */
2790 rad_project(edi, xstart, &edi->vecs.radacc);
2791 rad_project(edi, xstart, &edi->vecs.radfix);
2792 if ( (eEDflood == ed->eEDtype) && (FALSE == edi->flood.bConstForce) )
2794 if (edi->flood.bHarmonic)
2796 fprintf(stderr, "ED: A (possibly changing) ref. projection will define the flooding potential center.\n");
2797 for (i = 0; i < edi->flood.vecs.neig; i++)
2799 edi->flood.vecs.refproj[i] = edi->flood.vecs.refproj0[i];
2804 fprintf(stderr, "ED: The AVERAGE structure will define the flooding potential center.\n");
2805 /* Set center of flooding potential to the center of the covariance matrix,
2806 * i.e. the average structure, i.e. zero in the projected system */
2807 for (i = 0; i < edi->flood.vecs.neig; i++)
2809 edi->flood.vecs.refproj[i] = 0.0;
2814 /* For convenience, output the center of the flooding potential for the eigenvectors */
2815 if ( (eEDflood == ed->eEDtype) && (FALSE == edi->flood.bConstForce) )
2817 for (i = 0; i < edi->flood.vecs.neig; i++)
2819 fprintf(stdout, "ED: EV %d flooding potential center: %11.4e", edi->flood.vecs.ieig[i], edi->flood.vecs.refproj[i]);
2820 if (edi->flood.bHarmonic)
2822 fprintf(stdout, " (adding %11.4e/timestep)", edi->flood.vecs.refprojslope[i]);
2824 fprintf(stdout, "\n");
2828 /* set starting projections for linsam */
2829 rad_project(edi, xstart, &edi->vecs.linacc);
2830 rad_project(edi, xstart, &edi->vecs.linfix);
2832 /* Prepare for the next edi data set: */
2833 edi = edi->next_edi;
2835 /* Cleaning up on the master node: */
2836 if (!EDstate->bFromCpt)
2843 } /* end of MASTER only section */
2847 /* First let everybody know how many ED data sets to expect */
2848 gmx_bcast(sizeof(nED), &nED, cr);
2849 /* Broadcast the essential dynamics / flooding data to all nodes */
2850 broadcast_ed_data(cr, ed, nED);
2854 /* In the single-CPU case, point the local atom numbers pointers to the global
2855 * one, so that we can use the same notation in serial and parallel case: */
2856 /* Loop over all ED data sets (usually only one, though) */
2858 for (int nr_edi = 1; nr_edi <= nED; nr_edi++)
2860 edi->sref.anrs_loc = edi->sref.anrs;
2861 edi->sav.anrs_loc = edi->sav.anrs;
2862 edi->star.anrs_loc = edi->star.anrs;
2863 edi->sori.anrs_loc = edi->sori.anrs;
2864 /* For the same reason as above, make a dummy c_ind array: */
2865 snew(edi->sav.c_ind, edi->sav.nr);
2866 /* Initialize the array */
2867 for (i = 0; i < edi->sav.nr; i++)
2869 edi->sav.c_ind[i] = i;
2871 /* In the general case we will need a different-sized array for the reference indices: */
2874 snew(edi->sref.c_ind, edi->sref.nr);
2875 for (i = 0; i < edi->sref.nr; i++)
2877 edi->sref.c_ind[i] = i;
2880 /* Point to the very same array in case of other structures: */
2881 edi->star.c_ind = edi->sav.c_ind;
2882 edi->sori.c_ind = edi->sav.c_ind;
2883 /* In the serial case, the local number of atoms is the global one: */
2884 edi->sref.nr_loc = edi->sref.nr;
2885 edi->sav.nr_loc = edi->sav.nr;
2886 edi->star.nr_loc = edi->star.nr;
2887 edi->sori.nr_loc = edi->sori.nr;
2889 /* An on we go to the next ED group */
2890 edi = edi->next_edi;
2894 /* Allocate space for ED buffer variables */
2895 /* Again, loop over ED data sets */
2897 for (int nr_edi = 1; nr_edi <= nED; nr_edi++)
2899 /* Allocate space for ED buffer variables */
2900 snew_bc(cr, edi->buf, 1); /* MASTER has already allocated edi->buf in init_edi() */
2901 snew(edi->buf->do_edsam, 1);
2903 /* Space for collective ED buffer variables */
2905 /* Collective positions of atoms with the average indices */
2906 snew(edi->buf->do_edsam->xcoll, edi->sav.nr);
2907 snew(edi->buf->do_edsam->shifts_xcoll, edi->sav.nr); /* buffer for xcoll shifts */
2908 snew(edi->buf->do_edsam->extra_shifts_xcoll, edi->sav.nr);
2909 /* Collective positions of atoms with the reference indices */
2912 snew(edi->buf->do_edsam->xc_ref, edi->sref.nr);
2913 snew(edi->buf->do_edsam->shifts_xc_ref, edi->sref.nr); /* To store the shifts in */
2914 snew(edi->buf->do_edsam->extra_shifts_xc_ref, edi->sref.nr);
2917 /* Get memory for flooding forces */
2918 snew(edi->flood.forces_cartesian, edi->sav.nr);
2922 /* Dump it all into one file per process */
2923 dump_edi(edi, cr, nr_edi);
2927 edi = edi->next_edi;
2930 /* Flush the edo file so that the user can check some things
2931 * when the simulation has started */
2941 void do_edsam(const t_inputrec *ir,
2943 const t_commrec *cr,
2949 int i, edinr, iupdate = 500;
2950 matrix rotmat; /* rotation matrix */
2951 rvec transvec; /* translation vector */
2952 rvec dv, dx, x_unsh; /* tmp vectors for velocity, distance, unshifted x coordinate */
2953 real dt_1; /* 1/dt */
2954 struct t_do_edsam *buf;
2956 real rmsdev = -1; /* RMSD from reference structure prior to applying the constraints */
2957 gmx_bool bSuppress = FALSE; /* Write .xvg output file on master? */
2960 /* Check if ED sampling has to be performed */
2961 if (ed->eEDtype == eEDnone)
2966 dt_1 = 1.0/ir->delta_t;
2968 /* Loop over all ED groups (usually one) */
2971 while (edi != nullptr)
2974 if (bNeedDoEdsam(edi))
2977 buf = edi->buf->do_edsam;
2981 /* initialize radacc radius for slope criterion */
2982 buf->oldrad = calc_radius(&edi->vecs.radacc);
2985 /* Copy the positions into buf->xc* arrays and after ED
2986 * feed back corrections to the official positions */
2988 /* Broadcast the ED positions such that every node has all of them
2989 * Every node contributes its local positions xs and stores it in
2990 * the collective buf->xcoll array. Note that for edinr > 1
2991 * xs could already have been modified by an earlier ED */
2993 communicate_group_positions(cr, buf->xcoll, buf->shifts_xcoll, buf->extra_shifts_xcoll, PAR(cr) ? buf->bUpdateShifts : TRUE, xs,
2994 edi->sav.nr, edi->sav.nr_loc, edi->sav.anrs_loc, edi->sav.c_ind, edi->sav.x_old, box);
2996 /* Only assembly reference positions if their indices differ from the average ones */
2999 communicate_group_positions(cr, buf->xc_ref, buf->shifts_xc_ref, buf->extra_shifts_xc_ref, PAR(cr) ? buf->bUpdateShifts : TRUE, xs,
3000 edi->sref.nr, edi->sref.nr_loc, edi->sref.anrs_loc, edi->sref.c_ind, edi->sref.x_old, box);
3003 /* If bUpdateShifts was TRUE then the shifts have just been updated in communicate_group_positions.
3004 * We do not need to update the shifts until the next NS step. Note that dd_make_local_ed_indices
3005 * set bUpdateShifts=TRUE in the parallel case. */
3006 buf->bUpdateShifts = FALSE;
3008 /* Now all nodes have all of the ED positions in edi->sav->xcoll,
3009 * as well as the indices in edi->sav.anrs */
3011 /* Fit the reference indices to the reference structure */
3014 fit_to_reference(buf->xcoll, transvec, rotmat, edi);
3018 fit_to_reference(buf->xc_ref, transvec, rotmat, edi);
3021 /* Now apply the translation and rotation to the ED structure */
3022 translate_and_rotate(buf->xcoll, edi->sav.nr, transvec, rotmat);
3024 /* Find out how well we fit to the reference (just for output steps) */
3025 if (do_per_step(step, edi->outfrq) && MASTER(cr))
3029 /* Indices of reference and average structures are identical,
3030 * thus we can calculate the rmsd to SREF using xcoll */
3031 rmsdev = rmsd_from_structure(buf->xcoll, &edi->sref);
3035 /* We have to translate & rotate the reference atoms first */
3036 translate_and_rotate(buf->xc_ref, edi->sref.nr, transvec, rotmat);
3037 rmsdev = rmsd_from_structure(buf->xc_ref, &edi->sref);
3041 /* update radsam references, when required */
3042 if (do_per_step(step, edi->maxedsteps) && step >= edi->presteps)
3044 project(buf->xcoll, edi);
3045 rad_project(edi, buf->xcoll, &edi->vecs.radacc);
3046 rad_project(edi, buf->xcoll, &edi->vecs.radfix);
3047 buf->oldrad = -1.e5;
3050 /* update radacc references, when required */
3051 if (do_per_step(step, iupdate) && step >= edi->presteps)
3053 edi->vecs.radacc.radius = calc_radius(&edi->vecs.radacc);
3054 if (edi->vecs.radacc.radius - buf->oldrad < edi->slope)
3056 project(buf->xcoll, edi);
3057 rad_project(edi, buf->xcoll, &edi->vecs.radacc);
3062 buf->oldrad = edi->vecs.radacc.radius;
3066 /* apply the constraints */
3067 if (step >= edi->presteps && ed_constraints(ed->eEDtype, edi))
3069 /* ED constraints should be applied already in the first MD step
3070 * (which is step 0), therefore we pass step+1 to the routine */
3071 ed_apply_constraints(buf->xcoll, edi, step+1 - ir->init_step);
3074 /* write to edo, when required */
3075 if (do_per_step(step, edi->outfrq))
3077 project(buf->xcoll, edi);
3078 if (MASTER(cr) && !bSuppress)
3080 write_edo(edi, ed->edo, rmsdev);
3084 /* Copy back the positions unless monitoring only */
3085 if (ed_constraints(ed->eEDtype, edi))
3087 /* remove fitting */
3088 rmfit(edi->sav.nr, buf->xcoll, transvec, rotmat);
3090 /* Copy the ED corrected positions into the coordinate array */
3091 /* Each node copies its local part. In the serial case, nat_loc is the
3092 * total number of ED atoms */
3093 for (i = 0; i < edi->sav.nr_loc; i++)
3095 /* Unshift local ED coordinate and store in x_unsh */
3096 ed_unshift_single_coord(box, buf->xcoll[edi->sav.c_ind[i]],
3097 buf->shifts_xcoll[edi->sav.c_ind[i]], x_unsh);
3099 /* dx is the ED correction to the positions: */
3100 rvec_sub(x_unsh, xs[edi->sav.anrs_loc[i]], dx);
3104 /* dv is the ED correction to the velocity: */
3105 svmul(dt_1, dx, dv);
3106 /* apply the velocity correction: */
3107 rvec_inc(v[edi->sav.anrs_loc[i]], dv);
3109 /* Finally apply the position correction due to ED: */
3110 copy_rvec(x_unsh, xs[edi->sav.anrs_loc[i]]);
3113 } /* END of if ( bNeedDoEdsam(edi) ) */
3115 /* Prepare for the next ED group */
3116 edi = edi->next_edi;
3118 } /* END of loop over ED groups */
3123 void done_ed(gmx_edsam_t *ed)
3127 /* ed->edo is opened sometimes with xvgropen, sometimes with
3128 * gmx_fio_fopen, so we use the least common denominator for
3130 gmx_fio_fclose((*ed)->edo);
3133 /* TODO deallocate ed and set pointer to NULL */