1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
11 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13 * Copyright (c) 2001-2004, The GROMACS development team,
14 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * GROwing Monsters And Cloning Shrimps
56 #include "mtop_util.h"
58 #include "mpelogging.h"
60 #include "groupcoord.h"
63 /* We use the same defines as in mvdata.c here */
64 #define block_bc(cr, d) gmx_bcast( sizeof(d), &(d),(cr))
65 #define nblock_bc(cr,nr,d) gmx_bcast((nr)*sizeof((d)[0]), (d),(cr))
66 #define snew_bc(cr,d,nr) { if (!MASTER(cr)) snew((d),(nr)); }
69 /* enum to identify the type of ED: none, normal ED, flooding */
70 enum {eEDnone, eEDedsam, eEDflood, eEDnr};
72 /* enum to identify operations on reference, average, origin, target structures */
73 enum {eedREF, eedAV, eedORI, eedTAR, eedNR};
78 int neig; /* nr of eigenvectors */
79 int *ieig; /* index nrs of eigenvectors */
80 real *stpsz; /* stepsizes (per eigenvector) */
81 rvec **vec; /* eigenvector components */
82 real *xproj; /* instantaneous x projections */
83 real *fproj; /* instantaneous f projections */
84 real radius; /* instantaneous radius */
85 real *refproj; /* starting or target projecions */
86 /* When using flooding as harmonic restraint: The current reference projection
87 * is at each step calculated from the initial refproj0 and the slope. */
88 real *refproj0,*refprojslope;
94 t_eigvec mon; /* only monitored, no constraints */
95 t_eigvec linfix; /* fixed linear constraints */
96 t_eigvec linacc; /* acceptance linear constraints */
97 t_eigvec radfix; /* fixed radial constraints (exp) */
98 t_eigvec radacc; /* acceptance radial constraints (exp) */
99 t_eigvec radcon; /* acceptance rad. contraction constr. */
106 gmx_bool bHarmonic; /* Use flooding for harmonic restraint on eigenvector */
116 rvec *forces_cartesian;
117 t_eigvec vecs; /* use flooding for these */
121 /* This type is for the average, reference, target, and origin structure */
122 typedef struct gmx_edx
124 int nr; /* number of atoms this structure contains */
125 int nr_loc; /* number of atoms on local node */
126 int *anrs; /* atom index numbers */
127 int *anrs_loc; /* local atom index numbers */
128 int nalloc_loc; /* allocation size of anrs_loc */
129 int *c_ind; /* at which position of the whole anrs
130 * array is a local atom?, i.e.
131 * c_ind[0...nr_loc-1] gives the atom index
132 * with respect to the collective
133 * anrs[0...nr-1] array */
134 rvec *x; /* positions for this structure */
135 rvec *x_old; /* used to keep track of the shift vectors
136 such that the ED molecule can always be
137 made whole in the parallel case */
138 real *m; /* masses */
139 real mtot; /* total mass (only used in sref) */
140 real *sqrtm; /* sqrt of the masses used for mass-
141 * weighting of analysis (only used in sav) */
147 int nini; /* total Nr of atoms */
148 gmx_bool fitmas; /* true if trans fit with cm */
149 gmx_bool pcamas; /* true if mass-weighted PCA */
150 int presteps; /* number of steps to run without any
151 * perturbations ... just monitoring */
152 int outfrq; /* freq (in steps) of writing to edo */
153 int maxedsteps; /* max nr of steps per cycle */
155 /* all gmx_edx datasets are copied to all nodes in the parallel case */
156 struct gmx_edx sref; /* reference positions, to these fitting
158 gmx_bool bRefEqAv; /* If true, reference & average indices
159 * are the same. Used for optimization */
160 struct gmx_edx sav; /* average positions */
161 struct gmx_edx star; /* target positions */
162 struct gmx_edx sori; /* origin positions */
164 t_edvecs vecs; /* eigenvectors */
165 real slope; /* minimal slope in acceptance radexp */
167 gmx_bool bNeedDoEdsam; /* if any of the options mon, linfix, ...
168 * is used (i.e. apart from flooding) */
169 t_edflood flood; /* parameters especially for flooding */
170 struct t_ed_buffer *buf; /* handle to local buffers */
171 struct edpar *next_edi; /* Pointer to another ed dataset */
175 typedef struct gmx_edsam
177 int eEDtype; /* Type of ED: see enums above */
178 const char *edinam; /* name of ED sampling input file */
179 const char *edonam; /* output */
180 FILE *edo; /* output file pointer */
183 gmx_bool bStartFromCpt;
191 rvec old_transvec,older_transvec,transvec_compact;
192 rvec *xcoll; /* Positions from all nodes, this is the
193 collective set we work on.
194 These are the positions of atoms with
195 average structure indices */
196 rvec *xc_ref; /* same but with reference structure indices */
197 ivec *shifts_xcoll; /* Shifts for xcoll */
198 ivec *extra_shifts_xcoll; /* xcoll shift changes since last NS step */
199 ivec *shifts_xc_ref; /* Shifts for xc_ref */
200 ivec *extra_shifts_xc_ref; /* xc_ref shift changes since last NS step */
201 gmx_bool bUpdateShifts; /* TRUE in NS steps to indicate that the
202 ED shifts for this ED dataset need to
207 /* definition of ED buffer structure */
210 struct t_fit_to_ref * fit_to_ref;
211 struct t_do_edfit * do_edfit;
212 struct t_do_edsam * do_edsam;
213 struct t_do_radcon * do_radcon;
217 /* Function declarations */
218 static void fit_to_reference(rvec *xcoll,rvec transvec,matrix rotmat,t_edpar *edi);
220 static void translate_and_rotate(rvec *x,int nat,rvec transvec,matrix rotmat);
221 /* End function declarations */
224 /* Does not subtract average positions, projection on single eigenvector is returned
225 * used by: do_linfix, do_linacc, do_radfix, do_radacc, do_radcon
226 * Average position is subtracted in ed_apply_constraints prior to calling projectx
228 static real projectx(t_edpar *edi, rvec *xcoll, rvec *vec)
234 for (i=0; i<edi->sav.nr; i++)
235 proj += edi->sav.sqrtm[i]*iprod(vec[i], xcoll[i]);
241 /* Specialized: projection is stored in vec->refproj
242 * -> used for radacc, radfix, radcon and center of flooding potential
243 * subtracts average positions, projects vector x */
244 static void rad_project(t_edpar *edi, rvec *x, t_eigvec *vec, t_commrec *cr)
249 /* Subtract average positions */
250 for (i = 0; i < edi->sav.nr; i++)
251 rvec_dec(x[i], edi->sav.x[i]);
253 for (i = 0; i < vec->neig; i++)
255 vec->refproj[i] = projectx(edi,x,vec->vec[i]);
256 rad += pow((vec->refproj[i]-vec->xproj[i]),2);
258 vec->radius=sqrt(rad);
260 /* Add average positions */
261 for (i = 0; i < edi->sav.nr; i++)
262 rvec_inc(x[i], edi->sav.x[i]);
266 /* Project vector x, subtract average positions prior to projection and add
267 * them afterwards to retain the unchanged vector. Store in xproj. Mass-weighting
269 static void project_to_eigvectors(rvec *x, /* The positions to project to an eigenvector */
270 t_eigvec *vec, /* The eigenvectors */
276 if (!vec->neig) return;
278 /* Subtract average positions */
279 for (i=0; i<edi->sav.nr; i++)
280 rvec_dec(x[i], edi->sav.x[i]);
282 for (i=0; i<vec->neig; i++)
283 vec->xproj[i] = projectx(edi, x, vec->vec[i]);
285 /* Add average positions */
286 for (i=0; i<edi->sav.nr; i++)
287 rvec_inc(x[i], edi->sav.x[i]);
291 /* Project vector x onto all edi->vecs (mon, linfix,...) */
292 static void project(rvec *x, /* positions to project */
293 t_edpar *edi) /* edi data set */
295 /* It is not more work to subtract the average position in every
296 * subroutine again, because these routines are rarely used simultanely */
297 project_to_eigvectors(x, &edi->vecs.mon , edi);
298 project_to_eigvectors(x, &edi->vecs.linfix, edi);
299 project_to_eigvectors(x, &edi->vecs.linacc, edi);
300 project_to_eigvectors(x, &edi->vecs.radfix, edi);
301 project_to_eigvectors(x, &edi->vecs.radacc, edi);
302 project_to_eigvectors(x, &edi->vecs.radcon, edi);
306 static real calc_radius(t_eigvec *vec)
312 for (i=0; i<vec->neig; i++)
313 rad += pow((vec->refproj[i]-vec->xproj[i]),2);
315 return rad=sqrt(rad);
321 static void dump_xcoll(t_edpar *edi, struct t_do_edsam *buf, t_commrec *cr,
328 ivec *shifts, *eshifts;
335 shifts = buf->shifts_xcoll;
336 eshifts = buf->extra_shifts_xcoll;
338 sprintf(fn, "xcolldump_step%d.txt", step);
341 for (i=0; i<edi->sav.nr; i++)
342 fprintf(fp, "%d %9.5f %9.5f %9.5f %d %d %d %d %d %d\n",
344 xcoll[i][XX] , xcoll[i][YY] , xcoll[i][ZZ],
345 shifts[i][XX] , shifts[i][YY] , shifts[i][ZZ],
346 eshifts[i][XX], eshifts[i][YY], eshifts[i][ZZ]);
353 static void dump_edi_positions(FILE *out, struct gmx_edx *s, const char name[])
358 fprintf(out, "#%s positions:\n%d\n", name, s->nr);
362 fprintf(out, "#index, x, y, z");
364 fprintf(out, ", sqrt(m)");
365 for (i=0; i<s->nr; i++)
367 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]);
369 fprintf(out,"%9.3f",s->sqrtm[i]);
376 static void dump_edi_eigenvecs(FILE *out, t_eigvec *ev,
377 const char name[], int length)
382 fprintf(out, "#%s eigenvectors:\n%d\n", name, ev->neig);
383 /* Dump the data for every eigenvector: */
384 for (i=0; i<ev->neig; i++)
386 fprintf(out, "EV %4d\ncomponents %d\nstepsize %f\nxproj %f\nfproj %f\nrefproj %f\nradius %f\nComponents:\n",
387 ev->ieig[i], length, ev->stpsz[i], ev->xproj[i], ev->fproj[i], ev->refproj[i], ev->radius);
388 for (j=0; j<length; j++)
389 fprintf(out, "%11.6f %11.6f %11.6f\n", ev->vec[i][j][XX], ev->vec[i][j][YY], ev->vec[i][j][ZZ]);
395 static void dump_edi(t_edpar *edpars, t_commrec *cr, int nr_edi)
401 sprintf(fn, "EDdump_node%d_edi%d", cr->nodeid, nr_edi);
402 out = ffopen(fn, "w");
404 fprintf(out,"#NINI\n %d\n#FITMAS\n %d\n#ANALYSIS_MAS\n %d\n",
405 edpars->nini,edpars->fitmas,edpars->pcamas);
406 fprintf(out,"#OUTFRQ\n %d\n#MAXLEN\n %d\n#SLOPECRIT\n %f\n",
407 edpars->outfrq,edpars->maxedsteps,edpars->slope);
408 fprintf(out,"#PRESTEPS\n %d\n#DELTA_F0\n %f\n#TAU\n %f\n#EFL_NULL\n %f\n#ALPHA2\n %f\n",
409 edpars->presteps,edpars->flood.deltaF0,edpars->flood.tau,
410 edpars->flood.constEfl,edpars->flood.alpha2);
412 /* Dump reference, average, target, origin positions */
413 dump_edi_positions(out, &edpars->sref, "REFERENCE");
414 dump_edi_positions(out, &edpars->sav , "AVERAGE" );
415 dump_edi_positions(out, &edpars->star, "TARGET" );
416 dump_edi_positions(out, &edpars->sori, "ORIGIN" );
418 /* Dump eigenvectors */
419 dump_edi_eigenvecs(out, &edpars->vecs.mon , "MONITORED", edpars->sav.nr);
420 dump_edi_eigenvecs(out, &edpars->vecs.linfix, "LINFIX" , edpars->sav.nr);
421 dump_edi_eigenvecs(out, &edpars->vecs.linacc, "LINACC" , edpars->sav.nr);
422 dump_edi_eigenvecs(out, &edpars->vecs.radfix, "RADFIX" , edpars->sav.nr);
423 dump_edi_eigenvecs(out, &edpars->vecs.radacc, "RADACC" , edpars->sav.nr);
424 dump_edi_eigenvecs(out, &edpars->vecs.radcon, "RADCON" , edpars->sav.nr);
426 /* Dump flooding eigenvectors */
427 dump_edi_eigenvecs(out, &edpars->flood.vecs, "FLOODING" , edpars->sav.nr);
429 /* Dump ed local buffer */
430 fprintf(out, "buf->do_edfit =%p\n", (void*)edpars->buf->do_edfit );
431 fprintf(out, "buf->do_edsam =%p\n", (void*)edpars->buf->do_edsam );
432 fprintf(out, "buf->do_radcon =%p\n", (void*)edpars->buf->do_radcon );
439 static void dump_rotmat(FILE* out,matrix rotmat)
441 fprintf(out,"ROTMAT: %12.8f %12.8f %12.8f\n",rotmat[XX][XX],rotmat[XX][YY],rotmat[XX][ZZ]);
442 fprintf(out,"ROTMAT: %12.8f %12.8f %12.8f\n",rotmat[YY][XX],rotmat[YY][YY],rotmat[YY][ZZ]);
443 fprintf(out,"ROTMAT: %12.8f %12.8f %12.8f\n",rotmat[ZZ][XX],rotmat[ZZ][YY],rotmat[ZZ][ZZ]);
448 static void dump_rvec(FILE *out, int dim, rvec *x)
453 for (i=0; i<dim; i++)
454 fprintf(out,"%4d %f %f %f\n",i,x[i][XX],x[i][YY],x[i][ZZ]);
459 static void dump_mat(FILE* out, int dim, double** mat)
464 fprintf(out,"MATRIX:\n");
468 fprintf(out,"%f ",mat[i][j]);
480 static void do_edfit(int natoms,rvec *xp,rvec *x,matrix R,t_edpar *edi)
482 /* this is a copy of do_fit with some modifications */
489 struct t_do_edfit *loc;
492 if(edi->buf->do_edfit != NULL)
497 snew(edi->buf->do_edfit,1);
499 loc = edi->buf->do_edfit;
503 snew(loc->omega,2*DIM);
505 for(i=0; i<2*DIM; i++)
507 snew(loc->omega[i],2*DIM);
508 snew(loc->om[i],2*DIM);
522 /* calculate the matrix U */
524 for(n=0;(n<natoms);n++)
526 for(c=0; (c<DIM); c++)
529 for(r=0; (r<DIM); r++)
537 /* construct loc->omega */
538 /* loc->omega is symmetric -> loc->omega==loc->omega' */
543 loc->omega[r][c]=u[r-3][c];
544 loc->omega[c][r]=u[r-3][c];
552 /* determine h and k */
556 dump_mat(stderr,2*DIM,loc->omega);
558 fprintf(stderr,"d[%d] = %f\n",i,d[i]);
561 jacobi(loc->omega,6,d,loc->om,&irot);
564 fprintf(stderr,"IROT=0\n");
566 index=0; /* For the compiler only */
580 vh[j][i]=M_SQRT2*loc->om[i][index];
581 vk[j][i]=M_SQRT2*loc->om[i+DIM][index];
588 R[c][r]=vk[0][r]*vh[0][c]+
594 R[c][r]=vk[0][r]*vh[0][c]+
600 static void rmfit(int nat, rvec *xcoll, rvec transvec, matrix rotmat)
607 * The inverse rotation is described by the transposed rotation matrix */
608 transpose(rotmat,tmat);
609 rotate_x(xcoll, nat, tmat);
611 /* Remove translation */
612 vec[XX]=-transvec[XX];
613 vec[YY]=-transvec[YY];
614 vec[ZZ]=-transvec[ZZ];
615 translate_x(xcoll, nat, vec);
619 /**********************************************************************************
620 ******************** FLOODING ****************************************************
621 **********************************************************************************
623 The flooding ability was added later to edsam. Many of the edsam functionality could be reused for that purpose.
624 The flooding covariance matrix, i.e. the selected eigenvectors and their corresponding eigenvalues are
625 read as 7th Component Group. The eigenvalues are coded into the stepsize parameter (as used by -linfix or -linacc).
627 do_md clls right in the beginning the function init_edsam, which reads the edi file, saves all the necessary information in
628 the edi structure and calls init_flood, to initialise some extra fields in the edi->flood structure.
630 since the flooding acts on forces do_flood is called from the function force() (force.c), while the other
631 edsam functionality is hooked into md via the update() (update.c) function acting as constraint on positions.
633 do_flood makes a copy of the positions,
634 fits them, projects them computes flooding_energy, and flooding forces. The forces are computed in the
635 space of the eigenvectors and are then blown up to the full cartesian space and rotated back to remove the
636 fit. Then do_flood adds these forces to the forcefield-forces
637 (given as parameter) and updates the adaptive flooding parameters Efl and deltaF.
639 To center the flooding potential at a different location one can use the -ori option in make_edi. The ori
640 structure is projected to the system of eigenvectors and then this position in the subspace is used as
641 center of the flooding potential. If the option is not used, the center will be zero in the subspace,
642 i.e. the average structure as given in the make_edi file.
644 To use the flooding potential as restraint, make_edi has the option -restrain, which leads to inverted
645 signs of alpha2 and Efl, such that the sign in the exponential of Vfl is not inverted but the sign of
646 Vfl is inverted. Vfl = Efl * exp (- .../Efl/alpha2*x^2...) With tau>0 the negative Efl will grow slowly
647 so that the restraint is switched off slowly. When Efl==0 and inverted flooding is ON is reached no
648 further adaption is applied, Efl will stay constant at zero.
650 To use restraints with harmonic potentials switch -restrain and -harmonic. Then the eigenvalues are
651 used as spring constants for the harmonic potential.
652 Note that eq3 in the flooding paper (J. Comp. Chem. 2006, 27, 1693-1702) defines the parameter lambda \
653 as the inverse of the spring constant, whereas the implementation uses lambda as the spring constant.
655 To use more than one flooding matrix just concatenate several .edi files (cat flood1.edi flood2.edi > flood_all.edi)
656 the routine read_edi_file reads all of theses flooding files.
657 The structure t_edi is now organized as a list of t_edis and the function do_flood cycles through the list
658 calling the do_single_flood() routine for every single entry. Since every state variables have been kept in one
659 edi there is no interdependence whatsoever. The forces are added together.
661 To write energies into the .edr file, call the function
662 get_flood_enx_names(char**, int *nnames) to get the Header (Vfl1 Vfl2... Vfln)
664 get_flood_energies(real Vfl[],int nnames);
667 - 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.
669 Maybe one should give a range of atoms for which to remove motion, so that motion is removed with
670 two edsam files from two peptide chains
673 static void write_edo_flood(t_edpar *edi, FILE *fp, gmx_large_int_t step)
677 gmx_bool bOutputRef=FALSE;
680 fprintf(fp,"%d.th FL: %s %12.5e %12.5e %12.5e\n",
681 edi->flood.flood_id, gmx_step_str(step,buf),
682 edi->flood.Efl, edi->flood.Vfl, edi->flood.deltaF);
685 /* Check whether any of the references changes with time (this can happen
686 * in case flooding is used as harmonic restraint). If so, output all the
687 * current reference projections. */
688 if (edi->flood.bHarmonic)
690 for (i = 0; i < edi->flood.vecs.neig; i++)
692 if (edi->flood.vecs.refprojslope[i] != 0.0)
697 fprintf(fp, "Ref. projs.: ");
698 for (i = 0; i < edi->flood.vecs.neig; i++)
700 fprintf(fp, "%12.5e ", edi->flood.vecs.refproj[i]);
705 fprintf(fp,"FL_FORCES: ");
707 for (i=0; i<edi->flood.vecs.neig; i++)
708 fprintf(fp," %12.5e",edi->flood.vecs.fproj[i]);
714 /* From flood.xproj compute the Vfl(x) at this point */
715 static real flood_energy(t_edpar *edi, gmx_large_int_t step)
717 /* compute flooding energy Vfl
718 Vfl = Efl * exp( - \frac {kT} {2Efl alpha^2} * sum_i { \lambda_i c_i^2 } )
719 \lambda_i is the reciprocal eigenvalue 1/\sigma_i
720 it is already computed by make_edi and stored in stpsz[i]
722 Vfl = - Efl * 1/2(sum _i {\frac 1{\lambda_i} c_i^2})
729 /* Each time this routine is called (i.e. each time step), we add a small
730 * value to the reference projection. This way a harmonic restraint towards
731 * a moving reference is realized. If no value for the additive constant
732 * is provided in the edi file, the reference will not change. */
733 if (edi->flood.bHarmonic)
735 for (i=0; i<edi->flood.vecs.neig; i++)
737 edi->flood.vecs.refproj[i] = edi->flood.vecs.refproj0[i] + step * edi->flood.vecs.refprojslope[i];
742 /* Compute sum which will be the exponent of the exponential */
743 for (i=0; i<edi->flood.vecs.neig; i++)
744 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]);
746 /* Compute the Gauss function*/
747 if (edi->flood.bHarmonic)
749 Vfl = -0.5*edi->flood.Efl*sum; /* minus sign because Efl is negative, if restrain is on. */
753 Vfl = edi->flood.Efl!=0 ? edi->flood.Efl*exp(-edi->flood.kT/2/edi->flood.Efl/edi->flood.alpha2*sum) :0;
760 /* From the position and from Vfl compute forces in subspace -> store in edi->vec.flood.fproj */
761 static void flood_forces(t_edpar *edi)
763 /* compute the forces in the subspace of the flooding eigenvectors
764 * by the formula F_i= V_{fl}(c) * ( \frac {kT} {E_{fl}} \lambda_i c_i */
767 real energy=edi->flood.Vfl;
770 if (edi->flood.bHarmonic)
771 for (i=0; i<edi->flood.vecs.neig; i++)
773 edi->flood.vecs.fproj[i] = edi->flood.Efl* edi->flood.vecs.stpsz[i]*(edi->flood.vecs.xproj[i]-edi->flood.vecs.refproj[i]);
776 for (i=0; i<edi->flood.vecs.neig; i++)
778 /* if Efl is zero the forces are zero if not use the formula */
779 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;
784 /* Raise forces from subspace into cartesian space */
785 static void flood_blowup(t_edpar *edi, rvec *forces_cart)
787 /* this function lifts the forces from the subspace to the cartesian space
788 all the values not contained in the subspace are assumed to be zero and then
789 a coordinate transformation from eigenvector to cartesian vectors is performed
790 The nonexistent values don't have to be set to zero explicitly, they would occur
791 as zero valued summands, hence we just stop to compute this part of the sum.
793 for every atom we add all the contributions to this atom from all the different eigenvectors.
795 NOTE: one could add directly to the forcefield forces, would mean we wouldn't have to clear the
796 field forces_cart prior the computation, but momentarily we want to compute the forces separately
797 to have them accessible for diagnostics
804 forces_sub = edi->flood.vecs.fproj;
807 /* Calculate the cartesian forces for the local atoms */
809 /* Clear forces first */
810 for (j=0; j<edi->sav.nr_loc; j++)
811 clear_rvec(forces_cart[j]);
813 /* Now compute atomwise */
814 for (j=0; j<edi->sav.nr_loc; j++)
816 /* Compute forces_cart[edi->sav.anrs[j]] */
817 for (eig=0; eig<edi->flood.vecs.neig; eig++)
819 /* Force vector is force * eigenvector (compute only atom j) */
820 svmul(forces_sub[eig],edi->flood.vecs.vec[eig][edi->sav.c_ind[j]],dum);
821 /* Add this vector to the cartesian forces */
822 rvec_inc(forces_cart[j],dum);
828 /* Update the values of Efl, deltaF depending on tau and Vfl */
829 static void update_adaption(t_edpar *edi)
831 /* this function updates the parameter Efl and deltaF according to the rules given in
832 * 'predicting unimolecular chemical reactions: chemical flooding' M Mueller et al,
835 if ((edi->flood.tau < 0 ? -edi->flood.tau : edi->flood.tau ) > 0.00000001)
837 edi->flood.Efl = edi->flood.Efl+edi->flood.dt/edi->flood.tau*(edi->flood.deltaF0-edi->flood.deltaF);
838 /* check if restrain (inverted flooding) -> don't let EFL become positive */
839 if (edi->flood.alpha2<0 && edi->flood.Efl>-0.00000001)
842 edi->flood.deltaF = (1-edi->flood.dt/edi->flood.tau)*edi->flood.deltaF+edi->flood.dt/edi->flood.tau*edi->flood.Vfl;
847 static void do_single_flood(
852 gmx_large_int_t step,
857 matrix rotmat; /* rotation matrix */
858 matrix tmat; /* inverse rotation */
859 rvec transvec; /* translation vector */
860 struct t_do_edsam *buf;
863 buf=edi->buf->do_edsam;
865 /* Broadcast the positions of the AVERAGE structure such that they are known on
866 * every processor. Each node contributes its local positions x and stores them in
867 * the collective ED array buf->xcoll */
868 communicate_group_positions(cr, buf->xcoll, buf->shifts_xcoll, buf->extra_shifts_xcoll, buf->bUpdateShifts, x,
869 edi->sav.nr, edi->sav.nr_loc, edi->sav.anrs_loc, edi->sav.c_ind, edi->sav.x_old, box);
871 /* Only assembly REFERENCE positions if their indices differ from the average ones */
873 communicate_group_positions(cr, buf->xc_ref, buf->shifts_xc_ref, buf->extra_shifts_xc_ref, buf->bUpdateShifts, x,
874 edi->sref.nr, edi->sref.nr_loc, edi->sref.anrs_loc, edi->sref.c_ind, edi->sref.x_old, box);
876 /* If bUpdateShifts was TRUE, the shifts have just been updated in get_positions.
877 * We do not need to update the shifts until the next NS step */
878 buf->bUpdateShifts = FALSE;
880 /* Now all nodes have all of the ED/flooding positions in edi->sav->xcoll,
881 * as well as the indices in edi->sav.anrs */
883 /* Fit the reference indices to the reference structure */
885 fit_to_reference(buf->xcoll , transvec, rotmat, edi);
887 fit_to_reference(buf->xc_ref, transvec, rotmat, edi);
889 /* Now apply the translation and rotation to the ED structure */
890 translate_and_rotate(buf->xcoll, edi->sav.nr, transvec, rotmat);
892 /* Project fitted structure onto supbspace -> store in edi->flood.vecs.xproj */
893 project_to_eigvectors(buf->xcoll,&edi->flood.vecs,edi);
895 /* Compute Vfl(x) from flood.xproj */
896 edi->flood.Vfl = flood_energy(edi, step);
898 update_adaption(edi);
900 /* Compute the flooding forces */
903 /* Translate them into cartesian positions */
904 flood_blowup(edi, edi->flood.forces_cartesian);
906 /* Rotate forces back so that they correspond to the given structure and not to the fitted one */
907 /* Each node rotates back its local forces */
908 transpose(rotmat,tmat);
909 rotate_x(edi->flood.forces_cartesian, edi->sav.nr_loc, tmat);
911 /* Finally add forces to the main force variable */
912 for (i=0; i<edi->sav.nr_loc; i++)
913 rvec_inc(force[edi->sav.anrs_loc[i]],edi->flood.forces_cartesian[i]);
915 /* Output is written by the master process */
916 if (do_per_step(step,edi->outfrq) && MASTER(cr))
917 write_edo_flood(edi,edo,step);
921 /* Main flooding routine, called from do_force */
922 extern void do_flood(
923 FILE *log, /* md.log file */
924 t_commrec *cr, /* Communication record */
925 rvec x[], /* Positions on the local processor */
926 rvec force[], /* forcefield forces, to these the flooding forces are added */
927 gmx_edsam_t ed, /* ed data structure contains all ED and flooding datasets */
928 matrix box, /* the box */
929 gmx_large_int_t step) /* The relative time step since ir->init_step is already subtracted */
934 if (ed->eEDtype != eEDflood)
940 /* Call flooding for one matrix */
941 if (edi->flood.vecs.neig)
942 do_single_flood(ed->edo,x,force,edi,step,box,cr);
948 /* Called by init_edi, configure some flooding related variables and structures,
949 * print headers to output files */
950 static void init_flood(t_edpar *edi, gmx_edsam_t ed, real dt, t_commrec *cr)
952 edi->flood.Efl = edi->flood.constEfl;
956 if (edi->flood.vecs.neig)
958 /* If in any of the datasets we find a flooding vector, flooding is turned on */
959 ed->eEDtype = eEDflood;
961 fprintf(ed->edo,"FL_HEADER: Flooding of matrix %d is switched on! The flooding output will have the following format:\n",
962 edi->flood.flood_id);
963 fprintf(stderr,"ED: Flooding of matrix %d is switched on.\n", edi->flood.flood_id);
964 if (edi->flood.flood_id<1)
965 fprintf(ed->edo,"FL_HEADER: Step Efl Vfl deltaF\n");
971 /*********** Energy book keeping ******/
972 static void get_flood_enx_names(t_edpar *edi, char** names, int *nnames) /* get header of energies */
982 sprintf(buf,"Vfl_%d",count);
983 names[count-1]=strdup(buf);
984 actual=actual->next_edi;
991 static void get_flood_energies(t_edpar *edi, real Vfl[],int nnames)
993 /*fl has to be big enough to capture nnames-many entries*/
1002 Vfl[count-1]=actual->flood.Vfl;
1003 actual=actual->next_edi;
1006 if (nnames!=count-1)
1007 gmx_fatal(FARGS,"Number of energies is not consistent with t_edi structure");
1009 /************* END of FLOODING IMPLEMENTATION ****************************/
1013 gmx_edsam_t ed_open(int nfile,const t_filenm fnm[],unsigned long Flags,t_commrec *cr)
1018 /* Allocate space for the ED data structure */
1021 /* We want to perform ED (this switch might later be upgraded to eEDflood) */
1022 ed->eEDtype = eEDedsam;
1026 /* Open .edi input file: */
1027 ed->edinam=ftp2fn(efEDI,nfile,fnm);
1028 /* The master opens the .edo output file */
1029 fprintf(stderr,"ED sampling will be performed!\n");
1030 ed->edonam = ftp2fn(efEDO,nfile,fnm);
1031 ed->edo = gmx_fio_fopen(ed->edonam,(Flags & MD_APPENDFILES)? "a+" : "w+");
1032 ed->bStartFromCpt = Flags & MD_STARTFROMCPT;
1038 /* Broadcasts the structure data */
1039 static void bc_ed_positions(t_commrec *cr, struct gmx_edx *s, int stype)
1041 snew_bc(cr, s->anrs, s->nr ); /* Index numbers */
1042 snew_bc(cr, s->x , s->nr ); /* Positions */
1043 nblock_bc(cr, s->nr, s->anrs );
1044 nblock_bc(cr, s->nr, s->x );
1046 /* For the average & reference structures we need an array for the collective indices,
1047 * and we need to broadcast the masses as well */
1048 if (stype == eedAV || stype == eedREF)
1050 /* We need these additional variables in the parallel case: */
1051 snew(s->c_ind , s->nr ); /* Collective indices */
1052 /* Local atom indices get assigned in dd_make_local_group_indices.
1053 * There, also memory is allocated */
1054 s->nalloc_loc = 0; /* allocation size of s->anrs_loc */
1055 snew_bc(cr, s->x_old, s->nr); /* To be able to always make the ED molecule whole, ... */
1056 nblock_bc(cr, s->nr, s->x_old); /* ... keep track of shift changes with the help of old coords */
1059 /* broadcast masses for the reference structure (for mass-weighted fitting) */
1060 if (stype == eedREF)
1062 snew_bc(cr, s->m, s->nr);
1063 nblock_bc(cr, s->nr, s->m);
1066 /* For the average structure we might need the masses for mass-weighting */
1069 snew_bc(cr, s->sqrtm, s->nr);
1070 nblock_bc(cr, s->nr, s->sqrtm);
1071 snew_bc(cr, s->m, s->nr);
1072 nblock_bc(cr, s->nr, s->m);
1077 /* Broadcasts the eigenvector data */
1078 static void bc_ed_vecs(t_commrec *cr, t_eigvec *ev, int length, gmx_bool bHarmonic)
1082 snew_bc(cr, ev->ieig , ev->neig); /* index numbers of eigenvector */
1083 snew_bc(cr, ev->stpsz , ev->neig); /* stepsizes per eigenvector */
1084 snew_bc(cr, ev->xproj , ev->neig); /* instantaneous x projection */
1085 snew_bc(cr, ev->fproj , ev->neig); /* instantaneous f projection */
1086 snew_bc(cr, ev->refproj, ev->neig); /* starting or target projection */
1088 nblock_bc(cr, ev->neig, ev->ieig );
1089 nblock_bc(cr, ev->neig, ev->stpsz );
1090 nblock_bc(cr, ev->neig, ev->xproj );
1091 nblock_bc(cr, ev->neig, ev->fproj );
1092 nblock_bc(cr, ev->neig, ev->refproj);
1094 snew_bc(cr, ev->vec, ev->neig); /* Eigenvector components */
1095 for (i=0; i<ev->neig; i++)
1097 snew_bc(cr, ev->vec[i], length);
1098 nblock_bc(cr, length, ev->vec[i]);
1101 /* For harmonic restraints the reference projections can change with time */
1104 snew_bc(cr, ev->refproj0 , ev->neig);
1105 snew_bc(cr, ev->refprojslope, ev->neig);
1106 nblock_bc(cr, ev->neig, ev->refproj0 );
1107 nblock_bc(cr, ev->neig, ev->refprojslope);
1112 /* Broadcasts the ED / flooding data to other nodes
1113 * and allocates memory where needed */
1114 static void broadcast_ed_data(t_commrec *cr, gmx_edsam_t ed, int numedis)
1120 /* Master lets the other nodes know if its ED only or also flooding */
1121 gmx_bcast(sizeof(ed->eEDtype), &(ed->eEDtype), cr);
1123 snew_bc(cr, ed->edpar,1);
1124 /* Now transfer the ED data set(s) */
1126 for (nr=0; nr<numedis; nr++)
1128 /* Broadcast a single ED data set */
1131 /* Broadcast positions */
1132 bc_ed_positions(cr, &(edi->sref), eedREF); /* reference positions (don't broadcast masses) */
1133 bc_ed_positions(cr, &(edi->sav ), eedAV ); /* average positions (do broadcast masses as well) */
1134 bc_ed_positions(cr, &(edi->star), eedTAR); /* target positions */
1135 bc_ed_positions(cr, &(edi->sori), eedORI); /* origin positions */
1137 /* Broadcast eigenvectors */
1138 bc_ed_vecs(cr, &edi->vecs.mon , edi->sav.nr, FALSE);
1139 bc_ed_vecs(cr, &edi->vecs.linfix, edi->sav.nr, FALSE);
1140 bc_ed_vecs(cr, &edi->vecs.linacc, edi->sav.nr, FALSE);
1141 bc_ed_vecs(cr, &edi->vecs.radfix, edi->sav.nr, FALSE);
1142 bc_ed_vecs(cr, &edi->vecs.radacc, edi->sav.nr, FALSE);
1143 bc_ed_vecs(cr, &edi->vecs.radcon, edi->sav.nr, FALSE);
1144 /* Broadcast flooding eigenvectors and, if needed, values for the moving reference */
1145 bc_ed_vecs(cr, &edi->flood.vecs, edi->sav.nr, edi->flood.bHarmonic);
1147 /* Set the pointer to the next ED dataset */
1150 snew_bc(cr, edi->next_edi, 1);
1151 edi = edi->next_edi;
1157 /* init-routine called for every *.edi-cycle, initialises t_edpar structure */
1158 static void init_edi(gmx_mtop_t *mtop,t_inputrec *ir,
1159 t_commrec *cr,gmx_edsam_t ed,t_edpar *edi)
1162 real totalmass = 0.0;
1166 /* NOTE Init_edi is executed on the master process only
1167 * The initialized data sets are then transmitted to the
1168 * other nodes in broadcast_ed_data */
1170 edi->bNeedDoEdsam = edi->vecs.mon.neig
1171 || edi->vecs.linfix.neig
1172 || edi->vecs.linacc.neig
1173 || edi->vecs.radfix.neig
1174 || edi->vecs.radacc.neig
1175 || edi->vecs.radcon.neig;
1177 /* evaluate masses (reference structure) */
1178 snew(edi->sref.m, edi->sref.nr);
1179 for (i = 0; i < edi->sref.nr; i++)
1183 gmx_mtop_atomnr_to_atom(mtop,edi->sref.anrs[i],&atom);
1184 edi->sref.m[i] = atom->m;
1188 edi->sref.m[i] = 1.0;
1190 totalmass += edi->sref.m[i];
1192 edi->sref.mtot = totalmass;
1194 /* Masses m and sqrt(m) for the average structure. Note that m
1195 * is needed if forces have to be evaluated in do_edsam */
1196 snew(edi->sav.sqrtm, edi->sav.nr );
1197 snew(edi->sav.m , edi->sav.nr );
1198 for (i = 0; i < edi->sav.nr; i++)
1200 gmx_mtop_atomnr_to_atom(mtop,edi->sav.anrs[i],&atom);
1201 edi->sav.m[i] = atom->m;
1204 edi->sav.sqrtm[i] = sqrt(atom->m);
1208 edi->sav.sqrtm[i] = 1.0;
1212 /* put reference structure in origin */
1213 get_center(edi->sref.x, edi->sref.m, edi->sref.nr, com);
1217 translate_x(edi->sref.x, edi->sref.nr, com);
1219 /* Init ED buffer */
1224 static void check(const char *line, const char *label)
1226 if (!strstr(line,label))
1227 gmx_fatal(FARGS,"Could not find input parameter %s at expected position in edsam input-file (.edi)\nline read instead is %s",label,line);
1231 static int read_checked_edint(FILE *file,const char *label)
1233 char line[STRLEN+1];
1237 fgets2 (line,STRLEN,file);
1239 fgets2 (line,STRLEN,file);
1240 sscanf (line,"%d",&idum);
1245 static int read_edint(FILE *file,gmx_bool *bEOF)
1247 char line[STRLEN+1];
1252 eof=fgets2 (line,STRLEN,file);
1258 eof=fgets2 (line,STRLEN,file);
1264 sscanf (line,"%d",&idum);
1270 static real read_checked_edreal(FILE *file,const char *label)
1272 char line[STRLEN+1];
1276 fgets2 (line,STRLEN,file);
1278 fgets2 (line,STRLEN,file);
1279 sscanf (line,"%lf",&rdum);
1280 return (real) rdum; /* always read as double and convert to single */
1284 static void read_edx(FILE *file,int number,int *anrs,rvec *x)
1287 char line[STRLEN+1];
1291 for(i=0; i<number; i++)
1293 fgets2 (line,STRLEN,file);
1294 sscanf (line,"%d%lf%lf%lf",&anrs[i],&d[0],&d[1],&d[2]);
1295 anrs[i]--; /* we are reading FORTRAN indices */
1297 x[i][j]=d[j]; /* always read as double and convert to single */
1302 static void scan_edvec(FILE *in,int nr,rvec *vec)
1304 char line[STRLEN+1];
1309 for(i=0; (i < nr); i++)
1311 fgets2 (line,STRLEN,in);
1312 sscanf (line,"%le%le%le",&x,&y,&z);
1320 static void read_edvec(FILE *in,int nr,t_eigvec *tvec,gmx_bool bReadRefproj)
1323 double rdum,refproj_dum=0.0,refprojslope_dum=0.0;
1324 char line[STRLEN+1];
1327 tvec->neig=read_checked_edint(in,"NUMBER OF EIGENVECTORS");
1330 snew(tvec->ieig ,tvec->neig);
1331 snew(tvec->stpsz ,tvec->neig);
1332 snew(tvec->vec ,tvec->neig);
1333 snew(tvec->xproj ,tvec->neig);
1334 snew(tvec->fproj ,tvec->neig);
1335 snew(tvec->refproj,tvec->neig);
1338 snew(tvec->refproj0 ,tvec->neig);
1339 snew(tvec->refprojslope,tvec->neig);
1342 for(i=0; (i < tvec->neig); i++)
1344 fgets2 (line,STRLEN,in);
1345 if (bReadRefproj) /* ONLY when using flooding as harmonic restraint */
1347 nscan = sscanf(line,"%d%lf%lf%lf",&idum,&rdum,&refproj_dum,&refprojslope_dum);
1348 /* Zero out values which were not scanned */
1352 /* Every 4 values read */
1355 /* No value for slope, set to 0 */
1356 refprojslope_dum = 0.0;
1359 /* No values for reference projection and slope, set to 0 */
1361 refprojslope_dum = 0.0;
1364 gmx_fatal(FARGS,"Expected 2 - 4 (not %d) values for flooding vec: <nr> <spring const> <refproj> <refproj-slope>\n", nscan);
1367 tvec->refproj[i]=refproj_dum;
1368 tvec->refproj0[i]=refproj_dum;
1369 tvec->refprojslope[i]=refprojslope_dum;
1371 else /* Normal flooding */
1373 nscan = sscanf(line,"%d%lf",&idum,&rdum);
1375 gmx_fatal(FARGS,"Expected 2 values for flooding vec: <nr> <stpsz>\n");
1378 tvec->stpsz[i]=rdum;
1379 } /* end of loop over eigenvectors */
1381 for(i=0; (i < tvec->neig); i++)
1383 snew(tvec->vec[i],nr);
1384 scan_edvec(in,nr,tvec->vec[i]);
1390 /* calls read_edvec for the vector groups, only for flooding there is an extra call */
1391 static void read_edvecs(FILE *in,int nr,t_edvecs *vecs)
1393 read_edvec(in,nr,&vecs->mon ,FALSE);
1394 read_edvec(in,nr,&vecs->linfix,FALSE);
1395 read_edvec(in,nr,&vecs->linacc,FALSE);
1396 read_edvec(in,nr,&vecs->radfix,FALSE);
1397 read_edvec(in,nr,&vecs->radacc,FALSE);
1398 read_edvec(in,nr,&vecs->radcon,FALSE);
1402 /* Check if the same atom indices are used for reference and average positions */
1403 static gmx_bool check_if_same(struct gmx_edx sref, struct gmx_edx sav)
1408 /* If the number of atoms differs between the two structures,
1409 * they cannot be identical */
1410 if (sref.nr != sav.nr)
1413 /* Now that we know that both stuctures have the same number of atoms,
1414 * check if also the indices are identical */
1415 for (i=0; i < sav.nr; i++)
1417 if (sref.anrs[i] != sav.anrs[i])
1420 fprintf(stderr, "ED: Note: Reference and average structure are composed of the same atom indices.\n");
1426 static int read_edi(FILE* in, gmx_edsam_t ed,t_edpar *edi,int nr_mdatoms, int edi_nr, t_commrec *cr)
1429 const int magic=669;
1433 /* the edi file is not free format, so expect problems if the input is corrupt. */
1435 /* check the magic number */
1436 readmagic=read_edint(in,&bEOF);
1437 /* Check whether we have reached the end of the input file */
1441 if (readmagic != magic)
1443 if (readmagic==666 || readmagic==667 || readmagic==668)
1444 gmx_fatal(FARGS,"Wrong magic number: Use newest version of make_edi to produce edi file");
1446 gmx_fatal(FARGS,"Wrong magic number %d in %s",readmagic,ed->edinam);
1449 /* check the number of atoms */
1450 edi->nini=read_edint(in,&bEOF);
1451 if (edi->nini != nr_mdatoms)
1452 gmx_fatal(FARGS,"Nr of atoms in %s (%d) does not match nr of md atoms (%d)",
1453 ed->edinam,edi->nini,nr_mdatoms);
1455 /* Done checking. For the rest we blindly trust the input */
1456 edi->fitmas = read_checked_edint(in,"FITMAS");
1457 edi->pcamas = read_checked_edint(in,"ANALYSIS_MAS");
1458 edi->outfrq = read_checked_edint(in,"OUTFRQ");
1459 edi->maxedsteps = read_checked_edint(in,"MAXLEN");
1460 edi->slope = read_checked_edreal(in,"SLOPECRIT");
1462 edi->presteps = read_checked_edint(in,"PRESTEPS");
1463 edi->flood.deltaF0 = read_checked_edreal(in,"DELTA_F0");
1464 edi->flood.deltaF = read_checked_edreal(in,"INIT_DELTA_F");
1465 edi->flood.tau = read_checked_edreal(in,"TAU");
1466 edi->flood.constEfl = read_checked_edreal(in,"EFL_NULL");
1467 edi->flood.alpha2 = read_checked_edreal(in,"ALPHA2");
1468 edi->flood.kT = read_checked_edreal(in,"KT");
1469 edi->flood.bHarmonic = read_checked_edint(in,"HARMONIC");
1470 edi->flood.flood_id = edi_nr;
1471 edi->sref.nr = read_checked_edint(in,"NREF");
1473 /* allocate space for reference positions and read them */
1474 snew(edi->sref.anrs,edi->sref.nr);
1475 snew(edi->sref.x ,edi->sref.nr);
1477 snew(edi->sref.x_old,edi->sref.nr);
1478 edi->sref.sqrtm =NULL;
1479 read_edx(in,edi->sref.nr,edi->sref.anrs,edi->sref.x);
1481 /* average positions. they define which atoms will be used for ED sampling */
1482 edi->sav.nr=read_checked_edint(in,"NAV");
1483 snew(edi->sav.anrs,edi->sav.nr);
1484 snew(edi->sav.x ,edi->sav.nr);
1486 snew(edi->sav.x_old,edi->sav.nr);
1487 read_edx(in,edi->sav.nr,edi->sav.anrs,edi->sav.x);
1489 /* Check if the same atom indices are used for reference and average positions */
1490 edi->bRefEqAv = check_if_same(edi->sref, edi->sav);
1493 read_edvecs(in,edi->sav.nr,&edi->vecs);
1494 read_edvec(in,edi->sav.nr,&edi->flood.vecs,edi->flood.bHarmonic);
1496 /* target positions */
1497 edi->star.nr=read_edint(in,&bEOF);
1498 if (edi->star.nr > 0)
1500 snew(edi->star.anrs,edi->star.nr);
1501 snew(edi->star.x ,edi->star.nr);
1502 edi->star.sqrtm =NULL;
1503 read_edx(in,edi->star.nr,edi->star.anrs,edi->star.x);
1506 /* positions defining origin of expansion circle */
1507 edi->sori.nr=read_edint(in,&bEOF);
1508 if (edi->sori.nr > 0)
1510 snew(edi->sori.anrs,edi->sori.nr);
1511 snew(edi->sori.x ,edi->sori.nr);
1512 edi->sori.sqrtm =NULL;
1513 read_edx(in,edi->sori.nr,edi->sori.anrs,edi->sori.x);
1522 /* Read in the edi input file. Note that it may contain several ED data sets which were
1523 * achieved by concatenating multiple edi files. The standard case would be a single ED
1524 * data set, though. */
1525 static void read_edi_file(gmx_edsam_t ed, t_edpar *edi, int nr_mdatoms, t_commrec *cr)
1528 t_edpar *curr_edi,*last_edi;
1533 /* This routine is executed on the master only */
1535 /* Open the .edi parameter input file */
1536 in = gmx_fio_fopen(ed->edinam,"r");
1537 fprintf(stderr, "ED: Reading edi file %s\n", ed->edinam);
1539 /* Now read a sequence of ED input parameter sets from the edi file */
1542 while( read_edi(in, ed, curr_edi, nr_mdatoms, edi_nr, cr) )
1545 /* Make shure that the number of atoms in each dataset is the same as in the tpr file */
1546 if (edi->nini != nr_mdatoms)
1547 gmx_fatal(FARGS,"edi file %s (dataset #%d) was made for %d atoms, but the simulation contains %d atoms.",
1548 ed->edinam, edi_nr, edi->nini, nr_mdatoms);
1549 /* Since we arrived within this while loop we know that there is still another data set to be read in */
1550 /* We need to allocate space for the data: */
1552 /* Point the 'next_edi' entry to the next edi: */
1553 curr_edi->next_edi=edi_read;
1554 /* Keep the curr_edi pointer for the case that the next dataset is empty: */
1555 last_edi = curr_edi;
1556 /* Let's prepare to read in the next edi data set: */
1557 curr_edi = edi_read;
1560 gmx_fatal(FARGS, "No complete ED data set found in edi file %s.", ed->edinam);
1562 /* Terminate the edi dataset list with a NULL pointer: */
1563 last_edi->next_edi = NULL;
1565 fprintf(stderr, "ED: Found %d ED dataset%s.\n", edi_nr, edi_nr>1? "s" : "");
1567 /* Close the .edi file again */
1572 struct t_fit_to_ref {
1573 rvec *xcopy; /* Working copy of the positions in fit_to_reference */
1576 /* Fit the current positions to the reference positions
1577 * Do not actually do the fit, just return rotation and translation.
1578 * Note that the COM of the reference structure was already put into
1579 * the origin by init_edi. */
1580 static void fit_to_reference(rvec *xcoll, /* The positions to be fitted */
1581 rvec transvec, /* The translation vector */
1582 matrix rotmat, /* The rotation matrix */
1583 t_edpar *edi) /* Just needed for do_edfit */
1585 rvec com; /* center of mass */
1587 struct t_fit_to_ref *loc;
1590 GMX_MPE_LOG(ev_fit_to_reference_start);
1592 /* Allocate memory the first time this routine is called for each edi dataset */
1593 if (NULL == edi->buf->fit_to_ref)
1595 snew(edi->buf->fit_to_ref, 1);
1596 snew(edi->buf->fit_to_ref->xcopy, edi->sref.nr);
1598 loc = edi->buf->fit_to_ref;
1600 /* We do not touch the original positions but work on a copy. */
1601 for (i=0; i<edi->sref.nr; i++)
1602 copy_rvec(xcoll[i], loc->xcopy[i]);
1604 /* Calculate the center of mass */
1605 get_center(loc->xcopy, edi->sref.m, edi->sref.nr, com);
1607 transvec[XX] = -com[XX];
1608 transvec[YY] = -com[YY];
1609 transvec[ZZ] = -com[ZZ];
1611 /* Subtract the center of mass from the copy */
1612 translate_x(loc->xcopy, edi->sref.nr, transvec);
1614 /* Determine the rotation matrix */
1615 do_edfit(edi->sref.nr, edi->sref.x, loc->xcopy, rotmat, edi);
1617 GMX_MPE_LOG(ev_fit_to_reference_finish);
1621 static void translate_and_rotate(rvec *x, /* The positions to be translated and rotated */
1622 int nat, /* How many positions are there? */
1623 rvec transvec, /* The translation vector */
1624 matrix rotmat) /* The rotation matrix */
1627 translate_x(x, nat, transvec);
1630 rotate_x(x, nat, rotmat);
1634 /* Gets the rms deviation of the positions to the structure s */
1635 /* fit_to_structure has to be called before calling this routine! */
1636 static real rmsd_from_structure(rvec *x, /* The positions under consideration */
1637 struct gmx_edx *s) /* The structure from which the rmsd shall be computed */
1643 for (i=0; i < s->nr; i++)
1644 rmsd += distance2(s->x[i], x[i]);
1646 rmsd /= (real) s->nr;
1653 void dd_make_local_ed_indices(gmx_domdec_t *dd, struct gmx_edsam *ed)
1658 if (ed->eEDtype != eEDnone)
1660 /* Loop over ED datasets (usually there is just one dataset, though) */
1664 /* Local atoms of the reference structure (for fitting), need only be assembled
1665 * if their indices differ from the average ones */
1667 dd_make_local_group_indices(dd->ga2la, edi->sref.nr, edi->sref.anrs,
1668 &edi->sref.nr_loc, &edi->sref.anrs_loc, &edi->sref.nalloc_loc, edi->sref.c_ind);
1670 /* Local atoms of the average structure (on these ED will be performed) */
1671 dd_make_local_group_indices(dd->ga2la, edi->sav.nr, edi->sav.anrs,
1672 &edi->sav.nr_loc, &edi->sav.anrs_loc, &edi->sav.nalloc_loc, edi->sav.c_ind);
1674 /* Indicate that the ED shift vectors for this structure need to be updated
1675 * at the next call to communicate_group_positions, since obviously we are in a NS step */
1676 edi->buf->do_edsam->bUpdateShifts = TRUE;
1678 /* Set the pointer to the next ED dataset (if any) */
1685 static inline void ed_unshift_single_coord(matrix box, const rvec x, const ivec is, rvec xu)
1690 GMX_MPE_LOG(ev_unshift_start);
1698 xu[XX] = x[XX]-tx*box[XX][XX]-ty*box[YY][XX]-tz*box[ZZ][XX];
1699 xu[YY] = x[YY]-ty*box[YY][YY]-tz*box[ZZ][YY];
1700 xu[ZZ] = x[ZZ]-tz*box[ZZ][ZZ];
1703 xu[XX] = x[XX]-tx*box[XX][XX];
1704 xu[YY] = x[YY]-ty*box[YY][YY];
1705 xu[ZZ] = x[ZZ]-tz*box[ZZ][ZZ];
1708 GMX_MPE_LOG(ev_unshift_finish);
1712 static void do_linfix(rvec *xcoll, t_edpar *edi, int step, t_commrec *cr)
1719 /* loop over linfix vectors */
1720 for (i=0; i<edi->vecs.linfix.neig; i++)
1722 /* calculate the projection */
1723 proj = projectx(edi, xcoll, edi->vecs.linfix.vec[i]);
1725 /* calculate the correction */
1726 add = edi->vecs.linfix.refproj[i] + step*edi->vecs.linfix.stpsz[i] - proj;
1728 /* apply the correction */
1729 add /= edi->sav.sqrtm[i];
1730 for (j=0; j<edi->sav.nr; j++)
1732 svmul(add, edi->vecs.linfix.vec[i][j], vec_dum);
1733 rvec_inc(xcoll[j], vec_dum);
1739 static void do_linacc(rvec *xcoll, t_edpar *edi, t_commrec *cr)
1746 /* loop over linacc vectors */
1747 for (i=0; i<edi->vecs.linacc.neig; i++)
1749 /* calculate the projection */
1750 proj=projectx(edi, xcoll, edi->vecs.linacc.vec[i]);
1752 /* calculate the correction */
1754 if (edi->vecs.linacc.stpsz[i] > 0.0)
1756 if ((proj-edi->vecs.linacc.refproj[i]) < 0.0)
1757 add = edi->vecs.linacc.refproj[i] - proj;
1759 if (edi->vecs.linacc.stpsz[i] < 0.0)
1761 if ((proj-edi->vecs.linacc.refproj[i]) > 0.0)
1762 add = edi->vecs.linacc.refproj[i] - proj;
1765 /* apply the correction */
1766 add /= edi->sav.sqrtm[i];
1767 for (j=0; j<edi->sav.nr; j++)
1769 svmul(add, edi->vecs.linacc.vec[i][j], vec_dum);
1770 rvec_inc(xcoll[j], vec_dum);
1773 /* new positions will act as reference */
1774 edi->vecs.linacc.refproj[i] = proj + add;
1779 static void do_radfix(rvec *xcoll, t_edpar *edi, int step, t_commrec *cr)
1782 real *proj, rad=0.0, ratio;
1786 if (edi->vecs.radfix.neig == 0)
1789 snew(proj, edi->vecs.radfix.neig);
1791 /* loop over radfix vectors */
1792 for (i=0; i<edi->vecs.radfix.neig; i++)
1794 /* calculate the projections, radius */
1795 proj[i] = projectx(edi, xcoll, edi->vecs.radfix.vec[i]);
1796 rad += pow(proj[i] - edi->vecs.radfix.refproj[i], 2);
1800 ratio = (edi->vecs.radfix.stpsz[0]+edi->vecs.radfix.radius)/rad - 1.0;
1801 edi->vecs.radfix.radius += edi->vecs.radfix.stpsz[0];
1803 /* loop over radfix vectors */
1804 for (i=0; i<edi->vecs.radfix.neig; i++)
1806 proj[i] -= edi->vecs.radfix.refproj[i];
1808 /* apply the correction */
1809 proj[i] /= edi->sav.sqrtm[i];
1811 for (j=0; j<edi->sav.nr; j++) {
1812 svmul(proj[i], edi->vecs.radfix.vec[i][j], vec_dum);
1813 rvec_inc(xcoll[j], vec_dum);
1821 static void do_radacc(rvec *xcoll, t_edpar *edi, t_commrec *cr)
1824 real *proj, rad=0.0, ratio=0.0;
1828 if (edi->vecs.radacc.neig == 0)
1831 snew(proj,edi->vecs.radacc.neig);
1833 /* loop over radacc vectors */
1834 for (i=0; i<edi->vecs.radacc.neig; i++)
1836 /* calculate the projections, radius */
1837 proj[i] = projectx(edi, xcoll, edi->vecs.radacc.vec[i]);
1838 rad += pow(proj[i] - edi->vecs.radacc.refproj[i], 2);
1842 /* only correct when radius decreased */
1843 if (rad < edi->vecs.radacc.radius)
1845 ratio = edi->vecs.radacc.radius/rad - 1.0;
1846 rad = edi->vecs.radacc.radius;
1849 edi->vecs.radacc.radius = rad;
1851 /* loop over radacc vectors */
1852 for (i=0; i<edi->vecs.radacc.neig; i++)
1854 proj[i] -= edi->vecs.radacc.refproj[i];
1856 /* apply the correction */
1857 proj[i] /= edi->sav.sqrtm[i];
1859 for (j=0; j<edi->sav.nr; j++)
1861 svmul(proj[i], edi->vecs.radacc.vec[i][j], vec_dum);
1862 rvec_inc(xcoll[j], vec_dum);
1869 struct t_do_radcon {
1873 static void do_radcon(rvec *xcoll, t_edpar *edi, t_commrec *cr)
1876 real rad=0.0, ratio=0.0;
1877 struct t_do_radcon *loc;
1882 if(edi->buf->do_radcon != NULL)
1885 loc = edi->buf->do_radcon;
1890 snew(edi->buf->do_radcon, 1);
1892 loc = edi->buf->do_radcon;
1894 if (edi->vecs.radcon.neig == 0)
1898 snew(loc->proj, edi->vecs.radcon.neig);
1900 /* loop over radcon vectors */
1901 for (i=0; i<edi->vecs.radcon.neig; i++)
1903 /* calculate the projections, radius */
1904 loc->proj[i] = projectx(edi, xcoll, edi->vecs.radcon.vec[i]);
1905 rad += pow(loc->proj[i] - edi->vecs.radcon.refproj[i], 2);
1908 /* only correct when radius increased */
1909 if (rad > edi->vecs.radcon.radius)
1911 ratio = edi->vecs.radcon.radius/rad - 1.0;
1913 /* loop over radcon vectors */
1914 for (i=0; i<edi->vecs.radcon.neig; i++)
1916 /* apply the correction */
1917 loc->proj[i] -= edi->vecs.radcon.refproj[i];
1918 loc->proj[i] /= edi->sav.sqrtm[i];
1919 loc->proj[i] *= ratio;
1921 for (j=0; j<edi->sav.nr; j++)
1923 svmul(loc->proj[i], edi->vecs.radcon.vec[i][j], vec_dum);
1924 rvec_inc(xcoll[j], vec_dum);
1929 edi->vecs.radcon.radius = rad;
1931 if (rad != edi->vecs.radcon.radius)
1934 for (i=0; i<edi->vecs.radcon.neig; i++)
1936 /* calculate the projections, radius */
1937 loc->proj[i] = projectx(edi, xcoll, edi->vecs.radcon.vec[i]);
1938 rad += pow(loc->proj[i] - edi->vecs.radcon.refproj[i], 2);
1945 static void ed_apply_constraints(rvec *xcoll, t_edpar *edi, gmx_large_int_t step, t_commrec *cr)
1950 GMX_MPE_LOG(ev_ed_apply_cons_start);
1952 /* subtract the average positions */
1953 for (i=0; i<edi->sav.nr; i++)
1954 rvec_dec(xcoll[i], edi->sav.x[i]);
1956 /* apply the constraints */
1958 do_linfix(xcoll, edi, step, cr);
1959 do_linacc(xcoll, edi, cr);
1961 do_radfix(xcoll, edi, step, cr);
1962 do_radacc(xcoll, edi, cr);
1963 do_radcon(xcoll, edi, cr);
1965 /* add back the average positions */
1966 for (i=0; i<edi->sav.nr; i++)
1967 rvec_inc(xcoll[i], edi->sav.x[i]);
1969 GMX_MPE_LOG(ev_ed_apply_cons_finish);
1973 /* Write out the projections onto the eigenvectors */
1974 static void write_edo(int nr_edi, t_edpar *edi, gmx_edsam_t ed, gmx_large_int_t step,real rmsd)
1980 if (edi->bNeedDoEdsam)
1983 fprintf(ed->edo, "Initial projections:\n");
1986 fprintf(ed->edo,"Step %s, ED #%d ", gmx_step_str(step, buf), nr_edi);
1987 fprintf(ed->edo," RMSD %f nm\n",rmsd);
1988 if (ed->eEDtype == eEDflood)
1989 fprintf(ed->edo, " Efl=%f deltaF=%f Vfl=%f\n",edi->flood.Efl,edi->flood.deltaF,edi->flood.Vfl);
1992 if (edi->vecs.mon.neig)
1994 fprintf(ed->edo," Monitor eigenvectors");
1995 for (i=0; i<edi->vecs.mon.neig; i++)
1996 fprintf(ed->edo," %d: %12.5e ",edi->vecs.mon.ieig[i],edi->vecs.mon.xproj[i]);
1997 fprintf(ed->edo,"\n");
1999 if (edi->vecs.linfix.neig)
2001 fprintf(ed->edo," Linfix eigenvectors");
2002 for (i=0; i<edi->vecs.linfix.neig; i++)
2003 fprintf(ed->edo," %d: %12.5e ",edi->vecs.linfix.ieig[i],edi->vecs.linfix.xproj[i]);
2004 fprintf(ed->edo,"\n");
2006 if (edi->vecs.linacc.neig)
2008 fprintf(ed->edo," Linacc eigenvectors");
2009 for (i=0; i<edi->vecs.linacc.neig; i++)
2010 fprintf(ed->edo," %d: %12.5e ",edi->vecs.linacc.ieig[i],edi->vecs.linacc.xproj[i]);
2011 fprintf(ed->edo,"\n");
2013 if (edi->vecs.radfix.neig)
2015 fprintf(ed->edo," Radfix eigenvectors");
2016 for (i=0; i<edi->vecs.radfix.neig; i++)
2017 fprintf(ed->edo," %d: %12.5e ",edi->vecs.radfix.ieig[i],edi->vecs.radfix.xproj[i]);
2018 fprintf(ed->edo,"\n");
2019 fprintf(ed->edo," fixed increment radius = %f\n", calc_radius(&edi->vecs.radfix));
2021 if (edi->vecs.radacc.neig)
2023 fprintf(ed->edo," Radacc eigenvectors");
2024 for (i=0; i<edi->vecs.radacc.neig; i++)
2025 fprintf(ed->edo," %d: %12.5e ",edi->vecs.radacc.ieig[i],edi->vecs.radacc.xproj[i]);
2026 fprintf(ed->edo,"\n");
2027 fprintf(ed->edo," acceptance radius = %f\n", calc_radius(&edi->vecs.radacc));
2029 if (edi->vecs.radcon.neig)
2031 fprintf(ed->edo," Radcon eigenvectors");
2032 for (i=0; i<edi->vecs.radcon.neig; i++)
2033 fprintf(ed->edo," %d: %12.5e ",edi->vecs.radcon.ieig[i],edi->vecs.radcon.xproj[i]);
2034 fprintf(ed->edo,"\n");
2035 fprintf(ed->edo," contracting radius = %f\n", calc_radius(&edi->vecs.radcon));
2040 /* Returns if any constraints are switched on */
2041 static int ed_constraints(gmx_bool edtype, t_edpar *edi)
2043 if (edtype == eEDedsam || edtype == eEDflood)
2045 return (edi->vecs.linfix.neig || edi->vecs.linacc.neig ||
2046 edi->vecs.radfix.neig || edi->vecs.radacc.neig ||
2047 edi->vecs.radcon.neig);
2053 void init_edsam(gmx_mtop_t *mtop, /* global topology */
2054 t_inputrec *ir, /* input record */
2055 t_commrec *cr, /* communication record */
2056 gmx_edsam_t ed, /* contains all ED data */
2057 rvec x[], /* positions of the whole MD system */
2058 matrix box) /* the box */
2060 t_edpar *edi = NULL; /* points to a single edi data set */
2061 int numedis=0; /* keep track of the number of ED data sets in edi file */
2063 rvec *x_pbc = NULL; /* positions of the whole MD system with pbc removed */
2064 rvec *xfit = NULL; /* the positions which will be fitted to the reference structure */
2065 rvec *xstart = NULL; /* the positions which are subject to ED sampling */
2066 rvec fit_transvec; /* translation ... */
2067 matrix fit_rotmat; /* ... and rotation from fit to reference structure */
2070 if (!DOMAINDECOMP(cr) && PAR(cr) && MASTER(cr))
2071 gmx_fatal(FARGS, "Please switch on domain decomposition to use essential dynamics in parallel.");
2073 GMX_MPE_LOG(ev_edsam_start);
2076 fprintf(stderr, "ED: Initializing essential dynamics constraints.\n");
2078 /* Needed for initializing radacc radius in do_edsam */
2081 /* The input file is read by the master and the edi structures are
2082 * initialized here. Input is stored in ed->edpar. Then the edi
2083 * structures are transferred to the other nodes */
2087 /* Read the whole edi file at once: */
2088 read_edi_file(ed,ed->edpar,mtop->natoms,cr);
2090 /* Initialization for every ED/flooding dataset. Flooding uses one edi dataset per
2091 * flooding vector, Essential dynamics can be applied to more than one structure
2092 * as well, but will be done in the order given in the edi file, so
2093 * expect different results for different order of edi file concatenation! */
2097 init_edi(mtop,ir,cr,ed,edi);
2099 /* Init flooding parameters if needed */
2100 init_flood(edi,ed,ir->delta_t,cr);
2107 /* The master does the work here. The other nodes get the positions
2108 * not before dd_partition_system which is called after init_edsam */
2111 /* Remove pbc, make molecule whole.
2112 * When ir->bContinuation=TRUE this has already been done, but ok.
2114 snew(x_pbc,mtop->natoms);
2115 m_rveccopy(mtop->natoms,x,x_pbc);
2116 do_pbc_first_mtop(NULL,ir->ePBC,box,mtop,x_pbc);
2118 /* Reset pointer to first ED data set which contains the actual ED data */
2121 /* Loop over all ED/flooding data sets (usually only one, though) */
2122 for (nr_edi = 1; nr_edi <= numedis; nr_edi++)
2124 /* We use srenew to allocate memory since the size of the buffers
2125 * is likely to change with every ED dataset */
2126 srenew(xfit , edi->sref.nr );
2127 srenew(xstart, edi->sav.nr );
2129 /* Extract the positions of the atoms to which will be fitted */
2130 for (i=0; i < edi->sref.nr; i++)
2132 copy_rvec(x_pbc[edi->sref.anrs[i]], xfit[i]);
2134 /* Save the sref positions such that in the next time step the molecule can
2135 * be made whole again (in the parallel case) */
2137 copy_rvec(xfit[i], edi->sref.x_old[i]);
2140 /* Extract the positions of the atoms subject to ED sampling */
2141 for (i=0; i < edi->sav.nr; i++)
2143 copy_rvec(x_pbc[edi->sav.anrs[i]], xstart[i]);
2145 /* Save the sav positions such that in the next time step the molecule can
2146 * be made whole again (in the parallel case) */
2148 copy_rvec(xstart[i], edi->sav.x_old[i]);
2151 /* Make the fit to the REFERENCE structure, get translation and rotation */
2152 fit_to_reference(xfit, fit_transvec, fit_rotmat, edi);
2154 /* Output how well we fit to the reference at the start */
2155 translate_and_rotate(xfit, edi->sref.nr, fit_transvec, fit_rotmat);
2156 fprintf(stderr, "ED: Initial RMSD from reference after fit = %f nm (dataset #%d)\n",
2157 rmsd_from_structure(xfit, &edi->sref), nr_edi);
2159 /* Now apply the translation and rotation to the atoms on which ED sampling will be performed */
2160 translate_and_rotate(xstart, edi->sav.nr, fit_transvec, fit_rotmat);
2162 /* calculate initial projections */
2163 project(xstart, edi);
2165 /* process target structure, if required */
2166 if (edi->star.nr > 0)
2168 fprintf(stderr, "ED: Fitting target structure to reference structure\n");
2169 /* get translation & rotation for fit of target structure to reference structure */
2170 fit_to_reference(edi->star.x, fit_transvec, fit_rotmat, edi);
2172 translate_and_rotate(edi->star.x, edi->sav.nr, fit_transvec, fit_rotmat);
2173 rad_project(edi, edi->star.x, &edi->vecs.radcon, cr);
2175 rad_project(edi, xstart, &edi->vecs.radcon, cr);
2177 /* process structure that will serve as origin of expansion circle */
2178 if (eEDflood == ed->eEDtype)
2179 fprintf(stderr, "ED: Setting center of flooding potential (0 = average structure)\n");
2180 if (edi->sori.nr > 0)
2182 fprintf(stderr, "ED: Fitting origin structure to reference structure\n");
2183 /* fit this structure to reference structure */
2184 fit_to_reference(edi->sori.x, fit_transvec, fit_rotmat, edi);
2186 translate_and_rotate(edi->sori.x, edi->sav.nr, fit_transvec, fit_rotmat);
2187 rad_project(edi, edi->sori.x, &edi->vecs.radacc, cr);
2188 rad_project(edi, edi->sori.x, &edi->vecs.radfix, cr);
2189 if (ed->eEDtype == eEDflood)
2191 fprintf(stderr, "ED: The ORIGIN structure will define the flooding potential center.\n");
2192 /* Set center of flooding potential to the ORIGIN structure */
2193 rad_project(edi, edi->sori.x, &edi->flood.vecs, cr);
2196 else /* No origin structure given */
2198 rad_project(edi, xstart, &edi->vecs.radacc, cr);
2199 rad_project(edi, xstart, &edi->vecs.radfix, cr);
2200 if (ed->eEDtype == eEDflood)
2202 if (edi->flood.bHarmonic)
2204 fprintf(stderr, "ED: A (possibly changing) ref. projection will define the flooding potential center.\n");
2205 for (i=0; i<edi->flood.vecs.neig; i++)
2206 edi->flood.vecs.refproj[i] = edi->flood.vecs.refproj0[i];
2210 fprintf(stderr, "ED: The AVERAGE structure will define the flooding potential center.\n");
2211 /* Set center of flooding potential to the center of the covariance matrix,
2212 * i.e. the average structure, i.e. zero in the projected system */
2213 for (i=0; i<edi->flood.vecs.neig; i++)
2214 edi->flood.vecs.refproj[i] = 0.0;
2218 /* For convenience, output the center of the flooding potential for the eigenvectors */
2219 if (eEDflood == ed->eEDtype)
2221 for (i=0; i<edi->flood.vecs.neig; i++)
2223 fprintf(stdout, "ED: EV %d flooding potential center: %11.4e (adding %11.4e/timestep)\n",
2224 i, edi->flood.vecs.refproj[i], edi->flood.vecs.refprojslope[i]);
2228 /* set starting projections for linsam */
2229 rad_project(edi, xstart, &edi->vecs.linacc, cr);
2230 rad_project(edi, xstart, &edi->vecs.linfix, cr);
2232 /* Output to file, set the step to -1 so that write_edo knows it was called from init_edsam */
2233 if (ed->edo && !(ed->bStartFromCpt))
2234 write_edo(nr_edi, edi, ed, -1, 0);
2236 /* Prepare for the next edi data set: */
2239 /* Cleaning up on the master node: */
2244 } /* end of MASTER only section */
2248 /* First let everybody know how many ED data sets to expect */
2249 gmx_bcast(sizeof(numedis), &numedis, cr);
2250 /* Broadcast the essential dynamics / flooding data to all nodes */
2251 broadcast_ed_data(cr, ed, numedis);
2255 /* In the single-CPU case, point the local atom numbers pointers to the global
2256 * one, so that we can use the same notation in serial and parallel case: */
2258 /* Loop over all ED data sets (usually only one, though) */
2260 for (nr_edi = 1; nr_edi <= numedis; nr_edi++)
2262 edi->sref.anrs_loc = edi->sref.anrs;
2263 edi->sav.anrs_loc = edi->sav.anrs;
2264 edi->star.anrs_loc = edi->star.anrs;
2265 edi->sori.anrs_loc = edi->sori.anrs;
2266 /* For the same reason as above, make a dummy c_ind array: */
2267 snew(edi->sav.c_ind, edi->sav.nr);
2268 /* Initialize the array */
2269 for (i=0; i<edi->sav.nr; i++)
2270 edi->sav.c_ind[i] = i;
2271 /* In the general case we will need a different-sized array for the reference indices: */
2274 snew(edi->sref.c_ind, edi->sref.nr);
2275 for (i=0; i<edi->sref.nr; i++)
2276 edi->sref.c_ind[i] = i;
2278 /* Point to the very same array in case of other structures: */
2279 edi->star.c_ind = edi->sav.c_ind;
2280 edi->sori.c_ind = edi->sav.c_ind;
2281 /* In the serial case, the local number of atoms is the global one: */
2282 edi->sref.nr_loc = edi->sref.nr;
2283 edi->sav.nr_loc = edi->sav.nr;
2284 edi->star.nr_loc = edi->star.nr;
2285 edi->sori.nr_loc = edi->sori.nr;
2287 /* An on we go to the next edi dataset */
2292 /* Allocate space for ED buffer variables */
2293 /* Again, loop over ED data sets */
2295 for (nr_edi = 1; nr_edi <= numedis; nr_edi++)
2297 /* Allocate space for ED buffer */
2299 snew(edi->buf->do_edsam, 1);
2301 /* Space for collective ED buffer variables */
2303 /* Collective positions of atoms with the average indices */
2304 snew(edi->buf->do_edsam->xcoll , edi->sav.nr);
2305 snew(edi->buf->do_edsam->shifts_xcoll , edi->sav.nr); /* buffer for xcoll shifts */
2306 snew(edi->buf->do_edsam->extra_shifts_xcoll , edi->sav.nr);
2307 /* Collective positions of atoms with the reference indices */
2310 snew(edi->buf->do_edsam->xc_ref , edi->sref.nr);
2311 snew(edi->buf->do_edsam->shifts_xc_ref , edi->sref.nr); /* To store the shifts in */
2312 snew(edi->buf->do_edsam->extra_shifts_xc_ref, edi->sref.nr);
2315 /* Get memory for flooding forces */
2316 snew(edi->flood.forces_cartesian , edi->sav.nr);
2319 /* Dump it all into one file per process */
2320 dump_edi(edi, cr, nr_edi);
2323 /* An on we go to the next edi dataset */
2327 /* Flush the edo file so that the user can check some things
2328 * when the simulation has started */
2332 GMX_MPE_LOG(ev_edsam_finish);
2336 void do_edsam(t_inputrec *ir,
2337 gmx_large_int_t step,
2340 rvec xs[], /* The local current positions on this processor */
2341 rvec v[], /* The velocities */
2345 int i,edinr,iupdate=500;
2346 matrix rotmat; /* rotation matrix */
2347 rvec transvec; /* translation vector */
2348 rvec dv,dx,x_unsh; /* tmp vectors for velocity, distance, unshifted x coordinate */
2349 real dt_1; /* 1/dt */
2350 struct t_do_edsam *buf;
2352 real rmsdev=-1; /* RMSD from reference structure prior to applying the constraints */
2353 gmx_bool bSuppress=FALSE; /* Write .edo file on master? */
2356 /* Check if ED sampling has to be performed */
2357 if ( ed->eEDtype==eEDnone )
2360 /* Suppress output on first call of do_edsam if
2361 * two-step sd2 integrator is used */
2362 if ( (ir->eI==eiSD2) && (v != NULL) )
2365 dt_1 = 1.0/ir->delta_t;
2367 /* Loop over all ED datasets (usually one) */
2373 if (edi->bNeedDoEdsam)
2376 buf=edi->buf->do_edsam;
2379 /* initialise radacc radius for slope criterion */
2380 buf->oldrad=calc_radius(&edi->vecs.radacc);
2382 /* Copy the positions into buf->xc* arrays and after ED
2383 * feed back corrections to the official positions */
2385 /* Broadcast the ED positions such that every node has all of them
2386 * Every node contributes its local positions xs and stores it in
2387 * the collective buf->xcoll array. Note that for edinr > 1
2388 * xs could already have been modified by an earlier ED */
2390 communicate_group_positions(cr, buf->xcoll, buf->shifts_xcoll, buf->extra_shifts_xcoll, buf->bUpdateShifts, xs,
2391 edi->sav.nr, edi->sav.nr_loc, edi->sav.anrs_loc, edi->sav.c_ind, edi->sav.x_old, box);
2394 dump_xcoll(edi, buf, cr, step);
2396 /* Only assembly reference positions if their indices differ from the average ones */
2398 communicate_group_positions(cr, buf->xc_ref, buf->shifts_xc_ref, buf->extra_shifts_xc_ref, buf->bUpdateShifts, xs,
2399 edi->sref.nr, edi->sref.nr_loc, edi->sref.anrs_loc, edi->sref.c_ind, edi->sref.x_old, box);
2401 /* If bUpdateShifts was TRUE then the shifts have just been updated in get_positions.
2402 * We do not need to uptdate the shifts until the next NS step */
2403 buf->bUpdateShifts = FALSE;
2405 /* Now all nodes have all of the ED positions in edi->sav->xcoll,
2406 * as well as the indices in edi->sav.anrs */
2408 /* Fit the reference indices to the reference structure */
2410 fit_to_reference(buf->xcoll , transvec, rotmat, edi);
2412 fit_to_reference(buf->xc_ref, transvec, rotmat, edi);
2414 /* Now apply the translation and rotation to the ED structure */
2415 translate_and_rotate(buf->xcoll, edi->sav.nr, transvec, rotmat);
2417 /* Find out how well we fit to the reference (just for output steps) */
2418 if (do_per_step(step,edi->outfrq) && MASTER(cr))
2422 /* Indices of reference and average structures are identical,
2423 * thus we can calculate the rmsd to SREF using xcoll */
2424 rmsdev = rmsd_from_structure(buf->xcoll,&edi->sref);
2428 /* We have to translate & rotate the reference atoms first */
2429 translate_and_rotate(buf->xc_ref, edi->sref.nr, transvec, rotmat);
2430 rmsdev = rmsd_from_structure(buf->xc_ref,&edi->sref);
2434 /* update radsam references, when required */
2435 if (do_per_step(step,edi->maxedsteps) && step >= edi->presteps)
2437 project(buf->xcoll, edi);
2438 rad_project(edi, buf->xcoll, &edi->vecs.radacc, cr);
2439 rad_project(edi, buf->xcoll, &edi->vecs.radfix, cr);
2443 /* update radacc references, when required */
2444 if (do_per_step(step,iupdate) && step >= edi->presteps)
2446 edi->vecs.radacc.radius = calc_radius(&edi->vecs.radacc);
2447 if (edi->vecs.radacc.radius - buf->oldrad < edi->slope)
2449 project(buf->xcoll, edi);
2450 rad_project(edi, buf->xcoll, &edi->vecs.radacc, cr);
2453 buf->oldrad = edi->vecs.radacc.radius;
2456 /* apply the constraints */
2457 if (step >= edi->presteps && ed_constraints(ed->eEDtype, edi))
2459 /* ED constraints should be applied already in the first MD step
2460 * (which is step 0), therefore we pass step+1 to the routine */
2461 ed_apply_constraints(buf->xcoll, edi, step+1 - ir->init_step, cr);
2464 /* write to edo, when required */
2465 if (do_per_step(step,edi->outfrq))
2467 project(buf->xcoll, edi);
2468 if (MASTER(cr) && !bSuppress)
2469 write_edo(edinr, edi, ed, step, rmsdev);
2472 /* Copy back the positions unless monitoring only */
2473 if (ed_constraints(ed->eEDtype, edi))
2475 /* remove fitting */
2476 rmfit(edi->sav.nr, buf->xcoll, transvec, rotmat);
2478 /* Copy the ED corrected positions into the coordinate array */
2479 /* Each node copies its local part. In the serial case, nat_loc is the
2480 * total number of ED atoms */
2481 for (i=0; i<edi->sav.nr_loc; i++)
2483 /* Unshift local ED coordinate and store in x_unsh */
2484 ed_unshift_single_coord(box, buf->xcoll[edi->sav.c_ind[i]],
2485 buf->shifts_xcoll[edi->sav.c_ind[i]], x_unsh);
2487 /* dx is the ED correction to the positions: */
2488 rvec_sub(x_unsh, xs[edi->sav.anrs_loc[i]], dx);
2492 /* dv is the ED correction to the velocity: */
2493 svmul(dt_1, dx, dv);
2494 /* apply the velocity correction: */
2495 rvec_inc(v[edi->sav.anrs_loc[i]], dv);
2497 /* Finally apply the position correction due to ED: */
2498 copy_rvec(x_unsh, xs[edi->sav.anrs_loc[i]]);
2501 } /* END of if (edi->bNeedDoEdsam) */
2503 /* Prepare for the next ED dataset */
2504 edi = edi->next_edi;
2506 } /* END of loop over ED datasets */
2510 GMX_MPE_LOG(ev_edsam_finish);