/* initialize the collection*/ void mde_delta_h_coll_init(t_mde_delta_h_coll *dhc, const t_inputrec *ir) { int i; double lambda; int ndhmax=ir->nstenergy/ir->nstcalcenergy; dhc->temperature=ir->opts.ref_t[0]; /* only store system temperature */ dhc->start_time=0.; dhc->delta_time=ir->delta_t*ir->fepvals->nstdhdl; dhc->start_time_set=FALSE; /* for continuous change of lambda values */ dhc->start_lambda=ir->fepvals->init_lambda; dhc->delta_lambda=ir->fepvals->delta_lambda*ir->fepvals->nstdhdl; /* total number of raw data points in the sample */ dhc->ndh = 0; /* include one more for the specification of the state, by lambda or fep_state, store as double for now*/ if (ir->expandedvals->elamstats > elamstatsNO) { dhc->ndh +=1; } /* whether to print energies */ if (ir->fepvals->bPrintEnergy) { dhc->ndh += 1; } /* add the dhdl's */ for (i=0;i<efptNR;i++) { if (ir->fepvals->separate_dvdl[i]) { dhc->ndh+=1; } } /* add the lambdas */ dhc->ndh += ir->fepvals->n_lambda; if (ir->epc > epcNO) { dhc->ndh += 1; /* include pressure-volume work */ } snew(dhc->dh, dhc->ndh); for(i=0;i<dhc->ndh;i++) { mde_delta_h_init(dhc->dh+i, ir->fepvals->dh_hist_size, ir->fepvals->dh_hist_spacing, ndhmax); } }
/* initialize the collection*/ void mde_delta_h_coll_init(t_mde_delta_h_coll *dhc, const t_inputrec *ir) { int i, j, n; double lambda; double *lambda_vec; int ndhmax = ir->nstenergy/ir->nstcalcenergy; t_lambda *fep = ir->fepvals; dhc->temperature = ir->opts.ref_t[0]; /* only store system temperature */ dhc->start_time = 0.; dhc->delta_time = ir->delta_t*ir->fepvals->nstdhdl; dhc->start_time_set = FALSE; /* this is the compatibility lambda value. If it is >=0, it is valid, and there is either an old-style lambda or a slow growth simulation. */ dhc->start_lambda = ir->fepvals->init_lambda; /* for continuous change of lambda values */ dhc->delta_lambda = ir->fepvals->delta_lambda*ir->fepvals->nstdhdl; if (dhc->start_lambda < 0) { /* create the native lambda vectors */ dhc->lambda_index = fep->init_fep_state; dhc->n_lambda_vec = 0; for (i = 0; i < efptNR; i++) { if (fep->separate_dvdl[i]) { dhc->n_lambda_vec++; } } snew(dhc->native_lambda_vec, dhc->n_lambda_vec); snew(dhc->native_lambda_components, dhc->n_lambda_vec); j = 0; for (i = 0; i < efptNR; i++) { if (fep->separate_dvdl[i]) { dhc->native_lambda_components[j] = i; if (fep->init_fep_state >= 0 && fep->init_fep_state < fep->n_lambda) { dhc->native_lambda_vec[j] = fep->all_lambda[i][fep->init_fep_state]; } else { dhc->native_lambda_vec[j] = -1; } j++; } } } else { /* don't allocate the meta-data subblocks for lambda vectors */ dhc->native_lambda_vec = NULL; dhc->n_lambda_vec = 0; dhc->native_lambda_components = 0; dhc->lambda_index = -1; } /* allocate metadata subblocks */ snew(dhc->subblock_d, 5 + dhc->n_lambda_vec); snew(dhc->subblock_i, 1 + dhc->n_lambda_vec); /* now decide which data to write out */ dhc->nlambda = 0; dhc->ndhdl = 0; dhc->dh_expanded = NULL; dhc->dh_energy = NULL; dhc->dh_pv = NULL; /* total number of raw data point collections in the sample */ dhc->ndh = 0; { gmx_bool bExpanded = FALSE; gmx_bool bEnergy = FALSE; gmx_bool bPV = FALSE; int n_lambda_components = 0; /* first count the number of states */ /* add the dhdl's */ if (fep->dhdl_derivatives == edhdlderivativesYES) { for (i = 0; i < efptNR; i++) { if (ir->fepvals->separate_dvdl[i]) { dhc->ndh += 1; dhc->ndhdl += 1; } } } /* add the lambdas */ dhc->nlambda = ir->fepvals->lambda_stop_n - ir->fepvals->lambda_start_n; dhc->ndh += dhc->nlambda; /* another compatibility check */ if (dhc->start_lambda < 0) { /* include one more for the specification of the state, by lambda or fep_state*/ if (ir->expandedvals->elmcmove > elmcmoveNO) { dhc->ndh += 1; bExpanded = TRUE; } /* whether to print energies */ if (ir->fepvals->bPrintEnergy) { dhc->ndh += 1; bEnergy = TRUE; } if (ir->epc > epcNO) { dhc->ndh += 1; /* include pressure-volume work */ bPV = TRUE; } } /* allocate them */ snew(dhc->dh, dhc->ndh); /* now initialize them */ /* the order, for now, must match that of the dhdl.xvg file because of how g_energy -odh is implemented */ n = 0; if (bExpanded) { dhc->dh_expanded = dhc->dh+n; mde_delta_h_init(dhc->dh+n, ir->fepvals->dh_hist_size, ir->fepvals->dh_hist_spacing, ndhmax, dhbtEXPANDED, 0, 0, NULL); n++; } if (bEnergy) { dhc->dh_energy = dhc->dh+n; mde_delta_h_init(dhc->dh+n, ir->fepvals->dh_hist_size, ir->fepvals->dh_hist_spacing, ndhmax, dhbtEN, 0, 0, NULL); n++; } /* add the dhdl's */ n_lambda_components = 0; if (fep->dhdl_derivatives == edhdlderivativesYES) { dhc->dh_dhdl = dhc->dh + n; for (i = 0; i < efptNR; i++) { if (ir->fepvals->separate_dvdl[i]) { /* we give it init_lambda for compatibility */ mde_delta_h_init(dhc->dh+n, ir->fepvals->dh_hist_size, ir->fepvals->dh_hist_spacing, ndhmax, dhbtDHDL, n_lambda_components, 1, &(fep->init_lambda)); n++; n_lambda_components++; } } } else { for (i = 0; i < efptNR; i++) { if (ir->fepvals->separate_dvdl[i]) { n_lambda_components++; /* count the components */ } } } /* add the lambdas */ dhc->dh_du = dhc->dh + n; snew(lambda_vec, n_lambda_components); for (i = ir->fepvals->lambda_start_n; i < ir->fepvals->lambda_stop_n; i++) { int k = 0; for (j = 0; j < efptNR; j++) { if (ir->fepvals->separate_dvdl[j]) { lambda_vec[k++] = fep->all_lambda[j][i]; } } mde_delta_h_init(dhc->dh+n, ir->fepvals->dh_hist_size, ir->fepvals->dh_hist_spacing, ndhmax, dhbtDH, 0, n_lambda_components, lambda_vec); n++; } sfree(lambda_vec); if (bPV) { dhc->dh_pv = dhc->dh+n; mde_delta_h_init(dhc->dh+n, ir->fepvals->dh_hist_size, ir->fepvals->dh_hist_spacing, ndhmax, dhbtPV, 0, 0, NULL); n++; } } }