.keyMatchType("/", gmx::StringCompareType::CaseAndDashInsensitive);
module.initMdpTransform(transform.rules());
auto result = transform.transform(mdpValues.build(), nullptr);
- module.assignOptionsToModulesFromMdp(result.object(), nullptr);
+ module.assignOptionsToModules(result.object(), nullptr);
t_mdatoms md;
PaddedRVecVector f = { { 0, 0, 0 } };
real ewaldcoeff_q,
real ewaldcoeff_lj)
{
- t_inputrec irc;
int homenr;
int ret;
- irc = *ir;
- irc.nkx = grid_size[XX];
- irc.nky = grid_size[YY];
- irc.nkz = grid_size[ZZ];
+ // Create a copy of t_inputrec fields that are used in gmx_pme_init().
+ // TODO: This would be better as just copying a sub-structure that contains
+ // all the PME parameters and nothing else.
+ t_inputrec irc;
+ irc.ePBC = ir->ePBC;
+ irc.coulombtype = ir->coulombtype;
+ irc.vdwtype = ir->vdwtype;
+ irc.efep = ir->efep;
+ irc.pme_order = ir->pme_order;
+ irc.epsilon_r = ir->epsilon_r;
+ irc.ljpme_combination_rule = ir->ljpme_combination_rule;
+ irc.nkx = grid_size[XX];
+ irc.nky = grid_size[YY];
+ irc.nkz = grid_size[ZZ];
if (pme_src->nnodes == 1)
{
#include "gromacs/ewald/pme-internal.h"
#include "gromacs/math/vectypes.h"
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/utility/stringutil.h"
/*! \brief Test fixture for testing PME B-spline moduli creation */
class PmeBSplineModuliTest : public ::testing::TestWithParam<BSplineModuliInputParameters>
{
- private:
- //! Environment for getting the t_inputrec structure easily
- MDModules mdModules_;
-
public:
//! Default constructor
PmeBSplineModuliTest() = default;
gridSize[XX], gridSize[YY], gridSize[ZZ]));
/* Storing the input where it's needed */
- t_inputrec *inputRec = mdModules_.inputrec();
- inputRec->nkx = gridSize[XX];
- inputRec->nky = gridSize[YY];
- inputRec->nkz = gridSize[ZZ];
- inputRec->coulombtype = (moduliType == ModuliType::P3M) ? eelP3M_AD : eelPME;
- inputRec->pme_order = pmeOrder;
+ t_inputrec inputRec;
+ inputRec.nkx = gridSize[XX];
+ inputRec.nky = gridSize[YY];
+ inputRec.nkz = gridSize[ZZ];
+ inputRec.coulombtype = (moduliType == ModuliType::P3M) ? eelP3M_AD : eelPME;
+ inputRec.pme_order = pmeOrder;
/* PME initialization call which checks the inputs and computes the B-spline moduli according to the grid sizes. */
- PmeSafePointer pme = pmeInitEmpty(inputRec);
+ PmeSafePointer pme = pmeInitEmpty(&inputRec);
/* Setting up the checker */
TestReferenceData refData;
#include <gmock/gmock.h>
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/utility/stringutil.h"
class PmeGatherTest : public ::testing::TestWithParam<GatherInputParameters>
{
private:
- //! Environment for getting the t_inputrec structure easily
- MDModules mdModules_;
-
//! Storage of all the input atom datasets
static InputDataByAtomCount s_inputAtomDataSets_;
auto inputAtomSplineData = inputAtomData.splineDataByPmeOrder[pmeOrder];
/* Storing the input where it's needed, running the test */
- t_inputrec *inputRec = mdModules_.inputrec();
- inputRec->nkx = gridSize[XX];
- inputRec->nky = gridSize[YY];
- inputRec->nkz = gridSize[ZZ];
- inputRec->pme_order = pmeOrder;
- inputRec->coulombtype = eelPME;
+ t_inputrec inputRec;
+ inputRec.nkx = gridSize[XX];
+ inputRec.nky = gridSize[YY];
+ inputRec.nkz = gridSize[ZZ];
+ inputRec.pme_order = pmeOrder;
+ inputRec.coulombtype = eelPME;
TestReferenceData refData;
const std::map<CodePath, std::string> modesToTest = {{CodePath::CPU, "CPU"}};
(inputForceTreatment == PmeGatherInputHandling::ReduceWith) ? "with reduction" : "without reduction"
));
- PmeSafePointer pmeSafe = pmeInitWithAtoms(inputRec, inputAtomData.coordinates, inputAtomData.charges, box);
+ PmeSafePointer pmeSafe = pmeInitWithAtoms(&inputRec, inputAtomData.coordinates, inputAtomData.charges, box);
/* Setting some more inputs */
pmeSetRealGrid(pmeSafe.get(), mode.first, nonZeroGridValues);
#include <gmock/gmock.h>
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/utility/stringutil.h"
*/
class PmeSplineAndSpreadTest : public ::testing::TestWithParam<SplineAndSpreadInputParameters>
{
- private:
- //! Environment for getting the t_inputrec structure easily
- MDModules mdModules_;
-
public:
//! Default constructor
PmeSplineAndSpreadTest() = default;
const size_t atomCount = coordinates.size();
/* Storing the input where it's needed */
- t_inputrec *inputRec = mdModules_.inputrec();
- inputRec->nkx = gridSize[XX];
- inputRec->nky = gridSize[YY];
- inputRec->nkz = gridSize[ZZ];
- inputRec->pme_order = pmeOrder;
- inputRec->coulombtype = eelPME;
+ t_inputrec inputRec;
+ inputRec.nkx = gridSize[XX];
+ inputRec.nky = gridSize[YY];
+ inputRec.nkz = gridSize[ZZ];
+ inputRec.pme_order = pmeOrder;
+ inputRec.coulombtype = eelPME;
TestReferenceData refData;
/* Running the test */
- PmeSafePointer pmeSafe = pmeInitWithAtoms(inputRec, coordinates, charges, box);
+ PmeSafePointer pmeSafe = pmeInitWithAtoms(&inputRec, coordinates, charges, box);
const bool computeSplines = (option.first == PmeSplineAndSpreadOptions::SplineOnly) || (option.first == PmeSplineAndSpreadOptions::SplineAndSpreadUnified);
const bool spreadCharges = (option.first == PmeSplineAndSpreadOptions::SpreadOnly) || (option.first == PmeSplineAndSpreadOptions::SplineAndSpreadUnified);
#include "gromacs/mdlib/force.h"
#include "gromacs/mdlib/mdatoms.h"
#include "gromacs/mdlib/mdrun.h"
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/fcdata.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/mdtypes/md_enums.h"
init5(ntop);
}
- gmx::MDModules mdModules;
- t_inputrec *ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
read_tpxheader(ftp2fn(efTPR, NFILE, fnm), &header, FALSE);
snew(xtop, header.natoms);
#include "gromacs/math/units.h"
#include "gromacs/math/vec.h"
#include "gromacs/mdlib/mdebin.h"
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/mdtypes/md_enums.h"
#include "gromacs/topology/ifunc.h"
bVisco = opt2bSet("-vis", NFILE, fnm);
- gmx::MDModules mdModules;
- t_inputrec *ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
if ((!bDisRe) && (!bDHDL))
{
#include "gromacs/math/functions.h"
#include "gromacs/math/units.h"
#include "gromacs/math/vec.h"
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/pbcutil/pbc.h"
#include "gromacs/topology/ifunc.h"
hb = mk_hbdata(bHBmap, opt2bSet("-dan", NFILE, fnm), bMerge || bContact);
/* get topology */
- gmx::MDModules mdModules;
- t_inputrec *ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
read_tpx_top(ftp2fn(efTPR, NFILE, fnm), ir, box, &natoms, nullptr, nullptr, &top);
snew(grpnames, grNR);
#include "gromacs/math/units.h"
#include "gromacs/math/vec.h"
#include "gromacs/mdlib/broadcaststructs.h"
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/commrec.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/mdtypes/md_enums.h"
create_info(&info);
info.fourier_sp[0] = fs;
- gmx::MDModules mdModules;
-
if (MASTER(cr))
{
- ir = mdModules.inputrec();
+ ir = new t_inputrec();
read_tpr_file(opt2fn("-s", NFILE, fnm), &info, &state, &mtop, ir, user_beta, fracself);
/* Open logfile for reading */
fp = fopen(opt2fn("-o", NFILE, fnm), "w");
#include "gromacs/math/functions.h"
#include "gromacs/math/units.h"
#include "gromacs/math/vec.h"
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/pbcutil/pbc.h"
#include "gromacs/pbcutil/rmpbc.h"
int gmx_spol(int argc, char *argv[])
{
t_topology *top;
- t_inputrec *ir;
t_atom *atom;
t_trxstatus *status;
int nrefat, natoms, nf, ntot;
snew(top, 1);
// TODO: Only ePBC is used, not the full inputrec.
- gmx::MDModules mdModules;
- ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
read_tpx_top(ftp2fn(efTPR, NFILE, fnm),
ir, box, &natoms, nullptr, nullptr, top);
#include "gromacs/math/utilities.h"
#include "gromacs/math/vec.h"
#include "gromacs/mdlib/perf_est.h"
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/commrec.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/mdtypes/md_enums.h"
const char *fn_best_tpr, /* tpr file with the best performance */
const char *fn_sim_tpr) /* name of tpr file to be launched */
{
- t_inputrec *ir;
t_state state;
gmx_mtop_t mtop;
char buf[200];
- gmx::MDModules mdModules;
- ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
read_tpx_state(fn_best_tpr, ir, &state, &mtop);
/* Reset nsteps and init_step to the value of the input .tpr file */
FILE *fp) /* Write the output here */
{
int i, j, d;
- t_inputrec *ir;
t_state state;
gmx_mtop_t mtop;
real nlist_buffer; /* Thickness of the buffer regions for PME-switch potentials */
}
fprintf(stdout, ".\n");
- gmx::MDModules mdModules;
- ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
read_tpx_state(fn_sim_tpr, ir, &state, &mtop);
/* Check if some kind of PME was chosen */
gmx_bool bFree; /* Is a free energy simulation requested? */
gmx_bool bNM; /* Is a normal mode analysis requested? */
gmx_bool bSwap; /* Is water/ion position swapping requested? */
- t_inputrec *ir;
t_state state;
gmx_mtop_t mtop;
/* Check tpr file for options that trigger extra output files */
- gmx::MDModules mdModules;
- ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
read_tpx_state(opt2fn("-s", nfile, fnm), ir, &state, &mtop);
bFree = (efepNO != ir->efep );
bNM = (eiNM == ir->eI );
#include "gromacs/math/functions.h"
#include "gromacs/math/units.h"
#include "gromacs/math/vec.h"
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/mdtypes/md_enums.h"
#include "gromacs/mdtypes/pull-params.h"
//! Read pull groups from a tpr file (including position, force const, geometry, number of groups)
void read_tpr_header(const char *fn, t_UmbrellaHeader* header, t_UmbrellaOptions *opt, t_coordselection *coordsel)
{
- gmx::MDModules mdModules;
- t_inputrec *ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
t_state state;
static int first = 1;
/* PARAMETER file processing */
mdparin = opt2fn("-f", NFILE, fnm);
set_warning_line(wi, mdparin, -1);
- get_ir(mdparin, opt2fn("-po", NFILE, fnm), &mdModules, opts, wi);
- t_inputrec *ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
+ get_ir(mdparin, opt2fn("-po", NFILE, fnm), &mdModules, ir, opts, wi);
if (bVerbose)
{
} // namespace
void get_ir(const char *mdparin, const char *mdparout,
- gmx::MDModules *mdModules, t_gromppopts *opts,
+ gmx::MDModules *mdModules, t_inputrec *ir, t_gromppopts *opts,
warninp_t wi)
{
char *dumstr[2];
const char *tmp;
int i, j, m, ninp;
char warn_buf[STRLEN];
- t_inputrec *ir = mdModules->inputrec();
t_lambda *fep = ir->fepvals;
t_expanded *expand = ir->expandedvals;
}
MdpErrorHandler errorHandler(wi);
auto result
- = transform.transform(convertedValues, &errorHandler);
+ = transform.transform(convertedValues, &errorHandler);
+ ir->params = new gmx::KeyValueTreeObject(result.object());
+ mdModules->adjustInputrecBasedOnModules(ir);
errorHandler.setBackMapping(result.backMapping());
- mdModules->assignOptionsToModulesFromMdp(result.object(), &errorHandler);
+ mdModules->assignOptionsToModules(*ir->params, &errorHandler);
}
/* Ion/water position swapping ("computational electrophysiology") */
/* Even more checks, charge group radii vs. cut-off's only. */
void get_ir(const char *mdparin, const char *mdparout,
- gmx::MDModules *mdModules, t_gromppopts *opts,
+ gmx::MDModules *mdModules, t_inputrec *ir, t_gromppopts *opts,
warninp_t wi);
/* Read the input file, and retrieve data for inputrec.
* More data are read, but the are only evaluated when the next
{
public:
- Impl() : field_(nullptr), ir_(nullptr)
+ Impl()
+ : field_(createElectricFieldModule())
{
- snew(ir_, 1);
- snew(ir_->fepvals, 1);
- snew(ir_->expandedvals, 1);
- snew(ir_->simtempvals, 1);
// TODO Eventually implement a proper IMDModule, to which
// create*Module() would return a pointer. It might have
// methods in its interface that return IInputRecExtension
// (renamed IMdpOptionsProvider) and IForceProvider.
- field_ = createElectricFieldModule();
- }
- ~Impl()
- {
- if (ir_ != nullptr)
- {
- done_inputrec(ir_);
- sfree(ir_);
- }
}
void makeModuleOptions(Options *options)
}
IInputRecExtensionPtr field_;
- t_inputrec *ir_;
};
MDModules::MDModules() : impl_(new Impl)
{
}
-t_inputrec *MDModules::inputrec()
-{
- return impl_->ir_;
-}
-
-const t_inputrec *MDModules::inputrec() const
-{
- return impl_->ir_;
-}
-
void MDModules::initMdpTransform(IKeyValueTreeTransformRules *rules)
{
// TODO The transform rules for applied-forces modules should
impl_->field_->initMdpTransform(rules);
}
-void MDModules::assignOptionsToModulesFromMdp(const KeyValueTreeObject &mdpOptionValues,
- IKeyValueTreeErrorHandler *errorHandler)
+void MDModules::assignOptionsToModules(const KeyValueTreeObject ¶ms,
+ IKeyValueTreeErrorHandler *errorHandler)
{
Options moduleOptions;
impl_->makeModuleOptions(&moduleOptions);
-
- KeyValueTreeObject keyValueParameters(mdpOptionValues);
- impl_->ir_->params = new KeyValueTreeObject(adjustKeyValueTreeFromOptions(keyValueParameters, moduleOptions));
// The actual output is in the data fields of the modules that
// were set up in the module options.
- assignOptionsFromKeyValueTree(&moduleOptions, *impl_->ir_->params, errorHandler);
+ assignOptionsFromKeyValueTree(&moduleOptions, params, errorHandler);
}
-void MDModules::assignOptionsToModulesFromTpr()
+void MDModules::adjustInputrecBasedOnModules(t_inputrec *ir)
{
Options moduleOptions;
impl_->makeModuleOptions(&moduleOptions);
- // Note that impl_->ir_->params was set up during tpr reading, so
- // all we need to do here is integrate that with the module
- // options, which e.g. might have changed between versions.
- // The actual output is in the data fields of the modules that
- // were set up in the module options.
- //
- // TODO error handling
- assignOptionsFromKeyValueTree(&moduleOptions, *impl_->ir_->params, nullptr);
-}
-
-void MDModules::adjustInputrecBasedOnModules()
-{
- gmx::Options options;
- impl_->field_->initMdpOptions(&options);
- std::unique_ptr<KeyValueTreeObject> params(impl_->ir_->params);
- // Avoid double freeing if the next operation throws.
- impl_->ir_->params = nullptr;
- impl_->ir_->params = new KeyValueTreeObject(
- gmx::adjustKeyValueTreeFromOptions(*params, options));
+ std::unique_ptr<KeyValueTreeObject> params(
+ new KeyValueTreeObject(
+ gmx::adjustKeyValueTreeFromOptions(*ir->params, moduleOptions)));
+ delete ir->params;
+ ir->params = params.release();
}
void MDModules::initOutput(FILE *fplog, int nfile, const t_filenm fnm[],
* loops over a container of these interfaces, and/or groups of them (e.g.
* applied forces), instead of the current single pointer.
*
- * The assignOptionsToModules() and
- * assignOptionsToModulesFromInputrec() methods of this class also
- * take responsibility for wiring up the options (and their defaults)
- * for each module, respectively for mdp- and tpr-style input of those
- * options.
+ * The assignOptionsToModules() and adjustInputrecBasedOnModules() methods of
+ * this class also take responsibility for wiring up the options (and their
+ * defaults) for each module.
*
* \inlibraryapi
* \ingroup module_mdrunutility
MDModules();
~MDModules();
- /*! \brief
- * Returns an initialized t_inputrec structure.
- *
- * The inputrec structure is owned by MDModules and will be destroyed
- * with it.
- */
- t_inputrec *inputrec();
- //! \copydoc t_inputrec *inputrec()
- const t_inputrec *inputrec() const;
-
/*! \brief Initializes a transform from mdp values to
* sectioned options.
*
*/
void initMdpTransform(IKeyValueTreeTransformRules *rules);
- /*! \brief Use \c mdpOptionValues to set the options (e.g.read
- * from mdp input) for each module.
+ /*! \brief
+ * Sets input parameters from `params` for each module.
*
- * \param[in] mdpOptionValues Contains keys and values from user
+ * \param[in] params Contains keys and values from user
* input (and defaults) to configure modules that have
* registered options with those keys.
* \param[out] errorHandler Called to report errors. */
- void assignOptionsToModulesFromMdp(const KeyValueTreeObject &mdpOptionValues,
- IKeyValueTreeErrorHandler *errorHandler);
-
- /*! \brief
- * Initializes modules based on inputrec values read from tpr file.
- *
- * This needs to be called after read_tpx_state() if the modules need
- * to be accessed.
- */
- void assignOptionsToModulesFromTpr();
+ void assignOptionsToModules(const KeyValueTreeObject ¶ms,
+ IKeyValueTreeErrorHandler *errorHandler);
/*! \brief
* Normalizes inputrec parameters to match current code version.
* This orders the parameters in inputrec to match the current code and
* adds any missing defaults.
*/
- void adjustInputrecBasedOnModules();
+ void adjustInputrecBasedOnModules(t_inputrec *ir);
//! Initializes output files.
void initOutput(FILE *fplog, int nfile, const t_filenm fnm[],
#include "inputrec.h"
#include <cstdio>
+#include <cstdlib>
#include <cstring>
#include <algorithm>
const int nstmin_berendsen_pcouple = 10;
const int nstmin_harmonic = 20;
+t_inputrec::t_inputrec()
+{
+ std::memset(this, 0, sizeof(*this));
+ snew(fepvals, 1);
+ snew(expandedvals, 1);
+ snew(simtempvals, 1);
+}
+
+t_inputrec::~t_inputrec()
+{
+ done_inputrec(this);
+}
+
static int nst_wanted(const t_inputrec *ir)
{
if (ir->nstlist > 0)
struct t_inputrec
{
+ t_inputrec();
+ explicit t_inputrec(const t_inputrec &) = delete;
+ t_inputrec &operator=(const t_inputrec &) = delete;
+ ~t_inputrec();
+
int eI; /* Integration method */
gmx_int64_t nsteps; /* number of steps to be taken */
int simulation_part; /* Used in checkpointing to separate chunks */
gmx_bool bRMSD, real ftol, real abstol)
{
const char *ff[2];
- gmx::MDModules mdModules[2];
- t_inputrec *ir[2] = { mdModules[0].inputrec(), mdModules[1].inputrec() };
+ t_inputrec *ir[2];
t_state state[2];
gmx_mtop_t mtop[2];
t_topology top[2];
ff[1] = fn2;
for (i = 0; i < (fn2 ? 2 : 1); i++)
{
+ ir[i] = new t_inputrec();
read_tpx_state(ff[i], ir[i], &state[i], &(mtop[i]));
- mdModules[i].adjustInputrecBasedOnModules();
+ gmx::MDModules().adjustInputrecBasedOnModules(ir[i]);
}
if (fn2)
{
static void tpx2methods(const char *tpx, const char *tex)
{
FILE *fp;
- t_inputrec *ir;
t_state state;
gmx_mtop_t mtop;
- gmx::MDModules mdModules;
- ir = mdModules.inputrec();
- read_tpx_state(tpx, ir, &state, &mtop);
+ t_inputrec ir;
+ read_tpx_state(tpx, &ir, &state, &mtop);
fp = gmx_fio_fopen(tex, "w");
fprintf(fp, "\\section{Methods}\n");
tpx2system(fp, &mtop);
- tpx2params(fp, ir);
+ tpx2params(fp, &ir);
gmx_fio_fclose(fp);
}
gmx_mtop_t mtop;
gmx_localtop_t *top = nullptr;
t_state state;
- t_inputrec *ir;
+ t_inputrec ir;
- gmx::MDModules mdModules;
- ir = mdModules.inputrec();
if (tpr)
{
- read_tpx_state(tpr, ir, &state, &mtop);
- top = gmx_mtop_generate_local_top(&mtop, ir->efep != efepNO);
+ read_tpx_state(tpr, &ir, &state, &mtop);
+ top = gmx_mtop_generate_local_top(&mtop, ir.efep != efepNO);
}
new_natoms = -1;
natoms = -1;
natoms = new_natoms;
if (tpr)
{
- chk_bonds(&top->idef, ir->ePBC, fr.x, fr.box, tol);
+ chk_bonds(&top->idef, ir.ePBC, fr.x, fr.box, tol);
}
if (fr.bX)
{
#include "gromacs/fileio/tpxio.h"
#include "gromacs/fileio/trrio.h"
#include "gromacs/math/vec.h"
-#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/mdtypes/md_enums.h"
#include "gromacs/mdtypes/state.h"
gmx_bool bNsteps, bExtend, bUntil;
gmx_mtop_t mtop;
t_atoms atoms;
- t_inputrec *ir;
t_state state;
int gnx;
char *grpname;
top_fn = ftp2fn(efTPR, NFILE, fnm);
fprintf(stderr, "Reading toplogy and stuff from %s\n", top_fn);
- gmx::MDModules mdModules;
- ir = mdModules.inputrec();
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
read_tpx_state(top_fn, ir, &state, &mtop);
run_step = ir->init_step;
run_t = ir->init_step*ir->delta_t + ir->init_t;
FILE *gp;
int indent, i, j, **gcount, atot;
t_state state;
- t_inputrec *ir = nullptr;
t_tpxheader tpx;
gmx_mtop_t mtop;
gmx_groups_t *groups;
t_topology top;
read_tpxheader(fn, &tpx, TRUE);
- gmx::MDModules mdModules;
- if (tpx.bIr)
- {
- ir = mdModules.inputrec();
- }
+ t_inputrec ir;
read_tpx_state(fn,
- ir,
+ tpx.bIr ? &ir : nullptr,
&state,
tpx.bTop ? &mtop : nullptr);
if (tpx.bIr && !bOriginalInputrec)
{
- mdModules.adjustInputrecBasedOnModules();
+ gmx::MDModules mdModules;
+ mdModules.adjustInputrecBasedOnModules(&ir);
}
if (mdpfn && tpx.bIr)
{
gp = gmx_fio_fopen(mdpfn, "w");
- pr_inputrec(gp, 0, nullptr, ir, TRUE);
+ pr_inputrec(gp, 0, nullptr, &ir, TRUE);
gmx_fio_fclose(gp);
}
{
indent = 0;
pr_title(stdout, indent, fn);
- pr_inputrec(stdout, 0, "inputrec", ir, FALSE);
+ pr_inputrec(stdout, 0, "inputrec", tpx.bIr ? &ir : nullptr, FALSE);
pr_tpxheader(stdout, indent, "header", &(tpx));
int imdport, unsigned long Flags)
{
gmx_bool bForceUseGPU, bTryUseGPU, bRerunMD;
- t_inputrec *inputrec;
matrix box;
gmx_ddbox_t ddbox = {0};
int npme_major, npme_minor;
/* CAUTION: threads may be started later on in this function, so
cr doesn't reflect the final parallel state right now */
gmx::MDModules mdModules;
- inputrec = mdModules.inputrec();
+ t_inputrec inputrecInstance;
+ t_inputrec *inputrec = &inputrecInstance;
snew(mtop, 1);
if (Flags & MD_APPENDFILES)
*/
gmx_bcast_sim(sizeof(bUseGPU), &bUseGPU, cr);
}
- mdModules.assignOptionsToModulesFromTpr();
+ // TODO: Error handling
+ mdModules.assignOptionsToModules(*inputrec->params, nullptr);
if (fplog != nullptr)
{