1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
|
/*
* $Id: mdrun.h,v 1.71.2.1 2006/04/06 08:43:28 spoel Exp $
*
* This source code is part of
*
* G R O M A C S
*
* GROningen MAchine for Chemical Simulations
*
* VERSION 3.2.0
* Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team,
* check out http://www.gromacs.org for more information.
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* If you want to redistribute modifications, please consider that
* scientific software is very special. Version control is crucial -
* bugs must be traceable. We will be happy to consider code for
* inclusion in the official distribution, but derived work must not
* be called official GROMACS. Details are found in the README & COPYING
* files - if they are missing, get the official version at www.gromacs.org.
*
* To help us fund GROMACS development, we humbly ask that you cite
* the papers on the package - you can find them in the top README file.
*
* For more info, check our website at http://www.gromacs.org
*
* And Hey:
* Gromacs Runs On Most of All Computer Systems
*/
#ifndef _mdrun_h
#define _mdrun_h
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include "typedefs.h"
#include "network.h"
#include "tgroup.h"
#include "filenm.h"
#include "nsb.h"
#include "mshift.h"
#include "force.h"
#include "time.h"
#include "edsam.h"
#include "mdebin.h"
#include "vcm.h"
#include "vsite.h"
#include "pull.h"
#define MD_MULTISIM (1<<0)
#define MD_GLAS (1<<1)
#define MD_POLARISE (1<<2)
#define MD_IONIZE (1<<3)
#define MD_RERUN (1<<4)
#define MD_FFSCAN (1<<6)
#define MD_SEPDVDL (1<<7)
/* ROUTINES from md.c */
extern time_t do_md(FILE *log,t_commrec *cr,t_commrec *mcr,
int nfile,t_filenm fnm[],
bool bVerbose,bool bCompact,bool bVsites,
t_comm_vsites *vsitecomm,int stepout,
t_inputrec *inputrec,t_groups *grps,
t_topology *top,real ener[],t_fcdata *fcd,
t_state *state,rvec vold[],rvec vt[],rvec f[],
rvec buf[],t_mdatoms *mdatoms,
t_nsborder *nsb,t_nrnb nrnb[],
t_graph *graph,t_edsamyn *edyn,
t_forcerec *fr,
int repl_ex_nst,int repl_ex_seed,
unsigned long Flags);
/* ROUTINES from minimize.c */
extern time_t do_steep(FILE *log,int nfile,t_filenm fnm[],
t_inputrec *inputrec,t_topology *top,
t_groups *grps,t_nsborder *nsb,
t_state *state,rvec grad[],rvec buf[],t_mdatoms *mdatoms,
real ener[],t_fcdata *fcd,t_nrnb nrnb[],
bool bVerbose,bool bVsites,t_comm_vsites *vsitecomm,
t_commrec *cr,t_commrec *mcr,
t_graph *graph,t_forcerec *fr);
/* Do steepest descents EM or something like that! */
extern time_t do_cg(FILE *log,int nfile,t_filenm fnm[],
t_inputrec *inputrec,t_topology *top,
t_groups *grps,t_nsborder *nsb,
t_state *state,rvec grad[],rvec buf[],t_mdatoms *mdatoms,
real ener[],t_fcdata *fcd,t_nrnb nrnb[],
bool bVerbose,bool bVsites,t_comm_vsites *vsitecomm,
t_commrec *cr,t_commrec *mcr,
t_graph *graph,t_forcerec *fr);
/* Do conjugate gradients EM! */
extern time_t do_lbfgs(FILE *log,int nfile,t_filenm fnm[],
t_inputrec *inputrec,t_topology *top,
t_groups *grps,t_nsborder *nsb, t_state *state,
rvec grad[],rvec buf[],t_mdatoms *mdatoms,
real ener[],t_fcdata *fcd,t_nrnb nrnb[],
bool bVerbose,bool bVsites,t_comm_vsites *vsitecomm,
t_commrec *cr,t_commrec *mcr,
t_graph *graph,t_forcerec *fr);
/* Do conjugate gradients EM! */
extern time_t do_nm(FILE *log,t_commrec *cr,int nfile,t_filenm fnm[],
bool bVerbose,bool bCompact,int stepout,
t_inputrec *inputrec,t_groups *grps,
t_topology *top,real ener[],t_fcdata *fcd,
t_state *state,rvec vold[],rvec vt[],rvec f[],
rvec buf[],t_mdatoms *mdatoms,
t_nsborder *nsb,t_nrnb nrnb[],
t_graph *graph,t_edsamyn *edyn,
t_forcerec *fr);
/* Do normal mode analysis */
extern time_t do_tpi(FILE *log,int nfile,t_filenm fnm[],
t_inputrec *inputrec,t_topology *top,
t_groups *grps,t_nsborder *nsb,
t_state *state,rvec f[],rvec buf[],t_mdatoms *mdatoms,
real ener[],t_fcdata *fcd,t_nrnb nrnb[],
bool bVerbose,
t_commrec *cr,t_commrec *mcr,t_graph *graph,
t_forcerec *fr);
/* Do test particle insertion */
/* ROUTINES from runner.c */
extern bool optRerunMDset (int nfile, t_filenm fnm[]);
extern void do_pbc_first(FILE *log,matrix box,t_forcerec *fr,
t_graph *graph,rvec x[]);
/* ROUTINES from stat.c */
extern void global_stat(FILE *log,
t_commrec *cr,real ener[],
tensor fvir,tensor svir,
t_grpopts *opts,t_groups *grps,
t_nrnb *mynrnb,t_nrnb nrnb[],
t_vcm *vcm,real *terminate);
/* Communicate statistics around the ring */
extern int write_traj(FILE *log,t_commrec *cr,char *traj,t_nsborder *nsb,
int step,real t,real lambda,t_nrnb nr_nb[],
int natoms,rvec *xx,rvec *vv,rvec *ff,matrix box);
/* Routine to output statusfiles during a run, as specified in
* in inputrec->ir. If any of the pointers xx,vv,ff or ener is not NULL
* it is written to the trajectory file.
* Also write the energies etc. to the log file.
* Returns the file handle (to be closed with close_trn).
*/
extern int do_per_step(int step,int nstep);
/* Return TRUE if io should be done */
extern int do_any_io(int step, t_inputrec *ir);
extern void write_xtc_traj(FILE *log,t_commrec *cr,
char *xtc_traj,t_nsborder *nsb,t_mdatoms *md,
int step,real t,rvec *xx,
matrix box,real prec);
extern void close_xtc_traj(void);
/* ROUTINES from sim_util.c */
extern void update_mdatoms(t_mdatoms *md,real lambda, bool bFirst);
/* Compute fields from mdatoms struct (invmass etc.) which may change
* due to lambda dependent FEP calculations.
* If bFirst all values are set, this is necessary once in the
* first step.
* You only have to call this routine again if lambda changes.
*/
extern void print_time(FILE *out,time_t start,int step,t_inputrec *ir);
extern time_t print_date_and_time(FILE *log,int pid,char *title);
extern void do_force(FILE *log,t_commrec *cr,t_commrec *mcr,
t_inputrec *inputrec,t_nsborder *nsb,
int step,t_nrnb *nrnb,t_topology *top,t_groups *grps,
matrix box,rvec x[],rvec f[],rvec buf[],
t_mdatoms *mdatoms,real ener[],t_fcdata *fcd,
bool bVerbose,real lambda,t_graph *graph,
bool bStateChanged,bool bNS,bool bNBFonly,bool bDoForces,
t_forcerec *fr, rvec mu_tot,
bool bGatherOnly,real t,FILE *field,t_edsamyn *edyn);
extern void sum_lrforces(rvec f[],t_forcerec *fr,int start,int homenr);
extern void calc_virial(FILE *log,int start,int homenr,rvec x[],rvec f[],
tensor vir_part,tensor vir_el_recip,
t_graph *graph,matrix box,
t_nrnb *nrnb,const t_forcerec *fr);
extern void nstop_cm(FILE *log,t_commrec *cr,
int start,int nr_atoms,real mass[],rvec x[],rvec v[]);
extern void finish_run(FILE *log,t_commrec *cr,char *confout, t_nsborder *nsb,
t_topology *top, t_inputrec *inputrec,t_nrnb nrnb[],
double nodetime,double realtime,int step,
bool bWriteStat);
extern void calc_dispcorr(FILE *fplog,t_inputrec *ir,t_forcerec *fr,int step,
int natoms,matrix box,real lambda,
tensor pres,tensor virial,real ener[]);
typedef enum
{
LIST_SCALARS =0001,
LIST_INPUTREC =0002,
LIST_TOP =0004,
LIST_X =0010,
LIST_V =0020,
LIST_F =0040,
LIST_LOAD =0100
} t_listitem;
extern void check_nnodes_top(char *fn,t_topology *top,int nnodes);
/* Verify whether this tpr file is for nnodes nodes, and quit if not */
extern void init_single(FILE *log,
t_inputrec *inputrec, char *tpbfile, t_topology *top,
t_state *state,t_mdatoms **mdatoms,
t_nsborder *nsb);
/*
* Allocates space for the topology (top), the coordinates x, the
* velocities v, masses mass. Reads the parameters, topology,
* coordinates and velocities from the file specified in tpbfile
*/
extern void distribute_parts(int left,int right,int pid,int nprocs,
t_inputrec *inputrec,char *tpbfile,int nstDlb);
/*
* Reads the parameters, topology, coordinates and velocities for the
* multi processor version of the program from the file specified in
* inputrec->files[STATUS_NM]. This file should also contain a so called
* split descriptor which describes how to distribute particles over
* the system. It then selects for all subsystems the appropriate data
* and sends this to the processor using the left and right channels.
* At last it sends its own subsystem down the ring where it is buffered.
* Its own buffers for reading the data from the file are freed, and it
* is now possible to reload this processor from the ring by using the
* init_parts() routine.
* The routine also creates a renum array which can be used for writing
* out the x,v and f for analysis purpose.
*/
extern void init_parts(FILE *log,t_commrec *cr,
t_inputrec *inputrec,t_topology *top,
t_state *state,t_mdatoms **mdatoms,
t_nsborder *nsb,int list,
bool *bParallelVsites,
t_comm_vsites *vsitecomm);
/*
* Loads the data for a simulation from the ring. Parameters, topology
* coordinates, velocities, and masses are initialised equal to using
* init_single() in the single processor version. The extra argument
* f_add is allocated to use for the update of the forces, the load
* array specifies in which part of the x and f array the subsystems
* of the other processors are located. Homenr0, homenr1, nparts0 and
* nparts1 are necessary to calculate the non bonded interaction using
* the symmetry and thus calculating every force only once. List is a facility
* for logging (and debugging). One can decide to print none or a set of
* selected parameters to the file specified by log. Parameters are
* printed by or-ing the corresponding items from t_listitem. A 0 (zero)
* specifies that nothing is to be printed on the file. The function
* returns the number of shifts over the ring to perform to calculate
* all interactions.
*/
extern void start_time(void);
/* Start timing routines */
extern void update_time(void);
/* Update the timer.This must be done at least every INT_MAX microseconds,
* or 2400 s, in order to give reliable answers.
*/
extern double node_time(void);
/* Return the node time so far in seconds. */
extern void do_shakefirst(FILE *log,real ener[],
t_inputrec *inputrec,t_nsborder *nsb,t_mdatoms *md,
t_state *state,rvec vold[],rvec buf[],rvec f[],
t_graph *graph,t_commrec *cr,t_nrnb *nrnb,
t_groups *grps,t_forcerec *fr,t_topology *top,
t_edsamyn *edyn,t_pull *pulldata);
extern void dynamic_load_balancing(bool bVerbose,t_commrec *cr,real capacity[],
int dimension,t_mdatoms *md,t_topology *top,
rvec x[],rvec v[],matrix box);
/* Perform load balancing, i.e. split the particles over processors
* based on their coordinates in the "dimension" direction.
*/
extern void mdrunner(t_commrec *cr,t_commrec *mcr,int nfile,t_filenm fnm[],
bool bVerbose,bool bCompact,
int nDlb,int nstepout,
t_edsamyn *edyn,int repl_ex_nst,int repl_ex_seed,
unsigned long Flags);
/* Driver routine, that calls the different methods */
extern void init_md(t_commrec *cr,t_inputrec *ir,real *t,real *t0,
real *lambda,real *lam0,
t_nrnb *mynrnb,t_topology *top,
int nfile,t_filenm fnm[],char **traj,
char **xtc_traj,int *fp_ene,
FILE **fp_dgdl,FILE **fp_field,
t_mdebin **mdebin,t_groups *grps,
tensor force_vir,tensor shake_vir,
t_mdatoms *mdatoms,rvec mu_tot,
bool *bNEMD,bool *bSimAnn,t_vcm **vcm,t_nsborder *nsb);
/* Routine in sim_util.c */
extern void init_em(FILE *log,const char *title,t_inputrec *inputrec,
real *lambda,t_nrnb *mynrnb,rvec mu_tot,
matrix box,
t_forcerec *fr,t_mdatoms *mdatoms,t_topology *top,
t_nsborder *nsb,
t_commrec *cr,t_vcm **vcm,int *start,int *end);
/* Routine in minimize.c */
#endif /* _mdrun_h */
|