2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
39 /* This file is completely threadsafe - keep it that way! */
46 #include "gromacs/utility/futil.h"
54 #include "gromacs/math/vec.h"
55 #include "gromacs/topology/atomprop.h"
56 #include "gromacs/topology/block.h"
57 #include "gromacs/topology/mtop_util.h"
58 #include "gromacs/topology/symtab.h"
59 #include "gromacs/topology/topology.h"
60 #include "gromacs/utility/cstringutil.h"
61 #include "gromacs/utility/fatalerror.h"
62 #include "gromacs/utility/smalloc.h"
64 #define TPX_TAG_RELEASE "release"
66 /*! \brief Tag string for the file format written to run input files
67 * written by this version of the code.
69 * Change this if you want to change the run input format in a feature
70 * branch. This ensures that there will not be different run input
71 * formats around which cannot be distinguished, while not causing
72 * problems rebasing the feature branch onto upstream changes. When
73 * merging with mainstream GROMACS, set this tag string back to
74 * TPX_TAG_RELEASE, and instead add an element to tpxv and set
75 * tpx_version to that.
77 static const char *tpx_tag
= TPX_TAG_RELEASE
;
79 /*! \brief Enum of values that describe the contents of a tpr file
80 * whose format matches a version number
82 * The enum helps the code be more self-documenting and ensure merges
83 * do not silently resolve when two patches make the same bump. When
84 * adding new functionality, add a new element to the end of this
85 * enumeration, change the definition of tpx_version, and write code
86 * below that does the right thing according to the value of
89 tpxv_ComputationalElectrophysiology
= 96, /**< support for ion/water position swaps (computational electrophysiology) */
90 tpxv_Use64BitRandomSeed
, /**< change ld_seed from int to gmx_int64_t */
91 tpxv_RestrictedBendingAndCombinedAngleTorsionPotentials
, /**< potentials for supporting coarse-grained force fields */
92 tpxv_InteractiveMolecularDynamics
, /**< interactive molecular dynamics (IMD) */
93 tpxv_RemoveObsoleteParameters1
/**< remove optimize_fft, dihre_fc, nstcheckpoint */
96 /*! \brief Version number of the file format written to run input
97 * files by this version of the code.
99 * The tpx_version number should be increased whenever the file format
100 * in the main development branch changes, generally to the highest
101 * value present in tpxv. Backward compatibility for reading old run
102 * input files is maintained by checking this version number against
103 * that of the file and then using the correct code path.
105 * When developing a feature branch that needs to change the run input
106 * file format, change tpx_tag instead. */
107 static const int tpx_version
= tpxv_RemoveObsoleteParameters1
;
110 /* This number should only be increased when you edit the TOPOLOGY section
111 * or the HEADER of the tpx format.
112 * This way we can maintain forward compatibility too for all analysis tools
113 * and/or external programs that only need to know the atom/residue names,
114 * charges, and bond connectivity.
116 * It first appeared in tpx version 26, when I also moved the inputrecord
117 * to the end of the tpx file, so we can just skip it if we only
120 * In particular, it must be increased when adding new elements to
121 * ftupd, so that old code can read new .tpr files.
123 static const int tpx_generation
= 26;
125 /* This number should be the most recent backwards incompatible version
126 * I.e., if this number is 9, we cannot read tpx version 9 with this code.
128 static const int tpx_incompatible_version
= 9;
132 /* Struct used to maintain tpx compatibility when function types are added */
134 int fvnr
; /* file version number in which the function type first appeared */
135 int ftype
; /* function type */
139 * The entries should be ordered in:
140 * 1. ascending file version number
141 * 2. ascending function type number
143 /*static const t_ftupd ftupd[] = {
144 { 20, F_CUBICBONDS },
148 { 22, F_DISRESVIOL },
154 { 26, F_DIHRESVIOL },
155 { 30, F_CROSS_BOND_BONDS },
156 { 30, F_CROSS_BOND_ANGLES },
157 { 30, F_UREY_BRADLEY },
158 { 30, F_POLARIZATION },
162 * The entries should be ordered in:
163 * 1. ascending function type number
164 * 2. ascending file version number
166 /* question; what is the purpose of the commented code above? */
167 static const t_ftupd ftupd
[] = {
168 { 20, F_CUBICBONDS
},
173 { 43, F_TABBONDSNC
},
174 { 70, F_RESTRBONDS
},
175 { tpxv_RestrictedBendingAndCombinedAngleTorsionPotentials
, F_RESTRANGLES
},
176 { 76, F_LINEAR_ANGLES
},
177 { 30, F_CROSS_BOND_BONDS
},
178 { 30, F_CROSS_BOND_ANGLES
},
179 { 30, F_UREY_BRADLEY
},
180 { 34, F_QUARTIC_ANGLES
},
182 { tpxv_RestrictedBendingAndCombinedAngleTorsionPotentials
, F_RESTRDIHS
},
183 { tpxv_RestrictedBendingAndCombinedAngleTorsionPotentials
, F_CBTDIHS
},
192 { 72, F_NPSOLVATION
},
194 { 41, F_LJC_PAIRS_NB
},
197 { 32, F_COUL_RECIP
},
200 { 30, F_POLARIZATION
},
203 { 22, F_DISRESVIOL
},
207 { 26, F_DIHRESVIOL
},
212 { 46, F_ECONSERVED
},
213 { 69, F_VTEMP_NOLONGERUSED
},
215 { 54, F_DVDL_CONSTR
},
216 { 76, F_ANHARM_POL
},
219 { 79, F_DVDL_BONDED
, },
220 { 79, F_DVDL_RESTRAINT
},
221 { 79, F_DVDL_TEMPERATURE
},
223 #define NFTUPD asize(ftupd)
225 /* Needed for backward compatibility */
228 static void _do_section(t_fileio
*fio
, int key
, gmx_bool bRead
, const char *src
,
234 if (gmx_fio_getftp(fio
) == efTPA
)
238 gmx_fio_write_string(fio
, itemstr
[key
]);
239 bDbg
= gmx_fio_getdebug(fio
);
240 gmx_fio_setdebug(fio
, FALSE
);
241 gmx_fio_write_string(fio
, comment_str
[key
]);
242 gmx_fio_setdebug(fio
, bDbg
);
246 if (gmx_fio_getdebug(fio
))
248 fprintf(stderr
, "Looking for section %s (%s, %d)",
249 itemstr
[key
], src
, line
);
254 gmx_fio_do_string(fio
, buf
);
256 while ((gmx_strcasecmp(buf
, itemstr
[key
]) != 0));
258 if (gmx_strcasecmp(buf
, itemstr
[key
]) != 0)
260 gmx_fatal(FARGS
, "\nCould not find section heading %s", itemstr
[key
]);
262 else if (gmx_fio_getdebug(fio
))
264 fprintf(stderr
, " and found it\n");
270 #define do_section(fio, key, bRead) _do_section(fio, key, bRead, __FILE__, __LINE__)
272 /**************************************************************
274 * Now the higer level routines that do io of the structures and arrays
276 **************************************************************/
277 static void do_pullgrp_tpx_pre95(t_fileio
*fio
,
286 gmx_fio_do_int(fio
, pgrp
->nat
);
289 snew(pgrp
->ind
, pgrp
->nat
);
291 gmx_fio_ndo_int(fio
, pgrp
->ind
, pgrp
->nat
);
292 gmx_fio_do_int(fio
, pgrp
->nweight
);
295 snew(pgrp
->weight
, pgrp
->nweight
);
297 gmx_fio_ndo_real(fio
, pgrp
->weight
, pgrp
->nweight
);
298 gmx_fio_do_int(fio
, pgrp
->pbcatom
);
299 gmx_fio_do_rvec(fio
, pcrd
->vec
);
300 clear_rvec(pcrd
->origin
);
301 gmx_fio_do_rvec(fio
, tmp
);
303 gmx_fio_do_real(fio
, pcrd
->rate
);
304 gmx_fio_do_real(fio
, pcrd
->k
);
305 if (file_version
>= 56)
307 gmx_fio_do_real(fio
, pcrd
->kB
);
315 static void do_pull_group(t_fileio
*fio
, t_pull_group
*pgrp
, gmx_bool bRead
)
319 gmx_fio_do_int(fio
, pgrp
->nat
);
322 snew(pgrp
->ind
, pgrp
->nat
);
324 gmx_fio_ndo_int(fio
, pgrp
->ind
, pgrp
->nat
);
325 gmx_fio_do_int(fio
, pgrp
->nweight
);
328 snew(pgrp
->weight
, pgrp
->nweight
);
330 gmx_fio_ndo_real(fio
, pgrp
->weight
, pgrp
->nweight
);
331 gmx_fio_do_int(fio
, pgrp
->pbcatom
);
334 static void do_pull_coord(t_fileio
*fio
, t_pull_coord
*pcrd
)
338 gmx_fio_do_int(fio
, pcrd
->group
[0]);
339 gmx_fio_do_int(fio
, pcrd
->group
[1]);
340 gmx_fio_do_rvec(fio
, pcrd
->origin
);
341 gmx_fio_do_rvec(fio
, pcrd
->vec
);
342 gmx_fio_do_real(fio
, pcrd
->init
);
343 gmx_fio_do_real(fio
, pcrd
->rate
);
344 gmx_fio_do_real(fio
, pcrd
->k
);
345 gmx_fio_do_real(fio
, pcrd
->kB
);
348 static void do_expandedvals(t_fileio
*fio
, t_expanded
*expand
, t_lambda
*fepvals
, gmx_bool bRead
, int file_version
)
350 /* i is used in the ndo_double macro*/
354 int n_lambda
= fepvals
->n_lambda
;
356 /* reset the lambda calculation window */
357 fepvals
->lambda_start_n
= 0;
358 fepvals
->lambda_stop_n
= n_lambda
;
359 if (file_version
>= 79)
365 snew(expand
->init_lambda_weights
, n_lambda
);
367 gmx_fio_ndo_real(fio
, expand
->init_lambda_weights
, n_lambda
);
368 gmx_fio_do_gmx_bool(fio
, expand
->bInit_weights
);
371 gmx_fio_do_int(fio
, expand
->nstexpanded
);
372 gmx_fio_do_int(fio
, expand
->elmcmove
);
373 gmx_fio_do_int(fio
, expand
->elamstats
);
374 gmx_fio_do_int(fio
, expand
->lmc_repeats
);
375 gmx_fio_do_int(fio
, expand
->gibbsdeltalam
);
376 gmx_fio_do_int(fio
, expand
->lmc_forced_nstart
);
377 gmx_fio_do_int(fio
, expand
->lmc_seed
);
378 gmx_fio_do_real(fio
, expand
->mc_temp
);
379 gmx_fio_do_int(fio
, expand
->bSymmetrizedTMatrix
);
380 gmx_fio_do_int(fio
, expand
->nstTij
);
381 gmx_fio_do_int(fio
, expand
->minvarmin
);
382 gmx_fio_do_int(fio
, expand
->c_range
);
383 gmx_fio_do_real(fio
, expand
->wl_scale
);
384 gmx_fio_do_real(fio
, expand
->wl_ratio
);
385 gmx_fio_do_real(fio
, expand
->init_wl_delta
);
386 gmx_fio_do_gmx_bool(fio
, expand
->bWLoneovert
);
387 gmx_fio_do_int(fio
, expand
->elmceq
);
388 gmx_fio_do_int(fio
, expand
->equil_steps
);
389 gmx_fio_do_int(fio
, expand
->equil_samples
);
390 gmx_fio_do_int(fio
, expand
->equil_n_at_lam
);
391 gmx_fio_do_real(fio
, expand
->equil_wl_delta
);
392 gmx_fio_do_real(fio
, expand
->equil_ratio
);
396 static void do_simtempvals(t_fileio
*fio
, t_simtemp
*simtemp
, int n_lambda
, gmx_bool bRead
,
399 if (file_version
>= 79)
401 gmx_fio_do_int(fio
, simtemp
->eSimTempScale
);
402 gmx_fio_do_real(fio
, simtemp
->simtemp_high
);
403 gmx_fio_do_real(fio
, simtemp
->simtemp_low
);
408 snew(simtemp
->temperatures
, n_lambda
);
410 gmx_fio_ndo_real(fio
, simtemp
->temperatures
, n_lambda
);
415 static void do_imd(t_fileio
*fio
, t_IMD
*imd
, gmx_bool bRead
)
417 gmx_fio_do_int(fio
, imd
->nat
);
420 snew(imd
->ind
, imd
->nat
);
422 gmx_fio_ndo_int(fio
, imd
->ind
, imd
->nat
);
425 static void do_fepvals(t_fileio
*fio
, t_lambda
*fepvals
, gmx_bool bRead
, int file_version
)
427 /* i is defined in the ndo_double macro; use g to iterate. */
432 /* free energy values */
434 if (file_version
>= 79)
436 gmx_fio_do_int(fio
, fepvals
->init_fep_state
);
437 gmx_fio_do_double(fio
, fepvals
->init_lambda
);
438 gmx_fio_do_double(fio
, fepvals
->delta_lambda
);
440 else if (file_version
>= 59)
442 gmx_fio_do_double(fio
, fepvals
->init_lambda
);
443 gmx_fio_do_double(fio
, fepvals
->delta_lambda
);
447 gmx_fio_do_real(fio
, rdum
);
448 fepvals
->init_lambda
= rdum
;
449 gmx_fio_do_real(fio
, rdum
);
450 fepvals
->delta_lambda
= rdum
;
452 if (file_version
>= 79)
454 gmx_fio_do_int(fio
, fepvals
->n_lambda
);
457 snew(fepvals
->all_lambda
, efptNR
);
459 for (g
= 0; g
< efptNR
; g
++)
461 if (fepvals
->n_lambda
> 0)
465 snew(fepvals
->all_lambda
[g
], fepvals
->n_lambda
);
467 gmx_fio_ndo_double(fio
, fepvals
->all_lambda
[g
], fepvals
->n_lambda
);
468 gmx_fio_ndo_int(fio
, fepvals
->separate_dvdl
, efptNR
);
470 else if (fepvals
->init_lambda
>= 0)
472 fepvals
->separate_dvdl
[efptFEP
] = TRUE
;
476 else if (file_version
>= 64)
478 gmx_fio_do_int(fio
, fepvals
->n_lambda
);
483 snew(fepvals
->all_lambda
, efptNR
);
484 /* still allocate the all_lambda array's contents. */
485 for (g
= 0; g
< efptNR
; g
++)
487 if (fepvals
->n_lambda
> 0)
489 snew(fepvals
->all_lambda
[g
], fepvals
->n_lambda
);
493 gmx_fio_ndo_double(fio
, fepvals
->all_lambda
[efptFEP
],
495 if (fepvals
->init_lambda
>= 0)
499 fepvals
->separate_dvdl
[efptFEP
] = TRUE
;
503 /* copy the contents of the efptFEP lambda component to all
504 the other components */
505 for (g
= 0; g
< efptNR
; g
++)
507 for (h
= 0; h
< fepvals
->n_lambda
; h
++)
511 fepvals
->all_lambda
[g
][h
] =
512 fepvals
->all_lambda
[efptFEP
][h
];
521 fepvals
->n_lambda
= 0;
522 fepvals
->all_lambda
= NULL
;
523 if (fepvals
->init_lambda
>= 0)
525 fepvals
->separate_dvdl
[efptFEP
] = TRUE
;
528 if (file_version
>= 13)
530 gmx_fio_do_real(fio
, fepvals
->sc_alpha
);
534 fepvals
->sc_alpha
= 0;
536 if (file_version
>= 38)
538 gmx_fio_do_int(fio
, fepvals
->sc_power
);
542 fepvals
->sc_power
= 2;
544 if (file_version
>= 79)
546 gmx_fio_do_real(fio
, fepvals
->sc_r_power
);
550 fepvals
->sc_r_power
= 6.0;
552 if (file_version
>= 15)
554 gmx_fio_do_real(fio
, fepvals
->sc_sigma
);
558 fepvals
->sc_sigma
= 0.3;
562 if (file_version
>= 71)
564 fepvals
->sc_sigma_min
= fepvals
->sc_sigma
;
568 fepvals
->sc_sigma_min
= 0;
571 if (file_version
>= 79)
573 gmx_fio_do_int(fio
, fepvals
->bScCoul
);
577 fepvals
->bScCoul
= TRUE
;
579 if (file_version
>= 64)
581 gmx_fio_do_int(fio
, fepvals
->nstdhdl
);
585 fepvals
->nstdhdl
= 1;
588 if (file_version
>= 73)
590 gmx_fio_do_int(fio
, fepvals
->separate_dhdl_file
);
591 gmx_fio_do_int(fio
, fepvals
->dhdl_derivatives
);
595 fepvals
->separate_dhdl_file
= esepdhdlfileYES
;
596 fepvals
->dhdl_derivatives
= edhdlderivativesYES
;
598 if (file_version
>= 71)
600 gmx_fio_do_int(fio
, fepvals
->dh_hist_size
);
601 gmx_fio_do_double(fio
, fepvals
->dh_hist_spacing
);
605 fepvals
->dh_hist_size
= 0;
606 fepvals
->dh_hist_spacing
= 0.1;
608 if (file_version
>= 79)
610 gmx_fio_do_int(fio
, fepvals
->edHdLPrintEnergy
);
614 fepvals
->edHdLPrintEnergy
= edHdLPrintEnergyNO
;
617 /* handle lambda_neighbors */
618 if ((file_version
>= 83 && file_version
< 90) || file_version
>= 92)
620 gmx_fio_do_int(fio
, fepvals
->lambda_neighbors
);
621 if ( (fepvals
->lambda_neighbors
>= 0) && (fepvals
->init_fep_state
>= 0) &&
622 (fepvals
->init_lambda
< 0) )
624 fepvals
->lambda_start_n
= (fepvals
->init_fep_state
-
625 fepvals
->lambda_neighbors
);
626 fepvals
->lambda_stop_n
= (fepvals
->init_fep_state
+
627 fepvals
->lambda_neighbors
+ 1);
628 if (fepvals
->lambda_start_n
< 0)
630 fepvals
->lambda_start_n
= 0;;
632 if (fepvals
->lambda_stop_n
>= fepvals
->n_lambda
)
634 fepvals
->lambda_stop_n
= fepvals
->n_lambda
;
639 fepvals
->lambda_start_n
= 0;
640 fepvals
->lambda_stop_n
= fepvals
->n_lambda
;
645 fepvals
->lambda_start_n
= 0;
646 fepvals
->lambda_stop_n
= fepvals
->n_lambda
;
650 static void do_pull(t_fileio
*fio
, t_pull
*pull
, gmx_bool bRead
, int file_version
)
654 if (file_version
>= 95)
656 gmx_fio_do_int(fio
, pull
->ngroup
);
658 gmx_fio_do_int(fio
, pull
->ncoord
);
659 if (file_version
< 95)
661 pull
->ngroup
= pull
->ncoord
+ 1;
663 gmx_fio_do_int(fio
, pull
->eGeom
);
664 gmx_fio_do_ivec(fio
, pull
->dim
);
665 gmx_fio_do_real(fio
, pull
->cyl_r1
);
666 gmx_fio_do_real(fio
, pull
->cyl_r0
);
667 gmx_fio_do_real(fio
, pull
->constr_tol
);
668 if (file_version
>= 95)
670 gmx_fio_do_int(fio
, pull
->bPrintRef
);
672 gmx_fio_do_int(fio
, pull
->nstxout
);
673 gmx_fio_do_int(fio
, pull
->nstfout
);
676 snew(pull
->group
, pull
->ngroup
);
677 snew(pull
->coord
, pull
->ncoord
);
679 if (file_version
< 95)
681 /* epullgPOS for position pulling, before epullgDIRPBC was removed */
682 if (pull
->eGeom
== epullgDIRPBC
)
684 gmx_fatal(FARGS
, "pull-geometry=position is no longer supported");
686 if (pull
->eGeom
> epullgDIRPBC
)
691 for (g
= 0; g
< pull
->ngroup
; g
++)
693 /* We read and ignore a pull coordinate for group 0 */
694 do_pullgrp_tpx_pre95(fio
, &pull
->group
[g
], &pull
->coord
[max(g
-1, 0)],
695 bRead
, file_version
);
698 pull
->coord
[g
-1].group
[0] = 0;
699 pull
->coord
[g
-1].group
[1] = g
;
703 pull
->bPrintRef
= (pull
->group
[0].nat
> 0);
707 for (g
= 0; g
< pull
->ngroup
; g
++)
709 do_pull_group(fio
, &pull
->group
[g
], bRead
);
711 for (g
= 0; g
< pull
->ncoord
; g
++)
713 do_pull_coord(fio
, &pull
->coord
[g
]);
719 static void do_rotgrp(t_fileio
*fio
, t_rotgrp
*rotg
, gmx_bool bRead
)
723 gmx_fio_do_int(fio
, rotg
->eType
);
724 gmx_fio_do_int(fio
, rotg
->bMassW
);
725 gmx_fio_do_int(fio
, rotg
->nat
);
728 snew(rotg
->ind
, rotg
->nat
);
730 gmx_fio_ndo_int(fio
, rotg
->ind
, rotg
->nat
);
733 snew(rotg
->x_ref
, rotg
->nat
);
735 gmx_fio_ndo_rvec(fio
, rotg
->x_ref
, rotg
->nat
);
736 gmx_fio_do_rvec(fio
, rotg
->vec
);
737 gmx_fio_do_rvec(fio
, rotg
->pivot
);
738 gmx_fio_do_real(fio
, rotg
->rate
);
739 gmx_fio_do_real(fio
, rotg
->k
);
740 gmx_fio_do_real(fio
, rotg
->slab_dist
);
741 gmx_fio_do_real(fio
, rotg
->min_gaussian
);
742 gmx_fio_do_real(fio
, rotg
->eps
);
743 gmx_fio_do_int(fio
, rotg
->eFittype
);
744 gmx_fio_do_int(fio
, rotg
->PotAngle_nstep
);
745 gmx_fio_do_real(fio
, rotg
->PotAngle_step
);
748 static void do_rot(t_fileio
*fio
, t_rot
*rot
, gmx_bool bRead
)
752 gmx_fio_do_int(fio
, rot
->ngrp
);
753 gmx_fio_do_int(fio
, rot
->nstrout
);
754 gmx_fio_do_int(fio
, rot
->nstsout
);
757 snew(rot
->grp
, rot
->ngrp
);
759 for (g
= 0; g
< rot
->ngrp
; g
++)
761 do_rotgrp(fio
, &rot
->grp
[g
], bRead
);
766 static void do_swapcoords(t_fileio
*fio
, t_swapcoords
*swap
, gmx_bool bRead
)
771 gmx_fio_do_int(fio
, swap
->nat
);
772 gmx_fio_do_int(fio
, swap
->nat_sol
);
773 for (j
= 0; j
< 2; j
++)
775 gmx_fio_do_int(fio
, swap
->nat_split
[j
]);
776 gmx_fio_do_int(fio
, swap
->massw_split
[j
]);
778 gmx_fio_do_int(fio
, swap
->nstswap
);
779 gmx_fio_do_int(fio
, swap
->nAverage
);
780 gmx_fio_do_real(fio
, swap
->threshold
);
781 gmx_fio_do_real(fio
, swap
->cyl0r
);
782 gmx_fio_do_real(fio
, swap
->cyl0u
);
783 gmx_fio_do_real(fio
, swap
->cyl0l
);
784 gmx_fio_do_real(fio
, swap
->cyl1r
);
785 gmx_fio_do_real(fio
, swap
->cyl1u
);
786 gmx_fio_do_real(fio
, swap
->cyl1l
);
790 snew(swap
->ind
, swap
->nat
);
791 snew(swap
->ind_sol
, swap
->nat_sol
);
792 for (j
= 0; j
< 2; j
++)
794 snew(swap
->ind_split
[j
], swap
->nat_split
[j
]);
798 gmx_fio_ndo_int(fio
, swap
->ind
, swap
->nat
);
799 gmx_fio_ndo_int(fio
, swap
->ind_sol
, swap
->nat_sol
);
800 for (j
= 0; j
< 2; j
++)
802 gmx_fio_ndo_int(fio
, swap
->ind_split
[j
], swap
->nat_split
[j
]);
805 for (j
= 0; j
< eCompNR
; j
++)
807 gmx_fio_do_int(fio
, swap
->nanions
[j
]);
808 gmx_fio_do_int(fio
, swap
->ncations
[j
]);
814 static void do_inputrec(t_fileio
*fio
, t_inputrec
*ir
, gmx_bool bRead
,
815 int file_version
, real
*fudgeQQ
)
817 int i
, j
, k
, *tmp
, idum
= 0;
820 gmx_bool bSimAnn
, bdum
= 0;
821 real zerotemptime
, finish_t
, init_temp
, finish_temp
;
823 if (file_version
!= tpx_version
)
825 /* Give a warning about features that are not accessible */
826 fprintf(stderr
, "Note: file tpx version %d, software tpx version %d\n",
827 file_version
, tpx_version
);
835 if (file_version
== 0)
840 /* Basic inputrec stuff */
841 gmx_fio_do_int(fio
, ir
->eI
);
842 if (file_version
>= 62)
844 gmx_fio_do_int64(fio
, ir
->nsteps
);
848 gmx_fio_do_int(fio
, idum
);
852 if (file_version
> 25)
854 if (file_version
>= 62)
856 gmx_fio_do_int64(fio
, ir
->init_step
);
860 gmx_fio_do_int(fio
, idum
);
861 ir
->init_step
= idum
;
869 if (file_version
>= 58)
871 gmx_fio_do_int(fio
, ir
->simulation_part
);
875 ir
->simulation_part
= 1;
878 if (file_version
>= 67)
880 gmx_fio_do_int(fio
, ir
->nstcalcenergy
);
884 ir
->nstcalcenergy
= 1;
886 if (file_version
< 53)
888 /* The pbc info has been moved out of do_inputrec,
889 * since we always want it, also without reading the inputrec.
891 gmx_fio_do_int(fio
, ir
->ePBC
);
892 if ((file_version
<= 15) && (ir
->ePBC
== 2))
896 if (file_version
>= 45)
898 gmx_fio_do_int(fio
, ir
->bPeriodicMols
);
905 ir
->bPeriodicMols
= TRUE
;
909 ir
->bPeriodicMols
= FALSE
;
913 if (file_version
>= 81)
915 gmx_fio_do_int(fio
, ir
->cutoff_scheme
);
916 if (file_version
< 94)
918 ir
->cutoff_scheme
= 1 - ir
->cutoff_scheme
;
923 ir
->cutoff_scheme
= ecutsGROUP
;
925 gmx_fio_do_int(fio
, ir
->ns_type
);
926 gmx_fio_do_int(fio
, ir
->nstlist
);
927 gmx_fio_do_int(fio
, idum
); /* used to be ndelta; not used anymore */
928 if (file_version
< 41)
930 gmx_fio_do_int(fio
, idum
);
931 gmx_fio_do_int(fio
, idum
);
933 if (file_version
>= 45)
935 gmx_fio_do_real(fio
, ir
->rtpi
);
941 gmx_fio_do_int(fio
, ir
->nstcomm
);
942 if (file_version
> 34)
944 gmx_fio_do_int(fio
, ir
->comm_mode
);
946 else if (ir
->nstcomm
< 0)
948 ir
->comm_mode
= ecmANGULAR
;
952 ir
->comm_mode
= ecmLINEAR
;
954 ir
->nstcomm
= abs(ir
->nstcomm
);
956 /* ignore nstcheckpoint */
957 if (file_version
> 25 && file_version
< tpxv_RemoveObsoleteParameters1
)
959 gmx_fio_do_int(fio
, idum
);
962 gmx_fio_do_int(fio
, ir
->nstcgsteep
);
964 if (file_version
>= 30)
966 gmx_fio_do_int(fio
, ir
->nbfgscorr
);
973 gmx_fio_do_int(fio
, ir
->nstlog
);
974 gmx_fio_do_int(fio
, ir
->nstxout
);
975 gmx_fio_do_int(fio
, ir
->nstvout
);
976 gmx_fio_do_int(fio
, ir
->nstfout
);
977 gmx_fio_do_int(fio
, ir
->nstenergy
);
978 gmx_fio_do_int(fio
, ir
->nstxout_compressed
);
979 if (file_version
>= 59)
981 gmx_fio_do_double(fio
, ir
->init_t
);
982 gmx_fio_do_double(fio
, ir
->delta_t
);
986 gmx_fio_do_real(fio
, rdum
);
988 gmx_fio_do_real(fio
, rdum
);
991 gmx_fio_do_real(fio
, ir
->x_compression_precision
);
992 if (file_version
< 19)
994 gmx_fio_do_int(fio
, idum
);
995 gmx_fio_do_int(fio
, idum
);
997 if (file_version
< 18)
999 gmx_fio_do_int(fio
, idum
);
1001 if (file_version
>= 81)
1003 gmx_fio_do_real(fio
, ir
->verletbuf_tol
);
1007 ir
->verletbuf_tol
= 0;
1009 gmx_fio_do_real(fio
, ir
->rlist
);
1010 if (file_version
>= 67)
1012 gmx_fio_do_real(fio
, ir
->rlistlong
);
1014 if (file_version
>= 82 && file_version
!= 90)
1016 gmx_fio_do_int(fio
, ir
->nstcalclr
);
1020 /* Calculate at NS steps */
1021 ir
->nstcalclr
= ir
->nstlist
;
1023 gmx_fio_do_int(fio
, ir
->coulombtype
);
1024 if (file_version
< 32 && ir
->coulombtype
== eelRF
)
1026 ir
->coulombtype
= eelRF_NEC
;
1028 if (file_version
>= 81)
1030 gmx_fio_do_int(fio
, ir
->coulomb_modifier
);
1034 ir
->coulomb_modifier
= (ir
->cutoff_scheme
== ecutsVERLET
? eintmodPOTSHIFT
: eintmodNONE
);
1036 gmx_fio_do_real(fio
, ir
->rcoulomb_switch
);
1037 gmx_fio_do_real(fio
, ir
->rcoulomb
);
1038 gmx_fio_do_int(fio
, ir
->vdwtype
);
1039 if (file_version
>= 81)
1041 gmx_fio_do_int(fio
, ir
->vdw_modifier
);
1045 ir
->vdw_modifier
= (ir
->cutoff_scheme
== ecutsVERLET
? eintmodPOTSHIFT
: eintmodNONE
);
1047 gmx_fio_do_real(fio
, ir
->rvdw_switch
);
1048 gmx_fio_do_real(fio
, ir
->rvdw
);
1049 if (file_version
< 67)
1051 ir
->rlistlong
= max_cutoff(ir
->rlist
, max_cutoff(ir
->rvdw
, ir
->rcoulomb
));
1053 gmx_fio_do_int(fio
, ir
->eDispCorr
);
1054 gmx_fio_do_real(fio
, ir
->epsilon_r
);
1055 if (file_version
>= 37)
1057 gmx_fio_do_real(fio
, ir
->epsilon_rf
);
1061 if (EEL_RF(ir
->coulombtype
))
1063 ir
->epsilon_rf
= ir
->epsilon_r
;
1064 ir
->epsilon_r
= 1.0;
1068 ir
->epsilon_rf
= 1.0;
1071 if (file_version
>= 29)
1073 gmx_fio_do_real(fio
, ir
->tabext
);
1080 if (file_version
> 25)
1082 gmx_fio_do_int(fio
, ir
->gb_algorithm
);
1083 gmx_fio_do_int(fio
, ir
->nstgbradii
);
1084 gmx_fio_do_real(fio
, ir
->rgbradii
);
1085 gmx_fio_do_real(fio
, ir
->gb_saltconc
);
1086 gmx_fio_do_int(fio
, ir
->implicit_solvent
);
1090 ir
->gb_algorithm
= egbSTILL
;
1093 ir
->gb_saltconc
= 0;
1094 ir
->implicit_solvent
= eisNO
;
1096 if (file_version
>= 55)
1098 gmx_fio_do_real(fio
, ir
->gb_epsilon_solvent
);
1099 gmx_fio_do_real(fio
, ir
->gb_obc_alpha
);
1100 gmx_fio_do_real(fio
, ir
->gb_obc_beta
);
1101 gmx_fio_do_real(fio
, ir
->gb_obc_gamma
);
1102 if (file_version
>= 60)
1104 gmx_fio_do_real(fio
, ir
->gb_dielectric_offset
);
1105 gmx_fio_do_int(fio
, ir
->sa_algorithm
);
1109 ir
->gb_dielectric_offset
= 0.009;
1110 ir
->sa_algorithm
= esaAPPROX
;
1112 gmx_fio_do_real(fio
, ir
->sa_surface_tension
);
1114 /* Override sa_surface_tension if it is not changed in the mpd-file */
1115 if (ir
->sa_surface_tension
< 0)
1117 if (ir
->gb_algorithm
== egbSTILL
)
1119 ir
->sa_surface_tension
= 0.0049 * 100 * CAL2JOULE
;
1121 else if (ir
->gb_algorithm
== egbHCT
|| ir
->gb_algorithm
== egbOBC
)
1123 ir
->sa_surface_tension
= 0.0054 * 100 * CAL2JOULE
;
1130 /* Better use sensible values than insane (0.0) ones... */
1131 ir
->gb_epsilon_solvent
= 80;
1132 ir
->gb_obc_alpha
= 1.0;
1133 ir
->gb_obc_beta
= 0.8;
1134 ir
->gb_obc_gamma
= 4.85;
1135 ir
->sa_surface_tension
= 2.092;
1139 if (file_version
>= 81)
1141 gmx_fio_do_real(fio
, ir
->fourier_spacing
);
1145 ir
->fourier_spacing
= 0.0;
1147 gmx_fio_do_int(fio
, ir
->nkx
);
1148 gmx_fio_do_int(fio
, ir
->nky
);
1149 gmx_fio_do_int(fio
, ir
->nkz
);
1150 gmx_fio_do_int(fio
, ir
->pme_order
);
1151 gmx_fio_do_real(fio
, ir
->ewald_rtol
);
1153 if (file_version
>= 93)
1155 gmx_fio_do_real(fio
, ir
->ewald_rtol_lj
);
1159 ir
->ewald_rtol_lj
= ir
->ewald_rtol
;
1162 if (file_version
>= 24)
1164 gmx_fio_do_int(fio
, ir
->ewald_geometry
);
1168 ir
->ewald_geometry
= eewg3D
;
1171 if (file_version
<= 17)
1173 ir
->epsilon_surface
= 0;
1174 if (file_version
== 17)
1176 gmx_fio_do_int(fio
, idum
);
1181 gmx_fio_do_real(fio
, ir
->epsilon_surface
);
1184 /* ignore bOptFFT */
1185 if (file_version
< tpxv_RemoveObsoleteParameters1
)
1187 gmx_fio_do_gmx_bool(fio
, bdum
);
1190 if (file_version
>= 93)
1192 gmx_fio_do_int(fio
, ir
->ljpme_combination_rule
);
1194 gmx_fio_do_gmx_bool(fio
, ir
->bContinuation
);
1195 gmx_fio_do_int(fio
, ir
->etc
);
1196 /* before version 18, ir->etc was a gmx_bool (ir->btc),
1197 * but the values 0 and 1 still mean no and
1198 * berendsen temperature coupling, respectively.
1200 if (file_version
>= 79)
1202 gmx_fio_do_gmx_bool(fio
, ir
->bPrintNHChains
);
1204 if (file_version
>= 71)
1206 gmx_fio_do_int(fio
, ir
->nsttcouple
);
1210 ir
->nsttcouple
= ir
->nstcalcenergy
;
1212 if (file_version
<= 15)
1214 gmx_fio_do_int(fio
, idum
);
1216 if (file_version
<= 17)
1218 gmx_fio_do_int(fio
, ir
->epct
);
1219 if (file_version
<= 15)
1223 ir
->epct
= epctSURFACETENSION
;
1225 gmx_fio_do_int(fio
, idum
);
1228 /* we have removed the NO alternative at the beginning */
1232 ir
->epct
= epctISOTROPIC
;
1236 ir
->epc
= epcBERENDSEN
;
1241 gmx_fio_do_int(fio
, ir
->epc
);
1242 gmx_fio_do_int(fio
, ir
->epct
);
1244 if (file_version
>= 71)
1246 gmx_fio_do_int(fio
, ir
->nstpcouple
);
1250 ir
->nstpcouple
= ir
->nstcalcenergy
;
1252 gmx_fio_do_real(fio
, ir
->tau_p
);
1253 if (file_version
<= 15)
1255 gmx_fio_do_rvec(fio
, vdum
);
1256 clear_mat(ir
->ref_p
);
1257 for (i
= 0; i
< DIM
; i
++)
1259 ir
->ref_p
[i
][i
] = vdum
[i
];
1264 gmx_fio_do_rvec(fio
, ir
->ref_p
[XX
]);
1265 gmx_fio_do_rvec(fio
, ir
->ref_p
[YY
]);
1266 gmx_fio_do_rvec(fio
, ir
->ref_p
[ZZ
]);
1268 if (file_version
<= 15)
1270 gmx_fio_do_rvec(fio
, vdum
);
1271 clear_mat(ir
->compress
);
1272 for (i
= 0; i
< DIM
; i
++)
1274 ir
->compress
[i
][i
] = vdum
[i
];
1279 gmx_fio_do_rvec(fio
, ir
->compress
[XX
]);
1280 gmx_fio_do_rvec(fio
, ir
->compress
[YY
]);
1281 gmx_fio_do_rvec(fio
, ir
->compress
[ZZ
]);
1283 if (file_version
>= 47)
1285 gmx_fio_do_int(fio
, ir
->refcoord_scaling
);
1286 gmx_fio_do_rvec(fio
, ir
->posres_com
);
1287 gmx_fio_do_rvec(fio
, ir
->posres_comB
);
1291 ir
->refcoord_scaling
= erscNO
;
1292 clear_rvec(ir
->posres_com
);
1293 clear_rvec(ir
->posres_comB
);
1295 if ((file_version
> 25) && (file_version
< 79))
1297 gmx_fio_do_int(fio
, ir
->andersen_seed
);
1301 ir
->andersen_seed
= 0;
1303 if (file_version
< 26)
1305 gmx_fio_do_gmx_bool(fio
, bSimAnn
);
1306 gmx_fio_do_real(fio
, zerotemptime
);
1309 if (file_version
< 37)
1311 gmx_fio_do_real(fio
, rdum
);
1314 gmx_fio_do_real(fio
, ir
->shake_tol
);
1315 if (file_version
< 54)
1317 gmx_fio_do_real(fio
, *fudgeQQ
);
1320 gmx_fio_do_int(fio
, ir
->efep
);
1321 if (file_version
<= 14 && ir
->efep
!= efepNO
)
1325 do_fepvals(fio
, ir
->fepvals
, bRead
, file_version
);
1327 if (file_version
>= 79)
1329 gmx_fio_do_gmx_bool(fio
, ir
->bSimTemp
);
1332 ir
->bSimTemp
= TRUE
;
1337 ir
->bSimTemp
= FALSE
;
1341 do_simtempvals(fio
, ir
->simtempvals
, ir
->fepvals
->n_lambda
, bRead
, file_version
);
1344 if (file_version
>= 79)
1346 gmx_fio_do_gmx_bool(fio
, ir
->bExpanded
);
1349 ir
->bExpanded
= TRUE
;
1353 ir
->bExpanded
= FALSE
;
1358 do_expandedvals(fio
, ir
->expandedvals
, ir
->fepvals
, bRead
, file_version
);
1360 if (file_version
>= 57)
1362 gmx_fio_do_int(fio
, ir
->eDisre
);
1364 gmx_fio_do_int(fio
, ir
->eDisreWeighting
);
1365 if (file_version
< 22)
1367 if (ir
->eDisreWeighting
== 0)
1369 ir
->eDisreWeighting
= edrwEqual
;
1373 ir
->eDisreWeighting
= edrwConservative
;
1376 gmx_fio_do_gmx_bool(fio
, ir
->bDisreMixed
);
1377 gmx_fio_do_real(fio
, ir
->dr_fc
);
1378 gmx_fio_do_real(fio
, ir
->dr_tau
);
1379 gmx_fio_do_int(fio
, ir
->nstdisreout
);
1380 if (file_version
>= 22)
1382 gmx_fio_do_real(fio
, ir
->orires_fc
);
1383 gmx_fio_do_real(fio
, ir
->orires_tau
);
1384 gmx_fio_do_int(fio
, ir
->nstorireout
);
1390 ir
->nstorireout
= 0;
1393 /* ignore dihre_fc */
1394 if (file_version
>= 26 && file_version
< 79)
1396 gmx_fio_do_real(fio
, rdum
);
1397 if (file_version
< 56)
1399 gmx_fio_do_real(fio
, rdum
);
1400 gmx_fio_do_int(fio
, idum
);
1404 gmx_fio_do_real(fio
, ir
->em_stepsize
);
1405 gmx_fio_do_real(fio
, ir
->em_tol
);
1406 if (file_version
>= 22)
1408 gmx_fio_do_gmx_bool(fio
, ir
->bShakeSOR
);
1412 ir
->bShakeSOR
= TRUE
;
1414 if (file_version
>= 11)
1416 gmx_fio_do_int(fio
, ir
->niter
);
1421 fprintf(stderr
, "Note: niter not in run input file, setting it to %d\n",
1424 if (file_version
>= 21)
1426 gmx_fio_do_real(fio
, ir
->fc_stepsize
);
1430 ir
->fc_stepsize
= 0;
1432 gmx_fio_do_int(fio
, ir
->eConstrAlg
);
1433 gmx_fio_do_int(fio
, ir
->nProjOrder
);
1434 gmx_fio_do_real(fio
, ir
->LincsWarnAngle
);
1435 if (file_version
<= 14)
1437 gmx_fio_do_int(fio
, idum
);
1439 if (file_version
>= 26)
1441 gmx_fio_do_int(fio
, ir
->nLincsIter
);
1446 fprintf(stderr
, "Note: nLincsIter not in run input file, setting it to %d\n",
1449 if (file_version
< 33)
1451 gmx_fio_do_real(fio
, bd_temp
);
1453 gmx_fio_do_real(fio
, ir
->bd_fric
);
1454 if (file_version
>= tpxv_Use64BitRandomSeed
)
1456 gmx_fio_do_int64(fio
, ir
->ld_seed
);
1460 gmx_fio_do_int(fio
, idum
);
1463 if (file_version
>= 33)
1465 for (i
= 0; i
< DIM
; i
++)
1467 gmx_fio_do_rvec(fio
, ir
->deform
[i
]);
1472 for (i
= 0; i
< DIM
; i
++)
1474 clear_rvec(ir
->deform
[i
]);
1477 if (file_version
>= 14)
1479 gmx_fio_do_real(fio
, ir
->cos_accel
);
1485 gmx_fio_do_int(fio
, ir
->userint1
);
1486 gmx_fio_do_int(fio
, ir
->userint2
);
1487 gmx_fio_do_int(fio
, ir
->userint3
);
1488 gmx_fio_do_int(fio
, ir
->userint4
);
1489 gmx_fio_do_real(fio
, ir
->userreal1
);
1490 gmx_fio_do_real(fio
, ir
->userreal2
);
1491 gmx_fio_do_real(fio
, ir
->userreal3
);
1492 gmx_fio_do_real(fio
, ir
->userreal4
);
1495 if (file_version
>= 77)
1497 gmx_fio_do_gmx_bool(fio
, ir
->bAdress
);
1502 snew(ir
->adress
, 1);
1504 gmx_fio_do_int(fio
, ir
->adress
->type
);
1505 gmx_fio_do_real(fio
, ir
->adress
->const_wf
);
1506 gmx_fio_do_real(fio
, ir
->adress
->ex_width
);
1507 gmx_fio_do_real(fio
, ir
->adress
->hy_width
);
1508 gmx_fio_do_int(fio
, ir
->adress
->icor
);
1509 gmx_fio_do_int(fio
, ir
->adress
->site
);
1510 gmx_fio_do_rvec(fio
, ir
->adress
->refs
);
1511 gmx_fio_do_int(fio
, ir
->adress
->n_tf_grps
);
1512 gmx_fio_do_real(fio
, ir
->adress
->ex_forcecap
);
1513 gmx_fio_do_int(fio
, ir
->adress
->n_energy_grps
);
1514 gmx_fio_do_int(fio
, ir
->adress
->do_hybridpairs
);
1518 snew(ir
->adress
->tf_table_index
, ir
->adress
->n_tf_grps
);
1520 if (ir
->adress
->n_tf_grps
> 0)
1522 gmx_fio_ndo_int(fio
, ir
->adress
->tf_table_index
, ir
->adress
->n_tf_grps
);
1526 snew(ir
->adress
->group_explicit
, ir
->adress
->n_energy_grps
);
1528 if (ir
->adress
->n_energy_grps
> 0)
1530 gmx_fio_ndo_int(fio
, ir
->adress
->group_explicit
, ir
->adress
->n_energy_grps
);
1536 ir
->bAdress
= FALSE
;
1540 if (file_version
>= 48)
1542 gmx_fio_do_int(fio
, ir
->ePull
);
1543 if (ir
->ePull
!= epullNO
)
1549 do_pull(fio
, ir
->pull
, bRead
, file_version
);
1554 ir
->ePull
= epullNO
;
1557 /* Enforced rotation */
1558 if (file_version
>= 74)
1560 gmx_fio_do_int(fio
, ir
->bRot
);
1561 if (ir
->bRot
== TRUE
)
1567 do_rot(fio
, ir
->rot
, bRead
);
1575 /* Interactive molecular dynamics */
1576 if (file_version
>= tpxv_InteractiveMolecularDynamics
)
1578 gmx_fio_do_int(fio
, ir
->bIMD
);
1579 if (TRUE
== ir
->bIMD
)
1585 do_imd(fio
, ir
->imd
, bRead
);
1590 /* We don't support IMD sessions for old .tpr files */
1595 gmx_fio_do_int(fio
, ir
->opts
.ngtc
);
1596 if (file_version
>= 69)
1598 gmx_fio_do_int(fio
, ir
->opts
.nhchainlength
);
1602 ir
->opts
.nhchainlength
= 1;
1604 gmx_fio_do_int(fio
, ir
->opts
.ngacc
);
1605 gmx_fio_do_int(fio
, ir
->opts
.ngfrz
);
1606 gmx_fio_do_int(fio
, ir
->opts
.ngener
);
1610 snew(ir
->opts
.nrdf
, ir
->opts
.ngtc
);
1611 snew(ir
->opts
.ref_t
, ir
->opts
.ngtc
);
1612 snew(ir
->opts
.annealing
, ir
->opts
.ngtc
);
1613 snew(ir
->opts
.anneal_npoints
, ir
->opts
.ngtc
);
1614 snew(ir
->opts
.anneal_time
, ir
->opts
.ngtc
);
1615 snew(ir
->opts
.anneal_temp
, ir
->opts
.ngtc
);
1616 snew(ir
->opts
.tau_t
, ir
->opts
.ngtc
);
1617 snew(ir
->opts
.nFreeze
, ir
->opts
.ngfrz
);
1618 snew(ir
->opts
.acc
, ir
->opts
.ngacc
);
1619 snew(ir
->opts
.egp_flags
, ir
->opts
.ngener
*ir
->opts
.ngener
);
1621 if (ir
->opts
.ngtc
> 0)
1623 if (bRead
&& file_version
< 13)
1625 snew(tmp
, ir
->opts
.ngtc
);
1626 gmx_fio_ndo_int(fio
, tmp
, ir
->opts
.ngtc
);
1627 for (i
= 0; i
< ir
->opts
.ngtc
; i
++)
1629 ir
->opts
.nrdf
[i
] = tmp
[i
];
1635 gmx_fio_ndo_real(fio
, ir
->opts
.nrdf
, ir
->opts
.ngtc
);
1637 gmx_fio_ndo_real(fio
, ir
->opts
.ref_t
, ir
->opts
.ngtc
);
1638 gmx_fio_ndo_real(fio
, ir
->opts
.tau_t
, ir
->opts
.ngtc
);
1639 if (file_version
< 33 && ir
->eI
== eiBD
)
1641 for (i
= 0; i
< ir
->opts
.ngtc
; i
++)
1643 ir
->opts
.tau_t
[i
] = bd_temp
;
1647 if (ir
->opts
.ngfrz
> 0)
1649 gmx_fio_ndo_ivec(fio
, ir
->opts
.nFreeze
, ir
->opts
.ngfrz
);
1651 if (ir
->opts
.ngacc
> 0)
1653 gmx_fio_ndo_rvec(fio
, ir
->opts
.acc
, ir
->opts
.ngacc
);
1655 if (file_version
>= 12)
1657 gmx_fio_ndo_int(fio
, ir
->opts
.egp_flags
,
1658 ir
->opts
.ngener
*ir
->opts
.ngener
);
1661 if (bRead
&& file_version
< 26)
1663 for (i
= 0; i
< ir
->opts
.ngtc
; i
++)
1667 ir
->opts
.annealing
[i
] = eannSINGLE
;
1668 ir
->opts
.anneal_npoints
[i
] = 2;
1669 snew(ir
->opts
.anneal_time
[i
], 2);
1670 snew(ir
->opts
.anneal_temp
[i
], 2);
1671 /* calculate the starting/ending temperatures from reft, zerotemptime, and nsteps */
1672 finish_t
= ir
->init_t
+ ir
->nsteps
* ir
->delta_t
;
1673 init_temp
= ir
->opts
.ref_t
[i
]*(1-ir
->init_t
/zerotemptime
);
1674 finish_temp
= ir
->opts
.ref_t
[i
]*(1-finish_t
/zerotemptime
);
1675 ir
->opts
.anneal_time
[i
][0] = ir
->init_t
;
1676 ir
->opts
.anneal_time
[i
][1] = finish_t
;
1677 ir
->opts
.anneal_temp
[i
][0] = init_temp
;
1678 ir
->opts
.anneal_temp
[i
][1] = finish_temp
;
1682 ir
->opts
.annealing
[i
] = eannNO
;
1683 ir
->opts
.anneal_npoints
[i
] = 0;
1689 /* file version 26 or later */
1690 /* First read the lists with annealing and npoints for each group */
1691 gmx_fio_ndo_int(fio
, ir
->opts
.annealing
, ir
->opts
.ngtc
);
1692 gmx_fio_ndo_int(fio
, ir
->opts
.anneal_npoints
, ir
->opts
.ngtc
);
1693 for (j
= 0; j
< (ir
->opts
.ngtc
); j
++)
1695 k
= ir
->opts
.anneal_npoints
[j
];
1698 snew(ir
->opts
.anneal_time
[j
], k
);
1699 snew(ir
->opts
.anneal_temp
[j
], k
);
1701 gmx_fio_ndo_real(fio
, ir
->opts
.anneal_time
[j
], k
);
1702 gmx_fio_ndo_real(fio
, ir
->opts
.anneal_temp
[j
], k
);
1706 if (file_version
>= 45)
1708 gmx_fio_do_int(fio
, ir
->nwall
);
1709 gmx_fio_do_int(fio
, ir
->wall_type
);
1710 if (file_version
>= 50)
1712 gmx_fio_do_real(fio
, ir
->wall_r_linpot
);
1716 ir
->wall_r_linpot
= -1;
1718 gmx_fio_do_int(fio
, ir
->wall_atomtype
[0]);
1719 gmx_fio_do_int(fio
, ir
->wall_atomtype
[1]);
1720 gmx_fio_do_real(fio
, ir
->wall_density
[0]);
1721 gmx_fio_do_real(fio
, ir
->wall_density
[1]);
1722 gmx_fio_do_real(fio
, ir
->wall_ewald_zfac
);
1728 ir
->wall_atomtype
[0] = -1;
1729 ir
->wall_atomtype
[1] = -1;
1730 ir
->wall_density
[0] = 0;
1731 ir
->wall_density
[1] = 0;
1732 ir
->wall_ewald_zfac
= 3;
1734 /* Cosine stuff for electric fields */
1735 for (j
= 0; (j
< DIM
); j
++)
1737 gmx_fio_do_int(fio
, ir
->ex
[j
].n
);
1738 gmx_fio_do_int(fio
, ir
->et
[j
].n
);
1741 snew(ir
->ex
[j
].a
, ir
->ex
[j
].n
);
1742 snew(ir
->ex
[j
].phi
, ir
->ex
[j
].n
);
1743 snew(ir
->et
[j
].a
, ir
->et
[j
].n
);
1744 snew(ir
->et
[j
].phi
, ir
->et
[j
].n
);
1746 gmx_fio_ndo_real(fio
, ir
->ex
[j
].a
, ir
->ex
[j
].n
);
1747 gmx_fio_ndo_real(fio
, ir
->ex
[j
].phi
, ir
->ex
[j
].n
);
1748 gmx_fio_ndo_real(fio
, ir
->et
[j
].a
, ir
->et
[j
].n
);
1749 gmx_fio_ndo_real(fio
, ir
->et
[j
].phi
, ir
->et
[j
].n
);
1753 if (file_version
>= tpxv_ComputationalElectrophysiology
)
1755 gmx_fio_do_int(fio
, ir
->eSwapCoords
);
1756 if (ir
->eSwapCoords
!= eswapNO
)
1762 do_swapcoords(fio
, ir
->swap
, bRead
);
1767 if (file_version
>= 39)
1769 gmx_fio_do_gmx_bool(fio
, ir
->bQMMM
);
1770 gmx_fio_do_int(fio
, ir
->QMMMscheme
);
1771 gmx_fio_do_real(fio
, ir
->scalefactor
);
1772 gmx_fio_do_int(fio
, ir
->opts
.ngQM
);
1775 snew(ir
->opts
.QMmethod
, ir
->opts
.ngQM
);
1776 snew(ir
->opts
.QMbasis
, ir
->opts
.ngQM
);
1777 snew(ir
->opts
.QMcharge
, ir
->opts
.ngQM
);
1778 snew(ir
->opts
.QMmult
, ir
->opts
.ngQM
);
1779 snew(ir
->opts
.bSH
, ir
->opts
.ngQM
);
1780 snew(ir
->opts
.CASorbitals
, ir
->opts
.ngQM
);
1781 snew(ir
->opts
.CASelectrons
, ir
->opts
.ngQM
);
1782 snew(ir
->opts
.SAon
, ir
->opts
.ngQM
);
1783 snew(ir
->opts
.SAoff
, ir
->opts
.ngQM
);
1784 snew(ir
->opts
.SAsteps
, ir
->opts
.ngQM
);
1785 snew(ir
->opts
.bOPT
, ir
->opts
.ngQM
);
1786 snew(ir
->opts
.bTS
, ir
->opts
.ngQM
);
1788 if (ir
->opts
.ngQM
> 0)
1790 gmx_fio_ndo_int(fio
, ir
->opts
.QMmethod
, ir
->opts
.ngQM
);
1791 gmx_fio_ndo_int(fio
, ir
->opts
.QMbasis
, ir
->opts
.ngQM
);
1792 gmx_fio_ndo_int(fio
, ir
->opts
.QMcharge
, ir
->opts
.ngQM
);
1793 gmx_fio_ndo_int(fio
, ir
->opts
.QMmult
, ir
->opts
.ngQM
);
1794 gmx_fio_ndo_gmx_bool(fio
, ir
->opts
.bSH
, ir
->opts
.ngQM
);
1795 gmx_fio_ndo_int(fio
, ir
->opts
.CASorbitals
, ir
->opts
.ngQM
);
1796 gmx_fio_ndo_int(fio
, ir
->opts
.CASelectrons
, ir
->opts
.ngQM
);
1797 gmx_fio_ndo_real(fio
, ir
->opts
.SAon
, ir
->opts
.ngQM
);
1798 gmx_fio_ndo_real(fio
, ir
->opts
.SAoff
, ir
->opts
.ngQM
);
1799 gmx_fio_ndo_int(fio
, ir
->opts
.SAsteps
, ir
->opts
.ngQM
);
1800 gmx_fio_ndo_gmx_bool(fio
, ir
->opts
.bOPT
, ir
->opts
.ngQM
);
1801 gmx_fio_ndo_gmx_bool(fio
, ir
->opts
.bTS
, ir
->opts
.ngQM
);
1803 /* end of QMMM stuff */
1808 static void do_harm(t_fileio
*fio
, t_iparams
*iparams
)
1810 gmx_fio_do_real(fio
, iparams
->harmonic
.rA
);
1811 gmx_fio_do_real(fio
, iparams
->harmonic
.krA
);
1812 gmx_fio_do_real(fio
, iparams
->harmonic
.rB
);
1813 gmx_fio_do_real(fio
, iparams
->harmonic
.krB
);
1816 void do_iparams(t_fileio
*fio
, t_functype ftype
, t_iparams
*iparams
,
1817 gmx_bool bRead
, int file_version
)
1824 gmx_fio_set_comment(fio
, interaction_function
[ftype
].name
);
1834 do_harm(fio
, iparams
);
1835 if ((ftype
== F_ANGRES
|| ftype
== F_ANGRESZ
) && bRead
)
1837 /* Correct incorrect storage of parameters */
1838 iparams
->pdihs
.phiB
= iparams
->pdihs
.phiA
;
1839 iparams
->pdihs
.cpB
= iparams
->pdihs
.cpA
;
1843 gmx_fio_do_real(fio
, iparams
->harmonic
.rA
);
1844 gmx_fio_do_real(fio
, iparams
->harmonic
.krA
);
1846 case F_LINEAR_ANGLES
:
1847 gmx_fio_do_real(fio
, iparams
->linangle
.klinA
);
1848 gmx_fio_do_real(fio
, iparams
->linangle
.aA
);
1849 gmx_fio_do_real(fio
, iparams
->linangle
.klinB
);
1850 gmx_fio_do_real(fio
, iparams
->linangle
.aB
);
1853 gmx_fio_do_real(fio
, iparams
->fene
.bm
);
1854 gmx_fio_do_real(fio
, iparams
->fene
.kb
);
1858 gmx_fio_do_real(fio
, iparams
->restraint
.lowA
);
1859 gmx_fio_do_real(fio
, iparams
->restraint
.up1A
);
1860 gmx_fio_do_real(fio
, iparams
->restraint
.up2A
);
1861 gmx_fio_do_real(fio
, iparams
->restraint
.kA
);
1862 gmx_fio_do_real(fio
, iparams
->restraint
.lowB
);
1863 gmx_fio_do_real(fio
, iparams
->restraint
.up1B
);
1864 gmx_fio_do_real(fio
, iparams
->restraint
.up2B
);
1865 gmx_fio_do_real(fio
, iparams
->restraint
.kB
);
1871 gmx_fio_do_real(fio
, iparams
->tab
.kA
);
1872 gmx_fio_do_int(fio
, iparams
->tab
.table
);
1873 gmx_fio_do_real(fio
, iparams
->tab
.kB
);
1875 case F_CROSS_BOND_BONDS
:
1876 gmx_fio_do_real(fio
, iparams
->cross_bb
.r1e
);
1877 gmx_fio_do_real(fio
, iparams
->cross_bb
.r2e
);
1878 gmx_fio_do_real(fio
, iparams
->cross_bb
.krr
);
1880 case F_CROSS_BOND_ANGLES
:
1881 gmx_fio_do_real(fio
, iparams
->cross_ba
.r1e
);
1882 gmx_fio_do_real(fio
, iparams
->cross_ba
.r2e
);
1883 gmx_fio_do_real(fio
, iparams
->cross_ba
.r3e
);
1884 gmx_fio_do_real(fio
, iparams
->cross_ba
.krt
);
1886 case F_UREY_BRADLEY
:
1887 gmx_fio_do_real(fio
, iparams
->u_b
.thetaA
);
1888 gmx_fio_do_real(fio
, iparams
->u_b
.kthetaA
);
1889 gmx_fio_do_real(fio
, iparams
->u_b
.r13A
);
1890 gmx_fio_do_real(fio
, iparams
->u_b
.kUBA
);
1891 if (file_version
>= 79)
1893 gmx_fio_do_real(fio
, iparams
->u_b
.thetaB
);
1894 gmx_fio_do_real(fio
, iparams
->u_b
.kthetaB
);
1895 gmx_fio_do_real(fio
, iparams
->u_b
.r13B
);
1896 gmx_fio_do_real(fio
, iparams
->u_b
.kUBB
);
1900 iparams
->u_b
.thetaB
= iparams
->u_b
.thetaA
;
1901 iparams
->u_b
.kthetaB
= iparams
->u_b
.kthetaA
;
1902 iparams
->u_b
.r13B
= iparams
->u_b
.r13A
;
1903 iparams
->u_b
.kUBB
= iparams
->u_b
.kUBA
;
1906 case F_QUARTIC_ANGLES
:
1907 gmx_fio_do_real(fio
, iparams
->qangle
.theta
);
1908 gmx_fio_ndo_real(fio
, iparams
->qangle
.c
, 5);
1911 gmx_fio_do_real(fio
, iparams
->bham
.a
);
1912 gmx_fio_do_real(fio
, iparams
->bham
.b
);
1913 gmx_fio_do_real(fio
, iparams
->bham
.c
);
1916 gmx_fio_do_real(fio
, iparams
->morse
.b0A
);
1917 gmx_fio_do_real(fio
, iparams
->morse
.cbA
);
1918 gmx_fio_do_real(fio
, iparams
->morse
.betaA
);
1919 if (file_version
>= 79)
1921 gmx_fio_do_real(fio
, iparams
->morse
.b0B
);
1922 gmx_fio_do_real(fio
, iparams
->morse
.cbB
);
1923 gmx_fio_do_real(fio
, iparams
->morse
.betaB
);
1927 iparams
->morse
.b0B
= iparams
->morse
.b0A
;
1928 iparams
->morse
.cbB
= iparams
->morse
.cbA
;
1929 iparams
->morse
.betaB
= iparams
->morse
.betaA
;
1933 gmx_fio_do_real(fio
, iparams
->cubic
.b0
);
1934 gmx_fio_do_real(fio
, iparams
->cubic
.kb
);
1935 gmx_fio_do_real(fio
, iparams
->cubic
.kcub
);
1939 case F_POLARIZATION
:
1940 gmx_fio_do_real(fio
, iparams
->polarize
.alpha
);
1943 gmx_fio_do_real(fio
, iparams
->anharm_polarize
.alpha
);
1944 gmx_fio_do_real(fio
, iparams
->anharm_polarize
.drcut
);
1945 gmx_fio_do_real(fio
, iparams
->anharm_polarize
.khyp
);
1948 if (file_version
< 31)
1950 gmx_fatal(FARGS
, "Old tpr files with water_polarization not supported. Make a new.");
1952 gmx_fio_do_real(fio
, iparams
->wpol
.al_x
);
1953 gmx_fio_do_real(fio
, iparams
->wpol
.al_y
);
1954 gmx_fio_do_real(fio
, iparams
->wpol
.al_z
);
1955 gmx_fio_do_real(fio
, iparams
->wpol
.rOH
);
1956 gmx_fio_do_real(fio
, iparams
->wpol
.rHH
);
1957 gmx_fio_do_real(fio
, iparams
->wpol
.rOD
);
1960 gmx_fio_do_real(fio
, iparams
->thole
.a
);
1961 gmx_fio_do_real(fio
, iparams
->thole
.alpha1
);
1962 gmx_fio_do_real(fio
, iparams
->thole
.alpha2
);
1963 gmx_fio_do_real(fio
, iparams
->thole
.rfac
);
1966 gmx_fio_do_real(fio
, iparams
->lj
.c6
);
1967 gmx_fio_do_real(fio
, iparams
->lj
.c12
);
1970 gmx_fio_do_real(fio
, iparams
->lj14
.c6A
);
1971 gmx_fio_do_real(fio
, iparams
->lj14
.c12A
);
1972 gmx_fio_do_real(fio
, iparams
->lj14
.c6B
);
1973 gmx_fio_do_real(fio
, iparams
->lj14
.c12B
);
1976 gmx_fio_do_real(fio
, iparams
->ljc14
.fqq
);
1977 gmx_fio_do_real(fio
, iparams
->ljc14
.qi
);
1978 gmx_fio_do_real(fio
, iparams
->ljc14
.qj
);
1979 gmx_fio_do_real(fio
, iparams
->ljc14
.c6
);
1980 gmx_fio_do_real(fio
, iparams
->ljc14
.c12
);
1982 case F_LJC_PAIRS_NB
:
1983 gmx_fio_do_real(fio
, iparams
->ljcnb
.qi
);
1984 gmx_fio_do_real(fio
, iparams
->ljcnb
.qj
);
1985 gmx_fio_do_real(fio
, iparams
->ljcnb
.c6
);
1986 gmx_fio_do_real(fio
, iparams
->ljcnb
.c12
);
1992 gmx_fio_do_real(fio
, iparams
->pdihs
.phiA
);
1993 gmx_fio_do_real(fio
, iparams
->pdihs
.cpA
);
1994 if ((ftype
== F_ANGRES
|| ftype
== F_ANGRESZ
) && file_version
< 42)
1996 /* Read the incorrectly stored multiplicity */
1997 gmx_fio_do_real(fio
, iparams
->harmonic
.rB
);
1998 gmx_fio_do_real(fio
, iparams
->harmonic
.krB
);
1999 iparams
->pdihs
.phiB
= iparams
->pdihs
.phiA
;
2000 iparams
->pdihs
.cpB
= iparams
->pdihs
.cpA
;
2004 gmx_fio_do_real(fio
, iparams
->pdihs
.phiB
);
2005 gmx_fio_do_real(fio
, iparams
->pdihs
.cpB
);
2006 gmx_fio_do_int(fio
, iparams
->pdihs
.mult
);
2010 gmx_fio_do_real(fio
, iparams
->pdihs
.phiA
);
2011 gmx_fio_do_real(fio
, iparams
->pdihs
.cpA
);
2014 gmx_fio_do_int(fio
, iparams
->disres
.label
);
2015 gmx_fio_do_int(fio
, iparams
->disres
.type
);
2016 gmx_fio_do_real(fio
, iparams
->disres
.low
);
2017 gmx_fio_do_real(fio
, iparams
->disres
.up1
);
2018 gmx_fio_do_real(fio
, iparams
->disres
.up2
);
2019 gmx_fio_do_real(fio
, iparams
->disres
.kfac
);
2022 gmx_fio_do_int(fio
, iparams
->orires
.ex
);
2023 gmx_fio_do_int(fio
, iparams
->orires
.label
);
2024 gmx_fio_do_int(fio
, iparams
->orires
.power
);
2025 gmx_fio_do_real(fio
, iparams
->orires
.c
);
2026 gmx_fio_do_real(fio
, iparams
->orires
.obs
);
2027 gmx_fio_do_real(fio
, iparams
->orires
.kfac
);
2030 if (file_version
< 82)
2032 gmx_fio_do_int(fio
, idum
);
2033 gmx_fio_do_int(fio
, idum
);
2035 gmx_fio_do_real(fio
, iparams
->dihres
.phiA
);
2036 gmx_fio_do_real(fio
, iparams
->dihres
.dphiA
);
2037 gmx_fio_do_real(fio
, iparams
->dihres
.kfacA
);
2038 if (file_version
>= 82)
2040 gmx_fio_do_real(fio
, iparams
->dihres
.phiB
);
2041 gmx_fio_do_real(fio
, iparams
->dihres
.dphiB
);
2042 gmx_fio_do_real(fio
, iparams
->dihres
.kfacB
);
2046 iparams
->dihres
.phiB
= iparams
->dihres
.phiA
;
2047 iparams
->dihres
.dphiB
= iparams
->dihres
.dphiA
;
2048 iparams
->dihres
.kfacB
= iparams
->dihres
.kfacA
;
2052 gmx_fio_do_rvec(fio
, iparams
->posres
.pos0A
);
2053 gmx_fio_do_rvec(fio
, iparams
->posres
.fcA
);
2054 if (bRead
&& file_version
< 27)
2056 copy_rvec(iparams
->posres
.pos0A
, iparams
->posres
.pos0B
);
2057 copy_rvec(iparams
->posres
.fcA
, iparams
->posres
.fcB
);
2061 gmx_fio_do_rvec(fio
, iparams
->posres
.pos0B
);
2062 gmx_fio_do_rvec(fio
, iparams
->posres
.fcB
);
2066 gmx_fio_do_int(fio
, iparams
->fbposres
.geom
);
2067 gmx_fio_do_rvec(fio
, iparams
->fbposres
.pos0
);
2068 gmx_fio_do_real(fio
, iparams
->fbposres
.r
);
2069 gmx_fio_do_real(fio
, iparams
->fbposres
.k
);
2072 gmx_fio_ndo_real(fio
, iparams
->cbtdihs
.cbtcA
, NR_CBTDIHS
);
2075 gmx_fio_ndo_real(fio
, iparams
->rbdihs
.rbcA
, NR_RBDIHS
);
2076 if (file_version
>= 25)
2078 gmx_fio_ndo_real(fio
, iparams
->rbdihs
.rbcB
, NR_RBDIHS
);
2082 /* Fourier dihedrals are internally represented
2083 * as Ryckaert-Bellemans since those are faster to compute.
2085 gmx_fio_ndo_real(fio
, iparams
->rbdihs
.rbcA
, NR_RBDIHS
);
2086 gmx_fio_ndo_real(fio
, iparams
->rbdihs
.rbcB
, NR_RBDIHS
);
2090 gmx_fio_do_real(fio
, iparams
->constr
.dA
);
2091 gmx_fio_do_real(fio
, iparams
->constr
.dB
);
2094 gmx_fio_do_real(fio
, iparams
->settle
.doh
);
2095 gmx_fio_do_real(fio
, iparams
->settle
.dhh
);
2098 gmx_fio_do_real(fio
, iparams
->vsite
.a
);
2103 gmx_fio_do_real(fio
, iparams
->vsite
.a
);
2104 gmx_fio_do_real(fio
, iparams
->vsite
.b
);
2109 gmx_fio_do_real(fio
, iparams
->vsite
.a
);
2110 gmx_fio_do_real(fio
, iparams
->vsite
.b
);
2111 gmx_fio_do_real(fio
, iparams
->vsite
.c
);
2114 gmx_fio_do_int(fio
, iparams
->vsiten
.n
);
2115 gmx_fio_do_real(fio
, iparams
->vsiten
.a
);
2120 /* We got rid of some parameters in version 68 */
2121 if (bRead
&& file_version
< 68)
2123 gmx_fio_do_real(fio
, rdum
);
2124 gmx_fio_do_real(fio
, rdum
);
2125 gmx_fio_do_real(fio
, rdum
);
2126 gmx_fio_do_real(fio
, rdum
);
2128 gmx_fio_do_real(fio
, iparams
->gb
.sar
);
2129 gmx_fio_do_real(fio
, iparams
->gb
.st
);
2130 gmx_fio_do_real(fio
, iparams
->gb
.pi
);
2131 gmx_fio_do_real(fio
, iparams
->gb
.gbr
);
2132 gmx_fio_do_real(fio
, iparams
->gb
.bmlt
);
2135 gmx_fio_do_int(fio
, iparams
->cmap
.cmapA
);
2136 gmx_fio_do_int(fio
, iparams
->cmap
.cmapB
);
2139 gmx_fatal(FARGS
, "unknown function type %d (%s) in %s line %d",
2140 ftype
, interaction_function
[ftype
].name
, __FILE__
, __LINE__
);
2144 gmx_fio_unset_comment(fio
);
2148 static void do_ilist(t_fileio
*fio
, t_ilist
*ilist
, gmx_bool bRead
, int file_version
,
2155 gmx_fio_set_comment(fio
, interaction_function
[ftype
].name
);
2157 if (file_version
< 44)
2159 for (i
= 0; i
< MAXNODES
; i
++)
2161 gmx_fio_do_int(fio
, idum
);
2164 gmx_fio_do_int(fio
, ilist
->nr
);
2167 snew(ilist
->iatoms
, ilist
->nr
);
2169 gmx_fio_ndo_int(fio
, ilist
->iatoms
, ilist
->nr
);
2172 gmx_fio_unset_comment(fio
);
2176 static void do_ffparams(t_fileio
*fio
, gmx_ffparams_t
*ffparams
,
2177 gmx_bool bRead
, int file_version
)
2182 gmx_fio_do_int(fio
, ffparams
->atnr
);
2183 if (file_version
< 57)
2185 gmx_fio_do_int(fio
, idum
);
2187 gmx_fio_do_int(fio
, ffparams
->ntypes
);
2190 fprintf(debug
, "ffparams->atnr = %d, ntypes = %d\n",
2191 ffparams
->atnr
, ffparams
->ntypes
);
2195 snew(ffparams
->functype
, ffparams
->ntypes
);
2196 snew(ffparams
->iparams
, ffparams
->ntypes
);
2198 /* Read/write all the function types */
2199 gmx_fio_ndo_int(fio
, ffparams
->functype
, ffparams
->ntypes
);
2202 pr_ivec(debug
, 0, "functype", ffparams
->functype
, ffparams
->ntypes
, TRUE
);
2205 if (file_version
>= 66)
2207 gmx_fio_do_double(fio
, ffparams
->reppow
);
2211 ffparams
->reppow
= 12.0;
2214 if (file_version
>= 57)
2216 gmx_fio_do_real(fio
, ffparams
->fudgeQQ
);
2219 /* Check whether all these function types are supported by the code.
2220 * In practice the code is backwards compatible, which means that the
2221 * numbering may have to be altered from old numbering to new numbering
2223 for (i
= 0; (i
< ffparams
->ntypes
); i
++)
2227 /* Loop over file versions */
2228 for (k
= 0; (k
< NFTUPD
); k
++)
2230 /* Compare the read file_version to the update table */
2231 if ((file_version
< ftupd
[k
].fvnr
) &&
2232 (ffparams
->functype
[i
] >= ftupd
[k
].ftype
))
2234 ffparams
->functype
[i
] += 1;
2237 fprintf(debug
, "Incrementing function type %d to %d (due to %s)\n",
2238 i
, ffparams
->functype
[i
],
2239 interaction_function
[ftupd
[k
].ftype
].longname
);
2246 do_iparams(fio
, ffparams
->functype
[i
], &ffparams
->iparams
[i
], bRead
,
2250 pr_iparams(debug
, ffparams
->functype
[i
], &ffparams
->iparams
[i
]);
2255 static void add_settle_atoms(t_ilist
*ilist
)
2259 /* Settle used to only store the first atom: add the other two */
2260 srenew(ilist
->iatoms
, 2*ilist
->nr
);
2261 for (i
= ilist
->nr
/2-1; i
>= 0; i
--)
2263 ilist
->iatoms
[4*i
+0] = ilist
->iatoms
[2*i
+0];
2264 ilist
->iatoms
[4*i
+1] = ilist
->iatoms
[2*i
+1];
2265 ilist
->iatoms
[4*i
+2] = ilist
->iatoms
[2*i
+1] + 1;
2266 ilist
->iatoms
[4*i
+3] = ilist
->iatoms
[2*i
+1] + 2;
2268 ilist
->nr
= 2*ilist
->nr
;
2271 static void do_ilists(t_fileio
*fio
, t_ilist
*ilist
, gmx_bool bRead
,
2274 int i
, j
, renum
[F_NRE
];
2278 for (j
= 0; (j
< F_NRE
); j
++)
2283 for (k
= 0; k
< NFTUPD
; k
++)
2285 if ((file_version
< ftupd
[k
].fvnr
) && (j
== ftupd
[k
].ftype
))
2294 ilist
[j
].iatoms
= NULL
;
2298 do_ilist(fio
, &ilist
[j
], bRead
, file_version
, j
);
2299 if (file_version
< 78 && j
== F_SETTLE
&& ilist
[j
].nr
> 0)
2301 add_settle_atoms(&ilist
[j
]);
2305 if (bRead && gmx_debug_at)
2306 pr_ilist(debug,0,interaction_function[j].longname,
2307 functype,&ilist[j],TRUE);
2312 static void do_idef(t_fileio
*fio
, gmx_ffparams_t
*ffparams
, gmx_moltype_t
*molt
,
2313 gmx_bool bRead
, int file_version
)
2315 do_ffparams(fio
, ffparams
, bRead
, file_version
);
2317 if (file_version
>= 54)
2319 gmx_fio_do_real(fio
, ffparams
->fudgeQQ
);
2322 do_ilists(fio
, molt
->ilist
, bRead
, file_version
);
2325 static void do_block(t_fileio
*fio
, t_block
*block
, gmx_bool bRead
, int file_version
)
2327 int i
, idum
, dum_nra
, *dum_a
;
2329 if (file_version
< 44)
2331 for (i
= 0; i
< MAXNODES
; i
++)
2333 gmx_fio_do_int(fio
, idum
);
2336 gmx_fio_do_int(fio
, block
->nr
);
2337 if (file_version
< 51)
2339 gmx_fio_do_int(fio
, dum_nra
);
2343 if ((block
->nalloc_index
> 0) && (NULL
!= block
->index
))
2345 sfree(block
->index
);
2347 block
->nalloc_index
= block
->nr
+1;
2348 snew(block
->index
, block
->nalloc_index
);
2350 gmx_fio_ndo_int(fio
, block
->index
, block
->nr
+1);
2352 if (file_version
< 51 && dum_nra
> 0)
2354 snew(dum_a
, dum_nra
);
2355 gmx_fio_ndo_int(fio
, dum_a
, dum_nra
);
2360 static void do_blocka(t_fileio
*fio
, t_blocka
*block
, gmx_bool bRead
,
2365 if (file_version
< 44)
2367 for (i
= 0; i
< MAXNODES
; i
++)
2369 gmx_fio_do_int(fio
, idum
);
2372 gmx_fio_do_int(fio
, block
->nr
);
2373 gmx_fio_do_int(fio
, block
->nra
);
2376 block
->nalloc_index
= block
->nr
+1;
2377 snew(block
->index
, block
->nalloc_index
);
2378 block
->nalloc_a
= block
->nra
;
2379 snew(block
->a
, block
->nalloc_a
);
2381 gmx_fio_ndo_int(fio
, block
->index
, block
->nr
+1);
2382 gmx_fio_ndo_int(fio
, block
->a
, block
->nra
);
2385 /* This is a primitive routine to make it possible to translate atomic numbers
2386 * to element names when reading TPR files, without making the Gromacs library
2387 * directory a dependency on mdrun (which is the case if we need elements.dat).
2390 atomicnumber_to_element(int atomicnumber
)
2394 /* This does not have to be complete, so we only include elements likely
2395 * to occur in PDB files.
2397 switch (atomicnumber
)
2399 case 1: p
= "H"; break;
2400 case 5: p
= "B"; break;
2401 case 6: p
= "C"; break;
2402 case 7: p
= "N"; break;
2403 case 8: p
= "O"; break;
2404 case 9: p
= "F"; break;
2405 case 11: p
= "Na"; break;
2406 case 12: p
= "Mg"; break;
2407 case 15: p
= "P"; break;
2408 case 16: p
= "S"; break;
2409 case 17: p
= "Cl"; break;
2410 case 18: p
= "Ar"; break;
2411 case 19: p
= "K"; break;
2412 case 20: p
= "Ca"; break;
2413 case 25: p
= "Mn"; break;
2414 case 26: p
= "Fe"; break;
2415 case 28: p
= "Ni"; break;
2416 case 29: p
= "Cu"; break;
2417 case 30: p
= "Zn"; break;
2418 case 35: p
= "Br"; break;
2419 case 47: p
= "Ag"; break;
2420 default: p
= ""; break;
2426 static void do_atom(t_fileio
*fio
, t_atom
*atom
, int ngrp
, gmx_bool bRead
,
2427 int file_version
, gmx_groups_t
*groups
, int atnr
)
2432 gmx_fio_do_real(fio
, atom
->m
);
2433 gmx_fio_do_real(fio
, atom
->q
);
2434 gmx_fio_do_real(fio
, atom
->mB
);
2435 gmx_fio_do_real(fio
, atom
->qB
);
2436 gmx_fio_do_ushort(fio
, atom
->type
);
2437 gmx_fio_do_ushort(fio
, atom
->typeB
);
2438 gmx_fio_do_int(fio
, atom
->ptype
);
2439 gmx_fio_do_int(fio
, atom
->resind
);
2440 if (file_version
>= 52)
2442 gmx_fio_do_int(fio
, atom
->atomnumber
);
2445 /* Set element string from atomic number if present.
2446 * This routine returns an empty string if the name is not found.
2448 strncpy(atom
->elem
, atomicnumber_to_element(atom
->atomnumber
), 4);
2449 /* avoid warnings about potentially unterminated string */
2450 atom
->elem
[3] = '\0';
2455 atom
->atomnumber
= NOTSET
;
2457 if (file_version
< 23)
2461 else if (file_version
< 39)
2470 if (file_version
< 57)
2472 unsigned char uchar
[egcNR
];
2473 gmx_fio_ndo_uchar(fio
, uchar
, myngrp
);
2474 for (i
= myngrp
; (i
< ngrp
); i
++)
2478 /* Copy the old data format to the groups struct */
2479 for (i
= 0; i
< ngrp
; i
++)
2481 groups
->grpnr
[i
][atnr
] = uchar
[i
];
2486 static void do_grps(t_fileio
*fio
, int ngrp
, t_grps grps
[], gmx_bool bRead
,
2491 if (file_version
< 23)
2495 else if (file_version
< 39)
2504 for (j
= 0; (j
< ngrp
); j
++)
2508 gmx_fio_do_int(fio
, grps
[j
].nr
);
2511 snew(grps
[j
].nm_ind
, grps
[j
].nr
);
2513 gmx_fio_ndo_int(fio
, grps
[j
].nm_ind
, grps
[j
].nr
);
2518 snew(grps
[j
].nm_ind
, grps
[j
].nr
);
2523 static void do_symstr(t_fileio
*fio
, char ***nm
, gmx_bool bRead
, t_symtab
*symtab
)
2529 gmx_fio_do_int(fio
, ls
);
2530 *nm
= get_symtab_handle(symtab
, ls
);
2534 ls
= lookup_symtab(symtab
, *nm
);
2535 gmx_fio_do_int(fio
, ls
);
2539 static void do_strstr(t_fileio
*fio
, int nstr
, char ***nm
, gmx_bool bRead
,
2544 for (j
= 0; (j
< nstr
); j
++)
2546 do_symstr(fio
, &(nm
[j
]), bRead
, symtab
);
2550 static void do_resinfo(t_fileio
*fio
, int n
, t_resinfo
*ri
, gmx_bool bRead
,
2551 t_symtab
*symtab
, int file_version
)
2555 for (j
= 0; (j
< n
); j
++)
2557 do_symstr(fio
, &(ri
[j
].name
), bRead
, symtab
);
2558 if (file_version
>= 63)
2560 gmx_fio_do_int(fio
, ri
[j
].nr
);
2561 gmx_fio_do_uchar(fio
, ri
[j
].ic
);
2571 static void do_atoms(t_fileio
*fio
, t_atoms
*atoms
, gmx_bool bRead
, t_symtab
*symtab
,
2573 gmx_groups_t
*groups
)
2577 gmx_fio_do_int(fio
, atoms
->nr
);
2578 gmx_fio_do_int(fio
, atoms
->nres
);
2579 if (file_version
< 57)
2581 gmx_fio_do_int(fio
, groups
->ngrpname
);
2582 for (i
= 0; i
< egcNR
; i
++)
2584 groups
->ngrpnr
[i
] = atoms
->nr
;
2585 snew(groups
->grpnr
[i
], groups
->ngrpnr
[i
]);
2590 snew(atoms
->atom
, atoms
->nr
);
2591 snew(atoms
->atomname
, atoms
->nr
);
2592 snew(atoms
->atomtype
, atoms
->nr
);
2593 snew(atoms
->atomtypeB
, atoms
->nr
);
2594 snew(atoms
->resinfo
, atoms
->nres
);
2595 if (file_version
< 57)
2597 snew(groups
->grpname
, groups
->ngrpname
);
2599 atoms
->pdbinfo
= NULL
;
2601 for (i
= 0; (i
< atoms
->nr
); i
++)
2603 do_atom(fio
, &atoms
->atom
[i
], egcNR
, bRead
, file_version
, groups
, i
);
2605 do_strstr(fio
, atoms
->nr
, atoms
->atomname
, bRead
, symtab
);
2606 if (bRead
&& (file_version
<= 20))
2608 for (i
= 0; i
< atoms
->nr
; i
++)
2610 atoms
->atomtype
[i
] = put_symtab(symtab
, "?");
2611 atoms
->atomtypeB
[i
] = put_symtab(symtab
, "?");
2616 do_strstr(fio
, atoms
->nr
, atoms
->atomtype
, bRead
, symtab
);
2617 do_strstr(fio
, atoms
->nr
, atoms
->atomtypeB
, bRead
, symtab
);
2619 do_resinfo(fio
, atoms
->nres
, atoms
->resinfo
, bRead
, symtab
, file_version
);
2621 if (file_version
< 57)
2623 do_strstr(fio
, groups
->ngrpname
, groups
->grpname
, bRead
, symtab
);
2625 do_grps(fio
, egcNR
, groups
->grps
, bRead
, file_version
);
2629 static void do_groups(t_fileio
*fio
, gmx_groups_t
*groups
,
2630 gmx_bool bRead
, t_symtab
*symtab
,
2635 do_grps(fio
, egcNR
, groups
->grps
, bRead
, file_version
);
2636 gmx_fio_do_int(fio
, groups
->ngrpname
);
2639 snew(groups
->grpname
, groups
->ngrpname
);
2641 do_strstr(fio
, groups
->ngrpname
, groups
->grpname
, bRead
, symtab
);
2642 for (g
= 0; g
< egcNR
; g
++)
2644 gmx_fio_do_int(fio
, groups
->ngrpnr
[g
]);
2645 if (groups
->ngrpnr
[g
] == 0)
2649 groups
->grpnr
[g
] = NULL
;
2656 snew(groups
->grpnr
[g
], groups
->ngrpnr
[g
]);
2658 gmx_fio_ndo_uchar(fio
, groups
->grpnr
[g
], groups
->ngrpnr
[g
]);
2663 static void do_atomtypes(t_fileio
*fio
, t_atomtypes
*atomtypes
, gmx_bool bRead
,
2668 if (file_version
> 25)
2670 gmx_fio_do_int(fio
, atomtypes
->nr
);
2674 snew(atomtypes
->radius
, j
);
2675 snew(atomtypes
->vol
, j
);
2676 snew(atomtypes
->surftens
, j
);
2677 snew(atomtypes
->atomnumber
, j
);
2678 snew(atomtypes
->gb_radius
, j
);
2679 snew(atomtypes
->S_hct
, j
);
2681 gmx_fio_ndo_real(fio
, atomtypes
->radius
, j
);
2682 gmx_fio_ndo_real(fio
, atomtypes
->vol
, j
);
2683 gmx_fio_ndo_real(fio
, atomtypes
->surftens
, j
);
2684 if (file_version
>= 40)
2686 gmx_fio_ndo_int(fio
, atomtypes
->atomnumber
, j
);
2688 if (file_version
>= 60)
2690 gmx_fio_ndo_real(fio
, atomtypes
->gb_radius
, j
);
2691 gmx_fio_ndo_real(fio
, atomtypes
->S_hct
, j
);
2696 /* File versions prior to 26 cannot do GBSA,
2697 * so they dont use this structure
2700 atomtypes
->radius
= NULL
;
2701 atomtypes
->vol
= NULL
;
2702 atomtypes
->surftens
= NULL
;
2703 atomtypes
->atomnumber
= NULL
;
2704 atomtypes
->gb_radius
= NULL
;
2705 atomtypes
->S_hct
= NULL
;
2709 static void do_symtab(t_fileio
*fio
, t_symtab
*symtab
, gmx_bool bRead
)
2715 gmx_fio_do_int(fio
, symtab
->nr
);
2719 snew(symtab
->symbuf
, 1);
2720 symbuf
= symtab
->symbuf
;
2721 symbuf
->bufsize
= nr
;
2722 snew(symbuf
->buf
, nr
);
2723 for (i
= 0; (i
< nr
); i
++)
2725 gmx_fio_do_string(fio
, buf
);
2726 symbuf
->buf
[i
] = strdup(buf
);
2731 symbuf
= symtab
->symbuf
;
2732 while (symbuf
!= NULL
)
2734 for (i
= 0; (i
< symbuf
->bufsize
) && (i
< nr
); i
++)
2736 gmx_fio_do_string(fio
, symbuf
->buf
[i
]);
2739 symbuf
= symbuf
->next
;
2743 gmx_fatal(FARGS
, "nr of symtab strings left: %d", nr
);
2748 static void do_cmap(t_fileio
*fio
, gmx_cmap_t
*cmap_grid
, gmx_bool bRead
)
2750 int i
, j
, ngrid
, gs
, nelem
;
2752 gmx_fio_do_int(fio
, cmap_grid
->ngrid
);
2753 gmx_fio_do_int(fio
, cmap_grid
->grid_spacing
);
2755 ngrid
= cmap_grid
->ngrid
;
2756 gs
= cmap_grid
->grid_spacing
;
2761 snew(cmap_grid
->cmapdata
, ngrid
);
2763 for (i
= 0; i
< cmap_grid
->ngrid
; i
++)
2765 snew(cmap_grid
->cmapdata
[i
].cmap
, 4*nelem
);
2769 for (i
= 0; i
< cmap_grid
->ngrid
; i
++)
2771 for (j
= 0; j
< nelem
; j
++)
2773 gmx_fio_do_real(fio
, cmap_grid
->cmapdata
[i
].cmap
[j
*4]);
2774 gmx_fio_do_real(fio
, cmap_grid
->cmapdata
[i
].cmap
[j
*4+1]);
2775 gmx_fio_do_real(fio
, cmap_grid
->cmapdata
[i
].cmap
[j
*4+2]);
2776 gmx_fio_do_real(fio
, cmap_grid
->cmapdata
[i
].cmap
[j
*4+3]);
2782 void tpx_make_chain_identifiers(t_atoms
*atoms
, t_block
*mols
)
2784 int m
, a
, a0
, a1
, r
;
2788 /* We always assign a new chain number, but save the chain id characters
2789 * for larger molecules.
2791 #define CHAIN_MIN_ATOMS 15
2795 for (m
= 0; m
< mols
->nr
; m
++)
2797 a0
= mols
->index
[m
];
2798 a1
= mols
->index
[m
+1];
2799 if ((a1
-a0
>= CHAIN_MIN_ATOMS
) && (chainid
<= 'Z'))
2808 for (a
= a0
; a
< a1
; a
++)
2810 atoms
->resinfo
[atoms
->atom
[a
].resind
].chainnum
= chainnum
;
2811 atoms
->resinfo
[atoms
->atom
[a
].resind
].chainid
= c
;
2816 /* Blank out the chain id if there was only one chain */
2819 for (r
= 0; r
< atoms
->nres
; r
++)
2821 atoms
->resinfo
[r
].chainid
= ' ';
2826 static void do_moltype(t_fileio
*fio
, gmx_moltype_t
*molt
, gmx_bool bRead
,
2827 t_symtab
*symtab
, int file_version
,
2828 gmx_groups_t
*groups
)
2832 if (file_version
>= 57)
2834 do_symstr(fio
, &(molt
->name
), bRead
, symtab
);
2837 do_atoms(fio
, &molt
->atoms
, bRead
, symtab
, file_version
, groups
);
2839 if (bRead
&& gmx_debug_at
)
2841 pr_atoms(debug
, 0, "atoms", &molt
->atoms
, TRUE
);
2844 if (file_version
>= 57)
2846 do_ilists(fio
, molt
->ilist
, bRead
, file_version
);
2848 do_block(fio
, &molt
->cgs
, bRead
, file_version
);
2849 if (bRead
&& gmx_debug_at
)
2851 pr_block(debug
, 0, "cgs", &molt
->cgs
, TRUE
);
2855 /* This used to be in the atoms struct */
2856 do_blocka(fio
, &molt
->excls
, bRead
, file_version
);
2859 static void do_molblock(t_fileio
*fio
, gmx_molblock_t
*molb
, gmx_bool bRead
)
2863 gmx_fio_do_int(fio
, molb
->type
);
2864 gmx_fio_do_int(fio
, molb
->nmol
);
2865 gmx_fio_do_int(fio
, molb
->natoms_mol
);
2866 /* Position restraint coordinates */
2867 gmx_fio_do_int(fio
, molb
->nposres_xA
);
2868 if (molb
->nposres_xA
> 0)
2872 snew(molb
->posres_xA
, molb
->nposres_xA
);
2874 gmx_fio_ndo_rvec(fio
, molb
->posres_xA
, molb
->nposres_xA
);
2876 gmx_fio_do_int(fio
, molb
->nposres_xB
);
2877 if (molb
->nposres_xB
> 0)
2881 snew(molb
->posres_xB
, molb
->nposres_xB
);
2883 gmx_fio_ndo_rvec(fio
, molb
->posres_xB
, molb
->nposres_xB
);
2888 static t_block
mtop_mols(gmx_mtop_t
*mtop
)
2894 for (mb
= 0; mb
< mtop
->nmolblock
; mb
++)
2896 mols
.nr
+= mtop
->molblock
[mb
].nmol
;
2898 mols
.nalloc_index
= mols
.nr
+ 1;
2899 snew(mols
.index
, mols
.nalloc_index
);
2904 for (mb
= 0; mb
< mtop
->nmolblock
; mb
++)
2906 for (mol
= 0; mol
< mtop
->molblock
[mb
].nmol
; mol
++)
2908 a
+= mtop
->molblock
[mb
].natoms_mol
;
2917 static void add_posres_molblock(gmx_mtop_t
*mtop
)
2922 gmx_molblock_t
*molb
;
2925 /* posres reference positions are stored in ip->posres (if present) and
2926 in ip->fbposres (if present). If normal and flat-bottomed posres are present,
2927 posres.pos0A are identical to fbposres.pos0. */
2928 il
= &mtop
->moltype
[0].ilist
[F_POSRES
];
2929 ilfb
= &mtop
->moltype
[0].ilist
[F_FBPOSRES
];
2930 if (il
->nr
== 0 && ilfb
->nr
== 0)
2936 for (i
= 0; i
< il
->nr
; i
+= 2)
2938 ip
= &mtop
->ffparams
.iparams
[il
->iatoms
[i
]];
2939 am
= max(am
, il
->iatoms
[i
+1]);
2940 if (ip
->posres
.pos0B
[XX
] != ip
->posres
.pos0A
[XX
] ||
2941 ip
->posres
.pos0B
[YY
] != ip
->posres
.pos0A
[YY
] ||
2942 ip
->posres
.pos0B
[ZZ
] != ip
->posres
.pos0A
[ZZ
])
2947 /* This loop is required if we have only flat-bottomed posres:
2949 - bFE == FALSE (no B-state for flat-bottomed posres) */
2952 for (i
= 0; i
< ilfb
->nr
; i
+= 2)
2954 ip
= &mtop
->ffparams
.iparams
[ilfb
->iatoms
[i
]];
2955 am
= max(am
, ilfb
->iatoms
[i
+1]);
2958 /* Make the posres coordinate block end at a molecule end */
2960 while (am
>= mtop
->mols
.index
[mol
+1])
2964 molb
= &mtop
->molblock
[0];
2965 molb
->nposres_xA
= mtop
->mols
.index
[mol
+1];
2966 snew(molb
->posres_xA
, molb
->nposres_xA
);
2969 molb
->nposres_xB
= molb
->nposres_xA
;
2970 snew(molb
->posres_xB
, molb
->nposres_xB
);
2974 molb
->nposres_xB
= 0;
2976 for (i
= 0; i
< il
->nr
; i
+= 2)
2978 ip
= &mtop
->ffparams
.iparams
[il
->iatoms
[i
]];
2979 a
= il
->iatoms
[i
+1];
2980 molb
->posres_xA
[a
][XX
] = ip
->posres
.pos0A
[XX
];
2981 molb
->posres_xA
[a
][YY
] = ip
->posres
.pos0A
[YY
];
2982 molb
->posres_xA
[a
][ZZ
] = ip
->posres
.pos0A
[ZZ
];
2985 molb
->posres_xB
[a
][XX
] = ip
->posres
.pos0B
[XX
];
2986 molb
->posres_xB
[a
][YY
] = ip
->posres
.pos0B
[YY
];
2987 molb
->posres_xB
[a
][ZZ
] = ip
->posres
.pos0B
[ZZ
];
2992 /* If only flat-bottomed posres are present, take reference pos from them.
2993 Here: bFE == FALSE */
2994 for (i
= 0; i
< ilfb
->nr
; i
+= 2)
2996 ip
= &mtop
->ffparams
.iparams
[ilfb
->iatoms
[i
]];
2997 a
= ilfb
->iatoms
[i
+1];
2998 molb
->posres_xA
[a
][XX
] = ip
->fbposres
.pos0
[XX
];
2999 molb
->posres_xA
[a
][YY
] = ip
->fbposres
.pos0
[YY
];
3000 molb
->posres_xA
[a
][ZZ
] = ip
->fbposres
.pos0
[ZZ
];
3005 static void set_disres_npair(gmx_mtop_t
*mtop
)
3012 ip
= mtop
->ffparams
.iparams
;
3014 for (mt
= 0; mt
< mtop
->nmoltype
; mt
++)
3016 il
= &mtop
->moltype
[mt
].ilist
[F_DISRES
];
3021 for (i
= 0; i
< il
->nr
; i
+= 3)
3024 if (i
+3 == il
->nr
|| ip
[a
[i
]].disres
.label
!= ip
[a
[i
+3]].disres
.label
)
3026 ip
[a
[i
]].disres
.npair
= npair
;
3034 static void do_mtop(t_fileio
*fio
, gmx_mtop_t
*mtop
, gmx_bool bRead
,
3044 do_symtab(fio
, &(mtop
->symtab
), bRead
);
3047 pr_symtab(debug
, 0, "symtab", &mtop
->symtab
);
3050 do_symstr(fio
, &(mtop
->name
), bRead
, &(mtop
->symtab
));
3052 if (file_version
>= 57)
3054 do_ffparams(fio
, &mtop
->ffparams
, bRead
, file_version
);
3056 gmx_fio_do_int(fio
, mtop
->nmoltype
);
3064 snew(mtop
->moltype
, mtop
->nmoltype
);
3065 if (file_version
< 57)
3067 mtop
->moltype
[0].name
= mtop
->name
;
3070 for (mt
= 0; mt
< mtop
->nmoltype
; mt
++)
3072 do_moltype(fio
, &mtop
->moltype
[mt
], bRead
, &mtop
->symtab
, file_version
,
3076 if (file_version
>= 57)
3078 gmx_fio_do_int(fio
, mtop
->nmolblock
);
3082 mtop
->nmolblock
= 1;
3086 snew(mtop
->molblock
, mtop
->nmolblock
);
3088 if (file_version
>= 57)
3090 for (mb
= 0; mb
< mtop
->nmolblock
; mb
++)
3092 do_molblock(fio
, &mtop
->molblock
[mb
], bRead
);
3094 gmx_fio_do_int(fio
, mtop
->natoms
);
3098 mtop
->molblock
[0].type
= 0;
3099 mtop
->molblock
[0].nmol
= 1;
3100 mtop
->molblock
[0].natoms_mol
= mtop
->moltype
[0].atoms
.nr
;
3101 mtop
->molblock
[0].nposres_xA
= 0;
3102 mtop
->molblock
[0].nposres_xB
= 0;
3105 do_atomtypes (fio
, &(mtop
->atomtypes
), bRead
, file_version
);
3108 pr_atomtypes(debug
, 0, "atomtypes", &mtop
->atomtypes
, TRUE
);
3111 if (file_version
< 57)
3113 /* Debug statements are inside do_idef */
3114 do_idef (fio
, &mtop
->ffparams
, &mtop
->moltype
[0], bRead
, file_version
);
3115 mtop
->natoms
= mtop
->moltype
[0].atoms
.nr
;
3118 if (file_version
>= 65)
3120 do_cmap(fio
, &mtop
->ffparams
.cmap_grid
, bRead
);
3124 mtop
->ffparams
.cmap_grid
.ngrid
= 0;
3125 mtop
->ffparams
.cmap_grid
.grid_spacing
= 0;
3126 mtop
->ffparams
.cmap_grid
.cmapdata
= NULL
;
3129 if (file_version
>= 57)
3131 do_groups(fio
, &mtop
->groups
, bRead
, &(mtop
->symtab
), file_version
);
3134 if (file_version
< 57)
3136 do_block(fio
, &mtop
->moltype
[0].cgs
, bRead
, file_version
);
3137 if (bRead
&& gmx_debug_at
)
3139 pr_block(debug
, 0, "cgs", &mtop
->moltype
[0].cgs
, TRUE
);
3141 do_block(fio
, &mtop
->mols
, bRead
, file_version
);
3142 /* Add the posres coordinates to the molblock */
3143 add_posres_molblock(mtop
);
3147 if (file_version
>= 57)
3149 done_block(&mtop
->mols
);
3150 mtop
->mols
= mtop_mols(mtop
);
3154 pr_block(debug
, 0, "mols", &mtop
->mols
, TRUE
);
3158 if (file_version
< 51)
3160 /* Here used to be the shake blocks */
3161 do_blocka(fio
, &dumb
, bRead
, file_version
);
3174 close_symtab(&(mtop
->symtab
));
3178 /* If TopOnlyOK is TRUE then we can read even future versions
3179 * of tpx files, provided the file_generation hasn't changed.
3180 * If it is FALSE, we need the inputrecord too, and bail out
3181 * if the file is newer than the program.
3183 * The version and generation if the topology (see top of this file)
3184 * are returned in the two last arguments.
3186 * If possible, we will read the inputrec even when TopOnlyOK is TRUE.
3188 static void do_tpxheader(t_fileio
*fio
, gmx_bool bRead
, t_tpxheader
*tpx
,
3189 gmx_bool TopOnlyOK
, int *file_version
,
3190 int *file_generation
)
3193 char file_tag
[STRLEN
];
3200 gmx_fio_checktype(fio
);
3201 gmx_fio_setdebug(fio
, bDebugMode());
3203 /* NEW! XDR tpb file */
3204 precision
= sizeof(real
);
3207 gmx_fio_do_string(fio
, buf
);
3208 if (strncmp(buf
, "VERSION", 7))
3210 gmx_fatal(FARGS
, "Can not read file %s,\n"
3211 " this file is from a Gromacs version which is older than 2.0\n"
3212 " Make a new one with grompp or use a gro or pdb file, if possible",
3213 gmx_fio_getname(fio
));
3215 gmx_fio_do_int(fio
, precision
);
3216 bDouble
= (precision
== sizeof(double));
3217 if ((precision
!= sizeof(float)) && !bDouble
)
3219 gmx_fatal(FARGS
, "Unknown precision in file %s: real is %d bytes "
3220 "instead of %d or %d",
3221 gmx_fio_getname(fio
), precision
, sizeof(float), sizeof(double));
3223 gmx_fio_setprecision(fio
, bDouble
);
3224 fprintf(stderr
, "Reading file %s, %s (%s precision)\n",
3225 gmx_fio_getname(fio
), buf
, bDouble
? "double" : "single");
3229 gmx_fio_write_string(fio
, GromacsVersion());
3230 bDouble
= (precision
== sizeof(double));
3231 gmx_fio_setprecision(fio
, bDouble
);
3232 gmx_fio_do_int(fio
, precision
);
3234 sprintf(file_tag
, "%s", tpx_tag
);
3235 fgen
= tpx_generation
;
3238 /* Check versions! */
3239 gmx_fio_do_int(fio
, fver
);
3241 /* This is for backward compatibility with development versions 77-79
3242 * where the tag was, mistakenly, placed before the generation,
3243 * which would cause a segv instead of a proper error message
3244 * when reading the topology only from tpx with <77 code.
3246 if (fver
>= 77 && fver
<= 79)
3248 gmx_fio_do_string(fio
, file_tag
);
3253 gmx_fio_do_int(fio
, fgen
);
3262 gmx_fio_do_string(fio
, file_tag
);
3268 /* Versions before 77 don't have the tag, set it to release */
3269 sprintf(file_tag
, "%s", TPX_TAG_RELEASE
);
3272 if (strcmp(file_tag
, tpx_tag
) != 0)
3274 fprintf(stderr
, "Note: file tpx tag '%s', software tpx tag '%s'\n",
3277 /* We only support reading tpx files with the same tag as the code
3278 * or tpx files with the release tag and with lower version number.
3280 if (!strcmp(file_tag
, TPX_TAG_RELEASE
) == 0 && fver
< tpx_version
)
3282 gmx_fatal(FARGS
, "tpx tag/version mismatch: reading tpx file (%s) version %d, tag '%s' with program for tpx version %d, tag '%s'",
3283 gmx_fio_getname(fio
), fver
, file_tag
,
3284 tpx_version
, tpx_tag
);
3289 if (file_version
!= NULL
)
3291 *file_version
= fver
;
3293 if (file_generation
!= NULL
)
3295 *file_generation
= fgen
;
3299 if ((fver
<= tpx_incompatible_version
) ||
3300 ((fver
> tpx_version
) && !TopOnlyOK
) ||
3301 (fgen
> tpx_generation
) ||
3302 tpx_version
== 80) /*80 was used by both 5.0-dev and 4.6-dev*/
3304 gmx_fatal(FARGS
, "reading tpx file (%s) version %d with version %d program",
3305 gmx_fio_getname(fio
), fver
, tpx_version
);
3308 do_section(fio
, eitemHEADER
, bRead
);
3309 gmx_fio_do_int(fio
, tpx
->natoms
);
3312 gmx_fio_do_int(fio
, tpx
->ngtc
);
3320 gmx_fio_do_int(fio
, idum
);
3321 gmx_fio_do_real(fio
, rdum
);
3323 /*a better decision will eventually (5.0 or later) need to be made
3324 on how to treat the alchemical state of the system, which can now
3325 vary through a simulation, and cannot be completely described
3326 though a single lambda variable, or even a single state
3327 index. Eventually, should probably be a vector. MRS*/
3330 gmx_fio_do_int(fio
, tpx
->fep_state
);
3332 gmx_fio_do_real(fio
, tpx
->lambda
);
3333 gmx_fio_do_int(fio
, tpx
->bIr
);
3334 gmx_fio_do_int(fio
, tpx
->bTop
);
3335 gmx_fio_do_int(fio
, tpx
->bX
);
3336 gmx_fio_do_int(fio
, tpx
->bV
);
3337 gmx_fio_do_int(fio
, tpx
->bF
);
3338 gmx_fio_do_int(fio
, tpx
->bBox
);
3340 if ((fgen
> tpx_generation
))
3342 /* This can only happen if TopOnlyOK=TRUE */
3347 static int do_tpx(t_fileio
*fio
, gmx_bool bRead
,
3348 t_inputrec
*ir
, t_state
*state
, rvec
*f
, gmx_mtop_t
*mtop
,
3349 gmx_bool bXVallocated
)
3355 int file_version
, file_generation
;
3359 gmx_bool bPeriodicMols
;
3363 tpx
.natoms
= state
->natoms
;
3364 tpx
.ngtc
= state
->ngtc
; /* need to add nnhpres here? */
3365 tpx
.fep_state
= state
->fep_state
;
3366 tpx
.lambda
= state
->lambda
[efptFEP
];
3367 tpx
.bIr
= (ir
!= NULL
);
3368 tpx
.bTop
= (mtop
!= NULL
);
3369 tpx
.bX
= (state
->x
!= NULL
);
3370 tpx
.bV
= (state
->v
!= NULL
);
3371 tpx
.bF
= (f
!= NULL
);
3375 TopOnlyOK
= (ir
== NULL
);
3377 do_tpxheader(fio
, bRead
, &tpx
, TopOnlyOK
, &file_version
, &file_generation
);
3382 /* state->lambda = tpx.lambda;*/ /*remove this eventually? */
3383 /* The init_state calls initialize the Nose-Hoover xi integrals to zero */
3388 init_state(state
, 0, tpx
.ngtc
, 0, 0, 0); /* nose-hoover chains */ /* eventually, need to add nnhpres here? */
3389 state
->natoms
= tpx
.natoms
;
3390 state
->nalloc
= tpx
.natoms
;
3396 init_state(state
, tpx
.natoms
, tpx
.ngtc
, 0, 0, 0); /* nose-hoover chains */
3400 #define do_test(fio, b, p) if (bRead && (p != NULL) && !b) gmx_fatal(FARGS, "No %s in %s",#p, gmx_fio_getname(fio))
3402 do_test(fio
, tpx
.bBox
, state
->box
);
3403 do_section(fio
, eitemBOX
, bRead
);
3406 gmx_fio_ndo_rvec(fio
, state
->box
, DIM
);
3407 if (file_version
>= 51)
3409 gmx_fio_ndo_rvec(fio
, state
->box_rel
, DIM
);
3413 /* We initialize box_rel after reading the inputrec */
3414 clear_mat(state
->box_rel
);
3416 if (file_version
>= 28)
3418 gmx_fio_ndo_rvec(fio
, state
->boxv
, DIM
);
3419 if (file_version
< 56)
3422 gmx_fio_ndo_rvec(fio
, mdum
, DIM
);
3427 if (state
->ngtc
> 0 && file_version
>= 28)
3430 /*ndo_double(state->nosehoover_xi,state->ngtc,bDum);*/
3431 /*ndo_double(state->nosehoover_vxi,state->ngtc,bDum);*/
3432 /*ndo_double(state->therm_integral,state->ngtc,bDum);*/
3433 snew(dumv
, state
->ngtc
);
3434 if (file_version
< 69)
3436 gmx_fio_ndo_real(fio
, dumv
, state
->ngtc
);
3438 /* These used to be the Berendsen tcoupl_lambda's */
3439 gmx_fio_ndo_real(fio
, dumv
, state
->ngtc
);
3443 /* Prior to tpx version 26, the inputrec was here.
3444 * I moved it to enable partial forward-compatibility
3445 * for analysis/viewer programs.
3447 if (file_version
< 26)
3449 do_test(fio
, tpx
.bIr
, ir
);
3450 do_section(fio
, eitemIR
, bRead
);
3455 do_inputrec(fio
, ir
, bRead
, file_version
,
3456 mtop
? &mtop
->ffparams
.fudgeQQ
: NULL
);
3459 pr_inputrec(debug
, 0, "inputrec", ir
, FALSE
);
3464 do_inputrec(fio
, &dum_ir
, bRead
, file_version
,
3465 mtop
? &mtop
->ffparams
.fudgeQQ
: NULL
);
3468 pr_inputrec(debug
, 0, "inputrec", &dum_ir
, FALSE
);
3470 done_inputrec(&dum_ir
);
3476 do_test(fio
, tpx
.bTop
, mtop
);
3477 do_section(fio
, eitemTOP
, bRead
);
3482 do_mtop(fio
, mtop
, bRead
, file_version
);
3486 do_mtop(fio
, &dum_top
, bRead
, file_version
);
3487 done_mtop(&dum_top
, TRUE
);
3490 do_test(fio
, tpx
.bX
, state
->x
);
3491 do_section(fio
, eitemX
, bRead
);
3496 state
->flags
|= (1<<estX
);
3498 gmx_fio_ndo_rvec(fio
, state
->x
, state
->natoms
);
3501 do_test(fio
, tpx
.bV
, state
->v
);
3502 do_section(fio
, eitemV
, bRead
);
3507 state
->flags
|= (1<<estV
);
3509 gmx_fio_ndo_rvec(fio
, state
->v
, state
->natoms
);
3512 do_test(fio
, tpx
.bF
, f
);
3513 do_section(fio
, eitemF
, bRead
);
3516 gmx_fio_ndo_rvec(fio
, f
, state
->natoms
);
3519 /* Starting with tpx version 26, we have the inputrec
3520 * at the end of the file, so we can ignore it
3521 * if the file is never than the software (but still the
3522 * same generation - see comments at the top of this file.
3527 bPeriodicMols
= FALSE
;
3528 if (file_version
>= 26)
3530 do_test(fio
, tpx
.bIr
, ir
);
3531 do_section(fio
, eitemIR
, bRead
);
3534 if (file_version
>= 53)
3536 /* Removed the pbc info from do_inputrec, since we always want it */
3540 bPeriodicMols
= ir
->bPeriodicMols
;
3542 gmx_fio_do_int(fio
, ePBC
);
3543 gmx_fio_do_gmx_bool(fio
, bPeriodicMols
);
3545 if (file_generation
<= tpx_generation
&& ir
)
3547 do_inputrec(fio
, ir
, bRead
, file_version
, mtop
? &mtop
->ffparams
.fudgeQQ
: NULL
);
3550 pr_inputrec(debug
, 0, "inputrec", ir
, FALSE
);
3552 if (file_version
< 51)
3554 set_box_rel(ir
, state
);
3556 if (file_version
< 53)
3559 bPeriodicMols
= ir
->bPeriodicMols
;
3562 if (bRead
&& ir
&& file_version
>= 53)
3564 /* We need to do this after do_inputrec, since that initializes ir */
3566 ir
->bPeriodicMols
= bPeriodicMols
;
3575 if (state
->ngtc
== 0)
3577 /* Reading old version without tcoupl state data: set it */
3578 init_gtc_state(state
, ir
->opts
.ngtc
, 0, ir
->opts
.nhchainlength
);
3580 if (tpx
.bTop
&& mtop
)
3582 if (file_version
< 57)
3584 if (mtop
->moltype
[0].ilist
[F_DISRES
].nr
> 0)
3586 ir
->eDisre
= edrSimple
;
3590 ir
->eDisre
= edrNone
;
3593 set_disres_npair(mtop
);
3597 if (tpx
.bTop
&& mtop
)
3599 gmx_mtop_finalize(mtop
);
3602 if (file_version
>= 57)
3606 env
= getenv("GMX_NOCHARGEGROUPS");
3609 sscanf(env
, "%d", &ienv
);
3610 fprintf(stderr
, "\nFound env.var. GMX_NOCHARGEGROUPS = %d\n",
3615 "Will make single atomic charge groups in non-solvent%s\n",
3616 ienv
> 1 ? " and solvent" : "");
3617 gmx_mtop_make_atomic_charge_groups(mtop
, ienv
== 1);
3619 fprintf(stderr
, "\n");
3627 /************************************************************
3629 * The following routines are the exported ones
3631 ************************************************************/
3633 t_fileio
*open_tpx(const char *fn
, const char *mode
)
3635 return gmx_fio_open(fn
, mode
);
3638 void close_tpx(t_fileio
*fio
)
3643 void read_tpxheader(const char *fn
, t_tpxheader
*tpx
, gmx_bool TopOnlyOK
,
3644 int *file_version
, int *file_generation
)
3648 fio
= open_tpx(fn
, "r");
3649 do_tpxheader(fio
, TRUE
, tpx
, TopOnlyOK
, file_version
, file_generation
);
3653 void write_tpx_state(const char *fn
,
3654 t_inputrec
*ir
, t_state
*state
, gmx_mtop_t
*mtop
)
3658 fio
= open_tpx(fn
, "w");
3659 do_tpx(fio
, FALSE
, ir
, state
, NULL
, mtop
, FALSE
);
3663 void read_tpx_state(const char *fn
,
3664 t_inputrec
*ir
, t_state
*state
, rvec
*f
, gmx_mtop_t
*mtop
)
3668 fio
= open_tpx(fn
, "r");
3669 do_tpx(fio
, TRUE
, ir
, state
, f
, mtop
, FALSE
);
3673 int read_tpx(const char *fn
,
3674 t_inputrec
*ir
, matrix box
, int *natoms
,
3675 rvec
*x
, rvec
*v
, rvec
*f
, gmx_mtop_t
*mtop
)
3683 fio
= open_tpx(fn
, "r");
3684 ePBC
= do_tpx(fio
, TRUE
, ir
, &state
, f
, mtop
, TRUE
);
3686 *natoms
= state
.natoms
;
3689 copy_mat(state
.box
, box
);
3698 int read_tpx_top(const char *fn
,
3699 t_inputrec
*ir
, matrix box
, int *natoms
,
3700 rvec
*x
, rvec
*v
, rvec
*f
, t_topology
*top
)
3706 ePBC
= read_tpx(fn
, ir
, box
, natoms
, x
, v
, f
, &mtop
);
3708 *top
= gmx_mtop_t_to_t_topology(&mtop
);
3713 gmx_bool
fn2bTPX(const char *file
)
3715 switch (fn2ftp(file
))
3726 static void done_gmx_groups_t(gmx_groups_t
*g
)
3730 for (i
= 0; (i
< egcNR
); i
++)
3732 if (NULL
!= g
->grps
[i
].nm_ind
)
3734 sfree(g
->grps
[i
].nm_ind
);
3735 g
->grps
[i
].nm_ind
= NULL
;
3737 if (NULL
!= g
->grpnr
[i
])
3743 /* The contents of this array is in symtab, don't free it here */
3747 gmx_bool
read_tps_conf(const char *infile
, char *title
, t_topology
*top
, int *ePBC
,
3748 rvec
**x
, rvec
**v
, matrix box
, gmx_bool bMass
)
3751 int natoms
, i
, version
, generation
;
3752 gmx_bool bTop
, bXNULL
= FALSE
;
3754 t_topology
*topconv
;
3757 bTop
= fn2bTPX(infile
);
3761 read_tpxheader(infile
, &header
, TRUE
, &version
, &generation
);
3764 snew(*x
, header
.natoms
);
3768 snew(*v
, header
.natoms
);
3771 *ePBC
= read_tpx(infile
, NULL
, box
, &natoms
,
3772 (x
== NULL
) ? NULL
: *x
, (v
== NULL
) ? NULL
: *v
, NULL
, mtop
);
3773 *top
= gmx_mtop_t_to_t_topology(mtop
);
3774 /* In this case we need to throw away the group data too */
3775 done_gmx_groups_t(&mtop
->groups
);
3777 strcpy(title
, *top
->name
);
3778 tpx_make_chain_identifiers(&top
->atoms
, &top
->mols
);
3782 get_stx_coordnum(infile
, &natoms
);
3783 init_t_atoms(&top
->atoms
, natoms
, (fn2ftp(infile
) == efPDB
));
3794 read_stx_conf(infile
, title
, &top
->atoms
, *x
, (v
== NULL
) ? NULL
: *v
, ePBC
, box
);
3802 aps
= gmx_atomprop_init();
3803 for (i
= 0; (i
< natoms
); i
++)
3805 if (!gmx_atomprop_query(aps
, epropMass
,
3806 *top
->atoms
.resinfo
[top
->atoms
.atom
[i
].resind
].name
,
3807 *top
->atoms
.atomname
[i
],
3808 &(top
->atoms
.atom
[i
].m
)))
3812 fprintf(debug
, "Can not find mass for atom %s %d %s, setting to 1\n",
3813 *top
->atoms
.resinfo
[top
->atoms
.atom
[i
].resind
].name
,
3814 top
->atoms
.resinfo
[top
->atoms
.atom
[i
].resind
].nr
,
3815 *top
->atoms
.atomname
[i
]);
3819 gmx_atomprop_destroy(aps
);
3821 top
->idef
.ntypes
= -1;