00001
00002
00003
00004
00044 #ifndef STEP_H
00045 #define STEP_H
00046
00047 #include "mdapi/mdtypes.h"
00048
00049 #ifdef __cplusplus
00050 extern "C" {
00051 #endif
00052
00053
00057 enum {
00058 STEP_FAILURE = -1,
00061 STEP_SUCCESS = 0
00063 };
00064
00065
00069 typedef enum StepMethod_t {
00070 STEP_VERLET = 1,
00073 STEP_SHADOW,
00076 STEP_TEMPBATH,
00079 STEP_NHEXP,
00082 STEP_DRUDE_NH,
00085 STEP_DRUDE_ROUX,
00088 STEP_DRUDE_CHEN,
00091 STEP_CGMIN,
00094 STEP_METHOD_MARKER
00095
00096 } StepMethod;
00097
00098
00102 typedef enum StepOption_t {
00103 STEP_INITVEL = 0x001,
00106 STEP_RESTARTVEL= 0x002,
00110 STEP_REMOVECOM = 0x004,
00116 STEP_ZEROLINMO = 0x008,
00121 STEP_SETTLE = 0x010,
00124 STEP_VIRIAL = 0x020,
00127 STEP_MOMENTUM = 0x040,
00130 STEP_FIXEDATOMS= 0x080,
00136 STEP_CONSTRAINTS=0x100,
00140 STEP_OPTION_MARKER = 0x1FF
00141
00142 } StepOption;
00143
00144
00145 struct StepSystem_t;
00146 typedef struct StepSystem_t StepSystem;
00147
00148
00155 typedef struct StepParam_t {
00156
00157 StepMethod method;
00160 StepOption options;
00163 unsigned long random_seed;
00166 double timestep;
00169 double initial_temperature;
00173
00174
00175 void *messageObjPtr;
00178 int (*output_message)(void *messageObjPtr, const char *msg);
00181 void *forceObjPtr;
00184 int (*compute_force)(void *forceObjPtr,
00185 double *pe, MD_Dvec *force, const MD_Dvec *pos);
00189 void *resultsObjPtr;
00192 int (*submit_results)(void *resultsObjPtr, StepSystem *sys);
00196 int32 resultsFreq;
00199 int32 init_stepnum;
00202
00203
00204 MD_Atom *atom;
00207 int32 natoms;
00211 #if 0
00212 MD_Bond *bond;
00215 int32 nbonds;
00218 MD_Angle *angle;
00221 int32 nangles;
00224
00225
00226 MD_BondPrm *bondprm;
00229 int32 nbondprms;
00232 MD_AnglePrm *angleprm;
00235 int32 nangleprms;
00237 #endif
00238
00239
00240
00241 double bath_temperature;
00244 double relaxation_time;
00250
00251
00252 double nh_temperature;
00256 double nh_timescale;
00261
00262
00263 double drude_com_temperature;
00267 double drude_bond_temperature;
00271 double drude_com_timescale;
00275 double drude_bond_timescale;
00280 int32 drude_multisteps;
00284
00285
00286 double cgmin_dis;
00289 double cgmin_tol;
00292 int32 cgmin_eval;
00296
00297
00298 double settle_oh_dist;
00301 double settle_hoh_angle;
00304 } StepParam;
00305
00306
00308 enum StepShadowIndex_t {
00309 STEP_SHADOW_4 = 0,
00310 STEP_SHADOW_8,
00311 STEP_SHADOW_12,
00312 STEP_SHADOW_16,
00313 STEP_SHADOW_20,
00314 STEP_SHADOW_24,
00315 STEP_SHADOW_MAXINDEX
00316 };
00317
00318
00323 struct StepSystem_t {
00324
00325 double kinetic_energy;
00328 double temperature;
00331 MD_Dvec linear_momentum;
00334 MD_Dvec angular_momentum;
00337 double kinetic_virial[9];
00340 double potential_energy;
00343 double shadow_energy[STEP_SHADOW_MAXINDEX];
00346 double nh_extended_energy;
00349 double nh_friction_coef;
00352 double nh_log_s;
00355 double drude_com_energy;
00358 double drude_bond_energy;
00361 double drude_extended_energy;
00364 double drude_com_temperature;
00367 double drude_bond_temperature;
00370 MD_Dvec *force;
00373 MD_Dvec *vel;
00376 MD_Dvec *pos;
00379 int32 stepnum;
00382 int32 ndegfreedom;
00388 int32 nfixedatoms;
00392 int32 nrigidwaters;
00395 };
00396
00397
00400 struct Step_t;
00401 typedef struct Step_t Step;
00402
00403
00406 Step *new_Step(void);
00407
00410 void delete_Step(Step *);
00411
00430 int step_setup(Step *, StepParam *param,
00431 MD_Dvec *pos, MD_Dvec *vel, MD_Dvec *force);
00432
00433
00443 int step_compute(Step *, int32 numsteps);
00444
00445
00451 const char *step_errmsg(Step *);
00452
00453
00458 void step_cleanup(Step *);
00459
00460
00461 #ifdef __cplusplus
00462 }
00463 #endif
00464
00465 #endif