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, 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.
46 #include "gromacs/utility/cstringutil.h"
47 #include "gromacs/utility/smalloc.h"
49 #include "gromacs/fileio/confio.h"
51 #include "gromacs/math/vec.h"
55 #include "mtop_util.h"
56 #include "gromacs/essentialdynamics/edsam.h"
57 #include "gromacs/fileio/gmxfio.h"
58 #include "gromacs/fileio/xvgr.h"
59 #include "gromacs/mdlib/groupcoord.h"
61 #include "gromacs/linearalgebra/nrjac.h"
62 #include "gromacs/utility/fatalerror.h"
64 /* We use the same defines as in mvdata.c here */
65 #define block_bc(cr, d) gmx_bcast( sizeof(d), &(d), (cr))
66 #define nblock_bc(cr, nr, d) gmx_bcast((nr)*sizeof((d)[0]), (d), (cr))
67 #define snew_bc(cr, d, nr) { if (!MASTER(cr)) {snew((d), (nr)); }}
69 /* These macros determine the column width in the output file */
70 #define EDcol_sfmt "%17s"
71 #define EDcol_efmt "%17.5e"
72 #define EDcol_ffmt "%17f"
74 /* enum to identify the type of ED: none, normal ED, flooding */
76 eEDnone, eEDedsam, eEDflood, eEDnr
79 /* enum to identify operations on reference, average, origin, target structures */
81 eedREF, eedAV, eedORI, eedTAR, eedNR
87 int neig; /* nr of eigenvectors */
88 int *ieig; /* index nrs of eigenvectors */
89 real *stpsz; /* stepsizes (per eigenvector) */
90 rvec **vec; /* eigenvector components */
91 real *xproj; /* instantaneous x projections */
92 real *fproj; /* instantaneous f projections */
93 real radius; /* instantaneous radius */
94 real *refproj; /* starting or target projections */
95 /* When using flooding as harmonic restraint: The current reference projection
96 * is at each step calculated from the initial refproj0 and the slope. */
97 real *refproj0, *refprojslope;
103 t_eigvec mon; /* only monitored, no constraints */
104 t_eigvec linfix; /* fixed linear constraints */
105 t_eigvec linacc; /* acceptance linear constraints */
106 t_eigvec radfix; /* fixed radial constraints (exp) */
107 t_eigvec radacc; /* acceptance radial constraints (exp) */
108 t_eigvec radcon; /* acceptance rad. contraction constr. */
115 gmx_bool bHarmonic; /* Use flooding for harmonic restraint on
117 gmx_bool bConstForce; /* Do not calculate a flooding potential,
118 instead flood with a constant force */
127 rvec *forces_cartesian;
128 t_eigvec vecs; /* use flooding for these */
132 /* This type is for the average, reference, target, and origin structure */
133 typedef struct gmx_edx
135 int nr; /* number of atoms this structure contains */
136 int nr_loc; /* number of atoms on local node */
137 int *anrs; /* atom index numbers */
138 int *anrs_loc; /* local atom index numbers */
139 int nalloc_loc; /* allocation size of anrs_loc */
140 int *c_ind; /* at which position of the whole anrs
141 * array is a local atom?, i.e.
142 * c_ind[0...nr_loc-1] gives the atom index
143 * with respect to the collective
144 * anrs[0...nr-1] array */
145 rvec *x; /* positions for this structure */
146 rvec *x_old; /* Last positions which have the correct PBC
147 representation of the ED group. In
148 combination with keeping track of the
149 shift vectors, the ED group can always
151 real *m; /* masses */
152 real mtot; /* total mass (only used in sref) */
153 real *sqrtm; /* sqrt of the masses used for mass-
154 * weighting of analysis (only used in sav) */
160 int nini; /* total Nr of atoms */
161 gmx_bool fitmas; /* true if trans fit with cm */
162 gmx_bool pcamas; /* true if mass-weighted PCA */
163 int presteps; /* number of steps to run without any
164 * perturbations ... just monitoring */
165 int outfrq; /* freq (in steps) of writing to edo */
166 int maxedsteps; /* max nr of steps per cycle */
168 /* all gmx_edx datasets are copied to all nodes in the parallel case */
169 struct gmx_edx sref; /* reference positions, to these fitting
171 gmx_bool bRefEqAv; /* If true, reference & average indices
172 * are the same. Used for optimization */
173 struct gmx_edx sav; /* average positions */
174 struct gmx_edx star; /* target positions */
175 struct gmx_edx sori; /* origin positions */
177 t_edvecs vecs; /* eigenvectors */
178 real slope; /* minimal slope in acceptance radexp */
180 t_edflood flood; /* parameters especially for flooding */
181 struct t_ed_buffer *buf; /* handle to local buffers */
182 struct edpar *next_edi; /* Pointer to another ED group */
186 typedef struct gmx_edsam
188 int eEDtype; /* Type of ED: see enums above */
189 FILE *edo; /* output file pointer */
199 rvec old_transvec, older_transvec, transvec_compact;
200 rvec *xcoll; /* Positions from all nodes, this is the
201 collective set we work on.
202 These are the positions of atoms with
203 average structure indices */
204 rvec *xc_ref; /* same but with reference structure indices */
205 ivec *shifts_xcoll; /* Shifts for xcoll */
206 ivec *extra_shifts_xcoll; /* xcoll shift changes since last NS step */
207 ivec *shifts_xc_ref; /* Shifts for xc_ref */
208 ivec *extra_shifts_xc_ref; /* xc_ref shift changes since last NS step */
209 gmx_bool bUpdateShifts; /* TRUE in NS steps to indicate that the
210 ED shifts for this ED group need to
215 /* definition of ED buffer structure */
218 struct t_fit_to_ref * fit_to_ref;
219 struct t_do_edfit * do_edfit;
220 struct t_do_edsam * do_edsam;
221 struct t_do_radcon * do_radcon;
225 /* Function declarations */
226 static void fit_to_reference(rvec *xcoll, rvec transvec, matrix rotmat, t_edpar *edi);
227 static void translate_and_rotate(rvec *x, int nat, rvec transvec, matrix rotmat);
228 static real rmsd_from_structure(rvec *x, struct gmx_edx *s);
229 static int read_edi_file(const char *fn, t_edpar *edi, int nr_mdatoms);
230 static void crosscheck_edi_file_vs_checkpoint(gmx_edsam_t ed, edsamstate_t *EDstate);
231 static void init_edsamstate(gmx_edsam_t ed, edsamstate_t *EDstate);
232 static void write_edo_legend(gmx_edsam_t ed, int nED, const output_env_t oenv);
233 /* End function declarations */
236 /* Do we have to perform essential dynamics constraints or possibly only flooding
237 * for any of the ED groups? */
238 static gmx_bool bNeedDoEdsam(t_edpar *edi)
240 return edi->vecs.mon.neig
241 || edi->vecs.linfix.neig
242 || edi->vecs.linacc.neig
243 || edi->vecs.radfix.neig
244 || edi->vecs.radacc.neig
245 || edi->vecs.radcon.neig;
249 /* Multiple ED groups will be labeled with letters instead of numbers
250 * to avoid confusion with eigenvector indices */
251 static char get_EDgroupChar(int nr_edi, int nED)
259 * nr_edi = 2 -> B ...
261 return 'A' + nr_edi - 1;
265 /* Does not subtract average positions, projection on single eigenvector is returned
266 * used by: do_linfix, do_linacc, do_radfix, do_radacc, do_radcon
267 * Average position is subtracted in ed_apply_constraints prior to calling projectx
269 static real projectx(t_edpar *edi, rvec *xcoll, rvec *vec)
275 for (i = 0; i < edi->sav.nr; i++)
277 proj += edi->sav.sqrtm[i]*iprod(vec[i], xcoll[i]);
284 /* Specialized: projection is stored in vec->refproj
285 * -> used for radacc, radfix, radcon and center of flooding potential
286 * subtracts average positions, projects vector x */
287 static void rad_project(t_edpar *edi, rvec *x, t_eigvec *vec)
292 /* Subtract average positions */
293 for (i = 0; i < edi->sav.nr; i++)
295 rvec_dec(x[i], edi->sav.x[i]);
298 for (i = 0; i < vec->neig; i++)
300 vec->refproj[i] = projectx(edi, x, vec->vec[i]);
301 rad += pow((vec->refproj[i]-vec->xproj[i]), 2);
303 vec->radius = sqrt(rad);
305 /* Add average positions */
306 for (i = 0; i < edi->sav.nr; i++)
308 rvec_inc(x[i], edi->sav.x[i]);
313 /* Project vector x, subtract average positions prior to projection and add
314 * them afterwards to retain the unchanged vector. Store in xproj. Mass-weighting
316 static void project_to_eigvectors(rvec *x, /* The positions to project to an eigenvector */
317 t_eigvec *vec, /* The eigenvectors */
328 /* Subtract average positions */
329 for (i = 0; i < edi->sav.nr; i++)
331 rvec_dec(x[i], edi->sav.x[i]);
334 for (i = 0; i < vec->neig; i++)
336 vec->xproj[i] = projectx(edi, x, vec->vec[i]);
339 /* Add average positions */
340 for (i = 0; i < edi->sav.nr; i++)
342 rvec_inc(x[i], edi->sav.x[i]);
347 /* Project vector x onto all edi->vecs (mon, linfix,...) */
348 static void project(rvec *x, /* positions to project */
349 t_edpar *edi) /* edi data set */
351 /* It is not more work to subtract the average position in every
352 * subroutine again, because these routines are rarely used simultaneously */
353 project_to_eigvectors(x, &edi->vecs.mon, edi);
354 project_to_eigvectors(x, &edi->vecs.linfix, edi);
355 project_to_eigvectors(x, &edi->vecs.linacc, edi);
356 project_to_eigvectors(x, &edi->vecs.radfix, edi);
357 project_to_eigvectors(x, &edi->vecs.radacc, edi);
358 project_to_eigvectors(x, &edi->vecs.radcon, edi);
362 static real calc_radius(t_eigvec *vec)
368 for (i = 0; i < vec->neig; i++)
370 rad += pow((vec->refproj[i]-vec->xproj[i]), 2);
373 return rad = sqrt(rad);
379 static void dump_xcoll(t_edpar *edi, struct t_do_edsam *buf, t_commrec *cr,
386 ivec *shifts, *eshifts;
395 shifts = buf->shifts_xcoll;
396 eshifts = buf->extra_shifts_xcoll;
398 sprintf(fn, "xcolldump_step%d.txt", step);
401 for (i = 0; i < edi->sav.nr; i++)
403 fprintf(fp, "%d %9.5f %9.5f %9.5f %d %d %d %d %d %d\n",
405 xcoll[i][XX], xcoll[i][YY], xcoll[i][ZZ],
406 shifts[i][XX], shifts[i][YY], shifts[i][ZZ],
407 eshifts[i][XX], eshifts[i][YY], eshifts[i][ZZ]);
415 static void dump_edi_positions(FILE *out, struct gmx_edx *s, const char name[])
420 fprintf(out, "#%s positions:\n%d\n", name, s->nr);
426 fprintf(out, "#index, x, y, z");
429 fprintf(out, ", sqrt(m)");
431 for (i = 0; i < s->nr; i++)
433 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]);
436 fprintf(out, "%9.3f", s->sqrtm[i]);
444 static void dump_edi_eigenvecs(FILE *out, t_eigvec *ev,
445 const char name[], int length)
450 fprintf(out, "#%s eigenvectors:\n%d\n", name, ev->neig);
451 /* Dump the data for every eigenvector: */
452 for (i = 0; i < ev->neig; i++)
454 fprintf(out, "EV %4d\ncomponents %d\nstepsize %f\nxproj %f\nfproj %f\nrefproj %f\nradius %f\nComponents:\n",
455 ev->ieig[i], length, ev->stpsz[i], ev->xproj[i], ev->fproj[i], ev->refproj[i], ev->radius);
456 for (j = 0; j < length; j++)
458 fprintf(out, "%11.6f %11.6f %11.6f\n", ev->vec[i][j][XX], ev->vec[i][j][YY], ev->vec[i][j][ZZ]);
465 static void dump_edi(t_edpar *edpars, t_commrec *cr, int nr_edi)
471 sprintf(fn, "EDdump_node%d_edi%d", cr->nodeid, nr_edi);
472 out = gmx_ffopen(fn, "w");
474 fprintf(out, "#NINI\n %d\n#FITMAS\n %d\n#ANALYSIS_MAS\n %d\n",
475 edpars->nini, edpars->fitmas, edpars->pcamas);
476 fprintf(out, "#OUTFRQ\n %d\n#MAXLEN\n %d\n#SLOPECRIT\n %f\n",
477 edpars->outfrq, edpars->maxedsteps, edpars->slope);
478 fprintf(out, "#PRESTEPS\n %d\n#DELTA_F0\n %f\n#TAU\n %f\n#EFL_NULL\n %f\n#ALPHA2\n %f\n",
479 edpars->presteps, edpars->flood.deltaF0, edpars->flood.tau,
480 edpars->flood.constEfl, edpars->flood.alpha2);
482 /* Dump reference, average, target, origin positions */
483 dump_edi_positions(out, &edpars->sref, "REFERENCE");
484 dump_edi_positions(out, &edpars->sav, "AVERAGE" );
485 dump_edi_positions(out, &edpars->star, "TARGET" );
486 dump_edi_positions(out, &edpars->sori, "ORIGIN" );
488 /* Dump eigenvectors */
489 dump_edi_eigenvecs(out, &edpars->vecs.mon, "MONITORED", edpars->sav.nr);
490 dump_edi_eigenvecs(out, &edpars->vecs.linfix, "LINFIX", edpars->sav.nr);
491 dump_edi_eigenvecs(out, &edpars->vecs.linacc, "LINACC", edpars->sav.nr);
492 dump_edi_eigenvecs(out, &edpars->vecs.radfix, "RADFIX", edpars->sav.nr);
493 dump_edi_eigenvecs(out, &edpars->vecs.radacc, "RADACC", edpars->sav.nr);
494 dump_edi_eigenvecs(out, &edpars->vecs.radcon, "RADCON", edpars->sav.nr);
496 /* Dump flooding eigenvectors */
497 dump_edi_eigenvecs(out, &edpars->flood.vecs, "FLOODING", edpars->sav.nr);
499 /* Dump ed local buffer */
500 fprintf(out, "buf->do_edfit =%p\n", (void*)edpars->buf->do_edfit );
501 fprintf(out, "buf->do_edsam =%p\n", (void*)edpars->buf->do_edsam );
502 fprintf(out, "buf->do_radcon =%p\n", (void*)edpars->buf->do_radcon );
509 static void dump_rotmat(FILE* out, matrix rotmat)
511 fprintf(out, "ROTMAT: %12.8f %12.8f %12.8f\n", rotmat[XX][XX], rotmat[XX][YY], rotmat[XX][ZZ]);
512 fprintf(out, "ROTMAT: %12.8f %12.8f %12.8f\n", rotmat[YY][XX], rotmat[YY][YY], rotmat[YY][ZZ]);
513 fprintf(out, "ROTMAT: %12.8f %12.8f %12.8f\n", rotmat[ZZ][XX], rotmat[ZZ][YY], rotmat[ZZ][ZZ]);
518 static void dump_rvec(FILE *out, int dim, rvec *x)
523 for (i = 0; i < dim; i++)
525 fprintf(out, "%4d %f %f %f\n", i, x[i][XX], x[i][YY], x[i][ZZ]);
531 static void dump_mat(FILE* out, int dim, double** mat)
536 fprintf(out, "MATRIX:\n");
537 for (i = 0; i < dim; i++)
539 for (j = 0; j < dim; j++)
541 fprintf(out, "%f ", mat[i][j]);
554 static void do_edfit(int natoms, rvec *xp, rvec *x, matrix R, t_edpar *edi)
556 /* this is a copy of do_fit with some modifications */
557 int c, r, n, j, i, irot;
558 double d[6], xnr, xpc;
563 struct t_do_edfit *loc;
566 if (edi->buf->do_edfit != NULL)
573 snew(edi->buf->do_edfit, 1);
575 loc = edi->buf->do_edfit;
579 snew(loc->omega, 2*DIM);
580 snew(loc->om, 2*DIM);
581 for (i = 0; i < 2*DIM; i++)
583 snew(loc->omega[i], 2*DIM);
584 snew(loc->om[i], 2*DIM);
588 for (i = 0; (i < 6); i++)
591 for (j = 0; (j < 6); j++)
593 loc->omega[i][j] = 0;
598 /* calculate the matrix U */
600 for (n = 0; (n < natoms); n++)
602 for (c = 0; (c < DIM); c++)
605 for (r = 0; (r < DIM); r++)
613 /* construct loc->omega */
614 /* loc->omega is symmetric -> loc->omega==loc->omega' */
615 for (r = 0; (r < 6); r++)
617 for (c = 0; (c <= r); c++)
619 if ((r >= 3) && (c < 3))
621 loc->omega[r][c] = u[r-3][c];
622 loc->omega[c][r] = u[r-3][c];
626 loc->omega[r][c] = 0;
627 loc->omega[c][r] = 0;
632 /* determine h and k */
636 dump_mat(stderr, 2*DIM, loc->omega);
637 for (i = 0; i < 6; i++)
639 fprintf(stderr, "d[%d] = %f\n", i, d[i]);
643 jacobi(loc->omega, 6, d, loc->om, &irot);
647 fprintf(stderr, "IROT=0\n");
650 index = 0; /* For the compiler only */
652 for (j = 0; (j < 3); j++)
655 for (i = 0; (i < 6); i++)
664 for (i = 0; (i < 3); i++)
666 vh[j][i] = M_SQRT2*loc->om[i][index];
667 vk[j][i] = M_SQRT2*loc->om[i+DIM][index];
672 for (c = 0; (c < 3); c++)
674 for (r = 0; (r < 3); r++)
676 R[c][r] = vk[0][r]*vh[0][c]+
683 for (c = 0; (c < 3); c++)
685 for (r = 0; (r < 3); r++)
687 R[c][r] = vk[0][r]*vh[0][c]+
696 static void rmfit(int nat, rvec *xcoll, rvec transvec, matrix rotmat)
703 * The inverse rotation is described by the transposed rotation matrix */
704 transpose(rotmat, tmat);
705 rotate_x(xcoll, nat, tmat);
707 /* Remove translation */
708 vec[XX] = -transvec[XX];
709 vec[YY] = -transvec[YY];
710 vec[ZZ] = -transvec[ZZ];
711 translate_x(xcoll, nat, vec);
715 /**********************************************************************************
716 ******************** FLOODING ****************************************************
717 **********************************************************************************
719 The flooding ability was added later to edsam. Many of the edsam functionality could be reused for that purpose.
720 The flooding covariance matrix, i.e. the selected eigenvectors and their corresponding eigenvalues are
721 read as 7th Component Group. The eigenvalues are coded into the stepsize parameter (as used by -linfix or -linacc).
723 do_md clls right in the beginning the function init_edsam, which reads the edi file, saves all the necessary information in
724 the edi structure and calls init_flood, to initialise some extra fields in the edi->flood structure.
726 since the flooding acts on forces do_flood is called from the function force() (force.c), while the other
727 edsam functionality is hooked into md via the update() (update.c) function acting as constraint on positions.
729 do_flood makes a copy of the positions,
730 fits them, projects them computes flooding_energy, and flooding forces. The forces are computed in the
731 space of the eigenvectors and are then blown up to the full cartesian space and rotated back to remove the
732 fit. Then do_flood adds these forces to the forcefield-forces
733 (given as parameter) and updates the adaptive flooding parameters Efl and deltaF.
735 To center the flooding potential at a different location one can use the -ori option in make_edi. The ori
736 structure is projected to the system of eigenvectors and then this position in the subspace is used as
737 center of the flooding potential. If the option is not used, the center will be zero in the subspace,
738 i.e. the average structure as given in the make_edi file.
740 To use the flooding potential as restraint, make_edi has the option -restrain, which leads to inverted
741 signs of alpha2 and Efl, such that the sign in the exponential of Vfl is not inverted but the sign of
742 Vfl is inverted. Vfl = Efl * exp (- .../Efl/alpha2*x^2...) With tau>0 the negative Efl will grow slowly
743 so that the restraint is switched off slowly. When Efl==0 and inverted flooding is ON is reached no
744 further adaption is applied, Efl will stay constant at zero.
746 To use restraints with harmonic potentials switch -restrain and -harmonic. Then the eigenvalues are
747 used as spring constants for the harmonic potential.
748 Note that eq3 in the flooding paper (J. Comp. Chem. 2006, 27, 1693-1702) defines the parameter lambda \
749 as the inverse of the spring constant, whereas the implementation uses lambda as the spring constant.
751 To use more than one flooding matrix just concatenate several .edi files (cat flood1.edi flood2.edi > flood_all.edi)
752 the routine read_edi_file reads all of theses flooding files.
753 The structure t_edi is now organized as a list of t_edis and the function do_flood cycles through the list
754 calling the do_single_flood() routine for every single entry. Since every state variables have been kept in one
755 edi there is no interdependence whatsoever. The forces are added together.
757 To write energies into the .edr file, call the function
758 get_flood_enx_names(char**, int *nnames) to get the Header (Vfl1 Vfl2... Vfln)
760 get_flood_energies(real Vfl[],int nnames);
763 - 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.
765 Maybe one should give a range of atoms for which to remove motion, so that motion is removed with
766 two edsam files from two peptide chains
769 static void write_edo_flood(t_edpar *edi, FILE *fp, real rmsd)
774 /* Output how well we fit to the reference structure */
775 fprintf(fp, EDcol_ffmt, rmsd);
777 for (i = 0; i < edi->flood.vecs.neig; i++)
779 fprintf(fp, EDcol_efmt, edi->flood.vecs.xproj[i]);
781 /* Check whether the reference projection changes with time (this can happen
782 * in case flooding is used as harmonic restraint). If so, output the
783 * current reference projection */
784 if (edi->flood.bHarmonic && edi->flood.vecs.refprojslope[i] != 0.0)
786 fprintf(fp, EDcol_efmt, edi->flood.vecs.refproj[i]);
789 /* Output Efl if we are doing adaptive flooding */
790 if (0 != edi->flood.tau)
792 fprintf(fp, EDcol_efmt, edi->flood.Efl);
794 fprintf(fp, EDcol_efmt, edi->flood.Vfl);
796 /* Output deltaF if we are doing adaptive flooding */
797 if (0 != edi->flood.tau)
799 fprintf(fp, EDcol_efmt, edi->flood.deltaF);
801 fprintf(fp, EDcol_efmt, edi->flood.vecs.fproj[i]);
806 /* From flood.xproj compute the Vfl(x) at this point */
807 static real flood_energy(t_edpar *edi, gmx_int64_t step)
809 /* compute flooding energy Vfl
810 Vfl = Efl * exp( - \frac {kT} {2Efl alpha^2} * sum_i { \lambda_i c_i^2 } )
811 \lambda_i is the reciprocal eigenvalue 1/\sigma_i
812 it is already computed by make_edi and stored in stpsz[i]
814 Vfl = - Efl * 1/2(sum _i {\frac 1{\lambda_i} c_i^2})
821 /* Each time this routine is called (i.e. each time step), we add a small
822 * value to the reference projection. This way a harmonic restraint towards
823 * a moving reference is realized. If no value for the additive constant
824 * is provided in the edi file, the reference will not change. */
825 if (edi->flood.bHarmonic)
827 for (i = 0; i < edi->flood.vecs.neig; i++)
829 edi->flood.vecs.refproj[i] = edi->flood.vecs.refproj0[i] + step * edi->flood.vecs.refprojslope[i];
834 /* Compute sum which will be the exponent of the exponential */
835 for (i = 0; i < edi->flood.vecs.neig; i++)
837 /* stpsz stores the reciprocal eigenvalue 1/sigma_i */
838 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]);
841 /* Compute the Gauss function*/
842 if (edi->flood.bHarmonic)
844 Vfl = -0.5*edi->flood.Efl*sum; /* minus sign because Efl is negative, if restrain is on. */
848 Vfl = edi->flood.Efl != 0 ? edi->flood.Efl*exp(-edi->flood.kT/2/edi->flood.Efl/edi->flood.alpha2*sum) : 0;
855 /* From the position and from Vfl compute forces in subspace -> store in edi->vec.flood.fproj */
856 static void flood_forces(t_edpar *edi)
858 /* compute the forces in the subspace of the flooding eigenvectors
859 * by the formula F_i= V_{fl}(c) * ( \frac {kT} {E_{fl}} \lambda_i c_i */
862 real energy = edi->flood.Vfl;
865 if (edi->flood.bHarmonic)
867 for (i = 0; i < edi->flood.vecs.neig; i++)
869 edi->flood.vecs.fproj[i] = edi->flood.Efl* edi->flood.vecs.stpsz[i]*(edi->flood.vecs.xproj[i]-edi->flood.vecs.refproj[i]);
874 for (i = 0; i < edi->flood.vecs.neig; i++)
876 /* if Efl is zero the forces are zero if not use the formula */
877 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;
883 /* Raise forces from subspace into cartesian space */
884 static void flood_blowup(t_edpar *edi, rvec *forces_cart)
886 /* this function lifts the forces from the subspace to the cartesian space
887 all the values not contained in the subspace are assumed to be zero and then
888 a coordinate transformation from eigenvector to cartesian vectors is performed
889 The nonexistent values don't have to be set to zero explicitly, they would occur
890 as zero valued summands, hence we just stop to compute this part of the sum.
892 for every atom we add all the contributions to this atom from all the different eigenvectors.
894 NOTE: one could add directly to the forcefield forces, would mean we wouldn't have to clear the
895 field forces_cart prior the computation, but we compute the forces separately
896 to have them accessible for diagnostics
903 forces_sub = edi->flood.vecs.fproj;
906 /* Calculate the cartesian forces for the local atoms */
908 /* Clear forces first */
909 for (j = 0; j < edi->sav.nr_loc; j++)
911 clear_rvec(forces_cart[j]);
914 /* Now compute atomwise */
915 for (j = 0; j < edi->sav.nr_loc; j++)
917 /* Compute forces_cart[edi->sav.anrs[j]] */
918 for (eig = 0; eig < edi->flood.vecs.neig; eig++)
920 /* Force vector is force * eigenvector (compute only atom j) */
921 svmul(forces_sub[eig], edi->flood.vecs.vec[eig][edi->sav.c_ind[j]], dum);
922 /* Add this vector to the cartesian forces */
923 rvec_inc(forces_cart[j], dum);
929 /* Update the values of Efl, deltaF depending on tau and Vfl */
930 static void update_adaption(t_edpar *edi)
932 /* this function updates the parameter Efl and deltaF according to the rules given in
933 * 'predicting unimolecular chemical reactions: chemical flooding' M Mueller et al,
936 if ((edi->flood.tau < 0 ? -edi->flood.tau : edi->flood.tau ) > 0.00000001)
938 edi->flood.Efl = edi->flood.Efl+edi->flood.dt/edi->flood.tau*(edi->flood.deltaF0-edi->flood.deltaF);
939 /* check if restrain (inverted flooding) -> don't let EFL become positive */
940 if (edi->flood.alpha2 < 0 && edi->flood.Efl > -0.00000001)
945 edi->flood.deltaF = (1-edi->flood.dt/edi->flood.tau)*edi->flood.deltaF+edi->flood.dt/edi->flood.tau*edi->flood.Vfl;
950 static void do_single_flood(
958 gmx_bool bNS) /* Are we in a neighbor searching step? */
961 matrix rotmat; /* rotation matrix */
962 matrix tmat; /* inverse rotation */
963 rvec transvec; /* translation vector */
965 struct t_do_edsam *buf;
968 buf = edi->buf->do_edsam;
971 /* Broadcast the positions of the AVERAGE structure such that they are known on
972 * every processor. Each node contributes its local positions x and stores them in
973 * the collective ED array buf->xcoll */
974 communicate_group_positions(cr, buf->xcoll, buf->shifts_xcoll, buf->extra_shifts_xcoll, bNS, x,
975 edi->sav.nr, edi->sav.nr_loc, edi->sav.anrs_loc, edi->sav.c_ind, edi->sav.x_old, box);
977 /* Only assembly REFERENCE positions if their indices differ from the average ones */
980 communicate_group_positions(cr, buf->xc_ref, buf->shifts_xc_ref, buf->extra_shifts_xc_ref, bNS, x,
981 edi->sref.nr, edi->sref.nr_loc, edi->sref.anrs_loc, edi->sref.c_ind, edi->sref.x_old, box);
984 /* If bUpdateShifts was TRUE, the shifts have just been updated in get_positions.
985 * We do not need to update the shifts until the next NS step */
986 buf->bUpdateShifts = FALSE;
988 /* Now all nodes have all of the ED/flooding positions in edi->sav->xcoll,
989 * as well as the indices in edi->sav.anrs */
991 /* Fit the reference indices to the reference structure */
994 fit_to_reference(buf->xcoll, transvec, rotmat, edi);
998 fit_to_reference(buf->xc_ref, transvec, rotmat, edi);
1001 /* Now apply the translation and rotation to the ED structure */
1002 translate_and_rotate(buf->xcoll, edi->sav.nr, transvec, rotmat);
1004 /* Project fitted structure onto supbspace -> store in edi->flood.vecs.xproj */
1005 project_to_eigvectors(buf->xcoll, &edi->flood.vecs, edi);
1007 if (FALSE == edi->flood.bConstForce)
1009 /* Compute Vfl(x) from flood.xproj */
1010 edi->flood.Vfl = flood_energy(edi, step);
1012 update_adaption(edi);
1014 /* Compute the flooding forces */
1018 /* Translate them into cartesian positions */
1019 flood_blowup(edi, edi->flood.forces_cartesian);
1021 /* Rotate forces back so that they correspond to the given structure and not to the fitted one */
1022 /* Each node rotates back its local forces */
1023 transpose(rotmat, tmat);
1024 rotate_x(edi->flood.forces_cartesian, edi->sav.nr_loc, tmat);
1026 /* Finally add forces to the main force variable */
1027 for (i = 0; i < edi->sav.nr_loc; i++)
1029 rvec_inc(force[edi->sav.anrs_loc[i]], edi->flood.forces_cartesian[i]);
1032 /* Output is written by the master process */
1033 if (do_per_step(step, edi->outfrq) && MASTER(cr))
1035 /* Output how well we fit to the reference */
1038 /* Indices of reference and average structures are identical,
1039 * thus we can calculate the rmsd to SREF using xcoll */
1040 rmsdev = rmsd_from_structure(buf->xcoll, &edi->sref);
1044 /* We have to translate & rotate the reference atoms first */
1045 translate_and_rotate(buf->xc_ref, edi->sref.nr, transvec, rotmat);
1046 rmsdev = rmsd_from_structure(buf->xc_ref, &edi->sref);
1049 write_edo_flood(edi, edo, rmsdev);
1054 /* Main flooding routine, called from do_force */
1055 extern void do_flood(
1070 /* Write time to edo, when required. Output the time anyhow since we need
1071 * it in the output file for ED constraints. */
1072 if (MASTER(cr) && do_per_step(step, edi->outfrq))
1074 fprintf(ed->edo, "\n%12f", ir->init_t + step*ir->delta_t);
1077 if (ed->eEDtype != eEDflood)
1084 /* Call flooding for one matrix */
1085 if (edi->flood.vecs.neig)
1087 do_single_flood(ed->edo, x, force, edi, step, box, cr, bNS);
1089 edi = edi->next_edi;
1094 /* Called by init_edi, configure some flooding related variables and structures,
1095 * print headers to output files */
1096 static void init_flood(t_edpar *edi, gmx_edsam_t ed, real dt)
1101 edi->flood.Efl = edi->flood.constEfl;
1105 if (edi->flood.vecs.neig)
1107 /* If in any of the ED groups we find a flooding vector, flooding is turned on */
1108 ed->eEDtype = eEDflood;
1110 fprintf(stderr, "ED: Flooding %d eigenvector%s.\n", edi->flood.vecs.neig, edi->flood.vecs.neig > 1 ? "s" : "");
1112 if (edi->flood.bConstForce)
1114 /* We have used stpsz as a vehicle to carry the fproj values for constant
1115 * force flooding. Now we copy that to flood.vecs.fproj. Note that
1116 * in const force flooding, fproj is never changed. */
1117 for (i = 0; i < edi->flood.vecs.neig; i++)
1119 edi->flood.vecs.fproj[i] = edi->flood.vecs.stpsz[i];
1121 fprintf(stderr, "ED: applying on eigenvector %d a constant force of %g\n",
1122 edi->flood.vecs.ieig[i], edi->flood.vecs.fproj[i]);
1130 /*********** Energy book keeping ******/
1131 static void get_flood_enx_names(t_edpar *edi, char** names, int *nnames) /* get header of energies */
1140 srenew(names, count);
1141 sprintf(buf, "Vfl_%d", count);
1142 names[count-1] = strdup(buf);
1143 actual = actual->next_edi;
1150 static void get_flood_energies(t_edpar *edi, real Vfl[], int nnames)
1152 /*fl has to be big enough to capture nnames-many entries*/
1161 Vfl[count-1] = actual->flood.Vfl;
1162 actual = actual->next_edi;
1165 if (nnames != count-1)
1167 gmx_fatal(FARGS, "Number of energies is not consistent with t_edi structure");
1170 /************* END of FLOODING IMPLEMENTATION ****************************/
1174 gmx_edsam_t ed_open(int natoms, edsamstate_t *EDstate, int nfile, const t_filenm fnm[], unsigned long Flags, const output_env_t oenv, t_commrec *cr)
1180 /* Allocate space for the ED data structure */
1183 /* We want to perform ED (this switch might later be upgraded to eEDflood) */
1184 ed->eEDtype = eEDedsam;
1188 fprintf(stderr, "ED sampling will be performed!\n");
1191 /* Read the edi input file: */
1192 nED = read_edi_file(ftp2fn(efEDI, nfile, fnm), ed->edpar, natoms);
1194 /* Make sure the checkpoint was produced in a run using this .edi file */
1195 if (EDstate->bFromCpt)
1197 crosscheck_edi_file_vs_checkpoint(ed, EDstate);
1203 init_edsamstate(ed, EDstate);
1205 /* The master opens the ED output file */
1206 if (Flags & MD_APPENDFILES)
1208 ed->edo = gmx_fio_fopen(opt2fn("-eo", nfile, fnm), "a+");
1212 ed->edo = xvgropen(opt2fn("-eo", nfile, fnm),
1213 "Essential dynamics / flooding output",
1215 "RMSDs (nm), projections on EVs (nm), ...", oenv);
1217 /* Make a descriptive legend */
1218 write_edo_legend(ed, EDstate->nED, oenv);
1225 /* Broadcasts the structure data */
1226 static void bc_ed_positions(t_commrec *cr, struct gmx_edx *s, int stype)
1228 snew_bc(cr, s->anrs, s->nr ); /* Index numbers */
1229 snew_bc(cr, s->x, s->nr ); /* Positions */
1230 nblock_bc(cr, s->nr, s->anrs );
1231 nblock_bc(cr, s->nr, s->x );
1233 /* For the average & reference structures we need an array for the collective indices,
1234 * and we need to broadcast the masses as well */
1235 if (stype == eedAV || stype == eedREF)
1237 /* We need these additional variables in the parallel case: */
1238 snew(s->c_ind, s->nr ); /* Collective indices */
1239 /* Local atom indices get assigned in dd_make_local_group_indices.
1240 * There, also memory is allocated */
1241 s->nalloc_loc = 0; /* allocation size of s->anrs_loc */
1242 snew_bc(cr, s->x_old, s->nr); /* To be able to always make the ED molecule whole, ... */
1243 nblock_bc(cr, s->nr, s->x_old); /* ... keep track of shift changes with the help of old coords */
1246 /* broadcast masses for the reference structure (for mass-weighted fitting) */
1247 if (stype == eedREF)
1249 snew_bc(cr, s->m, s->nr);
1250 nblock_bc(cr, s->nr, s->m);
1253 /* For the average structure we might need the masses for mass-weighting */
1256 snew_bc(cr, s->sqrtm, s->nr);
1257 nblock_bc(cr, s->nr, s->sqrtm);
1258 snew_bc(cr, s->m, s->nr);
1259 nblock_bc(cr, s->nr, s->m);
1264 /* Broadcasts the eigenvector data */
1265 static void bc_ed_vecs(t_commrec *cr, t_eigvec *ev, int length, gmx_bool bHarmonic)
1269 snew_bc(cr, ev->ieig, ev->neig); /* index numbers of eigenvector */
1270 snew_bc(cr, ev->stpsz, ev->neig); /* stepsizes per eigenvector */
1271 snew_bc(cr, ev->xproj, ev->neig); /* instantaneous x projection */
1272 snew_bc(cr, ev->fproj, ev->neig); /* instantaneous f projection */
1273 snew_bc(cr, ev->refproj, ev->neig); /* starting or target projection */
1275 nblock_bc(cr, ev->neig, ev->ieig );
1276 nblock_bc(cr, ev->neig, ev->stpsz );
1277 nblock_bc(cr, ev->neig, ev->xproj );
1278 nblock_bc(cr, ev->neig, ev->fproj );
1279 nblock_bc(cr, ev->neig, ev->refproj);
1281 snew_bc(cr, ev->vec, ev->neig); /* Eigenvector components */
1282 for (i = 0; i < ev->neig; i++)
1284 snew_bc(cr, ev->vec[i], length);
1285 nblock_bc(cr, length, ev->vec[i]);
1288 /* For harmonic restraints the reference projections can change with time */
1291 snew_bc(cr, ev->refproj0, ev->neig);
1292 snew_bc(cr, ev->refprojslope, ev->neig);
1293 nblock_bc(cr, ev->neig, ev->refproj0 );
1294 nblock_bc(cr, ev->neig, ev->refprojslope);
1299 /* Broadcasts the ED / flooding data to other nodes
1300 * and allocates memory where needed */
1301 static void broadcast_ed_data(t_commrec *cr, gmx_edsam_t ed, int numedis)
1307 /* Master lets the other nodes know if its ED only or also flooding */
1308 gmx_bcast(sizeof(ed->eEDtype), &(ed->eEDtype), cr);
1310 snew_bc(cr, ed->edpar, 1);
1311 /* Now transfer the ED data set(s) */
1313 for (nr = 0; nr < numedis; nr++)
1315 /* Broadcast a single ED data set */
1318 /* Broadcast positions */
1319 bc_ed_positions(cr, &(edi->sref), eedREF); /* reference positions (don't broadcast masses) */
1320 bc_ed_positions(cr, &(edi->sav ), eedAV ); /* average positions (do broadcast masses as well) */
1321 bc_ed_positions(cr, &(edi->star), eedTAR); /* target positions */
1322 bc_ed_positions(cr, &(edi->sori), eedORI); /* origin positions */
1324 /* Broadcast eigenvectors */
1325 bc_ed_vecs(cr, &edi->vecs.mon, edi->sav.nr, FALSE);
1326 bc_ed_vecs(cr, &edi->vecs.linfix, edi->sav.nr, FALSE);
1327 bc_ed_vecs(cr, &edi->vecs.linacc, edi->sav.nr, FALSE);
1328 bc_ed_vecs(cr, &edi->vecs.radfix, edi->sav.nr, FALSE);
1329 bc_ed_vecs(cr, &edi->vecs.radacc, edi->sav.nr, FALSE);
1330 bc_ed_vecs(cr, &edi->vecs.radcon, edi->sav.nr, FALSE);
1331 /* Broadcast flooding eigenvectors and, if needed, values for the moving reference */
1332 bc_ed_vecs(cr, &edi->flood.vecs, edi->sav.nr, edi->flood.bHarmonic);
1334 /* Set the pointer to the next ED group */
1337 snew_bc(cr, edi->next_edi, 1);
1338 edi = edi->next_edi;
1344 /* init-routine called for every *.edi-cycle, initialises t_edpar structure */
1345 static void init_edi(gmx_mtop_t *mtop, t_edpar *edi)
1348 real totalmass = 0.0;
1350 gmx_mtop_atomlookup_t alook = NULL;
1353 /* NOTE Init_edi is executed on the master process only
1354 * The initialized data sets are then transmitted to the
1355 * other nodes in broadcast_ed_data */
1357 alook = gmx_mtop_atomlookup_init(mtop);
1359 /* evaluate masses (reference structure) */
1360 snew(edi->sref.m, edi->sref.nr);
1361 for (i = 0; i < edi->sref.nr; i++)
1365 gmx_mtop_atomnr_to_atom(alook, edi->sref.anrs[i], &atom);
1366 edi->sref.m[i] = atom->m;
1370 edi->sref.m[i] = 1.0;
1373 /* Check that every m > 0. Bad things will happen otherwise. */
1374 if (edi->sref.m[i] <= 0.0)
1376 gmx_fatal(FARGS, "Reference structure atom %d (sam.edi index %d) has a mass of %g.\n"
1377 "For a mass-weighted fit, all reference structure atoms need to have a mass >0.\n"
1378 "Either make the covariance analysis non-mass-weighted, or exclude massless\n"
1379 "atoms from the reference structure by creating a proper index group.\n",
1380 i, edi->sref.anrs[i]+1, edi->sref.m[i]);
1383 totalmass += edi->sref.m[i];
1385 edi->sref.mtot = totalmass;
1387 /* Masses m and sqrt(m) for the average structure. Note that m
1388 * is needed if forces have to be evaluated in do_edsam */
1389 snew(edi->sav.sqrtm, edi->sav.nr );
1390 snew(edi->sav.m, edi->sav.nr );
1391 for (i = 0; i < edi->sav.nr; i++)
1393 gmx_mtop_atomnr_to_atom(alook, edi->sav.anrs[i], &atom);
1394 edi->sav.m[i] = atom->m;
1397 edi->sav.sqrtm[i] = sqrt(atom->m);
1401 edi->sav.sqrtm[i] = 1.0;
1404 /* Check that every m > 0. Bad things will happen otherwise. */
1405 if (edi->sav.sqrtm[i] <= 0.0)
1407 gmx_fatal(FARGS, "Average structure atom %d (sam.edi index %d) has a mass of %g.\n"
1408 "For ED with mass-weighting, all average structure atoms need to have a mass >0.\n"
1409 "Either make the covariance analysis non-mass-weighted, or exclude massless\n"
1410 "atoms from the average structure by creating a proper index group.\n",
1411 i, edi->sav.anrs[i]+1, atom->m);
1415 gmx_mtop_atomlookup_destroy(alook);
1417 /* put reference structure in origin */
1418 get_center(edi->sref.x, edi->sref.m, edi->sref.nr, com);
1422 translate_x(edi->sref.x, edi->sref.nr, com);
1424 /* Init ED buffer */
1429 static void check(const char *line, const char *label)
1431 if (!strstr(line, label))
1433 gmx_fatal(FARGS, "Could not find input parameter %s at expected position in edsam input-file (.edi)\nline read instead is %s", label, line);
1438 static int read_checked_edint(FILE *file, const char *label)
1440 char line[STRLEN+1];
1444 fgets2 (line, STRLEN, file);
1446 fgets2 (line, STRLEN, file);
1447 sscanf (line, "%d", &idum);
1452 static int read_edint(FILE *file, gmx_bool *bEOF)
1454 char line[STRLEN+1];
1459 eof = fgets2 (line, STRLEN, file);
1465 eof = fgets2 (line, STRLEN, file);
1471 sscanf (line, "%d", &idum);
1477 static real read_checked_edreal(FILE *file, const char *label)
1479 char line[STRLEN+1];
1483 fgets2 (line, STRLEN, file);
1485 fgets2 (line, STRLEN, file);
1486 sscanf (line, "%lf", &rdum);
1487 return (real) rdum; /* always read as double and convert to single */
1491 static void read_edx(FILE *file, int number, int *anrs, rvec *x)
1494 char line[STRLEN+1];
1498 for (i = 0; i < number; i++)
1500 fgets2 (line, STRLEN, file);
1501 sscanf (line, "%d%lf%lf%lf", &anrs[i], &d[0], &d[1], &d[2]);
1502 anrs[i]--; /* we are reading FORTRAN indices */
1503 for (j = 0; j < 3; j++)
1505 x[i][j] = d[j]; /* always read as double and convert to single */
1511 static void scan_edvec(FILE *in, int nr, rvec *vec)
1513 char line[STRLEN+1];
1518 for (i = 0; (i < nr); i++)
1520 fgets2 (line, STRLEN, in);
1521 sscanf (line, "%le%le%le", &x, &y, &z);
1529 static void read_edvec(FILE *in, int nr, t_eigvec *tvec, gmx_bool bReadRefproj, gmx_bool *bHaveReference)
1532 double rdum, refproj_dum = 0.0, refprojslope_dum = 0.0;
1533 char line[STRLEN+1];
1536 tvec->neig = read_checked_edint(in, "NUMBER OF EIGENVECTORS");
1539 snew(tvec->ieig, tvec->neig);
1540 snew(tvec->stpsz, tvec->neig);
1541 snew(tvec->vec, tvec->neig);
1542 snew(tvec->xproj, tvec->neig);
1543 snew(tvec->fproj, tvec->neig);
1544 snew(tvec->refproj, tvec->neig);
1547 snew(tvec->refproj0, tvec->neig);
1548 snew(tvec->refprojslope, tvec->neig);
1551 for (i = 0; (i < tvec->neig); i++)
1553 fgets2 (line, STRLEN, in);
1554 if (bReadRefproj) /* ONLY when using flooding as harmonic restraint */
1556 nscan = sscanf(line, "%d%lf%lf%lf", &idum, &rdum, &refproj_dum, &refprojslope_dum);
1557 /* Zero out values which were not scanned */
1561 /* Every 4 values read, including reference position */
1562 *bHaveReference = TRUE;
1565 /* A reference position is provided */
1566 *bHaveReference = TRUE;
1567 /* No value for slope, set to 0 */
1568 refprojslope_dum = 0.0;
1571 /* No values for reference projection and slope, set to 0 */
1573 refprojslope_dum = 0.0;
1576 gmx_fatal(FARGS, "Expected 2 - 4 (not %d) values for flooding vec: <nr> <spring const> <refproj> <refproj-slope>\n", nscan);
1579 tvec->refproj[i] = refproj_dum;
1580 tvec->refproj0[i] = refproj_dum;
1581 tvec->refprojslope[i] = refprojslope_dum;
1583 else /* Normal flooding */
1585 nscan = sscanf(line, "%d%lf", &idum, &rdum);
1588 gmx_fatal(FARGS, "Expected 2 values for flooding vec: <nr> <stpsz>\n");
1591 tvec->ieig[i] = idum;
1592 tvec->stpsz[i] = rdum;
1593 } /* end of loop over eigenvectors */
1595 for (i = 0; (i < tvec->neig); i++)
1597 snew(tvec->vec[i], nr);
1598 scan_edvec(in, nr, tvec->vec[i]);
1604 /* calls read_edvec for the vector groups, only for flooding there is an extra call */
1605 static void read_edvecs(FILE *in, int nr, t_edvecs *vecs)
1607 gmx_bool bHaveReference = FALSE;
1610 read_edvec(in, nr, &vecs->mon, FALSE, &bHaveReference);
1611 read_edvec(in, nr, &vecs->linfix, FALSE, &bHaveReference);
1612 read_edvec(in, nr, &vecs->linacc, FALSE, &bHaveReference);
1613 read_edvec(in, nr, &vecs->radfix, FALSE, &bHaveReference);
1614 read_edvec(in, nr, &vecs->radacc, FALSE, &bHaveReference);
1615 read_edvec(in, nr, &vecs->radcon, FALSE, &bHaveReference);
1619 /* Check if the same atom indices are used for reference and average positions */
1620 static gmx_bool check_if_same(struct gmx_edx sref, struct gmx_edx sav)
1625 /* If the number of atoms differs between the two structures,
1626 * they cannot be identical */
1627 if (sref.nr != sav.nr)
1632 /* Now that we know that both stuctures have the same number of atoms,
1633 * check if also the indices are identical */
1634 for (i = 0; i < sav.nr; i++)
1636 if (sref.anrs[i] != sav.anrs[i])
1641 fprintf(stderr, "ED: Note: Reference and average structure are composed of the same atom indices.\n");
1647 static int read_edi(FILE* in, t_edpar *edi, int nr_mdatoms, const char *fn)
1650 const int magic = 670;
1653 /* Was a specific reference point for the flooding/umbrella potential provided in the edi file? */
1654 gmx_bool bHaveReference = FALSE;
1657 /* the edi file is not free format, so expect problems if the input is corrupt. */
1659 /* check the magic number */
1660 readmagic = read_edint(in, &bEOF);
1661 /* Check whether we have reached the end of the input file */
1667 if (readmagic != magic)
1669 if (readmagic == 666 || readmagic == 667 || readmagic == 668)
1671 gmx_fatal(FARGS, "Wrong magic number: Use newest version of make_edi to produce edi file");
1673 else if (readmagic != 669)
1675 gmx_fatal(FARGS, "Wrong magic number %d in %s", readmagic, fn);
1679 /* check the number of atoms */
1680 edi->nini = read_edint(in, &bEOF);
1681 if (edi->nini != nr_mdatoms)
1683 gmx_fatal(FARGS, "Nr of atoms in %s (%d) does not match nr of md atoms (%d)", fn, edi->nini, nr_mdatoms);
1686 /* Done checking. For the rest we blindly trust the input */
1687 edi->fitmas = read_checked_edint(in, "FITMAS");
1688 edi->pcamas = read_checked_edint(in, "ANALYSIS_MAS");
1689 edi->outfrq = read_checked_edint(in, "OUTFRQ");
1690 edi->maxedsteps = read_checked_edint(in, "MAXLEN");
1691 edi->slope = read_checked_edreal(in, "SLOPECRIT");
1693 edi->presteps = read_checked_edint(in, "PRESTEPS");
1694 edi->flood.deltaF0 = read_checked_edreal(in, "DELTA_F0");
1695 edi->flood.deltaF = read_checked_edreal(in, "INIT_DELTA_F");
1696 edi->flood.tau = read_checked_edreal(in, "TAU");
1697 edi->flood.constEfl = read_checked_edreal(in, "EFL_NULL");
1698 edi->flood.alpha2 = read_checked_edreal(in, "ALPHA2");
1699 edi->flood.kT = read_checked_edreal(in, "KT");
1700 edi->flood.bHarmonic = read_checked_edint(in, "HARMONIC");
1701 if (readmagic > 669)
1703 edi->flood.bConstForce = read_checked_edint(in, "CONST_FORCE_FLOODING");
1707 edi->flood.bConstForce = FALSE;
1709 edi->sref.nr = read_checked_edint(in, "NREF");
1711 /* allocate space for reference positions and read them */
1712 snew(edi->sref.anrs, edi->sref.nr);
1713 snew(edi->sref.x, edi->sref.nr);
1714 snew(edi->sref.x_old, edi->sref.nr);
1715 edi->sref.sqrtm = NULL;
1716 read_edx(in, edi->sref.nr, edi->sref.anrs, edi->sref.x);
1718 /* average positions. they define which atoms will be used for ED sampling */
1719 edi->sav.nr = read_checked_edint(in, "NAV");
1720 snew(edi->sav.anrs, edi->sav.nr);
1721 snew(edi->sav.x, edi->sav.nr);
1722 snew(edi->sav.x_old, edi->sav.nr);
1723 read_edx(in, edi->sav.nr, edi->sav.anrs, edi->sav.x);
1725 /* Check if the same atom indices are used for reference and average positions */
1726 edi->bRefEqAv = check_if_same(edi->sref, edi->sav);
1729 read_edvecs(in, edi->sav.nr, &edi->vecs);
1730 read_edvec(in, edi->sav.nr, &edi->flood.vecs, edi->flood.bHarmonic, &bHaveReference);
1732 /* target positions */
1733 edi->star.nr = read_edint(in, &bEOF);
1734 if (edi->star.nr > 0)
1736 snew(edi->star.anrs, edi->star.nr);
1737 snew(edi->star.x, edi->star.nr);
1738 edi->star.sqrtm = NULL;
1739 read_edx(in, edi->star.nr, edi->star.anrs, edi->star.x);
1742 /* positions defining origin of expansion circle */
1743 edi->sori.nr = read_edint(in, &bEOF);
1744 if (edi->sori.nr > 0)
1748 /* Both an -ori structure and a at least one manual reference point have been
1749 * specified. That's ambiguous and probably not intentional. */
1750 gmx_fatal(FARGS, "ED: An origin structure has been provided and a at least one (moving) reference\n"
1751 " point was manually specified in the edi file. That is ambiguous. Aborting.\n");
1753 snew(edi->sori.anrs, edi->sori.nr);
1754 snew(edi->sori.x, edi->sori.nr);
1755 edi->sori.sqrtm = NULL;
1756 read_edx(in, edi->sori.nr, edi->sori.anrs, edi->sori.x);
1765 /* Read in the edi input file. Note that it may contain several ED data sets which were
1766 * achieved by concatenating multiple edi files. The standard case would be a single ED
1767 * data set, though. */
1768 static int read_edi_file(const char *fn, t_edpar *edi, int nr_mdatoms)
1771 t_edpar *curr_edi, *last_edi;
1776 /* This routine is executed on the master only */
1778 /* Open the .edi parameter input file */
1779 in = gmx_fio_fopen(fn, "r");
1780 fprintf(stderr, "ED: Reading edi file %s\n", fn);
1782 /* Now read a sequence of ED input parameter sets from the edi file */
1785 while (read_edi(in, curr_edi, nr_mdatoms, fn) )
1789 /* Since we arrived within this while loop we know that there is still another data set to be read in */
1790 /* We need to allocate space for the data: */
1792 /* Point the 'next_edi' entry to the next edi: */
1793 curr_edi->next_edi = edi_read;
1794 /* Keep the curr_edi pointer for the case that the next group is empty: */
1795 last_edi = curr_edi;
1796 /* Let's prepare to read in the next edi data set: */
1797 /* cppcheck-suppress uninitvar Fixed in cppcheck 1.65 */
1798 curr_edi = edi_read;
1802 gmx_fatal(FARGS, "No complete ED data set found in edi file %s.", fn);
1805 /* Terminate the edi group list with a NULL pointer: */
1806 last_edi->next_edi = NULL;
1808 fprintf(stderr, "ED: Found %d ED group%s.\n", edi_nr, edi_nr > 1 ? "s" : "");
1810 /* Close the .edi file again */
1817 struct t_fit_to_ref {
1818 rvec *xcopy; /* Working copy of the positions in fit_to_reference */
1821 /* Fit the current positions to the reference positions
1822 * Do not actually do the fit, just return rotation and translation.
1823 * Note that the COM of the reference structure was already put into
1824 * the origin by init_edi. */
1825 static void fit_to_reference(rvec *xcoll, /* The positions to be fitted */
1826 rvec transvec, /* The translation vector */
1827 matrix rotmat, /* The rotation matrix */
1828 t_edpar *edi) /* Just needed for do_edfit */
1830 rvec com; /* center of mass */
1832 struct t_fit_to_ref *loc;
1835 /* Allocate memory the first time this routine is called for each edi group */
1836 if (NULL == edi->buf->fit_to_ref)
1838 snew(edi->buf->fit_to_ref, 1);
1839 snew(edi->buf->fit_to_ref->xcopy, edi->sref.nr);
1841 loc = edi->buf->fit_to_ref;
1843 /* We do not touch the original positions but work on a copy. */
1844 for (i = 0; i < edi->sref.nr; i++)
1846 copy_rvec(xcoll[i], loc->xcopy[i]);
1849 /* Calculate the center of mass */
1850 get_center(loc->xcopy, edi->sref.m, edi->sref.nr, com);
1852 transvec[XX] = -com[XX];
1853 transvec[YY] = -com[YY];
1854 transvec[ZZ] = -com[ZZ];
1856 /* Subtract the center of mass from the copy */
1857 translate_x(loc->xcopy, edi->sref.nr, transvec);
1859 /* Determine the rotation matrix */
1860 do_edfit(edi->sref.nr, edi->sref.x, loc->xcopy, rotmat, edi);
1864 static void translate_and_rotate(rvec *x, /* The positions to be translated and rotated */
1865 int nat, /* How many positions are there? */
1866 rvec transvec, /* The translation vector */
1867 matrix rotmat) /* The rotation matrix */
1870 translate_x(x, nat, transvec);
1873 rotate_x(x, nat, rotmat);
1877 /* Gets the rms deviation of the positions to the structure s */
1878 /* fit_to_structure has to be called before calling this routine! */
1879 static real rmsd_from_structure(rvec *x, /* The positions under consideration */
1880 struct gmx_edx *s) /* The structure from which the rmsd shall be computed */
1886 for (i = 0; i < s->nr; i++)
1888 rmsd += distance2(s->x[i], x[i]);
1891 rmsd /= (real) s->nr;
1898 void dd_make_local_ed_indices(gmx_domdec_t *dd, struct gmx_edsam *ed)
1903 if (ed->eEDtype != eEDnone)
1905 /* Loop over ED groups */
1909 /* Local atoms of the reference structure (for fitting), need only be assembled
1910 * if their indices differ from the average ones */
1913 dd_make_local_group_indices(dd->ga2la, edi->sref.nr, edi->sref.anrs,
1914 &edi->sref.nr_loc, &edi->sref.anrs_loc, &edi->sref.nalloc_loc, edi->sref.c_ind);
1917 /* Local atoms of the average structure (on these ED will be performed) */
1918 dd_make_local_group_indices(dd->ga2la, edi->sav.nr, edi->sav.anrs,
1919 &edi->sav.nr_loc, &edi->sav.anrs_loc, &edi->sav.nalloc_loc, edi->sav.c_ind);
1921 /* Indicate that the ED shift vectors for this structure need to be updated
1922 * at the next call to communicate_group_positions, since obviously we are in a NS step */
1923 edi->buf->do_edsam->bUpdateShifts = TRUE;
1925 /* Set the pointer to the next ED group (if any) */
1926 edi = edi->next_edi;
1932 static gmx_inline void ed_unshift_single_coord(matrix box, const rvec x, const ivec is, rvec xu)
1943 xu[XX] = x[XX]-tx*box[XX][XX]-ty*box[YY][XX]-tz*box[ZZ][XX];
1944 xu[YY] = x[YY]-ty*box[YY][YY]-tz*box[ZZ][YY];
1945 xu[ZZ] = x[ZZ]-tz*box[ZZ][ZZ];
1949 xu[XX] = x[XX]-tx*box[XX][XX];
1950 xu[YY] = x[YY]-ty*box[YY][YY];
1951 xu[ZZ] = x[ZZ]-tz*box[ZZ][ZZ];
1956 static void do_linfix(rvec *xcoll, t_edpar *edi, gmx_int64_t step)
1963 /* loop over linfix vectors */
1964 for (i = 0; i < edi->vecs.linfix.neig; i++)
1966 /* calculate the projection */
1967 proj = projectx(edi, xcoll, edi->vecs.linfix.vec[i]);
1969 /* calculate the correction */
1970 add = edi->vecs.linfix.refproj[i] + step*edi->vecs.linfix.stpsz[i] - proj;
1972 /* apply the correction */
1973 add /= edi->sav.sqrtm[i];
1974 for (j = 0; j < edi->sav.nr; j++)
1976 svmul(add, edi->vecs.linfix.vec[i][j], vec_dum);
1977 rvec_inc(xcoll[j], vec_dum);
1983 static void do_linacc(rvec *xcoll, t_edpar *edi)
1990 /* loop over linacc vectors */
1991 for (i = 0; i < edi->vecs.linacc.neig; i++)
1993 /* calculate the projection */
1994 proj = projectx(edi, xcoll, edi->vecs.linacc.vec[i]);
1996 /* calculate the correction */
1998 if (edi->vecs.linacc.stpsz[i] > 0.0)
2000 if ((proj-edi->vecs.linacc.refproj[i]) < 0.0)
2002 add = edi->vecs.linacc.refproj[i] - proj;
2005 if (edi->vecs.linacc.stpsz[i] < 0.0)
2007 if ((proj-edi->vecs.linacc.refproj[i]) > 0.0)
2009 add = edi->vecs.linacc.refproj[i] - proj;
2013 /* apply the correction */
2014 add /= edi->sav.sqrtm[i];
2015 for (j = 0; j < edi->sav.nr; j++)
2017 svmul(add, edi->vecs.linacc.vec[i][j], vec_dum);
2018 rvec_inc(xcoll[j], vec_dum);
2021 /* new positions will act as reference */
2022 edi->vecs.linacc.refproj[i] = proj + add;
2027 static void do_radfix(rvec *xcoll, t_edpar *edi)
2030 real *proj, rad = 0.0, ratio;
2034 if (edi->vecs.radfix.neig == 0)
2039 snew(proj, edi->vecs.radfix.neig);
2041 /* loop over radfix vectors */
2042 for (i = 0; i < edi->vecs.radfix.neig; i++)
2044 /* calculate the projections, radius */
2045 proj[i] = projectx(edi, xcoll, edi->vecs.radfix.vec[i]);
2046 rad += pow(proj[i] - edi->vecs.radfix.refproj[i], 2);
2050 ratio = (edi->vecs.radfix.stpsz[0]+edi->vecs.radfix.radius)/rad - 1.0;
2051 edi->vecs.radfix.radius += edi->vecs.radfix.stpsz[0];
2053 /* loop over radfix vectors */
2054 for (i = 0; i < edi->vecs.radfix.neig; i++)
2056 proj[i] -= edi->vecs.radfix.refproj[i];
2058 /* apply the correction */
2059 proj[i] /= edi->sav.sqrtm[i];
2061 for (j = 0; j < edi->sav.nr; j++)
2063 svmul(proj[i], edi->vecs.radfix.vec[i][j], vec_dum);
2064 rvec_inc(xcoll[j], vec_dum);
2072 static void do_radacc(rvec *xcoll, t_edpar *edi)
2075 real *proj, rad = 0.0, ratio = 0.0;
2079 if (edi->vecs.radacc.neig == 0)
2084 snew(proj, edi->vecs.radacc.neig);
2086 /* loop over radacc vectors */
2087 for (i = 0; i < edi->vecs.radacc.neig; i++)
2089 /* calculate the projections, radius */
2090 proj[i] = projectx(edi, xcoll, edi->vecs.radacc.vec[i]);
2091 rad += pow(proj[i] - edi->vecs.radacc.refproj[i], 2);
2095 /* only correct when radius decreased */
2096 if (rad < edi->vecs.radacc.radius)
2098 ratio = edi->vecs.radacc.radius/rad - 1.0;
2099 rad = edi->vecs.radacc.radius;
2103 edi->vecs.radacc.radius = rad;
2106 /* loop over radacc vectors */
2107 for (i = 0; i < edi->vecs.radacc.neig; i++)
2109 proj[i] -= edi->vecs.radacc.refproj[i];
2111 /* apply the correction */
2112 proj[i] /= edi->sav.sqrtm[i];
2114 for (j = 0; j < edi->sav.nr; j++)
2116 svmul(proj[i], edi->vecs.radacc.vec[i][j], vec_dum);
2117 rvec_inc(xcoll[j], vec_dum);
2124 struct t_do_radcon {
2128 static void do_radcon(rvec *xcoll, t_edpar *edi)
2131 real rad = 0.0, ratio = 0.0;
2132 struct t_do_radcon *loc;
2137 if (edi->buf->do_radcon != NULL)
2140 loc = edi->buf->do_radcon;
2145 snew(edi->buf->do_radcon, 1);
2147 loc = edi->buf->do_radcon;
2149 if (edi->vecs.radcon.neig == 0)
2156 snew(loc->proj, edi->vecs.radcon.neig);
2159 /* loop over radcon vectors */
2160 for (i = 0; i < edi->vecs.radcon.neig; i++)
2162 /* calculate the projections, radius */
2163 loc->proj[i] = projectx(edi, xcoll, edi->vecs.radcon.vec[i]);
2164 rad += pow(loc->proj[i] - edi->vecs.radcon.refproj[i], 2);
2167 /* only correct when radius increased */
2168 if (rad > edi->vecs.radcon.radius)
2170 ratio = edi->vecs.radcon.radius/rad - 1.0;
2172 /* loop over radcon vectors */
2173 for (i = 0; i < edi->vecs.radcon.neig; i++)
2175 /* apply the correction */
2176 loc->proj[i] -= edi->vecs.radcon.refproj[i];
2177 loc->proj[i] /= edi->sav.sqrtm[i];
2178 loc->proj[i] *= ratio;
2180 for (j = 0; j < edi->sav.nr; j++)
2182 svmul(loc->proj[i], edi->vecs.radcon.vec[i][j], vec_dum);
2183 rvec_inc(xcoll[j], vec_dum);
2189 edi->vecs.radcon.radius = rad;
2192 if (rad != edi->vecs.radcon.radius)
2195 for (i = 0; i < edi->vecs.radcon.neig; i++)
2197 /* calculate the projections, radius */
2198 loc->proj[i] = projectx(edi, xcoll, edi->vecs.radcon.vec[i]);
2199 rad += pow(loc->proj[i] - edi->vecs.radcon.refproj[i], 2);
2206 static void ed_apply_constraints(rvec *xcoll, t_edpar *edi, gmx_int64_t step)
2211 /* subtract the average positions */
2212 for (i = 0; i < edi->sav.nr; i++)
2214 rvec_dec(xcoll[i], edi->sav.x[i]);
2217 /* apply the constraints */
2220 do_linfix(xcoll, edi, step);
2222 do_linacc(xcoll, edi);
2225 do_radfix(xcoll, edi);
2227 do_radacc(xcoll, edi);
2228 do_radcon(xcoll, edi);
2230 /* add back the average positions */
2231 for (i = 0; i < edi->sav.nr; i++)
2233 rvec_inc(xcoll[i], edi->sav.x[i]);
2238 /* Write out the projections onto the eigenvectors. The order of output
2239 * corresponds to ed_output_legend() */
2240 static void write_edo(t_edpar *edi, FILE *fp, real rmsd)
2245 /* Output how well we fit to the reference structure */
2246 fprintf(fp, EDcol_ffmt, rmsd);
2248 for (i = 0; i < edi->vecs.mon.neig; i++)
2250 fprintf(fp, EDcol_efmt, edi->vecs.mon.xproj[i]);
2253 for (i = 0; i < edi->vecs.linfix.neig; i++)
2255 fprintf(fp, EDcol_efmt, edi->vecs.linfix.xproj[i]);
2258 for (i = 0; i < edi->vecs.linacc.neig; i++)
2260 fprintf(fp, EDcol_efmt, edi->vecs.linacc.xproj[i]);
2263 for (i = 0; i < edi->vecs.radfix.neig; i++)
2265 fprintf(fp, EDcol_efmt, edi->vecs.radfix.xproj[i]);
2267 if (edi->vecs.radfix.neig)
2269 fprintf(fp, EDcol_ffmt, calc_radius(&edi->vecs.radfix)); /* fixed increment radius */
2272 for (i = 0; i < edi->vecs.radacc.neig; i++)
2274 fprintf(fp, EDcol_efmt, edi->vecs.radacc.xproj[i]);
2276 if (edi->vecs.radacc.neig)
2278 fprintf(fp, EDcol_ffmt, calc_radius(&edi->vecs.radacc)); /* acceptance radius */
2281 for (i = 0; i < edi->vecs.radcon.neig; i++)
2283 fprintf(fp, EDcol_efmt, edi->vecs.radcon.xproj[i]);
2285 if (edi->vecs.radcon.neig)
2287 fprintf(fp, EDcol_ffmt, calc_radius(&edi->vecs.radcon)); /* contracting radius */
2291 /* Returns if any constraints are switched on */
2292 static int ed_constraints(gmx_bool edtype, t_edpar *edi)
2294 if (edtype == eEDedsam || edtype == eEDflood)
2296 return (edi->vecs.linfix.neig || edi->vecs.linacc.neig ||
2297 edi->vecs.radfix.neig || edi->vecs.radacc.neig ||
2298 edi->vecs.radcon.neig);
2304 /* Copies reference projection 'refproj' to fixed 'refproj0' variable for flooding/
2305 * umbrella sampling simulations. */
2306 static void copyEvecReference(t_eigvec* floodvecs)
2311 if (NULL == floodvecs->refproj0)
2313 snew(floodvecs->refproj0, floodvecs->neig);
2316 for (i = 0; i < floodvecs->neig; i++)
2318 floodvecs->refproj0[i] = floodvecs->refproj[i];
2323 /* Call on MASTER only. Check whether the essential dynamics / flooding
2324 * groups of the checkpoint file are consistent with the provided .edi file. */
2325 static void crosscheck_edi_file_vs_checkpoint(gmx_edsam_t ed, edsamstate_t *EDstate)
2327 t_edpar *edi = NULL; /* points to a single edi data set */
2331 if (NULL == EDstate->nref || NULL == EDstate->nav)
2333 gmx_fatal(FARGS, "Essential dynamics and flooding can only be switched on (or off) at the\n"
2334 "start of a new simulation. If a simulation runs with/without ED constraints,\n"
2335 "it must also continue with/without ED constraints when checkpointing.\n"
2336 "To switch on (or off) ED constraints, please prepare a new .tpr to start\n"
2337 "from without a checkpoint.\n");
2344 /* Check number of atoms in the reference and average structures */
2345 if (EDstate->nref[edinum] != edi->sref.nr)
2347 gmx_fatal(FARGS, "The number of reference structure atoms in ED group %c is\n"
2348 "not the same in .cpt (NREF=%d) and .edi (NREF=%d) files!\n",
2349 get_EDgroupChar(edinum+1, 0), EDstate->nref[edinum], edi->sref.nr);
2351 if (EDstate->nav[edinum] != edi->sav.nr)
2353 gmx_fatal(FARGS, "The number of average structure atoms in ED group %c is\n"
2354 "not the same in .cpt (NREF=%d) and .edi (NREF=%d) files!\n",
2355 get_EDgroupChar(edinum+1, 0), EDstate->nav[edinum], edi->sav.nr);
2357 edi = edi->next_edi;
2361 if (edinum != EDstate->nED)
2363 gmx_fatal(FARGS, "The number of essential dynamics / flooding groups is not consistent.\n"
2364 "There are %d ED groups in the .cpt file, but %d in the .edi file!\n"
2365 "Are you sure this is the correct .edi file?\n", EDstate->nED, edinum);
2370 /* The edsamstate struct stores the information we need to make the ED group
2371 * whole again after restarts from a checkpoint file. Here we do the following:
2372 * a) If we did not start from .cpt, we prepare the struct for proper .cpt writing,
2373 * b) if we did start from .cpt, we copy over the last whole structures from .cpt,
2374 * c) in any case, for subsequent checkpoint writing, we set the pointers in
2375 * edsamstate to the x_old arrays, which contain the correct PBC representation of
2376 * all ED structures at the last time step. */
2377 static void init_edsamstate(gmx_edsam_t ed, edsamstate_t *EDstate)
2383 snew(EDstate->old_sref_p, EDstate->nED);
2384 snew(EDstate->old_sav_p, EDstate->nED);
2386 /* If we did not read in a .cpt file, these arrays are not yet allocated */
2387 if (!EDstate->bFromCpt)
2389 snew(EDstate->nref, EDstate->nED);
2390 snew(EDstate->nav, EDstate->nED);
2393 /* Loop over all ED/flooding data sets (usually only one, though) */
2395 for (nr_edi = 1; nr_edi <= EDstate->nED; nr_edi++)
2397 /* We always need the last reference and average positions such that
2398 * in the next time step we can make the ED group whole again
2399 * if the atoms do not have the correct PBC representation */
2400 if (EDstate->bFromCpt)
2402 /* Copy the last whole positions of reference and average group from .cpt */
2403 for (i = 0; i < edi->sref.nr; i++)
2405 copy_rvec(EDstate->old_sref[nr_edi-1][i], edi->sref.x_old[i]);
2407 for (i = 0; i < edi->sav.nr; i++)
2409 copy_rvec(EDstate->old_sav [nr_edi-1][i], edi->sav.x_old [i]);
2414 EDstate->nref[nr_edi-1] = edi->sref.nr;
2415 EDstate->nav [nr_edi-1] = edi->sav.nr;
2418 /* For subsequent checkpoint writing, set the edsamstate pointers to the edi arrays: */
2419 EDstate->old_sref_p[nr_edi-1] = edi->sref.x_old;
2420 EDstate->old_sav_p [nr_edi-1] = edi->sav.x_old;
2422 edi = edi->next_edi;
2427 /* Adds 'buf' to 'str' */
2428 static void add_to_string(char **str, char *buf)
2433 len = strlen(*str) + strlen(buf) + 1;
2439 static void add_to_string_aligned(char **str, char *buf)
2441 char buf_aligned[STRLEN];
2443 sprintf(buf_aligned, EDcol_sfmt, buf);
2444 add_to_string(str, buf_aligned);
2448 static void nice_legend(const char ***setname, int *nsets, char **LegendStr, char *value, char *unit, char EDgroupchar)
2450 char tmp[STRLEN], tmp2[STRLEN];
2453 sprintf(tmp, "%c %s", EDgroupchar, value);
2454 add_to_string_aligned(LegendStr, tmp);
2455 sprintf(tmp2, "%s (%s)", tmp, unit);
2456 (*setname)[*nsets] = strdup(tmp2);
2461 static void nice_legend_evec(const char ***setname, int *nsets, char **LegendStr, t_eigvec *evec, char EDgroupChar, const char *EDtype)
2467 for (i = 0; i < evec->neig; i++)
2469 sprintf(tmp, "EV%dprj%s", evec->ieig[i], EDtype);
2470 nice_legend(setname, nsets, LegendStr, tmp, "nm", EDgroupChar);
2475 /* Makes a legend for the xvg output file. Call on MASTER only! */
2476 static void write_edo_legend(gmx_edsam_t ed, int nED, const output_env_t oenv)
2478 t_edpar *edi = NULL;
2480 int nr_edi, nsets, n_flood, n_edsam;
2481 const char **setname;
2483 char *LegendStr = NULL;
2488 fprintf(ed->edo, "# Output will be written every %d step%s\n", ed->edpar->outfrq, ed->edpar->outfrq != 1 ? "s" : "");
2490 for (nr_edi = 1; nr_edi <= nED; nr_edi++)
2492 fprintf(ed->edo, "#\n");
2493 fprintf(ed->edo, "# Summary of applied con/restraints for the ED group %c\n", get_EDgroupChar(nr_edi, nED));
2494 fprintf(ed->edo, "# Atoms in average structure: %d\n", edi->sav.nr);
2495 fprintf(ed->edo, "# monitor : %d vec%s\n", edi->vecs.mon.neig, edi->vecs.mon.neig != 1 ? "s" : "");
2496 fprintf(ed->edo, "# LINFIX : %d vec%s\n", edi->vecs.linfix.neig, edi->vecs.linfix.neig != 1 ? "s" : "");
2497 fprintf(ed->edo, "# LINACC : %d vec%s\n", edi->vecs.linacc.neig, edi->vecs.linacc.neig != 1 ? "s" : "");
2498 fprintf(ed->edo, "# RADFIX : %d vec%s\n", edi->vecs.radfix.neig, edi->vecs.radfix.neig != 1 ? "s" : "");
2499 fprintf(ed->edo, "# RADACC : %d vec%s\n", edi->vecs.radacc.neig, edi->vecs.radacc.neig != 1 ? "s" : "");
2500 fprintf(ed->edo, "# RADCON : %d vec%s\n", edi->vecs.radcon.neig, edi->vecs.radcon.neig != 1 ? "s" : "");
2501 fprintf(ed->edo, "# FLOODING : %d vec%s ", edi->flood.vecs.neig, edi->flood.vecs.neig != 1 ? "s" : "");
2503 if (edi->flood.vecs.neig)
2505 /* If in any of the groups we find a flooding vector, flooding is turned on */
2506 ed->eEDtype = eEDflood;
2508 /* Print what flavor of flooding we will do */
2509 if (0 == edi->flood.tau) /* constant flooding strength */
2511 fprintf(ed->edo, "Efl_null = %g", edi->flood.constEfl);
2512 if (edi->flood.bHarmonic)
2514 fprintf(ed->edo, ", harmonic");
2517 else /* adaptive flooding */
2519 fprintf(ed->edo, ", adaptive");
2522 fprintf(ed->edo, "\n");
2524 edi = edi->next_edi;
2527 /* Print a nice legend */
2529 LegendStr[0] = '\0';
2530 sprintf(buf, "# %6s", "time");
2531 add_to_string(&LegendStr, buf);
2533 /* Calculate the maximum number of columns we could end up with */
2536 for (nr_edi = 1; nr_edi <= nED; nr_edi++)
2538 nsets += 5 +edi->vecs.mon.neig
2539 +edi->vecs.linfix.neig
2540 +edi->vecs.linacc.neig
2541 +edi->vecs.radfix.neig
2542 +edi->vecs.radacc.neig
2543 +edi->vecs.radcon.neig
2544 + 6*edi->flood.vecs.neig;
2545 edi = edi->next_edi;
2547 snew(setname, nsets);
2549 /* In the mdrun time step in a first function call (do_flood()) the flooding
2550 * forces are calculated and in a second function call (do_edsam()) the
2551 * ED constraints. To get a corresponding legend, we need to loop twice
2552 * over the edi groups and output first the flooding, then the ED part */
2554 /* The flooding-related legend entries, if flooding is done */
2556 if (eEDflood == ed->eEDtype)
2559 for (nr_edi = 1; nr_edi <= nED; nr_edi++)
2561 /* Always write out the projection on the flooding EVs. Of course, this can also
2562 * be achieved with the monitoring option in do_edsam() (if switched on by the
2563 * user), but in that case the positions need to be communicated in do_edsam(),
2564 * which is not necessary when doing flooding only. */
2565 nice_legend(&setname, &nsets, &LegendStr, "RMSD to ref", "nm", get_EDgroupChar(nr_edi, nED) );
2567 for (i = 0; i < edi->flood.vecs.neig; i++)
2569 sprintf(buf, "EV%dprjFLOOD", edi->flood.vecs.ieig[i]);
2570 nice_legend(&setname, &nsets, &LegendStr, buf, "nm", get_EDgroupChar(nr_edi, nED));
2572 /* Output the current reference projection if it changes with time;
2573 * this can happen when flooding is used as harmonic restraint */
2574 if (edi->flood.bHarmonic && edi->flood.vecs.refprojslope[i] != 0.0)
2576 sprintf(buf, "EV%d ref.prj.", edi->flood.vecs.ieig[i]);
2577 nice_legend(&setname, &nsets, &LegendStr, buf, "nm", get_EDgroupChar(nr_edi, nED));
2580 /* For flooding we also output Efl, Vfl, deltaF, and the flooding forces */
2581 if (0 != edi->flood.tau) /* only output Efl for adaptive flooding (constant otherwise) */
2583 sprintf(buf, "EV%d-Efl", edi->flood.vecs.ieig[i]);
2584 nice_legend(&setname, &nsets, &LegendStr, buf, "kJ/mol", get_EDgroupChar(nr_edi, nED));
2587 sprintf(buf, "EV%d-Vfl", edi->flood.vecs.ieig[i]);
2588 nice_legend(&setname, &nsets, &LegendStr, buf, "kJ/mol", get_EDgroupChar(nr_edi, nED));
2590 if (0 != edi->flood.tau) /* only output deltaF for adaptive flooding (zero otherwise) */
2592 sprintf(buf, "EV%d-deltaF", edi->flood.vecs.ieig[i]);
2593 nice_legend(&setname, &nsets, &LegendStr, buf, "kJ/mol", get_EDgroupChar(nr_edi, nED));
2596 sprintf(buf, "EV%d-FLforces", edi->flood.vecs.ieig[i]);
2597 nice_legend(&setname, &nsets, &LegendStr, buf, "kJ/mol/nm", get_EDgroupChar(nr_edi, nED));
2600 edi = edi->next_edi;
2601 } /* End of flooding-related legend entries */
2605 /* Now the ED-related entries, if essential dynamics is done */
2607 for (nr_edi = 1; nr_edi <= nED; nr_edi++)
2609 if (bNeedDoEdsam(edi)) /* Only print ED legend if at least one ED option is on */
2611 nice_legend(&setname, &nsets, &LegendStr, "RMSD to ref", "nm", get_EDgroupChar(nr_edi, nED) );
2613 /* Essential dynamics, projections on eigenvectors */
2614 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.mon, get_EDgroupChar(nr_edi, nED), "MON" );
2615 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.linfix, get_EDgroupChar(nr_edi, nED), "LINFIX");
2616 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.linacc, get_EDgroupChar(nr_edi, nED), "LINACC");
2617 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.radfix, get_EDgroupChar(nr_edi, nED), "RADFIX");
2618 if (edi->vecs.radfix.neig)
2620 nice_legend(&setname, &nsets, &LegendStr, "RADFIX radius", "nm", get_EDgroupChar(nr_edi, nED));
2622 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.radacc, get_EDgroupChar(nr_edi, nED), "RADACC");
2623 if (edi->vecs.radacc.neig)
2625 nice_legend(&setname, &nsets, &LegendStr, "RADACC radius", "nm", get_EDgroupChar(nr_edi, nED));
2627 nice_legend_evec(&setname, &nsets, &LegendStr, &edi->vecs.radcon, get_EDgroupChar(nr_edi, nED), "RADCON");
2628 if (edi->vecs.radcon.neig)
2630 nice_legend(&setname, &nsets, &LegendStr, "RADCON radius", "nm", get_EDgroupChar(nr_edi, nED));
2633 edi = edi->next_edi;
2634 } /* end of 'pure' essential dynamics legend entries */
2635 n_edsam = nsets - n_flood;
2637 xvgr_legend(ed->edo, nsets, setname, oenv);
2640 fprintf(ed->edo, "#\n"
2641 "# Legend for %d column%s of flooding plus %d column%s of essential dynamics data:\n",
2642 n_flood, 1 == n_flood ? "" : "s",
2643 n_edsam, 1 == n_edsam ? "" : "s");
2644 fprintf(ed->edo, "%s", LegendStr);
2651 /* Init routine for ED and flooding. Calls init_edi in a loop for every .edi-cycle
2652 * contained in the input file, creates a NULL terminated list of t_edpar structures */
2653 void init_edsam(gmx_mtop_t *mtop,
2659 edsamstate_t *EDstate)
2661 t_edpar *edi = NULL; /* points to a single edi data set */
2662 int i, nr_edi, avindex;
2663 rvec *x_pbc = NULL; /* positions of the whole MD system with pbc removed */
2664 rvec *xfit = NULL, *xstart = NULL; /* dummy arrays to determine initial RMSDs */
2665 rvec fit_transvec; /* translation ... */
2666 matrix fit_rotmat; /* ... and rotation from fit to reference structure */
2667 rvec *ref_x_old = NULL; /* helper pointer */
2671 fprintf(stderr, "ED: Initializing essential dynamics constraints.\n");
2675 gmx_fatal(FARGS, "The checkpoint file you provided is from an essential dynamics or\n"
2676 "flooding simulation. Please also provide the correct .edi file with -ei.\n");
2680 /* Needed for initializing radacc radius in do_edsam */
2683 /* The input file is read by the master and the edi structures are
2684 * initialized here. Input is stored in ed->edpar. Then the edi
2685 * structures are transferred to the other nodes */
2688 /* Initialization for every ED/flooding group. Flooding uses one edi group per
2689 * flooding vector, Essential dynamics can be applied to more than one structure
2690 * as well, but will be done in the order given in the edi file, so
2691 * expect different results for different order of edi file concatenation! */
2695 init_edi(mtop, edi);
2696 init_flood(edi, ed, ir->delta_t);
2697 edi = edi->next_edi;
2701 /* The master does the work here. The other nodes get the positions
2702 * not before dd_partition_system which is called after init_edsam */
2705 if (!EDstate->bFromCpt)
2707 /* Remove PBC, make molecule(s) subject to ED whole. */
2708 snew(x_pbc, mtop->natoms);
2709 m_rveccopy(mtop->natoms, x, x_pbc);
2710 do_pbc_first_mtop(NULL, ir->ePBC, box, mtop, x_pbc);
2712 /* Reset pointer to first ED data set which contains the actual ED data */
2714 /* Loop over all ED/flooding data sets (usually only one, though) */
2715 for (nr_edi = 1; nr_edi <= EDstate->nED; nr_edi++)
2717 /* For multiple ED groups we use the output frequency that was specified
2718 * in the first set */
2721 edi->outfrq = ed->edpar->outfrq;
2724 /* Extract the initial reference and average positions. When starting
2725 * from .cpt, these have already been read into sref.x_old
2726 * in init_edsamstate() */
2727 if (!EDstate->bFromCpt)
2729 /* If this is the first run (i.e. no checkpoint present) we assume
2730 * that the starting positions give us the correct PBC representation */
2731 for (i = 0; i < edi->sref.nr; i++)
2733 copy_rvec(x_pbc[edi->sref.anrs[i]], edi->sref.x_old[i]);
2736 for (i = 0; i < edi->sav.nr; i++)
2738 copy_rvec(x_pbc[edi->sav.anrs[i]], edi->sav.x_old[i]);
2742 /* Now we have the PBC-correct start positions of the reference and
2743 average structure. We copy that over to dummy arrays on which we
2744 can apply fitting to print out the RMSD. We srenew the memory since
2745 the size of the buffers is likely different for every ED group */
2746 srenew(xfit, edi->sref.nr );
2747 srenew(xstart, edi->sav.nr );
2750 /* Reference indices are the same as average indices */
2751 ref_x_old = edi->sav.x_old;
2755 ref_x_old = edi->sref.x_old;
2757 copy_rvecn(ref_x_old, xfit, 0, edi->sref.nr);
2758 copy_rvecn(edi->sav.x_old, xstart, 0, edi->sav.nr);
2760 /* Make the fit to the REFERENCE structure, get translation and rotation */
2761 fit_to_reference(xfit, fit_transvec, fit_rotmat, edi);
2763 /* Output how well we fit to the reference at the start */
2764 translate_and_rotate(xfit, edi->sref.nr, fit_transvec, fit_rotmat);
2765 fprintf(stderr, "ED: Initial RMSD from reference after fit = %f nm",
2766 rmsd_from_structure(xfit, &edi->sref));
2767 if (EDstate->nED > 1)
2769 fprintf(stderr, " (ED group %c)", get_EDgroupChar(nr_edi, EDstate->nED));
2771 fprintf(stderr, "\n");
2773 /* Now apply the translation and rotation to the atoms on which ED sampling will be performed */
2774 translate_and_rotate(xstart, edi->sav.nr, fit_transvec, fit_rotmat);
2776 /* calculate initial projections */
2777 project(xstart, edi);
2779 /* For the target and origin structure both a reference (fit) and an
2780 * average structure can be provided in make_edi. If both structures
2781 * are the same, make_edi only stores one of them in the .edi file.
2782 * If they differ, first the fit and then the average structure is stored
2783 * in star (or sor), thus the number of entries in star/sor is
2784 * (n_fit + n_av) with n_fit the size of the fitting group and n_av
2785 * the size of the average group. */
2787 /* process target structure, if required */
2788 if (edi->star.nr > 0)
2790 fprintf(stderr, "ED: Fitting target structure to reference structure\n");
2792 /* get translation & rotation for fit of target structure to reference structure */
2793 fit_to_reference(edi->star.x, fit_transvec, fit_rotmat, edi);
2795 translate_and_rotate(edi->star.x, edi->star.nr, fit_transvec, fit_rotmat);
2796 if (edi->star.nr == edi->sav.nr)
2800 else /* edi->star.nr = edi->sref.nr + edi->sav.nr */
2802 /* The last sav.nr indices of the target structure correspond to
2803 * the average structure, which must be projected */
2804 avindex = edi->star.nr - edi->sav.nr;
2806 rad_project(edi, &edi->star.x[avindex], &edi->vecs.radcon);
2810 rad_project(edi, xstart, &edi->vecs.radcon);
2813 /* process structure that will serve as origin of expansion circle */
2814 if ( (eEDflood == ed->eEDtype) && (FALSE == edi->flood.bConstForce) )
2816 fprintf(stderr, "ED: Setting center of flooding potential (0 = average structure)\n");
2819 if (edi->sori.nr > 0)
2821 fprintf(stderr, "ED: Fitting origin structure to reference structure\n");
2823 /* fit this structure to reference structure */
2824 fit_to_reference(edi->sori.x, fit_transvec, fit_rotmat, edi);
2826 translate_and_rotate(edi->sori.x, edi->sori.nr, fit_transvec, fit_rotmat);
2827 if (edi->sori.nr == edi->sav.nr)
2831 else /* edi->sori.nr = edi->sref.nr + edi->sav.nr */
2833 /* For the projection, we need the last sav.nr indices of sori */
2834 avindex = edi->sori.nr - edi->sav.nr;
2837 rad_project(edi, &edi->sori.x[avindex], &edi->vecs.radacc);
2838 rad_project(edi, &edi->sori.x[avindex], &edi->vecs.radfix);
2839 if ( (eEDflood == ed->eEDtype) && (FALSE == edi->flood.bConstForce) )
2841 fprintf(stderr, "ED: The ORIGIN structure will define the flooding potential center.\n");
2842 /* Set center of flooding potential to the ORIGIN structure */
2843 rad_project(edi, &edi->sori.x[avindex], &edi->flood.vecs);
2844 /* We already know that no (moving) reference position was provided,
2845 * therefore we can overwrite refproj[0]*/
2846 copyEvecReference(&edi->flood.vecs);
2849 else /* No origin structure given */
2851 rad_project(edi, xstart, &edi->vecs.radacc);
2852 rad_project(edi, xstart, &edi->vecs.radfix);
2853 if ( (eEDflood == ed->eEDtype) && (FALSE == edi->flood.bConstForce) )
2855 if (edi->flood.bHarmonic)
2857 fprintf(stderr, "ED: A (possibly changing) ref. projection will define the flooding potential center.\n");
2858 for (i = 0; i < edi->flood.vecs.neig; i++)
2860 edi->flood.vecs.refproj[i] = edi->flood.vecs.refproj0[i];
2865 fprintf(stderr, "ED: The AVERAGE structure will define the flooding potential center.\n");
2866 /* Set center of flooding potential to the center of the covariance matrix,
2867 * i.e. the average structure, i.e. zero in the projected system */
2868 for (i = 0; i < edi->flood.vecs.neig; i++)
2870 edi->flood.vecs.refproj[i] = 0.0;
2875 /* For convenience, output the center of the flooding potential for the eigenvectors */
2876 if ( (eEDflood == ed->eEDtype) && (FALSE == edi->flood.bConstForce) )
2878 for (i = 0; i < edi->flood.vecs.neig; i++)
2880 fprintf(stdout, "ED: EV %d flooding potential center: %11.4e", edi->flood.vecs.ieig[i], edi->flood.vecs.refproj[i]);
2881 if (edi->flood.bHarmonic)
2883 fprintf(stdout, " (adding %11.4e/timestep)", edi->flood.vecs.refprojslope[i]);
2885 fprintf(stdout, "\n");
2889 /* set starting projections for linsam */
2890 rad_project(edi, xstart, &edi->vecs.linacc);
2891 rad_project(edi, xstart, &edi->vecs.linfix);
2893 /* Prepare for the next edi data set: */
2894 edi = edi->next_edi;
2896 /* Cleaning up on the master node: */
2897 if (!EDstate->bFromCpt)
2904 } /* end of MASTER only section */
2908 /* First let everybody know how many ED data sets to expect */
2909 gmx_bcast(sizeof(EDstate->nED), &EDstate->nED, cr);
2910 /* Broadcast the essential dynamics / flooding data to all nodes */
2911 broadcast_ed_data(cr, ed, EDstate->nED);
2915 /* In the single-CPU case, point the local atom numbers pointers to the global
2916 * one, so that we can use the same notation in serial and parallel case: */
2918 /* Loop over all ED data sets (usually only one, though) */
2920 for (nr_edi = 1; nr_edi <= EDstate->nED; nr_edi++)
2922 edi->sref.anrs_loc = edi->sref.anrs;
2923 edi->sav.anrs_loc = edi->sav.anrs;
2924 edi->star.anrs_loc = edi->star.anrs;
2925 edi->sori.anrs_loc = edi->sori.anrs;
2926 /* For the same reason as above, make a dummy c_ind array: */
2927 snew(edi->sav.c_ind, edi->sav.nr);
2928 /* Initialize the array */
2929 for (i = 0; i < edi->sav.nr; i++)
2931 edi->sav.c_ind[i] = i;
2933 /* In the general case we will need a different-sized array for the reference indices: */
2936 snew(edi->sref.c_ind, edi->sref.nr);
2937 for (i = 0; i < edi->sref.nr; i++)
2939 edi->sref.c_ind[i] = i;
2942 /* Point to the very same array in case of other structures: */
2943 edi->star.c_ind = edi->sav.c_ind;
2944 edi->sori.c_ind = edi->sav.c_ind;
2945 /* In the serial case, the local number of atoms is the global one: */
2946 edi->sref.nr_loc = edi->sref.nr;
2947 edi->sav.nr_loc = edi->sav.nr;
2948 edi->star.nr_loc = edi->star.nr;
2949 edi->sori.nr_loc = edi->sori.nr;
2951 /* An on we go to the next ED group */
2952 edi = edi->next_edi;
2956 /* Allocate space for ED buffer variables */
2957 /* Again, loop over ED data sets */
2959 for (nr_edi = 1; nr_edi <= EDstate->nED; nr_edi++)
2961 /* Allocate space for ED buffer variables */
2962 snew_bc(cr, edi->buf, 1); /* MASTER has already allocated edi->buf in init_edi() */
2963 snew(edi->buf->do_edsam, 1);
2965 /* Space for collective ED buffer variables */
2967 /* Collective positions of atoms with the average indices */
2968 snew(edi->buf->do_edsam->xcoll, edi->sav.nr);
2969 snew(edi->buf->do_edsam->shifts_xcoll, edi->sav.nr); /* buffer for xcoll shifts */
2970 snew(edi->buf->do_edsam->extra_shifts_xcoll, edi->sav.nr);
2971 /* Collective positions of atoms with the reference indices */
2974 snew(edi->buf->do_edsam->xc_ref, edi->sref.nr);
2975 snew(edi->buf->do_edsam->shifts_xc_ref, edi->sref.nr); /* To store the shifts in */
2976 snew(edi->buf->do_edsam->extra_shifts_xc_ref, edi->sref.nr);
2979 /* Get memory for flooding forces */
2980 snew(edi->flood.forces_cartesian, edi->sav.nr);
2983 /* Dump it all into one file per process */
2984 dump_edi(edi, cr, nr_edi);
2988 edi = edi->next_edi;
2991 /* Flush the edo file so that the user can check some things
2992 * when the simulation has started */
3000 void do_edsam(t_inputrec *ir,
3008 int i, edinr, iupdate = 500;
3009 matrix rotmat; /* rotation matrix */
3010 rvec transvec; /* translation vector */
3011 rvec dv, dx, x_unsh; /* tmp vectors for velocity, distance, unshifted x coordinate */
3012 real dt_1; /* 1/dt */
3013 struct t_do_edsam *buf;
3015 real rmsdev = -1; /* RMSD from reference structure prior to applying the constraints */
3016 gmx_bool bSuppress = FALSE; /* Write .xvg output file on master? */
3019 /* Check if ED sampling has to be performed */
3020 if (ed->eEDtype == eEDnone)
3025 /* Suppress output on first call of do_edsam if
3026 * two-step sd2 integrator is used */
3027 if ( (ir->eI == eiSD2) && (v != NULL) )
3032 dt_1 = 1.0/ir->delta_t;
3034 /* Loop over all ED groups (usually one) */
3040 if (bNeedDoEdsam(edi))
3043 buf = edi->buf->do_edsam;
3047 /* initialize radacc radius for slope criterion */
3048 buf->oldrad = calc_radius(&edi->vecs.radacc);
3051 /* Copy the positions into buf->xc* arrays and after ED
3052 * feed back corrections to the official positions */
3054 /* Broadcast the ED positions such that every node has all of them
3055 * Every node contributes its local positions xs and stores it in
3056 * the collective buf->xcoll array. Note that for edinr > 1
3057 * xs could already have been modified by an earlier ED */
3059 communicate_group_positions(cr, buf->xcoll, buf->shifts_xcoll, buf->extra_shifts_xcoll, PAR(cr) ? buf->bUpdateShifts : TRUE, xs,
3060 edi->sav.nr, edi->sav.nr_loc, edi->sav.anrs_loc, edi->sav.c_ind, edi->sav.x_old, box);
3062 /* Only assembly reference positions if their indices differ from the average ones */
3065 communicate_group_positions(cr, buf->xc_ref, buf->shifts_xc_ref, buf->extra_shifts_xc_ref, PAR(cr) ? buf->bUpdateShifts : TRUE, xs,
3066 edi->sref.nr, edi->sref.nr_loc, edi->sref.anrs_loc, edi->sref.c_ind, edi->sref.x_old, box);
3069 /* If bUpdateShifts was TRUE then the shifts have just been updated in communicate_group_positions.
3070 * We do not need to update the shifts until the next NS step. Note that dd_make_local_ed_indices
3071 * set bUpdateShifts=TRUE in the parallel case. */
3072 buf->bUpdateShifts = FALSE;
3074 /* Now all nodes have all of the ED positions in edi->sav->xcoll,
3075 * as well as the indices in edi->sav.anrs */
3077 /* Fit the reference indices to the reference structure */
3080 fit_to_reference(buf->xcoll, transvec, rotmat, edi);
3084 fit_to_reference(buf->xc_ref, transvec, rotmat, edi);
3087 /* Now apply the translation and rotation to the ED structure */
3088 translate_and_rotate(buf->xcoll, edi->sav.nr, transvec, rotmat);
3090 /* Find out how well we fit to the reference (just for output steps) */
3091 if (do_per_step(step, edi->outfrq) && MASTER(cr))
3095 /* Indices of reference and average structures are identical,
3096 * thus we can calculate the rmsd to SREF using xcoll */
3097 rmsdev = rmsd_from_structure(buf->xcoll, &edi->sref);
3101 /* We have to translate & rotate the reference atoms first */
3102 translate_and_rotate(buf->xc_ref, edi->sref.nr, transvec, rotmat);
3103 rmsdev = rmsd_from_structure(buf->xc_ref, &edi->sref);
3107 /* update radsam references, when required */
3108 if (do_per_step(step, edi->maxedsteps) && step >= edi->presteps)
3110 project(buf->xcoll, edi);
3111 rad_project(edi, buf->xcoll, &edi->vecs.radacc);
3112 rad_project(edi, buf->xcoll, &edi->vecs.radfix);
3113 buf->oldrad = -1.e5;
3116 /* update radacc references, when required */
3117 if (do_per_step(step, iupdate) && step >= edi->presteps)
3119 edi->vecs.radacc.radius = calc_radius(&edi->vecs.radacc);
3120 if (edi->vecs.radacc.radius - buf->oldrad < edi->slope)
3122 project(buf->xcoll, edi);
3123 rad_project(edi, buf->xcoll, &edi->vecs.radacc);
3128 buf->oldrad = edi->vecs.radacc.radius;
3132 /* apply the constraints */
3133 if (step >= edi->presteps && ed_constraints(ed->eEDtype, edi))
3135 /* ED constraints should be applied already in the first MD step
3136 * (which is step 0), therefore we pass step+1 to the routine */
3137 ed_apply_constraints(buf->xcoll, edi, step+1 - ir->init_step);
3140 /* write to edo, when required */
3141 if (do_per_step(step, edi->outfrq))
3143 project(buf->xcoll, edi);
3144 if (MASTER(cr) && !bSuppress)
3146 write_edo(edi, ed->edo, rmsdev);
3150 /* Copy back the positions unless monitoring only */
3151 if (ed_constraints(ed->eEDtype, edi))
3153 /* remove fitting */
3154 rmfit(edi->sav.nr, buf->xcoll, transvec, rotmat);
3156 /* Copy the ED corrected positions into the coordinate array */
3157 /* Each node copies its local part. In the serial case, nat_loc is the
3158 * total number of ED atoms */
3159 for (i = 0; i < edi->sav.nr_loc; i++)
3161 /* Unshift local ED coordinate and store in x_unsh */
3162 ed_unshift_single_coord(box, buf->xcoll[edi->sav.c_ind[i]],
3163 buf->shifts_xcoll[edi->sav.c_ind[i]], x_unsh);
3165 /* dx is the ED correction to the positions: */
3166 rvec_sub(x_unsh, xs[edi->sav.anrs_loc[i]], dx);
3170 /* dv is the ED correction to the velocity: */
3171 svmul(dt_1, dx, dv);
3172 /* apply the velocity correction: */
3173 rvec_inc(v[edi->sav.anrs_loc[i]], dv);
3175 /* Finally apply the position correction due to ED: */
3176 copy_rvec(x_unsh, xs[edi->sav.anrs_loc[i]]);
3179 } /* END of if ( bNeedDoEdsam(edi) ) */
3181 /* Prepare for the next ED group */
3182 edi = edi->next_edi;
3184 } /* END of loop over ED groups */