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