From b6b5243c18d82a36bea86067f919063977a12e91 Mon Sep 17 00:00:00 2001 From: Mark Abraham Date: Mon, 21 Jan 2019 06:11:15 +0100 Subject: [PATCH] Clean up initialize_lambdas With a little internal cleanup, the calling logic could be made much simpler, e.g. as lam0 was always provided. Also improved const correctness and used const inputrec as reference. Change-Id: I255842b4d0c3cd2c8c648d3ebedc35013992118e --- src/gromacs/mdlib/sim_util.cpp | 89 +++++++++++++++++------------------------- src/gromacs/mdlib/sim_util.h | 15 ++++++- src/gromacs/mdrun/minimize.cpp | 9 +---- 3 files changed, 51 insertions(+), 62 deletions(-) diff --git a/src/gromacs/mdlib/sim_util.cpp b/src/gromacs/mdlib/sim_util.cpp index c18287aad0..e27c704478 100644 --- a/src/gromacs/mdlib/sim_util.cpp +++ b/src/gromacs/mdlib/sim_util.cpp @@ -2871,49 +2871,59 @@ void finish_run(FILE *fplog, const gmx::MDLogger &mdlog, const t_commrec *cr, } } -extern void initialize_lambdas(FILE *fplog, t_inputrec *ir, int *fep_state, gmx::ArrayRef lambda, double *lam0) +void initialize_lambdas(FILE *fplog, + const t_inputrec &ir, + bool isMaster, + int *fep_state, + gmx::ArrayRef lambda, + double *lam0) { - /* this function works, but could probably use a logic rewrite to keep all the different - types of efep straight. */ + /* 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 == efepNO) && (!ir->bSimTemp)) + if ((ir.efep == efepNO) && (!ir.bSimTemp)) { return; } - t_lambda *fep = ir->fepvals; - *fep_state = fep->init_fep_state; /* this might overwrite the checkpoint - if checkpoint is set -- a kludge is in for now - to prevent this.*/ + const t_lambda *fep = ir.fepvals; + if (isMaster) + { + *fep_state = fep->init_fep_state; /* this might overwrite the checkpoint + if checkpoint is set -- a kludge is in for now + to prevent this.*/ + } for (int i = 0; i < efptNR; i++) { + 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 initializd */ + if (fep->init_lambda >= 0) /* if it's -1, it was never initialized */ { - lambda[i] = fep->init_lambda; - if (lam0) - { - lam0[i] = lambda[i]; - } + thisLambda = fep->init_lambda; } else { - lambda[i] = fep->all_lambda[i][*fep_state]; - if (lam0) - { - lam0[i] = lambda[i]; - } + thisLambda = fep->all_lambda[i][fep->init_fep_state]; + } + if (isMaster) + { + lambda[i] = thisLambda; + } + if (lam0 != nullptr) + { + lam0[i] = thisLambda; } } - if (ir->bSimTemp) + if (ir.bSimTemp) { /* need to rescale control temperatures to match current state */ - for (int i = 0; i < ir->opts.ngtc; i++) + for (int i = 0; i < ir.opts.ngtc; i++) { - if (ir->opts.ref_t[i] > 0) + if (ir.opts.ref_t[i] > 0) { - ir->opts.ref_t[i] = ir->simtempvals->temperatures[*fep_state]; + ir.opts.ref_t[i] = ir.simtempvals->temperatures[fep->init_fep_state]; } } } @@ -2930,7 +2940,6 @@ extern void initialize_lambdas(FILE *fplog, t_inputrec *ir, int *fep_state, gmx: } } - void init_md(FILE *fplog, const t_commrec *cr, gmx::IMDOutputProvider *outputProvider, t_inputrec *ir, const gmx_output_env_t *oenv, @@ -2961,21 +2970,7 @@ void init_md(FILE *fplog, } } - /* Initialize lambda variables */ - /* TODO: Clean up initialization of fep_state and lambda in t_state. - * We currently need to call initialize_lambdas on non-master ranks - * to initialize lam0. - */ - if (MASTER(cr)) - { - initialize_lambdas(fplog, ir, &globalState->fep_state, globalState->lambda, lam0); - } - else - { - int tmpFepState; - std::array tmpLambda; - initialize_lambdas(fplog, ir, &tmpFepState, tmpLambda, lam0); - } + initialize_lambdas(fplog, *ir, MASTER(cr), &globalState->fep_state, globalState->lambda, lam0); if (*bSimAnn) { @@ -3025,21 +3020,7 @@ void init_rerun(FILE *fplog, gmx_mdoutf_t *outf, t_mdebin **mdebin, gmx_wallcycle_t wcycle) { - /* Initialize lambda variables */ - /* TODO: Clean up initialization of fep_state and lambda in t_state. - * We currently need to call initialize_lambdas on non-master ranks - * to initialize lam0. - */ - if (MASTER(cr)) - { - initialize_lambdas(fplog, ir, &globalState->fep_state, globalState->lambda, lam0); - } - else - { - int tmpFepState; - std::array tmpLambda; - initialize_lambdas(fplog, ir, &tmpFepState, tmpLambda, lam0); - } + initialize_lambdas(fplog, *ir, MASTER(cr), &globalState->fep_state, globalState->lambda, lam0); init_nrnb(nrnb); diff --git a/src/gromacs/mdlib/sim_util.h b/src/gromacs/mdlib/sim_util.h index f908a3184d..5c0236b916 100644 --- a/src/gromacs/mdlib/sim_util.h +++ b/src/gromacs/mdlib/sim_util.h @@ -136,7 +136,20 @@ void calc_dispcorr(const t_inputrec *ir, const t_forcerec *fr, const matrix box, real lambda, tensor pres, tensor virial, real *prescorr, real *enercorr, real *dvdlcorr); -void initialize_lambdas(FILE *fplog, t_inputrec *ir, int *fep_state, gmx::ArrayRef lambda, double *lam0); +/*! \brief Fills fep_state, lambda, and lam0 if needed + * + * If FEP or simulated tempering is in use: + * + * fills non-null lam0 with the initial lambda values, and + * on master rank fills fep_state and lambda. + * + * Reports the initial lambda state to the log file. */ +void initialize_lambdas(FILE *fplog, + const t_inputrec &ir, + bool isMaster, + int *fep_state, + gmx::ArrayRef lambda, + double *lam0); void do_constrain_first(FILE *log, gmx::Constraints *constr, const t_inputrec *inputrec, const t_mdatoms *md, diff --git a/src/gromacs/mdrun/minimize.cpp b/src/gromacs/mdrun/minimize.cpp index 80a75fbb7c..a1c835a2eb 100644 --- a/src/gromacs/mdrun/minimize.cpp +++ b/src/gromacs/mdrun/minimize.cpp @@ -369,13 +369,8 @@ static void init_em(FILE *fplog, fprintf(fplog, "Initiating %s\n", title); } - if (MASTER(cr)) - { - state_global->ngtc = 0; - - /* Initialize lambda variables */ - initialize_lambdas(fplog, ir, &(state_global->fep_state), state_global->lambda, nullptr); - } + state_global->ngtc = 0; + initialize_lambdas(fplog, *ir, MASTER(cr), &(state_global->fep_state), state_global->lambda, nullptr); init_nrnb(nrnb); -- 2.11.4.GIT