Create fileio module
[alexxy/gromacs.git] / src / gromacs / fileio / trajectory_writing.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2013, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 #ifdef HAVE_CONFIG_H
36 #include <config.h>
37 #endif
38
39 #include "typedefs.h"
40 #include "smalloc.h"
41 #include "sysstuff.h"
42 #include "vec.h"
43 #include "sim_util.h"
44 #include "gmx_wallcycle.h"
45 #include "mdrun.h"
46 #include "confio.h"
47 #include "trajectory_writing.h"
48 #include "mdoutf.h"
49
50 void
51 do_trajectory_writing(FILE           *fplog,
52                       t_commrec      *cr,
53                       int             nfile,
54                       const t_filenm  fnm[],
55                       gmx_large_int_t step,
56                       gmx_large_int_t step_rel,
57                       double          t,
58                       t_inputrec     *ir,
59                       t_state        *state,
60                       t_state        *state_global,
61                       gmx_mtop_t     *top_global,
62                       t_forcerec     *fr,
63                       gmx_update_t    upd,
64                       gmx_mdoutf_t   *outf,
65                       t_mdebin       *mdebin,
66                       gmx_ekindata_t *ekind,
67                       rvec           *f,
68                       rvec           *f_global,
69                       gmx_wallcycle_t wcycle,
70                       gmx_rng_t       mcrng,
71                       int            *nchkpt,
72                       gmx_bool        bCPT,
73                       gmx_bool        bRerunMD,
74                       gmx_bool        bLastStep,
75                       gmx_bool        bDoConfOut,
76                       gmx_bool        bSumEkinhOld
77                       )
78 {
79     int   mdof_flags;
80     int   n_xtc    = -1;
81     rvec *x_xtc    = NULL;
82
83     mdof_flags = 0;
84     if (do_per_step(step, ir->nstxout))
85     {
86         mdof_flags |= MDOF_X;
87     }
88     if (do_per_step(step, ir->nstvout))
89     {
90         mdof_flags |= MDOF_V;
91     }
92     if (do_per_step(step, ir->nstfout))
93     {
94         mdof_flags |= MDOF_F;
95     }
96     if (do_per_step(step, ir->nstxtcout))
97     {
98         mdof_flags |= MDOF_XTC;
99     }
100     if (bCPT)
101     {
102         mdof_flags |= MDOF_CPT;
103     }
104     ;
105
106 #if defined(GMX_FAHCORE) || defined(GMX_WRITELASTSTEP)
107     if (bLastStep)
108     {
109         /* Enforce writing positions and velocities at end of run */
110         mdof_flags |= (MDOF_X | MDOF_V);
111     }
112 #endif
113 #ifdef GMX_FAHCORE
114     if (MASTER(cr))
115     {
116         fcReportProgress( ir->nsteps, step );
117     }
118
119     /* sync bCPT and fc record-keeping */
120     if (bCPT && MASTER(cr))
121     {
122         fcRequestCheckPoint();
123     }
124 #endif
125
126     if (mdof_flags != 0)
127     {
128         wallcycle_start(wcycle, ewcTRAJ);
129         if (bCPT)
130         {
131             if (state->flags & (1<<estLD_RNG))
132             {
133                 get_stochd_state(upd, state);
134             }
135             if (state->flags  & (1<<estMC_RNG))
136             {
137                 get_mc_state(mcrng, state);
138             }
139             if (MASTER(cr))
140             {
141                 if (bSumEkinhOld)
142                 {
143                     state_global->ekinstate.bUpToDate = FALSE;
144                 }
145                 else
146                 {
147                     update_ekinstate(&state_global->ekinstate, ekind);
148                     state_global->ekinstate.bUpToDate = TRUE;
149                 }
150                 update_energyhistory(&state_global->enerhist, mdebin);
151             }
152         }
153         write_traj(fplog, cr, outf, mdof_flags, top_global,
154                    step, t, state, state_global, f, f_global, &n_xtc, &x_xtc);
155         if (bCPT)
156         {
157             (*nchkpt)++;
158             bCPT = FALSE;
159         }
160         debug_gmx();
161         if (bLastStep && step_rel == ir->nsteps &&
162             bDoConfOut && MASTER(cr) &&
163             !bRerunMD)
164         {
165             /* x and v have been collected in write_traj,
166              * because a checkpoint file will always be written
167              * at the last step.
168              */
169             fprintf(stderr, "\nWriting final coordinates.\n");
170             if (fr->bMolPBC)
171             {
172                 /* Make molecules whole only for confout writing */
173                 do_pbc_mtop(fplog, ir->ePBC, state->box, top_global, state_global->x);
174             }
175             write_sto_conf_mtop(ftp2fn(efSTO, nfile, fnm),
176                                 *top_global->name, top_global,
177                                 state_global->x, state_global->v,
178                                 ir->ePBC, state->box);
179             debug_gmx();
180         }
181         wallcycle_stop(wcycle, ewcTRAJ);
182     }
183 }