From f980e8babf44f3a6fef948c4e03922a41a3e4dcb Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Thu, 19 Dec 2024 09:52:05 -0700 Subject: [PATCH 01/94] Integrated MD-KMC code to current development branch --- src/Depend.sh | 1 + src/MC/Install.sh | 2 + src/MC/fix_neighbor_swap.cpp | 1012 ++++++++++++++++++++++++++++++++++ src/MC/fix_neighbor_swap.h | 146 +++++ 4 files changed, 1161 insertions(+) create mode 100755 src/MC/fix_neighbor_swap.cpp create mode 100755 src/MC/fix_neighbor_swap.h diff --git a/src/Depend.sh b/src/Depend.sh index 9ddb29450d..ba55deb62c 100755 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -146,6 +146,7 @@ fi if (test $1 = "MC") then depend MISC + depend VORONOI fi if (test $1 = "MEAM") then diff --git a/src/MC/Install.sh b/src/MC/Install.sh index ccf6767c4d..9a0095fd34 100755 --- a/src/MC/Install.sh +++ b/src/MC/Install.sh @@ -51,6 +51,8 @@ action fix_charge_regulation.cpp action fix_charge_regulation.h action fix_gcmc.cpp action fix_gcmc.h +action fix_neighbor_swap.cpp +action fix_neighbor_swap.h action fix_mol_swap.cpp action fix_mol_swap.h action fix_sgcmc.cpp pair_eam.cpp diff --git a/src/MC/fix_neighbor_swap.cpp b/src/MC/fix_neighbor_swap.cpp new file mode 100755 index 0000000000..52730ee6f5 --- /dev/null +++ b/src/MC/fix_neighbor_swap.cpp @@ -0,0 +1,1012 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Jacob Tavenner +------------------------------------------------------------------------- */ + +#include "fix_neighbor_swap.h" + +#include "angle.h" +#include "atom.h" +#include "bond.h" +#include "comm.h" +#include "compute.h" +#include "dihedral.h" +#include "domain.h" +#include "error.h" +#include "fix.h" +#include "force.h" +#include "group.h" +#include "improper.h" +#include "kspace.h" +#include "memory.h" +#include "modify.h" +#include "neighbor.h" +#include "pair.h" +#include "random_park.h" +#include "region.h" +#include "update.h" +#include "compute_voronoi_atom.h" + +#include +#include +#include +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +static const char cite_fix_neighbor_swap_c[] = + "fix neighbor/swap command: doi:10.1016/j.commatsci.2022.111929\n\n" + "@Article{Tavenner2023111929,\n" + " author = {Jacob P. Tavenner and Mikhail I. Mendelev and John W. Lawson},\n" + " title = {Molecular dynamics based kinetic Monte Carlo simulation for accelerated diffusion},\n" + " journal = {Computational Materials Science},\n" + " year = {2023},\n" + " volume = {218},\n" + " pages = {111929}\n" + " url = {https://www.sciencedirect.com/science/article/pii/S0927025622006401}\n" + "}\n\n"; + +/* ---------------------------------------------------------------------- */ + +FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), region(nullptr), idregion(nullptr), type_list(nullptr), + qtype(nullptr), c_voro(nullptr), voro_neighbor_list(nullptr), + sqrt_mass_ratio(nullptr), local_swap_iatom_list(nullptr), + random_equal(nullptr), random_unequal(nullptr), c_pe(nullptr) +{ + if (narg < 10) error->all(FLERR,"Illegal fix neighbor/swap command"); + + // utils::logmesg(lmp,"Starting neighbor/swap\n"); + + dynamic_group_allow = 1; + + vector_flag = 1; + size_vector = 2; + global_freq = 1; + extvector = 0; + restart_global = 1; + time_depend = 1; + + // required args + + nevery = utils::inumeric(FLERR,arg[3],false,lmp); + ncycles = utils::inumeric(FLERR,arg[4],false,lmp); + seed = utils::inumeric(FLERR,arg[5],false,lmp); + double temperature = utils::numeric(FLERR,arg[6],false,lmp); + + if (nevery <= 0) error->all(FLERR,"Illegal fix neighbor/swap command"); + if (ncycles < 0) error->all(FLERR,"Illegal fix neighbor/swap command"); + // if (nevery < ncycles) error->all(FLERR,"Illegal fix neighbor/swap command"); + if (seed <= 0) error->all(FLERR,"Illegal fix neighbor/swap command"); + if (temperature <= 0.0) error->all(FLERR,"Illegal fix neighbor/swap command"); + + beta = 1.0 / (force->boltz * temperature); + + memory->create(type_list,atom->ntypes,"neighbor/swap:type_list"); + memory->create(rate_list,atom->ntypes,"neighbor/swap:rate_list"); + + // read options from end of input line + + options(narg-7,&arg[7]); + + if (voro_flag != 1) error->all(FLERR,"Voro Compute Required for fix neighbor/swap command"); + + // random number generator, same for all procs + + random_equal = new RanPark(lmp,seed); + + // random number generator, not the same for all procs + + random_unequal = new RanPark(lmp,seed); + + // set up reneighboring + + force_reneighbor = 1; + next_reneighbor = update->ntimestep + 1; + + // zero out counters + + nswap_attempts = 0.0; + nswap_successes = 0.0; + + atom_swap_nmax = 0; + voro_neighbor_list = nullptr; + local_swap_iatom_list = nullptr; + local_swap_neighbor_list = nullptr; + local_swap_probability = nullptr; + local_swap_type_list = nullptr; + + // set comm size needed by this Fix + + if (atom->q_flag) comm_forward = 2; + else comm_forward = 1; + +} + +/* ---------------------------------------------------------------------- */ + +FixNeighborSwap::~FixNeighborSwap() +{ + memory->destroy(type_list); + memory->destroy(rate_list); + memory->destroy(qtype); + memory->destroy(sqrt_mass_ratio); + memory->destroy(local_swap_iatom_list); + memory->destroy(local_swap_neighbor_list); + memory->destroy(local_swap_probability); + memory->destroy(local_swap_type_list); + delete[] idregion; + delete random_equal; + delete random_unequal; +} + +/* ---------------------------------------------------------------------- + parse optional parameters at end of input line +------------------------------------------------------------------------- */ + +void FixNeighborSwap::options(int narg, char **arg) +{ + if (narg < 0) error->all(FLERR,"Illegal fix neighbor/swap command\n"); + + ke_flag = 1; + diff_flag = 0; + rates_flag = 0; + voro_flag = 0; + nswaptypes = 0; + + int iarg = 0; + while (iarg < narg) { + // utils::logmesg(lmp,"Parsing Argument {}\n", arg[iarg]); + if (strcmp(arg[iarg],"region") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + region = domain->get_region_by_id(arg[iarg+1]); + if (!region) error->all(FLERR,"Region ID for fix neighbor/swap does not exist"); + idregion = utils::strdup(arg[iarg + 1]); + iarg += 2; + } else if (strcmp(arg[iarg],"ke") == 0) { + if (iarg + 2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + ke_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); + iarg += 2; + } else if (strcmp(arg[iarg],"types") == 0) { + if (iarg + 3 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + if (diff_flag != 0) error->all(FLERR,"Illegal fix neighbor/swap command"); + iarg++; + nswaptypes = 0; + while (iarg < narg) { + if (isalpha(arg[iarg][0])) break; + if (nswaptypes >= atom->ntypes) error->all(FLERR,"Illegal fix neighbor/swap command"); + type_list[nswaptypes] = utils::numeric(FLERR,arg[iarg],false,lmp); + nswaptypes++; + iarg++; + } + } else if (strcmp(arg[iarg],"voro") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + + int icompute = modify->find_compute(utils::strdup(arg[iarg+1])); + + if (icompute < 0) error->all(FLERR,"Could not find neighbor compute ID"); + c_voro = modify->compute[icompute]; + if (c_voro->local_flag == 0) + error->all(FLERR,"Neighbor compute does not compute local info"); + if (c_voro->size_local_cols != 3) + error->all(FLERR,"Neighbor compute does not give i, j, size as expected"); + + voro_flag = 1; + iarg += 2; + } else if (strcmp(arg[iarg],"diff") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + if (nswaptypes != 0) error->all(FLERR,"Illegal fix neighbor/swap command"); + type_list[nswaptypes] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + diff_flag = 1; + nswaptypes++; + iarg += 2; + } else if (strcmp(arg[iarg],"rates") == 0) { + if (iarg+atom->ntypes >= narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + // utils::logmesg(lmp,"Reading rates\n"); + iarg++; + int i = 0; + while (iarg < narg) { + if (isalpha(arg[iarg][0])) break; + if (i >= atom->ntypes) error->all(FLERR,"Illegal fix neighbor/swap command"); + rate_list[i] = utils::numeric(FLERR,arg[iarg],false,lmp); + i++; + iarg++; + } + rates_flag = 1; + if (i != atom->ntypes) error->all(FLERR,"Illegal fix neighbor/swap command"); + } + else error->all(FLERR,"Illegal fix neighbor/swap command"); + } +} + +/* ---------------------------------------------------------------------- */ + +int FixNeighborSwap::setmask() +{ + int mask = 0; + mask |= PRE_EXCHANGE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixNeighborSwap::init() +{ + // utils::logmesg(lmp,"Initializing neighbor/swap\n"); + c_pe = modify->get_compute_by_id("thermo_pe"); + + int *type = atom->type; + + if (nswaptypes < 2 && !diff_flag) error->all(FLERR,"Must specify at least 2 types in fix neighbor/swap command"); + + // set index and check validity of region + + if (idregion) { + region = domain->get_region_by_id(idregion); + if (!region) error->all(FLERR, "Region {} for fix setforce does not exist", idregion); + } + + for (int iswaptype = 0; iswaptype < nswaptypes; iswaptype++) + if (type_list[iswaptype] <= 0 || type_list[iswaptype] > atom->ntypes) + error->all(FLERR,"Invalid atom type in fix neighbor/swap command"); + + if (atom->q_flag) { + double qmax,qmin; + int firstall,first; + memory->create(qtype,nswaptypes,"neighbor/swap:qtype"); + for (int iswaptype = 0; iswaptype < nswaptypes; iswaptype++) { + first = 1; + for (int i = 0; i < atom->nlocal; i++) { + if (atom->mask[i] & groupbit) { + if (type[i] == type_list[iswaptype]) { + if (first) { + qtype[iswaptype] = atom->q[i]; + first = 0; + } else if (qtype[iswaptype] != atom->q[i]) + error->one(FLERR,"All atoms of a swapped type must have the same charge."); + } + } + } + MPI_Allreduce(&first,&firstall,1,MPI_INT,MPI_MIN,world); + if (firstall) error->all(FLERR,"At least one atom of each swapped type must be present to define charges."); + if (first) qtype[iswaptype] = -DBL_MAX; + MPI_Allreduce(&qtype[iswaptype],&qmax,1,MPI_DOUBLE,MPI_MAX,world); + if (first) qtype[iswaptype] = DBL_MAX; + MPI_Allreduce(&qtype[iswaptype],&qmin,1,MPI_DOUBLE,MPI_MIN,world); + if (qmax != qmin) error->all(FLERR,"All atoms of a swapped type must have same charge."); + } + } + + memory->create(sqrt_mass_ratio,atom->ntypes+1,atom->ntypes+1,"neighbor/swap:sqrt_mass_ratio"); + for (int itype = 1; itype <= atom->ntypes; itype++) + for (int jtype = 1; jtype <= atom->ntypes; jtype++) + sqrt_mass_ratio[itype][jtype] = sqrt(atom->mass[itype]/atom->mass[jtype]); + + // check to see if itype and jtype cutoffs are the same + // if not, reneighboring will be needed between swaps + + double **cutsq = force->pair->cutsq; + unequal_cutoffs = false; + for (int iswaptype = 0; iswaptype < nswaptypes; iswaptype++) + for (int jswaptype = 0; jswaptype < nswaptypes; jswaptype++) + for (int ktype = 1; ktype <= atom->ntypes; ktype++) + if (cutsq[type_list[iswaptype]][ktype] != cutsq[type_list[jswaptype]][ktype]) + unequal_cutoffs = true; + + // check that no swappable atoms are in atom->firstgroup + // swapping such an atom might not leave firstgroup atoms first + + if (atom->firstgroup >= 0) { + int *mask = atom->mask; + int firstgroupbit = group->bitmask[atom->firstgroup]; + + int flag = 0; + for (int i = 0; i < atom->nlocal; i++) + if ((mask[i] == groupbit) && (mask[i] && firstgroupbit)) flag = 1; + + int flagall; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); + + if (flagall) + error->all(FLERR,"Cannot do neighbor/swap on atoms in atom_modify first group"); + + // utils::logmesg(lmp,"Done Init\n"); + } +} + +/* ---------------------------------------------------------------------- + attempt Monte Carlo swaps +------------------------------------------------------------------------- */ + +void FixNeighborSwap::pre_exchange() +{ + // just return if should not be called on this timestep + + if (next_reneighbor != update->ntimestep) return; + + // ensure current system is ready to compute energy + + if (domain->triclinic) domain->x2lamda(atom->nlocal); + domain->pbc(); + comm->exchange(); + comm->borders(); + if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + if (modify->n_pre_neighbor) modify->pre_neighbor(); + neighbor->build(1); + + // energy_stored = energy of current state + // will be updated after accepted swaps + + energy_stored = energy_full(); + + // attempt Ncycle atom swaps + + // utils::logmesg(lmp,"Attempting Swap\n"); + + int nsuccess = 0; + update_iswap_atoms_list(); + // utils::logmesg(lmp,"Updated Atom i List\n"); + for (int i = 0; i < ncycles; i++) nsuccess += attempt_swap(); + + // utils::logmesg(lmp,"\n"); + + // udpate MC stats + + nswap_attempts += ncycles; + nswap_successes += nsuccess; + + next_reneighbor = update->ntimestep + nevery; +} + +/* ---------------------------------------------------------------------- + attempt a swap of a pair of atoms + compare before/after energy and accept/reject the swap +------------------------------------------------------------------------- */ + +int FixNeighborSwap::attempt_swap() +{ + // int nlocal = atom->nlocal; + tagint *id = atom->tag; + + if ( niswap == 0 ) return 0; + + // pre-swap energy + + double energy_before = energy_stored; + + // pick a random atom i + + int i = pick_i_swap_atom(); + + // get global id and position of atom i + // get_global_i(i); + + // build nearest-neighbor list based on atom i + + build_i_neighbor_list(i); + // utils::logmesg(lmp,"Built neighbor list with {} atoms\n",njswap); + if ( njswap <= 0 ) { + // utils::logmesg(lmp,"No valid neighbors found\n"); + return 0; + } + + // pick a neighbor atom j based on i neighbor list + jtype_selected = -1; + int j = pick_j_swap_neighbor(i); + // utils::logmesg(lmp,"Selected swap neighbor j\n"); + + int itype = type_list[0]; + int jtype = jtype_selected; + // utils::logmesg(lmp,"Selected atom j type {}\n",jtype); + + // utils::logmesg(lmp,"Swapping local atoms {} and ",i); + // utils::logmesg(lmp,"{}\n",j); + + // if ( i >= 0 || j >= 0) { + // utils::logmesg(lmp,"Selected atom j type {}\n",jtype); + // utils::logmesg(lmp,"Swapping atoms {} and ",id[i]); + // utils::logmesg(lmp,"{}\n",id[j]); + // } + + // utils::logmesg(lmp,"Atom type {} and ",itype); + // utils::logmesg(lmp,"{}\n",jtype); + + // Accept swap if types are equal, no change to system + if ( itype == jtype ){ + // utils::logmesg(lmp,"Atoms have same type, no processing needed\n"); + return 1; + } + + // swap their properties + if ( i >= 0 ) { + atom->type[i] = jtype; + if (atom->q_flag) atom->q[i] = qtype[jtype_selected]; + } + if ( j >= 0 ) { + atom->type[j] = itype; + if (atom->q_flag) atom->q[j] = qtype[0]; + } + + // if unequal_cutoffs, call comm->borders() and rebuild neighbor list + // else communicate ghost atoms + // call to comm->exchange() is a no-op but clears ghost atoms + + if (unequal_cutoffs) { + if (domain->triclinic) domain->x2lamda(atom->nlocal); + domain->pbc(); + comm->exchange(); + comm->borders(); + if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + if (modify->n_pre_neighbor) modify->pre_neighbor(); + neighbor->build(1); + } else { + comm->forward_comm(this); + } + + // post-swap energy + + double energy_after = energy_full(); + + // if swap accepted, return 1 + // if ke_flag, rescale atom velocities + + if (random_equal->uniform() < + exp(beta*(energy_before - energy_after))) { + update_iswap_atoms_list(); + if (ke_flag) { + if ( i >= 0 ) { + atom->v[i][0] *= sqrt_mass_ratio[itype][jtype]; + atom->v[i][1] *= sqrt_mass_ratio[itype][jtype]; + atom->v[i][2] *= sqrt_mass_ratio[itype][jtype]; + } + if ( j >= 0 ) { + atom->v[j][0] *= sqrt_mass_ratio[jtype][itype]; + atom->v[j][1] *= sqrt_mass_ratio[jtype][itype]; + atom->v[j][2] *= sqrt_mass_ratio[jtype][itype]; + } + } + energy_stored = energy_after; + + // utils::logmesg(lmp,"Swap accepted\n"); + // Swap atom groups if successful swap + + // int groupi = atom->mask[i]; + // int groupj = atom->mask[j]; + + // atom->mask[i] = group->bitmask[groupj]; + // atom->mask[j] = group->bitmask[groupi]; + + return 1; + } + + // swap not accepted, return 0 + // restore the swapped itype & jtype atoms + // do not need to re-call comm->borders() and rebuild neighbor list + // since will be done on next cycle or in Verlet when this fix finishes + + // utils::logmesg(lmp,"Swap not accepted\n"); + + if ( i >= 0 ) { + atom->type[i] = itype; + if (atom->q_flag) atom->q[i] = qtype[0]; + } + if ( j >= 0 ) { + atom->type[j] = jtype; + if (atom->q_flag) atom->q[j] = qtype[jtype_selected]; + } + + return 0; +} + +/* ---------------------------------------------------------------------- + compute system potential energy +------------------------------------------------------------------------- */ + +double FixNeighborSwap::energy_full() +{ + int eflag = 1; + int vflag = 0; + + if (modify->n_pre_force) modify->pre_force(vflag); + + if (force->pair) force->pair->compute(eflag,vflag); + + if (atom->molecular != Atom::ATOMIC) { + if (force->bond) force->bond->compute(eflag,vflag); + if (force->angle) force->angle->compute(eflag,vflag); + if (force->dihedral) force->dihedral->compute(eflag,vflag); + if (force->improper) force->improper->compute(eflag,vflag); + } + + if (force->kspace) force->kspace->compute(eflag,vflag); + + if (modify->n_post_force_any) modify->post_force(vflag); + + update->eflag_global = update->ntimestep; + double total_energy = c_pe->compute_scalar(); + + return total_energy; +} + +/* ---------------------------------------------------------------------- +------------------------------------------------------------------------- */ + +int FixNeighborSwap::pick_i_swap_atom() +{ + tagint *id = atom->tag; + int id_center_local = -1; + int i = -1; + + int iwhichglobal = static_cast (niswap*random_equal->uniform()); + if ((iwhichglobal >= niswap_before) && + (iwhichglobal < niswap_before + niswap_local)) { + int iwhichlocal = iwhichglobal - niswap_before; + i = local_swap_iatom_list[iwhichlocal]; + id_center_local = id[i]; + MPI_Allreduce(&id[i],&id_center,1,MPI_INT,MPI_MAX,world); + } else { + MPI_Allreduce(&id[i],&id_center,1,MPI_INT,MPI_MAX,world); + } + + return i; +} + +/* ---------------------------------------------------------------------- +------------------------------------------------------------------------- */ + +int FixNeighborSwap::pick_j_swap_neighbor(int i) +{ + int j = -1; + int jtype_selected_local = -1; + + // Generate random double from 0 to maximum global probability + double selected_prob = static_cast (global_probability*random_equal->uniform()); + + // utils::logmesg(lmp,"Local Probability {}\n",local_probability); + + // Find which local swap atom corresponds to probability + if ((selected_prob >= prev_probability) && + (selected_prob < prev_probability + local_probability)){ + // utils::logmesg(lmp,"Selected Probability {}\n",selected_prob); + double search_prob = selected_prob - prev_probability; + for (int n = 0; n < njswap_local; n++){ + if (search_prob > local_swap_probability[n]){ + search_prob -= local_swap_probability[n]; + } + else{ + j = local_swap_neighbor_list[n]; + jtype_selected_local = local_swap_type_list[n]; + // utils::logmesg(lmp,"Selecting Atom j type {}\n",jtype_selected_local); + MPI_Allreduce(&jtype_selected_local,&jtype_selected,1,MPI_INT,MPI_MAX,world); + return j; + } + } + error->all(FLERR,"Did not select local neighbor swap atom"); + } + + // utils::logmesg(lmp,"Swap atom not found on processor\n"); + MPI_Allreduce(&jtype_selected_local,&jtype_selected,1,MPI_INT,MPI_MAX,world); + return j; +} + +/* ---------------------------------------------------------------------- +------------------------------------------------------------------------- */ + +double FixNeighborSwap::get_distance(double* i, double* j) +{ + // double r_x, r_y, r_z; + + // r_x = i[0] - j[0]; + // r_y = i[1] - j[1]; + // r_z = i[2] - j[2]; + + // // Domain::minimum_image(r_x, r_y, r_z); + // double r = sqrt(pow(r_x, 2.) + + // pow(r_y, 2.) + + // pow(r_z, 2.)); + + double r = sqrt(pow((i[0] - j[0]), 2.) + + pow((i[1] - j[1]), 2.) + + pow((i[2] - j[2]), 2.)); + + + return r; +} + +/* ---------------------------------------------------------------------- +------------------------------------------------------------------------- */ + +void FixNeighborSwap::build_i_neighbor_list(int i_center) +{ + int nghost = atom->nghost; + int nlocal = atom->nlocal; + int *type = atom->type; + double **x = atom->x; + tagint *id = atom->tag; + + // Allocate local_swap_neighbor_list size + + memory->sfree(local_swap_neighbor_list); + atom_swap_nmax = atom->nmax; + local_swap_neighbor_list = (int *) memory->smalloc(atom_swap_nmax*sizeof(int), + "MCSWAP:local_swap_neighbor_list"); + + memory->sfree(local_swap_probability); + local_swap_probability = (double *) memory->smalloc(atom_swap_nmax*sizeof(double), + "MCSWAP:local_swap_probability_list"); + + memory->sfree(local_swap_type_list); + local_swap_type_list = (int *) memory->smalloc(atom_swap_nmax*sizeof(int), + "MCSWAP:local_swap_type_list"); + + // Compute voronoi and access neighbor list + + c_voro->compute_local(); + + voro_neighbor_list = c_voro->array_local; + njswap_local = 0; + local_probability = 0.0; + + // utils::logmesg(lmp,"Searching for atom {}\n",id_center); + + for (int n = 0; n < c_voro->size_local_rows; n++){ + + int temp_j_id = -1; + int temp_j = -1; + + // Find local voronoi entry with selected central atom + if ( (int)voro_neighbor_list[n][0] == id_center ){ + temp_j_id = voro_neighbor_list[n][1]; + temp_j = -1; + } else if ( ((int)voro_neighbor_list[n][1] == id_center) && + ( i_center < 0 ) ){ + temp_j_id = voro_neighbor_list[n][0]; + temp_j = -1; + } else { + continue; + } + + // Find which local atom corresponds to neighbor + for (int j = 0; j < nlocal; j++){ + if ( temp_j_id == id[j] ){ + temp_j = j; + // utils::logmesg(lmp,"Found neighbor {}\n",id[j]); + break; + } + } + + // If temp_j not on this processor, skip + if ( temp_j < 0 ) continue; + + // // If atom is already in local list, skip + // bool inlist = false; + // for ( int j = 0; j < njswap_local; j++ ){ + // if ( temp_j == local_swap_neighbor_list[j] ){ + // utils::logmesg(lmp,"Skipping atom {}, pair already counted\n",id[temp_j]); + // inlist = true; + // break; + // } + // } + // if (inlist) continue; + + if (region) { + if (region->match(x[temp_j][0],x[temp_j][1],x[temp_j][2]) == 1) { + if (atom->mask[temp_j] & groupbit) { + if (diff_flag) { + // Calculate distance from i to each j, adjust probability of selection + + // Get distance if own centr atom + double r = INFINITY; + if ( i_center >= 0 ){ + double r = get_distance(x[temp_j], x[i_center]); + } + + // Get local id of ghost center atom when ghost + for (int i=nlocal; i < nlocal+nghost; i++){ + if ( (id[i] == id_center) && + (get_distance(x[temp_j], x[i]) < r) ){ + r = get_distance(x[temp_j], x[i]); + } + } + + if (rates_flag) { + local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-pow((r/3.), 2.)); + } else { + local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); + } + local_probability += local_swap_probability[njswap_local]; + + // utils::logmesg(lmp,"Adding Atom j type {}\n",type[temp_j]); + local_swap_type_list[njswap_local] = type[temp_j]; + local_swap_neighbor_list[njswap_local] = temp_j; + njswap_local++; + } else { + for (int jswaptype = 1; jswaptype < nswaptypes; jswaptype++){ + if (type[temp_j] == type_list[jswaptype]) { + // Calculate distance from i to each j, adjust probability of selection + // Get distance if own center atom + double r = INFINITY; + if ( i_center >= 0 ){ + double r = get_distance(x[temp_j], x[i_center]); + } + + // Get local id of ghost center atom when ghost + for (int i=nlocal; i < nlocal+nghost; i++){ + if ( (id[i] == id_center) && + (get_distance(x[temp_j], x[i]) < r) ){ + r = get_distance(x[temp_j], x[i]); + } + } + + if (rates_flag) { + local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-pow((r/3.), 2.)); + } else { + local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); + } + local_probability += local_swap_probability[njswap_local]; + + local_swap_type_list[njswap_local] = jswaptype; + local_swap_neighbor_list[njswap_local] = temp_j; + njswap_local++; + } + } + } + } + } + } else { + if (atom->mask[temp_j] & groupbit) { + if (diff_flag) { + // Calculate distance from i to each j, adjust probability of selection + // Get distance if own center atom + double r = INFINITY; + if ( i_center >= 0 ){ + r = get_distance(x[temp_j], x[i_center]); + } + + // Get local id of ghost center atoms + // if ( i_center < 0 ){ + // utils::logmesg(lmp,"Initial distance {}\n", r); + for (int i=nlocal; i < nlocal+nghost; i++){ + if ( (id[i] == id_center) && + (get_distance(x[temp_j], x[i]) < r) ){ + r = get_distance(x[temp_j], x[i]); + // utils::logmesg(lmp,"Updated distance {}\n", r); + } + } + // } + + // utils::logmesg(lmp,"Final distance {}\n", r); + + if (rates_flag) { + local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-pow((r/3.), 2.)); + } else{ + local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); + } + local_probability += local_swap_probability[njswap_local]; + + local_swap_type_list[njswap_local] = type[temp_j]; + local_swap_neighbor_list[njswap_local] = temp_j; + njswap_local++; + } else { + for (int jswaptype = 1; jswaptype < nswaptypes; jswaptype++){ + if (type[temp_j] == type_list[jswaptype]) { + // Calculate distance from i to each j, adjust probability of selection + // Get distance if own center atom + double r = INFINITY; + if ( i_center >= 0 ){ + double r = get_distance(x[temp_j], x[i_center]); + } + + // Get local id of ghost center atom when ghost + for (int i=nlocal; i < nlocal+nghost; i++){ + if ( (id[i] == id_center) && + (get_distance(x[temp_j], x[i]) < r) ){ + r = get_distance(x[temp_j], x[i]); + } + } + + if (rates_flag) { + local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-pow((r/3.), 2.)); + } else { + local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); + } + local_probability += local_swap_probability[njswap_local]; + + local_swap_type_list[njswap_local] = jswaptype; + local_swap_neighbor_list[njswap_local] = temp_j; + njswap_local++; + } + } + } + } + } + } + + MPI_Allreduce(&njswap_local,&njswap,1,MPI_INT,MPI_SUM,world); + MPI_Scan(&njswap_local,&njswap_before,1,MPI_INT,MPI_SUM,world); + njswap_before -= njswap_local; + + MPI_Allreduce(&local_probability,&global_probability,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Scan(&local_probability,&prev_probability,1,MPI_DOUBLE,MPI_SUM,world); + prev_probability -= local_probability; +} + +/* ---------------------------------------------------------------------- + update the list of swap atoms +------------------------------------------------------------------------- */ + +void FixNeighborSwap::update_iswap_atoms_list() +{ + int nlocal = atom->nlocal; + int *type = atom->type; + double **x = atom->x; + + if (atom->nmax > atom_swap_nmax) { + memory->sfree(local_swap_iatom_list); + atom_swap_nmax = atom->nmax; + local_swap_iatom_list = (int *) memory->smalloc(atom_swap_nmax*sizeof(int), + "MCSWAP:local_swap_iatom_list"); + } + + niswap_local = 0; + + if (region) { + + for (int i = 0; i < nlocal; i++) { + if (region->match(x[i][0],x[i][1],x[i][2]) == 1) { + if (atom->mask[i] & groupbit) { + if (type[i] == type_list[0]) { + local_swap_iatom_list[niswap_local] = i; + niswap_local++; + } + } + } + } + + } else { + for (int i = 0; i < nlocal; i++) { + if (atom->mask[i] & groupbit) { + if (type[i] == type_list[0]) { + local_swap_iatom_list[niswap_local] = i; + niswap_local++; + } + } + } + } + + MPI_Allreduce(&niswap_local,&niswap,1,MPI_INT,MPI_SUM,world); + MPI_Scan(&niswap_local,&niswap_before,1,MPI_INT,MPI_SUM,world); + niswap_before -= niswap_local; +} + +/* ---------------------------------------------------------------------- */ + +int FixNeighborSwap::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) +{ + int i,j,m; + + int *type = atom->type; + double *q = atom->q; + + m = 0; + + if (atom->q_flag) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = type[j]; + buf[m++] = q[j]; + } + } else { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = type[j]; + } + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void FixNeighborSwap::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + int *type = atom->type; + double *q = atom->q; + + m = 0; + last = first + n; + + if (atom->q_flag) { + for (i = first; i < last; i++) { + type[i] = static_cast (buf[m++]); + q[i] = buf[m++]; + } + } else { + for (i = first; i < last; i++) + type[i] = static_cast (buf[m++]); + } +} + +/* ---------------------------------------------------------------------- + return acceptance ratio +------------------------------------------------------------------------- */ + +double FixNeighborSwap::compute_vector(int n) +{ + if (n == 0) return nswap_attempts; + if (n == 1) return nswap_successes; + return 0.0; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays +------------------------------------------------------------------------- */ + +double FixNeighborSwap::memory_usage() +{ + double bytes = (double)atom_swap_nmax * sizeof(int); + return bytes; +} + +/* ---------------------------------------------------------------------- + pack entire state of Fix into one write +------------------------------------------------------------------------- */ + +void FixNeighborSwap::write_restart(FILE *fp) +{ + int n = 0; + double list[6]; + list[n++] = random_equal->state(); + list[n++] = random_unequal->state(); + list[n++] = ubuf(next_reneighbor).d; + list[n++] = nswap_attempts; + list[n++] = nswap_successes; + list[n++] = ubuf(update->ntimestep).d; + + if (comm->me == 0) { + int size = n * sizeof(double); + fwrite(&size,sizeof(int),1,fp); + fwrite(list,sizeof(double),n,fp); + } +} + +/* ---------------------------------------------------------------------- + use state info from restart file to restart the Fix +------------------------------------------------------------------------- */ + +void FixNeighborSwap::restart(char *buf) +{ + int n = 0; + double *list = (double *) buf; + + seed = static_cast (list[n++]); + random_equal->reset(seed); + + seed = static_cast (list[n++]); + random_unequal->reset(seed); + + next_reneighbor = (bigint) ubuf(list[n++]).i; + + nswap_attempts = static_cast(list[n++]); + nswap_successes = static_cast(list[n++]); + + bigint ntimestep_restart = (bigint) ubuf(list[n++]).i; + if (ntimestep_restart != update->ntimestep) + error->all(FLERR,"Must not reset timestep when restarting fix neighbor/swap"); +} diff --git a/src/MC/fix_neighbor_swap.h b/src/MC/fix_neighbor_swap.h new file mode 100755 index 0000000000..1413de2ef8 --- /dev/null +++ b/src/MC/fix_neighbor_swap.h @@ -0,0 +1,146 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(neighbor/swap,FixNeighborSwap); +// clang-format on +#else + +#ifndef LMP_FIX_NEIGH_SWAP_H +#define LMP_FIX_NEIGH_SWAP_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixNeighborSwap : public Fix { + public: + FixNeighborSwap(class LAMMPS *, int, char **); + ~FixNeighborSwap(); + int setmask(); + void init(); + void pre_exchange(); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + double compute_vector(int); + double memory_usage(); + void write_restart(FILE *); + void restart(char *); + + private: + int nevery, seed; + int ke_flag; // yes = conserve ke, no = do not conserve ke + int diff_flag; // yes = simulate diffusion of central atom, no = swap only to certain types + int rates_flag; // yes = use modified type rates, no = swap rates are equivilent across types + int voro_flag; // yes = use given voronoi calculation, no = use internal voronoi calculation + int ncycles; + int niswap, njswap; // # of i,j swap atoms on all procs + int niswap_local, njswap_local; // # of swap atoms on this proc + int niswap_before, njswap_before; // # of swap atoms on procs < this proc + // int global_i_ID; // global id of selected i atom + class Region *region; // swap region + char *idregion; // swap region id + + int nswaptypes; + int jtype_selected; + int id_center; + double x_center; + double y_center; + double z_center; + int *type_list; + double *rate_list; + + double nswap_attempts; + double nswap_successes; + + bool unequal_cutoffs; + + int atom_swap_nmax; + double beta; + double local_probability; // Total swap probability stored on this proc + double global_probability; // Total swap probability across all proc + double prev_probability; // Swap probability on proc < this proc + double *qtype; + double energy_stored; + double **sqrt_mass_ratio; + double **voro_neighbor_list; + int *local_swap_iatom_list; + int *local_swap_neighbor_list; + int *local_swap_type_list; // Type list index of atoms stored on this proc + double *local_swap_probability; + + + class RanPark *random_equal; + class RanPark *random_unequal; + + class Compute *c_voro; + class Compute *c_pe; + + void options(int, char **); + int attempt_swap(); + double energy_full(); + int pick_i_swap_atom(); + int pick_j_swap_neighbor(int); + double get_distance(double[3], double[3]); + void build_i_neighbor_list(int); + void update_iswap_atoms_list(); +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Region ID for fix neighbor/swap does not exist + +Self-explanatory. + +E: Must specify at least 2 types in fix neighbor/swap command + +Self-explanatory. + +E: Need nswaptypes mu values in fix neighbor/swap command + +Self-explanatory. + +E: Invalid atom type in fix neighbor/swap command + +The atom type specified in the neighbor/swap command does not exist. + +E: All atoms of a swapped type must have the same charge. + +Self-explanatory. + +E: At least one atom of each swapped type must be present to define charges. + +Self-explanatory. + +E: All atoms of a swapped type must have same charge. + +Self-explanatory. + +E: Cannot do neighbor/swap on atoms in atom_modify first group + +This is a restriction due to the way atoms are organized in a list to +enable the atom_modify first command. + +*/ From 82569f444826aaad99ff7bd4cdd8d66d1a389f32 Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Thu, 19 Dec 2024 11:29:19 -0700 Subject: [PATCH 02/94] Added documentation files --- doc/src/Commands_fix.rst | 1 + doc/src/fix.rst | 1 + doc/src/fix_neighbor_swap.rst | 169 ++++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 doc/src/fix_neighbor_swap.rst diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index 04d1a9969a..cbadc09880 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -110,6 +110,7 @@ OPT. * :doc:`mvv/tdpd ` * :doc:`neb ` * :doc:`neb/spin ` + * :doc:`neighbor/swap ` * :doc:`nonaffine/displacement ` * :doc:`nph (ko) ` * :doc:`nph/asphere (o) ` diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 9af607601b..a4a9ac4a86 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -289,6 +289,7 @@ accelerated styles exist. * :doc:`mvv/tdpd ` - constant temperature DPD using the modified velocity-Verlet algorithm * :doc:`neb ` - nudged elastic band (NEB) spring forces * :doc:`neb/spin ` - nudged elastic band (NEB) spring forces for spins +* :doc:`neighbor/swap ` - kinetic Monte Calo atom swapping * :doc:`nonaffine/displacement ` - calculate nonaffine displacement of atoms * :doc:`nph ` - constant NPH time integration via Nose/Hoover * :doc:`nph/asphere ` - NPH for aspherical particles diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst new file mode 100644 index 0000000000..a3eb1c6d82 --- /dev/null +++ b/doc/src/fix_neighbor_swap.rst @@ -0,0 +1,169 @@ +.. index:: fix neighbor/swap + +fix neighbor/swap command +===================== + +Syntax +"""""" + +.. code-block:: LAMMPS + + fix ID group-ID neighbor/swap N X seed T R keyword values ... + +* ID, group-ID are documented in :doc:`fix ` command +* neighbor/swap = style name of this fix command +* N = invoke this fix every N steps +* X = number of swaps to attempt every N steps +* seed = random # seed (positive integer) +* T = scaling temperature of the MC swaps (temperature units) +* R = scaling swap probability of the MC swaps (distance units) +* one or more keyword/value pairs may be appended to args +* keyword = *types* or *mu* or *ke* or *semi-grand* or *region* + + .. parsed-literal:: + + *types* values = two or more atom types (1-Ntypes or type label) + *ke* value = *no* or *yes* + *no* = no conservation of kinetic energy after atom swaps + *yes* = kinetic energy is conserved after atom swaps + *region* value = region-ID + region-ID = ID of region to use as an exchange/move volume + *diff* values = one atom type + *voro* values = valid voronoi compute id (compute voronoi/atom) + *rates* values = Ntype values to conduct variable diffusion for different atom types (unitless) + +Examples +"""""""" + +.. code-block:: LAMMPS + + fix mc all neighbor/swap 10 160 15238 1000.0 diff 2 voro voroN + fix myFix all neighbor/swap 100 1 12345 298.0 region my_swap_region types 5 6 voro voroN + fix kmc all neighbor/swap 1 100 345 1.0 diff 3 rates 3 1 6 voro voroN + +Description +""""""""""" + +Computes MC evaluations to enable kinetic Monte Carlo (kMC) behavior +during MD simulation through only allowing neighboring atom swaps. +Neighboring atoms are selected using a Voronoi tesselation approach. This +implementation is as described in :ref:`(Tavenner) `. + +The fix is called every *N* timesteps and attempts *X* swaps. The system +is initialized with a random seed, using a temperature *T* for evaluating +the MC energy swaps. The distance-based probability is weighted according +to *R* which sets the radius :math:`r_0` for the weighting + +.. math:: + + p_{ij} = e^{(\frac{r_{ij}}{r_0})^2} + +where :math:`p_{ij}` is the probability of selecting atoms :math:`i` and :math:`j` for an +evaluated swap. + +The keyword *types* is submitted with two or more atom types as the value. +Atoms of the first atom type are swapped with valid neighbors of all the remaining +atom types. + +The keyword *diff* is used for implementation of simulated diffusion of a given atom type +as given by *diff type*. This command selects all atom types as acceptable swap types to a +centrally selected atom of type *type*. This includes the atom type specified by the diff +keyword to account for self-diffusion hops of an atom type with itself. + +Keyword *voro* is currently required, and is implemented as + +.. code-block:: LAMMPS + voro compute-ID + +where *compute-ID* is the ID of a corresponding Voronoi computation with neighbor list, i.e. + +.. code-block:: LAMMPS + + compute compute-ID group-ID voronoi/atom neighbors yes + +The group selected for computing *voro* should correspond to all the potential atoms to +be swapped at the initial step, i.e. + +.. code-block:: LAMMPS + group group-ID type 2 + +for using *fix neighbor/swap* with *diff 2*. + +The keyword *rates* can modify the swap rate for each swapped type by values +where the adjusted rates values are given in order of increasing atom type. +The number of rates provided must equal the number of atom types in the simulaton. +In the third provided example above, a simulation is conducted with three atom types +where the third atom type is the one sampled for attempted swaps. All three atom +types are considered valid swaps, but atoms of type 1 will be selected three times +as often as atoms of type 2. Conversely, atoms of type 3 are six times more likely to +be selected than atoms of type two and twice as likely as atoms of type 1. + +Finally, the *region* keyword is implemented as in other atomic fixes, where +the *region region-ID* command indicates that atom swaps only be considered in the area +given by *region-ID*. If only atoms of certain groups are expected to be in this region, +the corresponding compute voronoi command can be adjusted accordingly. + +Restart, fix_modify, output, run start/stop, minimize info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +This fix writes the state of the fix to :doc:`binary restart files +`. This includes information about the random number generator +seed, the next timestep for MC exchanges, the number of exchange +attempts and successes, etc. See the :doc:`read_restart ` +command for info on how to re-specify a fix in an input script that +reads a restart file, so that the operation of the fix continues in an +uninterrupted fashion. + +None of the :doc:`fix_modify ` options are relevant to this +fix. + +This fix computes a global vector of length 2, which can be accessed +by various :doc:`output commands `. The vector values are +the following global cumulative quantities: + + #. swap attempts + #. swap accepts + +The vector values calculated by this fix are "intensive". + +No parameter of this fix can be used with the *start/stop* keywords of +the :doc:`run ` command. This fix is not invoked during +:doc:`energy minimization `. + +Restrictions +"""""""""""" + +This fix is part of the MC package. It is only enabled if LAMMPS was +built with that package. See the :doc:`Build package ` +doc page for more info. + +Voronoi compute must be enabled on build. See :doc:`compute voronoi/atom `. +A vaild voronoi command which returns neighboring atoms must be used +and referenced with the *voro* keyword. + +When this fix is used with a :doc:`hybrid pair style ` +system, only swaps between atom types of the same sub-style (or +combination of sub-styles) are permitted. + +If this fix is used with systems that do not have per-type masses +(e.g. atom style sphere), the ke flag must be set to off since the implemented +algorithm will not be able to re-scale velocity properly. + +Related commands +"""""""""""""""" + +:doc:`fix nvt `, :doc:`compute voronoi/atom ` +:doc:`delete_atoms `, :doc:`fix gcmc `, +:doc:`fix atom/swap `, :doc:`fix mol/swap `, :doc:`fix sgcmc ` + +Default +""""""" + +The option defaults are *ke* = yes, *diff* = no, *rates* = 1 for +all atom types. + +---------- + +.. Tavenner: + +**(Tavenner)** J Tavenner, M Mendelev, J Lawson, Computational Materials Science, 218, 111929 (2023). From 4004d263048f914dc93f3332cdbd2106ecbe9163 Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Thu, 19 Dec 2024 12:57:17 -0700 Subject: [PATCH 03/94] Spelling check fix --- src/MC/fix_neighbor_swap.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MC/fix_neighbor_swap.cpp b/src/MC/fix_neighbor_swap.cpp index 52730ee6f5..9bbb777d92 100755 --- a/src/MC/fix_neighbor_swap.cpp +++ b/src/MC/fix_neighbor_swap.cpp @@ -103,7 +103,7 @@ FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : options(narg-7,&arg[7]); - if (voro_flag != 1) error->all(FLERR,"Voro Compute Required for fix neighbor/swap command"); + if (voro_flag != 1) error->all(FLERR,"Voronoi compute required for fix neighbor/swap command"); // random number generator, same for all procs @@ -194,7 +194,7 @@ void FixNeighborSwap::options(int narg, char **arg) iarg++; } } else if (strcmp(arg[iarg],"voro") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + if (iarg + 2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); int icompute = modify->find_compute(utils::strdup(arg[iarg+1])); @@ -208,7 +208,7 @@ void FixNeighborSwap::options(int narg, char **arg) voro_flag = 1; iarg += 2; } else if (strcmp(arg[iarg],"diff") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + if (iarg + 2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); if (nswaptypes != 0) error->all(FLERR,"Illegal fix neighbor/swap command"); type_list[nswaptypes] = utils::numeric(FLERR,arg[iarg+1],false,lmp); diff_flag = 1; From c847ac1fd45259e4bec3618d2ee2153a213a77fe Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Thu, 19 Dec 2024 13:37:30 -0700 Subject: [PATCH 04/94] Removed trailing whitespace --- doc/src/fix_neighbor_swap.rst | 12 ++++++------ src/MC/fix_neighbor_swap.cpp | 30 +++++++++++++++--------------- src/MC/fix_neighbor_swap.h | 4 ++-- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index a3eb1c6d82..e97b8bcbf2 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -70,11 +70,11 @@ as given by *diff type*. This command selects all atom types as acceptable swap centrally selected atom of type *type*. This includes the atom type specified by the diff keyword to account for self-diffusion hops of an atom type with itself. -Keyword *voro* is currently required, and is implemented as +Keyword *voro* is currently required, and is implemented as .. code-block:: LAMMPS voro compute-ID - + where *compute-ID* is the ID of a corresponding Voronoi computation with neighbor list, i.e. .. code-block:: LAMMPS @@ -89,17 +89,17 @@ be swapped at the initial step, i.e. for using *fix neighbor/swap* with *diff 2*. -The keyword *rates* can modify the swap rate for each swapped type by values -where the adjusted rates values are given in order of increasing atom type. +The keyword *rates* can modify the swap rate for each swapped type by values +where the adjusted rates values are given in order of increasing atom type. The number of rates provided must equal the number of atom types in the simulaton. In the third provided example above, a simulation is conducted with three atom types where the third atom type is the one sampled for attempted swaps. All three atom types are considered valid swaps, but atoms of type 1 will be selected three times as often as atoms of type 2. Conversely, atoms of type 3 are six times more likely to -be selected than atoms of type two and twice as likely as atoms of type 1. +be selected than atoms of type two and twice as likely as atoms of type 1. Finally, the *region* keyword is implemented as in other atomic fixes, where -the *region region-ID* command indicates that atom swaps only be considered in the area +the *region region-ID* command indicates that atom swaps only be considered in the area given by *region-ID*. If only atoms of certain groups are expected to be in this region, the corresponding compute voronoi command can be adjusted accordingly. diff --git a/src/MC/fix_neighbor_swap.cpp b/src/MC/fix_neighbor_swap.cpp index 9bbb777d92..1bd9cbbc02 100755 --- a/src/MC/fix_neighbor_swap.cpp +++ b/src/MC/fix_neighbor_swap.cpp @@ -195,7 +195,7 @@ void FixNeighborSwap::options(int narg, char **arg) } } else if (strcmp(arg[iarg],"voro") == 0) { if (iarg + 2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); - + int icompute = modify->find_compute(utils::strdup(arg[iarg+1])); if (icompute < 0) error->all(FLERR,"Could not find neighbor compute ID"); @@ -481,7 +481,7 @@ int FixNeighborSwap::attempt_swap() } energy_stored = energy_after; - // utils::logmesg(lmp,"Swap accepted\n"); + // utils::logmesg(lmp,"Swap accepted\n"); // Swap atom groups if successful swap // int groupi = atom->mask[i]; @@ -498,7 +498,7 @@ int FixNeighborSwap::attempt_swap() // do not need to re-call comm->borders() and rebuild neighbor list // since will be done on next cycle or in Verlet when this fix finishes - // utils::logmesg(lmp,"Swap not accepted\n"); + // utils::logmesg(lmp,"Swap not accepted\n"); if ( i >= 0 ) { atom->type[i] = itype; @@ -613,7 +613,7 @@ double FixNeighborSwap::get_distance(double* i, double* j) // r_x = i[0] - j[0]; // r_y = i[1] - j[1]; // r_z = i[2] - j[2]; - + // // Domain::minimum_image(r_x, r_y, r_z); // double r = sqrt(pow(r_x, 2.) + // pow(r_y, 2.) + @@ -648,7 +648,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) memory->sfree(local_swap_probability); local_swap_probability = (double *) memory->smalloc(atom_swap_nmax*sizeof(double), "MCSWAP:local_swap_probability_list"); - + memory->sfree(local_swap_type_list); local_swap_type_list = (int *) memory->smalloc(atom_swap_nmax*sizeof(int), "MCSWAP:local_swap_type_list"); @@ -656,7 +656,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) // Compute voronoi and access neighbor list c_voro->compute_local(); - + voro_neighbor_list = c_voro->array_local; njswap_local = 0; local_probability = 0.0; @@ -664,7 +664,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) // utils::logmesg(lmp,"Searching for atom {}\n",id_center); for (int n = 0; n < c_voro->size_local_rows; n++){ - + int temp_j_id = -1; int temp_j = -1; @@ -708,13 +708,13 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) if (atom->mask[temp_j] & groupbit) { if (diff_flag) { // Calculate distance from i to each j, adjust probability of selection - + // Get distance if own centr atom double r = INFINITY; if ( i_center >= 0 ){ double r = get_distance(x[temp_j], x[i_center]); } - + // Get local id of ghost center atom when ghost for (int i=nlocal; i < nlocal+nghost; i++){ if ( (id[i] == id_center) && @@ -743,7 +743,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) if ( i_center >= 0 ){ double r = get_distance(x[temp_j], x[i_center]); } - + // Get local id of ghost center atom when ghost for (int i=nlocal; i < nlocal+nghost; i++){ if ( (id[i] == id_center) && @@ -776,7 +776,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) if ( i_center >= 0 ){ r = get_distance(x[temp_j], x[i_center]); } - + // Get local id of ghost center atoms // if ( i_center < 0 ){ // utils::logmesg(lmp,"Initial distance {}\n", r); @@ -788,7 +788,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) } } // } - + // utils::logmesg(lmp,"Final distance {}\n", r); if (rates_flag) { @@ -797,7 +797,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); } local_probability += local_swap_probability[njswap_local]; - + local_swap_type_list[njswap_local] = type[temp_j]; local_swap_neighbor_list[njswap_local] = temp_j; njswap_local++; @@ -810,7 +810,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) if ( i_center >= 0 ){ double r = get_distance(x[temp_j], x[i_center]); } - + // Get local id of ghost center atom when ghost for (int i=nlocal; i < nlocal+nghost; i++){ if ( (id[i] == id_center) && @@ -823,7 +823,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-pow((r/3.), 2.)); } else { local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); - } + } local_probability += local_swap_probability[njswap_local]; local_swap_type_list[njswap_local] = jswaptype; diff --git a/src/MC/fix_neighbor_swap.h b/src/MC/fix_neighbor_swap.h index 1413de2ef8..e53eb9c1c3 100755 --- a/src/MC/fix_neighbor_swap.h +++ b/src/MC/fix_neighbor_swap.h @@ -63,7 +63,7 @@ class FixNeighborSwap : public Fix { double nswap_attempts; double nswap_successes; - + bool unequal_cutoffs; int atom_swap_nmax; @@ -79,7 +79,7 @@ class FixNeighborSwap : public Fix { int *local_swap_neighbor_list; int *local_swap_type_list; // Type list index of atoms stored on this proc double *local_swap_probability; - + class RanPark *random_equal; class RanPark *random_unequal; From 49b2b978e67cd8df42dfddfa7ad5faaa57443fdc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Dec 2024 19:20:51 -0500 Subject: [PATCH 05/94] build system updates to skip fix neighbor/swap if VORONOI package is not installed --- cmake/Modules/Packages/MC.cmake | 10 ++++++++++ src/.gitignore | 2 ++ src/MC/Install.sh | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/Packages/MC.cmake b/cmake/Modules/Packages/MC.cmake index f162254558..2a72a895cf 100644 --- a/cmake/Modules/Packages/MC.cmake +++ b/cmake/Modules/Packages/MC.cmake @@ -7,3 +7,13 @@ if(NOT PKG_MANYBODY) list(REMOVE_ITEM LAMMPS_SOURCES ${LAMMPS_SOURCE_DIR}/MC/fix_sgcmc.cpp) set_property(TARGET lammps PROPERTY SOURCES "${LAMMPS_SOURCES}") endif() + +# fix neighbor/swap may only be installed if also the VORONOI package is installed +if(NOT PKG_VORONOI) + get_property(LAMMPS_FIX_HEADERS GLOBAL PROPERTY FIX) + list(REMOVE_ITEM LAMMPS_FIX_HEADERS ${LAMMPS_SOURCE_DIR}/MC/fix_neighbor_swap.h) + set_property(GLOBAL PROPERTY FIX "${LAMMPS_FIX_HEADERS}") + get_target_property(LAMMPS_SOURCES lammps SOURCES) + list(REMOVE_ITEM LAMMPS_SOURCES ${LAMMPS_SOURCE_DIR}/MC/fix_neighbor_swap.cpp) + set_property(TARGET lammps PROPERTY SOURCES "${LAMMPS_SOURCES}") +endif() diff --git a/src/.gitignore b/src/.gitignore index f0554e3bfe..0f0e3759c9 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -912,6 +912,8 @@ /fix_msst.h /fix_neb.cpp /fix_neb.h +/fix_neighbor_swap.cpp +/fix_neighbor_swap.h /fix_nh_asphere.cpp /fix_nh_asphere.h /fix_nph_asphere.cpp diff --git a/src/MC/Install.sh b/src/MC/Install.sh index 9a0095fd34..efe6b7c07b 100755 --- a/src/MC/Install.sh +++ b/src/MC/Install.sh @@ -51,8 +51,8 @@ action fix_charge_regulation.cpp action fix_charge_regulation.h action fix_gcmc.cpp action fix_gcmc.h -action fix_neighbor_swap.cpp -action fix_neighbor_swap.h +action fix_neighbor_swap.cpp compute_voronoi_atom.cpp +action fix_neighbor_swap.h compute_voronoi_atom.h action fix_mol_swap.cpp action fix_mol_swap.h action fix_sgcmc.cpp pair_eam.cpp From b05172fe9687ba25b65efbb6cd6c47c980d360b1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Dec 2024 19:21:35 -0500 Subject: [PATCH 06/94] spelling fixes and documentation formatting corrections --- doc/src/fix.rst | 2 +- doc/src/fix_neighbor_swap.rst | 90 ++++++++++++--------- doc/utils/sphinx-config/false_positives.txt | 1 + 3 files changed, 52 insertions(+), 41 deletions(-) diff --git a/doc/src/fix.rst b/doc/src/fix.rst index a4a9ac4a86..ae02118bec 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -289,7 +289,7 @@ accelerated styles exist. * :doc:`mvv/tdpd ` - constant temperature DPD using the modified velocity-Verlet algorithm * :doc:`neb ` - nudged elastic band (NEB) spring forces * :doc:`neb/spin ` - nudged elastic band (NEB) spring forces for spins -* :doc:`neighbor/swap ` - kinetic Monte Calo atom swapping +* :doc:`neighbor/swap ` - kinetic Monte Carlo (kMC) atom swapping * :doc:`nonaffine/displacement ` - calculate nonaffine displacement of atoms * :doc:`nph ` - constant NPH time integration via Nose/Hoover * :doc:`nph/asphere ` - NPH for aspherical particles diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index e97b8bcbf2..898957c56c 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -1,7 +1,7 @@ .. index:: fix neighbor/swap fix neighbor/swap command -===================== +========================= Syntax """""" @@ -50,61 +50,69 @@ Neighboring atoms are selected using a Voronoi tesselation approach. This implementation is as described in :ref:`(Tavenner) `. The fix is called every *N* timesteps and attempts *X* swaps. The system -is initialized with a random seed, using a temperature *T* for evaluating -the MC energy swaps. The distance-based probability is weighted according -to *R* which sets the radius :math:`r_0` for the weighting +is initialized with a random seed, using a temperature *T* for +evaluating the MC energy swaps. The distance-based probability is +weighted according to *R* which sets the radius :math:`r_0` for the +weighting .. math:: p_{ij} = e^{(\frac{r_{ij}}{r_0})^2} -where :math:`p_{ij}` is the probability of selecting atoms :math:`i` and :math:`j` for an -evaluated swap. +where :math:`p_{ij}` is the probability of selecting atoms :math:`i` and +:math:`j` for an evaluated swap. -The keyword *types* is submitted with two or more atom types as the value. -Atoms of the first atom type are swapped with valid neighbors of all the remaining -atom types. +The keyword *types* is submitted with two or more atom types as the +value. Atoms of the first atom type are swapped with valid neighbors of +all the remaining atom types. -The keyword *diff* is used for implementation of simulated diffusion of a given atom type -as given by *diff type*. This command selects all atom types as acceptable swap types to a -centrally selected atom of type *type*. This includes the atom type specified by the diff -keyword to account for self-diffusion hops of an atom type with itself. +The keyword *diff* is used for implementation of simulated diffusion of +a given atom type as given by *diff type*. This command selects all atom +types as acceptable swap types to a centrally selected atom of type +*type*. This includes the atom type specified by the diff keyword to +account for self-diffusion hops of an atom type with itself. Keyword *voro* is currently required, and is implemented as .. code-block:: LAMMPS - voro compute-ID -where *compute-ID* is the ID of a corresponding Voronoi computation with neighbor list, i.e. + voro compute-ID + +where *compute-ID* is the ID of a corresponding Voronoi computation with +neighbor list, i.e. .. code-block:: LAMMPS compute compute-ID group-ID voronoi/atom neighbors yes -The group selected for computing *voro* should correspond to all the potential atoms to -be swapped at the initial step, i.e. +The group selected for computing *voro* should correspond to all the +potential atoms to be swapped at the initial step, i.e. .. code-block:: LAMMPS - group group-ID type 2 + + group group-ID type 2 for using *fix neighbor/swap* with *diff 2*. -The keyword *rates* can modify the swap rate for each swapped type by values -where the adjusted rates values are given in order of increasing atom type. -The number of rates provided must equal the number of atom types in the simulaton. -In the third provided example above, a simulation is conducted with three atom types -where the third atom type is the one sampled for attempted swaps. All three atom -types are considered valid swaps, but atoms of type 1 will be selected three times -as often as atoms of type 2. Conversely, atoms of type 3 are six times more likely to -be selected than atoms of type two and twice as likely as atoms of type 1. +The keyword *rates* can modify the swap rate for each swapped type by +values where the adjusted rates values are given in order of increasing +atom type. The number of rates provided must equal the number of atom +types in the simulation. In the third provided example above, a +simulation is conducted with three atom types where the third atom type +is the one sampled for attempted swaps. All three atom types are +considered valid swaps, but atoms of type 1 will be selected three times +as often as atoms of type 2. Conversely, atoms of type 3 are six times +more likely to be selected than atoms of type two and twice as likely as +atoms of type 1. -Finally, the *region* keyword is implemented as in other atomic fixes, where -the *region region-ID* command indicates that atom swaps only be considered in the area -given by *region-ID*. If only atoms of certain groups are expected to be in this region, -the corresponding compute voronoi command can be adjusted accordingly. +Finally, the *region* keyword is implemented as in other atomic fixes, +where the *region region-ID* command indicates that atom swaps only be +considered in the area given by *region-ID*. If only atoms of certain +groups are expected to be in this region, the corresponding compute +voronoi command can be adjusted accordingly. Restart, fix_modify, output, run start/stop, minimize info -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" This fix writes the state of the fix to :doc:`binary restart files `. This includes information about the random number generator @@ -135,10 +143,11 @@ Restrictions This fix is part of the MC package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` -doc page for more info. +doc page for more info. Also this fix requires that the +:ref:`VORONOI package ` is installed, otherwise the fix +will not be compiled. -Voronoi compute must be enabled on build. See :doc:`compute voronoi/atom `. -A vaild voronoi command which returns neighboring atoms must be used +A valid voronoi command which returns neighboring atoms must be used and referenced with the *voro* keyword. When this fix is used with a :doc:`hybrid pair style ` @@ -146,24 +155,25 @@ system, only swaps between atom types of the same sub-style (or combination of sub-styles) are permitted. If this fix is used with systems that do not have per-type masses -(e.g. atom style sphere), the ke flag must be set to off since the implemented -algorithm will not be able to re-scale velocity properly. +(e.g. atom style sphere), the ke flag must be set to off since the +implemented algorithm will not be able to re-scale velocity properly. Related commands """""""""""""""" :doc:`fix nvt `, :doc:`compute voronoi/atom ` :doc:`delete_atoms `, :doc:`fix gcmc `, -:doc:`fix atom/swap `, :doc:`fix mol/swap `, :doc:`fix sgcmc ` +:doc:`fix atom/swap `, :doc:`fix mol/swap `, +:doc:`fix sgcmc ` Default """"""" -The option defaults are *ke* = yes, *diff* = no, *rates* = 1 for -all atom types. +The option defaults are *ke* = yes, *diff* = no, *rates* = 1 for all +atom types. ---------- -.. Tavenner: +.. _Tavenner: **(Tavenner)** J Tavenner, M Mendelev, J Lawson, Computational Materials Science, 218, 111929 (2023). diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 67db18a17d..4d2b6f5d68 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1812,6 +1812,7 @@ Kloss Kloza kmax Kmax +kMC KMP kmu Knizhnik From 8a89d2fcf6f19b932abc20c440ea2016ac43fe79 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Dec 2024 19:22:02 -0500 Subject: [PATCH 07/94] no more error lists in headers --- src/MC/fix_neighbor_swap.h | 43 -------------------------------------- 1 file changed, 43 deletions(-) diff --git a/src/MC/fix_neighbor_swap.h b/src/MC/fix_neighbor_swap.h index e53eb9c1c3..df75505a6d 100755 --- a/src/MC/fix_neighbor_swap.h +++ b/src/MC/fix_neighbor_swap.h @@ -101,46 +101,3 @@ class FixNeighborSwap : public Fix { #endif #endif - -/* ERROR/WARNING messages: - -E: Illegal ... command - -Self-explanatory. Check the input script syntax and compare to the -documentation for the command. You can use -echo screen as a -command-line option when running LAMMPS to see the offending line. - -E: Region ID for fix neighbor/swap does not exist - -Self-explanatory. - -E: Must specify at least 2 types in fix neighbor/swap command - -Self-explanatory. - -E: Need nswaptypes mu values in fix neighbor/swap command - -Self-explanatory. - -E: Invalid atom type in fix neighbor/swap command - -The atom type specified in the neighbor/swap command does not exist. - -E: All atoms of a swapped type must have the same charge. - -Self-explanatory. - -E: At least one atom of each swapped type must be present to define charges. - -Self-explanatory. - -E: All atoms of a swapped type must have same charge. - -Self-explanatory. - -E: Cannot do neighbor/swap on atoms in atom_modify first group - -This is a restriction due to the way atoms are organized in a list to -enable the atom_modify first command. - -*/ From 3c0d4c8e145140fac912619da6e15bebadcddaff Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Dec 2024 19:36:36 -0500 Subject: [PATCH 08/94] add versionadded tag --- doc/src/fix_neighbor_swap.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 898957c56c..3c97400d3f 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -44,6 +44,8 @@ Examples Description """"""""""" +.. versionadded:: TBD + Computes MC evaluations to enable kinetic Monte Carlo (kMC) behavior during MD simulation through only allowing neighboring atom swaps. Neighboring atoms are selected using a Voronoi tesselation approach. This From 42b6308e2669ec7d8bcfdbc6c56ccf4505abf334 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Dec 2024 19:37:22 -0500 Subject: [PATCH 09/94] remove commented out debug code, replace pow(x,2.0) with MathSpecial::square() --- src/MC/fix_neighbor_swap.cpp | 174 +++++++++-------------------------- 1 file changed, 44 insertions(+), 130 deletions(-) diff --git a/src/MC/fix_neighbor_swap.cpp b/src/MC/fix_neighbor_swap.cpp index 1bd9cbbc02..703207783a 100755 --- a/src/MC/fix_neighbor_swap.cpp +++ b/src/MC/fix_neighbor_swap.cpp @@ -31,6 +31,7 @@ #include "group.h" #include "improper.h" #include "kspace.h" +#include "math_special.h" #include "memory.h" #include "modify.h" #include "neighbor.h" @@ -68,9 +69,7 @@ FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : sqrt_mass_ratio(nullptr), local_swap_iatom_list(nullptr), random_equal(nullptr), random_unequal(nullptr), c_pe(nullptr) { - if (narg < 10) error->all(FLERR,"Illegal fix neighbor/swap command"); - - // utils::logmesg(lmp,"Starting neighbor/swap\n"); + if (narg < 10) utils::missing_cmd_args(FLERR,"fix neighbor/swap", error); dynamic_group_allow = 1; @@ -88,11 +87,10 @@ FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : seed = utils::inumeric(FLERR,arg[5],false,lmp); double temperature = utils::numeric(FLERR,arg[6],false,lmp); - if (nevery <= 0) error->all(FLERR,"Illegal fix neighbor/swap command"); - if (ncycles < 0) error->all(FLERR,"Illegal fix neighbor/swap command"); - // if (nevery < ncycles) error->all(FLERR,"Illegal fix neighbor/swap command"); - if (seed <= 0) error->all(FLERR,"Illegal fix neighbor/swap command"); - if (temperature <= 0.0) error->all(FLERR,"Illegal fix neighbor/swap command"); + if (nevery <= 0) error->all(FLERR,"Illegal fix neighbor/swap command nevery value"); + if (ncycles < 0) error->all(FLERR,"Illegal fix neighbor/swap command ncycles value"); + if (seed <= 0) error->all(FLERR,"Illegal fix neighbor/swap command seed value"); + if (temperature <= 0.0) error->all(FLERR,"Illegal fix neighbor/swap command temperature value"); beta = 1.0 / (force->boltz * temperature); @@ -170,7 +168,6 @@ void FixNeighborSwap::options(int narg, char **arg) int iarg = 0; while (iarg < narg) { - // utils::logmesg(lmp,"Parsing Argument {}\n", arg[iarg]); if (strcmp(arg[iarg],"region") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); region = domain->get_region_by_id(arg[iarg+1]); @@ -216,7 +213,6 @@ void FixNeighborSwap::options(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg],"rates") == 0) { if (iarg+atom->ntypes >= narg) error->all(FLERR,"Illegal fix neighbor/swap command"); - // utils::logmesg(lmp,"Reading rates\n"); iarg++; int i = 0; while (iarg < narg) { @@ -246,7 +242,6 @@ int FixNeighborSwap::setmask() void FixNeighborSwap::init() { - // utils::logmesg(lmp,"Initializing neighbor/swap\n"); c_pe = modify->get_compute_by_id("thermo_pe"); int *type = atom->type; @@ -321,10 +316,7 @@ void FixNeighborSwap::init() int flagall; MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); - if (flagall) - error->all(FLERR,"Cannot do neighbor/swap on atoms in atom_modify first group"); - - // utils::logmesg(lmp,"Done Init\n"); + if (flagall) error->all(FLERR,"Cannot do neighbor/swap on atoms in atom_modify first group"); } } @@ -355,15 +347,10 @@ void FixNeighborSwap::pre_exchange() // attempt Ncycle atom swaps - // utils::logmesg(lmp,"Attempting Swap\n"); - int nsuccess = 0; update_iswap_atoms_list(); - // utils::logmesg(lmp,"Updated Atom i List\n"); for (int i = 0; i < ncycles; i++) nsuccess += attempt_swap(); - // utils::logmesg(lmp,"\n"); - // udpate MC stats nswap_attempts += ncycles; @@ -398,36 +385,17 @@ int FixNeighborSwap::attempt_swap() // build nearest-neighbor list based on atom i build_i_neighbor_list(i); - // utils::logmesg(lmp,"Built neighbor list with {} atoms\n",njswap); - if ( njswap <= 0 ) { - // utils::logmesg(lmp,"No valid neighbors found\n"); - return 0; - } + if ( njswap <= 0 ) return 0; // pick a neighbor atom j based on i neighbor list jtype_selected = -1; int j = pick_j_swap_neighbor(i); - // utils::logmesg(lmp,"Selected swap neighbor j\n"); int itype = type_list[0]; int jtype = jtype_selected; - // utils::logmesg(lmp,"Selected atom j type {}\n",jtype); - - // utils::logmesg(lmp,"Swapping local atoms {} and ",i); - // utils::logmesg(lmp,"{}\n",j); - - // if ( i >= 0 || j >= 0) { - // utils::logmesg(lmp,"Selected atom j type {}\n",jtype); - // utils::logmesg(lmp,"Swapping atoms {} and ",id[i]); - // utils::logmesg(lmp,"{}\n",id[j]); - // } - - // utils::logmesg(lmp,"Atom type {} and ",itype); - // utils::logmesg(lmp,"{}\n",jtype); // Accept swap if types are equal, no change to system - if ( itype == jtype ){ - // utils::logmesg(lmp,"Atoms have same type, no processing needed\n"); + if ( itype == jtype ) { return 1; } @@ -480,16 +448,6 @@ int FixNeighborSwap::attempt_swap() } } energy_stored = energy_after; - - // utils::logmesg(lmp,"Swap accepted\n"); - // Swap atom groups if successful swap - - // int groupi = atom->mask[i]; - // int groupj = atom->mask[j]; - - // atom->mask[i] = group->bitmask[groupj]; - // atom->mask[j] = group->bitmask[groupi]; - return 1; } @@ -498,8 +456,6 @@ int FixNeighborSwap::attempt_swap() // do not need to re-call comm->borders() and rebuild neighbor list // since will be done on next cycle or in Verlet when this fix finishes - // utils::logmesg(lmp,"Swap not accepted\n"); - if ( i >= 0 ) { atom->type[i] = itype; if (atom->q_flag) atom->q[i] = qtype[0]; @@ -529,7 +485,7 @@ double FixNeighborSwap::energy_full() if (force->bond) force->bond->compute(eflag,vflag); if (force->angle) force->angle->compute(eflag,vflag); if (force->dihedral) force->dihedral->compute(eflag,vflag); - if (force->improper) force->improper->compute(eflag,vflag); + if (force->improper) force->improper->compute(eflag,vflag); } if (force->kspace) force->kspace->compute(eflag,vflag); @@ -576,21 +532,17 @@ int FixNeighborSwap::pick_j_swap_neighbor(int i) // Generate random double from 0 to maximum global probability double selected_prob = static_cast (global_probability*random_equal->uniform()); - // utils::logmesg(lmp,"Local Probability {}\n",local_probability); - // Find which local swap atom corresponds to probability if ((selected_prob >= prev_probability) && - (selected_prob < prev_probability + local_probability)){ - // utils::logmesg(lmp,"Selected Probability {}\n",selected_prob); + (selected_prob < prev_probability + local_probability)) { double search_prob = selected_prob - prev_probability; - for (int n = 0; n < njswap_local; n++){ - if (search_prob > local_swap_probability[n]){ + for (int n = 0; n < njswap_local; n++) { + if (search_prob > local_swap_probability[n]) { search_prob -= local_swap_probability[n]; } else{ j = local_swap_neighbor_list[n]; jtype_selected_local = local_swap_type_list[n]; - // utils::logmesg(lmp,"Selecting Atom j type {}\n",jtype_selected_local); MPI_Allreduce(&jtype_selected_local,&jtype_selected,1,MPI_INT,MPI_MAX,world); return j; } @@ -598,7 +550,6 @@ int FixNeighborSwap::pick_j_swap_neighbor(int i) error->all(FLERR,"Did not select local neighbor swap atom"); } - // utils::logmesg(lmp,"Swap atom not found on processor\n"); MPI_Allreduce(&jtype_selected_local,&jtype_selected,1,MPI_INT,MPI_MAX,world); return j; } @@ -608,22 +559,9 @@ int FixNeighborSwap::pick_j_swap_neighbor(int i) double FixNeighborSwap::get_distance(double* i, double* j) { - // double r_x, r_y, r_z; - - // r_x = i[0] - j[0]; - // r_y = i[1] - j[1]; - // r_z = i[2] - j[2]; - - // // Domain::minimum_image(r_x, r_y, r_z); - // double r = sqrt(pow(r_x, 2.) + - // pow(r_y, 2.) + - // pow(r_z, 2.)); - - double r = sqrt(pow((i[0] - j[0]), 2.) + - pow((i[1] - j[1]), 2.) + - pow((i[2] - j[2]), 2.)); - - + double r = sqrt(MathSpecial::square((i[0] - j[0])) + + MathSpecial::square((i[1] - j[1])) + + MathSpecial::square((i[2] - j[2]))); return r; } @@ -661,19 +599,17 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) njswap_local = 0; local_probability = 0.0; - // utils::logmesg(lmp,"Searching for atom {}\n",id_center); - - for (int n = 0; n < c_voro->size_local_rows; n++){ + for (int n = 0; n < c_voro->size_local_rows; n++) { int temp_j_id = -1; int temp_j = -1; // Find local voronoi entry with selected central atom - if ( (int)voro_neighbor_list[n][0] == id_center ){ + if ( (int)voro_neighbor_list[n][0] == id_center ) { temp_j_id = voro_neighbor_list[n][1]; temp_j = -1; } else if ( ((int)voro_neighbor_list[n][1] == id_center) && - ( i_center < 0 ) ){ + ( i_center < 0 ) ) { temp_j_id = voro_neighbor_list[n][0]; temp_j = -1; } else { @@ -681,10 +617,9 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) } // Find which local atom corresponds to neighbor - for (int j = 0; j < nlocal; j++){ - if ( temp_j_id == id[j] ){ + for (int j = 0; j < nlocal; j++) { + if ( temp_j_id == id[j] ) { temp_j = j; - // utils::logmesg(lmp,"Found neighbor {}\n",id[j]); break; } } @@ -692,17 +627,6 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) // If temp_j not on this processor, skip if ( temp_j < 0 ) continue; - // // If atom is already in local list, skip - // bool inlist = false; - // for ( int j = 0; j < njswap_local; j++ ){ - // if ( temp_j == local_swap_neighbor_list[j] ){ - // utils::logmesg(lmp,"Skipping atom {}, pair already counted\n",id[temp_j]); - // inlist = true; - // break; - // } - // } - // if (inlist) continue; - if (region) { if (region->match(x[temp_j][0],x[temp_j][1],x[temp_j][2]) == 1) { if (atom->mask[temp_j] & groupbit) { @@ -711,51 +635,49 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) // Get distance if own centr atom double r = INFINITY; - if ( i_center >= 0 ){ + if ( i_center >= 0 ) { double r = get_distance(x[temp_j], x[i_center]); } // Get local id of ghost center atom when ghost - for (int i=nlocal; i < nlocal+nghost; i++){ + for (int i=nlocal; i < nlocal+nghost; i++) { if ( (id[i] == id_center) && - (get_distance(x[temp_j], x[i]) < r) ){ + (get_distance(x[temp_j], x[i]) < r) ) { r = get_distance(x[temp_j], x[i]); } } if (rates_flag) { - local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-pow((r/3.), 2.)); + local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-MathSpecial::square(r/3.0)); } else { - local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r/3.0)); } local_probability += local_swap_probability[njswap_local]; - - // utils::logmesg(lmp,"Adding Atom j type {}\n",type[temp_j]); local_swap_type_list[njswap_local] = type[temp_j]; local_swap_neighbor_list[njswap_local] = temp_j; njswap_local++; } else { - for (int jswaptype = 1; jswaptype < nswaptypes; jswaptype++){ + for (int jswaptype = 1; jswaptype < nswaptypes; jswaptype++) { if (type[temp_j] == type_list[jswaptype]) { // Calculate distance from i to each j, adjust probability of selection // Get distance if own center atom double r = INFINITY; - if ( i_center >= 0 ){ + if ( i_center >= 0 ) { double r = get_distance(x[temp_j], x[i_center]); } // Get local id of ghost center atom when ghost - for (int i=nlocal; i < nlocal+nghost; i++){ + for (int i=nlocal; i < nlocal+nghost; i++) { if ( (id[i] == id_center) && - (get_distance(x[temp_j], x[i]) < r) ){ + (get_distance(x[temp_j], x[i]) < r) ) { r = get_distance(x[temp_j], x[i]); } } if (rates_flag) { - local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-pow((r/3.), 2.)); + local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-MathSpecial::square(r/3.0)); } else { - local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r/3.0)); } local_probability += local_swap_probability[njswap_local]; @@ -773,28 +695,20 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) // Calculate distance from i to each j, adjust probability of selection // Get distance if own center atom double r = INFINITY; - if ( i_center >= 0 ){ + if ( i_center >= 0 ) { r = get_distance(x[temp_j], x[i_center]); } // Get local id of ghost center atoms - // if ( i_center < 0 ){ - // utils::logmesg(lmp,"Initial distance {}\n", r); - for (int i=nlocal; i < nlocal+nghost; i++){ - if ( (id[i] == id_center) && - (get_distance(x[temp_j], x[i]) < r) ){ - r = get_distance(x[temp_j], x[i]); - // utils::logmesg(lmp,"Updated distance {}\n", r); - } + for (int i=nlocal; i < nlocal+nghost; i++) { + if ( (id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r) ) + r = get_distance(x[temp_j], x[i]); } - // } - - // utils::logmesg(lmp,"Final distance {}\n", r); if (rates_flag) { - local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-pow((r/3.), 2.)); + local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-MathSpecial::square(r/3.0)); } else{ - local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r/3.0)); } local_probability += local_swap_probability[njswap_local]; @@ -802,27 +716,27 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) local_swap_neighbor_list[njswap_local] = temp_j; njswap_local++; } else { - for (int jswaptype = 1; jswaptype < nswaptypes; jswaptype++){ + for (int jswaptype = 1; jswaptype < nswaptypes; jswaptype++) { if (type[temp_j] == type_list[jswaptype]) { // Calculate distance from i to each j, adjust probability of selection // Get distance if own center atom double r = INFINITY; - if ( i_center >= 0 ){ + if ( i_center >= 0 ) { double r = get_distance(x[temp_j], x[i_center]); } // Get local id of ghost center atom when ghost - for (int i=nlocal; i < nlocal+nghost; i++){ + for (int i=nlocal; i < nlocal+nghost; i++) { if ( (id[i] == id_center) && - (get_distance(x[temp_j], x[i]) < r) ){ + (get_distance(x[temp_j], x[i]) < r)) { r = get_distance(x[temp_j], x[i]); } } if (rates_flag) { - local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-pow((r/3.), 2.)); + local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-MathSpecial::square(r/3.0)); } else { - local_swap_probability[njswap_local] = exp(-pow((r/3.), 2.)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r/3.0)); } local_probability += local_swap_probability[njswap_local]; From 60b0ef68a60e1dccb5a7341f7c748985bd27f104 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Dec 2024 19:39:19 -0500 Subject: [PATCH 10/94] enable and apply clang-format --- src/MC/fix_neighbor_swap.cpp | 360 +++++++++++++++++------------------ src/MC/fix_neighbor_swap.h | 21 +- 2 files changed, 185 insertions(+), 196 deletions(-) diff --git a/src/MC/fix_neighbor_swap.cpp b/src/MC/fix_neighbor_swap.cpp index 703207783a..95e74bee22 100755 --- a/src/MC/fix_neighbor_swap.cpp +++ b/src/MC/fix_neighbor_swap.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -23,6 +22,7 @@ #include "bond.h" #include "comm.h" #include "compute.h" +#include "compute_voronoi_atom.h" #include "dihedral.h" #include "domain.h" #include "error.h" @@ -39,37 +39,36 @@ #include "random_park.h" #include "region.h" #include "update.h" -#include "compute_voronoi_atom.h" -#include #include #include +#include #include using namespace LAMMPS_NS; using namespace FixConst; static const char cite_fix_neighbor_swap_c[] = - "fix neighbor/swap command: doi:10.1016/j.commatsci.2022.111929\n\n" - "@Article{Tavenner2023111929,\n" - " author = {Jacob P. Tavenner and Mikhail I. Mendelev and John W. Lawson},\n" - " title = {Molecular dynamics based kinetic Monte Carlo simulation for accelerated diffusion},\n" - " journal = {Computational Materials Science},\n" - " year = {2023},\n" - " volume = {218},\n" - " pages = {111929}\n" - " url = {https://www.sciencedirect.com/science/article/pii/S0927025622006401}\n" - "}\n\n"; + "fix neighbor/swap command: doi:10.1016/j.commatsci.2022.111929\n\n" + "@Article{Tavenner2023111929,\n" + " author = {Jacob P. Tavenner and Mikhail I. Mendelev and John W. Lawson},\n" + " title = {Molecular dynamics based kinetic Monte Carlo simulation for accelerated " + "diffusion},\n" + " journal = {Computational Materials Science},\n" + " year = {2023},\n" + " volume = {218},\n" + " pages = {111929}\n" + " url = {https://www.sciencedirect.com/science/article/pii/S0927025622006401}\n" + "}\n\n"; /* ---------------------------------------------------------------------- */ FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), region(nullptr), idregion(nullptr), type_list(nullptr), - qtype(nullptr), c_voro(nullptr), voro_neighbor_list(nullptr), - sqrt_mass_ratio(nullptr), local_swap_iatom_list(nullptr), - random_equal(nullptr), random_unequal(nullptr), c_pe(nullptr) + Fix(lmp, narg, arg), region(nullptr), idregion(nullptr), type_list(nullptr), qtype(nullptr), + c_voro(nullptr), voro_neighbor_list(nullptr), sqrt_mass_ratio(nullptr), + local_swap_iatom_list(nullptr), random_equal(nullptr), random_unequal(nullptr), c_pe(nullptr) { - if (narg < 10) utils::missing_cmd_args(FLERR,"fix neighbor/swap", error); + if (narg < 10) utils::missing_cmd_args(FLERR, "fix neighbor/swap", error); dynamic_group_allow = 1; @@ -82,34 +81,34 @@ FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : // required args - nevery = utils::inumeric(FLERR,arg[3],false,lmp); - ncycles = utils::inumeric(FLERR,arg[4],false,lmp); - seed = utils::inumeric(FLERR,arg[5],false,lmp); - double temperature = utils::numeric(FLERR,arg[6],false,lmp); + nevery = utils::inumeric(FLERR, arg[3], false, lmp); + ncycles = utils::inumeric(FLERR, arg[4], false, lmp); + seed = utils::inumeric(FLERR, arg[5], false, lmp); + double temperature = utils::numeric(FLERR, arg[6], false, lmp); - if (nevery <= 0) error->all(FLERR,"Illegal fix neighbor/swap command nevery value"); - if (ncycles < 0) error->all(FLERR,"Illegal fix neighbor/swap command ncycles value"); - if (seed <= 0) error->all(FLERR,"Illegal fix neighbor/swap command seed value"); - if (temperature <= 0.0) error->all(FLERR,"Illegal fix neighbor/swap command temperature value"); + if (nevery <= 0) error->all(FLERR, "Illegal fix neighbor/swap command nevery value"); + if (ncycles < 0) error->all(FLERR, "Illegal fix neighbor/swap command ncycles value"); + if (seed <= 0) error->all(FLERR, "Illegal fix neighbor/swap command seed value"); + if (temperature <= 0.0) error->all(FLERR, "Illegal fix neighbor/swap command temperature value"); beta = 1.0 / (force->boltz * temperature); - memory->create(type_list,atom->ntypes,"neighbor/swap:type_list"); - memory->create(rate_list,atom->ntypes,"neighbor/swap:rate_list"); + memory->create(type_list, atom->ntypes, "neighbor/swap:type_list"); + memory->create(rate_list, atom->ntypes, "neighbor/swap:rate_list"); // read options from end of input line - options(narg-7,&arg[7]); + options(narg - 7, &arg[7]); - if (voro_flag != 1) error->all(FLERR,"Voronoi compute required for fix neighbor/swap command"); + if (voro_flag != 1) error->all(FLERR, "Voronoi compute required for fix neighbor/swap command"); // random number generator, same for all procs - random_equal = new RanPark(lmp,seed); + random_equal = new RanPark(lmp, seed); // random number generator, not the same for all procs - random_unequal = new RanPark(lmp,seed); + random_unequal = new RanPark(lmp, seed); // set up reneighboring @@ -130,9 +129,10 @@ FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : // set comm size needed by this Fix - if (atom->q_flag) comm_forward = 2; - else comm_forward = 1; - + if (atom->q_flag) + comm_forward = 2; + else + comm_forward = 1; } /* ---------------------------------------------------------------------- */ @@ -158,7 +158,7 @@ FixNeighborSwap::~FixNeighborSwap() void FixNeighborSwap::options(int narg, char **arg) { - if (narg < 0) error->all(FLERR,"Illegal fix neighbor/swap command\n"); + if (narg < 0) error->all(FLERR, "Illegal fix neighbor/swap command\n"); ke_flag = 1; diff_flag = 0; @@ -168,64 +168,64 @@ void FixNeighborSwap::options(int narg, char **arg) int iarg = 0; while (iarg < narg) { - if (strcmp(arg[iarg],"region") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); - region = domain->get_region_by_id(arg[iarg+1]); - if (!region) error->all(FLERR,"Region ID for fix neighbor/swap does not exist"); + if (strcmp(arg[iarg], "region") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); + region = domain->get_region_by_id(arg[iarg + 1]); + if (!region) error->all(FLERR, "Region ID for fix neighbor/swap does not exist"); idregion = utils::strdup(arg[iarg + 1]); iarg += 2; - } else if (strcmp(arg[iarg],"ke") == 0) { - if (iarg + 2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); - ke_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "ke") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); + ke_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else if (strcmp(arg[iarg],"types") == 0) { - if (iarg + 3 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); - if (diff_flag != 0) error->all(FLERR,"Illegal fix neighbor/swap command"); + } else if (strcmp(arg[iarg], "types") == 0) { + if (iarg + 3 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); + if (diff_flag != 0) error->all(FLERR, "Illegal fix neighbor/swap command"); iarg++; nswaptypes = 0; while (iarg < narg) { if (isalpha(arg[iarg][0])) break; - if (nswaptypes >= atom->ntypes) error->all(FLERR,"Illegal fix neighbor/swap command"); - type_list[nswaptypes] = utils::numeric(FLERR,arg[iarg],false,lmp); + if (nswaptypes >= atom->ntypes) error->all(FLERR, "Illegal fix neighbor/swap command"); + type_list[nswaptypes] = utils::numeric(FLERR, arg[iarg], false, lmp); nswaptypes++; iarg++; } - } else if (strcmp(arg[iarg],"voro") == 0) { - if (iarg + 2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + } else if (strcmp(arg[iarg], "voro") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); - int icompute = modify->find_compute(utils::strdup(arg[iarg+1])); + int icompute = modify->find_compute(utils::strdup(arg[iarg + 1])); - if (icompute < 0) error->all(FLERR,"Could not find neighbor compute ID"); + if (icompute < 0) error->all(FLERR, "Could not find neighbor compute ID"); c_voro = modify->compute[icompute]; if (c_voro->local_flag == 0) - error->all(FLERR,"Neighbor compute does not compute local info"); + error->all(FLERR, "Neighbor compute does not compute local info"); if (c_voro->size_local_cols != 3) - error->all(FLERR,"Neighbor compute does not give i, j, size as expected"); + error->all(FLERR, "Neighbor compute does not give i, j, size as expected"); voro_flag = 1; iarg += 2; - } else if (strcmp(arg[iarg],"diff") == 0) { - if (iarg + 2 > narg) error->all(FLERR,"Illegal fix neighbor/swap command"); - if (nswaptypes != 0) error->all(FLERR,"Illegal fix neighbor/swap command"); - type_list[nswaptypes] = utils::numeric(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "diff") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); + if (nswaptypes != 0) error->all(FLERR, "Illegal fix neighbor/swap command"); + type_list[nswaptypes] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); diff_flag = 1; nswaptypes++; iarg += 2; - } else if (strcmp(arg[iarg],"rates") == 0) { - if (iarg+atom->ntypes >= narg) error->all(FLERR,"Illegal fix neighbor/swap command"); + } else if (strcmp(arg[iarg], "rates") == 0) { + if (iarg + atom->ntypes >= narg) error->all(FLERR, "Illegal fix neighbor/swap command"); iarg++; int i = 0; while (iarg < narg) { if (isalpha(arg[iarg][0])) break; - if (i >= atom->ntypes) error->all(FLERR,"Illegal fix neighbor/swap command"); - rate_list[i] = utils::numeric(FLERR,arg[iarg],false,lmp); + if (i >= atom->ntypes) error->all(FLERR, "Illegal fix neighbor/swap command"); + rate_list[i] = utils::numeric(FLERR, arg[iarg], false, lmp); i++; iarg++; } rates_flag = 1; - if (i != atom->ntypes) error->all(FLERR,"Illegal fix neighbor/swap command"); - } - else error->all(FLERR,"Illegal fix neighbor/swap command"); + if (i != atom->ntypes) error->all(FLERR, "Illegal fix neighbor/swap command"); + } else + error->all(FLERR, "Illegal fix neighbor/swap command"); } } @@ -246,7 +246,8 @@ void FixNeighborSwap::init() int *type = atom->type; - if (nswaptypes < 2 && !diff_flag) error->all(FLERR,"Must specify at least 2 types in fix neighbor/swap command"); + if (nswaptypes < 2 && !diff_flag) + error->all(FLERR, "Must specify at least 2 types in fix neighbor/swap command"); // set index and check validity of region @@ -257,12 +258,12 @@ void FixNeighborSwap::init() for (int iswaptype = 0; iswaptype < nswaptypes; iswaptype++) if (type_list[iswaptype] <= 0 || type_list[iswaptype] > atom->ntypes) - error->all(FLERR,"Invalid atom type in fix neighbor/swap command"); + error->all(FLERR, "Invalid atom type in fix neighbor/swap command"); if (atom->q_flag) { - double qmax,qmin; - int firstall,first; - memory->create(qtype,nswaptypes,"neighbor/swap:qtype"); + double qmax, qmin; + int firstall, first; + memory->create(qtype, nswaptypes, "neighbor/swap:qtype"); for (int iswaptype = 0; iswaptype < nswaptypes; iswaptype++) { first = 1; for (int i = 0; i < atom->nlocal; i++) { @@ -272,24 +273,27 @@ void FixNeighborSwap::init() qtype[iswaptype] = atom->q[i]; first = 0; } else if (qtype[iswaptype] != atom->q[i]) - error->one(FLERR,"All atoms of a swapped type must have the same charge."); + error->one(FLERR, "All atoms of a swapped type must have the same charge."); } } } - MPI_Allreduce(&first,&firstall,1,MPI_INT,MPI_MIN,world); - if (firstall) error->all(FLERR,"At least one atom of each swapped type must be present to define charges."); + MPI_Allreduce(&first, &firstall, 1, MPI_INT, MPI_MIN, world); + if (firstall) + error->all(FLERR, + "At least one atom of each swapped type must be present to define charges."); if (first) qtype[iswaptype] = -DBL_MAX; - MPI_Allreduce(&qtype[iswaptype],&qmax,1,MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&qtype[iswaptype], &qmax, 1, MPI_DOUBLE, MPI_MAX, world); if (first) qtype[iswaptype] = DBL_MAX; - MPI_Allreduce(&qtype[iswaptype],&qmin,1,MPI_DOUBLE,MPI_MIN,world); - if (qmax != qmin) error->all(FLERR,"All atoms of a swapped type must have same charge."); + MPI_Allreduce(&qtype[iswaptype], &qmin, 1, MPI_DOUBLE, MPI_MIN, world); + if (qmax != qmin) error->all(FLERR, "All atoms of a swapped type must have same charge."); } } - memory->create(sqrt_mass_ratio,atom->ntypes+1,atom->ntypes+1,"neighbor/swap:sqrt_mass_ratio"); + memory->create(sqrt_mass_ratio, atom->ntypes + 1, atom->ntypes + 1, + "neighbor/swap:sqrt_mass_ratio"); for (int itype = 1; itype <= atom->ntypes; itype++) for (int jtype = 1; jtype <= atom->ntypes; jtype++) - sqrt_mass_ratio[itype][jtype] = sqrt(atom->mass[itype]/atom->mass[jtype]); + sqrt_mass_ratio[itype][jtype] = sqrt(atom->mass[itype] / atom->mass[jtype]); // check to see if itype and jtype cutoffs are the same // if not, reneighboring will be needed between swaps @@ -314,9 +318,9 @@ void FixNeighborSwap::init() if ((mask[i] == groupbit) && (mask[i] && firstgroupbit)) flag = 1; int flagall; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); + MPI_Allreduce(&flag, &flagall, 1, MPI_INT, MPI_SUM, world); - if (flagall) error->all(FLERR,"Cannot do neighbor/swap on atoms in atom_modify first group"); + if (flagall) error->all(FLERR, "Cannot do neighbor/swap on atoms in atom_modify first group"); } } @@ -336,7 +340,7 @@ void FixNeighborSwap::pre_exchange() domain->pbc(); comm->exchange(); comm->borders(); - if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + if (domain->triclinic) domain->lamda2x(atom->nlocal + atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); neighbor->build(1); @@ -369,7 +373,7 @@ int FixNeighborSwap::attempt_swap() // int nlocal = atom->nlocal; tagint *id = atom->tag; - if ( niswap == 0 ) return 0; + if (niswap == 0) return 0; // pre-swap energy @@ -385,7 +389,7 @@ int FixNeighborSwap::attempt_swap() // build nearest-neighbor list based on atom i build_i_neighbor_list(i); - if ( njswap <= 0 ) return 0; + if (njswap <= 0) return 0; // pick a neighbor atom j based on i neighbor list jtype_selected = -1; @@ -395,16 +399,14 @@ int FixNeighborSwap::attempt_swap() int jtype = jtype_selected; // Accept swap if types are equal, no change to system - if ( itype == jtype ) { - return 1; - } + if (itype == jtype) { return 1; } // swap their properties - if ( i >= 0 ) { + if (i >= 0) { atom->type[i] = jtype; if (atom->q_flag) atom->q[i] = qtype[jtype_selected]; } - if ( j >= 0 ) { + if (j >= 0) { atom->type[j] = itype; if (atom->q_flag) atom->q[j] = qtype[0]; } @@ -418,7 +420,7 @@ int FixNeighborSwap::attempt_swap() domain->pbc(); comm->exchange(); comm->borders(); - if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + if (domain->triclinic) domain->lamda2x(atom->nlocal + atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); neighbor->build(1); } else { @@ -432,16 +434,15 @@ int FixNeighborSwap::attempt_swap() // if swap accepted, return 1 // if ke_flag, rescale atom velocities - if (random_equal->uniform() < - exp(beta*(energy_before - energy_after))) { + if (random_equal->uniform() < exp(beta * (energy_before - energy_after))) { update_iswap_atoms_list(); if (ke_flag) { - if ( i >= 0 ) { + if (i >= 0) { atom->v[i][0] *= sqrt_mass_ratio[itype][jtype]; atom->v[i][1] *= sqrt_mass_ratio[itype][jtype]; atom->v[i][2] *= sqrt_mass_ratio[itype][jtype]; } - if ( j >= 0 ) { + if (j >= 0) { atom->v[j][0] *= sqrt_mass_ratio[jtype][itype]; atom->v[j][1] *= sqrt_mass_ratio[jtype][itype]; atom->v[j][2] *= sqrt_mass_ratio[jtype][itype]; @@ -456,11 +457,11 @@ int FixNeighborSwap::attempt_swap() // do not need to re-call comm->borders() and rebuild neighbor list // since will be done on next cycle or in Verlet when this fix finishes - if ( i >= 0 ) { + if (i >= 0) { atom->type[i] = itype; if (atom->q_flag) atom->q[i] = qtype[0]; } - if ( j >= 0 ) { + if (j >= 0) { atom->type[j] = jtype; if (atom->q_flag) atom->q[j] = qtype[jtype_selected]; } @@ -479,16 +480,16 @@ double FixNeighborSwap::energy_full() if (modify->n_pre_force) modify->pre_force(vflag); - if (force->pair) force->pair->compute(eflag,vflag); + if (force->pair) force->pair->compute(eflag, vflag); if (atom->molecular != Atom::ATOMIC) { - if (force->bond) force->bond->compute(eflag,vflag); - if (force->angle) force->angle->compute(eflag,vflag); - if (force->dihedral) force->dihedral->compute(eflag,vflag); - if (force->improper) force->improper->compute(eflag,vflag); + if (force->bond) force->bond->compute(eflag, vflag); + if (force->angle) force->angle->compute(eflag, vflag); + if (force->dihedral) force->dihedral->compute(eflag, vflag); + if (force->improper) force->improper->compute(eflag, vflag); } - if (force->kspace) force->kspace->compute(eflag,vflag); + if (force->kspace) force->kspace->compute(eflag, vflag); if (modify->n_post_force_any) modify->post_force(vflag); @@ -507,15 +508,14 @@ int FixNeighborSwap::pick_i_swap_atom() int id_center_local = -1; int i = -1; - int iwhichglobal = static_cast (niswap*random_equal->uniform()); - if ((iwhichglobal >= niswap_before) && - (iwhichglobal < niswap_before + niswap_local)) { + int iwhichglobal = static_cast(niswap * random_equal->uniform()); + if ((iwhichglobal >= niswap_before) && (iwhichglobal < niswap_before + niswap_local)) { int iwhichlocal = iwhichglobal - niswap_before; i = local_swap_iatom_list[iwhichlocal]; id_center_local = id[i]; - MPI_Allreduce(&id[i],&id_center,1,MPI_INT,MPI_MAX,world); + MPI_Allreduce(&id[i], &id_center, 1, MPI_INT, MPI_MAX, world); } else { - MPI_Allreduce(&id[i],&id_center,1,MPI_INT,MPI_MAX,world); + MPI_Allreduce(&id[i], &id_center, 1, MPI_INT, MPI_MAX, world); } return i; @@ -530,7 +530,7 @@ int FixNeighborSwap::pick_j_swap_neighbor(int i) int jtype_selected_local = -1; // Generate random double from 0 to maximum global probability - double selected_prob = static_cast (global_probability*random_equal->uniform()); + double selected_prob = static_cast(global_probability * random_equal->uniform()); // Find which local swap atom corresponds to probability if ((selected_prob >= prev_probability) && @@ -539,28 +539,26 @@ int FixNeighborSwap::pick_j_swap_neighbor(int i) for (int n = 0; n < njswap_local; n++) { if (search_prob > local_swap_probability[n]) { search_prob -= local_swap_probability[n]; - } - else{ + } else { j = local_swap_neighbor_list[n]; jtype_selected_local = local_swap_type_list[n]; - MPI_Allreduce(&jtype_selected_local,&jtype_selected,1,MPI_INT,MPI_MAX,world); + MPI_Allreduce(&jtype_selected_local, &jtype_selected, 1, MPI_INT, MPI_MAX, world); return j; } } - error->all(FLERR,"Did not select local neighbor swap atom"); + error->all(FLERR, "Did not select local neighbor swap atom"); } - MPI_Allreduce(&jtype_selected_local,&jtype_selected,1,MPI_INT,MPI_MAX,world); + MPI_Allreduce(&jtype_selected_local, &jtype_selected, 1, MPI_INT, MPI_MAX, world); return j; } /* ---------------------------------------------------------------------- ------------------------------------------------------------------------- */ -double FixNeighborSwap::get_distance(double* i, double* j) +double FixNeighborSwap::get_distance(double *i, double *j) { - double r = sqrt(MathSpecial::square((i[0] - j[0])) + - MathSpecial::square((i[1] - j[1])) + + double r = sqrt(MathSpecial::square((i[0] - j[0])) + MathSpecial::square((i[1] - j[1])) + MathSpecial::square((i[2] - j[2]))); return r; } @@ -580,16 +578,16 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) memory->sfree(local_swap_neighbor_list); atom_swap_nmax = atom->nmax; - local_swap_neighbor_list = (int *) memory->smalloc(atom_swap_nmax*sizeof(int), - "MCSWAP:local_swap_neighbor_list"); + local_swap_neighbor_list = + (int *) memory->smalloc(atom_swap_nmax * sizeof(int), "MCSWAP:local_swap_neighbor_list"); memory->sfree(local_swap_probability); - local_swap_probability = (double *) memory->smalloc(atom_swap_nmax*sizeof(double), - "MCSWAP:local_swap_probability_list"); + local_swap_probability = (double *) memory->smalloc(atom_swap_nmax * sizeof(double), + "MCSWAP:local_swap_probability_list"); memory->sfree(local_swap_type_list); - local_swap_type_list = (int *) memory->smalloc(atom_swap_nmax*sizeof(int), - "MCSWAP:local_swap_type_list"); + local_swap_type_list = + (int *) memory->smalloc(atom_swap_nmax * sizeof(int), "MCSWAP:local_swap_type_list"); // Compute voronoi and access neighbor list @@ -605,11 +603,10 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) int temp_j = -1; // Find local voronoi entry with selected central atom - if ( (int)voro_neighbor_list[n][0] == id_center ) { + if ((int) voro_neighbor_list[n][0] == id_center) { temp_j_id = voro_neighbor_list[n][1]; temp_j = -1; - } else if ( ((int)voro_neighbor_list[n][1] == id_center) && - ( i_center < 0 ) ) { + } else if (((int) voro_neighbor_list[n][1] == id_center) && (i_center < 0)) { temp_j_id = voro_neighbor_list[n][0]; temp_j = -1; } else { @@ -618,39 +615,37 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) // Find which local atom corresponds to neighbor for (int j = 0; j < nlocal; j++) { - if ( temp_j_id == id[j] ) { + if (temp_j_id == id[j]) { temp_j = j; break; } } // If temp_j not on this processor, skip - if ( temp_j < 0 ) continue; + if (temp_j < 0) continue; if (region) { - if (region->match(x[temp_j][0],x[temp_j][1],x[temp_j][2]) == 1) { + if (region->match(x[temp_j][0], x[temp_j][1], x[temp_j][2]) == 1) { if (atom->mask[temp_j] & groupbit) { if (diff_flag) { // Calculate distance from i to each j, adjust probability of selection // Get distance if own centr atom double r = INFINITY; - if ( i_center >= 0 ) { - double r = get_distance(x[temp_j], x[i_center]); - } + if (i_center >= 0) { double r = get_distance(x[temp_j], x[i_center]); } // Get local id of ghost center atom when ghost - for (int i=nlocal; i < nlocal+nghost; i++) { - if ( (id[i] == id_center) && - (get_distance(x[temp_j], x[i]) < r) ) { - r = get_distance(x[temp_j], x[i]); + for (int i = nlocal; i < nlocal + nghost; i++) { + if ((id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r)) { + r = get_distance(x[temp_j], x[i]); } } if (rates_flag) { - local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-MathSpecial::square(r/3.0)); + local_swap_probability[njswap_local] = + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / 3.0)); } else { - local_swap_probability[njswap_local] = exp(-MathSpecial::square(r/3.0)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / 3.0)); } local_probability += local_swap_probability[njswap_local]; local_swap_type_list[njswap_local] = type[temp_j]; @@ -662,22 +657,20 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) // Calculate distance from i to each j, adjust probability of selection // Get distance if own center atom double r = INFINITY; - if ( i_center >= 0 ) { - double r = get_distance(x[temp_j], x[i_center]); - } + if (i_center >= 0) { double r = get_distance(x[temp_j], x[i_center]); } // Get local id of ghost center atom when ghost - for (int i=nlocal; i < nlocal+nghost; i++) { - if ( (id[i] == id_center) && - (get_distance(x[temp_j], x[i]) < r) ) { - r = get_distance(x[temp_j], x[i]); + for (int i = nlocal; i < nlocal + nghost; i++) { + if ((id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r)) { + r = get_distance(x[temp_j], x[i]); } } if (rates_flag) { - local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-MathSpecial::square(r/3.0)); + local_swap_probability[njswap_local] = + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / 3.0)); } else { - local_swap_probability[njswap_local] = exp(-MathSpecial::square(r/3.0)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / 3.0)); } local_probability += local_swap_probability[njswap_local]; @@ -695,20 +688,19 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) // Calculate distance from i to each j, adjust probability of selection // Get distance if own center atom double r = INFINITY; - if ( i_center >= 0 ) { - r = get_distance(x[temp_j], x[i_center]); - } + if (i_center >= 0) { r = get_distance(x[temp_j], x[i_center]); } // Get local id of ghost center atoms - for (int i=nlocal; i < nlocal+nghost; i++) { - if ( (id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r) ) + for (int i = nlocal; i < nlocal + nghost; i++) { + if ((id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r)) r = get_distance(x[temp_j], x[i]); } if (rates_flag) { - local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-MathSpecial::square(r/3.0)); - } else{ - local_swap_probability[njswap_local] = exp(-MathSpecial::square(r/3.0)); + local_swap_probability[njswap_local] = + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / 3.0)); + } else { + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / 3.0)); } local_probability += local_swap_probability[njswap_local]; @@ -721,22 +713,20 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) // Calculate distance from i to each j, adjust probability of selection // Get distance if own center atom double r = INFINITY; - if ( i_center >= 0 ) { - double r = get_distance(x[temp_j], x[i_center]); - } + if (i_center >= 0) { double r = get_distance(x[temp_j], x[i_center]); } // Get local id of ghost center atom when ghost - for (int i=nlocal; i < nlocal+nghost; i++) { - if ( (id[i] == id_center) && - (get_distance(x[temp_j], x[i]) < r)) { - r = get_distance(x[temp_j], x[i]); + for (int i = nlocal; i < nlocal + nghost; i++) { + if ((id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r)) { + r = get_distance(x[temp_j], x[i]); } } if (rates_flag) { - local_swap_probability[njswap_local] = rate_list[type[temp_j] - 1]*exp(-MathSpecial::square(r/3.0)); + local_swap_probability[njswap_local] = + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / 3.0)); } else { - local_swap_probability[njswap_local] = exp(-MathSpecial::square(r/3.0)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / 3.0)); } local_probability += local_swap_probability[njswap_local]; @@ -750,12 +740,12 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) } } - MPI_Allreduce(&njswap_local,&njswap,1,MPI_INT,MPI_SUM,world); - MPI_Scan(&njswap_local,&njswap_before,1,MPI_INT,MPI_SUM,world); + MPI_Allreduce(&njswap_local, &njswap, 1, MPI_INT, MPI_SUM, world); + MPI_Scan(&njswap_local, &njswap_before, 1, MPI_INT, MPI_SUM, world); njswap_before -= njswap_local; - MPI_Allreduce(&local_probability,&global_probability,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Scan(&local_probability,&prev_probability,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&local_probability, &global_probability, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Scan(&local_probability, &prev_probability, 1, MPI_DOUBLE, MPI_SUM, world); prev_probability -= local_probability; } @@ -772,8 +762,8 @@ void FixNeighborSwap::update_iswap_atoms_list() if (atom->nmax > atom_swap_nmax) { memory->sfree(local_swap_iatom_list); atom_swap_nmax = atom->nmax; - local_swap_iatom_list = (int *) memory->smalloc(atom_swap_nmax*sizeof(int), - "MCSWAP:local_swap_iatom_list"); + local_swap_iatom_list = + (int *) memory->smalloc(atom_swap_nmax * sizeof(int), "MCSWAP:local_swap_iatom_list"); } niswap_local = 0; @@ -781,9 +771,9 @@ void FixNeighborSwap::update_iswap_atoms_list() if (region) { for (int i = 0; i < nlocal; i++) { - if (region->match(x[i][0],x[i][1],x[i][2]) == 1) { + if (region->match(x[i][0], x[i][1], x[i][2]) == 1) { if (atom->mask[i] & groupbit) { - if (type[i] == type_list[0]) { + if (type[i] == type_list[0]) { local_swap_iatom_list[niswap_local] = i; niswap_local++; } @@ -794,7 +784,7 @@ void FixNeighborSwap::update_iswap_atoms_list() } else { for (int i = 0; i < nlocal; i++) { if (atom->mask[i] & groupbit) { - if (type[i] == type_list[0]) { + if (type[i] == type_list[0]) { local_swap_iatom_list[niswap_local] = i; niswap_local++; } @@ -802,16 +792,17 @@ void FixNeighborSwap::update_iswap_atoms_list() } } - MPI_Allreduce(&niswap_local,&niswap,1,MPI_INT,MPI_SUM,world); - MPI_Scan(&niswap_local,&niswap_before,1,MPI_INT,MPI_SUM,world); + MPI_Allreduce(&niswap_local, &niswap, 1, MPI_INT, MPI_SUM, world); + MPI_Scan(&niswap_local, &niswap_before, 1, MPI_INT, MPI_SUM, world); niswap_before -= niswap_local; } /* ---------------------------------------------------------------------- */ -int FixNeighborSwap::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) +int FixNeighborSwap::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, + int * /*pbc*/) { - int i,j,m; + int i, j, m; int *type = atom->type; double *q = atom->q; @@ -838,7 +829,7 @@ int FixNeighborSwap::pack_forward_comm(int n, int *list, double *buf, int /*pbc_ void FixNeighborSwap::unpack_forward_comm(int n, int first, double *buf) { - int i,m,last; + int i, m, last; int *type = atom->type; double *q = atom->q; @@ -848,12 +839,11 @@ void FixNeighborSwap::unpack_forward_comm(int n, int first, double *buf) if (atom->q_flag) { for (i = first; i < last; i++) { - type[i] = static_cast (buf[m++]); + type[i] = static_cast(buf[m++]); q[i] = buf[m++]; } } else { - for (i = first; i < last; i++) - type[i] = static_cast (buf[m++]); + for (i = first; i < last; i++) type[i] = static_cast(buf[m++]); } } @@ -874,7 +864,7 @@ double FixNeighborSwap::compute_vector(int n) double FixNeighborSwap::memory_usage() { - double bytes = (double)atom_swap_nmax * sizeof(int); + double bytes = (double) atom_swap_nmax * sizeof(int); return bytes; } @@ -895,8 +885,8 @@ void FixNeighborSwap::write_restart(FILE *fp) if (comm->me == 0) { int size = n * sizeof(double); - fwrite(&size,sizeof(int),1,fp); - fwrite(list,sizeof(double),n,fp); + fwrite(&size, sizeof(int), 1, fp); + fwrite(list, sizeof(double), n, fp); } } @@ -909,10 +899,10 @@ void FixNeighborSwap::restart(char *buf) int n = 0; double *list = (double *) buf; - seed = static_cast (list[n++]); + seed = static_cast(list[n++]); random_equal->reset(seed); - seed = static_cast (list[n++]); + seed = static_cast(list[n++]); random_unequal->reset(seed); next_reneighbor = (bigint) ubuf(list[n++]).i; @@ -922,5 +912,5 @@ void FixNeighborSwap::restart(char *buf) bigint ntimestep_restart = (bigint) ubuf(list[n++]).i; if (ntimestep_restart != update->ntimestep) - error->all(FLERR,"Must not reset timestep when restarting fix neighbor/swap"); + error->all(FLERR, "Must not reset timestep when restarting fix neighbor/swap"); } diff --git a/src/MC/fix_neighbor_swap.h b/src/MC/fix_neighbor_swap.h index df75505a6d..826ab96a65 100755 --- a/src/MC/fix_neighbor_swap.h +++ b/src/MC/fix_neighbor_swap.h @@ -40,17 +40,17 @@ class FixNeighborSwap : public Fix { private: int nevery, seed; - int ke_flag; // yes = conserve ke, no = do not conserve ke - int diff_flag; // yes = simulate diffusion of central atom, no = swap only to certain types - int rates_flag; // yes = use modified type rates, no = swap rates are equivilent across types - int voro_flag; // yes = use given voronoi calculation, no = use internal voronoi calculation + int ke_flag; // yes = conserve ke, no = do not conserve ke + int diff_flag; // yes = simulate diffusion of central atom, no = swap only to certain types + int rates_flag; // yes = use modified type rates, no = swap rates are equivilent across types + int voro_flag; // yes = use given voronoi calculation, no = use internal voronoi calculation int ncycles; int niswap, njswap; // # of i,j swap atoms on all procs int niswap_local, njswap_local; // # of swap atoms on this proc int niswap_before, njswap_before; // # of swap atoms on procs < this proc // int global_i_ID; // global id of selected i atom - class Region *region; // swap region - char *idregion; // swap region id + class Region *region; // swap region + char *idregion; // swap region id int nswaptypes; int jtype_selected; @@ -68,19 +68,18 @@ class FixNeighborSwap : public Fix { int atom_swap_nmax; double beta; - double local_probability; // Total swap probability stored on this proc - double global_probability; // Total swap probability across all proc - double prev_probability; // Swap probability on proc < this proc + double local_probability; // Total swap probability stored on this proc + double global_probability; // Total swap probability across all proc + double prev_probability; // Swap probability on proc < this proc double *qtype; double energy_stored; double **sqrt_mass_ratio; double **voro_neighbor_list; int *local_swap_iatom_list; int *local_swap_neighbor_list; - int *local_swap_type_list; // Type list index of atoms stored on this proc + int *local_swap_type_list; // Type list index of atoms stored on this proc double *local_swap_probability; - class RanPark *random_equal; class RanPark *random_unequal; From dbc930c756696a87463f976d46f34fe19c7a1df6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Dec 2024 19:44:28 -0500 Subject: [PATCH 11/94] correct permissions --- src/MC/fix_neighbor_swap.cpp | 0 src/MC/fix_neighbor_swap.h | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/MC/fix_neighbor_swap.cpp mode change 100755 => 100644 src/MC/fix_neighbor_swap.h diff --git a/src/MC/fix_neighbor_swap.cpp b/src/MC/fix_neighbor_swap.cpp old mode 100755 new mode 100644 diff --git a/src/MC/fix_neighbor_swap.h b/src/MC/fix_neighbor_swap.h old mode 100755 new mode 100644 From e6986cbc06208ae22457ad70178da60373c7942a Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Tue, 28 Jan 2025 18:51:07 -0700 Subject: [PATCH 12/94] Removed unused local RNG and restructured reading of command options --- src/MC/fix_neighbor_swap.cpp | 59 ++++++++++++++---------------------- src/MC/fix_neighbor_swap.h | 4 +-- 2 files changed, 23 insertions(+), 40 deletions(-) diff --git a/src/MC/fix_neighbor_swap.cpp b/src/MC/fix_neighbor_swap.cpp index 95e74bee22..d44181a981 100644 --- a/src/MC/fix_neighbor_swap.cpp +++ b/src/MC/fix_neighbor_swap.cpp @@ -66,7 +66,7 @@ static const char cite_fix_neighbor_swap_c[] = FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), region(nullptr), idregion(nullptr), type_list(nullptr), qtype(nullptr), c_voro(nullptr), voro_neighbor_list(nullptr), sqrt_mass_ratio(nullptr), - local_swap_iatom_list(nullptr), random_equal(nullptr), random_unequal(nullptr), c_pe(nullptr) + local_swap_iatom_list(nullptr), random_equal(nullptr), c_pe(nullptr) { if (narg < 10) utils::missing_cmd_args(FLERR, "fix neighbor/swap", error); @@ -85,6 +85,17 @@ FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : ncycles = utils::inumeric(FLERR, arg[4], false, lmp); seed = utils::inumeric(FLERR, arg[5], false, lmp); double temperature = utils::numeric(FLERR, arg[6], false, lmp); + r_0 = utils::inumeric(FLERR, arg[7], false, lmp); + + // Voro compute check + + int icompute = modify->find_compute(utils::strdup(arg[8])); + if (icompute < 0) error->all(FLERR, "Could not find neighbor compute ID"); + c_voro = modify->compute[icompute]; + if (c_voro->local_flag == 0) + error->all(FLERR, "Neighbor compute does not compute local info"); + if (c_voro->size_local_cols != 3) + error->all(FLERR, "Neighbor compute does not give i, j, size as expected"); if (nevery <= 0) error->all(FLERR, "Illegal fix neighbor/swap command nevery value"); if (ncycles < 0) error->all(FLERR, "Illegal fix neighbor/swap command ncycles value"); @@ -98,18 +109,12 @@ FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : // read options from end of input line - options(narg - 7, &arg[7]); - - if (voro_flag != 1) error->all(FLERR, "Voronoi compute required for fix neighbor/swap command"); + options(narg - 8, &arg[8]); // random number generator, same for all procs random_equal = new RanPark(lmp, seed); - // random number generator, not the same for all procs - - random_unequal = new RanPark(lmp, seed); - // set up reneighboring force_reneighbor = 1; @@ -149,7 +154,6 @@ FixNeighborSwap::~FixNeighborSwap() memory->destroy(local_swap_type_list); delete[] idregion; delete random_equal; - delete random_unequal; } /* ---------------------------------------------------------------------- @@ -163,7 +167,6 @@ void FixNeighborSwap::options(int narg, char **arg) ke_flag = 1; diff_flag = 0; rates_flag = 0; - voro_flag = 0; nswaptypes = 0; int iarg = 0; @@ -190,20 +193,6 @@ void FixNeighborSwap::options(int narg, char **arg) nswaptypes++; iarg++; } - } else if (strcmp(arg[iarg], "voro") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); - - int icompute = modify->find_compute(utils::strdup(arg[iarg + 1])); - - if (icompute < 0) error->all(FLERR, "Could not find neighbor compute ID"); - c_voro = modify->compute[icompute]; - if (c_voro->local_flag == 0) - error->all(FLERR, "Neighbor compute does not compute local info"); - if (c_voro->size_local_cols != 3) - error->all(FLERR, "Neighbor compute does not give i, j, size as expected"); - - voro_flag = 1; - iarg += 2; } else if (strcmp(arg[iarg], "diff") == 0) { if (iarg + 2 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); if (nswaptypes != 0) error->all(FLERR, "Illegal fix neighbor/swap command"); @@ -630,7 +619,7 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) if (diff_flag) { // Calculate distance from i to each j, adjust probability of selection - // Get distance if own centr atom + // Get distance if own center atom double r = INFINITY; if (i_center >= 0) { double r = get_distance(x[temp_j], x[i_center]); } @@ -643,9 +632,9 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) if (rates_flag) { local_swap_probability[njswap_local] = - rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / 3.0)); + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / r_0)); } else { - local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / 3.0)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / r_0)); } local_probability += local_swap_probability[njswap_local]; local_swap_type_list[njswap_local] = type[temp_j]; @@ -668,9 +657,9 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) if (rates_flag) { local_swap_probability[njswap_local] = - rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / 3.0)); + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / r_0)); } else { - local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / 3.0)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / r_0)); } local_probability += local_swap_probability[njswap_local]; @@ -698,9 +687,9 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) if (rates_flag) { local_swap_probability[njswap_local] = - rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / 3.0)); + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / r_0)); } else { - local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / 3.0)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / r_0)); } local_probability += local_swap_probability[njswap_local]; @@ -724,9 +713,9 @@ void FixNeighborSwap::build_i_neighbor_list(int i_center) if (rates_flag) { local_swap_probability[njswap_local] = - rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / 3.0)); + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / r_0)); } else { - local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / 3.0)); + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / r_0)); } local_probability += local_swap_probability[njswap_local]; @@ -877,7 +866,6 @@ void FixNeighborSwap::write_restart(FILE *fp) int n = 0; double list[6]; list[n++] = random_equal->state(); - list[n++] = random_unequal->state(); list[n++] = ubuf(next_reneighbor).d; list[n++] = nswap_attempts; list[n++] = nswap_successes; @@ -902,9 +890,6 @@ void FixNeighborSwap::restart(char *buf) seed = static_cast(list[n++]); random_equal->reset(seed); - seed = static_cast(list[n++]); - random_unequal->reset(seed); - next_reneighbor = (bigint) ubuf(list[n++]).i; nswap_attempts = static_cast(list[n++]); diff --git a/src/MC/fix_neighbor_swap.h b/src/MC/fix_neighbor_swap.h index 826ab96a65..821eda1bdc 100644 --- a/src/MC/fix_neighbor_swap.h +++ b/src/MC/fix_neighbor_swap.h @@ -43,7 +43,6 @@ class FixNeighborSwap : public Fix { int ke_flag; // yes = conserve ke, no = do not conserve ke int diff_flag; // yes = simulate diffusion of central atom, no = swap only to certain types int rates_flag; // yes = use modified type rates, no = swap rates are equivilent across types - int voro_flag; // yes = use given voronoi calculation, no = use internal voronoi calculation int ncycles; int niswap, njswap; // # of i,j swap atoms on all procs int niswap_local, njswap_local; // # of swap atoms on this proc @@ -67,7 +66,7 @@ class FixNeighborSwap : public Fix { bool unequal_cutoffs; int atom_swap_nmax; - double beta; + double beta, r_0; double local_probability; // Total swap probability stored on this proc double global_probability; // Total swap probability across all proc double prev_probability; // Swap probability on proc < this proc @@ -81,7 +80,6 @@ class FixNeighborSwap : public Fix { double *local_swap_probability; class RanPark *random_equal; - class RanPark *random_unequal; class Compute *c_voro; class Compute *c_pe; From a678a3b4742a5fe132babb2ddeea6a14ceabe03e Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Tue, 28 Jan 2025 18:51:52 -0700 Subject: [PATCH 13/94] Initial update of doc file --- doc/src/fix_neighbor_swap.rst | 63 +++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 3c97400d3f..913f479ebe 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -8,7 +8,7 @@ Syntax .. code-block:: LAMMPS - fix ID group-ID neighbor/swap N X seed T R keyword values ... + fix ID group-ID neighbor/swap N X seed T R0 voro keyword values ... * ID, group-ID are documented in :doc:`fix ` command * neighbor/swap = style name of this fix command @@ -16,9 +16,11 @@ Syntax * X = number of swaps to attempt every N steps * seed = random # seed (positive integer) * T = scaling temperature of the MC swaps (temperature units) -* R = scaling swap probability of the MC swaps (distance units) +* R0 = scaling swap probability of the MC swaps (distance units) +* voro = valid voronoi compute id (compute voronoi/atom) * one or more keyword/value pairs may be appended to args -* keyword = *types* or *mu* or *ke* or *semi-grand* or *region* +* keywords *types* and *diff* are mutually exclusive, but one must be specified +* keyword = *types* or *ke* or *region* or *diff* or *rates* .. parsed-literal:: @@ -29,32 +31,35 @@ Syntax *region* value = region-ID region-ID = ID of region to use as an exchange/move volume *diff* values = one atom type - *voro* values = valid voronoi compute id (compute voronoi/atom) - *rates* values = Ntype values to conduct variable diffusion for different atom types (unitless) + *rates* values = V1 V2 . . . Vntypes values to conduct variable diffusion for different atom types (unitless) Examples """""""" .. code-block:: LAMMPS - fix mc all neighbor/swap 10 160 15238 1000.0 diff 2 voro voroN - fix myFix all neighbor/swap 100 1 12345 298.0 region my_swap_region types 5 6 voro voroN - fix kmc all neighbor/swap 1 100 345 1.0 diff 3 rates 3 1 6 voro voroN + fix mc all neighbor/swap 10 160 15238 1000.0 3.0 diff 2 voro voroN + fix myFix all neighbor/swap 100 1 12345 298.0 3.0 region my_swap_region types 5 6 voro voroN + fix kmc all neighbor/swap 1 100 345 1.0 3.0 diff 3 rates 3 1 6 voro voroN Description """"""""""" .. versionadded:: TBD -Computes MC evaluations to enable kinetic Monte Carlo (kMC) behavior -during MD simulation through only allowing neighboring atom swaps. +Computes MC evaluations to enable kinetic Monte Carlo (kMC)-type behavior +during MD simulation through only allowing neighboring atom swaps. This +creates a hybrid type simulation of MDkMC simulation where atoms are only +swapped with their neighbors, but the swapping acceptance is perfomed by +evaluating the change in system energy using the Metropolis Criterion. Neighboring atoms are selected using a Voronoi tesselation approach. This -implementation is as described in :ref:`(Tavenner) `. +implementation is as described in :ref:`(Tavenner 2023) <_TavennerMDkMC>` +as originally intended for simulating accelerated diffusion in an MD context. The fix is called every *N* timesteps and attempts *X* swaps. The system is initialized with a random seed, using a temperature *T* for evaluating the MC energy swaps. The distance-based probability is -weighted according to *R* which sets the radius :math:`r_0` for the +weighted according to *R0* which sets the radius :math:`r_0` for the weighting .. math:: @@ -64,6 +69,10 @@ weighting where :math:`p_{ij}` is the probability of selecting atoms :math:`i` and :math:`j` for an evaluated swap. +Typically, a value around the average nearest-neighbor spacing is appropriate +for *R0*. Since this is simply a proability weighting, behavior is not +particularly sensitive to the exact value of *R0*. + The keyword *types* is submitted with two or more atom types as the value. Atoms of the first atom type are swapped with valid neighbors of all the remaining atom types. @@ -96,6 +105,9 @@ potential atoms to be swapped at the initial step, i.e. for using *fix neighbor/swap* with *diff 2*. +If atoms in the specified group are not in the voro calculated group +they will not be considered for swapping. + The keyword *rates* can modify the swap rate for each swapped type by values where the adjusted rates values are given in order of increasing atom type. The number of rates provided must equal the number of atom @@ -113,6 +125,24 @@ considered in the area given by *region-ID*. If only atoms of certain groups are expected to be in this region, the corresponding compute voronoi command can be adjusted accordingly. +Either the *types* or *diff* keyword must be specified to select atom +types for swapping + +Keywords +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +---------------------------------------------------------- + +types = Select random atom matching first type as type I, remaining +atom types are valid for selecting atom J. +diff = Select random atom of this type as atom I, all atoms are valid +for type J. +ke = re-scale velocities when atoms are swapped based on difference in +mass +region = select only atoms I and J from region +rates = pre-factor modification to the J atom selection probability +based on atom type. + + Restart, fix_modify, output, run start/stop, minimize info """""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -149,8 +179,7 @@ doc page for more info. Also this fix requires that the :ref:`VORONOI package ` is installed, otherwise the fix will not be compiled. -A valid voronoi command which returns neighboring atoms must be used -and referenced with the *voro* keyword. +The voronoi command specified by *voro* must return neighboring atoms. When this fix is used with a :doc:`hybrid pair style ` system, only swaps between atom types of the same sub-style (or @@ -171,11 +200,11 @@ Related commands Default """"""" -The option defaults are *ke* = yes, *diff* = no, *rates* = 1 for all +The option defaults are *ke* = yes, *rates* = 1 for all atom types. ---------- -.. _Tavenner: +.. _TavennerMDkMC: -**(Tavenner)** J Tavenner, M Mendelev, J Lawson, Computational Materials Science, 218, 111929 (2023). +**(Tavenner 2023)** J Tavenner, M Mendelev, J Lawson, Computational Materials Science, 218, 111929 (2023). From 94885186b8838d7c0fc091474f7198ac17482f26 Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Thu, 27 Feb 2025 16:12:06 -0700 Subject: [PATCH 14/94] Updated doc with description of kMC algorithm --- doc/src/fix_neighbor_swap.rst | 62 ++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 913f479ebe..9c87547321 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -20,7 +20,7 @@ Syntax * voro = valid voronoi compute id (compute voronoi/atom) * one or more keyword/value pairs may be appended to args * keywords *types* and *diff* are mutually exclusive, but one must be specified -* keyword = *types* or *ke* or *region* or *diff* or *rates* +* keyword = *types* or *diff* or *rates* or *ke* or *region* .. parsed-literal:: @@ -47,14 +47,55 @@ Description .. versionadded:: TBD -Computes MC evaluations to enable kinetic Monte Carlo (kMC)-type behavior -during MD simulation through only allowing neighboring atom swaps. This -creates a hybrid type simulation of MDkMC simulation where atoms are only -swapped with their neighbors, but the swapping acceptance is perfomed by -evaluating the change in system energy using the Metropolis Criterion. -Neighboring atoms are selected using a Voronoi tesselation approach. This -implementation is as described in :ref:`(Tavenner 2023) <_TavennerMDkMC>` -as originally intended for simulating accelerated diffusion in an MD context. +This fix computes Monte-Carlo (MC) evaluations to enable kinetic +Monte Carlo (kMC)-type behavior during MD simulation through only allowing +neighboring atom swaps. This creates a hybrid type simulation of MDkMC simulation +where atoms are only swapped with their neighbors, but the swapping acceptance is +perfomed by evaluating the change in system energy using the Metropolis Criterion. +Neighboring atoms are selected using a Voronoi tesselation approach. A detailed +explination of the original implementation of this procedure can be found in +:ref:`(Tavenner 2023) <_TavennerMDkMC>` as originally intended for simulating +accelerated diffusion in an MD context. + +Simulating inherently kineticly driven behaviors which rely on rare events +(such as atomic diffusion) is challenging for traditional Molecular Dynamics +approaches since simulations are restricted in their time-scale of events. +Since thermal vibration motion occurs on a timescale much shorter than the movement +of vacancies, such behaviors are challenging to model simultaneously. To address +this challenge, an approach from kMC simulations is adpoted where rare events can +be sampled at selected rates. By selecting such swap behaviors, the process +of atomic diffusion can be approximated during an MD simulation, effectively +decoupling the MD atomic vibrational time and the timescale of atomic hopping. + +To achieve such simulations, this algorithm takes the following approach. First, +the MD simulation is stopped after a given number of steps to perform atom swaps. +Given this instantaneous configuration from the MD simulation, Voronoi neighbors +are computed for all valid swap atoms. From the list of valid swap atoms, one atom +I is selected at random across the entire simulation. One if its Voronoi neighbors +that is a valid atom to swap is then selected. The atom ID is communicated to all +processors, such that if the neighbors are on different processors the swap still +occurs. The two atom types are swapped, and the change in system energy from before +the swap is compared using the Metropolis Criterion. This evaluation of the energy +change is a global calculation, such that it has a computational cost similar to +that of an MD timestep. If the swap is accepted from the Metropolis Criterion, the +atoms remain swapped. Else, the atoms are returned to their original types. This +process of MC evaluation is repeated for a given number of iterations until the +original MD simulation is resumed from the new state, where any successfully +swapped atoms have changed type, though the global system balance is preserved. + +A few key notes regarding this implementation are as follows. The parallel +efficiency of this algorithm is similar to that of other MC approaches. I.e, +due to the additional energy calculations for the MC steps, efficiency is +improved with a smaller number of atoms per processor than standalone MD simulation +since there is more weighting on the calculation of a given atomic domain and +minor additonal communication load. Communication of the atom ids to be swapped +between processors is negligible. Efficiency will additionally be much worse for +pair styles with different per-atom cutoffs, since the neighbor list will need to +be rebuilt between swap events. Limitations are imposed on the Voronoi neighbors +to restrict swapping of atoms which are outside of a reasonable cutoff. + +Input Parameters Usage +""""""""""" The fix is called every *N* timesteps and attempts *X* swaps. The system is initialized with a random seed, using a temperature *T* for @@ -128,9 +169,8 @@ voronoi command can be adjusted accordingly. Either the *types* or *diff* keyword must be specified to select atom types for swapping -Keywords +Keyword Summary """""""""""""""""""""""""""""""""""""""""""""""""""""""""" ----------------------------------------------------------- types = Select random atom matching first type as type I, remaining atom types are valid for selecting atom J. From 6dacf5d52c3fe107ef96e4beba9be682f288c7dc Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Sat, 15 Mar 2025 11:36:20 -0600 Subject: [PATCH 15/94] Update fix_neighbor_swap.rst I fixed some typos and shortened the text a bit. --- doc/src/fix_neighbor_swap.rst | 75 ++++++++++++++--------------------- 1 file changed, 30 insertions(+), 45 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 9c87547321..226926b0fb 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -24,7 +24,7 @@ Syntax .. parsed-literal:: - *types* values = two or more atom types (1-Ntypes or type label) + *types* values = two or more atom types (Integers in range [1,Ntypes] or type labels) *ke* value = *no* or *yes* *no* = no conservation of kinetic energy after atom swaps *yes* = kinetic energy is conserved after atom swaps @@ -47,52 +47,50 @@ Description .. versionadded:: TBD -This fix computes Monte-Carlo (MC) evaluations to enable kinetic -Monte Carlo (kMC)-type behavior during MD simulation through only allowing -neighboring atom swaps. This creates a hybrid type simulation of MDkMC simulation -where atoms are only swapped with their neighbors, but the swapping acceptance is -perfomed by evaluating the change in system energy using the Metropolis Criterion. +This fix computes Monte Carlo (MC) evaluations to enable kinetic +Monte Carlo (kMC) behavior during an MD simulation by allowing +neighboring atoms to swap their positions. This creates a hybrid MD/kMC +simulation +where atoms are swapped only with their neighbors, and the swapping acceptance is +perfomed by evaluating the change in system energy using the Metropolis criterion. Neighboring atoms are selected using a Voronoi tesselation approach. A detailed explination of the original implementation of this procedure can be found in :ref:`(Tavenner 2023) <_TavennerMDkMC>` as originally intended for simulating accelerated diffusion in an MD context. -Simulating inherently kineticly driven behaviors which rely on rare events +Simulating inherently kinetically-limited behaviors which rely on rare events (such as atomic diffusion) is challenging for traditional Molecular Dynamics -approaches since simulations are restricted in their time-scale of events. -Since thermal vibration motion occurs on a timescale much shorter than the movement -of vacancies, such behaviors are challenging to model simultaneously. To address -this challenge, an approach from kMC simulations is adpoted where rare events can +approaches, since thermal vibration motion occurs on a timescale much +shorter than local structural changes such as vacancy hopping. +To address +this challenge, an approach from kMC simulations is adopted where rare events can be sampled at selected rates. By selecting such swap behaviors, the process of atomic diffusion can be approximated during an MD simulation, effectively decoupling the MD atomic vibrational time and the timescale of atomic hopping. To achieve such simulations, this algorithm takes the following approach. First, -the MD simulation is stopped after a given number of steps to perform atom swaps. -Given this instantaneous configuration from the MD simulation, Voronoi neighbors -are computed for all valid swap atoms. From the list of valid swap atoms, one atom -I is selected at random across the entire simulation. One if its Voronoi neighbors -that is a valid atom to swap is then selected. The atom ID is communicated to all -processors, such that if the neighbors are on different processors the swap still -occurs. The two atom types are swapped, and the change in system energy from before -the swap is compared using the Metropolis Criterion. This evaluation of the energy +the MD simulation is stopped *N* steps to attempt *X* atom swaps. +Voronoi neighbors are computed for all valid swap atoms. +For each swap attempt, one atom +I is selected at random from the global list of valid atoms. One if its Voronoi neighbors +that is a valid atom to swap is then selected. The neighbor atom ID is communicated to all +processors, as it may be owned by a different processor. +The two atom types are then swapped, and the change in system energy from before +the swap is used to evaluate the Metropolis acceptance criterion. This evaluation of the energy change is a global calculation, such that it has a computational cost similar to -that of an MD timestep. If the swap is accepted from the Metropolis Criterion, the -atoms remain swapped. Else, the atoms are returned to their original types. This +that of an MD timestep. If the swap is accepted from the Metropolis criterion, the +atoms remain swapped. If the swap is rejected, the atoms are reverted to their original types. This process of MC evaluation is repeated for a given number of iterations until the original MD simulation is resumed from the new state, where any successfully swapped atoms have changed type, though the global system balance is preserved. A few key notes regarding this implementation are as follows. The parallel -efficiency of this algorithm is similar to that of other MC approaches. I.e, -due to the additional energy calculations for the MC steps, efficiency is -improved with a smaller number of atoms per processor than standalone MD simulation -since there is more weighting on the calculation of a given atomic domain and -minor additonal communication load. Communication of the atom ids to be swapped -between processors is negligible. Efficiency will additionally be much worse for -pair styles with different per-atom cutoffs, since the neighbor list will need to -be rebuilt between swap events. Limitations are imposed on the Voronoi neighbors -to restrict swapping of atoms which are outside of a reasonable cutoff. +efficiency of this algorithm is similar to that of other MC approaches, i.e, +the global potential energy must be calculated after each attempted swap. +Efficiency is sensitive to the maximum cutoff distance for the pair style, +since the neighbor list will need to be rebuilt between swap events. +Limitations are imposed on the Voronoi neighbors +to restrict swapping of atoms that are outside of a reasonable cutoff. Input Parameters Usage """"""""""" @@ -111,7 +109,7 @@ where :math:`p_{ij}` is the probability of selecting atoms :math:`i` and :math:`j` for an evaluated swap. Typically, a value around the average nearest-neighbor spacing is appropriate -for *R0*. Since this is simply a proability weighting, behavior is not +for *R0*. Since this is simply a probability weighting, behavior is not particularly sensitive to the exact value of *R0*. The keyword *types* is submitted with two or more atom types as the @@ -121,7 +119,7 @@ all the remaining atom types. The keyword *diff* is used for implementation of simulated diffusion of a given atom type as given by *diff type*. This command selects all atom types as acceptable swap types to a centrally selected atom of type -*type*. This includes the atom type specified by the diff keyword to +*type*. This includes the atom type specified by the *diff* keyword to account for self-diffusion hops of an atom type with itself. Keyword *voro* is currently required, and is implemented as @@ -169,19 +167,6 @@ voronoi command can be adjusted accordingly. Either the *types* or *diff* keyword must be specified to select atom types for swapping -Keyword Summary -"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -types = Select random atom matching first type as type I, remaining -atom types are valid for selecting atom J. -diff = Select random atom of this type as atom I, all atoms are valid -for type J. -ke = re-scale velocities when atoms are swapped based on difference in -mass -region = select only atoms I and J from region -rates = pre-factor modification to the J atom selection probability -based on atom type. - Restart, fix_modify, output, run start/stop, minimize info """""""""""""""""""""""""""""""""""""""""""""""""""""""""" From 9d01ac2caf1c0946399c438bfd717f2d653b647c Mon Sep 17 00:00:00 2001 From: William Zunker Date: Wed, 26 Mar 2025 10:43:51 -0400 Subject: [PATCH 16/94] Stablized radius update, added WFM, added outputs --- src/GRANULAR/fix_granular_mdr.cpp | 42 +++++- src/GRANULAR/fix_granular_mdr.h | 3 +- src/GRANULAR/gran_sub_mod_damping.cpp | 10 +- src/GRANULAR/gran_sub_mod_normal.cpp | 189 ++++++++++++++++++++++---- src/GRANULAR/gran_sub_mod_normal.h | 3 +- src/GRANULAR/granular_model.cpp | 4 +- src/csv_writer.h | 25 ++++ 7 files changed, 236 insertions(+), 40 deletions(-) create mode 100644 src/csv_writer.h diff --git a/src/GRANULAR/fix_granular_mdr.cpp b/src/GRANULAR/fix_granular_mdr.cpp index 9efabdf465..712d4ad1ff 100644 --- a/src/GRANULAR/fix_granular_mdr.cpp +++ b/src/GRANULAR/fix_granular_mdr.cpp @@ -38,6 +38,10 @@ #include "update.h" #include "variable.h" +// wzunker +#include "csv_writer.h" +#include + using namespace LAMMPS_NS; using namespace Granular_NS; using namespace Granular_MDR_NS; @@ -45,7 +49,7 @@ using namespace FixConst; using MathConst::MY_PI; static constexpr double EPSILON = 1e-16; -static constexpr double OVERLAP_LIMIT = 0.75; +static constexpr double OVERLAP_LIMIT = 0.95; enum { COMM_1, COMM_2 }; @@ -85,7 +89,7 @@ void FixGranularMDR::post_constructor() modify->add_fix( fmt::format("{} all property/atom d_Ro d_Vcaps d_Vgeo d_Velas d_eps_bar d_dRnumerator " "d_dRdenominator d_Acon0 d_Acon1 d_Atot d_Atot_sum d_ddelta_bar d_psi " - "d_history_setup_flag d_sigmaxx d_sigmayy d_sigmazz ghost yes", + "d_history_setup_flag d_sigmaxx d_sigmayy d_sigmazz d_dRavg ghost yes", id_fix)); index_Ro = atom->find_custom("Ro", tmp1, tmp2); @@ -105,6 +109,7 @@ void FixGranularMDR::post_constructor() index_sigmaxx = atom->find_custom("sigmaxx", tmp1, tmp2); index_sigmayy = atom->find_custom("sigmayy", tmp1, tmp2); index_sigmazz = atom->find_custom("sigmazz", tmp1, tmp2); + index_dRavg = atom->find_custom("dRavg", tmp1, tmp2); } /* ---------------------------------------------------------------------- */ @@ -208,6 +213,7 @@ void FixGranularMDR::pre_force(int) double *sigmayy = atom->dvector[index_sigmayy]; double *sigmazz = atom->dvector[index_sigmazz]; double *history_setup_flag = atom->dvector[index_history_setup_flag]; + double *dRavg = atom->dvector[index_dRavg]; int new_atom; int nlocal = atom->nlocal; @@ -250,10 +256,35 @@ void FixGranularMDR::pre_force(int) psi[i] = (Atot[i] - Acon1[i]) / Atot[i]; if (psi_b_coeff < psi[i]) { - const double dR = MAX(dRnumerator[i] / (dRdenominator[i] - 4.0 * MY_PI * pow(R, 2.0)), 0.0); - if ((radius[i] + dR) < (1.5 * Ro[i])) radius[i] += dR; + double w_confinement; + ( psi[i] > 0.1 ) ? w_confinement = 1.0/(1.0 + exp(-75.0*(psi[i]-0.2))) : w_confinement = 0.0; + const double dR = MAX(dRnumerator[i] / (dRdenominator[i] - 4.0 * MY_PI * pow(R, 2.0))*w_confinement, 0.0); + + const double N_window = 10.0; + if (dR > 0.0) dRavg[i] += (dR - dRavg[i]) / N_window; + + if (((radius[i] + dR) < (1.5 * Ro[i])) && (dR > 0.0)) radius[i] += dRavg[i]; + + //(dR + dRavg[i])/2.0; + //dRavg[i] = (dR + dRavg[i])/2.0; + + //// wzunker + //const double dRdenominatorTrue = (dRdenominator[i] - 4.0 * MY_PI * pow(R, 2.0)); + //if (i == 0) { + // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/bulk_response/compression_sleeve/dR_parameters.csv"); + // std::stringstream rowDataStream; + // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision + // rowDataStream << dRnumerator[i] << ", " << dRdenominator[i] << ", " << dRavg[i] << ", " << R << ", " << dRdenominatorTrue << ", " << lmp->update->ntimestep; + // std::string rowData = rowDataStream.str(); + // csvWriter.writeRow(rowData); + //} + } Acon0[i] = Acon1[i]; + + // wzunker + //const double dR_tmp = MAX(dRnumerator[i] / (dRdenominator[i] - 4.0 * MY_PI * pow(R, 2.0)), 0.0); + //printf("i = %d, psi_b = %f, psi = %f, Atot = %f, Acon = %f, dRnumerator = %f, dRdenominator = %f, R = %f, dR = %f \n", i, psi_b_coeff, psi[i], Atot[i], Acon1[i], dRnumerator[i], dRdenominator[i],radius[i],dR_tmp); } comm_stage = COMM_1; @@ -510,6 +541,9 @@ void FixGranularMDR::calculate_contact_penalty() "(e.g. increase the skin distance)."); pjk[0] += 1.0 / (1.0 + std::exp(-50.0 * (alpha / MY_PI - 0.5))); + + // wzunker + //printf("i = %d, j = %d, k = %d, pij = %f, pik = %f, pjk = %f \n", i, j, k, pij[0], pik[0], pjk[0]); } } } diff --git a/src/GRANULAR/fix_granular_mdr.h b/src/GRANULAR/fix_granular_mdr.h index f0ba76d155..56c576d79b 100644 --- a/src/GRANULAR/fix_granular_mdr.h +++ b/src/GRANULAR/fix_granular_mdr.h @@ -97,8 +97,7 @@ class FixGranularMDR : public Fix { int index_sigmayy; // yy-component of the stress tensor, not necessary forforce calculation int index_sigmazz; // zz-component of the stress tensor, not necessary forforce calculation int index_history_setup_flag; // flag to check if history variables have beeninitialized - int index_contacts; // total contacts on particle - int index_adhesive_length; // total length of adhesive contact on a particle + int index_dRavg; // total contacts on particle }; } // namespace LAMMPS_NS diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 2fdd7e1f82..4072944d5e 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -18,6 +18,8 @@ #include "math_special.h" #include "math_const.h" +#include "style_gran_sub_mod.h" // IWYU pragma: keep + #include using namespace LAMMPS_NS; @@ -74,8 +76,12 @@ GranSubModDampingVelocity::GranSubModDampingVelocity(GranularModel *gm, LAMMPS * double GranSubModDampingVelocity::calculate_forces() { - damp_prefactor = damp; - return -damp_prefactor * gm->vnnr; + if (gm->normal_model->name == "mdr") { + return 0.0; + } else { + damp_prefactor = damp; + return -damp_prefactor * gm->vnnr; + } } /* ---------------------------------------------------------------------- diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index 226d26d86b..6511f75c30 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -26,6 +26,9 @@ #include #include +// wzunker +#include "csv_writer.h" + using namespace LAMMPS_NS; using namespace Granular_NS; using namespace MathConst; @@ -47,7 +50,7 @@ static constexpr int MDR_MAX_IT = 100; // Newton-Raphs static constexpr double MDR_EPSILON1 = 1e-10; // Newton-Raphson for MDR static constexpr double MDR_EPSILON2 = 1e-16; // Newton-Raphson for MDR static constexpr double MDR_EPSILON3 = 1e-20; // For precision checks -static constexpr double MDR_OVERLAP_LIMIT = 0.75; // Maximum contact overlap for MDR +static constexpr double MDR_OVERLAP_LIMIT = 0.95; // Maximum contact overlap for MDR static const char cite_mdr[] = "MDR contact model command: (i) https://doi.org/10.1016/j.jmps.2023.105492 || (ii) https://doi.org/10.1016/j.jmps.2023.105493 || (iii) https://doi.org/10.31224/4289\n\n" @@ -472,14 +475,16 @@ void GranSubModNormalMDR::coeffs_to_local() Y = coeffs[2]; // yield stress gamma = coeffs[3]; // effective surface energy psi_b = coeffs[4]; // bulk response trigger based on ratio of remaining free area: A_{free}/A_{total} - CoR = coeffs[5]; // coefficent of restitution + //CoR = coeffs[5]; // coefficent of restitution + damp = coeffs[5]; // coefficent of restitution if (E <= 0.0) error->all(FLERR, "Illegal MDR normal model, Young's modulus must be greater than 0"); if (nu < 0.0 || nu > 0.5) error->all(FLERR, "Illegal MDR normal model, Poisson's ratio must be between 0 and 0.5"); if (Y < 0.0) error->all(FLERR, "Illegal MDR normal model, yield stress must be greater than or equal to 0"); if (gamma < 0.0) error->all(FLERR, "Illegal MDR normal model, effective surface energy must be greater than or equal to 0"); if (psi_b < 0.0 || psi_b > 1.0) error->all(FLERR, "Illegal MDR normal model, psi_b must be between 0 and 1.0"); - if (CoR < 0.0 || CoR > 1.0) error->all(FLERR, "Illegal MDR normal model, coefficent of restitution must be between 0 and 1.0"); + //if (CoR < 0.0 || CoR > 1.0) error->all(FLERR, "Illegal MDR normal model, coefficent of restitution must be between 0 and 1.0"); + if (damp < 0.0) error->all(FLERR, "Illegal MDR normal model, damping coefficent must be greater than 1"); G = E / (2.0 * (1.0 + nu)); // shear modulus kappa = E / (3.0 * (1.0 - 2.0 * nu)); // bulk modulus @@ -490,6 +495,7 @@ void GranSubModNormalMDR::coeffs_to_local() Eeffinv = 1.0 / Eeff; Eeffsq = Eeff * Eeff; Eeffsqinv = Eeffinv * Eeffinv; + Eeff2particle = 0.5 * Eeff; gammasq = gamma * gamma; gamma3 = gammasq * gamma; @@ -528,6 +534,7 @@ void GranSubModNormalMDR::init() index_sigmaxx = atom->find_custom("sigmaxx", tmp1, tmp2); // xx-component of the stress tensor, not necessary for force calculation index_sigmayy = atom->find_custom("sigmayy", tmp1, tmp2); // yy-component of the stress tensor, not necessary for force calculation index_sigmazz = atom->find_custom("sigmazz", tmp1, tmp2); // zz-component of the stress tensor, not necessary for force calculation + index_dRavg = atom->find_custom("dRavg", tmp1, tmp2); // radius update increment } /* ---------------------------------------------------------------------- */ @@ -566,6 +573,7 @@ double GranSubModNormalMDR::calculate_forces() double *sigmaxx = atom->dvector[index_sigmaxx]; double *sigmayy = atom->dvector[index_sigmayy]; double *sigmazz = atom->dvector[index_sigmazz]; + double *dRavg = atom->dvector[index_dRavg]; const int itag_true = atom->tag[gm->i]; // true i particle tag const int jtag_true = atom->tag[gm->j]; // true j particle tag @@ -579,6 +587,7 @@ double GranSubModNormalMDR::calculate_forces() double F1 = 0.0; // force on contact side 1 double delta = gm->delta; // apparent overlap double Ac_avg = 0.0; // average contact area across both sides + double a_damp = 0.0; // damping contact radius double *history = & gm->history[history_index]; // load in all history variables int history_update = gm->history_update; @@ -596,6 +605,11 @@ double GranSubModNormalMDR::calculate_forces() if (gm->delta >= *deltamax_offset) *deltamax_offset = gm->delta; double deltamax = *deltamax_offset; + //wzunker + double F_MDR0; + double F_BULK0; + double F_MDR1; + double F_BULK1; for (int contactSide = 0; contactSide < 2; contactSide++) { @@ -607,7 +621,7 @@ double GranSubModNormalMDR::calculate_forces() // displacement partitioning only necessary for particle-particle contact // itag and jtag persist after neighbor list builds, use tags to compare to match - // contact history variables consistently across steps for a particle pair. + // contact history variables consistently across steps for a particle pair. if ((contactSide == 0 && itag_true > jtag_true) || (contactSide != 0 && itag_true < jtag_true)) { gm->i = i_true; gm->j = j_true; @@ -804,8 +818,10 @@ double GranSubModNormalMDR::calculate_forces() F_MDR = calculate_nonadhesive_mdr_force(deltae1D, Ainv, Eeff, A, B); } - if (std::isnan(F_MDR)) + if (std::isnan(F_MDR)) { + printf("itag = %d, jtag = %d \n", itag_true, jtag_true); error->one(FLERR, "F_MDR is NaN, case 1: no tensile springs"); + } if (history_update) *aAdh_offset = a_fac * a_na; } else { @@ -861,15 +877,20 @@ double GranSubModNormalMDR::calculate_forces() } aAdh = aAdh_tmp; - g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - pow(aAdh, 2)); - g_aAdh = round_up_negative_epsilon(g_aAdh); + if (aAdh < acrit) { + aAdh = 0.0; + F_MDR = 0.0; + } else { + g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - pow(aAdh, 2)); + g_aAdh = round_up_negative_epsilon(g_aAdh); - const double deltaeAdh = g_aAdh; - const double F_na = calculate_nonadhesive_mdr_force(deltaeAdh, Ainv, Eeff, A, B); - const double F_Adhes = 2.0 * Eeff * (deltae1D - deltaeAdh) * aAdh; - F_MDR = F_na + F_Adhes; - if (std::isnan(F_MDR)) - error->one(FLERR, "F_MDR is NaN, case 3: tensile springs exceed critical length"); + const double deltaeAdh = g_aAdh; + const double F_na = calculate_nonadhesive_mdr_force(deltaeAdh, Ainv, Eeff, A, B); + const double F_Adhes = 2.0 * Eeff * (deltae1D - deltaeAdh) * aAdh; + F_MDR = F_na + F_Adhes; + if (std::isnan(F_MDR)) + error->one(FLERR, "F_MDR is NaN, case 3: tensile springs exceed critical length"); + } } if (history_update) *aAdh_offset = aAdh; } @@ -891,13 +912,22 @@ double GranSubModNormalMDR::calculate_forces() } Ac_avg += wij * Ac; + // wzunker damping contact area related things + (gamma > 0.0) ? a_damp += aAdh : a_damp += a_na; + // bulk force calculation double F_BULK; (delta_BULK <= 0.0) ? F_BULK = 0.0 : F_BULK = (1.0 / Vgeo[i]) * Acon0[i] * delta_BULK * kappa * Ac; + // force-magnifier + // total force calculation (contactSide == 0) ? F0 = F_MDR + F_BULK : F1 = F_MDR + F_BULK; + // wzunker + (contactSide == 0) ? F_MDR0 = F_MDR : F_MDR1 = F_MDR; + (contactSide == 0) ? F_BULK0 = F_BULK : F_BULK1 = F_BULK; + if (history_update) { // mean surface displacement calculation *Ac_offset = wij * Ac; @@ -921,6 +951,32 @@ double GranSubModNormalMDR::calculate_forces() dRnumerator[i] -= Vo * (eps_bar_contact - *eps_bar_offset); dRnumerator[i] -= wij * MY_PI * ddeltao * (2 * deltao * Ro - pow(deltao, 2) + pow(R, 2) - pow(Ro, 2)); dRdenominator[i] += wij * 2.0 * MY_PI * R * (deltao + R - Ro); + + + // wzunker + //if (gm->contact_type == PAIR && i == 0) { + // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/bulk_response/compression_sleeve/dR_parameters_0.csv"); + // std::stringstream rowDataStream; + // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision + // rowDataStream << wij << ", " << dRnumerator[i] << ", " << dRdenominator[i] << ", " << eps_bar_contact << ", " << *eps_bar_offset << ", " << ddeltao << ", " << deltao << ", " << R << ", " << Fntmp << ", " << lmp->update->ntimestep; + // std::string rowData = rowDataStream.str(); + // csvWriter.writeRow(rowData); + //} +// + //if (gm->contact_type == PAIR && i == 1) { + // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/bulk_response/compression_sleeve/dR_parameters_1.csv"); + // std::stringstream rowDataStream; + // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision + // rowDataStream << wij << ", " << dRnumerator[i] << ", " << dRdenominator[i] << ", " << eps_bar_contact << ", " << *eps_bar_offset << ", " << ddeltao << ", " << deltao << ", " << R << ", " << Fntmp << ", " << lmp->update->ntimestep; + // std::string rowData = rowDataStream.str(); + // csvWriter.writeRow(rowData); + //} + + // wzunker + //if (gm->contact_type == PAIR) { + // printf("i = %d, j = %d, contact_type = %d, dRnumerator = %f, dRdenominator = %f, eps_bar_contact = %f, eps_bar_offset = %f, wij = %f, ddelto = %f, deltao = %f, R = %f, Fntmp = %f \n", i, gm->j, gm->contact_type, dRnumerator[i], dRdenominator[i], eps_bar_contact, *eps_bar_offset, wij, ddeltao, deltao, R, Fntmp); + //} + } if (history_update) { @@ -944,31 +1000,106 @@ double GranSubModNormalMDR::calculate_forces() const double wij = MAX(1.0 - pij, 0.0); // assign final force + double damp_prefactor; if (gm->contact_type != PAIR) { - F = wij * F0; + a_damp = a_damp/2.0; + damp_prefactor = 0.5*sqrt(gm->meff * 2.0 * Eeff2particle * a_damp); + double *deltao_offset = &history[DELTAO_0]; + const double wfm = std::exp(10.7*(*deltao_offset)/Rinitial[gm->i] - 10.0) + 1.0; // wall force magnifier + //const double wfm = 1.0; + F = wij * F0 * wfm; } else { + damp_prefactor = 0.5*sqrt(gm->meff * 2.0 * Eeff * a_damp); F = wij * (F0 + F1) * 0.5; } // calculate damping force - if (F > 0.0) { - double Eeff2; - double Reff2; - if (gm->contact_type == PAIR) { - Eeff2 = E / (2.0 * (1.0 - pow(nu, 2))); - Reff2 = 1.0 / ((1.0 / gm->radi + 1.0 / gm->radj)); - } else { - Eeff2 = E / (1.0 - pow(nu, 2)); - Reff2 = gm->radi; - } - const double kn = Eeff2 * Reff2; - const double beta = -log(CoR) / sqrt(pow(log(CoR), 2) + PISQ); - const double damp_prefactor = beta * sqrt(gm->meff * kn); - const double F_DAMP = -damp_prefactor * gm->vnnr; + //if (F > 0.0) { + // double Eeff2; + // double Reff2; + // if (gm->contact_type == PAIR) { + // Eeff2 = E / (2.0 * (1.0 - pow(nu, 2))); + // Reff2 = 1.0 / ((1.0 / gm->radi + 1.0 / gm->radj)); + // } else { + // Eeff2 = E / (1.0 - pow(nu, 2)); + // Reff2 = gm->radi; + // } + // const double kn = Eeff2 * Reff2; + // const double beta = -log(CoR) / sqrt(pow(log(CoR), 2) + PISQ); + // const double damp_prefactor = beta * sqrt(gm->meff * kn); + // const double F_DAMP = -damp_prefactor * gm->vnnr; + // + // F += wij * F_DAMP; + //} - F += wij * F_DAMP; + // calculate damping force + if (F > 0.0) F += -wij * damp * gm->vnnr; + + //F += -wij * damp_prefactor * gm->vnnr; + + //printf("i = %d, j = %d, wij = %f, damp = %f, vnnr = %e, F_DAMP = %e \n", gm->i, gm->j, wij, damp, gm->vnnr, -wij * damp * gm->vnnr); + + // wzunker + double *delta_offset_0 = &history[DELTA_0]; + double *delta_offset_1 = &history[DELTA_0 + 1]; + const double delta0 = *delta_offset_0; + const double delta1 = *delta_offset_1; + double *delta_BULK_offset_0 = &history[DELTA_BULK_0]; + double *delta_BULK_offset_1 = &history[DELTA_BULK_0 + 1]; + const double deltaBULK0 = *delta_BULK_offset_0; + const double deltaBULK1 = *delta_BULK_offset_1; + double *aAdh_offset_0 = &history[AADH_0]; + double *aAdh_offset_1 = &history[AADH_0 + 1]; + const double aAdh0 = *aAdh_offset_0; + const double aAdh1 = *aAdh_offset_1; + double *Ac_offset_0 = &history[AC_0]; + double *Ac_offset_1 = &history[AC_0 + 1]; + const double Ac0 = *Ac_offset_0; + const double Ac1 = *Ac_offset_1; + double F_DAMP = -wij * damp * gm->vnnr; + + const double i_0 = 0; + const double i_1 = 1; + double psi_0; + double psi_1; + double Acon_0; + double Acon_1; + double Vgeo_0; + double Vgeo_1; + if (itag_true == i_0) { + psi_0 = psi[gm->i]; + psi_1 = psi[gm->j]; + Acon_0 = Acon0[gm->i]; + Acon_1 = Acon0[gm->j]; + Vgeo_0 = Vgeo[gm->i]; + Vgeo_1 = Vgeo[gm->j]; + } else { + psi_0 = psi[gm->j]; + psi_1 = psi[gm->i]; + Acon_0 = Acon0[gm->j]; + Acon_1 = Acon0[gm->i]; + Vgeo_0 = Vgeo[gm->j]; + Vgeo_1 = Vgeo[gm->i]; } + //if ( (itag_true == i_0 && jtag_true == i_1) || (itag_true == i_1 && jtag_true == i_0) ) { + // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/avicel_tableting/avicel_tableting_pair_info.csv"); + // std::stringstream rowDataStream; + // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision + // rowDataStream << itag_true << ", " << jtag_true << ", " << delta0 << ", " << delta1 << ", " << F0 << ", " << F1 << ", " << F << ", " << gm->radi << ", " << gm->radj << ", " << wij << ", " << psi_0 << ", " << psi_1 << ", " << aAdh0 << ", " << aAdh1 << ", " << Ac0 << ", " << Ac1 << ", " << F_MDR0 << ", " << F_MDR1 << ", " << F_BULK0 << ", " << F_BULK1 << ", " << deltaBULK0 << ", " << deltaBULK1 << ", " << Acon_0 << ", " << Acon_1 << ", " << Vgeo_0 << ", " << Vgeo_1 << ", " << kappa << ", " << lmp->update->ntimestep; + // std::string rowData = rowDataStream.str(); + // csvWriter.writeRow(rowData); + //} + + //if ( (gm->contact_type == PAIR) ) { + // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/bulk_response/sticky/pair_info.csv"); + // std::stringstream rowDataStream; + // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision + // rowDataStream << itag_true << ", " << jtag_true << ", " << delta0 << ", " << delta1 << ", " << F0 << ", " << F1 << ", " << F << ", " << gm->radi << ", " << gm->radj << ", " << wij << ", " << psi_0 << ", " << psi_1 << ", " << aAdh0 << ", " << aAdh1 << ", " << Ac0 << ", " << Ac1 << ", " << F_MDR0 << ", " << F_MDR1 << ", " << F_BULK0 << ", " << F_BULK1 << ", " << deltaBULK0 << ", " << deltaBULK1 << ", " << Acon_0 << ", " << Acon_1 << ", " << Vgeo_0 << ", " << Vgeo_1 << ", " << kappa << ", " << F_DAMP << ", " << gm->vnnr << ", " << delta << ", " << lmp->update->ntimestep; + // std::string rowData = rowDataStream.str(); + // csvWriter.writeRow(rowData); + //} + return F; } diff --git a/src/GRANULAR/gran_sub_mod_normal.h b/src/GRANULAR/gran_sub_mod_normal.h index db96227f13..b096e03ca8 100644 --- a/src/GRANULAR/gran_sub_mod_normal.h +++ b/src/GRANULAR/gran_sub_mod_normal.h @@ -147,7 +147,7 @@ namespace Granular_NS { protected: double G, kappa, Eeff; // derived coeffs - double Eeffsq, Eeffinv, Eeffsqinv; + double Eeffsq, Eeffinv, Eeffsqinv, Eeff2particle; double gammasq, gamma3, gamma4; int warn_flag; @@ -155,6 +155,7 @@ namespace Granular_NS { int index_Ro, index_Vgeo, index_Velas, index_Vcaps, index_eps_bar, index_dRnumerator; int index_dRdenominator, index_Acon0, index_Acon1, index_Atot, index_Atot_sum, index_ddelta_bar; int index_psi, index_sigmaxx, index_sigmayy, index_sigmazz, index_contacts, index_adhesive_length; + int index_dRavg; int fix_mdr_flag; char *id_fix; diff --git a/src/GRANULAR/granular_model.cpp b/src/GRANULAR/granular_model.cpp index e96debd59e..448281cfa6 100644 --- a/src/GRANULAR/granular_model.cpp +++ b/src/GRANULAR/granular_model.cpp @@ -251,8 +251,8 @@ void GranularModel::init() // Must have valid normal, damping, and tangential models if (normal_model->name == "none") error->all(FLERR, "Must specify normal granular model"); if (normal_model->name == "mdr") { - if (damping_model->name != "none") - error->all(FLERR, "MDR require 'none' damping model. To damp, specify a coefficient of restitution < 1."); + //if (damping_model->name != "none") + //error->all(FLERR, "MDR require 'none' damping model. To damp, specify a coefficient of restitution < 1."); } else { if (damping_model->name == "none") error->all(FLERR, "Must specify damping granular model"); } diff --git a/src/csv_writer.h b/src/csv_writer.h new file mode 100644 index 0000000000..0a01604393 --- /dev/null +++ b/src/csv_writer.h @@ -0,0 +1,25 @@ +#include +#include +#include + +class CSVWriter { +public: + CSVWriter(const std::string& filename) : filename_(filename) {} + + void writeRow(const std::string& data) { + std::ofstream file; + // Use the append mode to add data to the end of the file if it exists + file.open(filename_, std::ios::out | std::ios::app); + + if (!file.is_open()) { + std::cerr << "Failed to open file: " << filename_ << std::endl; + return; + } + + file << data << std::endl; + file.close(); + } + +private: + std::string filename_; +}; \ No newline at end of file From 3aafe2831b7c2d925a1c6fc5d3f4dd85053eb1a8 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Thu, 27 Mar 2025 16:50:54 -0400 Subject: [PATCH 17/94] added MDR damping method --- src/GRANULAR/fix_granular_mdr.h | 5 +++-- src/GRANULAR/gran_sub_mod_damping.cpp | 26 ++++++++++++++++++++++++++ src/GRANULAR/gran_sub_mod_damping.h | 9 +++++++++ src/GRANULAR/gran_sub_mod_normal.cpp | 20 ++++++++++++++------ 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/GRANULAR/fix_granular_mdr.h b/src/GRANULAR/fix_granular_mdr.h index 56c576d79b..fce727fe5d 100644 --- a/src/GRANULAR/fix_granular_mdr.h +++ b/src/GRANULAR/fix_granular_mdr.h @@ -51,7 +51,8 @@ namespace Granular_MDR_NS { PENALTY, // contact penalty DELTA_MAX, DELTAP_0, - DELTAP_1 + DELTAP_1, + DAMP_SCALE }; } // namespace Granular_MDR_NS @@ -97,7 +98,7 @@ class FixGranularMDR : public Fix { int index_sigmayy; // yy-component of the stress tensor, not necessary forforce calculation int index_sigmazz; // zz-component of the stress tensor, not necessary forforce calculation int index_history_setup_flag; // flag to check if history variables have beeninitialized - int index_dRavg; // total contacts on particle + int index_dRavg; // average radius update increment }; } // namespace LAMMPS_NS diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 4072944d5e..a9b7f68d4e 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -14,6 +14,7 @@ #include "gran_sub_mod_damping.h" #include "gran_sub_mod_normal.h" +#include "fix_granular_mdr.h" #include "granular_model.h" #include "math_special.h" #include "math_const.h" @@ -176,3 +177,28 @@ void GranSubModDampingCoeffRestitution::init() damp /= sqrt(MY_PI * MY_PI + logcor * logcor); } } + +/* ---------------------------------------------------------------------- + MDR damping +------------------------------------------------------------------------- */ + +GranSubModDampingMDR::GranSubModDampingMDR(GranularModel *gm, LAMMPS *lmp) : + GranSubModDamping(gm, lmp) +{ + contact_radius_flag = 1; +} + +/* ---------------------------------------------------------------------- */ + +double GranSubModDampingMDR::calculate_forces() +{ + using namespace Granular_MDR_NS; + double *history = & gm->history[gm->normal_model->history_index]; // load in all history variables + //printf("%p %d damping\n", (void*)& history[DAMP_SCALE], gm->normal_model->history_index); + damp_prefactor = damp * history[DAMP_SCALE]; + return -damp_prefactor * gm->vnnr; +} + + + + //printf("DAMP_SCALE = %d, damp_scale_history = %e, damp = %e, damp_prefactor = %e, F_DAMP = %e \n", DAMP_SCALE, history[DAMP_SCALE], damp, damp_prefactor, -damp_prefactor * gm->vnnr); diff --git a/src/GRANULAR/gran_sub_mod_damping.h b/src/GRANULAR/gran_sub_mod_damping.h index 98c31d680a..06aabbc5ca 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -19,6 +19,7 @@ GranSubModStyle(mass_velocity,GranSubModDampingMassVelocity,DAMPING); GranSubModStyle(viscoelastic,GranSubModDampingViscoelastic,DAMPING); GranSubModStyle(tsuji,GranSubModDampingTsuji,DAMPING); GranSubModStyle(coeff_restitution,GranSubModDampingCoeffRestitution,DAMPING); +GranSubModStyle(mdr,GranSubModDampingMDR,DAMPING); // clang-format on #else @@ -95,6 +96,14 @@ namespace Granular_NS { /* ---------------------------------------------------------------------- */ + class GranSubModDampingMDR : public GranSubModDamping { + public: + GranSubModDampingMDR(class GranularModel *, class LAMMPS *); + double calculate_forces() override; + }; + + /* ---------------------------------------------------------------------- */ + } // namespace Granular_NS } // namespace LAMMPS_NS diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index 6511f75c30..37ae769016 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -445,7 +445,7 @@ GranSubModNormalMDR::GranSubModNormalMDR(GranularModel *gm, LAMMPS *lmp) : num_coeffs = 6; contact_radius_flag = 1; - size_history = 26; + size_history = 27; nsvector = 1; fix_mdr_flag = 0; id_fix = nullptr; @@ -484,7 +484,7 @@ void GranSubModNormalMDR::coeffs_to_local() if (gamma < 0.0) error->all(FLERR, "Illegal MDR normal model, effective surface energy must be greater than or equal to 0"); if (psi_b < 0.0 || psi_b > 1.0) error->all(FLERR, "Illegal MDR normal model, psi_b must be between 0 and 1.0"); //if (CoR < 0.0 || CoR > 1.0) error->all(FLERR, "Illegal MDR normal model, coefficent of restitution must be between 0 and 1.0"); - if (damp < 0.0) error->all(FLERR, "Illegal MDR normal model, damping coefficent must be greater than 1"); + if (damp < 0.0) error->all(FLERR, "Illegal MDR normal model, damping coefficent must be greater than or equal to 0"); G = E / (2.0 * (1.0 + nu)); // shear modulus kappa = E / (3.0 * (1.0 - 2.0 * nu)); // bulk modulus @@ -1000,19 +1000,27 @@ double GranSubModNormalMDR::calculate_forces() const double wij = MAX(1.0 - pij, 0.0); // assign final force - double damp_prefactor; + double damp_scale; if (gm->contact_type != PAIR) { a_damp = a_damp/2.0; - damp_prefactor = 0.5*sqrt(gm->meff * 2.0 * Eeff2particle * a_damp); + damp_scale = 0.5*sqrt(gm->meff * 2.0 * Eeff2particle * a_damp); double *deltao_offset = &history[DELTAO_0]; const double wfm = std::exp(10.7*(*deltao_offset)/Rinitial[gm->i] - 10.0) + 1.0; // wall force magnifier //const double wfm = 1.0; F = wij * F0 * wfm; } else { - damp_prefactor = 0.5*sqrt(gm->meff * 2.0 * Eeff * a_damp); + damp_scale = 0.5*sqrt(gm->meff * 2.0 * Eeff * a_damp); F = wij * (F0 + F1) * 0.5; } + if (history_update) { + double *damp_scale_offset = & history[DAMP_SCALE]; + //printf("damp_scale_history = %e \n", history[DAMP_SCALE]); + (a_damp < 0.0) ? *damp_scale_offset = 0.0 : *damp_scale_offset = damp_scale; + //printf("DAMP_SCALE = %d, damp_scale_history = %e, damp = %e, a_damp = %e, damp_scale = %e \n", DAMP_SCALE, history[DAMP_SCALE], damp, a_damp, damp_scale); + //printf("%p %d normal\n", (void*)& history[DAMP_SCALE], history_index); + } + // calculate damping force //if (F > 0.0) { // double Eeff2; @@ -1033,7 +1041,7 @@ double GranSubModNormalMDR::calculate_forces() //} // calculate damping force - if (F > 0.0) F += -wij * damp * gm->vnnr; + // if (F > 0.0) F += -wij * damp * gm->vnnr; //F += -wij * damp_prefactor * gm->vnnr; From 8ee8cb1aa339103b09ed8e7daccb6296ab329957 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Thu, 27 Mar 2025 20:40:35 -0400 Subject: [PATCH 18/94] code clean-up --- src/GRANULAR/fix_granular_mdr.cpp | 26 ----- src/GRANULAR/gran_sub_mod_damping.cpp | 8 +- src/GRANULAR/gran_sub_mod_normal.cpp | 133 +------------------------- 3 files changed, 3 insertions(+), 164 deletions(-) diff --git a/src/GRANULAR/fix_granular_mdr.cpp b/src/GRANULAR/fix_granular_mdr.cpp index 712d4ad1ff..ebe3288d22 100644 --- a/src/GRANULAR/fix_granular_mdr.cpp +++ b/src/GRANULAR/fix_granular_mdr.cpp @@ -38,10 +38,6 @@ #include "update.h" #include "variable.h" -// wzunker -#include "csv_writer.h" -#include - using namespace LAMMPS_NS; using namespace Granular_NS; using namespace Granular_MDR_NS; @@ -264,27 +260,8 @@ void FixGranularMDR::pre_force(int) if (dR > 0.0) dRavg[i] += (dR - dRavg[i]) / N_window; if (((radius[i] + dR) < (1.5 * Ro[i])) && (dR > 0.0)) radius[i] += dRavg[i]; - - //(dR + dRavg[i])/2.0; - //dRavg[i] = (dR + dRavg[i])/2.0; - - //// wzunker - //const double dRdenominatorTrue = (dRdenominator[i] - 4.0 * MY_PI * pow(R, 2.0)); - //if (i == 0) { - // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/bulk_response/compression_sleeve/dR_parameters.csv"); - // std::stringstream rowDataStream; - // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision - // rowDataStream << dRnumerator[i] << ", " << dRdenominator[i] << ", " << dRavg[i] << ", " << R << ", " << dRdenominatorTrue << ", " << lmp->update->ntimestep; - // std::string rowData = rowDataStream.str(); - // csvWriter.writeRow(rowData); - //} - } Acon0[i] = Acon1[i]; - - // wzunker - //const double dR_tmp = MAX(dRnumerator[i] / (dRdenominator[i] - 4.0 * MY_PI * pow(R, 2.0)), 0.0); - //printf("i = %d, psi_b = %f, psi = %f, Atot = %f, Acon = %f, dRnumerator = %f, dRdenominator = %f, R = %f, dR = %f \n", i, psi_b_coeff, psi[i], Atot[i], Acon1[i], dRnumerator[i], dRdenominator[i],radius[i],dR_tmp); } comm_stage = COMM_1; @@ -541,9 +518,6 @@ void FixGranularMDR::calculate_contact_penalty() "(e.g. increase the skin distance)."); pjk[0] += 1.0 / (1.0 + std::exp(-50.0 * (alpha / MY_PI - 0.5))); - - // wzunker - //printf("i = %d, j = %d, k = %d, pij = %f, pik = %f, pjk = %f \n", i, j, k, pij[0], pik[0], pjk[0]); } } } diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index a9b7f68d4e..1229c92842 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -77,12 +77,8 @@ GranSubModDampingVelocity::GranSubModDampingVelocity(GranularModel *gm, LAMMPS * double GranSubModDampingVelocity::calculate_forces() { - if (gm->normal_model->name == "mdr") { - return 0.0; - } else { - damp_prefactor = damp; - return -damp_prefactor * gm->vnnr; - } + damp_prefactor = damp; + return -damp_prefactor * gm->vnnr; } /* ---------------------------------------------------------------------- diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index 37ae769016..cebaf72283 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -26,9 +26,6 @@ #include #include -// wzunker -#include "csv_writer.h" - using namespace LAMMPS_NS; using namespace Granular_NS; using namespace MathConst; @@ -605,12 +602,6 @@ double GranSubModNormalMDR::calculate_forces() if (gm->delta >= *deltamax_offset) *deltamax_offset = gm->delta; double deltamax = *deltamax_offset; - //wzunker - double F_MDR0; - double F_BULK0; - double F_MDR1; - double F_BULK1; - for (int contactSide = 0; contactSide < 2; contactSide++) { double *delta_offset, *deltao_offset, *delta_MDR_offset, *delta_BULK_offset; @@ -912,22 +903,16 @@ double GranSubModNormalMDR::calculate_forces() } Ac_avg += wij * Ac; - // wzunker damping contact area related things + // contact radius for damping (gamma > 0.0) ? a_damp += aAdh : a_damp += a_na; // bulk force calculation double F_BULK; (delta_BULK <= 0.0) ? F_BULK = 0.0 : F_BULK = (1.0 / Vgeo[i]) * Acon0[i] * delta_BULK * kappa * Ac; - // force-magnifier - // total force calculation (contactSide == 0) ? F0 = F_MDR + F_BULK : F1 = F_MDR + F_BULK; - // wzunker - (contactSide == 0) ? F_MDR0 = F_MDR : F_MDR1 = F_MDR; - (contactSide == 0) ? F_BULK0 = F_BULK : F_BULK1 = F_BULK; - if (history_update) { // mean surface displacement calculation *Ac_offset = wij * Ac; @@ -951,32 +936,6 @@ double GranSubModNormalMDR::calculate_forces() dRnumerator[i] -= Vo * (eps_bar_contact - *eps_bar_offset); dRnumerator[i] -= wij * MY_PI * ddeltao * (2 * deltao * Ro - pow(deltao, 2) + pow(R, 2) - pow(Ro, 2)); dRdenominator[i] += wij * 2.0 * MY_PI * R * (deltao + R - Ro); - - - // wzunker - //if (gm->contact_type == PAIR && i == 0) { - // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/bulk_response/compression_sleeve/dR_parameters_0.csv"); - // std::stringstream rowDataStream; - // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision - // rowDataStream << wij << ", " << dRnumerator[i] << ", " << dRdenominator[i] << ", " << eps_bar_contact << ", " << *eps_bar_offset << ", " << ddeltao << ", " << deltao << ", " << R << ", " << Fntmp << ", " << lmp->update->ntimestep; - // std::string rowData = rowDataStream.str(); - // csvWriter.writeRow(rowData); - //} -// - //if (gm->contact_type == PAIR && i == 1) { - // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/bulk_response/compression_sleeve/dR_parameters_1.csv"); - // std::stringstream rowDataStream; - // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision - // rowDataStream << wij << ", " << dRnumerator[i] << ", " << dRdenominator[i] << ", " << eps_bar_contact << ", " << *eps_bar_offset << ", " << ddeltao << ", " << deltao << ", " << R << ", " << Fntmp << ", " << lmp->update->ntimestep; - // std::string rowData = rowDataStream.str(); - // csvWriter.writeRow(rowData); - //} - - // wzunker - //if (gm->contact_type == PAIR) { - // printf("i = %d, j = %d, contact_type = %d, dRnumerator = %f, dRdenominator = %f, eps_bar_contact = %f, eps_bar_offset = %f, wij = %f, ddelto = %f, deltao = %f, R = %f, Fntmp = %f \n", i, gm->j, gm->contact_type, dRnumerator[i], dRdenominator[i], eps_bar_contact, *eps_bar_offset, wij, ddeltao, deltao, R, Fntmp); - //} - } if (history_update) { @@ -1015,99 +974,9 @@ double GranSubModNormalMDR::calculate_forces() if (history_update) { double *damp_scale_offset = & history[DAMP_SCALE]; - //printf("damp_scale_history = %e \n", history[DAMP_SCALE]); (a_damp < 0.0) ? *damp_scale_offset = 0.0 : *damp_scale_offset = damp_scale; - //printf("DAMP_SCALE = %d, damp_scale_history = %e, damp = %e, a_damp = %e, damp_scale = %e \n", DAMP_SCALE, history[DAMP_SCALE], damp, a_damp, damp_scale); - //printf("%p %d normal\n", (void*)& history[DAMP_SCALE], history_index); } - // calculate damping force - //if (F > 0.0) { - // double Eeff2; - // double Reff2; - // if (gm->contact_type == PAIR) { - // Eeff2 = E / (2.0 * (1.0 - pow(nu, 2))); - // Reff2 = 1.0 / ((1.0 / gm->radi + 1.0 / gm->radj)); - // } else { - // Eeff2 = E / (1.0 - pow(nu, 2)); - // Reff2 = gm->radi; - // } - // const double kn = Eeff2 * Reff2; - // const double beta = -log(CoR) / sqrt(pow(log(CoR), 2) + PISQ); - // const double damp_prefactor = beta * sqrt(gm->meff * kn); - // const double F_DAMP = -damp_prefactor * gm->vnnr; - // - // F += wij * F_DAMP; - //} - - // calculate damping force - // if (F > 0.0) F += -wij * damp * gm->vnnr; - - //F += -wij * damp_prefactor * gm->vnnr; - - //printf("i = %d, j = %d, wij = %f, damp = %f, vnnr = %e, F_DAMP = %e \n", gm->i, gm->j, wij, damp, gm->vnnr, -wij * damp * gm->vnnr); - - // wzunker - double *delta_offset_0 = &history[DELTA_0]; - double *delta_offset_1 = &history[DELTA_0 + 1]; - const double delta0 = *delta_offset_0; - const double delta1 = *delta_offset_1; - double *delta_BULK_offset_0 = &history[DELTA_BULK_0]; - double *delta_BULK_offset_1 = &history[DELTA_BULK_0 + 1]; - const double deltaBULK0 = *delta_BULK_offset_0; - const double deltaBULK1 = *delta_BULK_offset_1; - double *aAdh_offset_0 = &history[AADH_0]; - double *aAdh_offset_1 = &history[AADH_0 + 1]; - const double aAdh0 = *aAdh_offset_0; - const double aAdh1 = *aAdh_offset_1; - double *Ac_offset_0 = &history[AC_0]; - double *Ac_offset_1 = &history[AC_0 + 1]; - const double Ac0 = *Ac_offset_0; - const double Ac1 = *Ac_offset_1; - double F_DAMP = -wij * damp * gm->vnnr; - - const double i_0 = 0; - const double i_1 = 1; - double psi_0; - double psi_1; - double Acon_0; - double Acon_1; - double Vgeo_0; - double Vgeo_1; - if (itag_true == i_0) { - psi_0 = psi[gm->i]; - psi_1 = psi[gm->j]; - Acon_0 = Acon0[gm->i]; - Acon_1 = Acon0[gm->j]; - Vgeo_0 = Vgeo[gm->i]; - Vgeo_1 = Vgeo[gm->j]; - } else { - psi_0 = psi[gm->j]; - psi_1 = psi[gm->i]; - Acon_0 = Acon0[gm->j]; - Acon_1 = Acon0[gm->i]; - Vgeo_0 = Vgeo[gm->j]; - Vgeo_1 = Vgeo[gm->i]; - } - - //if ( (itag_true == i_0 && jtag_true == i_1) || (itag_true == i_1 && jtag_true == i_0) ) { - // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/avicel_tableting/avicel_tableting_pair_info.csv"); - // std::stringstream rowDataStream; - // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision - // rowDataStream << itag_true << ", " << jtag_true << ", " << delta0 << ", " << delta1 << ", " << F0 << ", " << F1 << ", " << F << ", " << gm->radi << ", " << gm->radj << ", " << wij << ", " << psi_0 << ", " << psi_1 << ", " << aAdh0 << ", " << aAdh1 << ", " << Ac0 << ", " << Ac1 << ", " << F_MDR0 << ", " << F_MDR1 << ", " << F_BULK0 << ", " << F_BULK1 << ", " << deltaBULK0 << ", " << deltaBULK1 << ", " << Acon_0 << ", " << Acon_1 << ", " << Vgeo_0 << ", " << Vgeo_1 << ", " << kappa << ", " << lmp->update->ntimestep; - // std::string rowData = rowDataStream.str(); - // csvWriter.writeRow(rowData); - //} - - //if ( (gm->contact_type == PAIR) ) { - // CSVWriter csvWriter("/Users/willzunker/simulations/lammps/bulk_response/sticky/pair_info.csv"); - // std::stringstream rowDataStream; - // rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision - // rowDataStream << itag_true << ", " << jtag_true << ", " << delta0 << ", " << delta1 << ", " << F0 << ", " << F1 << ", " << F << ", " << gm->radi << ", " << gm->radj << ", " << wij << ", " << psi_0 << ", " << psi_1 << ", " << aAdh0 << ", " << aAdh1 << ", " << Ac0 << ", " << Ac1 << ", " << F_MDR0 << ", " << F_MDR1 << ", " << F_BULK0 << ", " << F_BULK1 << ", " << deltaBULK0 << ", " << deltaBULK1 << ", " << Acon_0 << ", " << Acon_1 << ", " << Vgeo_0 << ", " << Vgeo_1 << ", " << kappa << ", " << F_DAMP << ", " << gm->vnnr << ", " << delta << ", " << lmp->update->ntimestep; - // std::string rowData = rowDataStream.str(); - // csvWriter.writeRow(rowData); - //} - return F; } From eeaf0694ad7142a7d39c2726dfbf37ecedd03837 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Mon, 31 Mar 2025 22:13:29 -0400 Subject: [PATCH 19/94] white space and comment removal --- src/GRANULAR/fix_granular_mdr.cpp | 2 +- src/GRANULAR/gran_sub_mod_damping.cpp | 10 ++-------- src/GRANULAR/gran_sub_mod_normal.cpp | 10 ++++------ src/GRANULAR/granular_model.cpp | 7 +------ 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/GRANULAR/fix_granular_mdr.cpp b/src/GRANULAR/fix_granular_mdr.cpp index ebe3288d22..0e9a5ada7f 100644 --- a/src/GRANULAR/fix_granular_mdr.cpp +++ b/src/GRANULAR/fix_granular_mdr.cpp @@ -256,7 +256,7 @@ void FixGranularMDR::pre_force(int) ( psi[i] > 0.1 ) ? w_confinement = 1.0/(1.0 + exp(-75.0*(psi[i]-0.2))) : w_confinement = 0.0; const double dR = MAX(dRnumerator[i] / (dRdenominator[i] - 4.0 * MY_PI * pow(R, 2.0))*w_confinement, 0.0); - const double N_window = 10.0; + const double N_window = 10.0; if (dR > 0.0) dRavg[i] += (dR - dRavg[i]) / N_window; if (((radius[i] + dR) < (1.5 * Ro[i])) && (dR > 0.0)) radius[i] += dRavg[i]; diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 1229c92842..1e233de38e 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -20,7 +20,6 @@ #include "math_const.h" #include "style_gran_sub_mod.h" // IWYU pragma: keep - #include using namespace LAMMPS_NS; @@ -189,12 +188,7 @@ GranSubModDampingMDR::GranSubModDampingMDR(GranularModel *gm, LAMMPS *lmp) : double GranSubModDampingMDR::calculate_forces() { using namespace Granular_MDR_NS; - double *history = & gm->history[gm->normal_model->history_index]; // load in all history variables - //printf("%p %d damping\n", (void*)& history[DAMP_SCALE], gm->normal_model->history_index); + double *history = & gm->history[gm->normal_model->history_index]; damp_prefactor = damp * history[DAMP_SCALE]; return -damp_prefactor * gm->vnnr; -} - - - - //printf("DAMP_SCALE = %d, damp_scale_history = %e, damp = %e, damp_prefactor = %e, F_DAMP = %e \n", DAMP_SCALE, history[DAMP_SCALE], damp, damp_prefactor, -damp_prefactor * gm->vnnr); +} \ No newline at end of file diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index cebaf72283..f27057e5b2 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -472,7 +472,6 @@ void GranSubModNormalMDR::coeffs_to_local() Y = coeffs[2]; // yield stress gamma = coeffs[3]; // effective surface energy psi_b = coeffs[4]; // bulk response trigger based on ratio of remaining free area: A_{free}/A_{total} - //CoR = coeffs[5]; // coefficent of restitution damp = coeffs[5]; // coefficent of restitution if (E <= 0.0) error->all(FLERR, "Illegal MDR normal model, Young's modulus must be greater than 0"); @@ -480,7 +479,6 @@ void GranSubModNormalMDR::coeffs_to_local() if (Y < 0.0) error->all(FLERR, "Illegal MDR normal model, yield stress must be greater than or equal to 0"); if (gamma < 0.0) error->all(FLERR, "Illegal MDR normal model, effective surface energy must be greater than or equal to 0"); if (psi_b < 0.0 || psi_b > 1.0) error->all(FLERR, "Illegal MDR normal model, psi_b must be between 0 and 1.0"); - //if (CoR < 0.0 || CoR > 1.0) error->all(FLERR, "Illegal MDR normal model, coefficent of restitution must be between 0 and 1.0"); if (damp < 0.0) error->all(FLERR, "Illegal MDR normal model, damping coefficent must be greater than or equal to 0"); G = E / (2.0 * (1.0 + nu)); // shear modulus @@ -531,7 +529,7 @@ void GranSubModNormalMDR::init() index_sigmaxx = atom->find_custom("sigmaxx", tmp1, tmp2); // xx-component of the stress tensor, not necessary for force calculation index_sigmayy = atom->find_custom("sigmayy", tmp1, tmp2); // yy-component of the stress tensor, not necessary for force calculation index_sigmazz = atom->find_custom("sigmazz", tmp1, tmp2); // zz-component of the stress tensor, not necessary for force calculation - index_dRavg = atom->find_custom("dRavg", tmp1, tmp2); // radius update increment + index_dRavg = atom->find_custom("dRavg", tmp1, tmp2); // radius update increment } /* ---------------------------------------------------------------------- */ @@ -871,7 +869,7 @@ double GranSubModNormalMDR::calculate_forces() if (aAdh < acrit) { aAdh = 0.0; F_MDR = 0.0; - } else { + } else { g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - pow(aAdh, 2)); g_aAdh = round_up_negative_epsilon(g_aAdh); @@ -879,7 +877,7 @@ double GranSubModNormalMDR::calculate_forces() const double F_na = calculate_nonadhesive_mdr_force(deltaeAdh, Ainv, Eeff, A, B); const double F_Adhes = 2.0 * Eeff * (deltae1D - deltaeAdh) * aAdh; F_MDR = F_na + F_Adhes; - if (std::isnan(F_MDR)) + if (std::isnan(F_MDR)) error->one(FLERR, "F_MDR is NaN, case 3: tensile springs exceed critical length"); } } @@ -904,7 +902,7 @@ double GranSubModNormalMDR::calculate_forces() Ac_avg += wij * Ac; // contact radius for damping - (gamma > 0.0) ? a_damp += aAdh : a_damp += a_na; + (gamma > 0.0) ? a_damp += aAdh : a_damp += a_na; // bulk force calculation double F_BULK; diff --git a/src/GRANULAR/granular_model.cpp b/src/GRANULAR/granular_model.cpp index 448281cfa6..1a3a46b12e 100644 --- a/src/GRANULAR/granular_model.cpp +++ b/src/GRANULAR/granular_model.cpp @@ -250,12 +250,7 @@ void GranularModel::init() // Must have valid normal, damping, and tangential models if (normal_model->name == "none") error->all(FLERR, "Must specify normal granular model"); - if (normal_model->name == "mdr") { - //if (damping_model->name != "none") - //error->all(FLERR, "MDR require 'none' damping model. To damp, specify a coefficient of restitution < 1."); - } else { - if (damping_model->name == "none") error->all(FLERR, "Must specify damping granular model"); - } + if (damping_model->name == "none") error->all(FLERR, "Must specify damping granular model"); if (tangential_model->name == "none") error->all(FLERR, "Must specify tangential granular model"); // Twisting, rolling, and heat are optional From 3c1ed34753d5f6a3997a4a1244e13c53c629c709 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Mon, 31 Mar 2025 22:16:09 -0400 Subject: [PATCH 20/94] removed csv_writer.h --- src/csv_writer.h | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 src/csv_writer.h diff --git a/src/csv_writer.h b/src/csv_writer.h deleted file mode 100644 index 0a01604393..0000000000 --- a/src/csv_writer.h +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include - -class CSVWriter { -public: - CSVWriter(const std::string& filename) : filename_(filename) {} - - void writeRow(const std::string& data) { - std::ofstream file; - // Use the append mode to add data to the end of the file if it exists - file.open(filename_, std::ios::out | std::ios::app); - - if (!file.is_open()) { - std::cerr << "Failed to open file: " << filename_ << std::endl; - return; - } - - file << data << std::endl; - file.close(); - } - -private: - std::string filename_; -}; \ No newline at end of file From b8aaa8d60ff52bc874546639ff2db548d3ab7686 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Mon, 31 Mar 2025 22:55:42 -0400 Subject: [PATCH 21/94] modified doc to include mdr damping model --- doc/src/pair_granular.rst | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 4ae59a587f..40339ab476 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -44,7 +44,7 @@ Examples pair_coeff * * hertz 1000.0 50.0 tangential mindlin 1000.0 1.0 0.4 heat area 0.1 pair_style granular - pair_coeff * * mdr 5e6 0.4 1.9e5 2.0 0.5 0.5 tangential linear_history 940.0 0.0 0.7 rolling sds 2.7e5 0.0 0.6 damping none + pair_coeff * * mdr 5e6 0.4 1.9e5 2.0 0.5 0.5 tangential linear_history 940.0 0.0 0.7 rolling sds 2.7e5 0.0 0.6 damping mdr Description """"""""""" @@ -88,7 +88,8 @@ and their required arguments are: 3. *hertz/material* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu` 4. *dmt* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` 5. *jkr* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` -6. *mdr* : :math:`E`, :math:`\nu`, :math:`Y`, :math:`\Delta\gamma`, :math:`\psi_b`, :math:`e` +6. *mdr* : :math:`E`, :math:`\nu`, :math:`Y`, :math:`\Delta\gamma`, +:math:`\psi_b`, :math:`\eta_{n0}` Here, :math:`k_n` is spring stiffness (with units that depend on model choice, see below); :math:`\eta_{n0}` is a damping prefactor (or, in its @@ -253,13 +254,6 @@ algorithm see :ref:`Zunker et al. `. newton off -The damping model must be set to *none*. The *mdr* model already has a built -in damping model. - -.. code-block:: LAMMPS - - pair_coeff * * mdr 5e6 0.4 1.9e5 2 0.5 0.5 damping none - The definition of multiple *mdr* models in the *pair_style* is currently not supported. Similarly, the *mdr* model cannot be combined with a different normal model in the *pair_style*. Physically this means that only one homogeneous @@ -336,6 +330,12 @@ for the damping model currently supported are: 3. *viscoelastic* 4. *tsuji* 5. *coeff_restitution* +6. *mdr* + +.. note:: + + It is suggested to use the *mdr* damping model with when the normal + *mdr* contact model is defined. If the *damping* keyword is not specified, the *viscoelastic* model is used by default. @@ -425,6 +425,24 @@ the damping coefficient, it accurately reproduces the specified coefficient of restitution for both monodisperse and polydisperse particle pairs. This damping model is not compatible with cohesive normal models such as *JKR* or *DMT*. +The *mdr* damping model is only compatible with the normal *mdr* contact model. +It takes into account the contact stiffness :math:`k_{mdr}` calulated +by the normal *mdr* contact model to determine the damping coefficent: + +.. math:: + + \eta_n = \eta_{n0} (m_{eff}k_{mdr})^{1/2}, + +where :math:`k_{mdr}` is proportional to contact radius :math:`a_{mdr}` tracked by the +normal *mdr* contact model: + +.. math:: + + k_{mdr} = 2 E_{eff} a_{mdr}. + +In this case, :math:`\eta_{n0}` is simply a dimensionless coefficent that scales the +the overall damping coefficent. + The total normal force is computed as the sum of the elastic and damping components: From 384d7f446b099d8be2325a5fdb5803776bc2ebb0 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Thu, 3 Apr 2025 11:56:16 -0400 Subject: [PATCH 22/94] updated damping in mdr example sims --- examples/granular/in.tableting.200 | 12 ++++++------ examples/granular/in.triaxial.compaction.12 | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/granular/in.tableting.200 b/examples/granular/in.tableting.200 index 41723c72af..4ea5801bf5 100644 --- a/examples/granular/in.tableting.200 +++ b/examples/granular/in.tableting.200 @@ -28,19 +28,19 @@ variable dieHeight equal 1e-2 pair_style granular -# mdr = E, nu, Y, gamma, psi_b, CoR +# mdr = E, nu, Y, gamma, psi_b, damp variable YoungsModulus equal 5e6 variable YieldStress equal 1.9e5 variable PoissonsRatio equal 0.4 variable SurfaceEnergy equal 2 variable SurfaceEnergyWall equal 0.0 -variable CoR equal 0.5 +variable damp equal 1.0 variable psi_b equal 0.5 # linear_history = k_t, x_gammat, mu_s variable kt equal 2/7*${YoungsModulus}*${atomRadius} variable kt_wall equal 2/7*${YoungsModulus}*${atomRadius} -variable xgammat equal 0.0 +variable xgammat equal 1.0 variable mu_s equal 0.7 variable mu_s_wall equal 0.1 @@ -49,14 +49,14 @@ variable mu_roll equal 0.6 variable k_roll equal 2.25*${mu_roll}*${mu_roll}*${YoungsModulus}*${atomRadius} variable gamma_roll equal 0.0 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${CoR} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} damping none +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} ######################################### ADD DIE AND PUNCH WALLS ############################################ variable disp_upper equal 0.0 variable disp_lower equal 0.0 -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${CoR} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} damping none" +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" variable dieHeight2 equal 2*${dieHeight} @@ -115,7 +115,7 @@ dump dumpParticles all custom ${output_rate} tableting200.dump id type mass diam ############################################## RUN SIMULATION ################################################# -variable upper_punch_stroke equal 0.6733*${dieHeight} +variable upper_punch_stroke equal 0.7*${dieHeight} variable vel_upper equal 0.25 variable settling_steps equal round(0.02/dt) diff --git a/examples/granular/in.triaxial.compaction.12 b/examples/granular/in.triaxial.compaction.12 index eee9a2bfd8..8287bb22ba 100644 --- a/examples/granular/in.triaxial.compaction.12 +++ b/examples/granular/in.triaxial.compaction.12 @@ -24,20 +24,20 @@ variable atomRadius equal 0.5 pair_style granular -# mdr = E, nu, Y, gamma, psi_b, CoR +# mdr = E, nu, Y, gamma, psi_b, damp variable YoungsModulus equal 1e9 variable PoissonsRatio equal 0.3 variable YieldStress equal 50e6 variable SurfaceEnergy equal 0.0 variable psi_b equal 0.5 -variable CoR equal 0.5 +variable damp equal 1.0 # linear_history = k_t, x_gamma,t, mu_s variable kt equal 2/7*${YoungsModulus}*${atomRadius} variable xgammat equal 0.0 variable mu_s equal 0.5 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${CoR} tangential linear_history ${kt} ${xgammat} ${mu_s} damping none +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} ######################################### ADD IN PLANES ################################################ @@ -54,7 +54,7 @@ region plane_xz_neg plane 0 -${halfBoxWidth} 0 0 1 0 side in move NULL v_plane_d region plane_xy_pos plane 0 0 ${halfBoxWidth} 0 0 -1 side in move NULL NULL v_plane_disp_neg units box region plane_xy_neg plane 0 0 -${halfBoxWidth} 0 0 1 side in move NULL NULL v_plane_disp units box -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${CoR} tangential linear_history ${kt} ${xgammat} ${mu_s} damping none" +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} " fix plane_yz_pos all wall/gran/region ${wall_contact_string} region plane_yz_pos contacts fix plane_yz_neg all wall/gran/region ${wall_contact_string} region plane_yz_neg contacts From 30bbbafd9d55d52a0a434bf0071ae825d032b2ec Mon Sep 17 00:00:00 2001 From: jtclemm Date: Fri, 4 Apr 2025 09:57:43 -0600 Subject: [PATCH 23/94] Cleaning up MDR files --- doc/src/pair_granular.rst | 12 +- examples/granular/in.tableting.200 | 15 +- examples/granular/in.triaxial.compaction.12 | 20 +- .../granular/log.4Feb25.tableting.200.g++.1 | 791 ++++++++++++++++++ .../log.4Feb25.triaxial.compaction.12.g++.1 | 779 +++++++++++++++++ src/GRANULAR/fix_granular_mdr.cpp | 19 +- src/GRANULAR/gran_sub_mod_damping.cpp | 11 +- src/GRANULAR/gran_sub_mod_damping.h | 2 +- src/GRANULAR/gran_sub_mod_normal.cpp | 1 - 9 files changed, 1615 insertions(+), 35 deletions(-) create mode 100644 examples/granular/log.4Feb25.tableting.200.g++.1 create mode 100644 examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 40339ab476..9804c90cef 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -178,6 +178,8 @@ two-part series :ref:`Zunker and Kamrin Part I ` and :ref:`Zunker and Kamrin Part II `. Further development and demonstrations of its application to industrially relevant powder compaction processes are presented in :ref:`Zunker et al. `. +If you use the *mdr* normal model, is recommended you use the *mdr* damping model +described below. The model requires the following inputs: @@ -220,12 +222,6 @@ effective stiffness related to the bulk elastic response. Here, :math:`\kappa = E/(3(1-2\nu))` is the bulk modulus and :math:`R_\textrm{min}` is the radius of the smallest particle. -.. note:: - - The *mdr* model requires some specific settings to function properly, - please read the following text carefully to ensure all requirements are - followed. - The *atom_style* must be set to *sphere 1* to enable dynamic particle radii. The *mdr* model is designed to respect the incompressibility of plastic deformation and inherently tracks free surface displacements @@ -335,7 +331,7 @@ for the damping model currently supported are: .. note:: It is suggested to use the *mdr* damping model with when the normal - *mdr* contact model is defined. + *mdr* contact model is defined. If the *damping* keyword is not specified, the *viscoelastic* model is used by default. @@ -431,7 +427,7 @@ by the normal *mdr* contact model to determine the damping coefficent: .. math:: - \eta_n = \eta_{n0} (m_{eff}k_{mdr})^{1/2}, + \eta_n = \eta_{n0} (m_{eff}k_{mdr})^{1/2}, where :math:`k_{mdr}` is proportional to contact radius :math:`a_{mdr}` tracked by the normal *mdr* contact model: diff --git a/examples/granular/in.tableting.200 b/examples/granular/in.tableting.200 index 4ea5801bf5..b9443cc36d 100644 --- a/examples/granular/in.tableting.200 +++ b/examples/granular/in.tableting.200 @@ -40,7 +40,7 @@ variable psi_b equal 0.5 # linear_history = k_t, x_gammat, mu_s variable kt equal 2/7*${YoungsModulus}*${atomRadius} variable kt_wall equal 2/7*${YoungsModulus}*${atomRadius} -variable xgammat equal 1.0 +variable xgammat equal 1.0 variable mu_s equal 0.7 variable mu_s_wall equal 0.1 @@ -49,7 +49,10 @@ variable mu_roll equal 0.6 variable k_roll equal 2.25*${mu_roll}*${mu_roll}*${YoungsModulus}*${atomRadius} variable gamma_roll equal 0.0 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} & + damping mdr & + tangential linear_history ${kt} ${xgammat} ${mu_s} & + rolling sds ${k_roll} ${gamma_roll} ${mu_roll} ######################################### ADD DIE AND PUNCH WALLS ############################################ @@ -73,7 +76,7 @@ variable avgUpperPunchForce equal c_avgUpperPunchForce compute avgLowerPunchForce all reduce sum f_lowerPunch[4] variable avgLowerPunchForce equal c_avgLowerPunchForce -fix printFD all print 1 "${disp_upper} ${avgUpperPunchForce} ${avgLowerPunchForce}" file punch_force_disp_tableting200.csv screen no +#fix printFD all print 1 "${disp_upper} ${avgUpperPunchForce} ${avgLowerPunchForce}" file punch_force_disp_tableting200.csv screen no ##################################### INTEGRATION AND GRAVITY ################################################# @@ -109,8 +112,8 @@ variable syy_ave equal c_sigmayy_ave variable szz_ave equal c_sigmazz_ave variable Vparticles equal c_Velas_sum -fix log all print 1 "${sxx_ave} ${syy_ave} ${szz_ave} ${Vparticles}" file average_normal_stresses_tableting200.csv screen no -dump dumpParticles all custom ${output_rate} tableting200.dump id type mass diameter x y z vx vy vz fx fy fz c_ke c_sigmaxx c_sigmayy c_sigmazz +#fix log all print 1 "${sxx_ave} ${syy_ave} ${szz_ave} ${Vparticles}" file average_normal_stresses_tableting200.csv screen no +#dump dumpParticles all custom ${output_rate} tableting200.dump id type mass diameter x y z vx vy vz fx fy fz c_ke c_sigmaxx c_sigmayy c_sigmazz #dump dumpParticlesVTK all vtk ${output_rate} post/particles_*.vtk id x y z fx fy fz vx vy vz c_ke radius c_sigmaxx c_sigmayy c_sigmazz ############################################## RUN SIMULATION ################################################# @@ -146,4 +149,4 @@ run ${ejection_steps} variable disp_lower equal ${dieHeight} variable disp_upper equal ${dieHeight}*0.9 variable max_disp equal ${dieRadius}*0.75 -run ${free_float_steps} \ No newline at end of file +run ${free_float_steps} diff --git a/examples/granular/in.triaxial.compaction.12 b/examples/granular/in.triaxial.compaction.12 index 8287bb22ba..d10e325721 100644 --- a/examples/granular/in.triaxial.compaction.12 +++ b/examples/granular/in.triaxial.compaction.12 @@ -1,7 +1,7 @@ ############################### SIMULATION SETTINGS ################################################### atom_style sphere 1 -atom_modify map array +atom_modify map array comm_modify vel yes units si newton off @@ -24,7 +24,7 @@ variable atomRadius equal 0.5 pair_style granular -# mdr = E, nu, Y, gamma, psi_b, damp +# mdr = E, nu, Y, gamma, psi_b, damp variable YoungsModulus equal 1e9 variable PoissonsRatio equal 0.3 variable YieldStress equal 50e6 @@ -37,7 +37,9 @@ variable kt equal 2/7*${YoungsModulus}*${atomRadius} variable xgammat equal 0.0 variable mu_s equal 0.5 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} & + damping mdr & + tangential linear_history ${kt} ${xgammat} ${mu_s} ######################################### ADD IN PLANES ################################################ @@ -72,12 +74,12 @@ variable plane_xz_neg_force equal c_plane_xz_neg_force compute plane_yz_neg_force all reduce sum f_plane_yz_neg[2] variable plane_yz_neg_force equal c_plane_yz_neg_force -fix print1 all print 1 "${plane_disp} ${plane_xy_neg_force} ${plane_xz_neg_force} ${plane_yz_neg_force}" file force_disp_triaxial12.csv screen no +#fix print1 all print 1 "${plane_disp} ${plane_xy_neg_force} ${plane_xz_neg_force} ${plane_yz_neg_force}" file force_disp_triaxial12.csv screen no -######################################## SCREEN OUTPUT #################################################### +######################################## SCREEN OUTPUT #################################################### compute 1 all erotate/sphere -thermo_style custom dt step atoms ke c_1 vol +thermo_style custom dt step atoms ke c_1 vol thermo 100 thermo_modify lost ignore norm no @@ -89,8 +91,8 @@ variable compression_steps equal round(${disp_max}/${ddisp}) variable output_rate equal round(${compression_steps}/100) ##################################### SET UP DUMP OUTPUTS #################################################### - -dump dumpParticles all custom ${output_rate} triaxial_compaction_12.dump id type mass x y z vx vy vz fx fy fz radius + +#dump dumpParticles all custom ${output_rate} triaxial_compaction_12.dump id type mass x y z vx vy vz fx fy fz radius #dump dmp all vtk ${output_rate} post/triaxial12particles_*.vtk id type mass x y z vx vy vz fx fy fz radius #################################### COMPRESS THE PARTICLES ################################################## @@ -101,7 +103,7 @@ run 0 compute Ac_1_12 particles_1_12 pair/local p13 cutoff radius compute Ac_1_12_sum particles_1_12 reduce sum c_Ac_1_12 inputs local variable Ac_1_12 equal c_Ac_1_12_sum -fix logArea all print 100 "${plane_disp} ${Ac_1_12}" file pair_1_12_contact_area_triaxial12.csv screen no +#fix logArea all print 100 "${plane_disp} ${Ac_1_12}" file pair_1_12_contact_area_triaxial12.csv screen no variable plane_disp equal ${ddisp}*elapsed variable plane_disp_neg equal -${ddisp}*elapsed diff --git a/examples/granular/log.4Feb25.tableting.200.g++.1 b/examples/granular/log.4Feb25.tableting.200.g++.1 new file mode 100644 index 0000000000..df6428ff1a --- /dev/null +++ b/examples/granular/log.4Feb25.tableting.200.g++.1 @@ -0,0 +1,791 @@ +LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-581-g384d7f446b-modified) +##################################### SIMULATION SETTINGS ################################################### + +atom_style sphere 1 +atom_modify map array +comm_modify vel yes +units si +newton off +neighbor 1.0e-3 bin +neigh_modify every 10 delay 60 check no +timestep 4e-6 +#processors 2 2 1 + +############################## SIMULATION BOUNDING BOX AND INSERT PARTICLES ################################# + +boundary f f f +read_data spheres200.data +Reading data file ... + orthogonal box = (-0.005 -0.005 -0.001) to (0.005 0.005 0.02) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 200 atoms + read_data CPU = 0.004 seconds + +#################################### ADD DIE AND ATOM PARAMETERIZATION ###################################### + +variable atomRadius equal 0.44e-3*1.25 +variable atomDiameter equal 2*${atomRadius} +variable atomDiameter equal 2*0.00055 +variable atomDensity equal 1560 +variable atomMassAvg equal ${atomDensity}*4.0/3.0*PI*${atomRadius}^3.0 +variable atomMassAvg equal 1560*4.0/3.0*PI*${atomRadius}^3.0 +variable atomMassAvg equal 1560*4.0/3.0*PI*0.00055^3.0 +variable dieRadius equal 4e-3 +variable dieHeight equal 1e-2 + +############################## PARTICLE MATERIAL PROPERTIES AND FORCE MODEL ################################## + +pair_style granular + +# mdr = E, nu, Y, gamma, psi_b, damp +variable YoungsModulus equal 5e6 +variable YieldStress equal 1.9e5 +variable PoissonsRatio equal 0.4 +variable SurfaceEnergy equal 2 +variable SurfaceEnergyWall equal 0.0 +variable damp equal 1.0 +variable psi_b equal 0.5 + +# linear_history = k_t, x_gammat, mu_s +variable kt equal 2/7*${YoungsModulus}*${atomRadius} +variable kt equal 2/7*5000000*${atomRadius} +variable kt equal 2/7*5000000*0.00055 +variable kt_wall equal 2/7*${YoungsModulus}*${atomRadius} +variable kt_wall equal 2/7*5000000*${atomRadius} +variable kt_wall equal 2/7*5000000*0.00055 +variable xgammat equal 1.0 +variable mu_s equal 0.7 +variable mu_s_wall equal 0.1 + +# sds = mu_roll, k_roll, gamma_roll +variable mu_roll equal 0.6 +variable k_roll equal 2.25*${mu_roll}*${mu_roll}*${YoungsModulus}*${atomRadius} +variable k_roll equal 2.25*0.6*${mu_roll}*${YoungsModulus}*${atomRadius} +variable k_roll equal 2.25*0.6*0.6*${YoungsModulus}*${atomRadius} +variable k_roll equal 2.25*0.6*0.6*5000000*${atomRadius} +variable k_roll equal 2.25*0.6*0.6*5000000*0.00055 +variable gamma_roll equal 0.0 + +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.7 rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 0 ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 0 0.6 + +######################################### ADD DIE AND PUNCH WALLS ############################################ + +variable disp_upper equal 0.0 +variable disp_lower equal 0.0 + +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" +granular mdr 5000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 + +variable dieHeight2 equal 2*${dieHeight} +variable dieHeight2 equal 2*0.01 + +region lowerPunch plane 0 0 0 0 0 1 side in units box move NULL NULL v_disp_lower units box +region upperPunch plane 0 0 ${dieHeight} 0 0 -1 side in move NULL NULL v_disp_upper units box +region upperPunch plane 0 0 0.01 0 0 -1 side in move NULL NULL v_disp_upper units box +region die cylinder z 0 0 ${dieRadius} 0 ${dieHeight2} side in units box +region die cylinder z 0 0 0.004 0 ${dieHeight2} side in units box +region die cylinder z 0 0 0.004 0 0.02 side in units box + +fix lowerPunch all wall/gran/region ${wall_contact_string} region lowerPunch contacts +fix lowerPunch all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region lowerPunch contacts +fix upperPunch all wall/gran/region ${wall_contact_string} region upperPunch contacts +fix upperPunch all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region upperPunch contacts +fix die all wall/gran/region ${wall_contact_string} region die contacts +fix die all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region die contacts + +compute avgUpperPunchForce all reduce sum f_upperPunch[4] +variable avgUpperPunchForce equal c_avgUpperPunchForce +compute avgLowerPunchForce all reduce sum f_lowerPunch[4] +variable avgLowerPunchForce equal c_avgLowerPunchForce + +#fix printFD all print 1 "${disp_upper} ${avgUpperPunchForce} ${avgLowerPunchForce}" file punch_force_disp_tableting200.csv screen no + +##################################### INTEGRATION AND GRAVITY ################################################# + +fix 1 all nve/sphere +fix grav all gravity 9.81 vector 0 0 -1 + +########################################### SCREEN OUTPUT #################################################### + +compute 1 all erotate/sphere +thermo_style custom dt step atoms ke vol v_disp_upper +thermo 100 +thermo_modify lost ignore norm no + +##################################### SET UP DUMP OUTPUTS #################################################### + +compute ke all ke/atom +variable output_rate equal round(1e-3/dt) + +run 0 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- MDR contact model command: (i) https://doi.org/10.1016/j.jmps.2023.105492 || (ii) https://doi.org/10.1016/j.jmps.2023.105493 || (iii) https://doi.org/10.31224/4289 + +@Article{zunker2024mechanicallyI, + author = {Zunker, William and Kamrin, Ken}, + title = {A mechanically-derived contact model for adhesive elastic-perfectly plastic particles, + Part I: Utilizing the method of dimensionality reduction}, + journal = {Journal of the Mechanics and Physics of Solids}, + year = {2024}, + volume = {183}, + pages = {105492}, +} + +@Article{zunker2024mechanicallyII, + author = {Zunker, William and Kamrin, Ken}, + title = {A mechanically-derived contact model for adhesive elastic-perfectly plastic particles, + Part II: Contact under high compaction—modeling a bulk elastic response}, + journal = {Journal of the Mechanics and Physics of Solids}, + year = {2024}, + volume = {183}, + pages = {105493}, +} + +@Article{zunker2025experimentally, + author = {Zunker, William and Dunatunga, Sachith and Thakur, Subhash and Tang, Pingjun and Kamrin, Ken}, + title = {Experimentally validated DEM for large deformation powder compaction: + mechanically-derived contact model and screening of non-physical contacts}, + year = {2025}, + journal = {engrXiv}, +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 10 steps, delay = 60 steps, check = no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 0.002318 + ghost atom cutoff = 0.002318 + binsize = 0.001159, bins = 9 9 19 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair granular, perpetual + attributes: half, newton off, size, history + pair build: half/size/bin/atomonly/newtoff + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 0 200 0 2.1e-06 0 +Loop time of 8.51e-07 on 1 procs for 0 steps with 200 atoms + +117.5% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 8.51e-07 | | |100.00 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1341 ave 1341 max 1341 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1341 +Ave neighs/atom = 6.705 +Neighbor list builds = 0 +Dangerous builds not checked + +compute sigmaxx all property/atom d_sigmaxx +compute sigmayy all property/atom d_sigmayy +compute sigmazz all property/atom d_sigmazz +compute Velas all property/atom d_Velas + +compute sigmaxx_ave all reduce ave c_sigmaxx +compute sigmayy_ave all reduce ave c_sigmayy +compute sigmazz_ave all reduce ave c_sigmazz +compute Velas_sum all reduce sum c_Velas + +variable sxx_ave equal c_sigmaxx_ave +variable syy_ave equal c_sigmayy_ave +variable szz_ave equal c_sigmazz_ave +variable Vparticles equal c_Velas_sum + +#fix log all print 1 "${sxx_ave} ${syy_ave} ${szz_ave} ${Vparticles}" file average_normal_stresses_tableting200.csv screen no +#dump dumpParticles all custom ${output_rate} tableting200.dump id type mass diameter x y z vx vy vz fx fy fz c_ke c_sigmaxx c_sigmayy c_sigmazz +#dump dumpParticlesVTK all vtk ${output_rate} post/particles_*.vtk id x y z fx fy fz vx vy vz c_ke radius c_sigmaxx c_sigmayy c_sigmazz + +############################################## RUN SIMULATION ################################################# + +variable upper_punch_stroke equal 0.7*${dieHeight} +variable upper_punch_stroke equal 0.7*0.01 +variable vel_upper equal 0.25 + +variable settling_steps equal round(0.02/dt) +variable compression_steps equal 2*round(${upper_punch_stroke}/${vel_upper}/dt) +variable compression_steps equal 2*round(0.007/${vel_upper}/dt) +variable compression_steps equal 2*round(0.007/0.25/dt) +variable ejection_steps equal ${compression_steps} +variable ejection_steps equal 14000 +variable free_float_steps equal round(0.02/dt) + +##### SETTLING ##### + +run ${settling_steps} +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 0 200 0 2.1e-06 0 + 4e-06 100 200 1.5945503e-09 2.1e-06 0 + 4e-06 200 200 6.3770738e-09 2.1e-06 0 + 4e-06 300 200 1.4245359e-08 2.1e-06 0 + 4e-06 400 200 2.5260505e-08 2.1e-06 0 + 4e-06 500 200 3.9464751e-08 2.1e-06 0 + 4e-06 600 200 5.6858098e-08 2.1e-06 0 + 4e-06 700 200 7.7385952e-08 2.1e-06 0 + 4e-06 800 198 1.0059548e-07 2.1e-06 0 + 4e-06 900 196 1.2599473e-07 2.1e-06 0 + 4e-06 1000 194 1.5428578e-07 2.1e-06 0 + 4e-06 1100 194 1.8644695e-07 2.1e-06 0 + 4e-06 1200 192 2.2088698e-07 2.1e-06 0 + 4e-06 1300 192 2.5897366e-07 2.1e-06 0 + 4e-06 1400 192 3.0013683e-07 2.1e-06 0 + 4e-06 1500 192 3.4277758e-07 2.1e-06 0 + 4e-06 1600 192 3.9077177e-07 2.1e-06 0 + 4e-06 1700 192 4.3898925e-07 2.1e-06 0 + 4e-06 1800 186 4.736674e-07 2.1e-06 0 + 4e-06 1900 184 5.2110858e-07 2.1e-06 0 + 4e-06 2000 184 5.7848899e-07 2.1e-06 0 + 4e-06 2100 184 6.3492469e-07 2.1e-06 0 + 4e-06 2200 184 6.9441989e-07 2.1e-06 0 + 4e-06 2300 182 inf 2.1e-06 0 + 4e-06 2400 176 7.9307687e-07 2.1e-06 0 + 4e-06 2500 176 8.599965e-07 2.1e-06 0 + 4e-06 2600 176 9.2970927e-07 2.1e-06 0 + 4e-06 2700 176 1.0022152e-06 2.1e-06 0 + 4e-06 2800 176 inf 2.1e-06 0 + 4e-06 2900 174 1.1458142e-06 2.1e-06 0 + 4e-06 3000 172 1.2159972e-06 2.1e-06 0 + 4e-06 3100 172 inf 2.1e-06 0 + 4e-06 3200 170 1.3640273e-06 2.1e-06 0 + 4e-06 3300 164 1.4023496e-06 2.1e-06 0 + 4e-06 3400 164 1.4878891e-06 2.1e-06 0 + 4e-06 3500 164 1.5760184e-06 2.1e-06 0 + 4e-06 3600 164 1.6667377e-06 2.1e-06 0 + 4e-06 3700 162 1.7486967e-06 2.1e-06 0 + 4e-06 3800 160 1.8165262e-06 2.1e-06 0 + 4e-06 3900 158 1.8886488e-06 2.1e-06 0 + 4e-06 4000 158 1.9853138e-06 2.1e-06 0 + 4e-06 4100 158 inf 2.1e-06 0 + 4e-06 4200 156 2.1616605e-06 2.1e-06 0 + 4e-06 4300 156 2.2655984e-06 2.1e-06 0 + 4e-06 4400 156 inf 2.1e-06 0 + 4e-06 4500 152 2.4161761e-06 2.1e-06 0 + 4e-06 4600 152 2.497822e-06 2.1e-06 0 + 4e-06 4700 150 2.6001287e-06 2.1e-06 0 + 4e-06 4800 148 inf 2.1e-06 0 + 4e-06 4900 146 inf 2.1e-06 0 + 4e-06 5000 140 2.7812394e-06 2.1e-06 0 +Loop time of 0.432192 on 1 procs for 5000 steps with 140 atoms + +99.7% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.10597 | 0.10597 | 0.10597 | 0.0 | 24.52 +Neigh | 0.011871 | 0.011871 | 0.011871 | 0.0 | 2.75 +Comm | 0.00034652 | 0.00034652 | 0.00034652 | 0.0 | 0.08 +Output | 0.00027596 | 0.00027596 | 0.00027596 | 0.0 | 0.06 +Modify | 0.31284 | 0.31284 | 0.31284 | 0.0 | 72.39 +Other | | 0.0008893 | | | 0.21 + +Nlocal: 140 ave 140 max 140 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 865 ave 865 max 865 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 865 +Ave neighs/atom = 6.1785714 +Neighbor list builds = 83 +Dangerous builds not checked + +##### Compression & Release ##### + +variable punch_frequency equal PI/2/(dt*${compression_steps}/2) +variable punch_frequency equal PI/2/(dt*14000/2) +variable disp_upper equal -${upper_punch_stroke}*sin(${punch_frequency}*elapsed*dt) +variable disp_upper equal -0.007*sin(${punch_frequency}*elapsed*dt) +variable disp_upper equal -0.007*sin(56.0998688141035*elapsed*dt) +variable short_release equal round(${compression_steps}*1.0) +variable short_release equal round(14000*1.0) +run ${short_release} +run 14000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 5000 140 2.7812394e-06 2.1e-06 0 + 4e-06 5100 140 2.8895541e-06 2.1e-06 -0.00015706645 + 4e-06 5200 136 2.9030642e-06 2.1e-06 -0.00031405381 + 4e-06 5300 134 2.9801402e-06 2.1e-06 -0.00047088304 + 4e-06 5400 134 inf 2.1e-06 -0.00062747516 + 4e-06 5500 130 3.1361708e-06 2.1e-06 -0.00078375133 + 4e-06 5600 130 3.224988e-06 2.1e-06 -0.00093963286 + 4e-06 5700 128 3.2981553e-06 2.1e-06 -0.0010950413 + 4e-06 5800 126 3.3346425e-06 2.1e-06 -0.0012498983 + 4e-06 5900 126 3.4495324e-06 2.1e-06 -0.0014041259 + 4e-06 6000 124 3.4436288e-06 2.1e-06 -0.0015576465 + 4e-06 6100 122 3.5108806e-06 2.1e-06 -0.0017103828 + 4e-06 6200 118 3.4808187e-06 2.1e-06 -0.0018622579 + 4e-06 6300 116 3.5520892e-06 2.1e-06 -0.0020131953 + 4e-06 6400 116 3.6651266e-06 2.1e-06 -0.002163119 + 4e-06 6500 116 3.7768528e-06 2.1e-06 -0.0023119534 + 4e-06 6600 114 3.8296982e-06 2.1e-06 -0.0024596238 + 4e-06 6700 110 3.8220731e-06 2.1e-06 -0.0026060556 + 4e-06 6800 108 3.8409573e-06 2.1e-06 -0.0027511752 + 4e-06 6900 108 inf 2.1e-06 -0.0028949095 + 4e-06 7000 104 3.9206342e-06 2.1e-06 -0.0030371862 + 4e-06 7100 102 3.9647246e-06 2.1e-06 -0.0031779335 + 4e-06 7200 102 inf 2.1e-06 -0.0033170806 + 4e-06 7300 98 3.9766723e-06 2.1e-06 -0.0034545575 + 4e-06 7400 90 3.7821936e-06 2.1e-06 -0.0035902949 + 4e-06 7500 90 inf 2.1e-06 -0.0037242245 + 4e-06 7600 86 3.8144737e-06 2.1e-06 -0.0038562789 + 4e-06 7700 84 3.7897749e-06 2.1e-06 -0.0039863915 + 4e-06 7800 82 3.8008682e-06 2.1e-06 -0.0041144968 + 4e-06 7900 80 3.791409e-06 2.1e-06 -0.0042405303 + 4e-06 8000 76 3.7336309e-06 2.1e-06 -0.0043644286 + 4e-06 8100 76 inf 2.1e-06 -0.0044861293 + 4e-06 8200 72 3.7708462e-06 2.1e-06 -0.0046055711 + 4e-06 8300 72 3.8690393e-06 2.1e-06 -0.0047226938 + 4e-06 8400 68 inf 2.1e-06 -0.0048374385 + 4e-06 8500 64 3.6623177e-06 2.1e-06 -0.0049497475 + 4e-06 8600 62 3.6134274e-06 2.1e-06 -0.005059564 + 4e-06 8700 62 3.6965363e-06 2.1e-06 -0.005166833 + 4e-06 8800 60 3.5674683e-06 2.1e-06 -0.0052715003 + 4e-06 8900 54 3.3423076e-06 2.1e-06 -0.0053735132 + 4e-06 9000 50 3.1486697e-06 2.1e-06 -0.0054728204 + 4e-06 9100 48 3.0716142e-06 2.1e-06 -0.0055693718 + 4e-06 9200 46 2.9984533e-06 2.1e-06 -0.005663119 + 4e-06 9300 46 inf 2.1e-06 -0.0057540145 + 4e-06 9400 34 inf 2.1e-06 -0.0058420128 + 4e-06 9500 32 2.4147256e-06 2.1e-06 -0.0059270694 + 4e-06 9600 32 inf 2.1e-06 -0.0060091416 + 4e-06 9700 26 inf 2.1e-06 -0.0060881879 + 4e-06 9800 20 1.5991947e-06 2.1e-06 -0.0061641687 + 4e-06 9900 20 inf 2.1e-06 -0.0062370457 + 4e-06 10000 16 1.3327917e-06 2.1e-06 -0.0063067821 + 4e-06 10100 10 8.8157027e-07 2.1e-06 -0.0063733428 + 4e-06 10200 10 8.9614642e-07 2.1e-06 -0.0064366944 + 4e-06 10300 10 8.9775988e-07 2.1e-06 -0.0064968049 + 4e-06 10400 10 9.0812889e-07 2.1e-06 -0.0065536441 + 4e-06 10500 10 9.003094e-07 2.1e-06 -0.0066071833 + 4e-06 10600 10 8.8275797e-07 2.1e-06 -0.0066573956 + 4e-06 10700 10 8.6537937e-07 2.1e-06 -0.0067042557 + 4e-06 10800 10 8.4817361e-07 2.1e-06 -0.00674774 + 4e-06 10900 10 8.311407e-07 2.1e-06 -0.0067878266 + 4e-06 11000 10 8.1428062e-07 2.1e-06 -0.0068244954 + 4e-06 11100 10 7.9759338e-07 2.1e-06 -0.0068577278 + 4e-06 11200 10 7.8107899e-07 2.1e-06 -0.0068875071 + 4e-06 11300 10 7.6473743e-07 2.1e-06 -0.0069138184 + 4e-06 11400 10 7.4856871e-07 2.1e-06 -0.0069366483 + 4e-06 11500 10 6.5214996e-07 2.1e-06 -0.0069559855 + 4e-06 11600 10 8.9415748e-07 2.1e-06 -0.0069718201 + 4e-06 11700 10 8.718476e-07 2.1e-06 -0.0069841441 + 4e-06 11800 10 1.0390866e-06 2.1e-06 -0.0069929515 + 4e-06 11900 10 1.058099e-06 2.1e-06 -0.0069982376 + 4e-06 12000 10 1.0772841e-06 2.1e-06 -0.007 + 4e-06 12100 10 1.0966421e-06 2.1e-06 -0.0069982376 + 4e-06 12200 10 1.116173e-06 2.1e-06 -0.0069929515 + 4e-06 12300 10 1.1358767e-06 2.1e-06 -0.0069841441 + 4e-06 12400 10 1.1557532e-06 2.1e-06 -0.0069718201 + 4e-06 12500 10 1.1709163e-06 2.1e-06 -0.0069559855 + 4e-06 12600 10 1.1781568e-06 2.1e-06 -0.0069366483 + 4e-06 12700 10 1.1814023e-06 2.1e-06 -0.0069138184 + 4e-06 12800 10 1.182238e-06 2.1e-06 -0.0068875071 + 4e-06 12900 10 1.1321834e-06 2.1e-06 -0.0068577278 + 4e-06 13000 10 1.1602658e-06 2.1e-06 -0.0068244954 + 4e-06 13100 10 1.1403281e-06 2.1e-06 -0.0067878266 + 4e-06 13200 10 1.1205632e-06 2.1e-06 -0.00674774 + 4e-06 13300 10 1.1009712e-06 2.1e-06 -0.0067042557 + 4e-06 13400 10 1.081552e-06 2.1e-06 -0.0066573956 + 4e-06 13500 10 1.0623057e-06 2.1e-06 -0.0066071833 + 4e-06 13600 10 9.7690472e-07 2.1e-06 -0.0065536441 + 4e-06 13700 10 8.7554649e-07 2.1e-06 -0.0064968049 + 4e-06 13800 10 8.6114161e-07 2.1e-06 -0.0064366944 + 4e-06 13900 10 7.2229969e-07 2.1e-06 -0.0063733428 + 4e-06 14000 10 6.0299298e-07 2.1e-06 -0.0063067821 + 4e-06 14100 10 5.9691906e-07 2.1e-06 -0.0062370457 + 4e-06 14200 10 5.8877052e-07 2.1e-06 -0.0061641687 + 4e-06 14300 10 5.8079481e-07 2.1e-06 -0.0060881879 + 4e-06 14400 10 5.0821182e-07 2.1e-06 -0.0060091416 + 4e-06 14500 10 4.5974587e-07 2.1e-06 -0.0059270694 + 4e-06 14600 10 4.5438391e-07 2.1e-06 -0.0058420128 + 4e-06 14700 10 4.4919479e-07 2.1e-06 -0.0057540145 + 4e-06 14800 10 3.6176002e-07 2.1e-06 -0.005663119 + 4e-06 14900 10 3.5835307e-07 2.1e-06 -0.0055693718 + 4e-06 15000 10 3.5511897e-07 2.1e-06 -0.0054728204 + 4e-06 15100 10 3.5205771e-07 2.1e-06 -0.0053735132 + 4e-06 15200 10 2.4180157e-07 2.1e-06 -0.0052715003 + 4e-06 15300 10 1.9792566e-07 2.1e-06 -0.005166833 + 4e-06 15400 10 1.9768384e-07 2.1e-06 -0.005059564 + 4e-06 15500 10 1.6550345e-07 2.1e-06 -0.0049497475 + 4e-06 15600 10 1.6608824e-07 2.1e-06 -0.0048374385 + 4e-06 15700 10 1.4780766e-07 2.1e-06 -0.0047226938 + 4e-06 15800 10 1.4899916e-07 2.1e-06 -0.0046055711 + 4e-06 15900 10 1.503635e-07 2.1e-06 -0.0044861293 + 4e-06 16000 10 1.5190069e-07 2.1e-06 -0.0043644286 + 4e-06 16100 10 1.5361071e-07 2.1e-06 -0.0042405303 + 4e-06 16200 10 1.5373505e-07 2.1e-06 -0.0041144968 + 4e-06 16300 10 1.5202036e-07 2.1e-06 -0.0039863915 + 4e-06 16400 10 1.5047851e-07 2.1e-06 -0.0038562789 + 4e-06 16500 10 1.491095e-07 2.1e-06 -0.0037242245 + 4e-06 16600 10 1.4791333e-07 2.1e-06 -0.0035902949 + 4e-06 16700 10 1.4689e-07 2.1e-06 -0.0034545575 + 4e-06 16800 10 1.460395e-07 2.1e-06 -0.0033170806 + 4e-06 16900 10 1.4536185e-07 2.1e-06 -0.0031779335 + 4e-06 17000 10 1.4485704e-07 2.1e-06 -0.0030371862 + 4e-06 17100 10 1.4452507e-07 2.1e-06 -0.0028949095 + 4e-06 17200 10 1.4436594e-07 2.1e-06 -0.0027511752 + 4e-06 17300 10 1.4297672e-07 2.1e-06 -0.0026060556 + 4e-06 17400 10 1.4034469e-07 2.1e-06 -0.0024596238 + 4e-06 17500 10 1.378855e-07 2.1e-06 -0.0023119534 + 4e-06 17600 10 1.3559914e-07 2.1e-06 -0.002163119 + 4e-06 17700 10 1.3348563e-07 2.1e-06 -0.0020131953 + 4e-06 17800 10 1.3154496e-07 2.1e-06 -0.0018622579 + 4e-06 17900 10 1.2977712e-07 2.1e-06 -0.0017103828 + 4e-06 18000 10 1.2659132e-07 2.1e-06 -0.0015576465 + 4e-06 18100 10 1.241758e-07 2.1e-06 -0.0014041259 + 4e-06 18200 10 1.2060433e-07 2.1e-06 -0.0012498983 + 4e-06 18300 10 1.172057e-07 2.1e-06 -0.0010950413 + 4e-06 18400 10 1.1397991e-07 2.1e-06 -0.00093963286 + 4e-06 18500 10 1.1092695e-07 2.1e-06 -0.00078375133 + 4e-06 18600 10 1.0804684e-07 2.1e-06 -0.00062747516 + 4e-06 18700 10 1.0533957e-07 2.1e-06 -0.00047088304 + 4e-06 18800 10 1.0280514e-07 2.1e-06 -0.00031405381 + 4e-06 18900 10 1.0044354e-07 2.1e-06 -0.00015706645 + 4e-06 19000 10 9.8254791e-08 2.1e-06 2.0903119e-17 +Loop time of 0.287179 on 1 procs for 14000 steps with 10 atoms + +99.8% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.049189 | 0.049189 | 0.049189 | 0.0 | 17.13 +Neigh | 0.0057064 | 0.0057064 | 0.0057064 | 0.0 | 1.99 +Comm | 0.00064863 | 0.00064863 | 0.00064863 | 0.0 | 0.23 +Output | 0.00089611 | 0.00089611 | 0.00089611 | 0.0 | 0.31 +Modify | 0.22899 | 0.22899 | 0.22899 | 0.0 | 79.74 +Other | | 0.001749 | | | 0.61 + +Nlocal: 10 ave 10 max 10 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 2 ave 2 max 2 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2 +Ave neighs/atom = 0.2 +Neighbor list builds = 233 +Dangerous builds not checked + +##### EJECTION ##### + +variable punch_frequency equal PI/2/(dt*${ejection_steps}) +variable punch_frequency equal PI/2/(dt*14000) +variable disp_lower equal ${dieHeight}*sin(${punch_frequency}*elapsed*dt) +variable disp_lower equal 0.01*sin(${punch_frequency}*elapsed*dt) +variable disp_lower equal 0.01*sin(28.0499344070517*elapsed*dt) +variable disp_upper equal 0.9*v_disp_lower +run ${ejection_steps} +run 14000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 19000 10 9.8254791e-08 2.1e-06 0 + 4e-06 19100 10 9.6238878e-08 2.1e-06 0.00010097765 + 4e-06 19200 10 9.4395806e-08 2.1e-06 0.00020194258 + 4e-06 19300 10 9.2725573e-08 2.1e-06 0.00030288209 + 4e-06 19400 10 9.1228181e-08 2.1e-06 0.00040378347 + 4e-06 19500 10 8.9903628e-08 2.1e-06 0.00050463403 + 4e-06 19600 10 8.8751915e-08 2.1e-06 0.00060542105 + 4e-06 19700 10 6.9553679e-08 2.1e-06 0.00070613186 + 4e-06 19800 10 3.855161e-07 2.1e-06 0.00080675378 + 4e-06 19900 10 3.8006492e-07 2.1e-06 0.00090727414 + 4e-06 20000 10 3.7478659e-07 2.1e-06 0.0010076803 + 4e-06 20100 10 3.6968109e-07 2.1e-06 0.0011079596 + 4e-06 20200 10 3.6474843e-07 2.1e-06 0.0012080994 + 4e-06 20300 10 3.5998861e-07 2.1e-06 0.0013080871 + 4e-06 20400 10 3.5540163e-07 2.1e-06 0.0014079102 + 4e-06 20500 10 3.509875e-07 2.1e-06 0.001507556 + 4e-06 20600 10 3.467462e-07 2.1e-06 0.0016070121 + 4e-06 20700 10 3.4267774e-07 2.1e-06 0.0017062658 + 4e-06 20800 10 3.3878212e-07 2.1e-06 0.0018053047 + 4e-06 20900 10 6.2902098e-07 2.1e-06 0.0019041164 + 4e-06 21000 10 7.1567323e-07 2.1e-06 0.0020026884 + 4e-06 21100 10 7.0670404e-07 2.1e-06 0.0021010083 + 4e-06 21200 10 6.9790769e-07 2.1e-06 0.0021990637 + 4e-06 21300 10 6.8928417e-07 2.1e-06 0.0022968422 + 4e-06 21400 10 6.808335e-07 2.1e-06 0.0023943316 + 4e-06 21500 10 8.228831e-07 2.1e-06 0.0024915196 + 4e-06 21600 10 8.1258059e-07 2.1e-06 0.0025883939 + 4e-06 21700 10 8.0245093e-07 2.1e-06 0.0026849424 + 4e-06 21800 10 7.924941e-07 2.1e-06 0.0027811529 + 4e-06 21900 10 7.8271011e-07 2.1e-06 0.0028770133 + 4e-06 22000 10 7.7309896e-07 2.1e-06 0.0029725116 + 4e-06 22100 10 7.6366066e-07 2.1e-06 0.0030676356 + 4e-06 22200 10 7.5439519e-07 2.1e-06 0.0031623734 + 4e-06 22300 10 9.6736756e-07 2.1e-06 0.0032567132 + 4e-06 22400 10 9.5508751e-07 2.1e-06 0.0033506429 + 4e-06 22500 10 1.146027e-06 2.1e-06 0.0034441509 + 4e-06 22600 10 1.3340747e-06 2.1e-06 0.0035372253 + 4e-06 22700 10 1.3161012e-06 2.1e-06 0.0036298544 + 4e-06 22800 10 1.3780346e-06 2.1e-06 0.0037220265 + 4e-06 22900 10 1.4437449e-06 2.1e-06 0.0038137301 + 4e-06 23000 10 1.4237439e-06 2.1e-06 0.0039049537 + 4e-06 23100 10 1.4039157e-06 2.1e-06 0.0039956856 + 4e-06 23200 10 1.3842603e-06 2.1e-06 0.0040859145 + 4e-06 23300 10 1.3647778e-06 2.1e-06 0.0041756291 + 4e-06 23400 10 1.3454681e-06 2.1e-06 0.004264818 + 4e-06 23500 10 1.3263312e-06 2.1e-06 0.00435347 + 4e-06 23600 10 1.3073672e-06 2.1e-06 0.004441574 + 4e-06 23700 10 1.4224882e-06 2.1e-06 0.0045291188 + 4e-06 23800 10 1.4016962e-06 2.1e-06 0.0046160935 + 4e-06 23900 10 1.381077e-06 2.1e-06 0.0047024871 + 4e-06 24000 10 1.3606307e-06 2.1e-06 0.0047882887 + 4e-06 24100 10 1.3403572e-06 2.1e-06 0.0048734875 + 4e-06 24200 10 1.3202566e-06 2.1e-06 0.0049580728 + 4e-06 24300 10 1.3003288e-06 2.1e-06 0.005042034 + 4e-06 24400 10 1.2805739e-06 2.1e-06 0.0051253604 + 4e-06 24500 10 1.2609917e-06 2.1e-06 0.0052080417 + 4e-06 24600 10 1.2415825e-06 2.1e-06 0.0052900673 + 4e-06 24700 10 1.222346e-06 2.1e-06 0.0053714269 + 4e-06 24800 10 1.2032824e-06 2.1e-06 0.0054521104 + 4e-06 24900 10 1.1843917e-06 2.1e-06 0.0055321075 + 4e-06 25000 10 1.2550315e-06 2.1e-06 0.0056114082 + 4e-06 25100 10 1.2348763e-06 2.1e-06 0.0056900025 + 4e-06 25200 10 1.2148941e-06 2.1e-06 0.0057678805 + 4e-06 25300 10 1.1950846e-06 2.1e-06 0.0058450324 + 4e-06 25400 10 1.175448e-06 2.1e-06 0.0059214485 + 4e-06 25500 10 1.1559842e-06 2.1e-06 0.0059971192 + 4e-06 25600 10 1.1366933e-06 2.1e-06 0.0060720349 + 4e-06 25700 10 1.1175752e-06 2.1e-06 0.0061461862 + 4e-06 25800 10 1.0986299e-06 2.1e-06 0.0062195638 + 4e-06 25900 10 1.0798575e-06 2.1e-06 0.0062921585 + 4e-06 26000 10 1.061258e-06 2.1e-06 0.006363961 + 4e-06 26100 10 9.1373064e-07 2.1e-06 0.0064349624 + 4e-06 26200 10 8.9836765e-07 2.1e-06 0.0065051538 + 4e-06 26300 10 8.8317749e-07 2.1e-06 0.0065745262 + 4e-06 26400 10 8.6816018e-07 2.1e-06 0.006643071 + 4e-06 26500 10 7.2232503e-07 2.1e-06 0.0067107795 + 4e-06 26600 10 7.1072319e-07 2.1e-06 0.0067776432 + 4e-06 26700 10 6.9929419e-07 2.1e-06 0.0068436537 + 4e-06 26800 10 6.8803803e-07 2.1e-06 0.0069088027 + 4e-06 26900 10 6.7695471e-07 2.1e-06 0.0069730819 + 4e-06 27000 10 6.6604423e-07 2.1e-06 0.0070364833 + 4e-06 27100 10 6.5530659e-07 2.1e-06 0.007098999 + 4e-06 27200 10 6.4474179e-07 2.1e-06 0.0071606209 + 4e-06 27300 10 6.3434984e-07 2.1e-06 0.0072213415 + 4e-06 27400 10 6.2413072e-07 2.1e-06 0.0072811529 + 4e-06 27500 10 6.1408444e-07 2.1e-06 0.0073400478 + 4e-06 27600 10 6.04211e-07 2.1e-06 0.0073980187 + 4e-06 27700 10 5.945104e-07 2.1e-06 0.0074550582 + 4e-06 27800 10 5.8498264e-07 2.1e-06 0.0075111593 + 4e-06 27900 10 5.7562772e-07 2.1e-06 0.0075663148 + 4e-06 28000 10 5.6644564e-07 2.1e-06 0.0076205178 + 4e-06 28100 10 5.574364e-07 2.1e-06 0.0076737615 + 4e-06 28200 10 5.486e-07 2.1e-06 0.0077260391 + 4e-06 28300 10 5.3993644e-07 2.1e-06 0.0077773442 + 4e-06 28400 10 5.3144572e-07 2.1e-06 0.0078276702 + 4e-06 28500 10 5.1027539e-07 2.1e-06 0.0078770108 + 4e-06 28600 10 3.5840723e-07 2.1e-06 0.0079253598 + 4e-06 28700 10 3.7060273e-07 2.1e-06 0.0079727111 + 4e-06 28800 10 3.6745652e-07 2.1e-06 0.0080190587 + 4e-06 28900 10 3.6448315e-07 2.1e-06 0.0080643969 + 4e-06 29000 10 3.0843931e-07 2.1e-06 0.0081087198 + 4e-06 29100 10 3.0772799e-07 2.1e-06 0.008152022 + 4e-06 29200 10 3.0718951e-07 2.1e-06 0.0081942979 + 4e-06 29300 10 3.0682387e-07 2.1e-06 0.0082355423 + 4e-06 29400 10 3.0663107e-07 2.1e-06 0.00827575 + 4e-06 29500 10 3.0661111e-07 2.1e-06 0.0083149158 + 4e-06 29600 10 3.0676399e-07 2.1e-06 0.0083530349 + 4e-06 29700 10 3.0708971e-07 2.1e-06 0.0083901025 + 4e-06 29800 10 3.0758827e-07 2.1e-06 0.0084261138 + 4e-06 29900 10 3.0825967e-07 2.1e-06 0.0084610645 + 4e-06 30000 10 3.0910391e-07 2.1e-06 0.00849495 + 4e-06 30100 10 2.7633224e-07 2.1e-06 0.0085277661 + 4e-06 30200 10 2.7917696e-07 2.1e-06 0.0085595086 + 4e-06 30300 10 2.8219452e-07 2.1e-06 0.0085901737 + 4e-06 30400 10 2.8538492e-07 2.1e-06 0.0086197574 + 4e-06 30500 10 2.8874816e-07 2.1e-06 0.0086482559 + 4e-06 30600 10 2.9228424e-07 2.1e-06 0.0086756657 + 4e-06 30700 10 2.9599316e-07 2.1e-06 0.0087019834 + 4e-06 30800 10 2.9987493e-07 2.1e-06 0.0087272057 + 4e-06 30900 10 3.0392953e-07 2.1e-06 0.0087513293 + 4e-06 31000 10 3.0815697e-07 2.1e-06 0.0087743512 + 4e-06 31100 10 3.1255725e-07 2.1e-06 0.0087962686 + 4e-06 31200 10 3.1713037e-07 2.1e-06 0.0088170786 + 4e-06 31300 10 3.2187633e-07 2.1e-06 0.0088367787 + 4e-06 31400 10 3.2679513e-07 2.1e-06 0.0088553663 + 4e-06 31500 10 3.3188677e-07 2.1e-06 0.0088728392 + 4e-06 31600 10 3.3522008e-07 2.1e-06 0.0088891951 + 4e-06 31700 10 3.3129412e-07 2.1e-06 0.0089044319 + 4e-06 31800 10 3.3814673e-07 2.1e-06 0.0089185479 + 4e-06 31900 10 3.7840167e-07 2.1e-06 0.0089315411 + 4e-06 32000 10 3.8178891e-07 2.1e-06 0.0089434099 + 4e-06 32100 10 3.8534899e-07 2.1e-06 0.0089541529 + 4e-06 32200 10 3.8908191e-07 2.1e-06 0.0089637686 + 4e-06 32300 10 4.1410686e-07 2.1e-06 0.008972256 + 4e-06 32400 10 4.1433199e-07 2.1e-06 0.0089796139 + 4e-06 32500 10 4.1472995e-07 2.1e-06 0.0089858413 + 4e-06 32600 10 4.1530076e-07 2.1e-06 0.0089909376 + 4e-06 32700 10 4.1604441e-07 2.1e-06 0.008994902 + 4e-06 32800 10 4.169609e-07 2.1e-06 0.0089977341 + 4e-06 32900 10 4.1805022e-07 2.1e-06 0.0089994335 + 4e-06 33000 10 4.1931239e-07 2.1e-06 0.009 +Loop time of 0.177773 on 1 procs for 14000 steps with 10 atoms + +99.8% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.0020062 | 0.0020062 | 0.0020062 | 0.0 | 1.13 +Neigh | 0.00084671 | 0.00084671 | 0.00084671 | 0.0 | 0.48 +Comm | 0.00056289 | 0.00056289 | 0.00056289 | 0.0 | 0.32 +Output | 0.0010356 | 0.0010356 | 0.0010356 | 0.0 | 0.58 +Modify | 0.17178 | 0.17178 | 0.17178 | 0.0 | 96.63 +Other | | 0.001546 | | | 0.87 + +Nlocal: 10 ave 10 max 10 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3 ave 3 max 3 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3 +Ave neighs/atom = 0.3 +Neighbor list builds = 233 +Dangerous builds not checked + +##### FREE FLOAT ##### + +variable disp_lower equal ${dieHeight} +variable disp_lower equal 0.01 +variable disp_upper equal ${dieHeight}*0.9 +variable disp_upper equal 0.01*0.9 +variable max_disp equal ${dieRadius}*0.75 +variable max_disp equal 0.004*0.75 +run ${free_float_steps} +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 33000 10 4.1931239e-07 2.1e-06 0.009 + 4e-06 33100 10 4.207474e-07 2.1e-06 0.009 + 4e-06 33200 10 4.2235525e-07 2.1e-06 0.009 + 4e-06 33300 10 4.2413593e-07 2.1e-06 0.009 + 4e-06 33400 10 4.2608946e-07 2.1e-06 0.009 + 4e-06 33500 10 4.2821583e-07 2.1e-06 0.009 + 4e-06 33600 10 4.3051504e-07 2.1e-06 0.009 + 4e-06 33700 10 4.3298709e-07 2.1e-06 0.009 + 4e-06 33800 10 4.3563197e-07 2.1e-06 0.009 + 4e-06 33900 10 4.384497e-07 2.1e-06 0.009 + 4e-06 34000 10 4.4144027e-07 2.1e-06 0.009 + 4e-06 34100 10 4.4460367e-07 2.1e-06 0.009 + 4e-06 34200 10 4.4793992e-07 2.1e-06 0.009 + 4e-06 34300 10 4.5144901e-07 2.1e-06 0.009 + 4e-06 34400 10 4.5465956e-07 2.1e-06 0.009 + 4e-06 34500 10 4.5470653e-07 2.1e-06 0.009 + 4e-06 34600 10 4.5236426e-07 2.1e-06 0.009 + 4e-06 34700 10 4.5019483e-07 2.1e-06 0.009 + 4e-06 34800 10 4.4819824e-07 2.1e-06 0.009 + 4e-06 34900 10 4.4590448e-07 2.1e-06 0.009 + 4e-06 35000 10 4.4154693e-07 2.1e-06 0.009 + 4e-06 35100 10 4.3736222e-07 2.1e-06 0.009 + 4e-06 35200 10 4.3335035e-07 2.1e-06 0.009 + 4e-06 35300 10 4.2951132e-07 2.1e-06 0.009 + 4e-06 35400 10 4.2584514e-07 2.1e-06 0.009 + 4e-06 35500 10 4.2235179e-07 2.1e-06 0.009 + 4e-06 35600 10 4.1903128e-07 2.1e-06 0.009 + 4e-06 35700 10 4.1034829e-07 2.1e-06 0.009 + 4e-06 35800 10 4.1153836e-07 2.1e-06 0.009 + 4e-06 35900 10 4.0720986e-07 2.1e-06 0.009 + 4e-06 36000 10 4.0259092e-07 2.1e-06 0.009 + 4e-06 36100 10 3.9607992e-07 2.1e-06 0.009 + 4e-06 36200 10 3.8974177e-07 2.1e-06 0.009 + 4e-06 36300 10 3.8357646e-07 2.1e-06 0.009 + 4e-06 36400 10 3.7758398e-07 2.1e-06 0.009 + 4e-06 36500 10 3.7176435e-07 2.1e-06 0.009 + 4e-06 36600 10 3.6611755e-07 2.1e-06 0.009 + 4e-06 36700 10 3.606436e-07 2.1e-06 0.009 + 4e-06 36800 10 3.5534248e-07 2.1e-06 0.009 + 4e-06 36900 10 3.5021421e-07 2.1e-06 0.009 + 4e-06 37000 10 3.4525877e-07 2.1e-06 0.009 + 4e-06 37100 10 3.4047618e-07 2.1e-06 0.009 + 4e-06 37200 10 3.3586643e-07 2.1e-06 0.009 + 4e-06 37300 10 3.3142951e-07 2.1e-06 0.009 + 4e-06 37400 10 3.0307307e-07 2.1e-06 0.009 + 4e-06 37500 10 3.208203e-07 2.1e-06 0.009 + 4e-06 37600 10 3.1480548e-07 2.1e-06 0.009 + 4e-06 37700 10 3.0896349e-07 2.1e-06 0.009 + 4e-06 37800 10 3.0329434e-07 2.1e-06 0.009 + 4e-06 37900 10 2.9779804e-07 2.1e-06 0.009 + 4e-06 38000 10 2.9247457e-07 2.1e-06 0.009 +Loop time of 0.0201013 on 1 procs for 5000 steps with 10 atoms + +99.8% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.00055406 | 0.00055406 | 0.00055406 | 0.0 | 2.76 +Neigh | 0.00029074 | 0.00029074 | 0.00029074 | 0.0 | 1.45 +Comm | 0.00017063 | 0.00017063 | 0.00017063 | 0.0 | 0.85 +Output | 0.00023192 | 0.00023192 | 0.00023192 | 0.0 | 1.15 +Modify | 0.018306 | 0.018306 | 0.018306 | 0.0 | 91.07 +Other | | 0.000548 | | | 2.73 + +Nlocal: 10 ave 10 max 10 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 2 ave 2 max 2 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2 +Ave neighs/atom = 0.2 +Neighbor list builds = 83 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 b/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 new file mode 100644 index 0000000000..8b9562d59f --- /dev/null +++ b/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 @@ -0,0 +1,779 @@ +LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-581-g384d7f446b-modified) +############################### SIMULATION SETTINGS ################################################### + +atom_style sphere 1 +atom_modify map array +comm_modify vel yes +units si +newton off +neighbor 2 bin +neigh_modify delay 0 +timestep 1e-6 + +##################### SIMULATION BOUNDING BOX, INSERT PARTICLES, AND INTEGRATION ####################### + +boundary f f f +read_data spheres12.data +Reading data file ... + orthogonal box = (-10 -10 -10) to (10 10 10) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 12 atoms + read_data CPU = 0.002 seconds +fix integr all nve/sphere + +# create pair group for contact area outputs +group particles_1_12 id 1 12 +2 atoms in group particles_1_12 + +########################### PARTICLE MATERIAL PROPERTIES AND FORCE MODEL ############################### + +variable atomRadius equal 0.5 + +pair_style granular + +# mdr = E, nu, Y, gamma, psi_b, damp +variable YoungsModulus equal 1e9 +variable PoissonsRatio equal 0.3 +variable YieldStress equal 50e6 +variable SurfaceEnergy equal 0.0 +variable psi_b equal 0.5 +variable damp equal 1.0 + +# linear_history = k_t, x_gamma,t, mu_s +variable kt equal 2/7*${YoungsModulus}*${atomRadius} +variable kt equal 2/7*1000000000*${atomRadius} +variable kt equal 2/7*1000000000*0.5 +variable xgammat equal 0.0 +variable mu_s equal 0.5 + +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 + +######################################### ADD IN PLANES ################################################ + +variable boxWidth equal 3 +variable halfBoxWidth equal ${boxWidth}/2 +variable halfBoxWidth equal 3/2 + +variable plane_disp equal 0.0 +variable plane_disp_neg equal 0.0 + +region plane_yz_pos plane ${halfBoxWidth} 0 0 -1 0 0 side in move v_plane_disp_neg NULL NULL units box +region plane_yz_pos plane 1.5 0 0 -1 0 0 side in move v_plane_disp_neg NULL NULL units box +region plane_yz_neg plane -${halfBoxWidth} 0 0 1 0 0 side in move v_plane_disp NULL NULL units box +region plane_yz_neg plane -1.5 0 0 1 0 0 side in move v_plane_disp NULL NULL units box +region plane_xz_pos plane 0 ${halfBoxWidth} 0 0 -1 0 side in move NULL v_plane_disp_neg NULL units box +region plane_xz_pos plane 0 1.5 0 0 -1 0 side in move NULL v_plane_disp_neg NULL units box +region plane_xz_neg plane 0 -${halfBoxWidth} 0 0 1 0 side in move NULL v_plane_disp NULL units box +region plane_xz_neg plane 0 -1.5 0 0 1 0 side in move NULL v_plane_disp NULL units box +region plane_xy_pos plane 0 0 ${halfBoxWidth} 0 0 -1 side in move NULL NULL v_plane_disp_neg units box +region plane_xy_pos plane 0 0 1.5 0 0 -1 side in move NULL NULL v_plane_disp_neg units box +region plane_xy_neg plane 0 0 -${halfBoxWidth} 0 0 1 side in move NULL NULL v_plane_disp units box +region plane_xy_neg plane 0 0 -1.5 0 0 1 side in move NULL NULL v_plane_disp units box + +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} " +granular mdr 1000000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 + +fix plane_yz_pos all wall/gran/region ${wall_contact_string} region plane_yz_pos contacts +fix plane_yz_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_yz_pos contacts +fix plane_yz_neg all wall/gran/region ${wall_contact_string} region plane_yz_neg contacts +fix plane_yz_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_yz_neg contacts +fix plane_xz_pos all wall/gran/region ${wall_contact_string} region plane_xz_pos contacts +fix plane_xz_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_xz_pos contacts +fix plane_xz_neg all wall/gran/region ${wall_contact_string} region plane_xz_neg contacts +fix plane_xz_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_xz_neg contacts +fix plane_xy_pos all wall/gran/region ${wall_contact_string} region plane_xy_pos contacts +fix plane_xy_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_xy_pos contacts +fix plane_xy_neg all wall/gran/region ${wall_contact_string} region plane_xy_neg contacts +fix plane_xy_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_xy_neg contacts + +compute plane_xy_neg_force all reduce sum f_plane_xy_neg[4] +variable plane_xy_neg_force equal c_plane_xy_neg_force + +compute plane_xz_neg_force all reduce sum f_plane_xz_neg[3] +variable plane_xz_neg_force equal c_plane_xz_neg_force + +compute plane_yz_neg_force all reduce sum f_plane_yz_neg[2] +variable plane_yz_neg_force equal c_plane_yz_neg_force + +#fix print1 all print 1 "${plane_disp} ${plane_xy_neg_force} ${plane_xz_neg_force} ${plane_yz_neg_force}" file force_disp_triaxial12.csv screen no + +######################################## SCREEN OUTPUT #################################################### + +compute 1 all erotate/sphere +thermo_style custom dt step atoms ke c_1 vol +thermo 100 +thermo_modify lost ignore norm no + +##################################### DEFINE WALL MOVEMENT ################################################# + +variable disp_max equal 0.499 +variable ddisp equal 0.00001 +variable compression_steps equal round(${disp_max}/${ddisp}) +variable compression_steps equal round(0.499/${ddisp}) +variable compression_steps equal round(0.499/1e-05) +variable output_rate equal round(${compression_steps}/100) +variable output_rate equal round(49900/100) + +##################################### SET UP DUMP OUTPUTS #################################################### + +#dump dumpParticles all custom ${output_rate} triaxial_compaction_12.dump id type mass x y z vx vy vz fx fy fz radius +#dump dmp all vtk ${output_rate} post/triaxial12particles_*.vtk id type mass x y z vx vy vz fx fy fz radius + +#################################### COMPRESS THE PARTICLES ################################################## + +run 0 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- MDR contact model command: (i) https://doi.org/10.1016/j.jmps.2023.105492 || (ii) https://doi.org/10.1016/j.jmps.2023.105493 || (iii) https://doi.org/10.31224/4289 + +@Article{zunker2024mechanicallyI, + author = {Zunker, William and Kamrin, Ken}, + title = {A mechanically-derived contact model for adhesive elastic-perfectly plastic particles, + Part I: Utilizing the method of dimensionality reduction}, + journal = {Journal of the Mechanics and Physics of Solids}, + year = {2024}, + volume = {183}, + pages = {105492}, +} + +@Article{zunker2024mechanicallyII, + author = {Zunker, William and Kamrin, Ken}, + title = {A mechanically-derived contact model for adhesive elastic-perfectly plastic particles, + Part II: Contact under high compaction—modeling a bulk elastic response}, + journal = {Journal of the Mechanics and Physics of Solids}, + year = {2024}, + volume = {183}, + pages = {105493}, +} + +@Article{zunker2025experimentally, + author = {Zunker, William and Dunatunga, Sachith and Thakur, Subhash and Tang, Pingjun and Kamrin, Ken}, + title = {Experimentally validated DEM for large deformation powder compaction: + mechanically-derived contact model and screening of non-physical contacts}, + year = {2025}, + journal = {engrXiv}, +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.2 + ghost atom cutoff = 3.2 + binsize = 1.6, bins = 13 13 13 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair granular, perpetual + attributes: half, newton off, size, history + pair build: half/size/bin/atomonly/newtoff + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 74.54 | 74.54 | 74.54 Mbytes + Dt Step Atoms KinEng c_1 Volume + 1e-06 0 12 0 0 8000 +Loop time of 1.135e-06 on 1 procs for 0 steps with 12 atoms + +88.1% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 1.135e-06 | | |100.00 + +Nlocal: 12 ave 12 max 12 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 66 ave 66 max 66 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 66 +Ave neighs/atom = 5.5 +Neighbor list builds = 0 +Dangerous builds = 0 + +# print out contact area evolution for particles 1 and 12 +compute Ac_1_12 particles_1_12 pair/local p13 cutoff radius +compute Ac_1_12_sum particles_1_12 reduce sum c_Ac_1_12 inputs local +variable Ac_1_12 equal c_Ac_1_12_sum +#fix logArea all print 100 "${plane_disp} ${Ac_1_12}" file pair_1_12_contact_area_triaxial12.csv screen no + +variable plane_disp equal ${ddisp}*elapsed +variable plane_disp equal 1e-05*elapsed +variable plane_disp_neg equal -${ddisp}*elapsed +variable plane_disp_neg equal -1e-05*elapsed + +run ${compression_steps} +run 49900 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.2 + ghost atom cutoff = 3.2 + binsize = 1.6, bins = 13 13 13 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair granular, perpetual + attributes: half, newton off, size, history + pair build: half/size/bin/atomonly/newtoff + stencil: full/bin/3d + bin: standard + (2) compute pair/local, occasional + attributes: half, newton off, size + pair build: half/size/bin/atomonly/newtoff + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 75.17 | 75.17 | 75.17 Mbytes + Dt Step Atoms KinEng c_1 Volume + 1e-06 0 12 0 0 8000 + 1e-06 100 12 0.00013054111 0 8000 + 1e-06 200 12 0.013855547 0 8000 + 1e-06 300 12 0.14822185 0 8000 + 1e-06 400 12 0.73507149 0 8000 + 1e-06 500 12 2.4874475 0 8000 + 1e-06 600 12 6.7258963 0 8000 + 1e-06 700 12 15.636026 0 8000 + 1e-06 800 12 32.517811 0 8000 + 1e-06 900 12 62.020123 0 8000 + 1e-06 1000 12 110.35576 0 8000 + 1e-06 1100 12 185.492 0 8000 + 1e-06 1200 12 297.31164 0 8000 + 1e-06 1300 12 457.73953 0 8000 + 1e-06 1400 12 680.82988 0 8000 + 1e-06 1500 12 982.80999 0 8000 + 1e-06 1600 12 1382.0767 0 8000 + 1e-06 1700 12 1899.1422 0 8000 + 1e-06 1800 12 2556.5278 0 8000 + 1e-06 1900 12 3378.6026 0 8000 + 1e-06 2000 12 4391.3694 0 8000 + 1e-06 2100 12 5622.1967 0 8000 + 1e-06 2200 12 7099.4998 0 8000 + 1e-06 2300 12 8852.3743 0 8000 + 1e-06 2400 10 6989.9205 0 8000 + 1e-06 2500 10 8429.3452 0 8000 + 1e-06 2600 10 10069.898 0 8000 + 1e-06 2700 10 11924.3 0 8000 + 1e-06 2800 10 14004.078 0 8000 + 1e-06 2900 10 16319.307 0 8000 + 1e-06 3000 10 18878.365 0 8000 + 1e-06 3100 10 21687.702 0 8000 + 1e-06 3200 10 24751.634 0 8000 + 1e-06 3300 10 28072.177 0 8000 + 1e-06 3400 10 31649.069 0 8000 + 1e-06 3500 10 35479.937 0 8000 + 1e-06 3600 10 39560.508 0 8000 + 1e-06 3700 10 43884.837 0 8000 + 1e-06 3800 10 48445.544 0 8000 + 1e-06 3900 10 53234.048 0 8000 + 1e-06 4000 10 58240.786 0 8000 + 1e-06 4100 10 63455.398 0 8000 + 1e-06 4200 10 68866.878 0 8000 + 1e-06 4300 10 74463.666 0 8000 + 1e-06 4400 10 80233.692 0 8000 + 1e-06 4500 10 86164.354 0 8000 + 1e-06 4600 10 92242.435 0 8000 + 1e-06 4700 10 98453.963 0 8000 + 1e-06 4800 10 104784.03 0 8000 + 1e-06 4900 10 111216.58 0 8000 + 1e-06 5000 10 117734.15 0 8000 + 1e-06 5100 10 124317.68 0 8000 + 1e-06 5200 10 130946.27 0 8000 + 1e-06 5300 10 137597 0 8000 + 1e-06 5400 10 144244.91 0 8000 + 1e-06 5500 10 150862.88 0 8000 + 1e-06 5600 10 157421.78 0 8000 + 1e-06 5700 10 163890.67 0 8000 + 1e-06 5800 10 170237.02 0 8000 + 1e-06 5900 10 176427.24 0 8000 + 1e-06 6000 10 182427.1 0 8000 + 1e-06 6100 10 188202.4 0 8000 + 1e-06 6200 10 193719.65 0 8000 + 1e-06 6300 10 198946.82 0 8000 + 1e-06 6400 10 203854.11 0 8000 + 1e-06 6500 10 208414.76 0 8000 + 1e-06 6600 10 212605.82 0 8000 + 1e-06 6700 10 216408.93 0 8000 + 1e-06 6800 10 219811.02 0 8000 + 1e-06 6900 10 222804.99 0 8000 + 1e-06 7000 10 225390.45 0 8000 + 1e-06 7100 10 227574.39 0 8000 + 1e-06 7200 10 229372.23 0 8000 + 1e-06 7300 10 230809.43 0 8000 + 1e-06 7400 10 231925.78 0 8000 + 1e-06 7500 10 232793.77 0 8000 + 1e-06 7600 10 233468.99 0 8000 + 1e-06 7700 10 233964.52 1.1292815e-08 8000 + 1e-06 7800 10 234297.53 3.2638536e-06 8000 + 1e-06 7900 10 234490.97 4.5245711e-05 8000 + 1e-06 8000 10 234575.58 0.00027361033 8000 + 1e-06 8100 10 234598.71 0.001096929 8000 + 1e-06 8200 10 234623.44 0.0034192164 8000 + 1e-06 8300 10 234664.37 0.0089703149 8000 + 1e-06 8400 10 234728.48 0.020734818 8000 + 1e-06 8500 10 234824.44 0.043473962 8000 + 1e-06 8600 10 234962.62 0.084326224 8000 + 1e-06 8700 10 235155.17 0.15346362 8000 + 1e-06 8800 10 235415.94 0.26477255 8000 + 1e-06 8900 10 235760.43 0.43652067 8000 + 1e-06 9000 10 236205.62 0.69196571 8000 + 1e-06 9100 10 236769.75 1.0598579 8000 + 1e-06 9200 10 237472.3 1.5747862 8000 + 1e-06 9300 10 238334.06 2.2773199 8000 + 1e-06 9400 10 239377.46 3.2138993 8000 + 1e-06 9500 10 240626.63 4.4364369 8000 + 1e-06 9600 10 242107.53 6.0015993 8000 + 1e-06 9700 10 243847.86 7.9697503 8000 + 1e-06 9800 10 245876.93 10.403551 8000 + 1e-06 9900 10 248225.31 13.366224 8000 + 1e-06 10000 10 250924.44 16.919517 8000 + 1e-06 10100 8 234934.58 0 8000 + 1e-06 10200 8 235124.58 0 8000 + 1e-06 10300 8 235382.91 0 8000 + 1e-06 10400 8 235723.84 0 8000 + 1e-06 10500 8 236162.16 0 8000 + 1e-06 10600 8 236712.7 0 8000 + 1e-06 10700 8 237389.77 0 8000 + 1e-06 10800 8 238206.63 0 8000 + 1e-06 10900 8 239174.87 0 8000 + 1e-06 11000 8 240303.83 0 8000 + 1e-06 11100 8 241600.1 0 8000 + 1e-06 11200 8 243067 0 8000 + 1e-06 11300 8 244704.22 0 8000 + 1e-06 11400 8 246507.57 0 8000 + 1e-06 11500 8 248468.78 0 8000 + 1e-06 11600 8 250575.55 0 8000 + 1e-06 11700 8 252811.67 0 8000 + 1e-06 11800 6 201540.76 0 8000 + 1e-06 11900 6 203972.8 0 8000 + 1e-06 12000 6 206465.55 0 8000 + 1e-06 12100 6 208991.23 0 8000 + 1e-06 12200 6 211520.76 0 8000 + 1e-06 12300 6 214024.53 0 8000 + 1e-06 12400 6 216473.14 0 8000 + 1e-06 12500 6 218838.23 0 8000 + 1e-06 12600 6 221093.18 0 8000 + 1e-06 12700 6 223213.84 0 8000 + 1e-06 12800 6 225179.08 0 8000 + 1e-06 12900 6 226971.32 0 8000 + 1e-06 13000 6 228576.94 0 8000 + 1e-06 13100 6 229986.52 0 8000 + 1e-06 13200 6 231195.09 0 8000 + 1e-06 13300 6 232202.15 0 8000 + 1e-06 13400 6 233011.77 0 8000 + 1e-06 13500 6 233632.53 0 8000 + 1e-06 13600 6 234077.63 0 8000 + 1e-06 13700 6 234365.12 0 8000 + 1e-06 13800 6 234518.64 0 8000 + 1e-06 13900 6 234569.99 0 8000 + 1e-06 14000 6 234572.25 0 8000 + 1e-06 14100 6 234572.25 0 8000 + 1e-06 14200 6 234572.25 0 8000 + 1e-06 14300 6 234572.25 0 8000 + 1e-06 14400 6 234572.25 0 8000 + 1e-06 14500 6 234572.25 0 8000 + 1e-06 14600 6 234572.25 0 8000 + 1e-06 14700 6 234572.25 0 8000 + 1e-06 14800 6 234572.29 0 8000 + 1e-06 14900 6 234572.53 0 8000 + 1e-06 15000 6 234573.43 0 8000 + 1e-06 15100 6 234575.83 0 8000 + 1e-06 15200 6 234581.15 0 8000 + 1e-06 15300 6 234591.61 0 8000 + 1e-06 15400 6 234610.69 0 8000 + 1e-06 15500 6 234643.46 0 8000 + 1e-06 15600 6 234697 0 8000 + 1e-06 15700 6 234780.66 0 8000 + 1e-06 15800 6 234906.33 0 8000 + 1e-06 15900 6 235088.62 0 8000 + 1e-06 16000 6 235344.92 0 8000 + 1e-06 16100 6 235695.54 0 8000 + 1e-06 16200 6 236163.79 0 8000 + 1e-06 16300 6 236775.81 0 8000 + 1e-06 16400 6 237560.44 0 8000 + 1e-06 16500 6 238548.84 0 8000 + 1e-06 16600 6 239774.02 0 8000 + 1e-06 16700 6 241270.31 0 8000 + 1e-06 16800 6 243072.61 0 8000 + 1e-06 16900 6 245211.28 6.7509561e-05 8000 + 1e-06 17000 6 247685.18 0.0080448801 8000 + 1e-06 17100 6 250497.91 0.088500606 8000 + 1e-06 17200 6 253660.58 0.44413361 8000 + 1e-06 17300 6 257184.97 1.4994335 8000 + 1e-06 17400 6 261081.58 3.9820483 8000 + 1e-06 17500 6 265358.51 9.0005574 8000 + 1e-06 17600 6 270020.73 18.117195 8000 + 1e-06 17700 6 275069.6 33.413964 8000 + 1e-06 17800 6 280502.61 57.550525 8000 + 1e-06 17900 6 286303.62 93.814333 8000 + 1e-06 18000 6 292426.19 146.2099 8000 + 1e-06 18100 6 298823.02 219.66922 8000 + 1e-06 18200 6 305448.57 320.29091 8000 + 1e-06 18300 6 312257.06 455.50977 8000 + 1e-06 18400 6 319203.29 634.16436 8000 + 1e-06 18500 6 326243.62 866.44452 8000 + 1e-06 18600 6 333337.05 1163.7119 8000 + 1e-06 18700 6 340446.07 1538.1992 8000 + 1e-06 18800 6 347537.26 2002.6065 8000 + 1e-06 18900 6 354581.63 2569.6256 8000 + 1e-06 19000 6 361554.66 3251.4317 8000 + 1e-06 19100 6 368436.16 4059.1895 8000 + 1e-06 19200 6 375209.78 5002.6224 8000 + 1e-06 19300 6 381882.2 6109.6539 8000 + 1e-06 19400 6 388474.8 7416.2947 8000 + 1e-06 19500 6 395001.33 8944.9067 8000 + 1e-06 19600 6 401479.91 10717.67 8000 + 1e-06 19700 6 407931.4 12755.438 8000 + 1e-06 19800 6 414377.59 15076.566 8000 + 1e-06 19900 6 420839.43 17695.777 8000 + 1e-06 20000 6 427335.35 20623.111 8000 + 1e-06 20100 6 433879.62 23863.014 8000 + 1e-06 20200 6 440481.15 27413.577 8000 + 1e-06 20300 6 447142.48 31265.951 8000 + 1e-06 20400 6 453859.41 35403.784 8000 + 1e-06 20500 6 460622.17 39801.729 8000 + 1e-06 20600 6 467431.36 44452.106 8000 + 1e-06 20700 6 474330.29 49397.748 8000 + 1e-06 20800 6 481309.26 54624.638 8000 + 1e-06 20900 6 488358.84 60103.827 8000 + 1e-06 21000 6 495475.98 65790.173 8000 + 1e-06 21100 6 502655.34 71632.552 8000 + 1e-06 21200 6 509889.38 77576.424 8000 + 1e-06 21300 6 517172.66 83561.469 8000 + 1e-06 21400 6 524502.62 89522.951 8000 + 1e-06 21500 6 531876.86 95398.198 8000 + 1e-06 21600 6 539294.19 101129.04 8000 + 1e-06 21700 6 546755.8 106663.72 8000 + 1e-06 21800 6 554266.99 111958.45 8000 + 1e-06 21900 6 561839.98 116978.4 8000 + 1e-06 22000 6 569504.77 121698.15 8000 + 1e-06 22100 6 577194.68 126299.67 8000 + 1e-06 22200 6 584793.35 130939.81 8000 + 1e-06 22300 6 592287.59 135570.38 8000 + 1e-06 22400 6 599668.12 140143.02 8000 + 1e-06 22500 6 606930.15 144609.51 8000 + 1e-06 22600 6 614053.56 148921.72 8000 + 1e-06 22700 6 621008.46 153030.89 8000 + 1e-06 22800 6 627801.12 156883.57 8000 + 1e-06 22900 6 634468.16 160420.58 8000 + 1e-06 23000 6 640978.09 163613.12 8000 + 1e-06 23100 6 647287.63 166442.2 8000 + 1e-06 23200 6 653357.63 168893.16 8000 + 1e-06 23300 6 659133.28 170996.37 8000 + 1e-06 23400 6 664395.28 173122 8000 + 1e-06 23500 6 669082.71 175330.06 8000 + 1e-06 23600 6 673190.8 177582.02 8000 + 1e-06 23700 6 676722.56 179839.98 8000 + 1e-06 23800 6 679689.62 182067.03 8000 + 1e-06 23900 6 682113 184227.49 8000 + 1e-06 24000 6 684024.19 186286.94 8000 + 1e-06 24100 6 685466.31 188212.09 8000 + 1e-06 24200 6 686496.31 189970.05 8000 + 1e-06 24300 6 687194.14 191524.49 8000 + 1e-06 24400 6 687664.3 192834.65 8000 + 1e-06 24500 6 687952.12 193892.14 8000 + 1e-06 24600 6 688095.09 194698.81 8000 + 1e-06 24700 6 688136.6 195260.51 8000 + 1e-06 24800 6 688125.44 195586.96 8000 + 1e-06 24900 6 688096.3 195728.68 8000 + 1e-06 25000 6 687921.9 196064.13 8000 + 1e-06 25100 6 687620.45 196683.53 8000 + 1e-06 25200 6 687262.22 197578.87 8000 + 1e-06 25300 6 686921.27 198739.39 8000 + 1e-06 25400 6 686676.56 200150.16 8000 + 1e-06 25500 6 686616.59 201789.73 8000 + 1e-06 25600 6 686864.53 203620.41 8000 + 1e-06 25700 6 687515.07 205612.65 8000 + 1e-06 25800 6 688581.75 207765.95 8000 + 1e-06 25900 6 690068.86 210079.27 8000 + 1e-06 26000 6 691973.66 212549.89 8000 + 1e-06 26100 6 694286.34 215173.38 8000 + 1e-06 26200 6 696990.21 217943.63 8000 + 1e-06 26300 6 700062.02 220852.8 8000 + 1e-06 26400 6 703472.51 223891.43 8000 + 1e-06 26500 6 707187.07 227048.44 8000 + 1e-06 26600 6 711166.57 230311.27 8000 + 1e-06 26700 6 715368.28 233666 8000 + 1e-06 26800 6 719746.83 237097.44 8000 + 1e-06 26900 4 611074.01 219866.64 8000 + 1e-06 27000 4 613405.75 223401.9 8000 + 1e-06 27100 4 615906.25 226962.69 8000 + 1e-06 27200 4 618550.98 230530.7 8000 + 1e-06 27300 4 621314.15 234087.34 8000 + 1e-06 27400 4 624169.04 237613.98 8000 + 1e-06 27500 4 627088.41 241092.16 8000 + 1e-06 27600 4 630045.27 244503.29 8000 + 1e-06 27700 4 633017.68 247822.39 8000 + 1e-06 27800 4 635987.37 251019.87 8000 + 1e-06 27900 4 638936.67 254066.27 8000 + 1e-06 28000 4 641848.81 256932.77 8000 + 1e-06 28100 4 644708.19 259591.65 8000 + 1e-06 28200 4 647500.76 262016.69 8000 + 1e-06 28300 4 650214.19 264183.55 8000 + 1e-06 28400 4 652838.21 266070.17 8000 + 1e-06 28500 4 655364.7 267657.12 8000 + 1e-06 28600 4 657787.94 268927.87 8000 + 1e-06 28700 4 660104.66 269869.08 8000 + 1e-06 28800 4 662314.19 270470.82 8000 + 1e-06 28900 4 664418.47 270726.71 8000 + 1e-06 29000 4 666422.08 270634.03 8000 + 1e-06 29100 4 668332.27 270193.77 8000 + 1e-06 29200 4 670133.21 269455.46 8000 + 1e-06 29300 4 671623.88 268795.91 8000 + 1e-06 29400 4 672777.96 268288.08 8000 + 1e-06 29500 4 673622.53 267917.97 8000 + 1e-06 29600 4 674189.83 267670.08 8000 + 1e-06 29700 4 674518.57 267526.71 8000 + 1e-06 29800 4 674657.04 267466.37 8000 + 1e-06 29900 4 674676.17 267458.04 8000 + 1e-06 30000 4 674676.17 267458.04 8000 + 1e-06 30100 4 674676.17 267458.04 8000 + 1e-06 30200 2 304425.26 84084.197 8000 + 1e-06 30300 2 304425.26 84084.197 8000 + 1e-06 30400 2 304425.26 84084.197 8000 + 1e-06 30500 2 304425.26 84084.197 8000 + 1e-06 30600 2 304425.26 84084.197 8000 + 1e-06 30700 2 304425.26 84084.197 8000 + 1e-06 30800 2 304425.26 84084.197 8000 + 1e-06 30900 2 304425.26 84084.197 8000 + 1e-06 31000 2 304425.26 84084.197 8000 + 1e-06 31100 2 304425.26 84084.197 8000 + 1e-06 31200 2 304425.26 84084.197 8000 + 1e-06 31300 2 304425.26 84084.197 8000 + 1e-06 31400 2 304425.26 84084.197 8000 + 1e-06 31500 2 304425.26 84084.197 8000 + 1e-06 31600 2 304425.26 84084.197 8000 + 1e-06 31700 2 304425.26 84084.197 8000 + 1e-06 31800 2 304425.26 84084.197 8000 + 1e-06 31900 2 304425.26 84084.197 8000 + 1e-06 32000 2 304425.26 84084.197 8000 + 1e-06 32100 2 304425.26 84084.197 8000 + 1e-06 32200 2 304425.26 84084.197 8000 + 1e-06 32300 2 304425.26 84084.197 8000 + 1e-06 32400 2 304425.26 84084.197 8000 + 1e-06 32500 2 304425.26 84084.197 8000 + 1e-06 32600 2 304425.26 84084.197 8000 + 1e-06 32700 2 304425.26 84084.197 8000 + 1e-06 32800 2 304425.26 84084.197 8000 + 1e-06 32900 2 304425.26 84084.197 8000 + 1e-06 33000 2 304425.26 84084.197 8000 + 1e-06 33100 2 304425.26 84084.197 8000 + 1e-06 33200 2 304425.26 84084.197 8000 + 1e-06 33300 2 304425.26 84084.197 8000 + 1e-06 33400 2 304425.26 84084.197 8000 + 1e-06 33500 2 304425.26 84084.197 8000 + 1e-06 33600 2 304425.26 84084.197 8000 + 1e-06 33700 2 304425.26 84084.197 8000 + 1e-06 33800 2 304425.26 84084.197 8000 + 1e-06 33900 2 304425.26 84084.197 8000 + 1e-06 34000 2 304419.46 84084.197 8000 + 1e-06 34100 2 304377.55 84084.224 8000 + 1e-06 34200 2 304278.4 84084.45 8000 + 1e-06 34300 2 304108.46 84085.385 8000 + 1e-06 34400 2 303858.22 84088.048 8000 + 1e-06 34500 2 303521.62 84094.139 8000 + 1e-06 34600 2 303095.91 84106.182 8000 + 1e-06 34700 2 302581.78 84127.634 8000 + 1e-06 34800 2 301983.37 84162.962 8000 + 1e-06 34900 2 301308.35 84217.674 8000 + 1e-06 35000 2 300567.85 84298.29 8000 + 1e-06 35100 2 299776.31 84412.267 8000 + 1e-06 35200 2 298951.17 84567.862 8000 + 1e-06 35300 2 298112.52 84773.935 8000 + 1e-06 35400 2 297282.57 85039.703 8000 + 1e-06 35500 2 296485.02 85374.448 8000 + 1e-06 35600 2 295744.34 85787.18 8000 + 1e-06 35700 2 295085 86286.286 8000 + 1e-06 35800 2 294530.68 86879.159 8000 + 1e-06 35900 0 0 0 8000 + 1e-06 36000 0 0 0 8000 + 1e-06 36100 0 0 0 8000 + 1e-06 36200 0 0 0 8000 + 1e-06 36300 0 0 0 8000 + 1e-06 36400 0 0 0 8000 + 1e-06 36500 0 0 0 8000 + 1e-06 36600 0 0 0 8000 + 1e-06 36700 0 0 0 8000 + 1e-06 36800 0 0 0 8000 + 1e-06 36900 0 0 0 8000 + 1e-06 37000 0 0 0 8000 + 1e-06 37100 0 0 0 8000 + 1e-06 37200 0 0 0 8000 + 1e-06 37300 0 0 0 8000 + 1e-06 37400 0 0 0 8000 + 1e-06 37500 0 0 0 8000 + 1e-06 37600 0 0 0 8000 + 1e-06 37700 0 0 0 8000 + 1e-06 37800 0 0 0 8000 + 1e-06 37900 0 0 0 8000 + 1e-06 38000 0 0 0 8000 + 1e-06 38100 0 0 0 8000 + 1e-06 38200 0 0 0 8000 + 1e-06 38300 0 0 0 8000 + 1e-06 38400 0 0 0 8000 + 1e-06 38500 0 0 0 8000 + 1e-06 38600 0 0 0 8000 + 1e-06 38700 0 0 0 8000 + 1e-06 38800 0 0 0 8000 + 1e-06 38900 0 0 0 8000 + 1e-06 39000 0 0 0 8000 + 1e-06 39100 0 0 0 8000 + 1e-06 39200 0 0 0 8000 + 1e-06 39300 0 0 0 8000 + 1e-06 39400 0 0 0 8000 + 1e-06 39500 0 0 0 8000 + 1e-06 39600 0 0 0 8000 + 1e-06 39700 0 0 0 8000 + 1e-06 39800 0 0 0 8000 + 1e-06 39900 0 0 0 8000 + 1e-06 40000 0 0 0 8000 + 1e-06 40100 0 0 0 8000 + 1e-06 40200 0 0 0 8000 + 1e-06 40300 0 0 0 8000 + 1e-06 40400 0 0 0 8000 + 1e-06 40500 0 0 0 8000 + 1e-06 40600 0 0 0 8000 + 1e-06 40700 0 0 0 8000 + 1e-06 40800 0 0 0 8000 + 1e-06 40900 0 0 0 8000 + 1e-06 41000 0 0 0 8000 + 1e-06 41100 0 0 0 8000 + 1e-06 41200 0 0 0 8000 + 1e-06 41300 0 0 0 8000 + 1e-06 41400 0 0 0 8000 + 1e-06 41500 0 0 0 8000 + 1e-06 41600 0 0 0 8000 + 1e-06 41700 0 0 0 8000 + 1e-06 41800 0 0 0 8000 + 1e-06 41900 0 0 0 8000 + 1e-06 42000 0 0 0 8000 + 1e-06 42100 0 0 0 8000 + 1e-06 42200 0 0 0 8000 + 1e-06 42300 0 0 0 8000 + 1e-06 42400 0 0 0 8000 + 1e-06 42500 0 0 0 8000 + 1e-06 42600 0 0 0 8000 + 1e-06 42700 0 0 0 8000 + 1e-06 42800 0 0 0 8000 + 1e-06 42900 0 0 0 8000 + 1e-06 43000 0 0 0 8000 + 1e-06 43100 0 0 0 8000 + 1e-06 43200 0 0 0 8000 + 1e-06 43300 0 0 0 8000 + 1e-06 43400 0 0 0 8000 + 1e-06 43500 0 0 0 8000 + 1e-06 43600 0 0 0 8000 + 1e-06 43700 0 0 0 8000 + 1e-06 43800 0 0 0 8000 + 1e-06 43900 0 0 0 8000 + 1e-06 44000 0 0 0 8000 + 1e-06 44100 0 0 0 8000 + 1e-06 44200 0 0 0 8000 + 1e-06 44300 0 0 0 8000 + 1e-06 44400 0 0 0 8000 + 1e-06 44500 0 0 0 8000 + 1e-06 44600 0 0 0 8000 + 1e-06 44700 0 0 0 8000 + 1e-06 44800 0 0 0 8000 + 1e-06 44900 0 0 0 8000 + 1e-06 45000 0 0 0 8000 + 1e-06 45100 0 0 0 8000 + 1e-06 45200 0 0 0 8000 + 1e-06 45300 0 0 0 8000 + 1e-06 45400 0 0 0 8000 + 1e-06 45500 0 0 0 8000 + 1e-06 45600 0 0 0 8000 + 1e-06 45700 0 0 0 8000 + 1e-06 45800 0 0 0 8000 + 1e-06 45900 0 0 0 8000 + 1e-06 46000 0 0 0 8000 + 1e-06 46100 0 0 0 8000 + 1e-06 46200 0 0 0 8000 + 1e-06 46300 0 0 0 8000 + 1e-06 46400 0 0 0 8000 + 1e-06 46500 0 0 0 8000 + 1e-06 46600 0 0 0 8000 + 1e-06 46700 0 0 0 8000 + 1e-06 46800 0 0 0 8000 + 1e-06 46900 0 0 0 8000 + 1e-06 47000 0 0 0 8000 + 1e-06 47100 0 0 0 8000 + 1e-06 47200 0 0 0 8000 + 1e-06 47300 0 0 0 8000 + 1e-06 47400 0 0 0 8000 + 1e-06 47500 0 0 0 8000 + 1e-06 47600 0 0 0 8000 + 1e-06 47700 0 0 0 8000 + 1e-06 47800 0 0 0 8000 + 1e-06 47900 0 0 0 8000 + 1e-06 48000 0 0 0 8000 + 1e-06 48100 0 0 0 8000 + 1e-06 48200 0 0 0 8000 + 1e-06 48300 0 0 0 8000 + 1e-06 48400 0 0 0 8000 + 1e-06 48500 0 0 0 8000 + 1e-06 48600 0 0 0 8000 + 1e-06 48700 0 0 0 8000 + 1e-06 48800 0 0 0 8000 + 1e-06 48900 0 0 0 8000 + 1e-06 49000 0 0 0 8000 + 1e-06 49100 0 0 0 8000 + 1e-06 49200 0 0 0 8000 + 1e-06 49300 0 0 0 8000 + 1e-06 49400 0 0 0 8000 + 1e-06 49500 0 0 0 8000 + 1e-06 49600 0 0 0 8000 + 1e-06 49700 0 0 0 8000 + 1e-06 49800 0 0 0 8000 + 1e-06 49900 0 0 0 8000 +Loop time of 0.419125 on 1 procs for 49900 steps with 0 atoms + +99.7% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.015815 | 0.015815 | 0.015815 | 0.0 | 3.77 +Neigh | 1.795e-05 | 1.795e-05 | 1.795e-05 | 0.0 | 0.00 +Comm | 0.0015216 | 0.0015216 | 0.0015216 | 0.0 | 0.36 +Output | 0.0024194 | 0.0024194 | 0.0024194 | 0.0 | 0.58 +Modify | 0.3932 | 0.3932 | 0.3932 | 0.0 | 93.81 +Other | | 0.006155 | | | 1.47 + +Nlocal: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 0 +Neighbor list builds = 6 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/src/GRANULAR/fix_granular_mdr.cpp b/src/GRANULAR/fix_granular_mdr.cpp index 0e9a5ada7f..08e3698be5 100644 --- a/src/GRANULAR/fix_granular_mdr.cpp +++ b/src/GRANULAR/fix_granular_mdr.cpp @@ -154,27 +154,27 @@ void FixGranularMDR::setup_pre_force(int /*vflag*/) norm_model2 = dynamic_cast(fix->model->normal_model); - if (norm_model && norm_model2 && (norm_model->E != norm_model2->E)) + if (norm_model && norm_model2 && fabs(norm_model->E - norm_model2->E) > EPSILON) error->all( FLERR, Error::NOLASTLINE, "Young's modulus in pair style, {}, does not agree with value {} in fix gran/wall/region", norm_model->E, norm_model2->E); - if (norm_model->nu != norm_model2->nu) + if (fabs(norm_model->nu - norm_model2->nu) > EPSILON) error->all( FLERR, Error::NOLASTLINE, "Poisson's ratio in pair style, {}, does not agree with value {} in fix gran/wall/region", norm_model->nu, norm_model2->nu); - if (norm_model->Y != norm_model2->Y) + if (fabs(norm_model->Y - norm_model2->Y) > EPSILON) error->all( FLERR, Error::NOLASTLINE, "Yield stress in pair style, {}, does not agree with value {} in fix gran/wall/region", norm_model->Y, norm_model2->Y); - if (norm_model->psi_b != norm_model2->psi_b) + if (fabs(norm_model->psi_b - norm_model2->psi_b) > EPSILON) error->all(FLERR, Error::NOLASTLINE, "Bulk response trigger in pair style, {}, does not agree with value {} in fix " "gran/wall/region", norm_model->psi_b, norm_model2->psi_b); - if (norm_model->CoR != norm_model2->CoR) + if (fabs(norm_model->CoR - norm_model2->CoR) > EPSILON) error->all(FLERR, Error::NOLASTLINE, "Coefficient of restitution in pair style, {}, does not agree with value {} in " "fix gran/wall/region", @@ -243,18 +243,19 @@ void FixGranularMDR::pre_force(int) if (update->setupflag && (!new_atom)) continue; const double R = radius[i]; + const double Rsq = R * R; const double Vo = 4.0 / 3.0 * MY_PI * pow(Ro[i], 3.0); - const double Vgeoi = 4.0 / 3.0 * MY_PI * pow(R, 3.0) - Vcaps[i]; + const double Vgeoi = 4.0 / 3.0 * MY_PI * Rsq * R - Vcaps[i]; Vgeo[i] = MIN(Vgeoi, Vo); Velas[i] = Vo * (1.0 + eps_bar[i]); - Atot[i] = 4.0 * MY_PI * pow(R, 2.0) + Atot_sum[i]; + Atot[i] = 4.0 * MY_PI * Rsq + Atot_sum[i]; psi[i] = (Atot[i] - Acon1[i]) / Atot[i]; if (psi_b_coeff < psi[i]) { double w_confinement; - ( psi[i] > 0.1 ) ? w_confinement = 1.0/(1.0 + exp(-75.0*(psi[i]-0.2))) : w_confinement = 0.0; - const double dR = MAX(dRnumerator[i] / (dRdenominator[i] - 4.0 * MY_PI * pow(R, 2.0))*w_confinement, 0.0); + ( psi[i] > 0.1 ) ? w_confinement = 1.0 / (1.0 + exp(-75.0 * (psi[i] - 0.2))) : w_confinement = 0.0; + const double dR = MAX(dRnumerator[i] / (dRdenominator[i] - 4.0 * MY_PI * Rsq) * w_confinement, 0.0); const double N_window = 10.0; if (dR > 0.0) dRavg[i] += (dR - dRavg[i]) / N_window; diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 1e233de38e..1c62c92c76 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -13,6 +13,7 @@ #include "gran_sub_mod_damping.h" +#include "error.h" #include "gran_sub_mod_normal.h" #include "fix_granular_mdr.h" #include "granular_model.h" @@ -185,10 +186,18 @@ GranSubModDampingMDR::GranSubModDampingMDR(GranularModel *gm, LAMMPS *lmp) : /* ---------------------------------------------------------------------- */ +void GranSubModDampingMDR::init() +{ + if (gm->normal_model->name != "mdr") + error->all(FLERR, "Damping mdr can only be used with mdr normal model"); +} + +/* ---------------------------------------------------------------------- */ + double GranSubModDampingMDR::calculate_forces() { using namespace Granular_MDR_NS; double *history = & gm->history[gm->normal_model->history_index]; damp_prefactor = damp * history[DAMP_SCALE]; return -damp_prefactor * gm->vnnr; -} \ No newline at end of file +} diff --git a/src/GRANULAR/gran_sub_mod_damping.h b/src/GRANULAR/gran_sub_mod_damping.h index 06aabbc5ca..cd7ee3bf1a 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -49,7 +49,6 @@ namespace Granular_NS { class GranSubModDampingNone : public GranSubModDamping { public: GranSubModDampingNone(class GranularModel *, class LAMMPS *); - void init() override{}; double calculate_forces() override; }; @@ -99,6 +98,7 @@ namespace Granular_NS { class GranSubModDampingMDR : public GranSubModDamping { public: GranSubModDampingMDR(class GranularModel *, class LAMMPS *); + void init() override; double calculate_forces() override; }; diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index f27057e5b2..5683f54fc2 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -978,7 +978,6 @@ double GranSubModNormalMDR::calculate_forces() return F; } - /* ---------------------------------------------------------------------- */ double GranSubModNormalMDR::calculate_nonadhesive_mdr_force(double delta, double Ainv, double Eeff, double A, double B) From 3d4b57d7fde7a40f7ee9d683fab6315f22ca8c3c Mon Sep 17 00:00:00 2001 From: jtclemm Date: Fri, 4 Apr 2025 14:40:01 -0600 Subject: [PATCH 24/94] Removing old variable --- src/GRANULAR/fix_granular_mdr.cpp | 6 +++--- src/GRANULAR/gran_sub_mod_normal.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/GRANULAR/fix_granular_mdr.cpp b/src/GRANULAR/fix_granular_mdr.cpp index 08e3698be5..8d9a0f116a 100644 --- a/src/GRANULAR/fix_granular_mdr.cpp +++ b/src/GRANULAR/fix_granular_mdr.cpp @@ -174,11 +174,11 @@ void FixGranularMDR::setup_pre_force(int /*vflag*/) "Bulk response trigger in pair style, {}, does not agree with value {} in fix " "gran/wall/region", norm_model->psi_b, norm_model2->psi_b); - if (fabs(norm_model->CoR - norm_model2->CoR) > EPSILON) + if (fabs(norm_model->get_damp() - norm_model2->get_damp()) > EPSILON) error->all(FLERR, Error::NOLASTLINE, - "Coefficient of restitution in pair style, {}, does not agree with value {} in " + "Damping in pair style, {}, does not agree with value {} in " "fix gran/wall/region", - norm_model->CoR, norm_model2->CoR); + norm_model->get_damp(), norm_model2->get_damp()); } fix_history = dynamic_cast(modify->get_fix_by_id("NEIGH_HISTORY_GRANULAR")); diff --git a/src/GRANULAR/gran_sub_mod_normal.h b/src/GRANULAR/gran_sub_mod_normal.h index b096e03ca8..8142d88cea 100644 --- a/src/GRANULAR/gran_sub_mod_normal.h +++ b/src/GRANULAR/gran_sub_mod_normal.h @@ -143,7 +143,7 @@ namespace Granular_NS { void coeffs_to_local() override; void init() override; double calculate_forces() override; - double E, nu, Y, gamma, CoR, psi_b; // specified coeffs + double E, nu, Y, gamma, psi_b; // specified coeffs protected: double G, kappa, Eeff; // derived coeffs From ea76dc99e9f2aceb8d0fdac448a8afabc1b4583b Mon Sep 17 00:00:00 2001 From: jtclemm Date: Fri, 4 Apr 2025 15:20:55 -0600 Subject: [PATCH 25/94] Adding damp coeff back in --- .../granular/log.4Feb25.tableting.200.g++.1 | 874 +++++++------- .../log.4Feb25.triaxial.compaction.12.g++.1 | 1035 +++++++++-------- src/GRANULAR/gran_sub_mod_damping.cpp | 2 + src/GRANULAR/gran_sub_mod_normal.cpp | 6 +- 4 files changed, 959 insertions(+), 958 deletions(-) diff --git a/examples/granular/log.4Feb25.tableting.200.g++.1 b/examples/granular/log.4Feb25.tableting.200.g++.1 index df6428ff1a..818198ccd7 100644 --- a/examples/granular/log.4Feb25.tableting.200.g++.1 +++ b/examples/granular/log.4Feb25.tableting.200.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-581-g384d7f446b-modified) +LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-583-g3d4b57d7fd-modified) ##################################### SIMULATION SETTINGS ################################################### atom_style sphere 1 @@ -20,7 +20,7 @@ Reading data file ... 1 by 1 by 1 MPI processor grid reading atoms ... 200 atoms - read_data CPU = 0.004 seconds + read_data CPU = 0.003 seconds #################################### ADD DIE AND ATOM PARAMETERIZATION ###################################### @@ -195,9 +195,9 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes Dt Step Atoms KinEng Volume v_disp_upper 4e-06 0 200 0 2.1e-06 0 -Loop time of 8.51e-07 on 1 procs for 0 steps with 200 atoms +Loop time of 7.84e-07 on 1 procs for 0 steps with 200 atoms -117.5% CPU use with 1 MPI tasks x no OpenMP threads +127.6% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total @@ -207,7 +207,7 @@ Neigh | 0 | 0 | 0 | 0.0 | 0.00 Comm | 0 | 0 | 0 | 0.0 | 0.00 Output | 0 | 0 | 0 | 0.0 | 0.00 Modify | 0 | 0 | 0 | 0.0 | 0.00 -Other | | 8.51e-07 | | |100.00 +Other | | 7.84e-07 | | |100.00 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -263,78 +263,78 @@ Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes Dt Step Atoms KinEng Volume v_disp_upper 4e-06 0 200 0 2.1e-06 0 4e-06 100 200 1.5945503e-09 2.1e-06 0 - 4e-06 200 200 6.3770738e-09 2.1e-06 0 - 4e-06 300 200 1.4245359e-08 2.1e-06 0 - 4e-06 400 200 2.5260505e-08 2.1e-06 0 - 4e-06 500 200 3.9464751e-08 2.1e-06 0 - 4e-06 600 200 5.6858098e-08 2.1e-06 0 - 4e-06 700 200 7.7385952e-08 2.1e-06 0 - 4e-06 800 198 1.0059548e-07 2.1e-06 0 - 4e-06 900 196 1.2599473e-07 2.1e-06 0 - 4e-06 1000 194 1.5428578e-07 2.1e-06 0 - 4e-06 1100 194 1.8644695e-07 2.1e-06 0 - 4e-06 1200 192 2.2088698e-07 2.1e-06 0 - 4e-06 1300 192 2.5897366e-07 2.1e-06 0 - 4e-06 1400 192 3.0013683e-07 2.1e-06 0 - 4e-06 1500 192 3.4277758e-07 2.1e-06 0 - 4e-06 1600 192 3.9077177e-07 2.1e-06 0 - 4e-06 1700 192 4.3898925e-07 2.1e-06 0 - 4e-06 1800 186 4.736674e-07 2.1e-06 0 - 4e-06 1900 184 5.2110858e-07 2.1e-06 0 - 4e-06 2000 184 5.7848899e-07 2.1e-06 0 - 4e-06 2100 184 6.3492469e-07 2.1e-06 0 - 4e-06 2200 184 6.9441989e-07 2.1e-06 0 - 4e-06 2300 182 inf 2.1e-06 0 - 4e-06 2400 176 7.9307687e-07 2.1e-06 0 - 4e-06 2500 176 8.599965e-07 2.1e-06 0 - 4e-06 2600 176 9.2970927e-07 2.1e-06 0 - 4e-06 2700 176 1.0022152e-06 2.1e-06 0 - 4e-06 2800 176 inf 2.1e-06 0 - 4e-06 2900 174 1.1458142e-06 2.1e-06 0 - 4e-06 3000 172 1.2159972e-06 2.1e-06 0 - 4e-06 3100 172 inf 2.1e-06 0 - 4e-06 3200 170 1.3640273e-06 2.1e-06 0 - 4e-06 3300 164 1.4023496e-06 2.1e-06 0 - 4e-06 3400 164 1.4878891e-06 2.1e-06 0 - 4e-06 3500 164 1.5760184e-06 2.1e-06 0 - 4e-06 3600 164 1.6667377e-06 2.1e-06 0 - 4e-06 3700 162 1.7486967e-06 2.1e-06 0 - 4e-06 3800 160 1.8165262e-06 2.1e-06 0 - 4e-06 3900 158 1.8886488e-06 2.1e-06 0 - 4e-06 4000 158 1.9853138e-06 2.1e-06 0 - 4e-06 4100 158 inf 2.1e-06 0 - 4e-06 4200 156 2.1616605e-06 2.1e-06 0 - 4e-06 4300 156 2.2655984e-06 2.1e-06 0 - 4e-06 4400 156 inf 2.1e-06 0 - 4e-06 4500 152 2.4161761e-06 2.1e-06 0 - 4e-06 4600 152 2.497822e-06 2.1e-06 0 - 4e-06 4700 150 2.6001287e-06 2.1e-06 0 - 4e-06 4800 148 inf 2.1e-06 0 - 4e-06 4900 146 inf 2.1e-06 0 - 4e-06 5000 140 2.7812394e-06 2.1e-06 0 -Loop time of 0.432192 on 1 procs for 5000 steps with 140 atoms + 4e-06 200 200 6.3722236e-09 2.1e-06 0 + 4e-06 300 200 1.4211064e-08 2.1e-06 0 + 4e-06 400 200 2.5258679e-08 2.1e-06 0 + 4e-06 500 200 3.9464769e-08 2.1e-06 0 + 4e-06 600 200 5.6825967e-08 2.1e-06 0 + 4e-06 700 200 7.7344469e-08 2.1e-06 0 + 4e-06 800 200 1.0060974e-07 2.1e-06 0 + 4e-06 900 200 1.2653591e-07 2.1e-06 0 + 4e-06 1000 200 1.5569212e-07 2.1e-06 0 + 4e-06 1100 200 1.8742647e-07 2.1e-06 0 + 4e-06 1200 200 2.215525e-07 2.1e-06 0 + 4e-06 1300 200 2.5959327e-07 2.1e-06 0 + 4e-06 1400 200 3.010369e-07 2.1e-06 0 + 4e-06 1500 200 3.4166871e-07 2.1e-06 0 + 4e-06 1600 200 3.8173997e-07 2.1e-06 0 + 4e-06 1700 200 4.2263596e-07 2.1e-06 0 + 4e-06 1800 200 4.6542919e-07 2.1e-06 0 + 4e-06 1900 200 5.1316032e-07 2.1e-06 0 + 4e-06 2000 200 5.6390086e-07 2.1e-06 0 + 4e-06 2100 200 6.1282692e-07 2.1e-06 0 + 4e-06 2200 200 6.6871978e-07 2.1e-06 0 + 4e-06 2300 200 7.2432957e-07 2.1e-06 0 + 4e-06 2400 200 7.7356329e-07 2.1e-06 0 + 4e-06 2500 200 8.3121212e-07 2.1e-06 0 + 4e-06 2600 200 8.9285402e-07 2.1e-06 0 + 4e-06 2700 200 9.5056709e-07 2.1e-06 0 + 4e-06 2800 200 1.0078859e-06 2.1e-06 0 + 4e-06 2900 200 1.0583726e-06 2.1e-06 0 + 4e-06 3000 200 1.1128777e-06 2.1e-06 0 + 4e-06 3100 200 1.149994e-06 2.1e-06 0 + 4e-06 3200 200 1.2038821e-06 2.1e-06 0 + 4e-06 3300 200 1.2266858e-06 2.1e-06 0 + 4e-06 3400 200 1.2785607e-06 2.1e-06 0 + 4e-06 3500 200 1.3382357e-06 2.1e-06 0 + 4e-06 3600 200 1.3864259e-06 2.1e-06 0 + 4e-06 3700 200 1.4382735e-06 2.1e-06 0 + 4e-06 3800 200 1.4261443e-06 2.1e-06 0 + 4e-06 3900 200 1.4409345e-06 2.1e-06 0 + 4e-06 4000 200 1.4794449e-06 2.1e-06 0 + 4e-06 4100 200 1.4696815e-06 2.1e-06 0 + 4e-06 4200 200 1.4980192e-06 2.1e-06 0 + 4e-06 4300 200 1.5093101e-06 2.1e-06 0 + 4e-06 4400 200 1.527165e-06 2.1e-06 0 + 4e-06 4500 200 1.5514338e-06 2.1e-06 0 + 4e-06 4600 200 1.5939536e-06 2.1e-06 0 + 4e-06 4700 200 1.6017087e-06 2.1e-06 0 + 4e-06 4800 200 1.5835827e-06 2.1e-06 0 + 4e-06 4900 200 1.5646707e-06 2.1e-06 0 + 4e-06 5000 200 1.5869167e-06 2.1e-06 0 +Loop time of 0.894952 on 1 procs for 5000 steps with 200 atoms 99.7% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.10597 | 0.10597 | 0.10597 | 0.0 | 24.52 -Neigh | 0.011871 | 0.011871 | 0.011871 | 0.0 | 2.75 -Comm | 0.00034652 | 0.00034652 | 0.00034652 | 0.0 | 0.08 -Output | 0.00027596 | 0.00027596 | 0.00027596 | 0.0 | 0.06 -Modify | 0.31284 | 0.31284 | 0.31284 | 0.0 | 72.39 -Other | | 0.0008893 | | | 0.21 +Pair | 0.33414 | 0.33414 | 0.33414 | 0.0 | 37.34 +Neigh | 0.013978 | 0.013978 | 0.013978 | 0.0 | 1.56 +Comm | 0.00055911 | 0.00055911 | 0.00055911 | 0.0 | 0.06 +Output | 0.00042257 | 0.00042257 | 0.00042257 | 0.0 | 0.05 +Modify | 0.54341 | 0.54341 | 0.54341 | 0.0 | 60.72 +Other | | 0.002439 | | | 0.27 -Nlocal: 140 ave 140 max 140 min +Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 865 ave 865 max 865 min +Neighs: 1663 ave 1663 max 1663 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 865 -Ave neighs/atom = 6.1785714 +Total # of neighbors = 1663 +Ave neighs/atom = 8.315 Neighbor list builds = 83 Dangerous builds not checked @@ -352,170 +352,170 @@ run 14000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes Dt Step Atoms KinEng Volume v_disp_upper - 4e-06 5000 140 2.7812394e-06 2.1e-06 0 - 4e-06 5100 140 2.8895541e-06 2.1e-06 -0.00015706645 - 4e-06 5200 136 2.9030642e-06 2.1e-06 -0.00031405381 - 4e-06 5300 134 2.9801402e-06 2.1e-06 -0.00047088304 - 4e-06 5400 134 inf 2.1e-06 -0.00062747516 - 4e-06 5500 130 3.1361708e-06 2.1e-06 -0.00078375133 - 4e-06 5600 130 3.224988e-06 2.1e-06 -0.00093963286 - 4e-06 5700 128 3.2981553e-06 2.1e-06 -0.0010950413 - 4e-06 5800 126 3.3346425e-06 2.1e-06 -0.0012498983 - 4e-06 5900 126 3.4495324e-06 2.1e-06 -0.0014041259 - 4e-06 6000 124 3.4436288e-06 2.1e-06 -0.0015576465 - 4e-06 6100 122 3.5108806e-06 2.1e-06 -0.0017103828 - 4e-06 6200 118 3.4808187e-06 2.1e-06 -0.0018622579 - 4e-06 6300 116 3.5520892e-06 2.1e-06 -0.0020131953 - 4e-06 6400 116 3.6651266e-06 2.1e-06 -0.002163119 - 4e-06 6500 116 3.7768528e-06 2.1e-06 -0.0023119534 - 4e-06 6600 114 3.8296982e-06 2.1e-06 -0.0024596238 - 4e-06 6700 110 3.8220731e-06 2.1e-06 -0.0026060556 - 4e-06 6800 108 3.8409573e-06 2.1e-06 -0.0027511752 - 4e-06 6900 108 inf 2.1e-06 -0.0028949095 - 4e-06 7000 104 3.9206342e-06 2.1e-06 -0.0030371862 - 4e-06 7100 102 3.9647246e-06 2.1e-06 -0.0031779335 - 4e-06 7200 102 inf 2.1e-06 -0.0033170806 - 4e-06 7300 98 3.9766723e-06 2.1e-06 -0.0034545575 - 4e-06 7400 90 3.7821936e-06 2.1e-06 -0.0035902949 - 4e-06 7500 90 inf 2.1e-06 -0.0037242245 - 4e-06 7600 86 3.8144737e-06 2.1e-06 -0.0038562789 - 4e-06 7700 84 3.7897749e-06 2.1e-06 -0.0039863915 - 4e-06 7800 82 3.8008682e-06 2.1e-06 -0.0041144968 - 4e-06 7900 80 3.791409e-06 2.1e-06 -0.0042405303 - 4e-06 8000 76 3.7336309e-06 2.1e-06 -0.0043644286 - 4e-06 8100 76 inf 2.1e-06 -0.0044861293 - 4e-06 8200 72 3.7708462e-06 2.1e-06 -0.0046055711 - 4e-06 8300 72 3.8690393e-06 2.1e-06 -0.0047226938 - 4e-06 8400 68 inf 2.1e-06 -0.0048374385 - 4e-06 8500 64 3.6623177e-06 2.1e-06 -0.0049497475 - 4e-06 8600 62 3.6134274e-06 2.1e-06 -0.005059564 - 4e-06 8700 62 3.6965363e-06 2.1e-06 -0.005166833 - 4e-06 8800 60 3.5674683e-06 2.1e-06 -0.0052715003 - 4e-06 8900 54 3.3423076e-06 2.1e-06 -0.0053735132 - 4e-06 9000 50 3.1486697e-06 2.1e-06 -0.0054728204 - 4e-06 9100 48 3.0716142e-06 2.1e-06 -0.0055693718 - 4e-06 9200 46 2.9984533e-06 2.1e-06 -0.005663119 - 4e-06 9300 46 inf 2.1e-06 -0.0057540145 - 4e-06 9400 34 inf 2.1e-06 -0.0058420128 - 4e-06 9500 32 2.4147256e-06 2.1e-06 -0.0059270694 - 4e-06 9600 32 inf 2.1e-06 -0.0060091416 - 4e-06 9700 26 inf 2.1e-06 -0.0060881879 - 4e-06 9800 20 1.5991947e-06 2.1e-06 -0.0061641687 - 4e-06 9900 20 inf 2.1e-06 -0.0062370457 - 4e-06 10000 16 1.3327917e-06 2.1e-06 -0.0063067821 - 4e-06 10100 10 8.8157027e-07 2.1e-06 -0.0063733428 - 4e-06 10200 10 8.9614642e-07 2.1e-06 -0.0064366944 - 4e-06 10300 10 8.9775988e-07 2.1e-06 -0.0064968049 - 4e-06 10400 10 9.0812889e-07 2.1e-06 -0.0065536441 - 4e-06 10500 10 9.003094e-07 2.1e-06 -0.0066071833 - 4e-06 10600 10 8.8275797e-07 2.1e-06 -0.0066573956 - 4e-06 10700 10 8.6537937e-07 2.1e-06 -0.0067042557 - 4e-06 10800 10 8.4817361e-07 2.1e-06 -0.00674774 - 4e-06 10900 10 8.311407e-07 2.1e-06 -0.0067878266 - 4e-06 11000 10 8.1428062e-07 2.1e-06 -0.0068244954 - 4e-06 11100 10 7.9759338e-07 2.1e-06 -0.0068577278 - 4e-06 11200 10 7.8107899e-07 2.1e-06 -0.0068875071 - 4e-06 11300 10 7.6473743e-07 2.1e-06 -0.0069138184 - 4e-06 11400 10 7.4856871e-07 2.1e-06 -0.0069366483 - 4e-06 11500 10 6.5214996e-07 2.1e-06 -0.0069559855 - 4e-06 11600 10 8.9415748e-07 2.1e-06 -0.0069718201 - 4e-06 11700 10 8.718476e-07 2.1e-06 -0.0069841441 - 4e-06 11800 10 1.0390866e-06 2.1e-06 -0.0069929515 - 4e-06 11900 10 1.058099e-06 2.1e-06 -0.0069982376 - 4e-06 12000 10 1.0772841e-06 2.1e-06 -0.007 - 4e-06 12100 10 1.0966421e-06 2.1e-06 -0.0069982376 - 4e-06 12200 10 1.116173e-06 2.1e-06 -0.0069929515 - 4e-06 12300 10 1.1358767e-06 2.1e-06 -0.0069841441 - 4e-06 12400 10 1.1557532e-06 2.1e-06 -0.0069718201 - 4e-06 12500 10 1.1709163e-06 2.1e-06 -0.0069559855 - 4e-06 12600 10 1.1781568e-06 2.1e-06 -0.0069366483 - 4e-06 12700 10 1.1814023e-06 2.1e-06 -0.0069138184 - 4e-06 12800 10 1.182238e-06 2.1e-06 -0.0068875071 - 4e-06 12900 10 1.1321834e-06 2.1e-06 -0.0068577278 - 4e-06 13000 10 1.1602658e-06 2.1e-06 -0.0068244954 - 4e-06 13100 10 1.1403281e-06 2.1e-06 -0.0067878266 - 4e-06 13200 10 1.1205632e-06 2.1e-06 -0.00674774 - 4e-06 13300 10 1.1009712e-06 2.1e-06 -0.0067042557 - 4e-06 13400 10 1.081552e-06 2.1e-06 -0.0066573956 - 4e-06 13500 10 1.0623057e-06 2.1e-06 -0.0066071833 - 4e-06 13600 10 9.7690472e-07 2.1e-06 -0.0065536441 - 4e-06 13700 10 8.7554649e-07 2.1e-06 -0.0064968049 - 4e-06 13800 10 8.6114161e-07 2.1e-06 -0.0064366944 - 4e-06 13900 10 7.2229969e-07 2.1e-06 -0.0063733428 - 4e-06 14000 10 6.0299298e-07 2.1e-06 -0.0063067821 - 4e-06 14100 10 5.9691906e-07 2.1e-06 -0.0062370457 - 4e-06 14200 10 5.8877052e-07 2.1e-06 -0.0061641687 - 4e-06 14300 10 5.8079481e-07 2.1e-06 -0.0060881879 - 4e-06 14400 10 5.0821182e-07 2.1e-06 -0.0060091416 - 4e-06 14500 10 4.5974587e-07 2.1e-06 -0.0059270694 - 4e-06 14600 10 4.5438391e-07 2.1e-06 -0.0058420128 - 4e-06 14700 10 4.4919479e-07 2.1e-06 -0.0057540145 - 4e-06 14800 10 3.6176002e-07 2.1e-06 -0.005663119 - 4e-06 14900 10 3.5835307e-07 2.1e-06 -0.0055693718 - 4e-06 15000 10 3.5511897e-07 2.1e-06 -0.0054728204 - 4e-06 15100 10 3.5205771e-07 2.1e-06 -0.0053735132 - 4e-06 15200 10 2.4180157e-07 2.1e-06 -0.0052715003 - 4e-06 15300 10 1.9792566e-07 2.1e-06 -0.005166833 - 4e-06 15400 10 1.9768384e-07 2.1e-06 -0.005059564 - 4e-06 15500 10 1.6550345e-07 2.1e-06 -0.0049497475 - 4e-06 15600 10 1.6608824e-07 2.1e-06 -0.0048374385 - 4e-06 15700 10 1.4780766e-07 2.1e-06 -0.0047226938 - 4e-06 15800 10 1.4899916e-07 2.1e-06 -0.0046055711 - 4e-06 15900 10 1.503635e-07 2.1e-06 -0.0044861293 - 4e-06 16000 10 1.5190069e-07 2.1e-06 -0.0043644286 - 4e-06 16100 10 1.5361071e-07 2.1e-06 -0.0042405303 - 4e-06 16200 10 1.5373505e-07 2.1e-06 -0.0041144968 - 4e-06 16300 10 1.5202036e-07 2.1e-06 -0.0039863915 - 4e-06 16400 10 1.5047851e-07 2.1e-06 -0.0038562789 - 4e-06 16500 10 1.491095e-07 2.1e-06 -0.0037242245 - 4e-06 16600 10 1.4791333e-07 2.1e-06 -0.0035902949 - 4e-06 16700 10 1.4689e-07 2.1e-06 -0.0034545575 - 4e-06 16800 10 1.460395e-07 2.1e-06 -0.0033170806 - 4e-06 16900 10 1.4536185e-07 2.1e-06 -0.0031779335 - 4e-06 17000 10 1.4485704e-07 2.1e-06 -0.0030371862 - 4e-06 17100 10 1.4452507e-07 2.1e-06 -0.0028949095 - 4e-06 17200 10 1.4436594e-07 2.1e-06 -0.0027511752 - 4e-06 17300 10 1.4297672e-07 2.1e-06 -0.0026060556 - 4e-06 17400 10 1.4034469e-07 2.1e-06 -0.0024596238 - 4e-06 17500 10 1.378855e-07 2.1e-06 -0.0023119534 - 4e-06 17600 10 1.3559914e-07 2.1e-06 -0.002163119 - 4e-06 17700 10 1.3348563e-07 2.1e-06 -0.0020131953 - 4e-06 17800 10 1.3154496e-07 2.1e-06 -0.0018622579 - 4e-06 17900 10 1.2977712e-07 2.1e-06 -0.0017103828 - 4e-06 18000 10 1.2659132e-07 2.1e-06 -0.0015576465 - 4e-06 18100 10 1.241758e-07 2.1e-06 -0.0014041259 - 4e-06 18200 10 1.2060433e-07 2.1e-06 -0.0012498983 - 4e-06 18300 10 1.172057e-07 2.1e-06 -0.0010950413 - 4e-06 18400 10 1.1397991e-07 2.1e-06 -0.00093963286 - 4e-06 18500 10 1.1092695e-07 2.1e-06 -0.00078375133 - 4e-06 18600 10 1.0804684e-07 2.1e-06 -0.00062747516 - 4e-06 18700 10 1.0533957e-07 2.1e-06 -0.00047088304 - 4e-06 18800 10 1.0280514e-07 2.1e-06 -0.00031405381 - 4e-06 18900 10 1.0044354e-07 2.1e-06 -0.00015706645 - 4e-06 19000 10 9.8254791e-08 2.1e-06 2.0903119e-17 -Loop time of 0.287179 on 1 procs for 14000 steps with 10 atoms + 4e-06 5000 200 1.5869167e-06 2.1e-06 0 + 4e-06 5100 200 1.533415e-06 2.1e-06 -0.00015706645 + 4e-06 5200 200 1.5210118e-06 2.1e-06 -0.00031405381 + 4e-06 5300 200 1.4717654e-06 2.1e-06 -0.00047088304 + 4e-06 5400 200 1.3867583e-06 2.1e-06 -0.00062747516 + 4e-06 5500 200 1.3210172e-06 2.1e-06 -0.00078375133 + 4e-06 5600 200 1.2694854e-06 2.1e-06 -0.00093963286 + 4e-06 5700 200 1.210939e-06 2.1e-06 -0.0010950413 + 4e-06 5800 200 1.1030246e-06 2.1e-06 -0.0012498983 + 4e-06 5900 200 1.0576145e-06 2.1e-06 -0.0014041259 + 4e-06 6000 200 9.6819458e-07 2.1e-06 -0.0015576465 + 4e-06 6100 200 8.4390663e-07 2.1e-06 -0.0017103828 + 4e-06 6200 200 7.1811878e-07 2.1e-06 -0.0018622579 + 4e-06 6300 200 5.9188275e-07 2.1e-06 -0.0020131953 + 4e-06 6400 200 4.8593994e-07 2.1e-06 -0.002163119 + 4e-06 6500 200 3.7604444e-07 2.1e-06 -0.0023119534 + 4e-06 6600 200 2.9315224e-07 2.1e-06 -0.0024596238 + 4e-06 6700 200 2.4346404e-07 2.1e-06 -0.0026060556 + 4e-06 6800 200 2.1035347e-07 2.1e-06 -0.0027511752 + 4e-06 6900 200 1.7982462e-07 2.1e-06 -0.0028949095 + 4e-06 7000 200 3.3817811e-07 2.1e-06 -0.0030371862 + 4e-06 7100 200 5.4229142e-07 2.1e-06 -0.0031779335 + 4e-06 7200 200 9.8011974e-07 2.1e-06 -0.0033170806 + 4e-06 7300 200 1.4073827e-06 2.1e-06 -0.0034545575 + 4e-06 7400 200 1.8007974e-06 2.1e-06 -0.0035902949 + 4e-06 7500 200 2.5690983e-06 2.1e-06 -0.0037242245 + 4e-06 7600 200 3.3504605e-06 2.1e-06 -0.0038562789 + 4e-06 7700 200 3.3047732e-06 2.1e-06 -0.0039863915 + 4e-06 7800 200 2.7409232e-06 2.1e-06 -0.0041144968 + 4e-06 7900 200 2.7731736e-06 2.1e-06 -0.0042405303 + 4e-06 8000 200 2.7721382e-06 2.1e-06 -0.0043644286 + 4e-06 8100 200 2.5449128e-06 2.1e-06 -0.0044861293 + 4e-06 8200 200 2.4113011e-06 2.1e-06 -0.0046055711 + 4e-06 8300 200 2.5104553e-06 2.1e-06 -0.0047226938 + 4e-06 8400 200 2.7969453e-06 2.1e-06 -0.0048374385 + 4e-06 8500 200 2.4549778e-06 2.1e-06 -0.0049497475 + 4e-06 8600 200 2.6065634e-06 2.1e-06 -0.005059564 + 4e-06 8700 200 1.94773e-06 2.1e-06 -0.005166833 + 4e-06 8800 200 1.8669003e-06 2.1e-06 -0.0052715003 + 4e-06 8900 200 1.7712516e-06 2.1e-06 -0.0053735132 + 4e-06 9000 200 1.5868574e-06 2.1e-06 -0.0054728204 + 4e-06 9100 200 1.2586882e-06 2.1e-06 -0.0055693718 + 4e-06 9200 200 1.7392355e-06 2.1e-06 -0.005663119 + 4e-06 9300 200 1.4103062e-06 2.1e-06 -0.0057540145 + 4e-06 9400 200 1.6133909e-06 2.1e-06 -0.0058420128 + 4e-06 9500 200 1.5715429e-06 2.1e-06 -0.0059270694 + 4e-06 9600 200 1.3060432e-06 2.1e-06 -0.0060091416 + 4e-06 9700 200 1.3016643e-06 2.1e-06 -0.0060881879 + 4e-06 9800 200 1.3827359e-06 2.1e-06 -0.0061641687 + 4e-06 9900 200 1.166866e-06 2.1e-06 -0.0062370457 + 4e-06 10000 200 1.1328931e-06 2.1e-06 -0.0063067821 + 4e-06 10100 200 1.0811811e-06 2.1e-06 -0.0063733428 + 4e-06 10200 200 1.0540805e-06 2.1e-06 -0.0064366944 + 4e-06 10300 200 9.3224876e-07 2.1e-06 -0.0064968049 + 4e-06 10400 200 8.8422228e-07 2.1e-06 -0.0065536441 + 4e-06 10500 200 9.6574449e-07 2.1e-06 -0.0066071833 + 4e-06 10600 200 6.5673924e-07 2.1e-06 -0.0066573956 + 4e-06 10700 200 5.7629287e-07 2.1e-06 -0.0067042557 + 4e-06 10800 200 5.1184648e-07 2.1e-06 -0.00674774 + 4e-06 10900 200 4.2140431e-07 2.1e-06 -0.0067878266 + 4e-06 11000 200 3.679501e-07 2.1e-06 -0.0068244954 + 4e-06 11100 200 2.7198635e-07 2.1e-06 -0.0068577278 + 4e-06 11200 200 3.9270049e-07 2.1e-06 -0.0068875071 + 4e-06 11300 200 2.5364345e-07 2.1e-06 -0.0069138184 + 4e-06 11400 200 2.311875e-07 2.1e-06 -0.0069366483 + 4e-06 11500 200 9.1194666e-08 2.1e-06 -0.0069559855 + 4e-06 11600 200 5.9128951e-08 2.1e-06 -0.0069718201 + 4e-06 11700 200 3.8675445e-08 2.1e-06 -0.0069841441 + 4e-06 11800 200 1.5261639e-08 2.1e-06 -0.0069929515 + 4e-06 11900 200 4.1435674e-09 2.1e-06 -0.0069982376 + 4e-06 12000 200 3.6182887e-10 2.1e-06 -0.007 + 4e-06 12100 200 3.4148153e-09 2.1e-06 -0.0069982376 + 4e-06 12200 200 1.201855e-08 2.1e-06 -0.0069929515 + 4e-06 12300 200 2.7088001e-08 2.1e-06 -0.0069841441 + 4e-06 12400 200 4.7261349e-08 2.1e-06 -0.0069718201 + 4e-06 12500 200 7.585591e-08 2.1e-06 -0.0069559855 + 4e-06 12600 200 1.0717843e-07 2.1e-06 -0.0069366483 + 4e-06 12700 200 1.4357347e-07 2.1e-06 -0.0069138184 + 4e-06 12800 200 2.3364223e-07 2.1e-06 -0.0068875071 + 4e-06 12900 200 2.6460705e-07 2.1e-06 -0.0068577278 + 4e-06 13000 200 3.0878617e-07 2.1e-06 -0.0068244954 + 4e-06 13100 200 4.0950412e-07 2.1e-06 -0.0067878266 + 4e-06 13200 200 5.4382238e-07 2.1e-06 -0.00674774 + 4e-06 13300 200 5.9323976e-07 2.1e-06 -0.0067042557 + 4e-06 13400 200 6.0024632e-07 2.1e-06 -0.0066573956 + 4e-06 13500 200 8.9144808e-07 2.1e-06 -0.0066071833 + 4e-06 13600 200 7.4298898e-07 2.1e-06 -0.0065536441 + 4e-06 13700 200 7.5476346e-07 2.1e-06 -0.0064968049 + 4e-06 13800 200 9.4480881e-07 2.1e-06 -0.0064366944 + 4e-06 13900 200 6.9480641e-07 2.1e-06 -0.0063733428 + 4e-06 14000 200 3.6996473e-07 2.1e-06 -0.0063067821 + 4e-06 14100 200 3.7522265e-07 2.1e-06 -0.0062370457 + 4e-06 14200 200 9.5971189e-07 2.1e-06 -0.0061641687 + 4e-06 14300 200 6.3482043e-07 2.1e-06 -0.0060881879 + 4e-06 14400 200 4.4208165e-08 2.1e-06 -0.0060091416 + 4e-06 14500 200 2.5451697e-09 2.1e-06 -0.0059270694 + 4e-06 14600 200 2.3358938e-10 2.1e-06 -0.0058420128 + 4e-06 14700 200 6.5542266e-10 2.1e-06 -0.0057540145 + 4e-06 14800 200 5.7442167e-10 2.1e-06 -0.005663119 + 4e-06 14900 200 1.8498409e-10 2.1e-06 -0.0055693718 + 4e-06 15000 200 8.9754087e-12 2.1e-06 -0.0054728204 + 4e-06 15100 200 1.5735217e-10 2.1e-06 -0.0053735132 + 4e-06 15200 200 2.0644095e-11 2.1e-06 -0.0052715003 + 4e-06 15300 200 3.1810324e-12 2.1e-06 -0.005166833 + 4e-06 15400 200 9.2248411e-13 2.1e-06 -0.005059564 + 4e-06 15500 200 1.049892e-12 2.1e-06 -0.0049497475 + 4e-06 15600 200 5.1537473e-13 2.1e-06 -0.0048374385 + 4e-06 15700 200 8.0874962e-14 2.1e-06 -0.0047226938 + 4e-06 15800 200 1.9259517e-14 2.1e-06 -0.0046055711 + 4e-06 15900 200 6.1677187e-14 2.1e-06 -0.0044861293 + 4e-06 16000 200 4.0175545e-14 2.1e-06 -0.0043644286 + 4e-06 16100 200 2.8906156e-14 2.1e-06 -0.0042405303 + 4e-06 16200 200 1.4689406e-14 2.1e-06 -0.0041144968 + 4e-06 16300 200 1.4816055e-14 2.1e-06 -0.0039863915 + 4e-06 16400 200 1.8585236e-14 2.1e-06 -0.0038562789 + 4e-06 16500 200 1.485896e-14 2.1e-06 -0.0037242245 + 4e-06 16600 200 1.5799533e-14 2.1e-06 -0.0035902949 + 4e-06 16700 200 1.5241276e-14 2.1e-06 -0.0034545575 + 4e-06 16800 200 1.1272606e-14 2.1e-06 -0.0033170806 + 4e-06 16900 200 1.2135244e-14 2.1e-06 -0.0031779335 + 4e-06 17000 200 1.143872e-14 2.1e-06 -0.0030371862 + 4e-06 17100 200 1.1915182e-14 2.1e-06 -0.0028949095 + 4e-06 17200 200 1.2037492e-14 2.1e-06 -0.0027511752 + 4e-06 17300 200 1.2142546e-14 2.1e-06 -0.0026060556 + 4e-06 17400 200 1.2259988e-14 2.1e-06 -0.0024596238 + 4e-06 17500 200 1.2151413e-14 2.1e-06 -0.0023119534 + 4e-06 17600 200 1.2016981e-14 2.1e-06 -0.002163119 + 4e-06 17700 200 1.1899607e-14 2.1e-06 -0.0020131953 + 4e-06 17800 200 1.1847233e-14 2.1e-06 -0.0018622579 + 4e-06 17900 200 1.2597274e-14 2.1e-06 -0.0017103828 + 4e-06 18000 200 1.2571584e-14 2.1e-06 -0.0015576465 + 4e-06 18100 200 1.2548167e-14 2.1e-06 -0.0014041259 + 4e-06 18200 200 1.2600584e-14 2.1e-06 -0.0012498983 + 4e-06 18300 200 1.2060676e-14 2.1e-06 -0.0010950413 + 4e-06 18400 200 1.2159889e-14 2.1e-06 -0.00093963286 + 4e-06 18500 200 1.2213635e-14 2.1e-06 -0.00078375133 + 4e-06 18600 200 1.2323751e-14 2.1e-06 -0.00062747516 + 4e-06 18700 200 1.2137887e-14 2.1e-06 -0.00047088304 + 4e-06 18800 200 1.2201084e-14 2.1e-06 -0.00031405381 + 4e-06 18900 200 1.2210617e-14 2.1e-06 -0.00015706645 + 4e-06 19000 200 1.2385845e-14 2.1e-06 2.0903119e-17 +Loop time of 9.48207 on 1 procs for 14000 steps with 200 atoms -99.8% CPU use with 1 MPI tasks x no OpenMP threads +99.6% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.049189 | 0.049189 | 0.049189 | 0.0 | 17.13 -Neigh | 0.0057064 | 0.0057064 | 0.0057064 | 0.0 | 1.99 -Comm | 0.00064863 | 0.00064863 | 0.00064863 | 0.0 | 0.23 -Output | 0.00089611 | 0.00089611 | 0.00089611 | 0.0 | 0.31 -Modify | 0.22899 | 0.22899 | 0.22899 | 0.0 | 79.74 -Other | | 0.001749 | | | 0.61 +Pair | 5.3814 | 5.3814 | 5.3814 | 0.0 | 56.75 +Neigh | 0.04326 | 0.04326 | 0.04326 | 0.0 | 0.46 +Comm | 0.0018574 | 0.0018574 | 0.0018574 | 0.0 | 0.02 +Output | 0.0018533 | 0.0018533 | 0.0018533 | 0.0 | 0.02 +Modify | 4.047 | 4.047 | 4.047 | 0.0 | 42.68 +Other | | 0.006661 | | | 0.07 -Nlocal: 10 ave 10 max 10 min +Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 2 ave 2 max 2 min +Neighs: 3146 ave 3146 max 3146 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 2 -Ave neighs/atom = 0.2 +Total # of neighbors = 3146 +Ave neighs/atom = 15.73 Neighbor list builds = 233 Dangerous builds not checked @@ -530,172 +530,172 @@ variable disp_upper equal 0.9*v_disp_lower run ${ejection_steps} run 14000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes +Per MPI rank memory allocation (min/avg/max) = 72.31 | 72.31 | 72.31 Mbytes Dt Step Atoms KinEng Volume v_disp_upper - 4e-06 19000 10 9.8254791e-08 2.1e-06 0 - 4e-06 19100 10 9.6238878e-08 2.1e-06 0.00010097765 - 4e-06 19200 10 9.4395806e-08 2.1e-06 0.00020194258 - 4e-06 19300 10 9.2725573e-08 2.1e-06 0.00030288209 - 4e-06 19400 10 9.1228181e-08 2.1e-06 0.00040378347 - 4e-06 19500 10 8.9903628e-08 2.1e-06 0.00050463403 - 4e-06 19600 10 8.8751915e-08 2.1e-06 0.00060542105 - 4e-06 19700 10 6.9553679e-08 2.1e-06 0.00070613186 - 4e-06 19800 10 3.855161e-07 2.1e-06 0.00080675378 - 4e-06 19900 10 3.8006492e-07 2.1e-06 0.00090727414 - 4e-06 20000 10 3.7478659e-07 2.1e-06 0.0010076803 - 4e-06 20100 10 3.6968109e-07 2.1e-06 0.0011079596 - 4e-06 20200 10 3.6474843e-07 2.1e-06 0.0012080994 - 4e-06 20300 10 3.5998861e-07 2.1e-06 0.0013080871 - 4e-06 20400 10 3.5540163e-07 2.1e-06 0.0014079102 - 4e-06 20500 10 3.509875e-07 2.1e-06 0.001507556 - 4e-06 20600 10 3.467462e-07 2.1e-06 0.0016070121 - 4e-06 20700 10 3.4267774e-07 2.1e-06 0.0017062658 - 4e-06 20800 10 3.3878212e-07 2.1e-06 0.0018053047 - 4e-06 20900 10 6.2902098e-07 2.1e-06 0.0019041164 - 4e-06 21000 10 7.1567323e-07 2.1e-06 0.0020026884 - 4e-06 21100 10 7.0670404e-07 2.1e-06 0.0021010083 - 4e-06 21200 10 6.9790769e-07 2.1e-06 0.0021990637 - 4e-06 21300 10 6.8928417e-07 2.1e-06 0.0022968422 - 4e-06 21400 10 6.808335e-07 2.1e-06 0.0023943316 - 4e-06 21500 10 8.228831e-07 2.1e-06 0.0024915196 - 4e-06 21600 10 8.1258059e-07 2.1e-06 0.0025883939 - 4e-06 21700 10 8.0245093e-07 2.1e-06 0.0026849424 - 4e-06 21800 10 7.924941e-07 2.1e-06 0.0027811529 - 4e-06 21900 10 7.8271011e-07 2.1e-06 0.0028770133 - 4e-06 22000 10 7.7309896e-07 2.1e-06 0.0029725116 - 4e-06 22100 10 7.6366066e-07 2.1e-06 0.0030676356 - 4e-06 22200 10 7.5439519e-07 2.1e-06 0.0031623734 - 4e-06 22300 10 9.6736756e-07 2.1e-06 0.0032567132 - 4e-06 22400 10 9.5508751e-07 2.1e-06 0.0033506429 - 4e-06 22500 10 1.146027e-06 2.1e-06 0.0034441509 - 4e-06 22600 10 1.3340747e-06 2.1e-06 0.0035372253 - 4e-06 22700 10 1.3161012e-06 2.1e-06 0.0036298544 - 4e-06 22800 10 1.3780346e-06 2.1e-06 0.0037220265 - 4e-06 22900 10 1.4437449e-06 2.1e-06 0.0038137301 - 4e-06 23000 10 1.4237439e-06 2.1e-06 0.0039049537 - 4e-06 23100 10 1.4039157e-06 2.1e-06 0.0039956856 - 4e-06 23200 10 1.3842603e-06 2.1e-06 0.0040859145 - 4e-06 23300 10 1.3647778e-06 2.1e-06 0.0041756291 - 4e-06 23400 10 1.3454681e-06 2.1e-06 0.004264818 - 4e-06 23500 10 1.3263312e-06 2.1e-06 0.00435347 - 4e-06 23600 10 1.3073672e-06 2.1e-06 0.004441574 - 4e-06 23700 10 1.4224882e-06 2.1e-06 0.0045291188 - 4e-06 23800 10 1.4016962e-06 2.1e-06 0.0046160935 - 4e-06 23900 10 1.381077e-06 2.1e-06 0.0047024871 - 4e-06 24000 10 1.3606307e-06 2.1e-06 0.0047882887 - 4e-06 24100 10 1.3403572e-06 2.1e-06 0.0048734875 - 4e-06 24200 10 1.3202566e-06 2.1e-06 0.0049580728 - 4e-06 24300 10 1.3003288e-06 2.1e-06 0.005042034 - 4e-06 24400 10 1.2805739e-06 2.1e-06 0.0051253604 - 4e-06 24500 10 1.2609917e-06 2.1e-06 0.0052080417 - 4e-06 24600 10 1.2415825e-06 2.1e-06 0.0052900673 - 4e-06 24700 10 1.222346e-06 2.1e-06 0.0053714269 - 4e-06 24800 10 1.2032824e-06 2.1e-06 0.0054521104 - 4e-06 24900 10 1.1843917e-06 2.1e-06 0.0055321075 - 4e-06 25000 10 1.2550315e-06 2.1e-06 0.0056114082 - 4e-06 25100 10 1.2348763e-06 2.1e-06 0.0056900025 - 4e-06 25200 10 1.2148941e-06 2.1e-06 0.0057678805 - 4e-06 25300 10 1.1950846e-06 2.1e-06 0.0058450324 - 4e-06 25400 10 1.175448e-06 2.1e-06 0.0059214485 - 4e-06 25500 10 1.1559842e-06 2.1e-06 0.0059971192 - 4e-06 25600 10 1.1366933e-06 2.1e-06 0.0060720349 - 4e-06 25700 10 1.1175752e-06 2.1e-06 0.0061461862 - 4e-06 25800 10 1.0986299e-06 2.1e-06 0.0062195638 - 4e-06 25900 10 1.0798575e-06 2.1e-06 0.0062921585 - 4e-06 26000 10 1.061258e-06 2.1e-06 0.006363961 - 4e-06 26100 10 9.1373064e-07 2.1e-06 0.0064349624 - 4e-06 26200 10 8.9836765e-07 2.1e-06 0.0065051538 - 4e-06 26300 10 8.8317749e-07 2.1e-06 0.0065745262 - 4e-06 26400 10 8.6816018e-07 2.1e-06 0.006643071 - 4e-06 26500 10 7.2232503e-07 2.1e-06 0.0067107795 - 4e-06 26600 10 7.1072319e-07 2.1e-06 0.0067776432 - 4e-06 26700 10 6.9929419e-07 2.1e-06 0.0068436537 - 4e-06 26800 10 6.8803803e-07 2.1e-06 0.0069088027 - 4e-06 26900 10 6.7695471e-07 2.1e-06 0.0069730819 - 4e-06 27000 10 6.6604423e-07 2.1e-06 0.0070364833 - 4e-06 27100 10 6.5530659e-07 2.1e-06 0.007098999 - 4e-06 27200 10 6.4474179e-07 2.1e-06 0.0071606209 - 4e-06 27300 10 6.3434984e-07 2.1e-06 0.0072213415 - 4e-06 27400 10 6.2413072e-07 2.1e-06 0.0072811529 - 4e-06 27500 10 6.1408444e-07 2.1e-06 0.0073400478 - 4e-06 27600 10 6.04211e-07 2.1e-06 0.0073980187 - 4e-06 27700 10 5.945104e-07 2.1e-06 0.0074550582 - 4e-06 27800 10 5.8498264e-07 2.1e-06 0.0075111593 - 4e-06 27900 10 5.7562772e-07 2.1e-06 0.0075663148 - 4e-06 28000 10 5.6644564e-07 2.1e-06 0.0076205178 - 4e-06 28100 10 5.574364e-07 2.1e-06 0.0076737615 - 4e-06 28200 10 5.486e-07 2.1e-06 0.0077260391 - 4e-06 28300 10 5.3993644e-07 2.1e-06 0.0077773442 - 4e-06 28400 10 5.3144572e-07 2.1e-06 0.0078276702 - 4e-06 28500 10 5.1027539e-07 2.1e-06 0.0078770108 - 4e-06 28600 10 3.5840723e-07 2.1e-06 0.0079253598 - 4e-06 28700 10 3.7060273e-07 2.1e-06 0.0079727111 - 4e-06 28800 10 3.6745652e-07 2.1e-06 0.0080190587 - 4e-06 28900 10 3.6448315e-07 2.1e-06 0.0080643969 - 4e-06 29000 10 3.0843931e-07 2.1e-06 0.0081087198 - 4e-06 29100 10 3.0772799e-07 2.1e-06 0.008152022 - 4e-06 29200 10 3.0718951e-07 2.1e-06 0.0081942979 - 4e-06 29300 10 3.0682387e-07 2.1e-06 0.0082355423 - 4e-06 29400 10 3.0663107e-07 2.1e-06 0.00827575 - 4e-06 29500 10 3.0661111e-07 2.1e-06 0.0083149158 - 4e-06 29600 10 3.0676399e-07 2.1e-06 0.0083530349 - 4e-06 29700 10 3.0708971e-07 2.1e-06 0.0083901025 - 4e-06 29800 10 3.0758827e-07 2.1e-06 0.0084261138 - 4e-06 29900 10 3.0825967e-07 2.1e-06 0.0084610645 - 4e-06 30000 10 3.0910391e-07 2.1e-06 0.00849495 - 4e-06 30100 10 2.7633224e-07 2.1e-06 0.0085277661 - 4e-06 30200 10 2.7917696e-07 2.1e-06 0.0085595086 - 4e-06 30300 10 2.8219452e-07 2.1e-06 0.0085901737 - 4e-06 30400 10 2.8538492e-07 2.1e-06 0.0086197574 - 4e-06 30500 10 2.8874816e-07 2.1e-06 0.0086482559 - 4e-06 30600 10 2.9228424e-07 2.1e-06 0.0086756657 - 4e-06 30700 10 2.9599316e-07 2.1e-06 0.0087019834 - 4e-06 30800 10 2.9987493e-07 2.1e-06 0.0087272057 - 4e-06 30900 10 3.0392953e-07 2.1e-06 0.0087513293 - 4e-06 31000 10 3.0815697e-07 2.1e-06 0.0087743512 - 4e-06 31100 10 3.1255725e-07 2.1e-06 0.0087962686 - 4e-06 31200 10 3.1713037e-07 2.1e-06 0.0088170786 - 4e-06 31300 10 3.2187633e-07 2.1e-06 0.0088367787 - 4e-06 31400 10 3.2679513e-07 2.1e-06 0.0088553663 - 4e-06 31500 10 3.3188677e-07 2.1e-06 0.0088728392 - 4e-06 31600 10 3.3522008e-07 2.1e-06 0.0088891951 - 4e-06 31700 10 3.3129412e-07 2.1e-06 0.0089044319 - 4e-06 31800 10 3.3814673e-07 2.1e-06 0.0089185479 - 4e-06 31900 10 3.7840167e-07 2.1e-06 0.0089315411 - 4e-06 32000 10 3.8178891e-07 2.1e-06 0.0089434099 - 4e-06 32100 10 3.8534899e-07 2.1e-06 0.0089541529 - 4e-06 32200 10 3.8908191e-07 2.1e-06 0.0089637686 - 4e-06 32300 10 4.1410686e-07 2.1e-06 0.008972256 - 4e-06 32400 10 4.1433199e-07 2.1e-06 0.0089796139 - 4e-06 32500 10 4.1472995e-07 2.1e-06 0.0089858413 - 4e-06 32600 10 4.1530076e-07 2.1e-06 0.0089909376 - 4e-06 32700 10 4.1604441e-07 2.1e-06 0.008994902 - 4e-06 32800 10 4.169609e-07 2.1e-06 0.0089977341 - 4e-06 32900 10 4.1805022e-07 2.1e-06 0.0089994335 - 4e-06 33000 10 4.1931239e-07 2.1e-06 0.009 -Loop time of 0.177773 on 1 procs for 14000 steps with 10 atoms + 4e-06 19000 200 1.2385845e-14 2.1e-06 0 + 4e-06 19100 200 1.2261513e-05 2.1e-06 0.00010097765 + 4e-06 19200 200 1.668842e-05 2.1e-06 0.00020194258 + 4e-06 19300 200 8.188349e-06 2.1e-06 0.00030288209 + 4e-06 19400 200 3.786144e-06 2.1e-06 0.00040378347 + 4e-06 19500 200 9.574368e-06 2.1e-06 0.00050463403 + 4e-06 19600 200 1.1344815e-05 2.1e-06 0.00060542105 + 4e-06 19700 200 5.9381813e-06 2.1e-06 0.00070613186 + 4e-06 19800 200 6.6666301e-06 2.1e-06 0.00080675378 + 4e-06 19900 200 1.090387e-05 2.1e-06 0.00090727414 + 4e-06 20000 200 7.740567e-06 2.1e-06 0.0010076803 + 4e-06 20100 200 6.2375154e-06 2.1e-06 0.0011079596 + 4e-06 20200 200 9.3040254e-06 2.1e-06 0.0012080994 + 4e-06 20300 200 8.9696433e-06 2.1e-06 0.0013080871 + 4e-06 20400 200 6.5727278e-06 2.1e-06 0.0014079102 + 4e-06 20500 200 7.762698e-06 2.1e-06 0.001507556 + 4e-06 20600 200 9.2433982e-06 2.1e-06 0.0016070121 + 4e-06 20700 200 7.3505514e-06 2.1e-06 0.0017062658 + 4e-06 20800 200 6.9601084e-06 2.1e-06 0.0018053047 + 4e-06 20900 200 8.6605025e-06 2.1e-06 0.0019041164 + 4e-06 21000 200 8.0661649e-06 2.1e-06 0.0020026884 + 4e-06 21100 200 6.9330037e-06 2.1e-06 0.0021010083 + 4e-06 21200 200 7.8802994e-06 2.1e-06 0.0021990637 + 4e-06 21300 200 8.12707e-06 2.1e-06 0.0022968422 + 4e-06 21400 200 7.1184483e-06 2.1e-06 0.0023943316 + 4e-06 21500 200 7.3747722e-06 2.1e-06 0.0024915196 + 4e-06 21600 200 7.941038e-06 2.1e-06 0.0025883939 + 4e-06 21700 200 7.2906871e-06 2.1e-06 0.0026849424 + 4e-06 21800 200 7.0584615e-06 2.1e-06 0.0027811529 + 4e-06 21900 200 7.6303484e-06 2.1e-06 0.0028770133 + 4e-06 22000 200 7.3276603e-06 2.1e-06 0.0029725116 + 4e-06 22100 200 7.0392936e-06 2.1e-06 0.0030676356 + 4e-06 22200 200 7.1860378e-06 2.1e-06 0.0031623734 + 4e-06 22300 200 7.1628093e-06 2.1e-06 0.0032567132 + 4e-06 22400 200 6.9556524e-06 2.1e-06 0.0033506429 + 4e-06 22500 200 6.9109402e-06 2.1e-06 0.0034441509 + 4e-06 22600 200 6.981937e-06 2.1e-06 0.0035372253 + 4e-06 22700 200 6.8009271e-06 2.1e-06 0.0036298544 + 4e-06 22800 200 6.6923037e-06 2.1e-06 0.0037220265 + 4e-06 22900 200 6.7438993e-06 2.1e-06 0.0038137301 + 4e-06 23000 200 6.6280705e-06 2.1e-06 0.0039049537 + 4e-06 23100 200 6.4659616e-06 2.1e-06 0.0039956856 + 4e-06 23200 200 6.486839e-06 2.1e-06 0.0040859145 + 4e-06 23300 200 6.4478859e-06 2.1e-06 0.0041756291 + 4e-06 23400 200 6.2666043e-06 2.1e-06 0.004264818 + 4e-06 23500 200 6.2352434e-06 2.1e-06 0.00435347 + 4e-06 23600 200 6.2074024e-06 2.1e-06 0.004441574 + 4e-06 23700 200 6.068366e-06 2.1e-06 0.0045291188 + 4e-06 23800 200 5.9784229e-06 2.1e-06 0.0046160935 + 4e-06 23900 200 5.9536629e-06 2.1e-06 0.0047024871 + 4e-06 24000 200 5.8480609e-06 2.1e-06 0.0047882887 + 4e-06 24100 200 5.707216e-06 2.1e-06 0.0048734875 + 4e-06 24200 200 5.6922834e-06 2.1e-06 0.0049580728 + 4e-06 24300 200 5.6187319e-06 2.1e-06 0.005042034 + 4e-06 24400 200 5.4774741e-06 2.1e-06 0.0051253604 + 4e-06 24500 200 5.4144843e-06 2.1e-06 0.0052080417 + 4e-06 24600 200 5.3595768e-06 2.1e-06 0.0052900673 + 4e-06 24700 200 5.2374057e-06 2.1e-06 0.0053714269 + 4e-06 24800 200 5.1410204e-06 2.1e-06 0.0054521104 + 4e-06 24900 200 5.0888231e-06 2.1e-06 0.0055321075 + 4e-06 25000 200 4.984139e-06 2.1e-06 0.0056114082 + 4e-06 25100 200 4.9836569e-06 2.1e-06 0.0056900025 + 4e-06 25200 200 4.7331289e-06 2.1e-06 0.0057678805 + 4e-06 25300 200 4.6728119e-06 2.1e-06 0.0058450324 + 4e-06 25400 200 4.7016583e-06 2.1e-06 0.0059214485 + 4e-06 25500 200 4.5200193e-06 2.1e-06 0.0059971192 + 4e-06 25600 200 4.378095e-06 2.1e-06 0.0060720349 + 4e-06 25700 200 4.3949017e-06 2.1e-06 0.0061461862 + 4e-06 25800 200 4.2795904e-06 2.1e-06 0.0062195638 + 4e-06 25900 200 4.116551e-06 2.1e-06 0.0062921585 + 4e-06 26000 200 4.0844003e-06 2.1e-06 0.006363961 + 4e-06 26100 200 4.0601132e-06 2.1e-06 0.0064349624 + 4e-06 26200 200 3.8632558e-06 2.1e-06 0.0065051538 + 4e-06 26300 200 3.7501901e-06 2.1e-06 0.0065745262 + 4e-06 26400 200 3.7665658e-06 2.1e-06 0.006643071 + 4e-06 26500 200 3.6221171e-06 2.1e-06 0.0067107795 + 4e-06 26600 200 3.483452e-06 2.1e-06 0.0067776432 + 4e-06 26700 200 3.4573133e-06 2.1e-06 0.0068436537 + 4e-06 26800 200 3.3725298e-06 2.1e-06 0.0069088027 + 4e-06 26900 200 3.2275695e-06 2.1e-06 0.0069730819 + 4e-06 27000 200 3.1636462e-06 2.1e-06 0.0070364833 + 4e-06 27100 200 3.1002791e-06 2.1e-06 0.007098999 + 4e-06 27200 200 2.9719515e-06 2.1e-06 0.0071606209 + 4e-06 27300 200 2.8999181e-06 2.1e-06 0.0072213415 + 4e-06 27400 200 2.8296722e-06 2.1e-06 0.0072811529 + 4e-06 27500 200 2.7244185e-06 2.1e-06 0.0073400478 + 4e-06 27600 200 2.6342108e-06 2.1e-06 0.0073980187 + 4e-06 27700 200 2.5655873e-06 2.1e-06 0.0074550582 + 4e-06 27800 200 2.4771843e-06 2.1e-06 0.0075111593 + 4e-06 27900 200 2.3805529e-06 2.1e-06 0.0075663148 + 4e-06 28000 200 2.3094253e-06 2.1e-06 0.0076205178 + 4e-06 28100 200 2.2443631e-06 2.1e-06 0.0076737615 + 4e-06 28200 200 2.1339799e-06 2.1e-06 0.0077260391 + 4e-06 28300 200 2.0525827e-06 2.1e-06 0.0077773442 + 4e-06 28400 200 2.0012311e-06 2.1e-06 0.0078276702 + 4e-06 28500 200 1.9064828e-06 2.1e-06 0.0078770108 + 4e-06 28600 200 1.8186848e-06 2.1e-06 0.0079253598 + 4e-06 28700 200 1.7614909e-06 2.1e-06 0.0079727111 + 4e-06 28800 200 1.6854916e-06 2.1e-06 0.0080190587 + 4e-06 28900 200 1.5987487e-06 2.1e-06 0.0080643969 + 4e-06 29000 200 1.5345142e-06 2.1e-06 0.0081087198 + 4e-06 29100 200 1.4807046e-06 2.1e-06 0.008152022 + 4e-06 29200 200 1.3891852e-06 2.1e-06 0.0081942979 + 4e-06 29300 200 1.3152808e-06 2.1e-06 0.0082355423 + 4e-06 29400 200 1.2682955e-06 2.1e-06 0.00827575 + 4e-06 29500 200 1.1980726e-06 2.1e-06 0.0083149158 + 4e-06 29600 200 1.1206391e-06 2.1e-06 0.0083530349 + 4e-06 29700 200 1.069315e-06 2.1e-06 0.0083901025 + 4e-06 29800 200 1.0128853e-06 2.1e-06 0.0084261138 + 4e-06 29900 200 9.4294228e-07 2.1e-06 0.0084610645 + 4e-06 30000 200 8.8682322e-07 2.1e-06 0.00849495 + 4e-06 30100 200 8.3143727e-07 2.1e-06 0.0085277661 + 4e-06 30200 200 7.7886925e-07 2.1e-06 0.0085595086 + 4e-06 30300 200 7.2644265e-07 2.1e-06 0.0085901737 + 4e-06 30400 200 6.7416382e-07 2.1e-06 0.0086197574 + 4e-06 30500 200 6.2520867e-07 2.1e-06 0.0086482559 + 4e-06 30600 200 5.7710448e-07 2.1e-06 0.0086756657 + 4e-06 30700 200 5.3156928e-07 2.1e-06 0.0087019834 + 4e-06 30800 200 4.8684727e-07 2.1e-06 0.0087272057 + 4e-06 30900 200 4.4454752e-07 2.1e-06 0.0087513293 + 4e-06 31000 200 4.0418128e-07 2.1e-06 0.0087743512 + 4e-06 31100 200 3.677997e-07 2.1e-06 0.0087962686 + 4e-06 31200 200 3.2762411e-07 2.1e-06 0.0088170786 + 4e-06 31300 200 2.9156601e-07 2.1e-06 0.0088367787 + 4e-06 31400 200 2.6235825e-07 2.1e-06 0.0088553663 + 4e-06 31500 200 2.2926207e-07 2.1e-06 0.0088728392 + 4e-06 31600 200 1.9870435e-07 2.1e-06 0.0088891951 + 4e-06 31700 200 1.7318685e-07 2.1e-06 0.0089044319 + 4e-06 31800 200 1.4793716e-07 2.1e-06 0.0089185479 + 4e-06 31900 200 1.2335756e-07 2.1e-06 0.0089315411 + 4e-06 32000 200 1.024269e-07 2.1e-06 0.0089434099 + 4e-06 32100 200 8.4811971e-08 2.1e-06 0.0089541529 + 4e-06 32200 200 6.5610079e-08 2.1e-06 0.0089637686 + 4e-06 32300 200 4.9804549e-08 2.1e-06 0.008972256 + 4e-06 32400 200 3.7696394e-08 2.1e-06 0.0089796139 + 4e-06 32500 200 2.6121364e-08 2.1e-06 0.0089858413 + 4e-06 32600 200 1.6302764e-08 2.1e-06 0.0089909376 + 4e-06 32700 200 9.4496486e-09 2.1e-06 0.008994902 + 4e-06 32800 200 4.3514823e-09 2.1e-06 0.0089977341 + 4e-06 32900 200 1.0546756e-09 2.1e-06 0.0089994335 + 4e-06 33000 200 7.3695568e-13 2.1e-06 0.009 +Loop time of 11.7961 on 1 procs for 14000 steps with 200 atoms -99.8% CPU use with 1 MPI tasks x no OpenMP threads +99.6% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.0020062 | 0.0020062 | 0.0020062 | 0.0 | 1.13 -Neigh | 0.00084671 | 0.00084671 | 0.00084671 | 0.0 | 0.48 -Comm | 0.00056289 | 0.00056289 | 0.00056289 | 0.0 | 0.32 -Output | 0.0010356 | 0.0010356 | 0.0010356 | 0.0 | 0.58 -Modify | 0.17178 | 0.17178 | 0.17178 | 0.0 | 96.63 -Other | | 0.001546 | | | 0.87 +Pair | 7.033 | 7.033 | 7.033 | 0.0 | 59.62 +Neigh | 0.047308 | 0.047308 | 0.047308 | 0.0 | 0.40 +Comm | 0.0020382 | 0.0020382 | 0.0020382 | 0.0 | 0.02 +Output | 0.0022072 | 0.0022072 | 0.0022072 | 0.0 | 0.02 +Modify | 4.7043 | 4.7043 | 4.7043 | 0.0 | 39.88 +Other | | 0.00727 | | | 0.06 -Nlocal: 10 ave 10 max 10 min +Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3 ave 3 max 3 min +Neighs: 3145 ave 3145 max 3145 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 3 -Ave neighs/atom = 0.3 +Total # of neighbors = 3145 +Ave neighs/atom = 15.725 Neighbor list builds = 233 Dangerous builds not checked @@ -710,82 +710,82 @@ variable max_disp equal 0.004*0.75 run ${free_float_steps} run 5000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes +Per MPI rank memory allocation (min/avg/max) = 72.31 | 72.31 | 72.31 Mbytes Dt Step Atoms KinEng Volume v_disp_upper - 4e-06 33000 10 4.1931239e-07 2.1e-06 0.009 - 4e-06 33100 10 4.207474e-07 2.1e-06 0.009 - 4e-06 33200 10 4.2235525e-07 2.1e-06 0.009 - 4e-06 33300 10 4.2413593e-07 2.1e-06 0.009 - 4e-06 33400 10 4.2608946e-07 2.1e-06 0.009 - 4e-06 33500 10 4.2821583e-07 2.1e-06 0.009 - 4e-06 33600 10 4.3051504e-07 2.1e-06 0.009 - 4e-06 33700 10 4.3298709e-07 2.1e-06 0.009 - 4e-06 33800 10 4.3563197e-07 2.1e-06 0.009 - 4e-06 33900 10 4.384497e-07 2.1e-06 0.009 - 4e-06 34000 10 4.4144027e-07 2.1e-06 0.009 - 4e-06 34100 10 4.4460367e-07 2.1e-06 0.009 - 4e-06 34200 10 4.4793992e-07 2.1e-06 0.009 - 4e-06 34300 10 4.5144901e-07 2.1e-06 0.009 - 4e-06 34400 10 4.5465956e-07 2.1e-06 0.009 - 4e-06 34500 10 4.5470653e-07 2.1e-06 0.009 - 4e-06 34600 10 4.5236426e-07 2.1e-06 0.009 - 4e-06 34700 10 4.5019483e-07 2.1e-06 0.009 - 4e-06 34800 10 4.4819824e-07 2.1e-06 0.009 - 4e-06 34900 10 4.4590448e-07 2.1e-06 0.009 - 4e-06 35000 10 4.4154693e-07 2.1e-06 0.009 - 4e-06 35100 10 4.3736222e-07 2.1e-06 0.009 - 4e-06 35200 10 4.3335035e-07 2.1e-06 0.009 - 4e-06 35300 10 4.2951132e-07 2.1e-06 0.009 - 4e-06 35400 10 4.2584514e-07 2.1e-06 0.009 - 4e-06 35500 10 4.2235179e-07 2.1e-06 0.009 - 4e-06 35600 10 4.1903128e-07 2.1e-06 0.009 - 4e-06 35700 10 4.1034829e-07 2.1e-06 0.009 - 4e-06 35800 10 4.1153836e-07 2.1e-06 0.009 - 4e-06 35900 10 4.0720986e-07 2.1e-06 0.009 - 4e-06 36000 10 4.0259092e-07 2.1e-06 0.009 - 4e-06 36100 10 3.9607992e-07 2.1e-06 0.009 - 4e-06 36200 10 3.8974177e-07 2.1e-06 0.009 - 4e-06 36300 10 3.8357646e-07 2.1e-06 0.009 - 4e-06 36400 10 3.7758398e-07 2.1e-06 0.009 - 4e-06 36500 10 3.7176435e-07 2.1e-06 0.009 - 4e-06 36600 10 3.6611755e-07 2.1e-06 0.009 - 4e-06 36700 10 3.606436e-07 2.1e-06 0.009 - 4e-06 36800 10 3.5534248e-07 2.1e-06 0.009 - 4e-06 36900 10 3.5021421e-07 2.1e-06 0.009 - 4e-06 37000 10 3.4525877e-07 2.1e-06 0.009 - 4e-06 37100 10 3.4047618e-07 2.1e-06 0.009 - 4e-06 37200 10 3.3586643e-07 2.1e-06 0.009 - 4e-06 37300 10 3.3142951e-07 2.1e-06 0.009 - 4e-06 37400 10 3.0307307e-07 2.1e-06 0.009 - 4e-06 37500 10 3.208203e-07 2.1e-06 0.009 - 4e-06 37600 10 3.1480548e-07 2.1e-06 0.009 - 4e-06 37700 10 3.0896349e-07 2.1e-06 0.009 - 4e-06 37800 10 3.0329434e-07 2.1e-06 0.009 - 4e-06 37900 10 2.9779804e-07 2.1e-06 0.009 - 4e-06 38000 10 2.9247457e-07 2.1e-06 0.009 -Loop time of 0.0201013 on 1 procs for 5000 steps with 10 atoms + 4e-06 33000 200 7.3695568e-13 2.1e-06 0.009 + 4e-06 33100 200 1.0383246e-10 2.1e-06 0.009 + 4e-06 33200 200 5.9976193e-12 2.1e-06 0.009 + 4e-06 33300 200 6.2729949e-12 2.1e-06 0.009 + 4e-06 33400 200 9.0819715e-12 2.1e-06 0.009 + 4e-06 33500 200 4.1741245e-12 2.1e-06 0.009 + 4e-06 33600 200 4.2796157e-13 2.1e-06 0.009 + 4e-06 33700 200 1.2198973e-13 2.1e-06 0.009 + 4e-06 33800 200 5.0253099e-13 2.1e-06 0.009 + 4e-06 33900 200 3.2987112e-13 2.1e-06 0.009 + 4e-06 34000 200 9.8474325e-14 2.1e-06 0.009 + 4e-06 34100 200 2.0804908e-14 2.1e-06 0.009 + 4e-06 34200 200 3.5479858e-14 2.1e-06 0.009 + 4e-06 34300 200 4.6823841e-14 2.1e-06 0.009 + 4e-06 34400 200 2.8845396e-14 2.1e-06 0.009 + 4e-06 34500 200 2.4894095e-14 2.1e-06 0.009 + 4e-06 34600 200 2.4407576e-14 2.1e-06 0.009 + 4e-06 34700 200 2.4241607e-14 2.1e-06 0.009 + 4e-06 34800 200 2.5678797e-14 2.1e-06 0.009 + 4e-06 34900 200 3.0880003e-14 2.1e-06 0.009 + 4e-06 35000 200 3.3341003e-14 2.1e-06 0.009 + 4e-06 35100 200 1.5611246e-11 2.1e-06 0.009 + 4e-06 35200 200 8.7304571e-13 2.1e-06 0.009 + 4e-06 35300 200 1.28235e-13 2.1e-06 0.009 + 4e-06 35400 200 4.7975116e-13 2.1e-06 0.009 + 4e-06 35500 200 4.0667584e-13 2.1e-06 0.009 + 4e-06 35600 200 1.1230838e-13 2.1e-06 0.009 + 4e-06 35700 200 3.0578739e-14 2.1e-06 0.009 + 4e-06 35800 200 5.2724197e-14 2.1e-06 0.009 + 4e-06 35900 200 5.4930313e-14 2.1e-06 0.009 + 4e-06 36000 200 5.0413822e-14 2.1e-06 0.009 + 4e-06 36100 200 4.2936129e-14 2.1e-06 0.009 + 4e-06 36200 200 4.2946116e-14 2.1e-06 0.009 + 4e-06 36300 200 4.5163485e-14 2.1e-06 0.009 + 4e-06 36400 200 4.6640704e-14 2.1e-06 0.009 + 4e-06 36500 200 4.6581622e-14 2.1e-06 0.009 + 4e-06 36600 200 4.6319151e-14 2.1e-06 0.009 + 4e-06 36700 200 4.5444461e-14 2.1e-06 0.009 + 4e-06 36800 200 4.6152933e-14 2.1e-06 0.009 + 4e-06 36900 200 4.5660145e-14 2.1e-06 0.009 + 4e-06 37000 200 4.479585e-14 2.1e-06 0.009 + 4e-06 37100 200 4.454612e-14 2.1e-06 0.009 + 4e-06 37200 200 4.3595031e-14 2.1e-06 0.009 + 4e-06 37300 200 4.2650848e-14 2.1e-06 0.009 + 4e-06 37400 200 4.3124042e-14 2.1e-06 0.009 + 4e-06 37500 200 4.1053224e-14 2.1e-06 0.009 + 4e-06 37600 200 4.2786157e-14 2.1e-06 0.009 + 4e-06 37700 200 4.3961233e-14 2.1e-06 0.009 + 4e-06 37800 200 4.359215e-14 2.1e-06 0.009 + 4e-06 37900 200 4.3410766e-14 2.1e-06 0.009 + 4e-06 38000 200 3.9866697e-14 2.1e-06 0.009 +Loop time of 4.29106 on 1 procs for 5000 steps with 200 atoms -99.8% CPU use with 1 MPI tasks x no OpenMP threads +99.6% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.00055406 | 0.00055406 | 0.00055406 | 0.0 | 2.76 -Neigh | 0.00029074 | 0.00029074 | 0.00029074 | 0.0 | 1.45 -Comm | 0.00017063 | 0.00017063 | 0.00017063 | 0.0 | 0.85 -Output | 0.00023192 | 0.00023192 | 0.00023192 | 0.0 | 1.15 -Modify | 0.018306 | 0.018306 | 0.018306 | 0.0 | 91.07 -Other | | 0.000548 | | | 2.73 +Pair | 2.6156 | 2.6156 | 2.6156 | 0.0 | 60.95 +Neigh | 0.017028 | 0.017028 | 0.017028 | 0.0 | 0.40 +Comm | 0.00059632 | 0.00059632 | 0.00059632 | 0.0 | 0.01 +Output | 0.00055782 | 0.00055782 | 0.00055782 | 0.0 | 0.01 +Modify | 1.6547 | 1.6547 | 1.6547 | 0.0 | 38.56 +Other | | 0.002613 | | | 0.06 -Nlocal: 10 ave 10 max 10 min +Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 2 ave 2 max 2 min +Neighs: 3145 ave 3145 max 3145 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 2 -Ave neighs/atom = 0.2 +Total # of neighbors = 3145 +Ave neighs/atom = 15.725 Neighbor list builds = 83 Dangerous builds not checked -Total wall time: 0:00:00 +Total wall time: 0:00:26 diff --git a/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 b/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 index 8b9562d59f..eb49f732e8 100644 --- a/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 +++ b/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-581-g384d7f446b-modified) +LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-583-g3d4b57d7fd-modified) ############################### SIMULATION SETTINGS ################################################### atom_style sphere 1 @@ -19,7 +19,7 @@ Reading data file ... 1 by 1 by 1 MPI processor grid reading atoms ... 12 atoms - read_data CPU = 0.002 seconds + read_data CPU = 0.003 seconds fix integr all nve/sphere # create pair group for contact area outputs @@ -193,9 +193,9 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 74.54 | 74.54 | 74.54 Mbytes Dt Step Atoms KinEng c_1 Volume 1e-06 0 12 0 0 8000 -Loop time of 1.135e-06 on 1 procs for 0 steps with 12 atoms +Loop time of 8.47e-07 on 1 procs for 0 steps with 12 atoms -88.1% CPU use with 1 MPI tasks x no OpenMP threads +0.0% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total @@ -205,7 +205,7 @@ Neigh | 0 | 0 | 0 | 0.0 | 0.00 Comm | 0 | 0 | 0 | 0.0 | 0.00 Output | 0 | 0 | 0 | 0.0 | 0.00 Modify | 0 | 0 | 0 | 0.0 | 0.00 -Other | | 1.135e-06 | | |100.00 +Other | | 8.47e-07 | | |100.00 Nlocal: 12 ave 12 max 12 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -253,527 +253,528 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 75.17 | 75.17 | 75.17 Mbytes Dt Step Atoms KinEng c_1 Volume 1e-06 0 12 0 0 8000 - 1e-06 100 12 0.00013054111 0 8000 - 1e-06 200 12 0.013855547 0 8000 - 1e-06 300 12 0.14822185 0 8000 - 1e-06 400 12 0.73507149 0 8000 - 1e-06 500 12 2.4874475 0 8000 - 1e-06 600 12 6.7258963 0 8000 - 1e-06 700 12 15.636026 0 8000 - 1e-06 800 12 32.517811 0 8000 - 1e-06 900 12 62.020123 0 8000 - 1e-06 1000 12 110.35576 0 8000 - 1e-06 1100 12 185.492 0 8000 - 1e-06 1200 12 297.31164 0 8000 - 1e-06 1300 12 457.73953 0 8000 - 1e-06 1400 12 680.82988 0 8000 - 1e-06 1500 12 982.80999 0 8000 - 1e-06 1600 12 1382.0767 0 8000 - 1e-06 1700 12 1899.1422 0 8000 - 1e-06 1800 12 2556.5278 0 8000 - 1e-06 1900 12 3378.6026 0 8000 - 1e-06 2000 12 4391.3694 0 8000 - 1e-06 2100 12 5622.1967 0 8000 - 1e-06 2200 12 7099.4998 0 8000 - 1e-06 2300 12 8852.3743 0 8000 - 1e-06 2400 10 6989.9205 0 8000 - 1e-06 2500 10 8429.3452 0 8000 - 1e-06 2600 10 10069.898 0 8000 - 1e-06 2700 10 11924.3 0 8000 - 1e-06 2800 10 14004.078 0 8000 - 1e-06 2900 10 16319.307 0 8000 - 1e-06 3000 10 18878.365 0 8000 - 1e-06 3100 10 21687.702 0 8000 - 1e-06 3200 10 24751.634 0 8000 - 1e-06 3300 10 28072.177 0 8000 - 1e-06 3400 10 31649.069 0 8000 - 1e-06 3500 10 35479.937 0 8000 - 1e-06 3600 10 39560.508 0 8000 - 1e-06 3700 10 43884.837 0 8000 - 1e-06 3800 10 48445.544 0 8000 - 1e-06 3900 10 53234.048 0 8000 - 1e-06 4000 10 58240.786 0 8000 - 1e-06 4100 10 63455.398 0 8000 - 1e-06 4200 10 68866.878 0 8000 - 1e-06 4300 10 74463.666 0 8000 - 1e-06 4400 10 80233.692 0 8000 - 1e-06 4500 10 86164.354 0 8000 - 1e-06 4600 10 92242.435 0 8000 - 1e-06 4700 10 98453.963 0 8000 - 1e-06 4800 10 104784.03 0 8000 - 1e-06 4900 10 111216.58 0 8000 - 1e-06 5000 10 117734.15 0 8000 - 1e-06 5100 10 124317.68 0 8000 - 1e-06 5200 10 130946.27 0 8000 - 1e-06 5300 10 137597 0 8000 - 1e-06 5400 10 144244.91 0 8000 - 1e-06 5500 10 150862.88 0 8000 - 1e-06 5600 10 157421.78 0 8000 - 1e-06 5700 10 163890.67 0 8000 - 1e-06 5800 10 170237.02 0 8000 - 1e-06 5900 10 176427.24 0 8000 - 1e-06 6000 10 182427.1 0 8000 - 1e-06 6100 10 188202.4 0 8000 - 1e-06 6200 10 193719.65 0 8000 - 1e-06 6300 10 198946.82 0 8000 - 1e-06 6400 10 203854.11 0 8000 - 1e-06 6500 10 208414.76 0 8000 - 1e-06 6600 10 212605.82 0 8000 - 1e-06 6700 10 216408.93 0 8000 - 1e-06 6800 10 219811.02 0 8000 - 1e-06 6900 10 222804.99 0 8000 - 1e-06 7000 10 225390.45 0 8000 - 1e-06 7100 10 227574.39 0 8000 - 1e-06 7200 10 229372.23 0 8000 - 1e-06 7300 10 230809.43 0 8000 - 1e-06 7400 10 231925.78 0 8000 - 1e-06 7500 10 232793.77 0 8000 - 1e-06 7600 10 233468.99 0 8000 - 1e-06 7700 10 233964.52 1.1292815e-08 8000 - 1e-06 7800 10 234297.53 3.2638536e-06 8000 - 1e-06 7900 10 234490.97 4.5245711e-05 8000 - 1e-06 8000 10 234575.58 0.00027361033 8000 - 1e-06 8100 10 234598.71 0.001096929 8000 - 1e-06 8200 10 234623.44 0.0034192164 8000 - 1e-06 8300 10 234664.37 0.0089703149 8000 - 1e-06 8400 10 234728.48 0.020734818 8000 - 1e-06 8500 10 234824.44 0.043473962 8000 - 1e-06 8600 10 234962.62 0.084326224 8000 - 1e-06 8700 10 235155.17 0.15346362 8000 - 1e-06 8800 10 235415.94 0.26477255 8000 - 1e-06 8900 10 235760.43 0.43652067 8000 - 1e-06 9000 10 236205.62 0.69196571 8000 - 1e-06 9100 10 236769.75 1.0598579 8000 - 1e-06 9200 10 237472.3 1.5747862 8000 - 1e-06 9300 10 238334.06 2.2773199 8000 - 1e-06 9400 10 239377.46 3.2138993 8000 - 1e-06 9500 10 240626.63 4.4364369 8000 - 1e-06 9600 10 242107.53 6.0015993 8000 - 1e-06 9700 10 243847.86 7.9697503 8000 - 1e-06 9800 10 245876.93 10.403551 8000 - 1e-06 9900 10 248225.31 13.366224 8000 - 1e-06 10000 10 250924.44 16.919517 8000 - 1e-06 10100 8 234934.58 0 8000 - 1e-06 10200 8 235124.58 0 8000 - 1e-06 10300 8 235382.91 0 8000 - 1e-06 10400 8 235723.84 0 8000 - 1e-06 10500 8 236162.16 0 8000 - 1e-06 10600 8 236712.7 0 8000 - 1e-06 10700 8 237389.77 0 8000 - 1e-06 10800 8 238206.63 0 8000 - 1e-06 10900 8 239174.87 0 8000 - 1e-06 11000 8 240303.83 0 8000 - 1e-06 11100 8 241600.1 0 8000 - 1e-06 11200 8 243067 0 8000 - 1e-06 11300 8 244704.22 0 8000 - 1e-06 11400 8 246507.57 0 8000 - 1e-06 11500 8 248468.78 0 8000 - 1e-06 11600 8 250575.55 0 8000 - 1e-06 11700 8 252811.67 0 8000 - 1e-06 11800 6 201540.76 0 8000 - 1e-06 11900 6 203972.8 0 8000 - 1e-06 12000 6 206465.55 0 8000 - 1e-06 12100 6 208991.23 0 8000 - 1e-06 12200 6 211520.76 0 8000 - 1e-06 12300 6 214024.53 0 8000 - 1e-06 12400 6 216473.14 0 8000 - 1e-06 12500 6 218838.23 0 8000 - 1e-06 12600 6 221093.18 0 8000 - 1e-06 12700 6 223213.84 0 8000 - 1e-06 12800 6 225179.08 0 8000 - 1e-06 12900 6 226971.32 0 8000 - 1e-06 13000 6 228576.94 0 8000 - 1e-06 13100 6 229986.52 0 8000 - 1e-06 13200 6 231195.09 0 8000 - 1e-06 13300 6 232202.15 0 8000 - 1e-06 13400 6 233011.77 0 8000 - 1e-06 13500 6 233632.53 0 8000 - 1e-06 13600 6 234077.63 0 8000 - 1e-06 13700 6 234365.12 0 8000 - 1e-06 13800 6 234518.64 0 8000 - 1e-06 13900 6 234569.99 0 8000 - 1e-06 14000 6 234572.25 0 8000 - 1e-06 14100 6 234572.25 0 8000 - 1e-06 14200 6 234572.25 0 8000 - 1e-06 14300 6 234572.25 0 8000 - 1e-06 14400 6 234572.25 0 8000 - 1e-06 14500 6 234572.25 0 8000 - 1e-06 14600 6 234572.25 0 8000 - 1e-06 14700 6 234572.25 0 8000 - 1e-06 14800 6 234572.29 0 8000 - 1e-06 14900 6 234572.53 0 8000 - 1e-06 15000 6 234573.43 0 8000 - 1e-06 15100 6 234575.83 0 8000 - 1e-06 15200 6 234581.15 0 8000 - 1e-06 15300 6 234591.61 0 8000 - 1e-06 15400 6 234610.69 0 8000 - 1e-06 15500 6 234643.46 0 8000 - 1e-06 15600 6 234697 0 8000 - 1e-06 15700 6 234780.66 0 8000 - 1e-06 15800 6 234906.33 0 8000 - 1e-06 15900 6 235088.62 0 8000 - 1e-06 16000 6 235344.92 0 8000 - 1e-06 16100 6 235695.54 0 8000 - 1e-06 16200 6 236163.79 0 8000 - 1e-06 16300 6 236775.81 0 8000 - 1e-06 16400 6 237560.44 0 8000 - 1e-06 16500 6 238548.84 0 8000 - 1e-06 16600 6 239774.02 0 8000 - 1e-06 16700 6 241270.31 0 8000 - 1e-06 16800 6 243072.61 0 8000 - 1e-06 16900 6 245211.28 6.7509561e-05 8000 - 1e-06 17000 6 247685.18 0.0080448801 8000 - 1e-06 17100 6 250497.91 0.088500606 8000 - 1e-06 17200 6 253660.58 0.44413361 8000 - 1e-06 17300 6 257184.97 1.4994335 8000 - 1e-06 17400 6 261081.58 3.9820483 8000 - 1e-06 17500 6 265358.51 9.0005574 8000 - 1e-06 17600 6 270020.73 18.117195 8000 - 1e-06 17700 6 275069.6 33.413964 8000 - 1e-06 17800 6 280502.61 57.550525 8000 - 1e-06 17900 6 286303.62 93.814333 8000 - 1e-06 18000 6 292426.19 146.2099 8000 - 1e-06 18100 6 298823.02 219.66922 8000 - 1e-06 18200 6 305448.57 320.29091 8000 - 1e-06 18300 6 312257.06 455.50977 8000 - 1e-06 18400 6 319203.29 634.16436 8000 - 1e-06 18500 6 326243.62 866.44452 8000 - 1e-06 18600 6 333337.05 1163.7119 8000 - 1e-06 18700 6 340446.07 1538.1992 8000 - 1e-06 18800 6 347537.26 2002.6065 8000 - 1e-06 18900 6 354581.63 2569.6256 8000 - 1e-06 19000 6 361554.66 3251.4317 8000 - 1e-06 19100 6 368436.16 4059.1895 8000 - 1e-06 19200 6 375209.78 5002.6224 8000 - 1e-06 19300 6 381882.2 6109.6539 8000 - 1e-06 19400 6 388474.8 7416.2947 8000 - 1e-06 19500 6 395001.33 8944.9067 8000 - 1e-06 19600 6 401479.91 10717.67 8000 - 1e-06 19700 6 407931.4 12755.438 8000 - 1e-06 19800 6 414377.59 15076.566 8000 - 1e-06 19900 6 420839.43 17695.777 8000 - 1e-06 20000 6 427335.35 20623.111 8000 - 1e-06 20100 6 433879.62 23863.014 8000 - 1e-06 20200 6 440481.15 27413.577 8000 - 1e-06 20300 6 447142.48 31265.951 8000 - 1e-06 20400 6 453859.41 35403.784 8000 - 1e-06 20500 6 460622.17 39801.729 8000 - 1e-06 20600 6 467431.36 44452.106 8000 - 1e-06 20700 6 474330.29 49397.748 8000 - 1e-06 20800 6 481309.26 54624.638 8000 - 1e-06 20900 6 488358.84 60103.827 8000 - 1e-06 21000 6 495475.98 65790.173 8000 - 1e-06 21100 6 502655.34 71632.552 8000 - 1e-06 21200 6 509889.38 77576.424 8000 - 1e-06 21300 6 517172.66 83561.469 8000 - 1e-06 21400 6 524502.62 89522.951 8000 - 1e-06 21500 6 531876.86 95398.198 8000 - 1e-06 21600 6 539294.19 101129.04 8000 - 1e-06 21700 6 546755.8 106663.72 8000 - 1e-06 21800 6 554266.99 111958.45 8000 - 1e-06 21900 6 561839.98 116978.4 8000 - 1e-06 22000 6 569504.77 121698.15 8000 - 1e-06 22100 6 577194.68 126299.67 8000 - 1e-06 22200 6 584793.35 130939.81 8000 - 1e-06 22300 6 592287.59 135570.38 8000 - 1e-06 22400 6 599668.12 140143.02 8000 - 1e-06 22500 6 606930.15 144609.51 8000 - 1e-06 22600 6 614053.56 148921.72 8000 - 1e-06 22700 6 621008.46 153030.89 8000 - 1e-06 22800 6 627801.12 156883.57 8000 - 1e-06 22900 6 634468.16 160420.58 8000 - 1e-06 23000 6 640978.09 163613.12 8000 - 1e-06 23100 6 647287.63 166442.2 8000 - 1e-06 23200 6 653357.63 168893.16 8000 - 1e-06 23300 6 659133.28 170996.37 8000 - 1e-06 23400 6 664395.28 173122 8000 - 1e-06 23500 6 669082.71 175330.06 8000 - 1e-06 23600 6 673190.8 177582.02 8000 - 1e-06 23700 6 676722.56 179839.98 8000 - 1e-06 23800 6 679689.62 182067.03 8000 - 1e-06 23900 6 682113 184227.49 8000 - 1e-06 24000 6 684024.19 186286.94 8000 - 1e-06 24100 6 685466.31 188212.09 8000 - 1e-06 24200 6 686496.31 189970.05 8000 - 1e-06 24300 6 687194.14 191524.49 8000 - 1e-06 24400 6 687664.3 192834.65 8000 - 1e-06 24500 6 687952.12 193892.14 8000 - 1e-06 24600 6 688095.09 194698.81 8000 - 1e-06 24700 6 688136.6 195260.51 8000 - 1e-06 24800 6 688125.44 195586.96 8000 - 1e-06 24900 6 688096.3 195728.68 8000 - 1e-06 25000 6 687921.9 196064.13 8000 - 1e-06 25100 6 687620.45 196683.53 8000 - 1e-06 25200 6 687262.22 197578.87 8000 - 1e-06 25300 6 686921.27 198739.39 8000 - 1e-06 25400 6 686676.56 200150.16 8000 - 1e-06 25500 6 686616.59 201789.73 8000 - 1e-06 25600 6 686864.53 203620.41 8000 - 1e-06 25700 6 687515.07 205612.65 8000 - 1e-06 25800 6 688581.75 207765.95 8000 - 1e-06 25900 6 690068.86 210079.27 8000 - 1e-06 26000 6 691973.66 212549.89 8000 - 1e-06 26100 6 694286.34 215173.38 8000 - 1e-06 26200 6 696990.21 217943.63 8000 - 1e-06 26300 6 700062.02 220852.8 8000 - 1e-06 26400 6 703472.51 223891.43 8000 - 1e-06 26500 6 707187.07 227048.44 8000 - 1e-06 26600 6 711166.57 230311.27 8000 - 1e-06 26700 6 715368.28 233666 8000 - 1e-06 26800 6 719746.83 237097.44 8000 - 1e-06 26900 4 611074.01 219866.64 8000 - 1e-06 27000 4 613405.75 223401.9 8000 - 1e-06 27100 4 615906.25 226962.69 8000 - 1e-06 27200 4 618550.98 230530.7 8000 - 1e-06 27300 4 621314.15 234087.34 8000 - 1e-06 27400 4 624169.04 237613.98 8000 - 1e-06 27500 4 627088.41 241092.16 8000 - 1e-06 27600 4 630045.27 244503.29 8000 - 1e-06 27700 4 633017.68 247822.39 8000 - 1e-06 27800 4 635987.37 251019.87 8000 - 1e-06 27900 4 638936.67 254066.27 8000 - 1e-06 28000 4 641848.81 256932.77 8000 - 1e-06 28100 4 644708.19 259591.65 8000 - 1e-06 28200 4 647500.76 262016.69 8000 - 1e-06 28300 4 650214.19 264183.55 8000 - 1e-06 28400 4 652838.21 266070.17 8000 - 1e-06 28500 4 655364.7 267657.12 8000 - 1e-06 28600 4 657787.94 268927.87 8000 - 1e-06 28700 4 660104.66 269869.08 8000 - 1e-06 28800 4 662314.19 270470.82 8000 - 1e-06 28900 4 664418.47 270726.71 8000 - 1e-06 29000 4 666422.08 270634.03 8000 - 1e-06 29100 4 668332.27 270193.77 8000 - 1e-06 29200 4 670133.21 269455.46 8000 - 1e-06 29300 4 671623.88 268795.91 8000 - 1e-06 29400 4 672777.96 268288.08 8000 - 1e-06 29500 4 673622.53 267917.97 8000 - 1e-06 29600 4 674189.83 267670.08 8000 - 1e-06 29700 4 674518.57 267526.71 8000 - 1e-06 29800 4 674657.04 267466.37 8000 - 1e-06 29900 4 674676.17 267458.04 8000 - 1e-06 30000 4 674676.17 267458.04 8000 - 1e-06 30100 4 674676.17 267458.04 8000 - 1e-06 30200 2 304425.26 84084.197 8000 - 1e-06 30300 2 304425.26 84084.197 8000 - 1e-06 30400 2 304425.26 84084.197 8000 - 1e-06 30500 2 304425.26 84084.197 8000 - 1e-06 30600 2 304425.26 84084.197 8000 - 1e-06 30700 2 304425.26 84084.197 8000 - 1e-06 30800 2 304425.26 84084.197 8000 - 1e-06 30900 2 304425.26 84084.197 8000 - 1e-06 31000 2 304425.26 84084.197 8000 - 1e-06 31100 2 304425.26 84084.197 8000 - 1e-06 31200 2 304425.26 84084.197 8000 - 1e-06 31300 2 304425.26 84084.197 8000 - 1e-06 31400 2 304425.26 84084.197 8000 - 1e-06 31500 2 304425.26 84084.197 8000 - 1e-06 31600 2 304425.26 84084.197 8000 - 1e-06 31700 2 304425.26 84084.197 8000 - 1e-06 31800 2 304425.26 84084.197 8000 - 1e-06 31900 2 304425.26 84084.197 8000 - 1e-06 32000 2 304425.26 84084.197 8000 - 1e-06 32100 2 304425.26 84084.197 8000 - 1e-06 32200 2 304425.26 84084.197 8000 - 1e-06 32300 2 304425.26 84084.197 8000 - 1e-06 32400 2 304425.26 84084.197 8000 - 1e-06 32500 2 304425.26 84084.197 8000 - 1e-06 32600 2 304425.26 84084.197 8000 - 1e-06 32700 2 304425.26 84084.197 8000 - 1e-06 32800 2 304425.26 84084.197 8000 - 1e-06 32900 2 304425.26 84084.197 8000 - 1e-06 33000 2 304425.26 84084.197 8000 - 1e-06 33100 2 304425.26 84084.197 8000 - 1e-06 33200 2 304425.26 84084.197 8000 - 1e-06 33300 2 304425.26 84084.197 8000 - 1e-06 33400 2 304425.26 84084.197 8000 - 1e-06 33500 2 304425.26 84084.197 8000 - 1e-06 33600 2 304425.26 84084.197 8000 - 1e-06 33700 2 304425.26 84084.197 8000 - 1e-06 33800 2 304425.26 84084.197 8000 - 1e-06 33900 2 304425.26 84084.197 8000 - 1e-06 34000 2 304419.46 84084.197 8000 - 1e-06 34100 2 304377.55 84084.224 8000 - 1e-06 34200 2 304278.4 84084.45 8000 - 1e-06 34300 2 304108.46 84085.385 8000 - 1e-06 34400 2 303858.22 84088.048 8000 - 1e-06 34500 2 303521.62 84094.139 8000 - 1e-06 34600 2 303095.91 84106.182 8000 - 1e-06 34700 2 302581.78 84127.634 8000 - 1e-06 34800 2 301983.37 84162.962 8000 - 1e-06 34900 2 301308.35 84217.674 8000 - 1e-06 35000 2 300567.85 84298.29 8000 - 1e-06 35100 2 299776.31 84412.267 8000 - 1e-06 35200 2 298951.17 84567.862 8000 - 1e-06 35300 2 298112.52 84773.935 8000 - 1e-06 35400 2 297282.57 85039.703 8000 - 1e-06 35500 2 296485.02 85374.448 8000 - 1e-06 35600 2 295744.34 85787.18 8000 - 1e-06 35700 2 295085 86286.286 8000 - 1e-06 35800 2 294530.68 86879.159 8000 - 1e-06 35900 0 0 0 8000 - 1e-06 36000 0 0 0 8000 - 1e-06 36100 0 0 0 8000 - 1e-06 36200 0 0 0 8000 - 1e-06 36300 0 0 0 8000 - 1e-06 36400 0 0 0 8000 - 1e-06 36500 0 0 0 8000 - 1e-06 36600 0 0 0 8000 - 1e-06 36700 0 0 0 8000 - 1e-06 36800 0 0 0 8000 - 1e-06 36900 0 0 0 8000 - 1e-06 37000 0 0 0 8000 - 1e-06 37100 0 0 0 8000 - 1e-06 37200 0 0 0 8000 - 1e-06 37300 0 0 0 8000 - 1e-06 37400 0 0 0 8000 - 1e-06 37500 0 0 0 8000 - 1e-06 37600 0 0 0 8000 - 1e-06 37700 0 0 0 8000 - 1e-06 37800 0 0 0 8000 - 1e-06 37900 0 0 0 8000 - 1e-06 38000 0 0 0 8000 - 1e-06 38100 0 0 0 8000 - 1e-06 38200 0 0 0 8000 - 1e-06 38300 0 0 0 8000 - 1e-06 38400 0 0 0 8000 - 1e-06 38500 0 0 0 8000 - 1e-06 38600 0 0 0 8000 - 1e-06 38700 0 0 0 8000 - 1e-06 38800 0 0 0 8000 - 1e-06 38900 0 0 0 8000 - 1e-06 39000 0 0 0 8000 - 1e-06 39100 0 0 0 8000 - 1e-06 39200 0 0 0 8000 - 1e-06 39300 0 0 0 8000 - 1e-06 39400 0 0 0 8000 - 1e-06 39500 0 0 0 8000 - 1e-06 39600 0 0 0 8000 - 1e-06 39700 0 0 0 8000 - 1e-06 39800 0 0 0 8000 - 1e-06 39900 0 0 0 8000 - 1e-06 40000 0 0 0 8000 - 1e-06 40100 0 0 0 8000 - 1e-06 40200 0 0 0 8000 - 1e-06 40300 0 0 0 8000 - 1e-06 40400 0 0 0 8000 - 1e-06 40500 0 0 0 8000 - 1e-06 40600 0 0 0 8000 - 1e-06 40700 0 0 0 8000 - 1e-06 40800 0 0 0 8000 - 1e-06 40900 0 0 0 8000 - 1e-06 41000 0 0 0 8000 - 1e-06 41100 0 0 0 8000 - 1e-06 41200 0 0 0 8000 - 1e-06 41300 0 0 0 8000 - 1e-06 41400 0 0 0 8000 - 1e-06 41500 0 0 0 8000 - 1e-06 41600 0 0 0 8000 - 1e-06 41700 0 0 0 8000 - 1e-06 41800 0 0 0 8000 - 1e-06 41900 0 0 0 8000 - 1e-06 42000 0 0 0 8000 - 1e-06 42100 0 0 0 8000 - 1e-06 42200 0 0 0 8000 - 1e-06 42300 0 0 0 8000 - 1e-06 42400 0 0 0 8000 - 1e-06 42500 0 0 0 8000 - 1e-06 42600 0 0 0 8000 - 1e-06 42700 0 0 0 8000 - 1e-06 42800 0 0 0 8000 - 1e-06 42900 0 0 0 8000 - 1e-06 43000 0 0 0 8000 - 1e-06 43100 0 0 0 8000 - 1e-06 43200 0 0 0 8000 - 1e-06 43300 0 0 0 8000 - 1e-06 43400 0 0 0 8000 - 1e-06 43500 0 0 0 8000 - 1e-06 43600 0 0 0 8000 - 1e-06 43700 0 0 0 8000 - 1e-06 43800 0 0 0 8000 - 1e-06 43900 0 0 0 8000 - 1e-06 44000 0 0 0 8000 - 1e-06 44100 0 0 0 8000 - 1e-06 44200 0 0 0 8000 - 1e-06 44300 0 0 0 8000 - 1e-06 44400 0 0 0 8000 - 1e-06 44500 0 0 0 8000 - 1e-06 44600 0 0 0 8000 - 1e-06 44700 0 0 0 8000 - 1e-06 44800 0 0 0 8000 - 1e-06 44900 0 0 0 8000 - 1e-06 45000 0 0 0 8000 - 1e-06 45100 0 0 0 8000 - 1e-06 45200 0 0 0 8000 - 1e-06 45300 0 0 0 8000 - 1e-06 45400 0 0 0 8000 - 1e-06 45500 0 0 0 8000 - 1e-06 45600 0 0 0 8000 - 1e-06 45700 0 0 0 8000 - 1e-06 45800 0 0 0 8000 - 1e-06 45900 0 0 0 8000 - 1e-06 46000 0 0 0 8000 - 1e-06 46100 0 0 0 8000 - 1e-06 46200 0 0 0 8000 - 1e-06 46300 0 0 0 8000 - 1e-06 46400 0 0 0 8000 - 1e-06 46500 0 0 0 8000 - 1e-06 46600 0 0 0 8000 - 1e-06 46700 0 0 0 8000 - 1e-06 46800 0 0 0 8000 - 1e-06 46900 0 0 0 8000 - 1e-06 47000 0 0 0 8000 - 1e-06 47100 0 0 0 8000 - 1e-06 47200 0 0 0 8000 - 1e-06 47300 0 0 0 8000 - 1e-06 47400 0 0 0 8000 - 1e-06 47500 0 0 0 8000 - 1e-06 47600 0 0 0 8000 - 1e-06 47700 0 0 0 8000 - 1e-06 47800 0 0 0 8000 - 1e-06 47900 0 0 0 8000 - 1e-06 48000 0 0 0 8000 - 1e-06 48100 0 0 0 8000 - 1e-06 48200 0 0 0 8000 - 1e-06 48300 0 0 0 8000 - 1e-06 48400 0 0 0 8000 - 1e-06 48500 0 0 0 8000 - 1e-06 48600 0 0 0 8000 - 1e-06 48700 0 0 0 8000 - 1e-06 48800 0 0 0 8000 - 1e-06 48900 0 0 0 8000 - 1e-06 49000 0 0 0 8000 - 1e-06 49100 0 0 0 8000 - 1e-06 49200 0 0 0 8000 - 1e-06 49300 0 0 0 8000 - 1e-06 49400 0 0 0 8000 - 1e-06 49500 0 0 0 8000 - 1e-06 49600 0 0 0 8000 - 1e-06 49700 0 0 0 8000 - 1e-06 49800 0 0 0 8000 - 1e-06 49900 0 0 0 8000 -Loop time of 0.419125 on 1 procs for 49900 steps with 0 atoms + 1e-06 100 12 0.37627896 0 8000 + 1e-06 200 12 4.1791248 0 8000 + 1e-06 300 12 14.842751 0 8000 + 1e-06 400 12 36.772259 0 8000 + 1e-06 500 12 77.630616 0 8000 + 1e-06 600 12 145.73848 0 8000 + 1e-06 700 12 250.50491 0 8000 + 1e-06 800 12 402.70153 0 8000 + 1e-06 900 12 614.51551 0 8000 + 1e-06 1000 12 899.53232 0 8000 + 1e-06 1100 12 1272.6697 0 8000 + 1e-06 1200 12 1750.0701 0 8000 + 1e-06 1300 12 2348.9536 0 8000 + 1e-06 1400 12 3087.4362 0 8000 + 1e-06 1500 12 3984.3134 0 8000 + 1e-06 1600 12 5058.8155 0 8000 + 1e-06 1700 12 6330.3362 0 8000 + 1e-06 1800 12 7818.1411 0 8000 + 1e-06 1900 12 9541.0592 0 8000 + 1e-06 2000 12 11498.791 0.0047810266 8000 + 1e-06 2100 12 13704.573 0.10811492 8000 + 1e-06 2200 12 16174.974 0.63000368 8000 + 1e-06 2300 12 18921.112 2.1626376 8000 + 1e-06 2400 12 21953.925 5.2698517 8000 + 1e-06 2500 12 25281.497 10.484444 8000 + 1e-06 2600 12 28908.645 18.482248 8000 + 1e-06 2700 12 32837.664 30.036339 8000 + 1e-06 2800 12 37068.237 46.017479 8000 + 1e-06 2900 12 41597.382 67.391786 8000 + 1e-06 3000 12 46419.434 95.215596 8000 + 1e-06 3100 12 51526.06 130.62752 8000 + 1e-06 3200 12 56906.565 174.8377 8000 + 1e-06 3300 12 62550.059 229.11444 8000 + 1e-06 3400 12 68444.395 294.66357 8000 + 1e-06 3500 12 74576.632 372.08886 8000 + 1e-06 3600 12 80933.178 461.43595 8000 + 1e-06 3700 12 87499.829 562.23674 8000 + 1e-06 3800 12 94261.901 673.47838 8000 + 1e-06 3900 12 101204.31 793.60705 8000 + 1e-06 4000 12 108311.58 920.56829 8000 + 1e-06 4100 12 115567.86 1051.8828 8000 + 1e-06 4200 12 122956.81 1184.754 8000 + 1e-06 4300 12 130461.5 1316.2004 8000 + 1e-06 4400 12 138064.33 1443.2052 8000 + 1e-06 4500 12 145746.82 1562.8719 8000 + 1e-06 4600 12 153422.95 1670.3394 8000 + 1e-06 4700 12 161051.84 1763.0999 8000 + 1e-06 4800 12 168667.52 1842.4996 8000 + 1e-06 4900 12 176255.36 1908.409 8000 + 1e-06 5000 12 183795.82 1961.1714 8000 + 1e-06 5100 12 191266.94 2001.7002 8000 + 1e-06 5200 12 198645 2031.4642 8000 + 1e-06 5300 12 205905.03 2052.4189 8000 + 1e-06 5400 12 213021.06 2066.906 8000 + 1e-06 5500 12 219828.33 2076.3201 8000 + 1e-06 5600 12 226088.26 2080.385 8000 + 1e-06 5700 12 231986.18 2088.93 8000 + 1e-06 5800 12 237570.94 2108.0119 8000 + 1e-06 5900 12 242837.17 2141.5471 8000 + 1e-06 6000 12 247775.44 2192.6781 8000 + 1e-06 6100 12 252375.51 2263.7885 8000 + 1e-06 6200 12 256627.89 2356.5013 8000 + 1e-06 6300 12 260524.71 2471.6922 8000 + 1e-06 6400 12 264060.29 2609.528 8000 + 1e-06 6500 12 267231.53 2769.5274 8000 + 1e-06 6600 12 270038.2 2950.6395 8000 + 1e-06 6700 12 272483.11 3151.335 8000 + 1e-06 6800 12 274572.24 3369.7006 8000 + 1e-06 6900 12 276314.75 3603.531 8000 + 1e-06 7000 12 277722.99 3850.4128 8000 + 1e-06 7100 12 278812.52 4107.7948 8000 + 1e-06 7200 12 279602.05 4373.0439 8000 + 1e-06 7300 12 280113.55 4643.4856 8000 + 1e-06 7400 12 280372.7 4916.43 8000 + 1e-06 7500 12 280411.71 5189.1887 8000 + 1e-06 7600 12 280270.18 5459.0844 8000 + 1e-06 7700 12 279999.69 5723.4596 8000 + 1e-06 7800 12 279696.94 5979.6896 8000 + 1e-06 7900 12 279705.93 6225.2029 8000 + 1e-06 8000 12 279677 6457.5689 8000 + 1e-06 8100 12 279607.39 6683.3974 8000 + 1e-06 8200 12 279535.86 6906.911 8000 + 1e-06 8300 12 279515.96 7125.9155 8000 + 1e-06 8400 12 279726.3 7338.4626 8000 + 1e-06 8500 12 279905.61 7528.2253 8000 + 1e-06 8600 12 279994.55 7695.3391 8000 + 1e-06 8700 12 280109.97 7846.4954 8000 + 1e-06 8800 12 280280.9 7992.1243 8000 + 1e-06 8900 12 280526.73 8146.1487 8000 + 1e-06 9000 12 280875.16 8309.0778 8000 + 1e-06 9100 12 281361.17 8473.1301 8000 + 1e-06 9200 12 282015.74 8638.5101 8000 + 1e-06 9300 12 282868.61 8807.2007 8000 + 1e-06 9400 12 283949.43 8980.8606 8000 + 1e-06 9500 12 285287.01 9160.6973 8000 + 1e-06 9600 12 286908.48 9347.3851 8000 + 1e-06 9700 12 288808.95 9540.3891 8000 + 1e-06 9800 12 291008.88 9739.3515 8000 + 1e-06 9900 12 293533.31 9944.1548 8000 + 1e-06 10000 12 296392.46 10153.993 8000 + 1e-06 10100 12 299589.23 10366.149 8000 + 1e-06 10200 12 303120.5 10580.26 8000 + 1e-06 10300 12 306976.5 10797.104 8000 + 1e-06 10400 12 311140.59 11018.1 8000 + 1e-06 10500 12 315589.46 11245.316 8000 + 1e-06 10600 12 320293.56 11481.375 8000 + 1e-06 10700 12 325217.67 11729.284 8000 + 1e-06 10800 12 330321.65 11992.189 8000 + 1e-06 10900 12 335561.34 12273.086 8000 + 1e-06 11000 12 340889.49 12574.505 8000 + 1e-06 11100 12 346256.88 12898.214 8000 + 1e-06 11200 12 351613.36 13244.969 8000 + 1e-06 11300 12 356921.74 13613.584 8000 + 1e-06 11400 12 362263.57 14000.802 8000 + 1e-06 11500 12 367685.46 14407.905 8000 + 1e-06 11600 12 373173.46 14833.769 8000 + 1e-06 11700 12 378713.19 15276.703 8000 + 1e-06 11800 12 384258.42 15728.278 8000 + 1e-06 11900 12 389798.27 16183.88 8000 + 1e-06 12000 12 395067.85 16636.846 8000 + 1e-06 12100 12 400198.63 17088.171 8000 + 1e-06 12200 12 405211.55 17537.364 8000 + 1e-06 12300 12 410112.47 17984.343 8000 + 1e-06 12400 12 414906.33 18429.831 8000 + 1e-06 12500 12 419598.71 18875.613 8000 + 1e-06 12600 12 424192.44 19324.904 8000 + 1e-06 12700 12 428565.91 19783.784 8000 + 1e-06 12800 12 432825.92 20255.392 8000 + 1e-06 12900 12 437005.65 20738.975 8000 + 1e-06 13000 12 441133.84 21226.416 8000 + 1e-06 13100 12 445218.44 21720.281 8000 + 1e-06 13200 12 449263.02 22225.116 8000 + 1e-06 13300 12 453268.59 22746.27 8000 + 1e-06 13400 12 457229.62 23288.917 8000 + 1e-06 13500 12 461141.35 23859.236 8000 + 1e-06 13600 12 464999.54 24464.127 8000 + 1e-06 13700 12 468798.7 25110.47 8000 + 1e-06 13800 12 472500.62 25806.135 8000 + 1e-06 13900 12 476074.74 26564.004 8000 + 1e-06 14000 12 479545.35 27389.059 8000 + 1e-06 14100 12 482914.85 28284.54 8000 + 1e-06 14200 12 486185.47 29252.687 8000 + 1e-06 14300 12 489361.15 30294.757 8000 + 1e-06 14400 12 492273.69 31409.091 8000 + 1e-06 14500 12 494514.18 32573.659 8000 + 1e-06 14600 12 496511.76 33785.467 8000 + 1e-06 14700 12 498362.32 35051.794 8000 + 1e-06 14800 12 500126.95 36382.324 8000 + 1e-06 14900 12 501872.73 37788.434 8000 + 1e-06 15000 12 503658.95 39269.921 8000 + 1e-06 15100 12 505524.32 40815.737 8000 + 1e-06 15200 12 507507.74 42410.397 8000 + 1e-06 15300 12 509052.44 44020.642 8000 + 1e-06 15400 12 510424.85 45607.21 8000 + 1e-06 15500 12 511477.14 47150.907 8000 + 1e-06 15600 12 511930.85 48638.383 8000 + 1e-06 15700 12 512124.38 50030.203 8000 + 1e-06 15800 12 512194.05 51293.423 8000 + 1e-06 15900 12 512175.22 52402.955 8000 + 1e-06 16000 12 512095.42 53340.637 8000 + 1e-06 16100 12 511970.22 54097.278 8000 + 1e-06 16200 12 511797.58 54671.217 8000 + 1e-06 16300 12 511596.19 55067.665 8000 + 1e-06 16400 12 511390.31 55298.281 8000 + 1e-06 16500 12 511203.2 55383.204 8000 + 1e-06 16600 12 511056.43 55352.575 8000 + 1e-06 16700 12 510973.55 55240.989 8000 + 1e-06 16800 12 510979.82 55085.771 8000 + 1e-06 16900 12 511018.94 54944.912 8000 + 1e-06 17000 12 510839.23 54871.084 8000 + 1e-06 17100 12 510670.95 54882.14 8000 + 1e-06 17200 12 510592.26 55012.23 8000 + 1e-06 17300 12 510473.65 55293.657 8000 + 1e-06 17400 12 509821.33 55718.974 8000 + 1e-06 17500 12 508425.2 56251.107 8000 + 1e-06 17600 12 506922.69 56913.254 8000 + 1e-06 17700 12 505432.36 57751.093 8000 + 1e-06 17800 12 504007.07 58820.863 8000 + 1e-06 17900 12 502565.91 60215.42 8000 + 1e-06 18000 12 501138.89 61987.521 8000 + 1e-06 18100 12 499028.8 64137.707 8000 + 1e-06 18200 12 493241.81 66656.007 8000 + 1e-06 18300 12 486709.22 69522.002 8000 + 1e-06 18400 12 480004.21 72703.075 8000 + 1e-06 18500 12 473373.17 76162.035 8000 + 1e-06 18600 12 466967.02 79858.627 8000 + 1e-06 18700 12 460896.76 83749.858 8000 + 1e-06 18800 12 455246.73 87789.78 8000 + 1e-06 18900 12 450058.54 91935.918 8000 + 1e-06 19000 12 445381.99 96175.252 8000 + 1e-06 19100 12 441278.15 100523.08 8000 + 1e-06 19200 12 437763.14 104946.19 8000 + 1e-06 19300 12 434836.79 109405.67 8000 + 1e-06 19400 12 432488.77 113863.34 8000 + 1e-06 19500 12 430699.83 118281.43 8000 + 1e-06 19600 12 429442.98 122622.26 8000 + 1e-06 19700 12 428684.66 126847.95 8000 + 1e-06 19800 12 428328.48 130917.63 8000 + 1e-06 19900 12 428196.55 134775.59 8000 + 1e-06 20000 12 427597.88 138354.14 8000 + 1e-06 20100 12 425748.44 141440.79 8000 + 1e-06 20200 12 423827.82 143975.56 8000 + 1e-06 20300 12 422029.53 145951.68 8000 + 1e-06 20400 12 420416.81 147364.79 8000 + 1e-06 20500 12 419027.95 148273.8 8000 + 1e-06 20600 12 417858.85 148716.68 8000 + 1e-06 20700 12 416878.1 148666.56 8000 + 1e-06 20800 12 416057.47 148096.03 8000 + 1e-06 20900 12 415366.73 146981.92 8000 + 1e-06 21000 12 414775.28 145311.94 8000 + 1e-06 21100 12 414254.77 143086.56 8000 + 1e-06 21200 12 413734.06 140320.07 8000 + 1e-06 21300 12 412373.7 137040.42 8000 + 1e-06 21400 12 410695.21 133289.46 8000 + 1e-06 21500 12 408430.75 129131.69 8000 + 1e-06 21600 12 405927.7 124609.43 8000 + 1e-06 21700 12 403251.27 119786.82 8000 + 1e-06 21800 12 400435.71 114740.64 8000 + 1e-06 21900 12 397484.88 109586.68 8000 + 1e-06 22000 12 394308.48 104582.2 8000 + 1e-06 22100 12 390933.42 99878.117 8000 + 1e-06 22200 12 387369.16 95602.908 8000 + 1e-06 22300 12 383599.37 91871.749 8000 + 1e-06 22400 12 379598.34 88800.942 8000 + 1e-06 22500 12 375344.08 86475.879 8000 + 1e-06 22600 12 370860.89 84903.263 8000 + 1e-06 22700 12 366151.23 84105.325 8000 + 1e-06 22800 12 361209.31 84104.321 8000 + 1e-06 22900 12 356040.22 84897.625 8000 + 1e-06 23000 12 350662.58 86460.188 8000 + 1e-06 23100 12 345116.82 88752.422 8000 + 1e-06 23200 12 339495.95 91790.621 8000 + 1e-06 23300 12 333687.3 95431.883 8000 + 1e-06 23400 12 327700.18 99552.952 8000 + 1e-06 23500 12 321587.6 104041.28 8000 + 1e-06 23600 12 315413.29 108778.56 8000 + 1e-06 23700 12 309232.19 113641.68 8000 + 1e-06 23800 12 303140 118515.28 8000 + 1e-06 23900 12 297243.14 123286.42 8000 + 1e-06 24000 12 291647.45 127852.5 8000 + 1e-06 24100 12 286443.56 132128.25 8000 + 1e-06 24200 12 281738.47 136042.29 8000 + 1e-06 24300 12 277598.16 139537.18 8000 + 1e-06 24400 12 274126.59 142570.51 8000 + 1e-06 24500 12 271212.37 145112.95 8000 + 1e-06 24600 12 268528.37 147123.47 8000 + 1e-06 24700 12 266518.1 148576.54 8000 + 1e-06 24800 12 265271.22 149482.64 8000 + 1e-06 24900 12 264825.89 149868.7 8000 + 1e-06 25000 12 265195.27 149778.11 8000 + 1e-06 25100 12 266383.27 149277.13 8000 + 1e-06 25200 12 268349.03 148416.99 8000 + 1e-06 25300 12 270306.65 147210.83 8000 + 1e-06 25400 12 272540.67 145679.8 8000 + 1e-06 25500 12 275074.7 143905.2 8000 + 1e-06 25600 12 277868.98 141980.52 8000 + 1e-06 25700 12 280861.82 139998.04 8000 + 1e-06 25800 12 283988.43 138050.21 8000 + 1e-06 25900 12 287187.75 136227 8000 + 1e-06 26000 12 290378.71 134578.07 8000 + 1e-06 26100 12 293523.52 133120.1 8000 + 1e-06 26200 12 296607.69 131949.25 8000 + 1e-06 26300 12 299624.93 131155.87 8000 + 1e-06 26400 12 302615.41 130771.8 8000 + 1e-06 26500 12 305572.83 130791.04 8000 + 1e-06 26600 12 308487.65 131181.94 8000 + 1e-06 26700 12 311349.47 131876.78 8000 + 1e-06 26800 12 314152.42 132778.86 8000 + 1e-06 26900 12 316889.29 133767.68 8000 + 1e-06 27000 12 319555.95 134708.52 8000 + 1e-06 27100 12 322120.91 135461.05 8000 + 1e-06 27200 12 324555.84 135890.05 8000 + 1e-06 27300 12 326829.66 135875.78 8000 + 1e-06 27400 12 328889.23 135312.91 8000 + 1e-06 27500 12 330281.69 133716.24 8000 + 1e-06 27600 12 329638.28 131054.91 8000 + 1e-06 27700 12 328037.36 127321.07 8000 + 1e-06 27800 12 325917.33 122660.17 8000 + 1e-06 27900 12 323405.93 117289.76 8000 + 1e-06 28000 12 320546.78 111541.78 8000 + 1e-06 28100 12 317368.1 105721.12 8000 + 1e-06 28200 12 313916.1 100042.75 8000 + 1e-06 28300 12 310233.7 94704.867 8000 + 1e-06 28400 12 306354.19 89876.573 8000 + 1e-06 28500 12 302311.92 85693.914 8000 + 1e-06 28600 12 298136.83 82229.878 8000 + 1e-06 28700 12 293861.39 79475.257 8000 + 1e-06 28800 12 289522.82 77321.299 8000 + 1e-06 28900 12 285166.39 75606.038 8000 + 1e-06 29000 12 280832.9 74150.094 8000 + 1e-06 29100 12 276597.93 72751.053 8000 + 1e-06 29200 12 272488.85 71238.957 8000 + 1e-06 29300 12 268566.35 69513.495 8000 + 1e-06 29400 12 264945.51 67531.391 8000 + 1e-06 29500 12 261654.36 65280.325 8000 + 1e-06 29600 12 258609.63 62770.995 8000 + 1e-06 29700 12 255839.5 60094.223 8000 + 1e-06 29800 12 253400.35 57359.541 8000 + 1e-06 29900 12 251293.26 54686.718 8000 + 1e-06 30000 12 249489.3 52206.293 8000 + 1e-06 30100 12 247933.05 50046.862 8000 + 1e-06 30200 12 246671.31 48361.721 8000 + 1e-06 30300 12 245727.43 47234.492 8000 + 1e-06 30400 12 245089.53 46668.443 8000 + 1e-06 30500 12 244732.88 46634.46 8000 + 1e-06 30600 12 244634.04 47078.65 8000 + 1e-06 30700 12 244776.41 47932.487 8000 + 1e-06 30800 12 245144.95 49123.892 8000 + 1e-06 30900 12 245702.52 50587.15 8000 + 1e-06 31000 12 246438.58 52268.799 8000 + 1e-06 31100 12 247320.85 54174.572 8000 + 1e-06 31200 12 248299.92 56314.047 8000 + 1e-06 31300 12 249329.77 58655.775 8000 + 1e-06 31400 12 250368.76 61154.112 8000 + 1e-06 31500 12 251379.78 63756.764 8000 + 1e-06 31600 12 252311.71 66409.538 8000 + 1e-06 31700 12 252527.59 69055.013 8000 + 1e-06 31800 12 252438.03 71645.91 8000 + 1e-06 31900 12 252149.26 74149.007 8000 + 1e-06 32000 12 251697.31 76539.619 8000 + 1e-06 32100 12 251102.37 78801.8 8000 + 1e-06 32200 12 250377.5 80923.81 8000 + 1e-06 32300 12 249388.7 82875.3 8000 + 1e-06 32400 12 248054.75 84570.827 8000 + 1e-06 32500 12 246510.48 85977.951 8000 + 1e-06 32600 12 244788.85 87069.778 8000 + 1e-06 32700 12 242926.09 87820.435 8000 + 1e-06 32800 12 240951.82 88208.457 8000 + 1e-06 32900 12 238923.34 88216.633 8000 + 1e-06 33000 12 236972.84 87811.784 8000 + 1e-06 33100 12 235176.94 86991.249 8000 + 1e-06 33200 12 233594.14 85783.149 8000 + 1e-06 33300 12 232256.48 84231.2 8000 + 1e-06 33400 12 231063.68 82397.369 8000 + 1e-06 33500 12 229814.73 80366.279 8000 + 1e-06 33600 12 228715.08 78221.16 8000 + 1e-06 33700 12 227846.27 76046.828 8000 + 1e-06 33800 12 227241.85 73932.693 8000 + 1e-06 33900 12 226942.55 71944.948 8000 + 1e-06 34000 12 226979.34 70148.331 8000 + 1e-06 34100 12 227374.73 68624.913 8000 + 1e-06 34200 12 228140.68 67389 8000 + 1e-06 34300 12 229286.23 66436.221 8000 + 1e-06 34400 12 230818.8 65748.265 8000 + 1e-06 34500 12 232718.67 65274.126 8000 + 1e-06 34600 12 234956.45 64949.901 8000 + 1e-06 34700 12 237495.47 64705.586 8000 + 1e-06 34800 12 240298.79 64471.768 8000 + 1e-06 34900 12 243327.46 64186.278 8000 + 1e-06 35000 12 246540.11 63799.369 8000 + 1e-06 35100 12 249891.89 63272.741 8000 + 1e-06 35200 12 253331.8 62590.115 8000 + 1e-06 35300 12 256810.15 61755.192 8000 + 1e-06 35400 12 260282.81 60790.037 8000 + 1e-06 35500 12 263711.24 59733.295 8000 + 1e-06 35600 12 267063.76 58636.285 8000 + 1e-06 35700 12 270321.08 57558.359 8000 + 1e-06 35800 12 273471.7 56562.046 8000 + 1e-06 35900 12 276025.36 55655.191 8000 + 1e-06 36000 12 277671.27 54780.068 8000 + 1e-06 36100 12 278702.08 54044.977 8000 + 1e-06 36200 12 279135.29 53482.141 8000 + 1e-06 36300 12 278950.85 53096.328 8000 + 1e-06 36400 12 278091.84 52852.785 8000 + 1e-06 36500 12 276595.93 52726.318 8000 + 1e-06 36600 12 274484.66 52702.496 8000 + 1e-06 36700 12 271787.05 52743.065 8000 + 1e-06 36800 12 268570.57 52802.129 8000 + 1e-06 36900 12 264883.91 52837.56 8000 + 1e-06 37000 12 260770.78 52813.294 8000 + 1e-06 37100 12 256294.93 52703.248 8000 + 1e-06 37200 12 251520.81 52496.031 8000 + 1e-06 37300 12 246514.92 52198.643 8000 + 1e-06 37400 12 241336.35 51838.499 8000 + 1e-06 37500 12 236051.19 51466.475 8000 + 1e-06 37600 12 230530.99 51158.037 8000 + 1e-06 37700 12 224831.9 51005.878 8000 + 1e-06 37800 12 219195 51087.112 8000 + 1e-06 37900 12 213774.51 51464.55 8000 + 1e-06 38000 12 208719.8 52178.179 8000 + 1e-06 38100 12 204173.16 53238.452 8000 + 1e-06 38200 12 200268.52 54621.477 8000 + 1e-06 38300 12 197150.81 56266.704 8000 + 1e-06 38400 12 194900.92 58092.885 8000 + 1e-06 38500 12 193569.8 59999.47 8000 + 1e-06 38600 12 193173.44 61875.452 8000 + 1e-06 38700 12 193689.15 63611.808 8000 + 1e-06 38800 12 195056.93 65114.049 8000 + 1e-06 38900 12 197179.13 66310.945 8000 + 1e-06 39000 12 199964.06 67173.129 8000 + 1e-06 39100 12 203313.78 67704.561 8000 + 1e-06 39200 12 206537.34 67923.159 8000 + 1e-06 39300 12 209698.91 67870.023 8000 + 1e-06 39400 12 212990.74 67598.734 8000 + 1e-06 39500 12 216350.18 67172.426 8000 + 1e-06 39600 12 219678.83 66655.657 8000 + 1e-06 39700 12 222844.21 66084.261 8000 + 1e-06 39800 12 225879.54 65489.967 8000 + 1e-06 39900 12 228750 64901.658 8000 + 1e-06 40000 12 231432.52 64333.74 8000 + 1e-06 40100 12 233916.24 63787.895 8000 + 1e-06 40200 12 236200.24 63256.3 8000 + 1e-06 40300 12 238290.68 62725.161 8000 + 1e-06 40400 12 240198.17 62177.851 8000 + 1e-06 40500 12 241937.05 61597.51 8000 + 1e-06 40600 12 243521.73 60967.618 8000 + 1e-06 40700 12 244888.47 60271.31 8000 + 1e-06 40800 12 245447.64 59435.777 8000 + 1e-06 40900 12 245685.9 58426.609 8000 + 1e-06 41000 12 245713.15 57255.612 8000 + 1e-06 41100 12 245574.53 55939.057 8000 + 1e-06 41200 12 245295.74 54497.409 8000 + 1e-06 41300 12 244893.38 52955.91 8000 + 1e-06 41400 12 244382.52 51349.735 8000 + 1e-06 41500 12 243831.69 49814.42 8000 + 1e-06 41600 12 243254.37 48400.984 8000 + 1e-06 41700 12 242477.85 47069.283 8000 + 1e-06 41800 12 241513.72 45827.072 8000 + 1e-06 41900 12 239756.07 44524.57 8000 + 1e-06 42000 12 237373.8 43055.987 8000 + 1e-06 42100 12 234744.81 41643.015 8000 + 1e-06 42200 12 231931.52 40312.339 8000 + 1e-06 42300 12 228935.92 39072.939 8000 + 1e-06 42400 12 225746.23 37930.778 8000 + 1e-06 42500 12 222348.89 36895.022 8000 + 1e-06 42600 12 218698.5 35981.801 8000 + 1e-06 42700 12 214647.12 35216.043 8000 + 1e-06 42800 12 210245.47 34620.785 8000 + 1e-06 42900 12 205531.71 34205.699 8000 + 1e-06 43000 12 200578.63 33994.95 8000 + 1e-06 43100 12 195456.13 33986.177 8000 + 1e-06 43200 12 190228.82 34157.583 8000 + 1e-06 43300 12 184952.07 34469.117 8000 + 1e-06 43400 12 179670.45 34866.761 8000 + 1e-06 43500 12 174418.49 35289.81 8000 + 1e-06 43600 12 169223.1 35679.916 8000 + 1e-06 43700 12 164106.46 35990.914 8000 + 1e-06 43800 12 159087.52 36198.071 8000 + 1e-06 43900 12 154186.33 36296.826 8000 + 1e-06 44000 12 149426.96 36300.354 8000 + 1e-06 44100 12 144835.14 36235.093 8000 + 1e-06 44200 12 140411 36133.354 8000 + 1e-06 44300 12 136182.81 36025.46 8000 + 1e-06 44400 12 132191.02 35932.385 8000 + 1e-06 44500 12 128477.69 35860.362 8000 + 1e-06 44600 12 125084.47 35799.083 8000 + 1e-06 44700 12 122052.38 35722.674 8000 + 1e-06 44800 12 119423.36 35591.653 8000 + 1e-06 44900 12 117231.38 35361.568 8000 + 1e-06 45000 12 115498.71 34993.601 8000 + 1e-06 45100 12 114234.68 34464.293 8000 + 1e-06 45200 12 113435.12 33772.471 8000 + 1e-06 45300 12 113082.91 32941.872 8000 + 1e-06 45400 12 113268.89 32017.499 8000 + 1e-06 45500 12 114094.16 31061.868 8000 + 1e-06 45600 12 115590.36 30141.335 8000 + 1e-06 45700 12 117815.57 29316.931 8000 + 1e-06 45800 12 120811.47 28631.895 8000 + 1e-06 45900 12 124575.14 28113.464 8000 + 1e-06 46000 12 129078.74 27763.791 8000 + 1e-06 46100 12 134338.42 27558.943 8000 + 1e-06 46200 12 140371.84 27456.007 8000 + 1e-06 46300 12 147179.46 27401.261 8000 + 1e-06 46400 12 154720.12 27350.633 8000 + 1e-06 46500 12 162903.78 27280.725 8000 + 1e-06 46600 12 171569.61 27160.074 8000 + 1e-06 46700 12 180503.28 26959.29 8000 + 1e-06 46800 12 189437.05 26679.422 8000 + 1e-06 46900 12 198196.23 26336.443 8000 + 1e-06 47000 12 206520.98 25964.312 8000 + 1e-06 47100 12 214102.44 25606.132 8000 + 1e-06 47200 12 220554.38 25312.112 8000 + 1e-06 47300 12 225530.25 25128.211 8000 + 1e-06 47400 12 228814.64 25087.25 8000 + 1e-06 47500 12 230374.48 25204.456 8000 + 1e-06 47600 12 230169.61 25476.535 8000 + 1e-06 47700 12 228279.91 25884.284 8000 + 1e-06 47800 12 224903.35 26398.057 8000 + 1e-06 47900 12 220331.08 26984.898 8000 + 1e-06 48000 12 214896.98 27615.915 8000 + 1e-06 48100 12 208954.59 28272.416 8000 + 1e-06 48200 12 202876.52 28949.711 8000 + 1e-06 48300 12 197002.89 29657.821 8000 + 1e-06 48400 12 191715.64 30417.951 8000 + 1e-06 48500 12 187427.74 31259.165 8000 + 1e-06 48600 12 184340.37 32206.982 8000 + 1e-06 48700 12 182293.26 33278.236 8000 + 1e-06 48800 12 181185.81 34481.276 8000 + 1e-06 48900 12 181101.89 35801.056 8000 + 1e-06 49000 12 182147.18 37201.316 8000 + 1e-06 49100 12 184365.23 38617.38 8000 + 1e-06 49200 12 187357.35 39915.206 8000 + 1e-06 49300 12 190910.82 40926.844 8000 + 1e-06 49400 12 195007.02 41662.043 8000 + 1e-06 49500 12 199572.66 42126.903 8000 + 1e-06 49600 12 204382.72 42280.987 8000 + 1e-06 49700 12 209699.49 42088.752 8000 + 1e-06 49800 12 215597.68 41583.342 8000 + 1e-06 49900 12 222033.85 40867.693 8000 +Loop time of 1.45978 on 1 procs for 49900 steps with 12 atoms -99.7% CPU use with 1 MPI tasks x no OpenMP threads +99.5% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.015815 | 0.015815 | 0.015815 | 0.0 | 3.77 -Neigh | 1.795e-05 | 1.795e-05 | 1.795e-05 | 0.0 | 0.00 -Comm | 0.0015216 | 0.0015216 | 0.0015216 | 0.0 | 0.36 -Output | 0.0024194 | 0.0024194 | 0.0024194 | 0.0 | 0.58 -Modify | 0.3932 | 0.3932 | 0.3932 | 0.0 | 93.81 -Other | | 0.006155 | | | 1.47 +Pair | 0.34189 | 0.34189 | 0.34189 | 0.0 | 23.42 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.0023579 | 0.0023579 | 0.0023579 | 0.0 | 0.16 +Output | 0.0038476 | 0.0038476 | 0.0038476 | 0.0 | 0.26 +Modify | 1.1002 | 1.1002 | 1.1002 | 0.0 | 75.37 +Other | | 0.01145 | | | 0.78 -Nlocal: 0 ave 0 max 0 min +Nlocal: 12 ave 12 max 12 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 0 ave 0 max 0 min +Neighs: 66 ave 66 max 66 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 0 -Neighbor list builds = 6 +Total # of neighbors = 66 +Ave neighs/atom = 5.5 +Neighbor list builds = 0 Dangerous builds = 0 -Total wall time: 0:00:00 +Total wall time: 0:00:01 diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 1c62c92c76..a171f70654 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -190,6 +190,8 @@ void GranSubModDampingMDR::init() { if (gm->normal_model->name != "mdr") error->all(FLERR, "Damping mdr can only be used with mdr normal model"); + + damp = gm->normal_model->get_damp(); } /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index 5683f54fc2..9eb30e2a0e 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -807,10 +807,8 @@ double GranSubModNormalMDR::calculate_forces() F_MDR = calculate_nonadhesive_mdr_force(deltae1D, Ainv, Eeff, A, B); } - if (std::isnan(F_MDR)) { - printf("itag = %d, jtag = %d \n", itag_true, jtag_true); - error->one(FLERR, "F_MDR is NaN, case 1: no tensile springs"); - } + if (std::isnan(F_MDR)) + error->one(FLERR, "F_MDR is NaN, case 1: no tensile springs for atoms {} and {}", itag_true, jtag_true); if (history_update) *aAdh_offset = a_fac * a_na; } else { From 319e14c8e300e76135cbb2baf1db29bdd2bf9553 Mon Sep 17 00:00:00 2001 From: Gabriel Alkuino <107645552+gsalkuin@users.noreply.github.com> Date: Mon, 7 Apr 2025 18:28:33 -0400 Subject: [PATCH 26/94] Update atom->quat in fix_rigid.cpp --- src/RIGID/fix_rigid.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index b0c6d46ee4..95c274e8e3 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -1516,6 +1516,11 @@ void FixRigid::set_xv() MathExtra::omega_to_angmom(omega[ibody],exone,eyone,ezone, inertiaatom,angmom_one[i]); } + if (atom->quat_flag) { + quatatom = atom->quat[i]; + MathExtra::quatquat(quat[ibody],orient[i],quatatom); + MathExtra::qnormalize(quatatom); + } if (eflags[i] & DIPOLE) { MathExtra::quat_to_mat(quat[ibody],p); MathExtra::matvec(p,dorient[i],mu[i]); @@ -1713,7 +1718,7 @@ void FixRigid::setup_bodies_static() } // grow extended arrays and set extended flags for each particle - // orientflag = 4 if any particle stores ellipsoid or tri orientation + // orientflag = 4 if any particle stores ellipsoid or tri orientation or quat // orientflag = 1 if any particle stores line orientation // dorientflag = 1 if any particle stores dipole orientation @@ -1721,6 +1726,7 @@ void FixRigid::setup_bodies_static() if (atom->ellipsoid_flag) orientflag = 4; if (atom->line_flag) orientflag = 1; if (atom->tri_flag) orientflag = 4; + if (atom->quat_flag) orientflag = 4; if (atom->mu_flag) dorientflag = 1; grow_arrays(atom->nmax); @@ -2061,7 +2067,12 @@ void FixRigid::setup_bodies_static() ez_space[ibody],delta,displace[i]); if (extended) { - if (eflags[i] & ELLIPSOID) { + if (atom->quat_flag) { + quatatom = atom->quat[i]; + MathExtra::qconjugate(quat[ibody],qc); + MathExtra::quatquat(qc,quatatom,orient[i]); + MathExtra::qnormalize(orient[i]); + } else if (eflags[i] & ELLIPSOID) { quatatom = ebonus[ellipsoid[i]].quat; MathExtra::qconjugate(quat[ibody],qc); MathExtra::quatquat(qc,quatatom,orient[i]); From 641d496d4b075b9feeb08006af5b08d53fbe864e Mon Sep 17 00:00:00 2001 From: talinke Date: Mon, 7 Apr 2025 17:36:48 -0700 Subject: [PATCH 27/94] Refined keyword options --- src/EXTRA-FIX/fix_langevin_gjf.cpp | 706 +++++++++++++++++++++++++++++ src/EXTRA-FIX/fix_langevin_gjf.h | 85 ++++ 2 files changed, 791 insertions(+) create mode 100644 src/EXTRA-FIX/fix_langevin_gjf.cpp create mode 100644 src/EXTRA-FIX/fix_langevin_gjf.h diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp new file mode 100644 index 0000000000..7f38a4d201 --- /dev/null +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -0,0 +1,706 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Tim Linke & Niels Gronbech-Jensen (UC Davis) +------------------------------------------------------------------------- */ + +#include "fix_langevin.h" + +#include "atom.h" +#include "atom_vec_ellipsoid.h" +#include "comm.h" +#include "compute.h" +#include "error.h" +#include "force.h" +#include "group.h" +#include "input.h" +#include "math_extra.h" +#include "memory.h" +#include "modify.h" +#include "random_mars.h" +#include "respa.h" +#include "update.h" +#include "variable.h" + +#include +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +enum { NOBIAS, BIAS }; +enum { CONSTANT, EQUAL, ATOM }; + +/* ---------------------------------------------------------------------- */ + +FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), gjfflag(0), gfactor1(nullptr), gfactor2(nullptr), ratio(nullptr), + tstr(nullptr), flangevin(nullptr), tforce(nullptr), lv(nullptr), id_temp(nullptr), random(nullptr) +{ + if (narg < 8) error->all(FLERR, "Illegal fix langevin/gjf command"); + + time_integrate = 1; + restart_peratom = 1; + // dynamic_group_allow = 1; + // scalar_flag = 1; + // global_freq = 1; + // extscalar = 1; + // ecouple_flag = 1; + nevery = 1; + + if (utils::strmatch(arg[3], "^v_")) { + tstr = utils::strdup(arg[3] + 2); + } else { + t_start = utils::numeric(FLERR, arg[3], false, lmp); + t_target = t_start; + tstyle = CONSTANT; + } + + t_stop = utils::numeric(FLERR, arg[4], false, lmp); + t_period = utils::numeric(FLERR, arg[5], false, lmp); + seed = utils::inumeric(FLERR, arg[6], false, lmp); + + if (t_period <= 0.0) error->all(FLERR, "Fix langevin/gjf period must be > 0.0"); + if (seed <= 0) error->all(FLERR, "Illegal fix langevin/gjf command"); + + // initialize Marsaglia RNG with processor-unique seed + + random = new RanMars(lmp, seed + comm->me); + + // allocate per-type arrays for force prefactors + + // gfactor1 = new double[atom->ntypes + 1]; + // gfactor2 = new double[atom->ntypes + 1]; + // ratio = new double[atom->ntypes + 1]; + int GJmethods = 8 // number of currently implemented GJ methods + + // optional args + + for (int i = 1; i <= atom->ntypes; i++) ratio[i] = 1.0; + osflag = 0; + GJmethod = 0; + + int iarg = 7; + while (iarg < narg) { + if (strcmp(arg[iarg], "vel") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix langevin/gjf command"); + if (strcmp(arg[iarg + 1], "vfull") == 0) { + osflag = 1; + } else if (strcmp(arg[iarg + 1], "vhalf") == 0) { + osflag = 0; + } else + error->all(FLERR, "Illegal fix langevin/gjf command"); + iarg += 2; + } else if (strcmp(arg[iarg], "method") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix langevin/gjf command"); + GJmethod = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + if (GJmethod <= 0 || GJmethod > GJmethods) error->all(FLERR, "Invalid GJ method choice in langevin/gjf command"); + iarg += 2; + } else + error->all(FLERR, "Illegal fix langevin/gjf command"); + } + + // set temperature = nullptr, user can override via fix_modify if wants bias + + id_temp = nullptr; + temperature = nullptr; + + energy = 0.0; + + // flangevin is unallocated until first call to setup() + // compute_scalar checks for this and returns 0.0 + // if flangevin_allocated is not set + + flangevin = nullptr; + flangevin_allocated = 0; + lv = nullptr; + tforce = nullptr; + maxatom1 = maxatom2 = 0; + + // setup atom-based array for lv + // register with Atom class + // no need to set peratom_flag, b/c data is for internal use only + + + FixLangevin::grow_arrays(atom->nmax); + atom->add_callback(Atom::GROW); + + // initialize lv to zero + + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) { + lv[i][0] = 0.0; + lv[i][1] = 0.0; + lv[i][2] = 0.0; + } +} + +/* ---------------------------------------------------------------------- */ + +FixLangevin::~FixLangevin() +{ + if (copymode) return; + + delete random; + delete[] tstr; + delete[] gfactor1; + delete[] gfactor2; + delete[] ratio; + delete[] id_temp; + memory->destroy(flangevin); + memory->destroy(tforce); + + memory->destroy(lv); + if (modify->get_fix_by_id(id)) atom->delete_callback(id, Atom::GROW); +} + +/* ---------------------------------------------------------------------- */ + +int FixLangevin::setmask() +{ + int mask = 0; + mask |= INITIAL_INTEGRATE; + mask |= FINAL_INTEGRATE; + mask |= END_OF_STEP; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixLangevin::init() +{ + if (id_temp) { + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) { + error->all(FLERR, "Temperature compute ID {} for fix {} does not exist", id_temp, style); + } else { + if (temperature->tempflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute temperature", id_temp, style); + } + } + // check variable + + if (tstr) { + tvar = input->variable->find(tstr); + if (tvar < 0) error->all(FLERR, "Variable name {} for fix langevin does not exist", tstr); + if (input->variable->equalstyle(tvar)) + tstyle = EQUAL; + else if (input->variable->atomstyle(tvar)) + tstyle = ATOM; + else + error->all(FLERR, "Variable {} for fix langevin is invalid style", tstr); + } + + // set force prefactors + + if (!atom->rmass) { + for (int i = 1; i <= atom->ntypes; i++) { + gfactor1[i] = -atom->mass[i] / t_period / force->ftm2v; + gfactor2[i] = sqrt(atom->mass[i]) / force->ftm2v; + gfactor2[i] *= sqrt(2.0 * update->dt * force->boltz / t_period / force->mvv2e); // gjfflag + } + } + + if (temperature && temperature->tempbias) + tbiasflag = BIAS; + else + tbiasflag = NOBIAS; + + if (utils::strmatch(update->integrate_style, "^respa")) { + nlevels_respa = (static_cast(update->integrate))->nlevels; + if (gjfflag) error->all(FLERR, "Fix langevin gjf and run style respa are not compatible"); + } + + if (gjfflag) { + gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); + gjfc1 = 1.0 / (1.0 + update->dt / 2.0 / t_period); + } + + switch (GJmethod) { + case 1: + gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); + gjfc1 = 1.0 / (1.0 + update->dt / 2.0 / t_period); + break; + case 2: + // Insert logic for method 2 + break; + case 3: + // Insert logic for method 3 + break; + case 4: + // Insert logic for method 4 + break; + case 5: + // Insert logic for method 5 + break; + case 6: + // Insert logic for method 6 + break; + case 7: + // Insert logic for method 7 + break; + case 8: + // Insert logic for method 8 + break; + default: + error->all(FLERR, "Fix langevin/gjf method not found"); + break; +} +} + +/* ---------------------------------------------------------------------- + integrate position and velocity according to the GJF method + in Grønbech-Jensen, J Stat Phys 191, 137 (2024). The general workflow is + 1. Langevin GJF Initial Integration + 2. Force Update + 3. Langevin GJF Final Integration + 4. Velocity Choice in end_of_step() +------------------------------------------------------------------------- */ + +void FixLangevin::initial_integrate(int /* vflag */) +{ + double gamma1,gamma2; + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double *mass = atom->mass; + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + double fran[3]; + + double boltz = force->boltz; + double dt = update->dt; + double mvv2e = force->mvv2e; + double ftm2v = force->ftm2v; + + double dtf = 0.5 * dt * ftm2v; + double dtfm; + double c1sqrt = sqrt(gjfc1); + + // NVE integrates position and velocity according to Eq. 8a, 8b + // This function embeds the GJF formulation into the NVE framework, which corresponds to the GJF case c1=c3. + + //NVE + if (rmass) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / rmass[i]; + v[i][0] += dtfm * f[i][0]; + v[i][1] += dtfm * f[i][1]; + v[i][2] += dtfm * f[i][2]; + x[i][0] += dt * v[i][0]; + x[i][1] += dt * v[i][1]; + x[i][2] += dt * v[i][2]; + } + + } else { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / mass[type[i]]; + v[i][0] += dtfm * f[i][0]; + v[i][1] += dtfm * f[i][1]; + v[i][2] += dtfm * f[i][2]; + x[i][0] += dt * v[i][0]; + x[i][1] += dt * v[i][1]; + x[i][2] += dt * v[i][2]; + } + } + + // The initial NVE integration should always use the on-site velocity. Therefore, a velocity correction + // must be done when using the half-step option. + //---------- + if (!osflag) { + if (rmass) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / rmass[i]; + // Undo NVE integration + x[i][0] -= dt * v[i][0]; + x[i][1] -= dt * v[i][1]; + x[i][2] -= dt * v[i][2]; + // Obtain Eq. 24a. lv[][] stores on-site velocity from previous timestep + v[i][0] = lv[i][0] + dtfm * f[i][0]; + v[i][1] = lv[i][1] + dtfm * f[i][1]; + v[i][2] = lv[i][2] + dtfm * f[i][2]; + // Redo NVE integration with correct velocity + x[i][0] += dt * v[i][0]; + x[i][1] += dt * v[i][1]; + x[i][2] += dt * v[i][2]; + } + + } else { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / mass[type[i]]; + // Undo NVE integration + x[i][0] -= dt * v[i][0]; + x[i][1] -= dt * v[i][1]; + x[i][2] -= dt * v[i][2]; + // Obtain Eq. 24a. lv[][] stores on-site velocity from previous timestep + v[i][0] = lv[i][0] + dtfm * f[i][0]; + v[i][1] = lv[i][1] + dtfm * f[i][1]; + v[i][2] = lv[i][2] + dtfm * f[i][2]; + // Redo NVE integration with correct velocity + x[i][0] += dt * v[i][0]; + x[i][1] += dt * v[i][1]; + x[i][2] += dt * v[i][2]; + } + } + } + //---------- + + compute_target(); + + if (tbiasflag == BIAS) temperature->compute_scalar(); + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + if (tstyle == ATOM) tsqrt = sqrt(tforce[i]); + if (rmass) { + gamma2 = sqrt(rmass[i]) * sqrt(2.0*dt*boltz/t_period/mvv2e) / ftm2v; + gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; + } else { + gamma2 = gfactor2[type[i]] * tsqrt; + } + fran[0] = gamma2*random->gaussian(); + fran[1] = gamma2*random->gaussian(); + fran[2] = gamma2*random->gaussian(); + + // NVE integrator delivers Eq. 24a, but also overshoots position integration. Calculate Eq. 24b: + x[i][0] -= 0.5 * dt * v[i][0]; + x[i][1] -= 0.5 * dt * v[i][1]; + x[i][2] -= 0.5 * dt * v[i][2]; + // Calculate Eq. 24c: + if (tbiasflag == BIAS) + temperature->remove_bias(i,v[i]); + if (rmass) { + lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c1sqrt / (2.0 * rmass[i])) * fran[0]; + lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c1sqrt / (2.0 * rmass[i])) * fran[1]; + lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c1sqrt / (2.0 * rmass[i])) * fran[2]; + } else { + lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c1sqrt / (2.0 * mass[type[i]])) * fran[0]; + lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c1sqrt / (2.0 * mass[type[i]])) * fran[1]; + lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c1sqrt / (2.0 * mass[type[i]])) * fran[2]; + } + if (tbiasflag == BIAS) + temperature->restore_bias(i,v[i]); + if (tbiasflag == BIAS) + temperature->restore_bias(i,lv[i]); + + // Calculate Eq. 24d + if (tbiasflag == BIAS) temperature->remove_bias(i, lv[i]); + if (atom->rmass) { + v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * (0.5 / rmass[i]) * fran[0]; + v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * (0.5 / rmass[i]) * fran[1]; + v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * (0.5 / rmass[i]) * fran[2]; + } else { + v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * (0.5 / mass[type[i]]) * fran[0]; + v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * (0.5 / mass[type[i]]) * fran[1]; + v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * (0.5 / mass[type[i]]) * fran[2]; + } + if (tbiasflag == BIAS) temperature->restore_bias(i, lv[i]); + // Calculate Eq. 24e. NVE integrator then calculates Eq. 24f. + x[i][0] += 0.5 * dt * v[i][0]; + x[i][1] += 0.5 * dt * v[i][1]; + x[i][2] += 0.5 * dt * v[i][2]; + } + } +} + +void FixLangevin::final_integrate() +{ + double dtfm; + double dt = update->dt; + double ftm2v = force->ftm2v; + double dtf = 0.5 * dt * ftm2v; + + // update v of atoms in group + + double **v = atom->v; + double **f = atom->f; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + if (rmass) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / rmass[i]; + v[i][0] += dtfm * f[i][0]; + v[i][1] += dtfm * f[i][1]; + v[i][2] += dtfm * f[i][2]; + } + + } else { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / mass[type[i]]; + v[i][0] += dtfm * f[i][0]; + v[i][1] += dtfm * f[i][1]; + v[i][2] += dtfm * f[i][2]; + } + } +} + +/* ---------------------------------------------------------------------- + set current t_target and t_sqrt +------------------------------------------------------------------------- */ + +void FixLangevin::compute_target() +{ + int *mask = atom->mask; + int nlocal = atom->nlocal; + + double delta = update->ntimestep - update->beginstep; + if (delta != 0.0) delta /= update->endstep - update->beginstep; + + // if variable temp, evaluate variable, wrap with clear/add + // reallocate tforce array if necessary + + if (tstyle == CONSTANT) { + t_target = t_start + delta * (t_stop-t_start); + tsqrt = sqrt(t_target); + } else { + modify->clearstep_compute(); + if (tstyle == EQUAL) { + t_target = input->variable->compute_equal(tvar); + if (t_target < 0.0) + error->one(FLERR, "Fix langevin variable returned negative temperature"); + tsqrt = sqrt(t_target); + } else { + if (atom->nmax > maxatom2) { + maxatom2 = atom->nmax; + memory->destroy(tforce); + memory->create(tforce,maxatom2,"langevin:tforce"); + } + input->variable->compute_atom(tvar,igroup,tforce,1,0); + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + if (tforce[i] < 0.0) + error->one(FLERR, "Fix langevin variable returned negative temperature"); + } + modify->addstep_compute(update->ntimestep + 1); + } +} + +/* ---------------------------------------------------------------------- + tally energy transfer to thermal reservoir, select velocity for GJF +------------------------------------------------------------------------- */ + +void FixLangevin::end_of_step() +{ + double **v = atom->v; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + energy_onestep = 0.0; + + if (tallyflag) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + energy_onestep += flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + + flangevin[i][2]*v[i][2]; + } + + energy += energy_onestep*update->dt; + + // After the NVE integrator delivers 24f, either the on-site or half-step + // velocity is used in remaining simulation tasks, depending on user input + if (gjfflag && !osflag) { + double tmp[3]; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + // v is Eq. 24f + tmp[0] = v[i][0]; + tmp[1] = v[i][1]; + tmp[2] = v[i][2]; + // Move on with half-step velocity + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; + // store Eq. 24f in lv for next timestep + lv[i][0] = tmp[0]; + lv[i][1] = tmp[1]; + lv[i][2] = tmp[2]; + } + } +} + +// clang-format on +/* ---------------------------------------------------------------------- */ + +void FixLangevin::reset_target(double t_new) +{ + t_target = t_start = t_stop = t_new; +} + +/* ---------------------------------------------------------------------- */ + +void FixLangevin::reset_dt() +{ + if (atom->mass) { + for (int i = 1; i <= atom->ntypes; i++) { + gfactor2[i] = sqrt(atom->mass[i]) / force->ftm2v; + if (gjfflag) + gfactor2[i] *= sqrt(2.0 * update->dt * force->boltz / t_period / force->mvv2e); // sqrt(2*alpha*kT*dt) + else + gfactor2[i] *= sqrt(24.0 * force->boltz / t_period / update->dt / force->mvv2e); + gfactor2[i] *= 1.0 / sqrt(ratio[i]); + } + } + if (gjfflag) { + gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); + gjfc1 = 1.0 / (1.0 + update->dt / 2.0 / t_period); + } +} + +/* ---------------------------------------------------------------------- */ + +int FixLangevin::modify_param(int narg, char **arg) +{ + if (strcmp(arg[0], "temp") == 0) { + if (narg < 2) utils::missing_cmd_args(FLERR, "fix_modify", error); + delete[] id_temp; + id_temp = utils::strdup(arg[1]); + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR, "Could not find fix_modify temperature compute ID: {}", id_temp); + + if (temperature->tempflag == 0) + error->all(FLERR, "Fix_modify temperature compute {} does not compute temperature", id_temp); + if (temperature->igroup != igroup && comm->me == 0) + error->warning(FLERR, "Group for fix_modify temp != fix group: {} vs {}", + group->names[igroup], group->names[temperature->igroup]); + return 2; + } + return 0; +} + +/* ---------------------------------------------------------------------- */ + +double FixLangevin::compute_scalar() +{ + if (!tallyflag || !flangevin_allocated) return 0.0; + + // capture the very first energy transfer to thermal reservoir + + double **v = atom->v; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + if (update->ntimestep == update->beginstep) { + energy_onestep = 0.0; + if (!gjfflag) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + energy_onestep += + flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + flangevin[i][2] * v[i][2]; + energy = 0.5 * energy_onestep * update->dt; + } else { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + if (tbiasflag) temperature->remove_bias(i, lv[i]); + energy_onestep += + flangevin[i][0] * lv[i][0] + flangevin[i][1] * lv[i][1] + flangevin[i][2] * lv[i][2]; + if (tbiasflag) temperature->restore_bias(i, lv[i]); + } + energy = -0.5 * energy_onestep * update->dt; + } + } + + // convert midstep energy back to previous fullstep energy + + double energy_me = energy - 0.5 * energy_onestep * update->dt; + + double energy_all; + MPI_Allreduce(&energy_me, &energy_all, 1, MPI_DOUBLE, MPI_SUM, world); + return -energy_all; +} + +/* ---------------------------------------------------------------------- + extract thermostat properties +------------------------------------------------------------------------- */ + +void *FixLangevin::extract(const char *str, int &dim) +{ + dim = 0; + if (strcmp(str, "t_target") == 0) { return &t_target; } + return nullptr; +} + +/* ---------------------------------------------------------------------- + memory usage of tally array +------------------------------------------------------------------------- */ + +double FixLangevin::memory_usage() +{ + double bytes = 0.0; + if (gjfflag) bytes += (double) atom->nmax * 3 * sizeof(double); + if (tallyflag || osflag) bytes += (double) atom->nmax * 3 * sizeof(double); + if (tforce) bytes += (double) atom->nmax * sizeof(double); + return bytes; +} + +/* ---------------------------------------------------------------------- + allocate atom-based array for lv +------------------------------------------------------------------------- */ + +void FixLangevin::grow_arrays(int nmax) +{ + memory->grow(lv, nmax, 3, "fix_langevin:lv"); +} + +/* ---------------------------------------------------------------------- + copy values within local atom-based array +------------------------------------------------------------------------- */ + +void FixLangevin::copy_arrays(int i, int j, int /*delflag*/) +{ + lv[j][0] = lv[i][0]; + lv[j][1] = lv[i][1]; + lv[j][2] = lv[i][2]; +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based array for exchange with another proc +------------------------------------------------------------------------- */ + +int FixLangevin::pack_exchange(int i, double *buf) +{ + int n = 0; + buf[n++] = lv[i][0]; + buf[n++] = lv[i][1]; + buf[n++] = lv[i][2]; + return n; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based array from exchange with another proc +------------------------------------------------------------------------- */ + +int FixLangevin::unpack_exchange(int nlocal, double *buf) +{ + int n = 0; + lv[nlocal][0] = buf[n++]; + lv[nlocal][1] = buf[n++]; + lv[nlocal][2] = buf[n++]; + return n; +} diff --git a/src/EXTRA-FIX/fix_langevin_gjf.h b/src/EXTRA-FIX/fix_langevin_gjf.h new file mode 100644 index 0000000000..c54772c457 --- /dev/null +++ b/src/EXTRA-FIX/fix_langevin_gjf.h @@ -0,0 +1,85 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(langevin,FixLangevin); +// clang-format on +#else + +#ifndef LMP_FIX_LANGEVIN_H +#define LMP_FIX_LANGEVIN_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixLangevin : public Fix { + public: + FixLangevin(class LAMMPS *, int, char **); + ~FixLangevin() override; + int setmask() override; + void init() override; + void setup(int) override; + void initial_integrate(int) override; + void post_force(int) override; + void post_force_respa(int, int, int) override; + void end_of_step() override; + void reset_target(double) override; + void reset_dt() override; + int modify_param(int, char **) override; + double compute_scalar() override; + double memory_usage() override; + void *extract(const char *, int &) override; + void grow_arrays(int) override; + void copy_arrays(int, int, int) override; + int pack_exchange(int, double *) override; + int unpack_exchange(int, double *) override; + + protected: + int osflag, GJmethod; + int flangevin_allocated; + double t_start, t_stop, t_period, t_target; + double *gfactor1, *gfactor2, *ratio; + double energy, energy_onestep; + double tsqrt; + double gjfc1, gjfc2; + int tstyle, tvar; + char *tstr; + + class AtomVecEllipsoid *avec; + + int maxatom1, maxatom2; + double **flangevin; + double *tforce; + double **lv; //half step velocity + + char *id_temp; + class Compute *temperature; + + int nlevels_respa; + class RanMars *random; + int seed; + + template + void post_force_templated(); + + void omega_thermostat(); + void angmom_thermostat(); + void compute_target(); +}; + +} // namespace LAMMPS_NS + +#endif +#endif From 7643c901ebbf8309916f024cfb72e738d323ae38 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Mon, 7 Apr 2025 22:57:29 -0400 Subject: [PATCH 28/94] cleaned mdr damping and updated velocity damping for mdr use --- doc/src/pair_granular.rst | 22 ++++++++++++---------- examples/granular/in.tableting.200 | 2 +- src/GRANULAR/gran_sub_mod_damping.cpp | 13 +++++++++++-- src/GRANULAR/gran_sub_mod_normal.cpp | 10 +++++----- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 9804c90cef..6e17d604fd 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -89,7 +89,7 @@ and their required arguments are: 4. *dmt* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` 5. *jkr* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` 6. *mdr* : :math:`E`, :math:`\nu`, :math:`Y`, :math:`\Delta\gamma`, -:math:`\psi_b`, :math:`\eta_{n0}` + :math:`\psi_b`, :math:`\eta_{n0}` Here, :math:`k_n` is spring stiffness (with units that depend on model choice, see below); :math:`\eta_{n0}` is a damping prefactor (or, in its @@ -178,8 +178,9 @@ two-part series :ref:`Zunker and Kamrin Part I ` and :ref:`Zunker and Kamrin Part II `. Further development and demonstrations of its application to industrially relevant powder compaction processes are presented in :ref:`Zunker et al. `. -If you use the *mdr* normal model, is recommended you use the *mdr* damping model -described below. +If you use the *mdr* normal model, the default, and recommended damping model is +the *mdr* damping model described below. The other currently supported damping model +for the *mdr* normal model is *velocity*, all others will result in an error. The model requires the following inputs: @@ -203,8 +204,8 @@ The model requires the following inputs: triggered. Lower values of :math:`\psi_b` delay the onset of the bulk elastic response. - 6. *Coefficient of restitution* :math:`0 \le e \le 1` : The coefficient of - restitution is a tunable parameter that controls damping in the normal direction. + 6. *Damping coefficent* :math:`\eta_{n0} \ge 0` : The damping coefficient + is a tunable parameter that controls damping in the normal direction. .. note:: @@ -216,7 +217,7 @@ The *mdr* model produces a nonlinear force-displacement response, therefore the critical timestep :math:`\Delta t` depends on the inputs and level of deformation. As a conservative starting point the timestep can be assumed to be dictated by the bulk elastic response such that -:math:`\Delta t = 0.35\sqrt{m/k_\textrm{bulk}}`, where :math:`m` is the mass of +:math:`\Delta t = 0.08\sqrt{m/k_\textrm{bulk}}`, where :math:`m` is the mass of the smallest particle and :math:`k_\textrm{bulk} = \kappa R_\textrm{min}` is an effective stiffness related to the bulk elastic response. Here, :math:`\kappa = E/(3(1-2\nu))` is the bulk modulus and @@ -334,7 +335,8 @@ for the damping model currently supported are: *mdr* contact model is defined. If the *damping* keyword is not specified, the *viscoelastic* model is -used by default. +used by default. The exception is when the normal model is set +to *mdr* then the *mdr* damping model will be used by default. For *damping velocity*, the normal damping is simply equal to the user-specified damping coefficient in the *normal* model: @@ -344,7 +346,7 @@ user-specified damping coefficient in the *normal* model: \eta_n = \eta_{n0} Here, :math:`\eta_{n0}` is the damping coefficient specified for the normal -contact model, in units of *mass*\ /\ *time*\ . +contact model, in units of *mass*\ /\ *time*\ . For *damping mass_velocity*, the normal damping is given by: @@ -1082,8 +1084,8 @@ a bulk elastic response. Journal of the Mechanics and Physics of Solids, **(Zunker et al, 2025)** Zunker, W., Dunatunga, S., Thakur, S., Tang, P., & Kamrin, K. (2025). Experimentally validated DEM for large -deformation powder compaction: mechanically-derived contact model and -screening of non-physical contacts. +deformation powder compaction: Mechanically-derived contact model and +screening of non-physical contacts. Powder Technology, 120972. .. _Luding2008: diff --git a/examples/granular/in.tableting.200 b/examples/granular/in.tableting.200 index b9443cc36d..d1ecc28aa1 100644 --- a/examples/granular/in.tableting.200 +++ b/examples/granular/in.tableting.200 @@ -34,7 +34,7 @@ variable YieldStress equal 1.9e5 variable PoissonsRatio equal 0.4 variable SurfaceEnergy equal 2 variable SurfaceEnergyWall equal 0.0 -variable damp equal 1.0 +variable damp equal 0.2 variable psi_b equal 0.5 # linear_history = k_t, x_gammat, mu_s diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index a171f70654..13041b1a0b 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -77,7 +77,17 @@ GranSubModDampingVelocity::GranSubModDampingVelocity(GranularModel *gm, LAMMPS * double GranSubModDampingVelocity::calculate_forces() { - damp_prefactor = damp; + if (gm->normal_model->name == "mdr") { + using namespace Granular_MDR_NS; + double *history = & gm->history[gm->normal_model->history_index]; + if (history[DAMP_SCALE] == 0.0) { + damp_prefactor == 0.0; + } else { + damp_prefactor = damp; + } + } else { + damp_prefactor = damp; + } return -damp_prefactor * gm->vnnr; } @@ -181,7 +191,6 @@ void GranSubModDampingCoeffRestitution::init() GranSubModDampingMDR::GranSubModDampingMDR(GranularModel *gm, LAMMPS *lmp) : GranSubModDamping(gm, lmp) { - contact_radius_flag = 1; } /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index 9eb30e2a0e..ec75fd2f71 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -73,8 +73,9 @@ static const char cite_mdr[] = " author = {Zunker, William and Dunatunga, Sachith and Thakur, Subhash and Tang, Pingjun and Kamrin, Ken},\n" " title = {Experimentally validated DEM for large deformation powder compaction:\n" " mechanically-derived contact model and screening of non-physical contacts},\n" + " journal = {Powder Technology},\n" " year = {2025},\n" - " journal = {engrXiv},\n" + " pages = {120972},\n" "}\n\n"; /* ---------------------------------------------------------------------- @@ -958,19 +959,18 @@ double GranSubModNormalMDR::calculate_forces() double damp_scale; if (gm->contact_type != PAIR) { a_damp = a_damp/2.0; - damp_scale = 0.5*sqrt(gm->meff * 2.0 * Eeff2particle * a_damp); + damp_scale = sqrt(gm->meff * 2.0 * Eeff2particle * a_damp); double *deltao_offset = &history[DELTAO_0]; const double wfm = std::exp(10.7*(*deltao_offset)/Rinitial[gm->i] - 10.0) + 1.0; // wall force magnifier - //const double wfm = 1.0; F = wij * F0 * wfm; } else { - damp_scale = 0.5*sqrt(gm->meff * 2.0 * Eeff * a_damp); + damp_scale = sqrt(gm->meff * 2.0 * Eeff * a_damp); F = wij * (F0 + F1) * 0.5; } if (history_update) { double *damp_scale_offset = & history[DAMP_SCALE]; - (a_damp < 0.0) ? *damp_scale_offset = 0.0 : *damp_scale_offset = damp_scale; + (a_damp <= 0.0) ? *damp_scale_offset = 0.0 : *damp_scale_offset = damp_scale; } return F; From 586d24f5efed3ec5e2b8b1ff6bbd08ec8fc3b124 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Mon, 7 Apr 2025 23:02:00 -0400 Subject: [PATCH 29/94] whitespace --- doc/src/pair_granular.rst | 2 +- src/GRANULAR/gran_sub_mod_damping.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 6e17d604fd..8cd8e04af5 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -346,7 +346,7 @@ user-specified damping coefficient in the *normal* model: \eta_n = \eta_{n0} Here, :math:`\eta_{n0}` is the damping coefficient specified for the normal -contact model, in units of *mass*\ /\ *time*\ . +contact model, in units of *mass*\ /\ *time*\ . For *damping mass_velocity*, the normal damping is given by: diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 13041b1a0b..da9aa81079 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -85,7 +85,7 @@ double GranSubModDampingVelocity::calculate_forces() } else { damp_prefactor = damp; } - } else { + } else { damp_prefactor = damp; } return -damp_prefactor * gm->vnnr; From d6e9a6a44af5f00d9902e46e40488ddce0f6a554 Mon Sep 17 00:00:00 2001 From: Gabriel Alkuino <107645552+gsalkuin@users.noreply.github.com> Date: Tue, 8 Apr 2025 10:03:36 -0400 Subject: [PATCH 30/94] Update atom->quat in fix_rigid_small.cpp --- src/RIGID/fix_rigid_small.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 6ba2e5eb1c..d55b1fadd9 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1409,6 +1409,11 @@ void FixRigidSmall::set_xv() MathExtra::omega_to_angmom(b->omega,exone,eyone,ezone, inertiaatom,angmom[i]); } + if (atom->quat_flag) { + quatatom = atom->quat[i]; + MathExtra::quatquat(b->quat,orient[i],quatatom); + MathExtra::qnormalize(quatatom); + } if (eflags[i] & DIPOLE) { MathExtra::quat_to_mat(b->quat,p); MathExtra::matvec(p,dorient[i],mu[i]); @@ -1849,7 +1854,7 @@ void FixRigidSmall::setup_bodies_static() } // grow extended arrays and set extended flags for each particle - // orientflag = 4 if any particle stores ellipsoid or tri orientation + // orientflag = 4 if any particle stores ellipsoid or tri orientation or quat // orientflag = 1 if any particle stores line orientation // dorientflag = 1 if any particle stores dipole orientation @@ -1857,6 +1862,7 @@ void FixRigidSmall::setup_bodies_static() if (atom->ellipsoid_flag) orientflag = 4; if (atom->line_flag) orientflag = 1; if (atom->tri_flag) orientflag = 4; + if (atom->quat_flag) orientflag = 4; if (atom->mu_flag) dorientflag = 1; grow_arrays(atom->nmax); @@ -2209,7 +2215,12 @@ void FixRigidSmall::setup_bodies_static() delta,displace[i]); if (extended) { - if (eflags[i] & ELLIPSOID) { + if (atom->quat_flag) { + quatatom = atom->quat[i]; + MathExtra::qconjugate(b->quat,qc); + MathExtra::quatquat(qc,quatatom,orient[i]); + MathExtra::qnormalize(orient[i]); + } else if (eflags[i] & ELLIPSOID) { quatatom = ebonus[ellipsoid[i]].quat; MathExtra::qconjugate(b->quat,qc); MathExtra::quatquat(qc,quatatom,orient[i]); From 210cddd94e2fefefa48dbdee3814ddc4ee7a79a5 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Tue, 8 Apr 2025 18:32:45 -0400 Subject: [PATCH 31/94] working on adding damping types to mdr damping --- src/GRANULAR/gran_sub_mod_damping.cpp | 27 +++++++++++++++------------ src/GRANULAR/gran_sub_mod_damping.h | 1 + src/GRANULAR/gran_sub_mod_normal.cpp | 16 +++++++++------- src/GRANULAR/gran_sub_mod_normal.h | 2 ++ 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index da9aa81079..a5dc5745a4 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -45,6 +45,11 @@ GranSubModDamping::GranSubModDamping(GranularModel *gm, LAMMPS *lmp) : GranSubMo void GranSubModDamping::init() { damp = gm->normal_model->get_damp(); + if (gm->normal_model->name == "mdr") { + if (gm->tangential_model->name != "mdr") + error->all(FLERR, "Only damping mdr may be used with the mdr normal model"); + damp_type = gm->normal_model->get_damp_type(); + } } /* ---------------------------------------------------------------------- @@ -77,17 +82,7 @@ GranSubModDampingVelocity::GranSubModDampingVelocity(GranularModel *gm, LAMMPS * double GranSubModDampingVelocity::calculate_forces() { - if (gm->normal_model->name == "mdr") { - using namespace Granular_MDR_NS; - double *history = & gm->history[gm->normal_model->history_index]; - if (history[DAMP_SCALE] == 0.0) { - damp_prefactor == 0.0; - } else { - damp_prefactor = damp; - } - } else { - damp_prefactor = damp; - } + damp_prefactor = damp; return -damp_prefactor * gm->vnnr; } @@ -209,6 +204,14 @@ double GranSubModDampingMDR::calculate_forces() { using namespace Granular_MDR_NS; double *history = & gm->history[gm->normal_model->history_index]; - damp_prefactor = damp * history[DAMP_SCALE]; + if (damp_type == 1) { + damp_prefactor = damp * history[DAMP_SCALE]; + } else if (damp_type == 2) { + if (history[DAMP_SCALE] == 0.0) { + damp_prefactor == 0.0; + } else { + damp_prefactor = damp; + } + } return -damp_prefactor * gm->vnnr; } diff --git a/src/GRANULAR/gran_sub_mod_damping.h b/src/GRANULAR/gran_sub_mod_damping.h index cd7ee3bf1a..c73a4a8e5e 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -42,6 +42,7 @@ namespace Granular_NS { protected: double damp_prefactor; double damp; + int damp_type; }; /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index ec75fd2f71..ecf53ea24c 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -441,7 +441,7 @@ GranSubModNormalMDR::GranSubModNormalMDR(GranularModel *gm, LAMMPS *lmp) : { if (lmp->citeme) lmp->citeme->add(cite_mdr); - num_coeffs = 6; + num_coeffs = 7; contact_radius_flag = 1; size_history = 27; nsvector = 1; @@ -468,12 +468,13 @@ GranSubModNormalMDR::~GranSubModNormalMDR() void GranSubModNormalMDR::coeffs_to_local() { - E = coeffs[0]; // Young's modulus - nu = coeffs[1]; // Poisson's ratio - Y = coeffs[2]; // yield stress - gamma = coeffs[3]; // effective surface energy - psi_b = coeffs[4]; // bulk response trigger based on ratio of remaining free area: A_{free}/A_{total} - damp = coeffs[5]; // coefficent of restitution + E = coeffs[0]; // Young's modulus + nu = coeffs[1]; // Poisson's ratio + Y = coeffs[2]; // yield stress + gamma = coeffs[3]; // effective surface energy + psi_b = coeffs[4]; // bulk response trigger based on ratio of remaining free area: A_{free}/A_{total} + damp = coeffs[5]; // coefficent of restitution + damp_type = coeffs[6]; // damping type 1 = mdr or 2 = velocity if (E <= 0.0) error->all(FLERR, "Illegal MDR normal model, Young's modulus must be greater than 0"); if (nu < 0.0 || nu > 0.5) error->all(FLERR, "Illegal MDR normal model, Poisson's ratio must be between 0 and 0.5"); @@ -481,6 +482,7 @@ void GranSubModNormalMDR::coeffs_to_local() if (gamma < 0.0) error->all(FLERR, "Illegal MDR normal model, effective surface energy must be greater than or equal to 0"); if (psi_b < 0.0 || psi_b > 1.0) error->all(FLERR, "Illegal MDR normal model, psi_b must be between 0 and 1.0"); if (damp < 0.0) error->all(FLERR, "Illegal MDR normal model, damping coefficent must be greater than or equal to 0"); + if (damp_type != 1 && damp_type != 2) error->all(FLERR, "Illegal MDR normal model, damping type must an integer equal to 1 (mdr) or 2 (velocity)"); G = E / (2.0 * (1.0 + nu)); // shear modulus kappa = E / (3.0 * (1.0 - 2.0 * nu)); // bulk modulus diff --git a/src/GRANULAR/gran_sub_mod_normal.h b/src/GRANULAR/gran_sub_mod_normal.h index 8142d88cea..0b7bb664d5 100644 --- a/src/GRANULAR/gran_sub_mod_normal.h +++ b/src/GRANULAR/gran_sub_mod_normal.h @@ -41,6 +41,7 @@ namespace Granular_NS { int get_cohesive_flag() const { return cohesive_flag; } double get_damp() const { return damp; } + double get_damp_type() const { return damp_type; } double get_emod() const { return Emod; } double get_fncrit() const { return Fncrit; } int get_material_properties() const { return material_properties; } @@ -51,6 +52,7 @@ namespace Granular_NS { protected: double damp; // argument historically needed by damping // typically (but not always) equals eta_n0 + int damp_type; // damping type is only used by normal mdr model double Emod, poiss; double Fncrit; int material_properties, cohesive_flag; From 585565edb914060de90804e5e588067c3bc7c843 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Tue, 8 Apr 2025 20:33:28 -0400 Subject: [PATCH 32/94] corrected initialization of damp_type, error checks, doc changes, example script updates --- doc/src/pair_granular.rst | 38 +++++++++++++-------- examples/granular/in.tableting.200 | 7 ++-- examples/granular/in.triaxial.compaction.12 | 7 ++-- src/GRANULAR/gran_sub_mod_damping.cpp | 15 +++++--- src/GRANULAR/gran_sub_mod_normal.cpp | 2 +- 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 8cd8e04af5..696c87b0ab 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -44,7 +44,7 @@ Examples pair_coeff * * hertz 1000.0 50.0 tangential mindlin 1000.0 1.0 0.4 heat area 0.1 pair_style granular - pair_coeff * * mdr 5e6 0.4 1.9e5 2.0 0.5 0.5 tangential linear_history 940.0 0.0 0.7 rolling sds 2.7e5 0.0 0.6 damping mdr + pair_coeff * * mdr 5e6 0.4 1.9e5 2.0 0.5 0.5 tangential linear_history 940.0 0.0 0.7 rolling sds 2.7e5 0.0 0.6 damping mdr 1 Description """"""""""" @@ -89,7 +89,7 @@ and their required arguments are: 4. *dmt* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` 5. *jkr* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` 6. *mdr* : :math:`E`, :math:`\nu`, :math:`Y`, :math:`\Delta\gamma`, - :math:`\psi_b`, :math:`\eta_{n0}` + :math:`\psi_b`, :math:`\eta_{n0}`, :math:`d_{type}` Here, :math:`k_n` is spring stiffness (with units that depend on model choice, see below); :math:`\eta_{n0}` is a damping prefactor (or, in its @@ -178,9 +178,8 @@ two-part series :ref:`Zunker and Kamrin Part I ` and :ref:`Zunker and Kamrin Part II `. Further development and demonstrations of its application to industrially relevant powder compaction processes are presented in :ref:`Zunker et al. `. -If you use the *mdr* normal model, the default, and recommended damping model is -the *mdr* damping model described below. The other currently supported damping model -for the *mdr* normal model is *velocity*, all others will result in an error. +If you use the *mdr* normal model the only supported damping option is +the *mdr* damping class described below. The model requires the following inputs: @@ -207,6 +206,9 @@ The model requires the following inputs: 6. *Damping coefficent* :math:`\eta_{n0} \ge 0` : The damping coefficient is a tunable parameter that controls damping in the normal direction. + 7. *Damping type* :math:`d_{type} =` 1 or 2 : The damping type specfies the + damping model defined for the *mdr* damping class described below. + .. note:: The values for :math:`E`, :math:`\nu`, :math:`Y`, and :math:`\Delta\gamma` (i.e., @@ -329,14 +331,8 @@ for the damping model currently supported are: 5. *coeff_restitution* 6. *mdr* -.. note:: - - It is suggested to use the *mdr* damping model with when the normal - *mdr* contact model is defined. - If the *damping* keyword is not specified, the *viscoelastic* model is -used by default. The exception is when the normal model is set -to *mdr* then the *mdr* damping model will be used by default. +used by default. For *damping velocity*, the normal damping is simply equal to the user-specified damping coefficient in the *normal* model: @@ -423,8 +419,13 @@ the damping coefficient, it accurately reproduces the specified coefficient of restitution for both monodisperse and polydisperse particle pairs. This damping model is not compatible with cohesive normal models such as *JKR* or *DMT*. -The *mdr* damping model is only compatible with the normal *mdr* contact model. -It takes into account the contact stiffness :math:`k_{mdr}` calulated +The *mdr* damping class contains multiple damping models that can be toggled between +by specifying different integer values for the :math:`d_{type}` parameter in the *mdr* +normal model. This damping option is therefore only compatible with the normal *mdr* +contact model. + +Setting :math:`d_{type} = 1` is the suggested damping option. This specifies a damping +model that takes into account the contact stiffness :math:`k_{mdr}` calulated by the normal *mdr* contact model to determine the damping coefficent: .. math:: @@ -441,6 +442,15 @@ normal *mdr* contact model: In this case, :math:`\eta_{n0}` is simply a dimensionless coefficent that scales the the overall damping coefficent. +The other supported option is :math:`d_{type} = 2`, which defines a simple damping model +similar to the *velocity* option + +.. math:: + + \eta_n = \eta_{n0}, + +but has additional checks to avoid non-physical damping after plastic deformation. + The total normal force is computed as the sum of the elastic and damping components: diff --git a/examples/granular/in.tableting.200 b/examples/granular/in.tableting.200 index d1ecc28aa1..02eb6743de 100644 --- a/examples/granular/in.tableting.200 +++ b/examples/granular/in.tableting.200 @@ -34,8 +34,9 @@ variable YieldStress equal 1.9e5 variable PoissonsRatio equal 0.4 variable SurfaceEnergy equal 2 variable SurfaceEnergyWall equal 0.0 -variable damp equal 0.2 variable psi_b equal 0.5 +variable damp equal 0.2 +variable damp_type equal 1 # linear_history = k_t, x_gammat, mu_s variable kt equal 2/7*${YoungsModulus}*${atomRadius} @@ -49,7 +50,7 @@ variable mu_roll equal 0.6 variable k_roll equal 2.25*${mu_roll}*${mu_roll}*${YoungsModulus}*${atomRadius} variable gamma_roll equal 0.0 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} & +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} ${damp_type} & damping mdr & tangential linear_history ${kt} ${xgammat} ${mu_s} & rolling sds ${k_roll} ${gamma_roll} ${mu_roll} @@ -59,7 +60,7 @@ pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEne variable disp_upper equal 0.0 variable disp_lower equal 0.0 -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} ${damp_type} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" variable dieHeight2 equal 2*${dieHeight} diff --git a/examples/granular/in.triaxial.compaction.12 b/examples/granular/in.triaxial.compaction.12 index d10e325721..6a948157d3 100644 --- a/examples/granular/in.triaxial.compaction.12 +++ b/examples/granular/in.triaxial.compaction.12 @@ -30,14 +30,15 @@ variable PoissonsRatio equal 0.3 variable YieldStress equal 50e6 variable SurfaceEnergy equal 0.0 variable psi_b equal 0.5 -variable damp equal 1.0 +variable damp equal 0.2 +variable damp_type equal 1 # linear_history = k_t, x_gamma,t, mu_s variable kt equal 2/7*${YoungsModulus}*${atomRadius} variable xgammat equal 0.0 variable mu_s equal 0.5 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} & +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} ${damp_type} & damping mdr & tangential linear_history ${kt} ${xgammat} ${mu_s} @@ -56,7 +57,7 @@ region plane_xz_neg plane 0 -${halfBoxWidth} 0 0 1 0 side in move NULL v_plane_d region plane_xy_pos plane 0 0 ${halfBoxWidth} 0 0 -1 side in move NULL NULL v_plane_disp_neg units box region plane_xy_neg plane 0 0 -${halfBoxWidth} 0 0 1 side in move NULL NULL v_plane_disp units box -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} " +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} ${damp_type} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} " fix plane_yz_pos all wall/gran/region ${wall_contact_string} region plane_yz_pos contacts fix plane_yz_neg all wall/gran/region ${wall_contact_string} region plane_yz_neg contacts diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index a5dc5745a4..c35d63d668 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -44,12 +44,10 @@ GranSubModDamping::GranSubModDamping(GranularModel *gm, LAMMPS *lmp) : GranSubMo void GranSubModDamping::init() { + if (gm->normal_model->name == "mdr") + error->all(FLERR, "Only damping mdr may be used with the mdr normal model"); + damp = gm->normal_model->get_damp(); - if (gm->normal_model->name == "mdr") { - if (gm->tangential_model->name != "mdr") - error->all(FLERR, "Only damping mdr may be used with the mdr normal model"); - damp_type = gm->normal_model->get_damp_type(); - } } /* ---------------------------------------------------------------------- @@ -135,6 +133,9 @@ GranSubModDampingTsuji::GranSubModDampingTsuji(GranularModel *gm, LAMMPS *lmp) : void GranSubModDampingTsuji::init() { + if (gm->normal_model->name == "mdr") + error->all(FLERR, "Only damping mdr may be used with the mdr normal model"); + double tmp = gm->normal_model->get_damp(); damp = 1.2728 - 4.2783 * tmp + 11.087 * square(tmp); damp += -22.348 * cube(tmp) + 27.467 * powint(tmp, 4); @@ -168,6 +169,9 @@ GranSubModDampingCoeffRestitution::GranSubModDampingCoeffRestitution(GranularMod void GranSubModDampingCoeffRestitution::init() { + if (gm->normal_model->name == "mdr") + error->all(FLERR, "Only damping mdr may be used with the mdr normal model"); + // Calculate prefactor, assume Hertzian as default double cor = gm->normal_model->get_damp(); double logcor = log(cor); @@ -196,6 +200,7 @@ void GranSubModDampingMDR::init() error->all(FLERR, "Damping mdr can only be used with mdr normal model"); damp = gm->normal_model->get_damp(); + damp_type = gm->normal_model->get_damp_type(); } /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index ecf53ea24c..aa53f5fcf6 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -482,7 +482,7 @@ void GranSubModNormalMDR::coeffs_to_local() if (gamma < 0.0) error->all(FLERR, "Illegal MDR normal model, effective surface energy must be greater than or equal to 0"); if (psi_b < 0.0 || psi_b > 1.0) error->all(FLERR, "Illegal MDR normal model, psi_b must be between 0 and 1.0"); if (damp < 0.0) error->all(FLERR, "Illegal MDR normal model, damping coefficent must be greater than or equal to 0"); - if (damp_type != 1 && damp_type != 2) error->all(FLERR, "Illegal MDR normal model, damping type must an integer equal to 1 (mdr) or 2 (velocity)"); + if (damp_type != 1 && damp_type != 2) error->all(FLERR, "Illegal MDR normal model, damping type must an integer equal to 1 or 2"); G = E / (2.0 * (1.0 + nu)); // shear modulus kappa = E / (3.0 * (1.0 - 2.0 * nu)); // bulk modulus From bd6bb3ce1082df0c5e71ef9c8dfb46cfeb8f6875 Mon Sep 17 00:00:00 2001 From: talinke Date: Tue, 8 Apr 2025 17:35:09 -0700 Subject: [PATCH 33/94] Updated integrator, streamlined variables --- src/EXTRA-FIX/fix_langevin_gjf.cpp | 423 ++++++++++------------------- src/EXTRA-FIX/fix_langevin_gjf.h | 25 +- 2 files changed, 155 insertions(+), 293 deletions(-) diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp index 7f38a4d201..59d5cff1c5 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -44,8 +44,8 @@ enum { CONSTANT, EQUAL, ATOM }; /* ---------------------------------------------------------------------- */ -FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), gjfflag(0), gfactor1(nullptr), gfactor2(nullptr), ratio(nullptr), +FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), gjfflag(0), tstr(nullptr), flangevin(nullptr), tforce(nullptr), lv(nullptr), id_temp(nullptr), random(nullptr) { if (narg < 8) error->all(FLERR, "Illegal fix langevin/gjf command"); @@ -78,16 +78,10 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : random = new RanMars(lmp, seed + comm->me); - // allocate per-type arrays for force prefactors - - // gfactor1 = new double[atom->ntypes + 1]; - // gfactor2 = new double[atom->ntypes + 1]; - // ratio = new double[atom->ntypes + 1]; int GJmethods = 8 // number of currently implemented GJ methods // optional args - for (int i = 1; i <= atom->ntypes; i++) ratio[i] = 1.0; osflag = 0; GJmethod = 0; @@ -105,39 +99,28 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg], "method") == 0) { if (iarg + 2 > narg) error->all(FLERR, "Illegal fix langevin/gjf command"); GJmethod = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); - if (GJmethod <= 0 || GJmethod > GJmethods) error->all(FLERR, "Invalid GJ method choice in langevin/gjf command"); + if (GJmethod < 0 || GJmethod > GJmethods) error->all(FLERR, "Invalid GJ method choice in langevin/gjf command"); iarg += 2; } else error->all(FLERR, "Illegal fix langevin/gjf command"); } // set temperature = nullptr, user can override via fix_modify if wants bias - id_temp = nullptr; temperature = nullptr; - energy = 0.0; - - // flangevin is unallocated until first call to setup() - // compute_scalar checks for this and returns 0.0 - // if flangevin_allocated is not set - - flangevin = nullptr; - flangevin_allocated = 0; lv = nullptr; tforce = nullptr; - maxatom1 = maxatom2 = 0; // setup atom-based array for lv // register with Atom class // no need to set peratom_flag, b/c data is for internal use only - FixLangevin::grow_arrays(atom->nmax); + FixLangevinGJF::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); // initialize lv to zero - int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { lv[i][0] = 0.0; @@ -148,17 +131,13 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixLangevin::~FixLangevin() +FixLangevinGJF::~FixLangevinGJF() { if (copymode) return; delete random; delete[] tstr; - delete[] gfactor1; - delete[] gfactor2; - delete[] ratio; delete[] id_temp; - memory->destroy(flangevin); memory->destroy(tforce); memory->destroy(lv); @@ -167,18 +146,18 @@ FixLangevin::~FixLangevin() /* ---------------------------------------------------------------------- */ -int FixLangevin::setmask() +int FixLangevinGJF::setmask() { int mask = 0; mask |= INITIAL_INTEGRATE; mask |= FINAL_INTEGRATE; - mask |= END_OF_STEP; + if (!osflag) mask |= END_OF_STEP; return mask; } /* ---------------------------------------------------------------------- */ -void FixLangevin::init() +void FixLangevinGJF::init() { if (id_temp) { temperature = modify->get_compute_by_id(id_temp); @@ -193,23 +172,13 @@ void FixLangevin::init() if (tstr) { tvar = input->variable->find(tstr); - if (tvar < 0) error->all(FLERR, "Variable name {} for fix langevin does not exist", tstr); + if (tvar < 0) error->all(FLERR, "Variable name {} for fix langevin/gjf does not exist", tstr); if (input->variable->equalstyle(tvar)) tstyle = EQUAL; else if (input->variable->atomstyle(tvar)) tstyle = ATOM; else - error->all(FLERR, "Variable {} for fix langevin is invalid style", tstr); - } - - // set force prefactors - - if (!atom->rmass) { - for (int i = 1; i <= atom->ntypes; i++) { - gfactor1[i] = -atom->mass[i] / t_period / force->ftm2v; - gfactor2[i] = sqrt(atom->mass[i]) / force->ftm2v; - gfactor2[i] *= sqrt(2.0 * update->dt * force->boltz / t_period / force->mvv2e); // gjfflag - } + error->all(FLERR, "Variable {} for fix langevin/gjf is invalid style", tstr); } if (temperature && temperature->tempbias) @@ -219,44 +188,44 @@ void FixLangevin::init() if (utils::strmatch(update->integrate_style, "^respa")) { nlevels_respa = (static_cast(update->integrate))->nlevels; - if (gjfflag) error->all(FLERR, "Fix langevin gjf and run style respa are not compatible"); - } - - if (gjfflag) { - gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); - gjfc1 = 1.0 / (1.0 + update->dt / 2.0 / t_period); + error->all(FLERR, "Fix langevin gjf and run style respa are not compatible"); } + // Complete set of thermostats is given in Gronbech-Jensen, Molecular Physics, 118 (2020) switch (GJmethod) { case 1: gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); - gjfc1 = 1.0 / (1.0 + update->dt / 2.0 / t_period); break; case 2: - // Insert logic for method 2 + gjfc2 = exp(-update->dt / t_period); break; case 3: - // Insert logic for method 3 + gjfc2 = 1.0 - update->dt / t_period; break; case 4: - // Insert logic for method 4 + gjfc2 = ( sqrt(1.0 + 4.0 * (update->dt / t_period) ) - 1.0 ) / ( 2.0 * update->dt / t_period ); break; case 5: - // Insert logic for method 5 + gjfc2 = 1.0 / (1.0 + update->dt / t_period); break; case 6: - // Insert logic for method 6 + gjfc2 = (1.0 / (1.0 + update->dt / 2.0 / t_period)) * (1.0 / (1.0 + update->dt / 2.0 / t_period)); break; - case 7: - // Insert logic for method 7 + case 7: // provided in Finkelstein (2021) + gjfc2 = 1; // TODO: correct this break; - case 8: - // Insert logic for method 8 + case 8: // provided in Gronbech-Jensen (2024) + gjfc2 = sqrt( (update->dt / t_period)*(update->dt / t_period) + 1.0 ) - update->dt / t_period; + break; + case 0: + gjfc2 = 0.0; break; default: error->all(FLERR, "Fix langevin/gjf method not found"); break; -} + } + gjfc1 = (1.0 + gjfc2) / 2.0; + gjfc3 = (1.0 - gjfc2) * t_period / update->dt; } /* ---------------------------------------------------------------------- @@ -268,10 +237,9 @@ void FixLangevin::init() 4. Velocity Choice in end_of_step() ------------------------------------------------------------------------- */ -void FixLangevin::initial_integrate(int /* vflag */) +void FixLangevinGJF::initial_integrate(int /* vflag */) { - double gamma1,gamma2; - + // This function provides the integration of the GJ formulation 24a-e double **x = atom->x; double **v = atom->v; double **f = atom->f; @@ -290,79 +258,21 @@ void FixLangevin::initial_integrate(int /* vflag */) double dtf = 0.5 * dt * ftm2v; double dtfm; - double c1sqrt = sqrt(gjfc1); - - // NVE integrates position and velocity according to Eq. 8a, 8b - // This function embeds the GJF formulation into the NVE framework, which corresponds to the GJF case c1=c3. + double c1sq = sqrt(gjfc1); + double c3sq = sqrt(gjfc3); + double csq = sqrt(gjfc3 / gjfc1); + double m, beta; - //NVE - if (rmass) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - dtfm = dtf / rmass[i]; - v[i][0] += dtfm * f[i][0]; - v[i][1] += dtfm * f[i][1]; - v[i][2] += dtfm * f[i][2]; - x[i][0] += dt * v[i][0]; - x[i][1] += dt * v[i][1]; - x[i][2] += dt * v[i][2]; - } - - } else { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - dtfm = dtf / mass[type[i]]; - v[i][0] += dtfm * f[i][0]; - v[i][1] += dtfm * f[i][1]; - v[i][2] += dtfm * f[i][2]; - x[i][0] += dt * v[i][0]; - x[i][1] += dt * v[i][1]; - x[i][2] += dt * v[i][2]; - } - } - - // The initial NVE integration should always use the on-site velocity. Therefore, a velocity correction - // must be done when using the half-step option. - //---------- + // If user elected vhalf, v needs to be reassigned to onsite velocity for integration if (!osflag) { - if (rmass) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - dtfm = dtf / rmass[i]; - // Undo NVE integration - x[i][0] -= dt * v[i][0]; - x[i][1] -= dt * v[i][1]; - x[i][2] -= dt * v[i][2]; - // Obtain Eq. 24a. lv[][] stores on-site velocity from previous timestep - v[i][0] = lv[i][0] + dtfm * f[i][0]; - v[i][1] = lv[i][1] + dtfm * f[i][1]; - v[i][2] = lv[i][2] + dtfm * f[i][2]; - // Redo NVE integration with correct velocity - x[i][0] += dt * v[i][0]; - x[i][1] += dt * v[i][1]; - x[i][2] += dt * v[i][2]; - } - - } else { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - dtfm = dtf / mass[type[i]]; - // Undo NVE integration - x[i][0] -= dt * v[i][0]; - x[i][1] -= dt * v[i][1]; - x[i][2] -= dt * v[i][2]; - // Obtain Eq. 24a. lv[][] stores on-site velocity from previous timestep - v[i][0] = lv[i][0] + dtfm * f[i][0]; - v[i][1] = lv[i][1] + dtfm * f[i][1]; - v[i][2] = lv[i][2] + dtfm * f[i][2]; - // Redo NVE integration with correct velocity - x[i][0] += dt * v[i][0]; - x[i][1] += dt * v[i][1]; - x[i][2] += dt * v[i][2]; - } - } + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + // lv is Eq. 24f from previous time step + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; + } } - //---------- compute_target(); @@ -370,59 +280,58 @@ void FixLangevin::initial_integrate(int /* vflag */) for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { + if (tstyle == ATOM) tsqrt = sqrt(tforce[i]); - if (rmass) { - gamma2 = sqrt(rmass[i]) * sqrt(2.0*dt*boltz/t_period/mvv2e) / ftm2v; - gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; + if (rmass) { + m = rmass[i]; + beta = tsqrt * sqrt(2.0*dt*rmass[i]*boltz/t_period/mvv2e) / ftm2v; } else { - gamma2 = gfactor2[type[i]] * tsqrt; + m = mass[type[i]]; + beta = tsqrt * sqrt(2.0*dt*atom->mass[i]*boltz/t_period/mvv2e) / ftm2v; } - fran[0] = gamma2*random->gaussian(); - fran[1] = gamma2*random->gaussian(); - fran[2] = gamma2*random->gaussian(); + + fran[0] = beta*random->gaussian(); + fran[1] = beta*random->gaussian(); + fran[2] = beta*random->gaussian(); + + // First integration delivers Eq. 24a and 24b: + dtfm = dtf / m; + v[i][0] += csq * dtfm * f[i][0]; + v[i][1] += csq * dtfm * f[i][1]; + v[i][2] += csq * dtfm * f[i][2]; + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; - // NVE integrator delivers Eq. 24a, but also overshoots position integration. Calculate Eq. 24b: - x[i][0] -= 0.5 * dt * v[i][0]; - x[i][1] -= 0.5 * dt * v[i][1]; - x[i][2] -= 0.5 * dt * v[i][2]; // Calculate Eq. 24c: if (tbiasflag == BIAS) temperature->remove_bias(i,v[i]); - if (rmass) { - lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c1sqrt / (2.0 * rmass[i])) * fran[0]; - lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c1sqrt / (2.0 * rmass[i])) * fran[1]; - lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c1sqrt / (2.0 * rmass[i])) * fran[2]; - } else { - lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c1sqrt / (2.0 * mass[type[i]])) * fran[0]; - lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c1sqrt / (2.0 * mass[type[i]])) * fran[1]; - lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c1sqrt / (2.0 * mass[type[i]])) * fran[2]; - } + lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c3sqrt / (2.0 * m)) * fran[0]; + lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c3sqrt / (2.0 * m)) * fran[1]; + lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c3sqrt / (2.0 * m)) * fran[2]; + if (tbiasflag == BIAS) temperature->restore_bias(i,v[i]); if (tbiasflag == BIAS) temperature->restore_bias(i,lv[i]); // Calculate Eq. 24d - if (tbiasflag == BIAS) temperature->remove_bias(i, lv[i]); - if (atom->rmass) { - v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * (0.5 / rmass[i]) * fran[0]; - v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * (0.5 / rmass[i]) * fran[1]; - v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * (0.5 / rmass[i]) * fran[2]; - } else { - v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * (0.5 / mass[type[i]]) * fran[0]; - v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * (0.5 / mass[type[i]]) * fran[1]; - v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * (0.5 / mass[type[i]]) * fran[2]; - } - if (tbiasflag == BIAS) temperature->restore_bias(i, lv[i]); - // Calculate Eq. 24e. NVE integrator then calculates Eq. 24f. - x[i][0] += 0.5 * dt * v[i][0]; - x[i][1] += 0.5 * dt * v[i][1]; - x[i][2] += 0.5 * dt * v[i][2]; + if (tbiasflag == BIAS) temperature->remove_bias(i, v[i]); + + v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * csq * (0.5 / m) * fran[0]; + v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * csq * (0.5 / m) * fran[1]; + v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * csq * (0.5 / m) * fran[2]; + if (tbiasflag == BIAS) temperature->restore_bias(i, v[i]); + + // Calculate Eq. 24e. Final integrator then calculates Eq. 24f after force update. + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; } } } -void FixLangevin::final_integrate() +void FixLangevinGJF::final_integrate() { double dtfm; double dt = update->dt; @@ -444,18 +353,18 @@ void FixLangevin::final_integrate() for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { dtfm = dtf / rmass[i]; - v[i][0] += dtfm * f[i][0]; - v[i][1] += dtfm * f[i][1]; - v[i][2] += dtfm * f[i][2]; + v[i][0] += csq * dtfm * f[i][0]; + v[i][1] += csq * dtfm * f[i][1]; + v[i][2] += csq * dtfm * f[i][2]; } } else { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { dtfm = dtf / mass[type[i]]; - v[i][0] += dtfm * f[i][0]; - v[i][1] += dtfm * f[i][1]; - v[i][2] += dtfm * f[i][2]; + v[i][0] += csq * dtfm * f[i][0]; + v[i][1] += csq * dtfm * f[i][1]; + v[i][2] += csq * dtfm * f[i][2]; } } } @@ -464,7 +373,7 @@ void FixLangevin::final_integrate() set current t_target and t_sqrt ------------------------------------------------------------------------- */ -void FixLangevin::compute_target() +void FixLangevinGJF::compute_target() { int *mask = atom->mask; int nlocal = atom->nlocal; @@ -483,7 +392,7 @@ void FixLangevin::compute_target() if (tstyle == EQUAL) { t_target = input->variable->compute_equal(tvar); if (t_target < 0.0) - error->one(FLERR, "Fix langevin variable returned negative temperature"); + error->one(FLERR, "Fix langevin/gjf variable returned negative temperature"); tsqrt = sqrt(t_target); } else { if (atom->nmax > maxatom2) { @@ -495,86 +404,94 @@ void FixLangevin::compute_target() for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) if (tforce[i] < 0.0) - error->one(FLERR, "Fix langevin variable returned negative temperature"); + error->one(FLERR, "Fix langevin/gjf variable returned negative temperature"); } modify->addstep_compute(update->ntimestep + 1); } } /* ---------------------------------------------------------------------- - tally energy transfer to thermal reservoir, select velocity for GJF + select velocity for GJF ------------------------------------------------------------------------- */ -void FixLangevin::end_of_step() +void FixLangevinGJF::end_of_step() { double **v = atom->v; int *mask = atom->mask; int nlocal = atom->nlocal; - energy_onestep = 0.0; - - if (tallyflag) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - energy_onestep += flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + - flangevin[i][2]*v[i][2]; - } - - energy += energy_onestep*update->dt; - - // After the NVE integrator delivers 24f, either the on-site or half-step + // After the final integrator delivers 24f, either the on-site or half-step // velocity is used in remaining simulation tasks, depending on user input - if (gjfflag && !osflag) { - double tmp[3]; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - // v is Eq. 24f - tmp[0] = v[i][0]; - tmp[1] = v[i][1]; - tmp[2] = v[i][2]; - // Move on with half-step velocity - v[i][0] = lv[i][0]; - v[i][1] = lv[i][1]; - v[i][2] = lv[i][2]; - // store Eq. 24f in lv for next timestep - lv[i][0] = tmp[0]; - lv[i][1] = tmp[1]; - lv[i][2] = tmp[2]; - } - } + double tmp[3]; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + // v is Eq. 24f + tmp[0] = v[i][0]; + tmp[1] = v[i][1]; + tmp[2] = v[i][2]; + // Move on with half-step velocity + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; + // store Eq. 24f in lv for next timestep + lv[i][0] = tmp[0]; + lv[i][1] = tmp[1]; + lv[i][2] = tmp[2]; + } } // clang-format on /* ---------------------------------------------------------------------- */ -void FixLangevin::reset_target(double t_new) +void FixLangevinGJF::reset_target(double t_new) { t_target = t_start = t_stop = t_new; } /* ---------------------------------------------------------------------- */ -void FixLangevin::reset_dt() +void FixLangevinGJF::reset_dt() { - if (atom->mass) { - for (int i = 1; i <= atom->ntypes; i++) { - gfactor2[i] = sqrt(atom->mass[i]) / force->ftm2v; - if (gjfflag) - gfactor2[i] *= sqrt(2.0 * update->dt * force->boltz / t_period / force->mvv2e); // sqrt(2*alpha*kT*dt) - else - gfactor2[i] *= sqrt(24.0 * force->boltz / t_period / update->dt / force->mvv2e); - gfactor2[i] *= 1.0 / sqrt(ratio[i]); - } - } - if (gjfflag) { - gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); - gjfc1 = 1.0 / (1.0 + update->dt / 2.0 / t_period); + // Complete set of thermostats is given in Gronbech-Jensen, Molecular Physics, 118 (2020) + switch (GJmethod) { + case 1: + gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); + break; + case 2: + gjfc2 = exp(-update->dt / t_period); + break; + case 3: + gjfc2 = 1.0 - update->dt / t_period; + break; + case 4: + gjfc2 = ( sqrt(1.0 + 4.0 * (update->dt / t_period) ) - 1.0 ) / ( 2.0 * update->dt / t_period ); + break; + case 5: + gjfc2 = 1.0 / (1.0 + update->dt / t_period); + break; + case 6: + gjfc2 = (1.0 / (1.0 + update->dt / 2.0 / t_period)) * (1.0 / (1.0 + update->dt / 2.0 / t_period)); + break; + case 7: // provided in Finkelstein (2021) + gjfc2 = 1; // TODO: correct this + break; + case 8: // provided in Gronbech-Jensen (2024) + gjfc2 = sqrt( (update->dt / t_period)*(update->dt / t_period) + 1.0 ) - update->dt / t_period; + break; + case 0: + gjfc2 = 0.0; + break; + default: + error->all(FLERR, "Fix langevin/gjf method not found"); + break; } + gjfc1 = (1.0 + gjfc2) / 2.0; + gjfc3 = (1.0 - gjfc2) * t_period / update->dt; } /* ---------------------------------------------------------------------- */ -int FixLangevin::modify_param(int narg, char **arg) +int FixLangevinGJF::modify_param(int narg, char **arg) { if (strcmp(arg[0], "temp") == 0) { if (narg < 2) utils::missing_cmd_args(FLERR, "fix_modify", error); @@ -594,52 +511,11 @@ int FixLangevin::modify_param(int narg, char **arg) return 0; } -/* ---------------------------------------------------------------------- */ - -double FixLangevin::compute_scalar() -{ - if (!tallyflag || !flangevin_allocated) return 0.0; - - // capture the very first energy transfer to thermal reservoir - - double **v = atom->v; - int *mask = atom->mask; - int nlocal = atom->nlocal; - - if (update->ntimestep == update->beginstep) { - energy_onestep = 0.0; - if (!gjfflag) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - energy_onestep += - flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + flangevin[i][2] * v[i][2]; - energy = 0.5 * energy_onestep * update->dt; - } else { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - if (tbiasflag) temperature->remove_bias(i, lv[i]); - energy_onestep += - flangevin[i][0] * lv[i][0] + flangevin[i][1] * lv[i][1] + flangevin[i][2] * lv[i][2]; - if (tbiasflag) temperature->restore_bias(i, lv[i]); - } - energy = -0.5 * energy_onestep * update->dt; - } - } - - // convert midstep energy back to previous fullstep energy - - double energy_me = energy - 0.5 * energy_onestep * update->dt; - - double energy_all; - MPI_Allreduce(&energy_me, &energy_all, 1, MPI_DOUBLE, MPI_SUM, world); - return -energy_all; -} - /* ---------------------------------------------------------------------- extract thermostat properties ------------------------------------------------------------------------- */ -void *FixLangevin::extract(const char *str, int &dim) +void *FixLangevinGJF::extract(const char *str, int &dim) { dim = 0; if (strcmp(str, "t_target") == 0) { return &t_target; } @@ -650,11 +526,10 @@ void *FixLangevin::extract(const char *str, int &dim) memory usage of tally array ------------------------------------------------------------------------- */ -double FixLangevin::memory_usage() +double FixLangevinGJF::memory_usage() { double bytes = 0.0; - if (gjfflag) bytes += (double) atom->nmax * 3 * sizeof(double); - if (tallyflag || osflag) bytes += (double) atom->nmax * 3 * sizeof(double); + bytes += (double) atom->nmax * 3 * sizeof(double); if (tforce) bytes += (double) atom->nmax * sizeof(double); return bytes; } @@ -663,16 +538,16 @@ double FixLangevin::memory_usage() allocate atom-based array for lv ------------------------------------------------------------------------- */ -void FixLangevin::grow_arrays(int nmax) +void FixLangevinGJF::grow_arrays(int nmax) { - memory->grow(lv, nmax, 3, "fix_langevin:lv"); + memory->grow(lv, nmax, 3, "fix_langevin_gjf:lv"); } /* ---------------------------------------------------------------------- copy values within local atom-based array ------------------------------------------------------------------------- */ -void FixLangevin::copy_arrays(int i, int j, int /*delflag*/) +void FixLangevinGJF::copy_arrays(int i, int j, int /*delflag*/) { lv[j][0] = lv[i][0]; lv[j][1] = lv[i][1]; @@ -683,7 +558,7 @@ void FixLangevin::copy_arrays(int i, int j, int /*delflag*/) pack values in local atom-based array for exchange with another proc ------------------------------------------------------------------------- */ -int FixLangevin::pack_exchange(int i, double *buf) +int FixLangevinGJF::pack_exchange(int i, double *buf) { int n = 0; buf[n++] = lv[i][0]; @@ -696,7 +571,7 @@ int FixLangevin::pack_exchange(int i, double *buf) unpack values in local atom-based array from exchange with another proc ------------------------------------------------------------------------- */ -int FixLangevin::unpack_exchange(int nlocal, double *buf) +int FixLangevinGJF::unpack_exchange(int nlocal, double *buf) { int n = 0; lv[nlocal][0] = buf[n++]; diff --git a/src/EXTRA-FIX/fix_langevin_gjf.h b/src/EXTRA-FIX/fix_langevin_gjf.h index c54772c457..df6b80e1b7 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.h +++ b/src/EXTRA-FIX/fix_langevin_gjf.h @@ -24,21 +24,19 @@ FixStyle(langevin,FixLangevin); namespace LAMMPS_NS { -class FixLangevin : public Fix { +class FixLangevinGJF : public Fix { public: - FixLangevin(class LAMMPS *, int, char **); - ~FixLangevin() override; + FixLangevinGJF(class LAMMPS *, int, char **); + ~FixLangevinGJF() override; int setmask() override; void init() override; void setup(int) override; void initial_integrate(int) override; - void post_force(int) override; - void post_force_respa(int, int, int) override; + void final_integrate() override; void end_of_step() override; void reset_target(double) override; void reset_dt() override; int modify_param(int, char **) override; - double compute_scalar() override; double memory_usage() override; void *extract(const char *, int &) override; void grow_arrays(int) override; @@ -48,19 +46,13 @@ class FixLangevin : public Fix { protected: int osflag, GJmethod; - int flangevin_allocated; double t_start, t_stop, t_period, t_target; - double *gfactor1, *gfactor2, *ratio; - double energy, energy_onestep; + double *gfactor2; double tsqrt; - double gjfc1, gjfc2; + double gjfc1, gjfc2, gjfc3; int tstyle, tvar; char *tstr; - class AtomVecEllipsoid *avec; - - int maxatom1, maxatom2; - double **flangevin; double *tforce; double **lv; //half step velocity @@ -71,11 +63,6 @@ class FixLangevin : public Fix { class RanMars *random; int seed; - template - void post_force_templated(); - - void omega_thermostat(); - void angmom_thermostat(); void compute_target(); }; From 4dd8c66390a723accb315d96f5e84bfbdadc4e44 Mon Sep 17 00:00:00 2001 From: talinke Date: Thu, 10 Apr 2025 10:33:08 -0700 Subject: [PATCH 34/94] Updated documentation --- doc/src/Commands_fix.rst | 1 + doc/src/Howto_thermostat.rst | 3 +- doc/src/fix.rst | 1 + doc/src/fix_langevin_gjf.rst | 211 +++++++++++++++++++++++++++++++++++ 4 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 doc/src/fix_langevin_gjf.rst diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index 35c3804969..58397d7c7e 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -92,6 +92,7 @@ OPT. * :doc:`langevin (k) ` * :doc:`langevin/drude ` * :doc:`langevin/eff ` + * :doc:`langevin/gjf ` * :doc:`langevin/spin ` * :doc:`lb/fluid ` * :doc:`lb/momentum ` diff --git a/doc/src/Howto_thermostat.rst b/doc/src/Howto_thermostat.rst index fe53fff540..6719abfc82 100644 --- a/doc/src/Howto_thermostat.rst +++ b/doc/src/Howto_thermostat.rst @@ -22,6 +22,7 @@ can be invoked via the *dpd/tstat* pair style: * :doc:`fix temp/berendsen ` * :doc:`fix temp/csvr ` * :doc:`fix langevin ` +* :doc:`fix langevin/gjf ` * :doc:`fix temp/rescale ` * :doc:`pair_style dpd/tstat ` @@ -82,7 +83,7 @@ that: .. note:: - Only the nvt fixes perform time integration, meaning they update + Only the nvt and langevin/gjf fixes perform time integration, meaning they update the velocities and positions of particles due to forces and velocities respectively. The other thermostat fixes only adjust velocities; they do NOT perform time integration updates. Thus they should be used in diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 3b1bc4a75c..13a6ad166d 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -271,6 +271,7 @@ accelerated styles exist. * :doc:`langevin ` - Langevin temperature control * :doc:`langevin/drude ` - Langevin temperature control of Drude oscillators * :doc:`langevin/eff ` - Langevin temperature control for the electron force field model +* :doc:`langevin/gjf ` - statistically correct Langevin temperature control using the GJ methods * :doc:`langevin/spin ` - Langevin temperature control for a spin or spin-lattice system * :doc:`lb/fluid ` - lattice-Boltzmann fluid on a uniform mesh * :doc:`lb/momentum ` - :doc:`fix momentum ` replacement for use with a lattice-Boltzmann fluid diff --git a/doc/src/fix_langevin_gjf.rst b/doc/src/fix_langevin_gjf.rst new file mode 100644 index 0000000000..08e6c1c87b --- /dev/null +++ b/doc/src/fix_langevin_gjf.rst @@ -0,0 +1,211 @@ +.. index:: fix langevin/gjf + +fix langevin/gjf command +======================== + +Syntax +"""""" + +.. code-block:: LAMMPS + + fix ID group-ID langevin/gjf Tstart Tstop damp seed keyword values ... + +* ID, group-ID are documented in :doc:`fix ` command +* langevin/gjf = style name of this fix command +* Tstart,Tstop = desired temperature at start/end of run (temperature units) +* Tstart can be a variable (see below) +* damp = damping parameter (time units) +* seed = random number seed to use for white noise (positive integer) +* zero or more keyword/value pairs may be appended +* keyword = *vel* or *method* + + .. parsed-literal:: + + *vel* value = *vfull* or *vhalf* + *vfull* = use on-site velocity + *vhalf* = use half-step velocity + *method* value = *1-8* + *1-8* = choose one of the many GJ formulations + +Examples +"""""""" + +.. code-block:: LAMMPS + + fix 3 boundary langevin/gjf 10.0 10.0 1.0 699483 + fix 1 all langevin/gjf 10.0 100.0 100.0 48279 vel vfull method 4 + +Description +""""""""""" + +Apply a Langevin thermostat as described in :ref:`(Gronbech-Jensen-2024) ` +to a group of atoms which models an interaction with a background +implicit solvent. As described in the papers cited below, the purpose of this method is to +enable longer timesteps to be used (up to the numerical stability +limit of the integrator), while still producing the correct Boltzmann +distribution of atom positions. + +The current implementation provides the user with the option to output +the velocity in one of two forms: *vfull* or *vhalf*. The option *vfull* outputs the +on-site velocity given in :ref:`Gronbech-Jensen/Farago +`; this velocity is shown to be systematically lower +than the target temperature by a small amount, which grows +quadratically with the timestep. The option *vhalf* outputs the +2GJ half-step velocity given in :ref:`Gronbech Jensen/Gronbech-Jensen +`; for linear systems, this velocity is shown to not +have any statistical errors for any stable time step. An overview of +statistically correct Boltzmann and Maxwell-Boltzmann sampling of true +on-site and true half-step velocities is given in +:ref:`Gronbech-Jensen-2020 `. + +This fix allows the use of any of the GJ methods as listed in :ref:`Gronbech-Jensen-2020 `. +The GJ-VII method is described in :ref:`Finkelstein `. +The implementation follows the splitting form provided in Eqs. (24) and (25) +in :ref:`Gronbech-Jensen-2024 `, including the application +of Gaussian noise values, per the description in +:ref:`Gronbech-Jensen-2023 `. + + +.. note:: + + Unlike the :doc:`fix langevin ` command which performs force + modifications only, this fix performs thermostatting and time integration. + Thus you no longer need a separate time integration fix, like :doc:`fix nve `. + +See the :doc:`Howto thermostat ` page for +a discussion of different ways to compute temperature and perform +thermostatting. + +The desired temperature at each timestep is a ramped value during the +run from *Tstart* to *Tstop*\ . + +*Tstart* can be specified as an equal-style or atom-style +:doc:`variable `. In this case, the *Tstop* setting is +ignored. If the value is a variable, it should be specified as +v_name, where name is the variable name. In this case, the variable +will be evaluated each timestep, and its value used to determine the +target temperature. + +Equal-style variables can specify formulas with various mathematical +functions, and include :doc:`thermo_style ` command +keywords for the simulation box parameters and timestep and elapsed +time. Thus it is easy to specify a time-dependent temperature. + +Atom-style variables can specify the same formulas as equal-style +variables but can also include per-atom values, such as atom +coordinates. Thus it is easy to specify a spatially-dependent +temperature with optional time-dependence as well. + +Like other fixes that perform thermostatting, this fix can be used +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. In this case, the thermostat works in the following manner: +bias is removed from each atom, thermostatting is performed on the +remaining thermal degrees of freedom, and the bias is added back in. + +The *damp* parameter is specified in time units and determines how +rapidly the temperature is relaxed. For example, a value of 100.0 means +to relax the temperature in a timespan of (roughly) 100 time units +(:math:`\tau` or fs or ps - see the :doc:`units ` command). The +damp factor can be thought of as inversely related to the viscosity of +the solvent. I.e. a small relaxation time implies a high-viscosity +solvent and vice versa. See the discussion about :math:`\gamma` and +viscosity in the documentation for the :doc:`fix viscous ` +command for more details. + +The random # *seed* must be a positive integer. A Marsaglia random +number generator is used. Each processor uses the input seed to +generate its own unique seed and its own stream of random numbers. +Thus the dynamics of the system will not be identical on two runs on +different numbers of processors. + +---------- + +The keyword/value option pairs are used in the following ways. + +The keyword *vel* determine which velocity is used to determine +quantities of interest in the simulation. + +The keyword *method* selects one of the eight GJ-methods implemented in LAMMPS. + +*Insert brief explanation for each method* + +---------- + +.. include:: accel_styles.rst + +---------- + +Restart, fix_modify, output, run start/stop, minimize info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +No information about this fix is written to :doc:`binary restart files `. +For the Bruenger thermostat: Because the state of the random number generator +is not saved in restart files, this means you cannot do "exact" +restarts with this fix, where the simulation continues on the same as +if no restart had taken place. However, in a statistical sense, a +restarted simulation should produce the same behavior. The "exact" restart is +done with either vfull or vhalf velocity output for as long as the choice of +vfull/vhalf is the same for the simulation as it is in the restart file. + +The :doc:`fix_modify ` *temp* option is supported by this +fix. You can use it to assign a temperature :doc:`compute ` +you have defined to this fix which will be used in its thermostatting +procedure, as described above. For consistency, the group used by +this fix and by the compute should be the same. + +This fix can ramp its target temperature over multiple runs, using the +*start* and *stop* keywords of the :doc:`run ` command. See the +:doc:`run ` command for details of how to do this. + +This fix is not invoked during :doc:`energy minimization `. + +Restrictions +"""""""""""" + +This fix is not compatible with run_style respa. + +Related commands +"""""""""""""""" + +:doc:`fix langevin `, :doc:`fix nvt ` + +Default +""""""" + +The option defaults are vel = vhalf, method = 1. + +---------- + +.. _Gronbech-Jensen-2024: + +**(Gronbech-Jensen-2024)** Gronbech-Jensen, J. Stat. Phys. 191, 137 (2024). + +.. _Gronbech-Jensen-Farago: + +**(Gronbech-Jensen/Farago)** Gronbech-Jensen and Farago, Mol Phys, 111, 983 +(2013). + +.. _Gronbech-Jensen-2019: + +**(Gronbech Jensen/Gronbech-Jensen)** Gronbech Jensen and Gronbech-Jensen, Mol Phys, 117, 2511 (2019) + +.. _Gronbech-Jensen-2020: + +**(Gronbech-Jensen-2020)** Gronbech-Jensen, Mol Phys 118, e1662506 (2020). + +.. _Finkelstein: + +**(Finkelstein)** Finkelstein, Cheng, Florin, Seibold, Gronbech-Jensen, J. Chem. Phys., 155, 18 (2021) + +.. _Gronbech-Jensen-2023: + +**(Gronbech-Jensen-2023)** Gronbech-Jensen, J. Stat. Phys. 190, 96 (2023). From 43a7b14b7ceebaaadb01366bf030d711e0ab3003 Mon Sep 17 00:00:00 2001 From: talinke Date: Thu, 10 Apr 2025 12:01:02 -0700 Subject: [PATCH 35/94] New example structure --- doc/src/fix_langevin_gjf.rst | 18 ++- examples/gjf/README | 46 +++++++ examples/gjf/README.md | 13 -- examples/gjf/in.gjf.vfull | 5 +- examples/gjf/in.gjf.vhalf | 5 +- examples/gjf/log.15Oct19.gjf.vfull.g++.1 | 125 ------------------- examples/gjf/log.15Oct19.gjf.vfull.g++.4 | 125 ------------------- examples/gjf/log.15Oct19.gjf.vhalf.g++.1 | 125 ------------------- examples/gjf/log.15Oct19.gjf.vhalf.g++.4 | 125 ------------------- examples/gjf/log.2Apr25.gjf.vfull.g++.1 | 152 +++++++++++++++++++++++ examples/gjf/log.2Apr25.gjf.vfull.g++.4 | 152 +++++++++++++++++++++++ examples/gjf/log.2Apr25.gjf.vhalf.g++.1 | 152 +++++++++++++++++++++++ examples/gjf/log.2Apr25.gjf.vhalf.g++.4 | 152 +++++++++++++++++++++++ src/EXTRA-FIX/fix_langevin_gjf.cpp | 87 +++++++------ src/EXTRA-FIX/fix_langevin_gjf.h | 14 +-- 15 files changed, 713 insertions(+), 583 deletions(-) create mode 100644 examples/gjf/README delete mode 100644 examples/gjf/README.md delete mode 100644 examples/gjf/log.15Oct19.gjf.vfull.g++.1 delete mode 100644 examples/gjf/log.15Oct19.gjf.vfull.g++.4 delete mode 100644 examples/gjf/log.15Oct19.gjf.vhalf.g++.1 delete mode 100644 examples/gjf/log.15Oct19.gjf.vhalf.g++.4 create mode 100644 examples/gjf/log.2Apr25.gjf.vfull.g++.1 create mode 100644 examples/gjf/log.2Apr25.gjf.vfull.g++.4 create mode 100644 examples/gjf/log.2Apr25.gjf.vhalf.g++.1 create mode 100644 examples/gjf/log.2Apr25.gjf.vhalf.g++.4 diff --git a/doc/src/fix_langevin_gjf.rst b/doc/src/fix_langevin_gjf.rst index 08e6c1c87b..e58b4305bd 100644 --- a/doc/src/fix_langevin_gjf.rst +++ b/doc/src/fix_langevin_gjf.rst @@ -107,9 +107,7 @@ This is not done by default, but only if the :doc:`fix_modify ` command is used to assign a temperature compute to this fix that includes such a bias term. See the doc pages for individual :doc:`compute temp commands ` to determine which ones include -a bias. In this case, the thermostat works in the following manner: -bias is removed from each atom, thermostatting is performed on the -remaining thermal degrees of freedom, and the bias is added back in. +a bias. The *damp* parameter is specified in time units and determines how rapidly the temperature is relaxed. For example, a value of 100.0 means @@ -148,13 +146,13 @@ Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" No information about this fix is written to :doc:`binary restart files `. -For the Bruenger thermostat: Because the state of the random number generator -is not saved in restart files, this means you cannot do "exact" -restarts with this fix, where the simulation continues on the same as -if no restart had taken place. However, in a statistical sense, a -restarted simulation should produce the same behavior. The "exact" restart is -done with either vfull or vhalf velocity output for as long as the choice of -vfull/vhalf is the same for the simulation as it is in the restart file. +Because the state of the random number generator is not saved in restart files, +this means you cannot do "exact" restarts with this fix, where the simulation +continues on the same as if no restart had taken place. However, in a +statistical sense, a restarted simulation should produce the same behavior. +The "exact" restart is done with either vfull or vhalf velocity output for as +long as the choice of vfull/vhalf is the same for the simulation as it is in +the restart file. The :doc:`fix_modify ` *temp* option is supported by this fix. You can use it to assign a temperature :doc:`compute ` diff --git a/examples/gjf/README b/examples/gjf/README new file mode 100644 index 0000000000..fdbc843522 --- /dev/null +++ b/examples/gjf/README @@ -0,0 +1,46 @@ +LAMMPS GJ THERMOSTAT EXAMPLE + +Required LAMMPS packages: EXTRA-FIX, MOLECULE, EXTRA-PAIR + +This directory contains the ingredients to run an NVT simulation using the +GJ thermostats. + +Example: + +NP=4 #number of processors +mpirun -np $NP lmp_mpi -in.gjf.vhalf + +Compared to other thermostats, the GJ thermostat allows for larger timesteps +with the correct Boltzmann statistics. A comparison using averaged properties +from this example's input file is shown below. 'X' denotes a failed simulation. + +KINETIC ENERGY (eV) +| Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | +|==============||========|========|========|========|========|========|========| +| langevin/gjf || 1.112 | 1.108 | 1.114 | 1.118 | 1.111 | 1.133 | 1.168 | +| langevin || 1.113 | 1.125 | 1.121 | 1.135 | 1.152 | X | X | +| nvt || 1.094 | 1.114 | 1.117 | 1.113 | 1.121 | X | X | +|--------------||--------|--------|--------|--------|--------|--------|--------| + +POTENTIAL ENERGY (eV) +| Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | +|==============||========|========|========|========|========|========|========| +| langevin/gjf || -55.16 | -55.16 | -55.15 | -55.15 | -55.15 | -55.14 | -55.12 | +| langevin || -55.16 | -55.12 | -54.93 | -54.85 | -54.71 | X | X | +| nvt || -55.17 | -55.10 | -54.95 | -54.88 | -54.82 | X | X | +|--------------||--------|--------|--------|--------|--------|--------|--------| + + +Script Commands: +-- +fix nve all nve +fix lang all langevin 10 10 1 26488 +-- +vs +-- +fix noho all nvt temp 10 10 1 +-- +vs +-- +fix lang all langevin/gjf 10 10 1 26488 +-- \ No newline at end of file diff --git a/examples/gjf/README.md b/examples/gjf/README.md deleted file mode 100644 index e6886cb2dd..0000000000 --- a/examples/gjf/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# LAMMPS GJF-2GJ THERMOSTAT EXAMPLE - -## GJF-2GJ THERMOSTAT - -This directory contains the ingredients to run an NVT simulation using the GJF-2GJ thermostat. - -Example: -``` -NP=4 #number of processors -mpirun -np $NP lmp_mpi -in.gjf.vhalf -``` - -## Required LAMMPS packages: MOLECULE package diff --git a/examples/gjf/in.gjf.vfull b/examples/gjf/in.gjf.vfull index 40512ac37a..8512dad837 100644 --- a/examples/gjf/in.gjf.vfull +++ b/examples/gjf/in.gjf.vfull @@ -1,4 +1,4 @@ -# GJF-2GJ thermostat +# GJ thermostat units metal atom_style full @@ -14,8 +14,7 @@ neighbor 1 bin timestep 0.1 -fix lang all langevin 10 10 1 26488 gjf vfull -fix nve all nve +fix lang all langevin/gjf 10 10 1 26488 vel vfull method 4 thermo 200 run 5000 diff --git a/examples/gjf/in.gjf.vhalf b/examples/gjf/in.gjf.vhalf index 63fb8bd467..08b0b45c8c 100644 --- a/examples/gjf/in.gjf.vhalf +++ b/examples/gjf/in.gjf.vhalf @@ -1,4 +1,4 @@ -# GJF-2GJ thermostat +# GJ thermostat units metal atom_style full @@ -14,8 +14,7 @@ neighbor 1 bin timestep 0.1 -fix lang all langevin 10 10 1 26488 gjf vhalf -fix nve all nve +fix lang all langevin/gjf 10 10 1 26488 thermo 200 run 5000 diff --git a/examples/gjf/log.15Oct19.gjf.vfull.g++.1 b/examples/gjf/log.15Oct19.gjf.vfull.g++.1 deleted file mode 100644 index e3e9cce124..0000000000 --- a/examples/gjf/log.15Oct19.gjf.vfull.g++.1 +++ /dev/null @@ -1,125 +0,0 @@ -LAMMPS (19 Sep 2019) - using 1 OpenMP thread(s) per MPI task -# GJF-2GJ thermostat - -units metal -atom_style full - -boundary p p p -read_data argon.lmp - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 864 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000150019 secs - read_data CPU = 0.001946 secs - -include ff-argon.lmp -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Ar equal 1 - -############# -#Atom Masses# -############# - -mass ${Ar} 39.903 -mass 1 39.903 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style lj/cubic -pair_coeff * * 0.0102701 3.42 - - -velocity all create 10 2357 mom yes dist gaussian - -neighbor 1 bin - -timestep 0.1 - -fix lang all langevin 10 10 1 26488 gjf vfull -fix nve all nve - -thermo 200 -run 5000 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.875 | 6.875 | 6.875 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 11.080223 -56.207655 0 -54.97164 37.215524 - 200 8.2588471 -55.073602 0 -54.152316 339.80416 - 400 8.1427292 -55.072244 0 -54.16391 338.91883 - 600 8.7595618 -55.066739 0 -54.089596 344.25426 - 800 8.550633 -55.148315 0 -54.194479 318.9385 - 1000 8.5394337 -55.125709 0 -54.173122 326.59471 - 1200 8.565973 -55.114892 0 -54.159345 328.5193 - 1400 8.2092914 -55.109233 0 -54.193475 329.56161 - 1600 8.209495 -55.138161 0 -54.22238 321.39971 - 1800 8.4039924 -55.13355 0 -54.196072 322.64214 - 2000 8.4548937 -55.062994 0 -54.119838 343.29888 - 2200 8.3775139 -55.13364 0 -54.199116 323.63744 - 2400 8.537332 -55.163702 0 -54.21135 315.62864 - 2600 8.672488 -55.112054 0 -54.144625 330.1106 - 2800 8.3000218 -55.147275 0 -54.221396 318.73112 - 3000 8.3552421 -55.135164 0 -54.203124 323.53075 - 3200 8.4126798 -55.135753 0 -54.197306 321.48817 - 3400 8.4986413 -55.135408 0 -54.187372 323.42951 - 3600 8.38431 -55.103932 0 -54.16865 330.68929 - 3800 8.8262454 -55.103648 0 -54.119067 332.97779 - 4000 7.9658136 -55.120402 0 -54.231803 324.9595 - 4200 8.2265544 -55.129011 0 -54.211327 323.87069 - 4400 8.1253738 -55.153089 0 -54.246691 316.304 - 4600 8.2010823 -55.124053 0 -54.20921 325.98402 - 4800 8.5512149 -55.075877 0 -54.121976 338.30137 - 5000 8.4737659 -55.158604 0 -54.213343 316.22418 -Loop time of 2.73236 on 1 procs for 5000 steps with 864 atoms - -Performance: 15810.507 ns/day, 0.002 hours/ns, 1829.920 timesteps/s -99.7% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.4262 | 1.4262 | 1.4262 | 0.0 | 52.20 -Bond | 0.00042836 | 0.00042836 | 0.00042836 | 0.0 | 0.02 -Neigh | 0.12819 | 0.12819 | 0.12819 | 0.0 | 4.69 -Comm | 0.058611 | 0.058611 | 0.058611 | 0.0 | 2.15 -Output | 0.00047283 | 0.00047283 | 0.00047283 | 0.0 | 0.02 -Modify | 1.0924 | 1.0924 | 1.0924 | 0.0 | 39.98 -Other | | 0.02605 | | | 0.95 - -Nlocal: 864 ave 864 max 864 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 1593 ave 1593 max 1593 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 18143 ave 18143 max 18143 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 18143 -Ave neighs/atom = 20.9988 -Ave special neighs/atom = 0 -Neighbor list builds = 158 -Dangerous builds = 5 - - -Total wall time: 0:00:02 diff --git a/examples/gjf/log.15Oct19.gjf.vfull.g++.4 b/examples/gjf/log.15Oct19.gjf.vfull.g++.4 deleted file mode 100644 index 95caed5dc9..0000000000 --- a/examples/gjf/log.15Oct19.gjf.vfull.g++.4 +++ /dev/null @@ -1,125 +0,0 @@ -LAMMPS (19 Sep 2019) - using 1 OpenMP thread(s) per MPI task -# GJF-2GJ thermostat - -units metal -atom_style full - -boundary p p p -read_data argon.lmp - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 864 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000556268 secs - read_data CPU = 0.003817 secs - -include ff-argon.lmp -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Ar equal 1 - -############# -#Atom Masses# -############# - -mass ${Ar} 39.903 -mass 1 39.903 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style lj/cubic -pair_coeff * * 0.0102701 3.42 - - -velocity all create 10 2357 mom yes dist gaussian - -neighbor 1 bin - -timestep 0.1 - -fix lang all langevin 10 10 1 26488 gjf vfull -fix nve all nve - -thermo 200 -run 5000 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.808 | 6.808 | 6.808 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 11.080228 -56.207655 0 -54.971639 37.215541 - 200 8.4818184 -55.127334 0 -54.181174 324.96159 - 400 8.5960916 -55.09236 0 -54.133453 334.83136 - 600 8.1607556 -55.073136 0 -54.162791 339.035 - 800 8.8350489 -55.133382 0 -54.147819 324.48149 - 1000 8.5692704 -55.118463 0 -54.162548 327.26328 - 1200 8.4174147 -55.126297 0 -54.187322 324.4248 - 1400 8.6362603 -55.123075 0 -54.159688 326.7798 - 1600 8.222512 -55.153799 0 -54.236565 317.8147 - 1800 8.324523 -55.116698 0 -54.188085 327.35373 - 2000 7.9615959 -55.155825 0 -54.267697 315.37215 - 2200 8.495968 -55.083943 0 -54.136205 336.67775 - 2400 7.7926986 -55.044816 0 -54.175529 344.87758 - 2600 8.1551351 -55.069404 0 -54.159687 339.60901 - 2800 8.2593599 -55.084151 0 -54.162807 336.54935 - 3000 8.2860869 -55.110296 0 -54.185971 328.99074 - 3200 8.4074534 -55.123576 0 -54.185712 326.06823 - 3400 8.6694364 -55.128925 0 -54.161836 324.67512 - 3600 8.5718984 -55.129861 0 -54.173653 325.20586 - 3800 8.508102 -55.099093 0 -54.150001 333.91437 - 4000 8.2966658 -55.117782 0 -54.192276 327.13516 - 4200 8.7641728 -55.135792 0 -54.158136 324.00844 - 4400 8.8827909 -55.096369 0 -54.10548 335.08467 - 4600 8.7666577 -55.127213 0 -54.149279 326.15539 - 4800 8.6670762 -55.163395 0 -54.19657 316.48383 - 5000 8.1893094 -55.073756 0 -54.160226 337.95271 -Loop time of 0.870594 on 4 procs for 5000 steps with 864 atoms - -Performance: 49621.267 ns/day, 0.000 hours/ns, 5743.202 timesteps/s -96.5% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.33582 | 0.35125 | 0.3724 | 2.3 | 40.35 -Bond | 0.00030267 | 0.00031316 | 0.00033538 | 0.0 | 0.04 -Neigh | 0.034246 | 0.03479 | 0.035904 | 0.4 | 4.00 -Comm | 0.15068 | 0.17419 | 0.19191 | 3.6 | 20.01 -Output | 0.00044776 | 0.00054703 | 0.00083177 | 0.0 | 0.06 -Modify | 0.27679 | 0.28079 | 0.28849 | 0.9 | 32.25 -Other | | 0.02871 | | | 3.30 - -Nlocal: 216 ave 216 max 216 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Nghost: 888.75 ave 899 max 876 min -Histogram: 1 0 1 0 0 0 0 0 0 2 -Neighs: 4536 ave 4737 max 4335 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 18144 -Ave neighs/atom = 21 -Ave special neighs/atom = 0 -Neighbor list builds = 178 -Dangerous builds = 11 - - -Total wall time: 0:00:00 diff --git a/examples/gjf/log.15Oct19.gjf.vhalf.g++.1 b/examples/gjf/log.15Oct19.gjf.vhalf.g++.1 deleted file mode 100644 index a87b20a887..0000000000 --- a/examples/gjf/log.15Oct19.gjf.vhalf.g++.1 +++ /dev/null @@ -1,125 +0,0 @@ -LAMMPS (19 Sep 2019) - using 1 OpenMP thread(s) per MPI task -# GJF-2GJ thermostat - -units metal -atom_style full - -boundary p p p -read_data argon.lmp - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 864 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000147804 secs - read_data CPU = 0.00194898 secs - -include ff-argon.lmp -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Ar equal 1 - -############# -#Atom Masses# -############# - -mass ${Ar} 39.903 -mass 1 39.903 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style lj/cubic -pair_coeff * * 0.0102701 3.42 - - -velocity all create 10 2357 mom yes dist gaussian - -neighbor 1 bin - -timestep 0.1 - -fix lang all langevin 10 10 1 26488 gjf vhalf -fix nve all nve - -thermo 200 -run 5000 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.5 | 6.5 | 6.5 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 11.080223 -56.207655 0 -54.97164 37.215524 - 200 9.8808568 -55.073602 0 -53.971378 345.62207 - 400 9.8712816 -55.072244 0 -53.971088 345.11889 - 600 10.528988 -55.066739 0 -53.892214 350.60093 - 800 10.167171 -55.148315 0 -54.014152 324.73679 - 1000 10.029026 -55.125709 0 -54.006956 331.93766 - 1200 10.194424 -55.114892 0 -53.977688 334.36032 - 1400 9.3473846 -55.109233 0 -54.066518 333.64378 - 1600 9.7774071 -55.138161 0 -54.047477 327.02358 - 1800 9.9814275 -55.13355 0 -54.020107 328.30017 - 2000 10.2515 -55.062994 0 -53.919424 349.74304 - 2200 9.8126922 -55.13364 0 -54.039019 328.78521 - 2400 10.044314 -55.163702 0 -54.043244 321.03397 - 2600 10.543316 -55.112054 0 -53.935932 336.82099 - 2800 9.7874375 -55.147275 0 -54.055472 324.06626 - 3000 9.7703821 -55.135164 0 -54.045263 328.60665 - 3200 10.141958 -55.135753 0 -54.004402 327.69084 - 3400 10.160576 -55.135408 0 -54.00198 329.39063 - 3600 10.044652 -55.103932 0 -53.983436 336.64469 - 3800 10.662403 -55.103648 0 -53.914241 339.56382 - 4000 9.2921047 -55.120402 0 -54.083853 329.71671 - 4200 9.8744553 -55.129011 0 -54.027501 329.78147 - 4400 9.4085964 -55.153089 0 -54.103546 320.90673 - 4600 9.5463801 -55.124053 0 -54.05914 330.80941 - 4800 10.223884 -55.075877 0 -53.935387 344.30099 - 5000 9.6243338 -55.158604 0 -54.084996 320.3511 -Loop time of 2.29551 on 1 procs for 5000 steps with 864 atoms - -Performance: 18819.358 ns/day, 0.001 hours/ns, 2178.166 timesteps/s -99.7% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.4393 | 1.4393 | 1.4393 | 0.0 | 62.70 -Bond | 0.0004441 | 0.0004441 | 0.0004441 | 0.0 | 0.02 -Neigh | 0.12136 | 0.12136 | 0.12136 | 0.0 | 5.29 -Comm | 0.059342 | 0.059342 | 0.059342 | 0.0 | 2.59 -Output | 0.00046968 | 0.00046968 | 0.00046968 | 0.0 | 0.02 -Modify | 0.64937 | 0.64937 | 0.64937 | 0.0 | 28.29 -Other | | 0.02522 | | | 1.10 - -Nlocal: 864 ave 864 max 864 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 1593 ave 1593 max 1593 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 18143 ave 18143 max 18143 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 18143 -Ave neighs/atom = 20.9988 -Ave special neighs/atom = 0 -Neighbor list builds = 158 -Dangerous builds = 5 - - -Total wall time: 0:00:02 diff --git a/examples/gjf/log.15Oct19.gjf.vhalf.g++.4 b/examples/gjf/log.15Oct19.gjf.vhalf.g++.4 deleted file mode 100644 index a70a67a89c..0000000000 --- a/examples/gjf/log.15Oct19.gjf.vhalf.g++.4 +++ /dev/null @@ -1,125 +0,0 @@ -LAMMPS (19 Sep 2019) - using 1 OpenMP thread(s) per MPI task -# GJF-2GJ thermostat - -units metal -atom_style full - -boundary p p p -read_data argon.lmp - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 864 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000315903 secs - read_data CPU = 0.0653752 secs - -include ff-argon.lmp -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Ar equal 1 - -############# -#Atom Masses# -############# - -mass ${Ar} 39.903 -mass 1 39.903 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style lj/cubic -pair_coeff * * 0.0102701 3.42 - - -velocity all create 10 2357 mom yes dist gaussian - -neighbor 1 bin - -timestep 0.1 - -fix lang all langevin 10 10 1 26488 gjf vhalf -fix nve all nve - -thermo 200 -run 5000 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.433 | 6.433 | 6.433 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 11.080228 -56.207655 0 -54.971639 37.215541 - 200 9.8046716 -55.127334 0 -54.033608 329.70647 - 400 10.174622 -55.09236 0 -53.957366 340.49331 - 600 9.9812299 -55.073136 0 -53.959714 345.56477 - 800 10.512874 -55.133382 0 -53.960655 330.4996 - 1000 9.9587885 -55.118463 0 -54.007545 332.24728 - 1200 10.236607 -55.126297 0 -53.984388 330.94998 - 1400 10.134679 -55.123075 0 -53.992537 332.15441 - 1600 9.8934078 -55.153799 0 -54.050174 323.80795 - 1800 10.064966 -55.116698 0 -53.993936 333.59644 - 2000 9.6736107 -55.155825 0 -54.076719 321.5129 - 2200 10.264537 -55.083943 0 -53.938918 343.02135 - 2400 9.5640032 -55.044816 0 -53.977937 351.23099 - 2600 9.6581077 -55.069404 0 -53.992028 344.99996 - 2800 9.9622575 -55.084151 0 -53.972846 342.6574 - 3000 9.8724909 -55.110296 0 -54.009005 334.68094 - 3200 10.032027 -55.123576 0 -54.004488 331.89534 - 3400 10.221132 -55.128925 0 -53.988742 330.24082 - 3600 10.085802 -55.129861 0 -54.004774 330.63601 - 3800 10.098545 -55.099093 0 -53.972585 339.61905 - 4000 10.000257 -55.117782 0 -54.002238 333.24569 - 4200 10.20477 -55.135792 0 -53.997435 329.17565 - 4400 10.545132 -55.096369 0 -53.920044 341.04725 - 4600 10.376108 -55.127213 0 -53.969743 331.92825 - 4800 10.247392 -55.163395 0 -54.020283 322.15219 - 5000 9.7753102 -55.073756 0 -53.983305 343.64146 -Loop time of 1.19785 on 4 procs for 5000 steps with 864 atoms - -Performance: 36064.674 ns/day, 0.001 hours/ns, 4174.152 timesteps/s -88.6% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.36387 | 0.38652 | 0.44086 | 5.1 | 32.27 -Bond | 0.00028847 | 0.00030833 | 0.000338 | 0.0 | 0.03 -Neigh | 0.033934 | 0.034959 | 0.036917 | 0.6 | 2.92 -Comm | 0.39292 | 0.47821 | 0.52198 | 7.3 | 39.92 -Output | 0.00050343 | 0.0012343 | 0.0023338 | 1.9 | 0.10 -Modify | 0.1605 | 0.17963 | 0.19457 | 2.9 | 15.00 -Other | | 0.117 | | | 9.77 - -Nlocal: 216 ave 216 max 216 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Nghost: 888.75 ave 899 max 876 min -Histogram: 1 0 1 0 0 0 0 0 0 2 -Neighs: 4536 ave 4737 max 4335 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 18144 -Ave neighs/atom = 21 -Ave special neighs/atom = 0 -Neighbor list builds = 178 -Dangerous builds = 11 - - -Total wall time: 0:00:01 diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 new file mode 100644 index 0000000000..a1cb4de702 --- /dev/null +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 @@ -0,0 +1,152 @@ +LAMMPS (2 Apr 2025 - Development - 4dd8c66390-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.007 seconds + +include ff-argon.lmp +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 +mass 1 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + + +velocity all create 10 2357 mom yes dist gaussian + +neighbor 1 bin + +timestep 0.1 + +fix lang all langevin/gjf 10 10 1 26488 vel vfull method 4 + +thermo 200 +run 5000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- Langevin GJF methods: doi:10.1007/s10955-024-03345-1 + +@Article{gronbech_jensen_2024, +title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations}, +volume = {191}, +number = {10}, +url = {https://doi.org/10.1007/s10955-024-03345-1}, +doi = {10.1007/s10955-024-03345-1}, +urldate = {2024-10-22}, +journal = {J. Stat. Phys.}, +author = {Gronbech-Jensen, Niels}, +year = {2024}, +pages = {137} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.9407173 + ghost atom cutoff = 6.9407173 + binsize = 3.4703587, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 10 -56.207652 0 -55.092137 33.341103 + 200 8.3566091 -55.074758 0 -54.142565 340.34804 + 400 8.5550582 -55.098903 0 -54.144573 333.63174 + 600 8.7873675 -55.044559 0 -54.064315 350.7384 + 800 8.7258741 -55.149735 0 -54.17635 318.83613 + 1000 8.3748307 -55.059754 0 -54.125529 343.7989 + 1200 8.6082188 -55.156326 0 -54.196066 316.8728 + 1400 8.9291902 -55.11836 0 -54.122295 328.12488 + 1600 8.3386383 -55.119788 0 -54.189601 325.81369 + 1800 8.0698034 -55.076285 0 -54.176086 338.69767 + 2000 8.5103978 -55.084479 0 -54.135131 338.12197 + 2200 8.3201517 -55.104858 0 -54.176733 329.95905 + 2400 8.7070407 -55.120649 0 -54.149366 328.06488 + 2600 8.4244379 -55.147583 0 -54.207824 321.45013 + 2800 8.7911907 -55.127309 0 -54.146638 325.76049 + 3000 8.250829 -55.1039 0 -54.183508 332.05048 + 3200 8.693979 -55.155552 0 -54.185726 318.29736 + 3400 8.9806023 -55.127303 0 -54.125504 327.48861 + 3600 8.8313967 -55.081076 0 -54.09592 339.16793 + 3800 8.8008688 -55.176748 0 -54.194998 313.08151 + 4000 8.1780418 -55.105368 0 -54.193096 330.04164 + 4200 8.3772045 -55.128813 0 -54.194323 324.29069 + 4400 8.3580983 -55.086979 0 -54.154621 335.63911 + 4600 8.1493124 -55.096648 0 -54.18758 332.51502 + 4800 9.0189389 -55.126828 0 -54.120752 326.36041 + 5000 8.7587383 -55.084993 0 -54.107943 337.17399 +Loop time of 2.34344 on 1 procs for 5000 steps with 864 atoms + +Performance: 18434.456 ns/day, 0.001 hours/ns, 2133.618 timesteps/s, 1.843 Matom-step/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.3044 | 1.3044 | 1.3044 | 0.0 | 55.66 +Bond | 0.00055276 | 0.00055276 | 0.00055276 | 0.0 | 0.02 +Neigh | 0.27376 | 0.27376 | 0.27376 | 0.0 | 11.68 +Comm | 0.055077 | 0.055077 | 0.055077 | 0.0 | 2.35 +Output | 0.00055401 | 0.00055401 | 0.00055401 | 0.0 | 0.02 +Modify | 0.68502 | 0.68502 | 0.68502 | 0.0 | 29.23 +Other | | 0.02412 | | | 1.03 + +Nlocal: 864 ave 864 max 864 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1593 ave 1593 max 1593 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 18143 ave 18143 max 18143 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 18143 +Ave neighs/atom = 20.998843 +Ave special neighs/atom = 0 +Neighbor list builds = 257 +Dangerous builds = 0 + + +Total wall time: 0:00:02 diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 new file mode 100644 index 0000000000..6d9543c087 --- /dev/null +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 @@ -0,0 +1,152 @@ +LAMMPS (2 Apr 2025 - Development - 4dd8c66390-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.002 seconds + read_data CPU = 0.014 seconds + +include ff-argon.lmp +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 +mass 1 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + + +velocity all create 10 2357 mom yes dist gaussian + +neighbor 1 bin + +timestep 0.1 + +fix lang all langevin/gjf 10 10 1 26488 vel vfull method 4 + +thermo 200 +run 5000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- Langevin GJF methods: doi:10.1007/s10955-024-03345-1 + +@Article{gronbech_jensen_2024, +title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations}, +volume = {191}, +number = {10}, +url = {https://doi.org/10.1007/s10955-024-03345-1}, +doi = {10.1007/s10955-024-03345-1}, +urldate = {2024-10-22}, +journal = {J. Stat. Phys.}, +author = {Gronbech-Jensen, Niels}, +year = {2024}, +pages = {137} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.9407173 + ghost atom cutoff = 6.9407173 + binsize = 3.4703587, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 10 -56.207652 0 -55.092137 33.341103 + 200 8.3950866 -55.088994 0 -54.15251 334.90536 + 400 8.6408464 -55.090811 0 -54.126912 335.23135 + 600 8.3101447 -55.121286 0 -54.194277 325.43222 + 800 8.5045003 -55.090513 0 -54.141824 335.05857 + 1000 8.7236378 -55.101455 0 -54.12832 331.96596 + 1200 8.7063561 -55.109371 0 -54.138164 331.62683 + 1400 8.7935957 -55.089763 0 -54.108824 336.89842 + 1600 8.454418 -55.105207 0 -54.162104 330.18927 + 1800 8.7989267 -55.142078 0 -54.160544 322.47021 + 2000 8.7823094 -55.153625 0 -54.173945 318.95028 + 2200 8.6201117 -55.11511 0 -54.153524 329.13488 + 2400 9.1165215 -55.161069 0 -54.144107 318.48524 + 2600 8.7636341 -55.142401 0 -54.164805 322.46493 + 2800 8.4876731 -55.111528 0 -54.164715 329.66127 + 3000 8.7005957 -55.149445 0 -54.178881 319.92878 + 3200 8.1711364 -55.137611 0 -54.226108 322.83713 + 3400 8.7172512 -55.143449 0 -54.171026 322.68918 + 3600 8.6262526 -55.1002 0 -54.137928 333.02737 + 3800 8.1680259 -55.166423 0 -54.255267 313.66684 + 4000 8.8340067 -55.121759 0 -54.136312 328.58235 + 4200 8.427926 -55.126903 0 -54.186755 324.95528 + 4400 8.6352614 -55.193826 0 -54.23055 307.14392 + 4600 8.7381405 -55.120503 0 -54.14575 327.73985 + 4800 8.3857194 -55.081944 0 -54.146505 337.38629 + 5000 8.1179517 -55.162247 0 -54.256677 314.50176 +Loop time of 2.08834 on 4 procs for 5000 steps with 864 atoms + +Performance: 20686.324 ns/day, 0.001 hours/ns, 2394.250 timesteps/s, 2.069 Matom-step/s +63.4% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.53532 | 0.5439 | 0.54781 | 0.7 | 26.04 +Bond | 0.0006347 | 0.00066042 | 0.00068198 | 0.0 | 0.03 +Neigh | 0.10879 | 0.11194 | 0.118 | 1.1 | 5.36 +Comm | 0.94935 | 0.96017 | 0.97155 | 0.8 | 45.98 +Output | 0.0060135 | 0.006061 | 0.0061217 | 0.1 | 0.29 +Modify | 0.2483 | 0.24911 | 0.25049 | 0.2 | 11.93 +Other | | 0.2165 | | | 10.37 + +Nlocal: 216 ave 216 max 216 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 884.25 ave 892 max 875 min +Histogram: 1 1 0 0 0 0 0 0 0 2 +Neighs: 4535.5 ave 4737 max 4333 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 18142 +Ave neighs/atom = 20.997685 +Ave special neighs/atom = 0 +Neighbor list builds = 280 +Dangerous builds = 0 + + +Total wall time: 0:00:02 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 new file mode 100644 index 0000000000..fed8f271e5 --- /dev/null +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 @@ -0,0 +1,152 @@ +LAMMPS (2 Apr 2025 - Development - 4dd8c66390-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.008 seconds + +include ff-argon.lmp +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 +mass 1 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + + +velocity all create 10 2357 mom yes dist gaussian + +neighbor 1 bin + +timestep 0.1 + +fix lang all langevin/gjf 10 10 1 26488 + +thermo 200 +run 5000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- Langevin GJF methods: doi:10.1007/s10955-024-03345-1 + +@Article{gronbech_jensen_2024, +title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations}, +volume = {191}, +number = {10}, +url = {https://doi.org/10.1007/s10955-024-03345-1}, +doi = {10.1007/s10955-024-03345-1}, +urldate = {2024-10-22}, +journal = {J. Stat. Phys.}, +author = {Gronbech-Jensen, Niels}, +year = {2024}, +pages = {137} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.9407173 + ghost atom cutoff = 6.9407173 + binsize = 3.4703587, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 10 -56.207652 0 -55.092137 33.341103 + 200 9.8808461 -55.073599 0 -53.971376 345.62224 + 400 9.8712816 -55.072241 0 -53.971084 345.11909 + 600 10.528988 -55.066736 0 -53.892211 350.60112 + 800 10.167171 -55.148312 0 -54.014149 324.73698 + 1000 10.029026 -55.125705 0 -54.006952 331.93785 + 1200 9.8898479 -55.086642 0 -53.983414 342.04309 + 1400 10.610014 -55.076793 0 -53.89323 346.34338 + 1600 9.9402137 -55.111688 0 -54.002842 335.04779 + 1800 9.8078801 -55.140475 0 -54.046391 325.88652 + 2000 10.472791 -55.06102 0 -53.892765 349.97306 + 2200 9.877248 -55.191201 0 -54.089379 312.77421 + 2400 9.9739487 -55.108904 0 -53.996295 335.9089 + 2600 10.131803 -55.149444 0 -54.019226 325.44115 + 2800 9.6980127 -55.118395 0 -54.036568 331.2097 + 3000 9.7193425 -55.149785 0 -54.065577 323.32384 + 3200 10.27638 -55.083302 0 -53.936957 342.56458 + 3400 9.9253941 -55.082368 0 -53.975175 342.28594 + 3600 10.665862 -55.056774 0 -53.866981 352.03551 + 3800 10.011077 -55.084664 0 -53.967913 341.45122 + 4000 9.4182671 -55.128803 0 -54.078181 327.81846 + 4200 10.02466 -55.106046 0 -53.98778 336.56944 + 4400 9.3721033 -55.146068 0 -54.100596 322.38199 + 4600 9.5485537 -55.118577 0 -54.053421 332.04274 + 4800 10.039726 -55.074068 0 -53.954122 344.76817 + 5000 9.7731898 -55.150518 0 -54.060304 322.94195 +Loop time of 2.28614 on 1 procs for 5000 steps with 864 atoms + +Performance: 18896.448 ns/day, 0.001 hours/ns, 2187.089 timesteps/s, 1.890 Matom-step/s +100.0% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.2918 | 1.2918 | 1.2918 | 0.0 | 56.51 +Bond | 0.00048345 | 0.00048345 | 0.00048345 | 0.0 | 0.02 +Neigh | 0.2776 | 0.2776 | 0.2776 | 0.0 | 12.14 +Comm | 0.055375 | 0.055375 | 0.055375 | 0.0 | 2.42 +Output | 0.00054609 | 0.00054609 | 0.00054609 | 0.0 | 0.02 +Modify | 0.63625 | 0.63625 | 0.63625 | 0.0 | 27.83 +Other | | 0.02408 | | | 1.05 + +Nlocal: 864 ave 864 max 864 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1593 ave 1593 max 1593 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 18143 ave 18143 max 18143 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 18143 +Ave neighs/atom = 20.998843 +Ave special neighs/atom = 0 +Neighbor list builds = 258 +Dangerous builds = 0 + + +Total wall time: 0:00:02 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 new file mode 100644 index 0000000000..aa90fb779b --- /dev/null +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 @@ -0,0 +1,152 @@ +LAMMPS (2 Apr 2025 - Development - 4dd8c66390-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.002 seconds + read_data CPU = 0.014 seconds + +include ff-argon.lmp +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 +mass 1 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + + +velocity all create 10 2357 mom yes dist gaussian + +neighbor 1 bin + +timestep 0.1 + +fix lang all langevin/gjf 10 10 1 26488 + +thermo 200 +run 5000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- Langevin GJF methods: doi:10.1007/s10955-024-03345-1 + +@Article{gronbech_jensen_2024, +title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations}, +volume = {191}, +number = {10}, +url = {https://doi.org/10.1007/s10955-024-03345-1}, +doi = {10.1007/s10955-024-03345-1}, +urldate = {2024-10-22}, +journal = {J. Stat. Phys.}, +author = {Gronbech-Jensen, Niels}, +year = {2024}, +pages = {137} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.9407173 + ghost atom cutoff = 6.9407173 + binsize = 3.4703587, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 10 -56.207652 0 -55.092137 33.341103 + 200 9.8046819 -55.12733 0 -54.033603 329.70683 + 400 10.174622 -55.092357 0 -53.957363 340.4935 + 600 9.6157634 -55.174205 0 -54.101552 316.68047 + 800 9.9617862 -55.097525 0 -53.986273 339.257 + 1000 10.373198 -55.116484 0 -53.959338 335.09796 + 1200 10.064779 -55.17366 0 -54.050919 318.66487 + 1400 10.562182 -55.067856 0 -53.889628 349.23452 + 1600 9.7696935 -55.081542 0 -53.991718 342.92593 + 1800 10.454466 -55.130637 0 -53.964426 330.88658 + 2000 10.253701 -55.154093 0 -54.010277 323.15259 + 2200 9.6688957 -55.143479 0 -54.064899 325.16815 + 2400 10.059787 -55.134941 0 -54.012756 329.83534 + 2600 9.9050905 -55.096231 0 -53.991303 338.94947 + 2800 9.663551 -55.130202 0 -54.052218 328.77571 + 3000 9.950484 -55.123447 0 -54.013455 332.00143 + 3200 9.7210637 -55.120005 0 -54.035606 331.39812 + 3400 9.6457139 -55.080953 0 -54.004959 341.95838 + 3600 10.42249 -55.102379 0 -53.939734 339.66808 + 3800 10.276893 -55.126271 0 -53.979868 332.40943 + 4000 10.135481 -55.091551 0 -53.960922 340.60675 + 4200 10.129209 -55.084189 0 -53.95426 343.39315 + 4400 10.006953 -55.120704 0 -54.004413 331.57121 + 4600 10.497483 -55.144898 0 -53.973888 327.22996 + 4800 9.9230954 -55.126028 0 -54.019091 330.70489 + 5000 9.3726166 -55.076514 0 -54.030985 342.43571 +Loop time of 2.0887 on 4 procs for 5000 steps with 864 atoms + +Performance: 20682.713 ns/day, 0.001 hours/ns, 2393.833 timesteps/s, 2.068 Matom-step/s +62.5% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.53905 | 0.54518 | 0.5484 | 0.5 | 26.10 +Bond | 0.00062355 | 0.00066183 | 0.0007207 | 0.0 | 0.03 +Neigh | 0.10715 | 0.10937 | 0.11212 | 0.5 | 5.24 +Comm | 0.94637 | 0.95041 | 0.95905 | 0.5 | 45.50 +Output | 0.0061059 | 0.0061286 | 0.0061661 | 0.0 | 0.29 +Modify | 0.26086 | 0.26355 | 0.26979 | 0.7 | 12.62 +Other | | 0.2134 | | | 10.22 + +Nlocal: 216 ave 216 max 216 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 884.75 ave 885 max 884 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Neighs: 4536 ave 4737 max 4335 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 18144 +Ave neighs/atom = 21 +Ave special neighs/atom = 0 +Neighbor list builds = 273 +Dangerous builds = 0 + + +Total wall time: 0:00:02 diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp index 59d5cff1c5..95d67fb15f 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -15,17 +15,16 @@ Contributing authors: Tim Linke & Niels Gronbech-Jensen (UC Davis) ------------------------------------------------------------------------- */ -#include "fix_langevin.h" +#include "fix_langevin_gjf.h" #include "atom.h" -#include "atom_vec_ellipsoid.h" +#include "citeme.h" #include "comm.h" #include "compute.h" #include "error.h" #include "force.h" #include "group.h" #include "input.h" -#include "math_extra.h" #include "memory.h" #include "modify.h" #include "random_mars.h" @@ -42,21 +41,33 @@ using namespace FixConst; enum { NOBIAS, BIAS }; enum { CONSTANT, EQUAL, ATOM }; +static const char cite_langevin_gjf[] = + "Langevin GJF methods: doi:10.1007/s10955-024-03345-1\n\n" + "@Article{gronbech_jensen_2024,\n" + "title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations},\n" + "volume = {191},\n" + "number = {10},\n" + "url = {https://doi.org/10.1007/s10955-024-03345-1},\n" + "doi = {10.1007/s10955-024-03345-1},\n" + "urldate = {2024-10-22},\n" + "journal = {J. Stat. Phys.},\n" + "author = {Gronbech-Jensen, Niels},\n" + "year = {2024},\n" + "pages = {137}\n" + "}\n\n"; + + /* ---------------------------------------------------------------------- */ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), gjfflag(0), - tstr(nullptr), flangevin(nullptr), tforce(nullptr), lv(nullptr), id_temp(nullptr), random(nullptr) + Fix(lmp, narg, arg), tstr(nullptr), tforce(nullptr), lv(nullptr), id_temp(nullptr), random(nullptr) { - if (narg < 8) error->all(FLERR, "Illegal fix langevin/gjf command"); + if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf); + if (narg < 7) error->all(FLERR, "Illegal fix langevin/gjf command"); time_integrate = 1; restart_peratom = 1; - // dynamic_group_allow = 1; - // scalar_flag = 1; - // global_freq = 1; - // extscalar = 1; - // ecouple_flag = 1; + global_freq = 1; nevery = 1; if (utils::strmatch(arg[3], "^v_")) { @@ -75,15 +86,17 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : if (seed <= 0) error->all(FLERR, "Illegal fix langevin/gjf command"); // initialize Marsaglia RNG with processor-unique seed - random = new RanMars(lmp, seed + comm->me); - int GJmethods = 8 // number of currently implemented GJ methods + int GJmethods = 8; // number of currently implemented GJ methods + maxatom = 0; // optional args + // per default, use half step and GJ-I osflag = 0; - GJmethod = 0; + GJmethod = 1; + lv_allocated = 0; int iarg = 7; while (iarg < narg) { @@ -120,7 +133,7 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : FixLangevinGJF::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); - // initialize lv to zero + // initialize lv to onsite velocity int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { lv[i][0] = 0.0; @@ -181,14 +194,8 @@ void FixLangevinGJF::init() error->all(FLERR, "Variable {} for fix langevin/gjf is invalid style", tstr); } - if (temperature && temperature->tempbias) - tbiasflag = BIAS; - else - tbiasflag = NOBIAS; - if (utils::strmatch(update->integrate_style, "^respa")) { - nlevels_respa = (static_cast(update->integrate))->nlevels; - error->all(FLERR, "Fix langevin gjf and run style respa are not compatible"); + error->all(FLERR, "Fix langevin/gjf and run style respa are not compatible"); } // Complete set of thermostats is given in Gronbech-Jensen, Molecular Physics, 118 (2020) @@ -215,7 +222,7 @@ void FixLangevinGJF::init() gjfc2 = 1; // TODO: correct this break; case 8: // provided in Gronbech-Jensen (2024) - gjfc2 = sqrt( (update->dt / t_period)*(update->dt / t_period) + 1.0 ) - update->dt / t_period; + gjfc2 = sqrt( (update->dt / t_period) * (update->dt / t_period) + 1.0 ) - update->dt / t_period; break; case 0: gjfc2 = 0.0; @@ -239,7 +246,7 @@ void FixLangevinGJF::init() void FixLangevinGJF::initial_integrate(int /* vflag */) { - // This function provides the integration of the GJ formulation 24a-e + // This function provides the integration of the GJ formulation 24 a-e double **x = atom->x; double **v = atom->v; double **f = atom->f; @@ -258,13 +265,13 @@ void FixLangevinGJF::initial_integrate(int /* vflag */) double dtf = 0.5 * dt * ftm2v; double dtfm; - double c1sq = sqrt(gjfc1); - double c3sq = sqrt(gjfc3); + double c1sqrt = sqrt(gjfc1); + double c3sqrt = sqrt(gjfc3); double csq = sqrt(gjfc3 / gjfc1); double m, beta; // If user elected vhalf, v needs to be reassigned to onsite velocity for integration - if (!osflag) { + if (!osflag && lv_allocated) { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { // lv is Eq. 24f from previous time step @@ -275,8 +282,6 @@ void FixLangevinGJF::initial_integrate(int /* vflag */) } compute_target(); - - if (tbiasflag == BIAS) temperature->compute_scalar(); for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { @@ -284,10 +289,10 @@ void FixLangevinGJF::initial_integrate(int /* vflag */) if (tstyle == ATOM) tsqrt = sqrt(tforce[i]); if (rmass) { m = rmass[i]; - beta = tsqrt * sqrt(2.0*dt*rmass[i]*boltz/t_period/mvv2e) / ftm2v; + beta = tsqrt * sqrt(2.0*dt*m*boltz/t_period/mvv2e) / ftm2v; } else { m = mass[type[i]]; - beta = tsqrt * sqrt(2.0*dt*atom->mass[i]*boltz/t_period/mvv2e) / ftm2v; + beta = tsqrt * sqrt(2.0*dt*m*boltz/t_period/mvv2e) / ftm2v; } fran[0] = beta*random->gaussian(); @@ -304,24 +309,14 @@ void FixLangevinGJF::initial_integrate(int /* vflag */) x[i][2] += 0.5 * csq * dt * v[i][2]; // Calculate Eq. 24c: - if (tbiasflag == BIAS) - temperature->remove_bias(i,v[i]); lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c3sqrt / (2.0 * m)) * fran[0]; lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c3sqrt / (2.0 * m)) * fran[1]; lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c3sqrt / (2.0 * m)) * fran[2]; - if (tbiasflag == BIAS) - temperature->restore_bias(i,v[i]); - if (tbiasflag == BIAS) - temperature->restore_bias(i,lv[i]); - // Calculate Eq. 24d - if (tbiasflag == BIAS) temperature->remove_bias(i, v[i]); - v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * csq * (0.5 / m) * fran[0]; v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * csq * (0.5 / m) * fran[1]; v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * csq * (0.5 / m) * fran[2]; - if (tbiasflag == BIAS) temperature->restore_bias(i, v[i]); // Calculate Eq. 24e. Final integrator then calculates Eq. 24f after force update. x[i][0] += 0.5 * csq * dt * v[i][0]; @@ -337,9 +332,9 @@ void FixLangevinGJF::final_integrate() double dt = update->dt; double ftm2v = force->ftm2v; double dtf = 0.5 * dt * ftm2v; + double csq = sqrt(gjfc3 / gjfc1); // update v of atoms in group - double **v = atom->v; double **f = atom->f; double *rmass = atom->rmass; @@ -367,6 +362,8 @@ void FixLangevinGJF::final_integrate() v[i][2] += csq * dtfm * f[i][2]; } } + + lv_allocated = 1; } /* ---------------------------------------------------------------------- @@ -395,10 +392,10 @@ void FixLangevinGJF::compute_target() error->one(FLERR, "Fix langevin/gjf variable returned negative temperature"); tsqrt = sqrt(t_target); } else { - if (atom->nmax > maxatom2) { - maxatom2 = atom->nmax; + if (atom->nmax > maxatom) { + maxatom = atom->nmax; memory->destroy(tforce); - memory->create(tforce,maxatom2,"langevin:tforce"); + memory->create(tforce,maxatom,"langevin_gjf:tforce"); } input->variable->compute_atom(tvar,igroup,tforce,1,0); for (int i = 0; i < nlocal; i++) diff --git a/src/EXTRA-FIX/fix_langevin_gjf.h b/src/EXTRA-FIX/fix_langevin_gjf.h index df6b80e1b7..4b65051cf5 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.h +++ b/src/EXTRA-FIX/fix_langevin_gjf.h @@ -13,12 +13,12 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(langevin,FixLangevin); +FixStyle(langevin/gjf,FixLangevinGJF); // clang-format on #else -#ifndef LMP_FIX_LANGEVIN_H -#define LMP_FIX_LANGEVIN_H +#ifndef LMP_FIX_LANGEVINGJF_H +#define LMP_FIX_LANGEVINGJF_H #include "fix.h" @@ -30,7 +30,6 @@ class FixLangevinGJF : public Fix { ~FixLangevinGJF() override; int setmask() override; void init() override; - void setup(int) override; void initial_integrate(int) override; void final_integrate() override; void end_of_step() override; @@ -45,10 +44,8 @@ class FixLangevinGJF : public Fix { int unpack_exchange(int, double *) override; protected: - int osflag, GJmethod; - double t_start, t_stop, t_period, t_target; - double *gfactor2; - double tsqrt; + int osflag, GJmethod, maxatom, lv_allocated; + double t_start, t_stop, t_period, t_target, tsqrt; double gjfc1, gjfc2, gjfc3; int tstyle, tvar; char *tstr; @@ -59,7 +56,6 @@ class FixLangevinGJF : public Fix { char *id_temp; class Compute *temperature; - int nlevels_respa; class RanMars *random; int seed; From 2bb945419012724480e4773e98e191ee53f2d9a2 Mon Sep 17 00:00:00 2001 From: talinke Date: Thu, 10 Apr 2025 13:15:30 -0700 Subject: [PATCH 36/94] Correct style --- doc/src/fix_langevin_gjf.rst | 32 +++++++++++++----------------- src/EXTRA-FIX/fix_langevin_gjf.cpp | 12 +++++------ 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/doc/src/fix_langevin_gjf.rst b/doc/src/fix_langevin_gjf.rst index e58b4305bd..a1fcea9c9a 100644 --- a/doc/src/fix_langevin_gjf.rst +++ b/doc/src/fix_langevin_gjf.rst @@ -56,20 +56,20 @@ quadratically with the timestep. The option *vhalf* outputs the have any statistical errors for any stable time step. An overview of statistically correct Boltzmann and Maxwell-Boltzmann sampling of true on-site and true half-step velocities is given in -:ref:`Gronbech-Jensen-2020 `. +:ref:`Gronbech-Jensen-2020 `. -This fix allows the use of any of the GJ methods as listed in :ref:`Gronbech-Jensen-2020 `. -The GJ-VII method is described in :ref:`Finkelstein `. -The implementation follows the splitting form provided in Eqs. (24) and (25) -in :ref:`Gronbech-Jensen-2024 `, including the application -of Gaussian noise values, per the description in +This fix allows the use of any of the GJ methods as listed in :ref:`Gronbech-Jensen-2020 `. +The GJ-VII method is described in :ref:`Finkelstein `. +The implementation follows the splitting form provided in Eqs. (24) and (25) +in :ref:`Gronbech-Jensen-2024 `, including the application +of Gaussian noise values, per the description in :ref:`Gronbech-Jensen-2023 `. .. note:: Unlike the :doc:`fix langevin ` command which performs force - modifications only, this fix performs thermostatting and time integration. + modifications only, this fix performs thermostatting and time integration. Thus you no longer need a separate time integration fix, like :doc:`fix nve `. See the :doc:`Howto thermostat ` page for @@ -138,20 +138,16 @@ The keyword *method* selects one of the eight GJ-methods implemented in LAMMPS. ---------- -.. include:: accel_styles.rst - ----------- - Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -No information about this fix is written to :doc:`binary restart files `. -Because the state of the random number generator is not saved in restart files, -this means you cannot do "exact" restarts with this fix, where the simulation -continues on the same as if no restart had taken place. However, in a -statistical sense, a restarted simulation should produce the same behavior. -The "exact" restart is done with either vfull or vhalf velocity output for as -long as the choice of vfull/vhalf is the same for the simulation as it is in +No information about this fix is written to :doc:`binary restart files `. +Because the state of the random number generator is not saved in restart files, +this means you cannot do "exact" restarts with this fix, where the simulation +continues on the same as if no restart had taken place. However, in a +statistical sense, a restarted simulation should produce the same behavior. +The "exact" restart is done with either vfull or vhalf velocity output for as +long as the choice of vfull/vhalf is the same for the simulation as it is in the restart file. The :doc:`fix_modify ` *temp* option is supported by this diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp index 95d67fb15f..c1aa3dfac7 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -129,7 +129,7 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : // register with Atom class // no need to set peratom_flag, b/c data is for internal use only - + FixLangevinGJF::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); @@ -282,12 +282,12 @@ void FixLangevinGJF::initial_integrate(int /* vflag */) } compute_target(); - + for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { if (tstyle == ATOM) tsqrt = sqrt(tforce[i]); - if (rmass) { + if (rmass) { m = rmass[i]; beta = tsqrt * sqrt(2.0*dt*m*boltz/t_period/mvv2e) / ftm2v; } else { @@ -298,7 +298,7 @@ void FixLangevinGJF::initial_integrate(int /* vflag */) fran[0] = beta*random->gaussian(); fran[1] = beta*random->gaussian(); fran[2] = beta*random->gaussian(); - + // First integration delivers Eq. 24a and 24b: dtfm = dtf / m; v[i][0] += csq * dtfm * f[i][0]; @@ -307,12 +307,12 @@ void FixLangevinGJF::initial_integrate(int /* vflag */) x[i][0] += 0.5 * csq * dt * v[i][0]; x[i][1] += 0.5 * csq * dt * v[i][1]; x[i][2] += 0.5 * csq * dt * v[i][2]; - + // Calculate Eq. 24c: lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c3sqrt / (2.0 * m)) * fran[0]; lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c3sqrt / (2.0 * m)) * fran[1]; lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c3sqrt / (2.0 * m)) * fran[2]; - + // Calculate Eq. 24d v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * csq * (0.5 / m) * fran[0]; v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * csq * (0.5 / m) * fran[1]; From a30daec3483d749489e387284186c275fc1b32d3 Mon Sep 17 00:00:00 2001 From: talinke Date: Fri, 11 Apr 2025 13:40:35 -0700 Subject: [PATCH 37/94] Addition of GJ-VII --- src/EXTRA-FIX/fix_langevin_gjf.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp index c1aa3dfac7..f9e523548f 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -66,7 +66,6 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : if (narg < 7) error->all(FLERR, "Illegal fix langevin/gjf command"); time_integrate = 1; - restart_peratom = 1; global_freq = 1; nevery = 1; @@ -219,7 +218,10 @@ void FixLangevinGJF::init() gjfc2 = (1.0 / (1.0 + update->dt / 2.0 / t_period)) * (1.0 / (1.0 + update->dt / 2.0 / t_period)); break; case 7: // provided in Finkelstein (2021) - gjfc2 = 1; // TODO: correct this + gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); //using GJ-I + gjfc1 = (1.0 + gjfc2) / 2.0; + gjfc3 = (1.0 - gjfc2) * t_period / update->dt; + gjfc2 = exp(-sqrt(gjfc3/gjfc1)*update->dt / t_period); break; case 8: // provided in Gronbech-Jensen (2024) gjfc2 = sqrt( (update->dt / t_period) * (update->dt / t_period) + 1.0 ) - update->dt / t_period; @@ -470,7 +472,10 @@ void FixLangevinGJF::reset_dt() gjfc2 = (1.0 / (1.0 + update->dt / 2.0 / t_period)) * (1.0 / (1.0 + update->dt / 2.0 / t_period)); break; case 7: // provided in Finkelstein (2021) - gjfc2 = 1; // TODO: correct this + gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); //using GJ-I + gjfc1 = (1.0 + gjfc2) / 2.0; + gjfc3 = (1.0 - gjfc2) * t_period / update->dt; + gjfc2 = exp(-sqrt(gjfc3/gjfc1)*update->dt / t_period); break; case 8: // provided in Gronbech-Jensen (2024) gjfc2 = sqrt( (update->dt / t_period)*(update->dt / t_period) + 1.0 ) - update->dt / t_period; From 09d3ac0a1bdfa1656329400a72598ece7a008fc6 Mon Sep 17 00:00:00 2001 From: talinke Date: Fri, 11 Apr 2025 20:07:25 -0700 Subject: [PATCH 38/94] Updated GJ-VII, GJ-VIII --- examples/gjf/README | 7 ++- src/EXTRA-FIX/fix_langevin_gjf.cpp | 69 ++++++++++++++++++++++-------- 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/examples/gjf/README b/examples/gjf/README index fdbc843522..c22df903e7 100644 --- a/examples/gjf/README +++ b/examples/gjf/README @@ -33,14 +33,13 @@ POTENTIAL ENERGY (eV) Script Commands: -- +fix lang all langevin/gjf 10 10 1 26488 +vs +-- fix nve all nve fix lang all langevin 10 10 1 26488 -- vs -- fix noho all nvt temp 10 10 1 --- -vs --- -fix lang all langevin/gjf 10 10 1 26488 -- \ No newline at end of file diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp index f9e523548f..c00fbb9ee5 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -41,8 +41,37 @@ using namespace FixConst; enum { NOBIAS, BIAS }; enum { CONSTANT, EQUAL, ATOM }; + static const char cite_langevin_gjf[] = - "Langevin GJF methods: doi:10.1007/s10955-024-03345-1\n\n" + "Langevin GJ methods: doi:10.1080/00268976.2019.1662506\n\n" + "@Article{gronbech-jensen_complete_2020,\n" + "title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations},\n" + "volume = {118},\n" + "number = {8},\n" + "url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506},\n" + "doi = {10.1080/00268976.2019.1662506},\n" + "journal = {Molecular Physics},\n" + "author = {Grønbech-Jensen, Niels},\n" + "year = {2020},\n" + "}\n\n"; + +static const char cite_langevin_gjf_7[] = + "Langevin GJ-VII method: doi:10.1063/5.0066008\n\n" + "@Article{finkelstein_2021,\n" + "title = {Bringing discrete-time Langevin splitting methods into agreement with thermodynamics},\n" + "volume = {155},\n" + "number = {18},\n" + "url = {https://doi.org/10.1063/5.0066008},\n" + "doi = {10.1063/5.0066008},\n" + "urldate = {2021-11-14},\n" + "journal = {J. Chem. Phys.},\n" + "author = {Finkelstein, Joshua and Cheng, Chungho and Fiorin, Giacomo and Seibold, Benjamin and Grønbech-Jensen, Niels},\n" + "year = {2021},\n" + "pages = {184104}\n" + "}\n\n"; + +static const char cite_langevin_gjf_8[] = + "Langevin GJ-VIII method: doi:10.1007/s10955-024-03345-1\n\n" "@Article{gronbech_jensen_2024,\n" "title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations},\n" "volume = {191},\n" @@ -55,7 +84,7 @@ static const char cite_langevin_gjf[] = "year = {2024},\n" "pages = {137}\n" "}\n\n"; - + /* ---------------------------------------------------------------------- */ @@ -109,10 +138,20 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Illegal fix langevin/gjf command"); iarg += 2; } else if (strcmp(arg[iarg], "method") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal fix langevin/gjf command"); GJmethod = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); - if (GJmethod < 0 || GJmethod > GJmethods) error->all(FLERR, "Invalid GJ method choice in langevin/gjf command"); - iarg += 2; + if (GJmethod = 7) { + if (iarg + 3 > narg) error->all(FLERR, "Illegal fix langevin/gjf command for GJ-VII"); + gjfc2 = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + if (gjfc2 < 0 || gjfc2 > 1) error->all(FLERR, "Choice of c2 in GJ-VII must be 0≤c2≤1"); + iarg += 3; + if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_7); + } + else { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix langevin/gjf command"); + if (GJmethod < 0 || GJmethod > GJmethods) error->all(FLERR, "Invalid GJ method choice in langevin/gjf command"); + if (GJmethod = 8) if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_8); + iarg += 2; + } } else error->all(FLERR, "Illegal fix langevin/gjf command"); } @@ -218,10 +257,7 @@ void FixLangevinGJF::init() gjfc2 = (1.0 / (1.0 + update->dt / 2.0 / t_period)) * (1.0 / (1.0 + update->dt / 2.0 / t_period)); break; case 7: // provided in Finkelstein (2021) - gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); //using GJ-I - gjfc1 = (1.0 + gjfc2) / 2.0; - gjfc3 = (1.0 - gjfc2) * t_period / update->dt; - gjfc2 = exp(-sqrt(gjfc3/gjfc1)*update->dt / t_period); + update->dt = (1.0 + gjfc2) / (1.0 - gjfc2) * log(gjfc2) * log(gjfc2) * 0.5 * t_period; break; case 8: // provided in Gronbech-Jensen (2024) gjfc2 = sqrt( (update->dt / t_period) * (update->dt / t_period) + 1.0 ) - update->dt / t_period; @@ -238,11 +274,11 @@ void FixLangevinGJF::init() } /* ---------------------------------------------------------------------- - integrate position and velocity according to the GJF method + integrate position and velocity according to the GJ methods in Grønbech-Jensen, J Stat Phys 191, 137 (2024). The general workflow is - 1. Langevin GJF Initial Integration + 1. Langevin GJ Initial Integration 2. Force Update - 3. Langevin GJF Final Integration + 3. Langevin GJ Final Integration 4. Velocity Choice in end_of_step() ------------------------------------------------------------------------- */ @@ -336,7 +372,6 @@ void FixLangevinGJF::final_integrate() double dtf = 0.5 * dt * ftm2v; double csq = sqrt(gjfc3 / gjfc1); - // update v of atoms in group double **v = atom->v; double **f = atom->f; double *rmass = atom->rmass; @@ -346,6 +381,7 @@ void FixLangevinGJF::final_integrate() int nlocal = atom->nlocal; if (igroup == atom->firstgroup) nlocal = atom->nfirst; + // Calculate Eq. 24f. if (rmass) { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -410,7 +446,7 @@ void FixLangevinGJF::compute_target() } /* ---------------------------------------------------------------------- - select velocity for GJF + select velocity for GJ ------------------------------------------------------------------------- */ void FixLangevinGJF::end_of_step() @@ -472,10 +508,7 @@ void FixLangevinGJF::reset_dt() gjfc2 = (1.0 / (1.0 + update->dt / 2.0 / t_period)) * (1.0 / (1.0 + update->dt / 2.0 / t_period)); break; case 7: // provided in Finkelstein (2021) - gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); //using GJ-I - gjfc1 = (1.0 + gjfc2) / 2.0; - gjfc3 = (1.0 - gjfc2) * t_period / update->dt; - gjfc2 = exp(-sqrt(gjfc3/gjfc1)*update->dt / t_period); + update->dt = (1.0 + gjfc2) / (1.0 - gjfc2) * log(gjfc2) * log(gjfc2) * 0.5 * t_period; break; case 8: // provided in Gronbech-Jensen (2024) gjfc2 = sqrt( (update->dt / t_period)*(update->dt / t_period) + 1.0 ) - update->dt / t_period; From e4c3b0c05e6a83d6d933a0514e09b8cb162728db Mon Sep 17 00:00:00 2001 From: talinke Date: Mon, 14 Apr 2025 11:33:02 -0700 Subject: [PATCH 39/94] New example and log files --- examples/gjf/README | 20 ++-- examples/gjf/in.gjf.vfull | 11 +- examples/gjf/in.gjf.vhalf | 9 +- examples/gjf/log.2Apr25.gjf.vfull.g++.1 | 137 +++++++++++++--------- examples/gjf/log.2Apr25.gjf.vfull.g++.4 | 147 ++++++++++++++---------- examples/gjf/log.2Apr25.gjf.vhalf.g++.1 | 131 ++++++++++++--------- examples/gjf/log.2Apr25.gjf.vhalf.g++.4 | 129 +++++++++++++-------- src/EXTRA-FIX/fix_langevin_gjf.cpp | 4 +- 8 files changed, 354 insertions(+), 234 deletions(-) diff --git a/examples/gjf/README b/examples/gjf/README index c22df903e7..b98e4134ab 100644 --- a/examples/gjf/README +++ b/examples/gjf/README @@ -13,33 +13,35 @@ mpirun -np $NP lmp_mpi -in.gjf.vhalf Compared to other thermostats, the GJ thermostat allows for larger timesteps with the correct Boltzmann statistics. A comparison using averaged properties from this example's input file is shown below. 'X' denotes a failed simulation. +The theoretical value for KE is 1.1168 eV. KINETIC ENERGY (eV) | Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | |==============||========|========|========|========|========|========|========| -| langevin/gjf || 1.112 | 1.108 | 1.114 | 1.118 | 1.111 | 1.133 | 1.168 | -| langevin || 1.113 | 1.125 | 1.121 | 1.135 | 1.152 | X | X | -| nvt || 1.094 | 1.114 | 1.117 | 1.113 | 1.121 | X | X | +| gjf half || 1.117 | 1.116 | 1.119 | 1.119 | 1.123 | 1.136 | 1.170 | +| gjf full || 1.116 | 1.071 | 0.938 | 0.898 | 0.858 | 0.817 | 0.780 | +| langevin || 1.110 | 1.113 | 1.121 | 1.129 | 1.157 | X | X | +| nvt || 1.083 | 1.109 | 1.112 | 1.113 | 1.114 | X | X | |--------------||--------|--------|--------|--------|--------|--------|--------| POTENTIAL ENERGY (eV) | Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | |==============||========|========|========|========|========|========|========| -| langevin/gjf || -55.16 | -55.16 | -55.15 | -55.15 | -55.15 | -55.14 | -55.12 | -| langevin || -55.16 | -55.12 | -54.93 | -54.85 | -54.71 | X | X | -| nvt || -55.17 | -55.10 | -54.95 | -54.88 | -54.82 | X | X | +| gjf half || -55.11 | -55.11 | -55.11 | -55.11 | -55.11 | -55.10 | -55.07 | +| gjf full || -55.11 | -55.11 | -55.11 | -55.11 | -55.11 | -55.10 | -55.07 | +| langevin || -55.11 | -55.07 | -54.87 | -54.79 | -54.65 | X | X | +| nvt || -55.14 | -55.07 | -54.90 | -54.84 | -54.76 | X | X | |--------------||--------|--------|--------|--------|--------|--------|--------| Script Commands: -- fix lang all langevin/gjf 10 10 1 26488 -vs +-- +fix lang all langevin/gjf 10 10 1 26488 vel vfull -- fix nve all nve fix lang all langevin 10 10 1 26488 -- -vs --- fix noho all nvt temp 10 10 1 -- \ No newline at end of file diff --git a/examples/gjf/in.gjf.vfull b/examples/gjf/in.gjf.vfull index 8512dad837..127b8fef87 100644 --- a/examples/gjf/in.gjf.vfull +++ b/examples/gjf/in.gjf.vfull @@ -5,18 +5,21 @@ atom_style full boundary p p p read_data argon.lmp - include ff-argon.lmp velocity all create 10 2357 mom yes dist gaussian - neighbor 1 bin timestep 0.1 -fix lang all langevin/gjf 10 10 1 26488 vel vfull method 4 +compute myKE all ke +compute myPE all pe -thermo 200 +fix lang all langevin/gjf 10 10 1 26488 vel vfull method 1 + +thermo 2000 run 5000 +fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out +run 35000 \ No newline at end of file diff --git a/examples/gjf/in.gjf.vhalf b/examples/gjf/in.gjf.vhalf index 08b0b45c8c..ba805d693a 100644 --- a/examples/gjf/in.gjf.vhalf +++ b/examples/gjf/in.gjf.vhalf @@ -5,18 +5,21 @@ atom_style full boundary p p p read_data argon.lmp - include ff-argon.lmp velocity all create 10 2357 mom yes dist gaussian - neighbor 1 bin timestep 0.1 +compute myKE all ke +compute myPE all pe + fix lang all langevin/gjf 10 10 1 26488 -thermo 200 run 5000 +fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out +thermo 2000 +run 35000 \ No newline at end of file diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 index a1cb4de702..30a0f7e9c9 100644 --- a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 4dd8c66390-modified) +LAMMPS (2 Apr 2025 - Development - 09d3ac0a1b-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -22,7 +22,6 @@ Finding 1-2 1-3 1-4 neighbors ... 1 = max # of special neighbors special bonds CPU = 0.000 seconds read_data CPU = 0.007 seconds - include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -47,33 +46,33 @@ pair_coeff * * 0.0102701 3.42 velocity all create 10 2357 mom yes dist gaussian - neighbor 1 bin timestep 0.1 -fix lang all langevin/gjf 10 10 1 26488 vel vfull method 4 +compute myKE all ke +compute myPE all pe -thermo 200 +fix lang all langevin/gjf 10 10 1 26488 vel vfull method 1 + +thermo 2000 run 5000 CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: -- Langevin GJF methods: doi:10.1007/s10955-024-03345-1 +- Langevin GJ methods: doi:10.1080/00268976.2019.1662506 -@Article{gronbech_jensen_2024, -title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations}, -volume = {191}, -number = {10}, -url = {https://doi.org/10.1007/s10955-024-03345-1}, -doi = {10.1007/s10955-024-03345-1}, -urldate = {2024-10-22}, -journal = {J. Stat. Phys.}, -author = {Gronbech-Jensen, Niels}, -year = {2024}, -pages = {137} +@Article{gronbech-jensen_complete_2020, +title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, +volume = {118}, +number = {8}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, +doi = {10.1080/00268976.2019.1662506}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels}, +year = {2020}, } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -94,46 +93,24 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 - 200 8.3566091 -55.074758 0 -54.142565 340.34804 - 400 8.5550582 -55.098903 0 -54.144573 333.63174 - 600 8.7873675 -55.044559 0 -54.064315 350.7384 - 800 8.7258741 -55.149735 0 -54.17635 318.83613 - 1000 8.3748307 -55.059754 0 -54.125529 343.7989 - 1200 8.6082188 -55.156326 0 -54.196066 316.8728 - 1400 8.9291902 -55.11836 0 -54.122295 328.12488 - 1600 8.3386383 -55.119788 0 -54.189601 325.81369 - 1800 8.0698034 -55.076285 0 -54.176086 338.69767 - 2000 8.5103978 -55.084479 0 -54.135131 338.12197 - 2200 8.3201517 -55.104858 0 -54.176733 329.95905 - 2400 8.7070407 -55.120649 0 -54.149366 328.06488 - 2600 8.4244379 -55.147583 0 -54.207824 321.45013 - 2800 8.7911907 -55.127309 0 -54.146638 325.76049 - 3000 8.250829 -55.1039 0 -54.183508 332.05048 - 3200 8.693979 -55.155552 0 -54.185726 318.29736 - 3400 8.9806023 -55.127303 0 -54.125504 327.48861 - 3600 8.8313967 -55.081076 0 -54.09592 339.16793 - 3800 8.8008688 -55.176748 0 -54.194998 313.08151 - 4000 8.1780418 -55.105368 0 -54.193096 330.04164 - 4200 8.3772045 -55.128813 0 -54.194323 324.29069 - 4400 8.3580983 -55.086979 0 -54.154621 335.63911 - 4600 8.1493124 -55.096648 0 -54.18758 332.51502 - 4800 9.0189389 -55.126828 0 -54.120752 326.36041 - 5000 8.7587383 -55.084993 0 -54.107943 337.17399 -Loop time of 2.34344 on 1 procs for 5000 steps with 864 atoms + 2000 8.5329244 -55.06102 0 -54.10916 343.01505 + 4000 7.8165794 -55.128803 0 -54.256851 322.07344 + 5000 8.4535562 -55.150518 0 -54.207511 318.20862 +Loop time of 2.26625 on 1 procs for 5000 steps with 864 atoms -Performance: 18434.456 ns/day, 0.001 hours/ns, 2133.618 timesteps/s, 1.843 Matom-step/s -99.9% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 19062.331 ns/day, 0.001 hours/ns, 2206.288 timesteps/s, 1.906 Matom-step/s +100.0% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.3044 | 1.3044 | 1.3044 | 0.0 | 55.66 -Bond | 0.00055276 | 0.00055276 | 0.00055276 | 0.0 | 0.02 -Neigh | 0.27376 | 0.27376 | 0.27376 | 0.0 | 11.68 -Comm | 0.055077 | 0.055077 | 0.055077 | 0.0 | 2.35 -Output | 0.00055401 | 0.00055401 | 0.00055401 | 0.0 | 0.02 -Modify | 0.68502 | 0.68502 | 0.68502 | 0.0 | 29.23 -Other | | 0.02412 | | | 1.03 +Pair | 1.2907 | 1.2907 | 1.2907 | 0.0 | 56.95 +Bond | 0.00032498 | 0.00032498 | 0.00032498 | 0.0 | 0.01 +Neigh | 0.28343 | 0.28343 | 0.28343 | 0.0 | 12.51 +Comm | 0.055491 | 0.055491 | 0.055491 | 0.0 | 2.45 +Output | 8.5614e-05 | 8.5614e-05 | 8.5614e-05 | 0.0 | 0.00 +Modify | 0.61129 | 0.61129 | 0.61129 | 0.0 | 26.97 +Other | | 0.02497 | | | 1.10 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -145,8 +122,60 @@ Histogram: 1 0 0 0 0 0 0 0 0 0 Total # of neighbors = 18143 Ave neighs/atom = 20.998843 Ave special neighs/atom = 0 -Neighbor list builds = 257 +Neighbor list builds = 258 Dangerous builds = 0 +fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out -Total wall time: 0:00:02 +run 35000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes + Step Temp E_pair E_mol TotEng Press + 5000 8.4535562 -55.150518 0 -54.207511 318.20862 + 6000 8.4899401 -55.108242 0 -54.161176 331.10703 + 8000 8.3618893 -55.092171 0 -54.15939 334.11831 + 10000 8.8684311 -55.100316 0 -54.111029 334.09931 + 12000 8.4339192 -55.07343 0 -54.132614 340.00487 + 14000 8.072393 -55.115121 0 -54.214633 327.98965 + 16000 8.3420289 -55.077813 0 -54.147247 337.74926 + 18000 8.3803911 -55.12201 0 -54.187164 326.10485 + 20000 8.4676985 -55.176339 0 -54.231754 311.57092 + 22000 8.8560138 -55.110505 0 -54.122603 330.66179 + 24000 8.3187826 -55.120592 0 -54.192619 327.01148 + 26000 8.0327666 -55.116664 0 -54.220596 326.25179 + 28000 8.3672169 -55.130413 0 -54.197037 324.2368 + 30000 8.1669275 -55.057678 0 -54.146645 344.9168 + 32000 8.3819314 -55.08989 0 -54.154873 335.45317 + 34000 8.109088 -55.17222 0 -54.267639 310.83717 + 36000 8.3048574 -55.079475 0 -54.153056 338.04291 + 38000 8.8708544 -55.108991 0 -54.119434 330.70097 + 40000 8.4012779 -55.080817 0 -54.143642 338.54326 +Loop time of 19.3814 on 1 procs for 35000 steps with 864 atoms + +Performance: 15602.554 ns/day, 0.002 hours/ns, 1805.851 timesteps/s, 1.560 Matom-step/s +100.0% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 12.065 | 12.065 | 12.065 | 0.0 | 62.25 +Bond | 0.0021494 | 0.0021494 | 0.0021494 | 0.0 | 0.01 +Neigh | 2.3755 | 2.3755 | 2.3755 | 0.0 | 12.26 +Comm | 0.40916 | 0.40916 | 0.40916 | 0.0 | 2.11 +Output | 0.0004907 | 0.0004907 | 0.0004907 | 0.0 | 0.00 +Modify | 4.3528 | 4.3528 | 4.3528 | 0.0 | 22.46 +Other | | 0.1765 | | | 0.91 + +Nlocal: 864 ave 864 max 864 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1592 ave 1592 max 1592 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 18144 ave 18144 max 18144 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 18144 +Ave neighs/atom = 21 +Ave special neighs/atom = 0 +Neighbor list builds = 2122 +Dangerous builds = 0 +Total wall time: 0:00:21 diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 index 6d9543c087..454887a106 100644 --- a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 4dd8c66390-modified) +LAMMPS (2 Apr 2025 - Development - 09d3ac0a1b-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -22,7 +22,6 @@ Finding 1-2 1-3 1-4 neighbors ... 1 = max # of special neighbors special bonds CPU = 0.002 seconds read_data CPU = 0.014 seconds - include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -47,33 +46,33 @@ pair_coeff * * 0.0102701 3.42 velocity all create 10 2357 mom yes dist gaussian - neighbor 1 bin timestep 0.1 -fix lang all langevin/gjf 10 10 1 26488 vel vfull method 4 +compute myKE all ke +compute myPE all pe -thermo 200 +fix lang all langevin/gjf 10 10 1 26488 vel vfull method 1 + +thermo 2000 run 5000 CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: -- Langevin GJF methods: doi:10.1007/s10955-024-03345-1 +- Langevin GJ methods: doi:10.1080/00268976.2019.1662506 -@Article{gronbech_jensen_2024, -title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations}, -volume = {191}, -number = {10}, -url = {https://doi.org/10.1007/s10955-024-03345-1}, -doi = {10.1007/s10955-024-03345-1}, -urldate = {2024-10-22}, -journal = {J. Stat. Phys.}, -author = {Gronbech-Jensen, Niels}, -year = {2024}, -pages = {137} +@Article{gronbech-jensen_complete_2020, +title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, +volume = {118}, +number = {8}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, +doi = {10.1080/00268976.2019.1662506}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels}, +year = {2020}, } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -94,59 +93,89 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 - 200 8.3950866 -55.088994 0 -54.15251 334.90536 - 400 8.6408464 -55.090811 0 -54.126912 335.23135 - 600 8.3101447 -55.121286 0 -54.194277 325.43222 - 800 8.5045003 -55.090513 0 -54.141824 335.05857 - 1000 8.7236378 -55.101455 0 -54.12832 331.96596 - 1200 8.7063561 -55.109371 0 -54.138164 331.62683 - 1400 8.7935957 -55.089763 0 -54.108824 336.89842 - 1600 8.454418 -55.105207 0 -54.162104 330.18927 - 1800 8.7989267 -55.142078 0 -54.160544 322.47021 - 2000 8.7823094 -55.153625 0 -54.173945 318.95028 - 2200 8.6201117 -55.11511 0 -54.153524 329.13488 - 2400 9.1165215 -55.161069 0 -54.144107 318.48524 - 2600 8.7636341 -55.142401 0 -54.164805 322.46493 - 2800 8.4876731 -55.111528 0 -54.164715 329.66127 - 3000 8.7005957 -55.149445 0 -54.178881 319.92878 - 3200 8.1711364 -55.137611 0 -54.226108 322.83713 - 3400 8.7172512 -55.143449 0 -54.171026 322.68918 - 3600 8.6262526 -55.1002 0 -54.137928 333.02737 - 3800 8.1680259 -55.166423 0 -54.255267 313.66684 - 4000 8.8340067 -55.121759 0 -54.136312 328.58235 - 4200 8.427926 -55.126903 0 -54.186755 324.95528 - 4400 8.6352614 -55.193826 0 -54.23055 307.14392 - 4600 8.7381405 -55.120503 0 -54.14575 327.73985 - 4800 8.3857194 -55.081944 0 -54.146505 337.38629 - 5000 8.1179517 -55.162247 0 -54.256677 314.50176 -Loop time of 2.08834 on 4 procs for 5000 steps with 864 atoms + 2000 8.63533 -55.154093 0 -54.190809 317.34773 + 4000 8.2482881 -55.091551 0 -54.171442 333.83766 + 5000 7.946377 -55.076514 0 -54.190084 337.31999 +Loop time of 2.06641 on 4 procs for 5000 steps with 864 atoms -Performance: 20686.324 ns/day, 0.001 hours/ns, 2394.250 timesteps/s, 2.069 Matom-step/s -63.4% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 20905.811 ns/day, 0.001 hours/ns, 2419.654 timesteps/s, 2.091 Matom-step/s +62.1% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.53532 | 0.5439 | 0.54781 | 0.7 | 26.04 -Bond | 0.0006347 | 0.00066042 | 0.00068198 | 0.0 | 0.03 -Neigh | 0.10879 | 0.11194 | 0.118 | 1.1 | 5.36 -Comm | 0.94935 | 0.96017 | 0.97155 | 0.8 | 45.98 -Output | 0.0060135 | 0.006061 | 0.0061217 | 0.1 | 0.29 -Modify | 0.2483 | 0.24911 | 0.25049 | 0.2 | 11.93 -Other | | 0.2165 | | | 10.37 +Pair | 0.53593 | 0.54393 | 0.55031 | 0.7 | 26.32 +Bond | 0.0004435 | 0.00052388 | 0.000586 | 0.0 | 0.03 +Neigh | 0.10844 | 0.11152 | 0.11687 | 1.0 | 5.40 +Comm | 0.94337 | 0.94742 | 0.94979 | 0.3 | 45.85 +Output | 0.00076423 | 0.00077499 | 0.00078949 | 0.0 | 0.04 +Modify | 0.24993 | 0.25116 | 0.25286 | 0.2 | 12.15 +Other | | 0.2111 | | | 10.21 Nlocal: 216 ave 216 max 216 min Histogram: 4 0 0 0 0 0 0 0 0 0 -Nghost: 884.25 ave 892 max 875 min -Histogram: 1 1 0 0 0 0 0 0 0 2 -Neighs: 4535.5 ave 4737 max 4333 min +Nghost: 884.75 ave 885 max 884 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Neighs: 4536 ave 4737 max 4335 min Histogram: 2 0 0 0 0 0 0 0 0 2 -Total # of neighbors = 18142 -Ave neighs/atom = 20.997685 +Total # of neighbors = 18144 +Ave neighs/atom = 21 Ave special neighs/atom = 0 -Neighbor list builds = 280 +Neighbor list builds = 273 Dangerous builds = 0 +fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out -Total wall time: 0:00:02 +run 35000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes + Step Temp E_pair E_mol TotEng Press + 5000 7.946377 -55.076514 0 -54.190084 337.31999 + 6000 8.2565866 -55.129244 0 -54.208209 324.57967 + 8000 7.9942397 -55.101417 0 -54.209648 331.24127 + 10000 8.5413968 -55.083292 0 -54.130486 337.82599 + 12000 8.3682078 -55.090905 0 -54.157419 335.08066 + 14000 8.5082065 -55.085051 0 -54.135948 336.2765 + 16000 8.1944037 -55.090733 0 -54.176635 334.03786 + 18000 8.2607106 -55.030131 0 -54.108637 352.49892 + 20000 8.1154691 -55.104072 0 -54.198779 330.14203 + 22000 8.5592601 -55.152019 0 -54.197221 318.03507 + 24000 8.3182914 -55.115242 0 -54.187324 328.46084 + 26000 8.3691375 -55.125275 0 -54.191685 325.43673 + 28000 8.531632 -55.107097 0 -54.155381 331.42771 + 30000 8.1102222 -55.099011 0 -54.194304 332.04678 + 32000 8.5558571 -55.077016 0 -54.122598 339.87746 + 34000 8.4213946 -55.097068 0 -54.157649 333.34935 + 36000 8.0936615 -55.152202 0 -54.249342 316.20169 + 38000 7.999652 -55.048407 0 -54.156034 345.07945 + 40000 8.6699753 -55.087634 0 -54.120485 337.23709 +Loop time of 17.4329 on 4 procs for 35000 steps with 864 atoms + +Performance: 17346.528 ns/day, 0.001 hours/ns, 2007.700 timesteps/s, 1.735 Matom-step/s +65.5% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.1129 | 5.1423 | 5.1581 | 0.8 | 29.50 +Bond | 0.0029266 | 0.0034929 | 0.0038279 | 0.6 | 0.02 +Neigh | 0.85004 | 0.87543 | 0.90992 | 2.4 | 5.02 +Comm | 6.6875 | 6.6993 | 6.7123 | 0.4 | 38.43 +Output | 0.0043725 | 0.0045522 | 0.005017 | 0.4 | 0.03 +Modify | 3.2524 | 3.2579 | 3.2677 | 0.3 | 18.69 +Other | | 1.45 | | | 8.32 + +Nlocal: 216 ave 222 max 210 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 905.5 ave 911 max 899 min +Histogram: 1 1 0 0 0 0 0 0 0 2 +Neighs: 4535.75 ave 4837 max 4218 min +Histogram: 1 0 0 1 0 0 1 0 0 1 + +Total # of neighbors = 18143 +Ave neighs/atom = 20.998843 +Ave special neighs/atom = 0 +Neighbor list builds = 2140 +Dangerous builds = 0 +Total wall time: 0:00:19 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 index fed8f271e5..5d07985f1c 100644 --- a/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 4dd8c66390-modified) +LAMMPS (2 Apr 2025 - Development - 09d3ac0a1b-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -21,8 +21,7 @@ Finding 1-2 1-3 1-4 neighbors ... 0 = max # of 1-4 neighbors 1 = max # of special neighbors special bonds CPU = 0.000 seconds - read_data CPU = 0.008 seconds - + read_data CPU = 0.007 seconds include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -47,33 +46,32 @@ pair_coeff * * 0.0102701 3.42 velocity all create 10 2357 mom yes dist gaussian - neighbor 1 bin timestep 0.1 +compute myKE all ke +compute myPE all pe + fix lang all langevin/gjf 10 10 1 26488 -thermo 200 run 5000 CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: -- Langevin GJF methods: doi:10.1007/s10955-024-03345-1 +- Langevin GJ methods: doi:10.1080/00268976.2019.1662506 -@Article{gronbech_jensen_2024, -title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations}, -volume = {191}, -number = {10}, -url = {https://doi.org/10.1007/s10955-024-03345-1}, -doi = {10.1007/s10955-024-03345-1}, -urldate = {2024-10-22}, -journal = {J. Stat. Phys.}, -author = {Gronbech-Jensen, Niels}, -year = {2024}, -pages = {137} +@Article{gronbech-jensen_complete_2020, +title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, +volume = {118}, +number = {8}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, +doi = {10.1080/00268976.2019.1662506}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels}, +year = {2020}, } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -94,46 +92,22 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 - 200 9.8808461 -55.073599 0 -53.971376 345.62224 - 400 9.8712816 -55.072241 0 -53.971084 345.11909 - 600 10.528988 -55.066736 0 -53.892211 350.60112 - 800 10.167171 -55.148312 0 -54.014149 324.73698 - 1000 10.029026 -55.125705 0 -54.006952 331.93785 - 1200 9.8898479 -55.086642 0 -53.983414 342.04309 - 1400 10.610014 -55.076793 0 -53.89323 346.34338 - 1600 9.9402137 -55.111688 0 -54.002842 335.04779 - 1800 9.8078801 -55.140475 0 -54.046391 325.88652 - 2000 10.472791 -55.06102 0 -53.892765 349.97306 - 2200 9.877248 -55.191201 0 -54.089379 312.77421 - 2400 9.9739487 -55.108904 0 -53.996295 335.9089 - 2600 10.131803 -55.149444 0 -54.019226 325.44115 - 2800 9.6980127 -55.118395 0 -54.036568 331.2097 - 3000 9.7193425 -55.149785 0 -54.065577 323.32384 - 3200 10.27638 -55.083302 0 -53.936957 342.56458 - 3400 9.9253941 -55.082368 0 -53.975175 342.28594 - 3600 10.665862 -55.056774 0 -53.866981 352.03551 - 3800 10.011077 -55.084664 0 -53.967913 341.45122 - 4000 9.4182671 -55.128803 0 -54.078181 327.81846 - 4200 10.02466 -55.106046 0 -53.98778 336.56944 - 4400 9.3721033 -55.146068 0 -54.100596 322.38199 - 4600 9.5485537 -55.118577 0 -54.053421 332.04274 - 4800 10.039726 -55.074068 0 -53.954122 344.76817 5000 9.7731898 -55.150518 0 -54.060304 322.94195 -Loop time of 2.28614 on 1 procs for 5000 steps with 864 atoms +Loop time of 2.32188 on 1 procs for 5000 steps with 864 atoms -Performance: 18896.448 ns/day, 0.001 hours/ns, 2187.089 timesteps/s, 1.890 Matom-step/s -100.0% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 18605.621 ns/day, 0.001 hours/ns, 2153.428 timesteps/s, 1.861 Matom-step/s +99.8% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.2918 | 1.2918 | 1.2918 | 0.0 | 56.51 -Bond | 0.00048345 | 0.00048345 | 0.00048345 | 0.0 | 0.02 -Neigh | 0.2776 | 0.2776 | 0.2776 | 0.0 | 12.14 -Comm | 0.055375 | 0.055375 | 0.055375 | 0.0 | 2.42 -Output | 0.00054609 | 0.00054609 | 0.00054609 | 0.0 | 0.02 -Modify | 0.63625 | 0.63625 | 0.63625 | 0.0 | 27.83 -Other | | 0.02408 | | | 1.05 +Pair | 1.3154 | 1.3154 | 1.3154 | 0.0 | 56.65 +Bond | 0.00030719 | 0.00030719 | 0.00030719 | 0.0 | 0.01 +Neigh | 0.28939 | 0.28939 | 0.28939 | 0.0 | 12.46 +Comm | 0.055279 | 0.055279 | 0.055279 | 0.0 | 2.38 +Output | 4.3714e-05 | 4.3714e-05 | 4.3714e-05 | 0.0 | 0.00 +Modify | 0.63675 | 0.63675 | 0.63675 | 0.0 | 27.42 +Other | | 0.02471 | | | 1.06 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -148,5 +122,58 @@ Ave special neighs/atom = 0 Neighbor list builds = 258 Dangerous builds = 0 +fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out -Total wall time: 0:00:02 +thermo 2000 +run 35000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes + Step Temp E_pair E_mol TotEng Press + 5000 9.7731898 -55.150518 0 -54.060304 322.94195 + 6000 10.024842 -55.108242 0 -53.989956 336.6125 + 8000 10.118994 -55.092171 0 -53.963382 340.42078 + 10000 10.541359 -55.100316 0 -53.924412 340.09986 + 12000 10.023234 -55.07343 0 -53.955323 345.70551 + 14000 9.5912018 -55.115121 0 -54.045208 333.43739 + 16000 9.9450498 -55.077813 0 -53.968428 343.49906 + 18000 10.113744 -55.12201 0 -53.993806 332.32214 + 20000 9.9345204 -55.176339 0 -54.068128 316.83219 + 22000 10.585719 -55.110505 0 -53.929652 336.86599 + 24000 10.024757 -55.120592 0 -54.002315 333.13056 + 26000 9.7787474 -55.116664 0 -54.02583 332.51437 + 28000 9.6092087 -55.130413 0 -54.058491 328.69165 + 30000 9.8245787 -55.057678 0 -53.961731 350.86255 + 32000 10.066994 -55.08989 0 -53.966902 341.49724 + 34000 9.5677059 -55.17222 0 -54.104928 316.06902 + 36000 9.7252627 -55.079475 0 -53.994608 343.13769 + 38000 10.438984 -55.108991 0 -53.944506 336.32562 + 40000 10.238268 -55.080817 0 -53.938723 345.13228 +Loop time of 19.5673 on 1 procs for 35000 steps with 864 atoms + +Performance: 15454.339 ns/day, 0.002 hours/ns, 1788.697 timesteps/s, 1.545 Matom-step/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 12.065 | 12.065 | 12.065 | 0.0 | 61.66 +Bond | 0.002157 | 0.002157 | 0.002157 | 0.0 | 0.01 +Neigh | 2.384 | 2.384 | 2.384 | 0.0 | 12.18 +Comm | 0.40912 | 0.40912 | 0.40912 | 0.0 | 2.09 +Output | 0.00050573 | 0.00050573 | 0.00050573 | 0.0 | 0.00 +Modify | 4.5321 | 4.5321 | 4.5321 | 0.0 | 23.16 +Other | | 0.1749 | | | 0.89 + +Nlocal: 864 ave 864 max 864 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1592 ave 1592 max 1592 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 18144 ave 18144 max 18144 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 18144 +Ave neighs/atom = 21 +Ave special neighs/atom = 0 +Neighbor list builds = 2122 +Dangerous builds = 0 +Total wall time: 0:00:21 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 index aa90fb779b..cac135e578 100644 --- a/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 4dd8c66390-modified) +LAMMPS (2 Apr 2025 - Development - 09d3ac0a1b-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -22,7 +22,6 @@ Finding 1-2 1-3 1-4 neighbors ... 1 = max # of special neighbors special bonds CPU = 0.002 seconds read_data CPU = 0.014 seconds - include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -47,33 +46,32 @@ pair_coeff * * 0.0102701 3.42 velocity all create 10 2357 mom yes dist gaussian - neighbor 1 bin timestep 0.1 +compute myKE all ke +compute myPE all pe + fix lang all langevin/gjf 10 10 1 26488 -thermo 200 run 5000 CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: -- Langevin GJF methods: doi:10.1007/s10955-024-03345-1 +- Langevin GJ methods: doi:10.1080/00268976.2019.1662506 -@Article{gronbech_jensen_2024, -title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations}, -volume = {191}, -number = {10}, -url = {https://doi.org/10.1007/s10955-024-03345-1}, -doi = {10.1007/s10955-024-03345-1}, -urldate = {2024-10-22}, -journal = {J. Stat. Phys.}, -author = {Gronbech-Jensen, Niels}, -year = {2024}, -pages = {137} +@Article{gronbech-jensen_complete_2020, +title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, +volume = {118}, +number = {8}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, +doi = {10.1080/00268976.2019.1662506}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels}, +year = {2020}, } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -94,46 +92,22 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 - 200 9.8046819 -55.12733 0 -54.033603 329.70683 - 400 10.174622 -55.092357 0 -53.957363 340.4935 - 600 9.6157634 -55.174205 0 -54.101552 316.68047 - 800 9.9617862 -55.097525 0 -53.986273 339.257 - 1000 10.373198 -55.116484 0 -53.959338 335.09796 - 1200 10.064779 -55.17366 0 -54.050919 318.66487 - 1400 10.562182 -55.067856 0 -53.889628 349.23452 - 1600 9.7696935 -55.081542 0 -53.991718 342.92593 - 1800 10.454466 -55.130637 0 -53.964426 330.88658 - 2000 10.253701 -55.154093 0 -54.010277 323.15259 - 2200 9.6688957 -55.143479 0 -54.064899 325.16815 - 2400 10.059787 -55.134941 0 -54.012756 329.83534 - 2600 9.9050905 -55.096231 0 -53.991303 338.94947 - 2800 9.663551 -55.130202 0 -54.052218 328.77571 - 3000 9.950484 -55.123447 0 -54.013455 332.00143 - 3200 9.7210637 -55.120005 0 -54.035606 331.39812 - 3400 9.6457139 -55.080953 0 -54.004959 341.95838 - 3600 10.42249 -55.102379 0 -53.939734 339.66808 - 3800 10.276893 -55.126271 0 -53.979868 332.40943 - 4000 10.135481 -55.091551 0 -53.960922 340.60675 - 4200 10.129209 -55.084189 0 -53.95426 343.39315 - 4400 10.006953 -55.120704 0 -54.004413 331.57121 - 4600 10.497483 -55.144898 0 -53.973888 327.22996 - 4800 9.9230954 -55.126028 0 -54.019091 330.70489 5000 9.3726166 -55.076514 0 -54.030985 342.43571 -Loop time of 2.0887 on 4 procs for 5000 steps with 864 atoms +Loop time of 2.09273 on 4 procs for 5000 steps with 864 atoms -Performance: 20682.713 ns/day, 0.001 hours/ns, 2393.833 timesteps/s, 2.068 Matom-step/s -62.5% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 20642.908 ns/day, 0.001 hours/ns, 2389.226 timesteps/s, 2.064 Matom-step/s +62.7% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.53905 | 0.54518 | 0.5484 | 0.5 | 26.10 -Bond | 0.00062355 | 0.00066183 | 0.0007207 | 0.0 | 0.03 -Neigh | 0.10715 | 0.10937 | 0.11212 | 0.5 | 5.24 -Comm | 0.94637 | 0.95041 | 0.95905 | 0.5 | 45.50 -Output | 0.0061059 | 0.0061286 | 0.0061661 | 0.0 | 0.29 -Modify | 0.26086 | 0.26355 | 0.26979 | 0.7 | 12.62 -Other | | 0.2134 | | | 10.22 +Pair | 0.53092 | 0.54173 | 0.55017 | 1.0 | 25.89 +Bond | 0.00049283 | 0.00052862 | 0.00057217 | 0.0 | 0.03 +Neigh | 0.10693 | 0.11084 | 0.1158 | 1.0 | 5.30 +Comm | 0.95622 | 0.96088 | 0.96553 | 0.4 | 45.92 +Output | 0.00027302 | 0.00027645 | 0.00028114 | 0.0 | 0.01 +Modify | 0.2615 | 0.26289 | 0.2635 | 0.2 | 12.56 +Other | | 0.2156 | | | 10.30 Nlocal: 216 ave 216 max 216 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -148,5 +122,58 @@ Ave special neighs/atom = 0 Neighbor list builds = 273 Dangerous builds = 0 +fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out -Total wall time: 0:00:02 +thermo 2000 +run 35000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes + Step Temp E_pair E_mol TotEng Press + 5000 9.3726166 -55.076514 0 -54.030985 342.43571 + 6000 9.6911866 -55.129244 0 -54.048177 329.72537 + 8000 9.7296551 -55.101417 0 -54.016059 337.46595 + 10000 10.098808 -55.083292 0 -53.956755 343.4122 + 12000 10.114344 -55.090905 0 -53.962635 341.3438 + 14000 10.230012 -55.085051 0 -53.943878 342.45237 + 16000 9.5989709 -55.090733 0 -54.019954 339.07584 + 18000 10.016071 -55.030131 0 -53.912824 358.79514 + 20000 9.7197057 -55.104072 0 -54.019824 335.89619 + 22000 9.959647 -55.152019 0 -54.041005 323.05805 + 24000 10.075138 -55.115242 0 -53.991345 334.76239 + 26000 10.227192 -55.125275 0 -53.984416 332.10131 + 28000 10.177109 -55.107097 0 -53.971825 337.32979 + 30000 9.521036 -55.099011 0 -54.036925 337.10716 + 32000 10.265633 -55.077016 0 -53.93187 346.01018 + 34000 10.173978 -55.097068 0 -53.962146 339.63562 + 36000 9.6032778 -55.152202 0 -54.080942 321.61646 + 38000 9.8802995 -55.048407 0 -53.946245 351.82506 + 40000 10.372288 -55.087634 0 -53.93059 343.34304 +Loop time of 17.6209 on 4 procs for 35000 steps with 864 atoms + +Performance: 17161.415 ns/day, 0.001 hours/ns, 1986.275 timesteps/s, 1.716 Matom-step/s +64.2% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.0439 | 5.1029 | 5.1534 | 2.0 | 28.96 +Bond | 0.0031373 | 0.0034925 | 0.0038794 | 0.5 | 0.02 +Neigh | 0.84082 | 0.87558 | 0.91665 | 3.0 | 4.97 +Comm | 6.7337 | 6.7936 | 6.8487 | 1.6 | 38.55 +Output | 0.0044073 | 0.004559 | 0.0049773 | 0.4 | 0.03 +Modify | 3.3556 | 3.3647 | 3.3722 | 0.3 | 19.10 +Other | | 1.476 | | | 8.38 + +Nlocal: 216 ave 222 max 210 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 905.5 ave 911 max 899 min +Histogram: 1 1 0 0 0 0 0 0 0 2 +Neighs: 4535.75 ave 4837 max 4218 min +Histogram: 1 0 0 1 0 0 1 0 0 1 + +Total # of neighbors = 18143 +Ave neighs/atom = 20.998843 +Ave special neighs/atom = 0 +Neighbor list builds = 2140 +Dangerous builds = 0 +Total wall time: 0:00:19 diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp index c00fbb9ee5..ea0e75c598 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -139,7 +139,7 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : iarg += 2; } else if (strcmp(arg[iarg], "method") == 0) { GJmethod = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); - if (GJmethod = 7) { + if (GJmethod == 7) { if (iarg + 3 > narg) error->all(FLERR, "Illegal fix langevin/gjf command for GJ-VII"); gjfc2 = utils::numeric(FLERR, arg[iarg + 2], false, lmp); if (gjfc2 < 0 || gjfc2 > 1) error->all(FLERR, "Choice of c2 in GJ-VII must be 0≤c2≤1"); @@ -149,7 +149,7 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : else { if (iarg + 2 > narg) error->all(FLERR, "Illegal fix langevin/gjf command"); if (GJmethod < 0 || GJmethod > GJmethods) error->all(FLERR, "Invalid GJ method choice in langevin/gjf command"); - if (GJmethod = 8) if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_8); + if (GJmethod == 8) if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_8); iarg += 2; } } else From 3a6ea0808daa42d5f681ec76cd53e4a8760989c8 Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Mon, 14 Apr 2025 15:36:33 -0600 Subject: [PATCH 40/94] Merged changes to documentation for further user clarity --- doc/src/fix_neighbor_swap.rst | 268 +++++++++++++++++----------------- 1 file changed, 136 insertions(+), 132 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 9c87547321..da1e89bed5 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -18,19 +18,19 @@ Syntax * T = scaling temperature of the MC swaps (temperature units) * R0 = scaling swap probability of the MC swaps (distance units) * voro = valid voronoi compute id (compute voronoi/atom) -* one or more keyword/value pairs may be appended to args +* two or more keyword/value pairs may be appended to args * keywords *types* and *diff* are mutually exclusive, but one must be specified -* keyword = *types* or *diff* or *rates* or *ke* or *region* +* keyword = *types* or *diff* or *ke* or *region* or *rates* .. parsed-literal:: - *types* values = two or more atom types (1-Ntypes or type label) - *ke* value = *no* or *yes* - *no* = no conservation of kinetic energy after atom swaps + *types* values = two or more atom types (Integers in range [1,Ntypes] or type labels) + *diff* values = one atom type + *ke* value = *yes* or *no* *yes* = kinetic energy is conserved after atom swaps + *no* = no conservation of kinetic energy after atom swaps *region* value = region-ID region-ID = ID of region to use as an exchange/move volume - *diff* values = one atom type *rates* values = V1 V2 . . . Vntypes values to conduct variable diffusion for different atom types (unitless) Examples @@ -38,6 +38,7 @@ Examples .. code-block:: LAMMPS + compute voroN all voronoi/atom neighbors yes fix mc all neighbor/swap 10 160 15238 1000.0 3.0 diff 2 voro voroN fix myFix all neighbor/swap 100 1 12345 298.0 3.0 region my_swap_region types 5 6 voro voroN fix kmc all neighbor/swap 1 100 345 1.0 3.0 diff 3 rates 3 1 6 voro voroN @@ -47,140 +48,144 @@ Description .. versionadded:: TBD -This fix computes Monte-Carlo (MC) evaluations to enable kinetic -Monte Carlo (kMC)-type behavior during MD simulation through only allowing -neighboring atom swaps. This creates a hybrid type simulation of MDkMC simulation -where atoms are only swapped with their neighbors, but the swapping acceptance is -perfomed by evaluating the change in system energy using the Metropolis Criterion. -Neighboring atoms are selected using a Voronoi tesselation approach. A detailed -explination of the original implementation of this procedure can be found in -:ref:`(Tavenner 2023) <_TavennerMDkMC>` as originally intended for simulating -accelerated diffusion in an MD context. +This fix performs Monte-Carlo (MC) evaluations to enable kinetic +Monte Carlo (kMC)-type behavior during MD simulation by allowing +neighboring atoms to swap their positions. In constrast to the :doc:`fix +atom/swap ` command which swaps pairs of atoms anywhere +in the simulation domain, the restriction of the MC swapping to +neighbors enables a hybrid MD/kMC-like simulation. -Simulating inherently kineticly driven behaviors which rely on rare events -(such as atomic diffusion) is challenging for traditional Molecular Dynamics -approaches since simulations are restricted in their time-scale of events. -Since thermal vibration motion occurs on a timescale much shorter than the movement -of vacancies, such behaviors are challenging to model simultaneously. To address -this challenge, an approach from kMC simulations is adpoted where rare events can -be sampled at selected rates. By selecting such swap behaviors, the process -of atomic diffusion can be approximated during an MD simulation, effectively -decoupling the MD atomic vibrational time and the timescale of atomic hopping. +Neighboring atoms are defined by using a Voronoi tesselation performed +by the :doc:`compute voronoi/atom ` command. +Two atoms are neighbors if their Voronoi cells share a common face +(3d) or edge (2d). -To achieve such simulations, this algorithm takes the following approach. First, -the MD simulation is stopped after a given number of steps to perform atom swaps. -Given this instantaneous configuration from the MD simulation, Voronoi neighbors -are computed for all valid swap atoms. From the list of valid swap atoms, one atom -I is selected at random across the entire simulation. One if its Voronoi neighbors -that is a valid atom to swap is then selected. The atom ID is communicated to all -processors, such that if the neighbors are on different processors the swap still -occurs. The two atom types are swapped, and the change in system energy from before -the swap is compared using the Metropolis Criterion. This evaluation of the energy -change is a global calculation, such that it has a computational cost similar to -that of an MD timestep. If the swap is accepted from the Metropolis Criterion, the -atoms remain swapped. Else, the atoms are returned to their original types. This -process of MC evaluation is repeated for a given number of iterations until the -original MD simulation is resumed from the new state, where any successfully -swapped atoms have changed type, though the global system balance is preserved. +The selection of a swap neighbor is made using a distance-based +criterion for weighting the selection probability of each swap, in the +same manner as kMC selects a next event using relative probabilities. +The acceptance or rejection of each swap is determined via the +Metropolis criterion after evaluating the change in system energy due +to the swap. -A few key notes regarding this implementation are as follows. The parallel -efficiency of this algorithm is similar to that of other MC approaches. I.e, -due to the additional energy calculations for the MC steps, efficiency is -improved with a smaller number of atoms per processor than standalone MD simulation -since there is more weighting on the calculation of a given atomic domain and -minor additonal communication load. Communication of the atom ids to be swapped -between processors is negligible. Efficiency will additionally be much worse for -pair styles with different per-atom cutoffs, since the neighbor list will need to -be rebuilt between swap events. Limitations are imposed on the Voronoi neighbors -to restrict swapping of atoms which are outside of a reasonable cutoff. +A detailed explanation of the original implementation of this +algorithm can be found in :ref:`(Tavenner 2023) <_TavennerMDkMC>` +where it was used to simulated accelerated diffusion in an MD context. -Input Parameters Usage -""""""""""" +Simulating inherently kinetically-limited behaviors which rely on rare +events (such as atomic diffusion in a solid) is challenging for +traditional MD since its relatively short timescale will not naturally +sample many events. This fix addresses this challenge by allowing rare +neighbor hopping events to be sampled in a kMC-like fashion at a much +faster rate (set by the specified *N* and *X* parameters). This enables +the processes of atomic diffusion to be approximated during an MD +simulation, effectively decoupling the MD atomic vibrational timescale +and the atomic hopping (kMC event) timescale. -The fix is called every *N* timesteps and attempts *X* swaps. The system -is initialized with a random seed, using a temperature *T* for -evaluating the MC energy swaps. The distance-based probability is -weighted according to *R0* which sets the radius :math:`r_0` for the -weighting +The algorithm implemented by this fix is as follows. The MD +simulation is paused every *N* stepsA Voronoi tesselation is +performed for the current atom configuration. Then *X* atom swaps are +attempted, one after the other. For each swap, an atom *I* is +selected randomly from the list of atom types specified by either the +*types* or *diff* keywords. One of *I*'s Voronoi neighbors *J* is +selected using the distance-weighted probability for each neighbor +detailed below. The *I,J* atom IDs are communicated to all processors +so that a global energy evaluation can be performed for the post-swap +state of the system. The swap is accepted or rejected based on the +Metropolis criterion using the energy change of the system and the +specified temperature *T*. + +Here are a few comments on the computational cost of the swapping +algorithm. + +(1) The cost of a global energy evaluation is similar to that of an MD +timestep. + +(2) Simliar to other MC algorithms in LAMMPS, an optimized parallel efficiency +is achieved with a smaller number of atoms per processor than would typically +be used in an standard MD simulation. This is because the per-energy evaluation +cost increases relative to the balance of MD/MC steps as indicated by (1), but +the communication cost remains relatively constant for a given number of MD steps. + +(3) The MC portion of the simulation will run dramatically slower if +the pair style uses different cutoffs for different atom types (or +type pairs). This is because each atom swap then requires a rebuild +of the neighbor list to ensure the post-swap global energy can be +computed correctly. + +Limitations are imposed on selection of *I,J* atom pairs to avoid +swapping of atoms which are outside of a reasonable cutoff (e.g. due +to a Voronoi tesselation near free surfaces) though the +use of a distance-weighted probabiltiy scaling. + +---------- + +This section gives more details on other arguments and keywords. + +The random number generator (RNG) used by all the processors for MC +operations is initialized with the specified *seed*. + +The distance-based probability is weighted by the specified *R0* which +sets the radius :math:`r_0` in this formula .. math:: p_{ij} = e^{(\frac{r_{ij}}{r_0})^2} -where :math:`p_{ij}` is the probability of selecting atoms :math:`i` and -:math:`j` for an evaluated swap. +where :math:`p_{ij}` is the probability of selecting atom :math:`j` to +swap with atom :math:`i`. Typically, a value for *R0* around the +average nearest-neighbor spacing is appropriate. Since this is simply +a proability weighting, the swapping behavior is not very sensitive to +the exact value of *R0*. -Typically, a value around the average nearest-neighbor spacing is appropriate -for *R0*. Since this is simply a proability weighting, behavior is not -particularly sensitive to the exact value of *R0*. +The keyword *types* takes two or more atom types as its values. Only +atoms *I* of the first atom type will be selected. Only atoms *J* of the +remaining atom types will be considered as potential swap partners. -The keyword *types* is submitted with two or more atom types as the -value. Atoms of the first atom type are swapped with valid neighbors of -all the remaining atom types. +The keyword *diff* take a single atom type as its value. Only atoms +*I* of the that atom type will be selected. Atoms *J* of all +remaining atom types will be considered as potential swap partners. +This includes the atom type specified with the *diff* keyword to +account for self-diffusive hops between two atoms of the same type. -The keyword *diff* is used for implementation of simulated diffusion of -a given atom type as given by *diff type*. This command selects all atom -types as acceptable swap types to a centrally selected atom of type -*type*. This includes the atom type specified by the diff keyword to -account for self-diffusion hops of an atom type with itself. - -Keyword *voro* is currently required, and is implemented as - -.. code-block:: LAMMPS - - voro compute-ID - -where *compute-ID* is the ID of a corresponding Voronoi computation with -neighbor list, i.e. +The keyword *voro* is required. Its *vID* value is the compute-ID of +a :doc:`compute voronoi/atom ` command like +this: .. code-block:: LAMMPS compute compute-ID group-ID voronoi/atom neighbors yes -The group selected for computing *voro* should correspond to all the -potential atoms to be swapped at the initial step, i.e. +Note that the *neighbors yes* option must be enabled for use with this +fix. The group-ID should include all the atoms which this fix will +potentialy select. I.e. the group-ID used in the voronoi compute should +include the same atoms as that indicated by the *types* keyword. If the +*diff* keyword is used, the group-ID should include atoms of all types +in the simulation. -.. code-block:: LAMMPS +The keyword *ke* takes *yes* (default) or *no* as its value. It two +atoms are swapped with different masses, then a value of *yes* will +rescale their respective velocities to conserve the kinetic energy of +the system. A value of *no* will perform no rescaling, so that +kinetic energy is not conserved. See the restriction on this keyword +below. - group group-ID type 2 +The *region* keyword takes a *region-ID* as its value. If specified, +then only atoms *I* and *J* within the geometric region will be +considered as swap partners. See the :doc:`region ` command +for details. This means the group-ID for the :doc:`compute +voronoi/atom ` command also need only contain +atoms within the region. -for using *fix neighbor/swap* with *diff 2*. - -If atoms in the specified group are not in the voro calculated group -they will not be considered for swapping. - -The keyword *rates* can modify the swap rate for each swapped type by -values where the adjusted rates values are given in order of increasing -atom type. The number of rates provided must equal the number of atom -types in the simulation. In the third provided example above, a -simulation is conducted with three atom types where the third atom type -is the one sampled for attempted swaps. All three atom types are -considered valid swaps, but atoms of type 1 will be selected three times -as often as atoms of type 2. Conversely, atoms of type 3 are six times -more likely to be selected than atoms of type two and twice as likely as -atoms of type 1. - -Finally, the *region* keyword is implemented as in other atomic fixes, -where the *region region-ID* command indicates that atom swaps only be -considered in the area given by *region-ID*. If only atoms of certain -groups are expected to be in this region, the corresponding compute -voronoi command can be adjusted accordingly. - -Either the *types* or *diff* keyword must be specified to select atom -types for swapping - -Keyword Summary -"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -types = Select random atom matching first type as type I, remaining -atom types are valid for selecting atom J. -diff = Select random atom of this type as atom I, all atoms are valid -for type J. -ke = re-scale velocities when atoms are swapped based on difference in -mass -region = select only atoms I and J from region -rates = pre-factor modification to the J atom selection probability -based on atom type. +The keyword *rates* can modify the swap rate based on the type of atom +*J*. Ntype values must be specified, where Ntype = the number of atom +types in the system. Each value is used to scale the probability +weighting given by the equation above. In the third example command +above, a simulation has 3 atoms types. Atom *I*s of type 1 are +eligible for swapping. Swaps may occur with atom *J*s of all 3 types. +Assuming all *J* atoms are equidistant from an atom *I*, *J* atoms of +type 1 will be 3x more likely to be selected as a swap partner than +atoms of type 2. And *J* atoms of type 3 will be 6.5x more likely to +be selected than atoms of type 2. If the *rates* keyword is not used, Restart, fix_modify, output, run start/stop, minimize info @@ -215,19 +220,18 @@ Restrictions This fix is part of the MC package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` -doc page for more info. Also this fix requires that the -:ref:`VORONOI package ` is installed, otherwise the fix -will not be compiled. +doc page for more info. Also this fix requires that the :ref:`VORONOI +package ` be installed, otherwise the fix will not be +compiled. -The voronoi command specified by *voro* must return neighboring atoms. - -When this fix is used with a :doc:`hybrid pair style ` -system, only swaps between atom types of the same sub-style (or -combination of sub-styles) are permitted. +The :doc:`compute voronoi/atom ` command +referenced by keyword *voro* must return neighboring atoms as +illustrated in the examples above. If this fix is used with systems that do not have per-type masses -(e.g. atom style sphere), the ke flag must be set to off since the -implemented algorithm will not be able to re-scale velocity properly. +(e.g. atom style sphere), the *ke* keyword must be set to *off* since +the implemented algorithm will not be able to re-scale velocities +properly. Related commands """""""""""""""" @@ -240,11 +244,11 @@ Related commands Default """"""" -The option defaults are *ke* = yes, *rates* = 1 for all -atom types. +The option defaults are *ke* = yes and *rates* = 1 for all atom types. ---------- .. _TavennerMDkMC: -**(Tavenner 2023)** J Tavenner, M Mendelev, J Lawson, Computational Materials Science, 218, 111929 (2023). +**(Tavenner 2023)** J Tavenner, M Mendelev, J Lawson, Computational + Materials Science, 218, 111929 (2023). From 51de62ce057f144ed59f5b4737734315e92bf3b4 Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Mon, 14 Apr 2025 15:58:19 -0600 Subject: [PATCH 41/94] Reconcile version changes to documentation and polish --- doc/src/fix_neighbor_swap.rst | 102 ---------------------------------- 1 file changed, 102 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 5f0373d13b..da1e89bed5 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -25,13 +25,8 @@ Syntax .. parsed-literal:: *types* values = two or more atom types (Integers in range [1,Ntypes] or type labels) -<<<<<<< HEAD *diff* values = one atom type *ke* value = *yes* or *no* -======= - *ke* value = *no* or *yes* - *no* = no conservation of kinetic energy after atom swaps ->>>>>>> a3bc1a6c0b09ee7a84167ab8aa626e4a93443846 *yes* = kinetic energy is conserved after atom swaps *no* = no conservation of kinetic energy after atom swaps *region* value = region-ID @@ -53,7 +48,6 @@ Description .. versionadded:: TBD -<<<<<<< HEAD This fix performs Monte-Carlo (MC) evaluations to enable kinetic Monte Carlo (kMC)-type behavior during MD simulation by allowing neighboring atoms to swap their positions. In constrast to the :doc:`fix @@ -76,52 +70,6 @@ to the swap. A detailed explanation of the original implementation of this algorithm can be found in :ref:`(Tavenner 2023) <_TavennerMDkMC>` where it was used to simulated accelerated diffusion in an MD context. -======= -This fix computes Monte Carlo (MC) evaluations to enable kinetic -Monte Carlo (kMC) behavior during an MD simulation by allowing -neighboring atoms to swap their positions. This creates a hybrid MD/kMC -simulation -where atoms are swapped only with their neighbors, and the swapping acceptance is -perfomed by evaluating the change in system energy using the Metropolis criterion. -Neighboring atoms are selected using a Voronoi tesselation approach. A detailed -explination of the original implementation of this procedure can be found in -:ref:`(Tavenner 2023) <_TavennerMDkMC>` as originally intended for simulating -accelerated diffusion in an MD context. - -Simulating inherently kinetically-limited behaviors which rely on rare events -(such as atomic diffusion) is challenging for traditional Molecular Dynamics -approaches, since thermal vibration motion occurs on a timescale much -shorter than local structural changes such as vacancy hopping. -To address -this challenge, an approach from kMC simulations is adopted where rare events can -be sampled at selected rates. By selecting such swap behaviors, the process -of atomic diffusion can be approximated during an MD simulation, effectively -decoupling the MD atomic vibrational time and the timescale of atomic hopping. - -To achieve such simulations, this algorithm takes the following approach. First, -the MD simulation is stopped *N* steps to attempt *X* atom swaps. -Voronoi neighbors are computed for all valid swap atoms. -For each swap attempt, one atom -I is selected at random from the global list of valid atoms. One if its Voronoi neighbors -that is a valid atom to swap is then selected. The neighbor atom ID is communicated to all -processors, as it may be owned by a different processor. -The two atom types are then swapped, and the change in system energy from before -the swap is used to evaluate the Metropolis acceptance criterion. This evaluation of the energy -change is a global calculation, such that it has a computational cost similar to -that of an MD timestep. If the swap is accepted from the Metropolis criterion, the -atoms remain swapped. If the swap is rejected, the atoms are reverted to their original types. This -process of MC evaluation is repeated for a given number of iterations until the -original MD simulation is resumed from the new state, where any successfully -swapped atoms have changed type, though the global system balance is preserved. - -A few key notes regarding this implementation are as follows. The parallel -efficiency of this algorithm is similar to that of other MC approaches, i.e, -the global potential energy must be calculated after each attempted swap. -Efficiency is sensitive to the maximum cutoff distance for the pair style, -since the neighbor list will need to be rebuilt between swap events. -Limitations are imposed on the Voronoi neighbors -to restrict swapping of atoms that are outside of a reasonable cutoff. ->>>>>>> a3bc1a6c0b09ee7a84167ab8aa626e4a93443846 Simulating inherently kinetically-limited behaviors which rely on rare events (such as atomic diffusion in a solid) is challenging for @@ -189,15 +137,9 @@ average nearest-neighbor spacing is appropriate. Since this is simply a proability weighting, the swapping behavior is not very sensitive to the exact value of *R0*. -<<<<<<< HEAD The keyword *types* takes two or more atom types as its values. Only atoms *I* of the first atom type will be selected. Only atoms *J* of the remaining atom types will be considered as potential swap partners. -======= -Typically, a value around the average nearest-neighbor spacing is appropriate -for *R0*. Since this is simply a probability weighting, behavior is not -particularly sensitive to the exact value of *R0*. ->>>>>>> a3bc1a6c0b09ee7a84167ab8aa626e4a93443846 The keyword *diff* take a single atom type as its value. Only atoms *I* of the that atom type will be selected. Atoms *J* of all @@ -205,26 +147,9 @@ remaining atom types will be considered as potential swap partners. This includes the atom type specified with the *diff* keyword to account for self-diffusive hops between two atoms of the same type. -<<<<<<< HEAD The keyword *voro* is required. Its *vID* value is the compute-ID of a :doc:`compute voronoi/atom ` command like this: -======= -The keyword *diff* is used for implementation of simulated diffusion of -a given atom type as given by *diff type*. This command selects all atom -types as acceptable swap types to a centrally selected atom of type -*type*. This includes the atom type specified by the *diff* keyword to -account for self-diffusion hops of an atom type with itself. - -Keyword *voro* is currently required, and is implemented as - -.. code-block:: LAMMPS - - voro compute-ID - -where *compute-ID* is the ID of a corresponding Voronoi computation with -neighbor list, i.e. ->>>>>>> a3bc1a6c0b09ee7a84167ab8aa626e4a93443846 .. code-block:: LAMMPS @@ -251,7 +176,6 @@ for details. This means the group-ID for the :doc:`compute voronoi/atom ` command also need only contain atoms within the region. -<<<<<<< HEAD The keyword *rates* can modify the swap rate based on the type of atom *J*. Ntype values must be specified, where Ntype = the number of atom types in the system. Each value is used to scale the probability @@ -262,32 +186,6 @@ Assuming all *J* atoms are equidistant from an atom *I*, *J* atoms of type 1 will be 3x more likely to be selected as a swap partner than atoms of type 2. And *J* atoms of type 3 will be 6.5x more likely to be selected than atoms of type 2. If the *rates* keyword is not used, -======= -for using *fix neighbor/swap* with *diff 2*. - -If atoms in the specified group are not in the voro calculated group -they will not be considered for swapping. - -The keyword *rates* can modify the swap rate for each swapped type by -values where the adjusted rates values are given in order of increasing -atom type. The number of rates provided must equal the number of atom -types in the simulation. In the third provided example above, a -simulation is conducted with three atom types where the third atom type -is the one sampled for attempted swaps. All three atom types are -considered valid swaps, but atoms of type 1 will be selected three times -as often as atoms of type 2. Conversely, atoms of type 3 are six times -more likely to be selected than atoms of type two and twice as likely as -atoms of type 1. - -Finally, the *region* keyword is implemented as in other atomic fixes, -where the *region region-ID* command indicates that atom swaps only be -considered in the area given by *region-ID*. If only atoms of certain -groups are expected to be in this region, the corresponding compute -voronoi command can be adjusted accordingly. - -Either the *types* or *diff* keyword must be specified to select atom -types for swapping ->>>>>>> a3bc1a6c0b09ee7a84167ab8aa626e4a93443846 Restart, fix_modify, output, run start/stop, minimize info From 4bfdd3eb3481e15aa1fa7e9be746a952ec454b8d Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Mon, 14 Apr 2025 16:22:11 -0600 Subject: [PATCH 42/94] Remove trailing whitespace --- doc/src/fix_neighbor_swap.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index da1e89bed5..274c4ea939 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -48,11 +48,11 @@ Description .. versionadded:: TBD -This fix performs Monte-Carlo (MC) evaluations to enable kinetic -Monte Carlo (kMC)-type behavior during MD simulation by allowing +This fix performs Monte-Carlo (MC) evaluations to enable kinetic +Monte Carlo (kMC)-type behavior during MD simulation by allowing neighboring atoms to swap their positions. In constrast to the :doc:`fix atom/swap ` command which swaps pairs of atoms anywhere -in the simulation domain, the restriction of the MC swapping to +in the simulation domain, the restriction of the MC swapping to neighbors enables a hybrid MD/kMC-like simulation. Neighboring atoms are defined by using a Voronoi tesselation performed @@ -115,7 +115,7 @@ computed correctly. Limitations are imposed on selection of *I,J* atom pairs to avoid swapping of atoms which are outside of a reasonable cutoff (e.g. due to a Voronoi tesselation near free surfaces) though the -use of a distance-weighted probabiltiy scaling. +use of a distance-weighted probabiltiy scaling. ---------- From 0c29a0a0c9e555a16dc2dd439d9cf2cfece364d1 Mon Sep 17 00:00:00 2001 From: William Zunker Date: Tue, 15 Apr 2025 13:55:38 -0400 Subject: [PATCH 43/94] changed damp_type to be a mdr damping coefficent --- doc/src/pair_granular.rst | 16 ++++++---------- examples/granular/in.tableting.200 | 6 +++--- examples/granular/in.triaxial.compaction.12 | 6 +++--- src/GRANULAR/gran_sub_mod_damping.cpp | 8 +++++++- src/GRANULAR/gran_sub_mod_damping.h | 3 ++- src/GRANULAR/gran_sub_mod_normal.cpp | 4 +--- src/GRANULAR/gran_sub_mod_normal.h | 2 -- 7 files changed, 22 insertions(+), 23 deletions(-) diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 696c87b0ab..7998f11cc5 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -44,7 +44,7 @@ Examples pair_coeff * * hertz 1000.0 50.0 tangential mindlin 1000.0 1.0 0.4 heat area 0.1 pair_style granular - pair_coeff * * mdr 5e6 0.4 1.9e5 2.0 0.5 0.5 tangential linear_history 940.0 0.0 0.7 rolling sds 2.7e5 0.0 0.6 damping mdr 1 + pair_coeff * * mdr 5e6 0.4 1.9e5 2.0 0.5 0.5 tangential linear_history 940.0 1.0 0.7 rolling sds 2.7e5 0.0 0.6 damping mdr 1 Description """"""""""" @@ -89,7 +89,7 @@ and their required arguments are: 4. *dmt* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` 5. *jkr* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` 6. *mdr* : :math:`E`, :math:`\nu`, :math:`Y`, :math:`\Delta\gamma`, - :math:`\psi_b`, :math:`\eta_{n0}`, :math:`d_{type}` + :math:`\psi_b`, :math:`\eta_{n0}` Here, :math:`k_n` is spring stiffness (with units that depend on model choice, see below); :math:`\eta_{n0}` is a damping prefactor (or, in its @@ -206,9 +206,6 @@ The model requires the following inputs: 6. *Damping coefficent* :math:`\eta_{n0} \ge 0` : The damping coefficient is a tunable parameter that controls damping in the normal direction. - 7. *Damping type* :math:`d_{type} =` 1 or 2 : The damping type specfies the - damping model defined for the *mdr* damping class described below. - .. note:: The values for :math:`E`, :math:`\nu`, :math:`Y`, and :math:`\Delta\gamma` (i.e., @@ -263,7 +260,7 @@ The *mdr* model currently only supports *fix wall/gran/region*, not any *fix wall/gran/region* commands must also use the *mdr* model. Additionally, the following *mdr* inputs must match between the *pair_style* and *fix wall/gran/region* definitions: :math:`E`, -:math:`\nu`, :math:`Y`, :math:`\psi_b`, and :math:`e`. The exception +:math:`\nu`, :math:`Y`, :math:`\psi_b`, and :math:`\eta_{n0}`. The exception is :math:`\Delta\gamma`, which may vary, permitting different adhesive behaviors between particle-particle and particle-wall interactions. @@ -329,7 +326,7 @@ for the damping model currently supported are: 3. *viscoelastic* 4. *tsuji* 5. *coeff_restitution* -6. *mdr* +6. *mdr* (class) : :math:`d_{type}` If the *damping* keyword is not specified, the *viscoelastic* model is used by default. @@ -420,9 +417,8 @@ restitution for both monodisperse and polydisperse particle pairs. This damping model is not compatible with cohesive normal models such as *JKR* or *DMT*. The *mdr* damping class contains multiple damping models that can be toggled between -by specifying different integer values for the :math:`d_{type}` parameter in the *mdr* -normal model. This damping option is therefore only compatible with the normal *mdr* -contact model. +by specifying different integer values for the :math:`d_{type}` input parameter. This +damping option is only compatible with the normal *mdr* contact model. Setting :math:`d_{type} = 1` is the suggested damping option. This specifies a damping model that takes into account the contact stiffness :math:`k_{mdr}` calulated diff --git a/examples/granular/in.tableting.200 b/examples/granular/in.tableting.200 index 02eb6743de..58fc8dde3e 100644 --- a/examples/granular/in.tableting.200 +++ b/examples/granular/in.tableting.200 @@ -50,8 +50,8 @@ variable mu_roll equal 0.6 variable k_roll equal 2.25*${mu_roll}*${mu_roll}*${YoungsModulus}*${atomRadius} variable gamma_roll equal 0.0 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} ${damp_type} & - damping mdr & +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} & + damping mdr ${damp_type} & tangential linear_history ${kt} ${xgammat} ${mu_s} & rolling sds ${k_roll} ${gamma_roll} ${mu_roll} @@ -60,7 +60,7 @@ pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEne variable disp_upper equal 0.0 variable disp_lower equal 0.0 -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} ${damp_type} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" variable dieHeight2 equal 2*${dieHeight} diff --git a/examples/granular/in.triaxial.compaction.12 b/examples/granular/in.triaxial.compaction.12 index 6a948157d3..0a35ab3c0a 100644 --- a/examples/granular/in.triaxial.compaction.12 +++ b/examples/granular/in.triaxial.compaction.12 @@ -38,8 +38,8 @@ variable kt equal 2/7*${YoungsModulus}*${atomRadius} variable xgammat equal 0.0 variable mu_s equal 0.5 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} ${damp_type} & - damping mdr & +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} & + damping mdr ${damp_type} & tangential linear_history ${kt} ${xgammat} ${mu_s} ######################################### ADD IN PLANES ################################################ @@ -57,7 +57,7 @@ region plane_xz_neg plane 0 -${halfBoxWidth} 0 0 1 0 side in move NULL v_plane_d region plane_xy_pos plane 0 0 ${halfBoxWidth} 0 0 -1 side in move NULL NULL v_plane_disp_neg units box region plane_xy_neg plane 0 0 -${halfBoxWidth} 0 0 1 side in move NULL NULL v_plane_disp units box -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} ${damp_type} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} " +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} " fix plane_yz_pos all wall/gran/region ${wall_contact_string} region plane_yz_pos contacts fix plane_yz_neg all wall/gran/region ${wall_contact_string} region plane_yz_neg contacts diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index c35d63d668..b68a720413 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -190,6 +190,13 @@ void GranSubModDampingCoeffRestitution::init() GranSubModDampingMDR::GranSubModDampingMDR(GranularModel *gm, LAMMPS *lmp) : GranSubModDamping(gm, lmp) { + num_coeffs = 1; +} + +void GranSubModDampingMDR::coeffs_to_local() +{ + damp_type = coeffs[0]; // damping type 1 = mdr stiffness or 2 = velocity + if (damp_type != 1 && damp_type != 2) error->all(FLERR, "Illegal MDR normal model, damping type must an integer equal to 1 or 2"); } /* ---------------------------------------------------------------------- */ @@ -200,7 +207,6 @@ void GranSubModDampingMDR::init() error->all(FLERR, "Damping mdr can only be used with mdr normal model"); damp = gm->normal_model->get_damp(); - damp_type = gm->normal_model->get_damp_type(); } /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/gran_sub_mod_damping.h b/src/GRANULAR/gran_sub_mod_damping.h index c73a4a8e5e..274c3d9e29 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -42,7 +42,7 @@ namespace Granular_NS { protected: double damp_prefactor; double damp; - int damp_type; + int damp_type; // damping type is only used by normal mdr model }; /* ---------------------------------------------------------------------- */ @@ -99,6 +99,7 @@ namespace Granular_NS { class GranSubModDampingMDR : public GranSubModDamping { public: GranSubModDampingMDR(class GranularModel *, class LAMMPS *); + void coeffs_to_local() override; void init() override; double calculate_forces() override; }; diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index aa53f5fcf6..68cb853d9d 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -441,7 +441,7 @@ GranSubModNormalMDR::GranSubModNormalMDR(GranularModel *gm, LAMMPS *lmp) : { if (lmp->citeme) lmp->citeme->add(cite_mdr); - num_coeffs = 7; + num_coeffs = 6; contact_radius_flag = 1; size_history = 27; nsvector = 1; @@ -474,7 +474,6 @@ void GranSubModNormalMDR::coeffs_to_local() gamma = coeffs[3]; // effective surface energy psi_b = coeffs[4]; // bulk response trigger based on ratio of remaining free area: A_{free}/A_{total} damp = coeffs[5]; // coefficent of restitution - damp_type = coeffs[6]; // damping type 1 = mdr or 2 = velocity if (E <= 0.0) error->all(FLERR, "Illegal MDR normal model, Young's modulus must be greater than 0"); if (nu < 0.0 || nu > 0.5) error->all(FLERR, "Illegal MDR normal model, Poisson's ratio must be between 0 and 0.5"); @@ -482,7 +481,6 @@ void GranSubModNormalMDR::coeffs_to_local() if (gamma < 0.0) error->all(FLERR, "Illegal MDR normal model, effective surface energy must be greater than or equal to 0"); if (psi_b < 0.0 || psi_b > 1.0) error->all(FLERR, "Illegal MDR normal model, psi_b must be between 0 and 1.0"); if (damp < 0.0) error->all(FLERR, "Illegal MDR normal model, damping coefficent must be greater than or equal to 0"); - if (damp_type != 1 && damp_type != 2) error->all(FLERR, "Illegal MDR normal model, damping type must an integer equal to 1 or 2"); G = E / (2.0 * (1.0 + nu)); // shear modulus kappa = E / (3.0 * (1.0 - 2.0 * nu)); // bulk modulus diff --git a/src/GRANULAR/gran_sub_mod_normal.h b/src/GRANULAR/gran_sub_mod_normal.h index 0b7bb664d5..8142d88cea 100644 --- a/src/GRANULAR/gran_sub_mod_normal.h +++ b/src/GRANULAR/gran_sub_mod_normal.h @@ -41,7 +41,6 @@ namespace Granular_NS { int get_cohesive_flag() const { return cohesive_flag; } double get_damp() const { return damp; } - double get_damp_type() const { return damp_type; } double get_emod() const { return Emod; } double get_fncrit() const { return Fncrit; } int get_material_properties() const { return material_properties; } @@ -52,7 +51,6 @@ namespace Granular_NS { protected: double damp; // argument historically needed by damping // typically (but not always) equals eta_n0 - int damp_type; // damping type is only used by normal mdr model double Emod, poiss; double Fncrit; int material_properties, cohesive_flag; From 49d5e02c11a84b3ed3c14fada9560e28cb9f6461 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Tue, 15 Apr 2025 17:34:46 -0600 Subject: [PATCH 44/94] Variable name change, fixing some spacing/typos --- .../granular/log.4Feb25.tableting.200.g++.1 | 926 +++++++------- .../log.4Feb25.triaxial.compaction.12.g++.1 | 1080 +++++++++-------- src/GRANULAR/fix_granular_mdr.cpp | 8 +- src/GRANULAR/gran_sub_mod_damping.cpp | 3 +- src/GRANULAR/gran_sub_mod_damping.h | 4 +- src/GRANULAR/gran_sub_mod_normal.cpp | 35 +- src/GRANULAR/gran_sub_mod_normal.h | 2 +- 7 files changed, 1035 insertions(+), 1023 deletions(-) diff --git a/examples/granular/log.4Feb25.tableting.200.g++.1 b/examples/granular/log.4Feb25.tableting.200.g++.1 index 818198ccd7..c164f3dbee 100644 --- a/examples/granular/log.4Feb25.tableting.200.g++.1 +++ b/examples/granular/log.4Feb25.tableting.200.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-583-g3d4b57d7fd-modified) +LAMMPS (4 Feb 2025 - Development - patch_5May2020-22356-g0c29a0a0c9-modified) ##################################### SIMULATION SETTINGS ################################################### atom_style sphere 1 @@ -20,7 +20,7 @@ Reading data file ... 1 by 1 by 1 MPI processor grid reading atoms ... 200 atoms - read_data CPU = 0.003 seconds + read_data CPU = 0.024 seconds #################################### ADD DIE AND ATOM PARAMETERIZATION ###################################### @@ -44,8 +44,9 @@ variable YieldStress equal 1.9e5 variable PoissonsRatio equal 0.4 variable SurfaceEnergy equal 2 variable SurfaceEnergyWall equal 0.0 -variable damp equal 1.0 variable psi_b equal 0.5 +variable damp equal 0.2 +variable damp_type equal 1 # linear_history = k_t, x_gammat, mu_s variable kt equal 2/7*${YoungsModulus}*${atomRadius} @@ -67,38 +68,40 @@ variable k_roll equal 2.25*0.6*0.6*5000000*${atomRadius} variable k_roll equal 2.25*0.6*0.6*5000000*0.00055 variable gamma_roll equal 0.0 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 2 ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 2 0.5 ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.7 rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 ${gamma_roll} ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 0 ${mu_roll} -pair_coeff * * mdr 5000000 0.4 190000 2 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 0 0.6 +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.7 rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 0 ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 0 0.6 ######################################### ADD DIE AND PUNCH WALLS ############################################ variable disp_upper equal 0.0 variable disp_lower equal 0.0 -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" -granular mdr 5000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 190000 ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 190000 0 ${psi_b} ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 190000 0 0.5 ${damp} damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds ${k_roll} ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 ${gamma_roll} ${mu_roll} -granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 ${mu_roll} -granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" +granular mdr 5000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 variable dieHeight2 equal 2*${dieHeight} variable dieHeight2 equal 2*0.01 @@ -111,11 +114,11 @@ region die cylinder z 0 0 0.004 0 ${dieHeight2} side in units box region die cylinder z 0 0 0.004 0 0.02 side in units box fix lowerPunch all wall/gran/region ${wall_contact_string} region lowerPunch contacts -fix lowerPunch all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region lowerPunch contacts +fix lowerPunch all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region lowerPunch contacts fix upperPunch all wall/gran/region ${wall_contact_string} region upperPunch contacts -fix upperPunch all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region upperPunch contacts +fix upperPunch all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region upperPunch contacts fix die all wall/gran/region ${wall_contact_string} region die contacts -fix die all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 1 damping mdr tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region die contacts +fix die all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region die contacts compute avgUpperPunchForce all reduce sum f_upperPunch[4] variable avgUpperPunchForce equal c_avgUpperPunchForce @@ -173,8 +176,9 @@ Your simulation uses code contributions which should be cited: author = {Zunker, William and Dunatunga, Sachith and Thakur, Subhash and Tang, Pingjun and Kamrin, Ken}, title = {Experimentally validated DEM for large deformation powder compaction: mechanically-derived contact model and screening of non-physical contacts}, + journal = {Powder Technology}, year = {2025}, - journal = {engrXiv}, + pages = {120972}, } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -195,9 +199,9 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes Dt Step Atoms KinEng Volume v_disp_upper 4e-06 0 200 0 2.1e-06 0 -Loop time of 7.84e-07 on 1 procs for 0 steps with 200 atoms +Loop time of 7.43e-07 on 1 procs for 0 steps with 200 atoms -127.6% CPU use with 1 MPI tasks x no OpenMP threads +134.6% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total @@ -207,7 +211,7 @@ Neigh | 0 | 0 | 0 | 0.0 | 0.00 Comm | 0 | 0 | 0 | 0.0 | 0.00 Output | 0 | 0 | 0 | 0.0 | 0.00 Modify | 0 | 0 | 0 | 0.0 | 0.00 -Other | | 7.84e-07 | | |100.00 +Other | | 7.43e-07 | | |100.00 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -263,78 +267,78 @@ Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes Dt Step Atoms KinEng Volume v_disp_upper 4e-06 0 200 0 2.1e-06 0 4e-06 100 200 1.5945503e-09 2.1e-06 0 - 4e-06 200 200 6.3722236e-09 2.1e-06 0 - 4e-06 300 200 1.4211064e-08 2.1e-06 0 - 4e-06 400 200 2.5258679e-08 2.1e-06 0 - 4e-06 500 200 3.9464769e-08 2.1e-06 0 - 4e-06 600 200 5.6825967e-08 2.1e-06 0 - 4e-06 700 200 7.7344469e-08 2.1e-06 0 - 4e-06 800 200 1.0060974e-07 2.1e-06 0 - 4e-06 900 200 1.2653591e-07 2.1e-06 0 - 4e-06 1000 200 1.5569212e-07 2.1e-06 0 - 4e-06 1100 200 1.8742647e-07 2.1e-06 0 - 4e-06 1200 200 2.215525e-07 2.1e-06 0 - 4e-06 1300 200 2.5959327e-07 2.1e-06 0 - 4e-06 1400 200 3.010369e-07 2.1e-06 0 - 4e-06 1500 200 3.4166871e-07 2.1e-06 0 - 4e-06 1600 200 3.8173997e-07 2.1e-06 0 - 4e-06 1700 200 4.2263596e-07 2.1e-06 0 - 4e-06 1800 200 4.6542919e-07 2.1e-06 0 - 4e-06 1900 200 5.1316032e-07 2.1e-06 0 - 4e-06 2000 200 5.6390086e-07 2.1e-06 0 - 4e-06 2100 200 6.1282692e-07 2.1e-06 0 - 4e-06 2200 200 6.6871978e-07 2.1e-06 0 - 4e-06 2300 200 7.2432957e-07 2.1e-06 0 - 4e-06 2400 200 7.7356329e-07 2.1e-06 0 - 4e-06 2500 200 8.3121212e-07 2.1e-06 0 - 4e-06 2600 200 8.9285402e-07 2.1e-06 0 - 4e-06 2700 200 9.5056709e-07 2.1e-06 0 - 4e-06 2800 200 1.0078859e-06 2.1e-06 0 - 4e-06 2900 200 1.0583726e-06 2.1e-06 0 - 4e-06 3000 200 1.1128777e-06 2.1e-06 0 - 4e-06 3100 200 1.149994e-06 2.1e-06 0 - 4e-06 3200 200 1.2038821e-06 2.1e-06 0 - 4e-06 3300 200 1.2266858e-06 2.1e-06 0 - 4e-06 3400 200 1.2785607e-06 2.1e-06 0 - 4e-06 3500 200 1.3382357e-06 2.1e-06 0 - 4e-06 3600 200 1.3864259e-06 2.1e-06 0 - 4e-06 3700 200 1.4382735e-06 2.1e-06 0 - 4e-06 3800 200 1.4261443e-06 2.1e-06 0 - 4e-06 3900 200 1.4409345e-06 2.1e-06 0 - 4e-06 4000 200 1.4794449e-06 2.1e-06 0 - 4e-06 4100 200 1.4696815e-06 2.1e-06 0 - 4e-06 4200 200 1.4980192e-06 2.1e-06 0 - 4e-06 4300 200 1.5093101e-06 2.1e-06 0 - 4e-06 4400 200 1.527165e-06 2.1e-06 0 - 4e-06 4500 200 1.5514338e-06 2.1e-06 0 - 4e-06 4600 200 1.5939536e-06 2.1e-06 0 - 4e-06 4700 200 1.6017087e-06 2.1e-06 0 - 4e-06 4800 200 1.5835827e-06 2.1e-06 0 - 4e-06 4900 200 1.5646707e-06 2.1e-06 0 - 4e-06 5000 200 1.5869167e-06 2.1e-06 0 -Loop time of 0.894952 on 1 procs for 5000 steps with 200 atoms + 4e-06 200 200 6.3750614e-09 2.1e-06 0 + 4e-06 300 200 1.4225143e-08 2.1e-06 0 + 4e-06 400 200 2.5255561e-08 2.1e-06 0 + 4e-06 500 200 3.947508e-08 2.1e-06 0 + 4e-06 600 200 5.6839079e-08 2.1e-06 0 + 4e-06 700 200 7.7346494e-08 2.1e-06 0 + 4e-06 800 200 1.0075645e-07 2.1e-06 0 + 4e-06 900 200 1.2660105e-07 2.1e-06 0 + 4e-06 1000 200 1.5571123e-07 2.1e-06 0 + 4e-06 1100 200 1.8785107e-07 2.1e-06 0 + 4e-06 1200 200 2.2200974e-07 2.1e-06 0 + 4e-06 1300 200 2.6009223e-07 2.1e-06 0 + 4e-06 1400 200 3.0148646e-07 2.1e-06 0 + 4e-06 1500 200 3.4269724e-07 2.1e-06 0 + 4e-06 1600 200 3.8502938e-07 2.1e-06 0 + 4e-06 1700 200 4.2763891e-07 2.1e-06 0 + 4e-06 1800 200 4.6779321e-07 2.1e-06 0 + 4e-06 1900 200 5.1285578e-07 2.1e-06 0 + 4e-06 2000 200 5.6630973e-07 2.1e-06 0 + 4e-06 2100 200 6.1904302e-07 2.1e-06 0 + 4e-06 2200 200 6.7462868e-07 2.1e-06 0 + 4e-06 2300 200 7.3066636e-07 2.1e-06 0 + 4e-06 2400 200 7.7407334e-07 2.1e-06 0 + 4e-06 2500 200 8.3353557e-07 2.1e-06 0 + 4e-06 2600 200 9.0017986e-07 2.1e-06 0 + 4e-06 2700 200 9.5154909e-07 2.1e-06 0 + 4e-06 2800 200 1.0110977e-06 2.1e-06 0 + 4e-06 2900 200 1.0661364e-06 2.1e-06 0 + 4e-06 3000 200 1.1226841e-06 2.1e-06 0 + 4e-06 3100 200 1.1703917e-06 2.1e-06 0 + 4e-06 3200 200 1.2254551e-06 2.1e-06 0 + 4e-06 3300 200 1.2239859e-06 2.1e-06 0 + 4e-06 3400 200 1.273437e-06 2.1e-06 0 + 4e-06 3500 200 1.3357598e-06 2.1e-06 0 + 4e-06 3600 200 1.3949477e-06 2.1e-06 0 + 4e-06 3700 200 1.459988e-06 2.1e-06 0 + 4e-06 3800 200 1.5053806e-06 2.1e-06 0 + 4e-06 3900 200 1.4952453e-06 2.1e-06 0 + 4e-06 4000 200 1.5037857e-06 2.1e-06 0 + 4e-06 4100 200 1.5225204e-06 2.1e-06 0 + 4e-06 4200 200 1.5375323e-06 2.1e-06 0 + 4e-06 4300 200 1.5552328e-06 2.1e-06 0 + 4e-06 4400 200 1.581097e-06 2.1e-06 0 + 4e-06 4500 200 1.6066427e-06 2.1e-06 0 + 4e-06 4600 200 1.6061944e-06 2.1e-06 0 + 4e-06 4700 200 1.6110891e-06 2.1e-06 0 + 4e-06 4800 200 1.6072997e-06 2.1e-06 0 + 4e-06 4900 200 1.5907992e-06 2.1e-06 0 + 4e-06 5000 200 1.5501104e-06 2.1e-06 0 +Loop time of 0.592588 on 1 procs for 5000 steps with 200 atoms -99.7% CPU use with 1 MPI tasks x no OpenMP threads +99.4% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.33414 | 0.33414 | 0.33414 | 0.0 | 37.34 -Neigh | 0.013978 | 0.013978 | 0.013978 | 0.0 | 1.56 -Comm | 0.00055911 | 0.00055911 | 0.00055911 | 0.0 | 0.06 -Output | 0.00042257 | 0.00042257 | 0.00042257 | 0.0 | 0.05 -Modify | 0.54341 | 0.54341 | 0.54341 | 0.0 | 60.72 -Other | | 0.002439 | | | 0.27 +Pair | 0.20465 | 0.20465 | 0.20465 | 0.0 | 34.53 +Neigh | 0.013252 | 0.013252 | 0.013252 | 0.0 | 2.24 +Comm | 0.00037594 | 0.00037594 | 0.00037594 | 0.0 | 0.06 +Output | 0.00037454 | 0.00037454 | 0.00037454 | 0.0 | 0.06 +Modify | 0.37295 | 0.37295 | 0.37295 | 0.0 | 62.93 +Other | | 0.0009914 | | | 0.17 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1663 ave 1663 max 1663 min +Neighs: 1632 ave 1632 max 1632 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 1663 -Ave neighs/atom = 8.315 +Total # of neighbors = 1632 +Ave neighs/atom = 8.16 Neighbor list builds = 83 Dangerous builds not checked @@ -352,170 +356,170 @@ run 14000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes Dt Step Atoms KinEng Volume v_disp_upper - 4e-06 5000 200 1.5869167e-06 2.1e-06 0 - 4e-06 5100 200 1.533415e-06 2.1e-06 -0.00015706645 - 4e-06 5200 200 1.5210118e-06 2.1e-06 -0.00031405381 - 4e-06 5300 200 1.4717654e-06 2.1e-06 -0.00047088304 - 4e-06 5400 200 1.3867583e-06 2.1e-06 -0.00062747516 - 4e-06 5500 200 1.3210172e-06 2.1e-06 -0.00078375133 - 4e-06 5600 200 1.2694854e-06 2.1e-06 -0.00093963286 - 4e-06 5700 200 1.210939e-06 2.1e-06 -0.0010950413 - 4e-06 5800 200 1.1030246e-06 2.1e-06 -0.0012498983 - 4e-06 5900 200 1.0576145e-06 2.1e-06 -0.0014041259 - 4e-06 6000 200 9.6819458e-07 2.1e-06 -0.0015576465 - 4e-06 6100 200 8.4390663e-07 2.1e-06 -0.0017103828 - 4e-06 6200 200 7.1811878e-07 2.1e-06 -0.0018622579 - 4e-06 6300 200 5.9188275e-07 2.1e-06 -0.0020131953 - 4e-06 6400 200 4.8593994e-07 2.1e-06 -0.002163119 - 4e-06 6500 200 3.7604444e-07 2.1e-06 -0.0023119534 - 4e-06 6600 200 2.9315224e-07 2.1e-06 -0.0024596238 - 4e-06 6700 200 2.4346404e-07 2.1e-06 -0.0026060556 - 4e-06 6800 200 2.1035347e-07 2.1e-06 -0.0027511752 - 4e-06 6900 200 1.7982462e-07 2.1e-06 -0.0028949095 - 4e-06 7000 200 3.3817811e-07 2.1e-06 -0.0030371862 - 4e-06 7100 200 5.4229142e-07 2.1e-06 -0.0031779335 - 4e-06 7200 200 9.8011974e-07 2.1e-06 -0.0033170806 - 4e-06 7300 200 1.4073827e-06 2.1e-06 -0.0034545575 - 4e-06 7400 200 1.8007974e-06 2.1e-06 -0.0035902949 - 4e-06 7500 200 2.5690983e-06 2.1e-06 -0.0037242245 - 4e-06 7600 200 3.3504605e-06 2.1e-06 -0.0038562789 - 4e-06 7700 200 3.3047732e-06 2.1e-06 -0.0039863915 - 4e-06 7800 200 2.7409232e-06 2.1e-06 -0.0041144968 - 4e-06 7900 200 2.7731736e-06 2.1e-06 -0.0042405303 - 4e-06 8000 200 2.7721382e-06 2.1e-06 -0.0043644286 - 4e-06 8100 200 2.5449128e-06 2.1e-06 -0.0044861293 - 4e-06 8200 200 2.4113011e-06 2.1e-06 -0.0046055711 - 4e-06 8300 200 2.5104553e-06 2.1e-06 -0.0047226938 - 4e-06 8400 200 2.7969453e-06 2.1e-06 -0.0048374385 - 4e-06 8500 200 2.4549778e-06 2.1e-06 -0.0049497475 - 4e-06 8600 200 2.6065634e-06 2.1e-06 -0.005059564 - 4e-06 8700 200 1.94773e-06 2.1e-06 -0.005166833 - 4e-06 8800 200 1.8669003e-06 2.1e-06 -0.0052715003 - 4e-06 8900 200 1.7712516e-06 2.1e-06 -0.0053735132 - 4e-06 9000 200 1.5868574e-06 2.1e-06 -0.0054728204 - 4e-06 9100 200 1.2586882e-06 2.1e-06 -0.0055693718 - 4e-06 9200 200 1.7392355e-06 2.1e-06 -0.005663119 - 4e-06 9300 200 1.4103062e-06 2.1e-06 -0.0057540145 - 4e-06 9400 200 1.6133909e-06 2.1e-06 -0.0058420128 - 4e-06 9500 200 1.5715429e-06 2.1e-06 -0.0059270694 - 4e-06 9600 200 1.3060432e-06 2.1e-06 -0.0060091416 - 4e-06 9700 200 1.3016643e-06 2.1e-06 -0.0060881879 - 4e-06 9800 200 1.3827359e-06 2.1e-06 -0.0061641687 - 4e-06 9900 200 1.166866e-06 2.1e-06 -0.0062370457 - 4e-06 10000 200 1.1328931e-06 2.1e-06 -0.0063067821 - 4e-06 10100 200 1.0811811e-06 2.1e-06 -0.0063733428 - 4e-06 10200 200 1.0540805e-06 2.1e-06 -0.0064366944 - 4e-06 10300 200 9.3224876e-07 2.1e-06 -0.0064968049 - 4e-06 10400 200 8.8422228e-07 2.1e-06 -0.0065536441 - 4e-06 10500 200 9.6574449e-07 2.1e-06 -0.0066071833 - 4e-06 10600 200 6.5673924e-07 2.1e-06 -0.0066573956 - 4e-06 10700 200 5.7629287e-07 2.1e-06 -0.0067042557 - 4e-06 10800 200 5.1184648e-07 2.1e-06 -0.00674774 - 4e-06 10900 200 4.2140431e-07 2.1e-06 -0.0067878266 - 4e-06 11000 200 3.679501e-07 2.1e-06 -0.0068244954 - 4e-06 11100 200 2.7198635e-07 2.1e-06 -0.0068577278 - 4e-06 11200 200 3.9270049e-07 2.1e-06 -0.0068875071 - 4e-06 11300 200 2.5364345e-07 2.1e-06 -0.0069138184 - 4e-06 11400 200 2.311875e-07 2.1e-06 -0.0069366483 - 4e-06 11500 200 9.1194666e-08 2.1e-06 -0.0069559855 - 4e-06 11600 200 5.9128951e-08 2.1e-06 -0.0069718201 - 4e-06 11700 200 3.8675445e-08 2.1e-06 -0.0069841441 - 4e-06 11800 200 1.5261639e-08 2.1e-06 -0.0069929515 - 4e-06 11900 200 4.1435674e-09 2.1e-06 -0.0069982376 - 4e-06 12000 200 3.6182887e-10 2.1e-06 -0.007 - 4e-06 12100 200 3.4148153e-09 2.1e-06 -0.0069982376 - 4e-06 12200 200 1.201855e-08 2.1e-06 -0.0069929515 - 4e-06 12300 200 2.7088001e-08 2.1e-06 -0.0069841441 - 4e-06 12400 200 4.7261349e-08 2.1e-06 -0.0069718201 - 4e-06 12500 200 7.585591e-08 2.1e-06 -0.0069559855 - 4e-06 12600 200 1.0717843e-07 2.1e-06 -0.0069366483 - 4e-06 12700 200 1.4357347e-07 2.1e-06 -0.0069138184 - 4e-06 12800 200 2.3364223e-07 2.1e-06 -0.0068875071 - 4e-06 12900 200 2.6460705e-07 2.1e-06 -0.0068577278 - 4e-06 13000 200 3.0878617e-07 2.1e-06 -0.0068244954 - 4e-06 13100 200 4.0950412e-07 2.1e-06 -0.0067878266 - 4e-06 13200 200 5.4382238e-07 2.1e-06 -0.00674774 - 4e-06 13300 200 5.9323976e-07 2.1e-06 -0.0067042557 - 4e-06 13400 200 6.0024632e-07 2.1e-06 -0.0066573956 - 4e-06 13500 200 8.9144808e-07 2.1e-06 -0.0066071833 - 4e-06 13600 200 7.4298898e-07 2.1e-06 -0.0065536441 - 4e-06 13700 200 7.5476346e-07 2.1e-06 -0.0064968049 - 4e-06 13800 200 9.4480881e-07 2.1e-06 -0.0064366944 - 4e-06 13900 200 6.9480641e-07 2.1e-06 -0.0063733428 - 4e-06 14000 200 3.6996473e-07 2.1e-06 -0.0063067821 - 4e-06 14100 200 3.7522265e-07 2.1e-06 -0.0062370457 - 4e-06 14200 200 9.5971189e-07 2.1e-06 -0.0061641687 - 4e-06 14300 200 6.3482043e-07 2.1e-06 -0.0060881879 - 4e-06 14400 200 4.4208165e-08 2.1e-06 -0.0060091416 - 4e-06 14500 200 2.5451697e-09 2.1e-06 -0.0059270694 - 4e-06 14600 200 2.3358938e-10 2.1e-06 -0.0058420128 - 4e-06 14700 200 6.5542266e-10 2.1e-06 -0.0057540145 - 4e-06 14800 200 5.7442167e-10 2.1e-06 -0.005663119 - 4e-06 14900 200 1.8498409e-10 2.1e-06 -0.0055693718 - 4e-06 15000 200 8.9754087e-12 2.1e-06 -0.0054728204 - 4e-06 15100 200 1.5735217e-10 2.1e-06 -0.0053735132 - 4e-06 15200 200 2.0644095e-11 2.1e-06 -0.0052715003 - 4e-06 15300 200 3.1810324e-12 2.1e-06 -0.005166833 - 4e-06 15400 200 9.2248411e-13 2.1e-06 -0.005059564 - 4e-06 15500 200 1.049892e-12 2.1e-06 -0.0049497475 - 4e-06 15600 200 5.1537473e-13 2.1e-06 -0.0048374385 - 4e-06 15700 200 8.0874962e-14 2.1e-06 -0.0047226938 - 4e-06 15800 200 1.9259517e-14 2.1e-06 -0.0046055711 - 4e-06 15900 200 6.1677187e-14 2.1e-06 -0.0044861293 - 4e-06 16000 200 4.0175545e-14 2.1e-06 -0.0043644286 - 4e-06 16100 200 2.8906156e-14 2.1e-06 -0.0042405303 - 4e-06 16200 200 1.4689406e-14 2.1e-06 -0.0041144968 - 4e-06 16300 200 1.4816055e-14 2.1e-06 -0.0039863915 - 4e-06 16400 200 1.8585236e-14 2.1e-06 -0.0038562789 - 4e-06 16500 200 1.485896e-14 2.1e-06 -0.0037242245 - 4e-06 16600 200 1.5799533e-14 2.1e-06 -0.0035902949 - 4e-06 16700 200 1.5241276e-14 2.1e-06 -0.0034545575 - 4e-06 16800 200 1.1272606e-14 2.1e-06 -0.0033170806 - 4e-06 16900 200 1.2135244e-14 2.1e-06 -0.0031779335 - 4e-06 17000 200 1.143872e-14 2.1e-06 -0.0030371862 - 4e-06 17100 200 1.1915182e-14 2.1e-06 -0.0028949095 - 4e-06 17200 200 1.2037492e-14 2.1e-06 -0.0027511752 - 4e-06 17300 200 1.2142546e-14 2.1e-06 -0.0026060556 - 4e-06 17400 200 1.2259988e-14 2.1e-06 -0.0024596238 - 4e-06 17500 200 1.2151413e-14 2.1e-06 -0.0023119534 - 4e-06 17600 200 1.2016981e-14 2.1e-06 -0.002163119 - 4e-06 17700 200 1.1899607e-14 2.1e-06 -0.0020131953 - 4e-06 17800 200 1.1847233e-14 2.1e-06 -0.0018622579 - 4e-06 17900 200 1.2597274e-14 2.1e-06 -0.0017103828 - 4e-06 18000 200 1.2571584e-14 2.1e-06 -0.0015576465 - 4e-06 18100 200 1.2548167e-14 2.1e-06 -0.0014041259 - 4e-06 18200 200 1.2600584e-14 2.1e-06 -0.0012498983 - 4e-06 18300 200 1.2060676e-14 2.1e-06 -0.0010950413 - 4e-06 18400 200 1.2159889e-14 2.1e-06 -0.00093963286 - 4e-06 18500 200 1.2213635e-14 2.1e-06 -0.00078375133 - 4e-06 18600 200 1.2323751e-14 2.1e-06 -0.00062747516 - 4e-06 18700 200 1.2137887e-14 2.1e-06 -0.00047088304 - 4e-06 18800 200 1.2201084e-14 2.1e-06 -0.00031405381 - 4e-06 18900 200 1.2210617e-14 2.1e-06 -0.00015706645 - 4e-06 19000 200 1.2385845e-14 2.1e-06 2.0903119e-17 -Loop time of 9.48207 on 1 procs for 14000 steps with 200 atoms + 4e-06 5000 200 1.5501104e-06 2.1e-06 0 + 4e-06 5100 200 1.5146077e-06 2.1e-06 -0.00015706645 + 4e-06 5200 200 1.4902158e-06 2.1e-06 -0.00031405381 + 4e-06 5300 200 1.3871134e-06 2.1e-06 -0.00047088304 + 4e-06 5400 200 1.3531184e-06 2.1e-06 -0.00062747516 + 4e-06 5500 200 1.3154278e-06 2.1e-06 -0.00078375133 + 4e-06 5600 200 1.2461265e-06 2.1e-06 -0.00093963286 + 4e-06 5700 200 1.1840322e-06 2.1e-06 -0.0010950413 + 4e-06 5800 200 1.083844e-06 2.1e-06 -0.0012498983 + 4e-06 5900 200 9.8572649e-07 2.1e-06 -0.0014041259 + 4e-06 6000 200 8.6605656e-07 2.1e-06 -0.0015576465 + 4e-06 6100 200 7.6694391e-07 2.1e-06 -0.0017103828 + 4e-06 6200 200 7.1292979e-07 2.1e-06 -0.0018622579 + 4e-06 6300 200 6.475067e-07 2.1e-06 -0.0020131953 + 4e-06 6400 200 5.378202e-07 2.1e-06 -0.002163119 + 4e-06 6500 200 4.5668598e-07 2.1e-06 -0.0023119534 + 4e-06 6600 200 3.1208987e-07 2.1e-06 -0.0024596238 + 4e-06 6700 200 2.2996407e-07 2.1e-06 -0.0026060556 + 4e-06 6800 200 1.658813e-07 2.1e-06 -0.0027511752 + 4e-06 6900 200 1.4495016e-07 2.1e-06 -0.0028949095 + 4e-06 7000 200 1.6172966e-07 2.1e-06 -0.0030371862 + 4e-06 7100 200 4.6620591e-07 2.1e-06 -0.0031779335 + 4e-06 7200 200 6.8121833e-07 2.1e-06 -0.0033170806 + 4e-06 7300 200 1.5506154e-06 2.1e-06 -0.0034545575 + 4e-06 7400 200 2.5919669e-06 2.1e-06 -0.0035902949 + 4e-06 7500 200 2.9403576e-06 2.1e-06 -0.0037242245 + 4e-06 7600 200 2.7726732e-06 2.1e-06 -0.0038562789 + 4e-06 7700 200 2.6586936e-06 2.1e-06 -0.0039863915 + 4e-06 7800 200 2.7059447e-06 2.1e-06 -0.0041144968 + 4e-06 7900 200 2.8454301e-06 2.1e-06 -0.0042405303 + 4e-06 8000 200 2.7747574e-06 2.1e-06 -0.0043644286 + 4e-06 8100 200 2.6329747e-06 2.1e-06 -0.0044861293 + 4e-06 8200 200 2.3654294e-06 2.1e-06 -0.0046055711 + 4e-06 8300 200 2.616465e-06 2.1e-06 -0.0047226938 + 4e-06 8400 200 2.6920973e-06 2.1e-06 -0.0048374385 + 4e-06 8500 200 2.6041158e-06 2.1e-06 -0.0049497475 + 4e-06 8600 200 1.8236056e-06 2.1e-06 -0.005059564 + 4e-06 8700 200 2.1290462e-06 2.1e-06 -0.005166833 + 4e-06 8800 200 1.8723934e-06 2.1e-06 -0.0052715003 + 4e-06 8900 200 1.7196474e-06 2.1e-06 -0.0053735132 + 4e-06 9000 200 1.558001e-06 2.1e-06 -0.0054728204 + 4e-06 9100 200 1.1714433e-06 2.1e-06 -0.0055693718 + 4e-06 9200 200 1.7973167e-06 2.1e-06 -0.005663119 + 4e-06 9300 200 1.4951874e-06 2.1e-06 -0.0057540145 + 4e-06 9400 200 1.197557e-06 2.1e-06 -0.0058420128 + 4e-06 9500 200 1.1638085e-06 2.1e-06 -0.0059270694 + 4e-06 9600 200 1.2591061e-06 2.1e-06 -0.0060091416 + 4e-06 9700 200 1.2747299e-06 2.1e-06 -0.0060881879 + 4e-06 9800 200 1.2424243e-06 2.1e-06 -0.0061641687 + 4e-06 9900 200 1.1624586e-06 2.1e-06 -0.0062370457 + 4e-06 10000 200 1.0724272e-06 2.1e-06 -0.0063067821 + 4e-06 10100 200 1.0806622e-06 2.1e-06 -0.0063733428 + 4e-06 10200 200 9.2046484e-07 2.1e-06 -0.0064366944 + 4e-06 10300 200 8.1801156e-07 2.1e-06 -0.0064968049 + 4e-06 10400 200 7.74927e-07 2.1e-06 -0.0065536441 + 4e-06 10500 200 6.85447e-07 2.1e-06 -0.0066071833 + 4e-06 10600 200 5.4693931e-07 2.1e-06 -0.0066573956 + 4e-06 10700 200 4.5275522e-07 2.1e-06 -0.0067042557 + 4e-06 10800 200 4.2807826e-07 2.1e-06 -0.00674774 + 4e-06 10900 200 3.5676739e-07 2.1e-06 -0.0067878266 + 4e-06 11000 200 2.9448839e-07 2.1e-06 -0.0068244954 + 4e-06 11100 200 2.7397196e-07 2.1e-06 -0.0068577278 + 4e-06 11200 200 1.8313029e-07 2.1e-06 -0.0068875071 + 4e-06 11300 200 1.4616679e-07 2.1e-06 -0.0069138184 + 4e-06 11400 200 1.0916404e-07 2.1e-06 -0.0069366483 + 4e-06 11500 200 7.4608897e-08 2.1e-06 -0.0069559855 + 4e-06 11600 200 4.9799693e-08 2.1e-06 -0.0069718201 + 4e-06 11700 200 2.996701e-08 2.1e-06 -0.0069841441 + 4e-06 11800 200 1.1810054e-08 2.1e-06 -0.0069929515 + 4e-06 11900 200 3.9455661e-09 2.1e-06 -0.0069982376 + 4e-06 12000 200 7.0818836e-11 2.1e-06 -0.007 + 4e-06 12100 200 3.989114e-09 2.1e-06 -0.0069982376 + 4e-06 12200 200 1.0481589e-08 2.1e-06 -0.0069929515 + 4e-06 12300 200 2.3561653e-08 2.1e-06 -0.0069841441 + 4e-06 12400 200 4.1819363e-08 2.1e-06 -0.0069718201 + 4e-06 12500 200 6.5328826e-08 2.1e-06 -0.0069559855 + 4e-06 12600 200 9.3738095e-08 2.1e-06 -0.0069366483 + 4e-06 12700 200 1.3058219e-07 2.1e-06 -0.0069138184 + 4e-06 12800 200 1.7668602e-07 2.1e-06 -0.0068875071 + 4e-06 12900 200 2.1482809e-07 2.1e-06 -0.0068577278 + 4e-06 13000 200 2.7185589e-07 2.1e-06 -0.0068244954 + 4e-06 13100 200 3.3577426e-07 2.1e-06 -0.0067878266 + 4e-06 13200 200 3.9749034e-07 2.1e-06 -0.00674774 + 4e-06 13300 200 5.0743398e-07 2.1e-06 -0.0067042557 + 4e-06 13400 200 5.6629069e-07 2.1e-06 -0.0066573956 + 4e-06 13500 200 5.9092105e-07 2.1e-06 -0.0066071833 + 4e-06 13600 200 7.313638e-07 2.1e-06 -0.0065536441 + 4e-06 13700 200 1.0954352e-06 2.1e-06 -0.0064968049 + 4e-06 13800 200 7.1637332e-07 2.1e-06 -0.0064366944 + 4e-06 13900 200 8.5398051e-07 2.1e-06 -0.0063733428 + 4e-06 14000 200 1.0429888e-06 2.1e-06 -0.0063067821 + 4e-06 14100 200 1.6673022e-07 2.1e-06 -0.0062370457 + 4e-06 14200 200 2.0206568e-08 2.1e-06 -0.0061641687 + 4e-06 14300 200 5.6062261e-09 2.1e-06 -0.0060881879 + 4e-06 14400 200 4.5198973e-09 2.1e-06 -0.0060091416 + 4e-06 14500 200 2.5522353e-09 2.1e-06 -0.0059270694 + 4e-06 14600 200 9.091094e-10 2.1e-06 -0.0058420128 + 4e-06 14700 200 1.3992806e-10 2.1e-06 -0.0057540145 + 4e-06 14800 200 1.0208666e-11 2.1e-06 -0.005663119 + 4e-06 14900 200 8.4078334e-11 2.1e-06 -0.0055693718 + 4e-06 15000 200 1.2567311e-10 2.1e-06 -0.0054728204 + 4e-06 15100 200 5.2285722e-10 2.1e-06 -0.0053735132 + 4e-06 15200 200 1.5839179e-10 2.1e-06 -0.0052715003 + 4e-06 15300 200 3.2283374e-11 2.1e-06 -0.005166833 + 4e-06 15400 200 2.9516435e-12 2.1e-06 -0.005059564 + 4e-06 15500 200 1.0302118e-11 2.1e-06 -0.0049497475 + 4e-06 15600 200 1.7289975e-11 2.1e-06 -0.0048374385 + 4e-06 15700 200 1.4850209e-11 2.1e-06 -0.0047226938 + 4e-06 15800 200 8.0260964e-12 2.1e-06 -0.0046055711 + 4e-06 15900 200 2.616591e-12 2.1e-06 -0.0044861293 + 4e-06 16000 200 3.0793261e-13 2.1e-06 -0.0043644286 + 4e-06 16100 200 4.9187696e-13 2.1e-06 -0.0042405303 + 4e-06 16200 200 3.9849142e-13 2.1e-06 -0.0041144968 + 4e-06 16300 200 5.2823345e-13 2.1e-06 -0.0039863915 + 4e-06 16400 200 3.9902725e-13 2.1e-06 -0.0038562789 + 4e-06 16500 200 1.9259043e-13 2.1e-06 -0.0037242245 + 4e-06 16600 200 5.3557316e-14 2.1e-06 -0.0035902949 + 4e-06 16700 200 3.7734621e-15 2.1e-06 -0.0034545575 + 4e-06 16800 200 3.0867115e-15 2.1e-06 -0.0033170806 + 4e-06 16900 200 1.1841579e-14 2.1e-06 -0.0031779335 + 4e-06 17000 200 1.3850503e-14 2.1e-06 -0.0030371862 + 4e-06 17100 200 9.8491914e-15 2.1e-06 -0.0028949095 + 4e-06 17200 200 4.7140149e-15 2.1e-06 -0.0027511752 + 4e-06 17300 200 1.3440466e-15 2.1e-06 -0.0026060556 + 4e-06 17400 200 1.0627828e-16 2.1e-06 -0.0024596238 + 4e-06 17500 200 6.2015781e-17 2.1e-06 -0.0023119534 + 4e-06 17600 200 2.8723007e-16 2.1e-06 -0.002163119 + 4e-06 17700 200 3.6601367e-16 2.1e-06 -0.0020131953 + 4e-06 17800 200 2.7862312e-16 2.1e-06 -0.0018622579 + 4e-06 17900 200 1.4268051e-16 2.1e-06 -0.0017103828 + 4e-06 18000 200 4.5443603e-17 2.1e-06 -0.0015576465 + 4e-06 18100 200 5.2330376e-18 2.1e-06 -0.0014041259 + 4e-06 18200 200 7.3566254e-19 2.1e-06 -0.0012498983 + 4e-06 18300 200 6.5880468e-18 2.1e-06 -0.0010950413 + 4e-06 18400 200 9.5744931e-18 2.1e-06 -0.00093963286 + 4e-06 18500 200 7.8604487e-18 2.1e-06 -0.00078375133 + 4e-06 18600 200 4.3166295e-18 2.1e-06 -0.00062747516 + 4e-06 18700 200 1.5188792e-18 2.1e-06 -0.00047088304 + 4e-06 18800 200 2.3221067e-19 2.1e-06 -0.00031405381 + 4e-06 18900 200 4.7558964e-21 2.1e-06 -0.00015706645 + 4e-06 19000 200 1.4567292e-19 2.1e-06 2.0903119e-17 +Loop time of 6.96616 on 1 procs for 14000 steps with 200 atoms -99.6% CPU use with 1 MPI tasks x no OpenMP threads +99.5% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.3814 | 5.3814 | 5.3814 | 0.0 | 56.75 -Neigh | 0.04326 | 0.04326 | 0.04326 | 0.0 | 0.46 -Comm | 0.0018574 | 0.0018574 | 0.0018574 | 0.0 | 0.02 -Output | 0.0018533 | 0.0018533 | 0.0018533 | 0.0 | 0.02 -Modify | 4.047 | 4.047 | 4.047 | 0.0 | 42.68 -Other | | 0.006661 | | | 0.07 +Pair | 3.8534 | 3.8534 | 3.8534 | 0.0 | 55.32 +Neigh | 0.038778 | 0.038778 | 0.038778 | 0.0 | 0.56 +Comm | 0.0015081 | 0.0015081 | 0.0015081 | 0.0 | 0.02 +Output | 0.0018007 | 0.0018007 | 0.0018007 | 0.0 | 0.03 +Modify | 3.0668 | 3.0668 | 3.0668 | 0.0 | 44.02 +Other | | 0.003851 | | | 0.06 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3146 ave 3146 max 3146 min +Neighs: 3031 ave 3031 max 3031 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 3146 -Ave neighs/atom = 15.73 +Total # of neighbors = 3031 +Ave neighs/atom = 15.155 Neighbor list builds = 233 Dangerous builds not checked @@ -532,170 +536,170 @@ run 14000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule Per MPI rank memory allocation (min/avg/max) = 72.31 | 72.31 | 72.31 Mbytes Dt Step Atoms KinEng Volume v_disp_upper - 4e-06 19000 200 1.2385845e-14 2.1e-06 0 - 4e-06 19100 200 1.2261513e-05 2.1e-06 0.00010097765 - 4e-06 19200 200 1.668842e-05 2.1e-06 0.00020194258 - 4e-06 19300 200 8.188349e-06 2.1e-06 0.00030288209 - 4e-06 19400 200 3.786144e-06 2.1e-06 0.00040378347 - 4e-06 19500 200 9.574368e-06 2.1e-06 0.00050463403 - 4e-06 19600 200 1.1344815e-05 2.1e-06 0.00060542105 - 4e-06 19700 200 5.9381813e-06 2.1e-06 0.00070613186 - 4e-06 19800 200 6.6666301e-06 2.1e-06 0.00080675378 - 4e-06 19900 200 1.090387e-05 2.1e-06 0.00090727414 - 4e-06 20000 200 7.740567e-06 2.1e-06 0.0010076803 - 4e-06 20100 200 6.2375154e-06 2.1e-06 0.0011079596 - 4e-06 20200 200 9.3040254e-06 2.1e-06 0.0012080994 - 4e-06 20300 200 8.9696433e-06 2.1e-06 0.0013080871 - 4e-06 20400 200 6.5727278e-06 2.1e-06 0.0014079102 - 4e-06 20500 200 7.762698e-06 2.1e-06 0.001507556 - 4e-06 20600 200 9.2433982e-06 2.1e-06 0.0016070121 - 4e-06 20700 200 7.3505514e-06 2.1e-06 0.0017062658 - 4e-06 20800 200 6.9601084e-06 2.1e-06 0.0018053047 - 4e-06 20900 200 8.6605025e-06 2.1e-06 0.0019041164 - 4e-06 21000 200 8.0661649e-06 2.1e-06 0.0020026884 - 4e-06 21100 200 6.9330037e-06 2.1e-06 0.0021010083 - 4e-06 21200 200 7.8802994e-06 2.1e-06 0.0021990637 - 4e-06 21300 200 8.12707e-06 2.1e-06 0.0022968422 - 4e-06 21400 200 7.1184483e-06 2.1e-06 0.0023943316 - 4e-06 21500 200 7.3747722e-06 2.1e-06 0.0024915196 - 4e-06 21600 200 7.941038e-06 2.1e-06 0.0025883939 - 4e-06 21700 200 7.2906871e-06 2.1e-06 0.0026849424 - 4e-06 21800 200 7.0584615e-06 2.1e-06 0.0027811529 - 4e-06 21900 200 7.6303484e-06 2.1e-06 0.0028770133 - 4e-06 22000 200 7.3276603e-06 2.1e-06 0.0029725116 - 4e-06 22100 200 7.0392936e-06 2.1e-06 0.0030676356 - 4e-06 22200 200 7.1860378e-06 2.1e-06 0.0031623734 - 4e-06 22300 200 7.1628093e-06 2.1e-06 0.0032567132 - 4e-06 22400 200 6.9556524e-06 2.1e-06 0.0033506429 - 4e-06 22500 200 6.9109402e-06 2.1e-06 0.0034441509 - 4e-06 22600 200 6.981937e-06 2.1e-06 0.0035372253 - 4e-06 22700 200 6.8009271e-06 2.1e-06 0.0036298544 - 4e-06 22800 200 6.6923037e-06 2.1e-06 0.0037220265 - 4e-06 22900 200 6.7438993e-06 2.1e-06 0.0038137301 - 4e-06 23000 200 6.6280705e-06 2.1e-06 0.0039049537 - 4e-06 23100 200 6.4659616e-06 2.1e-06 0.0039956856 - 4e-06 23200 200 6.486839e-06 2.1e-06 0.0040859145 - 4e-06 23300 200 6.4478859e-06 2.1e-06 0.0041756291 - 4e-06 23400 200 6.2666043e-06 2.1e-06 0.004264818 - 4e-06 23500 200 6.2352434e-06 2.1e-06 0.00435347 - 4e-06 23600 200 6.2074024e-06 2.1e-06 0.004441574 - 4e-06 23700 200 6.068366e-06 2.1e-06 0.0045291188 - 4e-06 23800 200 5.9784229e-06 2.1e-06 0.0046160935 - 4e-06 23900 200 5.9536629e-06 2.1e-06 0.0047024871 - 4e-06 24000 200 5.8480609e-06 2.1e-06 0.0047882887 - 4e-06 24100 200 5.707216e-06 2.1e-06 0.0048734875 - 4e-06 24200 200 5.6922834e-06 2.1e-06 0.0049580728 - 4e-06 24300 200 5.6187319e-06 2.1e-06 0.005042034 - 4e-06 24400 200 5.4774741e-06 2.1e-06 0.0051253604 - 4e-06 24500 200 5.4144843e-06 2.1e-06 0.0052080417 - 4e-06 24600 200 5.3595768e-06 2.1e-06 0.0052900673 - 4e-06 24700 200 5.2374057e-06 2.1e-06 0.0053714269 - 4e-06 24800 200 5.1410204e-06 2.1e-06 0.0054521104 - 4e-06 24900 200 5.0888231e-06 2.1e-06 0.0055321075 - 4e-06 25000 200 4.984139e-06 2.1e-06 0.0056114082 - 4e-06 25100 200 4.9836569e-06 2.1e-06 0.0056900025 - 4e-06 25200 200 4.7331289e-06 2.1e-06 0.0057678805 - 4e-06 25300 200 4.6728119e-06 2.1e-06 0.0058450324 - 4e-06 25400 200 4.7016583e-06 2.1e-06 0.0059214485 - 4e-06 25500 200 4.5200193e-06 2.1e-06 0.0059971192 - 4e-06 25600 200 4.378095e-06 2.1e-06 0.0060720349 - 4e-06 25700 200 4.3949017e-06 2.1e-06 0.0061461862 - 4e-06 25800 200 4.2795904e-06 2.1e-06 0.0062195638 - 4e-06 25900 200 4.116551e-06 2.1e-06 0.0062921585 - 4e-06 26000 200 4.0844003e-06 2.1e-06 0.006363961 - 4e-06 26100 200 4.0601132e-06 2.1e-06 0.0064349624 - 4e-06 26200 200 3.8632558e-06 2.1e-06 0.0065051538 - 4e-06 26300 200 3.7501901e-06 2.1e-06 0.0065745262 - 4e-06 26400 200 3.7665658e-06 2.1e-06 0.006643071 - 4e-06 26500 200 3.6221171e-06 2.1e-06 0.0067107795 - 4e-06 26600 200 3.483452e-06 2.1e-06 0.0067776432 - 4e-06 26700 200 3.4573133e-06 2.1e-06 0.0068436537 - 4e-06 26800 200 3.3725298e-06 2.1e-06 0.0069088027 - 4e-06 26900 200 3.2275695e-06 2.1e-06 0.0069730819 - 4e-06 27000 200 3.1636462e-06 2.1e-06 0.0070364833 - 4e-06 27100 200 3.1002791e-06 2.1e-06 0.007098999 - 4e-06 27200 200 2.9719515e-06 2.1e-06 0.0071606209 - 4e-06 27300 200 2.8999181e-06 2.1e-06 0.0072213415 - 4e-06 27400 200 2.8296722e-06 2.1e-06 0.0072811529 - 4e-06 27500 200 2.7244185e-06 2.1e-06 0.0073400478 - 4e-06 27600 200 2.6342108e-06 2.1e-06 0.0073980187 - 4e-06 27700 200 2.5655873e-06 2.1e-06 0.0074550582 - 4e-06 27800 200 2.4771843e-06 2.1e-06 0.0075111593 - 4e-06 27900 200 2.3805529e-06 2.1e-06 0.0075663148 - 4e-06 28000 200 2.3094253e-06 2.1e-06 0.0076205178 - 4e-06 28100 200 2.2443631e-06 2.1e-06 0.0076737615 - 4e-06 28200 200 2.1339799e-06 2.1e-06 0.0077260391 - 4e-06 28300 200 2.0525827e-06 2.1e-06 0.0077773442 - 4e-06 28400 200 2.0012311e-06 2.1e-06 0.0078276702 - 4e-06 28500 200 1.9064828e-06 2.1e-06 0.0078770108 - 4e-06 28600 200 1.8186848e-06 2.1e-06 0.0079253598 - 4e-06 28700 200 1.7614909e-06 2.1e-06 0.0079727111 - 4e-06 28800 200 1.6854916e-06 2.1e-06 0.0080190587 - 4e-06 28900 200 1.5987487e-06 2.1e-06 0.0080643969 - 4e-06 29000 200 1.5345142e-06 2.1e-06 0.0081087198 - 4e-06 29100 200 1.4807046e-06 2.1e-06 0.008152022 - 4e-06 29200 200 1.3891852e-06 2.1e-06 0.0081942979 - 4e-06 29300 200 1.3152808e-06 2.1e-06 0.0082355423 - 4e-06 29400 200 1.2682955e-06 2.1e-06 0.00827575 - 4e-06 29500 200 1.1980726e-06 2.1e-06 0.0083149158 - 4e-06 29600 200 1.1206391e-06 2.1e-06 0.0083530349 - 4e-06 29700 200 1.069315e-06 2.1e-06 0.0083901025 - 4e-06 29800 200 1.0128853e-06 2.1e-06 0.0084261138 - 4e-06 29900 200 9.4294228e-07 2.1e-06 0.0084610645 - 4e-06 30000 200 8.8682322e-07 2.1e-06 0.00849495 - 4e-06 30100 200 8.3143727e-07 2.1e-06 0.0085277661 - 4e-06 30200 200 7.7886925e-07 2.1e-06 0.0085595086 - 4e-06 30300 200 7.2644265e-07 2.1e-06 0.0085901737 - 4e-06 30400 200 6.7416382e-07 2.1e-06 0.0086197574 - 4e-06 30500 200 6.2520867e-07 2.1e-06 0.0086482559 - 4e-06 30600 200 5.7710448e-07 2.1e-06 0.0086756657 - 4e-06 30700 200 5.3156928e-07 2.1e-06 0.0087019834 - 4e-06 30800 200 4.8684727e-07 2.1e-06 0.0087272057 - 4e-06 30900 200 4.4454752e-07 2.1e-06 0.0087513293 - 4e-06 31000 200 4.0418128e-07 2.1e-06 0.0087743512 - 4e-06 31100 200 3.677997e-07 2.1e-06 0.0087962686 - 4e-06 31200 200 3.2762411e-07 2.1e-06 0.0088170786 - 4e-06 31300 200 2.9156601e-07 2.1e-06 0.0088367787 - 4e-06 31400 200 2.6235825e-07 2.1e-06 0.0088553663 - 4e-06 31500 200 2.2926207e-07 2.1e-06 0.0088728392 - 4e-06 31600 200 1.9870435e-07 2.1e-06 0.0088891951 - 4e-06 31700 200 1.7318685e-07 2.1e-06 0.0089044319 - 4e-06 31800 200 1.4793716e-07 2.1e-06 0.0089185479 - 4e-06 31900 200 1.2335756e-07 2.1e-06 0.0089315411 - 4e-06 32000 200 1.024269e-07 2.1e-06 0.0089434099 - 4e-06 32100 200 8.4811971e-08 2.1e-06 0.0089541529 - 4e-06 32200 200 6.5610079e-08 2.1e-06 0.0089637686 - 4e-06 32300 200 4.9804549e-08 2.1e-06 0.008972256 - 4e-06 32400 200 3.7696394e-08 2.1e-06 0.0089796139 - 4e-06 32500 200 2.6121364e-08 2.1e-06 0.0089858413 - 4e-06 32600 200 1.6302764e-08 2.1e-06 0.0089909376 - 4e-06 32700 200 9.4496486e-09 2.1e-06 0.008994902 - 4e-06 32800 200 4.3514823e-09 2.1e-06 0.0089977341 - 4e-06 32900 200 1.0546756e-09 2.1e-06 0.0089994335 - 4e-06 33000 200 7.3695568e-13 2.1e-06 0.009 -Loop time of 11.7961 on 1 procs for 14000 steps with 200 atoms + 4e-06 19000 200 1.4567292e-19 2.1e-06 0 + 4e-06 19100 200 1.9132195e-05 2.1e-06 0.00010097765 + 4e-06 19200 200 3.1561748e-06 2.1e-06 0.00020194258 + 4e-06 19300 200 1.4462178e-05 2.1e-06 0.00030288209 + 4e-06 19400 200 4.6622112e-06 2.1e-06 0.00040378347 + 4e-06 19500 200 1.1929852e-05 2.1e-06 0.00050463403 + 4e-06 19600 200 5.6933661e-06 2.1e-06 0.00060542105 + 4e-06 19700 200 1.0429976e-05 2.1e-06 0.00070613186 + 4e-06 19800 200 6.6580254e-06 2.1e-06 0.00080675378 + 4e-06 19900 200 9.1721686e-06 2.1e-06 0.00090727414 + 4e-06 20000 200 7.4553343e-06 2.1e-06 0.0010076803 + 4e-06 20100 200 8.3534813e-06 2.1e-06 0.0011079596 + 4e-06 20200 200 7.8671075e-06 2.1e-06 0.0012080994 + 4e-06 20300 200 7.9115898e-06 2.1e-06 0.0013080871 + 4e-06 20400 200 8.2222312e-06 2.1e-06 0.0014079102 + 4e-06 20500 200 7.5281175e-06 2.1e-06 0.001507556 + 4e-06 20600 200 8.4242027e-06 2.1e-06 0.0016070121 + 4e-06 20700 200 7.3282364e-06 2.1e-06 0.0017062658 + 4e-06 20800 200 8.3501222e-06 2.1e-06 0.0018053047 + 4e-06 20900 200 7.3417566e-06 2.1e-06 0.0019041164 + 4e-06 21000 200 8.0702927e-06 2.1e-06 0.0020026884 + 4e-06 21100 200 7.5896194e-06 2.1e-06 0.0021010083 + 4e-06 21200 200 7.6596342e-06 2.1e-06 0.0021990637 + 4e-06 21300 200 7.7009755e-06 2.1e-06 0.0022968422 + 4e-06 21400 200 7.4010568e-06 2.1e-06 0.0023943316 + 4e-06 21500 200 7.7254953e-06 2.1e-06 0.0024915196 + 4e-06 21600 200 7.2931076e-06 2.1e-06 0.0025883939 + 4e-06 21700 200 7.5667043e-06 2.1e-06 0.0026849424 + 4e-06 21800 200 7.2767179e-06 2.1e-06 0.0027811529 + 4e-06 21900 200 7.3632148e-06 2.1e-06 0.0028770133 + 4e-06 22000 200 7.2563523e-06 2.1e-06 0.0029725116 + 4e-06 22100 200 7.2003226e-06 2.1e-06 0.0030676356 + 4e-06 22200 200 7.1862422e-06 2.1e-06 0.0031623734 + 4e-06 22300 200 7.0035785e-06 2.1e-06 0.0032567132 + 4e-06 22400 200 7.1023437e-06 2.1e-06 0.0033506429 + 4e-06 22500 200 6.8767896e-06 2.1e-06 0.0034441509 + 4e-06 22600 200 6.9556381e-06 2.1e-06 0.0035372253 + 4e-06 22700 200 6.7754491e-06 2.1e-06 0.0036298544 + 4e-06 22800 200 6.7752923e-06 2.1e-06 0.0037220265 + 4e-06 22900 200 6.6947789e-06 2.1e-06 0.0038137301 + 4e-06 23000 200 6.5811876e-06 2.1e-06 0.0039049537 + 4e-06 23100 200 6.5600064e-06 2.1e-06 0.0039956856 + 4e-06 23200 200 6.407054e-06 2.1e-06 0.0040859145 + 4e-06 23300 200 6.4635326e-06 2.1e-06 0.0041756291 + 4e-06 23400 200 6.2604509e-06 2.1e-06 0.004264818 + 4e-06 23500 200 6.2914059e-06 2.1e-06 0.00435347 + 4e-06 23600 200 6.1416598e-06 2.1e-06 0.004441574 + 4e-06 23700 200 6.0839487e-06 2.1e-06 0.0045291188 + 4e-06 23800 200 6.0216029e-06 2.1e-06 0.0046160935 + 4e-06 23900 200 5.896464e-06 2.1e-06 0.0047024871 + 4e-06 24000 200 5.8682556e-06 2.1e-06 0.0047882887 + 4e-06 24100 200 5.8744357e-06 2.1e-06 0.0048734875 + 4e-06 24200 200 5.6172509e-06 2.1e-06 0.0049580728 + 4e-06 24300 200 5.6527872e-06 2.1e-06 0.005042034 + 4e-06 24400 200 5.4706998e-06 2.1e-06 0.0051253604 + 4e-06 24500 200 5.4368713e-06 2.1e-06 0.0052080417 + 4e-06 24600 200 5.3496195e-06 2.1e-06 0.0052900673 + 4e-06 24700 200 5.2020248e-06 2.1e-06 0.0053714269 + 4e-06 24800 200 5.2035809e-06 2.1e-06 0.0054521104 + 4e-06 24900 200 5.0302031e-06 2.1e-06 0.0055321075 + 4e-06 25000 200 5.0094633e-06 2.1e-06 0.0056114082 + 4e-06 25100 200 4.8588064e-06 2.1e-06 0.0056900025 + 4e-06 25200 200 4.8221437e-06 2.1e-06 0.0057678805 + 4e-06 25300 200 4.7117322e-06 2.1e-06 0.0058450324 + 4e-06 25400 200 4.6148719e-06 2.1e-06 0.0059214485 + 4e-06 25500 200 4.5348297e-06 2.1e-06 0.0059971192 + 4e-06 25600 200 4.4325937e-06 2.1e-06 0.0060720349 + 4e-06 25700 200 4.3587865e-06 2.1e-06 0.0061461862 + 4e-06 25800 200 4.2449842e-06 2.1e-06 0.0062195638 + 4e-06 25900 200 4.1730814e-06 2.1e-06 0.0062921585 + 4e-06 26000 200 4.0712085e-06 2.1e-06 0.006363961 + 4e-06 26100 200 3.9603603e-06 2.1e-06 0.0064349624 + 4e-06 26200 200 3.9152641e-06 2.1e-06 0.0065051538 + 4e-06 26300 200 3.7864366e-06 2.1e-06 0.0065745262 + 4e-06 26400 200 3.7211553e-06 2.1e-06 0.006643071 + 4e-06 26500 200 3.6038142e-06 2.1e-06 0.0067107795 + 4e-06 26600 200 3.5518456e-06 2.1e-06 0.0067776432 + 4e-06 26700 200 3.4213616e-06 2.1e-06 0.0068436537 + 4e-06 26800 200 3.348649e-06 2.1e-06 0.0069088027 + 4e-06 26900 200 3.2592054e-06 2.1e-06 0.0069730819 + 4e-06 27000 200 3.1640896e-06 2.1e-06 0.0070364833 + 4e-06 27100 200 3.1491467e-06 2.1e-06 0.007098999 + 4e-06 27200 200 2.9475347e-06 2.1e-06 0.0071606209 + 4e-06 27300 200 2.9234007e-06 2.1e-06 0.0072213415 + 4e-06 27400 200 2.8106832e-06 2.1e-06 0.0072811529 + 4e-06 27500 200 2.7190831e-06 2.1e-06 0.0073400478 + 4e-06 27600 200 2.6595021e-06 2.1e-06 0.0073980187 + 4e-06 27700 200 2.5384163e-06 2.1e-06 0.0074550582 + 4e-06 27800 200 2.4906759e-06 2.1e-06 0.0075111593 + 4e-06 27900 200 2.3760852e-06 2.1e-06 0.0075663148 + 4e-06 28000 200 2.3135864e-06 2.1e-06 0.0076205178 + 4e-06 28100 200 2.206388e-06 2.1e-06 0.0076737615 + 4e-06 28200 200 2.1580755e-06 2.1e-06 0.0077260391 + 4e-06 28300 200 2.0541807e-06 2.1e-06 0.0077773442 + 4e-06 28400 200 1.9879886e-06 2.1e-06 0.0078276702 + 4e-06 28500 200 1.9080731e-06 2.1e-06 0.0078770108 + 4e-06 28600 200 1.8244513e-06 2.1e-06 0.0079253598 + 4e-06 28700 200 1.7612085e-06 2.1e-06 0.0079727111 + 4e-06 28800 200 1.6725418e-06 2.1e-06 0.0080190587 + 4e-06 28900 200 1.6108221e-06 2.1e-06 0.0080643969 + 4e-06 29000 200 1.5315923e-06 2.1e-06 0.0081087198 + 4e-06 29100 200 1.4668177e-06 2.1e-06 0.008152022 + 4e-06 29200 200 1.389947e-06 2.1e-06 0.0081942979 + 4e-06 29300 200 1.3244327e-06 2.1e-06 0.0082355423 + 4e-06 29400 200 1.2613389e-06 2.1e-06 0.00827575 + 4e-06 29500 200 1.189317e-06 2.1e-06 0.0083149158 + 4e-06 29600 200 1.1328651e-06 2.1e-06 0.0083530349 + 4e-06 29700 200 1.0634003e-06 2.1e-06 0.0083901025 + 4e-06 29800 200 1.0089659e-06 2.1e-06 0.0084261138 + 4e-06 29900 200 9.452383e-07 2.1e-06 0.0084610645 + 4e-06 30000 200 8.8857387e-07 2.1e-06 0.00849495 + 4e-06 30100 200 8.3934751e-07 2.1e-06 0.0085277661 + 4e-06 30200 200 7.7404495e-07 2.1e-06 0.0085595086 + 4e-06 30300 200 7.2760888e-07 2.1e-06 0.0085901737 + 4e-06 30400 200 6.7239685e-07 2.1e-06 0.0086197574 + 4e-06 30500 200 6.245416e-07 2.1e-06 0.0086482559 + 4e-06 30600 200 5.7834155e-07 2.1e-06 0.0086756657 + 4e-06 30700 200 5.2814574e-07 2.1e-06 0.0087019834 + 4e-06 30800 200 4.8878902e-07 2.1e-06 0.0087272057 + 4e-06 30900 200 4.4241206e-07 2.1e-06 0.0087513293 + 4e-06 31000 200 4.0442514e-07 2.1e-06 0.0087743512 + 4e-06 31100 200 3.642199e-07 2.1e-06 0.0087962686 + 4e-06 31200 200 3.2738558e-07 2.1e-06 0.0088170786 + 4e-06 31300 200 2.9389397e-07 2.1e-06 0.0088367787 + 4e-06 31400 200 2.5861566e-07 2.1e-06 0.0088553663 + 4e-06 31500 200 2.2934636e-07 2.1e-06 0.0088728392 + 4e-06 31600 200 1.9888494e-07 2.1e-06 0.0088891951 + 4e-06 31700 200 1.7250531e-07 2.1e-06 0.0089044319 + 4e-06 31800 200 1.4678036e-07 2.1e-06 0.0089185479 + 4e-06 31900 200 1.2324632e-07 2.1e-06 0.0089315411 + 4e-06 32000 200 1.0248084e-07 2.1e-06 0.0089434099 + 4e-06 32100 200 8.2609273e-08 2.1e-06 0.0089541529 + 4e-06 32200 200 6.551679e-08 2.1e-06 0.0089637686 + 4e-06 32300 200 5.0080052e-08 2.1e-06 0.008972256 + 4e-06 32400 200 3.6856646e-08 2.1e-06 0.0089796139 + 4e-06 32500 200 2.5648284e-08 2.1e-06 0.0089858413 + 4e-06 32600 200 1.637837e-08 2.1e-06 0.0089909376 + 4e-06 32700 200 9.2578154e-09 2.1e-06 0.008994902 + 4e-06 32800 200 4.0824723e-09 2.1e-06 0.0089977341 + 4e-06 32900 200 1.0371165e-09 2.1e-06 0.0089994335 + 4e-06 33000 200 6.1012168e-14 2.1e-06 0.009 +Loop time of 7.70808 on 1 procs for 14000 steps with 200 atoms 99.6% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 7.033 | 7.033 | 7.033 | 0.0 | 59.62 -Neigh | 0.047308 | 0.047308 | 0.047308 | 0.0 | 0.40 -Comm | 0.0020382 | 0.0020382 | 0.0020382 | 0.0 | 0.02 -Output | 0.0022072 | 0.0022072 | 0.0022072 | 0.0 | 0.02 -Modify | 4.7043 | 4.7043 | 4.7043 | 0.0 | 39.88 -Other | | 0.00727 | | | 0.06 +Pair | 4.4414 | 4.4414 | 4.4414 | 0.0 | 57.62 +Neigh | 0.040941 | 0.040941 | 0.040941 | 0.0 | 0.53 +Comm | 0.001526 | 0.001526 | 0.001526 | 0.0 | 0.02 +Output | 0.0019617 | 0.0019617 | 0.0019617 | 0.0 | 0.03 +Modify | 3.2183 | 3.2183 | 3.2183 | 0.0 | 41.75 +Other | | 0.003942 | | | 0.05 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3145 ave 3145 max 3145 min +Neighs: 3026 ave 3026 max 3026 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 3145 -Ave neighs/atom = 15.725 +Total # of neighbors = 3026 +Ave neighs/atom = 15.13 Neighbor list builds = 233 Dangerous builds not checked @@ -712,80 +716,80 @@ run 5000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule Per MPI rank memory allocation (min/avg/max) = 72.31 | 72.31 | 72.31 Mbytes Dt Step Atoms KinEng Volume v_disp_upper - 4e-06 33000 200 7.3695568e-13 2.1e-06 0.009 - 4e-06 33100 200 1.0383246e-10 2.1e-06 0.009 - 4e-06 33200 200 5.9976193e-12 2.1e-06 0.009 - 4e-06 33300 200 6.2729949e-12 2.1e-06 0.009 - 4e-06 33400 200 9.0819715e-12 2.1e-06 0.009 - 4e-06 33500 200 4.1741245e-12 2.1e-06 0.009 - 4e-06 33600 200 4.2796157e-13 2.1e-06 0.009 - 4e-06 33700 200 1.2198973e-13 2.1e-06 0.009 - 4e-06 33800 200 5.0253099e-13 2.1e-06 0.009 - 4e-06 33900 200 3.2987112e-13 2.1e-06 0.009 - 4e-06 34000 200 9.8474325e-14 2.1e-06 0.009 - 4e-06 34100 200 2.0804908e-14 2.1e-06 0.009 - 4e-06 34200 200 3.5479858e-14 2.1e-06 0.009 - 4e-06 34300 200 4.6823841e-14 2.1e-06 0.009 - 4e-06 34400 200 2.8845396e-14 2.1e-06 0.009 - 4e-06 34500 200 2.4894095e-14 2.1e-06 0.009 - 4e-06 34600 200 2.4407576e-14 2.1e-06 0.009 - 4e-06 34700 200 2.4241607e-14 2.1e-06 0.009 - 4e-06 34800 200 2.5678797e-14 2.1e-06 0.009 - 4e-06 34900 200 3.0880003e-14 2.1e-06 0.009 - 4e-06 35000 200 3.3341003e-14 2.1e-06 0.009 - 4e-06 35100 200 1.5611246e-11 2.1e-06 0.009 - 4e-06 35200 200 8.7304571e-13 2.1e-06 0.009 - 4e-06 35300 200 1.28235e-13 2.1e-06 0.009 - 4e-06 35400 200 4.7975116e-13 2.1e-06 0.009 - 4e-06 35500 200 4.0667584e-13 2.1e-06 0.009 - 4e-06 35600 200 1.1230838e-13 2.1e-06 0.009 - 4e-06 35700 200 3.0578739e-14 2.1e-06 0.009 - 4e-06 35800 200 5.2724197e-14 2.1e-06 0.009 - 4e-06 35900 200 5.4930313e-14 2.1e-06 0.009 - 4e-06 36000 200 5.0413822e-14 2.1e-06 0.009 - 4e-06 36100 200 4.2936129e-14 2.1e-06 0.009 - 4e-06 36200 200 4.2946116e-14 2.1e-06 0.009 - 4e-06 36300 200 4.5163485e-14 2.1e-06 0.009 - 4e-06 36400 200 4.6640704e-14 2.1e-06 0.009 - 4e-06 36500 200 4.6581622e-14 2.1e-06 0.009 - 4e-06 36600 200 4.6319151e-14 2.1e-06 0.009 - 4e-06 36700 200 4.5444461e-14 2.1e-06 0.009 - 4e-06 36800 200 4.6152933e-14 2.1e-06 0.009 - 4e-06 36900 200 4.5660145e-14 2.1e-06 0.009 - 4e-06 37000 200 4.479585e-14 2.1e-06 0.009 - 4e-06 37100 200 4.454612e-14 2.1e-06 0.009 - 4e-06 37200 200 4.3595031e-14 2.1e-06 0.009 - 4e-06 37300 200 4.2650848e-14 2.1e-06 0.009 - 4e-06 37400 200 4.3124042e-14 2.1e-06 0.009 - 4e-06 37500 200 4.1053224e-14 2.1e-06 0.009 - 4e-06 37600 200 4.2786157e-14 2.1e-06 0.009 - 4e-06 37700 200 4.3961233e-14 2.1e-06 0.009 - 4e-06 37800 200 4.359215e-14 2.1e-06 0.009 - 4e-06 37900 200 4.3410766e-14 2.1e-06 0.009 - 4e-06 38000 200 3.9866697e-14 2.1e-06 0.009 -Loop time of 4.29106 on 1 procs for 5000 steps with 200 atoms + 4e-06 33000 200 6.1012168e-14 2.1e-06 0.009 + 4e-06 33100 200 6.7902539e-11 2.1e-06 0.009 + 4e-06 33200 200 2.0896758e-11 2.1e-06 0.009 + 4e-06 33300 200 2.5200405e-11 2.1e-06 0.009 + 4e-06 33400 200 2.1747895e-12 2.1e-06 0.009 + 4e-06 33500 200 1.1228817e-11 2.1e-06 0.009 + 4e-06 33600 200 3.3597579e-12 2.1e-06 0.009 + 4e-06 33700 200 1.4808583e-12 2.1e-06 0.009 + 4e-06 33800 200 3.5132295e-12 2.1e-06 0.009 + 4e-06 33900 200 8.2438639e-14 2.1e-06 0.009 + 4e-06 34000 200 1.3267378e-12 2.1e-06 0.009 + 4e-06 34100 200 6.2365031e-13 2.1e-06 0.009 + 4e-06 34200 200 1.1820072e-13 2.1e-06 0.009 + 4e-06 34300 200 5.2797742e-13 2.1e-06 0.009 + 4e-06 34400 200 3.2199555e-14 2.1e-06 0.009 + 4e-06 34500 200 1.553388e-13 2.1e-06 0.009 + 4e-06 34600 200 1.1458173e-13 2.1e-06 0.009 + 4e-06 34700 200 5.8686124e-15 2.1e-06 0.009 + 4e-06 34800 200 7.3486748e-14 2.1e-06 0.009 + 4e-06 34900 200 1.0877367e-14 2.1e-06 0.009 + 4e-06 35000 200 1.5284442e-14 2.1e-06 0.009 + 4e-06 35100 200 2.0294057e-14 2.1e-06 0.009 + 4e-06 35200 200 1.5385334e-17 2.1e-06 0.009 + 4e-06 35300 200 9.5858898e-15 2.1e-06 0.009 + 4e-06 35400 200 3.1985384e-15 2.1e-06 0.009 + 4e-06 35500 200 1.1327574e-15 2.1e-06 0.009 + 4e-06 35600 200 3.3810722e-15 2.1e-06 0.009 + 4e-06 35700 200 1.2867327e-16 2.1e-06 0.009 + 4e-06 35800 200 1.0755232e-15 2.1e-06 0.009 + 4e-06 35900 200 7.3381985e-16 2.1e-06 0.009 + 4e-06 36000 200 3.7750251e-17 2.1e-06 0.009 + 4e-06 36100 200 4.8518794e-16 2.1e-06 0.009 + 4e-06 36200 200 8.361623e-17 2.1e-06 0.009 + 4e-06 36300 200 8.9347649e-17 2.1e-06 0.009 + 4e-06 36400 200 1.4528409e-16 2.1e-06 0.009 + 4e-06 36500 200 8.2328133e-19 2.1e-06 0.009 + 4e-06 36600 200 5.9628413e-17 2.1e-06 0.009 + 4e-06 36700 200 2.857306e-17 2.1e-06 0.009 + 4e-06 36800 200 4.1078269e-18 2.1e-06 0.009 + 4e-06 36900 200 2.4094514e-17 2.1e-06 0.009 + 4e-06 37000 200 2.6153896e-18 2.1e-06 0.009 + 4e-06 37100 200 5.6577297e-18 2.1e-06 0.009 + 4e-06 37200 200 6.5849416e-18 2.1e-06 0.009 + 4e-06 37300 200 4.5596918e-21 2.1e-06 0.009 + 4e-06 37400 200 3.2329813e-18 2.1e-06 0.009 + 4e-06 37500 200 1.123288e-18 2.1e-06 0.009 + 4e-06 37600 200 3.4227094e-19 2.1e-06 0.009 + 4e-06 37700 200 1.1782135e-18 2.1e-06 0.009 + 4e-06 37800 200 6.9535961e-20 2.1e-06 0.009 + 4e-06 37900 200 3.4055174e-19 2.1e-06 0.009 + 4e-06 38000 200 2.8968649e-19 2.1e-06 0.009 +Loop time of 2.65906 on 1 procs for 5000 steps with 200 atoms 99.6% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 2.6156 | 2.6156 | 2.6156 | 0.0 | 60.95 -Neigh | 0.017028 | 0.017028 | 0.017028 | 0.0 | 0.40 -Comm | 0.00059632 | 0.00059632 | 0.00059632 | 0.0 | 0.01 -Output | 0.00055782 | 0.00055782 | 0.00055782 | 0.0 | 0.01 -Modify | 1.6547 | 1.6547 | 1.6547 | 0.0 | 38.56 -Other | | 0.002613 | | | 0.06 +Pair | 1.5595 | 1.5595 | 1.5595 | 0.0 | 58.65 +Neigh | 0.012904 | 0.012904 | 0.012904 | 0.0 | 0.49 +Comm | 0.00041333 | 0.00041333 | 0.00041333 | 0.0 | 0.02 +Output | 0.00053486 | 0.00053486 | 0.00053486 | 0.0 | 0.02 +Modify | 1.0844 | 1.0844 | 1.0844 | 0.0 | 40.78 +Other | | 0.001336 | | | 0.05 Nlocal: 200 ave 200 max 200 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3145 ave 3145 max 3145 min +Neighs: 3026 ave 3026 max 3026 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 3145 -Ave neighs/atom = 15.725 +Total # of neighbors = 3026 +Ave neighs/atom = 15.13 Neighbor list builds = 83 Dangerous builds not checked -Total wall time: 0:00:26 +Total wall time: 0:00:18 diff --git a/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 b/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 index eb49f732e8..1992fb2555 100644 --- a/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 +++ b/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-583-g3d4b57d7fd-modified) +LAMMPS (4 Feb 2025 - Development - patch_5May2020-22356-g0c29a0a0c9-modified) ############################### SIMULATION SETTINGS ################################################### atom_style sphere 1 @@ -19,7 +19,7 @@ Reading data file ... 1 by 1 by 1 MPI processor grid reading atoms ... 12 atoms - read_data CPU = 0.003 seconds + read_data CPU = 0.029 seconds fix integr all nve/sphere # create pair group for contact area outputs @@ -38,7 +38,8 @@ variable PoissonsRatio equal 0.3 variable YieldStress equal 50e6 variable SurfaceEnergy equal 0.0 variable psi_b equal 0.5 -variable damp equal 1.0 +variable damp equal 0.2 +variable damp_type equal 1 # linear_history = k_t, x_gamma,t, mu_s variable kt equal 2/7*${YoungsModulus}*${atomRadius} @@ -47,16 +48,17 @@ variable kt equal 2/7*1000000000*0.5 variable xgammat equal 0.0 variable mu_s equal 0.5 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -pair_coeff * * mdr 1000000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -pair_coeff * * mdr 1000000000 0.3 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -pair_coeff * * mdr 1000000000 0.3 50000000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -pair_coeff * * mdr 1000000000 0.3 50000000 0 ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 ${xgammat} ${mu_s} -pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 ${mu_s} -pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 ######################################### ADD IN PLANES ################################################ @@ -80,29 +82,30 @@ region plane_xy_pos plane 0 0 1.5 0 0 -1 side in move NULL NULL v_plane_disp_ne region plane_xy_neg plane 0 0 -${halfBoxWidth} 0 0 1 side in move NULL NULL v_plane_disp units box region plane_xy_neg plane 0 0 -1.5 0 0 1 side in move NULL NULL v_plane_disp units box -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} " -granular mdr 1000000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -granular mdr 1000000000 0.3 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -granular mdr 1000000000 0.3 50000000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -granular mdr 1000000000 0.3 50000000 0 ${psi_b} ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -granular mdr 1000000000 0.3 50000000 0 0.5 ${damp} damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history ${kt} ${xgammat} ${mu_s} -granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 ${xgammat} ${mu_s} -granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 ${mu_s} -granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} " +granular mdr 1000000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 fix plane_yz_pos all wall/gran/region ${wall_contact_string} region plane_yz_pos contacts -fix plane_yz_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_yz_pos contacts +fix plane_yz_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_yz_pos contacts fix plane_yz_neg all wall/gran/region ${wall_contact_string} region plane_yz_neg contacts -fix plane_yz_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_yz_neg contacts +fix plane_yz_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_yz_neg contacts fix plane_xz_pos all wall/gran/region ${wall_contact_string} region plane_xz_pos contacts -fix plane_xz_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_xz_pos contacts +fix plane_xz_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_xz_pos contacts fix plane_xz_neg all wall/gran/region ${wall_contact_string} region plane_xz_neg contacts -fix plane_xz_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_xz_neg contacts +fix plane_xz_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_xz_neg contacts fix plane_xy_pos all wall/gran/region ${wall_contact_string} region plane_xy_pos contacts -fix plane_xy_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_xy_pos contacts +fix plane_xy_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_xy_pos contacts fix plane_xy_neg all wall/gran/region ${wall_contact_string} region plane_xy_neg contacts -fix plane_xy_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 1 damping mdr tangential linear_history 142857142.857143 0 0.5 region plane_xy_neg contacts +fix plane_xy_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_xy_neg contacts compute plane_xy_neg_force all reduce sum f_plane_xy_neg[4] variable plane_xy_neg_force equal c_plane_xy_neg_force @@ -171,8 +174,9 @@ Your simulation uses code contributions which should be cited: author = {Zunker, William and Dunatunga, Sachith and Thakur, Subhash and Tang, Pingjun and Kamrin, Ken}, title = {Experimentally validated DEM for large deformation powder compaction: mechanically-derived contact model and screening of non-physical contacts}, + journal = {Powder Technology}, year = {2025}, - journal = {engrXiv}, + pages = {120972}, } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -193,7 +197,7 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 74.54 | 74.54 | 74.54 Mbytes Dt Step Atoms KinEng c_1 Volume 1e-06 0 12 0 0 8000 -Loop time of 8.47e-07 on 1 procs for 0 steps with 12 atoms +Loop time of 8.28e-07 on 1 procs for 0 steps with 12 atoms 0.0% CPU use with 1 MPI tasks x no OpenMP threads @@ -205,7 +209,7 @@ Neigh | 0 | 0 | 0 | 0.0 | 0.00 Comm | 0 | 0 | 0 | 0.0 | 0.00 Output | 0 | 0 | 0 | 0.0 | 0.00 Modify | 0 | 0 | 0 | 0.0 | 0.00 -Other | | 8.47e-07 | | |100.00 +Other | | 8.28e-07 | | |100.00 Nlocal: 12 ave 12 max 12 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -253,518 +257,518 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 75.17 | 75.17 | 75.17 Mbytes Dt Step Atoms KinEng c_1 Volume 1e-06 0 12 0 0 8000 - 1e-06 100 12 0.37627896 0 8000 - 1e-06 200 12 4.1791248 0 8000 - 1e-06 300 12 14.842751 0 8000 - 1e-06 400 12 36.772259 0 8000 - 1e-06 500 12 77.630616 0 8000 - 1e-06 600 12 145.73848 0 8000 - 1e-06 700 12 250.50491 0 8000 - 1e-06 800 12 402.70153 0 8000 - 1e-06 900 12 614.51551 0 8000 - 1e-06 1000 12 899.53232 0 8000 - 1e-06 1100 12 1272.6697 0 8000 - 1e-06 1200 12 1750.0701 0 8000 - 1e-06 1300 12 2348.9536 0 8000 - 1e-06 1400 12 3087.4362 0 8000 - 1e-06 1500 12 3984.3134 0 8000 - 1e-06 1600 12 5058.8155 0 8000 - 1e-06 1700 12 6330.3362 0 8000 - 1e-06 1800 12 7818.1411 0 8000 - 1e-06 1900 12 9541.0592 0 8000 - 1e-06 2000 12 11498.791 0.0047810266 8000 - 1e-06 2100 12 13704.573 0.10811492 8000 - 1e-06 2200 12 16174.974 0.63000368 8000 - 1e-06 2300 12 18921.112 2.1626376 8000 - 1e-06 2400 12 21953.925 5.2698517 8000 - 1e-06 2500 12 25281.497 10.484444 8000 - 1e-06 2600 12 28908.645 18.482248 8000 - 1e-06 2700 12 32837.664 30.036339 8000 - 1e-06 2800 12 37068.237 46.017479 8000 - 1e-06 2900 12 41597.382 67.391786 8000 - 1e-06 3000 12 46419.434 95.215596 8000 - 1e-06 3100 12 51526.06 130.62752 8000 - 1e-06 3200 12 56906.565 174.8377 8000 - 1e-06 3300 12 62550.059 229.11444 8000 - 1e-06 3400 12 68444.395 294.66357 8000 - 1e-06 3500 12 74576.632 372.08886 8000 - 1e-06 3600 12 80933.178 461.43595 8000 - 1e-06 3700 12 87499.829 562.23674 8000 - 1e-06 3800 12 94261.901 673.47838 8000 - 1e-06 3900 12 101204.31 793.60705 8000 - 1e-06 4000 12 108311.58 920.56829 8000 - 1e-06 4100 12 115567.86 1051.8828 8000 - 1e-06 4200 12 122956.81 1184.754 8000 - 1e-06 4300 12 130461.5 1316.2004 8000 - 1e-06 4400 12 138064.33 1443.2052 8000 - 1e-06 4500 12 145746.82 1562.8719 8000 - 1e-06 4600 12 153422.95 1670.3394 8000 - 1e-06 4700 12 161051.84 1763.0999 8000 - 1e-06 4800 12 168667.52 1842.4996 8000 - 1e-06 4900 12 176255.36 1908.409 8000 - 1e-06 5000 12 183795.82 1961.1714 8000 - 1e-06 5100 12 191266.94 2001.7002 8000 - 1e-06 5200 12 198645 2031.4642 8000 - 1e-06 5300 12 205905.03 2052.4189 8000 - 1e-06 5400 12 213021.06 2066.906 8000 - 1e-06 5500 12 219828.33 2076.3201 8000 - 1e-06 5600 12 226088.26 2080.385 8000 - 1e-06 5700 12 231986.18 2088.93 8000 - 1e-06 5800 12 237570.94 2108.0119 8000 - 1e-06 5900 12 242837.17 2141.5471 8000 - 1e-06 6000 12 247775.44 2192.6781 8000 - 1e-06 6100 12 252375.51 2263.7885 8000 - 1e-06 6200 12 256627.89 2356.5013 8000 - 1e-06 6300 12 260524.71 2471.6922 8000 - 1e-06 6400 12 264060.29 2609.528 8000 - 1e-06 6500 12 267231.53 2769.5274 8000 - 1e-06 6600 12 270038.2 2950.6395 8000 - 1e-06 6700 12 272483.11 3151.335 8000 - 1e-06 6800 12 274572.24 3369.7006 8000 - 1e-06 6900 12 276314.75 3603.531 8000 - 1e-06 7000 12 277722.99 3850.4128 8000 - 1e-06 7100 12 278812.52 4107.7948 8000 - 1e-06 7200 12 279602.05 4373.0439 8000 - 1e-06 7300 12 280113.55 4643.4856 8000 - 1e-06 7400 12 280372.7 4916.43 8000 - 1e-06 7500 12 280411.71 5189.1887 8000 - 1e-06 7600 12 280270.18 5459.0844 8000 - 1e-06 7700 12 279999.69 5723.4596 8000 - 1e-06 7800 12 279696.94 5979.6896 8000 - 1e-06 7900 12 279705.93 6225.2029 8000 - 1e-06 8000 12 279677 6457.5689 8000 - 1e-06 8100 12 279607.39 6683.3974 8000 - 1e-06 8200 12 279535.86 6906.911 8000 - 1e-06 8300 12 279515.96 7125.9155 8000 - 1e-06 8400 12 279726.3 7338.4626 8000 - 1e-06 8500 12 279905.61 7528.2253 8000 - 1e-06 8600 12 279994.55 7695.3391 8000 - 1e-06 8700 12 280109.97 7846.4954 8000 - 1e-06 8800 12 280280.9 7992.1243 8000 - 1e-06 8900 12 280526.73 8146.1487 8000 - 1e-06 9000 12 280875.16 8309.0778 8000 - 1e-06 9100 12 281361.17 8473.1301 8000 - 1e-06 9200 12 282015.74 8638.5101 8000 - 1e-06 9300 12 282868.61 8807.2007 8000 - 1e-06 9400 12 283949.43 8980.8606 8000 - 1e-06 9500 12 285287.01 9160.6973 8000 - 1e-06 9600 12 286908.48 9347.3851 8000 - 1e-06 9700 12 288808.95 9540.3891 8000 - 1e-06 9800 12 291008.88 9739.3515 8000 - 1e-06 9900 12 293533.31 9944.1548 8000 - 1e-06 10000 12 296392.46 10153.993 8000 - 1e-06 10100 12 299589.23 10366.149 8000 - 1e-06 10200 12 303120.5 10580.26 8000 - 1e-06 10300 12 306976.5 10797.104 8000 - 1e-06 10400 12 311140.59 11018.1 8000 - 1e-06 10500 12 315589.46 11245.316 8000 - 1e-06 10600 12 320293.56 11481.375 8000 - 1e-06 10700 12 325217.67 11729.284 8000 - 1e-06 10800 12 330321.65 11992.189 8000 - 1e-06 10900 12 335561.34 12273.086 8000 - 1e-06 11000 12 340889.49 12574.505 8000 - 1e-06 11100 12 346256.88 12898.214 8000 - 1e-06 11200 12 351613.36 13244.969 8000 - 1e-06 11300 12 356921.74 13613.584 8000 - 1e-06 11400 12 362263.57 14000.802 8000 - 1e-06 11500 12 367685.46 14407.905 8000 - 1e-06 11600 12 373173.46 14833.769 8000 - 1e-06 11700 12 378713.19 15276.703 8000 - 1e-06 11800 12 384258.42 15728.278 8000 - 1e-06 11900 12 389798.27 16183.88 8000 - 1e-06 12000 12 395067.85 16636.846 8000 - 1e-06 12100 12 400198.63 17088.171 8000 - 1e-06 12200 12 405211.55 17537.364 8000 - 1e-06 12300 12 410112.47 17984.343 8000 - 1e-06 12400 12 414906.33 18429.831 8000 - 1e-06 12500 12 419598.71 18875.613 8000 - 1e-06 12600 12 424192.44 19324.904 8000 - 1e-06 12700 12 428565.91 19783.784 8000 - 1e-06 12800 12 432825.92 20255.392 8000 - 1e-06 12900 12 437005.65 20738.975 8000 - 1e-06 13000 12 441133.84 21226.416 8000 - 1e-06 13100 12 445218.44 21720.281 8000 - 1e-06 13200 12 449263.02 22225.116 8000 - 1e-06 13300 12 453268.59 22746.27 8000 - 1e-06 13400 12 457229.62 23288.917 8000 - 1e-06 13500 12 461141.35 23859.236 8000 - 1e-06 13600 12 464999.54 24464.127 8000 - 1e-06 13700 12 468798.7 25110.47 8000 - 1e-06 13800 12 472500.62 25806.135 8000 - 1e-06 13900 12 476074.74 26564.004 8000 - 1e-06 14000 12 479545.35 27389.059 8000 - 1e-06 14100 12 482914.85 28284.54 8000 - 1e-06 14200 12 486185.47 29252.687 8000 - 1e-06 14300 12 489361.15 30294.757 8000 - 1e-06 14400 12 492273.69 31409.091 8000 - 1e-06 14500 12 494514.18 32573.659 8000 - 1e-06 14600 12 496511.76 33785.467 8000 - 1e-06 14700 12 498362.32 35051.794 8000 - 1e-06 14800 12 500126.95 36382.324 8000 - 1e-06 14900 12 501872.73 37788.434 8000 - 1e-06 15000 12 503658.95 39269.921 8000 - 1e-06 15100 12 505524.32 40815.737 8000 - 1e-06 15200 12 507507.74 42410.397 8000 - 1e-06 15300 12 509052.44 44020.642 8000 - 1e-06 15400 12 510424.85 45607.21 8000 - 1e-06 15500 12 511477.14 47150.907 8000 - 1e-06 15600 12 511930.85 48638.383 8000 - 1e-06 15700 12 512124.38 50030.203 8000 - 1e-06 15800 12 512194.05 51293.423 8000 - 1e-06 15900 12 512175.22 52402.955 8000 - 1e-06 16000 12 512095.42 53340.637 8000 - 1e-06 16100 12 511970.22 54097.278 8000 - 1e-06 16200 12 511797.58 54671.217 8000 - 1e-06 16300 12 511596.19 55067.665 8000 - 1e-06 16400 12 511390.31 55298.281 8000 - 1e-06 16500 12 511203.2 55383.204 8000 - 1e-06 16600 12 511056.43 55352.575 8000 - 1e-06 16700 12 510973.55 55240.989 8000 - 1e-06 16800 12 510979.82 55085.771 8000 - 1e-06 16900 12 511018.94 54944.912 8000 - 1e-06 17000 12 510839.23 54871.084 8000 - 1e-06 17100 12 510670.95 54882.14 8000 - 1e-06 17200 12 510592.26 55012.23 8000 - 1e-06 17300 12 510473.65 55293.657 8000 - 1e-06 17400 12 509821.33 55718.974 8000 - 1e-06 17500 12 508425.2 56251.107 8000 - 1e-06 17600 12 506922.69 56913.254 8000 - 1e-06 17700 12 505432.36 57751.093 8000 - 1e-06 17800 12 504007.07 58820.863 8000 - 1e-06 17900 12 502565.91 60215.42 8000 - 1e-06 18000 12 501138.89 61987.521 8000 - 1e-06 18100 12 499028.8 64137.707 8000 - 1e-06 18200 12 493241.81 66656.007 8000 - 1e-06 18300 12 486709.22 69522.002 8000 - 1e-06 18400 12 480004.21 72703.075 8000 - 1e-06 18500 12 473373.17 76162.035 8000 - 1e-06 18600 12 466967.02 79858.627 8000 - 1e-06 18700 12 460896.76 83749.858 8000 - 1e-06 18800 12 455246.73 87789.78 8000 - 1e-06 18900 12 450058.54 91935.918 8000 - 1e-06 19000 12 445381.99 96175.252 8000 - 1e-06 19100 12 441278.15 100523.08 8000 - 1e-06 19200 12 437763.14 104946.19 8000 - 1e-06 19300 12 434836.79 109405.67 8000 - 1e-06 19400 12 432488.77 113863.34 8000 - 1e-06 19500 12 430699.83 118281.43 8000 - 1e-06 19600 12 429442.98 122622.26 8000 - 1e-06 19700 12 428684.66 126847.95 8000 - 1e-06 19800 12 428328.48 130917.63 8000 - 1e-06 19900 12 428196.55 134775.59 8000 - 1e-06 20000 12 427597.88 138354.14 8000 - 1e-06 20100 12 425748.44 141440.79 8000 - 1e-06 20200 12 423827.82 143975.56 8000 - 1e-06 20300 12 422029.53 145951.68 8000 - 1e-06 20400 12 420416.81 147364.79 8000 - 1e-06 20500 12 419027.95 148273.8 8000 - 1e-06 20600 12 417858.85 148716.68 8000 - 1e-06 20700 12 416878.1 148666.56 8000 - 1e-06 20800 12 416057.47 148096.03 8000 - 1e-06 20900 12 415366.73 146981.92 8000 - 1e-06 21000 12 414775.28 145311.94 8000 - 1e-06 21100 12 414254.77 143086.56 8000 - 1e-06 21200 12 413734.06 140320.07 8000 - 1e-06 21300 12 412373.7 137040.42 8000 - 1e-06 21400 12 410695.21 133289.46 8000 - 1e-06 21500 12 408430.75 129131.69 8000 - 1e-06 21600 12 405927.7 124609.43 8000 - 1e-06 21700 12 403251.27 119786.82 8000 - 1e-06 21800 12 400435.71 114740.64 8000 - 1e-06 21900 12 397484.88 109586.68 8000 - 1e-06 22000 12 394308.48 104582.2 8000 - 1e-06 22100 12 390933.42 99878.117 8000 - 1e-06 22200 12 387369.16 95602.908 8000 - 1e-06 22300 12 383599.37 91871.749 8000 - 1e-06 22400 12 379598.34 88800.942 8000 - 1e-06 22500 12 375344.08 86475.879 8000 - 1e-06 22600 12 370860.89 84903.263 8000 - 1e-06 22700 12 366151.23 84105.325 8000 - 1e-06 22800 12 361209.31 84104.321 8000 - 1e-06 22900 12 356040.22 84897.625 8000 - 1e-06 23000 12 350662.58 86460.188 8000 - 1e-06 23100 12 345116.82 88752.422 8000 - 1e-06 23200 12 339495.95 91790.621 8000 - 1e-06 23300 12 333687.3 95431.883 8000 - 1e-06 23400 12 327700.18 99552.952 8000 - 1e-06 23500 12 321587.6 104041.28 8000 - 1e-06 23600 12 315413.29 108778.56 8000 - 1e-06 23700 12 309232.19 113641.68 8000 - 1e-06 23800 12 303140 118515.28 8000 - 1e-06 23900 12 297243.14 123286.42 8000 - 1e-06 24000 12 291647.45 127852.5 8000 - 1e-06 24100 12 286443.56 132128.25 8000 - 1e-06 24200 12 281738.47 136042.29 8000 - 1e-06 24300 12 277598.16 139537.18 8000 - 1e-06 24400 12 274126.59 142570.51 8000 - 1e-06 24500 12 271212.37 145112.95 8000 - 1e-06 24600 12 268528.37 147123.47 8000 - 1e-06 24700 12 266518.1 148576.54 8000 - 1e-06 24800 12 265271.22 149482.64 8000 - 1e-06 24900 12 264825.89 149868.7 8000 - 1e-06 25000 12 265195.27 149778.11 8000 - 1e-06 25100 12 266383.27 149277.13 8000 - 1e-06 25200 12 268349.03 148416.99 8000 - 1e-06 25300 12 270306.65 147210.83 8000 - 1e-06 25400 12 272540.67 145679.8 8000 - 1e-06 25500 12 275074.7 143905.2 8000 - 1e-06 25600 12 277868.98 141980.52 8000 - 1e-06 25700 12 280861.82 139998.04 8000 - 1e-06 25800 12 283988.43 138050.21 8000 - 1e-06 25900 12 287187.75 136227 8000 - 1e-06 26000 12 290378.71 134578.07 8000 - 1e-06 26100 12 293523.52 133120.1 8000 - 1e-06 26200 12 296607.69 131949.25 8000 - 1e-06 26300 12 299624.93 131155.87 8000 - 1e-06 26400 12 302615.41 130771.8 8000 - 1e-06 26500 12 305572.83 130791.04 8000 - 1e-06 26600 12 308487.65 131181.94 8000 - 1e-06 26700 12 311349.47 131876.78 8000 - 1e-06 26800 12 314152.42 132778.86 8000 - 1e-06 26900 12 316889.29 133767.68 8000 - 1e-06 27000 12 319555.95 134708.52 8000 - 1e-06 27100 12 322120.91 135461.05 8000 - 1e-06 27200 12 324555.84 135890.05 8000 - 1e-06 27300 12 326829.66 135875.78 8000 - 1e-06 27400 12 328889.23 135312.91 8000 - 1e-06 27500 12 330281.69 133716.24 8000 - 1e-06 27600 12 329638.28 131054.91 8000 - 1e-06 27700 12 328037.36 127321.07 8000 - 1e-06 27800 12 325917.33 122660.17 8000 - 1e-06 27900 12 323405.93 117289.76 8000 - 1e-06 28000 12 320546.78 111541.78 8000 - 1e-06 28100 12 317368.1 105721.12 8000 - 1e-06 28200 12 313916.1 100042.75 8000 - 1e-06 28300 12 310233.7 94704.867 8000 - 1e-06 28400 12 306354.19 89876.573 8000 - 1e-06 28500 12 302311.92 85693.914 8000 - 1e-06 28600 12 298136.83 82229.878 8000 - 1e-06 28700 12 293861.39 79475.257 8000 - 1e-06 28800 12 289522.82 77321.299 8000 - 1e-06 28900 12 285166.39 75606.038 8000 - 1e-06 29000 12 280832.9 74150.094 8000 - 1e-06 29100 12 276597.93 72751.053 8000 - 1e-06 29200 12 272488.85 71238.957 8000 - 1e-06 29300 12 268566.35 69513.495 8000 - 1e-06 29400 12 264945.51 67531.391 8000 - 1e-06 29500 12 261654.36 65280.325 8000 - 1e-06 29600 12 258609.63 62770.995 8000 - 1e-06 29700 12 255839.5 60094.223 8000 - 1e-06 29800 12 253400.35 57359.541 8000 - 1e-06 29900 12 251293.26 54686.718 8000 - 1e-06 30000 12 249489.3 52206.293 8000 - 1e-06 30100 12 247933.05 50046.862 8000 - 1e-06 30200 12 246671.31 48361.721 8000 - 1e-06 30300 12 245727.43 47234.492 8000 - 1e-06 30400 12 245089.53 46668.443 8000 - 1e-06 30500 12 244732.88 46634.46 8000 - 1e-06 30600 12 244634.04 47078.65 8000 - 1e-06 30700 12 244776.41 47932.487 8000 - 1e-06 30800 12 245144.95 49123.892 8000 - 1e-06 30900 12 245702.52 50587.15 8000 - 1e-06 31000 12 246438.58 52268.799 8000 - 1e-06 31100 12 247320.85 54174.572 8000 - 1e-06 31200 12 248299.92 56314.047 8000 - 1e-06 31300 12 249329.77 58655.775 8000 - 1e-06 31400 12 250368.76 61154.112 8000 - 1e-06 31500 12 251379.78 63756.764 8000 - 1e-06 31600 12 252311.71 66409.538 8000 - 1e-06 31700 12 252527.59 69055.013 8000 - 1e-06 31800 12 252438.03 71645.91 8000 - 1e-06 31900 12 252149.26 74149.007 8000 - 1e-06 32000 12 251697.31 76539.619 8000 - 1e-06 32100 12 251102.37 78801.8 8000 - 1e-06 32200 12 250377.5 80923.81 8000 - 1e-06 32300 12 249388.7 82875.3 8000 - 1e-06 32400 12 248054.75 84570.827 8000 - 1e-06 32500 12 246510.48 85977.951 8000 - 1e-06 32600 12 244788.85 87069.778 8000 - 1e-06 32700 12 242926.09 87820.435 8000 - 1e-06 32800 12 240951.82 88208.457 8000 - 1e-06 32900 12 238923.34 88216.633 8000 - 1e-06 33000 12 236972.84 87811.784 8000 - 1e-06 33100 12 235176.94 86991.249 8000 - 1e-06 33200 12 233594.14 85783.149 8000 - 1e-06 33300 12 232256.48 84231.2 8000 - 1e-06 33400 12 231063.68 82397.369 8000 - 1e-06 33500 12 229814.73 80366.279 8000 - 1e-06 33600 12 228715.08 78221.16 8000 - 1e-06 33700 12 227846.27 76046.828 8000 - 1e-06 33800 12 227241.85 73932.693 8000 - 1e-06 33900 12 226942.55 71944.948 8000 - 1e-06 34000 12 226979.34 70148.331 8000 - 1e-06 34100 12 227374.73 68624.913 8000 - 1e-06 34200 12 228140.68 67389 8000 - 1e-06 34300 12 229286.23 66436.221 8000 - 1e-06 34400 12 230818.8 65748.265 8000 - 1e-06 34500 12 232718.67 65274.126 8000 - 1e-06 34600 12 234956.45 64949.901 8000 - 1e-06 34700 12 237495.47 64705.586 8000 - 1e-06 34800 12 240298.79 64471.768 8000 - 1e-06 34900 12 243327.46 64186.278 8000 - 1e-06 35000 12 246540.11 63799.369 8000 - 1e-06 35100 12 249891.89 63272.741 8000 - 1e-06 35200 12 253331.8 62590.115 8000 - 1e-06 35300 12 256810.15 61755.192 8000 - 1e-06 35400 12 260282.81 60790.037 8000 - 1e-06 35500 12 263711.24 59733.295 8000 - 1e-06 35600 12 267063.76 58636.285 8000 - 1e-06 35700 12 270321.08 57558.359 8000 - 1e-06 35800 12 273471.7 56562.046 8000 - 1e-06 35900 12 276025.36 55655.191 8000 - 1e-06 36000 12 277671.27 54780.068 8000 - 1e-06 36100 12 278702.08 54044.977 8000 - 1e-06 36200 12 279135.29 53482.141 8000 - 1e-06 36300 12 278950.85 53096.328 8000 - 1e-06 36400 12 278091.84 52852.785 8000 - 1e-06 36500 12 276595.93 52726.318 8000 - 1e-06 36600 12 274484.66 52702.496 8000 - 1e-06 36700 12 271787.05 52743.065 8000 - 1e-06 36800 12 268570.57 52802.129 8000 - 1e-06 36900 12 264883.91 52837.56 8000 - 1e-06 37000 12 260770.78 52813.294 8000 - 1e-06 37100 12 256294.93 52703.248 8000 - 1e-06 37200 12 251520.81 52496.031 8000 - 1e-06 37300 12 246514.92 52198.643 8000 - 1e-06 37400 12 241336.35 51838.499 8000 - 1e-06 37500 12 236051.19 51466.475 8000 - 1e-06 37600 12 230530.99 51158.037 8000 - 1e-06 37700 12 224831.9 51005.878 8000 - 1e-06 37800 12 219195 51087.112 8000 - 1e-06 37900 12 213774.51 51464.55 8000 - 1e-06 38000 12 208719.8 52178.179 8000 - 1e-06 38100 12 204173.16 53238.452 8000 - 1e-06 38200 12 200268.52 54621.477 8000 - 1e-06 38300 12 197150.81 56266.704 8000 - 1e-06 38400 12 194900.92 58092.885 8000 - 1e-06 38500 12 193569.8 59999.47 8000 - 1e-06 38600 12 193173.44 61875.452 8000 - 1e-06 38700 12 193689.15 63611.808 8000 - 1e-06 38800 12 195056.93 65114.049 8000 - 1e-06 38900 12 197179.13 66310.945 8000 - 1e-06 39000 12 199964.06 67173.129 8000 - 1e-06 39100 12 203313.78 67704.561 8000 - 1e-06 39200 12 206537.34 67923.159 8000 - 1e-06 39300 12 209698.91 67870.023 8000 - 1e-06 39400 12 212990.74 67598.734 8000 - 1e-06 39500 12 216350.18 67172.426 8000 - 1e-06 39600 12 219678.83 66655.657 8000 - 1e-06 39700 12 222844.21 66084.261 8000 - 1e-06 39800 12 225879.54 65489.967 8000 - 1e-06 39900 12 228750 64901.658 8000 - 1e-06 40000 12 231432.52 64333.74 8000 - 1e-06 40100 12 233916.24 63787.895 8000 - 1e-06 40200 12 236200.24 63256.3 8000 - 1e-06 40300 12 238290.68 62725.161 8000 - 1e-06 40400 12 240198.17 62177.851 8000 - 1e-06 40500 12 241937.05 61597.51 8000 - 1e-06 40600 12 243521.73 60967.618 8000 - 1e-06 40700 12 244888.47 60271.31 8000 - 1e-06 40800 12 245447.64 59435.777 8000 - 1e-06 40900 12 245685.9 58426.609 8000 - 1e-06 41000 12 245713.15 57255.612 8000 - 1e-06 41100 12 245574.53 55939.057 8000 - 1e-06 41200 12 245295.74 54497.409 8000 - 1e-06 41300 12 244893.38 52955.91 8000 - 1e-06 41400 12 244382.52 51349.735 8000 - 1e-06 41500 12 243831.69 49814.42 8000 - 1e-06 41600 12 243254.37 48400.984 8000 - 1e-06 41700 12 242477.85 47069.283 8000 - 1e-06 41800 12 241513.72 45827.072 8000 - 1e-06 41900 12 239756.07 44524.57 8000 - 1e-06 42000 12 237373.8 43055.987 8000 - 1e-06 42100 12 234744.81 41643.015 8000 - 1e-06 42200 12 231931.52 40312.339 8000 - 1e-06 42300 12 228935.92 39072.939 8000 - 1e-06 42400 12 225746.23 37930.778 8000 - 1e-06 42500 12 222348.89 36895.022 8000 - 1e-06 42600 12 218698.5 35981.801 8000 - 1e-06 42700 12 214647.12 35216.043 8000 - 1e-06 42800 12 210245.47 34620.785 8000 - 1e-06 42900 12 205531.71 34205.699 8000 - 1e-06 43000 12 200578.63 33994.95 8000 - 1e-06 43100 12 195456.13 33986.177 8000 - 1e-06 43200 12 190228.82 34157.583 8000 - 1e-06 43300 12 184952.07 34469.117 8000 - 1e-06 43400 12 179670.45 34866.761 8000 - 1e-06 43500 12 174418.49 35289.81 8000 - 1e-06 43600 12 169223.1 35679.916 8000 - 1e-06 43700 12 164106.46 35990.914 8000 - 1e-06 43800 12 159087.52 36198.071 8000 - 1e-06 43900 12 154186.33 36296.826 8000 - 1e-06 44000 12 149426.96 36300.354 8000 - 1e-06 44100 12 144835.14 36235.093 8000 - 1e-06 44200 12 140411 36133.354 8000 - 1e-06 44300 12 136182.81 36025.46 8000 - 1e-06 44400 12 132191.02 35932.385 8000 - 1e-06 44500 12 128477.69 35860.362 8000 - 1e-06 44600 12 125084.47 35799.083 8000 - 1e-06 44700 12 122052.38 35722.674 8000 - 1e-06 44800 12 119423.36 35591.653 8000 - 1e-06 44900 12 117231.38 35361.568 8000 - 1e-06 45000 12 115498.71 34993.601 8000 - 1e-06 45100 12 114234.68 34464.293 8000 - 1e-06 45200 12 113435.12 33772.471 8000 - 1e-06 45300 12 113082.91 32941.872 8000 - 1e-06 45400 12 113268.89 32017.499 8000 - 1e-06 45500 12 114094.16 31061.868 8000 - 1e-06 45600 12 115590.36 30141.335 8000 - 1e-06 45700 12 117815.57 29316.931 8000 - 1e-06 45800 12 120811.47 28631.895 8000 - 1e-06 45900 12 124575.14 28113.464 8000 - 1e-06 46000 12 129078.74 27763.791 8000 - 1e-06 46100 12 134338.42 27558.943 8000 - 1e-06 46200 12 140371.84 27456.007 8000 - 1e-06 46300 12 147179.46 27401.261 8000 - 1e-06 46400 12 154720.12 27350.633 8000 - 1e-06 46500 12 162903.78 27280.725 8000 - 1e-06 46600 12 171569.61 27160.074 8000 - 1e-06 46700 12 180503.28 26959.29 8000 - 1e-06 46800 12 189437.05 26679.422 8000 - 1e-06 46900 12 198196.23 26336.443 8000 - 1e-06 47000 12 206520.98 25964.312 8000 - 1e-06 47100 12 214102.44 25606.132 8000 - 1e-06 47200 12 220554.38 25312.112 8000 - 1e-06 47300 12 225530.25 25128.211 8000 - 1e-06 47400 12 228814.64 25087.25 8000 - 1e-06 47500 12 230374.48 25204.456 8000 - 1e-06 47600 12 230169.61 25476.535 8000 - 1e-06 47700 12 228279.91 25884.284 8000 - 1e-06 47800 12 224903.35 26398.057 8000 - 1e-06 47900 12 220331.08 26984.898 8000 - 1e-06 48000 12 214896.98 27615.915 8000 - 1e-06 48100 12 208954.59 28272.416 8000 - 1e-06 48200 12 202876.52 28949.711 8000 - 1e-06 48300 12 197002.89 29657.821 8000 - 1e-06 48400 12 191715.64 30417.951 8000 - 1e-06 48500 12 187427.74 31259.165 8000 - 1e-06 48600 12 184340.37 32206.982 8000 - 1e-06 48700 12 182293.26 33278.236 8000 - 1e-06 48800 12 181185.81 34481.276 8000 - 1e-06 48900 12 181101.89 35801.056 8000 - 1e-06 49000 12 182147.18 37201.316 8000 - 1e-06 49100 12 184365.23 38617.38 8000 - 1e-06 49200 12 187357.35 39915.206 8000 - 1e-06 49300 12 190910.82 40926.844 8000 - 1e-06 49400 12 195007.02 41662.043 8000 - 1e-06 49500 12 199572.66 42126.903 8000 - 1e-06 49600 12 204382.72 42280.987 8000 - 1e-06 49700 12 209699.49 42088.752 8000 - 1e-06 49800 12 215597.68 41583.342 8000 - 1e-06 49900 12 222033.85 40867.693 8000 -Loop time of 1.45978 on 1 procs for 49900 steps with 12 atoms + 1e-06 100 12 0.063728867 0 8000 + 1e-06 200 12 0.79328888 0 8000 + 1e-06 300 12 3.1671095 0 8000 + 1e-06 400 12 8.7248683 0 8000 + 1e-06 500 12 20.158012 0 8000 + 1e-06 600 12 41.157061 0 8000 + 1e-06 700 12 76.628872 0 8000 + 1e-06 800 12 132.88829 0 8000 + 1e-06 900 12 217.80403 0 8000 + 1e-06 1000 12 340.91325 0 8000 + 1e-06 1100 12 513.50254 0 8000 + 1e-06 1200 12 748.65202 0 8000 + 1e-06 1300 12 1061.2394 0 8000 + 1e-06 1400 12 1467.9017 0 8000 + 1e-06 1500 12 1986.9524 0 8000 + 1e-06 1600 12 2638.2542 0 8000 + 1e-06 1700 12 3443.0464 0 8000 + 1e-06 1800 12 4423.728 0 8000 + 1e-06 1900 12 5603.6004 0 8000 + 1e-06 2000 12 7006.5697 0 8000 + 1e-06 2100 12 8656.8153 0 8000 + 1e-06 2200 12 10575.061 0.00041930161 8000 + 1e-06 2300 12 12776.34 0.031472922 8000 + 1e-06 2400 12 15285.834 0.16547279 8000 + 1e-06 2500 12 18123.472 0.48824818 8000 + 1e-06 2600 12 21306.73 1.1172148 8000 + 1e-06 2700 12 24850.635 2.2101203 8000 + 1e-06 2800 12 28767.448 3.9742876 8000 + 1e-06 2900 12 33066.341 6.6765245 8000 + 1e-06 3000 12 37753.104 10.653677 8000 + 1e-06 3100 12 42829.905 16.323673 8000 + 1e-06 3200 12 48295.143 24.196804 8000 + 1e-06 3300 12 54143.784 34.886968 8000 + 1e-06 3400 12 60367.427 49.122473 8000 + 1e-06 3500 12 66954.459 67.756017 8000 + 1e-06 3600 12 73890.367 91.773371 8000 + 1e-06 3700 12 81158.051 122.30029 8000 + 1e-06 3800 12 88738.15 160.60714 8000 + 1e-06 3900 12 96609.374 208.11075 8000 + 1e-06 4000 12 104748.82 266.37305 8000 + 1e-06 4100 12 113132.27 337.09603 8000 + 1e-06 4200 12 121734.46 422.11267 8000 + 1e-06 4300 12 130529.26 523.37361 8000 + 1e-06 4400 12 139489.96 642.8869 8000 + 1e-06 4500 12 148590.48 781.76659 8000 + 1e-06 4600 12 157805.54 939.73777 8000 + 1e-06 4700 12 167102.78 1115.3765 8000 + 1e-06 4800 12 176408.3 1304.8823 8000 + 1e-06 4900 12 185727.22 1506.1791 8000 + 1e-06 5000 12 195037.08 1715.5141 8000 + 1e-06 5100 12 204311.37 1928.3496 8000 + 1e-06 5200 12 213522.05 2139.6607 8000 + 1e-06 5300 12 222640.01 2344.2078 8000 + 1e-06 5400 12 231635.3 2536.8271 8000 + 1e-06 5500 12 240477.26 2712.7272 8000 + 1e-06 5600 12 249036.18 2865.4067 8000 + 1e-06 5700 12 257225.21 2990.2307 8000 + 1e-06 5800 12 265107.22 3088.4777 8000 + 1e-06 5900 12 272662.78 3160.202 8000 + 1e-06 6000 12 279867.43 3206.6334 8000 + 1e-06 6100 12 286696.38 3230.2607 8000 + 1e-06 6200 12 293126.06 3234.7442 8000 + 1e-06 6300 12 299135.09 3224.7366 8000 + 1e-06 6400 12 304704.84 3205.6378 8000 + 1e-06 6500 12 309820.07 3183.3082 8000 + 1e-06 6600 12 314469.34 3163.76 8000 + 1e-06 6700 12 318645.43 3152.8517 8000 + 1e-06 6800 12 322345.74 3156.004 8000 + 1e-06 6900 12 325572.61 3177.9574 8000 + 1e-06 7000 12 328333.69 3222.5849 8000 + 1e-06 7100 12 330642.36 3292.7692 8000 + 1e-06 7200 12 332518.34 3390.3494 8000 + 1e-06 7300 12 333988.86 3516.133 8000 + 1e-06 7400 12 335091.17 3669.9688 8000 + 1e-06 7500 12 335881.45 3850.8676 8000 + 1e-06 7600 12 336541.99 4057.1561 8000 + 1e-06 7700 12 337100.25 4286.6487 8000 + 1e-06 7800 12 337436.07 4536.819 8000 + 1e-06 7900 12 337576.23 4804.9572 8000 + 1e-06 8000 12 337553.74 5088.3001 8000 + 1e-06 8100 12 337412.69 5384.125 8000 + 1e-06 8200 12 337266.12 5689.8034 8000 + 1e-06 8300 12 337141.16 6002.815 8000 + 1e-06 8400 12 336990.23 6320.7444 8000 + 1e-06 8500 12 336832.35 6645.3584 8000 + 1e-06 8600 12 336684.67 6980.6347 8000 + 1e-06 8700 12 336479.86 7317.4769 8000 + 1e-06 8800 12 336286.29 7653.1265 8000 + 1e-06 8900 12 336134.3 7982.859 8000 + 1e-06 9000 12 336043.31 8307.1796 8000 + 1e-06 9100 12 336035 8626.669 8000 + 1e-06 9200 12 336134.55 8942.2162 8000 + 1e-06 9300 12 336370.73 9254.9724 8000 + 1e-06 9400 12 336775.97 9566.1537 8000 + 1e-06 9500 12 337386.26 9876.5005 8000 + 1e-06 9600 12 338238.87 10185.038 8000 + 1e-06 9700 12 339373.93 10490.42 8000 + 1e-06 9800 12 340832.84 10792.816 8000 + 1e-06 9900 12 342649.99 11091.69 8000 + 1e-06 10000 12 344857.32 11386.232 8000 + 1e-06 10100 12 347498.52 11676.525 8000 + 1e-06 10200 12 350625.53 11966.038 8000 + 1e-06 10300 12 354228.27 12250.382 8000 + 1e-06 10400 12 358314.64 12529.915 8000 + 1e-06 10500 12 362887.71 12806.586 8000 + 1e-06 10600 12 367944.26 13083.935 8000 + 1e-06 10700 12 373508.47 13375.901 8000 + 1e-06 10800 12 379544.75 13682.748 8000 + 1e-06 10900 12 385955.58 13992.431 8000 + 1e-06 11000 12 392687 14307.793 8000 + 1e-06 11100 12 399676.01 14631.631 8000 + 1e-06 11200 12 406851.99 14966.316 8000 + 1e-06 11300 12 414139.37 15312.299 8000 + 1e-06 11400 12 421458.35 15668.76 8000 + 1e-06 11500 12 428725.85 16034.567 8000 + 1e-06 11600 12 435860.63 16408.01 8000 + 1e-06 11700 12 442914.03 16784.22 8000 + 1e-06 11800 12 449956.98 17165.7 8000 + 1e-06 11900 12 456943.52 17548.894 8000 + 1e-06 12000 12 463832.6 17927.761 8000 + 1e-06 12100 12 470563.99 18302.718 8000 + 1e-06 12200 12 477048.89 18678.218 8000 + 1e-06 12300 12 483212.97 19059.367 8000 + 1e-06 12400 12 489085.23 19458.596 8000 + 1e-06 12500 12 494661.19 19885.306 8000 + 1e-06 12600 12 499940 20344.66 8000 + 1e-06 12700 12 504927.83 20838.53 8000 + 1e-06 12800 12 509641.24 21366.554 8000 + 1e-06 12900 12 514117.28 21934.019 8000 + 1e-06 13000 12 518378.2 22538.416 8000 + 1e-06 13100 12 522458.77 23167.62 8000 + 1e-06 13200 12 525853.3 23780.032 8000 + 1e-06 13300 12 528815.22 24345.078 8000 + 1e-06 13400 12 531513.34 24883.702 8000 + 1e-06 13500 12 534014.75 25400.482 8000 + 1e-06 13600 12 536357.43 25891.923 8000 + 1e-06 13700 12 538572.95 26355.972 8000 + 1e-06 13800 12 540657.99 26795.836 8000 + 1e-06 13900 12 542612.1 27223.435 8000 + 1e-06 14000 12 544466.84 27647.413 8000 + 1e-06 14100 12 546241.59 28080.229 8000 + 1e-06 14200 12 547953.9 28538.741 8000 + 1e-06 14300 12 549620.46 29043.928 8000 + 1e-06 14400 12 551260.1 29617.65 8000 + 1e-06 14500 12 552886.91 30280.697 8000 + 1e-06 14600 12 554517.93 31050.292 8000 + 1e-06 14700 12 556175.17 31938.659 8000 + 1e-06 14800 12 557897.11 32951.814 8000 + 1e-06 14900 12 559696.65 34092.387 8000 + 1e-06 15000 12 561564.33 35360.561 8000 + 1e-06 15100 12 563512.54 36749.828 8000 + 1e-06 15200 12 565557.63 38246.838 8000 + 1e-06 15300 12 567718.92 39832.256 8000 + 1e-06 15400 12 569910.41 41477.599 8000 + 1e-06 15500 12 572038.38 43132.458 8000 + 1e-06 15600 12 573913.47 44763.446 8000 + 1e-06 15700 12 575651.62 46334.905 8000 + 1e-06 15800 12 577306.75 47812.828 8000 + 1e-06 15900 12 578897.86 49166.374 8000 + 1e-06 16000 12 580431.98 50370.863 8000 + 1e-06 16100 12 581917.67 51410.025 8000 + 1e-06 16200 12 583392.37 52290.363 8000 + 1e-06 16300 12 584896.54 53001.616 8000 + 1e-06 16400 12 586445.21 53535.481 8000 + 1e-06 16500 12 588052.51 53896.917 8000 + 1e-06 16600 12 589732.17 54102.867 8000 + 1e-06 16700 12 591496.83 54180.423 8000 + 1e-06 16800 12 593357.37 54163.728 8000 + 1e-06 16900 12 595249.77 54088.894 8000 + 1e-06 17000 12 597130.72 53987.792 8000 + 1e-06 17100 12 598744.15 53852.584 8000 + 1e-06 17200 12 600057.69 53662.064 8000 + 1e-06 17300 12 601263.08 53505.031 8000 + 1e-06 17400 12 602411.57 53452.104 8000 + 1e-06 17500 12 603541.22 53553.609 8000 + 1e-06 17600 12 604067.01 53875.668 8000 + 1e-06 17700 12 602571.09 54490.575 8000 + 1e-06 17800 12 600292.75 55434.526 8000 + 1e-06 17900 12 597386.86 56736.273 8000 + 1e-06 18000 12 593981.08 58424.745 8000 + 1e-06 18100 12 590178.8 60527.06 8000 + 1e-06 18200 12 586056.65 63073.313 8000 + 1e-06 18300 12 581695.18 66084.237 8000 + 1e-06 18400 12 577195.63 69560.379 8000 + 1e-06 18500 12 572657.32 73490.56 8000 + 1e-06 18600 12 568173.86 77853.568 8000 + 1e-06 18700 12 563830.46 82617.321 8000 + 1e-06 18800 12 559701.49 87738.316 8000 + 1e-06 18900 12 555848.76 93162.955 8000 + 1e-06 19000 12 552088.23 98803.436 8000 + 1e-06 19100 12 548185.32 104427.42 8000 + 1e-06 19200 12 544535.46 110064.18 8000 + 1e-06 19300 12 541228.34 115757.05 8000 + 1e-06 19400 12 538293.89 121467.69 8000 + 1e-06 19500 12 535108.7 127127.41 8000 + 1e-06 19600 12 531413.61 132495.98 8000 + 1e-06 19700 12 527729.51 137678.56 8000 + 1e-06 19800 12 524151.76 142754.02 8000 + 1e-06 19900 12 520715.23 147730.68 8000 + 1e-06 20000 12 517436.17 152621.73 8000 + 1e-06 20100 12 514316.17 157423.95 8000 + 1e-06 20200 12 511400.64 162074.69 8000 + 1e-06 20300 12 508692.38 166497.97 8000 + 1e-06 20400 12 506153.1 170617.84 8000 + 1e-06 20500 12 503717.78 174351.25 8000 + 1e-06 20600 12 501293.63 177615.72 8000 + 1e-06 20700 12 498966.36 180365.82 8000 + 1e-06 20800 12 496760.02 182555.39 8000 + 1e-06 20900 12 494705.8 184132.07 8000 + 1e-06 21000 12 492841.84 185052.2 8000 + 1e-06 21100 12 491215.97 185288.72 8000 + 1e-06 21200 12 489677.84 184786.05 8000 + 1e-06 21300 12 488104.26 183535.77 8000 + 1e-06 21400 12 486394.75 181560.76 8000 + 1e-06 21500 12 484603.38 178874.58 8000 + 1e-06 21600 12 482731.75 175610.89 8000 + 1e-06 21700 12 480707.38 172071.04 8000 + 1e-06 21800 12 478504.9 168244.44 8000 + 1e-06 21900 12 476099.5 164130.08 8000 + 1e-06 22000 12 473401.48 159927.13 8000 + 1e-06 22100 12 470370.26 155762.08 8000 + 1e-06 22200 12 467067.88 151634.35 8000 + 1e-06 22300 12 463485.76 147589.77 8000 + 1e-06 22400 12 459593.94 143696.49 8000 + 1e-06 22500 12 455376.67 140035.23 8000 + 1e-06 22600 12 450819.48 136692.31 8000 + 1e-06 22700 12 445945.91 133704.47 8000 + 1e-06 22800 12 440758.89 131179.35 8000 + 1e-06 22900 12 435302.31 129342.22 8000 + 1e-06 23000 12 429598.98 128282.87 8000 + 1e-06 23100 12 423606.11 127995.47 8000 + 1e-06 23200 12 417364.51 128494.32 8000 + 1e-06 23300 12 410931.48 129772.21 8000 + 1e-06 23400 12 404376.34 131791.95 8000 + 1e-06 23500 12 397794.05 134484.8 8000 + 1e-06 23600 12 390990.06 137778.07 8000 + 1e-06 23700 12 384162.26 141638.59 8000 + 1e-06 23800 12 377636.5 145932.03 8000 + 1e-06 23900 12 371606.04 150514.72 8000 + 1e-06 24000 12 366266.24 155257.47 8000 + 1e-06 24100 12 361786.35 160026.32 8000 + 1e-06 24200 12 358332.56 164701.26 8000 + 1e-06 24300 12 356060.82 169171.06 8000 + 1e-06 24400 12 355078.48 173360.16 8000 + 1e-06 24500 12 355450.93 177217.02 8000 + 1e-06 24600 12 357219.84 180708.91 8000 + 1e-06 24700 12 360415.01 183807.52 8000 + 1e-06 24800 12 365023.77 186489.43 8000 + 1e-06 24900 12 371003.31 188744.64 8000 + 1e-06 25000 12 377719.96 190508.83 8000 + 1e-06 25100 12 385044.02 191723.21 8000 + 1e-06 25200 12 392909.32 192416.99 8000 + 1e-06 25300 12 401135.52 192645.59 8000 + 1e-06 25400 12 409539.24 192477.65 8000 + 1e-06 25500 12 417291.42 191761.92 8000 + 1e-06 25600 12 424737.36 190597.14 8000 + 1e-06 25700 12 431913.53 189106.01 8000 + 1e-06 25800 12 438736.08 187391.23 8000 + 1e-06 25900 12 445137.75 185551.39 8000 + 1e-06 26000 12 451066.87 183681.98 8000 + 1e-06 26100 12 456506.74 181876.3 8000 + 1e-06 26200 12 461444.38 180210.36 8000 + 1e-06 26300 12 465927.86 178746.53 8000 + 1e-06 26400 12 470133.57 177568.71 8000 + 1e-06 26500 12 474134.12 176672.99 8000 + 1e-06 26600 12 477972.05 176033.42 8000 + 1e-06 26700 12 481533.44 175580.73 8000 + 1e-06 26800 12 484262.56 175093.24 8000 + 1e-06 26900 12 486070.74 174178.51 8000 + 1e-06 27000 12 487322.68 173184.75 8000 + 1e-06 27100 12 488010.07 172084.41 8000 + 1e-06 27200 12 488079.27 170808.69 8000 + 1e-06 27300 12 487463.01 169291.88 8000 + 1e-06 27400 12 486083.88 167484.29 8000 + 1e-06 27500 12 483861.52 165357.96 8000 + 1e-06 27600 12 480726.55 162915.35 8000 + 1e-06 27700 12 476628.16 160197.08 8000 + 1e-06 27800 12 471546.66 157277.97 8000 + 1e-06 27900 12 465514.41 154256.68 8000 + 1e-06 28000 12 458577.33 151265.67 8000 + 1e-06 28100 12 450810.58 148472.95 8000 + 1e-06 28200 12 442311.34 146058.64 8000 + 1e-06 28300 12 433200.29 144179.21 8000 + 1e-06 28400 12 423625.66 142953.04 8000 + 1e-06 28500 12 413765.24 142450.35 8000 + 1e-06 28600 12 403817.87 142689.67 8000 + 1e-06 28700 12 393989.03 143646.16 8000 + 1e-06 28800 12 384484.33 145259.76 8000 + 1e-06 28900 12 375502.5 147428.86 8000 + 1e-06 29000 12 367250.91 150041.97 8000 + 1e-06 29100 12 359903.16 153002.45 8000 + 1e-06 29200 12 353678.89 156213.09 8000 + 1e-06 29300 12 348513.14 159524.58 8000 + 1e-06 29400 12 344408.06 162793.23 8000 + 1e-06 29500 12 341354.25 165860.66 8000 + 1e-06 29600 12 339292.66 168560.48 8000 + 1e-06 29700 12 338131.77 170723.76 8000 + 1e-06 29800 12 337633.87 172131.92 8000 + 1e-06 29900 12 337374.11 172433.2 8000 + 1e-06 30000 12 337379.48 171680.35 8000 + 1e-06 30100 12 337530.24 169927.53 8000 + 1e-06 30200 12 337706.33 167168.98 8000 + 1e-06 30300 12 337790.98 163426.76 8000 + 1e-06 30400 12 337697.64 158781.65 8000 + 1e-06 30500 12 337366.76 153367.47 8000 + 1e-06 30600 12 336755.07 147361.71 8000 + 1e-06 30700 12 335854.47 140976.25 8000 + 1e-06 30800 12 334662.2 134438.92 8000 + 1e-06 30900 12 333206.26 127982.95 8000 + 1e-06 31000 12 331464.93 121911.39 8000 + 1e-06 31100 12 329488.62 116351.57 8000 + 1e-06 31200 12 327373.17 111369.57 8000 + 1e-06 31300 12 325228.82 107014.37 8000 + 1e-06 31400 12 323169.4 103330.69 8000 + 1e-06 31500 12 321071.03 100385.5 8000 + 1e-06 31600 12 319031.38 98193.648 8000 + 1e-06 31700 12 317126.27 96712.557 8000 + 1e-06 31800 12 315438.37 95876.196 8000 + 1e-06 31900 12 313815.51 95565.683 8000 + 1e-06 32000 12 312239.38 95585.612 8000 + 1e-06 32100 12 310926.28 95828.27 8000 + 1e-06 32200 12 309948.5 96173.311 8000 + 1e-06 32300 12 309370.35 96442.454 8000 + 1e-06 32400 12 309201.18 96472.304 8000 + 1e-06 32500 12 309383.35 96140.953 8000 + 1e-06 32600 12 309865.73 95349.932 8000 + 1e-06 32700 12 310615.88 94029.061 8000 + 1e-06 32800 12 311624.15 92145.895 8000 + 1e-06 32900 12 312897.69 89717.564 8000 + 1e-06 33000 12 314451.54 86812.433 8000 + 1e-06 33100 12 316227.53 83544.302 8000 + 1e-06 33200 12 318247.7 80051.39 8000 + 1e-06 33300 12 320540.3 76478.862 8000 + 1e-06 33400 12 323095.15 72955.915 8000 + 1e-06 33500 12 325858.6 69576.683 8000 + 1e-06 33600 12 328744.8 66391.967 8000 + 1e-06 33700 12 331653.91 63413.798 8000 + 1e-06 33800 12 334464.83 60630.152 8000 + 1e-06 33900 12 337044.79 58019.718 8000 + 1e-06 34000 12 339236.01 55565.231 8000 + 1e-06 34100 12 340903.65 53265.034 8000 + 1e-06 34200 12 341925.23 51135.512 8000 + 1e-06 34300 12 342206.93 49222.627 8000 + 1e-06 34400 12 341649.35 47586.207 8000 + 1e-06 34500 12 340176.56 46291.105 8000 + 1e-06 34600 12 337667.96 45393.826 8000 + 1e-06 34700 12 333648.9 44922.723 8000 + 1e-06 34800 12 328322.97 44898.764 8000 + 1e-06 34900 12 321776.97 45316.954 8000 + 1e-06 35000 12 314135.31 46151.059 8000 + 1e-06 35100 12 305598.53 47348.476 8000 + 1e-06 35200 12 296352.23 48877.862 8000 + 1e-06 35300 12 286690.37 50727.291 8000 + 1e-06 35400 12 276916.56 52890.03 8000 + 1e-06 35500 12 267324.34 55346.515 8000 + 1e-06 35600 12 258272.27 58117.818 8000 + 1e-06 35700 12 250043.55 61209.498 8000 + 1e-06 35800 12 242858.64 64607.799 8000 + 1e-06 35900 12 236841.89 68268.869 8000 + 1e-06 36000 12 232039.2 72109.967 8000 + 1e-06 36100 12 228474.09 76010.069 8000 + 1e-06 36200 12 226115.66 79808.944 8000 + 1e-06 36300 12 224858.91 83318.088 8000 + 1e-06 36400 12 224574.55 86340.123 8000 + 1e-06 36500 12 225062.39 88691.698 8000 + 1e-06 36600 12 226104.86 90211.829 8000 + 1e-06 36700 12 227493.83 90797.861 8000 + 1e-06 36800 12 229033.4 90446.128 8000 + 1e-06 36900 12 230503.16 89238.368 8000 + 1e-06 37000 12 231859.26 87294.45 8000 + 1e-06 37100 12 233083.51 84767.219 8000 + 1e-06 37200 12 234235.94 81827.155 8000 + 1e-06 37300 12 235402.6 78655.588 8000 + 1e-06 37400 12 236702.37 75432.209 8000 + 1e-06 37500 12 238271.62 72343.239 8000 + 1e-06 37600 12 240191.8 69493.919 8000 + 1e-06 37700 12 242533.8 66949.307 8000 + 1e-06 37800 12 245357.31 64751.161 8000 + 1e-06 37900 12 248707.62 62935.998 8000 + 1e-06 38000 12 252613.72 61551.838 8000 + 1e-06 38100 12 257052.41 60672.572 8000 + 1e-06 38200 12 261959.48 60392.157 8000 + 1e-06 38300 12 267252.31 60809.22 8000 + 1e-06 38400 12 272813.05 62005.004 8000 + 1e-06 38500 12 278498.77 64020.387 8000 + 1e-06 38600 12 284150.51 66835.207 8000 + 1e-06 38700 12 289604.09 70354.609 8000 + 1e-06 38800 12 294696.3 74392.688 8000 + 1e-06 38900 12 299233.72 78587.64 8000 + 1e-06 39000 12 303148.91 82674.175 8000 + 1e-06 39100 12 306708.36 86536.948 8000 + 1e-06 39200 12 309600.62 89862.067 8000 + 1e-06 39300 12 311700.43 92456.711 8000 + 1e-06 39400 12 312846.09 94218.029 8000 + 1e-06 39500 12 312996.55 95123.249 8000 + 1e-06 39600 12 311853.31 95204.167 8000 + 1e-06 39700 12 309573.91 94589.061 8000 + 1e-06 39800 12 306120.98 93445.743 8000 + 1e-06 39900 12 301697.58 91905.478 8000 + 1e-06 40000 12 296465.51 90172.857 8000 + 1e-06 40100 12 290548.45 88402.41 8000 + 1e-06 40200 12 284112.93 86721.642 8000 + 1e-06 40300 12 277419.21 85394.11 8000 + 1e-06 40400 12 270601.67 84327.103 8000 + 1e-06 40500 12 263782.18 83363.209 8000 + 1e-06 40600 12 257075.79 82350.637 8000 + 1e-06 40700 12 250587.81 81169.87 8000 + 1e-06 40800 12 244408.86 79765.108 8000 + 1e-06 40900 12 238613.12 78159.356 8000 + 1e-06 41000 12 233263.11 76444.561 8000 + 1e-06 41100 12 228410.45 74765.108 8000 + 1e-06 41200 12 224097.82 73288.059 8000 + 1e-06 41300 12 220360.61 72170.137 8000 + 1e-06 41400 12 217228.06 71527.798 8000 + 1e-06 41500 12 214724.04 71415.43 8000 + 1e-06 41600 12 212866.32 71815.969 8000 + 1e-06 41700 12 211661 72645.932 8000 + 1e-06 41800 12 211103.8 73762.785 8000 + 1e-06 41900 12 211177.1 74986.705 8000 + 1e-06 42000 12 211607.62 76028.195 8000 + 1e-06 42100 12 212363.62 76700.039 8000 + 1e-06 42200 12 213529.03 76938.547 8000 + 1e-06 42300 12 215008.35 76693.739 8000 + 1e-06 42400 12 216674.6 75984.606 8000 + 1e-06 42500 12 218453.89 74873.786 8000 + 1e-06 42600 12 220270.22 73459.542 8000 + 1e-06 42700 12 222044.1 71860.203 8000 + 1e-06 42800 12 223693.34 70197.611 8000 + 1e-06 42900 12 225131.14 68583.075 8000 + 1e-06 43000 12 226264.5 67108.382 8000 + 1e-06 43100 12 227001.96 65842.14 8000 + 1e-06 43200 12 227259.44 64830.806 8000 + 1e-06 43300 12 226966.5 64102.73 8000 + 1e-06 43400 12 226072.23 63673.107 8000 + 1e-06 43500 12 224550.01 63547.892 8000 + 1e-06 43600 12 222400.27 63725.546 8000 + 1e-06 43700 12 219649.08 64198.122 8000 + 1e-06 43800 12 216345.77 64940.248 8000 + 1e-06 43900 12 212561.67 65898.806 8000 + 1e-06 44000 12 208386.13 66994.934 8000 + 1e-06 44100 12 203921.52 68131.378 8000 + 1e-06 44200 12 199278.14 69204.386 8000 + 1e-06 44300 12 194569.44 70118.481 8000 + 1e-06 44400 12 189909.06 70810.594 8000 + 1e-06 44500 12 185407.95 71268.155 8000 + 1e-06 44600 12 181166.51 71493.826 8000 + 1e-06 44700 12 177276.76 71524.448 8000 + 1e-06 44800 12 173823.45 71423.226 8000 + 1e-06 44900 12 170886.41 71262.132 8000 + 1e-06 45000 12 168528.37 71107.616 8000 + 1e-06 45100 12 166817.96 70991.562 8000 + 1e-06 45200 12 165820.31 70920.666 8000 + 1e-06 45300 12 165574.99 70863.13 8000 + 1e-06 45400 12 166019.37 70710.029 8000 + 1e-06 45500 12 167147.87 70350.412 8000 + 1e-06 45600 12 169082.77 69657.821 8000 + 1e-06 45700 12 171945.43 68520.345 8000 + 1e-06 45800 12 175909.9 66883.643 8000 + 1e-06 45900 12 181195.22 64747.392 8000 + 1e-06 46000 12 188023.1 62178.63 8000 + 1e-06 46100 12 196442.27 59308.946 8000 + 1e-06 46200 12 206276.92 56311.64 8000 + 1e-06 46300 12 217187.2 53375.161 8000 + 1e-06 46400 12 228713.53 50677.575 8000 + 1e-06 46500 12 240278.4 48364.725 8000 + 1e-06 46600 12 251273.01 46535.827 8000 + 1e-06 46700 12 261407.3 45239.704 8000 + 1e-06 46800 12 270264.36 44479.416 8000 + 1e-06 46900 12 277578.87 44223.038 8000 + 1e-06 47000 12 283258 44417.235 8000 + 1e-06 47100 12 287156.44 45000.19 8000 + 1e-06 47200 12 289242.87 45911.176 8000 + 1e-06 47300 12 289597.36 47095.056 8000 + 1e-06 47400 12 288380.97 48501.691 8000 + 1e-06 47500 12 285805.13 50081.427 8000 + 1e-06 47600 12 282130.22 51780.572 8000 + 1e-06 47700 12 277128.82 53385.936 8000 + 1e-06 47800 12 271407.61 54873.773 8000 + 1e-06 47900 12 265556.17 56217.287 8000 + 1e-06 48000 12 260082.32 57338.782 8000 + 1e-06 48100 12 255399.15 58166.789 8000 + 1e-06 48200 12 251785.89 58653.934 8000 + 1e-06 48300 12 249277.86 58789.891 8000 + 1e-06 48400 12 247494.11 58609.44 8000 + 1e-06 48500 12 245660.12 58192.865 8000 + 1e-06 48600 12 242968.44 57656.856 8000 + 1e-06 48700 12 238968.69 57140.878 8000 + 1e-06 48800 12 233565.17 56788.953 8000 + 1e-06 48900 12 227411.99 56720.334 8000 + 1e-06 49000 12 221053.64 57003.014 8000 + 1e-06 49100 12 215153.96 57629.419 8000 + 1e-06 49200 12 210402.16 58574.859 8000 + 1e-06 49300 12 207216.41 59750.238 8000 + 1e-06 49400 12 205860.43 61020.818 8000 + 1e-06 49500 12 206382.26 62237.849 8000 + 1e-06 49600 12 208600.44 63264.958 8000 + 1e-06 49700 12 212280.2 63999.734 8000 + 1e-06 49800 12 217167.6 64388.533 8000 + 1e-06 49900 12 223002.61 64430.977 8000 +Loop time of 0.997677 on 1 procs for 49900 steps with 12 atoms -99.5% CPU use with 1 MPI tasks x no OpenMP threads +99.2% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.34189 | 0.34189 | 0.34189 | 0.0 | 23.42 +Pair | 0.24529 | 0.24529 | 0.24529 | 0.0 | 24.59 Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 0.0023579 | 0.0023579 | 0.0023579 | 0.0 | 0.16 -Output | 0.0038476 | 0.0038476 | 0.0038476 | 0.0 | 0.26 -Modify | 1.1002 | 1.1002 | 1.1002 | 0.0 | 75.37 -Other | | 0.01145 | | | 0.78 +Comm | 0.0019929 | 0.0019929 | 0.0019929 | 0.0 | 0.20 +Output | 0.0024977 | 0.0024977 | 0.0024977 | 0.0 | 0.25 +Modify | 0.74056 | 0.74056 | 0.74056 | 0.0 | 74.23 +Other | | 0.007341 | | | 0.74 Nlocal: 12 ave 12 max 12 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/src/GRANULAR/fix_granular_mdr.cpp b/src/GRANULAR/fix_granular_mdr.cpp index 8d9a0f116a..fcdc3b2b17 100644 --- a/src/GRANULAR/fix_granular_mdr.cpp +++ b/src/GRANULAR/fix_granular_mdr.cpp @@ -154,16 +154,16 @@ void FixGranularMDR::setup_pre_force(int /*vflag*/) norm_model2 = dynamic_cast(fix->model->normal_model); - if (norm_model && norm_model2 && fabs(norm_model->E - norm_model2->E) > EPSILON) + if (norm_model && norm_model2 && fabs(norm_model->get_emod() - norm_model2->get_emod()) > EPSILON) error->all( FLERR, Error::NOLASTLINE, "Young's modulus in pair style, {}, does not agree with value {} in fix gran/wall/region", - norm_model->E, norm_model2->E); - if (fabs(norm_model->nu - norm_model2->nu) > EPSILON) + norm_model->get_emod(), norm_model2->get_emod()); + if (fabs(norm_model->get_poiss() - norm_model2->get_poiss()) > EPSILON) error->all( FLERR, Error::NOLASTLINE, "Poisson's ratio in pair style, {}, does not agree with value {} in fix gran/wall/region", - norm_model->nu, norm_model2->nu); + norm_model->get_poiss(), norm_model2->get_poiss()); if (fabs(norm_model->Y - norm_model2->Y) > EPSILON) error->all( FLERR, Error::NOLASTLINE, diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index b68a720413..5420895c32 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -196,7 +196,8 @@ GranSubModDampingMDR::GranSubModDampingMDR(GranularModel *gm, LAMMPS *lmp) : void GranSubModDampingMDR::coeffs_to_local() { damp_type = coeffs[0]; // damping type 1 = mdr stiffness or 2 = velocity - if (damp_type != 1 && damp_type != 2) error->all(FLERR, "Illegal MDR normal model, damping type must an integer equal to 1 or 2"); + if (damp_type != 1 && damp_type != 2) + error->all(FLERR, "Illegal MDR damping model, damping type must an integer equal to 1 or 2"); } /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/gran_sub_mod_damping.h b/src/GRANULAR/gran_sub_mod_damping.h index 274c3d9e29..ac1363f64f 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -42,7 +42,6 @@ namespace Granular_NS { protected: double damp_prefactor; double damp; - int damp_type; // damping type is only used by normal mdr model }; /* ---------------------------------------------------------------------- */ @@ -102,6 +101,9 @@ namespace Granular_NS { void coeffs_to_local() override; void init() override; double calculate_forces() override; + + protected: + int damp_type; }; /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index 68cb853d9d..b0f04cfa40 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -446,6 +446,7 @@ GranSubModNormalMDR::GranSubModNormalMDR(GranularModel *gm, LAMMPS *lmp) : size_history = 27; nsvector = 1; fix_mdr_flag = 0; + material_properties = 1; id_fix = nullptr; nondefault_history_transfer = 1; @@ -468,23 +469,23 @@ GranSubModNormalMDR::~GranSubModNormalMDR() void GranSubModNormalMDR::coeffs_to_local() { - E = coeffs[0]; // Young's modulus - nu = coeffs[1]; // Poisson's ratio + Emod = coeffs[0]; // Young's modulus + poiss = coeffs[1]; // Poisson's ratio Y = coeffs[2]; // yield stress gamma = coeffs[3]; // effective surface energy psi_b = coeffs[4]; // bulk response trigger based on ratio of remaining free area: A_{free}/A_{total} damp = coeffs[5]; // coefficent of restitution - if (E <= 0.0) error->all(FLERR, "Illegal MDR normal model, Young's modulus must be greater than 0"); - if (nu < 0.0 || nu > 0.5) error->all(FLERR, "Illegal MDR normal model, Poisson's ratio must be between 0 and 0.5"); + if (Emod <= 0.0) error->all(FLERR, "Illegal MDR normal model, Young's modulus must be greater than 0"); + if (poiss < 0.0 || poiss > 0.5) error->all(FLERR, "Illegal MDR normal model, Poisson's ratio must be between 0 and 0.5"); if (Y < 0.0) error->all(FLERR, "Illegal MDR normal model, yield stress must be greater than or equal to 0"); if (gamma < 0.0) error->all(FLERR, "Illegal MDR normal model, effective surface energy must be greater than or equal to 0"); if (psi_b < 0.0 || psi_b > 1.0) error->all(FLERR, "Illegal MDR normal model, psi_b must be between 0 and 1.0"); if (damp < 0.0) error->all(FLERR, "Illegal MDR normal model, damping coefficent must be greater than or equal to 0"); - G = E / (2.0 * (1.0 + nu)); // shear modulus - kappa = E / (3.0 * (1.0 - 2.0 * nu)); // bulk modulus - Eeff = E / (1.0 - pow(nu, 2.0)); // composite plane strain modulus + G = Emod / (2.0 * (1.0 + poiss)); // shear modulus + kappa = Emod / (3.0 * (1.0 - 2.0 * poiss)); // bulk modulus + Eeff = Emod / (1.0 - pow(poiss, 2.0)); // composite plane strain modulus // precomputing factors @@ -613,15 +614,15 @@ double GranSubModNormalMDR::calculate_forces() // itag and jtag persist after neighbor list builds, use tags to compare to match // contact history variables consistently across steps for a particle pair. if ((contactSide == 0 && itag_true > jtag_true) || (contactSide != 0 && itag_true < jtag_true)) { - gm->i = i_true; - gm->j = j_true; - gm->radi = radi_true; - gm->radj = radj_true; + gm->i = i_true; + gm->j = j_true; + gm->radi = radi_true; + gm->radj = radj_true; } else { - gm->i = j_true; - gm->j = i_true; - gm->radi = radj_true; - gm->radj = radi_true; + gm->i = j_true; + gm->j = i_true; + gm->radi = radj_true; + gm->radj = radi_true; } // determine the two maximum experienced geometric overlaps on either side of rigid flat @@ -757,7 +758,7 @@ double GranSubModNormalMDR::calculate_forces() // depth of particle center const double zR = R - (deltamax_MDR - deltae1Dmax); - deltaR = 2 * amaxsq * (-1 + nu) - (-1 + 2 * nu) * zR * (-zR + sqrt(amaxsq + pow(zR, 2))); + deltaR = 2 * amaxsq * (-1 + poiss) - (-1 + 2 * poiss) * zR * (-zR + sqrt(amaxsq + pow(zR, 2))); deltaR *= Fmax / (MY_2PI * amaxsq * G * sqrt(amaxsq + pow(zR, 2))); // transformed elastic displacement @@ -961,7 +962,7 @@ double GranSubModNormalMDR::calculate_forces() a_damp = a_damp/2.0; damp_scale = sqrt(gm->meff * 2.0 * Eeff2particle * a_damp); double *deltao_offset = &history[DELTAO_0]; - const double wfm = std::exp(10.7*(*deltao_offset)/Rinitial[gm->i] - 10.0) + 1.0; // wall force magnifier + const double wfm = std::exp(10.7 * (*deltao_offset) / Rinitial[gm->i] - 10.0) + 1.0; // wall force magnifier F = wij * F0 * wfm; } else { damp_scale = sqrt(gm->meff * 2.0 * Eeff * a_damp); diff --git a/src/GRANULAR/gran_sub_mod_normal.h b/src/GRANULAR/gran_sub_mod_normal.h index 8142d88cea..9805bd81c0 100644 --- a/src/GRANULAR/gran_sub_mod_normal.h +++ b/src/GRANULAR/gran_sub_mod_normal.h @@ -143,7 +143,7 @@ namespace Granular_NS { void coeffs_to_local() override; void init() override; double calculate_forces() override; - double E, nu, Y, gamma, psi_b; // specified coeffs + double Y, gamma, psi_b; // specified coeffs protected: double G, kappa, Eeff; // derived coeffs From 5d9a7d154d02a95ad3c4e32a83105f8529669f49 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 15 Apr 2025 22:48:25 -0400 Subject: [PATCH 45/94] address spelling and formatting issues --- doc/src/fix_neighbor_swap.rst | 71 +++++++++++---------- doc/utils/sphinx-config/false_positives.txt | 1 + 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 274c4ea939..fbe793eef9 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -50,7 +50,7 @@ Description This fix performs Monte-Carlo (MC) evaluations to enable kinetic Monte Carlo (kMC)-type behavior during MD simulation by allowing -neighboring atoms to swap their positions. In constrast to the :doc:`fix +neighboring atoms to swap their positions. In contrast to the :doc:`fix atom/swap ` command which swaps pairs of atoms anywhere in the simulation domain, the restriction of the MC swapping to neighbors enables a hybrid MD/kMC-like simulation. @@ -68,7 +68,7 @@ Metropolis criterion after evaluating the change in system energy due to the swap. A detailed explanation of the original implementation of this -algorithm can be found in :ref:`(Tavenner 2023) <_TavennerMDkMC>` +algorithm can be found in :ref:`(Tavenner 2023) ` where it was used to simulated accelerated diffusion in an MD context. Simulating inherently kinetically-limited behaviors which rely on rare @@ -81,41 +81,46 @@ the processes of atomic diffusion to be approximated during an MD simulation, effectively decoupling the MD atomic vibrational timescale and the atomic hopping (kMC event) timescale. -The algorithm implemented by this fix is as follows. The MD -simulation is paused every *N* stepsA Voronoi tesselation is -performed for the current atom configuration. Then *X* atom swaps are -attempted, one after the other. For each swap, an atom *I* is -selected randomly from the list of atom types specified by either the -*types* or *diff* keywords. One of *I*'s Voronoi neighbors *J* is -selected using the distance-weighted probability for each neighbor -detailed below. The *I,J* atom IDs are communicated to all processors -so that a global energy evaluation can be performed for the post-swap -state of the system. The swap is accepted or rejected based on the -Metropolis criterion using the energy change of the system and the -specified temperature *T*. +The algorithm implemented by this fix is as follows: + + - The MD simulation is paused every *N* steps + - A Voronoi tesselation is performed for the current atom configuration. + - Then *X* atom swaps are attempted, one after the other. + - For each swap, an atom *I* is selected randomly from the list of + atom types specified by either the *types* or *diff* keywords. + - One of *I*'s Voronoi neighbors *J* is selected using the + distance-weighted probability for each neighbor detailed below. + - The *I,J* atom IDs are communicated to all processors so that a + global energy evaluation can be performed for the post-swap state + of the system. + - The swap is accepted or rejected based on the Metropolis criterion + using the energy change of the system and the specified temperature + *T*. Here are a few comments on the computational cost of the swapping algorithm. -(1) The cost of a global energy evaluation is similar to that of an MD -timestep. + 1. The cost of a global energy evaluation is similar to that of an MD + timestep. -(2) Simliar to other MC algorithms in LAMMPS, an optimized parallel efficiency -is achieved with a smaller number of atoms per processor than would typically -be used in an standard MD simulation. This is because the per-energy evaluation -cost increases relative to the balance of MD/MC steps as indicated by (1), but -the communication cost remains relatively constant for a given number of MD steps. + 2. Similar to other MC algorithms in LAMMPS, improved parallel + efficiency is achieved with a smaller number of atoms per + processor than would typically be used in an standard MD + simulation. This is because the per-energy evaluation cost + increases relative to the balance of MD/MC steps as indicated by + 1., but the communication cost remains relatively constant for a + given number of MD steps. -(3) The MC portion of the simulation will run dramatically slower if -the pair style uses different cutoffs for different atom types (or -type pairs). This is because each atom swap then requires a rebuild -of the neighbor list to ensure the post-swap global energy can be -computed correctly. + 3. The MC portion of the simulation will run dramatically slower if + the pair style uses different cutoffs for different atom types (or + type pairs). This is because each atom swap then requires a + rebuild of the neighbor list to ensure the post-swap global energy + can be computed correctly. Limitations are imposed on selection of *I,J* atom pairs to avoid -swapping of atoms which are outside of a reasonable cutoff (e.g. due -to a Voronoi tesselation near free surfaces) though the -use of a distance-weighted probabiltiy scaling. +swapping of atoms which are outside of a reasonable cutoff (e.g. due to +a Voronoi tesselation near free surfaces) though the use of a +distance-weighted probability scaling. ---------- @@ -133,8 +138,8 @@ sets the radius :math:`r_0` in this formula where :math:`p_{ij}` is the probability of selecting atom :math:`j` to swap with atom :math:`i`. Typically, a value for *R0* around the -average nearest-neighbor spacing is appropriate. Since this is simply -a proability weighting, the swapping behavior is not very sensitive to +average nearest-neighbor spacing is appropriate. Since this is simply a +probability weighting, the swapping behavior is not very sensitive to the exact value of *R0*. The keyword *types* takes two or more atom types as its values. Only @@ -157,7 +162,7 @@ this: Note that the *neighbors yes* option must be enabled for use with this fix. The group-ID should include all the atoms which this fix will -potentialy select. I.e. the group-ID used in the voronoi compute should +potentially select. I.e. the group-ID used in the voronoi compute should include the same atoms as that indicated by the *types* keyword. If the *diff* keyword is used, the group-ID should include atoms of all types in the simulation. @@ -221,7 +226,7 @@ Restrictions This fix is part of the MC package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Also this fix requires that the :ref:`VORONOI -package ` be installed, otherwise the fix will not be +package ` is installed, otherwise the fix will not be compiled. The :doc:`compute voronoi/atom ` command diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index afb0fe3e95..115acc575b 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -4109,6 +4109,7 @@ volpress volumetric von Voro +voro Vorobyov voronoi Voronoi From 648cd3f0c6a7a54d3eb99173dab1e707d978674e Mon Sep 17 00:00:00 2001 From: talinke Date: Tue, 22 Apr 2025 17:43:21 -0700 Subject: [PATCH 46/94] Temperature bias capability --- examples/gjf/README | 32 +++--- examples/gjf/in.gjf.vfull | 4 +- examples/gjf/in.gjf.vhalf | 2 +- examples/gjf/log.2Apr25.gjf.vfull.g++.1 | 50 ++++---- examples/gjf/log.2Apr25.gjf.vfull.g++.4 | 50 ++++---- examples/gjf/log.2Apr25.gjf.vhalf.g++.1 | 59 ++++++---- examples/gjf/log.2Apr25.gjf.vhalf.g++.4 | 61 ++++++---- src/EXTRA-FIX/fix_langevin_gjf.cpp | 145 +++++++++++++++++------- src/EXTRA-FIX/fix_langevin_gjf.h | 2 +- 9 files changed, 242 insertions(+), 163 deletions(-) diff --git a/examples/gjf/README b/examples/gjf/README index b98e4134ab..34b60292bb 100644 --- a/examples/gjf/README +++ b/examples/gjf/README @@ -15,23 +15,23 @@ with the correct Boltzmann statistics. A comparison using averaged properties from this example's input file is shown below. 'X' denotes a failed simulation. The theoretical value for KE is 1.1168 eV. -KINETIC ENERGY (eV) -| Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | -|==============||========|========|========|========|========|========|========| -| gjf half || 1.117 | 1.116 | 1.119 | 1.119 | 1.123 | 1.136 | 1.170 | -| gjf full || 1.116 | 1.071 | 0.938 | 0.898 | 0.858 | 0.817 | 0.780 | -| langevin || 1.110 | 1.113 | 1.121 | 1.129 | 1.157 | X | X | -| nvt || 1.083 | 1.109 | 1.112 | 1.113 | 1.114 | X | X | -|--------------||--------|--------|--------|--------|--------|--------|--------| - POTENTIAL ENERGY (eV) -| Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | -|==============||========|========|========|========|========|========|========| -| gjf half || -55.11 | -55.11 | -55.11 | -55.11 | -55.11 | -55.10 | -55.07 | -| gjf full || -55.11 | -55.11 | -55.11 | -55.11 | -55.11 | -55.10 | -55.07 | -| langevin || -55.11 | -55.07 | -54.87 | -54.79 | -54.65 | X | X | -| nvt || -55.14 | -55.07 | -54.90 | -54.84 | -54.76 | X | X | -|--------------||--------|--------|--------|--------|--------|--------|--------| +| Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | +|===================||========|========|========|========|========|========|========| +| gjf half || -55.11 | -55.11 | -55.11 | -55.11 | -55.11 | -55.10 | -55.07 | +| gjf full || -55.11 | -55.11 | -55.11 | -55.11 | -55.11 | -55.10 | -55.07 | +| langevin || -55.11 | -55.07 | -54.87 | -54.79 | -54.65 | X | X | +| nvt (Nose-Hoover) || -55.14 | -55.07 | -54.90 | -54.84 | -54.76 | X | X | +|-------------------||--------|--------|--------|--------|--------|--------|--------| + +KINETIC ENERGY (eV) +| Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | +|===================||========|========|========|========|========|========|========| +| gjf half || 1.117 | 1.116 | 1.119 | 1.119 | 1.123 | 1.136 | 1.170 | +| gjf full || 1.116 | 1.071 | 0.938 | 0.898 | 0.858 | 0.817 | 0.780 | +| langevin || 1.110 | 1.113 | 1.121 | 1.129 | 1.157 | X | X | +| nvt (Nose-Hoover) || 1.083 | 1.109 | 1.112 | 1.113 | 1.114 | X | X | +|-------------------||--------|--------|--------|--------|--------|--------|--------| Script Commands: diff --git a/examples/gjf/in.gjf.vfull b/examples/gjf/in.gjf.vfull index 127b8fef87..c36a5b0690 100644 --- a/examples/gjf/in.gjf.vfull +++ b/examples/gjf/in.gjf.vfull @@ -17,9 +17,9 @@ compute myPE all pe fix lang all langevin/gjf 10 10 1 26488 vel vfull method 1 -thermo 2000 run 5000 -fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out +thermo 2000 run 35000 \ No newline at end of file diff --git a/examples/gjf/in.gjf.vhalf b/examples/gjf/in.gjf.vhalf index ba805d693a..0635998954 100644 --- a/examples/gjf/in.gjf.vhalf +++ b/examples/gjf/in.gjf.vhalf @@ -19,7 +19,7 @@ fix lang all langevin/gjf 10 10 1 26488 run 5000 -fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out thermo 2000 run 35000 \ No newline at end of file diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 index 30a0f7e9c9..3bb204704b 100644 --- a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 09d3ac0a1b-modified) +LAMMPS (2 Apr 2025 - Development - e4c3b0c05e-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -55,7 +55,6 @@ compute myPE all pe fix lang all langevin/gjf 10 10 1 26488 vel vfull method 1 -thermo 2000 run 5000 CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -72,7 +71,7 @@ url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, doi = {10.1080/00268976.2019.1662506}, journal = {Molecular Physics}, author = {Grønbech-Jensen, Niels}, -year = {2020}, +year = {2020} } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -93,24 +92,22 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 - 2000 8.5329244 -55.06102 0 -54.10916 343.01505 - 4000 7.8165794 -55.128803 0 -54.256851 322.07344 5000 8.4535562 -55.150518 0 -54.207511 318.20862 -Loop time of 2.26625 on 1 procs for 5000 steps with 864 atoms +Loop time of 2.32365 on 1 procs for 5000 steps with 864 atoms -Performance: 19062.331 ns/day, 0.001 hours/ns, 2206.288 timesteps/s, 1.906 Matom-step/s -100.0% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 18591.401 ns/day, 0.001 hours/ns, 2151.782 timesteps/s, 1.859 Matom-step/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.2907 | 1.2907 | 1.2907 | 0.0 | 56.95 -Bond | 0.00032498 | 0.00032498 | 0.00032498 | 0.0 | 0.01 -Neigh | 0.28343 | 0.28343 | 0.28343 | 0.0 | 12.51 -Comm | 0.055491 | 0.055491 | 0.055491 | 0.0 | 2.45 -Output | 8.5614e-05 | 8.5614e-05 | 8.5614e-05 | 0.0 | 0.00 -Modify | 0.61129 | 0.61129 | 0.61129 | 0.0 | 26.97 -Other | | 0.02497 | | | 1.10 +Pair | 1.3067 | 1.3067 | 1.3067 | 0.0 | 56.23 +Bond | 0.00027472 | 0.00027472 | 0.00027472 | 0.0 | 0.01 +Neigh | 0.28218 | 0.28218 | 0.28218 | 0.0 | 12.14 +Comm | 0.057388 | 0.057388 | 0.057388 | 0.0 | 2.47 +Output | 5.6019e-05 | 5.6019e-05 | 5.6019e-05 | 0.0 | 0.00 +Modify | 0.65159 | 0.65159 | 0.65159 | 0.0 | 28.04 +Other | | 0.02549 | | | 1.10 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -125,8 +122,9 @@ Ave special neighs/atom = 0 Neighbor list builds = 258 Dangerous builds = 0 -fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out +thermo 2000 run 35000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes @@ -150,21 +148,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes 36000 8.3048574 -55.079475 0 -54.153056 338.04291 38000 8.8708544 -55.108991 0 -54.119434 330.70097 40000 8.4012779 -55.080817 0 -54.143642 338.54326 -Loop time of 19.3814 on 1 procs for 35000 steps with 864 atoms +Loop time of 19.3834 on 1 procs for 35000 steps with 864 atoms -Performance: 15602.554 ns/day, 0.002 hours/ns, 1805.851 timesteps/s, 1.560 Matom-step/s -100.0% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 15601.000 ns/day, 0.002 hours/ns, 1805.671 timesteps/s, 1.560 Matom-step/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 12.065 | 12.065 | 12.065 | 0.0 | 62.25 -Bond | 0.0021494 | 0.0021494 | 0.0021494 | 0.0 | 0.01 -Neigh | 2.3755 | 2.3755 | 2.3755 | 0.0 | 12.26 -Comm | 0.40916 | 0.40916 | 0.40916 | 0.0 | 2.11 -Output | 0.0004907 | 0.0004907 | 0.0004907 | 0.0 | 0.00 -Modify | 4.3528 | 4.3528 | 4.3528 | 0.0 | 22.46 -Other | | 0.1765 | | | 0.91 +Pair | 11.828 | 11.828 | 11.828 | 0.0 | 61.02 +Bond | 0.0024424 | 0.0024424 | 0.0024424 | 0.0 | 0.01 +Neigh | 2.3519 | 2.3519 | 2.3519 | 0.0 | 12.13 +Comm | 0.42251 | 0.42251 | 0.42251 | 0.0 | 2.18 +Output | 0.00056686 | 0.00056686 | 0.00056686 | 0.0 | 0.00 +Modify | 4.5987 | 4.5987 | 4.5987 | 0.0 | 23.73 +Other | | 0.1793 | | | 0.93 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 index 454887a106..4c6fe82e54 100644 --- a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 09d3ac0a1b-modified) +LAMMPS (2 Apr 2025 - Development - e4c3b0c05e-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -55,7 +55,6 @@ compute myPE all pe fix lang all langevin/gjf 10 10 1 26488 vel vfull method 1 -thermo 2000 run 5000 CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -72,7 +71,7 @@ url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, doi = {10.1080/00268976.2019.1662506}, journal = {Molecular Physics}, author = {Grønbech-Jensen, Niels}, -year = {2020}, +year = {2020} } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -93,24 +92,22 @@ Neighbor list info ... Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 - 2000 8.63533 -55.154093 0 -54.190809 317.34773 - 4000 8.2482881 -55.091551 0 -54.171442 333.83766 5000 7.946377 -55.076514 0 -54.190084 337.31999 -Loop time of 2.06641 on 4 procs for 5000 steps with 864 atoms +Loop time of 2.0791 on 4 procs for 5000 steps with 864 atoms -Performance: 20905.811 ns/day, 0.001 hours/ns, 2419.654 timesteps/s, 2.091 Matom-step/s -62.1% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 20778.210 ns/day, 0.001 hours/ns, 2404.885 timesteps/s, 2.078 Matom-step/s +64.9% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.53593 | 0.54393 | 0.55031 | 0.7 | 26.32 -Bond | 0.0004435 | 0.00052388 | 0.000586 | 0.0 | 0.03 -Neigh | 0.10844 | 0.11152 | 0.11687 | 1.0 | 5.40 -Comm | 0.94337 | 0.94742 | 0.94979 | 0.3 | 45.85 -Output | 0.00076423 | 0.00077499 | 0.00078949 | 0.0 | 0.04 -Modify | 0.24993 | 0.25116 | 0.25286 | 0.2 | 12.15 -Other | | 0.2111 | | | 10.21 +Pair | 0.52985 | 0.53809 | 0.54586 | 0.8 | 25.88 +Bond | 0.00054599 | 0.00057676 | 0.00061668 | 0.0 | 0.03 +Neigh | 0.10872 | 0.10965 | 0.11044 | 0.2 | 5.27 +Comm | 0.95581 | 0.96284 | 0.97025 | 0.5 | 46.31 +Output | 0.00027472 | 0.00028374 | 0.00029435 | 0.0 | 0.01 +Modify | 0.25077 | 0.25198 | 0.2529 | 0.2 | 12.12 +Other | | 0.2157 | | | 10.37 Nlocal: 216 ave 216 max 216 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -125,8 +122,9 @@ Ave special neighs/atom = 0 Neighbor list builds = 273 Dangerous builds = 0 -fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out +thermo 2000 run 35000 Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes @@ -150,21 +148,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes 36000 8.0936615 -55.152202 0 -54.249342 316.20169 38000 7.999652 -55.048407 0 -54.156034 345.07945 40000 8.6699753 -55.087634 0 -54.120485 337.23709 -Loop time of 17.4329 on 4 procs for 35000 steps with 864 atoms +Loop time of 17.5212 on 4 procs for 35000 steps with 864 atoms -Performance: 17346.528 ns/day, 0.001 hours/ns, 2007.700 timesteps/s, 1.735 Matom-step/s -65.5% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 17259.111 ns/day, 0.001 hours/ns, 1997.582 timesteps/s, 1.726 Matom-step/s +63.6% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.1129 | 5.1423 | 5.1581 | 0.8 | 29.50 -Bond | 0.0029266 | 0.0034929 | 0.0038279 | 0.6 | 0.02 -Neigh | 0.85004 | 0.87543 | 0.90992 | 2.4 | 5.02 -Comm | 6.6875 | 6.6993 | 6.7123 | 0.4 | 38.43 -Output | 0.0043725 | 0.0045522 | 0.005017 | 0.4 | 0.03 -Modify | 3.2524 | 3.2579 | 3.2677 | 0.3 | 18.69 -Other | | 1.45 | | | 8.32 +Pair | 4.9924 | 5.0801 | 5.1446 | 2.4 | 28.99 +Bond | 0.0041975 | 0.0044234 | 0.0046863 | 0.3 | 0.03 +Neigh | 0.85805 | 0.86369 | 0.87021 | 0.5 | 4.93 +Comm | 6.7339 | 6.8008 | 6.8891 | 2.1 | 38.81 +Output | 0.0044786 | 0.0046306 | 0.0050572 | 0.4 | 0.03 +Modify | 3.2849 | 3.2919 | 3.2981 | 0.3 | 18.79 +Other | | 1.476 | | | 8.42 Nlocal: 216 ave 222 max 210 min Histogram: 2 0 0 0 0 0 0 0 0 2 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 index 5d07985f1c..7ea6355b64 100644 --- a/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 09d3ac0a1b-modified) +LAMMPS (2 Apr 2025 - Development - e4c3b0c05e-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -21,7 +21,7 @@ Finding 1-2 1-3 1-4 neighbors ... 0 = max # of 1-4 neighbors 1 = max # of special neighbors special bonds CPU = 0.000 seconds - read_data CPU = 0.007 seconds + read_data CPU = 0.012 seconds include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -71,7 +71,20 @@ url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, doi = {10.1080/00268976.2019.1662506}, journal = {Molecular Physics}, author = {Grønbech-Jensen, Niels}, -year = {2020}, +year = {2020} +} + +- Langevin GJ-I vhalf method: doi:10.1080/00268976.2019.1570369 + +@Article{jensen_accurate_2019, +title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems}, +volume = {117}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1570369}, +doi = {10.1080/00268976.2019.1570369}, +number = {18}, +journal = {Molecular Physics}, +author = {Jensen, Lucas Frese Grønbech and Grønbech-Jensen, Niels}, +year = {2019} } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -93,21 +106,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 5000 9.7731898 -55.150518 0 -54.060304 322.94195 -Loop time of 2.32188 on 1 procs for 5000 steps with 864 atoms +Loop time of 2.33802 on 1 procs for 5000 steps with 864 atoms -Performance: 18605.621 ns/day, 0.001 hours/ns, 2153.428 timesteps/s, 1.861 Matom-step/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 18477.199 ns/day, 0.001 hours/ns, 2138.565 timesteps/s, 1.848 Matom-step/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.3154 | 1.3154 | 1.3154 | 0.0 | 56.65 -Bond | 0.00030719 | 0.00030719 | 0.00030719 | 0.0 | 0.01 -Neigh | 0.28939 | 0.28939 | 0.28939 | 0.0 | 12.46 -Comm | 0.055279 | 0.055279 | 0.055279 | 0.0 | 2.38 -Output | 4.3714e-05 | 4.3714e-05 | 4.3714e-05 | 0.0 | 0.00 -Modify | 0.63675 | 0.63675 | 0.63675 | 0.0 | 27.42 -Other | | 0.02471 | | | 1.06 +Pair | 1.3074 | 1.3074 | 1.3074 | 0.0 | 55.92 +Bond | 0.00028207 | 0.00028207 | 0.00028207 | 0.0 | 0.01 +Neigh | 0.27625 | 0.27625 | 0.27625 | 0.0 | 11.82 +Comm | 0.056554 | 0.056554 | 0.056554 | 0.0 | 2.42 +Output | 5.3527e-05 | 5.3527e-05 | 5.3527e-05 | 0.0 | 0.00 +Modify | 0.67274 | 0.67274 | 0.67274 | 0.0 | 28.77 +Other | | 0.02477 | | | 1.06 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -122,7 +135,7 @@ Ave special neighs/atom = 0 Neighbor list builds = 258 Dangerous builds = 0 -fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out thermo 2000 run 35000 @@ -148,21 +161,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes 36000 9.7252627 -55.079475 0 -53.994608 343.13769 38000 10.438984 -55.108991 0 -53.944506 336.32562 40000 10.238268 -55.080817 0 -53.938723 345.13228 -Loop time of 19.5673 on 1 procs for 35000 steps with 864 atoms +Loop time of 19.4518 on 1 procs for 35000 steps with 864 atoms -Performance: 15454.339 ns/day, 0.002 hours/ns, 1788.697 timesteps/s, 1.545 Matom-step/s +Performance: 15546.156 ns/day, 0.002 hours/ns, 1799.324 timesteps/s, 1.555 Matom-step/s 99.9% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 12.065 | 12.065 | 12.065 | 0.0 | 61.66 -Bond | 0.002157 | 0.002157 | 0.002157 | 0.0 | 0.01 -Neigh | 2.384 | 2.384 | 2.384 | 0.0 | 12.18 -Comm | 0.40912 | 0.40912 | 0.40912 | 0.0 | 2.09 -Output | 0.00050573 | 0.00050573 | 0.00050573 | 0.0 | 0.00 -Modify | 4.5321 | 4.5321 | 4.5321 | 0.0 | 23.16 -Other | | 0.1749 | | | 0.89 +Pair | 11.789 | 11.789 | 11.789 | 0.0 | 60.61 +Bond | 0.0022933 | 0.0022933 | 0.0022933 | 0.0 | 0.01 +Neigh | 2.3359 | 2.3359 | 2.3359 | 0.0 | 12.01 +Comm | 0.4146 | 0.4146 | 0.4146 | 0.0 | 2.13 +Output | 0.0005505 | 0.0005505 | 0.0005505 | 0.0 | 0.00 +Modify | 4.7341 | 4.7341 | 4.7341 | 0.0 | 24.34 +Other | | 0.1749 | | | 0.90 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 index cac135e578..088fa73044 100644 --- a/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 09d3ac0a1b-modified) +LAMMPS (2 Apr 2025 - Development - e4c3b0c05e-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -21,7 +21,7 @@ Finding 1-2 1-3 1-4 neighbors ... 0 = max # of 1-4 neighbors 1 = max # of special neighbors special bonds CPU = 0.002 seconds - read_data CPU = 0.014 seconds + read_data CPU = 0.015 seconds include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -71,7 +71,20 @@ url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, doi = {10.1080/00268976.2019.1662506}, journal = {Molecular Physics}, author = {Grønbech-Jensen, Niels}, -year = {2020}, +year = {2020} +} + +- Langevin GJ-I vhalf method: doi:10.1080/00268976.2019.1570369 + +@Article{jensen_accurate_2019, +title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems}, +volume = {117}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1570369}, +doi = {10.1080/00268976.2019.1570369}, +number = {18}, +journal = {Molecular Physics}, +author = {Jensen, Lucas Frese Grønbech and Grønbech-Jensen, Niels}, +year = {2019} } CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -93,21 +106,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 5000 9.3726166 -55.076514 0 -54.030985 342.43571 -Loop time of 2.09273 on 4 procs for 5000 steps with 864 atoms +Loop time of 2.09482 on 4 procs for 5000 steps with 864 atoms -Performance: 20642.908 ns/day, 0.001 hours/ns, 2389.226 timesteps/s, 2.064 Matom-step/s -62.7% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 20622.269 ns/day, 0.001 hours/ns, 2386.837 timesteps/s, 2.062 Matom-step/s +64.9% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.53092 | 0.54173 | 0.55017 | 1.0 | 25.89 -Bond | 0.00049283 | 0.00052862 | 0.00057217 | 0.0 | 0.03 -Neigh | 0.10693 | 0.11084 | 0.1158 | 1.0 | 5.30 -Comm | 0.95622 | 0.96088 | 0.96553 | 0.4 | 45.92 -Output | 0.00027302 | 0.00027645 | 0.00028114 | 0.0 | 0.01 -Modify | 0.2615 | 0.26289 | 0.2635 | 0.2 | 12.56 -Other | | 0.2156 | | | 10.30 +Pair | 0.5344 | 0.54263 | 0.54877 | 0.8 | 25.90 +Bond | 0.00049036 | 0.00055513 | 0.00061267 | 0.0 | 0.03 +Neigh | 0.10741 | 0.10898 | 0.11004 | 0.3 | 5.20 +Comm | 0.95869 | 0.96388 | 0.96936 | 0.4 | 46.01 +Output | 0.00025982 | 0.00026553 | 0.00026761 | 0.0 | 0.01 +Modify | 0.26091 | 0.26108 | 0.26137 | 0.0 | 12.46 +Other | | 0.2174 | | | 10.38 Nlocal: 216 ave 216 max 216 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -122,7 +135,7 @@ Ave special neighs/atom = 0 Neighbor list builds = 273 Dangerous builds = 0 -fix energies all ave/time 1 20000 20000 c_myKE c_myPE file ave.out +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out thermo 2000 run 35000 @@ -148,21 +161,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes 36000 9.6032778 -55.152202 0 -54.080942 321.61646 38000 9.8802995 -55.048407 0 -53.946245 351.82506 40000 10.372288 -55.087634 0 -53.93059 343.34304 -Loop time of 17.6209 on 4 procs for 35000 steps with 864 atoms +Loop time of 17.6294 on 4 procs for 35000 steps with 864 atoms -Performance: 17161.415 ns/day, 0.001 hours/ns, 1986.275 timesteps/s, 1.716 Matom-step/s -64.2% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 17153.172 ns/day, 0.001 hours/ns, 1985.321 timesteps/s, 1.715 Matom-step/s +63.7% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.0439 | 5.1029 | 5.1534 | 2.0 | 28.96 -Bond | 0.0031373 | 0.0034925 | 0.0038794 | 0.5 | 0.02 -Neigh | 0.84082 | 0.87558 | 0.91665 | 3.0 | 4.97 -Comm | 6.7337 | 6.7936 | 6.8487 | 1.6 | 38.55 -Output | 0.0044073 | 0.004559 | 0.0049773 | 0.4 | 0.03 -Modify | 3.3556 | 3.3647 | 3.3722 | 0.3 | 19.10 -Other | | 1.476 | | | 8.38 +Pair | 5.0222 | 5.1025 | 5.1759 | 2.5 | 28.94 +Bond | 0.0040066 | 0.0042899 | 0.0045178 | 0.3 | 0.02 +Neigh | 0.8511 | 0.85865 | 0.86632 | 0.6 | 4.87 +Comm | 6.7448 | 6.8089 | 6.8793 | 1.8 | 38.62 +Output | 0.0043966 | 0.0045518 | 0.0049846 | 0.4 | 0.03 +Modify | 3.364 | 3.3672 | 3.3717 | 0.2 | 19.10 +Other | | 1.483 | | | 8.41 Nlocal: 216 ave 222 max 210 min Histogram: 2 0 0 0 0 0 0 0 0 2 diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp index ea0e75c598..73ab2a852f 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -41,7 +41,6 @@ using namespace FixConst; enum { NOBIAS, BIAS }; enum { CONSTANT, EQUAL, ATOM }; - static const char cite_langevin_gjf[] = "Langevin GJ methods: doi:10.1080/00268976.2019.1662506\n\n" "@Article{gronbech-jensen_complete_2020,\n" @@ -52,7 +51,7 @@ static const char cite_langevin_gjf[] = "doi = {10.1080/00268976.2019.1662506},\n" "journal = {Molecular Physics},\n" "author = {Grønbech-Jensen, Niels},\n" - "year = {2020},\n" + "year = {2020}\n" "}\n\n"; static const char cite_langevin_gjf_7[] = @@ -63,7 +62,6 @@ static const char cite_langevin_gjf_7[] = "number = {18},\n" "url = {https://doi.org/10.1063/5.0066008},\n" "doi = {10.1063/5.0066008},\n" - "urldate = {2021-11-14},\n" "journal = {J. Chem. Phys.},\n" "author = {Finkelstein, Joshua and Cheng, Chungho and Fiorin, Giacomo and Seibold, Benjamin and Grønbech-Jensen, Niels},\n" "year = {2021},\n" @@ -78,12 +76,24 @@ static const char cite_langevin_gjf_8[] = "number = {10},\n" "url = {https://doi.org/10.1007/s10955-024-03345-1},\n" "doi = {10.1007/s10955-024-03345-1},\n" - "urldate = {2024-10-22},\n" "journal = {J. Stat. Phys.},\n" "author = {Gronbech-Jensen, Niels},\n" "year = {2024},\n" "pages = {137}\n" "}\n\n"; + +static const char cite_langevin_gjf_vhalf[] = + "Langevin GJ-I vhalf method: doi:10.1080/00268976.2019.1570369\n\n" + "@Article{jensen_accurate_2019,\n" + "title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems},\n" + "volume = {117},\n" + "url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1570369},\n" + "doi = {10.1080/00268976.2019.1570369},\n" + "number = {18},\n" + "journal = {Molecular Physics},\n" + "author = {Jensen, Lucas Frese Grønbech and Grønbech-Jensen, Niels},\n" + "year = {2019}\n" + "}\n\n"; /* ---------------------------------------------------------------------- */ @@ -155,6 +165,7 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR, "Illegal fix langevin/gjf command"); } + if (GJmethod == 1 && osflag == 0) if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_vhalf); // set temperature = nullptr, user can override via fix_modify if wants bias id_temp = nullptr; @@ -236,6 +247,11 @@ void FixLangevinGJF::init() error->all(FLERR, "Fix langevin/gjf and run style respa are not compatible"); } + if (temperature && temperature->tempbias) + tbiasflag = BIAS; + else + tbiasflag = NOBIAS; + // Complete set of thermostats is given in Gronbech-Jensen, Molecular Physics, 118 (2020) switch (GJmethod) { case 1: @@ -320,58 +336,95 @@ void FixLangevinGJF::initial_integrate(int /* vflag */) } compute_target(); + if (tbiasflag) temperature->compute_scalar(); - for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) { - - if (tstyle == ATOM) tsqrt = sqrt(tforce[i]); - if (rmass) { + if (rmass) { + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + if (tstyle == ATOM) tsqrt = sqrt(tforce[i]); m = rmass[i]; beta = tsqrt * sqrt(2.0*dt*m*boltz/t_period/mvv2e) / ftm2v; - } else { + + fran[0] = beta*random->gaussian(); + fran[1] = beta*random->gaussian(); + fran[2] = beta*random->gaussian(); + + // First integration delivers Eq. 24a and 24b: + dtfm = dtf / m; + v[i][0] += csq * dtfm * f[i][0]; + v[i][1] += csq * dtfm * f[i][1]; + v[i][2] += csq * dtfm * f[i][2]; + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; + + if (tbiasflag) temperature->remove_bias(i, v[i]); + + // Calculate Eq. 24c: + lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c3sqrt / (2.0 * m)) * fran[0]; + lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c3sqrt / (2.0 * m)) * fran[1]; + lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c3sqrt / (2.0 * m)) * fran[2]; + + // Calculate Eq. 24d + v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * csq * (0.5 / m) * fran[0]; + v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * csq * (0.5 / m) * fran[1]; + v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * csq * (0.5 / m) * fran[2]; + + if (tbiasflag) temperature->restore_bias(i, v[i]); + if (tbiasflag) temperature->restore_bias(i, lv[i]); + + // Calculate Eq. 24e. Final integrator then calculates Eq. 24f after force update. + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; + } + } + } else { + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + if (tstyle == ATOM) tsqrt = sqrt(tforce[i]); m = mass[type[i]]; beta = tsqrt * sqrt(2.0*dt*m*boltz/t_period/mvv2e) / ftm2v; + + fran[0] = beta*random->gaussian(); + fran[1] = beta*random->gaussian(); + fran[2] = beta*random->gaussian(); + + // First integration delivers Eq. 24a and 24b: + dtfm = dtf / m; + v[i][0] += csq * dtfm * f[i][0]; + v[i][1] += csq * dtfm * f[i][1]; + v[i][2] += csq * dtfm * f[i][2]; + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; + + if (tbiasflag) temperature->remove_bias(i, v[i]); + + // Calculate Eq. 24c: + lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c3sqrt / (2.0 * m)) * fran[0]; + lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c3sqrt / (2.0 * m)) * fran[1]; + lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c3sqrt / (2.0 * m)) * fran[2]; + + // Calculate Eq. 24d + v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * csq * (0.5 / m) * fran[0]; + v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * csq * (0.5 / m) * fran[1]; + v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * csq * (0.5 / m) * fran[2]; + + if (tbiasflag) temperature->restore_bias(i, v[i]); + if (tbiasflag) temperature->restore_bias(i, lv[i]); + + // Calculate Eq. 24e. Final integrator then calculates Eq. 24f after force update. + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; } - - fran[0] = beta*random->gaussian(); - fran[1] = beta*random->gaussian(); - fran[2] = beta*random->gaussian(); - - // First integration delivers Eq. 24a and 24b: - dtfm = dtf / m; - v[i][0] += csq * dtfm * f[i][0]; - v[i][1] += csq * dtfm * f[i][1]; - v[i][2] += csq * dtfm * f[i][2]; - x[i][0] += 0.5 * csq * dt * v[i][0]; - x[i][1] += 0.5 * csq * dt * v[i][1]; - x[i][2] += 0.5 * csq * dt * v[i][2]; - - // Calculate Eq. 24c: - lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c3sqrt / (2.0 * m)) * fran[0]; - lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c3sqrt / (2.0 * m)) * fran[1]; - lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c3sqrt / (2.0 * m)) * fran[2]; - - // Calculate Eq. 24d - v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * csq * (0.5 / m) * fran[0]; - v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * csq * (0.5 / m) * fran[1]; - v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * csq * (0.5 / m) * fran[2]; - - // Calculate Eq. 24e. Final integrator then calculates Eq. 24f after force update. - x[i][0] += 0.5 * csq * dt * v[i][0]; - x[i][1] += 0.5 * csq * dt * v[i][1]; - x[i][2] += 0.5 * csq * dt * v[i][2]; } } } void FixLangevinGJF::final_integrate() { - double dtfm; - double dt = update->dt; - double ftm2v = force->ftm2v; - double dtf = 0.5 * dt * ftm2v; - double csq = sqrt(gjfc3 / gjfc1); - double **v = atom->v; double **f = atom->f; double *rmass = atom->rmass; @@ -381,6 +434,10 @@ void FixLangevinGJF::final_integrate() int nlocal = atom->nlocal; if (igroup == atom->firstgroup) nlocal = atom->nfirst; + double dtfm; + double dtf = 0.5 * update->dt * force->ftm2v; + double csq = sqrt(gjfc3 / gjfc1); + // Calculate Eq. 24f. if (rmass) { for (int i = 0; i < nlocal; i++) diff --git a/src/EXTRA-FIX/fix_langevin_gjf.h b/src/EXTRA-FIX/fix_langevin_gjf.h index 4b65051cf5..45ccf4cbe2 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.h +++ b/src/EXTRA-FIX/fix_langevin_gjf.h @@ -44,7 +44,7 @@ class FixLangevinGJF : public Fix { int unpack_exchange(int, double *) override; protected: - int osflag, GJmethod, maxatom, lv_allocated; + int osflag, tbiasflag, GJmethod, maxatom, lv_allocated; double t_start, t_stop, t_period, t_target, tsqrt; double gjfc1, gjfc2, gjfc3; int tstyle, tvar; From ad086f26a5c9028058915fedb53f3c3c076a7adf Mon Sep 17 00:00:00 2001 From: Navraj Lalli Date: Thu, 24 Apr 2025 10:42:42 +0100 Subject: [PATCH 47/94] Update version added --- doc/src/fix_qeq_rel_reaxff.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_qeq_rel_reaxff.rst b/doc/src/fix_qeq_rel_reaxff.rst index 012980e230..331fa8b489 100644 --- a/doc/src/fix_qeq_rel_reaxff.rst +++ b/doc/src/fix_qeq_rel_reaxff.rst @@ -37,7 +37,6 @@ Examples Description """"""""""" -.. versionadded:: 19Nov2024 This fix implements the QEqR method for charge equilibration, which differs from the QEq charge equilibration method :ref:`(Rappe and @@ -45,6 +44,7 @@ Goddard) ` only in how external electric fields are accounted for. This fix therefore raises a warning when used without :doc:`fix efield ` since :doc:`fix qeq/reaxff ` should be used without an external electric field. Charges are computed with +.. versionadded:: 2Apr2025 the QEqR method by minimizing the electrostatic energy of the system in the same way as the QEq method but where the absolute electronegativity, :math:`\chi_i`, of each atom in the QEq method is replaced with an From 11f6b3483bfe4f958c6568830bc09f8c705c1592 Mon Sep 17 00:00:00 2001 From: talinke Date: Mon, 28 Apr 2025 13:02:47 -0700 Subject: [PATCH 48/94] Updated documentation, updated log files --- doc/src/fix_langevin_gjf.rst | 66 +++++++++++++------------ examples/gjf/log.2Apr25.gjf.vfull.g++.1 | 58 +++++++++++++--------- examples/gjf/log.2Apr25.gjf.vfull.g++.4 | 56 +++++++++++++-------- src/EXTRA-FIX/fix_langevin_gjf.cpp | 16 +++++- 4 files changed, 120 insertions(+), 76 deletions(-) diff --git a/doc/src/fix_langevin_gjf.rst b/doc/src/fix_langevin_gjf.rst index a1fcea9c9a..623c1e4d59 100644 --- a/doc/src/fix_langevin_gjf.rst +++ b/doc/src/fix_langevin_gjf.rst @@ -26,6 +26,7 @@ Syntax *vhalf* = use half-step velocity *method* value = *1-8* *1-8* = choose one of the many GJ formulations + *7* = requires input of additional scalar between 0 and 1 Examples """""""" @@ -34,32 +35,34 @@ Examples fix 3 boundary langevin/gjf 10.0 10.0 1.0 699483 fix 1 all langevin/gjf 10.0 100.0 100.0 48279 vel vfull method 4 + fix 2 all langevin/gjf 10.0 10.0 1.0 26488 method 7 0.95 Description """"""""""" -Apply a Langevin thermostat as described in :ref:`(Gronbech-Jensen-2024) ` +Apply a Langevin thermostat as described in :ref:`(Gronbech-Jensen-2020) ` to a group of atoms which models an interaction with a background -implicit solvent. As described in the papers cited below, the purpose of this method is to -enable longer timesteps to be used (up to the numerical stability -limit of the integrator), while still producing the correct Boltzmann -distribution of atom positions. +implicit solvent. As described in the papers cited below, the GJ methods +provide exact diffusion, drift, and Boltzmann sampling for linear systems for +any time step within the stability limit. The purpose of this set of methods +is therefore to significantly improve statistical accuracy at longer time steps +compared to other thermostats. The current implementation provides the user with the option to output -the velocity in one of two forms: *vfull* or *vhalf*. The option *vfull* outputs the -on-site velocity given in :ref:`Gronbech-Jensen/Farago +the velocity in one of two forms: *vfull* or *vhalf*. The option *vhalf* +outputs the 2GJ half-step velocity given in :ref:`Gronbech Jensen/Gronbech-Jensen +`; for linear systems, this velocity is shown to not +have any statistical errors for any stable time step. The option *vfull* +outputs the on-site velocity given in :ref:`Gronbech-Jensen/Farago `; this velocity is shown to be systematically lower than the target temperature by a small amount, which grows -quadratically with the timestep. The option *vhalf* outputs the -2GJ half-step velocity given in :ref:`Gronbech Jensen/Gronbech-Jensen -`; for linear systems, this velocity is shown to not -have any statistical errors for any stable time step. An overview of -statistically correct Boltzmann and Maxwell-Boltzmann sampling of true -on-site and true half-step velocities is given in -:ref:`Gronbech-Jensen-2020 `. +quadratically with the timestep. An overview of statistically correct Boltzmann +and Maxwell-Boltzmann sampling of true on-site and true half-step velocities is +given in :ref:`Gronbech-Jensen-2020 `. -This fix allows the use of any of the GJ methods as listed in :ref:`Gronbech-Jensen-2020 `. -The GJ-VII method is described in :ref:`Finkelstein `. +This fix allows the use of several GJ methods as listed in :ref:`Gronbech-Jensen-2020 `. +The GJ-VII method is described in :ref:`Finkelstein ` and GJ-VIII +is described in :ref:`Gronbech-Jensen-2024 `. The implementation follows the splitting form provided in Eqs. (24) and (25) in :ref:`Gronbech-Jensen-2024 `, including the application of Gaussian noise values, per the description in @@ -129,13 +132,11 @@ different numbers of processors. The keyword/value option pairs are used in the following ways. -The keyword *vel* determine which velocity is used to determine +The keyword *vel* determines which velocity is used to determine quantities of interest in the simulation. The keyword *method* selects one of the eight GJ-methods implemented in LAMMPS. -*Insert brief explanation for each method* - ---------- Restart, fix_modify, output, run start/stop, minimize info @@ -146,9 +147,10 @@ Because the state of the random number generator is not saved in restart files, this means you cannot do "exact" restarts with this fix, where the simulation continues on the same as if no restart had taken place. However, in a statistical sense, a restarted simulation should produce the same behavior. -The "exact" restart is done with either vfull or vhalf velocity output for as -long as the choice of vfull/vhalf is the same for the simulation as it is in -the restart file. +additionally, the GJ methods implement noise exclusively within each time step +(unlike the BBK thermostat of the fix-langevin). The restart is done with +either vfull or vhalf velocity output for as long as the choice of vfull/vhalf +is the same for the simulation as it is in the restart file. The :doc:`fix_modify ` *temp* option is supported by this fix. You can use it to assign a temperature :doc:`compute ` @@ -165,7 +167,8 @@ This fix is not invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is not compatible with run_style respa. +This fix is not compatible with run_style respa. It is not compatible with +accelerated packages such as KOKKOS. Related commands """""""""""""""" @@ -179,27 +182,26 @@ The option defaults are vel = vhalf, method = 1. ---------- -.. _Gronbech-Jensen-2024: +.. _Gronbech-Jensen-2020: -**(Gronbech-Jensen-2024)** Gronbech-Jensen, J. Stat. Phys. 191, 137 (2024). - -.. _Gronbech-Jensen-Farago: - -**(Gronbech-Jensen/Farago)** Gronbech-Jensen and Farago, Mol Phys, 111, 983 -(2013). +**(Gronbech-Jensen-2020)** Gronbech-Jensen, Mol Phys 118, e1662506 (2020). .. _Gronbech-Jensen-2019: **(Gronbech Jensen/Gronbech-Jensen)** Gronbech Jensen and Gronbech-Jensen, Mol Phys, 117, 2511 (2019) -.. _Gronbech-Jensen-2020: +.. _Gronbech-Jensen-Farago: -**(Gronbech-Jensen-2020)** Gronbech-Jensen, Mol Phys 118, e1662506 (2020). +**(Gronbech-Jensen/Farago)** Gronbech-Jensen and Farago, Mol Phys, 111, 983 (2013). .. _Finkelstein: **(Finkelstein)** Finkelstein, Cheng, Florin, Seibold, Gronbech-Jensen, J. Chem. Phys., 155, 18 (2021) +.. _Gronbech-Jensen-2024: + +**(Gronbech-Jensen-2024)** Gronbech-Jensen, J. Stat. Phys. 191, 137 (2024). + .. _Gronbech-Jensen-2023: **(Gronbech-Jensen-2023)** Gronbech-Jensen, J. Stat. Phys. 190, 96 (2023). diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 index 3bb204704b..f85c13672d 100644 --- a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - e4c3b0c05e-modified) +LAMMPS (2 Apr 2025 - Development - 648cd3f0c6-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -21,7 +21,7 @@ Finding 1-2 1-3 1-4 neighbors ... 0 = max # of 1-4 neighbors 1 = max # of special neighbors special bonds CPU = 0.000 seconds - read_data CPU = 0.007 seconds + read_data CPU = 0.009 seconds include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -74,6 +74,20 @@ author = {Grønbech-Jensen, Niels}, year = {2020} } +- Langevin GJ-I vfull method: doi:10.1080/00268976.2012.760055 + +@Article{gronbech-jensen_simple_2013, +title = {A simple and effective Verlet-type algorithm for simulating Langevin dynamics}, +volume = {111}, +url = {http://www.tandfonline.com/doi/abs/10.1080/00268976.2012.760055}, +doi = {10.1080/00268976.2012.760055}, +pages = {983-991}, +number = {8}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels and Farago, Oded}, +year = {2013} +} + CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule @@ -93,21 +107,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 5000 8.4535562 -55.150518 0 -54.207511 318.20862 -Loop time of 2.32365 on 1 procs for 5000 steps with 864 atoms +Loop time of 2.27448 on 1 procs for 5000 steps with 864 atoms -Performance: 18591.401 ns/day, 0.001 hours/ns, 2151.782 timesteps/s, 1.859 Matom-step/s -99.9% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 18993.378 ns/day, 0.001 hours/ns, 2198.308 timesteps/s, 1.899 Matom-step/s +100.0% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.3067 | 1.3067 | 1.3067 | 0.0 | 56.23 -Bond | 0.00027472 | 0.00027472 | 0.00027472 | 0.0 | 0.01 -Neigh | 0.28218 | 0.28218 | 0.28218 | 0.0 | 12.14 -Comm | 0.057388 | 0.057388 | 0.057388 | 0.0 | 2.47 -Output | 5.6019e-05 | 5.6019e-05 | 5.6019e-05 | 0.0 | 0.00 -Modify | 0.65159 | 0.65159 | 0.65159 | 0.0 | 28.04 -Other | | 0.02549 | | | 1.10 +Pair | 1.2877 | 1.2877 | 1.2877 | 0.0 | 56.61 +Bond | 0.00049357 | 0.00049357 | 0.00049357 | 0.0 | 0.02 +Neigh | 0.28068 | 0.28068 | 0.28068 | 0.0 | 12.34 +Comm | 0.055813 | 0.055813 | 0.055813 | 0.0 | 2.45 +Output | 5.5144e-05 | 5.5144e-05 | 5.5144e-05 | 0.0 | 0.00 +Modify | 0.62478 | 0.62478 | 0.62478 | 0.0 | 27.47 +Other | | 0.02499 | | | 1.10 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -148,21 +162,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes 36000 8.3048574 -55.079475 0 -54.153056 338.04291 38000 8.8708544 -55.108991 0 -54.119434 330.70097 40000 8.4012779 -55.080817 0 -54.143642 338.54326 -Loop time of 19.3834 on 1 procs for 35000 steps with 864 atoms +Loop time of 19.0379 on 1 procs for 35000 steps with 864 atoms -Performance: 15601.000 ns/day, 0.002 hours/ns, 1805.671 timesteps/s, 1.560 Matom-step/s -99.9% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 15884.146 ns/day, 0.002 hours/ns, 1838.443 timesteps/s, 1.588 Matom-step/s +100.0% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 11.828 | 11.828 | 11.828 | 0.0 | 61.02 -Bond | 0.0024424 | 0.0024424 | 0.0024424 | 0.0 | 0.01 -Neigh | 2.3519 | 2.3519 | 2.3519 | 0.0 | 12.13 -Comm | 0.42251 | 0.42251 | 0.42251 | 0.0 | 2.18 -Output | 0.00056686 | 0.00056686 | 0.00056686 | 0.0 | 0.00 -Modify | 4.5987 | 4.5987 | 4.5987 | 0.0 | 23.73 -Other | | 0.1793 | | | 0.93 +Pair | 11.641 | 11.641 | 11.641 | 0.0 | 61.14 +Bond | 0.003055 | 0.003055 | 0.003055 | 0.0 | 0.02 +Neigh | 2.3613 | 2.3613 | 2.3613 | 0.0 | 12.40 +Comm | 0.41299 | 0.41299 | 0.41299 | 0.0 | 2.17 +Output | 0.00055686 | 0.00055686 | 0.00055686 | 0.0 | 0.00 +Modify | 4.442 | 4.442 | 4.442 | 0.0 | 23.33 +Other | | 0.1775 | | | 0.93 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 index 4c6fe82e54..12bc5ca3b2 100644 --- a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - e4c3b0c05e-modified) +LAMMPS (2 Apr 2025 - Development - 648cd3f0c6-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -74,6 +74,20 @@ author = {Grønbech-Jensen, Niels}, year = {2020} } +- Langevin GJ-I vfull method: doi:10.1080/00268976.2012.760055 + +@Article{gronbech-jensen_simple_2013, +title = {A simple and effective Verlet-type algorithm for simulating Langevin dynamics}, +volume = {111}, +url = {http://www.tandfonline.com/doi/abs/10.1080/00268976.2012.760055}, +doi = {10.1080/00268976.2012.760055}, +pages = {983-991}, +number = {8}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels and Farago, Oded}, +year = {2013} +} + CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule @@ -93,21 +107,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 5000 7.946377 -55.076514 0 -54.190084 337.31999 -Loop time of 2.0791 on 4 procs for 5000 steps with 864 atoms +Loop time of 2.10015 on 4 procs for 5000 steps with 864 atoms -Performance: 20778.210 ns/day, 0.001 hours/ns, 2404.885 timesteps/s, 2.078 Matom-step/s -64.9% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 20570.001 ns/day, 0.001 hours/ns, 2380.787 timesteps/s, 2.057 Matom-step/s +64.0% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.52985 | 0.53809 | 0.54586 | 0.8 | 25.88 -Bond | 0.00054599 | 0.00057676 | 0.00061668 | 0.0 | 0.03 -Neigh | 0.10872 | 0.10965 | 0.11044 | 0.2 | 5.27 -Comm | 0.95581 | 0.96284 | 0.97025 | 0.5 | 46.31 -Output | 0.00027472 | 0.00028374 | 0.00029435 | 0.0 | 0.01 -Modify | 0.25077 | 0.25198 | 0.2529 | 0.2 | 12.12 -Other | | 0.2157 | | | 10.37 +Pair | 0.54244 | 0.54516 | 0.54794 | 0.3 | 25.96 +Bond | 0.00056978 | 0.00065706 | 0.00071013 | 0.0 | 0.03 +Neigh | 0.10885 | 0.11 | 0.11178 | 0.4 | 5.24 +Comm | 0.96848 | 0.97341 | 0.97775 | 0.3 | 46.35 +Output | 0.00028754 | 0.00029437 | 0.00030094 | 0.0 | 0.01 +Modify | 0.25125 | 0.25293 | 0.25477 | 0.3 | 12.04 +Other | | 0.2177 | | | 10.37 Nlocal: 216 ave 216 max 216 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -148,21 +162,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes 36000 8.0936615 -55.152202 0 -54.249342 316.20169 38000 7.999652 -55.048407 0 -54.156034 345.07945 40000 8.6699753 -55.087634 0 -54.120485 337.23709 -Loop time of 17.5212 on 4 procs for 35000 steps with 864 atoms +Loop time of 17.6531 on 4 procs for 35000 steps with 864 atoms -Performance: 17259.111 ns/day, 0.001 hours/ns, 1997.582 timesteps/s, 1.726 Matom-step/s -63.6% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 17130.136 ns/day, 0.001 hours/ns, 1982.655 timesteps/s, 1.713 Matom-step/s +63.9% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 4.9924 | 5.0801 | 5.1446 | 2.4 | 28.99 -Bond | 0.0041975 | 0.0044234 | 0.0046863 | 0.3 | 0.03 -Neigh | 0.85805 | 0.86369 | 0.87021 | 0.5 | 4.93 -Comm | 6.7339 | 6.8008 | 6.8891 | 2.1 | 38.81 -Output | 0.0044786 | 0.0046306 | 0.0050572 | 0.4 | 0.03 -Modify | 3.2849 | 3.2919 | 3.2981 | 0.3 | 18.79 -Other | | 1.476 | | | 8.42 +Pair | 5.0485 | 5.078 | 5.11 | 1.0 | 28.77 +Bond | 0.0038244 | 0.0043855 | 0.0047706 | 0.6 | 0.02 +Neigh | 0.8487 | 0.86408 | 0.87685 | 1.1 | 4.89 +Comm | 6.8368 | 6.8833 | 6.9317 | 1.4 | 38.99 +Output | 0.004493 | 0.0045296 | 0.0045945 | 0.1 | 0.03 +Modify | 3.3123 | 3.3253 | 3.3366 | 0.5 | 18.84 +Other | | 1.494 | | | 8.46 Nlocal: 216 ave 222 max 210 min Histogram: 2 0 0 0 0 0 0 0 0 2 diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp index 73ab2a852f..b1637ff54c 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -94,7 +94,20 @@ static const char cite_langevin_gjf_vhalf[] = "author = {Jensen, Lucas Frese Grønbech and Grønbech-Jensen, Niels},\n" "year = {2019}\n" "}\n\n"; - + +static const char cite_langevin_gjf_vfull[] = + "Langevin GJ-I vfull method: doi:10.1080/00268976.2012.760055\n\n" + "@Article{gronbech-jensen_simple_2013,\n" + "title = {A simple and effective Verlet-type algorithm for simulating Langevin dynamics},\n" + "volume = {111},\n" + "url = {http://www.tandfonline.com/doi/abs/10.1080/00268976.2012.760055},\n" + "doi = {10.1080/00268976.2012.760055},\n" + "pages = {983-991},\n" + "number = {8},\n" + "journal = {Molecular Physics},\n" + "author = {Grønbech-Jensen, Niels and Farago, Oded},\n" + "year = {2013}\n" + "}\n\n"; /* ---------------------------------------------------------------------- */ @@ -166,6 +179,7 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Illegal fix langevin/gjf command"); } if (GJmethod == 1 && osflag == 0) if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_vhalf); + if (GJmethod == 1 && osflag == 1) if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_vfull); // set temperature = nullptr, user can override via fix_modify if wants bias id_temp = nullptr; From fc0788f61c8bdb513c5e3b2e705135fed5564af1 Mon Sep 17 00:00:00 2001 From: talinke Date: Mon, 28 Apr 2025 13:18:33 -0700 Subject: [PATCH 49/94] Styling --- doc/src/fix_langevin_gjf.rst | 24 ++++++++++++------------ src/EXTRA-FIX/fix_langevin_gjf.cpp | 30 +++++++++++++++--------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/doc/src/fix_langevin_gjf.rst b/doc/src/fix_langevin_gjf.rst index 623c1e4d59..1dd9178505 100644 --- a/doc/src/fix_langevin_gjf.rst +++ b/doc/src/fix_langevin_gjf.rst @@ -42,26 +42,26 @@ Description Apply a Langevin thermostat as described in :ref:`(Gronbech-Jensen-2020) ` to a group of atoms which models an interaction with a background -implicit solvent. As described in the papers cited below, the GJ methods -provide exact diffusion, drift, and Boltzmann sampling for linear systems for -any time step within the stability limit. The purpose of this set of methods -is therefore to significantly improve statistical accuracy at longer time steps +implicit solvent. As described in the papers cited below, the GJ methods +provide exact diffusion, drift, and Boltzmann sampling for linear systems for +any time step within the stability limit. The purpose of this set of methods +is therefore to significantly improve statistical accuracy at longer time steps compared to other thermostats. The current implementation provides the user with the option to output -the velocity in one of two forms: *vfull* or *vhalf*. The option *vhalf* +the velocity in one of two forms: *vfull* or *vhalf*. The option *vhalf* outputs the 2GJ half-step velocity given in :ref:`Gronbech Jensen/Gronbech-Jensen `; for linear systems, this velocity is shown to not -have any statistical errors for any stable time step. The option *vfull* +have any statistical errors for any stable time step. The option *vfull* outputs the on-site velocity given in :ref:`Gronbech-Jensen/Farago `; this velocity is shown to be systematically lower than the target temperature by a small amount, which grows -quadratically with the timestep. An overview of statistically correct Boltzmann -and Maxwell-Boltzmann sampling of true on-site and true half-step velocities is +quadratically with the timestep. An overview of statistically correct Boltzmann +and Maxwell-Boltzmann sampling of true on-site and true half-step velocities is given in :ref:`Gronbech-Jensen-2020 `. This fix allows the use of several GJ methods as listed in :ref:`Gronbech-Jensen-2020 `. -The GJ-VII method is described in :ref:`Finkelstein ` and GJ-VIII +The GJ-VII method is described in :ref:`Finkelstein ` and GJ-VIII is described in :ref:`Gronbech-Jensen-2024 `. The implementation follows the splitting form provided in Eqs. (24) and (25) in :ref:`Gronbech-Jensen-2024 `, including the application @@ -147,8 +147,8 @@ Because the state of the random number generator is not saved in restart files, this means you cannot do "exact" restarts with this fix, where the simulation continues on the same as if no restart had taken place. However, in a statistical sense, a restarted simulation should produce the same behavior. -additionally, the GJ methods implement noise exclusively within each time step -(unlike the BBK thermostat of the fix-langevin). The restart is done with +Additionally, the GJ methods implement noise exclusively within each time step +(unlike the BBK thermostat of the fix-langevin). The restart is done with either vfull or vhalf velocity output for as long as the choice of vfull/vhalf is the same for the simulation as it is in the restart file. @@ -167,7 +167,7 @@ This fix is not invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is not compatible with run_style respa. It is not compatible with +This fix is not compatible with run_style respa. It is not compatible with accelerated packages such as KOKKOS. Related commands diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_langevin_gjf.cpp index b1637ff54c..cf9a8bb8cd 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_langevin_gjf.cpp @@ -44,14 +44,14 @@ enum { CONSTANT, EQUAL, ATOM }; static const char cite_langevin_gjf[] = "Langevin GJ methods: doi:10.1080/00268976.2019.1662506\n\n" "@Article{gronbech-jensen_complete_2020,\n" - "title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations},\n" - "volume = {118},\n" + "title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations},\n" + "volume = {118},\n" "number = {8},\n" - "url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506},\n" - "doi = {10.1080/00268976.2019.1662506},\n" - "journal = {Molecular Physics},\n" - "author = {Grønbech-Jensen, Niels},\n" - "year = {2020}\n" + "url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506},\n" + "doi = {10.1080/00268976.2019.1662506},\n" + "journal = {Molecular Physics},\n" + "author = {Grønbech-Jensen, Niels},\n" + "year = {2020}\n" "}\n\n"; static const char cite_langevin_gjf_7[] = @@ -85,14 +85,14 @@ static const char cite_langevin_gjf_8[] = static const char cite_langevin_gjf_vhalf[] = "Langevin GJ-I vhalf method: doi:10.1080/00268976.2019.1570369\n\n" "@Article{jensen_accurate_2019,\n" - "title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems},\n" - "volume = {117},\n" - "url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1570369},\n" - "doi = {10.1080/00268976.2019.1570369},\n" - "number = {18},\n" - "journal = {Molecular Physics},\n" - "author = {Jensen, Lucas Frese Grønbech and Grønbech-Jensen, Niels},\n" - "year = {2019}\n" + "title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems},\n" + "volume = {117},\n" + "url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1570369},\n" + "doi = {10.1080/00268976.2019.1570369},\n" + "number = {18},\n" + "journal = {Molecular Physics},\n" + "author = {Jensen, Lucas Frese Grønbech and Grønbech-Jensen, Niels},\n" + "year = {2019}\n" "}\n\n"; static const char cite_langevin_gjf_vfull[] = From 4a3c08576f0c6f1929c8849600d0b2df3894c362 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 28 Apr 2025 22:19:14 -0400 Subject: [PATCH 50/94] small formal updates --- doc/src/Howto_thermostat.rst | 8 ++++++-- src/.gitignore | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/src/Howto_thermostat.rst b/doc/src/Howto_thermostat.rst index 6719abfc82..812b56cf21 100644 --- a/doc/src/Howto_thermostat.rst +++ b/doc/src/Howto_thermostat.rst @@ -21,10 +21,14 @@ can be invoked via the *dpd/tstat* pair style: * :doc:`fix nvt/sllod ` * :doc:`fix temp/berendsen ` * :doc:`fix temp/csvr ` +* :doc:`fix ffl ` +* :doc:`fix gld ` +* :doc:`fix gle ` * :doc:`fix langevin ` * :doc:`fix langevin/gjf ` * :doc:`fix temp/rescale ` * :doc:`pair_style dpd/tstat ` +* :doc:`pair_style dpd/ext/tstat ` :doc:`Fix nvt ` only thermostats the translational velocity of particles. :doc:`Fix nvt/sllod ` also does this, @@ -83,10 +87,10 @@ that: .. note:: - Only the nvt and langevin/gjf fixes perform time integration, meaning they update + Not all thermostat fixes perform time integration, meaning they update the velocities and positions of particles due to forces and velocities respectively. The other thermostat fixes only adjust velocities; they - do NOT perform time integration updates. Thus they should be used in + do NOT perform time integration updates. Thus, they should be used in conjunction with a constant NVE integration fix such as these: * :doc:`fix nve ` diff --git a/src/.gitignore b/src/.gitignore index a25a884a8a..9feb76ddc9 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -879,6 +879,8 @@ /fix_gld.h /fix_gle.cpp /fix_gle.h +/fix_langevin_gjf.cpp +/fix_langevin_gjf.h /fix_gpu.cpp /fix_gpu.h /fix_grem.cpp From 2927b08792cce403c6d8fac0c185fbd4ca7ca8c0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 26 Apr 2025 02:17:54 -0400 Subject: [PATCH 51/94] correct reference --- doc/src/pair_lj_pirani.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/pair_lj_pirani.rst b/doc/src/pair_lj_pirani.rst index c7f2703c01..822d277a1b 100644 --- a/doc/src/pair_lj_pirani.rst +++ b/doc/src/pair_lj_pirani.rst @@ -74,7 +74,7 @@ electrostatic interactions. If these are desired, this pair style should be used along with a Coulomb pair style like :doc:`pair styles coul/cut or coul/long ` by using :doc:`pair style hybrid/overlay ` and a suitable -kspace style :doc:``, if needed. +:doc:`kspace style `, if needed. As discussed in :ref:`(Pirani) `, analysis of a variety of systems showed that :math:`\alpha= 4` generally works very well. In From d4867ab55e426de7dd000df557c859935d362f73 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 28 Apr 2025 22:22:47 -0400 Subject: [PATCH 52/94] add false positives --- doc/utils/sphinx-config/false_positives.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index cf90ce802d..ef27b28a66 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1197,6 +1197,7 @@ filesystem filesystems Fily Fincham +Finkelstein Fint fingerprintconstants fingerprintsperelement @@ -1351,6 +1352,7 @@ Gillan Gingold Gissinger github +GJ gjf gjwagne gl @@ -3463,6 +3465,7 @@ sectoring sed Seddon segmental +Seibold Seifert Seleson sellerio @@ -4082,9 +4085,11 @@ versa Verstraelen ves vf +vfull vflag vflow vfrac +vhalf vhi vibrational Vij From 332006923d2c65a45f04803ab71988416e964cca Mon Sep 17 00:00:00 2001 From: talinke Date: Tue, 29 Apr 2025 12:00:06 -0700 Subject: [PATCH 53/94] Name change: langevin/gjf to gjf --- doc/src/Commands_fix.rst | 2 +- doc/src/Howto_thermostat.rst | 2 +- doc/src/fix.rst | 2 +- doc/src/{fix_langevin_gjf.rst => fix_gjf.rst} | 14 +-- examples/gjf/README | 4 +- examples/gjf/in.gjf.vfull | 2 +- examples/gjf/in.gjf.vhalf | 2 +- examples/gjf/log.2Apr25.gjf.vfull.g++.1 | 50 ++++---- examples/gjf/log.2Apr25.gjf.vfull.g++.4 | 50 ++++---- examples/gjf/log.2Apr25.gjf.vhalf.g++.1 | 48 ++++---- examples/gjf/log.2Apr25.gjf.vhalf.g++.4 | 50 ++++---- src/.gitignore | 4 +- .../{fix_langevin_gjf.cpp => fix_gjf.cpp} | 108 +++++++++--------- .../{fix_langevin_gjf.h => fix_gjf.h} | 12 +- 14 files changed, 175 insertions(+), 175 deletions(-) rename doc/src/{fix_langevin_gjf.rst => fix_gjf.rst} (95%) rename src/EXTRA-FIX/{fix_langevin_gjf.cpp => fix_gjf.cpp} (86%) rename src/EXTRA-FIX/{fix_langevin_gjf.h => fix_gjf.h} (88%) diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index 58397d7c7e..e80f01b87a 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -77,6 +77,7 @@ OPT. * :doc:`flow/gauss ` * :doc:`freeze (k) ` * :doc:`gcmc ` + * :doc:`gjf ` * :doc:`gld ` * :doc:`gle ` * :doc:`gravity (ko) ` @@ -92,7 +93,6 @@ OPT. * :doc:`langevin (k) ` * :doc:`langevin/drude ` * :doc:`langevin/eff ` - * :doc:`langevin/gjf ` * :doc:`langevin/spin ` * :doc:`lb/fluid ` * :doc:`lb/momentum ` diff --git a/doc/src/Howto_thermostat.rst b/doc/src/Howto_thermostat.rst index 812b56cf21..bda3bc6cb4 100644 --- a/doc/src/Howto_thermostat.rst +++ b/doc/src/Howto_thermostat.rst @@ -22,10 +22,10 @@ can be invoked via the *dpd/tstat* pair style: * :doc:`fix temp/berendsen ` * :doc:`fix temp/csvr ` * :doc:`fix ffl ` +* :doc:`fix gjf ` * :doc:`fix gld ` * :doc:`fix gle ` * :doc:`fix langevin ` -* :doc:`fix langevin/gjf ` * :doc:`fix temp/rescale ` * :doc:`pair_style dpd/tstat ` * :doc:`pair_style dpd/ext/tstat ` diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 13a6ad166d..cdc0e786ce 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -256,6 +256,7 @@ accelerated styles exist. * :doc:`flow/gauss ` - Gaussian dynamics for constant mass flux * :doc:`freeze ` - freeze atoms in a granular simulation * :doc:`gcmc ` - grand canonical insertions/deletions +* :doc:`gjf ` - statistically correct Langevin temperature control using the GJ methods * :doc:`gld ` - generalized Langevin dynamics integrator * :doc:`gle ` - generalized Langevin equation thermostat * :doc:`gravity ` - add gravity to atoms in a granular simulation @@ -271,7 +272,6 @@ accelerated styles exist. * :doc:`langevin ` - Langevin temperature control * :doc:`langevin/drude ` - Langevin temperature control of Drude oscillators * :doc:`langevin/eff ` - Langevin temperature control for the electron force field model -* :doc:`langevin/gjf ` - statistically correct Langevin temperature control using the GJ methods * :doc:`langevin/spin ` - Langevin temperature control for a spin or spin-lattice system * :doc:`lb/fluid ` - lattice-Boltzmann fluid on a uniform mesh * :doc:`lb/momentum ` - :doc:`fix momentum ` replacement for use with a lattice-Boltzmann fluid diff --git a/doc/src/fix_langevin_gjf.rst b/doc/src/fix_gjf.rst similarity index 95% rename from doc/src/fix_langevin_gjf.rst rename to doc/src/fix_gjf.rst index 1dd9178505..f55a811ab7 100644 --- a/doc/src/fix_langevin_gjf.rst +++ b/doc/src/fix_gjf.rst @@ -1,6 +1,6 @@ -.. index:: fix langevin/gjf +.. index:: fix gjf -fix langevin/gjf command +fix gjf command ======================== Syntax @@ -8,10 +8,10 @@ Syntax .. code-block:: LAMMPS - fix ID group-ID langevin/gjf Tstart Tstop damp seed keyword values ... + fix ID group-ID gjf Tstart Tstop damp seed keyword values ... * ID, group-ID are documented in :doc:`fix ` command -* langevin/gjf = style name of this fix command +* gjf = style name of this fix command * Tstart,Tstop = desired temperature at start/end of run (temperature units) * Tstart can be a variable (see below) * damp = damping parameter (time units) @@ -33,9 +33,9 @@ Examples .. code-block:: LAMMPS - fix 3 boundary langevin/gjf 10.0 10.0 1.0 699483 - fix 1 all langevin/gjf 10.0 100.0 100.0 48279 vel vfull method 4 - fix 2 all langevin/gjf 10.0 10.0 1.0 26488 method 7 0.95 + fix 3 boundary gjf 10.0 10.0 1.0 699483 + fix 1 all gjf 10.0 100.0 100.0 48279 vel vfull method 4 + fix 2 all gjf 10.0 10.0 1.0 26488 method 7 0.95 Description """"""""""" diff --git a/examples/gjf/README b/examples/gjf/README index 34b60292bb..f7c955080f 100644 --- a/examples/gjf/README +++ b/examples/gjf/README @@ -36,9 +36,9 @@ KINETIC ENERGY (eV) Script Commands: -- -fix lang all langevin/gjf 10 10 1 26488 +fix lang all gjf 10 10 1 26488 -- -fix lang all langevin/gjf 10 10 1 26488 vel vfull +fix lang all gjf 10 10 1 26488 vel vfull -- fix nve all nve fix lang all langevin 10 10 1 26488 diff --git a/examples/gjf/in.gjf.vfull b/examples/gjf/in.gjf.vfull index c36a5b0690..fad6df4a9b 100644 --- a/examples/gjf/in.gjf.vfull +++ b/examples/gjf/in.gjf.vfull @@ -15,7 +15,7 @@ timestep 0.1 compute myKE all ke compute myPE all pe -fix lang all langevin/gjf 10 10 1 26488 vel vfull method 1 +fix lang all gjf 10 10 1 26488 vel vfull method 1 run 5000 diff --git a/examples/gjf/in.gjf.vhalf b/examples/gjf/in.gjf.vhalf index 0635998954..2f5c482928 100644 --- a/examples/gjf/in.gjf.vhalf +++ b/examples/gjf/in.gjf.vhalf @@ -15,7 +15,7 @@ timestep 0.1 compute myKE all ke compute myPE all pe -fix lang all langevin/gjf 10 10 1 26488 +fix lang all gjf 10 10 1 26488 run 5000 diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 index f85c13672d..ca739b3a22 100644 --- a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 648cd3f0c6-modified) +LAMMPS (2 Apr 2025 - Development - d4867ab55e-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -21,7 +21,7 @@ Finding 1-2 1-3 1-4 neighbors ... 0 = max # of 1-4 neighbors 1 = max # of special neighbors special bonds CPU = 0.000 seconds - read_data CPU = 0.009 seconds + read_data CPU = 0.007 seconds include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -53,7 +53,7 @@ timestep 0.1 compute myKE all ke compute myPE all pe -fix lang all langevin/gjf 10 10 1 26488 vel vfull method 1 +fix lang all gjf 10 10 1 26488 vel vfull method 1 run 5000 @@ -61,7 +61,7 @@ CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: -- Langevin GJ methods: doi:10.1080/00268976.2019.1662506 +- GJ methods: doi:10.1080/00268976.2019.1662506 @Article{gronbech-jensen_complete_2020, title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, @@ -74,7 +74,7 @@ author = {Grønbech-Jensen, Niels}, year = {2020} } -- Langevin GJ-I vfull method: doi:10.1080/00268976.2012.760055 +- GJ-I vfull method: doi:10.1080/00268976.2012.760055 @Article{gronbech-jensen_simple_2013, title = {A simple and effective Verlet-type algorithm for simulating Langevin dynamics}, @@ -107,21 +107,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 5000 8.4535562 -55.150518 0 -54.207511 318.20862 -Loop time of 2.27448 on 1 procs for 5000 steps with 864 atoms +Loop time of 2.26831 on 1 procs for 5000 steps with 864 atoms -Performance: 18993.378 ns/day, 0.001 hours/ns, 2198.308 timesteps/s, 1.899 Matom-step/s -100.0% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 19044.977 ns/day, 0.001 hours/ns, 2204.280 timesteps/s, 1.904 Matom-step/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.2877 | 1.2877 | 1.2877 | 0.0 | 56.61 -Bond | 0.00049357 | 0.00049357 | 0.00049357 | 0.0 | 0.02 -Neigh | 0.28068 | 0.28068 | 0.28068 | 0.0 | 12.34 -Comm | 0.055813 | 0.055813 | 0.055813 | 0.0 | 2.45 -Output | 5.5144e-05 | 5.5144e-05 | 5.5144e-05 | 0.0 | 0.00 -Modify | 0.62478 | 0.62478 | 0.62478 | 0.0 | 27.47 -Other | | 0.02499 | | | 1.10 +Pair | 1.2802 | 1.2802 | 1.2802 | 0.0 | 56.44 +Bond | 0.00051213 | 0.00051213 | 0.00051213 | 0.0 | 0.02 +Neigh | 0.27007 | 0.27007 | 0.27007 | 0.0 | 11.91 +Comm | 0.057527 | 0.057527 | 0.057527 | 0.0 | 2.54 +Output | 6.3876e-05 | 6.3876e-05 | 6.3876e-05 | 0.0 | 0.00 +Modify | 0.63364 | 0.63364 | 0.63364 | 0.0 | 27.93 +Other | | 0.02635 | | | 1.16 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -162,21 +162,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes 36000 8.3048574 -55.079475 0 -54.153056 338.04291 38000 8.8708544 -55.108991 0 -54.119434 330.70097 40000 8.4012779 -55.080817 0 -54.143642 338.54326 -Loop time of 19.0379 on 1 procs for 35000 steps with 864 atoms +Loop time of 18.9699 on 1 procs for 35000 steps with 864 atoms -Performance: 15884.146 ns/day, 0.002 hours/ns, 1838.443 timesteps/s, 1.588 Matom-step/s -100.0% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 15941.040 ns/day, 0.002 hours/ns, 1845.028 timesteps/s, 1.594 Matom-step/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 11.641 | 11.641 | 11.641 | 0.0 | 61.14 -Bond | 0.003055 | 0.003055 | 0.003055 | 0.0 | 0.02 -Neigh | 2.3613 | 2.3613 | 2.3613 | 0.0 | 12.40 -Comm | 0.41299 | 0.41299 | 0.41299 | 0.0 | 2.17 -Output | 0.00055686 | 0.00055686 | 0.00055686 | 0.0 | 0.00 -Modify | 4.442 | 4.442 | 4.442 | 0.0 | 23.33 -Other | | 0.1775 | | | 0.93 +Pair | 11.593 | 11.593 | 11.593 | 0.0 | 61.11 +Bond | 0.0041801 | 0.0041801 | 0.0041801 | 0.0 | 0.02 +Neigh | 2.2671 | 2.2671 | 2.2671 | 0.0 | 11.95 +Comm | 0.42339 | 0.42339 | 0.42339 | 0.0 | 2.23 +Output | 0.00062204 | 0.00062204 | 0.00062204 | 0.0 | 0.00 +Modify | 4.4976 | 4.4976 | 4.4976 | 0.0 | 23.71 +Other | | 0.1839 | | | 0.97 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 index 12bc5ca3b2..93466e8dfe 100644 --- a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - 648cd3f0c6-modified) +LAMMPS (2 Apr 2025 - Development - d4867ab55e-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -21,7 +21,7 @@ Finding 1-2 1-3 1-4 neighbors ... 0 = max # of 1-4 neighbors 1 = max # of special neighbors special bonds CPU = 0.002 seconds - read_data CPU = 0.014 seconds + read_data CPU = 0.015 seconds include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -53,7 +53,7 @@ timestep 0.1 compute myKE all ke compute myPE all pe -fix lang all langevin/gjf 10 10 1 26488 vel vfull method 1 +fix lang all gjf 10 10 1 26488 vel vfull method 1 run 5000 @@ -61,7 +61,7 @@ CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: -- Langevin GJ methods: doi:10.1080/00268976.2019.1662506 +- GJ methods: doi:10.1080/00268976.2019.1662506 @Article{gronbech-jensen_complete_2020, title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, @@ -74,7 +74,7 @@ author = {Grønbech-Jensen, Niels}, year = {2020} } -- Langevin GJ-I vfull method: doi:10.1080/00268976.2012.760055 +- GJ-I vfull method: doi:10.1080/00268976.2012.760055 @Article{gronbech-jensen_simple_2013, title = {A simple and effective Verlet-type algorithm for simulating Langevin dynamics}, @@ -107,21 +107,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 5000 7.946377 -55.076514 0 -54.190084 337.31999 -Loop time of 2.10015 on 4 procs for 5000 steps with 864 atoms +Loop time of 2.0998 on 4 procs for 5000 steps with 864 atoms -Performance: 20570.001 ns/day, 0.001 hours/ns, 2380.787 timesteps/s, 2.057 Matom-step/s -64.0% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 20573.405 ns/day, 0.001 hours/ns, 2381.181 timesteps/s, 2.057 Matom-step/s +65.2% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.54244 | 0.54516 | 0.54794 | 0.3 | 25.96 -Bond | 0.00056978 | 0.00065706 | 0.00071013 | 0.0 | 0.03 -Neigh | 0.10885 | 0.11 | 0.11178 | 0.4 | 5.24 -Comm | 0.96848 | 0.97341 | 0.97775 | 0.3 | 46.35 -Output | 0.00028754 | 0.00029437 | 0.00030094 | 0.0 | 0.01 -Modify | 0.25125 | 0.25293 | 0.25477 | 0.3 | 12.04 -Other | | 0.2177 | | | 10.37 +Pair | 0.53641 | 0.54389 | 0.54721 | 0.6 | 25.90 +Bond | 0.00056487 | 0.0006195 | 0.00068462 | 0.0 | 0.03 +Neigh | 0.10567 | 0.1086 | 0.11128 | 0.7 | 5.17 +Comm | 0.96913 | 0.97758 | 0.98191 | 0.5 | 46.56 +Output | 0.00025213 | 0.00025642 | 0.00026405 | 0.0 | 0.01 +Modify | 0.25061 | 0.25105 | 0.25172 | 0.1 | 11.96 +Other | | 0.2178 | | | 10.37 Nlocal: 216 ave 216 max 216 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -162,21 +162,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes 36000 8.0936615 -55.152202 0 -54.249342 316.20169 38000 7.999652 -55.048407 0 -54.156034 345.07945 40000 8.6699753 -55.087634 0 -54.120485 337.23709 -Loop time of 17.6531 on 4 procs for 35000 steps with 864 atoms +Loop time of 17.6726 on 4 procs for 35000 steps with 864 atoms -Performance: 17130.136 ns/day, 0.001 hours/ns, 1982.655 timesteps/s, 1.713 Matom-step/s -63.9% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 17111.263 ns/day, 0.001 hours/ns, 1980.470 timesteps/s, 1.711 Matom-step/s +65.4% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.0485 | 5.078 | 5.11 | 1.0 | 28.77 -Bond | 0.0038244 | 0.0043855 | 0.0047706 | 0.6 | 0.02 -Neigh | 0.8487 | 0.86408 | 0.87685 | 1.1 | 4.89 -Comm | 6.8368 | 6.8833 | 6.9317 | 1.4 | 38.99 -Output | 0.004493 | 0.0045296 | 0.0045945 | 0.1 | 0.03 -Modify | 3.3123 | 3.3253 | 3.3366 | 0.5 | 18.84 -Other | | 1.494 | | | 8.46 +Pair | 5.0739 | 5.1178 | 5.1689 | 1.5 | 28.96 +Bond | 0.0043764 | 0.004688 | 0.0051706 | 0.4 | 0.03 +Neigh | 0.83797 | 0.85506 | 0.87554 | 1.8 | 4.84 +Comm | 6.816 | 6.8932 | 6.9215 | 1.7 | 39.00 +Output | 0.0043624 | 0.0045336 | 0.004998 | 0.4 | 0.03 +Modify | 3.3008 | 3.3033 | 3.3066 | 0.1 | 18.69 +Other | | 1.494 | | | 8.45 Nlocal: 216 ave 222 max 210 min Histogram: 2 0 0 0 0 0 0 0 0 2 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 index 7ea6355b64..569b13bad6 100644 --- a/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - e4c3b0c05e-modified) +LAMMPS (2 Apr 2025 - Development - d4867ab55e-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -21,7 +21,7 @@ Finding 1-2 1-3 1-4 neighbors ... 0 = max # of 1-4 neighbors 1 = max # of special neighbors special bonds CPU = 0.000 seconds - read_data CPU = 0.012 seconds + read_data CPU = 0.010 seconds include ff-argon.lmp ############################# #Atoms types - mass - charge# @@ -53,7 +53,7 @@ timestep 0.1 compute myKE all ke compute myPE all pe -fix lang all langevin/gjf 10 10 1 26488 +fix lang all gjf 10 10 1 26488 run 5000 @@ -61,7 +61,7 @@ CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: -- Langevin GJ methods: doi:10.1080/00268976.2019.1662506 +- GJ methods: doi:10.1080/00268976.2019.1662506 @Article{gronbech-jensen_complete_2020, title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, @@ -74,7 +74,7 @@ author = {Grønbech-Jensen, Niels}, year = {2020} } -- Langevin GJ-I vhalf method: doi:10.1080/00268976.2019.1570369 +- GJ-I vhalf method: doi:10.1080/00268976.2019.1570369 @Article{jensen_accurate_2019, title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems}, @@ -106,21 +106,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 5000 9.7731898 -55.150518 0 -54.060304 322.94195 -Loop time of 2.33802 on 1 procs for 5000 steps with 864 atoms +Loop time of 2.28421 on 1 procs for 5000 steps with 864 atoms -Performance: 18477.199 ns/day, 0.001 hours/ns, 2138.565 timesteps/s, 1.848 Matom-step/s -99.6% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 18912.438 ns/day, 0.001 hours/ns, 2188.940 timesteps/s, 1.891 Matom-step/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.3074 | 1.3074 | 1.3074 | 0.0 | 55.92 -Bond | 0.00028207 | 0.00028207 | 0.00028207 | 0.0 | 0.01 -Neigh | 0.27625 | 0.27625 | 0.27625 | 0.0 | 11.82 -Comm | 0.056554 | 0.056554 | 0.056554 | 0.0 | 2.42 -Output | 5.3527e-05 | 5.3527e-05 | 5.3527e-05 | 0.0 | 0.00 -Modify | 0.67274 | 0.67274 | 0.67274 | 0.0 | 28.77 -Other | | 0.02477 | | | 1.06 +Pair | 1.2715 | 1.2715 | 1.2715 | 0.0 | 55.66 +Bond | 0.00057126 | 0.00057126 | 0.00057126 | 0.0 | 0.03 +Neigh | 0.27008 | 0.27008 | 0.27008 | 0.0 | 11.82 +Comm | 0.057938 | 0.057938 | 0.057938 | 0.0 | 2.54 +Output | 6.1954e-05 | 6.1954e-05 | 6.1954e-05 | 0.0 | 0.00 +Modify | 0.658 | 0.658 | 0.658 | 0.0 | 28.81 +Other | | 0.0261 | | | 1.14 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -161,21 +161,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes 36000 9.7252627 -55.079475 0 -53.994608 343.13769 38000 10.438984 -55.108991 0 -53.944506 336.32562 40000 10.238268 -55.080817 0 -53.938723 345.13228 -Loop time of 19.4518 on 1 procs for 35000 steps with 864 atoms +Loop time of 19.138 on 1 procs for 35000 steps with 864 atoms -Performance: 15546.156 ns/day, 0.002 hours/ns, 1799.324 timesteps/s, 1.555 Matom-step/s +Performance: 15801.041 ns/day, 0.002 hours/ns, 1828.824 timesteps/s, 1.580 Matom-step/s 99.9% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 11.789 | 11.789 | 11.789 | 0.0 | 60.61 -Bond | 0.0022933 | 0.0022933 | 0.0022933 | 0.0 | 0.01 -Neigh | 2.3359 | 2.3359 | 2.3359 | 0.0 | 12.01 -Comm | 0.4146 | 0.4146 | 0.4146 | 0.0 | 2.13 -Output | 0.0005505 | 0.0005505 | 0.0005505 | 0.0 | 0.00 -Modify | 4.7341 | 4.7341 | 4.7341 | 0.0 | 24.34 -Other | | 0.1749 | | | 0.90 +Pair | 11.568 | 11.568 | 11.568 | 0.0 | 60.44 +Bond | 0.0042372 | 0.0042372 | 0.0042372 | 0.0 | 0.02 +Neigh | 2.2577 | 2.2577 | 2.2577 | 0.0 | 11.80 +Comm | 0.42841 | 0.42841 | 0.42841 | 0.0 | 2.24 +Output | 0.00060128 | 0.00060128 | 0.00060128 | 0.0 | 0.00 +Modify | 4.694 | 4.694 | 4.694 | 0.0 | 24.53 +Other | | 0.1852 | | | 0.97 Nlocal: 864 ave 864 max 864 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 index 088fa73044..2b5e19e634 100644 --- a/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (2 Apr 2025 - Development - e4c3b0c05e-modified) +LAMMPS (2 Apr 2025 - Development - d4867ab55e-modified) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) using 1 OpenMP thread(s) per MPI task # GJ thermostat @@ -53,7 +53,7 @@ timestep 0.1 compute myKE all ke compute myPE all pe -fix lang all langevin/gjf 10 10 1 26488 +fix lang all gjf 10 10 1 26488 run 5000 @@ -61,7 +61,7 @@ CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: -- Langevin GJ methods: doi:10.1080/00268976.2019.1662506 +- GJ methods: doi:10.1080/00268976.2019.1662506 @Article{gronbech-jensen_complete_2020, title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, @@ -74,7 +74,7 @@ author = {Grønbech-Jensen, Niels}, year = {2020} } -- Langevin GJ-I vhalf method: doi:10.1080/00268976.2019.1570369 +- GJ-I vhalf method: doi:10.1080/00268976.2019.1570369 @Article{jensen_accurate_2019, title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems}, @@ -106,21 +106,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes Step Temp E_pair E_mol TotEng Press 0 10 -56.207652 0 -55.092137 33.341103 5000 9.3726166 -55.076514 0 -54.030985 342.43571 -Loop time of 2.09482 on 4 procs for 5000 steps with 864 atoms +Loop time of 2.11818 on 4 procs for 5000 steps with 864 atoms -Performance: 20622.269 ns/day, 0.001 hours/ns, 2386.837 timesteps/s, 2.062 Matom-step/s -64.9% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 20394.822 ns/day, 0.001 hours/ns, 2360.512 timesteps/s, 2.039 Matom-step/s +63.1% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.5344 | 0.54263 | 0.54877 | 0.8 | 25.90 -Bond | 0.00049036 | 0.00055513 | 0.00061267 | 0.0 | 0.03 -Neigh | 0.10741 | 0.10898 | 0.11004 | 0.3 | 5.20 -Comm | 0.95869 | 0.96388 | 0.96936 | 0.4 | 46.01 -Output | 0.00025982 | 0.00026553 | 0.00026761 | 0.0 | 0.01 -Modify | 0.26091 | 0.26108 | 0.26137 | 0.0 | 12.46 -Other | | 0.2174 | | | 10.38 +Pair | 0.53987 | 0.54922 | 0.56044 | 1.2 | 25.93 +Bond | 0.00058281 | 0.00063674 | 0.00075153 | 0.0 | 0.03 +Neigh | 0.10821 | 0.10912 | 0.11017 | 0.2 | 5.15 +Comm | 0.96075 | 0.97484 | 0.98645 | 1.1 | 46.02 +Output | 0.00026318 | 0.00026575 | 0.00027192 | 0.0 | 0.01 +Modify | 0.26142 | 0.2634 | 0.26465 | 0.2 | 12.44 +Other | | 0.2207 | | | 10.42 Nlocal: 216 ave 216 max 216 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -161,21 +161,21 @@ Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes 36000 9.6032778 -55.152202 0 -54.080942 321.61646 38000 9.8802995 -55.048407 0 -53.946245 351.82506 40000 10.372288 -55.087634 0 -53.93059 343.34304 -Loop time of 17.6294 on 4 procs for 35000 steps with 864 atoms +Loop time of 17.867 on 4 procs for 35000 steps with 864 atoms -Performance: 17153.172 ns/day, 0.001 hours/ns, 1985.321 timesteps/s, 1.715 Matom-step/s -63.7% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 16925.013 ns/day, 0.001 hours/ns, 1958.914 timesteps/s, 1.693 Matom-step/s +65.3% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.0222 | 5.1025 | 5.1759 | 2.5 | 28.94 -Bond | 0.0040066 | 0.0042899 | 0.0045178 | 0.3 | 0.02 -Neigh | 0.8511 | 0.85865 | 0.86632 | 0.6 | 4.87 -Comm | 6.7448 | 6.8089 | 6.8793 | 1.8 | 38.62 -Output | 0.0043966 | 0.0045518 | 0.0049846 | 0.4 | 0.03 -Modify | 3.364 | 3.3672 | 3.3717 | 0.2 | 19.10 -Other | | 1.483 | | | 8.41 +Pair | 5.0932 | 5.1683 | 5.2256 | 2.5 | 28.93 +Bond | 0.0044473 | 0.0048347 | 0.0058137 | 0.8 | 0.03 +Neigh | 0.85262 | 0.8601 | 0.87438 | 0.9 | 4.81 +Comm | 6.8164 | 6.8981 | 6.9859 | 2.6 | 38.61 +Output | 0.0046884 | 0.0047093 | 0.0047322 | 0.0 | 0.03 +Modify | 3.4107 | 3.4186 | 3.4248 | 0.3 | 19.13 +Other | | 1.512 | | | 8.47 Nlocal: 216 ave 222 max 210 min Histogram: 2 0 0 0 0 0 0 0 0 2 @@ -189,4 +189,4 @@ Ave neighs/atom = 20.998843 Ave special neighs/atom = 0 Neighbor list builds = 2140 Dangerous builds = 0 -Total wall time: 0:00:19 +Total wall time: 0:00:21 diff --git a/src/.gitignore b/src/.gitignore index 9feb76ddc9..20d1bccc4a 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -875,12 +875,12 @@ /fix_freeze.h /fix_gcmc.cpp /fix_gcmc.h +/fix_gjf.cpp +/fix_gjf.h /fix_gld.cpp /fix_gld.h /fix_gle.cpp /fix_gle.h -/fix_langevin_gjf.cpp -/fix_langevin_gjf.h /fix_gpu.cpp /fix_gpu.h /fix_grem.cpp diff --git a/src/EXTRA-FIX/fix_langevin_gjf.cpp b/src/EXTRA-FIX/fix_gjf.cpp similarity index 86% rename from src/EXTRA-FIX/fix_langevin_gjf.cpp rename to src/EXTRA-FIX/fix_gjf.cpp index cf9a8bb8cd..f602e6181d 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.cpp +++ b/src/EXTRA-FIX/fix_gjf.cpp @@ -15,7 +15,7 @@ Contributing authors: Tim Linke & Niels Gronbech-Jensen (UC Davis) ------------------------------------------------------------------------- */ -#include "fix_langevin_gjf.h" +#include "fix_gjf.h" #include "atom.h" #include "citeme.h" @@ -41,8 +41,8 @@ using namespace FixConst; enum { NOBIAS, BIAS }; enum { CONSTANT, EQUAL, ATOM }; -static const char cite_langevin_gjf[] = - "Langevin GJ methods: doi:10.1080/00268976.2019.1662506\n\n" +static const char cite_gjf[] = + "GJ methods: doi:10.1080/00268976.2019.1662506\n\n" "@Article{gronbech-jensen_complete_2020,\n" "title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations},\n" "volume = {118},\n" @@ -54,8 +54,8 @@ static const char cite_langevin_gjf[] = "year = {2020}\n" "}\n\n"; -static const char cite_langevin_gjf_7[] = - "Langevin GJ-VII method: doi:10.1063/5.0066008\n\n" +static const char cite_gjf_7[] = + "GJ-VII method: doi:10.1063/5.0066008\n\n" "@Article{finkelstein_2021,\n" "title = {Bringing discrete-time Langevin splitting methods into agreement with thermodynamics},\n" "volume = {155},\n" @@ -68,8 +68,8 @@ static const char cite_langevin_gjf_7[] = "pages = {184104}\n" "}\n\n"; -static const char cite_langevin_gjf_8[] = - "Langevin GJ-VIII method: doi:10.1007/s10955-024-03345-1\n\n" +static const char cite_gjf_8[] = + "GJ-VIII method: doi:10.1007/s10955-024-03345-1\n\n" "@Article{gronbech_jensen_2024,\n" "title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations},\n" "volume = {191},\n" @@ -82,8 +82,8 @@ static const char cite_langevin_gjf_8[] = "pages = {137}\n" "}\n\n"; -static const char cite_langevin_gjf_vhalf[] = - "Langevin GJ-I vhalf method: doi:10.1080/00268976.2019.1570369\n\n" +static const char cite_gjf_vhalf[] = + "GJ-I vhalf method: doi:10.1080/00268976.2019.1570369\n\n" "@Article{jensen_accurate_2019,\n" "title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems},\n" "volume = {117},\n" @@ -95,8 +95,8 @@ static const char cite_langevin_gjf_vhalf[] = "year = {2019}\n" "}\n\n"; -static const char cite_langevin_gjf_vfull[] = - "Langevin GJ-I vfull method: doi:10.1080/00268976.2012.760055\n\n" +static const char cite_gjf_vfull[] = + "GJ-I vfull method: doi:10.1080/00268976.2012.760055\n\n" "@Article{gronbech-jensen_simple_2013,\n" "title = {A simple and effective Verlet-type algorithm for simulating Langevin dynamics},\n" "volume = {111},\n" @@ -111,11 +111,11 @@ static const char cite_langevin_gjf_vfull[] = /* ---------------------------------------------------------------------- */ -FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : +FixGJF::FixGJF(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), tstr(nullptr), tforce(nullptr), lv(nullptr), id_temp(nullptr), random(nullptr) { - if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf); - if (narg < 7) error->all(FLERR, "Illegal fix langevin/gjf command"); + if (lmp->citeme) lmp->citeme->add(cite_gjf); + if (narg < 7) error->all(FLERR, "Illegal fix gjf command"); time_integrate = 1; global_freq = 1; @@ -133,8 +133,8 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : t_period = utils::numeric(FLERR, arg[5], false, lmp); seed = utils::inumeric(FLERR, arg[6], false, lmp); - if (t_period <= 0.0) error->all(FLERR, "Fix langevin/gjf period must be > 0.0"); - if (seed <= 0) error->all(FLERR, "Illegal fix langevin/gjf command"); + if (t_period <= 0.0) error->all(FLERR, "Fix gjf period must be > 0.0"); + if (seed <= 0) error->all(FLERR, "Illegal fix gjf command"); // initialize Marsaglia RNG with processor-unique seed random = new RanMars(lmp, seed + comm->me); @@ -152,34 +152,34 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : int iarg = 7; while (iarg < narg) { if (strcmp(arg[iarg], "vel") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal fix langevin/gjf command"); + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix gjf command"); if (strcmp(arg[iarg + 1], "vfull") == 0) { osflag = 1; } else if (strcmp(arg[iarg + 1], "vhalf") == 0) { osflag = 0; } else - error->all(FLERR, "Illegal fix langevin/gjf command"); + error->all(FLERR, "Illegal fix gjf command"); iarg += 2; } else if (strcmp(arg[iarg], "method") == 0) { GJmethod = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); if (GJmethod == 7) { - if (iarg + 3 > narg) error->all(FLERR, "Illegal fix langevin/gjf command for GJ-VII"); + if (iarg + 3 > narg) error->all(FLERR, "Illegal fix gjf command for GJ-VII"); gjfc2 = utils::numeric(FLERR, arg[iarg + 2], false, lmp); if (gjfc2 < 0 || gjfc2 > 1) error->all(FLERR, "Choice of c2 in GJ-VII must be 0≤c2≤1"); iarg += 3; - if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_7); + if (lmp->citeme) lmp->citeme->add(cite_gjf_7); } else { - if (iarg + 2 > narg) error->all(FLERR, "Illegal fix langevin/gjf command"); - if (GJmethod < 0 || GJmethod > GJmethods) error->all(FLERR, "Invalid GJ method choice in langevin/gjf command"); - if (GJmethod == 8) if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_8); + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix gjf command"); + if (GJmethod < 0 || GJmethod > GJmethods) error->all(FLERR, "Invalid GJ method choice in gjf command"); + if (GJmethod == 8) if (lmp->citeme) lmp->citeme->add(cite_gjf_8); iarg += 2; } } else - error->all(FLERR, "Illegal fix langevin/gjf command"); + error->all(FLERR, "Illegal fix gjf command"); } - if (GJmethod == 1 && osflag == 0) if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_vhalf); - if (GJmethod == 1 && osflag == 1) if (lmp->citeme) lmp->citeme->add(cite_langevin_gjf_vfull); + if (GJmethod == 1 && osflag == 0) if (lmp->citeme) lmp->citeme->add(cite_gjf_vhalf); + if (GJmethod == 1 && osflag == 1) if (lmp->citeme) lmp->citeme->add(cite_gjf_vfull); // set temperature = nullptr, user can override via fix_modify if wants bias id_temp = nullptr; @@ -193,7 +193,7 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only - FixLangevinGJF::grow_arrays(atom->nmax); + FixGJF::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); // initialize lv to onsite velocity @@ -207,7 +207,7 @@ FixLangevinGJF::FixLangevinGJF(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixLangevinGJF::~FixLangevinGJF() +FixGJF::~FixGJF() { if (copymode) return; @@ -222,7 +222,7 @@ FixLangevinGJF::~FixLangevinGJF() /* ---------------------------------------------------------------------- */ -int FixLangevinGJF::setmask() +int FixGJF::setmask() { int mask = 0; mask |= INITIAL_INTEGRATE; @@ -233,7 +233,7 @@ int FixLangevinGJF::setmask() /* ---------------------------------------------------------------------- */ -void FixLangevinGJF::init() +void FixGJF::init() { if (id_temp) { temperature = modify->get_compute_by_id(id_temp); @@ -248,17 +248,17 @@ void FixLangevinGJF::init() if (tstr) { tvar = input->variable->find(tstr); - if (tvar < 0) error->all(FLERR, "Variable name {} for fix langevin/gjf does not exist", tstr); + if (tvar < 0) error->all(FLERR, "Variable name {} for fix gjf does not exist", tstr); if (input->variable->equalstyle(tvar)) tstyle = EQUAL; else if (input->variable->atomstyle(tvar)) tstyle = ATOM; else - error->all(FLERR, "Variable {} for fix langevin/gjf is invalid style", tstr); + error->all(FLERR, "Variable {} for fix gjf is invalid style", tstr); } if (utils::strmatch(update->integrate_style, "^respa")) { - error->all(FLERR, "Fix langevin/gjf and run style respa are not compatible"); + error->all(FLERR, "Fix gjf and run style respa are not compatible"); } if (temperature && temperature->tempbias) @@ -296,7 +296,7 @@ void FixLangevinGJF::init() gjfc2 = 0.0; break; default: - error->all(FLERR, "Fix langevin/gjf method not found"); + error->all(FLERR, "Fix gjf method not found"); break; } gjfc1 = (1.0 + gjfc2) / 2.0; @@ -306,13 +306,13 @@ void FixLangevinGJF::init() /* ---------------------------------------------------------------------- integrate position and velocity according to the GJ methods in Grønbech-Jensen, J Stat Phys 191, 137 (2024). The general workflow is - 1. Langevin GJ Initial Integration + 1. GJ Initial Integration 2. Force Update - 3. Langevin GJ Final Integration + 3. GJ Final Integration 4. Velocity Choice in end_of_step() ------------------------------------------------------------------------- */ -void FixLangevinGJF::initial_integrate(int /* vflag */) +void FixGJF::initial_integrate(int /* vflag */) { // This function provides the integration of the GJ formulation 24 a-e double **x = atom->x; @@ -437,7 +437,7 @@ void FixLangevinGJF::initial_integrate(int /* vflag */) } } -void FixLangevinGJF::final_integrate() +void FixGJF::final_integrate() { double **v = atom->v; double **f = atom->f; @@ -479,7 +479,7 @@ void FixLangevinGJF::final_integrate() set current t_target and t_sqrt ------------------------------------------------------------------------- */ -void FixLangevinGJF::compute_target() +void FixGJF::compute_target() { int *mask = atom->mask; int nlocal = atom->nlocal; @@ -498,19 +498,19 @@ void FixLangevinGJF::compute_target() if (tstyle == EQUAL) { t_target = input->variable->compute_equal(tvar); if (t_target < 0.0) - error->one(FLERR, "Fix langevin/gjf variable returned negative temperature"); + error->one(FLERR, "Fix gjf variable returned negative temperature"); tsqrt = sqrt(t_target); } else { if (atom->nmax > maxatom) { maxatom = atom->nmax; memory->destroy(tforce); - memory->create(tforce,maxatom,"langevin_gjf:tforce"); + memory->create(tforce,maxatom,"gjf:tforce"); } input->variable->compute_atom(tvar,igroup,tforce,1,0); for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) if (tforce[i] < 0.0) - error->one(FLERR, "Fix langevin/gjf variable returned negative temperature"); + error->one(FLERR, "Fix gjf variable returned negative temperature"); } modify->addstep_compute(update->ntimestep + 1); } @@ -520,7 +520,7 @@ void FixLangevinGJF::compute_target() select velocity for GJ ------------------------------------------------------------------------- */ -void FixLangevinGJF::end_of_step() +void FixGJF::end_of_step() { double **v = atom->v; int *mask = atom->mask; @@ -549,14 +549,14 @@ void FixLangevinGJF::end_of_step() // clang-format on /* ---------------------------------------------------------------------- */ -void FixLangevinGJF::reset_target(double t_new) +void FixGJF::reset_target(double t_new) { t_target = t_start = t_stop = t_new; } /* ---------------------------------------------------------------------- */ -void FixLangevinGJF::reset_dt() +void FixGJF::reset_dt() { // Complete set of thermostats is given in Gronbech-Jensen, Molecular Physics, 118 (2020) switch (GJmethod) { @@ -588,7 +588,7 @@ void FixLangevinGJF::reset_dt() gjfc2 = 0.0; break; default: - error->all(FLERR, "Fix langevin/gjf method not found"); + error->all(FLERR, "Fix gjf method not found"); break; } gjfc1 = (1.0 + gjfc2) / 2.0; @@ -597,7 +597,7 @@ void FixLangevinGJF::reset_dt() /* ---------------------------------------------------------------------- */ -int FixLangevinGJF::modify_param(int narg, char **arg) +int FixGJF::modify_param(int narg, char **arg) { if (strcmp(arg[0], "temp") == 0) { if (narg < 2) utils::missing_cmd_args(FLERR, "fix_modify", error); @@ -621,7 +621,7 @@ int FixLangevinGJF::modify_param(int narg, char **arg) extract thermostat properties ------------------------------------------------------------------------- */ -void *FixLangevinGJF::extract(const char *str, int &dim) +void *FixGJF::extract(const char *str, int &dim) { dim = 0; if (strcmp(str, "t_target") == 0) { return &t_target; } @@ -632,7 +632,7 @@ void *FixLangevinGJF::extract(const char *str, int &dim) memory usage of tally array ------------------------------------------------------------------------- */ -double FixLangevinGJF::memory_usage() +double FixGJF::memory_usage() { double bytes = 0.0; bytes += (double) atom->nmax * 3 * sizeof(double); @@ -644,16 +644,16 @@ double FixLangevinGJF::memory_usage() allocate atom-based array for lv ------------------------------------------------------------------------- */ -void FixLangevinGJF::grow_arrays(int nmax) +void FixGJF::grow_arrays(int nmax) { - memory->grow(lv, nmax, 3, "fix_langevin_gjf:lv"); + memory->grow(lv, nmax, 3, "fix_gjf:lv"); } /* ---------------------------------------------------------------------- copy values within local atom-based array ------------------------------------------------------------------------- */ -void FixLangevinGJF::copy_arrays(int i, int j, int /*delflag*/) +void FixGJF::copy_arrays(int i, int j, int /*delflag*/) { lv[j][0] = lv[i][0]; lv[j][1] = lv[i][1]; @@ -664,7 +664,7 @@ void FixLangevinGJF::copy_arrays(int i, int j, int /*delflag*/) pack values in local atom-based array for exchange with another proc ------------------------------------------------------------------------- */ -int FixLangevinGJF::pack_exchange(int i, double *buf) +int FixGJF::pack_exchange(int i, double *buf) { int n = 0; buf[n++] = lv[i][0]; @@ -677,7 +677,7 @@ int FixLangevinGJF::pack_exchange(int i, double *buf) unpack values in local atom-based array from exchange with another proc ------------------------------------------------------------------------- */ -int FixLangevinGJF::unpack_exchange(int nlocal, double *buf) +int FixGJF::unpack_exchange(int nlocal, double *buf) { int n = 0; lv[nlocal][0] = buf[n++]; diff --git a/src/EXTRA-FIX/fix_langevin_gjf.h b/src/EXTRA-FIX/fix_gjf.h similarity index 88% rename from src/EXTRA-FIX/fix_langevin_gjf.h rename to src/EXTRA-FIX/fix_gjf.h index 45ccf4cbe2..154f6543da 100644 --- a/src/EXTRA-FIX/fix_langevin_gjf.h +++ b/src/EXTRA-FIX/fix_gjf.h @@ -13,21 +13,21 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(langevin/gjf,FixLangevinGJF); +FixStyle(gjf,FixGJF); // clang-format on #else -#ifndef LMP_FIX_LANGEVINGJF_H -#define LMP_FIX_LANGEVINGJF_H +#ifndef LMP_FIX_GJF_H +#define LMP_FIX_GJF_H #include "fix.h" namespace LAMMPS_NS { -class FixLangevinGJF : public Fix { +class FixGJF : public Fix { public: - FixLangevinGJF(class LAMMPS *, int, char **); - ~FixLangevinGJF() override; + FixGJF(class LAMMPS *, int, char **); + ~FixGJF() override; int setmask() override; void init() override; void initial_integrate(int) override; From 1062a8fb3acb62614e7da405d5cf6d6c7c348ef8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 29 Apr 2025 17:20:04 -0400 Subject: [PATCH 54/94] add deprecation warning to fix langevin and document it --- doc/src/Commands_removed.rst | 11 +++++++++++ doc/src/fix_langevin.rst | 7 +++++++ src/fix_langevin.cpp | 3 +++ 3 files changed, 21 insertions(+) diff --git a/doc/src/Commands_removed.rst b/doc/src/Commands_removed.rst index cea964fe79..54679c6d46 100644 --- a/doc/src/Commands_removed.rst +++ b/doc/src/Commands_removed.rst @@ -12,6 +12,17 @@ stop LAMMPS and print a suitable error message in most cases, when a style/command is used that has been removed or will replace the command with the direct alternative (if available) and print a warning. +GJF formulation in fix langevin +------------------------------- + +.. deprecated:: TBD + +The *gjf* keyword in fix langevin is deprecated and will be removed +soon. The GJF functionality has been moved to its own fix style +:doc:`fix gjf ` and it is strongly recommended to use that +fix instead. + + LAMMPS shell ------------ diff --git a/doc/src/fix_langevin.rst b/doc/src/fix_langevin.rst index 30e4c48270..f9956bbec9 100644 --- a/doc/src/fix_langevin.rst +++ b/doc/src/fix_langevin.rst @@ -241,6 +241,13 @@ to zero by subtracting off an equal part of it from each atom in the group. As a result, the center-of-mass of a system with zero initial momentum will not drift over time. +.. deprecated:: TDB + +The *gjf* keyword in fix langevin is deprecated and will be removed +soon. The GJF functionality has been moved to its own fix style +:doc:`fix gjf ` and it is strongly recommended to use that +fix instead. + The keyword *gjf* can be used to run the :ref:`Gronbech-Jensen/Farago ` time-discretization of the Langevin model. As described in the papers cited below, the purpose of this method is to diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 60a55bbbb4..5f754b6d2b 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -170,6 +170,9 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only if (gjfflag) { + if (comm->me == 0) + error->warning(FLERR, "The GJF formulation in fix {} is deprecated and will be removed soon. " + "\nPlease use fix gjf instead: https://docs.lammps.org/fix_gjf.html", style); FixLangevin::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); From def38bf0f36195fc66640da038ba4593e49e10af Mon Sep 17 00:00:00 2001 From: talinke Date: Tue, 29 Apr 2025 15:03:49 -0700 Subject: [PATCH 55/94] Updated fix langevin algorithm citation --- doc/src/fix_langevin.rst | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/doc/src/fix_langevin.rst b/doc/src/fix_langevin.rst index f9956bbec9..b8be16e16d 100644 --- a/doc/src/fix_langevin.rst +++ b/doc/src/fix_langevin.rst @@ -56,7 +56,7 @@ Examples Description """"""""""" -Apply a Langevin thermostat as described in :ref:`(Schneider) ` +Apply a Langevin thermostat as described in :ref:`(Bruenger) ` to a group of atoms which models an interaction with a background implicit solvent. Used with :doc:`fix nve `, this command performs Brownian dynamics (BD), since the total force on each atom @@ -331,14 +331,16 @@ types, tally = no, zero = no, gjf = no. ---------- +.. _Bruenger1: + +**(Bruenger)** Bruenger, Brooks, and Karplus, Chem. Phys. Lett. 105, 495 (1982). +[Previously attributed to Schneider and Stoll, Phys. Rev. B 17, 1302 (1978). +Implementation remains unchanged.] + .. _Dunweg1: **(Dunweg)** Dunweg and Paul, Int J of Modern Physics C, 2, 817-27 (1991). -.. _Schneider1: - -**(Schneider)** Schneider and Stoll, Phys Rev B, 17, 1302 (1978). - .. _Gronbech-Jensen: **(Gronbech-Jensen)** Gronbech-Jensen and Farago, Mol Phys, 111, 983 From cba479bf6ea8dae4c262083444b9a1edd946bf41 Mon Sep 17 00:00:00 2001 From: Giacomo Fiorin Date: Tue, 8 Apr 2025 12:18:07 -0400 Subject: [PATCH 56/94] Update Colvars library to version 2025-04-18 The following is a list of pull requests relevant to LAMMPS in the Colvars repository since 2024-08-06: - 752 New tool poisson_integrator_conv https://github.com/Colvars/colvars/pull/752 (@jhenin) - 733 Custom grids for all biases https://github.com/Colvars/colvars/pull/733 (@giacomofiorin, @jhenin) - 776 Avoid error in acos and asin with fast-math https://github.com/Colvars/colvars/pull/776 (@jhenin) - 773 fix: fix the clang build test failure of OPES https://github.com/Colvars/colvars/pull/773 (@HanatoK) - 768 fix: clamp the input values of asin and acos in case of fast math on aarch64 https://github.com/Colvars/colvars/pull/768 (@HanatoK) - 761 Add debug code for the Jacobi failure https://github.com/Colvars/colvars/pull/761 (@HanatoK) - 759 min_image fix; Saves long runs from crashes; https://github.com/Colvars/colvars/pull/759 (@PolyachenkoYA) - 757 Fix MSVC OpenMP issue https://github.com/Colvars/colvars/pull/757 (@HanatoK) - 755 Fix indentation of 'Init CVC' message in standard output https://github.com/Colvars/colvars/pull/755 (@jhenin) - 750 Optimize and simplify the calculation of dihedral gradients https://github.com/Colvars/colvars/pull/750 (@HanatoK) - 749 Add references to new Colvars paper https://github.com/Colvars/colvars/pull/749 (@jhenin, @giacomofiorin) - 740 Report the specific C++ standard at init time, stop warning about C++97/03 https://github.com/Colvars/colvars/pull/740 (@giacomofiorin) - 731 Improve detection of hard/mathematical boundaries https://github.com/Colvars/colvars/pull/731 (@giacomofiorin) - 729 Optimize the fit gradients https://github.com/Colvars/colvars/pull/729 (@HanatoK, @jhenin) - 728 Fix undefined behavior when getting the current working directory from std::filesystem https://github.com/Colvars/colvars/pull/728 (@giacomofiorin) - 727 Add patchversion scripting command https://github.com/Colvars/colvars/pull/727 (@giacomofiorin) - 724 Fix gradients and metric functions of distanceDir https://github.com/Colvars/colvars/pull/724 (@giacomofiorin) - 715 Add missing rotation in orientation component https://github.com/Colvars/colvars/pull/715 (@giacomofiorin) - 713 fix: try to solve #87 for non-scala components https://github.com/Colvars/colvars/pull/713 (@HanatoK) - 709 Implementation of OPES in Colvars https://github.com/Colvars/colvars/pull/709 (@HanatoK, @giacomofiorin, @jhenin) - 706 BUGFIX for Segmentation fault in colvarbias_meta::calc_energy() with useGrids off https://github.com/Colvars/colvars/pull/706 (@alphataubio) - 570 enable use of CVs defined by PyTorch neural network models https://github.com/Colvars/colvars/pull/570 (@zwpku, @giacomofiorin, @HanatoK, @jhenin) Authors: @alphataubio, @EzryStIago, @giacomofiorin, @HanatoK, @jhenin, @PolyachenkoYA, @zwpku --- cmake/Modules/Packages/COLVARS.cmake | 5 + doc/src/PDF/colvars-refman-lammps.pdf | Bin 1632360 -> 1681941 bytes lib/colvars/Makefile.common | 2 + lib/colvars/Makefile.deps | 16 +- lib/colvars/colvar.cpp | 231 +- lib/colvars/colvar.h | 15 +- lib/colvars/colvar_rotation_derivative.h | 102 +- lib/colvars/colvaratoms.cpp | 144 +- lib/colvars/colvaratoms.h | 109 +- lib/colvars/colvarbias.cpp | 57 +- lib/colvars/colvarbias.h | 7 +- lib/colvars/colvarbias_abf.cpp | 120 +- lib/colvars/colvarbias_histogram.cpp | 6 +- lib/colvars/colvarbias_histogram.h | 1 + .../colvarbias_histogram_reweight_amd.cpp | 60 +- .../colvarbias_histogram_reweight_amd.h | 14 +- lib/colvars/colvarbias_meta.cpp | 215 +- lib/colvars/colvarbias_meta.h | 26 +- lib/colvars/colvarbias_opes.cpp | 1996 +++++++++++++++++ lib/colvars/colvarbias_opes.h | 176 ++ lib/colvars/colvarcomp.cpp | 9 +- lib/colvars/colvarcomp.h | 12 +- lib/colvars/colvarcomp_alchlambda.cpp | 49 +- lib/colvars/colvarcomp_angles.cpp | 76 +- lib/colvars/colvarcomp_distances.cpp | 33 +- lib/colvars/colvarcomp_protein.cpp | 203 +- lib/colvars/colvarcomp_rotations.cpp | 25 +- lib/colvars/colvarcomp_torchann.cpp | 233 ++ lib/colvars/colvarcomp_torchann.h | 63 + lib/colvars/colvardeps.cpp | 46 +- lib/colvars/colvardeps.h | 22 +- lib/colvars/colvargrid.cpp | 124 +- lib/colvars/colvargrid.h | 170 +- lib/colvars/colvargrid_def.h | 64 +- lib/colvars/colvarmodule.cpp | 80 +- lib/colvars/colvarmodule.h | 53 +- lib/colvars/colvarmodule_refs.h | 151 +- lib/colvars/colvarparse.cpp | 5 +- lib/colvars/colvarproxy.cpp | 56 +- lib/colvars/colvarproxy.h | 52 +- lib/colvars/colvarproxy_io.cpp | 69 +- lib/colvars/colvarproxy_io.h | 6 + lib/colvars/colvarproxy_replicas.cpp | 83 +- lib/colvars/colvarproxy_replicas.h | 66 + lib/colvars/colvarproxy_system.h | 6 + lib/colvars/colvars_memstream.h | 3 + lib/colvars/colvars_version.h | 2 +- lib/colvars/colvarscript_commands.h | 13 +- lib/colvars/colvarscript_commands_colvar.h | 1 + lib/colvars/colvartypes.cpp | 89 +- lib/colvars/colvartypes.h | 59 +- lib/colvars/colvarvalue.cpp | 139 +- lib/colvars/colvarvalue.h | 86 - src/COLVARS/colvarproxy_lammps.cpp | 72 - src/COLVARS/colvarproxy_lammps.h | 17 +- src/COLVARS/colvarproxy_lammps_version.h | 2 +- src/COLVARS/fix_colvars.cpp | 4 +- 57 files changed, 4346 insertions(+), 1199 deletions(-) create mode 100644 lib/colvars/colvarbias_opes.cpp create mode 100644 lib/colvars/colvarbias_opes.h create mode 100644 lib/colvars/colvarcomp_torchann.cpp create mode 100644 lib/colvars/colvarcomp_torchann.h create mode 100644 lib/colvars/colvarproxy_replicas.h diff --git a/cmake/Modules/Packages/COLVARS.cmake b/cmake/Modules/Packages/COLVARS.cmake index 8fa0d84f01..b4dc738626 100644 --- a/cmake/Modules/Packages/COLVARS.cmake +++ b/cmake/Modules/Packages/COLVARS.cmake @@ -26,6 +26,11 @@ if(BUILD_OMP) target_link_libraries(colvars PRIVATE OpenMP::OpenMP_CXX) endif() +if(BUILD_MPI) + target_compile_definitions(colvars PUBLIC -DCOLVARS_MPI) + target_link_libraries(colvars PUBLIC MPI::MPI_CXX) +endif() + if(COLVARS_DEBUG) # Need to export the define publicly to be valid in interface code target_compile_definitions(colvars PUBLIC -DCOLVARS_DEBUG) diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf index b8f049ce019f6d2d9555a87a1f0b2bfde8e88bf7..76d94f8e3af70e53b0dddc6b6d060d5ec5913da2 100644 GIT binary patch delta 509526 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/XsC*=Hl(vc#IW3dU?4qZMHva>WG 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%0AXOgS24l9Xx7npV6*Bd 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

@(2n+ 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

o_W_ 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�HWLt9j=0Plzd-2R><@74 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�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 W=nerHIvi+<_{Gm$# delta 460211 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

-+aPUAbRyh@PDGNN$kY}J;F5^~ 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�ieAS-8qJZ3q?sAnz&Ea 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 diff --git a/lib/colvars/Makefile.common b/lib/colvars/Makefile.common index f0282b8caf..9203f9d158 100644 --- a/lib/colvars/Makefile.common +++ b/lib/colvars/Makefile.common @@ -32,6 +32,7 @@ COLVARS_SRCS = \ colvarbias_histogram_reweight_amd.cpp \ colvarbias_meta.cpp \ colvarbias_restraint.cpp \ + colvarbias_opes.cpp \ colvarcomp_alchlambda.cpp \ colvarcomp_angles.cpp \ colvarcomp_apath.cpp \ @@ -40,6 +41,7 @@ COLVARS_SRCS = \ colvarcomp_distances.cpp \ colvarcomp_gpath.cpp \ colvarcomp_neuralnetwork.cpp \ + colvarcomp_torchann.cpp \ colvarcomp_combination.cpp \ colvarcomp_protein.cpp \ colvarcomp_rotations.cpp \ diff --git a/lib/colvars/Makefile.deps b/lib/colvars/Makefile.deps index 61f0b1a335..82d36e53c4 100644 --- a/lib/colvars/Makefile.deps +++ b/lib/colvars/Makefile.deps @@ -52,6 +52,12 @@ $(COLVARS_OBJ_DIR)colvarbias_restraint.o: colvarbias_restraint.cpp \ colvarproxy_tcl.h colvarproxy_volmaps.h colvarvalue.h \ colvarbias_restraint.h colvarbias.h colvar.h colvarparse.h \ colvarparams.h colvardeps.h +$(COLVARS_OBJ_DIR)colvarbias_opes.o: colvarbias_opes.cpp \ + colvarmodule.h colvars_version.h colvarproxy.h colvartypes.h \ + ../../src/math_eigen_impl.h colvarproxy_io.h colvarproxy_system.h \ + colvarproxy_tcl.h colvarproxy_volmaps.h colvarvalue.h \ + colvarbias_opes.h colvarbias.h colvar.h colvarparse.h \ + colvarparams.h colvardeps.h $(COLVARS_OBJ_DIR)colvarcomp_alchlambda.o: colvarcomp_alchlambda.cpp \ colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ ../../src/math_eigen_impl.h colvar.h colvarparse.h colvarparams.h \ @@ -101,6 +107,11 @@ $(COLVARS_OBJ_DIR)colvarcomp_neuralnetwork.o: \ colvarproxy.h colvarproxy_io.h colvarproxy_system.h colvarproxy_tcl.h \ colvarproxy_volmaps.h colvar_geometricpath.h \ colvar_neuralnetworkcompute.h +$(COLVARS_OBJ_DIR)colvarcomp_torchann.o: \ + colvarcomp_torchann.cpp colvarmodule.h colvars_version.h \ + colvarvalue.h colvartypes.h colvarparse.h colvarparams.h colvar.h \ + colvardeps.h colvarcomp.h colvarcomp_torchann.h colvaratoms.h colvarproxy.h colvarproxy_io.h \ + colvarproxy_system.h colvarproxy_tcl.h $(COLVARS_OBJ_DIR)colvarcomp_combination.o: colvarcomp_combination.cpp \ colvarcomp.h colvarmodule.h colvars_version.h colvaratoms.h \ colvarproxy.h colvartypes.h ../../src/math_eigen_impl.h colvarproxy_io.h \ @@ -127,7 +138,7 @@ $(COLVARS_OBJ_DIR)colvarcomp_volmaps.o: colvarcomp_volmaps.cpp \ colvar_geometricpath.h $(COLVARS_OBJ_DIR)colvar.o: colvar.cpp colvarmodule.h colvars_version.h \ colvarvalue.h colvartypes.h ../../src/math_eigen_impl.h colvarparse.h \ - colvarparams.h colvarcomp.h colvaratoms.h colvarproxy.h colvarproxy_io.h \ + colvarparams.h colvarcomp.h colvarcomp_torchann.h colvaratoms.h colvarproxy.h colvarproxy_io.h \ colvarproxy_system.h colvarproxy_tcl.h colvarproxy_volmaps.h \ colvardeps.h colvar.h colvar_geometricpath.h colvarbias.h \ colvars_memstream.h @@ -152,7 +163,8 @@ $(COLVARS_OBJ_DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h \ colvarbias_histogram_reweight_amd.h colvarbias_meta.h colvarscript.h \ colvarscript_commands.h colvarscript_commands_colvar.h \ colvarscript_commands_bias.h colvaratoms.h colvarcomp.h \ - colvar_geometricpath.h colvars_memstream.h colvarmodule_refs.h + colvar_geometricpath.h colvars_memstream.h colvarmodule_refs.h \ + colvarbias_opes.h $(COLVARS_OBJ_DIR)colvarparams.o: colvarparams.cpp colvarmodule.h \ colvars_version.h colvarvalue.h colvartypes.h \ ../../src/math_eigen_impl.h colvarparams.h diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index 58eb87fd0e..136aa2afd5 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -21,6 +21,7 @@ #include "colvarbias.h" #include "colvars_memstream.h" +#include "colvarcomp_torchann.h" std::map> colvar::global_cvc_map = std::map>(); @@ -95,6 +96,12 @@ int colvar::init(std::string const &conf) if (error_code != COLVARS_OK) { return cvm::get_error(); } +#else + if (key_lookup(conf, "customFunction")) { + return cvm::error( + "Error: customFunction keyword is used, but the Lepton library is not available.\n", + COLVARS_NOT_IMPLEMENTED); + } #endif // Setup colvar as scripted function of components @@ -175,12 +182,6 @@ int colvar::init(std::string const &conf) set_enabled(f_cv_scalar, (value().type() == colvarvalue::type_scalar)); - // If using scripted biases, any colvar may receive bias forces - // and will need its gradient - if (cvm::scripted_forces()) { - enable(f_cv_gradient); - } - // check for linear combinations { bool lin = !(is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function)); @@ -311,9 +312,27 @@ int colvar::init(std::string const &conf) // Detect if we have a single component that is an alchemical lambda if (is_enabled(f_cv_single_cvc) && cvcs[0]->function_type() == "alchLambda") { enable(f_cv_external); + + static_cast(cvcs[0].get())->init_alchemy(time_step_factor); + } + + // If using scripted biases, any colvar may receive bias forces + if (cvm::scripted_forces()) { + enable(f_cv_apply_force); } error_code |= init_extended_Lagrangian(conf); + + // when total atomic forces are obtained from the previous time step, + // we cannot (currently) have colvar values and projected total forces for the same timestep + // (that would require anticipating the total force request by one timestep) + // i.e. the combination of f_cv_total_force_calc and f_cv_multiple_ts requires f_cv_total_force_current_step + // Because f_cv_total_force_current_step is static, we can hard-code this, once other features are set + // that is f_cv_external and f_cv_extended_Lagrangian + if (!is_enabled(f_cv_total_force_current_step)) { + exclude_feature_self(f_cv_multiple_ts, f_cv_total_force_calc); + } + error_code |= init_output_flags(conf); // Now that the children are defined we can solve dependencies @@ -495,8 +514,6 @@ int colvar::init_grid_parameters(std::string const &conf) { int error_code = COLVARS_OK; - colvarmodule *cv = cvm::main(); - cvm::real default_width = width; if (!key_already_set("width")) { @@ -522,34 +539,68 @@ int colvar::init_grid_parameters(std::string const &conf) if (is_enabled(f_cv_scalar)) { - if (is_enabled(f_cv_single_cvc)) { - // Get the default boundaries from the component + // Record the CVC's intrinsic boundaries, and set them as default values for the user's choice + colvarvalue cvc_lower_boundary, cvc_upper_boundary; + + if (is_enabled(f_cv_single_cvc)) { // Get the intrinsic boundaries of the CVC + if (cvcs[0]->is_enabled(f_cvc_lower_boundary)) { enable(f_cv_lower_boundary); enable(f_cv_hard_lower_boundary); - lower_boundary = + lower_boundary = cvc_lower_boundary = *(reinterpret_cast(cvcs[0]->get_param_ptr("lowerBoundary"))); } + if (cvcs[0]->is_enabled(f_cvc_upper_boundary)) { enable(f_cv_upper_boundary); enable(f_cv_hard_upper_boundary); - upper_boundary = - *(reinterpret_cast(cvcs[0]->get_param_ptr("upperBoundary"))); + upper_boundary = cvc_upper_boundary = + *(reinterpret_cast(cvcs[0]->get_param_ptr("upperBoundary"))); } } if (get_keyval(conf, "lowerBoundary", lower_boundary, lower_boundary)) { enable(f_cv_lower_boundary); - // Because this is the user's choice, we cannot assume it is a true - // physical boundary - disable(f_cv_hard_lower_boundary); + if (is_enabled(f_cv_single_cvc) && is_enabled(f_cv_hard_lower_boundary)) { + if (cvm::sqrt(dist2(lower_boundary, cvc_lower_boundary))/width > colvar_boundaries_tol) { + // The user choice is different from the CVC's default + disable(f_cv_hard_lower_boundary); + } + } } if (get_keyval(conf, "upperBoundary", upper_boundary, upper_boundary)) { enable(f_cv_upper_boundary); - disable(f_cv_hard_upper_boundary); + if (is_enabled(f_cv_single_cvc) && is_enabled(f_cv_hard_upper_boundary)) { + if (cvm::sqrt(dist2(upper_boundary, cvc_upper_boundary))/width > colvar_boundaries_tol) { + disable(f_cv_hard_upper_boundary); + } + } } + get_keyval_feature(this, conf, "hardLowerBoundary", f_cv_hard_lower_boundary, + is_enabled(f_cv_hard_lower_boundary)); + + get_keyval_feature(this, conf, "hardUpperBoundary", f_cv_hard_upper_boundary, + is_enabled(f_cv_hard_upper_boundary)); + + get_keyval(conf, "expandBoundaries", expand_boundaries, expand_boundaries); + + error_code |= parse_legacy_wall_params(conf); + error_code |= check_grid_parameters(); + } + + return error_code; +} + + +int colvar::parse_legacy_wall_params(std::string const &conf) +{ + int error_code = COLVARS_OK; + colvarmodule *cv = cvm::main(); + + if (is_enabled(f_cv_scalar)) { + // Parse legacy wall options and set up a harmonicWalls bias if needed cvm::real lower_wall_k = 0.0, upper_wall_k = 0.0; cvm::real lower_wall = 0.0, upper_wall = 0.0; @@ -603,13 +654,14 @@ harmonicWalls {\n\ } } - get_keyval_feature(this, conf, "hardLowerBoundary", f_cv_hard_lower_boundary, - is_enabled(f_cv_hard_lower_boundary)); + return error_code; +} - get_keyval_feature(this, conf, "hardUpperBoundary", f_cv_hard_upper_boundary, - is_enabled(f_cv_hard_upper_boundary)); - // consistency checks for boundaries and walls +int colvar::check_grid_parameters() +{ + int error_code = COLVARS_OK; + if (is_enabled(f_cv_lower_boundary) && is_enabled(f_cv_upper_boundary)) { if (lower_boundary >= upper_boundary) { error_code |= cvm::error("Error: the upper boundary, "+ @@ -620,7 +672,6 @@ harmonicWalls {\n\ } } - get_keyval(conf, "expandBoundaries", expand_boundaries, expand_boundaries); if (expand_boundaries && periodic_boundaries()) { error_code |= cvm::error("Error: trying to expand boundaries that already " "cover a whole period of a periodic colvar.\n", @@ -654,14 +705,15 @@ int colvar::init_extended_Lagrangian(std::string const &conf) x_ext.type(colvarvalue::type_notset); v_ext.type(value()); fr.type(value()); - const bool temp_provided = get_keyval(conf, "extendedTemp", temp, - proxy->target_temperature()); + const bool temp_provided = get_keyval(conf, "extendedTemp", temp, proxy->target_temperature()); if (is_enabled(f_cv_external)) { - // In the case of an "external" coordinate, there is no coupling potential: + // In the case of a driven external parameter in the back-end, there is no coupling potential: // only the fictitious mass is meaningful get_keyval(conf, "extendedMass", ext_mass); // Ensure that the computed restraint energy term is zero ext_force_k = 0.0; + // Then we need forces from the back-end + enable(f_cv_total_force_calc); } else { // Standard case of coupling to a geometric colvar if (temp <= 0.0) { // Then a finite temperature is required @@ -779,6 +831,7 @@ int colvar::init_components_type(const std::string& conf, const char* def_config &def_conf, &pos) ) { + cvm::increase_depth(); cvm::log("Initializing " "a new \""+std::string(def_config_key)+"\" component"+ (cvm::debug() ? ", with configuration:\n"+def_conf @@ -791,7 +844,6 @@ int colvar::init_components_type(const std::string& conf, const char* def_config } cvcs.push_back(std::shared_ptr(cvcp)); - cvm::increase_depth(); int error_code_this = cvcp->init(def_conf); if (error_code_this == COLVARS_OK) { // Checking for invalid keywords only if the parsing was successful, otherwise any @@ -851,12 +903,8 @@ void colvar::define_component_types() add_component_type("dipole angle", "dipoleAngle"); add_component_type("dihedral", "dihedral"); add_component_type("hydrogen bond", "hBond"); - - if (proxy->check_atom_name_selections_available() == COLVARS_OK) { - add_component_type("alpha helix", "alpha"); - add_component_type("dihedral principal component", "dihedralPC"); - } - + add_component_type("alpha helix", "alpha"); + add_component_type("dihedral principal component", "dihedralPC"); add_component_type("orientation", "orientation"); add_component_type("orientation angle", "orientationAngle"); add_component_type("orientation projection", "orientationProj"); @@ -888,6 +936,8 @@ void colvar::define_component_types() add_component_type("neural network CV for other CVs", "neuralNetwork"); + add_component_type("CV defined by PyTorch artifical neural network models", "torchANN"); + if (proxy->check_volmaps_available() == COLVARS_OK) { add_component_type("total value of atomic map", "mapTotal"); } @@ -1098,6 +1148,9 @@ int colvar::init_dependencies() { init_feature(f_cv_gradient, "gradient", f_type_dynamic); require_feature_children(f_cv_gradient, f_cvc_gradient); + init_feature(f_cv_apply_force, "apply_force", f_type_dynamic); + require_feature_alt(f_cv_apply_force, f_cv_gradient, f_cv_external); + init_feature(f_cv_collect_gradient, "collect_gradient", f_type_dynamic); require_feature_self(f_cv_collect_gradient, f_cv_gradient); require_feature_self(f_cv_collect_gradient, f_cv_scalar); @@ -1116,6 +1169,10 @@ int colvar::init_dependencies() { init_feature(f_cv_total_force, "total_force", f_type_dynamic); require_feature_alt(f_cv_total_force, f_cv_extended_Lagrangian, f_cv_total_force_calc); + // If this is active, the total force reported to biases (ABF / TI) is from the current step + // therefore it does not include Colvars biases -> it is a "system force" + init_feature(f_cv_total_force_current_step, "total_force_current_step", f_type_dynamic); + // Deps for explicit total force calculation init_feature(f_cv_total_force_calc, "total_force_calculation", f_type_dynamic); require_feature_self(f_cv_total_force_calc, f_cv_scalar); @@ -1134,13 +1191,15 @@ int colvar::init_dependencies() { init_feature(f_cv_extended_Lagrangian, "extended_Lagrangian", f_type_user); require_feature_self(f_cv_extended_Lagrangian, f_cv_scalar); - require_feature_self(f_cv_extended_Lagrangian, f_cv_gradient); + require_feature_self(f_cv_extended_Lagrangian, f_cv_apply_force); init_feature(f_cv_Langevin, "Langevin_dynamics", f_type_user); require_feature_self(f_cv_Langevin, f_cv_extended_Lagrangian); - init_feature(f_cv_external, "external", f_type_user); + init_feature(f_cv_external, "external_parameter", f_type_static); require_feature_self(f_cv_external, f_cv_single_cvc); + // External parameters always report the total force for current step + require_feature_self(f_cv_external, f_cv_total_force_current_step); init_feature(f_cv_single_cvc, "single_component", f_type_static); @@ -1201,10 +1260,7 @@ int colvar::init_dependencies() { init_feature(f_cv_linear, "linear", f_type_static); init_feature(f_cv_homogeneous, "homogeneous", f_type_static); - // because total forces are obtained from the previous time step, - // we cannot (currently) have colvar values and total forces for the same timestep init_feature(f_cv_multiple_ts, "multiple_timestep", f_type_static); - exclude_feature_self(f_cv_multiple_ts, f_cv_total_force_calc); // check that everything is initialized for (i = 0; i < colvardeps::f_cv_ntot; i++) { @@ -1225,6 +1281,10 @@ int colvar::init_dependencies() { feature_states[f_cv_fdiff_velocity].available = cvm::main()->proxy->simulation_running(); + // Some back-ends report current total forces for all colvars + if (cvm::main()->proxy->total_forces_same_step()) + enable(f_cv_total_force_current_step); + return COLVARS_OK; } @@ -1351,7 +1411,6 @@ int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) cvm::log("Calculating colvar \""+this->name+"\", components "+ cvm::to_str(first_cvc)+" through "+cvm::to_str(first_cvc+num_cvcs)+".\n"); - colvarproxy *proxy = cvm::main()->proxy; int error_code = COLVARS_OK; error_code |= check_cvc_range(first_cvc, num_cvcs); @@ -1359,7 +1418,7 @@ int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) return error_code; } - if ((cvm::step_relative() > 0) && (!proxy->total_forces_same_step())){ + if ((cvm::step_relative() > 0) && (!is_enabled(f_cv_total_force_current_step))){ // Use Jacobian derivative from previous timestep error_code |= calc_cvc_total_force(first_cvc, num_cvcs); } @@ -1367,7 +1426,7 @@ int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) error_code |= calc_cvc_values(first_cvc, num_cvcs); error_code |= calc_cvc_gradients(first_cvc, num_cvcs); error_code |= calc_cvc_Jacobians(first_cvc, num_cvcs); - if (proxy->total_forces_same_step()){ + if (is_enabled(f_cv_total_force_current_step)){ // Use Jacobian derivative from this timestep error_code |= calc_cvc_total_force(first_cvc, num_cvcs); } @@ -1384,10 +1443,9 @@ int colvar::collect_cvc_data() if (cvm::debug()) cvm::log("Calculating colvar \""+this->name+"\"'s properties.\n"); - colvarproxy *proxy = cvm::main()->proxy; int error_code = COLVARS_OK; - if ((cvm::step_relative() > 0) && (!proxy->total_forces_same_step())){ + if ((cvm::step_relative() > 0) && (!is_enabled(f_cv_total_force_current_step))){ // Total force depends on Jacobian derivative from previous timestep // collect_cvc_total_forces() uses the previous value of jd error_code |= collect_cvc_total_forces(); @@ -1395,7 +1453,7 @@ int colvar::collect_cvc_data() error_code |= collect_cvc_values(); error_code |= collect_cvc_gradients(); error_code |= collect_cvc_Jacobians(); - if (proxy->total_forces_same_step()){ + if (is_enabled(f_cv_total_force_current_step)){ // Use Jacobian derivative from this timestep error_code |= collect_cvc_total_forces(); } @@ -1609,22 +1667,20 @@ int colvar::collect_cvc_total_forces() if (is_enabled(f_cv_total_force_calc)) { ft.reset(); - if (cvm::step_relative() > 0) { - // get from the cvcs the total forces from the PREVIOUS step - for (size_t i = 0; i < cvcs.size(); i++) { - if (!cvcs[i]->is_enabled()) continue; - if (cvm::debug()) - cvm::log("Colvar component no. "+cvm::to_str(i+1)+ - " within colvar \""+this->name+"\" has total force "+ - cvm::to_str((cvcs[i])->total_force(), - cvm::cv_width, cvm::cv_prec)+".\n"); - // linear combination is assumed - ft += (cvcs[i])->total_force() * (cvcs[i])->sup_coeff / active_cvc_square_norm; - } + for (size_t i = 0; i < cvcs.size(); i++) { + if (!cvcs[i]->is_enabled()) continue; + if (cvm::debug()) + cvm::log("Colvar component no. "+cvm::to_str(i+1)+ + " within colvar \""+this->name+"\" has total force "+ + cvm::to_str((cvcs[i])->total_force(), + cvm::cv_width, cvm::cv_prec)+".\n"); + // linear combination is assumed + ft += (cvcs[i])->total_force() * (cvcs[i])->sup_coeff / active_cvc_square_norm; } if (!(is_enabled(f_cv_hide_Jacobian) && is_enabled(f_cv_subtract_applied_force))) { - // add the Jacobian force to the total force, and don't apply any silent + // This is by far the most common case + // Add the Jacobian force to the total force, and don't apply any silent // correction internally: biases such as colvarbias_abf will handle it // If f_cv_hide_Jacobian is enabled, a force of -fj is present in ft due to the // Jacobian-compensating force @@ -1632,6 +1688,10 @@ int colvar::collect_cvc_total_forces() } } + if (is_enabled(f_cv_total_force_current_step)) { + // Report total force value without waiting for calc_colvar_properties() + ft_reported = ft; + } return COLVARS_OK; } @@ -1733,12 +1793,15 @@ int colvar::calc_colvar_properties() // But we report values at the beginning of the timestep (value at t=0 on the first timestep) x_reported = x_ext; v_reported = v_ext; - // the "total force" with the extended Lagrangian is - // calculated in update_forces_energy() below + // the "total force" for the extended Lagrangian is calculated in update_forces_energy() below + // A future improvement could compute a "system force" here, borrowing a part of update_extended_Lagrangian() + // this would change the behavior of eABF with respect to other biases + // by enabling f_cv_total_force_current_step, and reducing the total force to a system force + // giving the behavior of f_cv_subtract_applied_force - this is correct for WTM-eABF etc. } else { - if (is_enabled(f_cv_subtract_applied_force)) { + if (is_enabled(f_cv_subtract_applied_force) && !cvm::proxy->total_forces_same_step()) { // correct the total force only if it has been measured // TODO add a specific test instead of relying on sq norm if (ft.norm2() > 0.0) { @@ -1825,7 +1888,8 @@ void colvar::update_extended_Lagrangian() // Integrate with slow timestep (if time_step_factor != 1) cvm::real dt = cvm::dt() * cvm::real(time_step_factor); - colvarvalue f_ext(fr.type()); // force acting on the extended variable + // Force acting on the extended variable + colvarvalue f_ext(fr.type()); f_ext.reset(); if (is_enabled(f_cv_external)) { @@ -1834,13 +1898,13 @@ void colvar::update_extended_Lagrangian() f += fb_actual; } - // fr: bias force on extended variable (without harmonic spring), for output in trajectory - fr = f; - // External force has been scaled for an inner-timestep impulse (for the back-end integrator) // here we scale it back because this integrator uses only the outer (long) timestep f_ext = f / cvm::real(time_step_factor); + // fr: bias force on extended variable (without harmonic spring), for output in trajectory + fr = f_ext; + colvarvalue f_system(fr.type()); // force exterted by the system on the extended DOF if (is_enabled(f_cv_external)) { @@ -1863,14 +1927,18 @@ void colvar::update_extended_Lagrangian() } f_ext += f_system; - if (is_enabled(f_cv_subtract_applied_force)) { - // Report a "system" force without the biases on this colvar - // that is, just the spring force (or alchemical force) - ft_reported = f_system; - } else { - // The total force acting on the extended variable is f_ext - // This will be used in the next timestep - ft_reported = f_ext; + if ( ! is_enabled(f_cv_total_force_current_step)) { + if (is_enabled(f_cv_subtract_applied_force)) { + // Report a "system" force without the biases on this colvar + // that is, just the spring force (or alchemical force) + ft_reported = f_system; + } else { + // The total force acting on the extended variable is f_ext + // This will be used in the next timestep + ft_reported = f_ext; + } + // Since biases have already been updated, this ft_reported will only be + // communicated to biases at the next timestep } // backup in case we need to revert this integration timestep @@ -2184,12 +2252,10 @@ int colvar::set_cvc_param(std::string const ¶m_name, void const *new_value) bool colvar::periodic_boundaries(colvarvalue const &lb, colvarvalue const &ub) const { if (period > 0.0) { - if ( ((cvm::sqrt(this->dist2(lb, ub))) / this->width) - < 1.0E-10 ) { + if (((cvm::sqrt(this->dist2(lb, ub))) / this->width) < colvar_boundaries_tol) { return true; } } - return false; } @@ -2347,6 +2413,11 @@ int colvar::set_state_params(std::string const &conf) cvm::to_str(x)+"\n"); x_restart = x; after_restart = true; + // Externally driven cv (e.g. alchemical lambda) is imposed by restart value + if (is_enabled(f_cv_external) && is_enabled(f_cv_extended_Lagrangian)) { + // Request immediate sync of driven parameter to back-end code + cvcs[0]->set_value(x, true); + } } if (is_enabled(f_cv_extended_Lagrangian)) { @@ -2489,8 +2560,14 @@ std::string const colvar::get_state_params() const os << " name " << name << "\n" << " x " << std::setprecision(cvm::cv_prec) - << std::setw(cvm::cv_width) - << x << "\n"; + << std::setw(cvm::cv_width); + if (is_enabled(f_cv_external) && is_enabled(f_cv_extended_Lagrangian)) { + // For an external colvar, x is one timestep in the future after integration + // write x at beginning of timestep + os << x_reported << "\n"; + } else { + os << x << "\n"; + } if (is_enabled(f_cv_output_velocity)) { os << " v " diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 443e1e4bdd..1db313f416 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -263,6 +263,12 @@ public: /// Init defaults for grid options int init_grid_parameters(std::string const &conf); + /// Consistency check for the grid paramaters + int check_grid_parameters(); + + /// Read legacy wall keyword (these are biases now) + int parse_legacy_wall_params(std::string const &conf); + /// Init extended Lagrangian parameters int init_extended_Lagrangian(std::string const &conf); @@ -633,6 +639,7 @@ public: class euler_psi; class euler_theta; class neuralNetwork; + class torchANN; class customColvar; // non-scalar components @@ -753,7 +760,7 @@ inline colvarvalue const & colvar::total_force() const inline void colvar::add_bias_force(colvarvalue const &force) { - check_enabled(f_cv_gradient, + check_enabled(f_cv_apply_force, std::string("applying a force to the variable \""+name+"\"")); if (cvm::debug()) { cvm::log("Adding biasing force "+cvm::to_str(force)+" to colvar \""+name+"\".\n"); @@ -778,4 +785,10 @@ inline void colvar::reset_bias_force() { fb_actual.reset(); } + +namespace { + // Tolerance parameter to decide when two boundaries coincide + constexpr cvm::real colvar_boundaries_tol = 1.0e-10; +} + #endif diff --git a/lib/colvars/colvar_rotation_derivative.h b/lib/colvars/colvar_rotation_derivative.h index 50f4f1aa97..ceaf728c36 100644 --- a/lib/colvars/colvar_rotation_derivative.h +++ b/lib/colvars/colvar_rotation_derivative.h @@ -5,11 +5,21 @@ #include #include +#ifndef _noalias +#if defined(__INTEL_COMPILER) || (defined(__PGI) && !defined(__NVCOMPILER)) +#define _noalias restrict +#elif defined(__GNUC__) || defined(__INTEL_LLVM_COMPILER) || defined(__NVCOMPILER) +#define _noalias __restrict +#else +#define _noalias +#endif +#endif + /// \brief Helper function for loading the ia-th atom in the vector pos to x, y and z (C++11 SFINAE is used) template ::value, bool>::type = true> inline void read_atom_coord( size_t ia, const std::vector& pos, - cvm::real* x, cvm::real* y, cvm::real* z) { + cvm::real* _noalias x, cvm::real* _noalias y, cvm::real* _noalias z) { *x = pos[ia].x; *y = pos[ia].y; *z = pos[ia].z; @@ -18,7 +28,7 @@ inline void read_atom_coord( template ::value, bool>::type = true> inline void read_atom_coord( size_t ia, const std::vector& pos, - cvm::real* x, cvm::real* y, cvm::real* z) { + cvm::real* _noalias x, cvm::real* _noalias y, cvm::real* _noalias z) { *x = pos[ia].pos.x; *y = pos[ia].pos.y; *z = pos[ia].pos.z; @@ -26,9 +36,9 @@ inline void read_atom_coord( /// \brief Helper enum class for specifying options in rotation_derivative::prepare_derivative enum class rotation_derivative_dldq { - /// Require the derivative of the leading eigenvalue with respect to the atom coordinats + /// Require the derivative of the leading eigenvalue with respect to the atom coordinates use_dl = 1 << 0, - /// Require the derivative of the leading eigenvector with respect to the atom coordinats + /// Require the derivative of the leading eigenvector with respect to the atom coordinates use_dq = 1 << 1 }; @@ -327,12 +337,13 @@ struct rotation_derivative { * @param[out] dq0_out The output of derivative of Q * @param[out] ds_out The output of derivative of overlap matrix S */ + template void calc_derivative_impl( const cvm::rvector (&ds)[4][4], - cvm::rvector* const dl0_out, - cvm::vector1d* const dq0_out, - cvm::matrix2d* const ds_out) const { - if (ds_out != nullptr) { + cvm::rvector* _noalias const dl0_out, + cvm::vector1d* _noalias const dq0_out, + cvm::matrix2d* _noalias const ds_out) const { + if (use_ds) { // this code path is for debug_gradients, so not necessary to unroll the loop *ds_out = cvm::matrix2d(4, 4); for (int i = 0; i < 4; ++i) { @@ -341,7 +352,7 @@ struct rotation_derivative { } } } - if (dl0_out != nullptr) { + if (use_dl) { /* manually loop unrolling of the following loop: dl0_1.reset(); for (size_t i = 0; i < 4; i++) { @@ -367,7 +378,7 @@ struct rotation_derivative { tmp_Q0Q0[3][2] * ds[3][2] + tmp_Q0Q0[3][3] * ds[3][3]; } - if (dq0_out != nullptr) { + if (use_dq) { // we can skip this check if a fixed-size array is used if (dq0_out->size() != 4) dq0_out->resize(4); /* manually loop unrolling of the following loop: @@ -462,32 +473,21 @@ struct rotation_derivative { * @param[out] ds_1_out The output of derivative of overlap matrix S with * respect to ia-th atom of group 1 */ + template void calc_derivative_wrt_group1( - size_t ia, cvm::rvector* const dl0_1_out = nullptr, - cvm::vector1d* const dq0_1_out = nullptr, - cvm::matrix2d* const ds_1_out = nullptr) const { - if (dl0_1_out == nullptr && dq0_1_out == nullptr) return; + size_t ia, cvm::rvector* _noalias const dl0_1_out = nullptr, + cvm::vector1d* _noalias const dq0_1_out = nullptr, + cvm::matrix2d* _noalias const ds_1_out = nullptr) const { + // if (dl0_1_out == nullptr && dq0_1_out == nullptr) return; cvm::real a2x, a2y, a2z; // we can get rid of the helper function read_atom_coord if C++17 (constexpr) is available read_atom_coord(ia, m_pos2, &a2x, &a2y, &a2z); - cvm::rvector ds_1[4][4]; - ds_1[0][0].set( a2x, a2y, a2z); - ds_1[1][0].set( 0.0, a2z, -a2y); - ds_1[0][1] = ds_1[1][0]; - ds_1[2][0].set(-a2z, 0.0, a2x); - ds_1[0][2] = ds_1[2][0]; - ds_1[3][0].set( a2y, -a2x, 0.0); - ds_1[0][3] = ds_1[3][0]; - ds_1[1][1].set( a2x, -a2y, -a2z); - ds_1[2][1].set( a2y, a2x, 0.0); - ds_1[1][2] = ds_1[2][1]; - ds_1[3][1].set( a2z, 0.0, a2x); - ds_1[1][3] = ds_1[3][1]; - ds_1[2][2].set(-a2x, a2y, -a2z); - ds_1[3][2].set( 0.0, a2z, a2y); - ds_1[2][3] = ds_1[3][2]; - ds_1[3][3].set(-a2x, -a2y, a2z); - calc_derivative_impl(ds_1, dl0_1_out, dq0_1_out, ds_1_out); + const cvm::rvector ds_1[4][4] = { + {{ a2x, a2y, a2z}, { 0.0, a2z, -a2y}, {-a2z, 0.0, a2x}, { a2y, -a2x, 0.0}}, + {{ 0.0, a2z, -a2y}, { a2x, -a2y, -a2z}, { a2y, a2x, 0.0}, { a2z, 0.0, a2x}}, + {{-a2z, 0.0, a2x}, { a2y, a2x, 0.0}, {-a2x, a2y, -a2z}, { 0.0, a2z, a2y}}, + {{ a2y, -a2x, 0.0}, { a2z, 0.0, a2x}, { 0.0, a2z, a2y}, {-a2x, -a2y, a2z}}}; + calc_derivative_impl(ds_1, dl0_1_out, dq0_1_out, ds_1_out); } /*! @brief Calculate the derivatives of S, the leading eigenvalue L and * the leading eigenvector Q with respect to `m_pos2` @@ -499,32 +499,21 @@ struct rotation_derivative { * @param[out] ds_2_out The output of derivative of overlap matrix S with * respect to ia-th atom of group 2 */ + template void calc_derivative_wrt_group2( - size_t ia, cvm::rvector* const dl0_2_out = nullptr, - cvm::vector1d* const dq0_2_out = nullptr, - cvm::matrix2d* const ds_2_out = nullptr) const { - if (dl0_2_out == nullptr && dq0_2_out == nullptr) return; + size_t ia, cvm::rvector* _noalias const dl0_2_out = nullptr, + cvm::vector1d* _noalias const dq0_2_out = nullptr, + cvm::matrix2d* _noalias const ds_2_out = nullptr) const { + // if (dl0_2_out == nullptr && dq0_2_out == nullptr) return; cvm::real a1x, a1y, a1z; // we can get rid of the helper function read_atom_coord if C++17 (constexpr) is available read_atom_coord(ia, m_pos1, &a1x, &a1y, &a1z); - cvm::rvector ds_2[4][4]; - ds_2[0][0].set( a1x, a1y, a1z); - ds_2[1][0].set( 0.0, -a1z, a1y); - ds_2[0][1] = ds_2[1][0]; - ds_2[2][0].set( a1z, 0.0, -a1x); - ds_2[0][2] = ds_2[2][0]; - ds_2[3][0].set(-a1y, a1x, 0.0); - ds_2[0][3] = ds_2[3][0]; - ds_2[1][1].set( a1x, -a1y, -a1z); - ds_2[2][1].set( a1y, a1x, 0.0); - ds_2[1][2] = ds_2[2][1]; - ds_2[3][1].set( a1z, 0.0, a1x); - ds_2[1][3] = ds_2[3][1]; - ds_2[2][2].set(-a1x, a1y, -a1z); - ds_2[3][2].set( 0.0, a1z, a1y); - ds_2[2][3] = ds_2[3][2]; - ds_2[3][3].set(-a1x, -a1y, a1z); - calc_derivative_impl(ds_2, dl0_2_out, dq0_2_out, ds_2_out); + const cvm::rvector ds_2[4][4] = { + {{ a1x, a1y, a1z}, { 0.0, -a1z, a1y}, { a1z, 0.0, -a1x}, {-a1y, a1x, 0.0}}, + {{ 0.0, -a1z, a1y}, { a1x, -a1y, -a1z}, { a1y, a1x, 0.0}, { a1z, 0.0, a1x}}, + {{ a1z, 0.0, -a1x}, { a1y, a1x, 0.0}, {-a1x, a1y, -a1z}, { 0.0, a1z, a1y}}, + {{-a1y, a1x, 0.0}, { a1z, 0.0, a1x}, { 0.0, a1z, a1y}, {-a1x, -a1y, a1z}}}; + calc_derivative_impl(ds_2, dl0_2_out, dq0_2_out, ds_2_out); } }; @@ -585,10 +574,7 @@ void debug_gradients( cvm::real S_new_eigval[4]; cvm::real S_new_eigvec[4][4]; for (size_t ia = 0; ia < pos2.size(); ++ia) { - // cvm::real const &a1x = pos1[ia].x; - // cvm::real const &a1y = pos1[ia].y; - // cvm::real const &a1z = pos1[ia].z; - deriv.calc_derivative_wrt_group2(ia, &dl0_2, &dq0_2, &ds_2); + deriv.template calc_derivative_wrt_group2(ia, &dl0_2, &dq0_2, &ds_2); // make an infitesimal move along each cartesian coordinate of // this atom, and solve again the eigenvector problem for (size_t comp = 0; comp < 3; comp++) { diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index e15b9301a1..054db505f3 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -673,7 +673,7 @@ int cvm::atom_group::add_atom_numbers(std::string const &numbers_conf) } -int cvm::atom_group::add_index_group(std::string const &index_group_name) +int cvm::atom_group::add_index_group(std::string const &index_group_name, bool silent) { std::vector const &index_group_names = cvm::main()->index_group_names; @@ -687,7 +687,10 @@ int cvm::atom_group::add_index_group(std::string const &index_group_name) } if (i_group >= index_group_names.size()) { - return cvm::error("Error: could not find index group "+ + if (silent) + return COLVARS_INPUT_ERROR; + else + return cvm::error("Error: could not find index group "+ index_group_name+" among those already provided.\n", COLVARS_INPUT_ERROR); } @@ -1055,6 +1058,14 @@ void cvm::atom_group::calc_apply_roto_translation() } } + if (is_enabled(f_ag_fit_gradients) && !b_dummy) { + // Save the unrotated frame for fit gradients + pos_unrotated.resize(size()); + for (size_t i = 0; i < size(); ++i) { + pos_unrotated[i] = atoms[i].pos; + } + } + if (is_enabled(f_ag_rotate)) { // rotate the group (around the center of geometry if f_ag_center is // enabled, around the origin otherwise) @@ -1217,23 +1228,30 @@ void cvm::atom_group::calc_fit_gradients() if (cvm::debug()) cvm::log("Calculating fit gradients.\n"); + cvm::atom_group *group_for_fit = fitting_group ? fitting_group : this; + + auto accessor_main = [this](size_t i){return atoms[i].grad;}; + auto accessor_fitting = [&group_for_fit](size_t j, const cvm::rvector& grad){group_for_fit->fit_gradients[j] = grad;}; if (is_enabled(f_ag_center) && is_enabled(f_ag_rotate)) - calc_fit_gradients_impl(); + calc_fit_forces_impl(accessor_main, accessor_fitting); if (is_enabled(f_ag_center) && !is_enabled(f_ag_rotate)) - calc_fit_gradients_impl(); + calc_fit_forces_impl(accessor_main, accessor_fitting); if (!is_enabled(f_ag_center) && is_enabled(f_ag_rotate)) - calc_fit_gradients_impl(); + calc_fit_forces_impl(accessor_main, accessor_fitting); if (!is_enabled(f_ag_center) && !is_enabled(f_ag_rotate)) - calc_fit_gradients_impl(); + calc_fit_forces_impl(accessor_main, accessor_fitting); if (cvm::debug()) cvm::log("Done calculating fit gradients.\n"); } -template -void cvm::atom_group::calc_fit_gradients_impl() { - cvm::atom_group *group_for_fit = fitting_group ? fitting_group : this; +template +void cvm::atom_group::calc_fit_forces_impl( + main_force_accessor_T accessor_main, + fitting_force_accessor_T accessor_fitting) const { + const cvm::atom_group *group_for_fit = fitting_group ? fitting_group : this; // the center of geometry contribution to the gradients cvm::rvector atom_grad; // the rotation matrix contribution to the gradients @@ -1243,17 +1261,13 @@ void cvm::atom_group::calc_fit_gradients_impl() { cvm::vector1d dq0_1(4); // loop 1: iterate over the current atom group for (size_t i = 0; i < size(); i++) { - cvm::atom_pos pos_orig; if (B_ag_center) { - atom_grad += atoms[i].grad; - if (B_ag_rotate) pos_orig = rot_inv * (atoms[i].pos - ref_pos_cog); - } else { - if (B_ag_rotate) pos_orig = atoms[i].pos; + atom_grad += accessor_main(i); } if (B_ag_rotate) { // calculate \partial(R(q) \vec{x}_i)/\partial q) \cdot \partial\xi/\partial\vec{x}_i cvm::quaternion const dxdq = - rot.q.position_derivative_inner(pos_orig, atoms[i].grad); + rot.q.position_derivative_inner(pos_unrotated[i], accessor_main(i)); sum_dxdq[0] += dxdq[0]; sum_dxdq[1] += dxdq[1]; sum_dxdq[2] += dxdq[2]; @@ -1261,26 +1275,45 @@ void cvm::atom_group::calc_fit_gradients_impl() { } } if (B_ag_center) { - if (B_ag_rotate) atom_grad = rot.inverse().matrix() * atom_grad; + if (B_ag_rotate) atom_grad = rot_inv * atom_grad; atom_grad *= (-1.0)/(cvm::real(group_for_fit->size())); } // loop 2: iterate over the fitting group if (B_ag_rotate) rot_deriv->prepare_derivative(rotation_derivative_dldq::use_dq); for (size_t j = 0; j < group_for_fit->size(); j++) { + cvm::rvector fitting_force_grad{0, 0, 0}; if (B_ag_center) { - group_for_fit->fit_gradients[j] = atom_grad; + fitting_force_grad += atom_grad; } if (B_ag_rotate) { - rot_deriv->calc_derivative_wrt_group1(j, nullptr, &dq0_1); + rot_deriv->calc_derivative_wrt_group1(j, nullptr, &dq0_1); // multiply by {\partial q}/\partial\vec{x}_j and add it to the fit gradients - group_for_fit->fit_gradients[j] += sum_dxdq[0] * dq0_1[0] + - sum_dxdq[1] * dq0_1[1] + - sum_dxdq[2] * dq0_1[2] + - sum_dxdq[3] * dq0_1[3]; + fitting_force_grad += sum_dxdq[0] * dq0_1[0] + + sum_dxdq[1] * dq0_1[1] + + sum_dxdq[2] * dq0_1[2] + + sum_dxdq[3] * dq0_1[3]; } + if (cvm::debug()) { + cvm::log(cvm::to_str(fitting_force_grad)); + } + accessor_fitting(j, fitting_force_grad); } } +template +void cvm::atom_group::calc_fit_forces( + main_force_accessor_T accessor_main, + fitting_force_accessor_T accessor_fitting) const { + if (is_enabled(f_ag_center) && is_enabled(f_ag_rotate)) + calc_fit_forces_impl(accessor_main, accessor_fitting); + if (is_enabled(f_ag_center) && !is_enabled(f_ag_rotate)) + calc_fit_forces_impl(accessor_main, accessor_fitting); + if (!is_enabled(f_ag_center) && is_enabled(f_ag_rotate)) + calc_fit_forces_impl(accessor_main, accessor_fitting); + if (!is_enabled(f_ag_center) && !is_enabled(f_ag_rotate)) + calc_fit_forces_impl(accessor_main, accessor_fitting); +} + std::vector cvm::atom_group::positions() const { @@ -1452,17 +1485,72 @@ void cvm::atom_group::apply_force(cvm::rvector const &force) return; } - if (is_enabled(f_ag_rotate)) { + auto ag_force = get_group_force_object(); + for (size_t i = 0; i < size(); ++i) { + ag_force.add_atom_force(i, atoms[i].mass / total_mass * force); + } +} - const auto rot_inv = rot.inverse().matrix(); - for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { - ai->apply_force(rot_inv * ((ai->mass/total_mass) * force)); +cvm::atom_group::group_force_object cvm::atom_group::get_group_force_object() { + return cvm::atom_group::group_force_object(this); +} + +cvm::atom_group::group_force_object::group_force_object(cvm::atom_group* ag): +m_ag(ag), m_group_for_fit(m_ag->fitting_group ? m_ag->fitting_group : m_ag), +m_has_fitting_force(m_ag->is_enabled(f_ag_center) || m_ag->is_enabled(f_ag_rotate)) { + if (m_has_fitting_force) { + if (m_ag->group_forces.size() != m_ag->size()) { + m_ag->group_forces.assign(m_ag->size(), 0); + } else { + std::fill(m_ag->group_forces.begin(), + m_ag->group_forces.end(), 0); } + } +} +cvm::atom_group::group_force_object::~group_force_object() { + if (m_has_fitting_force) { + apply_force_with_fitting_group(); + } +} + +void cvm::atom_group::group_force_object::add_atom_force(size_t i, const cvm::rvector& force) { + if (m_has_fitting_force) { + m_ag->group_forces[i] += force; } else { + // Apply the force directly if we don't use fitting + (*m_ag)[i].apply_force(force); + } +} - for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { - ai->apply_force((ai->mass/total_mass) * force); +void cvm::atom_group::group_force_object::apply_force_with_fitting_group() { + const cvm::rmatrix rot_inv = m_ag->rot.inverse().matrix(); + if (cvm::debug()) { + cvm::log("Applying force on main group " + m_ag->name + ":\n"); + } + for (size_t ia = 0; ia < m_ag->size(); ++ia) { + const cvm::rvector f_ia = rot_inv * m_ag->group_forces[ia]; + (*m_ag)[ia].apply_force(f_ia); + if (cvm::debug()) { + cvm::log(cvm::to_str(f_ia)); + } + } + // Gradients are only available with scalar components, so for a scalar component, + // if f_ag_fit_gradients is disabled, then the forces on the fitting group is not + // computed. For a vector component, we can only know the forces on the fitting + // group, but checking this flag can mimic results that the users expect (if + // "enableFitGradients no" then there is no force on the fitting group). + if (!m_ag->b_dummy && m_ag->is_enabled(f_ag_fit_gradients)) { + auto accessor_main = [this](size_t i){return m_ag->group_forces[i];}; + auto accessor_fitting = [this](size_t j, const cvm::rvector& fitting_force){ + (*(m_group_for_fit))[j].apply_force(fitting_force); + }; + if (cvm::debug()) { + cvm::log("Applying force on the fitting group of main group" + m_ag->name + ":\n"); + } + m_ag->calc_fit_forces(accessor_main, accessor_fitting); + if (cvm::debug()) { + cvm::log("Done applying force on the fitting group of main group" + m_ag->name + ":\n"); } } } diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index d16ca7bd56..528e849df0 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -194,7 +194,7 @@ public: int add_atom_numbers(std::string const &numbers_conf); int add_atoms_of_group(atom_group const * ag); - int add_index_group(std::string const &index_group_name); + int add_index_group(std::string const &index_group_name, bool silent = false); int add_atom_numbers_range(std::string const &range_conf); int add_atom_name_residue_range(std::string const &psf_segid, std::string const &range_conf); @@ -257,8 +257,63 @@ protected: /// \brief Index in the colvarproxy arrays (if the group is scalable) int index; + /// \brief The temporary forces acting on the main group atoms. + /// Currently this is only used for calculating the fitting group forces for + /// non-scalar components. + std::vector group_forces; + public: + /*! @class group_force_object + * @brief A helper class for applying forces on an atom group in a way that + * is aware of the fitting group. NOTE: you are encouraged to use + * get_group_force_object() to get an instance of group_force_object + * instead of constructing directly. + */ + class group_force_object { + public: + /*! @brief Constructor of group_force_object + * @param ag The pointer to the atom group that forces will be applied on. + */ + group_force_object(cvm::atom_group* ag); + /*! @brief Destructor of group_force_object + */ + ~group_force_object(); + /*! @brief Apply force to atom i + * @param i The i-th of atom in the atom group. + * @param force The force being added to atom i. + * + * The function can be used as follows, + * @code + * // In your colvar::cvc::apply_force() loop of a component: + * auto ag_force = atoms->get_group_force_object(); + * for (ia = 0; ia < atoms->size(); ia++) { + * const cvm::rvector f = compute_force_on_atom_ia(); + * ag_force.add_atom_force(ia, f); + * } + * @endcode + * There are actually two scenarios under the hood: + * (i) If the atom group does not have a fitting group, then the force is + * added to atom i directly; + * (ii) If the atom group has a fitting group, the force on atom i will just + * be temporary stashed into ag->group_forces. At the end of the loop + * of apply_force(), the destructor ~group_force_object() will be called, + * which then call apply_force_with_fitting_group(). The forces on the + * main group will be rotated back by multiplying ag->group_forces with + * the inverse rotation. The forces on the fitting group (if + * enableFitGradients is on) will be calculated by calling + * calc_fit_forces. + */ + void add_atom_force(size_t i, const cvm::rvector& force); + private: + cvm::atom_group* m_ag; + cvm::atom_group* m_group_for_fit; + bool m_has_fitting_force; + void apply_force_with_fitting_group(); + }; + + group_force_object get_group_force_object(); + inline cvm::atom & operator [] (size_t const i) { return atoms[i]; @@ -423,6 +478,9 @@ private: /// \brief Center of geometry before any fitting cvm::atom_pos cog_orig; + /// \brief Unrotated atom positions for fit gradients + std::vector pos_unrotated; + public: /// \brief Return the center of geometry of the atomic positions @@ -497,15 +555,60 @@ public: /// \brief Calculate the derivatives of the fitting transformation void calc_fit_gradients(); -/*! @brief Actual implementation of `calc_fit_gradients`. The template is +/*! @brief Actual implementation of `calc_fit_gradients` and + * `calc_fit_forces`. The template is * used to avoid branching inside the loops in case that the CPU * branch prediction is broken (or further migration to GPU code). * @tparam B_ag_center Centered the reference to origin? This should follow * the value of `is_enabled(f_ag_center)`. * @tparam B_ag_rotate Calculate the optimal rotation? This should follow * the value of `is_enabled(f_ag_rotate)`. + * @tparam main_force_accessor_T The type of accessor of the main + * group forces or gradients acting on the rotated frame. + * @tparam fitting_force_accessor_T The type of accessor of the fitting group + * forces or gradients. + * @param accessor_main The accessor of the main group forces or gradients. + * accessor_main(i) should return the i-th force or gradient of the + * rotated main group. + * @param accessor_fitting The accessor of the fitting group forces or gradients. + * accessor_fitting(j, v) should store/apply the j-th atom gradient or + * force in the fitting group. + * + * This function is used to (i) project the gradients of CV with respect to + * rotated main group atoms to fitting group atoms, or (ii) project the forces + * on rotated main group atoms to fitting group atoms, by the following two steps + * (using the goal (ii) for example): + * (1) Loop over the positions of main group atoms and call cvm::quaternion::position_derivative_inner + * to project the forces on rotated main group atoms to the forces on quaternion. + * (2) Loop over the positions of fitting group atoms, compute the gradients of + * \f$\mathbf{q}\f$ with respect to the position of each atom, and then multiply + * that with the force on \f$\mathbf{q}\f$ (chain rule). */ - template void calc_fit_gradients_impl(); + template + void calc_fit_forces_impl( + main_force_accessor_T accessor_main, + fitting_force_accessor_T accessor_fitting) const; + +/*! @brief Calculate or apply the fitting group forces from the main group forces. + * @tparam main_force_accessor_T The type of accessor of the main + * group forces or gradients. + * @tparam fitting_force_accessor_T The type of accessor of the fitting group + * forces or gradients. + * @param accessor_main The accessor of the main group forces or gradients. + * accessor_main(i) should return the i-th force or gradient of the + * main group. + * @param accessor_fitting The accessor of the fitting group forces or gradients. + * accessor_fitting(j, v) should store/apply the j-th atom gradient or + * force in the fitting group. + * + * This function just dispatches the parameters to calc_fit_forces_impl that really + * performs the calculations. + */ + template + void calc_fit_forces( + main_force_accessor_T accessor_main, + fitting_force_accessor_T accessor_fitting) const; /// \brief Derivatives of the fitting transformation std::vector fit_gradients; diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp index fdffdc1794..43b54d672f 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -93,6 +93,8 @@ int colvarbias::init(std::string const &conf) cvm::log("Reinitializing bias \""+name+"\".\n"); } + feature_states[f_cvb_step_zero_data].available = true; + colvar_values.resize(num_variables()); for (i = 0; i < num_variables(); i++) { colvar_values[i].type(colvars[i]->value().type()); @@ -157,7 +159,7 @@ int colvarbias::init_dependencies() { init_feature(f_cvb_step_zero_data, "step_zero_data", f_type_user); init_feature(f_cvb_apply_force, "apply_force", f_type_user); - require_feature_children(f_cvb_apply_force, f_cv_gradient); + require_feature_children(f_cvb_apply_force, f_cv_apply_force); init_feature(f_cvb_bypass_ext_lagrangian, "bypass_extended_Lagrangian_coordinates", f_type_user); @@ -199,6 +201,8 @@ int colvarbias::init_dependencies() { init_feature(f_cvb_extended, "Bias on extended-Lagrangian variables", f_type_static); + init_feature(f_cvb_smp, "smp_computation", f_type_user); + // check that everything is initialized for (i = 0; i < colvardeps::f_cvb_ntot; i++) { if (is_not_set(i)) { @@ -221,8 +225,9 @@ int colvarbias::init_dependencies() { // The feature f_cvb_bypass_ext_lagrangian is only implemented by some derived classes // (initially, harmonicWalls) feature_states[f_cvb_bypass_ext_lagrangian].available = false; - // disabled by default; can be changed by derived classes that implement it - feature_states[f_cvb_bypass_ext_lagrangian].enabled = false; + + // Most biases cannot currently be processed in parallel over threads + feature_states[f_cvb_smp].available = false; return COLVARS_OK; } @@ -704,7 +709,7 @@ int colvarbias::read_state_string(char const *buffer) std::ostream &colvarbias::write_state_data_key(std::ostream &os, std::string const &key, - bool header) + bool header) const { os << (header ? "\n" : "") << key << (header ? "\n" : " "); return os; @@ -712,7 +717,7 @@ std::ostream &colvarbias::write_state_data_key(std::ostream &os, std::string con cvm::memory_stream &colvarbias::write_state_data_key(cvm::memory_stream &os, std::string const &key, - bool /* header */) + bool /* header */) const { os << std::string(key); return os; @@ -792,6 +797,8 @@ int colvarbias_ti::init(std::string const &conf) { int error_code = COLVARS_OK; + key_lookup(conf, "grid", &grid_conf); + get_keyval_feature(this, conf, "writeTISamples", f_cvb_write_ti_samples, is_enabled(f_cvb_write_ti_samples)); @@ -800,18 +807,16 @@ int colvarbias_ti::init(std::string const &conf) f_cvb_write_ti_pmf, is_enabled(f_cvb_write_ti_pmf)); + if (is_enabled(f_cvb_write_ti_pmf)) { + enable(f_cvb_write_ti_samples); + } + if ((num_variables() > 1) && is_enabled(f_cvb_write_ti_pmf)) { return cvm::error("Error: only 1-dimensional PMFs can be written " "on the fly.\n" "Consider using writeTISamples instead and " "post-processing the sampled free-energy gradients.\n", COLVARS_NOT_IMPLEMENTED); - } else { - error_code |= init_grids(); - } - - if (is_enabled(f_cvb_write_ti_pmf)) { - enable(f_cvb_write_ti_samples); } if (is_enabled(f_cvb_calc_ti_samples)) { @@ -831,6 +836,8 @@ int colvarbias_ti::init(std::string const &conf) } } + error_code |= colvarbias_ti::init_grids(); + if (is_enabled(f_cvb_write_ti_pmf) || is_enabled(f_cvb_write_ti_samples)) { cvm::main()->cite_feature("Internal-forces free energy estimator"); } @@ -844,16 +851,15 @@ int colvarbias_ti::init_grids() if (is_enabled(f_cvb_calc_ti_samples)) { if (!ti_avg_forces) { ti_bin.resize(num_variables()); + ti_bin.assign(ti_bin.size(), -1); ti_system_forces.resize(num_variables()); for (size_t icv = 0; icv < num_variables(); icv++) { ti_system_forces[icv].type(variables(icv)->value()); ti_system_forces[icv].is_derivative(); ti_system_forces[icv].reset(); } - ti_avg_forces.reset(new colvar_grid_gradient(colvars)); - ti_count.reset(new colvar_grid_count(colvars)); - ti_avg_forces->samples = ti_count; - ti_count->has_parent_data = true; + ti_count.reset(new colvar_grid_count(colvars, grid_conf)); + ti_avg_forces.reset(new colvar_grid_gradient(colvars, ti_count)); } } @@ -884,8 +890,12 @@ int colvarbias_ti::update_system_forces(std::vector const size_t i; - if (proxy->total_forces_same_step()) { - for (i = 0; i < num_variables(); i++) { + if (cvm::debug()) { + cvm::log("TI bin for bias \"" + name + "\" = " + cvm::to_str(ti_bin) + ".\n"); + } + + for (i = 0; i < num_variables(); i++) { + if (variables(i)->is_enabled(f_cv_total_force_current_step)) { ti_bin[i] = ti_avg_forces->current_bin_scalar(i); } } @@ -894,8 +904,10 @@ int colvarbias_ti::update_system_forces(std::vector const if ((cvm::step_relative() > 0) || proxy->total_forces_same_step()) { if (ti_avg_forces->index_ok(ti_bin)) { for (i = 0; i < num_variables(); i++) { - if (variables(i)->is_enabled(f_cv_subtract_applied_force)) { + if (variables(i)->is_enabled(f_cv_subtract_applied_force) || + (cvm::proxy->total_forces_same_step() && !variables(i)->is_enabled(f_cv_external))) { // this colvar is already subtracting all applied forces + // or the "total force" is really a system force at current step ti_system_forces[i] = variables(i)->total_force(); } else { ti_system_forces[i] = variables(i)->total_force() - @@ -904,14 +916,17 @@ int colvarbias_ti::update_system_forces(std::vector const } } if (cvm::step_relative() > 0 || is_enabled(f_cvb_step_zero_data)) { + if (cvm::debug()) { + cvm::log("Accumulating TI forces for bias \"" + name + "\".\n"); + } ti_avg_forces->acc_value(ti_bin, ti_system_forces); } } } - if (!proxy->total_forces_same_step()) { - // Set the index for use in the next iteration, when total forces come in - for (i = 0; i < num_variables(); i++) { + for (i = 0; i < num_variables(); i++) { + if (!variables(i)->is_enabled(f_cv_total_force_current_step)) { + // Set the index for use in the next iteration, when total forces come in ti_bin[i] = ti_avg_forces->current_bin_scalar(i); } } diff --git a/lib/colvars/colvarbias.h b/lib/colvars/colvarbias.h index 03f93f4315..35438752a1 100644 --- a/lib/colvars/colvarbias.h +++ b/lib/colvars/colvarbias.h @@ -174,14 +174,14 @@ public: /// \param[in,out] os Output stream /// \param[in] key Keyword labeling the header block /// \param[in] header Whether this is the header of a multi-line segment vs a single line - std::ostream &write_state_data_key(std::ostream &os, std::string const &key, bool header = true); + std::ostream &write_state_data_key(std::ostream &os, std::string const &key, bool header = true) const; /// Write a keyword header for a data sequence to an unformatted stream /// \param[in,out] os Output stream /// \param[in] key Keyword labeling the header block /// \param[in] header Ignored cvm::memory_stream &write_state_data_key(cvm::memory_stream &os, std::string const &key, - bool header = true); + bool header = true) const; private: @@ -358,6 +358,9 @@ protected: /// \brief Forces exerted from the system to the associated variables std::vector ti_system_forces; + /// Grid configuration parameters (also used by grids in derived classes) + std::string grid_conf; + /// Averaged system forces std::shared_ptr ti_avg_forces; diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index 6327650863..b01e9de853 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -87,24 +87,25 @@ int colvarbias_abf::init(std::string const &conf) get_keyval(conf, "shared", shared_on, false); if (shared_on) { cvm::main()->cite_feature("Multiple-walker ABF implementation"); - if ((proxy->replica_enabled() != COLVARS_OK) || - (proxy->num_replicas() <= 1)) { - return cvm::error("Error: shared ABF requires more than one replica.", - COLVARS_INPUT_ERROR); - } - cvm::log("shared ABF will be applied among "+ - cvm::to_str(proxy->num_replicas()) + " replicas.\n"); + cvm::main()->cite_feature("Updated multiple-walker ABF implementation"); + + + // Cannot check this here because the replica communicator is obtained later + // in Gromacs + + // if ((proxy->check_replicas_enabled() != COLVARS_OK) || + // (proxy->num_replicas() <= 1)) { + // return cvm::error("Error: shared ABF requires more than one replica.", + // COLVARS_INPUT_ERROR); + // } + // cvm::log("shared ABF will be applied among "+ + // cvm::to_str(proxy->num_replicas()) + " replicas.\n"); // If shared_freq is not set, we default to output_freq get_keyval(conf, "sharedFreq", shared_freq, output_freq); if ( shared_freq && output_freq % shared_freq ) { return cvm::error("Error: outputFreq must be a multiple of sharedFreq.\n"); } - - // Allocate these at init time if possible - local_samples.reset(new colvar_grid_count(colvars)); - local_gradients.reset(new colvar_grid_gradient(colvars, local_samples)); - local_pmf.reset(new integrate_potential(colvars, local_gradients)); } // ************* checking the associated colvars ******************* @@ -124,10 +125,17 @@ int colvarbias_abf::init(std::string const &conf) colvars[i]->enable(f_cv_hide_Jacobian); } - // If any colvar is extended-system, we need to collect the extended - // system gradient - if (colvars[i]->is_enabled(f_cv_extended_Lagrangian)) + // If any colvar is extended-system (restrained, not driven external param), we are running eABF + if (colvars[i]->is_enabled(f_cv_extended_Lagrangian) + && !colvars[i]->is_enabled(f_cv_external)) { enable(f_cvb_extended); + } + + if (!colvars[i]->is_enabled(f_cv_total_force_current_step)) { + // If any colvar does not have current-step total force, then + // we can't do step 0 data + provide(f_cvb_step_zero_data, false); + } // Cannot mix and match coarse time steps with ABF because it gives // wrong total force averages - total force needs to be averaged over @@ -181,12 +189,23 @@ int colvarbias_abf::init(std::string const &conf) cvm::log("Allocating count and free energy gradient grids.\n"); } - samples.reset(new colvar_grid_count(colvars)); - gradients.reset(new colvar_grid_gradient(colvars, samples)); + { + /// Optional custom configuration string for grid parameters + std::string grid_conf; + key_lookup(conf, "grid", &grid_conf); + + samples.reset(new colvar_grid_count(colvars, grid_conf)); + } + gradients.reset(new colvar_grid_gradient(colvars, samples)); // Also use samples as template for sizes gradients->full_samples = full_samples; gradients->min_samples = min_samples; + if (shared_on) { + local_samples.reset(new colvar_grid_count(colvars, samples)); + local_gradients.reset(new colvar_grid_gradient(colvars, local_samples)); + } + // Data for eABF z-based estimator if (is_enabled(f_cvb_extended)) { get_keyval(conf, "CZARestimator", b_CZAR_estimator, true); @@ -198,11 +217,11 @@ int colvarbias_abf::init(std::string const &conf) colvarparse::parse_silent); z_bin.assign(num_variables(), 0); - z_samples.reset(new colvar_grid_count(colvars)); + z_samples.reset(new colvar_grid_count(colvars, samples)); z_samples->request_actual_value(); z_gradients.reset(new colvar_grid_gradient(colvars, z_samples)); z_gradients->request_actual_value(); - czar_gradients.reset(new colvar_grid_gradient(colvars)); + czar_gradients.reset(new colvar_grid_gradient(colvars, nullptr, samples)); } get_keyval(conf, "integrate", b_integrate, num_variables() <= 3); // Integrate for output if d<=3 @@ -216,6 +235,9 @@ int colvarbias_abf::init(std::string const &conf) if (b_CZAR_estimator) { czar_pmf.reset(new integrate_potential(colvars, czar_gradients)); } + if (shared_on) { + local_pmf.reset(new integrate_potential(colvars, local_gradients)); + } // Parameters for integrating initial (and final) gradient data get_keyval(conf, "integrateMaxIterations", integrate_iterations, 10000, colvarparse::parse_silent); get_keyval(conf, "integrateTol", integrate_tol, 1e-6, colvarparse::parse_silent); @@ -228,9 +250,9 @@ int colvarbias_abf::init(std::string const &conf) if (b_CZAR_estimator && shared_on && cvm::main()->proxy->replica_index() == 0) { // The pointers below are used for outputting CZAR data // Allocate grids for collected global data, on replica 0 only - global_z_samples.reset(new colvar_grid_count(colvars)); + global_z_samples.reset(new colvar_grid_count(colvars, samples)); global_z_gradients.reset(new colvar_grid_gradient(colvars, global_z_samples)); - global_czar_gradients.reset(new colvar_grid_gradient(colvars)); + global_czar_gradients.reset(new colvar_grid_gradient(colvars, nullptr, samples)); global_czar_pmf.reset(new integrate_potential(colvars, global_czar_gradients)); } else { // otherwise they are just aliases for the local CZAR grids @@ -244,10 +266,10 @@ int colvarbias_abf::init(std::string const &conf) // This used to be only if "shared" was defined, // but now we allow calling share externally (e.g. from Tcl). if (b_CZAR_estimator) { - z_samples_in.reset(new colvar_grid_count(colvars)); + z_samples_in.reset(new colvar_grid_count(colvars, samples)); z_gradients_in.reset(new colvar_grid_gradient(colvars, z_samples_in)); } - last_samples.reset(new colvar_grid_count(colvars)); + last_samples.reset(new colvar_grid_count(colvars, samples)); last_gradients.reset(new colvar_grid_gradient(colvars, last_samples)); // Any data collected after now is new for shared ABF purposes shared_last_step = cvm::step_absolute(); @@ -315,27 +337,36 @@ int colvarbias_abf::update() size_t i; for (i = 0; i < num_variables(); i++) { bin[i] = samples->current_bin_scalar(i); + if (colvars[i]->is_enabled(f_cv_total_force_current_step)) { + force_bin[i] = bin[i]; + } } - // *********************************************************** // ****** ABF Part I: update the FE gradient estimate ****** // *********************************************************** - if (cvm::proxy->total_forces_same_step()) { - // e.g. in LAMMPS, total forces are current - force_bin = bin; + // Share data first, so that 2d/3d PMF is refreshed using new data for mw-pABF. + // shared_on can be true with shared_freq 0 if we are sharing via script + if (shared_on && shared_freq && + shared_last_step >= 0 && // we have already collected some data + cvm::step_absolute() > shared_last_step && // time has passed since the last sharing timestep + // (avoid re-sharing at last and first ts of successive run statements) + cvm::step_absolute() % shared_freq == 0) { + // Share gradients and samples for shared ABF. + replica_share(); } if (can_accumulate_data() && is_enabled(f_cvb_history_dependent)) { if (cvm::step_relative() > 0 || cvm::proxy->total_forces_same_step()) { + // Note: this will skip step 0 data when available in some cases (extended system), + // but not doing so would make the code more complex if (samples->index_ok(force_bin)) { // Only if requested and within bounds of the grid... - // get total forces (lagging by 1 timestep) from colvars - // and subtract previous ABF force if necessary + // get total force and subtract previous ABF force if necessary update_system_force(); gradients->acc_force(force_bin, system_force); @@ -368,21 +399,11 @@ int colvarbias_abf::update() } } - if (!(cvm::proxy->total_forces_same_step())) { - // e.g. in NAMD, total forces will be available for next timestep - // hence we store the current colvar bin - force_bin = bin; - } + // In some cases, total forces are stored for next timestep + // hence we store the current colvar bin - this is overwritten on a per-colvar basis + // at the top of update() + force_bin = bin; - // Share data after force sample is collected for this time step - // shared_on can be true with shared_freq 0 if we are sharing via script - if (shared_on && shared_freq && - cvm::step_absolute() > shared_last_step && // time has passed since the last sharing timestep - // (avoid re-sharing at last and first ts of successive run statements) - cvm::step_absolute() % shared_freq == 0) { - // Share gradients and samples for shared ABF. - replica_share(); - } // ****************************************************************** // ****** ABF Part II: calculate and apply the biasing force ****** @@ -452,10 +473,13 @@ int colvarbias_abf::update_system_force() // System force from atomic forces (or extended Lagrangian if applicable) for (i = 0; i < num_variables(); i++) { - if (colvars[i]->is_enabled(f_cv_subtract_applied_force)) { + if (colvars[i]->is_enabled(f_cv_subtract_applied_force) + || colvars[i]->is_enabled(f_cv_total_force_current_step)) { // this colvar is already subtracting the ABF force + // or the "total force" is from current step and cannot possibly contain Colvars biases system_force[i] = colvars[i]->total_force().real_value; } else { + // Subtract previous step's bias force from previous step's total force system_force[i] = colvars[i]->total_force().real_value - colvar_forces[i].real_value; } @@ -525,7 +549,7 @@ int colvarbias_abf::replica_share() { colvarproxy *proxy = cvm::main()->proxy; - if (proxy->replica_enabled() != COLVARS_OK) { + if (proxy->check_replicas_enabled() != COLVARS_OK) { cvm::error("Error: shared ABF: No replicas.\n"); return COLVARS_ERROR; } @@ -542,7 +566,7 @@ int colvarbias_abf::replica_share() { if (!local_samples) { // We arrive here if sharing has just been enabled by a script // in which case local arrays have not been initialized yet - local_samples.reset(new colvar_grid_count(colvars)); + local_samples.reset(new colvar_grid_count(colvars, samples)); local_gradients.reset(new colvar_grid_gradient(colvars, local_samples)); local_pmf.reset(new integrate_potential(colvars, local_gradients)); } @@ -662,9 +686,9 @@ int colvarbias_abf::replica_share_CZAR() { // We arrive here if sharing has just been enabled by a script // Allocate grids for collective data, on replica 0 only // overriding CZAR grids that are equal to local ones by default - global_z_samples.reset(new colvar_grid_count(colvars)); + global_z_samples.reset(new colvar_grid_count(colvars, samples)); global_z_gradients.reset(new colvar_grid_gradient(colvars, global_z_samples)); - global_czar_gradients.reset(new colvar_grid_gradient(colvars)); + global_czar_gradients.reset(new colvar_grid_gradient(colvars, nullptr, samples)); global_czar_pmf.reset(new integrate_potential(colvars, global_czar_gradients)); } diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp index 98de275304..aab2c8f593 100644 --- a/lib/colvars/colvarbias_histogram.cpp +++ b/lib/colvars/colvarbias_histogram.cpp @@ -98,10 +98,10 @@ int colvarbias_histogram::init(std::string const &conf) } { - std::string grid_conf; - if (key_lookup(conf, "histogramGrid", &grid_conf)) { + if (key_lookup(conf, "histogramGrid", &grid_conf) || + key_lookup(conf, "grid", &grid_conf)) { grid->parse_params(grid_conf); - grid->check_keywords(grid_conf, "histogramGrid"); + grid->check_keywords(grid_conf, "grid"); } } diff --git a/lib/colvars/colvarbias_histogram.h b/lib/colvars/colvarbias_histogram.h index 2c6ee84d1f..ed3ee346a6 100644 --- a/lib/colvars/colvarbias_histogram.h +++ b/lib/colvars/colvarbias_histogram.h @@ -38,6 +38,7 @@ protected: /// n-dim histogram colvar_grid_scalar *grid; + std::string grid_conf; std::vector bin; std::string out_name, out_name_dx; diff --git a/lib/colvars/colvarbias_histogram_reweight_amd.cpp b/lib/colvars/colvarbias_histogram_reweight_amd.cpp index de2f6d9b8a..3c31e175f2 100644 --- a/lib/colvars/colvarbias_histogram_reweight_amd.cpp +++ b/lib/colvars/colvarbias_histogram_reweight_amd.cpp @@ -11,43 +11,9 @@ #include "colvarproxy.h" #include "colvars_memstream.h" -colvarbias_reweightaMD::colvarbias_reweightaMD(char const *key) - : colvarbias_histogram(key), grid_count(NULL), grid_dV(NULL), - grid_dV_square(NULL), pmf_grid_exp_avg(NULL), pmf_grid_cumulant(NULL), - grad_grid_exp_avg(NULL), grad_grid_cumulant(NULL) -{ -} +colvarbias_reweightaMD::colvarbias_reweightaMD(char const *key) : colvarbias_histogram(key) {} -colvarbias_reweightaMD::~colvarbias_reweightaMD() { - if (grid_dV) { - delete grid_dV; - grid_dV = NULL; - } - if (grid_dV_square) { - delete grid_dV_square; - grid_dV_square = NULL; - } - if (grid_count) { - delete grid_count; - grid_count = NULL; - } - if (pmf_grid_exp_avg) { - delete pmf_grid_exp_avg; - pmf_grid_exp_avg = NULL; - } - if (pmf_grid_cumulant) { - delete pmf_grid_cumulant; - pmf_grid_cumulant = NULL; - } - if (grad_grid_exp_avg) { - delete grad_grid_exp_avg; - grad_grid_exp_avg = NULL; - } - if (grad_grid_cumulant) { - delete grad_grid_cumulant; - grad_grid_cumulant = NULL; - } -} +colvarbias_reweightaMD::~colvarbias_reweightaMD() {} int colvarbias_reweightaMD::init(std::string const &conf) { if (cvm::proxy->accelMD_enabled() == false) { @@ -60,21 +26,21 @@ int colvarbias_reweightaMD::init(std::string const &conf) { get_keyval(conf, "WritePMFGradients", b_write_gradients, true); get_keyval(conf, "historyFreq", history_freq, 0); b_history_files = (history_freq > 0); - grid_count = new colvar_grid_scalar(colvars); + grid_count.reset(new colvar_grid_scalar(colvars, nullptr, false, grid_conf)); grid_count->request_actual_value(); grid->request_actual_value(); - pmf_grid_exp_avg = new colvar_grid_scalar(colvars); + pmf_grid_exp_avg.reset(new colvar_grid_scalar(colvars, grid_count)); if (b_write_gradients) { - grad_grid_exp_avg = new colvar_grid_gradient(colvars); + grad_grid_exp_avg.reset(new colvar_grid_gradient(colvars, nullptr, grid_count)); } if (b_use_cumulant_expansion) { - grid_dV = new colvar_grid_scalar(colvars); - grid_dV_square = new colvar_grid_scalar(colvars); - pmf_grid_cumulant = new colvar_grid_scalar(colvars); + grid_dV.reset(new colvar_grid_scalar(colvars, grid_count)); + grid_dV_square.reset(new colvar_grid_scalar(colvars, grid_count)); + pmf_grid_cumulant.reset(new colvar_grid_scalar(colvars, grid_count)); grid_dV->request_actual_value(); grid_dV_square->request_actual_value(); if (b_write_gradients) { - grad_grid_cumulant = new colvar_grid_gradient(colvars); + grad_grid_cumulant.reset(new colvar_grid_gradient(colvars, nullptr, grid_count)); } } previous_bin.assign(num_variables(), -1); @@ -193,7 +159,7 @@ int colvarbias_reweightaMD::write_exponential_reweighted_pmf( pmf_grid_exp_avg->set_value(i, tmp / count); } } - hist_to_pmf(pmf_grid_exp_avg, grid_count); + hist_to_pmf(pmf_grid_exp_avg.get(), grid_count.get()); pmf_grid_exp_avg->write_multicol(pmf_grid_os); if (!keep_open) { cvm::proxy->close_output_stream(output_pmf); @@ -231,9 +197,9 @@ int colvarbias_reweightaMD::write_cumulant_expansion_pmf( if (!pmf_grid_cumulant_os) { return COLVARS_FILE_ERROR; } - compute_cumulant_expansion_factor(grid_dV, grid_dV_square, - grid_count, pmf_grid_cumulant); - hist_to_pmf(pmf_grid_cumulant, grid_count); + compute_cumulant_expansion_factor(grid_dV.get(), grid_dV_square.get(), + grid_count.get(), pmf_grid_cumulant.get()); + hist_to_pmf(pmf_grid_cumulant.get(), grid_count.get()); pmf_grid_cumulant->write_multicol(pmf_grid_cumulant_os); if (!keep_open) { cvm::proxy->close_output_stream(output_pmf); diff --git a/lib/colvars/colvarbias_histogram_reweight_amd.h b/lib/colvars/colvarbias_histogram_reweight_amd.h index 43759b3bde..3e3bdede26 100644 --- a/lib/colvars/colvarbias_histogram_reweight_amd.h +++ b/lib/colvars/colvarbias_histogram_reweight_amd.h @@ -68,9 +68,9 @@ protected: /// Use cumulant expansion to second order? bool b_use_cumulant_expansion; - colvar_grid_scalar* grid_count; - colvar_grid_scalar* grid_dV; - colvar_grid_scalar* grid_dV_square; + std::shared_ptr grid_count; + std::unique_ptr grid_dV; + std::unique_ptr grid_dV_square; /// Number of timesteps between recording data in history files (if non-zero) size_t history_freq; @@ -90,10 +90,10 @@ protected: private: /// temporary grids for evaluating PMFs - colvar_grid_scalar *pmf_grid_exp_avg; - colvar_grid_scalar *pmf_grid_cumulant; - colvar_grid_gradient *grad_grid_exp_avg; - colvar_grid_gradient *grad_grid_cumulant; + std::unique_ptr pmf_grid_exp_avg; + std::unique_ptr pmf_grid_cumulant; + std::unique_ptr grad_grid_exp_avg; + std::unique_ptr grad_grid_cumulant; }; #endif // COLVARBIAS_HISTOGRAM_REWEIGHT_AMD diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index 905cd17883..1131c88ec5 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -11,27 +11,10 @@ #include #include -// Define function to get the absolute path of a replica file -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -#define GETCWD(BUF, SIZE) ::_getcwd(BUF, SIZE) -#define PATHSEP "\\" -#else -#include -#define GETCWD(BUF, SIZE) ::getcwd(BUF, SIZE) -#define PATHSEP "/" -#endif - -#ifdef __cpp_lib_filesystem -// When std::filesystem is available, use it -#include -#undef GETCWD -#define GETCWD(BUF, SIZE) (std::filesystem::current_path().string().c_str()) -#endif - #include "colvarmodule.h" #include "colvarproxy.h" #include "colvar.h" +#include "colvargrid.h" #include "colvarbias_meta.h" #include "colvars_memstream.h" @@ -49,8 +32,6 @@ colvarbias_meta::colvarbias_meta(char const *key) use_grids = true; grids_freq = 0; rebin_grids = false; - hills_energy = NULL; - hills_energy_gradients = NULL; dump_fes = true; keep_hills = false; @@ -161,9 +142,9 @@ int colvarbias_meta::init(std::string const &conf) get_keyval(conf, "keepHills", keep_hills, keep_hills); get_keyval(conf, "keepFreeEnergyFiles", dump_fes_save, dump_fes_save); - if (hills_energy == NULL) { - hills_energy = new colvar_grid_scalar(colvars); - hills_energy_gradients = new colvar_grid_gradient(colvars); + if (!hills_energy) { + hills_energy.reset(new colvar_grid_scalar(colvars, nullptr, false, grid_conf)); + hills_energy_gradients.reset(new colvar_grid_gradient(colvars, nullptr, hills_energy)); } } else { @@ -209,7 +190,7 @@ int colvarbias_meta::init_replicas_params(std::string const &conf) get_keyval(conf, "replicaID", replica_id, replica_id); if (!replica_id.size()) { - if (proxy->replica_enabled() == COLVARS_OK) { + if (proxy->check_replicas_enabled() == COLVARS_OK) { // Obtain replicaID from the communicator replica_id = cvm::to_str(proxy->replica_index()); cvm::log("Setting replicaID from communication layer: replicaID = "+ @@ -272,7 +253,6 @@ int colvarbias_meta::init_ebmeta_params(std::string const &conf) { int error_code = COLVARS_OK; // for ebmeta - target_dist = NULL; get_keyval(conf, "ebMeta", ebmeta, false); if(ebmeta){ cvm::main()->cite_feature("Ensemble-biased metadynamics (ebMetaD)"); @@ -283,7 +263,7 @@ int colvarbias_meta::init_ebmeta_params(std::string const &conf) "targetDistFile accordingly.\n", COLVARS_INPUT_ERROR); } - target_dist = new colvar_grid_scalar(); + target_dist.reset(new colvar_grid_scalar()); error_code |= target_dist->init_from_colvars(colvars); std::string target_dist_file; get_keyval(conf, "targetDistFile", target_dist_file); @@ -336,33 +316,15 @@ colvarbias_meta::~colvarbias_meta() { colvarbias_meta::clear_state_data(); colvarproxy *proxy = cvm::main()->proxy; - proxy->close_output_stream(replica_hills_file); - proxy->close_output_stream(hills_traj_file_name()); - - if (target_dist) { - delete target_dist; - target_dist = NULL; - } } int colvarbias_meta::clear_state_data() { - if (hills_energy) { - delete hills_energy; - hills_energy = NULL; - } - - if (hills_energy_gradients) { - delete hills_energy_gradients; - hills_energy_gradients = NULL; - } - hills.clear(); hills_off_grid.clear(); - return COLVARS_OK; } @@ -451,8 +413,11 @@ int colvarbias_meta::update() error_code |= update_grid_params(); // add new biasing energy/forces error_code |= update_bias(); - // update grid content to reflect new bias - error_code |= update_grid_data(); + + if (use_grids) { + // update grid content to reflect new bias + error_code |= update_grid_data(); + } if (comm != single_replica && (cvm::step_absolute() % replica_update_freq) == 0) { @@ -539,9 +504,9 @@ int colvarbias_meta::update_grid_params() // map everything into new grids colvar_grid_scalar *new_hills_energy = - new colvar_grid_scalar(*hills_energy); + new colvar_grid_scalar(*hills_energy); colvar_grid_gradient *new_hills_energy_gradients = - new colvar_grid_gradient(*hills_energy_gradients); + new colvar_grid_gradient(*hills_energy_gradients); // supply new boundaries to the new grids @@ -556,10 +521,8 @@ int colvarbias_meta::update_grid_params() new_hills_energy->map_grid(*hills_energy); new_hills_energy_gradients->map_grid(*hills_energy_gradients); - delete hills_energy; - delete hills_energy_gradients; - hills_energy = new_hills_energy; - hills_energy_gradients = new_hills_energy_gradients; + hills_energy.reset(new_hills_energy); + hills_energy_gradients.reset(new_hills_energy_gradients); curr_bin = hills_energy->get_colvars_index(); if (cvm::debug()) @@ -641,8 +604,7 @@ int colvarbias_meta::update_grid_data() { if ((cvm::step_absolute() % grids_freq) == 0) { // map the most recent gaussians to the grids - project_hills(new_hills_begin, hills.end(), - hills_energy, hills_energy_gradients); + project_hills(new_hills_begin, hills.end(), hills_energy.get(), hills_energy_gradients.get()); new_hills_begin = hills.end(); // TODO: we may want to condense all into one replicas array, @@ -651,8 +613,8 @@ int colvarbias_meta::update_grid_data() for (size_t ir = 0; ir < replicas.size(); ir++) { replicas[ir]->project_hills(replicas[ir]->new_hills_begin, replicas[ir]->hills.end(), - replicas[ir]->hills_energy, - replicas[ir]->hills_energy_gradients); + replicas[ir]->hills_energy.get(), + replicas[ir]->hills_energy_gradients.get()); replicas[ir]->new_hills_begin = replicas[ir]->hills.end(); } } @@ -670,11 +632,20 @@ int colvarbias_meta::calc_energy(std::vector const *values) replicas[ir]->bias_energy = 0.0; } - std::vector const curr_bin = values ? - hills_energy->get_colvars_index(*values) : - hills_energy->get_colvars_index(); + bool index_ok = false; + std::vector curr_bin; - if (hills_energy->index_ok(curr_bin)) { + if (use_grids) { + + curr_bin = values ? + hills_energy->get_colvars_index(*values) : + hills_energy->get_colvars_index(); + + index_ok = hills_energy->index_ok(curr_bin); + + } + + if ( index_ok ) { // index is within the grid: get the energy from there for (ir = 0; ir < replicas.size(); ir++) { @@ -723,11 +694,20 @@ int colvarbias_meta::calc_forces(std::vector const *values) } } - std::vector const curr_bin = values ? - hills_energy->get_colvars_index(*values) : - hills_energy->get_colvars_index(); + bool index_ok = false; + std::vector curr_bin; - if (hills_energy->index_ok(curr_bin)) { + if (use_grids) { + + curr_bin = values ? + hills_energy->get_colvars_index(*values) : + hills_energy->get_colvars_index(); + + index_ok = hills_energy->index_ok(curr_bin); + + } + + if ( index_ok ) { for (ir = 0; ir < replicas.size(); ir++) { cvm::real const *f = &(replicas[ir]->hills_energy_gradients->value(curr_bin)); for (ic = 0; ic < num_variables(); ic++) { @@ -959,8 +939,7 @@ void colvarbias_meta::project_hills(colvarbias_meta::hill_iter h_first, void colvarbias_meta::recount_hills_off_grid(colvarbias_meta::hill_iter h_first, - colvarbias_meta::hill_iter h_last, - colvar_grid_scalar * /* he */) + colvarbias_meta::hill_iter h_last) { hills_off_grid.clear(); @@ -1078,9 +1057,13 @@ int colvarbias_meta::update_replicas_registry() (replicas.back())->comm = multiple_replicas; if (use_grids) { - (replicas.back())->hills_energy = new colvar_grid_scalar(colvars); - (replicas.back())->hills_energy_gradients = new colvar_grid_gradient(colvars); + (replicas.back()) + ->hills_energy.reset(new colvar_grid_scalar(colvars, hills_energy)); + (replicas.back()) + ->hills_energy_gradients.reset( + new colvar_grid_gradient(colvars, nullptr, hills_energy)); } + if (is_enabled(f_cvb_calc_ti_samples)) { (replicas.back())->enable(f_cvb_calc_ti_samples); (replicas.back())->colvarbias_ti::init_grids(); @@ -1336,34 +1319,40 @@ template IST &colvarbias_meta::read_state_data_template_(IST &is) { if (use_grids) { - colvar_grid_scalar *hills_energy_backup = NULL; - colvar_grid_gradient *hills_energy_gradients_backup = NULL; + std::shared_ptr hills_energy_backup; + std::shared_ptr hills_energy_gradients_backup; - if (has_data) { + bool const need_backup = has_data; + + if (need_backup) { if (cvm::debug()) - cvm::log("Backupping grids for metadynamics bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n"); - hills_energy_backup = hills_energy; - hills_energy_gradients_backup = hills_energy_gradients; - hills_energy = new colvar_grid_scalar(colvars); - hills_energy_gradients = new colvar_grid_gradient(colvars); + cvm::log("Backing up grids for metadynamics bias \"" + this->name + "\"" + + ((comm != single_replica) ? ", replica \"" + replica_id + "\"" : "") + ".\n"); + + hills_energy_backup = std::move(hills_energy); + hills_energy_gradients_backup = std::move(hills_energy_gradients); + hills_energy.reset(new colvar_grid_scalar(colvars, hills_energy)); + hills_energy_gradients.reset(new colvar_grid_gradient(colvars, nullptr, hills_energy)); } - read_grid_data_template_(is, "hills_energy", hills_energy, - hills_energy_backup); + read_grid_data_template_(is, "hills_energy", hills_energy.get(), + hills_energy_backup.get()); - read_grid_data_template_( - is, "hills_energy_gradients", hills_energy_gradients, hills_energy_gradients_backup); + read_grid_data_template_(is, "hills_energy_gradients", + hills_energy_gradients.get(), + hills_energy_gradients_backup.get()); if (is) { cvm::log(" successfully read the biasing potential and its gradients from grids.\n"); - if (hills_energy_backup != nullptr) { - // Now that we have successfully updated the grids, delete the backup copies - delete hills_energy_backup; - delete hills_energy_gradients_backup; - } } else { + if (need_backup) { + if (cvm::debug()) + cvm::log("Restoring grids from backup for metadynamics bias \"" + this->name + "\"" + + ((comm != single_replica) ? ", replica \"" + replica_id + "\"" : "") + ".\n"); + // Restoring content from original grid + hills_energy->copy_grid(*hills_energy_backup); + hills_energy_gradients->copy_grid(*hills_energy_gradients_backup); + } return is; } } @@ -1451,10 +1440,12 @@ void colvarbias_meta::rebin_grids_after_restart() // read from the configuration file), and project onto them the // grids just read from the restart file - colvar_grid_scalar *new_hills_energy = - new colvar_grid_scalar(colvars); - colvar_grid_gradient *new_hills_energy_gradients = - new colvar_grid_gradient(colvars); + // Create new grids based on the configuration parameters, because reading from the state + // file automatically sets the old parameters + std::shared_ptr new_hills_energy( + new colvar_grid_scalar(colvars, nullptr, false, grid_conf)); + std::shared_ptr new_hills_energy_gradients( + new colvar_grid_gradient(colvars, nullptr, new_hills_energy)); if (cvm::debug()) { std::ostringstream tmp_os; @@ -1468,9 +1459,9 @@ void colvarbias_meta::rebin_grids_after_restart() if (restart_keep_hills && !hills.empty()) { // if there are hills, recompute the new grids from them cvm::log("Rebinning the energy and forces grids from "+ - cvm::to_str(hills.size())+" hills (this may take a while)...\n"); - project_hills(hills.begin(), hills.end(), - new_hills_energy, new_hills_energy_gradients, true); + cvm::to_str(hills.size())+" hills (this may take a bit)...\n"); + project_hills(hills.begin(), hills.end(), new_hills_energy.get(), + new_hills_energy_gradients.get(), true); cvm::log("rebinning done.\n"); } else { @@ -1481,15 +1472,13 @@ void colvarbias_meta::rebin_grids_after_restart() new_hills_energy_gradients->map_grid(*hills_energy_gradients); } - delete hills_energy; - delete hills_energy_gradients; - hills_energy = new_hills_energy; - hills_energy_gradients = new_hills_energy_gradients; + hills_energy = std::move(new_hills_energy); + hills_energy_gradients = std::move(new_hills_energy_gradients); // assuming that some boundaries have expanded, eliminate those // off-grid hills that aren't necessary any more if (!hills.empty()) - recount_hills_off_grid(hills.begin(), hills.end(), hills_energy); + recount_hills_off_grid(hills.begin(), hills.end()); } } @@ -1718,29 +1707,17 @@ int colvarbias_meta::setup_output() if (comm == multiple_replicas) { - // TODO: one may want to specify the path manually for intricated filesystems? - char *pwd = new char[3001]; - if (GETCWD(pwd, 3000) == nullptr) { - if (pwd != nullptr) { // - delete[] pwd; - } - return cvm::error("Error: cannot get the path of the current working directory.\n", - COLVARS_BUG_ERROR); - } - + auto const pwd = cvm::main()->proxy->get_current_work_dir(); replica_list_file = - (std::string(pwd)+std::string(PATHSEP)+ - this->name+"."+replica_id+".files.txt"); + cvm::main()->proxy->join_paths(pwd, this->name + "." + replica_id + ".files.txt"); // replica_hills_file and replica_state_file are those written // by the current replica; within the mirror biases, they are // those by another replica - replica_hills_file = - (std::string(pwd)+std::string(PATHSEP)+ - cvm::output_prefix()+".colvars."+this->name+"."+replica_id+".hills"); - replica_state_file = - (std::string(pwd)+std::string(PATHSEP)+ - cvm::output_prefix()+".colvars."+this->name+"."+replica_id+".state"); - delete[] pwd; + replica_hills_file = cvm::main()->proxy->join_paths( + pwd, cvm::output_prefix() + ".colvars." + this->name + "." + replica_id + ".hills"); + + replica_state_file = cvm::main()->proxy->join_paths( + pwd, cvm::output_prefix() + ".colvars." + this->name + "." + replica_id + ".state"); // now register this replica @@ -1842,7 +1819,7 @@ template OST &colvarbias_meta::write_state_data_template_(OST &os // this is a very good time to project hills, if you haven't done // it already! - project_hills(new_hills_begin, hills.end(), hills_energy, hills_energy_gradients); + project_hills(new_hills_begin, hills.end(), hills_energy.get(), hills_energy_gradients.get()); new_hills_begin = hills.end(); // write down the grids to the restart file diff --git a/lib/colvars/colvarbias_meta.h b/lib/colvars/colvarbias_meta.h index a765a60c71..57aa21ed6b 100644 --- a/lib/colvars/colvarbias_meta.h +++ b/lib/colvars/colvarbias_meta.h @@ -10,12 +10,16 @@ #ifndef COLVARBIAS_META_H #define COLVARBIAS_META_H -#include -#include #include +#include +#include +#include #include "colvarbias.h" -#include "colvargrid.h" + +class colvar_grid_scalar; +class colvar_grid_gradient; + /// Metadynamics bias (implementation of \link colvarbias \endlink) @@ -123,8 +127,7 @@ protected: hill_iter new_hills_off_grid_begin; /// Regenerate the hills_off_grid list - void recount_hills_off_grid(hill_iter h_first, hill_iter h_last, - colvar_grid_scalar *ge); + void recount_hills_off_grid(hill_iter h_first, hill_iter h_last); template OST &write_hill_template_(OST &os, colvarbias_meta::hill const &h); @@ -211,7 +214,7 @@ protected: bool ebmeta; /// Target distribution for EBmeta - colvar_grid_scalar* target_dist; + std::unique_ptr target_dist; /// Number of equilibration steps for EBmeta cvm::step_number ebmeta_equil_steps; @@ -223,15 +226,14 @@ protected: bool safely_read_restart; /// Hill energy, cached on a grid - colvar_grid_scalar *hills_energy; + std::shared_ptr hills_energy; /// Hill forces, cached on a grid - colvar_grid_gradient *hills_energy_gradients; + std::shared_ptr hills_energy_gradients; - /// \brief Project the selected hills onto grids - void project_hills(hill_iter h_first, hill_iter h_last, - colvar_grid_scalar *ge, colvar_grid_gradient *gf, - bool print_progress = false); + /// Project the selected hills onto grids + void project_hills(hill_iter h_first, hill_iter h_last, colvar_grid_scalar *ge, + colvar_grid_gradient *gf, bool print_progress = false); // Multiple Replicas variables and functions diff --git a/lib/colvars/colvarbias_opes.cpp b/lib/colvars/colvarbias_opes.cpp new file mode 100644 index 0000000000..9caeb967e0 --- /dev/null +++ b/lib/colvars/colvarbias_opes.cpp @@ -0,0 +1,1996 @@ +// This code is mainly adapted from the PLUMED opes module, which uses the +// LGPLv3 license as shown below: +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Copyright (c) 2020-2021 of Michele Invernizzi. + + This file is part of the OPES plumed module. + + The OPES plumed module is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + The OPES plumed module is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with plumed. If not, see . ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + +#include "colvarbias_opes.h" +#include "colvarbias.h" +#include "colvardeps.h" +#include "colvarproxy.h" +#include "colvars_memstream.h" +#include "colvargrid.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +colvarbias_opes::colvarbias_opes(char const *key): + colvarbias(key), m_kbt(0), m_barrier(0), m_biasfactor(0), + m_bias_prefactor(0), m_temperature(0), + m_pace(0), m_adaptive_sigma_stride(0), + m_adaptive_counter(0), m_counter(1), + m_compression_threshold(0), m_compression_threshold2(0), + m_adaptive_sigma(false), m_fixed_sigma(false), + m_no_zed(false), m_nlist(false), m_recursive_merge(true), + m_nlist_param(2, 0), m_epsilon(0), m_sum_weights(0), + m_sum_weights2(0), m_cutoff(0), m_cutoff2(0), + m_zed(1), m_old_kdenorm(0), m_kdenorm(0), + m_val_at_cutoff(0), m_nlist_center(0), m_nlist_index(0), + m_nlist_steps(0), m_nlist_update(false), + m_nlist_pace_reset(false), m_nker(0), m_calc_work(false), + m_work(0), comm(single_replica), m_num_walkers(1), + m_num_threads(1), m_nlker(0), m_traj_output_frequency(0), + m_traj_line(traj_line{0}), m_is_first_step(true), + m_pmf_grid_on(false), m_reweight_grid(nullptr), + m_pmf_grid(nullptr), m_pmf_hist_freq(0), m_pmf_shared(true), + m_explore(false), m_inf_biasfactor(false) +{ +#ifdef OPES_THREADING + provide(f_cvb_smp, cvm::proxy->get_smp_mode() == colvarproxy_smp::smp_mode_t::inner_loop); + if (is_available(f_cv_smp)){ + enable(f_cvb_smp); // Enabled by default + } +#endif +} + +int colvarbias_opes::init(const std::string& conf) { + int error_code = colvarbias::init(conf); + enable(f_cvb_scalar_variables); + get_keyval_feature(this, conf, "applyBias", f_cvb_apply_force, true); + m_temperature = cvm::proxy->target_temperature(); + m_kbt = m_temperature * cvm::proxy->boltzmann(); + get_keyval(conf, "newHillFrequency", m_pace); + get_keyval(conf, "barrier", m_barrier); + get_keyval(conf, "explore", m_explore, false); + if (m_barrier < 0) { + return cvm::error("the barrier should be greater than zero", COLVARS_INPUT_ERROR); + } + std::string biasfactor_str; + get_keyval(conf, "biasfactor", biasfactor_str); + if ((cvm::proxy->target_temperature() == 0.0) && cvm::proxy->simulation_running()) { + cvm::log("WARNING: OPES should not be run without a thermostat or at 0 Kelvin!\n"); + } + m_biasfactor = m_barrier / m_kbt; + m_inf_biasfactor = biasfactor_str == "inf" || biasfactor_str == "INF"; + if (m_inf_biasfactor) { + m_biasfactor = std::numeric_limits::infinity(); + m_bias_prefactor = 1; + if (m_explore) { + return cvm::error("biasfactor cannot be infinity in the explore mode."); + } + } else { + if (biasfactor_str.size() > 0) { + try { + m_biasfactor = std::stod(biasfactor_str); + } catch (const std::exception& e) { + return cvm::error(e.what(), COLVARS_INPUT_ERROR); + } + } + if (m_biasfactor <= 1.0) { + return cvm::error("biasfactor must be greater than one (use \"inf\" for uniform target)"); + } + m_bias_prefactor = 1 - 1.0 / m_biasfactor; + } + if (m_explore) { + m_bias_prefactor = m_biasfactor - 1; + } + get_keyval(conf, "adaptiveSigma", m_adaptive_sigma, false); + m_sigma0.resize(num_variables()); + get_keyval(conf, "gaussianSigma", m_sigma0, std::vector(num_variables())); + m_av_cv.assign(num_variables(), 0); + m_av_M2.assign(num_variables(), 0); + if (m_adaptive_sigma) { + get_keyval(conf, "adaptiveSigmaStride", m_adaptive_sigma_stride, 0); + if (m_inf_biasfactor) { + return cvm::error("cannot use infinite biasfactor with adaptive sigma", + COLVARS_INPUT_ERROR); + } + if (m_adaptive_sigma_stride == 0) { + m_adaptive_sigma_stride = m_pace * 10; + } + if (m_adaptive_sigma_stride < m_pace) { + return cvm::error("It is better to choose an adaptiveSigmaStride >= newHillFrequency.\n", COLVARS_INPUT_ERROR); + } + } else { + if (m_sigma0.size() != num_variables()) { + return cvm::error("number of sigma parameters does not match the number of variables", + COLVARS_INPUT_ERROR); + } + if (m_explore) { + for (size_t i = 0; i < num_variables(); ++i) { + m_sigma0[i] *= std::sqrt(m_biasfactor); + } + } + } + get_keyval(conf, "gaussianSigmaMin", m_sigma_min); + if ((m_sigma_min.size() != 0) && (m_sigma_min.size() != num_variables())) { + return cvm::error("incorrect number of parameters of gaussianSigmaMin"); + } + if (m_sigma_min.size() > 0 && !m_adaptive_sigma) { + for (size_t i = 0; i < num_variables(); ++i) { + if (m_sigma_min[i] > m_sigma0[i]) { + return cvm::error("gaussianSigmaMin of variable " + cvm::to_str(i) + " should be smaller than sigma"); + } + } + } + get_keyval(conf, "epsilon", m_epsilon, std::exp(-m_barrier/m_bias_prefactor/m_kbt)); + if (m_epsilon <= 0) { + return cvm::error("you must choose a value of epsilon greater than zero"); + } + m_sum_weights = std::pow(m_epsilon, m_bias_prefactor); + m_sum_weights2 = m_sum_weights * m_sum_weights; + if (m_explore) { + get_keyval(conf, "kernelCutoff", m_cutoff, std::sqrt(2.0*m_barrier/m_kbt)); + } else { + get_keyval(conf, "kernelCutoff", m_cutoff, std::sqrt(2.0*m_barrier/m_bias_prefactor/m_kbt)); + } + if (m_cutoff <= 0) { + return cvm::error("you must choose a value of kernelCutoff greater than zero"); + } + m_cutoff2 = m_cutoff * m_cutoff; + m_val_at_cutoff = std::exp(-0.5 * m_cutoff2); + get_keyval(conf, "compressionThreshold", m_compression_threshold, 1); + if (m_compression_threshold != 0) { + if (m_compression_threshold < 0 || m_compression_threshold > m_cutoff) { + return cvm::error("compressionThreshold cannot be smaller than 0 or larger than kernelCutoff", COLVARS_INPUT_ERROR); + } + } + m_compression_threshold2 = m_compression_threshold * m_compression_threshold; + get_keyval(conf, "neighborList", m_nlist, false); + if (m_nlist) { + get_keyval(conf, "neighborListNewHillReset", m_nlist_pace_reset, false); + std::vector nlist_param; + get_keyval(conf, "neighborListParameters", nlist_param, std::vector()); + if (nlist_param.empty()) { + m_nlist_param[0] = 3.0; //*cutoff2_ -> max distance of neighbors + m_nlist_param[1] = 0.5; //*nlist_dev2_[i] -> condition for rebuilding + } else { + if (nlist_param.size() != 2) { + return cvm::error("two cutoff parameters are needed for the neighbor list", COLVARS_INPUT_ERROR); + } + if (nlist_param[0] <= 1.0) { + return cvm::error("the first of neighborListParam must be greater than 1.0. The smaller the first, the smaller should be the second as well", COLVARS_INPUT_ERROR); + } + const cvm::real min_PARAM_1 = (1.-1./std::sqrt(nlist_param[0]))+0.16; + if (nlist_param[1] <= 0) { + return cvm::error("the second of neighborListParam must be greater than 0", COLVARS_INPUT_ERROR); + } + if (nlist_param[1] > min_PARAM_1) { + return cvm::error("the second of neighborListParam must be smaller to avoid systematic errors. Largest suggested value is: 1.16-1/sqrt(param_0) = " + cvm::to_str(min_PARAM_1), COLVARS_INPUT_ERROR); + } + m_nlist_param = nlist_param; + } + m_nlist_center.resize(num_variables()); + m_nlist_dev2.resize(num_variables(), 0); + m_nlist_steps = 0; + m_nlist_update = true; + } + get_keyval(conf, "noZed", m_no_zed, false); + if (m_no_zed) { + m_sum_weights = 1; + m_sum_weights2 = 1; + } + get_keyval(conf, "fixedGaussianSigma", m_fixed_sigma, false); + get_keyval(conf, "recursiveMerge", m_recursive_merge, true); + get_keyval(conf, "calcWork", m_calc_work, false); + bool b_replicas = false; + get_keyval(conf, "multipleReplicas", b_replicas, false); + +#ifdef OPES_THREADING + get_keyval_feature(this, conf, "smp", f_cvb_smp, is_enabled(f_cvb_smp)); + if (is_enabled(f_cv_smp)) { + m_num_threads = cvm::proxy->smp_num_threads(); + } else { + m_num_threads = 1; + } +#else + // if (m_num_threads > 1) { + // return cvm::error("Multithreading in OPES is not compiled.\n"); + // } + m_num_threads = 1; +#endif + bool serial = false; + get_keyval(conf, "serial", serial, false); + if (serial) m_num_threads = 1; + comm = b_replicas ? multiple_replicas : single_replica; + if (comm == multiple_replicas) { + colvarproxy *proxy = cvm::main()->proxy; + get_keyval(conf, "replicaID", replica_id, replica_id); + get_keyval(conf, "sharedFreq", shared_freq, output_freq); + if (!replica_id.size()) { + if (proxy->check_replicas_enabled() == COLVARS_OK) { + // Obtain replicaID from the communicator + replica_id = cvm::to_str(proxy->replica_index()); + cvm::log("Setting replicaID from communication layer: replicaID = "+ + replica_id+".\n"); + } else { + return cvm::error("Error: using more than one replica, but replicaID " + "could not be obtained.\n", COLVARS_INPUT_ERROR); + } + } + m_num_walkers = proxy->num_replicas(); + } + get_keyval(conf, "pmf", m_pmf_grid_on, false); + if (m_pmf_grid_on) { + std::vector pmf_cv_name; + get_keyval(conf, "pmfColvars", pmf_cv_name); + for (auto it = pmf_cv_name.begin(); it != pmf_cv_name.end(); ++it) { + bool found = false; + for (size_t i = 0; i < num_variables(); ++i) { + if (variables(i)->name == (*it)) { + if (variables(i)->enable(f_cv_grid) != COLVARS_OK) { + return cvm::error("CV " + (*it) + " does not support grid\n"); + } + m_pmf_cvs.push_back(variables(i)); + found = true; + break; + } + } + if (!found) { + return cvm::error("CV " + (*it) + " not found\n"); + } + } + key_lookup(conf, "grid", &grid_conf); + m_reweight_grid.reset(new colvar_grid_scalar(m_pmf_cvs, nullptr, false, grid_conf)); + m_pmf_grid.reset(new colvar_grid_scalar(m_pmf_cvs, m_reweight_grid)); + get_keyval(conf, "pmfHistoryFrequency", m_pmf_hist_freq, 0); + if (comm == multiple_replicas) { + get_keyval(conf, "pmfShared", m_pmf_shared, true); + if (m_pmf_shared) { + m_global_reweight_grid.reset(new colvar_grid_scalar(m_pmf_cvs, m_reweight_grid)); + m_global_pmf_grid.reset(new colvar_grid_scalar(m_pmf_cvs, m_reweight_grid)); + } + } + } + m_kdenorm = m_explore? m_counter : m_sum_weights; + m_old_kdenorm = m_kdenorm; + m_traj_line.rct = m_kbt * cvm::logn(m_sum_weights / m_counter); + m_traj_line.zed = m_zed; + m_traj_line.neff = (1 + m_sum_weights) * (1 + m_sum_weights) / (1 + m_sum_weights2); + m_traj_line.nker = m_kernels.size(); + get_keyval(conf, "printTrajectoryFrequency", m_traj_output_frequency, cvm::cv_traj_freq); + m_cv.resize(num_variables(), 0); + showInfo(); + return error_code; +} + +void colvarbias_opes::showInfo() const { + // Print information about this bias + auto printInfo = [&](const std::string& info, const std::string& val){ + cvm::log(this->name + ": " + info + val + "\n"); + }; + printInfo("temperature = ", cvm::to_str(m_kbt / cvm::proxy->boltzmann())); + printInfo("beta = ", cvm::to_str(1.0 / m_kbt)); + printInfo("depositing new kernels with newHillFrequency = ", cvm::to_str(m_pace)); + printInfo("expected barrier is ", cvm::to_str(m_barrier)); + printInfo("using target distribution with biasfactor (gamma) = ", m_inf_biasfactor ? "inf" : cvm::to_str(m_biasfactor)); + if (m_inf_biasfactor) { + cvm::log(" (thus a uniform flat target distribution, no well-tempering)\n"); + cvm::log(this->name + ": " + "the equivalent bias temperature = inf\n"); + } else { + cvm::log(this->name + ": " + "the equivalent bias temperature = " + cvm::to_str(cvm::proxy->target_temperature() * (m_biasfactor - 1))); + } + if (m_adaptive_sigma) { + printInfo("adaptive sigma will be used, with adaptiveSigmaStride = ", cvm::to_str(m_adaptive_sigma_stride)); + size_t x = std::ceil(m_adaptive_sigma_stride / m_pace); + printInfo(" thus the first x kernel depositions will be skipped, x = adaptiveSigmaStride/newHillFrequency = ", cvm::to_str(x)); + } else { + std::string sigmas; + for (size_t i = 0; i < num_variables(); ++i) { + sigmas += " " + cvm::to_str(m_sigma0[i]); + } + cvm::log(this->name + ": kernels have initial gaussianSigma = " + sigmas + "\n"); + } + if (m_fixed_sigma) { + cvm::log(this->name + " fixedGaussianSigma: gaussianSigma will not decrease as the simulation proceeds\n"); + } + printInfo("kernels are truncated with kernelCutoff = ", cvm::to_str(m_cutoff)); + if (m_cutoff < 3.5) { + cvm::log(this->name + " +++ WARNING +++ probably kernels are truncated too much\n"); + } + printInfo("the value at cutoff is = ", cvm::to_str(m_val_at_cutoff)); + printInfo("regularization epsilon = ", cvm::to_str(m_epsilon)); + if (m_val_at_cutoff > m_epsilon*(1+1e-6)) { + cvm::log(this->name + " +++ WARNING +++ the kernelCutoff might be too small for the given epsilon\n"); + } + printInfo("kernels will be compressed when closer than compression_threshold = ", cvm::to_str(m_compression_threshold)); + if (m_compression_threshold2 == 0) { + cvm::log(this->name + " +++ WARNING +++ kernels will never merge, expect slowdowns\n"); + } + if (!m_recursive_merge) { + cvm::log(this->name + " -- RECURSIVE_MERGE_OFF: only one merge for each new kernel will be attempted. This is faster only if total number of kernels does not grow too much\n"); + } + if (m_nlist) { + cvm::log(this->name + " neighborList: using neighbor list for kernels, with parameters: " + cvm::to_str(m_nlist_param[0]) + " " + cvm::to_str(m_nlist_param[1]) + "\n"); + if (m_nlist_pace_reset) { + cvm::log(this->name + " neighborListNewHillReset: forcing the neighbor list to update every time when depositing a new hill\n"); + } + } + if (m_no_zed) { + printInfo("noZed: using fixed normalization factor = ", cvm::to_str(m_zed)); + } + if (comm == multiple_replicas && m_num_walkers > 1) { + cvm::log(this->name + " if multiple replicas are present, they will share the same bias\n"); + } + if (m_num_threads > 1) { + printInfo("using multiple threads per simulation: ", cvm::to_str(m_num_threads)); + } + cvm::main()->cite_feature("OPES"); + if (m_adaptive_sigma || m_explore) { + cvm::main()->cite_feature("OPES explore or adaptive kernels"); + } +} + +cvm::real colvarbias_opes::evaluateKernel( + const colvarbias_opes::kernel& G, + const std::vector& x) const { + cvm::real norm2 = 0; + for (size_t i = 0; i < num_variables(); ++i) { + const cvm::real dist2_i = variables(i)->dist2(G.m_center[i], x[i]) / (G.m_sigma[i] * G.m_sigma[i]); + norm2 += dist2_i; + if (norm2 >= m_cutoff2) { + return 0; + } + } + return G.m_height * (std::exp(-0.5 * norm2) - m_val_at_cutoff); +} + +cvm::real colvarbias_opes::evaluateKernel( + const colvarbias_opes::kernel& G, + const std::vector& x, + std::vector& accumulated_derivative, + std::vector& dist) const { + cvm::real norm2 = 0; + for (size_t i = 0; i < num_variables(); ++i) { + dist[i] = 0.5 * variables(i)->dist2_lgrad(x[i], G.m_center[i]) / G.m_sigma[i]; + norm2 += dist[i] * dist[i]; + if (norm2 >= m_cutoff2) { + return 0; + } + } + const cvm::real val = G.m_height * (std::exp(-0.5 * norm2) - m_val_at_cutoff); + // The derivative of norm2 with respect to x + for (size_t i = 0; i < num_variables(); ++i) { + accumulated_derivative[i] -= val * dist[i] / G.m_sigma[i]; + } + return val; +} + +cvm::real colvarbias_opes::getProbAndDerivatives( + const std::vector& cv, std::vector& der_prob) const { + double prob = 0.0; + std::vector dist(num_variables(), 0); + if (!m_nlist) { + if (m_num_threads == 1 || m_kernels.size() < 2 * m_num_threads) { + for (size_t k = 0; k < m_kernels.size(); ++k) { + prob += evaluateKernel(m_kernels[k], cv, der_prob, dist); + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + std::vector omp_deriv(der_prob.size(), 0); + std::vector tmp_dist(num_variables()); + #pragma omp for reduction(+:prob) nowait + for (int k = 0; k < static_cast(m_kernels.size()); ++k) { + prob += evaluateKernel(m_kernels[k], cv, omp_deriv, tmp_dist); + } + #pragma omp critical + for (int i = 0; i < static_cast(num_variables()); ++i) { + der_prob[i]+=omp_deriv[i]; + } + #pragma omp single + for (int i = 0; i < static_cast(num_variables()); ++i) { + dist[i] = tmp_dist[i]; + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // TODO: Test this once fine-grained parallelization is enabled + std::vector> derivs(m_num_threads, std::vector(num_variables(), 0)); + std::vector> dists(m_num_threads, std::vector(num_variables(), 0)); + auto worker = [&](int start, int end, void* result){ + const int tid = cvm::proxy->smp_thread_id(); + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + tmp_prob += evaluateKernel(m_kernels[i], cv, derivs[tid], dists[tid]); + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &prob, CKLOOP_DOUBLE_SUM, NULL); + for (size_t i = 0; i < num_variables(); ++i) { + for (size_t j = 0; j < m_num_threads; ++j) { + if (j == 0) dist[i] = dists[j][i]; + der_prob[i] += derivs[j][i]; + } + } +#else + cvm::error("multiple threads required in OPES, but this binary is not linked with a supported threading library.\n"); +#endif + } + } else { + if (m_num_threads == 1 || m_nlist_index.size() < 2 * m_num_threads) { + for (size_t nk = 0; nk < m_nlist_index.size(); ++nk) { + const size_t k = m_nlist_index[nk]; + prob += evaluateKernel(m_kernels[k], cv, der_prob, dist); + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + std::vector omp_deriv(der_prob.size(), 0); + std::vector tmp_dist(num_variables()); + #pragma omp for reduction(+:prob) nowait + for (int nk = 0; nk < static_cast(m_nlist_index.size()); ++nk) { + const size_t k = m_nlist_index[nk]; + prob += evaluateKernel(m_kernels[k], cv, omp_deriv, tmp_dist); + } + #pragma omp critical + for (int i = 0; i < static_cast(num_variables()); ++i) { + der_prob[i]+=omp_deriv[i]; + } + #pragma omp single + for (int i = 0; i < static_cast(num_variables()); ++i) { + dist[i] = tmp_dist[i]; + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // TODO: Test this once fine-grained parallelization is enabled + std::vector> derivs(m_num_threads, std::vector(num_variables(), 0)); + std::vector> dists(m_num_threads, std::vector(num_variables(), 0)); + auto worker = [&](int start, int end, void* result){ + const int tid = cvm::proxy->smp_thread_id(); + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + const size_t k = m_nlist_index[i]; + tmp_prob += evaluateKernel(m_kernels[k], cv, derivs[tid], dists[tid]); + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_nlist_index.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &prob, CKLOOP_DOUBLE_SUM, NULL); + for (size_t i = 0; i < num_variables(); ++i) { + for (size_t j = 0; j < m_num_threads; ++j) { + if (j == 0) dist[i] = dists[j][i]; + der_prob[i] += derivs[j][i]; + } + } +#else + cvm::error("multiple threads required in OPES, but this binary is not linked with a supported threading library.\n"); +#endif + } + } + prob /= m_kdenorm; + for (size_t i = 0; i < num_variables(); ++i) { + der_prob[i] /= m_kdenorm; + } + return prob; +} + +int colvarbias_opes::calculate_opes() { + if (m_nlist) { + ++m_nlist_steps; + const bool exchange_step = + (comm == multiple_replicas) && + cvm::step_absolute() % shared_freq == 0; + if (exchange_step) { + m_nlist_update = true; + } else { + for (size_t i = 0; i < num_variables(); ++i) { + const cvm::real diff_i2 = variables(i)->dist2(m_cv[i], m_nlist_center[i]); + if (diff_i2 > m_nlist_param[1] * m_nlist_dev2[i]) { + m_nlist_update = true; + break; + } + } + } + if (m_nlist_update) { + updateNlist(m_cv); + } + } + std::vector der_prob(num_variables(), 0); + const cvm::real prob = getProbAndDerivatives(m_cv, der_prob); + const cvm::real bias = m_kbt * m_bias_prefactor * cvm::logn(prob / m_zed + m_epsilon); + bias_energy = bias; + if (is_enabled(f_cvb_apply_force)) { + for (size_t i = 0; i < num_variables(); ++i) { + colvar_forces[i] = -m_kbt * m_bias_prefactor / (prob / m_zed + m_epsilon) * der_prob[i] / m_zed; + } + } + return COLVARS_OK; +} + +int colvarbias_opes::update_opes() { + if (m_adaptive_sigma) { + m_adaptive_counter++; + cvm::step_number tau = m_adaptive_sigma_stride; + if (m_adaptive_counter < m_adaptive_sigma_stride) tau = m_adaptive_counter; + for (size_t i = 0; i < num_variables(); ++i) { + // Welford's online algorithm for standard deviation + const cvm::real diff_i = 0.5 * variables(i)->dist2_lgrad(m_cv[i], m_av_cv[i]); + m_av_cv[i] += diff_i / tau; + m_av_M2[i] += diff_i * 0.5 * variables(i)->dist2_lgrad(m_cv[i], m_av_cv[i]); + } + if (m_adaptive_counter < m_adaptive_sigma_stride && m_counter == 1) { + return COLVARS_OK;; + } + } + if (cvm::step_absolute() % m_pace == 0) { + m_old_kdenorm = m_kdenorm; + m_delta_kernels.clear(); + const size_t old_nker = m_kernels.size(); + // TODO: how could I account for extra biases in Colvars? + const cvm::real log_weight = bias_energy / m_kbt; + cvm::real height = cvm::exp(log_weight); + cvm::real sum_heights = height; + cvm::real sum_heights2 = height * height; + if (m_num_walkers > 1) { + std::vector replica_sum_heights(cvm::proxy->num_replicas() - 1, 0); + // Send all sum_heights to PE 0 + if (cvm::proxy->replica_index() == 0) { + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(replica_sum_heights[p - 1]), sizeof(cvm::real), p) != sizeof(cvm::real)) { + return cvm::error("Error: receiving sum of weights from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)&sum_heights, sizeof(cvm::real), 0) != sizeof(cvm::real)) { + return cvm::error("Error: sending sum of weights to replica 0."); + } + } + cvm::proxy->replica_comm_barrier(); + // PE 0 sum all sum_heights and broadcast + if (cvm::proxy->replica_index() == 0) { + for (auto it = replica_sum_heights.begin(); it != replica_sum_heights.end(); ++it) { + sum_heights += (*it); + } + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)&sum_heights, sizeof(cvm::real), p) != sizeof(cvm::real)) { + return cvm::error("Error: sending sum of weights to replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_recv((char*)&sum_heights, sizeof(cvm::real), 0) != sizeof(cvm::real)) { + return cvm::error("Error: receiving sum of weights from replica 0."); + } + } + cvm::proxy->replica_comm_barrier(); + // Send all sum_heights2 to PE 0 + std::vector replica_sum_heights2(cvm::proxy->num_replicas() - 1, 0); + if (cvm::proxy->replica_index() == 0) { + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(replica_sum_heights2[p - 1]), sizeof(cvm::real), p) != sizeof(cvm::real)) { + return cvm::error("Error: getting sum of weights2 from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)&sum_heights2, sizeof(cvm::real), 0) != sizeof(cvm::real)) { + return cvm::error("Error: sending sum of weights2 from replica."); + } + } + cvm::proxy->replica_comm_barrier(); + // PE 0 sum all sum_heights2 and broadcast + if (cvm::proxy->replica_index() == 0) { + for (auto it = replica_sum_heights2.begin(); it != replica_sum_heights2.end(); ++it) { + sum_heights2 += (*it); + } + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)&sum_heights2, sizeof(cvm::real), p) != sizeof(cvm::real)) { + return cvm::error("Error: sending sum of weights2 to replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_recv((char*)&sum_heights2, sizeof(cvm::real), 0) != sizeof(cvm::real)) { + return cvm::error("Error: receiving sum of weights2 from replica."); + } + } + cvm::proxy->replica_comm_barrier(); + } + m_counter += m_num_walkers; + m_sum_weights += sum_heights; + m_sum_weights2 += sum_heights2; + m_neff = (1 + m_sum_weights) * (1 + m_sum_weights) / (1 + m_sum_weights2); + m_rct = m_kbt * cvm::logn(m_sum_weights / m_counter); + m_traj_line.neff = m_neff; + m_traj_line.rct = m_rct; + if (m_explore) { + m_kdenorm = m_counter; + height = 1.0; + } else { + m_kdenorm = m_sum_weights; + } + std::vector sigma = m_sigma0; + if (m_adaptive_sigma) { + const cvm::real factor = m_explore ? 1.0 : m_biasfactor; + if (m_counter == 1 + m_num_walkers) { + for (size_t i = 0; i < num_variables(); ++i) { + m_av_M2[i] *= m_biasfactor; + } + for (size_t i = 0; i < num_variables(); ++i) { + m_sigma0[i] = std::sqrt(m_av_M2[i] / m_adaptive_counter / factor); + } + if (m_sigma_min.size() == 0) { + for (size_t i = 0; i < num_variables(); ++i) { + if (m_sigma0[i] < 1e-6) { + cvm::error("Adaptive sigma is suspiciously small for CV " + cvm::to_str(i) + "\nManually provide sigma or set a safe sigma_min to avoid possible issues\n"); + return COLVARS_ERROR; + } + } + } else { + for (size_t i = 0; i < num_variables(); ++i) { + m_sigma0[i] = std::max(m_sigma0[i], m_sigma_min[i]); + } + } + } + for (size_t i = 0; i < num_variables(); ++i) { + sigma[i] = std::sqrt(m_av_M2[i] / m_adaptive_counter / factor); + } + if (m_sigma_min.size() == 0) { + bool sigma_less_than_threshold = false; + for (size_t i = 0; i < num_variables(); ++i) { + if (sigma[i] < 1e-6) { + cvm::log("The adaptive sigma is suspiciously small, you should set a safe sigma_min. 1e-6 will be used here\n"); + sigma[i] = 1e-6; + sigma_less_than_threshold = true; + } + } + if (sigma_less_than_threshold) { + m_sigma_min.assign(num_variables(), 1e-6); + } + } else { + for (size_t i = 0; i < num_variables(); ++i) { + sigma[i] = std::max(sigma[i], m_sigma_min[i]); + } + } + } + if (!m_fixed_sigma) { + const cvm::real size = m_explore ? m_counter : m_neff; + const size_t ncv = num_variables(); + const cvm::real s_rescaling = std::pow(size * (ncv + 2.0) / 4, -1.0 / (4.0 + ncv)); + for (size_t i = 0; i < num_variables(); ++i) { + sigma[i] *= s_rescaling; + } + if (m_sigma_min.size() > 0) { + for (size_t i = 0; i < num_variables(); ++i) { + sigma[i] = std::max(sigma[i], m_sigma_min[i]); + } + } + } + // the height should be divided by sqrt(2*pi)*sigma0_, + // but this overall factor would be canceled when dividing by Zed + // thus we skip it altogether, but keep any other sigma rescaling + for (size_t i = 0; i < num_variables(); ++i) { + height *= (m_sigma0[i] / sigma[i]); + } + if (m_num_walkers == 1) { + addKernel(height, m_cv, sigma, log_weight); + } else { + std::vector all_height(m_num_walkers, 0.0); + std::vector all_center(m_num_walkers * num_variables(), 0.0); + std::vector all_sigma(m_num_walkers * num_variables(), 0.0); + std::vector all_logweight(m_num_walkers, 0.0); + const int my_replica = cvm::proxy->replica_index(); + + // Allgather of heights + if (my_replica == 0) { + all_height[0] = height; + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(all_height[p]), sizeof(decltype(all_height)::value_type), p) != sizeof(decltype(all_height)::value_type)) { + return cvm::error("Error: on receiving height on replica 0 from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)&height, sizeof(decltype(height)), 0) != sizeof(cvm::real)) { + return cvm::error("Error: on sending height to replica 0 from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast heights + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_height)::value_type) * all_height.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_height.data(), send_size, p) != send_size) { + return cvm::error("Error: on sending heights from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_height)::value_type) * all_height.size(); + if (cvm::proxy->replica_comm_recv((char*)all_height.data(), recv_size, 0) != recv_size) { + return cvm::error("Error: on receiving heights from replica 0 to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + + // Allgather of centers + if (my_replica == 0) { + std::copy(m_cv.begin(), m_cv.end(), all_center.begin()); + const int recv_size = sizeof(decltype(m_cv)::value_type) * m_cv.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + cvm::real* recv_start_ptr = &(all_center[p * m_cv.size()]); + if (cvm::proxy->replica_comm_recv((char*)recv_start_ptr, recv_size, p) != recv_size) { + return cvm::error("Error on receiving centers from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int send_size = sizeof(decltype(m_cv)::value_type) * m_cv.size(); + if (cvm::proxy->replica_comm_send((char*)m_cv.data(), send_size, 0) != send_size) { + return cvm::error("Error on sending centers to replica 0 from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast centers + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_center)::value_type) * all_center.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_center.data(), send_size, p) != send_size) { + return cvm::error("Error on sending centers from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_center)::value_type) * all_center.size(); + if (cvm::proxy->replica_comm_recv((char*)all_center.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving centers from replica 0 to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + + // Allgather of sigmas + if (my_replica == 0) { + std::copy(sigma.begin(), sigma.end(), all_sigma.begin()); + const int recv_size = sizeof(decltype(sigma)::value_type) * sigma.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + cvm::real* recv_start_ptr = &(all_sigma[p * m_cv.size()]); + if (cvm::proxy->replica_comm_recv((char*)recv_start_ptr, recv_size, p) != recv_size) { + return cvm::error("Error on receiving sigmas from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int send_size = sizeof(decltype(sigma)::value_type) * sigma.size(); + if (cvm::proxy->replica_comm_send((char*)sigma.data(), send_size, 0) != send_size) { + return cvm::error("Error on sending sigmas to replica 0 from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast sigmas + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_sigma)::value_type) * all_sigma.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_sigma.data(), send_size, p) != send_size) { + return cvm::error("Error on sending sigmas from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_sigma)::value_type) * all_sigma.size(); + if (cvm::proxy->replica_comm_recv((char*)all_sigma.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving sigmas from replica 0 to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + + // Allgather of logweights + if (my_replica == 0) { + all_logweight[0] = log_weight; + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(all_logweight[p]), sizeof(decltype(all_logweight)::value_type), p) != sizeof(decltype(all_logweight)::value_type)) { + return cvm::error("Error on receiving log_weight on replica 0 from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)&log_weight, sizeof(decltype(log_weight)), 0) != sizeof(cvm::real)) { + return cvm::error("Error on sending log_weight to replica 0 from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast log_weight + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_logweight)::value_type) * all_logweight.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_logweight.data(), send_size, p) != send_size) { + return cvm::error("Error on sending log_weight from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_logweight)::value_type) * all_logweight.size(); + if (cvm::proxy->replica_comm_recv((char*)all_logweight.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving log_weight from replica 0 to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + + if (m_nlist) { + std::vector all_nlist_size(m_num_walkers); + const int my_replica = cvm::proxy->replica_index(); + // Get the size of the neighbor list of each replica + if (my_replica == 0) { + all_nlist_size[0] = m_nlist_index.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(all_nlist_size[p]), sizeof(int), p) != sizeof(int)) { + return cvm::error("Error on receiving neighbor list size from replica " + cvm::to_str(p)); + } + } + } else { + const int nlist_size = m_nlist_index.size(); + if (cvm::proxy->replica_comm_send((char*)&nlist_size, sizeof(int), 0) != sizeof(int)) { + return cvm::error("Error on sending neighbor list size from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast the neighbor list sizes to all replicas + if (my_replica == 0) { + const int send_size = sizeof(int) * all_nlist_size.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_nlist_size.data(), send_size, p) != send_size) { + return cvm::error("Error on sending neighbor list sizes from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(int) * all_nlist_size.size(); + if (cvm::proxy->replica_comm_recv((char*)all_nlist_size.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving neighbor list sizes to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Gather all neighbor lists from replicas + const int tot_size = std::accumulate(all_nlist_size.begin(), all_nlist_size.end(), 0); + if (tot_size > 0) { + // Allgatherv all neighbor lists from replicas + std::vector all_nlist_index(tot_size); + if (my_replica == 0) { + std::vector recv_start(m_num_walkers); + // Accumulative sum + recv_start[0] = 0; + std::partial_sum(all_nlist_size.begin(), all_nlist_size.end() - 1, recv_start.begin() + 1); + std::copy(m_nlist_index.begin(), m_nlist_index.end(), all_nlist_index.begin()); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + size_t* recv_start_ptr = &(all_nlist_index[recv_start[p]]); + const int recv_size = all_nlist_size[p] * sizeof(decltype(all_nlist_index)::value_type); + if (cvm::proxy->replica_comm_recv((char*)recv_start_ptr, recv_size, p) != recv_size) { + return cvm::error("Error on receiving neighbor list from replica " + cvm::to_str(p)); + } + } + } else { + const int send_size = sizeof(decltype(m_nlist_index)::value_type) * m_nlist_index.size(); + if (cvm::proxy->replica_comm_send((char*)m_nlist_index.data(), send_size, 0) != send_size) { + return cvm::error("Error on sending neighbor list from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast the neighbor list + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_nlist_index)::value_type) * tot_size; + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_nlist_index.data(), send_size, p) != send_size) { + return cvm::error("Error on sending total neighbor list to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_nlist_index)::value_type) * tot_size; + if (cvm::proxy->replica_comm_recv((char*)all_nlist_index.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving total neighbor list on replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Deduplicate and sort the merged neighbor list + std::unordered_set all_nlist_index_set; + for (auto it = all_nlist_index.cbegin(); it != all_nlist_index.cend(); ++it) { + all_nlist_index_set.insert(*it); + } + m_nlist_index.assign(all_nlist_index_set.begin(), all_nlist_index_set.end()); + std::sort(m_nlist_index.begin(), m_nlist_index.end()); + } + } + for (size_t w = 0; w < m_num_walkers; ++w) { + std::vector center_w( + all_center.begin() + num_variables() * w, + all_center.begin() + num_variables() * (w + 1)); + std::vector sigma_w( + all_sigma.begin() + num_variables() * w, + all_sigma.begin() + num_variables() * (w + 1)); + addKernel(all_height[w], center_w, sigma_w, all_logweight[w]); + } + } + m_nker = m_kernels.size(); + m_traj_line.nker = m_nker; + if (m_nlist) { + m_nlker = m_nlist_index.size(); + m_traj_line.nlker = m_nlker; + if (m_nlist_pace_reset) { + m_nlist_update = true; + } + } + if (!m_no_zed) { + cvm::real sum_uprob = 0; + const size_t ks = m_kernels.size(); + const size_t ds = m_delta_kernels.size(); + const int num_parallel = 1; // Always 1 + const bool few_kernels = (ks * ks < (3 * ks * ds + 2 * ds * ds * num_parallel + 100)); + if (few_kernels) { + if (m_num_threads == 1) { + for (size_t k = 0; k < m_kernels.size(); ++k) { + for (size_t kk = 0; kk < m_kernels.size(); ++kk) { + sum_uprob += evaluateKernel(m_kernels[kk], m_kernels[k].m_center); + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + #pragma omp for reduction(+:sum_uprob) nowait + for (int k = 0; k < static_cast(m_kernels.size()); ++k) { + for (int kk = 0; kk < static_cast(m_kernels.size()); ++kk) { + sum_uprob += evaluateKernel(m_kernels[kk], m_kernels[k].m_center); + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // TODO: Does this work?? + auto worker = [&](int start, int end, void* result) { + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + for (size_t kk = 0; kk < m_kernels.size(); ++kk) { + tmp_prob += evaluateKernel(m_kernels[kk], m_kernels[i].m_center); + } + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &sum_uprob, CKLOOP_DOUBLE_SUM, NULL); +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + if (num_parallel > 1) { + return cvm::error("Unimplemented feature: OPES in parallel running.\n"); + } + } else { + cvm::real delta_sum_uprob = 0; + if (!m_nlist) { + if (m_num_threads == 1) { + for (size_t i = 0; i < m_kernels.size(); ++i) { + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob += evaluateKernel(m_delta_kernels[d], m_kernels[i].m_center) + sign * evaluateKernel(m_kernels[i], m_delta_kernels[d].m_center); + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + #pragma omp for reduction(+:delta_sum_uprob) nowait + for (int i = 0; i < static_cast(m_kernels.size()); ++i) { + for (int d = 0; d < static_cast(m_delta_kernels.size()); ++d) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob += evaluateKernel(m_delta_kernels[d], m_kernels[i].m_center) + sign * evaluateKernel(m_kernels[i], m_delta_kernels[d].m_center); + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + auto worker = [&](int start, int end, void* result) { + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + tmp_prob += evaluateKernel(m_delta_kernels[d], m_kernels[i].m_center) + sign * evaluateKernel(m_kernels[i], m_delta_kernels[d].m_center); + } + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &delta_sum_uprob, CKLOOP_DOUBLE_SUM, NULL); +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + } else { + if (m_num_threads == 1) { + for (size_t i = 0; i < m_nlist_index.size(); ++i) { + const size_t k = m_nlist_index[i]; + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + const double sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob += evaluateKernel(m_delta_kernels[d], m_kernels[k].m_center) + sign * evaluateKernel(m_kernels[k], m_delta_kernels[d].m_center); + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + #pragma omp for reduction(+:delta_sum_uprob) nowait + for (int i = 0; i < static_cast(m_nlist_index.size()); ++i) { + const size_t k = m_nlist_index[i]; + for (int d = 0; d < static_cast(m_delta_kernels.size()); ++d) { + const double sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob += evaluateKernel(m_delta_kernels[d], m_kernels[k].m_center) + sign * evaluateKernel(m_kernels[k], m_delta_kernels[d].m_center); + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + auto worker = [&](int start, int end, void* result) { + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + const size_t k = m_nlist_index[i]; + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + const double sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + tmp_prob += evaluateKernel(m_delta_kernels[d], m_kernels[k].m_center) + sign * evaluateKernel(m_kernels[k], m_delta_kernels[d].m_center); + } + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_nlist_index.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &delta_sum_uprob, CKLOOP_DOUBLE_SUM, NULL); +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + } + if (num_parallel > 1) { + return cvm::error("Unimplemented feature: OPES in parallel running.\n"); + } + if (m_num_threads == 1) { + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + for (size_t dd = 0; dd < m_delta_kernels.size(); ++dd) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob -= sign *evaluateKernel(m_delta_kernels[dd], m_delta_kernels[d].m_center); + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + #pragma omp for reduction(+:delta_sum_uprob) + for (int d = 0; d < static_cast(m_delta_kernels.size()); ++d) { + for (int dd = 0; dd < static_cast(m_delta_kernels.size()); ++dd) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob -= sign * evaluateKernel(m_delta_kernels[dd], m_delta_kernels[d].m_center); + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + auto worker = [&](int start, int end, void* result) { + double tmp_prob = 0; + for (int d = start; d <= end; ++d) { + for (size_t dd = 0; dd < m_delta_kernels.size(); ++dd) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + tmp_prob += sign * evaluateKernel(m_delta_kernels[dd], m_delta_kernels[d].m_center); + } + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_delta_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + double tmp = 0; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &tmp, CKLOOP_DOUBLE_SUM, NULL); + delta_sum_uprob -= tmp; +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + sum_uprob = m_zed * m_old_kdenorm * old_nker + delta_sum_uprob; + } + m_zed = sum_uprob / m_kdenorm / m_kernels.size(); + m_traj_line.zed = m_zed; + } + if (m_calc_work) { + std::vector dummy(num_variables()); + const cvm::real prob = getProbAndDerivatives(m_cv, dummy); + const cvm::real new_bias = m_kbt * m_bias_prefactor * cvm::logn(prob / m_zed + m_epsilon); + m_work += new_bias - bias_energy; + m_traj_line.work = m_work; + } + } + return COLVARS_OK; +} + +void colvarbias_opes::save_state() { + if (cvm::step_absolute() % cvm::restart_out_freq == 0) { + m_saved_zed = m_zed; + m_saved_sum_weights = m_sum_weights; + m_saved_sum_weights2 = m_sum_weights2; + m_saved_kernels = m_kernels; + } +} + +int colvarbias_opes::update() { + int error_code = COLVARS_OK; + for (size_t i = 0; i < num_variables(); ++i) { + m_cv[i] = variables(i)->value(); + } + error_code |= calculate_opes(); + // NOTE: I don't think that calling dumpStateToFile() after update in + // the PLUMED implementation is correct for step 0, so I save the + // data after calculate() that does not modify the internal state + // of the bias. + save_state(); + if (error_code != COLVARS_OK) return error_code; + if (m_is_first_step) { + // NOTE: Colvars does not allow chainned biases, so I have to implement + // the PRINT here. Even if OPESmetad::update() is skipped we should + // still call Print::update() + writeTrajBuffer(); + if (m_pmf_grid_on) error_code |= collectSampleToPMFGrid(); + m_is_first_step = false; + return COLVARS_OK; + } + error_code |= update_opes(); + if (error_code != COLVARS_OK) return error_code; + writeTrajBuffer(); // Print::update() + if (m_pmf_grid_on) error_code |= collectSampleToPMFGrid(); + return error_code; +} + +int colvarbias_opes::collectSampleToPMFGrid() { + if (m_reweight_grid) { + // Get the bin index + std::vector bin(m_pmf_cvs.size(), 0); + for (size_t i = 0; i < m_pmf_cvs.size(); ++i) { + bin[i] = m_reweight_grid->current_bin_scalar(i); + } + const cvm::real reweighting_factor = cvm::exp(bias_energy / m_kbt); + if (m_reweight_grid->index_ok(bin)) { + m_reweight_grid->acc_value(bin, reweighting_factor); + } + } + return COLVARS_OK; +} + +template OST& colvarbias_opes::write_state_data_template_(OST &os) const { + std::ios_base::fmtflags f; + const bool formatted = !std::is_same::value; + if (formatted) { + f = os.flags(); + os.setf(std::ios::scientific, std::ios::floatfield); + } + write_state_data_key(os, "opes_metad_" + this->name); + auto printFieldReal = [&](const std::string& s, cvm::real x){ + write_state_data_key(os, s, false); + if (formatted) + os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width); + os << x; + if (formatted) + os << "\n"; + }; + auto printFieldULL = [&](const std::string& s, unsigned long long x){ + write_state_data_key(os, s, false); + if (formatted) + os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width); + os << x; + if (formatted) + os << "\n"; + }; + auto printFieldString = [&](const std::string& s, const std::string& x){ + write_state_data_key(os, s, false); + if (formatted) + os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width); + os << x; + if (formatted) + os << "\n"; + }; + std::ostringstream oss; + if (m_inf_biasfactor) { + oss << "inf"; + } else { + oss << m_biasfactor; + } + printFieldString("biasfactor", oss.str()); + printFieldReal("epsilon", m_epsilon); + printFieldReal("kernel_cutoff", cvm::sqrt(m_cutoff2)); + printFieldReal("compression_threshold", m_compression_threshold); + printFieldReal("zed", m_saved_zed); + printFieldReal("sum_weights", m_saved_sum_weights); + printFieldReal("sum_weights2", m_saved_sum_weights2); + printFieldULL("counter", m_counter); + if (m_adaptive_sigma) { + printFieldULL("adaptive_counter", m_adaptive_counter); + for (size_t i = 0; i < num_variables(); ++i) { + printFieldReal("sigma0_" + variables(i)->name, m_sigma0[i]); + printFieldReal("av_cv_" + variables(i)->name, m_av_cv[i]); + printFieldReal("av_M2_" + variables(i)->name, m_av_M2[i]); + } + } + printFieldULL("num_hills", m_saved_kernels.size()); + write_state_data_key(os, "hills", false); + if (formatted) os << "{\n"; + for (size_t k = 0; k < m_saved_kernels.size(); ++k) { + if (formatted) os << "{ "; + os << k; + if (formatted) os << " "; + for (size_t i = 0; i < num_variables(); ++i) { + os << m_saved_kernels[k].m_center[i]; + if (formatted) os << " "; + } + for (size_t i = 0; i < num_variables(); ++i) { + os << m_saved_kernels[k].m_sigma[i]; + if (formatted) os << " "; + } + os << m_saved_kernels[k].m_height; + if (formatted) os << " }\n"; + } + if (formatted) os << "}\n"; + if (formatted) os.setf(f); + if (m_pmf_grid_on) { + write_state_data_key(os, "probability_grid"); + m_reweight_grid->write_raw(os, 8); + } + return os; +} + +std::ostream& colvarbias_opes::write_state_data(std::ostream &os) { + try { + auto& s = write_state_data_template_(os); + return s; + } catch (const std::exception& e) { + cvm::error(e.what()); + } + return os; +} + +cvm::memory_stream& colvarbias_opes::write_state_data(cvm::memory_stream& os) { + try { + auto& s = write_state_data_template_(os); + return s; + } catch (const std::exception& e) { + cvm::error(e.what()); + } + return os; +} + +template IST& colvarbias_opes::read_state_data_template_(IST &is) { + bool const formatted = !std::is_same::value; + std::string tmp_name; + is >> tmp_name; + if (tmp_name.rfind("opes_metad_", 0) != 0) { + throw std::runtime_error("Unknown action name: " + tmp_name + "\n"); + } + auto readFieldString = [&](const std::string& s, std::string& x){ + std::string field; + is >> field; + if (field.compare(s) == 0) { + is >> x; + } else { + throw std::runtime_error("Expect field \"" + s + "\" , but got \"" + field + "\"\n"); + } + }; + auto readFieldReal = [&](const std::string& s, cvm::real& x){ + std::string field; + is >> field; + if (field.compare(s) == 0) { + is >> x; + } else { + throw std::runtime_error("Expect field \"" + s + "\" , but got \"" + field + "\"\n"); + } + }; + auto readFieldULL = [&](const std::string& s, unsigned long long& x){ + std::string field; + is >> field; + if (field.compare(s) == 0) { + is >> x; + } else { + throw std::runtime_error("Expect field \"" + s + "\" , but got \"" + field + "\"\n"); + } + }; + std::string old_biasfactor_str; + cvm::real old_biasfactor; + readFieldString("biasfactor", old_biasfactor_str); + if (old_biasfactor_str == "inf" || old_biasfactor_str == "-inf" || old_biasfactor_str == "+inf" || + old_biasfactor_str == "INF" || old_biasfactor_str == "-INF" || old_biasfactor_str == "+INF") { + old_biasfactor = std::numeric_limits::infinity(); + m_inf_biasfactor = true; + } else { + old_biasfactor = std::stod(old_biasfactor_str); + m_inf_biasfactor = false; + } + if (std::abs(old_biasfactor - m_biasfactor) > 1e-6 * m_biasfactor) { + cvm::log("WARNING: previous bias factor was " + cvm::to_str(old_biasfactor) + + " while now it is " + cvm::to_str(m_biasfactor) + + " (the new one is used).\n"); + } + cvm::real old_epsilon; + readFieldReal("epsilon", old_epsilon); + if (std::abs(old_epsilon - m_epsilon) > 1e-6 * m_epsilon) { + cvm::log("WARNING: previous epsilon was " + cvm::to_str(old_epsilon) + + " while now it is " + cvm::to_str(m_epsilon) + + " (the new one is used).\n"); + } + cvm::real old_cutoff; + readFieldReal("kernel_cutoff", old_cutoff); + if (std::abs(old_cutoff - m_cutoff) > 1e-6 * m_cutoff) { + cvm::log("WARNING: previous cutoff was " + cvm::to_str(old_cutoff) + + " while now it is " + cvm::to_str(m_cutoff) + + " (the new one is used).\n"); + } + m_cutoff2 = m_cutoff * m_cutoff; + cvm::real old_compression_threshold; + readFieldReal("compression_threshold", old_compression_threshold); + if (std::abs(old_compression_threshold - m_compression_threshold) > 1e-6 * m_compression_threshold) { + cvm::log("WARNING: previous cutoff was " + cvm::to_str(old_compression_threshold) + + " while now it is " + cvm::to_str(m_compression_threshold) + + " (the new one is used).\n"); + } + m_compression_threshold2 = m_compression_threshold * m_compression_threshold; + readFieldReal("zed", m_zed); + readFieldReal("sum_weights", m_sum_weights); + readFieldReal("sum_weights2", m_sum_weights2); + unsigned long long tmp_counter = 1; + readFieldULL("counter", tmp_counter); + m_counter = tmp_counter; + if (m_adaptive_sigma) { + readFieldULL("adaptive_counter", tmp_counter); + m_adaptive_counter = tmp_counter; + for (size_t i = 0; i < num_variables(); ++i) { + readFieldReal("sigma0_" + variables(i)->name, m_sigma0[i]); + readFieldReal("av_cv_" + variables(i)->name, m_av_cv[i]); + readFieldReal("av_M2_" + variables(i)->name, m_av_M2[i]); + } + } + unsigned long long kernel_size = 0; + readFieldULL("num_hills", kernel_size); + if (kernel_size > 0) m_kernels.resize(kernel_size); + read_state_data_key(is, "hills"); + auto consume = [&](const std::string& expected_token){ + if (formatted) { + std::string field; + is >> field; + if (field.compare(expected_token) != 0) { + throw std::runtime_error("Expect " + expected_token + " but got " + field + "\n"); + } + } + }; + consume("{"); + for (size_t k = 0; k < m_kernels.size(); ++k) { + consume("{"); + unsigned long long tmp_k = 0; + is >> tmp_k; + if (formatted && k != tmp_k) { + throw std::runtime_error("Corrupt hill data\n"); + } + kernel current_kernel; + current_kernel.m_center.resize(num_variables()); + current_kernel.m_sigma.resize(num_variables()); + for (size_t i = 0; i < num_variables(); ++i) { + is >> current_kernel.m_center[i]; + } + for (size_t i = 0; i < num_variables(); ++i) { + is >> current_kernel.m_sigma[i]; + } + is >> current_kernel.m_height; + m_kernels[k] = current_kernel; + consume("}"); + } + consume("}"); + if (m_pmf_grid_on) { + read_state_data_key(is, "probability_grid"); + m_reweight_grid->read_raw(is); + } + m_kdenorm = m_explore ? m_counter : m_sum_weights; + m_traj_line.rct = m_kbt * cvm::logn(m_sum_weights / m_counter); + m_traj_line.zed = m_zed; + m_traj_line.neff = (1 + m_sum_weights) * (1 + m_sum_weights) / (1 + m_sum_weights2); + m_traj_line.nker = m_kernels.size(); + showInfo(); + return is; +} + +std::istream& colvarbias_opes::read_state_data(std::istream &is) { + try { + auto& ret = read_state_data_template_(is); + return ret; + } catch (const std::exception& e) { + cvm::error(e.what()); + } + return is; +} + +cvm::memory_stream& colvarbias_opes::read_state_data(cvm::memory_stream &is) { + try { + auto& ret = read_state_data_template_(is); + return ret; + } catch (const std::exception& e) { + cvm::error(e.what()); + } + return is; +} + +void colvarbias_opes::addKernel(const double height, const std::vector& center, const std::vector& sigma, const double logweight) { + addKernel(height,center,sigma); + const std::ios_base::fmtflags f = m_kernels_output.flags(); + m_kernels_output << std::right; + // simulation time in ps + m_kernels_output << std::setw(24) << (cvm::step_absolute() * cvm::dt()) * 1e-3; + for (size_t i = 0; i < num_variables(); ++i) { + m_kernels_output << " " << std::setw(24) << std::setprecision(16) << center[i]; + } + for (size_t i = 0; i < num_variables(); ++i) { + m_kernels_output << " " << std::setw(24) << std::setprecision(16) << sigma[i]; + } + m_kernels_output << " " << std::setw(24) << std::setprecision(16) << height; + m_kernels_output << " " << std::setw(24) << std::setprecision(16) << logweight; + m_kernels_output << std::endl; + m_kernels_output.flags(f); +} + +void colvarbias_opes::addKernel(const double height, const std::vector& center, const std::vector& sigma) { + bool no_match = true; + if (m_compression_threshold2 != 0) { + size_t taker_k = getMergeableKernel(center, m_kernels.size()); + if (taker_k < m_kernels.size()) { + no_match = false; + m_delta_kernels.emplace_back(-1 * m_kernels[taker_k].m_height, m_kernels[taker_k].m_center, m_kernels[taker_k].m_sigma); + mergeKernels(m_kernels[taker_k], kernel(height, center, sigma)); + m_delta_kernels.push_back(m_kernels[taker_k]); + if (m_recursive_merge) { + size_t giver_k = taker_k; + taker_k = getMergeableKernel(m_kernels[giver_k].m_center, giver_k); + while (taker_k < m_kernels.size()) { + m_delta_kernels.pop_back(); + m_delta_kernels.emplace_back(-1 * m_kernels[taker_k].m_height, m_kernels[taker_k].m_center, m_kernels[taker_k].m_sigma); + if (taker_k > giver_k) std::swap(taker_k, giver_k); + mergeKernels(m_kernels[taker_k], m_kernels[giver_k]); + m_delta_kernels.push_back(m_kernels[taker_k]); + m_kernels.erase(m_kernels.begin() + giver_k); + if (m_nlist) { + size_t giver_nk = 0; + bool found_giver = false; + for (size_t nk = 0; nk < m_nlist_index.size(); ++nk) { + if (found_giver) m_nlist_index[nk]--; + if (m_nlist_index[nk] == giver_k) { + giver_nk = nk; + found_giver = true; + } + } + if (found_giver == false) { + cvm::error("problem with merging and nlist\n"); + } + m_nlist_index.erase(m_nlist_index.begin() + giver_nk); + } + giver_k = taker_k; + taker_k = getMergeableKernel(m_kernels[giver_k].m_center, giver_k); + } + } + } + } + if (no_match) { + m_kernels.emplace_back(height, center, sigma); + m_delta_kernels.emplace_back(height, center, sigma); + if (m_nlist) m_nlist_index.push_back(m_kernels.size() - 1); + } +} + +void colvarbias_opes::mergeKernels(kernel& k1, const kernel& k2) const { + const double h = k1.m_height + k2.m_height; + for (size_t i = 0; i < k1.m_center.size(); ++i) { + const bool isPeriodic_i = variables(i)->is_enabled(f_cv_periodic); + if (isPeriodic_i) { + k1.m_center[i] = k2.m_center[i] + 0.5 * variables(i)->dist2_lgrad(k1.m_center[i], k2.m_center[i]).real_value; + } + const cvm::real c_i = (k1.m_height * k1.m_center[i] + + k2.m_height * k2.m_center[i]) / h; + const cvm::real ss_k1_part = k1.m_height * (k1.m_sigma[i] * k1.m_sigma[i] + k1.m_center[i] * k1.m_center[i]); + const cvm::real ss_k2_part = k2.m_height * (k2.m_sigma[i] * k2.m_sigma[i] + k2.m_center[i] * k2.m_center[i]); + const cvm::real ss_i = (ss_k1_part + ss_k2_part) / h - c_i * c_i; + if (isPeriodic_i) { + colvarvalue tmp(c_i); + variables(i)->wrap(tmp); + k1.m_center[i] = tmp.real_value; + } else { + k1.m_center[i] = c_i; + } + k1.m_sigma[i] = cvm::sqrt(ss_i); + } + k1.m_height = h; +} + +size_t colvarbias_opes::getMergeableKernel(const std::vector& giver_center, const size_t giver_k) const { + size_t min_k = m_kernels.size(); + cvm::real min_norm2 = m_compression_threshold2; + const int num_parallel = 1; + if (!m_nlist) { + if (m_num_threads == 1) { + for (size_t k = 0; k < m_kernels.size(); ++k) { + if (k == giver_k) continue; + double norm2 = 0; + for (size_t i = 0; i < num_variables(); ++i) { + norm2 += variables(i)->dist2(giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2) break; + } + if (norm2 < min_norm2) { + min_norm2 = norm2; + min_k = k; + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + int min_k_omp = min_k; + cvm::real min_norm2_omp = m_compression_threshold2; + #pragma omp for nowait + for (int k = 0; k < static_cast(m_kernels.size()); ++k) { + if (k == static_cast(giver_k)) continue; + double norm2 = 0; + for (int i = 0; i < static_cast(num_variables()); ++i) { + norm2 += variables(i)->dist2( giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2_omp) break; + } + if (norm2 < min_norm2_omp) { + min_norm2_omp = norm2; + min_k_omp = k; + } + } + #pragma omp critical + { + if (min_norm2_omp < min_norm2) { + min_norm2 = min_norm2_omp; + min_k = min_k_omp; + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // NOTE: No existing reduction type for finding the minimum, so I have + // to use such a workaround. + std::vector min_k_smp(m_num_threads, min_k); + std::vector min_norm2_smp(m_num_threads, m_compression_threshold2); + auto worker = [&](int start, int end, void* unused) { + const int tid = cvm::proxy->smp_thread_id(); + for (int k = start; k <= end; ++k) { + if (k == giver_k) continue; + double norm2 = 0; + for (size_t j = 0; j < num_variables(); ++j) { + norm2 += variables(i)->dist2( giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2_smp[tid]) break; + } + if (norm2 < min_norm2_smp[tid]) { + min_norm2_smp[tid] = norm2; + min_k_smp[tid] = k; + } + } + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, NULL, CKLOOP_NONE, NULL); + const auto it_min = std::min_element(min_norm2_smp.begin(), min_norm2_smp.end()); + min_norm2 = *it_min; + min_k = min_k_smp[std::distance(min_norm2_smp.begin(), it_min)]; +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + } else { + if (m_num_threads == 1) { + // size_t min_k_omp = min_k; + // cvm::real min_norm2_omp = m_compression_threshold2; + for (size_t nk = 0; nk < m_nlist_index.size(); ++nk) { + const size_t k = m_nlist_index[nk]; + if (k == giver_k) continue; + double norm2 = 0; + for (size_t i = 0; i < num_variables(); ++i) { + norm2 += variables(i)->dist2(giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2) break; + } + if (norm2 < min_norm2) { + min_norm2 = norm2; + min_k = k; + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + size_t min_k_omp = min_k; + cvm::real min_norm2_omp = m_compression_threshold2; + #pragma omp for nowait + for (int nk = 0; nk < static_cast(m_nlist_index.size()); ++nk) { + const size_t k = m_nlist_index[nk]; + if (k == giver_k) continue; + double norm2 = 0; + for (int i = 0; i < static_cast(num_variables()); ++i) { + norm2 += variables(i)->dist2(giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2_omp) break; + } + if (norm2 < min_norm2_omp) { + min_norm2_omp = norm2; + min_k_omp = k; + } + } + #pragma omp critical + { + if (min_norm2_omp < min_norm2) { + min_norm2 = min_norm2_omp; + min_k = min_k_omp; + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // NOTE: No existing reduction type for finding the minimum, so I have + // to use such a workaround. + std::vector min_k_smp(m_num_threads, min_k); + std::vector min_norm2_smp(m_num_threads, m_compression_threshold2); + auto worker = [&](int start, int end, void* unused) { + const int tid = cvm::proxy->smp_thread_id(); + for (int nk = start; nk <= end; ++nk) { + const size_t k = m_nlist_index[nk]; + if (k == giver_k) continue; + double norm2 = 0; + for (size_t j = 0; j < num_variables(); ++j) { + norm2 += variables(i)->dist2( giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2_smp[tid]) break; + } + if (norm2 < min_norm2_smp[tid]) { + min_norm2_smp[tid] = norm2; + min_k_smp[tid] = k; + } + } + }; + const size_t numChunks = m_nlist_index.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, NULL, CKLOOP_NONE, NULL); + const auto it_min = std::min_element(min_norm2_smp.begin(), min_norm2_smp.end()); + min_norm2 = *it_min; + min_k = min_k_smp[std::distance(min_norm2_smp.begin(), it_min)]; +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + } + if (num_parallel > 1) { + cvm::error("The Colvars OPES implementation does not support running OPES in parallel across nodes.\n"); + } + return min_k; +} + +std::string const colvarbias_opes::traj_file_name(const std::string& suffix) const { + return std::string(cvm::output_prefix()+ + ".colvars."+this->name+ + ( (comm != single_replica) ? + ("."+replica_id) : + ("") )+ + suffix); +} + +int colvarbias_opes::write_output_files() { + int error_code = COLVARS_OK; + thread_local static bool firsttime = true; + // Write the kernels + const std::string kernels_filename = traj_file_name(".kernels.dat"); + std::ostream& os_kernels = cvm::proxy->output_stream(kernels_filename, "kernels file"); + const std::ios_base::fmtflags format_kernels = os_kernels.flags(); + if (firsttime) { + os_kernels << "#! FIELDS time "; + for (size_t i = 0; i < num_variables(); ++i) { + os_kernels << variables(i)->name + " "; + } + for (size_t i = 0; i < num_variables(); ++i) { + os_kernels << "sigma_" + variables(i)->name + " "; + } + os_kernels << "height logweight\n"; + // Make sure the action name compatible with the script in https://github.com/invemichele/opes/blob/master/postprocessing/State_from_Kernels.py + if (m_explore) os_kernels << "#! SET action OPES_METAD_EXPLORE_kernels\n"; + else os_kernels << "#! SET action OPES_METAD_kernels\n"; + if (m_inf_biasfactor) { + os_kernels << "#! SET biasfactor " << "inf" << "\n"; + } else { + os_kernels << "#! SET biasfactor " << m_biasfactor << "\n"; + } + os_kernels << "#! SET epsilon " << m_epsilon << "\n"; + os_kernels << "#! SET kernel_cutoff " << m_cutoff << "\n"; + os_kernels << "#! SET compression_threshold " << m_compression_threshold << "\n"; + for (size_t i = 0; i < num_variables(); ++i) { + if (variables(i)->is_enabled(f_cv_periodic)) { + if (variables(i)->is_enabled(f_cv_lower_boundary)) { + os_kernels << "#! SET min_" + variables(i)->name + " " << variables(i)->lower_boundary.real_value << "\n"; + } + if (variables(i)->is_enabled(f_cv_upper_boundary)) { + os_kernels << "#! SET max_" + variables(i)->name + " " << variables(i)->upper_boundary.real_value << "\n"; + } + } + } + } + os_kernels << m_kernels_output.str(); + os_kernels.setf(format_kernels); + error_code |= cvm::proxy->flush_output_stream(kernels_filename); + m_kernels_output.str(""); + m_kernels_output.clear(); + + // Write the trajectory + const std::string traj_filename = traj_file_name(".misc.traj"); + std::ostream& os_traj = cvm::proxy->output_stream(traj_filename, "trajectory of various OPES properties"); + const std::ios_base::fmtflags format_traj = os_traj.flags(); + if (firsttime) { + os_traj << "#! FIELDS time "; + for (size_t i = 0; i < num_variables(); ++i) { + os_traj << variables(i)->name + " "; + } + os_traj << this->name + ".bias "; + os_traj << this->name + ".rct "; + if (!m_no_zed) os_traj << this->name + ".zed "; + os_traj << this->name + ".neff "; + if (m_calc_work) if (!m_no_zed) os_traj << this->name + ".work "; + os_traj << this->name + ".nker "; + if (m_nlist) os_traj << this->name + ".nlker "; + if (m_nlist) os_traj << this->name + ".nlsteps "; + os_traj << "\n"; + for (size_t i = 0; i < num_variables(); ++i) { + if (variables(i)->is_enabled(f_cv_lower_boundary)) { + os_traj << "#! SET min_" + variables(i)->name + " " << variables(i)->lower_boundary.real_value << "\n"; + } + if (variables(i)->is_enabled(f_cv_upper_boundary)) { + os_traj << "#! SET max_" + variables(i)->name + " " << variables(i)->upper_boundary.real_value << "\n"; + } + } + } + os_traj << m_traj_oss.str(); + os_traj.setf(format_traj); + error_code |= cvm::proxy->flush_output_stream(traj_filename); + m_traj_oss.str(""); + m_traj_oss.clear(); + if (firsttime) firsttime = false; + if (m_pmf_grid_on) { + error_code |= computePMF(); + const std::string pmf_filename = traj_file_name(".pmf"); + error_code |= writePMF(m_pmf_grid, pmf_filename, false); + if (comm == multiple_replicas && m_pmf_shared) { + if (cvm::proxy->replica_index() == 0) { + const std::string global_pmf_filename = traj_file_name(".global.pmf"); + error_code |= writePMF(m_global_pmf_grid, global_pmf_filename, false); + } + } + if (m_pmf_hist_freq > 0 && cvm::step_absolute() % m_pmf_hist_freq == 0) { + const std::string pmf_hist_filename = traj_file_name(".hist.pmf"); + error_code |= writePMF(m_pmf_grid, pmf_hist_filename, true); + if (comm == multiple_replicas && m_pmf_shared) { + if (cvm::proxy->replica_index() == 0) { + const std::string global_hist_pmf_filename = traj_file_name(".global.hist.pmf"); + error_code |= writePMF(m_global_pmf_grid, global_hist_pmf_filename, true); + } + } + } + } + // To prevent the case that one replica exits earlier and then destroys all streams + if (comm == multiple_replicas) cvm::proxy->replica_comm_barrier(); + return error_code; +} + +void hist_to_pmf(const cvm::real kbt, const colvar_grid_scalar *hist, std::unique_ptr& pmf) { + // Get the sum of probabilities of all grids + cvm::real norm_factor = 0; + cvm::real max_prob = 0; + auto& prob_data = hist->data; + for (auto it = prob_data.begin(); it != prob_data.end(); ++it) { + norm_factor += (*it); + if ((*it) > max_prob) max_prob = (*it); + } + if (norm_factor > 0) { + const cvm::real min_pmf = (max_prob > 0) ? -1.0 * kbt * cvm::logn(max_prob / norm_factor) : 0; + auto& pmf_data = pmf->data; + for (size_t i = 0; i < pmf_data.size(); ++i) { + if (prob_data[i] > 0) { + pmf_data[i] = -1.0 * kbt * cvm::logn(prob_data[i] / norm_factor) - min_pmf; + } + } + auto max_pmf = *std::max_element(pmf_data.begin(), pmf_data.end()); + for (size_t i = 0; i < pmf_data.size(); ++i) { + if (!(prob_data[i] > 0)) { + pmf_data[i] = max_pmf; + } + } + } +} + +int colvarbias_opes::computePMF() { + // Multiple replica: collect all samples from other replicas + if (comm == multiple_replicas && m_pmf_shared) { + const size_t samples_n = m_reweight_grid->raw_data_num(); + const int msg_size = samples_n * sizeof(cvm::real); + std::vector buffer; + if (cvm::main()->proxy->replica_index() == 0) { + buffer.resize(samples_n * (cvm::proxy->num_replicas() - 1)); + for (int p = 1; p < cvm::proxy->num_replicas(); p++) { + const size_t start_pos = (p - 1) * samples_n; + if (cvm::proxy->replica_comm_recv((char*)&(buffer[start_pos]), msg_size, p) != msg_size) { + return cvm::error("Error getting shared OPES reweighting histogram from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)(&(m_reweight_grid->data[0])), msg_size, 0) != msg_size) { + return cvm::error("Error sending shared OPES reweighting histogram from replica " + cvm::to_str(cvm::main()->proxy->replica_index())); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast m_reweight_grid to all replicas + auto& global_data = m_global_reweight_grid->data; + if (cvm::main()->proxy->replica_index() == 0) { + global_data = m_reweight_grid->data; + // Sum the samples on PE 0 + for (int p = 1; p < cvm::proxy->num_replicas(); p++) { + const size_t start_pos = (p - 1) * samples_n; + for (size_t i = 0 ; i < samples_n; ++i) { + global_data[i] += buffer[start_pos+i]; + } + } + } + } + // Get the sum of probabilities of all grids + hist_to_pmf(m_kbt, m_reweight_grid.get(), m_pmf_grid); + if (comm == multiple_replicas && m_pmf_shared) { + if (cvm::main()->proxy->replica_index() == 0) { + hist_to_pmf(m_kbt, m_global_reweight_grid.get(), m_global_pmf_grid); + } + } + if (comm == multiple_replicas) { + cvm::proxy->replica_comm_barrier(); + } + return COLVARS_OK; +} + +int colvarbias_opes::writePMF(const std::unique_ptr& pmf_grid, const std::string &filename, bool keep_open) { + std::ostream& os = cvm::proxy->output_stream(filename, "output stream of " + filename); + if (!os) { + return COLVARS_FILE_ERROR; + } + pmf_grid->write_multicol(os); + if (!keep_open) { + cvm::proxy->close_output_stream(filename); + } else { + cvm::proxy->flush_output_stream(filename); + } + return COLVARS_OK; +} + +void colvarbias_opes::writeTrajBuffer() { + if (m_traj_output_frequency > 0 && cvm::step_absolute() % m_traj_output_frequency == 0) { + m_traj_oss << std::right; + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << (cvm::step_absolute() * cvm::dt()) * 1e-3; + for (size_t i = 0; i < num_variables(); ++i) { + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << variables(i)->value().real_value; + } + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << bias_energy; + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << m_traj_line.rct; + if (!m_no_zed) m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << m_traj_line.zed; + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << m_traj_line.neff; + if (m_calc_work) m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << m_traj_line.work; + m_traj_oss << " " << m_traj_line.nker; + if (m_nlist) m_traj_oss << " " << m_traj_line.nlker; + if (m_nlist) m_traj_oss << " " << m_traj_line.nlsteps; + m_traj_oss << "\n"; + } +} + +void colvarbias_opes::updateNlist(const std::vector& center) { + if (m_kernels.empty()) return; + m_nlist_center = center; + m_nlist_index.clear(); + if (m_num_threads == 1 || m_kernels.size() < 2 * m_num_threads) { + for (size_t k = 0; k < m_kernels.size(); ++k) { + cvm::real norm2_k = 0; + for (size_t i = 0; i < num_variables(); ++i) { + norm2_k += variables(i)->dist2(m_nlist_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + } + if (norm2_k <= m_nlist_param[0] * m_cutoff2) { + m_nlist_index.push_back(k); + } + } + } else { +#if defined (_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + std::vector private_nlist_index; + #pragma omp for nowait + for (int k = 0; k < static_cast(m_kernels.size()); ++k) { + cvm::real norm2_k = 0; + for (int i = 0; i < static_cast(num_variables()); ++i) { + norm2_k += variables(i)->dist2(m_nlist_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + } + if (norm2_k <= m_nlist_param[0] * m_cutoff2) { + private_nlist_index.push_back(static_cast(k)); + } + } + #pragma omp critical + m_nlist_index.insert(m_nlist_index.end(), private_nlist_index.begin(), private_nlist_index.end()); + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + std::vector> private_nlist_index(m_num_threads); + auto worker = [&](int start, int end, void* unused){ + const int tid = cvm::proxy->smp_thread_id(); + for (int k = start; k <= end; ++k) { + cvm::real norm2_k = 0; + for (size_t i = 0; i < num_variables(); ++i) { + norm2_k += variables(i)->dist2(m_nlist_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + } + if (norm2_k <= m_nlist_param[0] * m_cutoff2) { + private_nlist_index[tid].push_back(k); + } + } + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, NULL, CKLOOP_NONE, NULL); + for (size_t j = 0; j < m_num_threads; ++j) { + m_nlist_index.insert(m_nlist_index.end(), private_nlist_index[i].begin(), private_nlist_index.end()); + } +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + if (m_recursive_merge) { + std::sort(m_nlist_index.begin(), m_nlist_index.end()); + } + } + std::vector dev2(num_variables(), 0); + for (size_t k = 0; k < m_nlist_index.size(); ++k) { + for (size_t i = 0; i < num_variables(); ++i) { + dev2[i] += variables(i)->dist2(m_nlist_center[i], m_kernels[m_nlist_index[k]].m_center[i]); + } + } + for (size_t i = 0; i < num_variables(); ++i) { + if (m_nlist_index.empty()) { + m_nlist_dev2[i] = m_kernels.back().m_sigma[i] * m_kernels.back().m_sigma[i]; + } else { + m_nlist_dev2[i] = dev2[i] / m_nlist_index.size(); + } + } + m_traj_line.nlker = m_nlist_index.size(); + m_traj_line.nlsteps = m_nlist_steps; + m_nlist_steps = 0; + m_nlist_update = false; +} diff --git a/lib/colvars/colvarbias_opes.h b/lib/colvars/colvarbias_opes.h new file mode 100644 index 0000000000..0c52ba2413 --- /dev/null +++ b/lib/colvars/colvarbias_opes.h @@ -0,0 +1,176 @@ +#ifndef COLVARBIAS_OPES_H +#define COLVARBIAS_OPES_H + +// This code is mainly adapted from the PLUMED opes module, which uses the +// LGPLv3 license as shown below: +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Copyright (c) 2020-2021 of Michele Invernizzi. + + This file is part of the OPES plumed module. + + The OPES plumed module is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + The OPES plumed module is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with plumed. If not, see . ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + +#include "colvarbias.h" + +#include +#include + +// OPES_METAD implementation: swiped from OPESmetad.cpp of PLUMED +class colvarbias_opes: public colvarbias { +public: + /// The Gaussian kernel data structure + struct kernel { + cvm::real m_height; + std::vector m_center; + std::vector m_sigma; + kernel() {} + kernel(cvm::real h, const std::vector& c, + const std::vector& s): + m_height(h), m_center(c), m_sigma(s) {} + }; + /// Communication between different replicas + enum Communication { + /// One replica (default) + single_replica, + /// Hills added concurrently by several replicas + multiple_replicas + }; + /// Constructor + colvarbias_opes(char const *key); + /// Initializer + int init(std::string const &conf) override; + /// Per-timestep update + int update() override; + /// Save the state to a text file for restarting + std::ostream &write_state_data(std::ostream &os) override; + /// Read the state from a text file for restarting + std::istream &read_state_data(std::istream &is) override; + /// Save the state to a binary file for restarting + cvm::memory_stream &write_state_data(cvm::memory_stream &os) override; + /// Read the state from a binary file for restarting + cvm::memory_stream &read_state_data(cvm::memory_stream &is) override; + /// Write to files at restart steps + int write_output_files() override; +private: + int update_opes(); + int calculate_opes(); + void save_state(); + cvm::real getProbAndDerivatives(const std::vector& cv, std::vector& der_prob) const; + cvm::real evaluateKernel(const kernel& G, const std::vector& x) const; + cvm::real evaluateKernel(const kernel& G, const std::vector& x, std::vector& accumulated_derivative, std::vector& dist) const; + void addKernel(const double height, const std::vector& center, const std::vector& sigma, const double logweight); + void addKernel(const double height, const std::vector& center, const std::vector& sigma); + size_t getMergeableKernel(const std::vector& giver_center, const size_t giver_k) const; + void mergeKernels(kernel& k1, const kernel& k2) const; + void updateNlist(const std::vector& center); + struct traj_line { + double rct; + double zed; + double neff; + double work; + size_t nker; + size_t nlker; + size_t nlsteps; + }; + void writeTrajBuffer(); + void showInfo() const; + template OST &write_state_data_template_(OST &os) const; + template IST &read_state_data_template_(IST &os); + std::string const traj_file_name(const std::string& suffix) const; + int collectSampleToPMFGrid(); + int computePMF(); + int writePMF(const std::unique_ptr& pmf_grid, const std::string &filename, bool keep_open); +private: + cvm::real m_kbt; + cvm::real m_barrier; + cvm::real m_biasfactor; + cvm::real m_bias_prefactor; + cvm::real m_temperature; + cvm::step_number m_pace; + cvm::step_number m_adaptive_sigma_stride; + cvm::step_number m_adaptive_counter; + unsigned long long m_counter; + cvm::real m_compression_threshold; + cvm::real m_compression_threshold2; + bool m_adaptive_sigma; + bool m_fixed_sigma; + bool m_no_zed; + // bool m_restart; + bool m_nlist; + bool m_recursive_merge; + std::vector m_nlist_param; + std::vector m_sigma0; + std::vector m_sigma_min; + cvm::real m_epsilon; + cvm::real m_sum_weights; + cvm::real m_sum_weights2; + cvm::real m_cutoff; + cvm::real m_cutoff2; + cvm::real m_zed; + cvm::real m_old_kdenorm; + cvm::real m_kdenorm; + cvm::real m_val_at_cutoff; + cvm::real m_rct; + cvm::real m_neff; + std::vector m_kernels; + std::vector m_delta_kernels; + std::vector m_av_cv; + std::vector m_av_M2; + std::ostringstream m_kernels_output; + std::vector m_nlist_center; + std::vector m_nlist_index; + std::vector m_nlist_dev2; + size_t m_nlist_steps; + bool m_nlist_update; + bool m_nlist_pace_reset; + size_t m_nker; + bool m_calc_work; + cvm::real m_work; + /// Communication between different replicas + Communication comm; + /// \brief Identifier for this replica + std::string replica_id; + size_t m_num_walkers; + size_t shared_freq; + size_t m_num_threads; + size_t m_nlker; + // size_t m_state_stride; + // std::unordered_map m_kernel_output_components; + std::string m_kernels_output_headers; + cvm::step_number m_traj_output_frequency; + traj_line m_traj_line; + std::ostringstream m_traj_oss; + bool m_is_first_step; + std::vector m_cv; + // For saving states + decltype(m_zed) m_saved_zed; + decltype(m_sum_weights) m_saved_sum_weights; + decltype(m_sum_weights2) m_saved_sum_weights2; + decltype(m_kernels) m_saved_kernels; + // PMF grid from reweighting + bool m_pmf_grid_on; + std::vector m_pmf_cvs; + std::string grid_conf; + std::shared_ptr m_reweight_grid; + std::unique_ptr m_pmf_grid; + cvm::step_number m_pmf_hist_freq; + bool m_pmf_shared; // shared PMF among replicas + std::unique_ptr m_global_reweight_grid; + std::unique_ptr m_global_pmf_grid; + bool m_explore; + bool m_inf_biasfactor; +}; + +#endif // COLVARBIAS_OPES_H diff --git a/lib/colvars/colvarcomp.cpp b/lib/colvars/colvarcomp.cpp index e6729f43a7..9a056f7dd3 100644 --- a/lib/colvars/colvarcomp.cpp +++ b/lib/colvars/colvarcomp.cpp @@ -261,7 +261,6 @@ int colvar::cvc::init_dependencies() { require_feature_children(f_cvc_explicit_gradient, f_ag_explicit_gradient); init_feature(f_cvc_inv_gradient, "inverse_gradient", f_type_dynamic); - require_feature_self(f_cvc_inv_gradient, f_cvc_gradient); init_feature(f_cvc_debug_gradient, "debug_gradient", f_type_user); require_feature_self(f_cvc_debug_gradient, f_cvc_gradient); @@ -525,7 +524,7 @@ void colvar::cvc::calc_force_invgrads() void colvar::cvc::calc_Jacobian_derivative() { - cvm::error("Error: calculation of inverse gradients is not implemented " + cvm::error("Error: calculation of Jacobian derivatives is not implemented " "for colvar components of type \""+function_type()+"\".\n", COLVARS_NOT_IMPLEMENTED); } @@ -533,8 +532,10 @@ void colvar::cvc::calc_Jacobian_derivative() void colvar::cvc::calc_fit_gradients() { - for (size_t ig = 0; ig < atom_groups.size(); ig++) { - atom_groups[ig]->calc_fit_gradients(); + if (is_enabled(f_cvc_explicit_gradient)) { + for (size_t ig = 0; ig < atom_groups.size(); ig++) { + atom_groups[ig]->calc_fit_gradients(); + } } } diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index 334fdc1f6e..53755576c2 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -233,8 +233,14 @@ public: /// Forcibly set value of CVC - useful for driving an external coordinate, /// eg. lambda dynamics - inline void set_value(colvarvalue const &new_value) { + inline void set_value(colvarvalue const &new_value, bool now=false) { x = new_value; + // Cache value to be communicated to back-end between time steps + cvm::proxy->set_alch_lambda(x.real_value); + if (now) { + // If requested (e.g. upon restarting), sync to back-end + cvm::proxy->send_alch_lambda(); + } } protected: @@ -1212,9 +1218,11 @@ protected: // No atom groups needed public: alch_lambda(); + int init_alchemy(int time_step_factor); virtual ~alch_lambda() {} virtual void calc_value(); - virtual void calc_gradients(); + virtual void calc_force_invgrads(); + virtual void calc_Jacobian_derivative(); virtual void apply_force(colvarvalue const &force); }; diff --git a/lib/colvars/colvarcomp_alchlambda.cpp b/lib/colvars/colvarcomp_alchlambda.cpp index a175ea43e8..29168d87ce 100644 --- a/lib/colvars/colvarcomp_alchlambda.cpp +++ b/lib/colvars/colvarcomp_alchlambda.cpp @@ -20,22 +20,46 @@ colvar::alch_lambda::alch_lambda() { set_function_type("alchLambda"); - disable(f_cvc_explicit_gradient); - disable(f_cvc_gradient); + provide(f_cvc_explicit_gradient, false); + provide(f_cvc_gradient, false); // Cannot apply forces on this CVC + provide(f_cvc_collect_atom_ids, false); + + provide(f_cvc_inv_gradient); // Projected force is TI derivative + provide(f_cvc_Jacobian); // Zero x.type(colvarvalue::type_scalar); - // Query initial value from back-end + + // Query initial value from back-end; will be overwritten if restarting from a state file cvm::proxy->get_alch_lambda(&x.real_value); } +int colvar::alch_lambda::init_alchemy(int factor) +{ + // We need calculation every time step + // default in Tinker-HP and NAMD2, must be enforced in NAMD3 + // Also checks back-end settings, ie. that alchemy is enabled + // (in NAMD3: alchType TI, computeEnergies at the right frequency) + + // Forbid MTS until fully implemented + if (factor != 1) { + return cvm::error("Error: timeStepFactor > 1 is not yet supported for alchemical variables."); + } + cvm::proxy->request_alch_energy_freq(factor); + + return COLVARS_OK; +} + + void colvar::alch_lambda::calc_value() { - // Special workflow: - // at the beginning of the timestep we get a force instead of calculating the value + // By default, follow external parameter + // This might get overwritten by driving extended dynamics + // (in apply_force() below) + cvm::proxy->get_alch_lambda(&x.real_value); cvm::proxy->get_dE_dlambda(&ft.real_value); - ft.real_value *= -1.0; // Energy derivative to force + ft.real_value *= -1.0; // Convert energy derivative to force // Include any force due to bias on Flambda ft.real_value += cvm::proxy->indirect_lambda_biasing_force; @@ -43,19 +67,24 @@ void colvar::alch_lambda::calc_value() } -void colvar::alch_lambda::calc_gradients() +void colvar::alch_lambda::calc_force_invgrads() { + // All the work is done in calc_value() +} + + +void colvar::alch_lambda::calc_Jacobian_derivative() +{ + jd = 0.0; } void colvar::alch_lambda::apply_force(colvarvalue const & /* force */) { - // new value will be cached and sent at end of timestep - cvm::proxy->set_alch_lambda(x.real_value); + // Forces, if any, are applied in colvar::update_extended_Lagrangian() } - colvar::alch_Flambda::alch_Flambda() { set_function_type("alch_Flambda"); diff --git a/lib/colvars/colvarcomp_angles.cpp b/lib/colvars/colvarcomp_angles.cpp index 56894e9f5c..0e7aed65ed 100644 --- a/lib/colvars/colvarcomp_angles.cpp +++ b/lib/colvars/colvarcomp_angles.cpp @@ -267,74 +267,22 @@ void colvar::dihedral::calc_value() void colvar::dihedral::calc_gradients() { - cvm::rvector A = cvm::rvector::outer(r12, r23); - cvm::real rA = A.norm(); - cvm::rvector B = cvm::rvector::outer(r23, r34); - cvm::real rB = B.norm(); - cvm::rvector C = cvm::rvector::outer(r23, A); - cvm::real rC = C.norm(); + // Eqs. (27i) ~ (27l) from https://doi.org/10.1002/(SICI)1096-987X(19960715)17:9<1132::AID-JCC5>3.0.CO;2-T. - cvm::real const cos_phi = (A*B)/(rA*rB); - cvm::real const sin_phi = (C*B)/(rC*rB); + const cvm::rvector A = cvm::rvector::outer(r12, r23); + const cvm::rvector B = cvm::rvector::outer(r23, r34); + const cvm::real nG = r23.norm(); + const cvm::real A2 = A.norm2(); + const cvm::real B2 = B.norm2(); - cvm::rvector f1, f2, f3; - - rB = 1.0/rB; - B *= rB; - - if (cvm::fabs(sin_phi) > 0.1) { - rA = 1.0/rA; - A *= rA; - cvm::rvector const dcosdA = rA*(cos_phi*A-B); - cvm::rvector const dcosdB = rB*(cos_phi*B-A); - // rA = 1.0; - - cvm::real const K = (1.0/sin_phi) * (180.0/PI); - - f1 = K * cvm::rvector::outer(r23, dcosdA); - f3 = K * cvm::rvector::outer(dcosdB, r23); - f2 = K * (cvm::rvector::outer(dcosdA, r12) - + cvm::rvector::outer(r34, dcosdB)); - } - else { - rC = 1.0/rC; - C *= rC; - cvm::rvector const dsindC = rC*(sin_phi*C-B); - cvm::rvector const dsindB = rB*(sin_phi*B-C); - // rC = 1.0; - - cvm::real const K = (-1.0/cos_phi) * (180.0/PI); - - f1.x = K*((r23.y*r23.y + r23.z*r23.z)*dsindC.x - - r23.x*r23.y*dsindC.y - - r23.x*r23.z*dsindC.z); - f1.y = K*((r23.z*r23.z + r23.x*r23.x)*dsindC.y - - r23.y*r23.z*dsindC.z - - r23.y*r23.x*dsindC.x); - f1.z = K*((r23.x*r23.x + r23.y*r23.y)*dsindC.z - - r23.z*r23.x*dsindC.x - - r23.z*r23.y*dsindC.y); - - f3 = cvm::rvector::outer(dsindB, r23); - f3 *= K; - - f2.x = K*(-(r23.y*r12.y + r23.z*r12.z)*dsindC.x - +(2.0*r23.x*r12.y - r12.x*r23.y)*dsindC.y - +(2.0*r23.x*r12.z - r12.x*r23.z)*dsindC.z - +dsindB.z*r34.y - dsindB.y*r34.z); - f2.y = K*(-(r23.z*r12.z + r23.x*r12.x)*dsindC.y - +(2.0*r23.y*r12.z - r12.y*r23.z)*dsindC.z - +(2.0*r23.y*r12.x - r12.y*r23.x)*dsindC.x - +dsindB.x*r34.z - dsindB.z*r34.x); - f2.z = K*(-(r23.x*r12.x + r23.y*r12.y)*dsindC.z - +(2.0*r23.z*r12.x - r12.z*r23.x)*dsindC.x - +(2.0*r23.z*r12.y - r12.z*r23.y)*dsindC.y - +dsindB.y*r34.x - dsindB.x*r34.y); - } + const cvm::real K = 180.0/PI; + const cvm::rvector f1 = K * nG / A2 * A; + const cvm::rvector f2 = K * ((r12 * r23 / (A2 * nG)) * A + (r34 * r23 / (B2 * nG)) * B); + const cvm::rvector f3 = K * nG / B2 * B; group1->set_weighted_gradient(-f1); - group2->set_weighted_gradient(-f2 + f1); - group3->set_weighted_gradient(-f3 + f2); + group2->set_weighted_gradient( f2 + f1); + group3->set_weighted_gradient(-f3 - f2); group4->set_weighted_gradient(f3); } diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index 319190c385..6de68264c3 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -384,32 +384,30 @@ void colvar::distance_dir::apply_force(colvarvalue const &force) cvm::real const iprod = force.rvector_value * x.rvector_value; cvm::rvector const force_tang = force.rvector_value - iprod * x.rvector_value; - if (!group1->noforce) - group1->apply_force(-1.0 * force_tang); - - if (!group2->noforce) - group2->apply_force( force_tang); + if (!group1->noforce) { + group1->apply_force(-1.0 / dist_v.norm() * force_tang); + } + if (!group2->noforce) { + group2->apply_force( 1.0 / dist_v.norm() * force_tang); + } } -cvm::real colvar::distance_dir::dist2(colvarvalue const &x1, - colvarvalue const &x2) const +cvm::real colvar::distance_dir::dist2(colvarvalue const &x1, colvarvalue const &x2) const { - return (x1.rvector_value - x2.rvector_value).norm2(); + return x1.dist2(x2); } -colvarvalue colvar::distance_dir::dist2_lgrad(colvarvalue const &x1, - colvarvalue const &x2) const +colvarvalue colvar::distance_dir::dist2_lgrad(colvarvalue const &x1, colvarvalue const &x2) const { - return colvarvalue((x1.rvector_value - x2.rvector_value), colvarvalue::type_unit3vectorderiv); + return x1.dist2_grad(x2); } -colvarvalue colvar::distance_dir::dist2_rgrad(colvarvalue const &x1, - colvarvalue const &x2) const +colvarvalue colvar::distance_dir::dist2_rgrad(colvarvalue const &x1, colvarvalue const &x2) const { - return colvarvalue((x2.rvector_value - x1.rvector_value), colvarvalue::type_unit3vectorderiv); + return x2.dist2_grad(x1); } @@ -1005,7 +1003,7 @@ void colvar::rmsd::calc_Jacobian_derivative() for (size_t ia = 0; ia < atoms->size(); ia++) { // Gradient of optimal quaternion wrt current Cartesian position - atoms->rot_deriv->calc_derivative_wrt_group1(ia, nullptr, &dq); + atoms->rot_deriv->calc_derivative_wrt_group1(ia, nullptr, &dq); g11 = 2.0 * (atoms->rot.q)[1]*dq[1]; g22 = 2.0 * (atoms->rot.q)[2]*dq[2]; @@ -1304,7 +1302,7 @@ void colvar::eigenvector::calc_Jacobian_derivative() // Gradient of optimal quaternion wrt current Cartesian position // trick: d(R^-1)/dx = d(R^t)/dx = (dR/dx)^t // we can just transpose the derivatives of the direct matrix - atoms->rot_deriv->calc_derivative_wrt_group1(ia, nullptr, &dq_1); + atoms->rot_deriv->calc_derivative_wrt_group1(ia, nullptr, &dq_1); g11 = 2.0 * quat0[1]*dq_1[1]; g22 = 2.0 * quat0[2]*dq_1[2]; @@ -1403,11 +1401,12 @@ void colvar::cartesian::apply_force(colvarvalue const &force) size_t ia, j; if (!atoms->noforce) { cvm::rvector f; + auto ag_force = atoms->get_group_force_object(); for (ia = 0; ia < atoms->size(); ia++) { for (j = 0; j < dim; j++) { f[axes[j]] = force.vector1d_value[dim*ia + j]; } - (*atoms)[ia].apply_force(f); + ag_force.add_atom_force(ia, f); } } } diff --git a/lib/colvars/colvarcomp_protein.cpp b/lib/colvars/colvarcomp_protein.cpp index f782095148..832005e2a7 100644 --- a/lib/colvars/colvarcomp_protein.cpp +++ b/lib/colvars/colvarcomp_protein.cpp @@ -28,34 +28,58 @@ colvar::alpha_angles::alpha_angles() int colvar::alpha_angles::init(std::string const &conf) { int error_code = cvc::init(conf); + if (error_code != COLVARS_OK) return error_code; std::string segment_id; - get_keyval(conf, "psfSegID", segment_id, std::string("MAIN")); - std::vector residues; - { - std::string residues_conf = ""; - key_lookup(conf, "residueRange", &residues_conf); + + bool b_use_index_groups = false; + cvm::atom_group group_CA, group_N, group_O; + + std::string residues_conf = ""; + std::string prefix; + + // residueRange is mandatory for the topology-based case + if (key_lookup(conf, "residueRange", &residues_conf)) { if (residues_conf.size()) { std::istringstream is(residues_conf); int initial, final; char dash; if ( (is >> initial) && (initial > 0) && - (is >> dash) && (dash == '-') && - (is >> final) && (final > 0) ) { + (is >> dash) && (dash == '-') && + (is >> final) && (final > 0) ) { for (int rnum = initial; rnum <= final; rnum++) { residues.push_back(rnum); } } } else { - error_code |= - cvm::error("Error: no residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); + return cvm::error("Error: no residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); } - } - if (residues.size() < 5) { - error_code |= cvm::error("Error: not enough residues defined in \"residueRange\".\n", - COLVARS_INPUT_ERROR); + if (residues.size() < 5) { + return cvm::error("Error: not enough residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); + } + get_keyval(conf, "psfSegID", segment_id, std::string("MAIN")); + + } else { + b_use_index_groups = true; + get_keyval(conf, "prefix", prefix, "alpha_"); + + // Not all groups are mandatory, parse silently + group_CA.add_index_group(prefix + "CA", true); + group_N.add_index_group(prefix + "N", true); + group_O.add_index_group(prefix + "O", true); + int na = group_CA.size(); + int nn = group_N.size(); + int no = group_O.size(); + if ((nn != 0 || no != 0) && (nn != no)) { + return cvm::error("Error: If either is provided, atom groups " + prefix + "N and " + prefix + "O must have the same number of atoms.", + COLVARS_INPUT_ERROR); + } + if (nn != 0 && na != 0 && nn != na) { + return cvm::error("Error: If both are provided, atom groups " + prefix + "N and " + prefix + "CA must have the same number of atoms.", + COLVARS_INPUT_ERROR); + } } std::string const &sid = segment_id; @@ -64,8 +88,7 @@ int colvar::alpha_angles::init(std::string const &conf) get_keyval(conf, "hBondCoeff", hb_coeff, hb_coeff); if ((hb_coeff < 0.0) || (hb_coeff > 1.0)) { - error_code |= - cvm::error("Error: hBondCoeff must be defined between 0 and 1.\n", COLVARS_INPUT_ERROR); + return cvm::error("Error: hBondCoeff must be defined between 0 and 1.\n", COLVARS_INPUT_ERROR); } @@ -73,14 +96,29 @@ int colvar::alpha_angles::init(std::string const &conf) get_keyval(conf, "angleTol", theta_tol, theta_tol); if (hb_coeff < 1.0) { - - for (size_t i = 0; i < residues.size()-2; i++) { - theta.push_back(new colvar::angle(cvm::atom(r[i ], "CA", sid), - cvm::atom(r[i+1], "CA", sid), - cvm::atom(r[i+2], "CA", sid))); - register_atom_group(theta.back()->atom_groups[0]); - register_atom_group(theta.back()->atom_groups[1]); - register_atom_group(theta.back()->atom_groups[2]); + if (b_use_index_groups) { + if (group_CA.size() < 5) { + return cvm::error("Not enough atoms (" + cvm::to_str(group_CA.size()) + ") in index group \"" + prefix + "CA\"", + COLVARS_INPUT_ERROR); + } + for (size_t i = 0; i < group_CA.size()-2; i++) { + // Note: the angle constructor constructs copies of the atom objects + theta.push_back(new colvar::angle(group_CA[i], + group_CA[i+1], + group_CA[i+2])); + register_atom_group(theta.back()->atom_groups[0]); + register_atom_group(theta.back()->atom_groups[1]); + register_atom_group(theta.back()->atom_groups[2]); + } + } else { + for (size_t i = 0; i < residues.size()-2; i++) { + theta.push_back(new colvar::angle(cvm::atom(r[i ], "CA", sid), + cvm::atom(r[i+1], "CA", sid), + cvm::atom(r[i+2], "CA", sid))); + register_atom_group(theta.back()->atom_groups[0]); + register_atom_group(theta.back()->atom_groups[1]); + register_atom_group(theta.back()->atom_groups[2]); + } } } else { @@ -93,14 +131,27 @@ int colvar::alpha_angles::init(std::string const &conf) get_keyval(conf, "hBondExpDenom", ed, ed); if (hb_coeff > 0.0) { - - for (size_t i = 0; i < residues.size()-4; i++) { - hb.push_back(new colvar::h_bond(cvm::atom(r[i ], "O", sid), - cvm::atom(r[i+4], "N", sid), - r0, en, ed)); - register_atom_group(hb.back()->atom_groups[0]); + if (b_use_index_groups) { + if (group_N.size() < 5) { + return cvm::error("Not enough atoms (" + cvm::to_str(group_N.size()) + ") in index group \"" + prefix + "N\"", + COLVARS_INPUT_ERROR); + } + for (size_t i = 0; i < group_N.size()-4; i++) { + // Note: we need to call the atom copy constructor here because + // the h_bond constructor does not make copies of the provided atoms + hb.push_back(new colvar::h_bond(cvm::atom(group_O[i]), + cvm::atom(group_N[i+4]), + r0, en, ed)); + register_atom_group(hb.back()->atom_groups[0]); + } + } else { + for (size_t i = 0; i < residues.size()-4; i++) { + hb.push_back(new colvar::h_bond(cvm::atom(r[i ], "O", sid), + cvm::atom(r[i+4], "N", sid), + r0, en, ed)); + register_atom_group(hb.back()->atom_groups[0]); + } } - } else { cvm::log("The hBondCoeff specified will disable the hydrogen bond terms.\n"); } @@ -290,41 +341,62 @@ int colvar::dihedPC::init(std::string const &conf) if (cvm::debug()) cvm::log("Initializing dihedral PC object.\n"); + bool b_use_index_groups = false; std::string segment_id; - get_keyval(conf, "psfSegID", segment_id, std::string("MAIN")); - std::vector residues; - { - std::string residues_conf = ""; - key_lookup(conf, "residueRange", &residues_conf); + size_t n_residues; + std::string residues_conf = ""; + std::string prefix; + cvm::atom_group group_CA, group_N, group_C; + + // residueRange is mandatory for the topology-based case + if (key_lookup(conf, "residueRange", &residues_conf)) { if (residues_conf.size()) { std::istringstream is(residues_conf); int initial, final; char dash; if ( (is >> initial) && (initial > 0) && - (is >> dash) && (dash == '-') && - (is >> final) && (final > 0) ) { + (is >> dash) && (dash == '-') && + (is >> final) && (final > 0) ) { for (int rnum = initial; rnum <= final; rnum++) { residues.push_back(rnum); } } } else { - error_code |= - cvm::error("Error: no residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); + return cvm::error("Error: no residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); } - } + n_residues = residues.size(); + get_keyval(conf, "psfSegID", segment_id, std::string("MAIN")); - if (residues.size() < 2) { + } else { + + b_use_index_groups = true; + get_keyval(conf, "prefix", prefix, "dihed_"); + + // All three groups are required + group_CA.add_index_group(prefix + "CA"); + group_N.add_index_group(prefix + "N"); + group_C.add_index_group(prefix + "C"); + int na = group_CA.size(); + int nn = group_N.size(); + int nc = group_C.size(); + if ((nn != na || na != nc)) { + return cvm::error("Error: atom groups " + prefix + "N, " + prefix + "CA, and " + prefix + + "C must have the same number of atoms.", COLVARS_INPUT_ERROR); + } + n_residues = nn; + } + if (n_residues < 2) { error_code |= - cvm::error("Error: dihedralPC requires at least two residues.\n", COLVARS_INPUT_ERROR); + cvm::error("Error: dihedralPC requires at least two residues.\n", COLVARS_INPUT_ERROR); } std::string const &sid = segment_id; std::vector const &r = residues; std::string vecFileName; - int vecNumber; if (get_keyval(conf, "vectorFile", vecFileName, vecFileName)) { + int vecNumber; get_keyval(conf, "vectorNumber", vecNumber, 0); if (vecNumber < 1) { error_code |= @@ -339,9 +411,8 @@ int colvar::dihedPC::init(std::string const &conf) } // TODO: adapt to different formats by setting this flag - bool eigenvectors_as_columns = true; - - if (eigenvectors_as_columns) { + // bool eigenvectors_as_columns = true; + // if (eigenvectors_as_columns) { // Carma-style dPCA file std::string line; cvm::real c; @@ -352,9 +423,7 @@ int colvar::dihedPC::init(std::string const &conf) for (int i=0; i> c; coeffs.push_back(c); } - } -/* TODO Uncomment this when different formats are recognized - else { + /* } else { // Uncomment this when different formats are recognized // Eigenvectors as lines // Skip to the right line for (int i = 1; iatom_groups[0]); register_atom_group(theta.back()->atom_groups[1]); register_atom_group(theta.back()->atom_groups[2]); register_atom_group(theta.back()->atom_groups[3]); // Phi (next res) - theta.push_back(new colvar::dihedral(cvm::atom(r[i ], "C", sid), - cvm::atom(r[i+1], "N", sid), - cvm::atom(r[i+1], "CA", sid), - cvm::atom(r[i+1], "C", sid))); + if (b_use_index_groups) { + theta.push_back(new colvar::dihedral(group_C[i], + group_N[i+1], + group_CA[i+1], + group_C[i+1])); + } else { + theta.push_back(new colvar::dihedral(cvm::atom(r[i ], "C", sid), + cvm::atom(r[i+1], "N", sid), + cvm::atom(r[i+1], "CA", sid), + cvm::atom(r[i+1], "C", sid))); + } register_atom_group(theta.back()->atom_groups[0]); register_atom_group(theta.back()->atom_groups[1]); register_atom_group(theta.back()->atom_groups[2]); diff --git a/lib/colvars/colvarcomp_rotations.cpp b/lib/colvars/colvarcomp_rotations.cpp index a04ace851a..766a0870d1 100644 --- a/lib/colvars/colvarcomp_rotations.cpp +++ b/lib/colvars/colvarcomp_rotations.cpp @@ -137,11 +137,14 @@ void colvar::orientation::apply_force(colvarvalue const &force) if (!atoms->noforce) { rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; + auto ag_force = atoms->get_group_force_object(); for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); - for (size_t i = 0; i < 4; i++) { - (*atoms)[ia].apply_force(FQ[i] * dq0_2[i]); - } + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + const auto f_ia = FQ[0] * dq0_2[0] + + FQ[1] * dq0_2[1] + + FQ[2] * dq0_2[2] + + FQ[3] * dq0_2[3]; + ag_force.add_atom_force(ia, f_ia); } } } @@ -205,7 +208,7 @@ void colvar::orientation_angle::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]); } } @@ -265,7 +268,7 @@ void colvar::orientation_proj::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]); } } @@ -314,7 +317,7 @@ void colvar::tilt::calc_gradients() cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { (*atoms)[ia].grad = cvm::rvector(0.0, 0.0, 0.0); - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); for (size_t iq = 0; iq < 4; iq++) { (*atoms)[ia].grad += (dxdq[iq] * dq0_2[iq]); } @@ -351,7 +354,7 @@ void colvar::spin_angle::calc_gradients() cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { (*atoms)[ia].grad = cvm::rvector(0.0, 0.0, 0.0); - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); for (size_t iq = 0; iq < 4; iq++) { (*atoms)[ia].grad += (dxdq[iq] * dq0_2[iq]); } @@ -399,7 +402,7 @@ void colvar::euler_phi::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]) + (dxdq1 * dq0_2[1]) + (dxdq2 * dq0_2[2]) + @@ -448,7 +451,7 @@ void colvar::euler_psi::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]) + (dxdq1 * dq0_2[1]) + (dxdq2 * dq0_2[2]) + @@ -495,7 +498,7 @@ void colvar::euler_theta::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]) + (dxdq1 * dq0_2[1]) + (dxdq2 * dq0_2[2]) + diff --git a/lib/colvars/colvarcomp_torchann.cpp b/lib/colvars/colvarcomp_torchann.cpp new file mode 100644 index 0000000000..7b83baf9b6 --- /dev/null +++ b/lib/colvars/colvarcomp_torchann.cpp @@ -0,0 +1,233 @@ +// -*- c++ -*- + +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/Colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. + +#include "colvar.h" +#include "colvarcomp.h" +#include "colvarmodule.h" +#include "colvarparse.h" +#include "colvarvalue.h" + +#include "colvarcomp_torchann.h" + + +#ifdef COLVARS_TORCH + +colvar::torchANN::torchANN() +{ + set_function_type("torchANN"); + provide(f_cvc_periodic); +} + +colvar::torchANN::~torchANN() {} + + +int colvar::torchANN::init(std::string const &conf) { + + int error_code = linearCombination::init(conf); + + std::string model_file ; + get_keyval(conf, "modelFile", model_file, std::string("")); + try { + nn = torch::jit::load(model_file); + nn.to(torch::kCPU); + cvm::log("torch model loaded.") ; + } catch (const std::exception & e) { + return cvm::error("Error: couldn't load libtorch model (see below).\n" + cvm::to_str(e.what()), + COLVARS_INPUT_ERROR); + } + + auto const legacy_keyword = get_keyval(conf, "m_output_index", m_output_index, m_output_index); + if (legacy_keyword) { + cvm::log("Warning: m_output_index is a deprecated keyword, please use output_component instead.\n"); + } + get_keyval(conf, "output_component", m_output_index, m_output_index); + + get_keyval(conf, "doubleInputTensor", use_double_input, use_double_input); + //get_keyval(conf, "useGPU", use_gpu, false); + + cvc_indices.resize(cv.size(),0); + + size_t num_inputs = 0; + // compute total number of inputs of neural network + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) + { + num_inputs += cv[i_cv]->value().size() ; + if (i_cv < cv.size() - 1) + cvc_indices[i_cv+1] = num_inputs; + } + cvm::log("Input dimension of model: " + cvm::to_str(num_inputs)); + + // initialize the input tensor + auto options = torch::TensorOptions().dtype(torch::kFloat32).requires_grad(true); + + /* + if (use_gpu) { + if (torch::cuda::is_available()) { + try { + nn.to(torch::kCUDA); + } catch(const std::exception & e) { + cvm::error("Failed to move model to GPU."); + use_gpu = false; + } + } else { + use_gpu = false; + cvm::log("GPU not available."); + } + } + + if (use_gpu) { + options = options.device(torch::kCUDA); + if (use_double_input) { + cvm::log("Data type reset to Float for GPU computation!"); + use_double_input = false; + } + } + */ + + if (use_double_input) { // set type to double + options = options.dtype(torch::kFloat64); + nn.to(torch::kFloat64); + cvm::log("Model's dtype: kFloat64."); + } else { + cvm::log("Model's dtype: kFloat32."); + } + + input_tensor = torch::zeros({1,(long int) num_inputs}, options); + + try { // test the model + std::vector inputs={input_tensor}; + nn_outputs = nn.forward(inputs).toTensor()[0][m_output_index]; + cvm::log("Evaluating model with zero tensor succeeded."); + } catch (const std::exception & e) { + error_code |= cvm::error("Error: evaluating model with zero tensor failed (see below).\n" + + cvm::to_str(e.what()), + COLVARS_INPUT_ERROR); + } + + return error_code; +} + + +void colvar::torchANN::calc_value() { + + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) + cv[i_cv]->calc_value(); + + /* + if (use_gpu) + input_tensor = input_tensor.to(torch::kCPU); + */ + + // set input tensor with no_grad + { + torch::NoGradGuard no_grad; + size_t l = 0; + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) { + const colvarvalue& current_cv_value = cv[i_cv]->value(); + if (current_cv_value.type() == colvarvalue::type_scalar) { + input_tensor[0][l++] = cv[i_cv]->sup_coeff * (cvm::pow(current_cv_value.real_value, cv[i_cv]->sup_np)); + } else { + for (size_t j_elem = 0; j_elem < current_cv_value.size(); ++j_elem) + input_tensor[0][l++] = cv[i_cv]->sup_coeff * current_cv_value[j_elem]; + } + } + } + + /* + if (use_gpu) + input_tensor = input_tensor.to(torch::kCUDA); + */ + + std::vector inputs={input_tensor}; + + // evaluate the value of function + nn_outputs = nn.forward(inputs).toTensor()[0][m_output_index]; + + input_grad = torch::autograd::grad({nn_outputs}, {input_tensor})[0][0]; + + /* + if (use_gpu) + input_grad = input_grad.to(torch::kCPU); + */ + + x = nn_outputs.item() ; + + this->wrap(x); + +} + +void colvar::torchANN::calc_gradients() { + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) { + cv[i_cv]->calc_gradients(); + if (cv[i_cv]->is_enabled(f_cvc_explicit_gradient)) { + const cvm::real factor_polynomial = getPolynomialFactorOfCVGradient(i_cv); + // get the initial index of this cvc + size_t l = cvc_indices[i_cv]; + for (size_t j_elem = 0; j_elem < cv[i_cv]->value().size(); ++j_elem) { + // get derivative of neural network wrt its input + const cvm::real factor = input_grad[l+j_elem].item(); + for (size_t k_ag = 0 ; k_ag < cv[i_cv]->atom_groups.size(); ++k_ag) { + for (size_t l_atom = 0; l_atom < (cv[i_cv]->atom_groups)[k_ag]->size(); ++l_atom) { + (*(cv[i_cv]->atom_groups)[k_ag])[l_atom].grad = factor_polynomial * factor * (*(cv[i_cv]->atom_groups)[k_ag])[l_atom].grad; + } + } + } + } + } +} + +void colvar::torchANN::apply_force(colvarvalue const &force) { + + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) { + // If this CV uses explicit gradients, then atomic gradients is already calculated + // We can apply the force to atom groups directly + if (cv[i_cv]->is_enabled(f_cvc_explicit_gradient)) { + for (size_t k_ag = 0 ; k_ag < cv[i_cv]->atom_groups.size(); ++k_ag) { + (cv[i_cv]->atom_groups)[k_ag]->apply_colvar_force(force.real_value); + } + } else { + const colvarvalue& current_cv_value = cv[i_cv]->value(); + colvarvalue cv_force(current_cv_value); + cv_force.reset(); + const cvm::real factor_polynomial = getPolynomialFactorOfCVGradient(i_cv); + // get the initial index of this cvc + size_t l = cvc_indices[i_cv]; + for (size_t j_elem = 0; j_elem < current_cv_value.size(); ++j_elem) { + cv_force[j_elem] = factor_polynomial * input_grad[l+j_elem].item() * force.real_value; + } + cv[i_cv]->apply_force(cv_force); + } + } +} + + +#else + +colvar::torchANN::torchANN() +{ + set_function_type("torchANN"); +} + +colvar::torchANN::~torchANN() {} + +int colvar::torchANN::init(std::string const &conf) { + + return cvm::error( + "torchANN requires the libtorch library, but it is not enabled during compilation.\n" + "Please refer to the Compilation Notes section of the Colvars manual for more " + "information.\n", + COLVARS_NOT_IMPLEMENTED); + +} + +void colvar::torchANN::calc_value() +{ +} + +#endif diff --git a/lib/colvars/colvarcomp_torchann.h b/lib/colvars/colvarcomp_torchann.h new file mode 100644 index 0000000000..ae241edbcc --- /dev/null +++ b/lib/colvars/colvarcomp_torchann.h @@ -0,0 +1,63 @@ +// -*- c++ -*- + +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/Colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. +// +#ifndef COLVARCOMP_TORCH_H +#define COLVARCOMP_TORCH_H + +// Declaration of torchann + +#include + +#include "colvar.h" +#include "colvarcomp.h" +#include "colvarmodule.h" + +#ifdef COLVARS_TORCH + +#include +#include + +class colvar::torchANN + : public colvar::linearCombination +{ +protected: + torch::jit::script::Module nn; + /// the index of nn output component + size_t m_output_index = 0; + bool use_double_input = false; + //bool use_gpu; + // 1d tensor, concatenation of values of sub-cvcs + torch::Tensor input_tensor; + torch::Tensor nn_outputs; + torch::Tensor input_grad; + // record the initial index of of sub-cvcs in input_tensor + std::vector cvc_indices; +public: + torchANN(); + virtual ~torchANN(); + virtual int init(std::string const &conf); + virtual void calc_value(); + virtual void calc_gradients(); + virtual void apply_force(colvarvalue const &force); +}; + +#else + +class colvar::torchANN + : public colvar::cvc +{ +public: + torchANN(); + virtual ~torchANN(); + virtual int init(std::string const &conf); + virtual void calc_value(); +}; +#endif // COLVARS_TORCH checking + +#endif diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index 46b7917569..3ba3209000 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -92,6 +92,8 @@ void colvardeps::restore_children_deps() { void colvardeps::provide(int feature_id, bool truefalse) { feature_states[feature_id].available = truefalse; + // Make sure that we don't leave this feature enabled + if (!truefalse) disable(feature_id); } @@ -123,8 +125,9 @@ bool colvardeps::get_keyval_feature(colvarparse *cvp, int colvardeps::enable(int feature_id, - bool dry_run /* default: false */, - bool toplevel /* default: true */) + bool dry_run /* default: false */, + bool toplevel /* default: true */, + bool error /*default: false */) { int res; size_t i, j; @@ -137,9 +140,12 @@ int colvardeps::enable(int feature_id, feature *f = features()[feature_id]; feature_state *fs = &feature_states[feature_id]; + // dry_run can be true because parent object is not active, yet we are displaying an error message + // then error is set to true + if (cvm::debug()) { cvm::log("DEPS: " + description + - (dry_run ? " testing " : " enabling ") + + (dry_run ? " testing " : " enabling ") + (error ? " [error] " : "") + "\"" + f->description +"\"\n"); } @@ -159,7 +165,7 @@ int colvardeps::enable(int feature_id, (is_dynamic(feature_id) ? "Dynamic" : "User-controlled"); if (!fs->available) { - if (!dry_run) { + if (!dry_run || error) { if (toplevel) { cvm::error("Error: " + feature_type_descr + " feature unavailable: \"" + f->description + "\" in " + description + ".\n"); @@ -172,7 +178,7 @@ int colvardeps::enable(int feature_id, } if (!toplevel && !is_dynamic(feature_id)) { - if (!dry_run) { + if (!dry_run || error) { cvm::log(feature_type_descr + " feature \"" + f->description + "\" cannot be enabled automatically in " + description + ".\n"); if (is_user(feature_id)) { @@ -189,7 +195,7 @@ int colvardeps::enable(int feature_id, if (cvm::debug()) cvm::log(f->description + " requires exclude " + g->description + "\n"); if (is_enabled(f->requires_exclude[i])) { - if (!dry_run) { + if (!dry_run || error) { cvm::log("Feature \"" + f->description + "\" is incompatible with \"" + g->description + "\" in " + description + ".\n"); if (toplevel) { @@ -204,10 +210,14 @@ int colvardeps::enable(int feature_id, for (i=0; irequires_self.size(); i++) { if (cvm::debug()) cvm::log(f->description + " requires self " + features()[f->requires_self[i]]->description + "\n"); - res = enable(f->requires_self[i], dry_run, false); + res = enable(f->requires_self[i], dry_run, false, error); if (res != COLVARS_OK) { - if (!dry_run) { - cvm::log("...required by \"" + f->description + "\" in " + description + "\n"); + if (!dry_run || error) { + if (toplevel) { + cvm::log("Cannot enable \"" + f->description + "\" in " + description + "\n"); + } else { + cvm::log("...required by \"" + f->description + "\" in " + description + "\n"); + } if (toplevel) { cvm::error("Error: Failed dependency in " + description + ".\n"); } @@ -225,11 +235,11 @@ int colvardeps::enable(int feature_id, int g = f->requires_alt[i][j]; if (cvm::debug()) cvm::log(f->description + " requires alt " + features()[g]->description + "\n"); - res = enable(g, true, false); // see if available + res = enable(g, true, false, error); // see if available if (res == COLVARS_OK) { ok = true; - if (!dry_run) { - enable(g, false, false); // Require again, for real + if (!dry_run || error) { + enable(g, false, false, error); // Require again, for real fs->alternate_refs.push_back(g); // We remember we enabled this // so we can free it if this feature gets disabled } @@ -245,7 +255,7 @@ int colvardeps::enable(int feature_id, for (j=0; jrequires_alt[i].size(); j++) { int g = f->requires_alt[i][j]; cvm::log(cvm::to_str(j+1) + ". " + features()[g]->description + "\n"); - enable(g, false, false); // Just for printing error output + enable(g, false, false, true); // Just for printing error output } cvm::decrease_depth(); cvm::log("-----------------------------------------\n"); @@ -264,10 +274,14 @@ int colvardeps::enable(int feature_id, for (i=0; irequires_children.size(); i++) { int g = f->requires_children[i]; for (j=0; jenable(g, dry_run || !is_enabled(), false); + res = children[j]->enable(g, dry_run || !is_enabled(), false, error); if (res != COLVARS_OK) { - if (!dry_run) { - cvm::log("...required by \"" + f->description + "\" in " + description + "\n"); + if (!dry_run || error) { + if (toplevel) { + cvm::log("Cannot enable \"" + f->description + "\" in " + description + "\n"); + } else { + cvm::log("...required by \"" + f->description + "\" in " + description + "\n"); + } if (toplevel) { cvm::error("Error: Failed dependency in " + description + ".\n"); } diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index 1bd304b545..92e7a88326 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -198,7 +198,9 @@ public: /// \param toplevel False if this is called as part of a chain of dependency resolution. /// This is used to diagnose failed dependencies by displaying the full stack: /// only the toplevel dependency will throw a fatal error. - int enable(int f, bool dry_run = false, bool toplevel = true); + /// \param error Recursively enable, printing error messages along the way + /// Necessary when propagating errors across alternate dependencies + int enable(int f, bool dry_run = false, bool toplevel = true, bool error = false); /// Disable a feature, decrease the reference count of its dependencies /// and recursively disable them as applicable @@ -255,6 +257,8 @@ public: f_cvb_scale_biasing_force, /// \brief whether this bias is applied to one or more ext-Lagrangian colvars f_cvb_extended, + /// Process this bias's data in parallel over multiple CPU threads + f_cvb_smp, f_cvb_ntot }; @@ -263,8 +267,11 @@ public: f_cv_active, /// \brief Colvar is awake (active on its own accord) this timestep f_cv_awake, - /// \brief Gradients are calculated and temporarily stored, so - /// that external forces can be applied + /// \brief External force can be applied, either to atoms or to an + /// extended DOF + f_cv_apply_force, + /// \brief Gradients are calculated and temporarily stored, + /// so that external forces can be propagated to atoms f_cv_gradient, /// \brief Collect atomic gradient data from all cvcs into vector /// atomic_gradient @@ -277,7 +284,10 @@ public: /// forces on the inverse gradient f_cv_total_force, /// \brief Calculate total force from atomic forces + /// or get it from the back-end for an external parameter f_cv_total_force_calc, + /// \brief Total force is that of current time step + f_cv_total_force_current_step, /// \brief Subtract the applied force from the total force f_cv_subtract_applied_force, /// \brief Estimate Jacobian derivative @@ -289,8 +299,10 @@ public: /// center with fictitious mass; bias forces will be applied to /// the center f_cv_extended_Lagrangian, - /// \brief An extended variable that sets an external variable in the - /// back-end (eg. an alchemical coupling parameter for lambda-dynamics) + /// \brief A variable that constrains or follows an external parameter + /// in the back-end (eg. an alchemical coupling parameter for lambda-dynamics) + /// If extended Lagrangian, then we drive the external parameter + /// Otherwise we follow it /// Can have a single component f_cv_external, /// \brief The extended system coordinate undergoes Langevin dynamics diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index 11693a7587..ad42966943 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -24,15 +24,14 @@ colvar_grid_count::colvar_grid_count() mult = 1; } -colvar_grid_count::colvar_grid_count(std::vector const &nx_i, - size_t const &def_count) - : colvar_grid(nx_i, def_count, 1) +colvar_grid_count::colvar_grid_count(std::vector &colvars, + std::string config) + : colvar_grid(colvars, 0, 1, false, nullptr, config) {} colvar_grid_count::colvar_grid_count(std::vector &colvars, - size_t const &def_count, - bool margin) - : colvar_grid(colvars, def_count, 1, margin) + std::shared_ptr params) + : colvar_grid(colvars, 0, 1, false, params) {} std::string colvar_grid_count::get_state_params() const @@ -132,13 +131,17 @@ colvar_grid_scalar::colvar_grid_scalar(colvar_grid_scalar const &g) { } -colvar_grid_scalar::colvar_grid_scalar(std::vector const &nx_i) - : colvar_grid(nx_i, 0.0, 1), samples(NULL) +colvar_grid_scalar::colvar_grid_scalar(std::vector &colvars, + std::shared_ptr params, + bool add_extra_bin, + std::string config) + : colvar_grid(colvars, 0.0, 1, add_extra_bin, params, config), samples(NULL) { } -colvar_grid_scalar::colvar_grid_scalar(std::vector &colvars, bool margin) - : colvar_grid(colvars, 0.0, 1, margin), samples(NULL) +colvar_grid_scalar::colvar_grid_scalar(std::string const &filename) + : colvar_grid(filename, 1), + samples(nullptr) { } @@ -330,89 +333,37 @@ cvm::real colvar_grid_scalar::grid_rmsd(colvar_grid_scalar const &other_grid) co colvar_grid_gradient::colvar_grid_gradient() - : colvar_grid(), samples(NULL), full_samples(0), min_samples(0) + : colvar_grid(), samples(NULL) {} -colvar_grid_gradient::colvar_grid_gradient(std::vector const &nx_i) - : colvar_grid(nx_i, 0.0, nx_i.size()), samples(NULL), full_samples(0), min_samples(0) -{} +// colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars, std::string config) +// : colvar_grid(colvars, 0.0, colvars.size(), false, nullptr, config), samples(NULL) +// {} +// colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars, +// std::shared_ptr samples_in) +// : colvar_grid(colvars, 0.0, colvars.size(), false, samples_in), samples(samples_in) +// { +// if (samples_in) +// samples_in->has_parent_data = true; +// } -colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars) - : colvar_grid(colvars, 0.0, colvars.size()), samples(NULL), full_samples(0), min_samples(0) -{} - - -colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars, std::shared_ptr samples_in) - : colvar_grid(colvars, 0.0, colvars.size()), samples(samples_in), full_samples(0), min_samples(0) +colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars, + std::shared_ptr samples_in, + std::shared_ptr params, + std::string config) + : colvar_grid(colvars, 0.0, colvars.size(), false, params, config), samples(samples_in) { - samples_in->has_parent_data = true; + if (samples_in) + samples_in->has_parent_data = true; } -colvar_grid_gradient::colvar_grid_gradient(std::string &filename) - : colvar_grid(), - samples(NULL) +colvar_grid_gradient::colvar_grid_gradient(std::string const &filename) + : colvar_grid(filename, 0), + samples(nullptr) { - std::istream &is = cvm::main()->proxy->input_stream(filename, - "gradient file"); - if (!is) { - return; - } - - // Data in the header: nColvars, then for each - // xiMin, dXi, nPoints, periodic flag - - std::string hash; - size_t i; - - if ( !(is >> hash) || (hash != "#") ) { - cvm::error("Error reading grid at position "+ - cvm::to_str(static_cast(is.tellg()))+ - " in stream(read \"" + hash + "\")\n"); - return; - } - - is >> nd; - - if (nd > 50) { - cvm::error("Error: excessive number of dimensions in file \""+ - filename+"\". Please ensure that the file is not corrupt.\n", - COLVARS_INPUT_ERROR); - return; - } - - mult = nd; - std::vector lower_in(nd), widths_in(nd); - std::vector nx_in(nd); - std::vector periodic_in(nd); - - for (i = 0; i < nd; i++ ) { - if ( !(is >> hash) || (hash != "#") ) { - cvm::error("Error reading grid at position "+ - cvm::to_str(static_cast(is.tellg()))+ - " in stream(read \"" + hash + "\")\n"); - return; - } - - is >> lower_in[i] >> widths_in[i] >> nx_in[i] >> periodic_in[i]; - } - - this->setup(nx_in, 0., mult); - - widths = widths_in; - - for (i = 0; i < nd; i++ ) { - lower_boundaries.push_back(colvarvalue(lower_in[i])); - periodic.push_back(static_cast(periodic_in[i])); - } - - // Reset the istream for read_multicol, which expects the whole file - is.clear(); - is.seekg(0); - read_multicol(is); - cvm::main()->proxy->close_input_stream(filename); } std::string colvar_grid_gradient::get_state_params() const @@ -586,12 +537,13 @@ cvm::real colvar_grid_gradient::grid_rmsd(colvar_grid_gradient const &other_grid } -integrate_potential::integrate_potential(std::vector &colvars, std::shared_ptr gradients) - : colvar_grid_scalar(colvars, true), +integrate_potential::integrate_potential(std::vector &colvars, + std::shared_ptr gradients) + : colvar_grid_scalar(colvars, gradients, true), b_smoothed(false), gradients(gradients) { - // parent class colvar_grid_scalar is constructed with margin option set to true + // parent class colvar_grid_scalar is constructed with add_extra_bin option set to true // hence PMF grid is wider than gradient grid if non-PBC if (nd > 1) { diff --git a/lib/colvars/colvargrid.h b/lib/colvars/colvargrid.h index 4cbbb10961..697b46a560 100644 --- a/lib/colvars/colvargrid.h +++ b/lib/colvars/colvargrid.h @@ -19,17 +19,13 @@ #include "colvarparse.h" -/// \brief Grid of values of a function of several collective -/// variables \param T The data type -/// -/// Only scalar colvars supported so far: vector colvars are treated as arrays -template class colvar_grid : public colvarparse { - - //protected: -public: // TODO create accessors for these after all instantiations work +/// \brief Unified base class for grid of values of a function of several collective +/// variables +class colvar_grid_params { +public: /// Number of dimensions - size_t nd; + size_t nd = 0; /// Number of points along each dimension std::vector nx; @@ -37,6 +33,27 @@ public: // TODO create accessors for these after all instantiations work /// Cumulative number of points along each dimension std::vector nxc; + /// Lower boundaries of the colvars in this grid + std::vector lower_boundaries; + + /// Upper boundaries of the colvars in this grid + std::vector upper_boundaries; + + /// Widths of the colvars in this grid + std::vector widths; +}; + + +/// \brief Grid of values of a function of several collective +/// variables \param T The data type +/// +/// Only scalar colvars supported so far: vector colvars are treated as arrays +/// All common, type-independent members are collected in the base class colvar_grid_base +template class colvar_grid : public colvar_grid_params, public colvarparse { + + //protected: +public: // TODO create accessors for these after all instantiations work + /// \brief Multiplicity of each datum (allow the binning of /// non-scalar types such as atomic gradients) size_t mult; @@ -73,13 +90,6 @@ public: // TODO create accessors for these after all instantiations work } public: - - /// Lower boundaries of the colvars in this grid - std::vector lower_boundaries; - - /// Upper boundaries of the colvars in this grid - std::vector upper_boundaries; - /// Whether some colvars are periodic std::vector periodic; @@ -89,9 +99,6 @@ public: /// Whether some colvars have hard upper boundaries std::vector hard_upper_boundaries; - /// Widths of the colvars in this grid - std::vector widths; - /// True if this is a count grid related to another grid of data bool has_parent_data; @@ -218,19 +225,15 @@ public: /// \brief "Almost copy-constructor": only copies configuration /// parameters from another grid, but doesn't reallocate stuff; /// setup() must be called after that; - colvar_grid(colvar_grid const &g) : colvarparse(), - nd(g.nd), - nx(g.nx), + colvar_grid(colvar_grid const &g) : colvar_grid_params(colvar_grid_params(g)), + colvarparse(), mult(g.mult), data(), cv(g.cv), use_actual_value(g.use_actual_value), - lower_boundaries(g.lower_boundaries), - upper_boundaries(g.upper_boundaries), periodic(g.periodic), hard_lower_boundaries(g.hard_lower_boundaries), hard_upper_boundaries(g.hard_upper_boundaries), - widths(g.widths), has_parent_data(false), has_data(false) {} @@ -247,22 +250,31 @@ public: this->setup(nx_i, t, mult_i); } - /// \brief Constructor from a vector of colvars + /// \brief Constructor from a vector of colvars or an optional grid config string /// \param add_extra_bin requests that non-periodic dimensions are extended /// by 1 bin to accommodate the integral (PMF) of another gridded quantity (gradient) colvar_grid(std::vector const &colvars, T const &t = T(), size_t mult_i = 1, - bool add_extra_bin = false) + bool add_extra_bin = false, + std::shared_ptr params = nullptr, + std::string config = std::string()) : has_parent_data(false), has_data(false) { (void) t; - this->init_from_colvars(colvars, mult_i, add_extra_bin); + this->init_from_colvars(colvars, mult_i, add_extra_bin, params, config); } + /// \brief Constructor from a multicol file + /// \param filename multicol file containing data to be read + /// \param multi_i multiplicity of the data - if 0, assume gradient multiplicity (mult = nd) + colvar_grid(std::string const &filename, size_t mult_i = 1); + int init_from_colvars(std::vector const &colvars, size_t mult_i = 1, - bool add_extra_bin = false) + bool add_extra_bin = false, + std::shared_ptr params = nullptr, + std::string config = std::string()) { if (cvm::debug()) { cvm::log("Reading grid configuration from collective variables.\n"); @@ -279,8 +291,7 @@ public: " collective variables, multiplicity = "+cvm::to_str(mult_i)+".\n"); } - for (i = 0; i < cv.size(); i++) { - + for (i = 0; i < nd; i++) { if (cv[i]->value().type() != colvarvalue::type_scalar) { cvm::error("Colvar grids can only be automatically " "constructed for scalar variables. " @@ -298,7 +309,6 @@ public: widths.push_back(cv[i]->width); hard_lower_boundaries.push_back(cv[i]->is_enabled(colvardeps::f_cv_hard_lower_boundary)); hard_upper_boundaries.push_back(cv[i]->is_enabled(colvardeps::f_cv_hard_upper_boundary)); - periodic.push_back(cv[i]->periodic_boundaries()); // By default, get reported colvar value (for extended Lagrangian colvars) use_actual_value.push_back(false); @@ -310,22 +320,55 @@ public: use_actual_value[i-1] = true; } + // This needs to work if the boundaries are undefined in the colvars + lower_boundaries.push_back(cv[i]->lower_boundary); + upper_boundaries.push_back(cv[i]->upper_boundary); + } + + // Replace widths and boundaries with optional custom configuration + if (!config.empty()) { + this->parse_params(config); + this->check_keywords(config, "grid"); + + if (params) { + cvm::error("Error: init_from_colvars was passed both a grid config and a template grid.", COLVARS_BUG_ERROR); + return COLVARS_BUG_ERROR; + } + } else if (params) { + // Match grid sizes with template + + if (params->nd != nd) { + cvm::error("Trying to initialize grid from template with wrong dimension (" + + cvm::to_str(params->nd) + " instead of " + + cvm::to_str(this->nd) + ")."); + return COLVARS_ERROR; + } + + widths =params->widths; + lower_boundaries =params->lower_boundaries; + upper_boundaries =params->upper_boundaries; + } + + // Only now can we determine periodicity + for (i = 0; i < nd; i++) { + periodic.push_back(cv[i]->periodic_boundaries(lower_boundaries[i].real_value, + upper_boundaries[i].real_value)); + if (add_extra_bin) { + // Shift the grid by half the bin width (values at edges instead of center of bins) + lower_boundaries[i] -= 0.5 * widths[i]; + if (periodic[i]) { - // Shift the grid by half the bin width (values at edges instead of center of bins) - lower_boundaries.push_back(cv[i]->lower_boundary.real_value - 0.5 * widths[i]); - upper_boundaries.push_back(cv[i]->upper_boundary.real_value - 0.5 * widths[i]); + // Just shift + upper_boundaries[i] -= 0.5 * widths[i]; } else { - // Make this grid larger by one bin width - lower_boundaries.push_back(cv[i]->lower_boundary.real_value - 0.5 * widths[i]); - upper_boundaries.push_back(cv[i]->upper_boundary.real_value + 0.5 * widths[i]); + // Widen grid by one bin width + upper_boundaries[i] += 0.5 * widths[i]; } - } else { - lower_boundaries.push_back(cv[i]->lower_boundary); - upper_boundaries.push_back(cv[i]->upper_boundary); } } + // Reset grid sizes based on widths and boundaries this->init_from_boundaries(); return this->setup(); } @@ -966,14 +1009,12 @@ public: virtual ~colvar_grid_count() {} - /// Constructor - colvar_grid_count(std::vector const &nx_i, - size_t const &def_count = 0); - - /// Constructor from a vector of colvars + /// Constructor from a vector of colvars or a config string colvar_grid_count(std::vector &colvars, - size_t const &def_count = 0, - bool add_extra_bin = false); + std::shared_ptr params = nullptr); + + colvar_grid_count(std::vector &colvars, + std::string config); /// Increment the counter at given position inline void incr_count(std::vector const &ix) @@ -1255,12 +1296,14 @@ public: /// Destructor virtual ~colvar_grid_scalar(); - /// Constructor from specific sizes arrays - colvar_grid_scalar(std::vector const &nx_i); - /// Constructor from a vector of colvars colvar_grid_scalar(std::vector &colvars, - bool add_extra_bin = false); + std::shared_ptr params = nullptr, + bool add_extra_bin = false, + std::string config = std::string()); + + /// Constructor from a multicol file + colvar_grid_scalar(std::string const &filename); /// Accumulate the value inline void acc_value(std::vector const &ix, @@ -1334,8 +1377,8 @@ public: /// \brief Return the gradient of the scalar field from finite differences /// Input coordinates are those of gradient grid, shifted wrt scalar grid - /// Should not be called on edges of scalar grid, provided the latter has margins - /// wrt gradient grid + /// Should not be called on edges of scalar grid, provided the latter has + /// margins (extra bins) wrt gradient grid inline void vector_gradient_finite_diff( const std::vector &ix0, std::vector &grad) { cvm::real A0, A1; @@ -1566,17 +1609,21 @@ public: virtual ~colvar_grid_gradient() {} - /// Constructor from specific sizes arrays - colvar_grid_gradient(std::vector const &nx_i); + // /// Constructor from specific sizes arrays + // colvar_grid_gradient(std::vector const &nx_i); - /// Constructor from a vector of colvars - colvar_grid_gradient(std::vector &colvars); + // /// Constructor from a vector of colvars + // colvar_grid_gradient(std::vector &colvars, + // std::string config = std::string()); /// Constructor from a multicol file - colvar_grid_gradient(std::string &filename); + colvar_grid_gradient(std::string const &filename); /// Constructor from a vector of colvars and a pointer to the count grid - colvar_grid_gradient(std::vector &colvars, std::shared_ptr samples_in); + colvar_grid_gradient(std::vector &colvars, + std::shared_ptr samples_in = nullptr, + std::shared_ptr params = nullptr, + std::string config = std::string()); /// Parameters for smoothing data with low sampling int full_samples; @@ -1829,7 +1876,8 @@ class integrate_potential : public colvar_grid_scalar {} /// Constructor from a vector of colvars + gradient grid - integrate_potential(std::vector &colvars, std::shared_ptr gradients); + integrate_potential(std::vector &colvars, + std::shared_ptr gradients); /// Constructor from a gradient grid (for processing grid files without a Colvars config) integrate_potential(std::shared_ptr gradients); diff --git a/lib/colvars/colvargrid_def.h b/lib/colvars/colvargrid_def.h index fa6531271b..96075e1ffe 100644 --- a/lib/colvars/colvargrid_def.h +++ b/lib/colvars/colvargrid_def.h @@ -22,6 +22,62 @@ #include "colvars_memstream.h" +template +colvar_grid::colvar_grid(std::string const &filename, size_t mult_i) +{ +std::istream &is = cvm::main()->proxy->input_stream(filename, "multicol grid file"); +if (!is) { + return; +} + +// Data in the header: nColvars, then for each +// xiMin, dXi, nPoints, periodic flag + +std::string hash; +size_t i; + +if ( !(is >> hash) || (hash != "#") ) { + cvm::error("Error reading grid at position "+ + cvm::to_str(static_cast(is.tellg()))+ + " in stream(read \"" + hash + "\")\n"); + return; +} + +is >> nd; +mult = (mult_i == 0) ? nd : mult_i; + +std::vector lower_in(nd), widths_in(nd); +std::vector nx_in(nd); +std::vector periodic_in(nd); + +for (i = 0; i < nd; i++ ) { + if ( !(is >> hash) || (hash != "#") ) { + cvm::error("Error reading grid at position "+ + cvm::to_str(static_cast(is.tellg()))+ + " in stream(read \"" + hash + "\")\n"); + return; + } + + is >> lower_in[i] >> widths_in[i] >> nx_in[i] >> periodic_in[i]; +} + +this->setup(nx_in, 0., mult); + +widths = widths_in; + +for (i = 0; i < nd; i++ ) { + lower_boundaries.push_back(colvarvalue(lower_in[i])); + periodic.push_back(static_cast(periodic_in[i])); +} + +// Reset the istream for read_multicol, which expects the whole file +is.clear(); +is.seekg(0); +read_multicol(is); +cvm::main()->proxy->close_input_stream(filename); +} + + template IST &read_restart_template_(colvar_grid &g, IST &is) { auto const start_pos = is.tellg(); @@ -203,14 +259,16 @@ template int colvar_grid::parse_params(std::string const &conf, lower_boundaries, lower_boundaries, colvarparse::parse_silent); colvarparse::get_keyval(conf, "upper_boundaries", upper_boundaries, upper_boundaries, colvarparse::parse_silent); + // plural form is used in state file + colvarparse::get_keyval(conf, "widths", widths, widths, colvarparse::parse_silent); // camel case keywords are used in config file - colvarparse::get_keyval(conf, "lowerBoundaries", + colvarparse::get_keyval(conf, "lowerBoundary", lower_boundaries, lower_boundaries, parse_mode); - colvarparse::get_keyval(conf, "upperBoundaries", + colvarparse::get_keyval(conf, "upperBoundary", upper_boundaries, upper_boundaries, parse_mode); - colvarparse::get_keyval(conf, "widths", widths, widths, parse_mode); + colvarparse::get_keyval(conf, "width", widths, widths, parse_mode); // only used in state file colvarparse::get_keyval(conf, "sizes", nx, nx, colvarparse::parse_silent); diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 25b1efe209..34485d7883 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -24,6 +24,7 @@ #include "colvarbias_histogram_reweight_amd.h" #include "colvarbias_meta.h" #include "colvarbias_restraint.h" +#include "colvarbias_opes.h" #include "colvarscript.h" #include "colvaratoms.h" #include "colvarcomp.h" @@ -109,23 +110,23 @@ colvarmodule::colvarmodule(colvarproxy *proxy_in) " https://doi.org/10.1080/00268976.2013.813594\n" "as well as all other papers listed below for individual features used.\n"); -#if (__cplusplus >= 201103L) - cvm::log("This version was built with the C++11 standard or higher.\n"); -#else - cvm::log("This version was built without the C++11 standard: some features are disabled.\n" - "Please see the following link for details:\n" - " https://colvars.github.io/README-c++11.html\n"); -#endif - cvm::log("Summary of compile-time features available in this build:\n"); - if (proxy->check_smp_enabled() == COLVARS_NOT_IMPLEMENTED) { - cvm::log(" - SMP parallelism: not available\n"); + std::string cxx_lang_msg(" - C++ language version: " + cvm::to_str(__cplusplus)); +#if defined(_WIN32) && !defined(__CYGWIN__) + cxx_lang_msg += std::string(" (warning: may not be accurate for this build)"); +#endif + cxx_lang_msg += std::string("\n"); + cvm::log(cxx_lang_msg); + + if (proxy->check_replicas_enabled() == COLVARS_NOT_IMPLEMENTED) { + cvm::log(" - Multiple replicas: not available\n"); } else { - if (proxy->check_smp_enabled() == COLVARS_OK) { - cvm::log(" - SMP parallelism: enabled (num. threads = " + to_str(proxy->smp_num_threads()) + ")\n"); + if (proxy->check_replicas_enabled() == COLVARS_OK) { + cvm::log(" - Multiple replicas: enabled (replica number " + + to_str(proxy->replica_index() + 1) + " of " + to_str(proxy->num_replicas()) + ")\n"); } else { - cvm::log(" - SMP parallelism: available, but not enabled\n"); + cvm::log(" - Multiple replicas: available, but not (yet) enabled\n"); } } @@ -201,6 +202,20 @@ std::vector *colvarmodule::variables_active_smp_items() } +int colvarmodule::calc_component_smp(int i) +{ + colvar *x = (*(variables_active_smp()))[i]; + int x_item = (*(variables_active_smp_items()))[i]; + if (cvm::debug()) { + cvm::log("Thread "+cvm::to_str(proxy->smp_thread_id())+"/"+ + cvm::to_str(proxy->smp_num_threads())+ + ": calc_component_smp(), i = "+cvm::to_str(i)+", cv = "+ + x->name+", cvc = "+cvm::to_str(x_item)+"\n"); + } + return x->calc_cvcs(x_item, 1); +} + + std::vector *colvarmodule::biases_active() { return &(biases_active_); @@ -387,8 +402,26 @@ int colvarmodule::parse_global_params(std::string const &conf) } } - if (parse->get_keyval(conf, "smp", proxy->b_smp_active, proxy->b_smp_active)) { - if (proxy->b_smp_active == false) { + std::string smp; + if (parse->get_keyval(conf, "smp", smp, "cvcs")) { + if (smp == "cvcs" || smp == "on" || smp == "yes") { + if (proxy->set_smp_mode(colvarproxy_smp::smp_mode_t::cvcs) != COLVARS_OK) { + cvm::error("Colvars component-based parallelism is not implemented.\n"); + return COLVARS_INPUT_ERROR; + } else { + cvm::log("SMP parallelism will be applied to Colvars components.\n"); + cvm::log(" - SMP parallelism: enabled (num. threads = " + to_str(proxy->smp_num_threads()) + ")\n"); + } + } else if (smp == "inner_loop") { + if (proxy->set_smp_mode(colvarproxy_smp::smp_mode_t::inner_loop) != COLVARS_OK) { + cvm::error("SMP parallelism inside the calculation of Colvars components is not implemented.\n"); + return COLVARS_INPUT_ERROR; + } else { + cvm::log("SMP parallelism will be applied inside the Colvars components.\n"); + cvm::log(" - SMP parallelism: enabled (num. threads = " + to_str(proxy->smp_num_threads()) + ")\n"); + } + } else { + proxy->set_smp_mode(colvarproxy_smp::smp_mode_t::none); cvm::log("SMP parallelism has been disabled.\n"); } } @@ -589,6 +622,9 @@ int colvarmodule::parse_biases(std::string const &conf) /// initialize reweightaMD instances parse_biases_type(conf, "reweightaMD"); + /// initialize OPES instances + parse_biases_type(conf, "opes_metad"); + if (use_scripted_forces) { cvm::log(cvm::line_marker); cvm::increase_depth(); @@ -922,7 +958,7 @@ int colvarmodule::calc_colvars() } // if SMP support is available, split up the work - if (proxy->check_smp_enabled() == COLVARS_OK) { + if (proxy->get_smp_mode() == colvarproxy_smp::smp_mode_t::cvcs) { // first, calculate how much work (currently, how many active CVCs) each colvar has @@ -948,8 +984,10 @@ int colvarmodule::calc_colvars() } cvm::decrease_depth(); - // calculate colvar components in parallel - error_code |= proxy->smp_colvars_loop(); + // calculate active colvar components in parallel + error_code |= proxy->smp_loop(variables_active_smp()->size(), [](int i) { + return cvm::main()->calc_component_smp(i); + }); cvm::increase_depth(); for (cvi = variables_active()->begin(); cvi != variables_active()->end(); cvi++) { @@ -1013,7 +1051,7 @@ int colvarmodule::calc_biases() } // If SMP support is available, split up the work (unless biases need to use main thread's memory) - if (proxy->check_smp_enabled() == COLVARS_OK && !biases_need_main_thread) { + if (proxy->get_smp_mode() == colvarproxy::smp_mode_t::cvcs && !biases_need_main_thread) { if (use_scripted_forces && !scripting_after_biases) { // calculate biases and scripted forces in parallel @@ -1097,7 +1135,7 @@ int colvarmodule::update_colvar_forces() cvm::log("Communicating forces from the colvars to the atoms.\n"); cvm::increase_depth(); for (cvi = variables_active()->begin(); cvi != variables_active()->end(); cvi++) { - if ((*cvi)->is_enabled(colvardeps::f_cv_gradient)) { + if ((*cvi)->is_enabled(colvardeps::f_cv_apply_force)) { (*cvi)->communicate_forces(); if (cvm::get_error()) { return COLVARS_ERROR; @@ -1986,7 +2024,7 @@ size_t & colvarmodule::depth() { // NOTE: do not call log() or error() here, to avoid recursion colvarmodule *cv = cvm::main(); - if (proxy->check_smp_enabled() == COLVARS_OK) { + if (proxy->get_smp_mode() == colvarproxy::smp_mode_t::cvcs) { int const nt = proxy->smp_num_threads(); if (int(cv->depth_v.size()) != nt) { proxy->smp_lock(); diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index fa84b1ad75..5f042767dc 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -18,6 +18,11 @@ #define COLVARS_DEBUG false #endif +#if defined(__FAST_MATH__) +// NOTE: This is used for fixing https://github.com/Colvars/colvars/issues/767 +#define COLVARS_BOUNDED_INV_TRIGONOMETRIC_FUNC +#endif + /*! \mainpage Main page This is the Developer's documentation for the Collective Variables module (Colvars). @@ -147,17 +152,44 @@ public: return ::cos(static_cast(x)); } - /// Reimplemented to work around MS compiler issues - static inline real asin(real const &x) - { - return ::asin(static_cast(x)); - } +#ifndef PI +#define PI 3.14159265358979323846 +#endif +#ifndef PI_2 +#define PI_2 1.57079632679489661923 +#endif - /// Reimplemented to work around MS compiler issues - static inline real acos(real const &x) - { +/// Reimplemented to work around compiler issues; return hard-coded values for boundary conditions +static inline real asin(real const &x) +{ +#ifdef COLVARS_BOUNDED_INV_TRIGONOMETRIC_FUNC + if (x <= -1.0) { + return -PI_2; + } else if (x >= 1.0) { + return PI_2; + } else { + return ::asin(static_cast(x)); + } +#else + return ::asin(static_cast(x)); +#endif +} + +/// Reimplemented to work around compiler issues; return hard-coded values for boundary conditions +static inline real acos(real const &x) +{ +#ifdef COLVARS_BOUNDED_INV_TRIGONOMETRIC_FUNC + if (x <= -1.0) { + return PI; + } else if (x >= 1.0) { + return 0.0; + } else { + return ::acos(static_cast(x)); + } +#else return ::acos(static_cast(x)); - } +#endif +} /// Reimplemented to work around MS compiler issues static inline real atan2(real const &x, real const &y) @@ -307,6 +339,9 @@ public: /// Indexes of the items to calculate for each colvar std::vector *variables_active_smp_items(); + /// Calculate the value of the specified component (to be called in a SMP loop) + int calc_component_smp(int i); + /// Array of collective variable biases std::vector biases; diff --git a/lib/colvars/colvarmodule_refs.h b/lib/colvars/colvarmodule_refs.h index 2e9615e3b4..0317567502 100644 --- a/lib/colvars/colvarmodule_refs.h +++ b/lib/colvars/colvarmodule_refs.h @@ -129,6 +129,23 @@ " url = {https://doi.org/10.1002/jcc.26075}\n" "}\n"; + paper_count_[std::string("Fiorin2024")] = 0; + paper_url_[std::string("Fiorin2024")] = "https://doi.org/10.1021/acs.jpcb.4c05604"; + paper_bibtex_[std::string("Fiorin2024")] = + "\n" + "@article{Fiorin2024,\n" + " author = {Fiorin, Giacomo and Marinelli, Fabrizio and Forrest, Lucy R. and Chen, Haochuan and Chipot, Christophe and Kohlmeyer, Axel and Santuz, Hubert and H{\\'e}nin, J{\\'e}rôme},\n" + " title = {Expanded Functionality and Portability for the Colvars Library},\n" + " journal = {J. Phys. Chem. {B}},\n" + " volume = {128},\n" + " number = {45},\n" + " pages = {11108--11123},\n" + " year = {2024},\n" + " doi = {10.1021/acs.jpcb.4c05604},\n" + " pmid = 39501453,\n" + " url = { https://doi.org/10.1021/acs.jpcb.4c05604}\n" + "}\n"; + paper_count_[std::string("Fu2016")] = 0; paper_url_[std::string("Fu2016")] = "https://doi.org/10.1021/acs.jctc.6b00447"; paper_bibtex_[std::string("Fu2016")] = @@ -227,6 +244,20 @@ " url = {https://doi.org/10.1016/0263-7855(96)00018-5}\n" "}\n"; + paper_count_[std::string("Lagardere2023")] = 0; + paper_url_[std::string("Lagardere2023")] = "https://arxiv.org/abs/2307.08006"; + paper_bibtex_[std::string("Lagardere2023")] = + "\n" + "@misc{Lagardere2023,\n" + " title={Lambda-ABF: Simplified, Accurate and Cost-effective Alchemical Free Energy Computations},\n" + " author={Louis Lagard\\`ere and Lise Maurin and Olivier Adjoua and Krystel El Hage and Pierre Monmarch\\'e and Jean-Philip Piquemal and J\\'er\\^ome H\\'enin},\n" + " year={2023},\n" + " eprint={2307.08006},\n" + " archivePrefix={arXiv},\n" + " primaryClass={physics.chem-ph},\n" + " url = {https://arxiv.org/abs/2307.08006}\n" + "}\n"; + paper_count_[std::string("Lesage2017")] = 0; paper_url_[std::string("Lesage2017")] = "https://doi.org/10.1021/acs.jpcb.6b10055"; paper_bibtex_[std::string("Lesage2017")] = @@ -344,6 +375,45 @@ " url = {https://doi.org/10.1021/ct500320c}\n" "}\n"; + paper_count_[std::string("Invernizzi2020")] = 0; + paper_url_[std::string("Invernizzi2020")] = "https://pubs.acs.org/doi/10.1021/acs.jpclett.0c00497"; + paper_bibtex_[std::string("Invernizzi2020")] = + "\n" + "@article{Invernizzi2020,\n" + " title = {Rethinking {Metadynamics}: {From} {Bias} {Potentials} to {Probability} {Distributions}},\n" + " volume = {11},\n" + " issn = {1948-7185, 1948-7185},\n" + " shorttitle = {Rethinking {Metadynamics}},\n" + " url = {https://pubs.acs.org/doi/10.1021/acs.jpclett.0c00497},\n" + " doi = {10.1021/acs.jpclett.0c00497},\n" + " number = {7},\n" + " urldate = {2020-09-30},\n" + " journal = {J. Phys. Chem. Lett.},\n" + " author = {Invernizzi, Michele and Parrinello, Michele},\n" + " month = apr,\n" + " year = {2020},\n" + " pages = {2731--2736},\n" + "}\n"; + + paper_count_[std::string("Invernizzi2022")] = 0; + paper_url_[std::string("Invernizzi2022")] = "https://doi.org/10.1021/acs.jctc.2c00152"; + paper_bibtex_[std::string("Invernizzi2022")] = + "\n" + "@article{Invernizzi2022,\n" + " title = {Exploration vs {Convergence} {Speed} in {Adaptive}-{Bias} {Enhanced} {Sampling}},\n" + " volume = {18},\n" + " issn = {1549-9618},\n" + " url = {https://doi.org/10.1021/acs.jctc.2c00152},\n" + " doi = {10.1021/acs.jctc.2c00152},\n" + " number = {6},\n" + " urldate = {2024-07-02},\n" + " journal = {J. Chem. Theory Comput.},\n" + " author = {Invernizzi, Michele and Parrinello, Michele},\n" + " month = jun,\n" + " year = {2022},\n" + " pages = {3988--3996},\n" + "}\n"; + paper_count_[std::string("n/a")] = 0; paper_url_[std::string("n/a")] = ""; paper_bibtex_[std::string("n/a")] = ""; @@ -489,6 +559,42 @@ feature_count_[std::string("Multi-Map collective variables")] = 0; feature_paper_map_[std::string("Multi-Map collective variables")] = "Fiorin2020"; + feature_count_[std::string("Colvars-GROMACS interface")] = 0; + feature_paper_map_[std::string("Colvars-GROMACS interface")] = "Fiorin2024"; + + feature_count_[std::string("gspath colvar component")] = 0; + feature_paper_map_[std::string("gspath colvar component")] = "Fiorin2024"; + + feature_count_[std::string("gzpath colvar component")] = 0; + feature_paper_map_[std::string("gzpath colvar component")] = "Fiorin2024"; + + feature_count_[std::string("linearCombination colvar component")] = 0; + feature_paper_map_[std::string("linearCombination colvar component")] = "Fiorin2024"; + + feature_count_[std::string("gspathCV colvar component")] = 0; + feature_paper_map_[std::string("gspathCV colvar component")] = "Fiorin2024"; + + feature_count_[std::string("gzpathCV colvar component")] = 0; + feature_paper_map_[std::string("gzpathCV colvar component")] = "Fiorin2024"; + + feature_count_[std::string("aspathCV colvar component")] = 0; + feature_paper_map_[std::string("aspathCV colvar component")] = "Fiorin2024"; + + feature_count_[std::string("azpathCV colvar component")] = 0; + feature_paper_map_[std::string("azpathCV colvar component")] = "Fiorin2024"; + + feature_count_[std::string("Custom functions (Lepton)")] = 0; + feature_paper_map_[std::string("Custom functions (Lepton)")] = "Fiorin2024"; + + feature_count_[std::string("Scripted functions (Tcl)")] = 0; + feature_paper_map_[std::string("Scripted functions (Tcl)")] = "Fiorin2024"; + + feature_count_[std::string("ABMD bias")] = 0; + feature_paper_map_[std::string("ABMD bias")] = "Fiorin2024"; + + feature_count_[std::string("Updated multiple-walker ABF implementation")] = 0; + feature_paper_map_[std::string("Updated multiple-walker ABF implementation")] = "Fiorin2024"; + feature_count_[std::string("Umbrella-integration eABF estimator")] = 0; feature_paper_map_[std::string("Umbrella-integration eABF estimator")] = "Fu2016"; @@ -525,6 +631,15 @@ feature_count_[std::string("VMD engine")] = 0; feature_paper_map_[std::string("VMD engine")] = "Humphrey1996"; + feature_count_[std::string("alchLambda colvar component")] = 0; + feature_paper_map_[std::string("alchLambda colvar component")] = "Lagardere2023"; + + feature_count_[std::string("alchFLambda colvar component")] = 0; + feature_paper_map_[std::string("alchFLambda colvar component")] = "Lagardere2023"; + + feature_count_[std::string("Tinker-HP interface")] = 0; + feature_paper_map_[std::string("Tinker-HP interface")] = "Lagardere2023"; + feature_count_[std::string("eABF implementation")] = 0; feature_paper_map_[std::string("eABF implementation")] = "Lesage2017"; @@ -555,38 +670,14 @@ feature_count_[std::string("ALB colvar bias implementation")] = 0; feature_paper_map_[std::string("ALB colvar bias implementation")] = "White2014"; - feature_count_[std::string("Colvars-GROMACS interface")] = 0; - feature_paper_map_[std::string("Colvars-GROMACS interface")] = "n/a"; + feature_count_[std::string("OPES")] = 0; + feature_paper_map_[std::string("OPES")] = "Invernizzi2020"; - feature_count_[std::string("gspath colvar component")] = 0; - feature_paper_map_[std::string("gspath colvar component")] = "n/a"; - - feature_count_[std::string("gzpath colvar component")] = 0; - feature_paper_map_[std::string("gzpath colvar component")] = "n/a"; - - feature_count_[std::string("linearCombination colvar component")] = 0; - feature_paper_map_[std::string("linearCombination colvar component")] = "n/a"; - - feature_count_[std::string("gspathCV colvar component")] = 0; - feature_paper_map_[std::string("gspathCV colvar component")] = "n/a"; - - feature_count_[std::string("gzpathCV colvar component")] = 0; - feature_paper_map_[std::string("gzpathCV colvar component")] = "n/a"; - - feature_count_[std::string("aspathCV colvar component")] = 0; - feature_paper_map_[std::string("aspathCV colvar component")] = "n/a"; - - feature_count_[std::string("azpathCV colvar component")] = 0; - feature_paper_map_[std::string("azpathCV colvar component")] = "n/a"; + feature_count_[std::string("OPES explore or adaptive kernels")] = 0; + feature_paper_map_[std::string("OPES explore or adaptive kernels")] = "Invernizzi2022"; feature_count_[std::string("coordNum pairlist")] = 0; feature_paper_map_[std::string("coordNum pairlist")] = "n/a"; - feature_count_[std::string("Custom functions (Lepton)")] = 0; - feature_paper_map_[std::string("Custom functions (Lepton)")] = "n/a"; - - feature_count_[std::string("Scripted functions (Tcl)")] = 0; - feature_paper_map_[std::string("Scripted functions (Tcl)")] = "n/a"; - - feature_count_[std::string("ABMD bias")] = 0; - feature_paper_map_[std::string("ABMD bias")] = "n/a"; + feature_count_[std::string("torchANN colvar component")] = 0; + feature_paper_map_[std::string("torchANN colvar component")] = "n/a"; diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 76b5c694c1..cf3096ba50 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -592,7 +592,7 @@ int colvarparse::check_keywords(std::string &conf, char const *key) { if (cvm::debug()) cvm::log("Configuration string for \""+std::string(key)+ - "\": \"\n"+conf+"\".\n"); + "\":\n\""+conf+"\".\n"); strip_values(conf); // after stripping, the config string has either empty lines, or @@ -833,7 +833,8 @@ bool colvarparse::key_lookup(std::string const &conf, data_end) + 1; } - if (data != NULL) { + // data_end < data_begin means that the data or block contains only whitespace + if (data != NULL && data_end > data_begin) { data->append(line, data_begin, (data_end-data_begin)); if (cvm::debug()) { diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp index 588b7c68d8..1ed7a55552 100644 --- a/lib/colvars/colvarproxy.cpp +++ b/lib/colvars/colvarproxy.cpp @@ -243,7 +243,7 @@ void colvarproxy_atom_groups::compute_max_atom_groups_applied_force() colvarproxy_smp::colvarproxy_smp() { - b_smp_active = true; // May be disabled by user option + smp_mode = smp_mode_t::cvcs; // May be disabled by user option omp_lock_state = NULL; #if defined(_OPENMP) if (omp_get_thread_num() == 0) { @@ -265,41 +265,45 @@ colvarproxy_smp::~colvarproxy_smp() #endif } - -int colvarproxy_smp::check_smp_enabled() -{ +colvarproxy::smp_mode_t colvarproxy_smp::get_smp_mode() const { #if defined(_OPENMP) - if (b_smp_active) { - return COLVARS_OK; - } - return COLVARS_ERROR; + return smp_mode; #else - return COLVARS_NOT_IMPLEMENTED; + return colvarproxy::smp_mode_t::none; +#endif +} + +int colvarproxy_smp::set_smp_mode(smp_mode_t mode) { +#if defined(_OPENMP) + smp_mode = mode; + return COLVARS_OK; +#else + if (mode != colvarproxy::smp_mode_t::none) { + return COLVARS_NOT_IMPLEMENTED; + } else { + smp_mode = colvarproxy::smp_mode_t::none; + } + return COLVARS_OK; #endif } -int colvarproxy_smp::smp_colvars_loop() +int colvarproxy_smp::smp_loop(int n_items, std::function const &worker) { + int error_code = COLVARS_OK; #if defined(_OPENMP) - colvarmodule *cv = cvm::main(); - colvarproxy *proxy = cv->proxy; + cvm::increase_depth(); #pragma omp parallel for - for (int i = 0; i < static_cast(cv->variables_active_smp()->size()); i++) { - colvar *x = (*(cv->variables_active_smp()))[i]; - int x_item = (*(cv->variables_active_smp_items()))[i]; - if (cvm::debug()) { - cvm::log("["+cvm::to_str(proxy->smp_thread_id())+"/"+ - cvm::to_str(proxy->smp_num_threads())+ - "]: calc_colvars_items_smp(), i = "+cvm::to_str(i)+", cv = "+ - x->name+", cvc = "+cvm::to_str(x_item)+"\n"); - } - x->calc_cvcs(x_item, 1); + for (int i = 0; i < n_items; i++) { + int const retcode = worker(i); +#pragma omp atomic + error_code |= retcode; } - return cvm::get_error(); + cvm::decrease_depth(); #else - return COLVARS_NOT_IMPLEMENTED; + error_code |= COLVARS_NOT_IMPLEMENTED; #endif + return error_code; } @@ -470,8 +474,8 @@ colvarproxy::~colvarproxy() bool colvarproxy::io_available() { - return (check_smp_enabled() == COLVARS_OK && smp_thread_id() == 0) || - (check_smp_enabled() != COLVARS_OK); + return ((get_smp_mode() != smp_mode_t::none) && smp_thread_id() == 0) || + (get_smp_mode() == smp_mode_t::none); } diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index 91db6011e9..353f354efa 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -10,9 +10,12 @@ #ifndef COLVARPROXY_H #define COLVARPROXY_H +#include + #include "colvarmodule.h" #include "colvartypes.h" #include "colvarproxy_io.h" +#include "colvarproxy_replicas.h" #include "colvarproxy_system.h" #include "colvarproxy_tcl.h" #include "colvarproxy_volmaps.h" @@ -447,21 +450,22 @@ class colvarproxy_smp { public: + enum class smp_mode_t {cvcs, inner_loop, none}; + /// Constructor colvarproxy_smp(); /// Destructor virtual ~colvarproxy_smp(); - /// Whether threaded parallelization should be used (TODO: make this a - /// cvm::deps feature) - bool b_smp_active; + /// Get the current SMP mode + virtual smp_mode_t get_smp_mode() const; - /// Whether threaded parallelization is available (TODO: make this a cvm::deps feature) - virtual int check_smp_enabled(); + /// Set the current SMP mode + virtual int set_smp_mode(smp_mode_t mode); - /// Distribute calculation of colvars (and their components) across threads - virtual int smp_colvars_loop(); + /// Distribute computation over threads using OpenMP, unless overridden in the backend (e.g. NAMD) + virtual int smp_loop(int n_items, std::function const &worker); /// Distribute calculation of biases across threads virtual int smp_biases_loop(); @@ -488,38 +492,10 @@ protected: /// Lock state for OpenMP omp_lock_t *omp_lock_state; -}; - - -/// \brief Methods for multiple-replica communication -class colvarproxy_replicas { - -public: - - /// Constructor - colvarproxy_replicas(); - - /// Destructor - virtual ~colvarproxy_replicas(); - - /// \brief Indicate if multi-replica support is available and active - virtual int replica_enabled(); - - /// \brief Index of this replica - virtual int replica_index(); - - /// \brief Total number of replicas - virtual int num_replicas(); - - /// \brief Synchronize replica with others - virtual void replica_comm_barrier(); - - /// \brief Receive data from other replica - virtual int replica_comm_recv(char* msg_data, int buf_len, int src_rep); - - /// \brief Send data to other replica - virtual int replica_comm_send(char* msg_data, int msg_len, int dest_rep); + /// Whether threaded parallelization should be used (TODO: make this a + /// cvm::deps feature) + smp_mode_t smp_mode; }; diff --git a/lib/colvars/colvarproxy_io.cpp b/lib/colvars/colvarproxy_io.cpp index 4cfdfeec26..0327ed36f0 100644 --- a/lib/colvars/colvarproxy_io.cpp +++ b/lib/colvars/colvarproxy_io.cpp @@ -7,10 +7,28 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. + +#if defined(_WIN32) && !defined(__CYGWIN__) + // Using access() to check if a file exists (until we can assume C++14/17) -#if !defined(_WIN32) || defined(__CYGWIN__) -#include +#include + +#if defined(__has_include) +# if __has_include() +# include // MSVC only defines __cpp_lib_filesystem after include +# endif #endif + +#else + +#include + +#ifdef __cpp_lib_filesystem +#include +#endif + +#endif + #if defined(_WIN32) #include #endif @@ -64,6 +82,53 @@ int colvarproxy_io::set_frame(long int) } +std::string colvarproxy_io::get_current_work_dir() const +{ +#ifdef __cpp_lib_filesystem + + return std::filesystem::current_path().string(); + +#else + + // Legacy code + size_t constexpr buf_size = 3001; + char buf[buf_size]; + +#if defined(_WIN32) && !defined(__CYGWIN__) + char *getcwd_result = ::_getcwd(buf, buf_size); +#else + char *getcwd_result = ::getcwd(buf, buf_size); +#endif + + if (getcwd_result == nullptr) { + cvm::error("Error: cannot read the current working directory.\n", COLVARS_INPUT_ERROR); + return std::string(""); + } + + return std::string(getcwd_result); +#endif +} + + +std::string colvarproxy_io::join_paths(std::string const &path1, std::string const &path2) const +{ +#ifdef __cpp_lib_filesystem + + return (std::filesystem::path(path1) / std::filesystem::path(path2)).string(); + +#else + + // Legacy code +#if defined(_WIN32) && !defined(__CYGWIN__) + return (path1 + "\\" + path2); +#else + return (path1 + "/" + path2); +#endif + +#endif +} + + int colvarproxy_io::backup_file(char const *filename) { // Simplified version of NAMD_file_exists() diff --git a/lib/colvars/colvarproxy_io.h b/lib/colvars/colvarproxy_io.h index 726f915c97..eaf750366d 100644 --- a/lib/colvars/colvarproxy_io.h +++ b/lib/colvars/colvarproxy_io.h @@ -38,6 +38,12 @@ public: // Returns error code virtual int set_frame(long int); + /// Get the current working directory of this process + std::string get_current_work_dir() const; + + /// Join two paths using the operating system's path separation + std::string join_paths(std::string const &path1, std::string const &path2) const; + /// \brief Rename the given file, before overwriting it virtual int backup_file(char const *filename); diff --git a/lib/colvars/colvarproxy_replicas.cpp b/lib/colvars/colvarproxy_replicas.cpp index 1f336d3e44..ec7ffdd8d5 100644 --- a/lib/colvars/colvarproxy_replicas.cpp +++ b/lib/colvars/colvarproxy_replicas.cpp @@ -7,50 +7,103 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. + #include "colvarmodule.h" -#include "colvarproxy.h" +#include "colvarproxy_replicas.h" -colvarproxy_replicas::colvarproxy_replicas() {} +colvarproxy_replicas::colvarproxy_replicas() +{ +#ifdef COLVARS_MPI + replicas_mpi_comm = MPI_COMM_NULL; +#endif +} colvarproxy_replicas::~colvarproxy_replicas() {} -int colvarproxy_replicas::replica_enabled() +void colvarproxy_replicas::set_replicas_mpi_communicator(replicas_mpi_comm_t comm) { + replicas_mpi_comm = comm; +#ifdef COLVARS_MPI + if (comm != MPI_COMM_NULL) { + MPI_Comm_rank(comm, &replicas_mpi_rank); + MPI_Comm_size(comm, &replicas_mpi_num); + cvm::log("Enabling multiple replicas: this is replica number " + + cvm::to_str(replica_index() + 1) + " of " + cvm::to_str(num_replicas()) + ".\n"); + } +#endif +} + + +int colvarproxy_replicas::check_replicas_enabled() +{ +#ifdef COLVARS_MPI + if (replicas_mpi_comm != MPI_COMM_NULL) { + return num_replicas() > 1 ? COLVARS_OK : COLVARS_ERROR; + } + return COLVARS_ERROR; +#else return COLVARS_NOT_IMPLEMENTED; +#endif } int colvarproxy_replicas::replica_index() { - return 0; + return replicas_mpi_rank; } int colvarproxy_replicas::num_replicas() { - return 1; + return replicas_mpi_num; } -void colvarproxy_replicas::replica_comm_barrier() {} - - -int colvarproxy_replicas::replica_comm_recv(char* /* msg_data */, - int /* buf_len */, - int /* src_rep */) +void colvarproxy_replicas::replica_comm_barrier() { - return COLVARS_NOT_IMPLEMENTED; +#ifdef COLVARS_MPI + MPI_Barrier(replicas_mpi_comm); +#endif } -int colvarproxy_replicas::replica_comm_send(char* /* msg_data */, - int /* msg_len */, - int /* dest_rep */) +int colvarproxy_replicas::replica_comm_recv(char *buffer, int buffer_length, int source_rank) { +#ifdef COLVARS_MPI + MPI_Status status; + int retval = MPI_Recv(buffer, buffer_length, MPI_CHAR, source_rank, 0, replicas_mpi_comm, &status); + if (retval == MPI_SUCCESS) { + MPI_Get_count(&status, MPI_CHAR, &retval); + } else { + retval = 0; + } + return retval; +#else + (void)buffer; + (void)buffer_length; + (void)source_rank; return COLVARS_NOT_IMPLEMENTED; +#endif } +int colvarproxy_replicas::replica_comm_send(char *buffer, int buffer_length, int destination_rank) +{ +#ifdef COLVARS_MPI + int retval = MPI_Send(buffer, buffer_length, MPI_CHAR, destination_rank, 0, replicas_mpi_comm); + if (retval == MPI_SUCCESS) { + retval = buffer_length; + } else { + retval = 0; + } + return retval; +#else + (void)buffer; + (void)buffer_length; + (void)destination_rank; + return COLVARS_NOT_IMPLEMENTED; +#endif +} diff --git a/lib/colvars/colvarproxy_replicas.h b/lib/colvars/colvarproxy_replicas.h new file mode 100644 index 0000000000..b58c80bf5e --- /dev/null +++ b/lib/colvars/colvarproxy_replicas.h @@ -0,0 +1,66 @@ +// -*- c++ -*- + +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/Colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. + +#ifndef COLVARPROXY_REPLICAS_H +#define COLVARPROXY_REPLICAS_H + + +#ifdef COLVARS_MPI +#include +typedef MPI_Comm replicas_mpi_comm_t; +#else +typedef void * replicas_mpi_comm_t; +#endif + + +/// \brief Methods for multiple-replica communication +class colvarproxy_replicas { + +public: + + /// Constructor + colvarproxy_replicas(); + + /// Destructor + virtual ~colvarproxy_replicas(); + + /// Set the multiple replicas communicator + virtual void set_replicas_mpi_communicator(replicas_mpi_comm_t comm); + + /// Indicate if multi-replica support is available and active + virtual int check_replicas_enabled(); + + /// Index of this replica + virtual int replica_index(); + + /// Total number of replicas + virtual int num_replicas(); + + /// Synchronize replica with others + virtual void replica_comm_barrier(); + + /// Receive data from other replica + virtual int replica_comm_recv(char* msg_data, int buf_len, int src_rep); + + /// Send data to other replica + virtual int replica_comm_send(char* msg_data, int msg_len, int dest_rep); + +protected: + + /// MPI communicator containint 1 root proc from each world + replicas_mpi_comm_t replicas_mpi_comm; + + /// Index (rank) of this replica in the MPI implementation + int replicas_mpi_rank = 0; + + /// Number of replicas in the MPI implementation + int replicas_mpi_num = 1; +}; + +#endif diff --git a/lib/colvars/colvarproxy_system.h b/lib/colvars/colvarproxy_system.h index 67d0938e54..bf2ad2ea8b 100644 --- a/lib/colvars/colvarproxy_system.h +++ b/lib/colvars/colvarproxy_system.h @@ -94,6 +94,7 @@ public: virtual bool total_forces_enabled() const; /// Are total forces from the current step available? + /// in which case they are really system forces virtual bool total_forces_same_step() const; /// Get the molecule ID when called in VMD; raise error otherwise @@ -109,6 +110,11 @@ public: /// Send cached value of alchemical lambda parameter to back-end (if available) virtual int send_alch_lambda(); + /// Request energy computation every freq steps (necessary for NAMD3, not all back-ends) + virtual int request_alch_energy_freq(int const freq) { + return COLVARS_OK; + } + /// Get energy derivative with respect to lambda (if available) virtual int get_dE_dlambda(cvm::real* dE_dlambda); diff --git a/lib/colvars/colvars_memstream.h b/lib/colvars/colvars_memstream.h index 0d80d2794d..c9564a3c41 100644 --- a/lib/colvars/colvars_memstream.h +++ b/lib/colvars/colvars_memstream.h @@ -108,6 +108,9 @@ public: /// Ignore formatting operators inline void setf(decltype(std::ios::fmtflags(0)), decltype(std::ios::floatfield)) {} + /// Ignore formatting operators + inline void setf(decltype(std::ios::fmtflags(0))) {} + /// Ignore formatting operators inline void flags(decltype(std::ios::fmtflags(0))) {} diff --git a/lib/colvars/colvars_version.h b/lib/colvars/colvars_version.h index d50a00fff5..02f949b517 100644 --- a/lib/colvars/colvars_version.h +++ b/lib/colvars/colvars_version.h @@ -1,3 +1,3 @@ #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2024-06-04" +#define COLVARS_VERSION "2025-04-30" #endif diff --git a/lib/colvars/colvarscript_commands.h b/lib/colvars/colvarscript_commands.h index bdad74e433..191724dd0f 100644 --- a/lib/colvars/colvarscript_commands.h +++ b/lib/colvars/colvarscript_commands.h @@ -541,6 +541,15 @@ CVSCRIPT(cv_printframe, return COLVARS_OK; ) +CVSCRIPT(cv_patchversion, + "Get the Colvars patch version number (used for bugfixes only)\n" + "version : string - Colvars version", + 0, 0, + "", + script->set_result_int(cvm::main()->patch_version_number()); + return COLVARS_OK; + ) + CVSCRIPT(cv_printframelabels, "Return the labels that would be written to colvars.traj\n" "Labels : string - The labels", @@ -656,7 +665,7 @@ CVSCRIPT(cv_update, ) CVSCRIPT(cv_version, - "Get the Colvars Module version string\n" + "Get the Colvars version string\n" "version : string - Colvars version", 0, 0, "", @@ -665,7 +674,7 @@ CVSCRIPT(cv_version, ) // This guard allows compiling colvar and bias function bodies in their -// respecitve files instead of colvarscript_commands.o +// respective files instead of colvarscript_commands.o #ifndef COLVARSCRIPT_COMMANDS_GLOBAL #include "colvarscript_commands_colvar.h" #include "colvarscript_commands_bias.h" diff --git a/lib/colvars/colvarscript_commands_colvar.h b/lib/colvars/colvarscript_commands_colvar.h index f6bb6b8c98..c641b321d0 100644 --- a/lib/colvars/colvarscript_commands_colvar.h +++ b/lib/colvars/colvarscript_commands_colvar.h @@ -23,6 +23,7 @@ CVSCRIPT(colvar_addforce, script->add_error_msg("addforce : error parsing force value"); return COLVARSCRIPT_ERROR; } + this_colvar->enable(colvardeps::f_cv_apply_force); this_colvar->add_bias_force(force); script->set_result_colvarvalue(force); return COLVARS_OK; diff --git a/lib/colvars/colvartypes.cpp b/lib/colvars/colvartypes.cpp index f51791d015..6c65f1f5a6 100644 --- a/lib/colvars/colvartypes.cpp +++ b/lib/colvars/colvartypes.cpp @@ -137,71 +137,6 @@ std::istream & operator >> (std::istream &is, colvarmodule::quaternion &q) } -cvm::quaternion -cvm::quaternion::position_derivative_inner(cvm::rvector const &pos, - cvm::rvector const &vec) const -{ - cvm::quaternion result(0.0, 0.0, 0.0, 0.0); - - - result.q0 = 2.0 * pos.x * q0 * vec.x - +2.0 * pos.y * q0 * vec.y - +2.0 * pos.z * q0 * vec.z - - -2.0 * pos.y * q3 * vec.x - +2.0 * pos.z * q2 * vec.x - - +2.0 * pos.x * q3 * vec.y - -2.0 * pos.z * q1 * vec.y - - -2.0 * pos.x * q2 * vec.z - +2.0 * pos.y * q1 * vec.z; - - - result.q1 = +2.0 * pos.x * q1 * vec.x - -2.0 * pos.y * q1 * vec.y - -2.0 * pos.z * q1 * vec.z - - +2.0 * pos.y * q2 * vec.x - +2.0 * pos.z * q3 * vec.x - - +2.0 * pos.x * q2 * vec.y - -2.0 * pos.z * q0 * vec.y - - +2.0 * pos.x * q3 * vec.z - +2.0 * pos.y * q0 * vec.z; - - - result.q2 = -2.0 * pos.x * q2 * vec.x - +2.0 * pos.y * q2 * vec.y - -2.0 * pos.z * q2 * vec.z - - +2.0 * pos.y * q1 * vec.x - +2.0 * pos.z * q0 * vec.x - - +2.0 * pos.x * q1 * vec.y - +2.0 * pos.z * q3 * vec.y - - -2.0 * pos.x * q0 * vec.z - +2.0 * pos.y * q3 * vec.z; - - - result.q3 = -2.0 * pos.x * q3 * vec.x - -2.0 * pos.y * q3 * vec.y - +2.0 * pos.z * q3 * vec.z - - -2.0 * pos.y * q0 * vec.x - +2.0 * pos.z * q1 * vec.x - - +2.0 * pos.x * q0 * vec.y - +2.0 * pos.z * q2 * vec.y - - +2.0 * pos.x * q1 * vec.z - +2.0 * pos.y * q2 * vec.z; - - return result; -} - #ifdef COLVARS_LAMMPS namespace { inline void *new_Jacobi_solver(int size) { @@ -336,7 +271,7 @@ void colvarmodule::rotation::compute_overlap_matrix() #ifndef COLVARS_LAMMPS namespace NR { -void diagonalize_matrix(cvm::real m[4][4], +int diagonalize_matrix(cvm::real m[4][4], cvm::real eigval[4], cvm::real eigvec[4][4]) { @@ -347,9 +282,7 @@ void diagonalize_matrix(cvm::real m[4][4], int jac_nrot = 0; if (NR_Jacobi::jacobi(m, eigval, eigvec, &jac_nrot) != COLVARS_OK) { - cvm::error("Too many iterations in jacobi diagonalization.\n" - "This is usually the result of an ill-defined set of atoms for " - "rotational alignment (RMSD, rotateReference, etc).\n"); + return COLVARS_ERROR; } NR_Jacobi::eigsrt(eigval, eigvec); // jacobi saves eigenvectors by columns @@ -367,6 +300,7 @@ void diagonalize_matrix(cvm::real m[4][4], eigvec[ie][i] /= norm; } } + return COLVARS_OK; } } @@ -429,14 +363,25 @@ void colvarmodule::rotation::calc_optimal_rotation_impl() { cvm::real[4][4]> *>(jacobi); int ierror = ecalc->Diagonalize(S, S_eigval, S_eigvec); +#else + int ierror = NR::diagonalize_matrix(S, S_eigval, S_eigvec); +#endif if (ierror) { + cvm::log("Failed to diagonalize the following overlapping matrix:\n"); + for (size_t i = 0; i < 4; ++i) { + for (size_t j = 0; j < 4; ++j) { + cvm::log(cvm::to_str(S[i][j]) + " "); + } + cvm::log("\n"); + } + cvm::log("The corresponding correlation matrix is:\n"); + cvm::log(" " + cvm::to_str(C.xx) + " " + cvm::to_str(C.xy) + " " + cvm::to_str(C.xz)); + cvm::log(" " + cvm::to_str(C.yx) + " " + cvm::to_str(C.yy) + " " + cvm::to_str(C.yz)); + cvm::log(" " + cvm::to_str(C.zx) + " " + cvm::to_str(C.zy) + " " + cvm::to_str(C.zz) + "\n"); cvm::error("Too many iterations in jacobi diagonalization.\n" "This is usually the result of an ill-defined set of atoms for " "rotational alignment (RMSD, rotateReference, etc).\n"); } -#else - NR::diagonalize_matrix(S, S_eigval, S_eigvec); -#endif q = cvm::quaternion{S_eigvec[0][0], S_eigvec[0][1], S_eigvec[0][2], S_eigvec[0][3]}; if (cvm::rotation::monitor_crossings) { diff --git a/lib/colvars/colvartypes.h b/lib/colvars/colvartypes.h index 455e628f1b..db5827990b 100644 --- a/lib/colvars/colvartypes.h +++ b/lib/colvars/colvartypes.h @@ -20,10 +20,6 @@ #include "colvarmodule.h" -#ifndef PI -#define PI 3.14159265358979323846 -#endif - // ---------------------------------------------------------------------- /// Linear algebra functions and data types used in the collective /// variables implemented so far @@ -1221,8 +1217,57 @@ public: /// \brief Multiply the given vector by the derivative of the given /// (rotated) position with respect to the quaternion - cvm::quaternion position_derivative_inner(cvm::rvector const &pos, - cvm::rvector const &vec) const; + /// \param pos The position \f$\mathbf{x}\f$. + /// \param vec The vector \f$\mathbf{v}\f$. + /// \return A quaternion (see the detailed documentation below). + /// + /// This function is mainly used for projecting the gradients or forces on + /// the rotated atoms to the forces on quaternion. Assume this rotation can + /// be represented as \f$R(\mathbf{q})\f$, + /// where \f$\mathbf{q} := (q_0, q_1, q_2, q_3)\f$ + /// is the current quaternion, the function returns the following new + /// quaternion: + /// \f[ + /// \left(\mathbf{v}^\mathrm{T}\frac{\partial R(\mathbf{q})}{\partial q_0}\mathbf{x}, + /// \mathbf{v}^\mathrm{T}\frac{\partial R(\mathbf{q})}{\partial q_1}\mathbf{x}, + /// \mathbf{v}^\mathrm{T}\frac{\partial R(\mathbf{q})}{\partial q_2}\mathbf{x}, + /// \mathbf{v}^\mathrm{T}\frac{\partial R(\mathbf{q})}{\partial q_3}\mathbf{x}\right) + /// \f] + /// where \f$\mathbf{v}\f$ is usually the gradient of \f$\xi\f$ with respect to + /// the rotated frame \f$\tilde{\mathbf{X}}\f$, + /// \f$\partial \xi / \partial \tilde{\mathbf{X}}\f$, or the force acting on it + /// (\f$\mathbf{F}_{\tilde{\mathbf{X}}}\f$). + /// By using the following loop in pseudo C++ code, + /// either \f$\partial \xi / \partial \tilde{\mathbf{X}}\f$ + /// or \f$\mathbf{F}_{\tilde{\mathbf{X}}}\f$, can be projected to + /// \f$\partial \xi / \partial \mathbf{q}\f$ or \f$\mathbf{F}_q\f$ into `sum_dxdq`: + /// @code + /// cvm::real sum_dxdq[4] = {0, 0, 0, 0}; + /// for (size_t i = 0; i < main_group_size(); ++i) { + /// const cvm::rvector v = grad_or_force_on_rotated_main_group(i); + /// const cvm::rvector x = unrotated_main_group_positions(i); + /// cvm::quaternion const dxdq = position_derivative_inner(x, v); + /// sum_dxdq[0] += dxdq[0]; + /// sum_dxdq[1] += dxdq[1]; + /// sum_dxdq[2] += dxdq[2]; + /// sum_dxdq[3] += dxdq[3]; + /// } + /// @endcode + inline cvm::quaternion position_derivative_inner(cvm::rvector const &pos, + cvm::rvector const &vec) const { + return cvm::quaternion(2.0 * (vec.x * ( q0 * pos.x - q3 * pos.y + q2 * pos.z) + + vec.y * ( q3 * pos.x + q0 * pos.y - q1 * pos.z) + + vec.z * (-q2 * pos.x + q1 * pos.y + q0 * pos.z)), + 2.0 * (vec.x * ( q1 * pos.x + q2 * pos.y + q3 * pos.z) + + vec.y * ( q2 * pos.x - q1 * pos.y - q0 * pos.z) + + vec.z * ( q3 * pos.x + q0 * pos.y - q1 * pos.z)), + 2.0 * (vec.x * (-q2 * pos.x + q1 * pos.y + q0 * pos.z) + + vec.y * ( q1 * pos.x + q2 * pos.y + q3 * pos.z) + + vec.z * (-q0 * pos.x + q3 * pos.y - q2 * pos.z)), + 2.0 * (vec.x * (-q3 * pos.x - q0 * pos.y + q1 * pos.z) + + vec.y * ( q0 * pos.x - q3 * pos.y + q2 * pos.z) + + vec.z * ( q1 * pos.x + q2 * pos.y + q3 * pos.z))); + } /// \brief Return the cosine between the orientation frame @@ -1301,7 +1346,7 @@ public: #ifndef COLVARS_LAMMPS namespace NR { -void diagonalize_matrix(cvm::real m[4][4], +int diagonalize_matrix(cvm::real m[4][4], cvm::real eigval[4], cvm::real eigvec[4][4]); } diff --git a/lib/colvars/colvarvalue.cpp b/lib/colvars/colvarvalue.cpp index 3b8077d2e7..66baf35eeb 100644 --- a/lib/colvars/colvarvalue.cpp +++ b/lib/colvars/colvarvalue.cpp @@ -153,29 +153,6 @@ std::string const colvarvalue::type_keyword(Type t) } -size_t colvarvalue::num_df(Type t) -{ - switch (t) { - case colvarvalue::type_notset: - default: - return 0; break; - case colvarvalue::type_scalar: - return 1; break; - case colvarvalue::type_3vector: - return 3; break; - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - return 2; break; - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - return 3; break; - case colvarvalue::type_vector: - // the size of a vector is unknown without its object - return 0; break; - } -} - - size_t colvarvalue::num_dimensions(Type t) { switch (t) { @@ -591,34 +568,132 @@ cvm::real operator * (colvarvalue const &x1, } +cvm::real colvarvalue::norm2() const +{ + switch (value_type) { + case colvarvalue::type_scalar: + return (this->real_value)*(this->real_value); + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vector: + case colvarvalue::type_unit3vectorderiv: + return (this->rvector_value).norm2(); + case colvarvalue::type_quaternion: + case colvarvalue::type_quaternionderiv: + return (this->quaternion_value).norm2(); + case colvarvalue::type_vector: + if (elem_types.size() > 0) { + // if we have information about non-scalar types, use it + cvm::real result = 0.0; + size_t i; + for (i = 0; i < elem_types.size(); i++) { + result += (this->get_elem(i)).norm2(); + } + return result; + } else { + return vector1d_value.norm2(); + } + break; + case colvarvalue::type_notset: + default: + return 0.0; + } +} + + +cvm::real colvarvalue::sum() const +{ + switch (value_type) { + case colvarvalue::type_scalar: + return (this->real_value); + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vector: + case colvarvalue::type_unit3vectorderiv: + return (this->rvector_value).x + (this->rvector_value).y + + (this->rvector_value).z; + case colvarvalue::type_quaternion: + case colvarvalue::type_quaternionderiv: + return (this->quaternion_value).q0 + (this->quaternion_value).q1 + + (this->quaternion_value).q2 + (this->quaternion_value).q3; + case colvarvalue::type_vector: + return (this->vector1d_value).sum(); + case colvarvalue::type_notset: + default: + return 0.0; + } +} + + +cvm::real colvarvalue::dist2(colvarvalue const &x2) const +{ + colvarvalue::check_types(*this, x2); + + switch (this->type()) { + case colvarvalue::type_scalar: + return (this->real_value - x2.real_value) * (this->real_value - x2.real_value); + case colvarvalue::type_3vector: + return (this->rvector_value - x2.rvector_value).norm2(); + case colvarvalue::type_unit3vector: { + cvm::rvector const &v1 = this->rvector_value; + cvm::rvector const &v2 = x2.rvector_value; + cvm::real const theta = cvm::acos(v1 * v2); + return theta * theta; + } + case colvarvalue::type_quaternion: + // angle between (*this) and x2 is the distance, the quaternion + // object has it implemented internally + return this->quaternion_value.dist2(x2.quaternion_value); + case colvarvalue::type_vector: + return (this->vector1d_value - x2.vector1d_value).norm2(); + case colvarvalue::type_unit3vectorderiv: + case colvarvalue::type_quaternionderiv: + cvm::error("Error: computing a squared-distance between two variables of type \"" + + type_desc(this->type()) + "\", for which it is not defined.\n", + COLVARS_BUG_ERROR); + case colvarvalue::type_notset: + default: + this->undef_op(); + return 0.0; + }; + + return 0.0; +} + + colvarvalue colvarvalue::dist2_grad(colvarvalue const &x2) const { colvarvalue::check_types(*this, x2); + // Compute derivative with respect to (*this) + switch (this->value_type) { case colvarvalue::type_scalar: return 2.0 * (this->real_value - x2.real_value); case colvarvalue::type_3vector: return 2.0 * (this->rvector_value - x2.rvector_value); - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - { - cvm::rvector const &v1 = this->rvector_value; - cvm::rvector const &v2 = x2.rvector_value; - cvm::real const cos_t = v1 * v2; - return colvarvalue(2.0 * (cos_t * v1 - v2), colvarvalue::type_unit3vectorderiv); - } + case colvarvalue::type_unit3vector: { + cvm::rvector const &v1 = this->rvector_value; + cvm::rvector const &v2 = x2.rvector_value; + cvm::real const cos_t = v1 * v2; + return colvarvalue(2.0 * cvm::acos(cos_t) * -1.0 / cvm::sqrt(1.0 - cos_t * cos_t) * v2, + colvarvalue::type_unit3vectorderiv); + } case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: return this->quaternion_value.dist2_grad(x2.quaternion_value); case colvarvalue::type_vector: return colvarvalue(2.0 * (this->vector1d_value - x2.vector1d_value), colvarvalue::type_vector); break; + case colvarvalue::type_unit3vectorderiv: + case colvarvalue::type_quaternionderiv: + cvm::error("Error: computing a squared-distance gradient between two variables of type \"" + + type_desc(this->type()) + "\", for which it is not defined.\n", + COLVARS_BUG_ERROR); case colvarvalue::type_notset: default: this->undef_op(); return colvarvalue(colvarvalue::type_notset); }; + + return colvarvalue(colvarvalue::type_notset); } diff --git a/lib/colvars/colvarvalue.h b/lib/colvars/colvarvalue.h index e8a6a849d3..61f1bf718b 100644 --- a/lib/colvars/colvarvalue.h +++ b/lib/colvars/colvarvalue.h @@ -109,9 +109,6 @@ public: /// User keywords for specifying value types in the configuration static std::string const type_keyword(Type t); - /// Number of degrees of freedom for each supported type - static size_t num_df(Type t); - /// Number of dimensions for each supported type (used to allocate vector1d_value) static size_t num_dimensions(Type t); @@ -671,87 +668,4 @@ inline cvm::vector1d const colvarvalue::as_vector() const } -inline cvm::real colvarvalue::norm2() const -{ - switch (value_type) { - case colvarvalue::type_scalar: - return (this->real_value)*(this->real_value); - case colvarvalue::type_3vector: - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - return (this->rvector_value).norm2(); - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - return (this->quaternion_value).norm2(); - case colvarvalue::type_vector: - if (elem_types.size() > 0) { - // if we have information about non-scalar types, use it - cvm::real result = 0.0; - size_t i; - for (i = 0; i < elem_types.size(); i++) { - result += (this->get_elem(i)).norm2(); - } - return result; - } else { - return vector1d_value.norm2(); - } - break; - case colvarvalue::type_notset: - default: - return 0.0; - } -} - - -inline cvm::real colvarvalue::sum() const -{ - switch (value_type) { - case colvarvalue::type_scalar: - return (this->real_value); - case colvarvalue::type_3vector: - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - return (this->rvector_value).x + (this->rvector_value).y + - (this->rvector_value).z; - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - return (this->quaternion_value).q0 + (this->quaternion_value).q1 + - (this->quaternion_value).q2 + (this->quaternion_value).q3; - case colvarvalue::type_vector: - return (this->vector1d_value).sum(); - case colvarvalue::type_notset: - default: - return 0.0; - } -} - - -inline cvm::real colvarvalue::dist2(colvarvalue const &x2) const -{ - colvarvalue::check_types(*this, x2); - - switch (this->type()) { - case colvarvalue::type_scalar: - return (this->real_value - x2.real_value)*(this->real_value - x2.real_value); - case colvarvalue::type_3vector: - return (this->rvector_value - x2.rvector_value).norm2(); - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - // angle between (*this) and x2 is the distance - return cvm::acos(this->rvector_value * x2.rvector_value) * cvm::acos(this->rvector_value * x2.rvector_value); - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - // angle between (*this) and x2 is the distance, the quaternion - // object has it implemented internally - return this->quaternion_value.dist2(x2.quaternion_value); - case colvarvalue::type_vector: - return (this->vector1d_value - x2.vector1d_value).norm2(); - case colvarvalue::type_notset: - default: - this->undef_op(); - return 0.0; - }; -} - - #endif diff --git a/src/COLVARS/colvarproxy_lammps.cpp b/src/COLVARS/colvarproxy_lammps.cpp index 265dc34f43..c92d835cf6 100644 --- a/src/COLVARS/colvarproxy_lammps.cpp +++ b/src/COLVARS/colvarproxy_lammps.cpp @@ -33,12 +33,9 @@ colvarproxy_lammps::colvarproxy_lammps(LAMMPS_NS::LAMMPS *lmp) : _lmp(lmp), _ra previous_step = -1; do_exit = false; - inter_me = 0; - inter_num = 1; bias_energy = 0.0; engine_ready_ = false; - inter_comm = MPI_COMM_NULL; } /* ---------------------------------------------------------------------- */ @@ -83,19 +80,6 @@ void colvarproxy_lammps::set_random_seed(int seed) _random = new LAMMPS_NS::RanPark(_lmp, seed); } -/* ---------------------------------------------------------------------- */ - -void colvarproxy_lammps::set_replicas_communicator(MPI_Comm root2root) -{ - inter_comm = root2root; - - // initialize multi-replica support, if available - if (replica_enabled() == COLVARS_OK) { - MPI_Comm_rank(inter_comm, &inter_me); - MPI_Comm_size(inter_comm, &inter_num); - } -} - /* ---------------------------------------------------------------------- re-initialize data where needed ------------------------------------------------------------------------- */ @@ -255,63 +239,7 @@ int colvarproxy_lammps::set_unit_system(std::string const &units_in, bool /*chec return COLVARS_OK; } -/* ---------------------------------------------------------------------- - multi-replica support -------------------------------------------------------------------------- */ -int colvarproxy_lammps::replica_enabled() -{ - return (inter_comm != MPI_COMM_NULL) ? COLVARS_OK : COLVARS_NOT_IMPLEMENTED; -} - -/* ---------------------------------------------------------------------- */ - -int colvarproxy_lammps::replica_index() -{ - return inter_me; -} - -/* ---------------------------------------------------------------------- */ - -int colvarproxy_lammps::num_replicas() -{ - return inter_num; -} - -/* ---------------------------------------------------------------------- */ - -void colvarproxy_lammps::replica_comm_barrier() -{ - MPI_Barrier(inter_comm); -} - -/* ---------------------------------------------------------------------- */ - -int colvarproxy_lammps::replica_comm_recv(char* msg_data, int buf_len, int src_rep) -{ - MPI_Status status; - int retval; - - retval = MPI_Recv(msg_data,buf_len,MPI_CHAR,src_rep,0,inter_comm,&status); - if (retval == MPI_SUCCESS) { - MPI_Get_count(&status, MPI_CHAR, &retval); - } else retval = 0; - return retval; -} - -/* ---------------------------------------------------------------------- */ - -int colvarproxy_lammps::replica_comm_send(char* msg_data, int msg_len, int dest_rep) -{ - int retval; - retval = MPI_Send(msg_data,msg_len,MPI_CHAR,dest_rep,0,inter_comm); - if (retval == MPI_SUCCESS) { - retval = msg_len; - } else retval = 0; - return retval; -} - -/* ---------------------------------------------------------------------- */ int colvarproxy_lammps::check_atom_id(int atom_number) { diff --git a/src/COLVARS/colvarproxy_lammps.h b/src/COLVARS/colvarproxy_lammps.h index d98be37b09..06bda4252e 100644 --- a/src/COLVARS/colvarproxy_lammps.h +++ b/src/COLVARS/colvarproxy_lammps.h @@ -45,9 +45,6 @@ class colvarproxy_lammps : public colvarproxy { std::vector atoms_types; - MPI_Comm inter_comm; // MPI comm with 1 root proc from each world - int inter_me, inter_num; // rank for the inter replica comm - public: friend class cvm::atom; @@ -59,9 +56,6 @@ class colvarproxy_lammps : public colvarproxy { /// Set the internal seed used by \link rand_gaussian() \endlink void set_random_seed(int seed); - /// Set the multiple replicas communicator - void set_replicas_communicator(MPI_Comm root2root); - int setup() override; // disable default and copy constructor @@ -72,7 +66,8 @@ class colvarproxy_lammps : public colvarproxy { // methods for lammps to move data or trigger actions in the proxy public: bool total_forces_enabled() const override { return total_force_requested; }; - bool total_forces_same_step() const override { return true; }; + // Total forces are saved at end of step, only processed at the next step + bool total_forces_same_step() const override { return false; }; bool want_exit() const { return do_exit; }; // perform colvars computation. returns biasing energy @@ -102,14 +97,6 @@ class colvarproxy_lammps : public colvarproxy { int check_atom_id(int atom_number) override; inline std::vector *modify_atom_types() { return &atoms_types; } - - int replica_enabled() override; - int replica_index() override; - int num_replicas() override; - - void replica_comm_barrier() override; - int replica_comm_recv(char *msg_data, int buf_len, int src_rep) override; - int replica_comm_send(char *msg_data, int msg_len, int dest_rep) override; }; #endif diff --git a/src/COLVARS/colvarproxy_lammps_version.h b/src/COLVARS/colvarproxy_lammps_version.h index 5901044b1e..1c16217679 100644 --- a/src/COLVARS/colvarproxy_lammps_version.h +++ b/src/COLVARS/colvarproxy_lammps_version.h @@ -1,3 +1,3 @@ #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2024-07-05" +#define COLVARPROXY_VERSION "2025-03-31" #endif diff --git a/src/COLVARS/fix_colvars.cpp b/src/COLVARS/fix_colvars.cpp index d5a8806eed..247ad2ef8b 100644 --- a/src/COLVARS/fix_colvars.cpp +++ b/src/COLVARS/fix_colvars.cpp @@ -267,6 +267,7 @@ void FixColvars::init() if (init_flag) return; init_flag = 1; +#if defined(COLVARS_MPI) if (universe->nworlds > 1) { // create inter root communicator int color = 1; @@ -275,9 +276,10 @@ void FixColvars::init() } MPI_Comm_split(universe->uworld, color, universe->iworld, &root2root); if (me == 0) { - proxy->set_replicas_communicator(root2root); + proxy->set_replicas_mpi_communicator(root2root); } } +#endif } From 1f5b64bca4ef85c7628781780db8e028fc0418b0 Mon Sep 17 00:00:00 2001 From: Forrest Glines Date: Thu, 1 May 2025 15:10:29 -0700 Subject: [PATCH 57/94] torch.load fix for torch>=2.6 in ML-IAP --- src/KOKKOS/mliap_unified_couple_kokkos.pyx | 2 +- src/ML-IAP/mliap_unified_couple.pyx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/mliap_unified_couple_kokkos.pyx b/src/KOKKOS/mliap_unified_couple_kokkos.pyx index 1492962013..91dce645ac 100644 --- a/src/KOKKOS/mliap_unified_couple_kokkos.pyx +++ b/src/KOKKOS/mliap_unified_couple_kokkos.pyx @@ -498,7 +498,7 @@ cdef public object mliap_unified_connect_kokkos(char *fname, MLIAPDummyModel * m unified = LOADED_MODEL elif str_fname.endswith(".pt") or str_fname.endswith('.pth'): import torch - unified = torch.load(str_fname) + unified = torch.load(str_fname,weights_only=False) else: with open(str_fname, 'rb') as pfile: unified = pickle.load(pfile) diff --git a/src/ML-IAP/mliap_unified_couple.pyx b/src/ML-IAP/mliap_unified_couple.pyx index 891ba8e28a..36c3eddda7 100644 --- a/src/ML-IAP/mliap_unified_couple.pyx +++ b/src/ML-IAP/mliap_unified_couple.pyx @@ -363,7 +363,7 @@ cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model, unified = LOADED_MODEL elif str_fname.endswith(".pt") or str_fname.endswith('.pth'): import torch - unified = torch.load(str_fname) + unified = torch.load(str_fname,weights_only=False) else: with open(str_fname, 'rb') as pfile: unified = pickle.load(pfile) From a388bd38ee3c5bcb0fde2f2e592d47a86b14429e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 2 May 2025 00:21:41 -0400 Subject: [PATCH 58/94] add LAMMPS-GUI screenshot image --- doc/src/JPG/lammps-gui-screen.png | Bin 0 -> 369853 bytes doc/src/Tools.rst | 12 ++++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 doc/src/JPG/lammps-gui-screen.png diff --git a/doc/src/JPG/lammps-gui-screen.png b/doc/src/JPG/lammps-gui-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..cae0ae9fe91023eeef74025f72f8d1092655b4fa GIT binary patch literal 369853 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

puA@4r_zo2A6(p{!sY-H~skUTSMePIJummC)rwq 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

6Hy(6}9`i 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 - Capture of images created via :doc:`dump image ` in Slide show window - Dialog to set variables, similar to the LAMMPS command-line flag '-v' / '-var' -- Support for GPU, INTEL, KOKKOS/OpenMP, OPENMAP, and OPT and accelerator packages +- Support for GPU, INTEL, KOKKOS/OpenMP, OPENMP, and OPT accelerator packages Parallelization ^^^^^^^^^^^^^^^ From 55a13efad0a7ff9dd9e162837d9cfea2e48783b8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 2 May 2025 00:30:22 -0400 Subject: [PATCH 59/94] small update --- doc/src/Tools.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index 44185cbd41..521cfe5f16 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -527,8 +527,8 @@ with CMake is required. The LAMMPS-GUI has been successfully compiled and tested on: - Ubuntu Linux 20.04LTS x86_64 using GCC 9, Qt version 5.12 -- Fedora Linux 40 x86\_64 using GCC 14 and Clang 17, Qt version 5.15LTS -- Fedora Linux 40 x86\_64 using GCC 14, Qt version 6.7 +- Fedora Linux 41 x86\_64 using GCC 14 and Clang 17, Qt version 5.15LTS +- Fedora Linux 41 x86\_64 using GCC 14, Qt version 6.8 - Apple macOS 12 (Monterey) and macOS 13 (Ventura) with Xcode on arm64 and x86\_64, Qt version 5.15LTS - Windows 10 and 11 x86_64 with Visual Studio 2022 and Visual C++ 14.36, Qt version 5.15LTS - Windows 10 and 11 x86_64 with Visual Studio 2022 and Visual C++ 14.40, Qt version 6.7 From 37221c080b73e24ee37027dcb069765a782ec36d Mon Sep 17 00:00:00 2001 From: Navraj Lalli Date: Fri, 2 May 2025 13:52:17 +0100 Subject: [PATCH 60/94] Add self-citation --- doc/src/fix_qeq_rel_reaxff.rst | 23 +++++++++++++-------- doc/src/fix_qtpie_reaxff.rst | 11 +++++----- doc/utils/sphinx-config/false_positives.txt | 3 ++- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/doc/src/fix_qeq_rel_reaxff.rst b/doc/src/fix_qeq_rel_reaxff.rst index 331fa8b489..354b53e775 100644 --- a/doc/src/fix_qeq_rel_reaxff.rst +++ b/doc/src/fix_qeq_rel_reaxff.rst @@ -37,14 +37,14 @@ Examples Description """"""""""" - -This fix implements the QEqR method for charge equilibration, which -differs from the QEq charge equilibration method :ref:`(Rappe and -Goddard) ` only in how external electric fields are accounted -for. This fix therefore raises a warning when used without :doc:`fix -efield ` since :doc:`fix qeq/reaxff ` should -be used without an external electric field. Charges are computed with .. versionadded:: 2Apr2025 + +This fix implements the QEqR method :ref:`(Lalli) ` for charge +equilibration, which differs from the QEq charge equilibration method +:ref:`(Rappe and Goddard) ` only in how external electric fields +are accounted for. This fix therefore raises a warning when used without +:doc:`fix efield ` since :doc:`fix qeq/reaxff ` +should be used without an external electric field. Charges are computed with the QEqR method by minimizing the electrostatic energy of the system in the same way as the QEq method but where the absolute electronegativity, :math:`\chi_i`, of each atom in the QEq method is replaced with an @@ -61,8 +61,9 @@ external electric field and :math:`S_{ij}` is the overlap integral between atoms :math:`i` and :math:`j`. This formulation is advantageous over the method used by :doc:`fix qeq/reaxff ` to account for an external electric field in that it permits periodic -boundaries in the direction of an external electric field and in that it -does not worsen long-range charge transfer seen with QEq. +boundaries in the direction of an external electric field and in +that it does not worsen long-range charge transfer seen with +QEq. See :ref:`Lalli ` for further details. This fix is typically used in conjunction with the ReaxFF force field model as implemented in the :doc:`pair_style reaxff ` @@ -184,6 +185,10 @@ scale = 1.0 and maxiter = 200 ---------- +.. _lalli2: + +**(Lalli)** Lalli and Giusti, Journal of Chemical Physics, 162, 174311 (2025). + .. _Rappe4: **(Rappe)** Rappe and Goddard III, Journal of Physical Chemistry, 95, diff --git a/doc/src/fix_qtpie_reaxff.rst b/doc/src/fix_qtpie_reaxff.rst index 08ae24e164..643295dba4 100644 --- a/doc/src/fix_qtpie_reaxff.rst +++ b/doc/src/fix_qtpie_reaxff.rst @@ -59,8 +59,7 @@ and atom :math:`j`. The effect of an external electric field can be incorporated into the QTPIE method by modifying the absolute or effective electronegativities of each atom :ref:`(Chen) `. This fix models the effect of an external -electric field by using the effective electronegativity given in -:ref:`(Gergs) `: +electric field by using the effective electronegativity :ref:`(Lalli) ` .. math:: \tilde{\chi}_{\mathrm{r}i} = \frac{\sum_{j=1}^{N} (\chi_i - \chi_j + \beta(\phi_i - \phi_j)) S_{ij}} @@ -68,7 +67,8 @@ electric field by using the effective electronegativity given in where :math:`\beta` is a scaling factor and :math:`\phi_i` and :math:`\phi_j` are the electric potentials at the positions of atoms :math:`i` and :math:`j` -due to the external electric field. +due to the external electric field. Additional details regarding the +implementation and performance of this fix are provided in :ref:`Lalli `. This fix is typically used in conjunction with the ReaxFF force field model as implemented in the :doc:`pair_style reaxff ` @@ -206,10 +206,9 @@ scale = 1.0 and maxiter = 200 **(Chen)** Chen, Jiahao. Theory and applications of fluctuating-charge models. University of Illinois at Urbana-Champaign, 2009. -.. _Gergs: +.. _lalli: -**(Gergs)** Gergs, Dirkmann and Mussenbrock. -Journal of Applied Physics 123.24 (2018). +**(Lalli)** Lalli and Giusti, Journal of Chemical Physics, 162, 174311 (2025). .. _qeq-Aktulga2: diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 577d2c23de..52bfce5c24 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1320,7 +1320,6 @@ Geocomputing georg Georg Geotechnica -Gergs germain Germann Germano @@ -1348,6 +1347,7 @@ Gillan Gingold Gissinger github +Giusti gjf gjwagne gl @@ -1914,6 +1914,7 @@ Lachet Lackmann Ladd lagrangian +Lalli lambdai LambdaLanczos Lambrecht From 3fafec9cba5734dc0212a394addfcb92804dfa84 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 2 May 2025 16:02:42 -0400 Subject: [PATCH 61/94] do not try to suppress nvcc warning with LLVM based compilers. those fail when configuring MPI. --- cmake/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 04ec037184..a639c1d993 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -131,7 +131,9 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "NVHPC") OR (CMAKE_CXX_COMPILER_ID STREQUAL " endif() # silence nvcc warnings -if((PKG_KOKKOS) AND (Kokkos_ENABLE_CUDA) AND NOT (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) +if((PKG_KOKKOS) AND (Kokkos_ENABLE_CUDA) AND NOT + ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM") + OR (CMAKE_CXX_COMPILER_ID STREQUAL "XLClang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "CrayClang"))) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xcudafe --diag_suppress=unrecognized_pragma,--diag_suppress=128") endif() From 7ec7745640d9f14e2ddb08a422b1bef912a44fca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 May 2025 05:21:18 -0400 Subject: [PATCH 62/94] make neighbor list settings, status, and bond/angle/dihedral/improper lists available to library interface --- src/library.cpp | 77 +++++++++++++++++++ src/neighbor.cpp | 2 +- .../c-library/test_library_properties.cpp | 39 +++++++++- 3 files changed, 116 insertions(+), 2 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 1e4243c59d..ad2699b41c 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1255,6 +1255,7 @@ be called without a valid LAMMPS object handle (it is ignored). * :ref:`Image masks ` * :ref:`System status ` * :ref:`System sizes ` +* :ref:`Neigbor list settings ` * :ref:`Atom style flags ` .. _extract_integer_sizes: @@ -1395,6 +1396,31 @@ internally by the :doc:`Fortran interface ` and are not likely to be us * - nbodies - number of atoms that have body data (see :doc:`the Body particle HowTo `) +.. _extract_neighbor_settings: + +**Neigbor list settings** + +.. list-table:: + :header-rows: 1 + :widths: 17 83 + + * - neigh_every + - neighbor lists are rebuild every this many steps + * - neigh_delay + - neighbor lists are rebuild delayed this many steps + * - neigh_dist_check + - 0 if always rebuild, 1 rebuild after 1/2 skin + * - neigh_ago + - neighbor lists were rebuilt this many steps ago + * - nbondlist + - number of entries in bondlist (get list with :ref:`lammps_extract_global() `) + * - nanglelist + - number of entries in anglelist (get list with :ref:`lammps_extract_global() `) + * - ndihedrallist + - number of entries in dihedrallist (get list with :ref:`lammps_extract_global() `) + * - nimproperlist + - number of entries in improperlist (get list with :ref:`lammps_extract_global() `) + .. _extract_atom_flags: **Atom style flags** @@ -1484,6 +1510,15 @@ int lammps_extract_setting(void *handle, const char *keyword) if (strcmp(keyword,"ntris") == 0) return lmp->atom->ntris; if (strcmp(keyword,"nbodies") == 0) return lmp->atom->nbodies; + if (strcmp(keyword,"neigh_every") == 0) return lmp->neighbor->every; + if (strcmp(keyword,"neigh_delay") == 0) return lmp->neighbor->delay; + if (strcmp(keyword,"neigh_dist_check") == 0) return lmp->neighbor->dist_check; + if (strcmp(keyword,"neigh_ago") == 0) return lmp->neighbor->ago; + if (strcmp(keyword,"nbondlist") == 0) return lmp->neighbor->nbondlist; + if (strcmp(keyword,"nanglelist") == 0) return lmp->neighbor->nanglelist; + if (strcmp(keyword,"ndihedrallist") == 0) return lmp->neighbor->ndihedrallist; + if (strcmp(keyword,"nimproperlist") == 0) return lmp->neighbor->nimproperlist; + if (strcmp(keyword,"molecule_flag") == 0) return lmp->atom->molecule_flag; if (strcmp(keyword,"q_flag") == 0) return lmp->atom->q_flag; if (strcmp(keyword,"mu_flag") == 0) return lmp->atom->mu_flag; @@ -1567,6 +1602,11 @@ int lammps_extract_global_datatype(void * /*handle*/, const char *name) if (strcmp(name,"special_lj") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"special_coul") == 0) return LAMMPS_DOUBLE; + if (strcmp(name,"neigh_bondlist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"neigh_anglelist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"neigh_dihedrallist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"neigh_improperlist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"map_style") == 0) return LAMMPS_INT; #if defined(LAMMPS_BIGBIG) if (strcmp(name,"map_tag_max") == 0) return LAMMPS_BIGINT; @@ -1651,6 +1691,7 @@ report the "native" data type. The following tables are provided: * :ref:`Timestep settings ` * :ref:`Simulation box settings ` * :ref:`System property settings ` +* :ref:`Neighbor topology data ` * :ref:`Git revision and version settings ` * :ref:`Unit settings ` @@ -1897,6 +1938,37 @@ report the "native" data type. The following tables are provided: - 1 - string with the current KSpace style. +.. _extract_neighbor_lists: + +**Neighbor topology data** + +Get length of lists with :ref:`lammps_extract_setting() `. + +.. list-table:: + :header-rows: 1 + :widths: 20 12 16 52 + + * - Name + - Type + - Length + - Description + * - neigh_bondlist + - 2d int + - nbondlist + - list of bonds (atom1, atom2, type) + * - neigh_anglelist + - 2d int + - nanglelist + - list of angles (atom1, atom2, atom3, type) + * - neigh_dihedrallist + - 2d int + - ndihedrallist + - list of dihedrals (atom1, atom2, atom3, atom4, type) + * - neigh_improperlist + - 2d int + - nimproperlist + - list of impropers (atom1, atom2, atom3, atom4, type) + .. _extract_git_settings: **Git revision and version settings** @@ -2107,6 +2179,11 @@ void *lammps_extract_global(void *handle, const char *name) if (strcmp(name,"q_flag") == 0) return (void *) &lmp->atom->q_flag; + if (strcmp(name,"neigh_bondlist") == 0) return lmp->neighbor->bondlist; + if (strcmp(name,"neigh_anglelist") == 0) return lmp->neighbor->anglelist; + if (strcmp(name,"neigh_dihedrallist") == 0) return lmp->neighbor->dihedrallist; + if (strcmp(name,"neigh_improperlist") == 0) return lmp->neighbor->improperlist; + if (strcmp(name,"map_style") == 0) return (void *) &lmp->atom->map_style; if (strcmp(name,"map_tag_max") == 0) return (void *) &lmp->atom->map_tag_max; if (strcmp(name,"sametag") == 0) return (void *) lmp->atom->sametag; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index a2aa3f411b..fcedfd7613 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -188,8 +188,8 @@ pairclass(nullptr), pairnames(nullptr), pairmasks(nullptr) // topology lists + nbondlist = nanglelist = ndihedrallist = nimproperlist = 0; bondwhich = anglewhich = dihedralwhich = improperwhich = NONE; - neigh_bond = nullptr; neigh_angle = nullptr; neigh_dihedral = nullptr; diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index 3878b13774..e2149d98e6 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -303,6 +303,15 @@ TEST_F(LibraryProperties, setting) EXPECT_EQ(lammps_extract_setting(lmp, "ndihedraltypes"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "nimpropertypes"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_every"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_delay"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_dist_check"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_ago"), -1); + EXPECT_EQ(lammps_extract_setting(lmp, "nbondlist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "nanglelist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "ndihedrallist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "nimproperlist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "molecule_flag"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "q_flag"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "mu_flag"), 0); @@ -313,7 +322,7 @@ TEST_F(LibraryProperties, setting) std::string input = path_join(INPUT_DIR, "in.fourmol"); if (!verbose) ::testing::internal::CaptureStdout(); lammps_file(lmp, input.c_str()); - lammps_command(lmp, "run 2 post no"); + lammps_command(lmp, "run 3 post no"); if (!verbose) ::testing::internal::GetCapturedStdout(); EXPECT_EQ(lammps_extract_setting(lmp, "triclinic"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "box_exist"), 1); @@ -328,6 +337,15 @@ TEST_F(LibraryProperties, setting) EXPECT_EQ(lammps_extract_setting(lmp, "ndihedraltypes"), 5); EXPECT_EQ(lammps_extract_setting(lmp, "nimpropertypes"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_every"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_delay"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_dist_check"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_ago"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "nbondlist"), 24); + EXPECT_EQ(lammps_extract_setting(lmp, "nanglelist"), 30); + EXPECT_EQ(lammps_extract_setting(lmp, "ndihedrallist"), 31); + EXPECT_EQ(lammps_extract_setting(lmp, "nimproperlist"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "molecule_flag"), 1); EXPECT_EQ(lammps_extract_setting(lmp, "q_flag"), 1); EXPECT_EQ(lammps_extract_setting(lmp, "mu_flag"), 0); @@ -584,17 +602,36 @@ TEST_F(LibraryProperties, neighlist) EXPECT_DOUBLE_EQ(minval, 1.0); EXPECT_DOUBLE_EQ(maxval, 2.1); + char errbuf[128]; + lammps_set_show_error(lmp, 0); const int nlocal = lammps_extract_setting(lmp, "nlocal"); EXPECT_EQ(nlocal, numatoms); EXPECT_NE(lammps_find_pair_neighlist(lmp, "sw", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_pair_neighlist(lmp, "morse", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_pair_neighlist(lmp, "lj/cut", 1, 1, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_pair_neighlist(lmp, "lj/cut", 1, 2, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_EQ(lammps_find_pair_neighlist(lmp, "lj/cut", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 1); + EXPECT_EQ(lammps_get_last_error_message(lmp, errbuf, 128), 1); + errbuf[69] = '\0'; + EXPECT_THAT(std::string(errbuf), + StrEq("ERROR: lammps_find_pair_neighlist(): Pair style lj/cut does not exist")); EXPECT_EQ(lammps_find_pair_neighlist(lmp, "hybrid/overlay", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_compute_neighlist(lmp, "dist", 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_EQ(lammps_find_fix_neighlist(lmp, "dist", 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_EQ(lammps_find_compute_neighlist(lmp, "xxx", 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 1); + EXPECT_EQ(lammps_get_last_error_message(lmp, errbuf, 128), 1); + errbuf[66] = '\0'; + EXPECT_THAT(std::string(errbuf), + StrEq("ERROR: lammps_find_compute_neighlist(): Compute xxx does not exist")); // full neighbor list for 4 type 1 atoms // all have 3 type 1 atom neighbors From 0d7e07b9bea073ccec98712d23627237b78e8b53 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 May 2025 06:25:22 -0400 Subject: [PATCH 63/94] export bond topology related per-atom data via library interface --- src/atom.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++-- src/library.cpp | 31 +++++++++++++++++++------- 2 files changed, 80 insertions(+), 10 deletions(-) diff --git a/src/atom.cpp b/src/atom.cpp index 0e0b1350ac..ac9ebb1634 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -2874,6 +2874,8 @@ void Atom::remove_custom(int index, int flag, int cols) } } +// TODO: complete list of exported properties. + /** Provide access to internal data of the Atom class by keyword * \verbatim embed:rst @@ -3035,7 +3037,6 @@ void *Atom::extract(const char *name) if (strcmp(name,"x") == 0) return (void *) x; if (strcmp(name,"v") == 0) return (void *) v; if (strcmp(name,"f") == 0) return (void *) f; - if (strcmp(name,"molecule") == 0) return (void *) molecule; if (strcmp(name,"q") == 0) return (void *) q; if (strcmp(name,"mu") == 0) return (void *) mu; if (strcmp(name,"omega") == 0) return (void *) omega; @@ -3051,6 +3052,33 @@ void *Atom::extract(const char *name) if (strcmp(name,"temperature") == 0) return (void *) temperature; if (strcmp(name,"heatflow") == 0) return (void *) heatflow; + // MOLECULE PACKAGE + + if (strcmp(name,"molecule") == 0) return (void *) molecule; + if (strcmp(name,"molindex") == 0) return (void *) molindex; + if (strcmp(name,"nspecial") == 0) return (void *) nspecial; + if (strcmp(name,"special") == 0) return (void *) special; + if (strcmp(name,"num_bond") == 0) return (void *) num_bond; + if (strcmp(name,"bond_type") == 0) return (void *) bond_type; + if (strcmp(name,"bond_atom") == 0) return (void *) bond_atom; + if (strcmp(name,"num_angle") == 0) return (void *) num_angle; + if (strcmp(name,"angle_type") == 0) return (void *) angle_type; + if (strcmp(name,"angle_atom1") == 0) return (void *) angle_atom1; + if (strcmp(name,"angle_atom2") == 0) return (void *) angle_atom2; + if (strcmp(name,"angle_atom3") == 0) return (void *) angle_atom3; + if (strcmp(name,"num_dihedral") == 0) return (void *) num_dihedral; + if (strcmp(name,"dihedral_type") == 0) return (void *) dihedral_type; + if (strcmp(name,"dihedral_atom1") == 0) return (void *) dihedral_atom1; + if (strcmp(name,"dihedral_atom2") == 0) return (void *) dihedral_atom2; + if (strcmp(name,"dihedral_atom3") == 0) return (void *) dihedral_atom3; + if (strcmp(name,"dihedral_atom4") == 0) return (void *) dihedral_atom4; + if (strcmp(name,"num_improper") == 0) return (void *) num_improper; + if (strcmp(name,"improper_type") == 0) return (void *) improper_type; + if (strcmp(name,"improper_atom1") == 0) return (void *) improper_atom1; + if (strcmp(name,"improper_atom2") == 0) return (void *) improper_atom2; + if (strcmp(name,"improper_atom3") == 0) return (void *) improper_atom3; + if (strcmp(name,"improper_atom4") == 0) return (void *) improper_atom4; + // PERI PACKAGE if (strcmp(name,"vfrac") == 0) return (void *) vfrac; @@ -3172,7 +3200,6 @@ int Atom::extract_datatype(const char *name) if (strcmp(name,"x") == 0) return LAMMPS_DOUBLE_2D; if (strcmp(name,"v") == 0) return LAMMPS_DOUBLE_2D; if (strcmp(name,"f") == 0) return LAMMPS_DOUBLE_2D; - if (strcmp(name,"molecule") == 0) return LAMMPS_TAGINT; if (strcmp(name,"q") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"mu") == 0) return LAMMPS_DOUBLE_2D; if (strcmp(name,"omega") == 0) return LAMMPS_DOUBLE_2D; @@ -3188,6 +3215,34 @@ int Atom::extract_datatype(const char *name) if (strcmp(name,"temperature") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"heatflow") == 0) return LAMMPS_DOUBLE; + // MOLECULE package + + if (strcmp(name,"molecule") == 0) return LAMMPS_TAGINT; + if (strcmp(name,"molindex") == 0) return LAMMPS_INT; + if (strcmp(name,"molatom") == 0) return LAMMPS_INT; + if (strcmp(name,"nspecial") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"special") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"num_bond") == 0) return LAMMPS_INT; + if (strcmp(name,"bond_type") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"bond_atom") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"num_angle") == 0) return LAMMPS_INT; + if (strcmp(name,"angle_type") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"angle_atom1") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"angle_atom2") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"angle_atom3") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"num_dihedral") == 0) return LAMMPS_INT; + if (strcmp(name,"dihedral_type") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"dihedral_atom1") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"dihedral_atom2") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"dihedral_atom3") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"dihedral_atom4") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"num_improper") == 0) return LAMMPS_INT; + if (strcmp(name,"improper_type") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"improper_atom1") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"improper_atom2") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"improper_atom3") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"improper_atom4") == 0) return LAMMPS_TAGINT_2D; + // PERI package (and in part MACHDYN) if (strcmp(name,"vfrac") == 0) return LAMMPS_DOUBLE; diff --git a/src/library.cpp b/src/library.cpp index ad2699b41c..527838f07a 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1387,6 +1387,16 @@ internally by the :doc:`Fortran interface ` and are not likely to be us - number of dihedral types * - nimpropertypes - number of improper types + * - bond_per_atom + - size of per-atom bond data arrays + * - angle_per_atom + - size of per-atom angle data arrays + * - dihedral_per_atom + - size of per-atom dihedral data arrays + * - improper_per_atom + - size of per-atom improper data arrays + * - maxspecial + - size of per-atom special data array * - nellipsoids - number of atoms that have ellipsoid data * - nlines @@ -1505,6 +1515,11 @@ int lammps_extract_setting(void *handle, const char *keyword) if (strcmp(keyword,"nangletypes") == 0) return lmp->atom->nangletypes; if (strcmp(keyword,"ndihedraltypes") == 0) return lmp->atom->ndihedraltypes; if (strcmp(keyword,"nimpropertypes") == 0) return lmp->atom->nimpropertypes; + if (strcmp(keyword,"bond_per_atom") == 0) return lmp->atom->bond_per_atom; + if (strcmp(keyword,"angle_per_atom") == 0) return lmp->atom->angle_per_atom; + if (strcmp(keyword,"dihedral_per_atom") == 0) return lmp->atom->dihedral_per_atom; + if (strcmp(keyword,"improper_per_atom") == 0) return lmp->atom->improper_per_atom; + if (strcmp(keyword,"maxspecial") == 0) return lmp->atom->maxspecial; if (strcmp(keyword,"nellipsoids") == 0) return lmp->atom->nellipsoids; if (strcmp(keyword,"nlines") == 0) return lmp->atom->nlines; if (strcmp(keyword,"ntris") == 0) return lmp->atom->ntris; @@ -1841,10 +1856,10 @@ report the "native" data type. The following tables are provided: - Type - Length - Description - * - ntypes - - int + * - natoms + - bigint - 1 - - number of atom types + - total number of atoms in the simulation. * - nbonds - bigint - 1 @@ -1861,10 +1876,6 @@ report the "native" data type. The following tables are provided: - bigint - 1 - total number of impropers in the simulation. - * - natoms - - bigint - - 1 - - total number of atoms in the simulation. * - nlocal - int - 1 @@ -1877,6 +1888,10 @@ report the "native" data type. The following tables are provided: - int - 1 - maximum of nlocal+nghost across all MPI ranks (for per-atom data array size). + * - ntypes + - int + - 1 + - number of atom types * - special_lj - double - 4 @@ -2166,7 +2181,6 @@ void *lammps_extract_global(void *handle, const char *name) return (void *) &lmp->comm->procgrid; if (strcmp(name,"natoms") == 0) return (void *) &lmp->atom->natoms; - if (strcmp(name,"ntypes") == 0) return (void *) &lmp->atom->ntypes; if (strcmp(name,"nbonds") == 0) return (void *) &lmp->atom->nbonds; if (strcmp(name,"nangles") == 0) return (void *) &lmp->atom->nangles; if (strcmp(name,"ndihedrals") == 0) return (void *) &lmp->atom->ndihedrals; @@ -2174,6 +2188,7 @@ void *lammps_extract_global(void *handle, const char *name) if (strcmp(name,"nlocal") == 0) return (void *) &lmp->atom->nlocal; if (strcmp(name,"nghost") == 0) return (void *) &lmp->atom->nghost; if (strcmp(name,"nmax") == 0) return (void *) &lmp->atom->nmax; + if (strcmp(name,"ntypes") == 0) return (void *) &lmp->atom->ntypes; if (strcmp(name,"special_lj") == 0) return (void *) lmp->force->special_lj; if (strcmp(name,"special_coul") == 0) return (void *) lmp->force->special_coul; From afcb97aaf2b3f65fa144af46171b01d43d13251f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 May 2025 20:22:00 -0400 Subject: [PATCH 64/94] address spelling issues --- doc/src/pair_granular.rst | 8 ++++---- doc/utils/sphinx-config/false_positives.txt | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 7998f11cc5..4d8753a7a1 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -421,8 +421,8 @@ by specifying different integer values for the :math:`d_{type}` input parameter. damping option is only compatible with the normal *mdr* contact model. Setting :math:`d_{type} = 1` is the suggested damping option. This specifies a damping -model that takes into account the contact stiffness :math:`k_{mdr}` calulated -by the normal *mdr* contact model to determine the damping coefficent: +model that takes into account the contact stiffness :math:`k_{mdr}` calculated +by the normal *mdr* contact model to determine the damping coefficient: .. math:: @@ -435,8 +435,8 @@ normal *mdr* contact model: k_{mdr} = 2 E_{eff} a_{mdr}. -In this case, :math:`\eta_{n0}` is simply a dimensionless coefficent that scales the -the overall damping coefficent. +In this case, :math:`\eta_{n0}` is simply a dimensionless coefficient that scales the +the overall damping coefficient. The other supported option is :math:`d_{type} = 2`, which defines a simple damping model similar to the *velocity* option diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index d9ef3edc52..40b6119399 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -110,6 +110,7 @@ Andrienko Andzelm Ang anglegrad +anglelist angleoffset angletangrad angmom @@ -347,6 +348,7 @@ Bomont BondAngle BondBond bondchk +bondlist bondmax bondscreened bondscreenedspin @@ -819,6 +821,7 @@ diffusively diffusivities diffusivity dihedral +dihedrallist dihedrals Dihedrals dihydride @@ -1609,6 +1612,7 @@ imagename imd Impey impl +improperlist impropers Impropers imulator @@ -2478,6 +2482,7 @@ namespaces nan NaN Nandor +nanglelist nangles Nangletype nangletypes @@ -2514,6 +2519,7 @@ nbodies nbody Nbody nbond +nbondlist nbonds nbondtype Nbondtype @@ -2535,6 +2541,7 @@ ncount nd ndactrung ndescriptors +ndihedrallist ndihedrals Ndihedraltype ndihedraltypes @@ -2592,6 +2599,7 @@ NiAlH Nicklas Niklasson Nikolskiy +nimproperlist nimpropers Nimpropertype nimpropertypes From 2d220920788e0bb6608ad4ff70b0d05a7265cbb8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 May 2025 12:00:55 -0400 Subject: [PATCH 65/94] additional info for pair style lj/smooth from Aidan --- doc/src/pair_lj_smooth.rst | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/doc/src/pair_lj_smooth.rst b/doc/src/pair_lj_smooth.rst index 4799ca3277..2bd4b551fc 100644 --- a/doc/src/pair_lj_smooth.rst +++ b/doc/src/pair_lj_smooth.rst @@ -48,13 +48,19 @@ At the inner cutoff the force and its first derivative will match the non-smoothed LJ formula. At the outer cutoff the force and its first derivative will be 0.0. The inner cutoff cannot be 0.0. +Explicit expressions for the coefficients C1, C2, C3, C4, as well as the +energy discontinuity at the cutoff can be found here :ref:`(Leoni_1) ` +and here :ref:`(Leoni_2) ` + .. note:: this force smoothing causes the energy to be discontinuous both in its values and first derivative. This can lead to poor energy - conservation and may require the use of a thermostat. Plot the energy - and force resulting from this formula via the - :doc:`pair_write ` command to see the effect. + conservation and may require the use of a thermostat. The energy + value discontinuity can be eliminated by shifting the potential + energy to be zero at the outer cuttoff using the pair_modify shift + option. With or without shifting, you can plot the resulting energy + and force via the :doc:`pair_write ` command to see the effect. The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples @@ -122,3 +128,14 @@ Default """"""" none + +---------- + +.. _Leoni_1: + +**(Leoni_1)** F. Leoni et al., Phys Rev Lett, 134, 128201 (2025). + +.. _Leoni_2: + +**(Leoni_2)** F. Leoni et al., Phys Rev Lett, 134, Supplementary Material (2025). + From 48df0448df6517ae2ed5c411b88a16061ab0cce7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 May 2025 12:05:12 -0400 Subject: [PATCH 66/94] spelling --- doc/src/pair_lj_smooth.rst | 2 +- doc/utils/sphinx-config/false_positives.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/src/pair_lj_smooth.rst b/doc/src/pair_lj_smooth.rst index 2bd4b551fc..d6b266d932 100644 --- a/doc/src/pair_lj_smooth.rst +++ b/doc/src/pair_lj_smooth.rst @@ -58,7 +58,7 @@ and here :ref:`(Leoni_2) ` in its values and first derivative. This can lead to poor energy conservation and may require the use of a thermostat. The energy value discontinuity can be eliminated by shifting the potential - energy to be zero at the outer cuttoff using the pair_modify shift + energy to be zero at the outer cutoff using the pair_modify shift option. With or without shifting, you can plot the resulting energy and force via the :doc:`pair_write ` command to see the effect. diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 40b6119399..4bd99e4c80 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1984,6 +1984,7 @@ lennard Lennard Lenosky Lenz +Leoni Lett Leuven Leven From 615dd589dd60010f476824a41635ef5d77d38fc7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 May 2025 15:21:06 -0400 Subject: [PATCH 67/94] replace slow pow() function with faster and more accurate alternatives --- src/GRANULAR/fix_add_heat.cpp | 4 ++- src/GRANULAR/fix_granular_mdr.cpp | 4 ++- src/GRANULAR/gran_sub_mod_normal.cpp | 38 +++++++++++++++------------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/GRANULAR/fix_add_heat.cpp b/src/GRANULAR/fix_add_heat.cpp index 73bf8a9a26..330723700b 100644 --- a/src/GRANULAR/fix_add_heat.cpp +++ b/src/GRANULAR/fix_add_heat.cpp @@ -20,11 +20,13 @@ #include "atom.h" #include "error.h" #include "input.h" +#include "math_special.h" #include "memory.h" #include "variable.h" using namespace LAMMPS_NS; using namespace FixConst; +using MathSpecial::powint; enum { CONSTANT, EQUAL, ATOM }; enum { ADD, LINEAR, QUARTIC }; @@ -152,7 +154,7 @@ void FixAddHeat::post_force(int /*vflag*/) } else if (style == LINEAR) { heatflow[i] += prefactor * (vtmp - temperature[i]); } else if (style == QUARTIC) { - heatflow[i] += prefactor * (pow(vtmp, 4.0) - pow(temperature[i], 4.0)); + heatflow[i] += prefactor * (powint(vtmp, 4) - powint(temperature[i], 4)); } } } diff --git a/src/GRANULAR/fix_granular_mdr.cpp b/src/GRANULAR/fix_granular_mdr.cpp index fcdc3b2b17..0416edc432 100644 --- a/src/GRANULAR/fix_granular_mdr.cpp +++ b/src/GRANULAR/fix_granular_mdr.cpp @@ -29,6 +29,7 @@ #include "granular_model.h" #include "input.h" #include "math_const.h" +#include "math_special.h" #include "memory.h" #include "modify.h" #include "neigh_list.h" @@ -43,6 +44,7 @@ using namespace Granular_NS; using namespace Granular_MDR_NS; using namespace FixConst; using MathConst::MY_PI; +using MathSpecial::cube; static constexpr double EPSILON = 1e-16; static constexpr double OVERLAP_LIMIT = 0.95; @@ -244,7 +246,7 @@ void FixGranularMDR::pre_force(int) const double R = radius[i]; const double Rsq = R * R; - const double Vo = 4.0 / 3.0 * MY_PI * pow(Ro[i], 3.0); + const double Vo = 4.0 / 3.0 * MY_PI * cube(Ro[i]); const double Vgeoi = 4.0 / 3.0 * MY_PI * Rsq * R - Vcaps[i]; Vgeo[i] = MIN(Vgeoi, Vo); diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index b0f04cfa40..a4e2aecdc4 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -19,16 +19,18 @@ #include "fix_granular_mdr.h" #include "granular_model.h" #include "math_const.h" +#include "math_special.h" #include "modify.h" #include "update.h" #include -#include -#include using namespace LAMMPS_NS; using namespace Granular_NS; using namespace MathConst; +using MathSpecial::square; +using MathSpecial::cube; +using MathSpecial::powint; static constexpr double PISQ = 9.8696044010893579923; // PI^2 static constexpr double PIINV = 0.318309886183790691216; // 1/PI @@ -485,7 +487,7 @@ void GranSubModNormalMDR::coeffs_to_local() G = Emod / (2.0 * (1.0 + poiss)); // shear modulus kappa = Emod / (3.0 * (1.0 - 2.0 * poiss)); // bulk modulus - Eeff = Emod / (1.0 - pow(poiss, 2.0)); // composite plane strain modulus + Eeff = Emod / (1.0 - square(poiss)); // composite plane strain modulus // precomputing factors @@ -720,7 +722,7 @@ double GranSubModNormalMDR::calculate_forces() if (history_update && phertz > pY) { *Yflag_offset = 1.0; *deltaY_offset = delta_MDR; - *cA_offset = MY_PI * (pow(*deltaY_offset, 2) - *deltaY_offset * R); + *cA_offset = MY_PI * (square(*deltaY_offset) - *deltaY_offset * R); } } @@ -742,7 +744,7 @@ double GranSubModNormalMDR::calculate_forces() amax = sqrt(deltamax_MDR * R); } else { // plastic contact - amax = sqrt(2.0 * deltamax_MDR * R - pow(deltamax_MDR, 2) + cA * PIINV); + amax = sqrt(2.0 * deltamax_MDR * R - square(deltamax_MDR) + cA * PIINV); amaxsq = amax * amax; A = 4.0 * pY * Eeffinv * amax; Ainv = 1.0 / A; @@ -753,13 +755,13 @@ double GranSubModNormalMDR::calculate_forces() // force caused by full submersion of elliptical indenter to depth of A/2 double Fmax = Eeff * (A * B * 0.25) * acos(1 - 2 * deltae1Dmax * Ainv); - Fmax -= (2 - 4 * deltae1Dmax * Ainv) * sqrt(deltae1Dmax * Ainv - pow(deltae1Dmax * Ainv, 2)); + Fmax -= (2 - 4 * deltae1Dmax * Ainv) * sqrt(deltae1Dmax * Ainv - square(deltae1Dmax * Ainv)); // depth of particle center const double zR = R - (deltamax_MDR - deltae1Dmax); - deltaR = 2 * amaxsq * (-1 + poiss) - (-1 + 2 * poiss) * zR * (-zR + sqrt(amaxsq + pow(zR, 2))); - deltaR *= Fmax / (MY_2PI * amaxsq * G * sqrt(amaxsq + pow(zR, 2))); + deltaR = 2 * amaxsq * (-1 + poiss) - (-1 + 2 * poiss) * zR * (-zR + sqrt(amaxsq + square(zR))); + deltaR *= Fmax / (MY_2PI * amaxsq * G * sqrt(amaxsq + square(zR))); // transformed elastic displacement deltae1D = (delta_MDR - deltamax_MDR + deltae1Dmax + deltaR) / (1 + deltaR / deltae1Dmax); @@ -816,11 +818,11 @@ double GranSubModNormalMDR::calculate_forces() } else { // case 2+3, tensile springs const double lmax = sqrt(MY_2PI * aAdh * gamma * Eeffinv); - g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - pow(aAdh, 2)); + g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - square(aAdh)); g_aAdh = round_up_negative_epsilon(g_aAdh); double tmp = 27 * A4 * B4 * gamma * Eeffinv; - tmp -= 2 * pow(B, 6) * gamma3 * PISQ * pow(Eeffinv, 3); + tmp -= 2 * powint(B, 6) * gamma3 * PISQ * cube(Eeffinv); tmp += sqrt(27) * Asq * B4 * sqrt(27 * A4 * Eeffsq * gammasq - 4 * Bsq * gamma4 * PISQ) * Eeffsqinv; tmp = cbrt(tmp); @@ -848,12 +850,12 @@ double GranSubModNormalMDR::calculate_forces() double aAdh_tmp = aAdh; double fa, fa2, fa_tmp, dfda; for (int lv1 = 0; lv1 < MDR_MAX_IT; ++lv1) { - fa_tmp = deltae1D - A * 0.5 + A * sqrt(Bsq * 0.25 - pow(aAdh_tmp, 2)) * Binv; + fa_tmp = deltae1D - A * 0.5 + A * sqrt(Bsq * 0.25 - square(aAdh_tmp)) * Binv; fa = fa_tmp + sqrt(MY_2PI * aAdh_tmp * gamma * Eeffinv); if (abs(fa) < MDR_EPSILON1) { break; } - dfda = -aAdh_tmp * A / (B * sqrt(-pow(aAdh_tmp, 2) + Bsq * 0.25)); + dfda = -aAdh_tmp * A / (B * sqrt(-square(aAdh_tmp) + Bsq * 0.25)); dfda += gamma * SQRTHALFPI / sqrt(aAdh_tmp * gamma * Eeff); aAdh_tmp = aAdh_tmp - fa / dfda; fa2 = fa_tmp + sqrt(MY_2PI * aAdh_tmp * gamma * Eeffinv); @@ -870,7 +872,7 @@ double GranSubModNormalMDR::calculate_forces() aAdh = 0.0; F_MDR = 0.0; } else { - g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - pow(aAdh, 2)); + g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - square(aAdh)); g_aAdh = round_up_negative_epsilon(g_aAdh); const double deltaeAdh = g_aAdh; @@ -893,7 +895,7 @@ double GranSubModNormalMDR::calculate_forces() // area related calculations double Ac; - (*Yflag_offset == 0.0) ? Ac = MY_PI * delta * R : Ac = MY_PI * (2.0 * delta * R - pow(delta, 2)) + cA; + (*Yflag_offset == 0.0) ? Ac = MY_PI * delta * R : Ac = MY_PI * (2.0 * delta * R - square(delta)) + cA; if (Ac < 0.0) Ac = 0.0; if (history_update) { Atot_sum[i] += wij * (Ac - MY_2PI * R * (deltamax_MDR + delta_BULK)); @@ -916,7 +918,7 @@ double GranSubModNormalMDR::calculate_forces() *Ac_offset = wij * Ac; // radius update scheme quantity calculation - Vcaps[i] += MY_PI * THIRD * pow(delta, 2) * (3.0 * R - delta); + Vcaps[i] += MY_PI * THIRD * square(delta) * (3.0 * R - delta); } const double Fntmp = wij * (F_MDR + F_BULK); @@ -930,9 +932,9 @@ double GranSubModNormalMDR::calculate_forces() if (history_update) eps_bar[i] += eps_bar_contact; if (history_update && delta_MDR == deltamax_MDR && *Yflag_offset > 0.0 && F_MDR > 0.0) { - const double Vo = FOURTHIRDS * MY_PI * pow(Ro, 3); + const double Vo = FOURTHIRDS * MY_PI * cube(Ro); dRnumerator[i] -= Vo * (eps_bar_contact - *eps_bar_offset); - dRnumerator[i] -= wij * MY_PI * ddeltao * (2 * deltao * Ro - pow(deltao, 2) + pow(R, 2) - pow(Ro, 2)); + dRnumerator[i] -= wij * MY_PI * ddeltao * (2 * deltao * Ro - square(deltao) + square(R) - square(Ro)); dRdenominator[i] += wij * 2.0 * MY_PI * R * (deltao + R - Ro); } @@ -982,7 +984,7 @@ double GranSubModNormalMDR::calculate_forces() double GranSubModNormalMDR::calculate_nonadhesive_mdr_force(double delta, double Ainv, double Eeff, double A, double B) { double F_na = acos(1.0 - 2.0 * delta * Ainv); - F_na -= (2 - 4 * delta * Ainv) * sqrt(delta * Ainv - pow(delta * Ainv, 2)); + F_na -= (2 - 4 * delta * Ainv) * sqrt(delta * Ainv - square(delta * Ainv)); F_na *= 0.25 * Eeff * A * B; return F_na; From 7c2c9ea286fac13af364534dcb242fcaff3ca380 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 May 2025 02:00:40 -0400 Subject: [PATCH 68/94] add missing versionadded tag --- doc/src/fix_gjf.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/src/fix_gjf.rst b/doc/src/fix_gjf.rst index f55a811ab7..82d283db34 100644 --- a/doc/src/fix_gjf.rst +++ b/doc/src/fix_gjf.rst @@ -39,10 +39,11 @@ Examples Description """"""""""" +.. versionadded:: TBD Apply a Langevin thermostat as described in :ref:`(Gronbech-Jensen-2020) ` to a group of atoms which models an interaction with a background -implicit solvent. As described in the papers cited below, the GJ methods +implicit solvent. As described in the papers cited below, the GJ methods provide exact diffusion, drift, and Boltzmann sampling for linear systems for any time step within the stability limit. The purpose of this set of methods is therefore to significantly improve statistical accuracy at longer time steps From 45944c4dc9d9a20a540d12527d176415bd9e45a4 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Mon, 5 May 2025 11:50:59 -0600 Subject: [PATCH 69/94] Fixing passed arg from type to index --- src/RHEO/fix_rheo_pressure.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/RHEO/fix_rheo_pressure.cpp b/src/RHEO/fix_rheo_pressure.cpp index 121473f7e3..6088c44348 100644 --- a/src/RHEO/fix_rheo_pressure.cpp +++ b/src/RHEO/fix_rheo_pressure.cpp @@ -191,14 +191,13 @@ void FixRHEOPressure::setup_pre_force(int /*vflag*/) void FixRHEOPressure::pre_force(int /*vflag*/) { int *mask = atom->mask; - int *type = atom->type; double *rho = atom->rho; double *pressure = atom->pressure; int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) pressure[i] = calc_pressure(rho[i], type[i]); + if (mask[i] & groupbit) pressure[i] = calc_pressure(rho[i], i); if (comm_forward) comm->forward_comm(this); } From 38dffe228398d891b7b040961576f09deb8756a1 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Mon, 5 May 2025 12:45:35 -0600 Subject: [PATCH 70/94] Properly processing >1 fix set force --- src/RHEO/compute_rheo_interface.cpp | 41 +++++++++++------------------ 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/src/RHEO/compute_rheo_interface.cpp b/src/RHEO/compute_rheo_interface.cpp index 0cd6e46417..c2440100ae 100644 --- a/src/RHEO/compute_rheo_interface.cpp +++ b/src/RHEO/compute_rheo_interface.cpp @@ -344,31 +344,22 @@ void ComputeRHEOInterface::store_forces() // If forces are overwritten by a fix, there are no pressure forces // so just normalize auto fixlist = modify->get_fix_by_style("setforce"); - if (fixlist.size() != 0) { - for (const auto &fix : fixlist) { - for (int i = 0; i < atom->nlocal; i++) { - if (rmass) - minv = 1.0 / rmass[i]; - else - minv = 1.0 / mass[type[i]]; - if (mask[i] & fix->groupbit) - for (int a = 0; a < 3; a++) fp_store[i][a] = f[i][a] * minv; - else - for (int a = 0; a < 3; a++) fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv; - } - } - } else { - if (rmass) { - for (int i = 0; i < atom->nlocal; i++) { - minv = 1.0 / rmass[i]; - for (int a = 0; a < 3; a++) fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv; - } - } else { - for (int i = 0; i < atom->nlocal; i++) { - minv = 1.0 / mass[type[i]]; - for (int a = 0; a < 3; a++) fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv; - } - } + int skip_from_setforce; + for (int i = 0; i < atom->nlocal; i++) { + if (rmass) + minv = 1.0 / rmass[i]; + else + minv = 1.0 / mass[type[i]]; + + skip_from_setforce = 0; + for (const auto &fix : fixlist) + if (mask[i] & fix->groupbit) + skip_from_setforce = 1; + + if (skip_from_setforce) + for (int a = 0; a < 3; a++) fp_store[i][a] = f[i][a] * minv; + else + for (int a = 0; a < 3; a++) fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv; } // Forward comm forces From 60fe08c3283830703bbc4ffb9891292928604283 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 May 2025 15:47:35 -0400 Subject: [PATCH 71/94] clarify and rewrap --- doc/src/fix_qeq_rel_reaxff.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/fix_qeq_rel_reaxff.rst b/doc/src/fix_qeq_rel_reaxff.rst index 354b53e775..98023ab51a 100644 --- a/doc/src/fix_qeq_rel_reaxff.rst +++ b/doc/src/fix_qeq_rel_reaxff.rst @@ -44,11 +44,11 @@ equilibration, which differs from the QEq charge equilibration method :ref:`(Rappe and Goddard) ` only in how external electric fields are accounted for. This fix therefore raises a warning when used without :doc:`fix efield ` since :doc:`fix qeq/reaxff ` -should be used without an external electric field. Charges are computed with -the QEqR method by minimizing the electrostatic energy of the system in -the same way as the QEq method but where the absolute electronegativity, -:math:`\chi_i`, of each atom in the QEq method is replaced with an -effective electronegativity given by +should be used when no external electric field is present. Charges are +computed with the QEqR method by minimizing the electrostatic energy of +the system in the same way as the QEq method but where the absolute +electronegativity, :math:`\chi_i`, of each atom in the QEq method is +replaced with an effective electronegativity given by .. math:: \chi_{\mathrm{r}i} = \chi_i + \frac{\sum_{j=1}^{N} \beta(\phi_i - \phi_j) S_{ij}} From 22cddeee7884994cf26c6bbcace5f109c88b974c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 May 2025 16:49:43 -0400 Subject: [PATCH 72/94] fix spelling in comments --- src/ML-PACE/pair_pace.cpp | 2 +- src/ML-PACE/pair_pace_extrapolation.cpp | 2 +- src/PERI/fix_peri_neigh.cpp | 2 +- src/PHONON/third_order.cpp | 2 +- src/library.cpp | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ML-PACE/pair_pace.cpp b/src/ML-PACE/pair_pace.cpp index 79d2f92455..c7b5414ef3 100644 --- a/src/ML-PACE/pair_pace.cpp +++ b/src/ML-PACE/pair_pace.cpp @@ -145,7 +145,7 @@ void PairPACE::compute(int eflag, int vflag) // ilist: list of "i" atoms for which neighbor lists exist ilist = list->ilist; - //numneigh: the length of each these neigbor list + //numneigh: the length of each these neighbor list numneigh = list->numneigh; // the pointer to the list of neighbors of "i" diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 2946729905..5ac857d748 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -151,7 +151,7 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) // ilist: list of "i" atoms for which neighbor lists exist ilist = list->ilist; - //numneigh: the length of each these neigbor list + //numneigh: the length of each these neighbor list numneigh = list->numneigh; // the pointer to the list of neighbors of "i" diff --git a/src/PERI/fix_peri_neigh.cpp b/src/PERI/fix_peri_neigh.cpp index 6adfc96f3f..1eba6006b8 100644 --- a/src/PERI/fix_peri_neigh.cpp +++ b/src/PERI/fix_peri_neigh.cpp @@ -279,7 +279,7 @@ void FixPeriNeigh::setup(int /*vflag*/) } } - // sanity check: does any atom appear twice in any neigborlist? + // sanity check: does any atom appear twice in any neighborlist? // should only be possible if using pbc and domain < 2*delta if (domain->xperiodic || domain->yperiodic || domain->zperiodic) { diff --git a/src/PHONON/third_order.cpp b/src/PHONON/third_order.cpp index e1d9161ef1..0facaecc9b 100644 --- a/src/PHONON/third_order.cpp +++ b/src/PHONON/third_order.cpp @@ -162,7 +162,7 @@ void ThirdOrder::command(int narg, char **arg) conversion = 1; folded = 0; - // set Neigborlist attributes to NULL + // set Neighborlist attributes to NULL ijnum = nullptr; neighbortags = nullptr; diff --git a/src/library.cpp b/src/library.cpp index 527838f07a..e6b14dafd3 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1255,7 +1255,7 @@ be called without a valid LAMMPS object handle (it is ignored). * :ref:`Image masks ` * :ref:`System status ` * :ref:`System sizes ` -* :ref:`Neigbor list settings ` +* :ref:`Neighbor list settings ` * :ref:`Atom style flags ` .. _extract_integer_sizes: @@ -1408,7 +1408,7 @@ internally by the :doc:`Fortran interface ` and are not likely to be us .. _extract_neighbor_settings: -**Neigbor list settings** +**Neighbor list settings** .. list-table:: :header-rows: 1 From 458c0844a8d67face2b213b36b26aa168c2a6d0d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 May 2025 17:44:38 -0400 Subject: [PATCH 73/94] fix typo --- src/GRANULAR/gran_sub_mod_damping.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 5420895c32..f85b866f8d 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -220,7 +220,7 @@ double GranSubModDampingMDR::calculate_forces() damp_prefactor = damp * history[DAMP_SCALE]; } else if (damp_type == 2) { if (history[DAMP_SCALE] == 0.0) { - damp_prefactor == 0.0; + damp_prefactor = 0.0; } else { damp_prefactor = damp; } From 6436cc87b7e4412b3748731b04be0cc8a5a36150 Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Fri, 9 May 2025 14:23:03 -0600 Subject: [PATCH 74/94] Corrected inconsistent voro-ID compute references and examples --- doc/src/fix_neighbor_swap.rst | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 274c4ea939..4095f23eef 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -17,7 +17,7 @@ Syntax * seed = random # seed (positive integer) * T = scaling temperature of the MC swaps (temperature units) * R0 = scaling swap probability of the MC swaps (distance units) -* voro = valid voronoi compute id (compute voronoi/atom) +* voro-ID = valid voronoi compute id (compute voronoi/atom) * two or more keyword/value pairs may be appended to args * keywords *types* and *diff* are mutually exclusive, but one must be specified * keyword = *types* or *diff* or *ke* or *region* or *rates* @@ -39,9 +39,9 @@ Examples .. code-block:: LAMMPS compute voroN all voronoi/atom neighbors yes - fix mc all neighbor/swap 10 160 15238 1000.0 3.0 diff 2 voro voroN - fix myFix all neighbor/swap 100 1 12345 298.0 3.0 region my_swap_region types 5 6 voro voroN - fix kmc all neighbor/swap 1 100 345 1.0 3.0 diff 3 rates 3 1 6 voro voroN + fix mc all neighbor/swap 10 160 15238 1000.0 3.0 voroN diff 2 + fix myFix all neighbor/swap 100 1 12345 298.0 3.0 voroN region my_swap_region types 5 6 + fix kmc all neighbor/swap 1 100 345 1.0 3.0 voroN diff 3 rates 3 1 6 Description """"""""""" @@ -137,6 +137,17 @@ average nearest-neighbor spacing is appropriate. Since this is simply a proability weighting, the swapping behavior is not very sensitive to the exact value of *R0*. +The required *voro-ID* value is the compute-ID of a +:doc:`compute voronoi/atom ` command like +this: + +.. code-block:: LAMMPS + + compute compute-ID group-ID voronoi/atom neighbors yes + +It must return per-atom list of valid neighbor IDs as in the +:doc:`compute voronoi/atom ` command. + The keyword *types* takes two or more atom types as its values. Only atoms *I* of the first atom type will be selected. Only atoms *J* of the remaining atom types will be considered as potential swap partners. @@ -147,14 +158,6 @@ remaining atom types will be considered as potential swap partners. This includes the atom type specified with the *diff* keyword to account for self-diffusive hops between two atoms of the same type. -The keyword *voro* is required. Its *vID* value is the compute-ID of -a :doc:`compute voronoi/atom ` command like -this: - -.. code-block:: LAMMPS - - compute compute-ID group-ID voronoi/atom neighbors yes - Note that the *neighbors yes* option must be enabled for use with this fix. The group-ID should include all the atoms which this fix will potentialy select. I.e. the group-ID used in the voronoi compute should @@ -225,7 +228,7 @@ package ` be installed, otherwise the fix will not be compiled. The :doc:`compute voronoi/atom ` command -referenced by keyword *voro* must return neighboring atoms as +referenced by the required voro-ID must return neighboring atoms as illustrated in the examples above. If this fix is used with systems that do not have per-type masses From 17da04f07b335d4e1edd2841a1e746998f1f347f Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Fri, 9 May 2025 14:25:08 -0600 Subject: [PATCH 75/94] Cleaned up language errors --- doc/src/fix_neighbor_swap.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 4095f23eef..6b26f99dff 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -189,6 +189,8 @@ Assuming all *J* atoms are equidistant from an atom *I*, *J* atoms of type 1 will be 3x more likely to be selected as a swap partner than atoms of type 2. And *J* atoms of type 3 will be 6.5x more likely to be selected than atoms of type 2. If the *rates* keyword is not used, +all atom types will be treated with the same probability during selection +of swap attempts. Restart, fix_modify, output, run start/stop, minimize info @@ -196,8 +198,8 @@ Restart, fix_modify, output, run start/stop, minimize info This fix writes the state of the fix to :doc:`binary restart files `. This includes information about the random number generator -seed, the next timestep for MC exchanges, the number of exchange -attempts and successes, etc. See the :doc:`read_restart ` +seed, the next timestep for MC exchanges, and the number of exchange +attempts and successes. See the :doc:`read_restart ` command for info on how to re-specify a fix in an input script that reads a restart file, so that the operation of the fix continues in an uninterrupted fashion. From ef89edc4c634f28f8f4e16e4518bbc4e3db8b928 Mon Sep 17 00:00:00 2001 From: Jacob Tavenner Date: Fri, 9 May 2025 14:53:27 -0600 Subject: [PATCH 76/94] Additional edits --- doc/src/fix_neighbor_swap.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst index 0f771e8ce9..dffbc93217 100644 --- a/doc/src/fix_neighbor_swap.rst +++ b/doc/src/fix_neighbor_swap.rst @@ -8,7 +8,7 @@ Syntax .. code-block:: LAMMPS - fix ID group-ID neighbor/swap N X seed T R0 voro keyword values ... + fix ID group-ID neighbor/swap N X seed T R0 voro-ID keyword values ... * ID, group-ID are documented in :doc:`fix ` command * neighbor/swap = style name of this fix command @@ -18,7 +18,7 @@ Syntax * T = scaling temperature of the MC swaps (temperature units) * R0 = scaling swap probability of the MC swaps (distance units) * voro-ID = valid voronoi compute id (compute voronoi/atom) -* two or more keyword/value pairs may be appended to args +* one or more keyword/value pairs may be appended to args * keywords *types* and *diff* are mutually exclusive, but one must be specified * keyword = *types* or *diff* or *ke* or *region* or *rates* From 2bcac9efba857331a4821da4b7057241f6c1a0e0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 May 2025 12:13:05 -0400 Subject: [PATCH 77/94] fix spelling issue --- doc/utils/sphinx-config/false_positives.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index c81be91cbe..0c013abd56 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -397,6 +397,7 @@ Broglie brownian brownw Broyden +Bruenger Bruskin Brusselle Bryantsev From 75907ccf918333a106e084edd840e2ddceb8fb7d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 May 2025 02:32:27 -0400 Subject: [PATCH 78/94] add support to extract eflag/vflag_atom/global as global properties --- src/library.cpp | 48 +++++++++++++++++-- .../c-library/test_library_properties.cpp | 13 +++++ 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index e6b14dafd3..a8acbade52 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1622,6 +1622,11 @@ int lammps_extract_global_datatype(void * /*handle*/, const char *name) if (strcmp(name,"neigh_dihedrallist") == 0) return LAMMPS_INT_2D; if (strcmp(name,"neigh_improperlist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"eflag_global") == 0) return LAMMPS_BIGINT; + if (strcmp(name,"eflag_atom") == 0) return LAMMPS_BIGINT; + if (strcmp(name,"vflag_global") == 0) return LAMMPS_BIGINT; + if (strcmp(name,"vflag_atom") == 0) return LAMMPS_BIGINT; + if (strcmp(name,"map_style") == 0) return LAMMPS_INT; #if defined(LAMMPS_BIGBIG) if (strcmp(name,"map_tag_max") == 0) return LAMMPS_BIGINT; @@ -1707,6 +1712,7 @@ report the "native" data type. The following tables are provided: * :ref:`Simulation box settings ` * :ref:`System property settings ` * :ref:`Neighbor topology data ` +* :ref:`Energy and virial tally settings ` * :ref:`Git revision and version settings ` * :ref:`Unit settings ` @@ -1984,6 +1990,35 @@ Get length of lists with :ref:`lammps_extract_setting() atom->q_flag; - if (strcmp(name,"neigh_bondlist") == 0) return lmp->neighbor->bondlist; - if (strcmp(name,"neigh_anglelist") == 0) return lmp->neighbor->anglelist; - if (strcmp(name,"neigh_dihedrallist") == 0) return lmp->neighbor->dihedrallist; - if (strcmp(name,"neigh_improperlist") == 0) return lmp->neighbor->improperlist; + if (strcmp(name,"neigh_bondlist") == 0) return (void *) lmp->neighbor->bondlist; + if (strcmp(name,"neigh_anglelist") == 0) return (void *) lmp->neighbor->anglelist; + if (strcmp(name,"neigh_dihedrallist") == 0) return (void *) lmp->neighbor->dihedrallist; + if (strcmp(name,"neigh_improperlist") == 0) return (void *) lmp->neighbor->improperlist; + + if (strcmp(name,"eflag_global") == 0) return (void *) &lmp->update->eflag_global; + if (strcmp(name,"eflag_atom") == 0) return (void *) &lmp->update->eflag_atom; + if (strcmp(name,"vflag_global") == 0) return (void *) &lmp->update->vflag_global; + if (strcmp(name,"vflag_atom") == 0) return (void *) &lmp->update->vflag_atom; if (strcmp(name,"map_style") == 0) return (void *) &lmp->atom->map_style; if (strcmp(name,"map_tag_max") == 0) return (void *) &lmp->atom->map_tag_max; diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index e2149d98e6..033e9c041e 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -387,6 +387,19 @@ TEST_F(LibraryProperties, global) auto *b_ptr = (int64_t *)lammps_extract_global(lmp, "ntimestep"); EXPECT_EQ((*b_ptr), 2); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "eflag_global"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "eflag_global"); + EXPECT_EQ((*b_ptr), 2); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "eflag_atom"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "eflag_atom"); + EXPECT_EQ((*b_ptr), 0); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "vflag_global"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "vflag_global"); + EXPECT_EQ((*b_ptr), 2); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "vflag_atom"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "vflag_atom"); + EXPECT_EQ((*b_ptr), 0); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "dt"), LAMMPS_DOUBLE); auto *d_ptr = (double *)lammps_extract_global(lmp, "dt"); EXPECT_DOUBLE_EQ((*d_ptr), 0.1); From fdd91e597e8c508a5ce06b84ff75002d0ee63d25 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 May 2025 02:44:05 -0400 Subject: [PATCH 79/94] add a few more tests for extracted global properties --- .../c-library/test_library_properties.cpp | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index 033e9c041e..39b31e8217 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -383,10 +383,35 @@ TEST_F(LibraryProperties, global) char *c_ptr = (char *)lammps_extract_global(lmp, "units"); EXPECT_THAT(c_ptr, StrEq("real")); - EXPECT_EQ(lammps_extract_global_datatype(lmp, "ntimestep"), LAMMPS_INT64); - auto *b_ptr = (int64_t *)lammps_extract_global(lmp, "ntimestep"); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "ntimestep"), LAMMPS_BIGINT); + auto *b_ptr = (bigint *)lammps_extract_global(lmp, "ntimestep"); EXPECT_EQ((*b_ptr), 2); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "natoms"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "natoms"); + EXPECT_EQ((*b_ptr), 29); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "nbonds"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "nbonds"); + EXPECT_EQ((*b_ptr), 24); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "nangles"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "nangles"); + EXPECT_EQ((*b_ptr), 30); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "ndihedrals"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "ndihedrals"); + EXPECT_EQ((*b_ptr), 31); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "nimpropers"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "nimpropers"); + EXPECT_EQ((*b_ptr), 2); + + EXPECT_EQ(lammps_extract_global_datatype(lmp, "neigh_bondlist"), LAMMPS_INT_2D); + EXPECT_NE(lammps_extract_global(lmp, "neigh_bondlist"), nullptr); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "neigh_anglelist"), LAMMPS_INT_2D); + EXPECT_NE(lammps_extract_global(lmp, "neigh_anglelist"), nullptr); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "neigh_dihedrallist"), LAMMPS_INT_2D); + EXPECT_NE(lammps_extract_global(lmp, "neigh_dihedrallist"), nullptr); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "neigh_improperlist"), LAMMPS_INT_2D); + EXPECT_NE(lammps_extract_global(lmp, "neigh_improperlist"), nullptr); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "eflag_global"), LAMMPS_BIGINT); b_ptr = (bigint *)lammps_extract_global(lmp, "eflag_global"); EXPECT_EQ((*b_ptr), 2); From 83fa2cbc9313afb9b5d40258c6910c9c6264db01 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 May 2025 06:02:10 -0400 Subject: [PATCH 80/94] enable PotentialFileReader class to change line buffer size --- src/potential_file_reader.cpp | 10 ++++++++++ src/potential_file_reader.h | 1 + src/text_file_reader.cpp | 4 +++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/potential_file_reader.cpp b/src/potential_file_reader.cpp index 2a93a4a524..7bac388ba0 100644 --- a/src/potential_file_reader.cpp +++ b/src/potential_file_reader.cpp @@ -86,11 +86,21 @@ PotentialFileReader::~PotentialFileReader() /** Set comment (= text after '#') handling preference for the file to be read * * \param value Comment text is ignored if true, or not if false */ + void PotentialFileReader::ignore_comments(bool value) { reader->ignore_comments = value; } +/** Set line buffer size of the internal TextFileReader class instance. + * + * \param bufsize New size of the line buffer */ + +void PotentialFileReader::set_bufsize(int bufsize) +{ + reader->set_bufsize(bufsize); +} + /** Reset file to the beginning */ void PotentialFileReader::rewind() diff --git a/src/potential_file_reader.h b/src/potential_file_reader.h index c07b4b83f6..534457a2f8 100644 --- a/src/potential_file_reader.h +++ b/src/potential_file_reader.h @@ -41,6 +41,7 @@ class PotentialFileReader : protected Pointers { const int auto_convert = 0); ~PotentialFileReader() override; + void set_bufsize(int bufsize); void ignore_comments(bool value); void rewind(); diff --git a/src/text_file_reader.cpp b/src/text_file_reader.cpp index 715e82ab32..d598c274f0 100644 --- a/src/text_file_reader.cpp +++ b/src/text_file_reader.cpp @@ -93,7 +93,9 @@ TextFileReader::~TextFileReader() delete[] line; } -/** adjust line buffer size */ +/** adjust line buffer size + * + * \param newsize New size of the internal line buffer */ void TextFileReader::set_bufsize(int newsize) { From 9ba50df9d8e8c54fe045e0e641ce6a718ab0dbec Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Tue, 13 May 2025 16:09:13 +0200 Subject: [PATCH 81/94] Select one overload of log2 for the kokkos build --- src/KOKKOS/pair_kokkos.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 399142dfaf..9e04770ae3 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -961,7 +961,7 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P lastcall = fpair->lmp->update->ntimestep; vectorsize = GetMaxNeighs(list); if (vectorsize == 0) vectorsize = 1; - vectorsize = MathSpecial::powint(2,(int(log2(vectorsize) + 0.5))); // round to nearest power of 2 + vectorsize = MathSpecial::powint(2,(int(log2(double(vectorsize)) + 0.5))); // round to nearest power of 2 #if defined(KOKKOS_ENABLE_HIP) int max_vectorsize = 64; From 01bde55e9a84d0508eed1697325fe21fd2c4114e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 May 2025 12:53:03 -0400 Subject: [PATCH 82/94] match all argument types for powint() --- src/KOKKOS/pair_kokkos.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 9e04770ae3..63e637c108 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -961,7 +961,7 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P lastcall = fpair->lmp->update->ntimestep; vectorsize = GetMaxNeighs(list); if (vectorsize == 0) vectorsize = 1; - vectorsize = MathSpecial::powint(2,(int(log2(double(vectorsize)) + 0.5))); // round to nearest power of 2 + vectorsize = MathSpecial::powint(2.0,(int(log2(double(vectorsize)) + 0.5))); // round to nearest power of 2 #if defined(KOKKOS_ENABLE_HIP) int max_vectorsize = 64; From 32588f075e11e8fdfbffb4fa84bb8278512ce885 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 May 2025 02:53:12 -0400 Subject: [PATCH 83/94] remove assignments of variables to themselves --- src/KOKKOS/meam_dens_init_kokkos.h | 1 - src/KOKKOS/meam_force_kokkos.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/KOKKOS/meam_dens_init_kokkos.h b/src/KOKKOS/meam_dens_init_kokkos.h index dd63be96bd..23985c7082 100644 --- a/src/KOKKOS/meam_dens_init_kokkos.h +++ b/src/KOKKOS/meam_dens_init_kokkos.h @@ -236,7 +236,6 @@ MEAMKokkos::meam_dens_init(int inum_half, int ntype, typename AT::t_ this->d_neighbors_half = d_neighbors_half; this->d_neighbors_full = d_neighbors_full; this->d_offset = d_offset; - this->nlocal = nlocal; if (need_dup) { dup_rho0 = Kokkos::Experimental::create_scatter_view(d_rho0); diff --git a/src/KOKKOS/meam_force_kokkos.h b/src/KOKKOS/meam_force_kokkos.h index 1875e22dcf..703bee23d7 100644 --- a/src/KOKKOS/meam_force_kokkos.h +++ b/src/KOKKOS/meam_force_kokkos.h @@ -17,7 +17,6 @@ void MEAMKokkos::meam_force( { EV_FLOAT ev; - this->eflag_either = eflag_either; this->eflag_global = eflag_global; this->eflag_atom = eflag_atom; this->vflag_global = vflag_global; From 179d4f0148ce5d9ce3ff35f1bab513c3eaec96c5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 May 2025 02:53:51 -0400 Subject: [PATCH 84/94] work around C++ error --- src/LATBOLTZ/fix_lb_fluid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LATBOLTZ/fix_lb_fluid.cpp b/src/LATBOLTZ/fix_lb_fluid.cpp index 286b56cab5..d5161bba42 100644 --- a/src/LATBOLTZ/fix_lb_fluid.cpp +++ b/src/LATBOLTZ/fix_lb_fluid.cpp @@ -2344,7 +2344,7 @@ void FixLbFluid::SetupBuffers() MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &dump_file_handle_raw); MPI_File_set_size(dump_file_handle_raw, 0); - MPI_File_set_view(dump_file_handle_raw, 0, MPI_DOUBLE, dump_file_mpitype, "native", + MPI_File_set_view(dump_file_handle_raw, 0, MPI_DOUBLE, dump_file_mpitype, (char *)"native", MPI_INFO_NULL); } } From 19cfd08eb87739c0532a74106a990b375cac358f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 May 2025 08:15:01 -0400 Subject: [PATCH 85/94] correctly enable GPU package and make fix imd wait in background for bucky+cnt example --- examples/PACKAGES/imd/in.bucky-plus-cnt | 4 +-- examples/PACKAGES/imd/in.bucky-plus-cnt-gpu | 15 ++++---- examples/PACKAGES/imd/in.deca-ala_imd-gpu | 14 ++++---- examples/PACKAGES/imd/in.melt_imd-gpu | 38 +++++++++++---------- 4 files changed, 38 insertions(+), 33 deletions(-) diff --git a/examples/PACKAGES/imd/in.bucky-plus-cnt b/examples/PACKAGES/imd/in.bucky-plus-cnt index b3eeff3cc1..af511fe11f 100644 --- a/examples/PACKAGES/imd/in.bucky-plus-cnt +++ b/examples/PACKAGES/imd/in.bucky-plus-cnt @@ -46,8 +46,8 @@ fix integrate mobile nve fix thermostat mobile langevin 300.0 300.0 2000.0 234624 # IMD setup. -fix comm all imd 6789 unwrap on trate 10 -#fix comm all imd 6789 unwrap on trate 10 nowait on +#fix comm all imd 6789 unwrap on trate 10 +fix comm all imd 6789 unwrap on trate 10 nowait on # temperature is based on mobile atoms only compute mobtemp mobile temp diff --git a/examples/PACKAGES/imd/in.bucky-plus-cnt-gpu b/examples/PACKAGES/imd/in.bucky-plus-cnt-gpu index 5762ec68c8..f3e4b32cdc 100644 --- a/examples/PACKAGES/imd/in.bucky-plus-cnt-gpu +++ b/examples/PACKAGES/imd/in.bucky-plus-cnt-gpu @@ -1,16 +1,20 @@ # stick a buckyball into a nanotube + +# enable GPU package from within the input: +package gpu 0 pair/only on +suffix gpu + units real dimension 3 boundary f f f atom_style molecular -newton off processors * * 1 # read topology read_data data.bucky-plus-cnt -pair_style lj/cut/gpu 10.0 +pair_style lj/cut 10.0 bond_style harmonic angle_style charmm dihedral_style charmm @@ -29,9 +33,6 @@ neigh_modify delay 0 every 1 check yes timestep 2.0 -# required for GPU acceleration -fix gpu all gpu force 0 0 1.0 - # we only move some atoms. group mobile type 1 @@ -49,8 +50,8 @@ fix integrate mobile nve fix thermostat mobile langevin 300.0 300.0 2000.0 234624 # IMD setup. -fix comm all imd 6789 unwrap on trate 10 -#fix comm all imd 6789 unwrap on trate 10 nowait on +#fix comm all imd 6789 unwrap on trate 10 +fix comm all imd 6789 unwrap on trate 10 nowait on # temperature is based on mobile atoms only compute mobtemp mobile temp diff --git a/examples/PACKAGES/imd/in.deca-ala_imd-gpu b/examples/PACKAGES/imd/in.deca-ala_imd-gpu index 72c3f4aae9..9470f7c213 100644 --- a/examples/PACKAGES/imd/in.deca-ala_imd-gpu +++ b/examples/PACKAGES/imd/in.deca-ala_imd-gpu @@ -1,8 +1,12 @@ -# +# + +# enable GPU package from within the input: +package gpu 0 pair/only on +suffix gpu + units real neighbor 2.5 bin neigh_modify delay 1 every 1 -newton off atom_style full bond_style harmonic @@ -10,20 +14,18 @@ angle_style charmm dihedral_style charmm improper_style harmonic -pair_style lj/charmm/coul/long/gpu 8 10 +pair_style lj/charmm/coul/long 8 10 pair_modify mix arithmetic special_bonds charmm read_data data.deca-ala-solv -fix 0 all gpu force/neigh 0 0 1.0 - group peptide id <= 103 fix rigidh all shake 1e-6 100 1000 t 1 2 3 4 5 a 23 thermo 100 thermo_style multi timestep 2.0 -kspace_style pppm/gpu 1e-5 +kspace_style pppm 1e-5 fix ensemble all npt temp 300.0 300.0 100.0 iso 1.0 1.0 1000.0 drag 0.2 diff --git a/examples/PACKAGES/imd/in.melt_imd-gpu b/examples/PACKAGES/imd/in.melt_imd-gpu index 24904eb832..f1406befa6 100644 --- a/examples/PACKAGES/imd/in.melt_imd-gpu +++ b/examples/PACKAGES/imd/in.melt_imd-gpu @@ -1,30 +1,32 @@ -# 3d Lennard-Jones melt +# 3d Lennard-Jones melt with GPU package acceleration -units lj -atom_style atomic -newton off +# enable GPU package from within the input: +package gpu 0 +suffix gpu -lattice fcc 0.8442 -region box block 0 10 0 10 0 10 -create_box 1 box -create_atoms 1 box -mass 1 1.0 +units lj +atom_style atomic -velocity all create 3.0 87287 +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 1 box +create_atoms 1 box +mass 1 1.0 -pair_style lj/cut/gpu 2.5 -pair_coeff 1 1 1.0 1.0 2.5 +velocity all create 3.0 87287 -neighbor 0.3 bin -neigh_modify every 5 delay 10 check yes +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 2.5 + +neighbor 0.3 bin +neigh_modify every 5 delay 10 check yes thermo_style custom step pe ke spcpu -fix 0 all gpu force/neigh 0 0 1.0 -fix 1 all nve +fix 1 all nve # IMD setup. fix comm all imd 5678 unwrap off fscale 20.0 trate 20 nowait on -thermo 500 -run 5000000 +thermo 500 +run 5000000 From c3c01806490feaad10b719eb21b2a9ef6496d420 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 May 2025 08:15:35 -0400 Subject: [PATCH 86/94] correctly check for 32bit integer overflow --- src/ML-POD/compute_podd_atom.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ML-POD/compute_podd_atom.cpp b/src/ML-POD/compute_podd_atom.cpp index 4ab6e23393..c691b6b3f2 100644 --- a/src/ML-POD/compute_podd_atom.cpp +++ b/src/ML-POD/compute_podd_atom.cpp @@ -58,8 +58,8 @@ ComputePODDAtom::ComputePODDAtom(LAMMPS *lmp, int narg, char **arg) : pod = nullptr; elements = nullptr; - if (((((MAXBIGINT*3.0)*atom->natoms)*podptr->nClusters)*podptr->Mdesc) > (MAXSMALLINT*1.0)) - error->all(FLERR, "Per-atom data too large"); + if ((((3.0*atom->natoms)*podptr->nClusters)*podptr->Mdesc) > (MAXSMALLINT*1.0)) + error->all(FLERR, "Too many atoms ({}_ for compute {}", atom->natoms, style); size_peratom_cols = 3 * atom->natoms * podptr->Mdesc * podptr->nClusters; peratom_flag = 1; } @@ -110,8 +110,8 @@ void ComputePODDAtom::compute_peratom() if (atom->natoms > nmax) { memory->destroy(pod); nmax = atom->natoms; - if (((((MAXBIGINT*3.0)*atom->natoms)*podptr->nClusters)*podptr->Mdesc) > (MAXSMALLINT*1.0)) - error->all(FLERR, "Per-atom data too large"); + if ((((3.0*atom->natoms)*podptr->nClusters)*podptr->Mdesc) > (MAXSMALLINT*1.0)) + error->all(FLERR, "Too many atoms ({}) for compute {}", atom->natoms, style); int numdesc = 3 * atom->natoms * podptr->Mdesc * podptr->nClusters; memory->create(pod, nmax, numdesc,"podd/atom:pod"); array_atom = pod; From 5fd4d6bb8722d1c9a385acb529b7950af2d2d662 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 May 2025 23:15:26 -0400 Subject: [PATCH 87/94] remove directionCorrection and update docs for compute pair/local and compute bond/local --- doc/src/compute_bond_local.rst | 32 +++++++++++++++++++++----------- doc/src/compute_pair_local.rst | 27 +++++++++++++++++++-------- src/compute_bond_local.cpp | 9 +++------ src/compute_pair_local.cpp | 9 +++------ 4 files changed, 46 insertions(+), 31 deletions(-) diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index e070d507b1..9aa062f911 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -64,22 +64,32 @@ All these properties are computed for the pair of atoms in a bond, whether the two atoms represent a simple diatomic molecule, or are part of some larger molecule. -The value *dist* is the current length of the bond. -The values *dx*, *dy*, and *dz* are the xyz components of the -*distance* between the pair of atoms. This value is always the -distance from the atom of lower to the one with the higher id. +.. versionchanged:: TBD + + The sign of *dx*, *dy*, *dz* is no longer determined by the atom IDs + of the bonded atoms but by their order in the bond list to be + consistent with *fx*, *fy*, and *fz*. + +The value *dist* is the current length of the bond. The values *dx*, +*dy*, and *dz* are the :math:`(x,y,z)` components of the distance vector +:math:`\vec{x_i} - \vec{x_j}` between the atoms in the bond. The order +of the atoms is determined by the bond list and the respective atom-IDs +can be output with :doc:`compute property/local +`. The value *engpot* is the potential energy for the bond, based on the current separation of the pair of atoms in the bond. -The value *force* is the magnitude of the force acting between the -pair of atoms in the bond. +The value *force* is the magnitude of the force acting between the pair +of atoms in the bond, which is positive for a repulsive force and +negative for an attractive force. -The values *fx*, *fy*, and *fz* are the xyz components of -*force* between the pair of atoms in the bond. For bond styles that apply -non-central forces, such as :doc:`bond_style bpm/rotational -`, these values only include the :math:`(x,y,z)` -components of the normal force component. +The values *fx*, *fy*, and *fz* are the :math:`(x,y,z)` components of +the force vector on atom *i* obtained by projecting *force* on the +distance vector. For bond styles that apply non-central forces, such as +:doc:`bond_style bpm/rotational `, these values +only include the :math:`(x,y,z)` components of the normal force +component. The remaining properties are all computed for motion of the two atoms relative to the center of mass (COM) velocity of the two atoms in the diff --git a/doc/src/compute_pair_local.rst b/doc/src/compute_pair_local.rst index 31209f63f4..5e8ac73a22 100644 --- a/doc/src/compute_pair_local.rst +++ b/doc/src/compute_pair_local.rst @@ -56,19 +56,30 @@ force cutoff distance for that interaction, as defined by the :doc:`pair_style ` and :doc:`pair_coeff ` commands. -The value *dist* is the distance between the pair of atoms. -The values *dx*, *dy*, and *dz* are the :math:`(x,y,z)` components of the -*distance* between the pair of atoms. This value is always the -distance from the atom of higher to the one with the lower atom ID. +.. versionchanged:: TBD + + The sign of *dx*, *dy*, *dz* is no longer determined by the value of + their atom-IDs but by their order in the neighbor list to be + consistent with *fx*, *fy*, and *fz*. + +The value *dist* is the distance between the pair of atoms. The values +*dx*, *dy*, and *dz* are the :math:`(x,y,z)` components of the distance +vector :math:`\vec{x_i} - \vec{x_j}` between the pair of atoms. The +order of the atoms is determined by the neighbor list and the respective +atom-IDs can be output with :doc:`compute property/local +`. The value *eng* is the interaction energy for the pair of atoms. The value *force* is the force acting between the pair of atoms, which is positive for a repulsive force and negative for an attractive -force. The values *fx*, *fy*, and *fz* are the :math:`(x,y,z)` components of -*force* on atom I. For pair styles that apply non-central forces, -such as :doc:`granular pair styles `, these values only include -the :math:`(x,y,z)` components of the normal force component. +force. + +The values *fx*, *fy*, and *fz* are the :math:`(x,y,z)` components of +the force vector on atom *i* obtained by projecting *force* on the +distance vector. For pair styles that apply non-central forces, such as +:doc:`granular pair styles `, these values only include the +:math:`(x,y,z)` components of the normal force component. A pair style may define additional pairwise quantities which can be accessed as *p1* to *pN*, where :math:`N` is defined by the pair style. diff --git a/src/compute_bond_local.cpp b/src/compute_bond_local.cpp index e9632d254f..6354c67638 100644 --- a/src/compute_bond_local.cpp +++ b/src/compute_bond_local.cpp @@ -428,22 +428,19 @@ int ComputeBondLocal::compute_bonds(int flag) if (dstr) input->variable->internal_set(dvar, sqrt(rsq)); } - // to make sure dx, dy and dz are always from the lower to the higher id - double directionCorrection = tag[atom1] > tag[atom2] ? -1.0 : 1.0; - for (int n = 0; n < nvalues; n++) { switch (bstyle[n]) { case DIST: ptr[n] = sqrt(rsq); break; case DX: - ptr[n] = dx * directionCorrection; + ptr[n] = dx; break; case DY: - ptr[n] = dy * directionCorrection; + ptr[n] = dy; break; case DZ: - ptr[n] = dz * directionCorrection; + ptr[n] = dz; break; case ENGPOT: ptr[n] = engpot; diff --git a/src/compute_pair_local.cpp b/src/compute_pair_local.cpp index 57f15264f0..fa5d164844 100644 --- a/src/compute_pair_local.cpp +++ b/src/compute_pair_local.cpp @@ -277,22 +277,19 @@ int ComputePairLocal::compute_pairs(int flag) else ptr = alocal[m]; - // to make sure dx, dy and dz are always from the lower to the higher id - double directionCorrection = itag > jtag ? -1.0 : 1.0; - for (n = 0; n < nvalues; n++) { switch (pstyle[n]) { case DIST: ptr[n] = sqrt(rsq); break; case DX: - ptr[n] = delx * directionCorrection; + ptr[n] = delx; break; case DY: - ptr[n] = dely * directionCorrection; + ptr[n] = dely; break; case DZ: - ptr[n] = delz * directionCorrection; + ptr[n] = delz; break; case ENG: ptr[n] = eng; From 629ec2eabe21dd68aa4079a7081ec5a950ddc890 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 May 2025 23:16:31 -0400 Subject: [PATCH 88/94] update for consistency with docs --- src/read_data.cpp | 4 ++-- src/reset_atoms_mol.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/read_data.cpp b/src/read_data.cpp index 79d88148c5..cf7b224db2 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -174,13 +174,13 @@ void ReadData::command(int narg, char **arg) addflag = VALUE; bigint offset = utils::bnumeric(FLERR, arg[iarg + 1], false, lmp); if (offset > MAXTAGINT) - error->all(FLERR, "Read data add atomID offset {} is too big", offset); + error->all(FLERR, "Read data add IDoffset {} is too big", offset); id_offset = offset; if (atom->molecule_flag) { offset = utils::bnumeric(FLERR, arg[iarg + 2], false, lmp); if (offset > MAXTAGINT) - error->all(FLERR, "Read data add molID offset {} is too big", offset); + error->all(FLERR, "Read data add MOLoffset {} is too big", offset); mol_offset = offset; iarg++; } diff --git a/src/reset_atoms_mol.cpp b/src/reset_atoms_mol.cpp index 54d3bbcc76..363e2f08eb 100644 --- a/src/reset_atoms_mol.cpp +++ b/src/reset_atoms_mol.cpp @@ -211,7 +211,7 @@ void ResetAtomsMol::reset() // if offset < 0 (default), reset it // if group = all, offset = 0 - // else offset = largest molID of non-group atoms + // else offset = largest molecule ID of non-group atoms if (offset < 0) { if (groupbit != 1) { From 031fab210feb6d67bc8203af4c176a9ac91c1a5b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 May 2025 23:28:46 -0400 Subject: [PATCH 89/94] update unittest for change in compute pair/local --- unittest/python/python-numpy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/python/python-numpy.py b/unittest/python/python-numpy.py index 4930527a61..be9109b9a3 100644 --- a/unittest/python/python-numpy.py +++ b/unittest/python/python-numpy.py @@ -153,7 +153,7 @@ class PythonNumpy(unittest.TestCase): self.assertEqual(values[0,0], 0.5) self.assertEqual(values[0,3], -0.5) self.assertEqual(values[1,0], 1.5) - self.assertEqual(values[1,3], 1.5) + self.assertEqual(values[1,3], -1.5) def testExtractAtom(self): self.lmp.command("units lj") From 63ee449dc1ec17f2c1403b9b24492e27b97dd8bd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 May 2025 21:15:48 -0400 Subject: [PATCH 90/94] reformulate description of force components --- doc/src/compute_bond_local.rst | 12 +++++++----- doc/src/compute_pair_local.rst | 7 +++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index 9aa062f911..7ce6f9b15a 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -85,11 +85,13 @@ of atoms in the bond, which is positive for a repulsive force and negative for an attractive force. The values *fx*, *fy*, and *fz* are the :math:`(x,y,z)` components of -the force vector on atom *i* obtained by projecting *force* on the -distance vector. For bond styles that apply non-central forces, such as -:doc:`bond_style bpm/rotational `, these values -only include the :math:`(x,y,z)` components of the normal force -component. +the force on the first atom *i* in the bond due to the second atom *j*. +Mathematically, they are obtained by multiplying the value of *force* +from above with a unit vector created from the *dx*, *dy*, and *dz* +components of the distance vector also described above. For bond styles +that apply non-central forces, such as :doc:`bond_style bpm/rotational +`, these values only include the :math:`(x,y,z)` +components of the normal force component. The remaining properties are all computed for motion of the two atoms relative to the center of mass (COM) velocity of the two atoms in the diff --git a/doc/src/compute_pair_local.rst b/doc/src/compute_pair_local.rst index 5e8ac73a22..605bfc8e9e 100644 --- a/doc/src/compute_pair_local.rst +++ b/doc/src/compute_pair_local.rst @@ -76,8 +76,11 @@ is positive for a repulsive force and negative for an attractive force. The values *fx*, *fy*, and *fz* are the :math:`(x,y,z)` components of -the force vector on atom *i* obtained by projecting *force* on the -distance vector. For pair styles that apply non-central forces, such as +the force vector on the first atom *i* of a pair in the neighbor list +due to the second atom *j*. Mathematically, they are obtained by +multiplying the value of *force* from above with a unit vector created +from the *dx*, *dy*, and *dz* components of the distance vector also +described above. For pair styles that apply non-central forces, such as :doc:`granular pair styles `, these values only include the :math:`(x,y,z)` components of the normal force component. From e393b9803bebb86910af976769db1379cc801e88 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 May 2025 22:41:42 -0400 Subject: [PATCH 91/94] add information about the OPC model to the TIP4P howto --- doc/src/Howto_tip4p.rst | 129 ++++++++++++++++++-- doc/utils/sphinx-config/false_positives.txt | 3 + 2 files changed, 123 insertions(+), 9 deletions(-) diff --git a/doc/src/Howto_tip4p.rst b/doc/src/Howto_tip4p.rst index 47a1b9b578..5f38ea3c62 100644 --- a/doc/src/Howto_tip4p.rst +++ b/doc/src/Howto_tip4p.rst @@ -1,5 +1,5 @@ -TIP4P water model -================= +TIP4P and OPC water models +========================== The four-point TIP4P rigid water model extends the traditional :doc:`three-point TIP3P ` model by adding an additional @@ -9,9 +9,11 @@ the oxygen along the bisector of the HOH bond angle. A bond style of :doc:`harmonic ` and an angle style of :doc:`harmonic ` or :doc:`charmm ` should also be used. In case of rigid bonds also bond style :doc:`zero ` and angle -style :doc:`zero ` can be used. +style :doc:`zero ` can be used. Very similar to the TIP4P +model is the OPC water model. It can be realized the same way as TIP4P +but has different geometry and force field parameters. -There are two ways to implement TIP4P water in LAMMPS: +There are two ways to implement TIP4P-like water in LAMMPS: #. Use a specially written pair style that uses the :ref:`TIP3P geometry ` without the point M. The point M location is then @@ -21,7 +23,10 @@ There are two ways to implement TIP4P water in LAMMPS: computationally very efficient, but the charge distribution in space is only correct within the tip4p labeled styles. So all other computations using charges will "see" the negative charge incorrectly - on the oxygen atom. + located on the oxygen atom unless they are specially written for using + the TIP4P geometry internally as well, e.g. :doc:`compute dipole/tip4p + `, :doc:`fix efield/tip4p `, or + :doc:`kspace_style pppm/tip4p `. This can be done with the following pair styles for Coulomb with a cutoff: @@ -68,77 +73,90 @@ TIP4P/2005 model :ref:`(Abascal2) ` and a version of TIP4P parameters adjusted for use with a long-range Coulombic solver (e.g. Ewald or PPPM in LAMMPS). Note that for implicit TIP4P models the OM distance is specified in the :doc:`pair_style ` command, -not as part of the pair coefficients. +not as part of the pair coefficients. Also parameters for the OPC +model (:ref:`Izadi `) are provided. .. list-table:: :header-rows: 1 - :widths: 36 19 13 15 17 + :widths: 40 12 12 14 11 11 * - Parameter - TIP4P (original) - TIP4P/Ice - TIP4P/2005 - TIP4P (Ewald) + - OPC * - O mass (amu) - 15.9994 - 15.9994 - 15.9994 - 15.9994 + - 15.9994 * - H mass (amu) - 1.008 - 1.008 - 1.008 - 1.008 + - 1.008 * - O or M charge (:math:`e`) - -1.040 - -1.1794 - -1.1128 - -1.04844 + - -1.3582 * - H charge (:math:`e`) - 0.520 - 0.5897 - 0.5564 - 0.52422 + - 0.6791 * - LJ :math:`\epsilon` of OO (kcal/mole) - 0.1550 - 0.21084 - 0.1852 - 0.16275 + - 0.21280 * - LJ :math:`\sigma` of OO (:math:`\AA`) - 3.1536 - 3.1668 - 3.1589 - 3.16435 + - 3.1660 * - LJ :math:`\epsilon` of HH, MM, OH, OM, HM (kcal/mole) - 0.0 - 0.0 - 0.0 - 0.0 + - 0.0 * - LJ :math:`\sigma` of HH, MM, OH, OM, HM (:math:`\AA`) - 1.0 - 1.0 - 1.0 - 1.0 + - 1.0 * - :math:`r_0` of OH bond (:math:`\AA`) - 0.9572 - 0.9572 - 0.9572 - 0.9572 + - 0.8724 * - :math:`\theta_0` of HOH angle - 104.52\ :math:`^{\circ}` - 104.52\ :math:`^{\circ}` - 104.52\ :math:`^{\circ}` - 104.52\ :math:`^{\circ}` + - 103.60\ :math:`^{\circ}` * - OM distance (:math:`\AA`) - 0.15 - 0.1577 - 0.1546 - 0.1250 + - 0.1594 -Note that the when using the TIP4P pair style, the neighbor list cutoff +Note that the when using a TIP4P pair style, the neighbor list cutoff for Coulomb interactions is effectively extended by a distance 2 \* (OM distance), to account for the offset distance of the fictitious charges -on O atoms in water molecules. Thus it is typically best in an +on O atoms in water molecules. Thus, it is typically best in an efficiency sense to use a LJ cutoff >= Coulomb cutoff + 2\*(OM distance), to shrink the size of the neighbor list. This leads to slightly larger cost for the long-range calculation, so you can test the @@ -192,6 +210,94 @@ file changed): run 20000 write_data tip4p-implicit.data nocoeff +When constructing an OPC model, we cannot use the ``tip3p.mol`` file due +to the different geometry. Below is a molecule file providing the 3 +sites for an implicit OPC geometry with TIP4P styles. Note, that the +"Shake" and "Special" sections are missing here. Those will be +auto-generated since the molecule file is loaded *after* the simulation +box has been created. They are required only when the molecule file +is loaded *before*. + +.. _opc3p_molecule: +.. code-block:: + + # Water molecule. 3 point geometry for OPC model + + 3 atoms + 2 bonds + 1 angles + + Coords + + 1 0.00000 -0.06037 0.00000 + 2 0.68558 0.50250 0.00000 + 3 -0.68558 0.50250 0.00000 + + Types + + 1 1 # O + 2 2 # H + 3 2 # H + + Charges + + 1 -1.3582 + 2 0.6791 + 3 0.6791 + + Bonds + + 1 1 1 2 + 2 1 1 3 + + Angles + + 1 1 2 1 3 + +Below is a LAMMPS input file using the implicit method to implement +the OPC model using the molecule file from above and including the +PPPM long-range Coulomb solver. + +.. code-block:: LAMMPS + + units real + atom_style full + region box block -5 5 -5 5 -5 5 + create_box 2 box bond/types 1 angle/types 1 & + extra/bond/per/atom 2 extra/angle/per/atom 1 extra/special/per/atom 2 + + mass 1 15.9994 + mass 2 1.008 + + pair_style lj/cut/tip4p/long 1 2 1 1 0.1594 12.0 + pair_coeff 1 1 0.2128 3.166 + pair_coeff 2 2 0.0 1.0 + + bond_style zero + bond_coeff 1 0.8724 + + angle_style zero + angle_coeff 1 103.6 + + kspace_style pppm/tip4p 1.0e-5 + + molecule water opc3p.mol # this file has the OPC geometry but is without M + create_atoms 0 random 33 34564 NULL mol water 25367 overlap 1.33 + + fix rigid all shake 0.001 10 10000 b 1 a 1 + minimize 0.0 0.0 1000 10000 + + reset_timestep 0 + timestep 1.0 + velocity all create 300.0 5463576 + fix integrate all nvt temp 300 300 100.0 + + thermo_style custom step temp press etotal pe + + thermo 1000 + run 20000 + write_data opc-implicit.data nocoeff + Below is the code for a LAMMPS input file using the explicit method and a TIP4P molecule file. Because of using :doc:`fix rigid/small ` no bonds need to be defined and thus no extra storage needs @@ -279,3 +385,8 @@ Phys, 79, 926 (1983). **(Abascal2)** Abascal, J Chem Phys, 123, 234505 (2005) https://doi.org/10.1063/1.2121687 + +.. _Izadi: + +**(Izadi)** Izadi, Anandakrishnan, Onufriev, J. Phys. Chem. Lett., 5, 21, 3863 (2014) + https://doi.org/10.1021/jz501780a diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 0c013abd56..c87637a26e 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -103,6 +103,7 @@ Amit amsmath amu Amzallag +Anandakrishnan analytical Anders Andric @@ -1732,6 +1733,7 @@ Iyz iz izcm ized +Izadi Izrailev Izumi Izvekov @@ -2808,6 +2810,7 @@ oneMKL oneway onlysalt ons +Onufriev OO Oord opencl From 2968a62937ff06cd73e8061cc76be588163b6eb7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 May 2025 23:30:18 -0400 Subject: [PATCH 92/94] continue refactoring for bio force field and water moldel discussions --- doc/src/Howto.rst | 1 + doc/src/Howto_FFgeneral.rst | 55 +++++++++++++++++++++++++++++++++++++ doc/src/Howto_bioFF.rst | 38 ++++++++++--------------- doc/src/Howto_spc.rst | 4 +-- doc/src/Howto_tip4p.rst | 10 +++---- 5 files changed, 78 insertions(+), 30 deletions(-) create mode 100644 doc/src/Howto_FFgeneral.rst diff --git a/doc/src/Howto.rst b/doc/src/Howto.rst index ec90472c27..cdc4efd737 100644 --- a/doc/src/Howto.rst +++ b/doc/src/Howto.rst @@ -66,6 +66,7 @@ Force fields howto :name: force_howto :maxdepth: 1 + Howto_FFgeneral Howto_bioFF Howto_amoeba Howto_tip3p diff --git a/doc/src/Howto_FFgeneral.rst b/doc/src/Howto_FFgeneral.rst new file mode 100644 index 0000000000..1b96ae1119 --- /dev/null +++ b/doc/src/Howto_FFgeneral.rst @@ -0,0 +1,55 @@ +Some general force field considerations +======================================= + +A compact summary of the concepts, definitions, and properties of force +fields with explicit bonded interactions (like the ones discussed in +this HowTo) is given in :ref:`(Gissinger) `. + +A force field has 2 parts: the formulas that define its potential +functions and the coefficients used for a particular system. To assign +parameters it is first required to assign atom types. Those are not +only based on the elements, but also on the chemical environment due to +the atoms bound to them. This often follows the chemical concept of +*functional groups*. Example: a carbon atom bound with a single bond to +a single OH-group (alcohol) would be a different atom type than a carbon +atom bound to a methyl CH3 group (aliphatic carbon). The atom types +usually then determine the non-bonded Lennard-Jones parameters and the +parameters for bonds, angles, dihedrals, and impropers. On top of that, +partial charges have to be applied. Those are usually independent of +the atom types and are determined either for groups of atoms called +residues with some fitting procedure based on quantum mechanical +calculations, or based on some increment system that add or subtract +increments from the partial charge of an atom based on the types of +the neighboring atoms. + +Force fields differ in the strategies they employ to determine the +parameters and charge distribution in how generic or specific they are +which in turn has an impact on the accuracy (compare for example +CGenFF to CHARMM and GAFF to Amber). Because of the different +strategies, it is not a good idea to use a mix of parameters from +different force field *families* (like CHARMM, Amber, or GROMOS) +and that extends to the parameters for the solvent, especially +water. The publication describing the parameterization of a force +field will describe which water model to use. Changing the water +model usually leads to overall worse results (even if it may improve +on the water itself). + +In addition, one has to consider that *families* of force fields like +CHARMM, Amber, OPLS, or GROMOS have evolved over time and thus provide +different *revisions* of the force field parameters. These often +corresponds to changes in the functional form or the parameterization +strategies. This may also result in changes required for simulation +settings like the preferred cutoff or how Coulomb interactions are +computed (cutoff, smoothed/shifted cutoff, or long-range with Ewald +summation or equivalent). Unless explicitly stated in the publication +describing the force field, the Coulomb interaction cannot be chosen at +will but must match the revision of the force field. That said, +liberties may be taken during the initial equilibration of a system to +speed up the process, but not for production simulations. + +---------- + +.. _Typelabel2: + +**(Gissinger)** J. R. Gissinger, I. Nikiforov, Y. Afshar, B. Waters, M. Choi, D. S. Karls, A. Stukowski, W. Im, H. Heinz, A. Kohlmeyer, and E. B. Tadmor, J Phys Chem B, 128, 3282-3297 (2024). + diff --git a/doc/src/Howto_bioFF.rst b/doc/src/Howto_bioFF.rst index 92dd45b9b6..cf8e4ab13e 100644 --- a/doc/src/Howto_bioFF.rst +++ b/doc/src/Howto_bioFF.rst @@ -1,22 +1,16 @@ CHARMM, AMBER, COMPASS, DREIDING, and OPLS force fields ======================================================= -A compact summary of the concepts, definitions, and properties of -force fields with explicit bonded interactions (like the ones discussed -in this HowTo) is given in :ref:`(Gissinger) `. - -A force field has 2 parts: the formulas that define it and the -coefficients used for a particular system. Here we only discuss -formulas implemented in LAMMPS that correspond to formulas commonly used -in the CHARMM, AMBER, COMPASS, and DREIDING force fields. Setting -coefficients is done either from special sections in an input data file -via the :doc:`read_data ` command or in the input script with -commands like :doc:`pair_coeff ` or :doc:`bond_coeff -` and so on. See the :doc:`Tools ` doc page for -additional tools that can use CHARMM, AMBER, or Materials Studio -generated files to assign force field coefficients and convert their -output into LAMMPS input. LAMMPS input scripts can also be generated by -`charmm-gui.org `_. +Here we only discuss formulas implemented in LAMMPS that correspond to +formulas commonly used in the CHARMM, AMBER, COMPASS, and DREIDING force +fields. Setting coefficients is done either from special sections in an +input data file via the :doc:`read_data ` command or in the +input script with commands like :doc:`pair_coeff ` or +:doc:`bond_coeff ` and so on. See the :doc:`Tools ` +doc page for additional tools that can use CHARMM, AMBER, or Materials +Studio generated files to assign force field coefficients and convert +their output into LAMMPS input. LAMMPS input scripts can also be +generated by `charmm-gui.org `_. CHARMM and AMBER ---------------- @@ -203,9 +197,11 @@ rather than individual force constants and geometric parameters that depend on the particular combinations of atoms involved in the bond, angle, or torsion terms. DREIDING has an :doc:`explicit hydrogen bond term ` to describe interactions involving a -hydrogen atom on very electronegative atoms (N, O, F). Unlike CHARMM -or AMBER, the DREIDING force field has not been parameterized for -considering solvents (like water). +hydrogen atom on very electronegative atoms (N, O, F). Unlike CHARMM or +AMBER, the DREIDING force field has not been parameterized for +considering solvents (like water) and has no rules for assigning +(partial) charges. That will seriously limit its accuracy when used for +simulating systems where those matter. See :ref:`(Mayo) ` for a description of the DREIDING force field @@ -272,10 +268,6 @@ compatible with a subset of OPLS interactions. ---------- -.. _Typelabel2: - -**(Gissinger)** J. R. Gissinger, I. Nikiforov, Y. Afshar, B. Waters, M. Choi, D. S. Karls, A. Stukowski, W. Im, H. Heinz, A. Kohlmeyer, and E. B. Tadmor, J Phys Chem B, 128, 3282-3297 (2024). - .. _howto-MacKerell: **(MacKerell)** MacKerell, Bashford, Bellott, Dunbrack, Evanseck, Field, Fischer, Gao, Guo, Ha, et al (1998). J Phys Chem, 102, 3586 . https://doi.org/10.1021/jp973084f diff --git a/doc/src/Howto_spc.rst b/doc/src/Howto_spc.rst index 00bd8a1b10..f84d7797d2 100644 --- a/doc/src/Howto_spc.rst +++ b/doc/src/Howto_spc.rst @@ -1,5 +1,5 @@ -SPC water model -=============== +SPC and SPC/E water model +========================= The SPC water model specifies a 3-site rigid water molecule with charges and Lennard-Jones parameters assigned to each of the three atoms. diff --git a/doc/src/Howto_tip4p.rst b/doc/src/Howto_tip4p.rst index 5f38ea3c62..76c470d615 100644 --- a/doc/src/Howto_tip4p.rst +++ b/doc/src/Howto_tip4p.rst @@ -212,11 +212,11 @@ file changed): When constructing an OPC model, we cannot use the ``tip3p.mol`` file due to the different geometry. Below is a molecule file providing the 3 -sites for an implicit OPC geometry with TIP4P styles. Note, that the -"Shake" and "Special" sections are missing here. Those will be -auto-generated since the molecule file is loaded *after* the simulation -box has been created. They are required only when the molecule file -is loaded *before*. +sites of an implicit OPC geometry for use with TIP4P styles. Note, that +the "Shake" and "Special" sections are missing here. Those will be +auto-generated by LAMMPS when the molecule file is loaded *after* the +simulation box has been created. These sections are required only when +the molecule file is loaded *before*. .. _opc3p_molecule: .. code-block:: From a821654ef53a4650f61c56f512e5a046d570492a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 19 May 2025 11:30:51 -0400 Subject: [PATCH 93/94] correct error message --- src/ML-POD/compute_podd_atom.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ML-POD/compute_podd_atom.cpp b/src/ML-POD/compute_podd_atom.cpp index c691b6b3f2..364bfb54ac 100644 --- a/src/ML-POD/compute_podd_atom.cpp +++ b/src/ML-POD/compute_podd_atom.cpp @@ -59,7 +59,7 @@ ComputePODDAtom::ComputePODDAtom(LAMMPS *lmp, int narg, char **arg) : elements = nullptr; if ((((3.0*atom->natoms)*podptr->nClusters)*podptr->Mdesc) > (MAXSMALLINT*1.0)) - error->all(FLERR, "Too many atoms ({}_ for compute {}", atom->natoms, style); + error->all(FLERR, "Too many atoms ({}) for compute {}", atom->natoms, style); size_peratom_cols = 3 * atom->natoms * podptr->Mdesc * podptr->nClusters; peratom_flag = 1; } From b9b59bd23c93bedcfd003bafad91673d96960eb9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 19 May 2025 11:31:42 -0400 Subject: [PATCH 94/94] small clarifications and corrections. Sync with current state of affairs --- doc/src/Intro_authors.rst | 5 +++-- doc/src/Intro_portability.rst | 25 +++++++++++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/doc/src/Intro_authors.rst b/doc/src/Intro_authors.rst index 38f1102595..730cd2e336 100644 --- a/doc/src/Intro_authors.rst +++ b/doc/src/Intro_authors.rst @@ -84,8 +84,9 @@ lammps.org". General questions about LAMMPS should be posted in the \normalsize -Past developers include Paul Crozier and Mark Stevens, both at SNL, -and Ray Shan, now at Materials Design. +Past core developers include Paul Crozier and Mark Stevens, both at SNL, +and Ray Shan while at SNL and later at Materials Design, now at Thermo +Fisher Scientific. ---------- diff --git a/doc/src/Intro_portability.rst b/doc/src/Intro_portability.rst index 63ae147b8c..564cdc47f4 100644 --- a/doc/src/Intro_portability.rst +++ b/doc/src/Intro_portability.rst @@ -28,8 +28,9 @@ Build systems LAMMPS can be compiled from source code using a (traditional) build system based on shell scripts, a few shell utilities (grep, sed, cat, tr) and the GNU make program. This requires running within a Bourne -shell (``/bin/sh``). Alternatively, a build system with different back -ends can be created using CMake. CMake must be at least version 3.16. +shell (``/bin/sh`` or ``/bin/bash``). Alternatively, a build system +with different back ends can be created using CMake. CMake must be +at least version 3.16. Operating systems ^^^^^^^^^^^^^^^^^ @@ -40,11 +41,18 @@ Also, compilation and correct execution on macOS and Windows (using Microsoft Visual C++) is checked automatically for the largest part of the source code. Some (optional) features are not compatible with all operating systems, either through limitations of the corresponding -LAMMPS source code or through incompatibilities of source code or -build system of required external libraries or packages. +LAMMPS source code or through incompatibilities or build system +limitations of required external libraries or packages. -Executables for Windows may be created natively using either Cygwin or -Visual Studio or with a Linux to Windows MinGW cross-compiler. +Executables for Windows may be created either natively using Cygwin, +MinGW, Intel, Clang, or Microsoft Visual C++ compilers, or with a Linux +to Windows MinGW cross-compiler. Native compilation is supported using +Microsoft Visual Studio or a terminal window (using the CMake build +system). + +Executables for macOS may be created either using Xcode or GNU compilers +installed with Homebrew. In the latter case, building of LAMMPS through +Homebrew instead of a manual compile is also possible. Additionally, FreeBSD and Solaris have been tested successfully to run LAMMPS and produce results consistent with those on Linux. @@ -61,8 +69,9 @@ CPU architectures ^^^^^^^^^^^^^^^^^ The primary CPU architecture for running LAMMPS is 64-bit x86, but also -32-bit x86, and 64-bit ARM and PowerPC (64-bit, Little Endian) are -regularly tested. +64-bit ARM and PowerPC (64-bit, Little Endian) are currently regularly +tested. Further architectures are tested by Linux distributions that +bundle LAMMPS. Portability compliance ^^^^^^^^^^^^^^^^^^^^^^