From c18c5072ef8d5a50da253d37b6ad33dc550e9514 Mon Sep 17 00:00:00 2001 From: Joe Jordan Date: Mon, 26 Apr 2021 15:33:40 +0000 Subject: [PATCH] Remove inputrec from initialize_lambdas signature --- src/gromacs/mdrun/md.cpp | 11 +++++-- src/gromacs/mdrun/mimic.cpp | 5 +++- src/gromacs/mdrun/minimize.cpp | 11 +++++-- src/gromacs/mdrun/rerun.cpp | 11 +++++-- src/gromacs/mdtypes/state.cpp | 30 ++++++++++--------- src/gromacs/mdtypes/state.h | 17 +++++++---- .../freeenergyperturbationdata.cpp | 5 +++- 7 files changed, 62 insertions(+), 28 deletions(-) diff --git a/src/gromacs/mdrun/md.cpp b/src/gromacs/mdrun/md.cpp index df33e9e782..425eda0de8 100644 --- a/src/gromacs/mdrun/md.cpp +++ b/src/gromacs/mdrun/md.cpp @@ -257,8 +257,15 @@ void gmx::LegacySimulator::do_md() int* fep_state = MASTER(cr) ? &state_global->fep_state : nullptr; gmx::ArrayRef lambda = MASTER(cr) ? state_global->lambda : gmx::ArrayRef(); - initialize_lambdas( - fplog, *ir, gmx::arrayRefFromArray(ir->opts.ref_t, ir->opts.ngtc), MASTER(cr), fep_state, lambda); + initialize_lambdas(fplog, + ir->efep, + ir->bSimTemp, + *ir->fepvals, + ir->simtempvals->temperatures, + gmx::arrayRefFromArray(ir->opts.ref_t, ir->opts.ngtc), + MASTER(cr), + fep_state, + lambda); Update upd(*ir, deform); bool doSimulatedAnnealing = false; { diff --git a/src/gromacs/mdrun/mimic.cpp b/src/gromacs/mdrun/mimic.cpp index 25feef03cd..1ff4427896 100644 --- a/src/gromacs/mdrun/mimic.cpp +++ b/src/gromacs/mdrun/mimic.cpp @@ -229,7 +229,10 @@ void gmx::LegacySimulator::do_mimic() } initialize_lambdas(fplog, - *ir, + ir->efep, + ir->bSimTemp, + *ir->fepvals, + ir->simtempvals->temperatures, gmx::arrayRefFromArray(ir->opts.ref_t, ir->opts.ngtc), MASTER(cr), &state_global->fep_state, diff --git a/src/gromacs/mdrun/minimize.cpp b/src/gromacs/mdrun/minimize.cpp index b115acdbec..79eaaf0a57 100644 --- a/src/gromacs/mdrun/minimize.cpp +++ b/src/gromacs/mdrun/minimize.cpp @@ -394,8 +394,15 @@ static void init_em(FILE* fplog, } int* fep_state = MASTER(cr) ? &state_global->fep_state : nullptr; gmx::ArrayRef lambda = MASTER(cr) ? state_global->lambda : gmx::ArrayRef(); - initialize_lambdas( - fplog, *ir, gmx::arrayRefFromArray(ir->opts.ref_t, ir->opts.ngtc), MASTER(cr), fep_state, lambda); + initialize_lambdas(fplog, + ir->efep, + ir->bSimTemp, + *ir->fepvals, + ir->simtempvals->temperatures, + gmx::arrayRefFromArray(ir->opts.ref_t, ir->opts.ngtc), + MASTER(cr), + fep_state, + lambda); if (ir->eI == IntegrationAlgorithm::NM) { diff --git a/src/gromacs/mdrun/rerun.cpp b/src/gromacs/mdrun/rerun.cpp index 157d18e55b..74697796f8 100644 --- a/src/gromacs/mdrun/rerun.cpp +++ b/src/gromacs/mdrun/rerun.cpp @@ -275,8 +275,15 @@ void gmx::LegacySimulator::do_rerun() } int* fep_state = MASTER(cr) ? &state_global->fep_state : nullptr; gmx::ArrayRef lambda = MASTER(cr) ? state_global->lambda : gmx::ArrayRef(); - initialize_lambdas( - fplog, *ir, gmx::arrayRefFromArray(ir->opts.ref_t, ir->opts.ngtc), MASTER(cr), fep_state, lambda); + initialize_lambdas(fplog, + ir->efep, + ir->bSimTemp, + *ir->fepvals, + ir->simtempvals->temperatures, + gmx::arrayRefFromArray(ir->opts.ref_t, ir->opts.ngtc), + MASTER(cr), + fep_state, + lambda); const bool simulationsShareState = false; gmx_mdoutf* outf = init_mdoutf(fplog, nfile, diff --git a/src/gromacs/mdtypes/state.cpp b/src/gromacs/mdtypes/state.cpp index 9cca0564a9..fe20752627 100644 --- a/src/gromacs/mdtypes/state.cpp +++ b/src/gromacs/mdtypes/state.cpp @@ -344,26 +344,28 @@ void printLambdaStateToLog(FILE* fplog, gmx::ArrayRef lambda, const } } -void initialize_lambdas(FILE* fplog, - const t_inputrec& ir, - gmx::ArrayRef ref_t, - bool isMaster, - int* fep_state, - gmx::ArrayRef lambda) +void initialize_lambdas(FILE* fplog, + const FreeEnergyPerturbationType freeEnergyPerturbationType, + const bool haveSimulatedTempering, + const t_lambda& fep, + gmx::ArrayRef simulatedTemperingTemps, + gmx::ArrayRef ref_t, + bool isMaster, + int* fep_state, + gmx::ArrayRef lambda) { /* TODO: Clean up initialization of fep_state and lambda in t_state. This function works, but could probably use a logic rewrite to keep all the different types of efep straight. */ - if ((ir.efep == FreeEnergyPerturbationType::No) && (!ir.bSimTemp)) + if ((freeEnergyPerturbationType == FreeEnergyPerturbationType::No) && (!haveSimulatedTempering)) { return; } - const t_lambda* fep = ir.fepvals.get(); if (isMaster) { - *fep_state = fep->init_fep_state; /* this might overwrite the checkpoint + *fep_state = fep.init_fep_state; /* this might overwrite the checkpoint if checkpoint is set -- a kludge is in for now to prevent this.*/ } @@ -372,27 +374,27 @@ void initialize_lambdas(FILE* fplog, { double thisLambda; /* overwrite lambda state with init_lambda for now for backwards compatibility */ - if (fep->init_lambda >= 0) /* if it's -1, it was never initialized */ + if (fep.init_lambda >= 0) /* if it's -1, it was never initialized */ { - thisLambda = fep->init_lambda; + thisLambda = fep.init_lambda; } else { - thisLambda = fep->all_lambda[i][fep->init_fep_state]; + thisLambda = fep.all_lambda[i][fep.init_fep_state]; } if (isMaster) { lambda[i] = thisLambda; } } - if (ir.bSimTemp) + if (haveSimulatedTempering) { /* need to rescale control temperatures to match current state */ for (int i = 0; i < ref_t.ssize(); i++) { if (ref_t[i] > 0) { - ref_t[i] = ir.simtempvals->temperatures[fep->init_fep_state]; + ref_t[i] = simulatedTemperingTemps[fep.init_fep_state]; } } } diff --git a/src/gromacs/mdtypes/state.h b/src/gromacs/mdtypes/state.h index 0dacb69dba..4b0f8a3b9b 100644 --- a/src/gromacs/mdtypes/state.h +++ b/src/gromacs/mdtypes/state.h @@ -67,6 +67,8 @@ #include "gromacs/utility/real.h" struct t_inputrec; +struct t_lambda; +enum class FreeEnergyPerturbationType; namespace gmx { @@ -363,11 +365,14 @@ void printLambdaStateToLog(FILE* fplog, gmx::ArrayRef lambda, bool i * and lambda on master rank. * * Reports the initial lambda state to the log file. */ -void initialize_lambdas(FILE* fplog, - const t_inputrec& ir, - gmx::ArrayRef ref_t, - bool isMaster, - int* fep_state, - gmx::ArrayRef lambda); +void initialize_lambdas(FILE* fplog, + FreeEnergyPerturbationType freeEnergyPerturbationType, + bool haveSimulatedTempering, + const t_lambda& fep, + gmx::ArrayRef simulatedTemperingTemps, + gmx::ArrayRef ref_t, + bool isMaster, + int* fep_state, + gmx::ArrayRef lambda); #endif diff --git a/src/gromacs/modularsimulator/freeenergyperturbationdata.cpp b/src/gromacs/modularsimulator/freeenergyperturbationdata.cpp index 6671c20d85..de8fbdc008 100644 --- a/src/gromacs/modularsimulator/freeenergyperturbationdata.cpp +++ b/src/gromacs/modularsimulator/freeenergyperturbationdata.cpp @@ -73,7 +73,10 @@ FreeEnergyPerturbationData::FreeEnergyPerturbationData(FILE* fplog, const t_inpu // available on master. We have the lambda vector available everywhere, so we pass a `true` // for isMaster on all ranks. See #3647. initialize_lambdas(fplog_, - inputrec_, + inputrec_.efep, + inputrec_.bSimTemp, + *inputrec_.fepvals, + inputrec_.simtempvals->temperatures, gmx::arrayRefFromArray(inputrec_.opts.ref_t, inputrec_.opts.ngtc), true, ¤tFEPState_, -- 2.22.0