X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=blobdiff_plain;f=src%2Fgromacs%2Fmdlib%2Fsim_util.c;h=b35dd827ac0afe009787c7e562d0baebeb264322;hb=19d3c2e5d0c401eb59010960d11a18b6ba2c54c6;hp=a6b166ccfd5acedb51742f9063d40207edda4e23;hpb=a349e4beffcbe43be945226384d2a590b27263f0;p=alexxy%2Fgromacs.git diff --git a/src/gromacs/mdlib/sim_util.c b/src/gromacs/mdlib/sim_util.c index a6b166ccfd..b35dd827ac 100644 --- a/src/gromacs/mdlib/sim_util.c +++ b/src/gromacs/mdlib/sim_util.c @@ -34,70 +34,71 @@ * To help us fund GROMACS development, we humbly ask that you cite * the research papers on the package. Check out http://www.gromacs.org. */ -#ifdef HAVE_CONFIG_H -#include -#endif +#include "gmxpre.h" + +#include "gromacs/legacyheaders/sim_util.h" + +#include "config.h" #include #include #include #include + #ifdef HAVE_SYS_TIME_H #include #endif -#include "typedefs.h" -#include "gromacs/utility/cstringutil.h" -#include "gromacs/utility/smalloc.h" -#include "names.h" -#include "txtdump.h" -#include "pbc.h" -#include "chargegroup.h" -#include "vec.h" -#include "nrnb.h" -#include "mshift.h" -#include "mdrun.h" -#include "sim_util.h" -#include "update.h" -#include "physics.h" -#include "main.h" -#include "mdatoms.h" -#include "force.h" -#include "bondf.h" -#include "pme.h" -#include "disre.h" -#include "orires.h" -#include "network.h" -#include "calcmu.h" -#include "constr.h" -#include "xvgr.h" -#include "copyrite.h" -#include "domdec.h" -#include "genborn.h" -#include "nbnxn_atomdata.h" -#include "nbnxn_search.h" -#include "nbnxn_kernels/nbnxn_kernel_ref.h" -#include "nbnxn_kernels/simd_4xn/nbnxn_kernel_simd_4xn.h" -#include "nbnxn_kernels/simd_2xnn/nbnxn_kernel_simd_2xnn.h" -#include "nbnxn_kernels/nbnxn_kernel_gpu_ref.h" -#include "nonbonded.h" -#include "../gmxlib/nonbonded/nb_kernel.h" -#include "../gmxlib/nonbonded/nb_free_energy.h" - -#include "gromacs/timing/wallcycle.h" -#include "gromacs/timing/walltime_accounting.h" -#include "gromacs/utility/gmxmpi.h" #include "gromacs/essentialdynamics/edsam.h" +#include "gromacs/gmxlib/nonbonded/nb_free_energy.h" +#include "gromacs/gmxlib/nonbonded/nb_kernel.h" +#include "gromacs/imd/imd.h" +#include "gromacs/legacyheaders/calcmu.h" +#include "gromacs/legacyheaders/chargegroup.h" +#include "gromacs/legacyheaders/constr.h" +#include "gromacs/legacyheaders/copyrite.h" +#include "gromacs/legacyheaders/disre.h" +#include "gromacs/legacyheaders/domdec.h" +#include "gromacs/legacyheaders/force.h" +#include "gromacs/legacyheaders/genborn.h" +#include "gromacs/legacyheaders/gmx_omp_nthreads.h" +#include "gromacs/legacyheaders/mdatoms.h" +#include "gromacs/legacyheaders/mdrun.h" +#include "gromacs/legacyheaders/names.h" +#include "gromacs/legacyheaders/network.h" +#include "gromacs/legacyheaders/nonbonded.h" +#include "gromacs/legacyheaders/nrnb.h" +#include "gromacs/legacyheaders/orires.h" +#include "gromacs/legacyheaders/pme.h" +#include "gromacs/legacyheaders/qmmm.h" +#include "gromacs/legacyheaders/txtdump.h" +#include "gromacs/legacyheaders/typedefs.h" +#include "gromacs/legacyheaders/update.h" +#include "gromacs/legacyheaders/types/commrec.h" +#include "gromacs/listed-forces/bonded.h" +#include "gromacs/math/units.h" +#include "gromacs/math/vec.h" +#include "gromacs/mdlib/nb_verlet.h" +#include "gromacs/mdlib/nbnxn_atomdata.h" +#include "gromacs/mdlib/nbnxn_search.h" +#include "gromacs/mdlib/nbnxn_cuda/nbnxn_cuda.h" +#include "gromacs/mdlib/nbnxn_cuda/nbnxn_cuda_data_mgmt.h" +#include "gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_gpu_ref.h" +#include "gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_ref.h" +#include "gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_simd_2xnn.h" +#include "gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_simd_4xn.h" +#include "gromacs/pbcutil/ishift.h" +#include "gromacs/pbcutil/mshift.h" +#include "gromacs/pbcutil/pbc.h" #include "gromacs/pulling/pull.h" #include "gromacs/pulling/pull_rotation.h" -#include "gromacs/imd/imd.h" -#include "adress.h" -#include "qmmm.h" - -#include "gmx_omp_nthreads.h" +#include "gromacs/timing/wallcycle.h" +#include "gromacs/timing/walltime_accounting.h" +#include "gromacs/utility/cstringutil.h" +#include "gromacs/utility/gmxmpi.h" +#include "gromacs/utility/smalloc.h" -#include "nbnxn_cuda_data_mgmt.h" -#include "nbnxn_cuda/nbnxn_cuda.h" +#include "adress.h" void print_time(FILE *out, gmx_walltime_accounting_t walltime_accounting, @@ -313,9 +314,7 @@ static void calc_virial(int start, int homenr, rvec x[], rvec f[], } } -static void posres_wrapper(FILE *fplog, - int flags, - gmx_bool bSepDVDL, +static void posres_wrapper(int flags, t_inputrec *ir, t_nrnb *nrnb, gmx_localtop_t *top, @@ -337,10 +336,6 @@ static void posres_wrapper(FILE *fplog, ir->ePBC == epbcNONE ? NULL : &pbc, lambda[efptRESTRAINT], &dvdl, fr->rc_scaling, fr->ePBC, fr->posres_com, fr->posres_comB); - if (bSepDVDL) - { - gmx_print_sepdvdl(fplog, interaction_function[F_POSRES].longname, v, dvdl); - } enerd->term[F_POSRES] += v; /* If just the force constant changes, the FEP term is linear, * but if k changes, it is not. @@ -386,9 +381,7 @@ static void fbposres_wrapper(t_inputrec *ir, inc_nrnb(nrnb, eNR_FBPOSRES, top->idef.il[F_FBPOSRES].nr/2); } -static void pull_potential_wrapper(FILE *fplog, - gmx_bool bSepDVDL, - t_commrec *cr, +static void pull_potential_wrapper(t_commrec *cr, t_inputrec *ir, matrix box, rvec x[], rvec f[], @@ -413,17 +406,11 @@ static void pull_potential_wrapper(FILE *fplog, enerd->term[F_COM_PULL] += pull_potential(ir->ePull, ir->pull, mdatoms, &pbc, cr, t, lambda[efptRESTRAINT], x, f, vir_force, &dvdl); - if (bSepDVDL) - { - gmx_print_sepdvdl(fplog, "Com pull", enerd->term[F_COM_PULL], dvdl); - } enerd->dvdl_lin[efptRESTRAINT] += dvdl; wallcycle_stop(wcycle, ewcPULLPOT); } -static void pme_receive_force_ener(FILE *fplog, - gmx_bool bSepDVDL, - t_commrec *cr, +static void pme_receive_force_ener(t_commrec *cr, gmx_wallcycle_t wcycle, gmx_enerdata_t *enerd, t_forcerec *fr) @@ -443,11 +430,6 @@ static void pme_receive_force_ener(FILE *fplog, gmx_pme_receive_f(cr, fr->f_novirsum, fr->vir_el_recip, &e_q, fr->vir_lj_recip, &e_lj, &dvdl_q, &dvdl_lj, &cycles_seppme); - if (bSepDVDL) - { - gmx_print_sepdvdl(fplog, "Electrostatic PME mesh", e_q, dvdl_q); - gmx_print_sepdvdl(fplog, "Lennard-Jones PME mesh", e_lj, dvdl_lj); - } enerd->term[F_COUL_RECIP] += e_q; enerd->term[F_LJ_RECIP] += e_lj; enerd->dvdl_lin[efptCOUL] += dvdl_q; @@ -802,6 +784,11 @@ static void do_nb_verlet_fep(nbnxn_pairlist_set_t *nbl_lists, wallcycle_sub_stop(wcycle, ewcsNONBONDED); } +gmx_bool use_GPU(const nonbonded_verlet_t *nbv) +{ + return nbv != NULL && nbv->bUseGPU; +} + void do_force_cutsVERLET(FILE *fplog, t_commrec *cr, t_inputrec *inputrec, gmx_int64_t step, t_nrnb *nrnb, gmx_wallcycle_t wcycle, @@ -823,7 +810,7 @@ void do_force_cutsVERLET(FILE *fplog, t_commrec *cr, int start, homenr; int nb_kernel_type; double mu[2*DIM]; - gmx_bool bSepDVDL, bStateChanged, bNS, bFillGrid, bCalcCGCM, bBS; + gmx_bool bStateChanged, bNS, bFillGrid, bCalcCGCM, bBS; gmx_bool bDoLongRange, bDoForces, bSepLRF, bUseGPU, bUseOrEmulGPU; gmx_bool bDiffKernels = FALSE; matrix boxs; @@ -840,8 +827,6 @@ void do_force_cutsVERLET(FILE *fplog, t_commrec *cr, start = 0; homenr = mdatoms->homenr; - bSepDVDL = (fr->bSepDVDL && do_per_step(step, inputrec->nstlog)); - clear_mat(vir_force); cg0 = 0; @@ -1251,10 +1236,11 @@ void do_force_cutsVERLET(FILE *fplog, t_commrec *cr, } /* We calculate the non-bonded forces, when done on the CPU, here. - * We do this before calling do_force_lowlevel, as in there bondeds - * forces are calculated before PME, which does communication. - * With this order, non-bonded and bonded force calculation imbalance - * can be balanced out by the domain decomposition load balancing. + * We do this before calling do_force_lowlevel, because in that + * function, the listed forces are calculated before PME, which + * does communication. With this order, non-bonded and listed + * force calculation imbalance can be balanced out by the domain + * decomposition load balancing. */ if (!bUseOrEmulGPU) @@ -1334,22 +1320,22 @@ void do_force_cutsVERLET(FILE *fplog, t_commrec *cr, update_QMMMrec(cr, fr, x, mdatoms, box, top); } - if ((flags & GMX_FORCE_BONDED) && top->idef.il[F_POSRES].nr > 0) + if ((flags & GMX_FORCE_LISTED) && top->idef.il[F_POSRES].nr > 0) { - posres_wrapper(fplog, flags, bSepDVDL, inputrec, nrnb, top, box, x, + posres_wrapper(flags, inputrec, nrnb, top, box, x, enerd, lambda, fr); } - if ((flags & GMX_FORCE_BONDED) && top->idef.il[F_FBPOSRES].nr > 0) + if ((flags & GMX_FORCE_LISTED) && top->idef.il[F_FBPOSRES].nr > 0) { fbposres_wrapper(inputrec, nrnb, top, box, x, enerd, fr); } /* Compute the bonded and non-bonded energies and optionally forces */ - do_force_lowlevel(fplog, step, fr, inputrec, &(top->idef), + do_force_lowlevel(fr, inputrec, &(top->idef), cr, nrnb, wcycle, mdatoms, x, hist, f, bSepLRF ? fr->f_twin : f, enerd, fcd, top, fr->born, - &(top->atomtypes), bBornRadii, box, + bBornRadii, box, inputrec->fepvals, lambda, graph, &(top->excls), fr->mu_tot, flags, &cycles_pme); @@ -1574,7 +1560,7 @@ void do_force_cutsVERLET(FILE *fplog, t_commrec *cr, /* Since the COM pulling is always done mass-weighted, no forces are * applied to vsites and this call can be done after vsite spreading. */ - pull_potential_wrapper(fplog, bSepDVDL, cr, inputrec, box, x, + pull_potential_wrapper(cr, inputrec, box, x, f, vir_force, mdatoms, enerd, lambda, t, wcycle); } @@ -1595,7 +1581,7 @@ void do_force_cutsVERLET(FILE *fplog, t_commrec *cr, /* In case of node-splitting, the PP nodes receive the long-range * forces, virial and energy from the PME nodes here. */ - pme_receive_force_ener(fplog, bSepDVDL, cr, wcycle, enerd, fr); + pme_receive_force_ener(cr, wcycle, enerd, fr); } if (bDoForces) @@ -1628,7 +1614,7 @@ void do_force_cutsGROUP(FILE *fplog, t_commrec *cr, int cg0, cg1, i, j; int start, homenr; double mu[2*DIM]; - gmx_bool bSepDVDL, bStateChanged, bNS, bFillGrid, bCalcCGCM, bBS; + gmx_bool bStateChanged, bNS, bFillGrid, bCalcCGCM, bBS; gmx_bool bDoLongRangeNS, bDoForces, bDoPotential, bSepLRF; gmx_bool bDoAdressWF; matrix boxs; @@ -1640,8 +1626,6 @@ void do_force_cutsGROUP(FILE *fplog, t_commrec *cr, start = 0; homenr = mdatoms->homenr; - bSepDVDL = (fr->bSepDVDL && do_per_step(step, inputrec->nstlog)); - clear_mat(vir_force); cg0 = 0; @@ -1926,22 +1910,22 @@ void do_force_cutsGROUP(FILE *fplog, t_commrec *cr, update_QMMMrec(cr, fr, x, mdatoms, box, top); } - if ((flags & GMX_FORCE_BONDED) && top->idef.il[F_POSRES].nr > 0) + if ((flags & GMX_FORCE_LISTED) && top->idef.il[F_POSRES].nr > 0) { - posres_wrapper(fplog, flags, bSepDVDL, inputrec, nrnb, top, box, x, + posres_wrapper(flags, inputrec, nrnb, top, box, x, enerd, lambda, fr); } - if ((flags & GMX_FORCE_BONDED) && top->idef.il[F_FBPOSRES].nr > 0) + if ((flags & GMX_FORCE_LISTED) && top->idef.il[F_FBPOSRES].nr > 0) { fbposres_wrapper(inputrec, nrnb, top, box, x, enerd, fr); } /* Compute the bonded and non-bonded energies and optionally forces */ - do_force_lowlevel(fplog, step, fr, inputrec, &(top->idef), + do_force_lowlevel(fr, inputrec, &(top->idef), cr, nrnb, wcycle, mdatoms, x, hist, f, bSepLRF ? fr->f_twin : f, enerd, fcd, top, fr->born, - &(top->atomtypes), bBornRadii, box, + bBornRadii, box, inputrec->fepvals, lambda, graph, &(top->excls), fr->mu_tot, flags, @@ -2049,7 +2033,7 @@ void do_force_cutsGROUP(FILE *fplog, t_commrec *cr, if (inputrec->ePull == epullUMBRELLA || inputrec->ePull == epullCONST_F) { - pull_potential_wrapper(fplog, bSepDVDL, cr, inputrec, box, x, + pull_potential_wrapper(cr, inputrec, box, x, f, vir_force, mdatoms, enerd, lambda, t, wcycle); } @@ -2070,7 +2054,7 @@ void do_force_cutsGROUP(FILE *fplog, t_commrec *cr, /* In case of node-splitting, the PP nodes receive the long-range * forces, virial and energy from the PME nodes here. */ - pme_receive_force_ener(fplog, bSepDVDL, cr, wcycle, enerd, fr); + pme_receive_force_ener(cr, wcycle, enerd, fr); } if (bDoForces) @@ -2486,8 +2470,8 @@ void calc_enervirdiff(FILE *fplog, int eDispCorr, t_forcerec *fr) } } -void calc_dispcorr(FILE *fplog, t_inputrec *ir, t_forcerec *fr, - gmx_int64_t step, int natoms, +void calc_dispcorr(t_inputrec *ir, t_forcerec *fr, + int natoms, matrix box, real lambda, tensor pres, tensor virial, real *prescorr, real *enercorr, real *dvdlcorr) { @@ -2588,10 +2572,6 @@ void calc_dispcorr(FILE *fplog, t_inputrec *ir, t_forcerec *fr, } } - if (fr->bSepDVDL && do_per_step(step, ir->nstlog)) - { - gmx_print_sepdvdl(fplog, "Dispersion correction", *enercorr, dvdlambda); - } if (fr->efep != efepNO) { *dvdlcorr += dvdlambda; @@ -2696,7 +2676,7 @@ void finish_run(FILE *fplog, t_commrec *cr, t_inputrec *inputrec, t_nrnb nrnb[], gmx_wallcycle_t wcycle, gmx_walltime_accounting_t walltime_accounting, - wallclock_gpu_t *gputimes, + nonbonded_verlet_t *nbv, gmx_bool bWriteStat) { int i, j; @@ -2760,6 +2740,8 @@ void finish_run(FILE *fplog, t_commrec *cr, if (SIMMASTER(cr)) { + wallclock_gpu_t* gputimes = use_GPU(nbv) ? + nbnxn_cuda_get_timings(nbv->cu_nbv) : NULL; wallcycle_print(fplog, cr->nnodes, cr->npmenodes, elapsed_time_over_all_ranks, wcycle, gputimes);