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.
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
21 * If you want to redistribute modifications, please consider that
22 * scientific software is very special. Version control is crucial -
23 * bugs must be traceable. We will be happy to consider code for
24 * inclusion in the official distribution, but derived work must not
25 * be called official GROMACS. Details are found in the README & COPYING
26 * files - if they are missing, get the official version at www.gromacs.org.
28 * To help us fund GROMACS development, we humbly ask that you cite
29 * the papers on the package - you can find them in the top README file.
31 * For more info, check our website at http://www.gromacs.org
34 * GROwing Monsters And Cloning Shrimps
56 #include "mtop_util.h"
59 typedef struct gmx_constr
{
60 int ncon_tot
; /* The total number of constraints */
61 int nflexcon
; /* The number of flexible constraints */
62 int n_at2con_mt
; /* The size of at2con = #moltypes */
63 t_blocka
*at2con_mt
; /* A list of atoms to constraints */
64 gmx_lincsdata_t lincsd
; /* LINCS data */
65 gmx_shakedata_t shaked
; /* SHAKE data */
66 gmx_settledata_t settled
; /* SETTLE data */
67 int nblocks
; /* The number of SHAKE blocks */
68 int *sblock
; /* The SHAKE blocks */
69 int sblock_nalloc
;/* The allocation size of sblock */
70 real
*lagr
; /* Lagrange multipliers for SHAKE */
71 int lagr_nalloc
; /* The allocation size of lagr */
72 int maxwarn
; /* The maximum number of warnings */
75 gmx_edsam_t ed
; /* The essential dynamics data */
77 gmx_mtop_t
*warn_mtop
; /* Only used for printing warnings */
85 t_vetavars
*init_vetavars(real veta
,real vetanew
, t_inputrec
*ir
)
92 snew(vars
->vscale_nhc
,ir
->opts
.ngtc
);
93 /* first, set the alpha integrator variable */
94 if (ir
->opts
.nrdf
[0] > 0)
96 vars
->alpha
= 1.0 + DIM
/((double)ir
->opts
.nrdf
[0]);
100 g
= 0.5*veta
*ir
->delta_t
;
101 vars
->rscale
= exp(g
)*series_sinhx(g
);
102 g
= -0.25*vars
->alpha
*veta
*ir
->delta_t
;
103 vars
->vscale
= exp(g
)*series_sinhx(g
);
104 vars
->rvscale
= vars
->vscale
*vars
->rscale
;
105 vars
->veta
= vetanew
;
106 for (i
=0;i
<ir
->opts
.ngtc
;i
++)
108 vars
->vscale_nhc
[i
] = ir
->opts
.vscale_nhc
[i
];
114 void free_vetavars(t_vetavars
*vars
)
116 sfree(vars
->vscale_nhc
);
120 static int pcomp(const void *p1
, const void *p2
)
123 atom_id min1
,min2
,max1
,max2
;
124 t_sortblock
*a1
=(t_sortblock
*)p1
;
125 t_sortblock
*a2
=(t_sortblock
*)p2
;
127 db
=a1
->blocknr
-a2
->blocknr
;
132 min1
=min(a1
->iatom
[1],a1
->iatom
[2]);
133 max1
=max(a1
->iatom
[1],a1
->iatom
[2]);
134 min2
=min(a2
->iatom
[1],a2
->iatom
[2]);
135 max2
=max(a2
->iatom
[1],a2
->iatom
[2]);
143 static int icomp(const void *p1
, const void *p2
)
145 atom_id
*a1
=(atom_id
*)p1
;
146 atom_id
*a2
=(atom_id
*)p2
;
151 int n_flexible_constraints(struct gmx_constr
*constr
)
156 nflexcon
= constr
->nflexcon
;
163 void too_many_constraint_warnings(int eConstrAlg
,int warncount
)
165 const char *abort
="- aborting to avoid logfile runaway.\n"
166 "This normally happens when your system is not sufficiently equilibrated,"
167 "or if you are changing lambda too fast in free energy simulations.\n";
170 "Too many %s warnings (%d)\n"
171 "If you know what you are doing you can %s"
172 "set the environment variable GMX_MAXCONSTRWARN to -1,\n"
173 "but normally it is better to fix the problem",
174 (eConstrAlg
== econtLINCS
) ? "LINCS" : "SETTLE",warncount
,
175 (eConstrAlg
== econtLINCS
) ?
176 "adjust the lincs warning threshold in your mdp file\nor " : "\n");
179 static void write_constr_pdb(const char *fn
,const char *title
,
181 int start
,int homenr
,t_commrec
*cr
,
184 char fname
[STRLEN
],format
[STRLEN
];
186 int dd_ac0
=0,dd_ac1
=0,i
,ii
,resnr
;
192 sprintf(fname
,"%s_n%d.pdb",fn
,cr
->sim_nodeid
);
193 if (DOMAINDECOMP(cr
)) {
195 dd_get_constraint_range(dd
,&dd_ac0
,&dd_ac1
);
200 sprintf(fname
,"%s.pdb",fn
);
202 sprintf(format
,"%s\n",pdbformat
);
204 out
= gmx_fio_fopen(fname
,"w");
206 fprintf(out
,"TITLE %s\n",title
);
207 gmx_write_pdb_box(out
,-1,box
);
208 for(i
=start
; i
<start
+homenr
; i
++) {
210 if (i
>= dd
->nat_home
&& i
< dd_ac0
)
212 ii
= dd
->gatindex
[i
];
216 gmx_mtop_atominfo_global(mtop
,ii
,&anm
,&resnr
,&resnm
);
217 fprintf(out
,format
,"ATOM",(ii
+1)%100000,
218 anm
,resnm
,' ',(resnr
+1)%10000,' ',
219 10*x
[i
][XX
],10*x
[i
][YY
],10*x
[i
][ZZ
]);
221 fprintf(out
,"TER\n");
226 static void dump_confs(FILE *fplog
,gmx_large_int_t step
,gmx_mtop_t
*mtop
,
227 int start
,int homenr
,t_commrec
*cr
,
228 rvec x
[],rvec xprime
[],matrix box
)
230 char buf
[256],buf2
[22];
232 char *env
=getenv("GMX_SUPPRESS_DUMP");
236 sprintf(buf
,"step%sb",gmx_step_str(step
,buf2
));
237 write_constr_pdb(buf
,"initial coordinates",
238 mtop
,start
,homenr
,cr
,x
,box
);
239 sprintf(buf
,"step%sc",gmx_step_str(step
,buf2
));
240 write_constr_pdb(buf
,"coordinates after constraining",
241 mtop
,start
,homenr
,cr
,xprime
,box
);
244 fprintf(fplog
,"Wrote pdb files with previous and current coordinates\n");
246 fprintf(stderr
,"Wrote pdb files with previous and current coordinates\n");
249 static void pr_sortblock(FILE *fp
,const char *title
,int nsb
,t_sortblock sb
[])
253 fprintf(fp
,"%s\n",title
);
254 for(i
=0; (i
<nsb
); i
++)
255 fprintf(fp
,"i: %5d, iatom: (%5d %5d %5d), blocknr: %5d\n",
256 i
,sb
[i
].iatom
[0],sb
[i
].iatom
[1],sb
[i
].iatom
[2],
260 bool constrain(FILE *fplog
,bool bLog
,bool bEner
,
261 struct gmx_constr
*constr
,
262 t_idef
*idef
,t_inputrec
*ir
,
264 gmx_large_int_t step
,int delta_step
,
266 rvec
*x
,rvec
*xprime
,rvec
*min_proj
,matrix box
,
267 real lambda
,real
*dvdlambda
,
269 t_nrnb
*nrnb
,int econq
,bool bPscal
,real veta
, real vetanew
)
272 int start
,homenr
,nrend
;
277 real invdt
,vir_fac
,t
;
284 if (econq
== econqForceDispl
&& !EI_ENERGY_MINIMIZATION(ir
->eI
))
286 gmx_incons("constrain called for forces displacements while not doing energy minimization, can not do this while the LINCS and SETTLE constraint connection matrices are mass weighted");
293 nrend
= start
+homenr
;
295 /* set constants for pressure control integration */
296 vetavar
= init_vetavars(veta
,vetanew
,ir
);
298 if (ir
->delta_t
== 0)
304 invdt
= 1/ir
->delta_t
;
307 if (ir
->efep
!= efepNO
&& EI_DYNAMICS(ir
->eI
))
309 /* Set the constraint lengths for the step at which this configuration
310 * is meant to be. The invmasses should not be changed.
312 lambda
+= delta_step
*ir
->delta_lambda
;
323 bOK
= constrain_lincs(fplog
,bLog
,bEner
,ir
,step
,constr
->lincsd
,md
,cr
,
324 x
,xprime
,min_proj
,box
,lambda
,dvdlambda
,
325 invdt
,v
,vir
!=NULL
,rmdr
,
327 constr
->maxwarn
,&constr
->warncount_lincs
);
328 if (!bOK
&& constr
->maxwarn
>= 0 && fplog
)
330 fprintf(fplog
,"Constraint error in algorithm %s at step %s\n",
331 econstr_names
[econtLINCS
],gmx_step_str(step
,buf
));
335 if (constr
->nblocks
> 0)
339 bOK
= bshakef(fplog
,constr
->shaked
,
340 homenr
,md
->invmass
,constr
->nblocks
,constr
->sblock
,
341 idef
,ir
,box
,x
,xprime
,nrnb
,
342 constr
->lagr
,lambda
,dvdlambda
,
343 invdt
,v
,vir
!=NULL
,rmdr
,constr
->maxwarn
>=0,econq
,vetavar
);
346 bOK
= bshakef(fplog
,constr
->shaked
,
347 homenr
,md
->invmass
,constr
->nblocks
,constr
->sblock
,
348 idef
,ir
,box
,x
,min_proj
,nrnb
,
349 constr
->lagr
,lambda
,dvdlambda
,
350 invdt
,NULL
,vir
!=NULL
,rmdr
,constr
->maxwarn
>=0,econq
,vetavar
);
353 gmx_fatal(FARGS
,"Internal error, SHAKE called for constraining something else than coordinates");
356 if (!bOK
&& constr
->maxwarn
>= 0 && fplog
)
358 fprintf(fplog
,"Constraint error in algorithm %s at step %s\n",
359 econstr_names
[econtSHAKE
],gmx_step_str(step
,buf
));
363 settle
= &idef
->il
[F_SETTLE
];
366 nsettle
= settle
->nr
/2;
371 csettle(constr
->settled
,
372 nsettle
,settle
->iatoms
,x
[0],xprime
[0],
373 invdt
,v
[0],vir
!=NULL
,rmdr
,&error
,vetavar
);
374 inc_nrnb(nrnb
,eNR_SETTLE
,nsettle
);
377 inc_nrnb(nrnb
,eNR_CONSTR_V
,nsettle
*3);
381 inc_nrnb(nrnb
,eNR_CONSTR_VIR
,nsettle
*3);
385 if (!bOK
&& constr
->maxwarn
>= 0)
389 "\nt = %.3f ps: Water molecule starting at atom %d can not be "
390 "settled.\nCheck for bad contacts and/or reduce the timestep.\n",
391 ir
->init_t
+step
*ir
->delta_t
,
392 ddglatnr(cr
->dd
,settle
->iatoms
[error
*2+1]));
395 fprintf(fplog
,"%s",buf
);
397 fprintf(stderr
,"%s",buf
);
398 constr
->warncount_settle
++;
399 if (constr
->warncount_settle
> constr
->maxwarn
)
401 too_many_constraint_warnings(-1,constr
->warncount_settle
);
407 case econqForceDispl
:
408 settle_proj(fplog
,constr
->settled
,econq
,
409 nsettle
,settle
->iatoms
,x
,
410 xprime
,min_proj
,vir
!=NULL
,rmdr
,vetavar
);
411 /* This is an overestimate */
412 inc_nrnb(nrnb
,eNR_SETTLE
,nsettle
);
414 case econqDeriv_FlexCon
:
415 /* Nothing to do, since the are no flexible constraints in settles */
418 gmx_incons("Unknown constraint quantity for settle");
423 free_vetavars(vetavar
);
430 vir_fac
= 0.5/(ir
->delta_t
*ir
->delta_t
);
433 vir_fac
= 0.5/ir
->delta_t
;
436 case econqForceDispl
:
441 gmx_incons("Unsupported constraint quantity for virial");
446 vir_fac
*= 2; /* only constraining over half the distance here */
452 (*vir
)[i
][j
] = vir_fac
*rmdr
[i
][j
];
457 if (!bOK
&& constr
->maxwarn
>= 0)
459 dump_confs(fplog
,step
,constr
->warn_mtop
,start
,homenr
,cr
,x
,xprime
,box
);
462 if (econq
== econqCoord
)
464 if (ir
->ePull
== epullCONSTRAINT
)
466 if (EI_DYNAMICS(ir
->eI
))
468 t
= ir
->init_t
+ (step
+ delta_step
)*ir
->delta_t
;
474 set_pbc(&pbc
,ir
->ePBC
,box
);
475 pull_constraint(ir
->pull
,md
,&pbc
,cr
,ir
->delta_t
,t
,x
,xprime
,v
,*vir
);
477 if (constr
->ed
&& delta_step
> 0)
479 /* apply the essential dynamcs constraints here */
480 do_edsam(ir
,step
,md
,cr
,xprime
,v
,box
,constr
->ed
);
487 real
*constr_rmsd_data(struct gmx_constr
*constr
)
490 return lincs_rmsd_data(constr
->lincsd
);
495 real
constr_rmsd(struct gmx_constr
*constr
,bool bSD2
)
498 return lincs_rmsd(constr
->lincsd
,bSD2
);
503 static void make_shake_sblock_pd(struct gmx_constr
*constr
,
504 t_idef
*idef
,t_mdatoms
*md
)
513 /* Since we are processing the local topology,
514 * the F_CONSTRNC ilist has been concatenated to the F_CONSTR ilist.
516 ncons
= idef
->il
[F_CONSTR
].nr
/3;
518 init_blocka(&sblocks
);
519 gen_sblocks(NULL
,md
->start
,md
->start
+md
->homenr
,idef
,&sblocks
,FALSE
);
522 bstart=(idef->nodeid > 0) ? blocks->multinr[idef->nodeid-1] : 0;
523 nblocks=blocks->multinr[idef->nodeid] - bstart;
526 constr
->nblocks
= sblocks
.nr
;
528 fprintf(debug
,"ncons: %d, bstart: %d, nblocks: %d\n",
529 ncons
,bstart
,constr
->nblocks
);
531 /* Calculate block number for each atom */
532 inv_sblock
= make_invblocka(&sblocks
,md
->nr
);
534 done_blocka(&sblocks
);
536 /* Store the block number in temp array and
537 * sort the constraints in order of the sblock number
538 * and the atom numbers, really sorting a segment of the array!
541 pr_idef(fplog
,0,"Before Sort",idef
);
543 iatom
=idef
->il
[F_CONSTR
].iatoms
;
545 for(i
=0; (i
<ncons
); i
++,iatom
+=3) {
547 sb
[i
].iatom
[m
] = iatom
[m
];
548 sb
[i
].blocknr
= inv_sblock
[iatom
[1]];
551 /* Now sort the blocks */
553 pr_sortblock(debug
,"Before sorting",ncons
,sb
);
554 fprintf(debug
,"Going to sort constraints\n");
557 qsort(sb
,ncons
,(size_t)sizeof(*sb
),pcomp
);
560 pr_sortblock(debug
,"After sorting",ncons
,sb
);
563 iatom
=idef
->il
[F_CONSTR
].iatoms
;
564 for(i
=0; (i
<ncons
); i
++,iatom
+=3)
566 iatom
[m
]=sb
[i
].iatom
[m
];
568 pr_idef(fplog
,0,"After Sort",idef
);
572 snew(constr
->sblock
,constr
->nblocks
+1);
574 for(i
=0; (i
<ncons
); i
++) {
575 if (sb
[i
].blocknr
!= bnr
) {
577 constr
->sblock
[j
++]=3*i
;
581 constr
->sblock
[j
++] = 3*ncons
;
583 if (j
!= (constr
->nblocks
+1)) {
584 fprintf(stderr
,"bstart: %d\n",bstart
);
585 fprintf(stderr
,"j: %d, nblocks: %d, ncons: %d\n",
586 j
,constr
->nblocks
,ncons
);
587 for(i
=0; (i
<ncons
); i
++)
588 fprintf(stderr
,"i: %5d sb[i].blocknr: %5u\n",i
,sb
[i
].blocknr
);
589 for(j
=0; (j
<=constr
->nblocks
); j
++)
590 fprintf(stderr
,"sblock[%3d]=%5d\n",j
,(int)constr
->sblock
[j
]);
591 gmx_fatal(FARGS
,"DEATH HORROR: "
592 "sblocks does not match idef->il[F_CONSTR]");
598 static void make_shake_sblock_dd(struct gmx_constr
*constr
,
599 t_ilist
*ilcon
,t_block
*cgs
,
605 if (dd
->ncg_home
+1 > constr
->sblock_nalloc
) {
606 constr
->sblock_nalloc
= over_alloc_dd(dd
->ncg_home
+1);
607 srenew(constr
->sblock
,constr
->sblock_nalloc
);
611 iatom
= ilcon
->iatoms
;
614 for(c
=0; c
<ncons
; c
++) {
615 if (c
== 0 || iatom
[1] >= cgs
->index
[cg
+1]) {
616 constr
->sblock
[constr
->nblocks
++] = 3*c
;
617 while (iatom
[1] >= cgs
->index
[cg
+1])
622 constr
->sblock
[constr
->nblocks
] = 3*ncons
;
625 t_blocka
make_at2con(int start
,int natoms
,
626 t_ilist
*ilist
,t_iparams
*iparams
,
627 bool bDynamics
,int *nflexiblecons
)
629 int *count
,ncon
,con
,con_tot
,nflexcon
,ftype
,i
,a
;
636 for(ftype
=F_CONSTR
; ftype
<=F_CONSTRNC
; ftype
++) {
637 ncon
= ilist
[ftype
].nr
/3;
638 ia
= ilist
[ftype
].iatoms
;
639 for(con
=0; con
<ncon
; con
++) {
640 bFlexCon
= (iparams
[ia
[0]].constr
.dA
== 0 &&
641 iparams
[ia
[0]].constr
.dB
== 0);
644 if (bDynamics
|| !bFlexCon
) {
653 *nflexiblecons
= nflexcon
;
656 at2con
.nalloc_index
= at2con
.nr
+1;
657 snew(at2con
.index
,at2con
.nalloc_index
);
659 for(a
=0; a
<natoms
; a
++) {
660 at2con
.index
[a
+1] = at2con
.index
[a
] + count
[a
];
663 at2con
.nra
= at2con
.index
[natoms
];
664 at2con
.nalloc_a
= at2con
.nra
;
665 snew(at2con
.a
,at2con
.nalloc_a
);
667 /* The F_CONSTRNC constraints have constraint numbers
668 * that continue after the last F_CONSTR constraint.
671 for(ftype
=F_CONSTR
; ftype
<=F_CONSTRNC
; ftype
++) {
672 ncon
= ilist
[ftype
].nr
/3;
673 ia
= ilist
[ftype
].iatoms
;
674 for(con
=0; con
<ncon
; con
++) {
675 bFlexCon
= (iparams
[ia
[0]].constr
.dA
== 0 &&
676 iparams
[ia
[0]].constr
.dB
== 0);
677 if (bDynamics
|| !bFlexCon
) {
680 at2con
.a
[at2con
.index
[a
]+count
[a
]++] = con_tot
;
693 void set_constraints(struct gmx_constr
*constr
,
694 gmx_localtop_t
*top
,t_inputrec
*ir
,
695 t_mdatoms
*md
,t_commrec
*cr
)
704 if (constr
->ncon_tot
> 0)
706 /* We are using the local topology,
707 * so there are only F_CONSTR constraints.
709 ncons
= idef
->il
[F_CONSTR
].nr
/3;
711 /* With DD we might also need to call LINCS with ncons=0 for
712 * communicating coordinates to other nodes that do have constraints.
714 if (ir
->eConstrAlg
== econtLINCS
)
716 set_lincs(idef
,md
,EI_DYNAMICS(ir
->eI
),cr
,constr
->lincsd
);
718 if (ir
->eConstrAlg
== econtSHAKE
)
722 make_shake_sblock_dd(constr
,&idef
->il
[F_CONSTR
],&top
->cgs
,cr
->dd
);
726 make_shake_sblock_pd(constr
,idef
,md
);
728 if (ncons
> constr
->lagr_nalloc
)
730 constr
->lagr_nalloc
= over_alloc_dd(ncons
);
731 srenew(constr
->lagr
,constr
->lagr_nalloc
);
734 constr
->shaked
= shake_init();
738 if (idef
->il
[F_SETTLE
].nr
> 0 && constr
->settled
== NULL
)
740 settle
= &idef
->il
[F_SETTLE
];
741 iO
= settle
->iatoms
[1];
742 iH
= settle
->iatoms
[1]+1;
744 settle_init(md
->massT
[iO
],md
->massT
[iH
],
745 md
->invmass
[iO
],md
->invmass
[iH
],
746 idef
->iparams
[settle
->iatoms
[0]].settle
.doh
,
747 idef
->iparams
[settle
->iatoms
[0]].settle
.dhh
);
750 /* Make a selection of the local atoms for essential dynamics */
751 if (constr
->ed
&& cr
->dd
)
753 dd_make_local_ed_indices(cr
->dd
,constr
->ed
,md
);
757 static void constr_recur(t_blocka
*at2con
,
758 t_ilist
*ilist
,t_iparams
*iparams
,bool bTopB
,
759 int at
,int depth
,int nc
,int *path
,
760 real r0
,real r1
,real
*r2max
,
772 ncon1
= ilist
[F_CONSTR
].nr
/3;
773 ia1
= ilist
[F_CONSTR
].iatoms
;
774 ia2
= ilist
[F_CONSTRNC
].iatoms
;
776 /* Loop over all constraints connected to this atom */
777 for(c
=at2con
->index
[at
]; c
<at2con
->index
[at
+1]; c
++) {
779 /* Do not walk over already used constraints */
781 for(a1
=0; a1
<depth
; a1
++) {
786 ia
= constr_iatomptr(ncon1
,ia1
,ia2
,con
);
787 /* Flexible constraints currently have length 0, which is incorrect */
789 len
= iparams
[ia
[0]].constr
.dA
;
791 len
= iparams
[ia
[0]].constr
.dB
;
792 /* In the worst case the bond directions alternate */
800 /* Assume angles of 120 degrees between all bonds */
801 if (rn0
*rn0
+ rn1
*rn1
+ rn0
*rn1
> *r2max
) {
802 *r2max
= rn0
*rn0
+ rn1
*rn1
+ r0
*rn1
;
804 fprintf(debug
,"Found longer constraint distance: r0 %5.3f r1 %5.3f rmax %5.3f\n", rn0
,rn1
,sqrt(*r2max
));
805 for(a1
=0; a1
<depth
; a1
++)
806 fprintf(debug
," %d %5.3f",
808 iparams
[constr_iatomptr(ncon1
,ia1
,ia2
,con
)[0]].constr
.dA
);
809 fprintf(debug
," %d %5.3f\n",con
,len
);
812 /* Limit the number of recursions to 1000*nc,
813 * so a call does not take more than a second,
814 * even for highly connected systems.
816 if (depth
+ 1 < nc
&& *count
< 1000*nc
) {
823 constr_recur(at2con
,ilist
,iparams
,
824 bTopB
,a1
,depth
+1,nc
,path
,rn0
,rn1
,r2max
,count
);
831 static real
constr_r_max_moltype(FILE *fplog
,
832 gmx_moltype_t
*molt
,t_iparams
*iparams
,
835 int natoms
,nflexcon
,*path
,at
,count
;
838 real r0
,r1
,r2maxA
,r2maxB
,rmax
,lam0
,lam1
;
840 if (molt
->ilist
[F_CONSTR
].nr
== 0 &&
841 molt
->ilist
[F_CONSTRNC
].nr
== 0) {
845 natoms
= molt
->atoms
.nr
;
847 at2con
= make_at2con(0,natoms
,molt
->ilist
,iparams
,
848 EI_DYNAMICS(ir
->eI
),&nflexcon
);
849 snew(path
,1+ir
->nProjOrder
);
850 for(at
=0; at
<1+ir
->nProjOrder
; at
++)
854 for(at
=0; at
<natoms
; at
++) {
859 constr_recur(&at2con
,molt
->ilist
,iparams
,
860 FALSE
,at
,0,1+ir
->nProjOrder
,path
,r0
,r1
,&r2maxA
,&count
);
862 if (ir
->efep
== efepNO
) {
866 for(at
=0; at
<natoms
; at
++) {
870 constr_recur(&at2con
,molt
->ilist
,iparams
,
871 TRUE
,at
,0,1+ir
->nProjOrder
,path
,r0
,r1
,&r2maxB
,&count
);
873 lam0
= ir
->init_lambda
;
874 if (EI_DYNAMICS(ir
->eI
))
875 lam0
+= ir
->init_step
*ir
->delta_lambda
;
876 rmax
= (1 - lam0
)*sqrt(r2maxA
) + lam0
*sqrt(r2maxB
);
877 if (EI_DYNAMICS(ir
->eI
)) {
878 lam1
= ir
->init_lambda
+ (ir
->init_step
+ ir
->nsteps
)*ir
->delta_lambda
;
879 rmax
= max(rmax
,(1 - lam1
)*sqrt(r2maxA
) + lam1
*sqrt(r2maxB
));
883 done_blocka(&at2con
);
889 real
constr_r_max(FILE *fplog
,gmx_mtop_t
*mtop
,t_inputrec
*ir
)
895 for(mt
=0; mt
<mtop
->nmoltype
; mt
++) {
897 constr_r_max_moltype(fplog
,&mtop
->moltype
[mt
],
898 mtop
->ffparams
.iparams
,ir
));
902 fprintf(fplog
,"Maximum distance for %d constraints, at 120 deg. angles, all-trans: %.3f nm\n",1+ir
->nProjOrder
,rmax
);
907 gmx_constr_t
init_constraints(FILE *fplog
,
908 gmx_mtop_t
*mtop
,t_inputrec
*ir
,
909 gmx_edsam_t ed
,t_state
*state
,
912 int ncon
,nset
,nmol
,settle_type
,i
,natoms
,mt
,nflexcon
;
913 struct gmx_constr
*constr
;
916 gmx_mtop_ilistloop_t iloop
;
919 gmx_mtop_ftype_count(mtop
,F_CONSTR
) +
920 gmx_mtop_ftype_count(mtop
,F_CONSTRNC
);
921 nset
= gmx_mtop_ftype_count(mtop
,F_SETTLE
);
923 if (ncon
+nset
== 0 && ir
->ePull
!= epullCONSTRAINT
&& ed
== NULL
)
930 constr
->ncon_tot
= ncon
;
931 constr
->nflexcon
= 0;
934 constr
->n_at2con_mt
= mtop
->nmoltype
;
935 snew(constr
->at2con_mt
,constr
->n_at2con_mt
);
936 for(mt
=0; mt
<mtop
->nmoltype
; mt
++)
938 constr
->at2con_mt
[mt
] = make_at2con(0,mtop
->moltype
[mt
].atoms
.nr
,
939 mtop
->moltype
[mt
].ilist
,
940 mtop
->ffparams
.iparams
,
941 EI_DYNAMICS(ir
->eI
),&nflexcon
);
942 for(i
=0; i
<mtop
->nmolblock
; i
++)
944 if (mtop
->molblock
[i
].type
== mt
)
946 constr
->nflexcon
+= mtop
->molblock
[i
].nmol
*nflexcon
;
951 if (constr
->nflexcon
> 0)
955 fprintf(fplog
,"There are %d flexible constraints\n",
957 if (ir
->fc_stepsize
== 0)
960 "WARNING: step size for flexible constraining = 0\n"
961 " All flexible constraints will be rigid.\n"
962 " Will try to keep all flexible constraints at their original length,\n"
963 " but the lengths may exhibit some drift.\n\n");
964 constr
->nflexcon
= 0;
967 if (constr
->nflexcon
> 0)
969 please_cite(fplog
,"Hess2002");
973 if (ir
->eConstrAlg
== econtLINCS
)
975 constr
->lincsd
= init_lincs(fplog
,mtop
,
976 constr
->nflexcon
,constr
->at2con_mt
,
977 DOMAINDECOMP(cr
) && cr
->dd
->bInterCGcons
,
978 ir
->nLincsIter
,ir
->nProjOrder
);
981 if (ir
->eConstrAlg
== econtSHAKE
) {
982 if (DOMAINDECOMP(cr
) && cr
->dd
->bInterCGcons
)
984 gmx_fatal(FARGS
,"SHAKE is not supported with domain decomposition and constraint that cross charge group boundaries, use LINCS");
986 if (constr
->nflexcon
)
988 gmx_fatal(FARGS
,"For this system also velocities and/or forces need to be constrained, this can not be done with SHAKE, you should select LINCS");
990 please_cite(fplog
,"Ryckaert77a");
993 please_cite(fplog
,"Barth95a");
999 please_cite(fplog
,"Miyamoto92a");
1001 /* Check that we have only one settle type */
1003 iloop
= gmx_mtop_ilistloop_init(mtop
);
1004 while (gmx_mtop_ilistloop_next(iloop
,&ilist
,&nmol
))
1006 for (i
=0; i
<ilist
[F_SETTLE
].nr
; i
+=2)
1008 if (settle_type
== -1)
1010 settle_type
= ilist
[F_SETTLE
].iatoms
[i
];
1012 else if (ilist
[F_SETTLE
].iatoms
[i
] != settle_type
)
1014 gmx_fatal(FARGS
,"More than one settle type.\n"
1015 "Suggestion: change the least use settle constraints into 3 normal constraints.");
1021 constr
->maxwarn
= 999;
1022 env
= getenv("GMX_MAXCONSTRWARN");
1025 constr
->maxwarn
= 0;
1026 sscanf(env
,"%d",&constr
->maxwarn
);
1030 "Setting the maximum number of constraint warnings to %d\n",
1036 "Setting the maximum number of constraint warnings to %d\n",
1040 if (constr
->maxwarn
< 0 && fplog
)
1042 fprintf(fplog
,"maxwarn < 0, will not stop on constraint errors\n");
1044 constr
->warncount_lincs
= 0;
1045 constr
->warncount_settle
= 0;
1047 /* Initialize the essential dynamics sampling.
1048 * Put the pointer to the ED struct in constr */
1052 init_edsam(mtop
,ir
,cr
,ed
,state
->x
,state
->box
);
1055 constr
->warn_mtop
= mtop
;
1060 t_blocka
*atom2constraints_moltype(gmx_constr_t constr
)
1062 return constr
->at2con_mt
;
1066 bool inter_charge_group_constraints(gmx_mtop_t
*mtop
)
1068 const gmx_moltype_t
*molt
;
1072 int nat
,*at2cg
,cg
,a
,ftype
,i
;
1076 for(mb
=0; mb
<mtop
->nmolblock
&& !bInterCG
; mb
++) {
1077 molt
= &mtop
->moltype
[mtop
->molblock
[mb
].type
];
1079 if (molt
->ilist
[F_CONSTR
].nr
> 0 ||
1080 molt
->ilist
[F_CONSTRNC
].nr
> 0) {
1082 snew(at2cg
,molt
->atoms
.nr
);
1083 for(cg
=0; cg
<cgs
->nr
; cg
++) {
1084 for(a
=cgs
->index
[cg
]; a
<cgs
->index
[cg
+1]; a
++)
1088 for(ftype
=F_CONSTR
; ftype
<=F_CONSTRNC
; ftype
++) {
1089 il
= &molt
->ilist
[ftype
];
1090 for(i
=0; i
<il
->nr
&& !bInterCG
; i
+=3) {
1091 if (at2cg
[il
->iatoms
[i
+1]] != at2cg
[il
->iatoms
[i
+2]])