/* * main.c * * contains MD_create_engine and MD_destroy_engine routines */ /* * Some sort of bug in AIX's compiler (as exhibited by beirut at TBG) * main.c and data.c both need similarly arranged system include files * (and mdengine.h has to be commented out, but data.h includes it) * -- otherwise, the "Data" structure ends up being different sizes * to main.c and data.c! */ #ifdef AIX #include #endif #include #include /* #include "mdengine.h" */ #include "data.h" #include "integ.h" /* * MD_create_engine (called through MD_create) * * Allocate engine data structures (allocate Data), set interface map, * set "init" and "run" functions, return pointer to engine data. */ extern MD_Errcode #ifdef MD_PLUGIN MD_create_engine #else deven_create_engine #endif (MD_Sim *sim) { Data *data; MD_Int idnum; MD_Int accessflags = MD_DATA_RESIZE | MD_DATA_WRITE | MD_DATA_READ | MD_DATA_INIT; /* allocate and initialize simulation data */ if ((data = (Data *) calloc(1, sizeof(Data))) == NULL) { MD_ERR(sim, MD_engine_name(sim), MD_ERR_MEMALLOC, "MD_create_engine call to calloc"); return MD_FAIL; } data->sim = sim; if (deven_data_init(data)) return MD_FAIL; /* set version number and engine data */ if (MD_set_version(sim, MD_API_VERSION) || MD_set_engine(sim, data)) { return MD_FAIL; } /* * map entries for reductions */ if ((idnum = MD_new_data(sim, &(data->p_reduc), &(data->nreducs), MD_DOUBLE, NREDUCS, accessflags | MD_DATA_CBREAD, NULL, NULL, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Reduction", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_reduclabel), &(data->nreducs), MD_STRING, NREDUCS, accessflags | MD_DATA_CBREAD, NULL, NULL, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Reduction Label", idnum)) return MD_FAIL; if (MD_new_name(sim, "ReductionLabel", idnum)) return MD_FAIL; /* * map entries for trajectory information */ if ((idnum = MD_new_data(sim, &(data->f), &(data->natoms), MD_DVEC, INT_MAX, accessflags | MD_DATA_CBREAD, MD_def_setlen, NULL, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Force", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->pos), &(data->natoms), MD_DVEC, INT_MAX, accessflags | MD_DATA_CBREAD | MD_DATA_FCBREAD, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Position", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->vel), &(data->natoms), MD_DVEC, INT_MAX, accessflags | MD_DATA_CBREAD, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Velocity", idnum)) return MD_FAIL; /* * map entries for molecular topology information */ if ((idnum = MD_new_data(sim, &(data->atom), &(data->natoms), MD_ATOM, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Atom", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->bond), &(data->nbonds), MD_BOND, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Bond", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->angle), &(data->nangles), MD_ANGLE, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Angle", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->dihed), &(data->ndiheds), MD_DIHED, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Dihedral", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->impr), &(data->nimprs), MD_IMPR, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Improper", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->excl), &(data->nexcls), MD_EXCL, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Exclusion", idnum)) return MD_FAIL; /* * map entries for force field parameters */ if ((idnum = MD_new_data(sim, &(data->atomprm), &(data->natomprms), MD_ATOM_PARAM, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Atom Param", idnum)) return MD_FAIL; if (MD_new_name(sim, "AtomParam", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->bondprm), &(data->nbondprms), MD_BOND_PARAM, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Bond Param", idnum)) return MD_FAIL; if (MD_new_name(sim, "BondParam", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->angleprm), &(data->nangleprms), MD_ANGLE_PARAM, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Angle Param", idnum)) return MD_FAIL; if (MD_new_name(sim, "AngleParam", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->dihedprm), &(data->ndihedprms), MD_DIHED_PARAM, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Dihedral Param", idnum)) return MD_FAIL; if (MD_new_name(sim, "DihedralParam", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->imprprm), &(data->nimprprms), MD_IMPR_PARAM, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Improper Param", idnum)) return MD_FAIL; if (MD_new_name(sim, "ImproperParam", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->nbfixprm), &(data->nnbfixprms), MD_NBFIX_PARAM, INT_MAX, accessflags, MD_def_setlen, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Nbfix Param", idnum)) return MD_FAIL; if (MD_new_name(sim, "NbfixParam", idnum)) return MD_FAIL; /* * map entries for simulation parameters */ /* basic simparams */ if ((idnum = MD_new_data(sim, &(data->p_timestep), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Timestep", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_dielectric), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Dielectric", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_scaling14), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "1-4Scaling", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_switchdist), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "SwitchDist", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_cutoff), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Cutoff", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_exclude), &(data->simparam_len), MD_STRING, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Exclude", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_is_switching), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Switching", idnum)) return MD_FAIL; /* this isn't really a simparam -- it can only be read for reference */ if ((idnum = MD_new_data(sim, &(data->p_stepnum), &(data->simparam_len), MD_INT, 1, accessflags, NULL, NULL, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "StepNum", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_firststepnum), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "FirstStepNum", idnum)) return MD_FAIL; /* alias for "firststepnum" for NAMD compatibility */ if (MD_new_name(sim, "FirstTimestep", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_elec_eval), &(data->simparam_len), MD_STRING, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; /* full name */ if (MD_new_name(sim, "ElectrostaticEvaluation", idnum)) return MD_FAIL; /* nickname */ if (MD_new_name(sim, "ElecEval", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_is_shadow), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "Shadow", idnum)) return MD_FAIL; /* simparams for multigrid */ if ((idnum = MD_new_data(sim, &(data->p_mg_levels), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "MGlevels", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_mg_divisions), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "MGdivisions", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_mg_gridsize), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "MGgridsize", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_mg_cutoff), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "MGcutoff", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_mg_length), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "MGlength", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_mg_switchtype_string), &(data->simparam_len), MD_STRING, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "MGswitchtype", idnum)) return MD_FAIL; /* simparams for DPMTA */ if ((idnum = MD_new_data(sim, &(data->p_dpmta_levels), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "DPMTAlevels", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_dpmta_mpterms), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "DPMTAmpterms", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_dpmta_is_fft), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "DPMTAuseFFT", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_dpmta_blocking_fft), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "DPMTAblockingFFT", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_dpmta_theta), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "DPMTAtheta", idnum)) return MD_FAIL; /* simparams for spherical boundary conditions */ if ((idnum = MD_new_data(sim, &(data->p_is_sphericalbc), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "SphericalBC", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_sphericalbc_center), &(data->simparam_len), MD_DVEC, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "SphericalBCcenter", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_sphericalbc_r1), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "SphericalBCr1", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_sphericalbc_k1), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "SphericalBCk1", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_sphericalbc_exp1), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "SphericalBCexp1", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_sphericalbc_r2), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "SphericalBCr2", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_sphericalbc_k2), &(data->simparam_len), MD_DOUBLE, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "SphericalBCk2", idnum)) return MD_FAIL; if ((idnum = MD_new_data(sim, &(data->p_sphericalbc_exp2), &(data->simparam_len), MD_INT, 1, accessflags, NULL, MD_def_setdata, MD_def_getdata)) < 0) return MD_FAIL; if (MD_new_name(sim, "SphericalBCexp2", idnum)) return MD_FAIL; /* * set engine defined errors */ if ((data->err_simparam = MD_new_err(sim, "illegal simulation parameter value", 0)) < 0) { return MD_FAIL; } if ((data->err_unstable = MD_new_err(sim, "system has become unstable", 0)) < 0) { return MD_FAIL; } if ((data->err_mgrid = MD_new_err(sim, "error returned from mgrid", 1)) < 0) { return MD_FAIL; } if ((data->err_dpmta = MD_new_err(sim, "error returned from DPMTA", 1)) < 0) { return MD_FAIL; } /* set MD_run to call our integrator */ if (MD_set_run(sim, deven_run)) return MD_FAIL; /* set MD_init to call our initialization routine */ if (MD_set_init(sim, deven_init)) return MD_FAIL; /* everything created OK */ return 0; } /* * MD_destroy_engine (called through MD_destroy) * * Deallocate all engine data structures. */ extern void #ifdef MD_PLUGIN MD_destroy_engine #else deven_destroy_engine #endif (MD_Sim *sim) { Data *data = MD_engine(sim); if (data != NULL) { deven_data_destroy(data); free(data); } }