Merge branch 'release-4-6'
[alexxy/gromacs.git] / src / gromacs / fileio / tpxio.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5  * Copyright (c) 2001-2004, The GROMACS development team,
6  * Copyright (c) 2013, 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.
10  *
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.
15  *
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.
20  *
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.
25  *
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.
33  *
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.
36  */
37 #ifdef HAVE_CONFIG_H
38 #include <config.h>
39 #endif
40
41 /* This file is completely threadsafe - keep it that way! */
42
43 #include <ctype.h>
44 #include "sysstuff.h"
45 #include "smalloc.h"
46 #include "string2.h"
47 #include "gmx_fatal.h"
48 #include "macros.h"
49 #include "names.h"
50 #include "symtab.h"
51 #include "futil.h"
52 #include "filenm.h"
53 #include "gmxfio.h"
54 #include "topsort.h"
55 #include "tpxio.h"
56 #include "txtdump.h"
57 #include "confio.h"
58 #include "atomprop.h"
59 #include "copyrite.h"
60 #include "vec.h"
61 #include "mtop_util.h"
62
63 #define TPX_TAG_RELEASE  "release"
64
65 /* This is the tag string which is stored in the tpx file.
66  * Change this if you want to change the tpx format in a feature branch.
67  * This ensures that there will not be different tpx formats around which
68  * can not be distinguished.
69  */
70 static const char *tpx_tag = TPX_TAG_RELEASE;
71
72 /* This number should be increased whenever the file format changes! */
73 static const int tpx_version = 92;
74
75 /* This number should only be increased when you edit the TOPOLOGY section
76  * or the HEADER of the tpx format.
77  * This way we can maintain forward compatibility too for all analysis tools
78  * and/or external programs that only need to know the atom/residue names,
79  * charges, and bond connectivity.
80  *
81  * It first appeared in tpx version 26, when I also moved the inputrecord
82  * to the end of the tpx file, so we can just skip it if we only
83  * want the topology.
84  */
85 static const int tpx_generation = 25;
86
87 /* This number should be the most recent backwards incompatible version
88  * I.e., if this number is 9, we cannot read tpx version 9 with this code.
89  */
90 static const int tpx_incompatible_version = 9;
91
92
93
94 /* Struct used to maintain tpx compatibility when function types are added */
95 typedef struct {
96     int fvnr;  /* file version number in which the function type first appeared */
97     int ftype; /* function type */
98 } t_ftupd;
99
100 /*
101  * The entries should be ordered in:
102  * 1. ascending file version number
103  * 2. ascending function type number
104  */
105 /*static const t_ftupd ftupd[] = {
106    { 20, F_CUBICBONDS        },
107    { 20, F_CONNBONDS         },
108    { 20, F_HARMONIC          },
109    { 20, F_EQM,              },
110    { 22, F_DISRESVIOL        },
111    { 22, F_ORIRES            },
112    { 22, F_ORIRESDEV         },
113    { 26, F_FOURDIHS          },
114    { 26, F_PIDIHS            },
115    { 26, F_DIHRES            },
116    { 26, F_DIHRESVIOL        },
117    { 30, F_CROSS_BOND_BONDS  },
118    { 30, F_CROSS_BOND_ANGLES },
119    { 30, F_UREY_BRADLEY      },
120    { 30, F_POLARIZATION      },
121    { 54, F_DHDL_CON          },
122    };*/
123 /*
124  * The entries should be ordered in:
125  * 1. ascending function type number
126  * 2. ascending file version number
127  */
128 /* question; what is the purpose of the commented code above? */
129 static const t_ftupd ftupd[] = {
130     { 20, F_CUBICBONDS        },
131     { 20, F_CONNBONDS         },
132     { 20, F_HARMONIC          },
133     { 34, F_FENEBONDS         },
134     { 43, F_TABBONDS          },
135     { 43, F_TABBONDSNC        },
136     { 70, F_RESTRBONDS        },
137     { 76, F_LINEAR_ANGLES     },
138     { 30, F_CROSS_BOND_BONDS  },
139     { 30, F_CROSS_BOND_ANGLES },
140     { 30, F_UREY_BRADLEY      },
141     { 34, F_QUARTIC_ANGLES    },
142     { 43, F_TABANGLES         },
143     { 26, F_FOURDIHS          },
144     { 26, F_PIDIHS            },
145     { 43, F_TABDIHS           },
146     { 65, F_CMAP              },
147     { 60, F_GB12              },
148     { 61, F_GB13              },
149     { 61, F_GB14              },
150     { 72, F_GBPOL             },
151     { 72, F_NPSOLVATION       },
152     { 41, F_LJC14_Q           },
153     { 41, F_LJC_PAIRS_NB      },
154     { 32, F_BHAM_LR           },
155     { 32, F_RF_EXCL           },
156     { 32, F_COUL_RECIP        },
157     { 46, F_DPD               },
158     { 30, F_POLARIZATION      },
159     { 36, F_THOLE_POL         },
160     { 90, F_FBPOSRES          },
161     { 22, F_DISRESVIOL        },
162     { 22, F_ORIRES            },
163     { 22, F_ORIRESDEV         },
164     { 26, F_DIHRES            },
165     { 26, F_DIHRESVIOL        },
166     { 49, F_VSITE4FDN         },
167     { 50, F_VSITEN            },
168     { 46, F_COM_PULL          },
169     { 20, F_EQM               },
170     { 46, F_ECONSERVED        },
171     { 69, F_VTEMP_NOLONGERUSED},
172     { 66, F_PDISPCORR         },
173     { 54, F_DVDL_CONSTR       },
174     { 76, F_ANHARM_POL        },
175     { 79, F_DVDL_COUL         },
176     { 79, F_DVDL_VDW,         },
177     { 79, F_DVDL_BONDED,      },
178     { 79, F_DVDL_RESTRAINT    },
179     { 79, F_DVDL_TEMPERATURE  },
180 };
181 #define NFTUPD asize(ftupd)
182
183 /* Needed for backward compatibility */
184 #define MAXNODES 256
185
186 static void _do_section(t_fileio *fio, int key, gmx_bool bRead, const char *src,
187                         int line)
188 {
189     char     buf[STRLEN];
190     gmx_bool bDbg;
191
192     if (gmx_fio_getftp(fio) == efTPA)
193     {
194         if (!bRead)
195         {
196             gmx_fio_write_string(fio, itemstr[key]);
197             bDbg       = gmx_fio_getdebug(fio);
198             gmx_fio_setdebug(fio, FALSE);
199             gmx_fio_write_string(fio, comment_str[key]);
200             gmx_fio_setdebug(fio, bDbg);
201         }
202         else
203         {
204             if (gmx_fio_getdebug(fio))
205             {
206                 fprintf(stderr, "Looking for section %s (%s, %d)",
207                         itemstr[key], src, line);
208             }
209
210             do
211             {
212                 gmx_fio_do_string(fio, buf);
213             }
214             while ((gmx_strcasecmp(buf, itemstr[key]) != 0));
215
216             if (gmx_strcasecmp(buf, itemstr[key]) != 0)
217             {
218                 gmx_fatal(FARGS, "\nCould not find section heading %s", itemstr[key]);
219             }
220             else if (gmx_fio_getdebug(fio))
221             {
222                 fprintf(stderr, " and found it\n");
223             }
224         }
225     }
226 }
227
228 #define do_section(fio, key, bRead) _do_section(fio, key, bRead, __FILE__, __LINE__)
229
230 /**************************************************************
231  *
232  * Now the higer level routines that do io of the structures and arrays
233  *
234  **************************************************************/
235 static void do_pullgrp(t_fileio *fio, t_pullgrp *pgrp, gmx_bool bRead,
236                        int file_version)
237 {
238     int      i;
239
240     gmx_fio_do_int(fio, pgrp->nat);
241     if (bRead)
242     {
243         snew(pgrp->ind, pgrp->nat);
244     }
245     gmx_fio_ndo_int(fio, pgrp->ind, pgrp->nat);
246     gmx_fio_do_int(fio, pgrp->nweight);
247     if (bRead)
248     {
249         snew(pgrp->weight, pgrp->nweight);
250     }
251     gmx_fio_ndo_real(fio, pgrp->weight, pgrp->nweight);
252     gmx_fio_do_int(fio, pgrp->pbcatom);
253     gmx_fio_do_rvec(fio, pgrp->vec);
254     gmx_fio_do_rvec(fio, pgrp->init);
255     gmx_fio_do_real(fio, pgrp->rate);
256     gmx_fio_do_real(fio, pgrp->k);
257     if (file_version >= 56)
258     {
259         gmx_fio_do_real(fio, pgrp->kB);
260     }
261     else
262     {
263         pgrp->kB = pgrp->k;
264     }
265 }
266
267 static void do_expandedvals(t_fileio *fio, t_expanded *expand, t_lambda *fepvals, gmx_bool bRead, int file_version)
268 {
269     /* i is used in the ndo_double macro*/
270     int      i;
271     real     fv;
272     real     rdum;
273     int      n_lambda = fepvals->n_lambda;
274
275     /* reset the lambda calculation window */
276     fepvals->lambda_start_n = 0;
277     fepvals->lambda_stop_n  = n_lambda;
278     if (file_version >= 79)
279     {
280         if (n_lambda > 0)
281         {
282             if (bRead)
283             {
284                 snew(expand->init_lambda_weights, n_lambda);
285             }
286             gmx_fio_ndo_real(fio, expand->init_lambda_weights, n_lambda);
287             gmx_fio_do_gmx_bool(fio, expand->bInit_weights);
288         }
289
290         gmx_fio_do_int(fio, expand->nstexpanded);
291         gmx_fio_do_int(fio, expand->elmcmove);
292         gmx_fio_do_int(fio, expand->elamstats);
293         gmx_fio_do_int(fio, expand->lmc_repeats);
294         gmx_fio_do_int(fio, expand->gibbsdeltalam);
295         gmx_fio_do_int(fio, expand->lmc_forced_nstart);
296         gmx_fio_do_int(fio, expand->lmc_seed);
297         gmx_fio_do_real(fio, expand->mc_temp);
298         gmx_fio_do_int(fio, expand->bSymmetrizedTMatrix);
299         gmx_fio_do_int(fio, expand->nstTij);
300         gmx_fio_do_int(fio, expand->minvarmin);
301         gmx_fio_do_int(fio, expand->c_range);
302         gmx_fio_do_real(fio, expand->wl_scale);
303         gmx_fio_do_real(fio, expand->wl_ratio);
304         gmx_fio_do_real(fio, expand->init_wl_delta);
305         gmx_fio_do_gmx_bool(fio, expand->bWLoneovert);
306         gmx_fio_do_int(fio, expand->elmceq);
307         gmx_fio_do_int(fio, expand->equil_steps);
308         gmx_fio_do_int(fio, expand->equil_samples);
309         gmx_fio_do_int(fio, expand->equil_n_at_lam);
310         gmx_fio_do_real(fio, expand->equil_wl_delta);
311         gmx_fio_do_real(fio, expand->equil_ratio);
312     }
313 }
314
315 static void do_simtempvals(t_fileio *fio, t_simtemp *simtemp, int n_lambda, gmx_bool bRead,
316                            int file_version)
317 {
318     if (file_version >= 79)
319     {
320         gmx_fio_do_int(fio, simtemp->eSimTempScale);
321         gmx_fio_do_real(fio, simtemp->simtemp_high);
322         gmx_fio_do_real(fio, simtemp->simtemp_low);
323         if (n_lambda > 0)
324         {
325             if (bRead)
326             {
327                 snew(simtemp->temperatures, n_lambda);
328             }
329             gmx_fio_ndo_real(fio, simtemp->temperatures, n_lambda);
330         }
331     }
332 }
333
334 static void do_fepvals(t_fileio *fio, t_lambda *fepvals, gmx_bool bRead, int file_version)
335 {
336     /* i is defined in the ndo_double macro; use g to iterate. */
337     int      i, g;
338     real     fv;
339     real     rdum;
340
341     /* free energy values */
342
343     if (file_version >= 79)
344     {
345         gmx_fio_do_int(fio, fepvals->init_fep_state);
346         gmx_fio_do_double(fio, fepvals->init_lambda);
347         gmx_fio_do_double(fio, fepvals->delta_lambda);
348     }
349     else if (file_version >= 59)
350     {
351         gmx_fio_do_double(fio, fepvals->init_lambda);
352         gmx_fio_do_double(fio, fepvals->delta_lambda);
353     }
354     else
355     {
356         gmx_fio_do_real(fio, rdum);
357         fepvals->init_lambda = rdum;
358         gmx_fio_do_real(fio, rdum);
359         fepvals->delta_lambda = rdum;
360     }
361     if (file_version >= 79)
362     {
363         gmx_fio_do_int(fio, fepvals->n_lambda);
364         if (bRead)
365         {
366             snew(fepvals->all_lambda, efptNR);
367         }
368         for (g = 0; g < efptNR; g++)
369         {
370             if (fepvals->n_lambda > 0)
371             {
372                 if (bRead)
373                 {
374                     snew(fepvals->all_lambda[g], fepvals->n_lambda);
375                 }
376                 gmx_fio_ndo_double(fio, fepvals->all_lambda[g], fepvals->n_lambda);
377                 gmx_fio_ndo_int(fio, fepvals->separate_dvdl, efptNR);
378             }
379             else if (fepvals->init_lambda >= 0)
380             {
381                 fepvals->separate_dvdl[efptFEP] = TRUE;
382             }
383         }
384     }
385     else if (file_version >= 64)
386     {
387         gmx_fio_do_int(fio, fepvals->n_lambda);
388         if (bRead)
389         {
390             int g;
391
392             snew(fepvals->all_lambda, efptNR);
393             /* still allocate the all_lambda array's contents. */
394             for (g = 0; g < efptNR; g++)
395             {
396                 if (fepvals->n_lambda > 0)
397                 {
398                     snew(fepvals->all_lambda[g], fepvals->n_lambda);
399                 }
400             }
401         }
402         gmx_fio_ndo_double(fio, fepvals->all_lambda[efptFEP],
403                            fepvals->n_lambda);
404         if (fepvals->init_lambda >= 0)
405         {
406             int g, h;
407
408             fepvals->separate_dvdl[efptFEP] = TRUE;
409
410             if (bRead)
411             {
412                 /* copy the contents of the efptFEP lambda component to all
413                    the other components */
414                 for (g = 0; g < efptNR; g++)
415                 {
416                     for (h = 0; h < fepvals->n_lambda; h++)
417                     {
418                         if (g != efptFEP)
419                         {
420                             fepvals->all_lambda[g][h] =
421                                 fepvals->all_lambda[efptFEP][h];
422                         }
423                     }
424                 }
425             }
426         }
427     }
428     else
429     {
430         fepvals->n_lambda     = 0;
431         fepvals->all_lambda   = NULL;
432         if (fepvals->init_lambda >= 0)
433         {
434             fepvals->separate_dvdl[efptFEP] = TRUE;
435         }
436     }
437     if (file_version >= 13)
438     {
439         gmx_fio_do_real(fio, fepvals->sc_alpha);
440     }
441     else
442     {
443         fepvals->sc_alpha = 0;
444     }
445     if (file_version >= 38)
446     {
447         gmx_fio_do_int(fio, fepvals->sc_power);
448     }
449     else
450     {
451         fepvals->sc_power = 2;
452     }
453     if (file_version >= 79)
454     {
455         gmx_fio_do_real(fio, fepvals->sc_r_power);
456     }
457     else
458     {
459         fepvals->sc_r_power = 6.0;
460     }
461     if (file_version >= 15)
462     {
463         gmx_fio_do_real(fio, fepvals->sc_sigma);
464     }
465     else
466     {
467         fepvals->sc_sigma = 0.3;
468     }
469     if (bRead)
470     {
471         if (file_version >= 71)
472         {
473             fepvals->sc_sigma_min = fepvals->sc_sigma;
474         }
475         else
476         {
477             fepvals->sc_sigma_min = 0;
478         }
479     }
480     if (file_version >= 79)
481     {
482         gmx_fio_do_int(fio, fepvals->bScCoul);
483     }
484     else
485     {
486         fepvals->bScCoul = TRUE;
487     }
488     if (file_version >= 64)
489     {
490         gmx_fio_do_int(fio, fepvals->nstdhdl);
491     }
492     else
493     {
494         fepvals->nstdhdl = 1;
495     }
496
497     if (file_version >= 73)
498     {
499         gmx_fio_do_int(fio, fepvals->separate_dhdl_file);
500         gmx_fio_do_int(fio, fepvals->dhdl_derivatives);
501     }
502     else
503     {
504         fepvals->separate_dhdl_file = esepdhdlfileYES;
505         fepvals->dhdl_derivatives   = edhdlderivativesYES;
506     }
507     if (file_version >= 71)
508     {
509         gmx_fio_do_int(fio, fepvals->dh_hist_size);
510         gmx_fio_do_double(fio, fepvals->dh_hist_spacing);
511     }
512     else
513     {
514         fepvals->dh_hist_size    = 0;
515         fepvals->dh_hist_spacing = 0.1;
516     }
517     if (file_version >= 79)
518     {
519         gmx_fio_do_int(fio, fepvals->bPrintEnergy);
520     }
521     else
522     {
523         fepvals->bPrintEnergy = FALSE;
524     }
525
526     /* handle lambda_neighbors */
527     if ((file_version >= 83 && file_version < 90) || file_version >= 92)
528     {
529         gmx_fio_do_int(fio, fepvals->lambda_neighbors);
530         if ( (fepvals->lambda_neighbors >= 0) && (fepvals->init_fep_state >= 0) &&
531              (fepvals->init_lambda < 0) )
532         {
533             fepvals->lambda_start_n = (fepvals->init_fep_state -
534                                        fepvals->lambda_neighbors);
535             fepvals->lambda_stop_n = (fepvals->init_fep_state +
536                                       fepvals->lambda_neighbors + 1);
537             if (fepvals->lambda_start_n < 0)
538             {
539                 fepvals->lambda_start_n = 0;;
540             }
541             if (fepvals->lambda_stop_n >= fepvals->n_lambda)
542             {
543                 fepvals->lambda_stop_n = fepvals->n_lambda;
544             }
545         }
546         else
547         {
548             fepvals->lambda_start_n = 0;
549             fepvals->lambda_stop_n  = fepvals->n_lambda;
550         }
551     }
552     else
553     {
554         fepvals->lambda_start_n = 0;
555         fepvals->lambda_stop_n  = fepvals->n_lambda;
556     }
557 }
558
559 static void do_pull(t_fileio *fio, t_pull *pull, gmx_bool bRead, int file_version)
560 {
561     int g;
562
563     gmx_fio_do_int(fio, pull->ngrp);
564     gmx_fio_do_int(fio, pull->eGeom);
565     gmx_fio_do_ivec(fio, pull->dim);
566     gmx_fio_do_real(fio, pull->cyl_r1);
567     gmx_fio_do_real(fio, pull->cyl_r0);
568     gmx_fio_do_real(fio, pull->constr_tol);
569     gmx_fio_do_int(fio, pull->nstxout);
570     gmx_fio_do_int(fio, pull->nstfout);
571     if (bRead)
572     {
573         snew(pull->grp, pull->ngrp+1);
574     }
575     for (g = 0; g < pull->ngrp+1; g++)
576     {
577         do_pullgrp(fio, &pull->grp[g], bRead, file_version);
578     }
579 }
580
581
582 static void do_rotgrp(t_fileio *fio, t_rotgrp *rotg, gmx_bool bRead)
583 {
584     int      i;
585
586     gmx_fio_do_int(fio, rotg->eType);
587     gmx_fio_do_int(fio, rotg->bMassW);
588     gmx_fio_do_int(fio, rotg->nat);
589     if (bRead)
590     {
591         snew(rotg->ind, rotg->nat);
592     }
593     gmx_fio_ndo_int(fio, rotg->ind, rotg->nat);
594     if (bRead)
595     {
596         snew(rotg->x_ref, rotg->nat);
597     }
598     gmx_fio_ndo_rvec(fio, rotg->x_ref, rotg->nat);
599     gmx_fio_do_rvec(fio, rotg->vec);
600     gmx_fio_do_rvec(fio, rotg->pivot);
601     gmx_fio_do_real(fio, rotg->rate);
602     gmx_fio_do_real(fio, rotg->k);
603     gmx_fio_do_real(fio, rotg->slab_dist);
604     gmx_fio_do_real(fio, rotg->min_gaussian);
605     gmx_fio_do_real(fio, rotg->eps);
606     gmx_fio_do_int(fio, rotg->eFittype);
607     gmx_fio_do_int(fio, rotg->PotAngle_nstep);
608     gmx_fio_do_real(fio, rotg->PotAngle_step);
609 }
610
611 static void do_rot(t_fileio *fio, t_rot *rot, gmx_bool bRead)
612 {
613     int g;
614
615     gmx_fio_do_int(fio, rot->ngrp);
616     gmx_fio_do_int(fio, rot->nstrout);
617     gmx_fio_do_int(fio, rot->nstsout);
618     if (bRead)
619     {
620         snew(rot->grp, rot->ngrp);
621     }
622     for (g = 0; g < rot->ngrp; g++)
623     {
624         do_rotgrp(fio, &rot->grp[g], bRead);
625     }
626 }
627
628
629 static void do_inputrec(t_fileio *fio, t_inputrec *ir, gmx_bool bRead,
630                         int file_version, real *fudgeQQ)
631 {
632     int      i, j, k, *tmp, idum = 0;
633     real     rdum, bd_temp;
634     rvec     vdum;
635     gmx_bool bSimAnn;
636     real     zerotemptime, finish_t, init_temp, finish_temp;
637
638     if (file_version != tpx_version)
639     {
640         /* Give a warning about features that are not accessible */
641         fprintf(stderr, "Note: file tpx version %d, software tpx version %d\n",
642                 file_version, tpx_version);
643     }
644
645     if (bRead)
646     {
647         init_inputrec(ir);
648     }
649
650     if (file_version == 0)
651     {
652         return;
653     }
654
655     /* Basic inputrec stuff */
656     gmx_fio_do_int(fio, ir->eI);
657     if (file_version >= 62)
658     {
659         gmx_fio_do_gmx_large_int(fio, ir->nsteps);
660     }
661     else
662     {
663         gmx_fio_do_int(fio, idum);
664         ir->nsteps = idum;
665     }
666     if (file_version > 25)
667     {
668         if (file_version >= 62)
669         {
670             gmx_fio_do_gmx_large_int(fio, ir->init_step);
671         }
672         else
673         {
674             gmx_fio_do_int(fio, idum);
675             ir->init_step = idum;
676         }
677     }
678     else
679     {
680         ir->init_step = 0;
681     }
682
683     if (file_version >= 58)
684     {
685         gmx_fio_do_int(fio, ir->simulation_part);
686     }
687     else
688     {
689         ir->simulation_part = 1;
690     }
691
692     if (file_version >= 67)
693     {
694         gmx_fio_do_int(fio, ir->nstcalcenergy);
695     }
696     else
697     {
698         ir->nstcalcenergy = 1;
699     }
700     if (file_version < 53)
701     {
702         /* The pbc info has been moved out of do_inputrec,
703          * since we always want it, also without reading the inputrec.
704          */
705         gmx_fio_do_int(fio, ir->ePBC);
706         if ((file_version <= 15) && (ir->ePBC == 2))
707         {
708             ir->ePBC = epbcNONE;
709         }
710         if (file_version >= 45)
711         {
712             gmx_fio_do_int(fio, ir->bPeriodicMols);
713         }
714         else
715         {
716             if (ir->ePBC == 2)
717             {
718                 ir->ePBC          = epbcXYZ;
719                 ir->bPeriodicMols = TRUE;
720             }
721             else
722             {
723                 ir->bPeriodicMols = FALSE;
724             }
725         }
726     }
727     if (file_version >= 81)
728     {
729         gmx_fio_do_int(fio, ir->cutoff_scheme);
730     }
731     else
732     {
733         ir->cutoff_scheme = ecutsGROUP;
734     }
735     gmx_fio_do_int(fio, ir->ns_type);
736     gmx_fio_do_int(fio, ir->nstlist);
737     gmx_fio_do_int(fio, ir->ndelta);
738     if (file_version < 41)
739     {
740         gmx_fio_do_int(fio, idum);
741         gmx_fio_do_int(fio, idum);
742     }
743     if (file_version >= 45)
744     {
745         gmx_fio_do_real(fio, ir->rtpi);
746     }
747     else
748     {
749         ir->rtpi = 0.05;
750     }
751     gmx_fio_do_int(fio, ir->nstcomm);
752     if (file_version > 34)
753     {
754         gmx_fio_do_int(fio, ir->comm_mode);
755     }
756     else if (ir->nstcomm < 0)
757     {
758         ir->comm_mode = ecmANGULAR;
759     }
760     else
761     {
762         ir->comm_mode = ecmLINEAR;
763     }
764     ir->nstcomm = abs(ir->nstcomm);
765
766     if (file_version > 25)
767     {
768         gmx_fio_do_int(fio, ir->nstcheckpoint);
769     }
770     else
771     {
772         ir->nstcheckpoint = 0;
773     }
774
775     gmx_fio_do_int(fio, ir->nstcgsteep);
776
777     if (file_version >= 30)
778     {
779         gmx_fio_do_int(fio, ir->nbfgscorr);
780     }
781     else if (bRead)
782     {
783         ir->nbfgscorr = 10;
784     }
785
786     gmx_fio_do_int(fio, ir->nstlog);
787     gmx_fio_do_int(fio, ir->nstxout);
788     gmx_fio_do_int(fio, ir->nstvout);
789     gmx_fio_do_int(fio, ir->nstfout);
790     gmx_fio_do_int(fio, ir->nstenergy);
791     gmx_fio_do_int(fio, ir->nstxtcout);
792     if (file_version >= 59)
793     {
794         gmx_fio_do_double(fio, ir->init_t);
795         gmx_fio_do_double(fio, ir->delta_t);
796     }
797     else
798     {
799         gmx_fio_do_real(fio, rdum);
800         ir->init_t = rdum;
801         gmx_fio_do_real(fio, rdum);
802         ir->delta_t = rdum;
803     }
804     gmx_fio_do_real(fio, ir->xtcprec);
805     if (file_version < 19)
806     {
807         gmx_fio_do_int(fio, idum);
808         gmx_fio_do_int(fio, idum);
809     }
810     if (file_version < 18)
811     {
812         gmx_fio_do_int(fio, idum);
813     }
814     if (file_version >= 81)
815     {
816         gmx_fio_do_real(fio, ir->verletbuf_drift);
817     }
818     else
819     {
820         ir->verletbuf_drift = 0;
821     }
822     gmx_fio_do_real(fio, ir->rlist);
823     if (file_version >= 67)
824     {
825         gmx_fio_do_real(fio, ir->rlistlong);
826     }
827     if (file_version >= 82 && file_version != 90)
828     {
829         gmx_fio_do_int(fio, ir->nstcalclr);
830     }
831     else
832     {
833         /* Calculate at NS steps */
834         ir->nstcalclr = ir->nstlist;
835     }
836     gmx_fio_do_int(fio, ir->coulombtype);
837     if (file_version < 32 && ir->coulombtype == eelRF)
838     {
839         ir->coulombtype = eelRF_NEC;
840     }
841     if (file_version >= 81)
842     {
843         gmx_fio_do_int(fio, ir->coulomb_modifier);
844     }
845     else
846     {
847         ir->coulomb_modifier = (ir->cutoff_scheme == ecutsVERLET ? eintmodPOTSHIFT : eintmodNONE);
848     }
849     gmx_fio_do_real(fio, ir->rcoulomb_switch);
850     gmx_fio_do_real(fio, ir->rcoulomb);
851     gmx_fio_do_int(fio, ir->vdwtype);
852     if (file_version >= 81)
853     {
854         gmx_fio_do_int(fio, ir->vdw_modifier);
855     }
856     else
857     {
858         ir->vdw_modifier = (ir->cutoff_scheme == ecutsVERLET ? eintmodPOTSHIFT : eintmodNONE);
859     }
860     gmx_fio_do_real(fio, ir->rvdw_switch);
861     gmx_fio_do_real(fio, ir->rvdw);
862     if (file_version < 67)
863     {
864         ir->rlistlong = max_cutoff(ir->rlist, max_cutoff(ir->rvdw, ir->rcoulomb));
865     }
866     gmx_fio_do_int(fio, ir->eDispCorr);
867     gmx_fio_do_real(fio, ir->epsilon_r);
868     if (file_version >= 37)
869     {
870         gmx_fio_do_real(fio, ir->epsilon_rf);
871     }
872     else
873     {
874         if (EEL_RF(ir->coulombtype))
875         {
876             ir->epsilon_rf = ir->epsilon_r;
877             ir->epsilon_r  = 1.0;
878         }
879         else
880         {
881             ir->epsilon_rf = 1.0;
882         }
883     }
884     if (file_version >= 29)
885     {
886         gmx_fio_do_real(fio, ir->tabext);
887     }
888     else
889     {
890         ir->tabext = 1.0;
891     }
892
893     if (file_version > 25)
894     {
895         gmx_fio_do_int(fio, ir->gb_algorithm);
896         gmx_fio_do_int(fio, ir->nstgbradii);
897         gmx_fio_do_real(fio, ir->rgbradii);
898         gmx_fio_do_real(fio, ir->gb_saltconc);
899         gmx_fio_do_int(fio, ir->implicit_solvent);
900     }
901     else
902     {
903         ir->gb_algorithm     = egbSTILL;
904         ir->nstgbradii       = 1;
905         ir->rgbradii         = 1.0;
906         ir->gb_saltconc      = 0;
907         ir->implicit_solvent = eisNO;
908     }
909     if (file_version >= 55)
910     {
911         gmx_fio_do_real(fio, ir->gb_epsilon_solvent);
912         gmx_fio_do_real(fio, ir->gb_obc_alpha);
913         gmx_fio_do_real(fio, ir->gb_obc_beta);
914         gmx_fio_do_real(fio, ir->gb_obc_gamma);
915         if (file_version >= 60)
916         {
917             gmx_fio_do_real(fio, ir->gb_dielectric_offset);
918             gmx_fio_do_int(fio, ir->sa_algorithm);
919         }
920         else
921         {
922             ir->gb_dielectric_offset = 0.009;
923             ir->sa_algorithm         = esaAPPROX;
924         }
925         gmx_fio_do_real(fio, ir->sa_surface_tension);
926
927         /* Override sa_surface_tension if it is not changed in the mpd-file */
928         if (ir->sa_surface_tension < 0)
929         {
930             if (ir->gb_algorithm == egbSTILL)
931             {
932                 ir->sa_surface_tension = 0.0049 * 100 * CAL2JOULE;
933             }
934             else if (ir->gb_algorithm == egbHCT || ir->gb_algorithm == egbOBC)
935             {
936                 ir->sa_surface_tension = 0.0054 * 100 * CAL2JOULE;
937             }
938         }
939
940     }
941     else
942     {
943         /* Better use sensible values than insane (0.0) ones... */
944         ir->gb_epsilon_solvent = 80;
945         ir->gb_obc_alpha       = 1.0;
946         ir->gb_obc_beta        = 0.8;
947         ir->gb_obc_gamma       = 4.85;
948         ir->sa_surface_tension = 2.092;
949     }
950
951
952     if (file_version >= 81)
953     {
954         gmx_fio_do_real(fio, ir->fourier_spacing);
955     }
956     else
957     {
958         ir->fourier_spacing = 0.0;
959     }
960     gmx_fio_do_int(fio, ir->nkx);
961     gmx_fio_do_int(fio, ir->nky);
962     gmx_fio_do_int(fio, ir->nkz);
963     gmx_fio_do_int(fio, ir->pme_order);
964     gmx_fio_do_real(fio, ir->ewald_rtol);
965
966     if (file_version >= 24)
967     {
968         gmx_fio_do_int(fio, ir->ewald_geometry);
969     }
970     else
971     {
972         ir->ewald_geometry = eewg3D;
973     }
974
975     if (file_version <= 17)
976     {
977         ir->epsilon_surface = 0;
978         if (file_version == 17)
979         {
980             gmx_fio_do_int(fio, idum);
981         }
982     }
983     else
984     {
985         gmx_fio_do_real(fio, ir->epsilon_surface);
986     }
987
988     gmx_fio_do_gmx_bool(fio, ir->bOptFFT);
989
990     gmx_fio_do_gmx_bool(fio, ir->bContinuation);
991     gmx_fio_do_int(fio, ir->etc);
992     /* before version 18, ir->etc was a gmx_bool (ir->btc),
993      * but the values 0 and 1 still mean no and
994      * berendsen temperature coupling, respectively.
995      */
996     if (file_version >= 79)
997     {
998         gmx_fio_do_gmx_bool(fio, ir->bPrintNHChains);
999     }
1000     if (file_version >= 71)
1001     {
1002         gmx_fio_do_int(fio, ir->nsttcouple);
1003     }
1004     else
1005     {
1006         ir->nsttcouple = ir->nstcalcenergy;
1007     }
1008     if (file_version <= 15)
1009     {
1010         gmx_fio_do_int(fio, idum);
1011     }
1012     if (file_version <= 17)
1013     {
1014         gmx_fio_do_int(fio, ir->epct);
1015         if (file_version <= 15)
1016         {
1017             if (ir->epct == 5)
1018             {
1019                 ir->epct = epctSURFACETENSION;
1020             }
1021             gmx_fio_do_int(fio, idum);
1022         }
1023         ir->epct -= 1;
1024         /* we have removed the NO alternative at the beginning */
1025         if (ir->epct == -1)
1026         {
1027             ir->epc  = epcNO;
1028             ir->epct = epctISOTROPIC;
1029         }
1030         else
1031         {
1032             ir->epc = epcBERENDSEN;
1033         }
1034     }
1035     else
1036     {
1037         gmx_fio_do_int(fio, ir->epc);
1038         gmx_fio_do_int(fio, ir->epct);
1039     }
1040     if (file_version >= 71)
1041     {
1042         gmx_fio_do_int(fio, ir->nstpcouple);
1043     }
1044     else
1045     {
1046         ir->nstpcouple = ir->nstcalcenergy;
1047     }
1048     gmx_fio_do_real(fio, ir->tau_p);
1049     if (file_version <= 15)
1050     {
1051         gmx_fio_do_rvec(fio, vdum);
1052         clear_mat(ir->ref_p);
1053         for (i = 0; i < DIM; i++)
1054         {
1055             ir->ref_p[i][i] = vdum[i];
1056         }
1057     }
1058     else
1059     {
1060         gmx_fio_do_rvec(fio, ir->ref_p[XX]);
1061         gmx_fio_do_rvec(fio, ir->ref_p[YY]);
1062         gmx_fio_do_rvec(fio, ir->ref_p[ZZ]);
1063     }
1064     if (file_version <= 15)
1065     {
1066         gmx_fio_do_rvec(fio, vdum);
1067         clear_mat(ir->compress);
1068         for (i = 0; i < DIM; i++)
1069         {
1070             ir->compress[i][i] = vdum[i];
1071         }
1072     }
1073     else
1074     {
1075         gmx_fio_do_rvec(fio, ir->compress[XX]);
1076         gmx_fio_do_rvec(fio, ir->compress[YY]);
1077         gmx_fio_do_rvec(fio, ir->compress[ZZ]);
1078     }
1079     if (file_version >= 47)
1080     {
1081         gmx_fio_do_int(fio, ir->refcoord_scaling);
1082         gmx_fio_do_rvec(fio, ir->posres_com);
1083         gmx_fio_do_rvec(fio, ir->posres_comB);
1084     }
1085     else
1086     {
1087         ir->refcoord_scaling = erscNO;
1088         clear_rvec(ir->posres_com);
1089         clear_rvec(ir->posres_comB);
1090     }
1091     if ((file_version > 25) && (file_version < 79))
1092     {
1093         gmx_fio_do_int(fio, ir->andersen_seed);
1094     }
1095     else
1096     {
1097         ir->andersen_seed = 0;
1098     }
1099     if (file_version < 26)
1100     {
1101         gmx_fio_do_gmx_bool(fio, bSimAnn);
1102         gmx_fio_do_real(fio, zerotemptime);
1103     }
1104
1105     if (file_version < 37)
1106     {
1107         gmx_fio_do_real(fio, rdum);
1108     }
1109
1110     gmx_fio_do_real(fio, ir->shake_tol);
1111     if (file_version < 54)
1112     {
1113         gmx_fio_do_real(fio, *fudgeQQ);
1114     }
1115
1116     gmx_fio_do_int(fio, ir->efep);
1117     if (file_version <= 14 && ir->efep != efepNO)
1118     {
1119         ir->efep = efepYES;
1120     }
1121     do_fepvals(fio, ir->fepvals, bRead, file_version);
1122
1123     if (file_version >= 79)
1124     {
1125         gmx_fio_do_gmx_bool(fio, ir->bSimTemp);
1126         if (ir->bSimTemp)
1127         {
1128             ir->bSimTemp = TRUE;
1129         }
1130     }
1131     else
1132     {
1133         ir->bSimTemp = FALSE;
1134     }
1135     if (ir->bSimTemp)
1136     {
1137         do_simtempvals(fio, ir->simtempvals, ir->fepvals->n_lambda, bRead, file_version);
1138     }
1139
1140     if (file_version >= 79)
1141     {
1142         gmx_fio_do_gmx_bool(fio, ir->bExpanded);
1143         if (ir->bExpanded)
1144         {
1145             ir->bExpanded = TRUE;
1146         }
1147         else
1148         {
1149             ir->bExpanded = FALSE;
1150         }
1151     }
1152     if (ir->bExpanded)
1153     {
1154         do_expandedvals(fio, ir->expandedvals, ir->fepvals, bRead, file_version);
1155     }
1156     if (file_version >= 57)
1157     {
1158         gmx_fio_do_int(fio, ir->eDisre);
1159     }
1160     gmx_fio_do_int(fio, ir->eDisreWeighting);
1161     if (file_version < 22)
1162     {
1163         if (ir->eDisreWeighting == 0)
1164         {
1165             ir->eDisreWeighting = edrwEqual;
1166         }
1167         else
1168         {
1169             ir->eDisreWeighting = edrwConservative;
1170         }
1171     }
1172     gmx_fio_do_gmx_bool(fio, ir->bDisreMixed);
1173     gmx_fio_do_real(fio, ir->dr_fc);
1174     gmx_fio_do_real(fio, ir->dr_tau);
1175     gmx_fio_do_int(fio, ir->nstdisreout);
1176     if (file_version >= 22)
1177     {
1178         gmx_fio_do_real(fio, ir->orires_fc);
1179         gmx_fio_do_real(fio, ir->orires_tau);
1180         gmx_fio_do_int(fio, ir->nstorireout);
1181     }
1182     else
1183     {
1184         ir->orires_fc   = 0;
1185         ir->orires_tau  = 0;
1186         ir->nstorireout = 0;
1187     }
1188     if (file_version >= 26 && file_version < 79)
1189     {
1190         gmx_fio_do_real(fio, ir->dihre_fc);
1191         if (file_version < 56)
1192         {
1193             gmx_fio_do_real(fio, rdum);
1194             gmx_fio_do_int(fio, idum);
1195         }
1196     }
1197     else
1198     {
1199         ir->dihre_fc = 0;
1200     }
1201
1202     gmx_fio_do_real(fio, ir->em_stepsize);
1203     gmx_fio_do_real(fio, ir->em_tol);
1204     if (file_version >= 22)
1205     {
1206         gmx_fio_do_gmx_bool(fio, ir->bShakeSOR);
1207     }
1208     else if (bRead)
1209     {
1210         ir->bShakeSOR = TRUE;
1211     }
1212     if (file_version >= 11)
1213     {
1214         gmx_fio_do_int(fio, ir->niter);
1215     }
1216     else if (bRead)
1217     {
1218         ir->niter = 25;
1219         fprintf(stderr, "Note: niter not in run input file, setting it to %d\n",
1220                 ir->niter);
1221     }
1222     if (file_version >= 21)
1223     {
1224         gmx_fio_do_real(fio, ir->fc_stepsize);
1225     }
1226     else
1227     {
1228         ir->fc_stepsize = 0;
1229     }
1230     gmx_fio_do_int(fio, ir->eConstrAlg);
1231     gmx_fio_do_int(fio, ir->nProjOrder);
1232     gmx_fio_do_real(fio, ir->LincsWarnAngle);
1233     if (file_version <= 14)
1234     {
1235         gmx_fio_do_int(fio, idum);
1236     }
1237     if (file_version >= 26)
1238     {
1239         gmx_fio_do_int(fio, ir->nLincsIter);
1240     }
1241     else if (bRead)
1242     {
1243         ir->nLincsIter = 1;
1244         fprintf(stderr, "Note: nLincsIter not in run input file, setting it to %d\n",
1245                 ir->nLincsIter);
1246     }
1247     if (file_version < 33)
1248     {
1249         gmx_fio_do_real(fio, bd_temp);
1250     }
1251     gmx_fio_do_real(fio, ir->bd_fric);
1252     gmx_fio_do_int(fio, ir->ld_seed);
1253     if (file_version >= 33)
1254     {
1255         for (i = 0; i < DIM; i++)
1256         {
1257             gmx_fio_do_rvec(fio, ir->deform[i]);
1258         }
1259     }
1260     else
1261     {
1262         for (i = 0; i < DIM; i++)
1263         {
1264             clear_rvec(ir->deform[i]);
1265         }
1266     }
1267     if (file_version >= 14)
1268     {
1269         gmx_fio_do_real(fio, ir->cos_accel);
1270     }
1271     else if (bRead)
1272     {
1273         ir->cos_accel = 0;
1274     }
1275     gmx_fio_do_int(fio, ir->userint1);
1276     gmx_fio_do_int(fio, ir->userint2);
1277     gmx_fio_do_int(fio, ir->userint3);
1278     gmx_fio_do_int(fio, ir->userint4);
1279     gmx_fio_do_real(fio, ir->userreal1);
1280     gmx_fio_do_real(fio, ir->userreal2);
1281     gmx_fio_do_real(fio, ir->userreal3);
1282     gmx_fio_do_real(fio, ir->userreal4);
1283
1284     /* AdResS stuff */
1285     if (file_version >= 77)
1286     {
1287         gmx_fio_do_gmx_bool(fio, ir->bAdress);
1288         if (ir->bAdress)
1289         {
1290             if (bRead)
1291             {
1292                 snew(ir->adress, 1);
1293             }
1294             gmx_fio_do_int(fio, ir->adress->type);
1295             gmx_fio_do_real(fio, ir->adress->const_wf);
1296             gmx_fio_do_real(fio, ir->adress->ex_width);
1297             gmx_fio_do_real(fio, ir->adress->hy_width);
1298             gmx_fio_do_int(fio, ir->adress->icor);
1299             gmx_fio_do_int(fio, ir->adress->site);
1300             gmx_fio_do_rvec(fio, ir->adress->refs);
1301             gmx_fio_do_int(fio, ir->adress->n_tf_grps);
1302             gmx_fio_do_real(fio, ir->adress->ex_forcecap);
1303             gmx_fio_do_int(fio, ir->adress->n_energy_grps);
1304             gmx_fio_do_int(fio, ir->adress->do_hybridpairs);
1305
1306             if (bRead)
1307             {
1308                 snew(ir->adress->tf_table_index, ir->adress->n_tf_grps);
1309             }
1310             if (ir->adress->n_tf_grps > 0)
1311             {
1312                 gmx_fio_ndo_int(fio, ir->adress->tf_table_index, ir->adress->n_tf_grps);
1313             }
1314             if (bRead)
1315             {
1316                 snew(ir->adress->group_explicit, ir->adress->n_energy_grps);
1317             }
1318             if (ir->adress->n_energy_grps > 0)
1319             {
1320                 gmx_fio_ndo_int(fio, ir->adress->group_explicit, ir->adress->n_energy_grps);
1321             }
1322         }
1323     }
1324     else
1325     {
1326         ir->bAdress = FALSE;
1327     }
1328
1329     /* pull stuff */
1330     if (file_version >= 48)
1331     {
1332         gmx_fio_do_int(fio, ir->ePull);
1333         if (ir->ePull != epullNO)
1334         {
1335             if (bRead)
1336             {
1337                 snew(ir->pull, 1);
1338             }
1339             do_pull(fio, ir->pull, bRead, file_version);
1340         }
1341     }
1342     else
1343     {
1344         ir->ePull = epullNO;
1345     }
1346
1347     /* Enforced rotation */
1348     if (file_version >= 74)
1349     {
1350         gmx_fio_do_int(fio, ir->bRot);
1351         if (ir->bRot == TRUE)
1352         {
1353             if (bRead)
1354             {
1355                 snew(ir->rot, 1);
1356             }
1357             do_rot(fio, ir->rot, bRead);
1358         }
1359     }
1360     else
1361     {
1362         ir->bRot = FALSE;
1363     }
1364
1365     /* grpopts stuff */
1366     gmx_fio_do_int(fio, ir->opts.ngtc);
1367     if (file_version >= 69)
1368     {
1369         gmx_fio_do_int(fio, ir->opts.nhchainlength);
1370     }
1371     else
1372     {
1373         ir->opts.nhchainlength = 1;
1374     }
1375     gmx_fio_do_int(fio, ir->opts.ngacc);
1376     gmx_fio_do_int(fio, ir->opts.ngfrz);
1377     gmx_fio_do_int(fio, ir->opts.ngener);
1378
1379     if (bRead)
1380     {
1381         snew(ir->opts.nrdf,   ir->opts.ngtc);
1382         snew(ir->opts.ref_t,  ir->opts.ngtc);
1383         snew(ir->opts.annealing, ir->opts.ngtc);
1384         snew(ir->opts.anneal_npoints, ir->opts.ngtc);
1385         snew(ir->opts.anneal_time, ir->opts.ngtc);
1386         snew(ir->opts.anneal_temp, ir->opts.ngtc);
1387         snew(ir->opts.tau_t,  ir->opts.ngtc);
1388         snew(ir->opts.nFreeze, ir->opts.ngfrz);
1389         snew(ir->opts.acc,    ir->opts.ngacc);
1390         snew(ir->opts.egp_flags, ir->opts.ngener*ir->opts.ngener);
1391     }
1392     if (ir->opts.ngtc > 0)
1393     {
1394         if (bRead && file_version < 13)
1395         {
1396             snew(tmp, ir->opts.ngtc);
1397             gmx_fio_ndo_int(fio, tmp, ir->opts.ngtc);
1398             for (i = 0; i < ir->opts.ngtc; i++)
1399             {
1400                 ir->opts.nrdf[i] = tmp[i];
1401             }
1402             sfree(tmp);
1403         }
1404         else
1405         {
1406             gmx_fio_ndo_real(fio, ir->opts.nrdf, ir->opts.ngtc);
1407         }
1408         gmx_fio_ndo_real(fio, ir->opts.ref_t, ir->opts.ngtc);
1409         gmx_fio_ndo_real(fio, ir->opts.tau_t, ir->opts.ngtc);
1410         if (file_version < 33 && ir->eI == eiBD)
1411         {
1412             for (i = 0; i < ir->opts.ngtc; i++)
1413             {
1414                 ir->opts.tau_t[i] = bd_temp;
1415             }
1416         }
1417     }
1418     if (ir->opts.ngfrz > 0)
1419     {
1420         gmx_fio_ndo_ivec(fio, ir->opts.nFreeze, ir->opts.ngfrz);
1421     }
1422     if (ir->opts.ngacc > 0)
1423     {
1424         gmx_fio_ndo_rvec(fio, ir->opts.acc, ir->opts.ngacc);
1425     }
1426     if (file_version >= 12)
1427     {
1428         gmx_fio_ndo_int(fio, ir->opts.egp_flags,
1429                         ir->opts.ngener*ir->opts.ngener);
1430     }
1431
1432     if (bRead && file_version < 26)
1433     {
1434         for (i = 0; i < ir->opts.ngtc; i++)
1435         {
1436             if (bSimAnn)
1437             {
1438                 ir->opts.annealing[i]      = eannSINGLE;
1439                 ir->opts.anneal_npoints[i] = 2;
1440                 snew(ir->opts.anneal_time[i], 2);
1441                 snew(ir->opts.anneal_temp[i], 2);
1442                 /* calculate the starting/ending temperatures from reft, zerotemptime, and nsteps */
1443                 finish_t                   = ir->init_t + ir->nsteps * ir->delta_t;
1444                 init_temp                  = ir->opts.ref_t[i]*(1-ir->init_t/zerotemptime);
1445                 finish_temp                = ir->opts.ref_t[i]*(1-finish_t/zerotemptime);
1446                 ir->opts.anneal_time[i][0] = ir->init_t;
1447                 ir->opts.anneal_time[i][1] = finish_t;
1448                 ir->opts.anneal_temp[i][0] = init_temp;
1449                 ir->opts.anneal_temp[i][1] = finish_temp;
1450             }
1451             else
1452             {
1453                 ir->opts.annealing[i]      = eannNO;
1454                 ir->opts.anneal_npoints[i] = 0;
1455             }
1456         }
1457     }
1458     else
1459     {
1460         /* file version 26 or later */
1461         /* First read the lists with annealing and npoints for each group */
1462         gmx_fio_ndo_int(fio, ir->opts.annealing, ir->opts.ngtc);
1463         gmx_fio_ndo_int(fio, ir->opts.anneal_npoints, ir->opts.ngtc);
1464         for (j = 0; j < (ir->opts.ngtc); j++)
1465         {
1466             k = ir->opts.anneal_npoints[j];
1467             if (bRead)
1468             {
1469                 snew(ir->opts.anneal_time[j], k);
1470                 snew(ir->opts.anneal_temp[j], k);
1471             }
1472             gmx_fio_ndo_real(fio, ir->opts.anneal_time[j], k);
1473             gmx_fio_ndo_real(fio, ir->opts.anneal_temp[j], k);
1474         }
1475     }
1476     /* Walls */
1477     if (file_version >= 45)
1478     {
1479         gmx_fio_do_int(fio, ir->nwall);
1480         gmx_fio_do_int(fio, ir->wall_type);
1481         if (file_version >= 50)
1482         {
1483             gmx_fio_do_real(fio, ir->wall_r_linpot);
1484         }
1485         else
1486         {
1487             ir->wall_r_linpot = -1;
1488         }
1489         gmx_fio_do_int(fio, ir->wall_atomtype[0]);
1490         gmx_fio_do_int(fio, ir->wall_atomtype[1]);
1491         gmx_fio_do_real(fio, ir->wall_density[0]);
1492         gmx_fio_do_real(fio, ir->wall_density[1]);
1493         gmx_fio_do_real(fio, ir->wall_ewald_zfac);
1494     }
1495     else
1496     {
1497         ir->nwall            = 0;
1498         ir->wall_type        = 0;
1499         ir->wall_atomtype[0] = -1;
1500         ir->wall_atomtype[1] = -1;
1501         ir->wall_density[0]  = 0;
1502         ir->wall_density[1]  = 0;
1503         ir->wall_ewald_zfac  = 3;
1504     }
1505     /* Cosine stuff for electric fields */
1506     for (j = 0; (j < DIM); j++)
1507     {
1508         gmx_fio_do_int(fio, ir->ex[j].n);
1509         gmx_fio_do_int(fio, ir->et[j].n);
1510         if (bRead)
1511         {
1512             snew(ir->ex[j].a,  ir->ex[j].n);
1513             snew(ir->ex[j].phi, ir->ex[j].n);
1514             snew(ir->et[j].a,  ir->et[j].n);
1515             snew(ir->et[j].phi, ir->et[j].n);
1516         }
1517         gmx_fio_ndo_real(fio, ir->ex[j].a,  ir->ex[j].n);
1518         gmx_fio_ndo_real(fio, ir->ex[j].phi, ir->ex[j].n);
1519         gmx_fio_ndo_real(fio, ir->et[j].a,  ir->et[j].n);
1520         gmx_fio_ndo_real(fio, ir->et[j].phi, ir->et[j].n);
1521     }
1522
1523     /* QMMM stuff */
1524     if (file_version >= 39)
1525     {
1526         gmx_fio_do_gmx_bool(fio, ir->bQMMM);
1527         gmx_fio_do_int(fio, ir->QMMMscheme);
1528         gmx_fio_do_real(fio, ir->scalefactor);
1529         gmx_fio_do_int(fio, ir->opts.ngQM);
1530         if (bRead)
1531         {
1532             snew(ir->opts.QMmethod,    ir->opts.ngQM);
1533             snew(ir->opts.QMbasis,     ir->opts.ngQM);
1534             snew(ir->opts.QMcharge,    ir->opts.ngQM);
1535             snew(ir->opts.QMmult,      ir->opts.ngQM);
1536             snew(ir->opts.bSH,         ir->opts.ngQM);
1537             snew(ir->opts.CASorbitals, ir->opts.ngQM);
1538             snew(ir->opts.CASelectrons, ir->opts.ngQM);
1539             snew(ir->opts.SAon,        ir->opts.ngQM);
1540             snew(ir->opts.SAoff,       ir->opts.ngQM);
1541             snew(ir->opts.SAsteps,     ir->opts.ngQM);
1542             snew(ir->opts.bOPT,        ir->opts.ngQM);
1543             snew(ir->opts.bTS,         ir->opts.ngQM);
1544         }
1545         if (ir->opts.ngQM > 0)
1546         {
1547             gmx_fio_ndo_int(fio, ir->opts.QMmethod, ir->opts.ngQM);
1548             gmx_fio_ndo_int(fio, ir->opts.QMbasis, ir->opts.ngQM);
1549             gmx_fio_ndo_int(fio, ir->opts.QMcharge, ir->opts.ngQM);
1550             gmx_fio_ndo_int(fio, ir->opts.QMmult, ir->opts.ngQM);
1551             gmx_fio_ndo_gmx_bool(fio, ir->opts.bSH, ir->opts.ngQM);
1552             gmx_fio_ndo_int(fio, ir->opts.CASorbitals, ir->opts.ngQM);
1553             gmx_fio_ndo_int(fio, ir->opts.CASelectrons, ir->opts.ngQM);
1554             gmx_fio_ndo_real(fio, ir->opts.SAon, ir->opts.ngQM);
1555             gmx_fio_ndo_real(fio, ir->opts.SAoff, ir->opts.ngQM);
1556             gmx_fio_ndo_int(fio, ir->opts.SAsteps, ir->opts.ngQM);
1557             gmx_fio_ndo_gmx_bool(fio, ir->opts.bOPT, ir->opts.ngQM);
1558             gmx_fio_ndo_gmx_bool(fio, ir->opts.bTS, ir->opts.ngQM);
1559         }
1560         /* end of QMMM stuff */
1561     }
1562 }
1563
1564
1565 static void do_harm(t_fileio *fio, t_iparams *iparams)
1566 {
1567     gmx_fio_do_real(fio, iparams->harmonic.rA);
1568     gmx_fio_do_real(fio, iparams->harmonic.krA);
1569     gmx_fio_do_real(fio, iparams->harmonic.rB);
1570     gmx_fio_do_real(fio, iparams->harmonic.krB);
1571 }
1572
1573 void do_iparams(t_fileio *fio, t_functype ftype, t_iparams *iparams,
1574                 gmx_bool bRead, int file_version)
1575 {
1576     int      idum;
1577     real     rdum;
1578
1579     if (!bRead)
1580     {
1581         gmx_fio_set_comment(fio, interaction_function[ftype].name);
1582     }
1583     switch (ftype)
1584     {
1585         case F_ANGLES:
1586         case F_G96ANGLES:
1587         case F_BONDS:
1588         case F_G96BONDS:
1589         case F_HARMONIC:
1590         case F_IDIHS:
1591             do_harm(fio, iparams);
1592             if ((ftype == F_ANGRES || ftype == F_ANGRESZ) && bRead)
1593             {
1594                 /* Correct incorrect storage of parameters */
1595                 iparams->pdihs.phiB = iparams->pdihs.phiA;
1596                 iparams->pdihs.cpB  = iparams->pdihs.cpA;
1597             }
1598             break;
1599         case F_LINEAR_ANGLES:
1600             gmx_fio_do_real(fio, iparams->linangle.klinA);
1601             gmx_fio_do_real(fio, iparams->linangle.aA);
1602             gmx_fio_do_real(fio, iparams->linangle.klinB);
1603             gmx_fio_do_real(fio, iparams->linangle.aB);
1604             break;
1605         case F_FENEBONDS:
1606             gmx_fio_do_real(fio, iparams->fene.bm);
1607             gmx_fio_do_real(fio, iparams->fene.kb);
1608             break;
1609         case F_RESTRBONDS:
1610             gmx_fio_do_real(fio, iparams->restraint.lowA);
1611             gmx_fio_do_real(fio, iparams->restraint.up1A);
1612             gmx_fio_do_real(fio, iparams->restraint.up2A);
1613             gmx_fio_do_real(fio, iparams->restraint.kA);
1614             gmx_fio_do_real(fio, iparams->restraint.lowB);
1615             gmx_fio_do_real(fio, iparams->restraint.up1B);
1616             gmx_fio_do_real(fio, iparams->restraint.up2B);
1617             gmx_fio_do_real(fio, iparams->restraint.kB);
1618             break;
1619         case F_TABBONDS:
1620         case F_TABBONDSNC:
1621         case F_TABANGLES:
1622         case F_TABDIHS:
1623             gmx_fio_do_real(fio, iparams->tab.kA);
1624             gmx_fio_do_int(fio, iparams->tab.table);
1625             gmx_fio_do_real(fio, iparams->tab.kB);
1626             break;
1627         case F_CROSS_BOND_BONDS:
1628             gmx_fio_do_real(fio, iparams->cross_bb.r1e);
1629             gmx_fio_do_real(fio, iparams->cross_bb.r2e);
1630             gmx_fio_do_real(fio, iparams->cross_bb.krr);
1631             break;
1632         case F_CROSS_BOND_ANGLES:
1633             gmx_fio_do_real(fio, iparams->cross_ba.r1e);
1634             gmx_fio_do_real(fio, iparams->cross_ba.r2e);
1635             gmx_fio_do_real(fio, iparams->cross_ba.r3e);
1636             gmx_fio_do_real(fio, iparams->cross_ba.krt);
1637             break;
1638         case F_UREY_BRADLEY:
1639             gmx_fio_do_real(fio, iparams->u_b.thetaA);
1640             gmx_fio_do_real(fio, iparams->u_b.kthetaA);
1641             gmx_fio_do_real(fio, iparams->u_b.r13A);
1642             gmx_fio_do_real(fio, iparams->u_b.kUBA);
1643             if (file_version >= 79)
1644             {
1645                 gmx_fio_do_real(fio, iparams->u_b.thetaB);
1646                 gmx_fio_do_real(fio, iparams->u_b.kthetaB);
1647                 gmx_fio_do_real(fio, iparams->u_b.r13B);
1648                 gmx_fio_do_real(fio, iparams->u_b.kUBB);
1649             }
1650             else
1651             {
1652                 iparams->u_b.thetaB  = iparams->u_b.thetaA;
1653                 iparams->u_b.kthetaB = iparams->u_b.kthetaA;
1654                 iparams->u_b.r13B    = iparams->u_b.r13A;
1655                 iparams->u_b.kUBB    = iparams->u_b.kUBA;
1656             }
1657             break;
1658         case F_QUARTIC_ANGLES:
1659             gmx_fio_do_real(fio, iparams->qangle.theta);
1660             gmx_fio_ndo_real(fio, iparams->qangle.c, 5);
1661             break;
1662         case F_BHAM:
1663             gmx_fio_do_real(fio, iparams->bham.a);
1664             gmx_fio_do_real(fio, iparams->bham.b);
1665             gmx_fio_do_real(fio, iparams->bham.c);
1666             break;
1667         case F_MORSE:
1668             gmx_fio_do_real(fio, iparams->morse.b0A);
1669             gmx_fio_do_real(fio, iparams->morse.cbA);
1670             gmx_fio_do_real(fio, iparams->morse.betaA);
1671             if (file_version >= 79)
1672             {
1673                 gmx_fio_do_real(fio, iparams->morse.b0B);
1674                 gmx_fio_do_real(fio, iparams->morse.cbB);
1675                 gmx_fio_do_real(fio, iparams->morse.betaB);
1676             }
1677             else
1678             {
1679                 iparams->morse.b0B   = iparams->morse.b0A;
1680                 iparams->morse.cbB   = iparams->morse.cbA;
1681                 iparams->morse.betaB = iparams->morse.betaA;
1682             }
1683             break;
1684         case F_CUBICBONDS:
1685             gmx_fio_do_real(fio, iparams->cubic.b0);
1686             gmx_fio_do_real(fio, iparams->cubic.kb);
1687             gmx_fio_do_real(fio, iparams->cubic.kcub);
1688             break;
1689         case F_CONNBONDS:
1690             break;
1691         case F_POLARIZATION:
1692             gmx_fio_do_real(fio, iparams->polarize.alpha);
1693             break;
1694         case F_ANHARM_POL:
1695             gmx_fio_do_real(fio, iparams->anharm_polarize.alpha);
1696             gmx_fio_do_real(fio, iparams->anharm_polarize.drcut);
1697             gmx_fio_do_real(fio, iparams->anharm_polarize.khyp);
1698             break;
1699         case F_WATER_POL:
1700             if (file_version < 31)
1701             {
1702                 gmx_fatal(FARGS, "Old tpr files with water_polarization not supported. Make a new.");
1703             }
1704             gmx_fio_do_real(fio, iparams->wpol.al_x);
1705             gmx_fio_do_real(fio, iparams->wpol.al_y);
1706             gmx_fio_do_real(fio, iparams->wpol.al_z);
1707             gmx_fio_do_real(fio, iparams->wpol.rOH);
1708             gmx_fio_do_real(fio, iparams->wpol.rHH);
1709             gmx_fio_do_real(fio, iparams->wpol.rOD);
1710             break;
1711         case F_THOLE_POL:
1712             gmx_fio_do_real(fio, iparams->thole.a);
1713             gmx_fio_do_real(fio, iparams->thole.alpha1);
1714             gmx_fio_do_real(fio, iparams->thole.alpha2);
1715             gmx_fio_do_real(fio, iparams->thole.rfac);
1716             break;
1717         case F_LJ:
1718             gmx_fio_do_real(fio, iparams->lj.c6);
1719             gmx_fio_do_real(fio, iparams->lj.c12);
1720             break;
1721         case F_LJ14:
1722             gmx_fio_do_real(fio, iparams->lj14.c6A);
1723             gmx_fio_do_real(fio, iparams->lj14.c12A);
1724             gmx_fio_do_real(fio, iparams->lj14.c6B);
1725             gmx_fio_do_real(fio, iparams->lj14.c12B);
1726             break;
1727         case F_LJC14_Q:
1728             gmx_fio_do_real(fio, iparams->ljc14.fqq);
1729             gmx_fio_do_real(fio, iparams->ljc14.qi);
1730             gmx_fio_do_real(fio, iparams->ljc14.qj);
1731             gmx_fio_do_real(fio, iparams->ljc14.c6);
1732             gmx_fio_do_real(fio, iparams->ljc14.c12);
1733             break;
1734         case F_LJC_PAIRS_NB:
1735             gmx_fio_do_real(fio, iparams->ljcnb.qi);
1736             gmx_fio_do_real(fio, iparams->ljcnb.qj);
1737             gmx_fio_do_real(fio, iparams->ljcnb.c6);
1738             gmx_fio_do_real(fio, iparams->ljcnb.c12);
1739             break;
1740         case F_PDIHS:
1741         case F_PIDIHS:
1742         case F_ANGRES:
1743         case F_ANGRESZ:
1744             gmx_fio_do_real(fio, iparams->pdihs.phiA);
1745             gmx_fio_do_real(fio, iparams->pdihs.cpA);
1746             if ((ftype == F_ANGRES || ftype == F_ANGRESZ) && file_version < 42)
1747             {
1748                 /* Read the incorrectly stored multiplicity */
1749                 gmx_fio_do_real(fio, iparams->harmonic.rB);
1750                 gmx_fio_do_real(fio, iparams->harmonic.krB);
1751                 iparams->pdihs.phiB = iparams->pdihs.phiA;
1752                 iparams->pdihs.cpB  = iparams->pdihs.cpA;
1753             }
1754             else
1755             {
1756                 gmx_fio_do_real(fio, iparams->pdihs.phiB);
1757                 gmx_fio_do_real(fio, iparams->pdihs.cpB);
1758                 gmx_fio_do_int(fio, iparams->pdihs.mult);
1759             }
1760             break;
1761         case F_DISRES:
1762             gmx_fio_do_int(fio, iparams->disres.label);
1763             gmx_fio_do_int(fio, iparams->disres.type);
1764             gmx_fio_do_real(fio, iparams->disres.low);
1765             gmx_fio_do_real(fio, iparams->disres.up1);
1766             gmx_fio_do_real(fio, iparams->disres.up2);
1767             gmx_fio_do_real(fio, iparams->disres.kfac);
1768             break;
1769         case F_ORIRES:
1770             gmx_fio_do_int(fio, iparams->orires.ex);
1771             gmx_fio_do_int(fio, iparams->orires.label);
1772             gmx_fio_do_int(fio, iparams->orires.power);
1773             gmx_fio_do_real(fio, iparams->orires.c);
1774             gmx_fio_do_real(fio, iparams->orires.obs);
1775             gmx_fio_do_real(fio, iparams->orires.kfac);
1776             break;
1777         case F_DIHRES:
1778             if (file_version < 82)
1779             {
1780                 gmx_fio_do_int(fio, idum);
1781                 gmx_fio_do_int(fio, idum);
1782             }
1783             gmx_fio_do_real(fio, iparams->dihres.phiA);
1784             gmx_fio_do_real(fio, iparams->dihres.dphiA);
1785             gmx_fio_do_real(fio, iparams->dihres.kfacA);
1786             if (file_version >= 82)
1787             {
1788                 gmx_fio_do_real(fio, iparams->dihres.phiB);
1789                 gmx_fio_do_real(fio, iparams->dihres.dphiB);
1790                 gmx_fio_do_real(fio, iparams->dihres.kfacB);
1791             }
1792             else
1793             {
1794                 iparams->dihres.phiB  = iparams->dihres.phiA;
1795                 iparams->dihres.dphiB = iparams->dihres.dphiA;
1796                 iparams->dihres.kfacB = iparams->dihres.kfacA;
1797             }
1798             break;
1799         case F_POSRES:
1800             gmx_fio_do_rvec(fio, iparams->posres.pos0A);
1801             gmx_fio_do_rvec(fio, iparams->posres.fcA);
1802             if (bRead && file_version < 27)
1803             {
1804                 copy_rvec(iparams->posres.pos0A, iparams->posres.pos0B);
1805                 copy_rvec(iparams->posres.fcA, iparams->posres.fcB);
1806             }
1807             else
1808             {
1809                 gmx_fio_do_rvec(fio, iparams->posres.pos0B);
1810                 gmx_fio_do_rvec(fio, iparams->posres.fcB);
1811             }
1812             break;
1813         case F_FBPOSRES:
1814             gmx_fio_do_int(fio, iparams->fbposres.geom);
1815             gmx_fio_do_rvec(fio, iparams->fbposres.pos0);
1816             gmx_fio_do_real(fio, iparams->fbposres.r);
1817             gmx_fio_do_real(fio, iparams->fbposres.k);
1818             break;
1819         case F_RBDIHS:
1820             gmx_fio_ndo_real(fio, iparams->rbdihs.rbcA, NR_RBDIHS);
1821             if (file_version >= 25)
1822             {
1823                 gmx_fio_ndo_real(fio, iparams->rbdihs.rbcB, NR_RBDIHS);
1824             }
1825             break;
1826         case F_FOURDIHS:
1827             /* Fourier dihedrals are internally represented
1828              * as Ryckaert-Bellemans since those are faster to compute.
1829              */
1830             gmx_fio_ndo_real(fio, iparams->rbdihs.rbcA, NR_RBDIHS);
1831             gmx_fio_ndo_real(fio, iparams->rbdihs.rbcB, NR_RBDIHS);
1832             break;
1833         case F_CONSTR:
1834         case F_CONSTRNC:
1835             gmx_fio_do_real(fio, iparams->constr.dA);
1836             gmx_fio_do_real(fio, iparams->constr.dB);
1837             break;
1838         case F_SETTLE:
1839             gmx_fio_do_real(fio, iparams->settle.doh);
1840             gmx_fio_do_real(fio, iparams->settle.dhh);
1841             break;
1842         case F_VSITE2:
1843             gmx_fio_do_real(fio, iparams->vsite.a);
1844             break;
1845         case F_VSITE3:
1846         case F_VSITE3FD:
1847         case F_VSITE3FAD:
1848             gmx_fio_do_real(fio, iparams->vsite.a);
1849             gmx_fio_do_real(fio, iparams->vsite.b);
1850             break;
1851         case F_VSITE3OUT:
1852         case F_VSITE4FD:
1853         case F_VSITE4FDN:
1854             gmx_fio_do_real(fio, iparams->vsite.a);
1855             gmx_fio_do_real(fio, iparams->vsite.b);
1856             gmx_fio_do_real(fio, iparams->vsite.c);
1857             break;
1858         case F_VSITEN:
1859             gmx_fio_do_int(fio, iparams->vsiten.n);
1860             gmx_fio_do_real(fio, iparams->vsiten.a);
1861             break;
1862         case F_GB12:
1863         case F_GB13:
1864         case F_GB14:
1865             /* We got rid of some parameters in version 68 */
1866             if (bRead && file_version < 68)
1867             {
1868                 gmx_fio_do_real(fio, rdum);
1869                 gmx_fio_do_real(fio, rdum);
1870                 gmx_fio_do_real(fio, rdum);
1871                 gmx_fio_do_real(fio, rdum);
1872             }
1873             gmx_fio_do_real(fio, iparams->gb.sar);
1874             gmx_fio_do_real(fio, iparams->gb.st);
1875             gmx_fio_do_real(fio, iparams->gb.pi);
1876             gmx_fio_do_real(fio, iparams->gb.gbr);
1877             gmx_fio_do_real(fio, iparams->gb.bmlt);
1878             break;
1879         case F_CMAP:
1880             gmx_fio_do_int(fio, iparams->cmap.cmapA);
1881             gmx_fio_do_int(fio, iparams->cmap.cmapB);
1882             break;
1883         default:
1884             gmx_fatal(FARGS, "unknown function type %d (%s) in %s line %d",
1885                       ftype, interaction_function[ftype].name, __FILE__, __LINE__);
1886     }
1887     if (!bRead)
1888     {
1889         gmx_fio_unset_comment(fio);
1890     }
1891 }
1892
1893 static void do_ilist(t_fileio *fio, t_ilist *ilist, gmx_bool bRead, int file_version,
1894                      int ftype)
1895 {
1896     int      i, k, idum;
1897
1898     if (!bRead)
1899     {
1900         gmx_fio_set_comment(fio, interaction_function[ftype].name);
1901     }
1902     if (file_version < 44)
1903     {
1904         for (i = 0; i < MAXNODES; i++)
1905         {
1906             gmx_fio_do_int(fio, idum);
1907         }
1908     }
1909     gmx_fio_do_int(fio, ilist->nr);
1910     if (bRead)
1911     {
1912         snew(ilist->iatoms, ilist->nr);
1913     }
1914     gmx_fio_ndo_int(fio, ilist->iatoms, ilist->nr);
1915     if (!bRead)
1916     {
1917         gmx_fio_unset_comment(fio);
1918     }
1919 }
1920
1921 static void do_ffparams(t_fileio *fio, gmx_ffparams_t *ffparams,
1922                         gmx_bool bRead, int file_version)
1923 {
1924     int          idum, i, j;
1925     unsigned int k;
1926
1927     gmx_fio_do_int(fio, ffparams->atnr);
1928     if (file_version < 57)
1929     {
1930         gmx_fio_do_int(fio, idum);
1931     }
1932     gmx_fio_do_int(fio, ffparams->ntypes);
1933     if (bRead && debug)
1934     {
1935         fprintf(debug, "ffparams->atnr = %d, ntypes = %d\n",
1936                 ffparams->atnr, ffparams->ntypes);
1937     }
1938     if (bRead)
1939     {
1940         snew(ffparams->functype, ffparams->ntypes);
1941         snew(ffparams->iparams, ffparams->ntypes);
1942     }
1943     /* Read/write all the function types */
1944     gmx_fio_ndo_int(fio, ffparams->functype, ffparams->ntypes);
1945     if (bRead && debug)
1946     {
1947         pr_ivec(debug, 0, "functype", ffparams->functype, ffparams->ntypes, TRUE);
1948     }
1949
1950     if (file_version >= 66)
1951     {
1952         gmx_fio_do_double(fio, ffparams->reppow);
1953     }
1954     else
1955     {
1956         ffparams->reppow = 12.0;
1957     }
1958
1959     if (file_version >= 57)
1960     {
1961         gmx_fio_do_real(fio, ffparams->fudgeQQ);
1962     }
1963
1964     /* Check whether all these function types are supported by the code.
1965      * In practice the code is backwards compatible, which means that the
1966      * numbering may have to be altered from old numbering to new numbering
1967      */
1968     for (i = 0; (i < ffparams->ntypes); i++)
1969     {
1970         if (bRead)
1971         {
1972             /* Loop over file versions */
1973             for (k = 0; (k < NFTUPD); k++)
1974             {
1975                 /* Compare the read file_version to the update table */
1976                 if ((file_version < ftupd[k].fvnr) &&
1977                     (ffparams->functype[i] >= ftupd[k].ftype))
1978                 {
1979                     ffparams->functype[i] += 1;
1980                     if (debug)
1981                     {
1982                         fprintf(debug, "Incrementing function type %d to %d (due to %s)\n",
1983                                 i, ffparams->functype[i],
1984                                 interaction_function[ftupd[k].ftype].longname);
1985                         fflush(debug);
1986                     }
1987                 }
1988             }
1989         }
1990
1991         do_iparams(fio, ffparams->functype[i], &ffparams->iparams[i], bRead,
1992                    file_version);
1993         if (bRead && debug)
1994         {
1995             pr_iparams(debug, ffparams->functype[i], &ffparams->iparams[i]);
1996         }
1997     }
1998 }
1999
2000 static void add_settle_atoms(t_ilist *ilist)
2001 {
2002     int i;
2003
2004     /* Settle used to only store the first atom: add the other two */
2005     srenew(ilist->iatoms, 2*ilist->nr);
2006     for (i = ilist->nr/2-1; i >= 0; i--)
2007     {
2008         ilist->iatoms[4*i+0] = ilist->iatoms[2*i+0];
2009         ilist->iatoms[4*i+1] = ilist->iatoms[2*i+1];
2010         ilist->iatoms[4*i+2] = ilist->iatoms[2*i+1] + 1;
2011         ilist->iatoms[4*i+3] = ilist->iatoms[2*i+1] + 2;
2012     }
2013     ilist->nr = 2*ilist->nr;
2014 }
2015
2016 static void do_ilists(t_fileio *fio, t_ilist *ilist, gmx_bool bRead,
2017                       int file_version)
2018 {
2019     int          i, j, renum[F_NRE];
2020     gmx_bool     bClear;
2021     unsigned int k;
2022
2023     for (j = 0; (j < F_NRE); j++)
2024     {
2025         bClear = FALSE;
2026         if (bRead)
2027         {
2028             for (k = 0; k < NFTUPD; k++)
2029             {
2030                 if ((file_version < ftupd[k].fvnr) && (j == ftupd[k].ftype))
2031                 {
2032                     bClear = TRUE;
2033                 }
2034             }
2035         }
2036         if (bClear)
2037         {
2038             ilist[j].nr     = 0;
2039             ilist[j].iatoms = NULL;
2040         }
2041         else
2042         {
2043             do_ilist(fio, &ilist[j], bRead, file_version, j);
2044             if (file_version < 78 && j == F_SETTLE && ilist[j].nr > 0)
2045             {
2046                 add_settle_atoms(&ilist[j]);
2047             }
2048         }
2049         /*
2050            if (bRead && gmx_debug_at)
2051            pr_ilist(debug,0,interaction_function[j].longname,
2052                functype,&ilist[j],TRUE);
2053          */
2054     }
2055 }
2056
2057 static void do_idef(t_fileio *fio, gmx_ffparams_t *ffparams, gmx_moltype_t *molt,
2058                     gmx_bool bRead, int file_version)
2059 {
2060     do_ffparams(fio, ffparams, bRead, file_version);
2061
2062     if (file_version >= 54)
2063     {
2064         gmx_fio_do_real(fio, ffparams->fudgeQQ);
2065     }
2066
2067     do_ilists(fio, molt->ilist, bRead, file_version);
2068 }
2069
2070 static void do_block(t_fileio *fio, t_block *block, gmx_bool bRead, int file_version)
2071 {
2072     int      i, idum, dum_nra, *dum_a;
2073
2074     if (file_version < 44)
2075     {
2076         for (i = 0; i < MAXNODES; i++)
2077         {
2078             gmx_fio_do_int(fio, idum);
2079         }
2080     }
2081     gmx_fio_do_int(fio, block->nr);
2082     if (file_version < 51)
2083     {
2084         gmx_fio_do_int(fio, dum_nra);
2085     }
2086     if (bRead)
2087     {
2088         if ((block->nalloc_index > 0) && (NULL != block->index))
2089         {
2090             sfree(block->index);
2091         }
2092         block->nalloc_index = block->nr+1;
2093         snew(block->index, block->nalloc_index);
2094     }
2095     gmx_fio_ndo_int(fio, block->index, block->nr+1);
2096
2097     if (file_version < 51 && dum_nra > 0)
2098     {
2099         snew(dum_a, dum_nra);
2100         gmx_fio_ndo_int(fio, dum_a, dum_nra);
2101         sfree(dum_a);
2102     }
2103 }
2104
2105 static void do_blocka(t_fileio *fio, t_blocka *block, gmx_bool bRead,
2106                       int file_version)
2107 {
2108     int      i, idum;
2109
2110     if (file_version < 44)
2111     {
2112         for (i = 0; i < MAXNODES; i++)
2113         {
2114             gmx_fio_do_int(fio, idum);
2115         }
2116     }
2117     gmx_fio_do_int(fio, block->nr);
2118     gmx_fio_do_int(fio, block->nra);
2119     if (bRead)
2120     {
2121         block->nalloc_index = block->nr+1;
2122         snew(block->index, block->nalloc_index);
2123         block->nalloc_a = block->nra;
2124         snew(block->a, block->nalloc_a);
2125     }
2126     gmx_fio_ndo_int(fio, block->index, block->nr+1);
2127     gmx_fio_ndo_int(fio, block->a, block->nra);
2128 }
2129
2130 static void do_atom(t_fileio *fio, t_atom *atom, int ngrp, gmx_bool bRead,
2131                     int file_version, gmx_groups_t *groups, int atnr)
2132 {
2133     int i, myngrp;
2134
2135     gmx_fio_do_real(fio, atom->m);
2136     gmx_fio_do_real(fio, atom->q);
2137     gmx_fio_do_real(fio, atom->mB);
2138     gmx_fio_do_real(fio, atom->qB);
2139     gmx_fio_do_ushort(fio, atom->type);
2140     gmx_fio_do_ushort(fio, atom->typeB);
2141     gmx_fio_do_int(fio, atom->ptype);
2142     gmx_fio_do_int(fio, atom->resind);
2143     if (file_version >= 52)
2144     {
2145         gmx_fio_do_int(fio, atom->atomnumber);
2146     }
2147     else if (bRead)
2148     {
2149         atom->atomnumber = NOTSET;
2150     }
2151     if (file_version < 23)
2152     {
2153         myngrp = 8;
2154     }
2155     else if (file_version < 39)
2156     {
2157         myngrp = 9;
2158     }
2159     else
2160     {
2161         myngrp = ngrp;
2162     }
2163
2164     if (file_version < 57)
2165     {
2166         unsigned char uchar[egcNR];
2167         gmx_fio_ndo_uchar(fio, uchar, myngrp);
2168         for (i = myngrp; (i < ngrp); i++)
2169         {
2170             uchar[i] = 0;
2171         }
2172         /* Copy the old data format to the groups struct */
2173         for (i = 0; i < ngrp; i++)
2174         {
2175             groups->grpnr[i][atnr] = uchar[i];
2176         }
2177     }
2178 }
2179
2180 static void do_grps(t_fileio *fio, int ngrp, t_grps grps[], gmx_bool bRead,
2181                     int file_version)
2182 {
2183     int      i, j, myngrp;
2184
2185     if (file_version < 23)
2186     {
2187         myngrp = 8;
2188     }
2189     else if (file_version < 39)
2190     {
2191         myngrp = 9;
2192     }
2193     else
2194     {
2195         myngrp = ngrp;
2196     }
2197
2198     for (j = 0; (j < ngrp); j++)
2199     {
2200         if (j < myngrp)
2201         {
2202             gmx_fio_do_int(fio, grps[j].nr);
2203             if (bRead)
2204             {
2205                 snew(grps[j].nm_ind, grps[j].nr);
2206             }
2207             gmx_fio_ndo_int(fio, grps[j].nm_ind, grps[j].nr);
2208         }
2209         else
2210         {
2211             grps[j].nr = 1;
2212             snew(grps[j].nm_ind, grps[j].nr);
2213         }
2214     }
2215 }
2216
2217 static void do_symstr(t_fileio *fio, char ***nm, gmx_bool bRead, t_symtab *symtab)
2218 {
2219     int ls;
2220
2221     if (bRead)
2222     {
2223         gmx_fio_do_int(fio, ls);
2224         *nm = get_symtab_handle(symtab, ls);
2225     }
2226     else
2227     {
2228         ls = lookup_symtab(symtab, *nm);
2229         gmx_fio_do_int(fio, ls);
2230     }
2231 }
2232
2233 static void do_strstr(t_fileio *fio, int nstr, char ***nm, gmx_bool bRead,
2234                       t_symtab *symtab)
2235 {
2236     int  j;
2237
2238     for (j = 0; (j < nstr); j++)
2239     {
2240         do_symstr(fio, &(nm[j]), bRead, symtab);
2241     }
2242 }
2243
2244 static void do_resinfo(t_fileio *fio, int n, t_resinfo *ri, gmx_bool bRead,
2245                        t_symtab *symtab, int file_version)
2246 {
2247     int  j;
2248
2249     for (j = 0; (j < n); j++)
2250     {
2251         do_symstr(fio, &(ri[j].name), bRead, symtab);
2252         if (file_version >= 63)
2253         {
2254             gmx_fio_do_int(fio, ri[j].nr);
2255             gmx_fio_do_uchar(fio, ri[j].ic);
2256         }
2257         else
2258         {
2259             ri[j].nr = j + 1;
2260             ri[j].ic = ' ';
2261         }
2262     }
2263 }
2264
2265 static void do_atoms(t_fileio *fio, t_atoms *atoms, gmx_bool bRead, t_symtab *symtab,
2266                      int file_version,
2267                      gmx_groups_t *groups)
2268 {
2269     int i;
2270
2271     gmx_fio_do_int(fio, atoms->nr);
2272     gmx_fio_do_int(fio, atoms->nres);
2273     if (file_version < 57)
2274     {
2275         gmx_fio_do_int(fio, groups->ngrpname);
2276         for (i = 0; i < egcNR; i++)
2277         {
2278             groups->ngrpnr[i] = atoms->nr;
2279             snew(groups->grpnr[i], groups->ngrpnr[i]);
2280         }
2281     }
2282     if (bRead)
2283     {
2284         snew(atoms->atom, atoms->nr);
2285         snew(atoms->atomname, atoms->nr);
2286         snew(atoms->atomtype, atoms->nr);
2287         snew(atoms->atomtypeB, atoms->nr);
2288         snew(atoms->resinfo, atoms->nres);
2289         if (file_version < 57)
2290         {
2291             snew(groups->grpname, groups->ngrpname);
2292         }
2293         atoms->pdbinfo = NULL;
2294     }
2295     for (i = 0; (i < atoms->nr); i++)
2296     {
2297         do_atom(fio, &atoms->atom[i], egcNR, bRead, file_version, groups, i);
2298     }
2299     do_strstr(fio, atoms->nr, atoms->atomname, bRead, symtab);
2300     if (bRead && (file_version <= 20))
2301     {
2302         for (i = 0; i < atoms->nr; i++)
2303         {
2304             atoms->atomtype[i]  = put_symtab(symtab, "?");
2305             atoms->atomtypeB[i] = put_symtab(symtab, "?");
2306         }
2307     }
2308     else
2309     {
2310         do_strstr(fio, atoms->nr, atoms->atomtype, bRead, symtab);
2311         do_strstr(fio, atoms->nr, atoms->atomtypeB, bRead, symtab);
2312     }
2313     do_resinfo(fio, atoms->nres, atoms->resinfo, bRead, symtab, file_version);
2314
2315     if (file_version < 57)
2316     {
2317         do_strstr(fio, groups->ngrpname, groups->grpname, bRead, symtab);
2318
2319         do_grps(fio, egcNR, groups->grps, bRead, file_version);
2320     }
2321 }
2322
2323 static void do_groups(t_fileio *fio, gmx_groups_t *groups,
2324                       gmx_bool bRead, t_symtab *symtab,
2325                       int file_version)
2326 {
2327     int      g, n, i;
2328
2329     do_grps(fio, egcNR, groups->grps, bRead, file_version);
2330     gmx_fio_do_int(fio, groups->ngrpname);
2331     if (bRead)
2332     {
2333         snew(groups->grpname, groups->ngrpname);
2334     }
2335     do_strstr(fio, groups->ngrpname, groups->grpname, bRead, symtab);
2336     for (g = 0; g < egcNR; g++)
2337     {
2338         gmx_fio_do_int(fio, groups->ngrpnr[g]);
2339         if (groups->ngrpnr[g] == 0)
2340         {
2341             if (bRead)
2342             {
2343                 groups->grpnr[g] = NULL;
2344             }
2345         }
2346         else
2347         {
2348             if (bRead)
2349             {
2350                 snew(groups->grpnr[g], groups->ngrpnr[g]);
2351             }
2352             gmx_fio_ndo_uchar(fio, groups->grpnr[g], groups->ngrpnr[g]);
2353         }
2354     }
2355 }
2356
2357 static void do_atomtypes(t_fileio *fio, t_atomtypes *atomtypes, gmx_bool bRead,
2358                          int file_version)
2359 {
2360     int      i, j;
2361
2362     if (file_version > 25)
2363     {
2364         gmx_fio_do_int(fio, atomtypes->nr);
2365         j = atomtypes->nr;
2366         if (bRead)
2367         {
2368             snew(atomtypes->radius, j);
2369             snew(atomtypes->vol, j);
2370             snew(atomtypes->surftens, j);
2371             snew(atomtypes->atomnumber, j);
2372             snew(atomtypes->gb_radius, j);
2373             snew(atomtypes->S_hct, j);
2374         }
2375         gmx_fio_ndo_real(fio, atomtypes->radius, j);
2376         gmx_fio_ndo_real(fio, atomtypes->vol, j);
2377         gmx_fio_ndo_real(fio, atomtypes->surftens, j);
2378         if (file_version >= 40)
2379         {
2380             gmx_fio_ndo_int(fio, atomtypes->atomnumber, j);
2381         }
2382         if (file_version >= 60)
2383         {
2384             gmx_fio_ndo_real(fio, atomtypes->gb_radius, j);
2385             gmx_fio_ndo_real(fio, atomtypes->S_hct, j);
2386         }
2387     }
2388     else
2389     {
2390         /* File versions prior to 26 cannot do GBSA,
2391          * so they dont use this structure
2392          */
2393         atomtypes->nr         = 0;
2394         atomtypes->radius     = NULL;
2395         atomtypes->vol        = NULL;
2396         atomtypes->surftens   = NULL;
2397         atomtypes->atomnumber = NULL;
2398         atomtypes->gb_radius  = NULL;
2399         atomtypes->S_hct      = NULL;
2400     }
2401 }
2402
2403 static void do_symtab(t_fileio *fio, t_symtab *symtab, gmx_bool bRead)
2404 {
2405     int       i, nr;
2406     t_symbuf *symbuf;
2407     char      buf[STRLEN];
2408
2409     gmx_fio_do_int(fio, symtab->nr);
2410     nr     = symtab->nr;
2411     if (bRead)
2412     {
2413         snew(symtab->symbuf, 1);
2414         symbuf          = symtab->symbuf;
2415         symbuf->bufsize = nr;
2416         snew(symbuf->buf, nr);
2417         for (i = 0; (i < nr); i++)
2418         {
2419             gmx_fio_do_string(fio, buf);
2420             symbuf->buf[i] = strdup(buf);
2421         }
2422     }
2423     else
2424     {
2425         symbuf = symtab->symbuf;
2426         while (symbuf != NULL)
2427         {
2428             for (i = 0; (i < symbuf->bufsize) && (i < nr); i++)
2429             {
2430                 gmx_fio_do_string(fio, symbuf->buf[i]);
2431             }
2432             nr    -= i;
2433             symbuf = symbuf->next;
2434         }
2435         if (nr != 0)
2436         {
2437             gmx_fatal(FARGS, "nr of symtab strings left: %d", nr);
2438         }
2439     }
2440 }
2441
2442 static void do_cmap(t_fileio *fio, gmx_cmap_t *cmap_grid, gmx_bool bRead)
2443 {
2444     int i, j, ngrid, gs, nelem;
2445
2446     gmx_fio_do_int(fio, cmap_grid->ngrid);
2447     gmx_fio_do_int(fio, cmap_grid->grid_spacing);
2448
2449     ngrid = cmap_grid->ngrid;
2450     gs    = cmap_grid->grid_spacing;
2451     nelem = gs * gs;
2452
2453     if (bRead)
2454     {
2455         snew(cmap_grid->cmapdata, ngrid);
2456
2457         for (i = 0; i < cmap_grid->ngrid; i++)
2458         {
2459             snew(cmap_grid->cmapdata[i].cmap, 4*nelem);
2460         }
2461     }
2462
2463     for (i = 0; i < cmap_grid->ngrid; i++)
2464     {
2465         for (j = 0; j < nelem; j++)
2466         {
2467             gmx_fio_do_real(fio, cmap_grid->cmapdata[i].cmap[j*4]);
2468             gmx_fio_do_real(fio, cmap_grid->cmapdata[i].cmap[j*4+1]);
2469             gmx_fio_do_real(fio, cmap_grid->cmapdata[i].cmap[j*4+2]);
2470             gmx_fio_do_real(fio, cmap_grid->cmapdata[i].cmap[j*4+3]);
2471         }
2472     }
2473 }
2474
2475
2476 void tpx_make_chain_identifiers(t_atoms *atoms, t_block *mols)
2477 {
2478     int  m, a, a0, a1, r;
2479     char c, chainid;
2480     int  chainnum;
2481
2482     /* We always assign a new chain number, but save the chain id characters
2483      * for larger molecules.
2484      */
2485 #define CHAIN_MIN_ATOMS 15
2486
2487     chainnum = 0;
2488     chainid  = 'A';
2489     for (m = 0; m < mols->nr; m++)
2490     {
2491         a0 = mols->index[m];
2492         a1 = mols->index[m+1];
2493         if ((a1-a0 >= CHAIN_MIN_ATOMS) && (chainid <= 'Z'))
2494         {
2495             c = chainid;
2496             chainid++;
2497         }
2498         else
2499         {
2500             c = ' ';
2501         }
2502         for (a = a0; a < a1; a++)
2503         {
2504             atoms->resinfo[atoms->atom[a].resind].chainnum = chainnum;
2505             atoms->resinfo[atoms->atom[a].resind].chainid  = c;
2506         }
2507         chainnum++;
2508     }
2509
2510     /* Blank out the chain id if there was only one chain */
2511     if (chainid == 'B')
2512     {
2513         for (r = 0; r < atoms->nres; r++)
2514         {
2515             atoms->resinfo[r].chainid = ' ';
2516         }
2517     }
2518 }
2519
2520 static void do_moltype(t_fileio *fio, gmx_moltype_t *molt, gmx_bool bRead,
2521                        t_symtab *symtab, int file_version,
2522                        gmx_groups_t *groups)
2523 {
2524     int i;
2525
2526     if (file_version >= 57)
2527     {
2528         do_symstr(fio, &(molt->name), bRead, symtab);
2529     }
2530
2531     do_atoms(fio, &molt->atoms, bRead, symtab, file_version, groups);
2532
2533     if (bRead && gmx_debug_at)
2534     {
2535         pr_atoms(debug, 0, "atoms", &molt->atoms, TRUE);
2536     }
2537
2538     if (file_version >= 57)
2539     {
2540         do_ilists(fio, molt->ilist, bRead, file_version);
2541
2542         do_block(fio, &molt->cgs, bRead, file_version);
2543         if (bRead && gmx_debug_at)
2544         {
2545             pr_block(debug, 0, "cgs", &molt->cgs, TRUE);
2546         }
2547     }
2548
2549     /* This used to be in the atoms struct */
2550     do_blocka(fio, &molt->excls, bRead, file_version);
2551 }
2552
2553 static void do_molblock(t_fileio *fio, gmx_molblock_t *molb, gmx_bool bRead)
2554 {
2555     int i;
2556
2557     gmx_fio_do_int(fio, molb->type);
2558     gmx_fio_do_int(fio, molb->nmol);
2559     gmx_fio_do_int(fio, molb->natoms_mol);
2560     /* Position restraint coordinates */
2561     gmx_fio_do_int(fio, molb->nposres_xA);
2562     if (molb->nposres_xA > 0)
2563     {
2564         if (bRead)
2565         {
2566             snew(molb->posres_xA, molb->nposres_xA);
2567         }
2568         gmx_fio_ndo_rvec(fio, molb->posres_xA, molb->nposres_xA);
2569     }
2570     gmx_fio_do_int(fio, molb->nposres_xB);
2571     if (molb->nposres_xB > 0)
2572     {
2573         if (bRead)
2574         {
2575             snew(molb->posres_xB, molb->nposres_xB);
2576         }
2577         gmx_fio_ndo_rvec(fio, molb->posres_xB, molb->nposres_xB);
2578     }
2579
2580 }
2581
2582 static t_block mtop_mols(gmx_mtop_t *mtop)
2583 {
2584     int     mb, m, a, mol;
2585     t_block mols;
2586
2587     mols.nr = 0;
2588     for (mb = 0; mb < mtop->nmolblock; mb++)
2589     {
2590         mols.nr += mtop->molblock[mb].nmol;
2591     }
2592     mols.nalloc_index = mols.nr + 1;
2593     snew(mols.index, mols.nalloc_index);
2594
2595     a             = 0;
2596     m             = 0;
2597     mols.index[m] = a;
2598     for (mb = 0; mb < mtop->nmolblock; mb++)
2599     {
2600         for (mol = 0; mol < mtop->molblock[mb].nmol; mol++)
2601         {
2602             a += mtop->molblock[mb].natoms_mol;
2603             m++;
2604             mols.index[m] = a;
2605         }
2606     }
2607
2608     return mols;
2609 }
2610
2611 static void add_posres_molblock(gmx_mtop_t *mtop)
2612 {
2613     t_ilist        *il, *ilfb;
2614     int             am, i, mol, a;
2615     gmx_bool        bFE;
2616     gmx_molblock_t *molb;
2617     t_iparams      *ip;
2618
2619     /* posres reference positions are stored in ip->posres (if present) and
2620        in ip->fbposres (if present). If normal and flat-bottomed posres are present,
2621        posres.pos0A are identical to fbposres.pos0. */
2622     il   = &mtop->moltype[0].ilist[F_POSRES];
2623     ilfb = &mtop->moltype[0].ilist[F_FBPOSRES];
2624     if (il->nr == 0 && ilfb->nr == 0)
2625     {
2626         return;
2627     }
2628     am  = 0;
2629     bFE = FALSE;
2630     for (i = 0; i < il->nr; i += 2)
2631     {
2632         ip = &mtop->ffparams.iparams[il->iatoms[i]];
2633         am = max(am, il->iatoms[i+1]);
2634         if (ip->posres.pos0B[XX] != ip->posres.pos0A[XX] ||
2635             ip->posres.pos0B[YY] != ip->posres.pos0A[YY] ||
2636             ip->posres.pos0B[ZZ] != ip->posres.pos0A[ZZ])
2637         {
2638             bFE = TRUE;
2639         }
2640     }
2641     /* This loop is required if we have only flat-bottomed posres:
2642        - set am
2643        - bFE == FALSE (no B-state for flat-bottomed posres) */
2644     if (il->nr == 0)
2645     {
2646         for (i = 0; i < ilfb->nr; i += 2)
2647         {
2648             ip = &mtop->ffparams.iparams[ilfb->iatoms[i]];
2649             am = max(am, ilfb->iatoms[i+1]);
2650         }
2651     }
2652     /* Make the posres coordinate block end at a molecule end */
2653     mol = 0;
2654     while (am >= mtop->mols.index[mol+1])
2655     {
2656         mol++;
2657     }
2658     molb             = &mtop->molblock[0];
2659     molb->nposres_xA = mtop->mols.index[mol+1];
2660     snew(molb->posres_xA, molb->nposres_xA);
2661     if (bFE)
2662     {
2663         molb->nposres_xB = molb->nposres_xA;
2664         snew(molb->posres_xB, molb->nposres_xB);
2665     }
2666     else
2667     {
2668         molb->nposres_xB = 0;
2669     }
2670     for (i = 0; i < il->nr; i += 2)
2671     {
2672         ip                     = &mtop->ffparams.iparams[il->iatoms[i]];
2673         a                      = il->iatoms[i+1];
2674         molb->posres_xA[a][XX] = ip->posres.pos0A[XX];
2675         molb->posres_xA[a][YY] = ip->posres.pos0A[YY];
2676         molb->posres_xA[a][ZZ] = ip->posres.pos0A[ZZ];
2677         if (bFE)
2678         {
2679             molb->posres_xB[a][XX] = ip->posres.pos0B[XX];
2680             molb->posres_xB[a][YY] = ip->posres.pos0B[YY];
2681             molb->posres_xB[a][ZZ] = ip->posres.pos0B[ZZ];
2682         }
2683     }
2684     if (il->nr == 0)
2685     {
2686         /* If only flat-bottomed posres are present, take reference pos from them.
2687            Here: bFE == FALSE      */
2688         for (i = 0; i < ilfb->nr; i += 2)
2689         {
2690             ip                     = &mtop->ffparams.iparams[ilfb->iatoms[i]];
2691             a                      = ilfb->iatoms[i+1];
2692             molb->posres_xA[a][XX] = ip->fbposres.pos0[XX];
2693             molb->posres_xA[a][YY] = ip->fbposres.pos0[YY];
2694             molb->posres_xA[a][ZZ] = ip->fbposres.pos0[ZZ];
2695         }
2696     }
2697 }
2698
2699 static void set_disres_npair(gmx_mtop_t *mtop)
2700 {
2701     int        mt, i, npair;
2702     t_iparams *ip;
2703     t_ilist   *il;
2704     t_iatom   *a;
2705
2706     ip = mtop->ffparams.iparams;
2707
2708     for (mt = 0; mt < mtop->nmoltype; mt++)
2709     {
2710         il = &mtop->moltype[mt].ilist[F_DISRES];
2711         if (il->nr > 0)
2712         {
2713             a     = il->iatoms;
2714             npair = 0;
2715             for (i = 0; i < il->nr; i += 3)
2716             {
2717                 npair++;
2718                 if (i+3 == il->nr || ip[a[i]].disres.label != ip[a[i+3]].disres.label)
2719                 {
2720                     ip[a[i]].disres.npair = npair;
2721                     npair                 = 0;
2722                 }
2723             }
2724         }
2725     }
2726 }
2727
2728 static void do_mtop(t_fileio *fio, gmx_mtop_t *mtop, gmx_bool bRead,
2729                     int file_version)
2730 {
2731     int      mt, mb, i;
2732     t_blocka dumb;
2733
2734     if (bRead)
2735     {
2736         init_mtop(mtop);
2737     }
2738     do_symtab(fio, &(mtop->symtab), bRead);
2739     if (bRead && debug)
2740     {
2741         pr_symtab(debug, 0, "symtab", &mtop->symtab);
2742     }
2743
2744     do_symstr(fio, &(mtop->name), bRead, &(mtop->symtab));
2745
2746     if (file_version >= 57)
2747     {
2748         do_ffparams(fio, &mtop->ffparams, bRead, file_version);
2749
2750         gmx_fio_do_int(fio, mtop->nmoltype);
2751     }
2752     else
2753     {
2754         mtop->nmoltype = 1;
2755     }
2756     if (bRead)
2757     {
2758         snew(mtop->moltype, mtop->nmoltype);
2759         if (file_version < 57)
2760         {
2761             mtop->moltype[0].name = mtop->name;
2762         }
2763     }
2764     for (mt = 0; mt < mtop->nmoltype; mt++)
2765     {
2766         do_moltype(fio, &mtop->moltype[mt], bRead, &mtop->symtab, file_version,
2767                    &mtop->groups);
2768     }
2769
2770     if (file_version >= 57)
2771     {
2772         gmx_fio_do_int(fio, mtop->nmolblock);
2773     }
2774     else
2775     {
2776         mtop->nmolblock = 1;
2777     }
2778     if (bRead)
2779     {
2780         snew(mtop->molblock, mtop->nmolblock);
2781     }
2782     if (file_version >= 57)
2783     {
2784         for (mb = 0; mb < mtop->nmolblock; mb++)
2785         {
2786             do_molblock(fio, &mtop->molblock[mb], bRead);
2787         }
2788         gmx_fio_do_int(fio, mtop->natoms);
2789     }
2790     else
2791     {
2792         mtop->molblock[0].type       = 0;
2793         mtop->molblock[0].nmol       = 1;
2794         mtop->molblock[0].natoms_mol = mtop->moltype[0].atoms.nr;
2795         mtop->molblock[0].nposres_xA = 0;
2796         mtop->molblock[0].nposres_xB = 0;
2797     }
2798
2799     do_atomtypes (fio, &(mtop->atomtypes), bRead, file_version);
2800     if (bRead && debug)
2801     {
2802         pr_atomtypes(debug, 0, "atomtypes", &mtop->atomtypes, TRUE);
2803     }
2804
2805     if (file_version < 57)
2806     {
2807         /* Debug statements are inside do_idef */
2808         do_idef (fio, &mtop->ffparams, &mtop->moltype[0], bRead, file_version);
2809         mtop->natoms = mtop->moltype[0].atoms.nr;
2810     }
2811
2812     if (file_version >= 65)
2813     {
2814         do_cmap(fio, &mtop->ffparams.cmap_grid, bRead);
2815     }
2816     else
2817     {
2818         mtop->ffparams.cmap_grid.ngrid        = 0;
2819         mtop->ffparams.cmap_grid.grid_spacing = 0;
2820         mtop->ffparams.cmap_grid.cmapdata     = NULL;
2821     }
2822
2823     if (file_version >= 57)
2824     {
2825         do_groups(fio, &mtop->groups, bRead, &(mtop->symtab), file_version);
2826     }
2827
2828     if (file_version < 57)
2829     {
2830         do_block(fio, &mtop->moltype[0].cgs, bRead, file_version);
2831         if (bRead && gmx_debug_at)
2832         {
2833             pr_block(debug, 0, "cgs", &mtop->moltype[0].cgs, TRUE);
2834         }
2835         do_block(fio, &mtop->mols, bRead, file_version);
2836         /* Add the posres coordinates to the molblock */
2837         add_posres_molblock(mtop);
2838     }
2839     if (bRead)
2840     {
2841         if (file_version >= 57)
2842         {
2843             done_block(&mtop->mols);
2844             mtop->mols = mtop_mols(mtop);
2845         }
2846         if (gmx_debug_at)
2847         {
2848             pr_block(debug, 0, "mols", &mtop->mols, TRUE);
2849         }
2850     }
2851
2852     if (file_version < 51)
2853     {
2854         /* Here used to be the shake blocks */
2855         do_blocka(fio, &dumb, bRead, file_version);
2856         if (dumb.nr > 0)
2857         {
2858             sfree(dumb.index);
2859         }
2860         if (dumb.nra > 0)
2861         {
2862             sfree(dumb.a);
2863         }
2864     }
2865
2866     if (bRead)
2867     {
2868         close_symtab(&(mtop->symtab));
2869     }
2870 }
2871
2872 /* If TopOnlyOK is TRUE then we can read even future versions
2873  * of tpx files, provided the file_generation hasn't changed.
2874  * If it is FALSE, we need the inputrecord too, and bail out
2875  * if the file is newer than the program.
2876  *
2877  * The version and generation if the topology (see top of this file)
2878  * are returned in the two last arguments.
2879  *
2880  * If possible, we will read the inputrec even when TopOnlyOK is TRUE.
2881  */
2882 static void do_tpxheader(t_fileio *fio, gmx_bool bRead, t_tpxheader *tpx,
2883                          gmx_bool TopOnlyOK, int *file_version,
2884                          int *file_generation)
2885 {
2886     char      buf[STRLEN];
2887     char      file_tag[STRLEN];
2888     gmx_bool  bDouble;
2889     int       precision;
2890     int       fver, fgen;
2891     int       idum = 0;
2892     real      rdum = 0;
2893
2894     gmx_fio_checktype(fio);
2895     gmx_fio_setdebug(fio, bDebugMode());
2896
2897     /* NEW! XDR tpb file */
2898     precision = sizeof(real);
2899     if (bRead)
2900     {
2901         gmx_fio_do_string(fio, buf);
2902         if (strncmp(buf, "VERSION", 7))
2903         {
2904             gmx_fatal(FARGS, "Can not read file %s,\n"
2905                       "             this file is from a Gromacs version which is older than 2.0\n"
2906                       "             Make a new one with grompp or use a gro or pdb file, if possible",
2907                       gmx_fio_getname(fio));
2908         }
2909         gmx_fio_do_int(fio, precision);
2910         bDouble = (precision == sizeof(double));
2911         if ((precision != sizeof(float)) && !bDouble)
2912         {
2913             gmx_fatal(FARGS, "Unknown precision in file %s: real is %d bytes "
2914                       "instead of %d or %d",
2915                       gmx_fio_getname(fio), precision, sizeof(float), sizeof(double));
2916         }
2917         gmx_fio_setprecision(fio, bDouble);
2918         fprintf(stderr, "Reading file %s, %s (%s precision)\n",
2919                 gmx_fio_getname(fio), buf, bDouble ? "double" : "single");
2920     }
2921     else
2922     {
2923         gmx_fio_write_string(fio, GromacsVersion());
2924         bDouble = (precision == sizeof(double));
2925         gmx_fio_setprecision(fio, bDouble);
2926         gmx_fio_do_int(fio, precision);
2927         fver = tpx_version;
2928         sprintf(file_tag, "%s", tpx_tag);
2929         fgen = tpx_generation;
2930     }
2931
2932     /* Check versions! */
2933     gmx_fio_do_int(fio, fver);
2934
2935     /* This is for backward compatibility with development versions 77-79
2936      * where the tag was, mistakenly, placed before the generation,
2937      * which would cause a segv instead of a proper error message
2938      * when reading the topology only from tpx with <77 code.
2939      */
2940     if (fver >= 77 && fver <= 79)
2941     {
2942         gmx_fio_do_string(fio, file_tag);
2943     }
2944
2945     if (fver >= 26)
2946     {
2947         gmx_fio_do_int(fio, fgen);
2948     }
2949     else
2950     {
2951         fgen = 0;
2952     }
2953
2954     if (fver >= 81)
2955     {
2956         gmx_fio_do_string(fio, file_tag);
2957     }
2958     if (bRead)
2959     {
2960         if (fver < 77)
2961         {
2962             /* Versions before 77 don't have the tag, set it to release */
2963             sprintf(file_tag, "%s", TPX_TAG_RELEASE);
2964         }
2965
2966         if (strcmp(file_tag, tpx_tag) != 0)
2967         {
2968             fprintf(stderr, "Note: file tpx tag '%s', software tpx tag '%s'\n",
2969                     file_tag, tpx_tag);
2970
2971             /* We only support reading tpx files with the same tag as the code
2972              * or tpx files with the release tag and with lower version number.
2973              */
2974             if (!strcmp(file_tag, TPX_TAG_RELEASE) == 0 && fver < tpx_version)
2975             {
2976                 gmx_fatal(FARGS, "tpx tag/version mismatch: reading tpx file (%s) version %d, tag '%s' with program for tpx version %d, tag '%s'",
2977                           gmx_fio_getname(fio), fver, file_tag,
2978                           tpx_version, tpx_tag);
2979             }
2980         }
2981     }
2982
2983     if (file_version != NULL)
2984     {
2985         *file_version = fver;
2986     }
2987     if (file_generation != NULL)
2988     {
2989         *file_generation = fgen;
2990     }
2991
2992
2993     if ((fver <= tpx_incompatible_version) ||
2994         ((fver > tpx_version) && !TopOnlyOK) ||
2995         (fgen > tpx_generation) ||
2996         tpx_version == 80) /*80 was used by both 5.0-dev and 4.6-dev*/
2997     {
2998         gmx_fatal(FARGS, "reading tpx file (%s) version %d with version %d program",
2999                   gmx_fio_getname(fio), fver, tpx_version);
3000     }
3001
3002     do_section(fio, eitemHEADER, bRead);
3003     gmx_fio_do_int(fio, tpx->natoms);
3004     if (fver >= 28)
3005     {
3006         gmx_fio_do_int(fio, tpx->ngtc);
3007     }
3008     else
3009     {
3010         tpx->ngtc = 0;
3011     }
3012     if (fver < 62)
3013     {
3014         gmx_fio_do_int(fio, idum);
3015         gmx_fio_do_real(fio, rdum);
3016     }
3017     /*a better decision will eventually (5.0 or later) need to be made
3018        on how to treat the alchemical state of the system, which can now
3019        vary through a simulation, and cannot be completely described
3020        though a single lambda variable, or even a single state
3021        index. Eventually, should probably be a vector. MRS*/
3022     if (fver >= 79)
3023     {
3024         gmx_fio_do_int(fio, tpx->fep_state);
3025     }
3026     gmx_fio_do_real(fio, tpx->lambda);
3027     gmx_fio_do_int(fio, tpx->bIr);
3028     gmx_fio_do_int(fio, tpx->bTop);
3029     gmx_fio_do_int(fio, tpx->bX);
3030     gmx_fio_do_int(fio, tpx->bV);
3031     gmx_fio_do_int(fio, tpx->bF);
3032     gmx_fio_do_int(fio, tpx->bBox);
3033
3034     if ((fgen > tpx_generation))
3035     {
3036         /* This can only happen if TopOnlyOK=TRUE */
3037         tpx->bIr = FALSE;
3038     }
3039 }
3040
3041 static int do_tpx(t_fileio *fio, gmx_bool bRead,
3042                   t_inputrec *ir, t_state *state, rvec *f, gmx_mtop_t *mtop,
3043                   gmx_bool bXVallocated)
3044 {
3045     t_tpxheader     tpx;
3046     t_inputrec      dum_ir;
3047     gmx_mtop_t      dum_top;
3048     gmx_bool        TopOnlyOK;
3049     int             file_version, file_generation;
3050     int             i;
3051     rvec           *xptr, *vptr;
3052     int             ePBC;
3053     gmx_bool        bPeriodicMols;
3054
3055     if (!bRead)
3056     {
3057         tpx.natoms    = state->natoms;
3058         tpx.ngtc      = state->ngtc; /* need to add nnhpres here? */
3059         tpx.fep_state = state->fep_state;
3060         tpx.lambda    = state->lambda[efptFEP];
3061         tpx.bIr       = (ir       != NULL);
3062         tpx.bTop      = (mtop     != NULL);
3063         tpx.bX        = (state->x != NULL);
3064         tpx.bV        = (state->v != NULL);
3065         tpx.bF        = (f        != NULL);
3066         tpx.bBox      = TRUE;
3067     }
3068
3069     TopOnlyOK = (ir == NULL);
3070
3071     do_tpxheader(fio, bRead, &tpx, TopOnlyOK, &file_version, &file_generation);
3072
3073     if (bRead)
3074     {
3075         state->flags  = 0;
3076         /* state->lambda = tpx.lambda;*/ /*remove this eventually? */
3077         /* The init_state calls initialize the Nose-Hoover xi integrals to zero */
3078         if (bXVallocated)
3079         {
3080             xptr = state->x;
3081             vptr = state->v;
3082             init_state(state, 0, tpx.ngtc, 0, 0, 0); /* nose-hoover chains */ /* eventually, need to add nnhpres here? */
3083             state->natoms = tpx.natoms;
3084             state->nalloc = tpx.natoms;
3085             state->x      = xptr;
3086             state->v      = vptr;
3087         }
3088         else
3089         {
3090             init_state(state, tpx.natoms, tpx.ngtc, 0, 0, 0); /* nose-hoover chains */
3091         }
3092     }
3093
3094 #define do_test(fio, b, p) if (bRead && (p != NULL) && !b) gmx_fatal(FARGS, "No %s in %s",#p, gmx_fio_getname(fio))
3095
3096     do_test(fio, tpx.bBox, state->box);
3097     do_section(fio, eitemBOX, bRead);
3098     if (tpx.bBox)
3099     {
3100         gmx_fio_ndo_rvec(fio, state->box, DIM);
3101         if (file_version >= 51)
3102         {
3103             gmx_fio_ndo_rvec(fio, state->box_rel, DIM);
3104         }
3105         else
3106         {
3107             /* We initialize box_rel after reading the inputrec */
3108             clear_mat(state->box_rel);
3109         }
3110         if (file_version >= 28)
3111         {
3112             gmx_fio_ndo_rvec(fio, state->boxv, DIM);
3113             if (file_version < 56)
3114             {
3115                 matrix mdum;
3116                 gmx_fio_ndo_rvec(fio, mdum, DIM);
3117             }
3118         }
3119     }
3120
3121     if (state->ngtc > 0 && file_version >= 28)
3122     {
3123         real *dumv;
3124         /*ndo_double(state->nosehoover_xi,state->ngtc,bDum);*/
3125         /*ndo_double(state->nosehoover_vxi,state->ngtc,bDum);*/
3126         /*ndo_double(state->therm_integral,state->ngtc,bDum);*/
3127         snew(dumv, state->ngtc);
3128         if (file_version < 69)
3129         {
3130             gmx_fio_ndo_real(fio, dumv, state->ngtc);
3131         }
3132         /* These used to be the Berendsen tcoupl_lambda's */
3133         gmx_fio_ndo_real(fio, dumv, state->ngtc);
3134         sfree(dumv);
3135     }
3136
3137     /* Prior to tpx version 26, the inputrec was here.
3138      * I moved it to enable partial forward-compatibility
3139      * for analysis/viewer programs.
3140      */
3141     if (file_version < 26)
3142     {
3143         do_test(fio, tpx.bIr, ir);
3144         do_section(fio, eitemIR, bRead);
3145         if (tpx.bIr)
3146         {
3147             if (ir)
3148             {
3149                 do_inputrec(fio, ir, bRead, file_version,
3150                             mtop ? &mtop->ffparams.fudgeQQ : NULL);
3151                 if (bRead && debug)
3152                 {
3153                     pr_inputrec(debug, 0, "inputrec", ir, FALSE);
3154                 }
3155             }
3156             else
3157             {
3158                 do_inputrec(fio, &dum_ir, bRead, file_version,
3159                             mtop ? &mtop->ffparams.fudgeQQ : NULL);
3160                 if (bRead && debug)
3161                 {
3162                     pr_inputrec(debug, 0, "inputrec", &dum_ir, FALSE);
3163                 }
3164                 done_inputrec(&dum_ir);
3165             }
3166
3167         }
3168     }
3169
3170     do_test(fio, tpx.bTop, mtop);
3171     do_section(fio, eitemTOP, bRead);
3172     if (tpx.bTop)
3173     {
3174         if (mtop)
3175         {
3176             do_mtop(fio, mtop, bRead, file_version);
3177         }
3178         else
3179         {
3180             do_mtop(fio, &dum_top, bRead, file_version);
3181             done_mtop(&dum_top, TRUE);
3182         }
3183     }
3184     do_test(fio, tpx.bX, state->x);
3185     do_section(fio, eitemX, bRead);
3186     if (tpx.bX)
3187     {
3188         if (bRead)
3189         {
3190             state->flags |= (1<<estX);
3191         }
3192         gmx_fio_ndo_rvec(fio, state->x, state->natoms);
3193     }
3194
3195     do_test(fio, tpx.bV, state->v);
3196     do_section(fio, eitemV, bRead);
3197     if (tpx.bV)
3198     {
3199         if (bRead)
3200         {
3201             state->flags |= (1<<estV);
3202         }
3203         gmx_fio_ndo_rvec(fio, state->v, state->natoms);
3204     }
3205
3206     do_test(fio, tpx.bF, f);
3207     do_section(fio, eitemF, bRead);
3208     if (tpx.bF)
3209     {
3210         gmx_fio_ndo_rvec(fio, f, state->natoms);
3211     }
3212
3213     /* Starting with tpx version 26, we have the inputrec
3214      * at the end of the file, so we can ignore it
3215      * if the file is never than the software (but still the
3216      * same generation - see comments at the top of this file.
3217      *
3218      *
3219      */
3220     ePBC          = -1;
3221     bPeriodicMols = FALSE;
3222     if (file_version >= 26)
3223     {
3224         do_test(fio, tpx.bIr, ir);
3225         do_section(fio, eitemIR, bRead);
3226         if (tpx.bIr)
3227         {
3228             if (file_version >= 53)
3229             {
3230                 /* Removed the pbc info from do_inputrec, since we always want it */
3231                 if (!bRead)
3232                 {
3233                     ePBC          = ir->ePBC;
3234                     bPeriodicMols = ir->bPeriodicMols;
3235                 }
3236                 gmx_fio_do_int(fio, ePBC);
3237                 gmx_fio_do_gmx_bool(fio, bPeriodicMols);
3238             }
3239             if (file_generation <= tpx_generation && ir)
3240             {
3241                 do_inputrec(fio, ir, bRead, file_version, mtop ? &mtop->ffparams.fudgeQQ : NULL);
3242                 if (bRead && debug)
3243                 {
3244                     pr_inputrec(debug, 0, "inputrec", ir, FALSE);
3245                 }
3246                 if (file_version < 51)
3247                 {
3248                     set_box_rel(ir, state);
3249                 }
3250                 if (file_version < 53)
3251                 {
3252                     ePBC          = ir->ePBC;
3253                     bPeriodicMols = ir->bPeriodicMols;
3254                 }
3255             }
3256             if (bRead && ir && file_version >= 53)
3257             {
3258                 /* We need to do this after do_inputrec, since that initializes ir */
3259                 ir->ePBC          = ePBC;
3260                 ir->bPeriodicMols = bPeriodicMols;
3261             }
3262         }
3263     }
3264
3265     if (bRead)
3266     {
3267         if (tpx.bIr && ir)
3268         {
3269             if (state->ngtc == 0)
3270             {
3271                 /* Reading old version without tcoupl state data: set it */
3272                 init_gtc_state(state, ir->opts.ngtc, 0, ir->opts.nhchainlength);
3273             }
3274             if (tpx.bTop && mtop)
3275             {
3276                 if (file_version < 57)
3277                 {
3278                     if (mtop->moltype[0].ilist[F_DISRES].nr > 0)
3279                     {
3280                         ir->eDisre = edrSimple;
3281                     }
3282                     else
3283                     {
3284                         ir->eDisre = edrNone;
3285                     }
3286                 }
3287                 set_disres_npair(mtop);
3288             }
3289         }
3290
3291         if (tpx.bTop && mtop)
3292         {
3293             gmx_mtop_finalize(mtop);
3294         }
3295
3296         if (file_version >= 57)
3297         {
3298             char *env;
3299             int   ienv;
3300             env = getenv("GMX_NOCHARGEGROUPS");
3301             if (env != NULL)
3302             {
3303                 sscanf(env, "%d", &ienv);
3304                 fprintf(stderr, "\nFound env.var. GMX_NOCHARGEGROUPS = %d\n",
3305                         ienv);
3306                 if (ienv > 0)
3307                 {
3308                     fprintf(stderr,
3309                             "Will make single atomic charge groups in non-solvent%s\n",
3310                             ienv > 1 ? " and solvent" : "");
3311                     gmx_mtop_make_atomic_charge_groups(mtop, ienv == 1);
3312                 }
3313                 fprintf(stderr, "\n");
3314             }
3315         }
3316     }
3317
3318     return ePBC;
3319 }
3320
3321 /************************************************************
3322  *
3323  *  The following routines are the exported ones
3324  *
3325  ************************************************************/
3326
3327 t_fileio *open_tpx(const char *fn, const char *mode)
3328 {
3329     return gmx_fio_open(fn, mode);
3330 }
3331
3332 void close_tpx(t_fileio *fio)
3333 {
3334     gmx_fio_close(fio);
3335 }
3336
3337 void read_tpxheader(const char *fn, t_tpxheader *tpx, gmx_bool TopOnlyOK,
3338                     int *file_version, int *file_generation)
3339 {
3340     t_fileio *fio;
3341
3342     fio = open_tpx(fn, "r");
3343     do_tpxheader(fio, TRUE, tpx, TopOnlyOK, file_version, file_generation);
3344     close_tpx(fio);
3345 }
3346
3347 void write_tpx_state(const char *fn,
3348                      t_inputrec *ir, t_state *state, gmx_mtop_t *mtop)
3349 {
3350     t_fileio *fio;
3351
3352     fio = open_tpx(fn, "w");
3353     do_tpx(fio, FALSE, ir, state, NULL, mtop, FALSE);
3354     close_tpx(fio);
3355 }
3356
3357 void read_tpx_state(const char *fn,
3358                     t_inputrec *ir, t_state *state, rvec *f, gmx_mtop_t *mtop)
3359 {
3360     t_fileio *fio;
3361
3362     fio = open_tpx(fn, "r");
3363     do_tpx(fio, TRUE, ir, state, f, mtop, FALSE);
3364     close_tpx(fio);
3365 }
3366
3367 int read_tpx(const char *fn,
3368              t_inputrec *ir, matrix box, int *natoms,
3369              rvec *x, rvec *v, rvec *f, gmx_mtop_t *mtop)
3370 {
3371     t_fileio *fio;
3372     t_state   state;
3373     int       ePBC;
3374
3375     state.x = x;
3376     state.v = v;
3377     fio     = open_tpx(fn, "r");
3378     ePBC    = do_tpx(fio, TRUE, ir, &state, f, mtop, TRUE);
3379     close_tpx(fio);
3380     *natoms = state.natoms;
3381     if (box)
3382     {
3383         copy_mat(state.box, box);
3384     }
3385     state.x = NULL;
3386     state.v = NULL;
3387     done_state(&state);
3388
3389     return ePBC;
3390 }
3391
3392 int read_tpx_top(const char *fn,
3393                  t_inputrec *ir, matrix box, int *natoms,
3394                  rvec *x, rvec *v, rvec *f, t_topology *top)
3395 {
3396     gmx_mtop_t  mtop;
3397     t_topology *ltop;
3398     int         ePBC;
3399
3400     ePBC = read_tpx(fn, ir, box, natoms, x, v, f, &mtop);
3401
3402     *top = gmx_mtop_t_to_t_topology(&mtop);
3403
3404     return ePBC;
3405 }
3406
3407 gmx_bool fn2bTPX(const char *file)
3408 {
3409     switch (fn2ftp(file))
3410     {
3411         case efTPR:
3412         case efTPB:
3413         case efTPA:
3414             return TRUE;
3415         default:
3416             return FALSE;
3417     }
3418 }
3419
3420 static void done_gmx_groups_t(gmx_groups_t *g)
3421 {
3422     int i;
3423
3424     for (i = 0; (i < egcNR); i++)
3425     {
3426         if (NULL != g->grps[i].nm_ind)
3427         {
3428             sfree(g->grps[i].nm_ind);
3429             g->grps[i].nm_ind = NULL;
3430         }
3431         if (NULL != g->grpnr[i])
3432         {
3433             sfree(g->grpnr[i]);
3434             g->grpnr[i] = NULL;
3435         }
3436     }
3437     /* The contents of this array is in symtab, don't free it here */
3438     sfree(g->grpname);
3439 }
3440
3441 gmx_bool read_tps_conf(const char *infile, char *title, t_topology *top, int *ePBC,
3442                        rvec **x, rvec **v, matrix box, gmx_bool bMass)
3443 {
3444     t_tpxheader      header;
3445     int              natoms, i, version, generation;
3446     gmx_bool         bTop, bXNULL = FALSE;
3447     gmx_mtop_t      *mtop;
3448     t_topology      *topconv;
3449     gmx_atomprop_t   aps;
3450
3451     bTop  = fn2bTPX(infile);
3452     *ePBC = -1;
3453     if (bTop)
3454     {
3455         read_tpxheader(infile, &header, TRUE, &version, &generation);
3456         if (x)
3457         {
3458             snew(*x, header.natoms);
3459         }
3460         if (v)
3461         {
3462             snew(*v, header.natoms);
3463         }
3464         snew(mtop, 1);
3465         *ePBC = read_tpx(infile, NULL, box, &natoms,
3466                          (x == NULL) ? NULL : *x, (v == NULL) ? NULL : *v, NULL, mtop);
3467         *top = gmx_mtop_t_to_t_topology(mtop);
3468         /* In this case we need to throw away the group data too */
3469         done_gmx_groups_t(&mtop->groups);
3470         sfree(mtop);
3471         strcpy(title, *top->name);
3472         tpx_make_chain_identifiers(&top->atoms, &top->mols);
3473     }
3474     else
3475     {
3476         get_stx_coordnum(infile, &natoms);
3477         init_t_atoms(&top->atoms, natoms, (fn2ftp(infile) == efPDB));
3478         if (x == NULL)
3479         {
3480             snew(x, 1);
3481             bXNULL = TRUE;
3482         }
3483         snew(*x, natoms);
3484         if (v)
3485         {
3486             snew(*v, natoms);
3487         }
3488         read_stx_conf(infile, title, &top->atoms, *x, (v == NULL) ? NULL : *v, ePBC, box);
3489         if (bXNULL)
3490         {
3491             sfree(*x);
3492             sfree(x);
3493         }
3494         if (bMass)
3495         {
3496             aps = gmx_atomprop_init();
3497             for (i = 0; (i < natoms); i++)
3498             {
3499                 if (!gmx_atomprop_query(aps, epropMass,
3500                                         *top->atoms.resinfo[top->atoms.atom[i].resind].name,
3501                                         *top->atoms.atomname[i],
3502                                         &(top->atoms.atom[i].m)))
3503                 {
3504                     if (debug)
3505                     {
3506                         fprintf(debug, "Can not find mass for atom %s %d %s, setting to 1\n",
3507                                 *top->atoms.resinfo[top->atoms.atom[i].resind].name,
3508                                 top->atoms.resinfo[top->atoms.atom[i].resind].nr,
3509                                 *top->atoms.atomname[i]);
3510                     }
3511                 }
3512             }
3513             gmx_atomprop_destroy(aps);
3514         }
3515         top->idef.ntypes = -1;
3516     }
3517
3518     return bTop;
3519 }