From e384dfa424e790e8e2ae550d5813165bfc2a2858 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 6 Feb 2022 14:44:49 -0500 Subject: [PATCH 01/91] 'bondlist' option for replicate command generalizes the command to work for periodic systems --- src/atom_vec.cpp | 14 ++--- src/atom_vec.h | 2 +- src/read_restart.cpp | 8 +-- src/replicate.cpp | 120 ++++++++++++++++++++++++++++++++++--------- src/replicate.h | 7 +++ 5 files changed, 116 insertions(+), 35 deletions(-) diff --git a/src/atom_vec.cpp b/src/atom_vec.cpp index aa646ecabb..816d48e2b5 100644 --- a/src/atom_vec.cpp +++ b/src/atom_vec.cpp @@ -1534,16 +1534,16 @@ int AtomVec::pack_restart(int i, double *buf) unpack data for one atom from restart file including extra quantities ------------------------------------------------------------------------- */ -int AtomVec::unpack_restart(double *buf) +int AtomVec::unpack_restart(double *buf, Atom *&thisatom) { int mm,nn,datatype,cols,collength,ncols; void *pdata,*plength; - int nlocal = atom->nlocal; + int nlocal = thisatom->nlocal; if (nlocal == nmax) { grow(0); - if (atom->nextra_store) - memory->grow(atom->extra,nmax,atom->nextra_store,"atom:extra"); + if (thisatom->nextra_store) + memory->grow(thisatom->extra,nmax,thisatom->nextra_store,"atom:extra"); } int m = 1; @@ -1624,13 +1624,13 @@ int AtomVec::unpack_restart(double *buf) // store extra restart info which fixes can unpack when instantiated - double **extra = atom->extra; - if (atom->nextra_store) { + double **extra = thisatom->extra; + if (thisatom->nextra_store) { int size = static_cast (buf[0]) - m; for (int i = 0; i < size; i++) extra[nlocal][i] = buf[m++]; } - atom->nlocal++; + thisatom->nlocal++; return m; } diff --git a/src/atom_vec.h b/src/atom_vec.h index ad1c7f3315..caef3dc218 100644 --- a/src/atom_vec.h +++ b/src/atom_vec.h @@ -111,7 +111,7 @@ class AtomVec : protected Pointers { virtual int size_restart(); virtual int pack_restart(int, double *); - virtual int unpack_restart(double *); + virtual int unpack_restart(double *, Atom *&); virtual void pack_restart_pre(int) {} virtual void pack_restart_post(int) {} diff --git a/src/read_restart.cpp b/src/read_restart.cpp index f8ac14534b..a5d5e8e0cd 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -195,7 +195,7 @@ void ReadRestart::command(int narg, char **arg) } m = 0; - while (m < assignedChunkSize) m += avec->unpack_restart(&buf[m]); + while (m < assignedChunkSize) m += avec->unpack_restart(&buf[m],atom); } // input of single native file @@ -247,7 +247,7 @@ void ReadRestart::command(int narg, char **arg) if (coord[0] >= sublo[0] && coord[0] < subhi[0] && coord[1] >= sublo[1] && coord[1] < subhi[1] && coord[2] >= sublo[2] && coord[2] < subhi[2]) { - m += avec->unpack_restart(&buf[m]); + m += avec->unpack_restart(&buf[m],atom); } else m += static_cast (buf[m]); } } @@ -292,7 +292,7 @@ void ReadRestart::command(int narg, char **arg) utils::sfread(FLERR,buf,sizeof(double),n,fp,nullptr,error); m = 0; - while (m < n) m += avec->unpack_restart(&buf[m]); + while (m < n) m += avec->unpack_restart(&buf[m],atom); } fclose(fp); @@ -385,7 +385,7 @@ void ReadRestart::command(int narg, char **arg) if (i % nclusterprocs == me - fileproc) { m = 0; - while (m < n) m += avec->unpack_restart(&buf[m]); + while (m < n) m += avec->unpack_restart(&buf[m],atom); } } diff --git a/src/replicate.cpp b/src/replicate.cpp index 80edd7bcbc..90ffe35baa 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -55,10 +55,16 @@ void Replicate::command(int narg, char **arg) int ny = utils::inumeric(FLERR,arg[1],false,lmp); int nz = utils::inumeric(FLERR,arg[2],false,lmp); int nrep = nx*ny*nz; + allnrep[0] = nx; + allnrep[1] = ny; + allnrep[2] = nz; int bbox_flag = 0; - if (narg == 4) + int bondlist_flag = 0; + if (narg == 4) { if (strcmp(arg[3],"bbox") == 0) bbox_flag = 1; + if (strcmp(arg[3],"bondlist") == 0) bondlist_flag = 1; + } // error and warning checks @@ -81,9 +87,9 @@ void Replicate::command(int narg, char **arg) MPI_Barrier(world); double time1 = platform::walltime(); - // maxtag = largest atom tag across all existing atoms + // maxtag = original largest atom tag across all existing atoms - tagint maxtag = 0; + maxtag = 0; if (atom->tag_enable) { for (i = 0; i < atom->nlocal; i++) maxtag = MAX(atom->tag[i],maxtag); tagint maxtag_all; @@ -154,7 +160,7 @@ void Replicate::command(int narg, char **arg) // atom = new replicated atom class // also set atomKK for Kokkos version of Atom class - Atom *old = atom; + old = atom; atomKK = nullptr; if (lmp->kokkos) atom = atomKK = new AtomKokkos(lmp); else atom = new Atom(lmp); @@ -229,6 +235,11 @@ void Replicate::command(int narg, char **arg) double old_xprd = domain->xprd; double old_yprd = domain->yprd; double old_zprd = domain->zprd; + double old_center[3]; + for (i = 0; i < 3; i++) { + old_prd_half[i] = domain->prd_half[i]; + old_center[i] = 0.5*(domain->boxlo[i]+domain->boxhi[i]); + } double old_xy = domain->xy; double old_xz = domain->xz; double old_yz = domain->yz; @@ -339,13 +350,13 @@ void Replicate::command(int narg, char **arg) AtomVec *avec = atom->avec; int ix,iy,iz; - tagint atom_offset,mol_offset; + tagint atom_offset,mol_offset,atom0tag; imageint image; - double x[3],lamda[3]; + double x[3],lamda[3],shiftsign[3]; double *coord; int tag_enable = atom->tag_enable; - if (bbox_flag) { + if (bbox_flag || bondlist_flag) { // allgather size of buf on each proc @@ -418,10 +429,23 @@ void Replicate::command(int narg, char **arg) int num_replicas_added = 0; + // let's repurpose the old atom class to allow atom->map for all atoms + // tag and x for the whole system (before replication) stored in 'old' + + m = 0; + old->nlocal = 0; + while (m < size_buf_all) m += old_avec->unpack_restart(&buf_all[m],old); + old->map_init(); + old->map_set(); + for (ix = 0; ix < nx; ix++) { for (iy = 0; iy < ny; iy++) { for (iz = 0; iz < nz; iz++) { + thisrep[0] = ix; + thisrep[1] = iy; + thisrep[2] = iz; + // domain->remap() overwrites coordinates, so always recompute here if (triclinic) { @@ -567,6 +591,10 @@ void Replicate::command(int narg, char **arg) m = 0; while (m < size_buf_all) { + for (j = 0; j < 3; j++) { + if (buf_all[m+j+1] > old_center[j]) shiftsign[j] = 1; + else shiftsign[j] = -1; + } image = ((imageint) IMGMAX << IMG2BITS) | ((imageint) IMGMAX << IMGBITS) | IMGMAX; if (triclinic == 0) { @@ -588,7 +616,7 @@ void Replicate::command(int narg, char **arg) coord[1] >= sublo[1] && coord[1] < subhi[1] && coord[2] >= sublo[2] && coord[2] < subhi[2]) { - m += avec->unpack_restart(&buf_all[m]); + m += avec->unpack_restart(&buf_all[m],atom); i = atom->nlocal - 1; if (tag_enable) @@ -600,6 +628,7 @@ void Replicate::command(int narg, char **arg) atom->x[i][1] = x[1]; atom->x[i][2] = x[2]; + atom0tag = atom->tag[i]; atom->tag[i] += atom_offset; atom->image[i] = image; @@ -608,27 +637,50 @@ void Replicate::command(int narg, char **arg) atom->molecule[i] += mol_offset; if (atom->molecular == Atom::MOLECULAR) { if (atom->avec->bonds_allow) - for (j = 0; j < atom->num_bond[i]; j++) - atom->bond_atom[i][j] += atom_offset; + for (j = 0; j < atom->num_bond[i]; j++) { + if (bondlist_flag) + newtag(atom0tag,atom->bond_atom[i][j],shiftsign); + else atom->bond_atom[i][j] += atom_offset; + } if (atom->avec->angles_allow) for (j = 0; j < atom->num_angle[i]; j++) { - atom->angle_atom1[i][j] += atom_offset; - atom->angle_atom2[i][j] += atom_offset; - atom->angle_atom3[i][j] += atom_offset; + if (bondlist_flag) { + newtag(atom0tag,atom->angle_atom1[i][j],shiftsign); + newtag(atom0tag,atom->angle_atom2[i][j],shiftsign); + newtag(atom0tag,atom->angle_atom3[i][j],shiftsign); + } else { + atom->angle_atom1[i][j] += atom_offset; + atom->angle_atom2[i][j] += atom_offset; + atom->angle_atom3[i][j] += atom_offset; + } } if (atom->avec->dihedrals_allow) for (j = 0; j < atom->num_dihedral[i]; j++) { - atom->dihedral_atom1[i][j] += atom_offset; - atom->dihedral_atom2[i][j] += atom_offset; - atom->dihedral_atom3[i][j] += atom_offset; - atom->dihedral_atom4[i][j] += atom_offset; + if (bondlist_flag) { + newtag(atom0tag,atom->dihedral_atom1[i][j],shiftsign); + newtag(atom0tag,atom->dihedral_atom2[i][j],shiftsign); + newtag(atom0tag,atom->dihedral_atom3[i][j],shiftsign); + newtag(atom0tag,atom->dihedral_atom4[i][j],shiftsign); + } else { + atom->dihedral_atom1[i][j] += atom_offset; + atom->dihedral_atom2[i][j] += atom_offset; + atom->dihedral_atom3[i][j] += atom_offset; + atom->dihedral_atom4[i][j] += atom_offset; + } } if (atom->avec->impropers_allow) for (j = 0; j < atom->num_improper[i]; j++) { - atom->improper_atom1[i][j] += atom_offset; - atom->improper_atom2[i][j] += atom_offset; - atom->improper_atom3[i][j] += atom_offset; - atom->improper_atom4[i][j] += atom_offset; + if (bondlist_flag) { + newtag(atom0tag,atom->improper_atom1[i][j],shiftsign); + newtag(atom0tag,atom->improper_atom2[i][j],shiftsign); + newtag(atom0tag,atom->improper_atom3[i][j],shiftsign); + newtag(atom0tag,atom->improper_atom4[i][j],shiftsign); + } else { + atom->improper_atom1[i][j] += atom_offset; + atom->improper_atom2[i][j] += atom_offset; + atom->improper_atom3[i][j] += atom_offset; + atom->improper_atom4[i][j] += atom_offset; + } } } } @@ -689,7 +741,7 @@ void Replicate::command(int narg, char **arg) coord[1] >= sublo[1] && coord[1] < subhi[1] && coord[2] >= sublo[2] && coord[2] < subhi[2]) { - m += avec->unpack_restart(&buf[m]); + m += avec->unpack_restart(&buf[m],atom); i = atom->nlocal - 1; if (tag_enable) @@ -739,7 +791,7 @@ void Replicate::command(int narg, char **arg) } } } - } // if (bbox_flag) + } // if (bbox_flag || bondlist_flag) // free communication buffer and old atom class @@ -801,3 +853,25 @@ void Replicate::command(int narg, char **arg) if (me == 0) utils::logmesg(lmp," replicate CPU = {:.3f} seconds\n",platform::walltime()-time1); } + +/* ---------------------------------------------------------------------- + find new tag for the atom 'atom2bond' bonded to atom 'atom0' + for bondlist option, useful for periodic loops or inconsistent image flags + reassign bond if > old boxlength / 2 +------------------------------------------------------------------------- */ + +void Replicate::newtag(int atom0tag, int &tag2bond, double shiftsign[]) { + double del[3]; + int rep2bond[3], repshift[3] = {0, 0, 0}; + int atom0 = old->map(atom0tag); + int atom2bond = old->map(tag2bond); + for (int i = 0; i < 3; i++) { + del[i] = fabs(old->x[atom0][i] - old->x[atom2bond][i]); + if (del[i] > old_prd_half[i]) repshift[i] = shiftsign[i]; + rep2bond[i] = thisrep[i] + repshift[i]; + if (rep2bond[i] >= allnrep[i]) rep2bond[i] = 0; + if (rep2bond[i] < 0) rep2bond[i] = allnrep[i]-1; + } + tag2bond = (tag2bond + rep2bond[2]*allnrep[1]*allnrep[0]*maxtag + + rep2bond[1]*allnrep[0]*maxtag + rep2bond[0]*maxtag); +} diff --git a/src/replicate.h b/src/replicate.h index 9eaae1d763..0edd7bf818 100644 --- a/src/replicate.h +++ b/src/replicate.h @@ -28,6 +28,13 @@ class Replicate : public Command { public: Replicate(class LAMMPS *); void command(int, char **) override; + + private: + Atom *old; + double old_prd_half[3]; + tagint maxtag; + int thisrep[3], allnrep[3]; + void newtag(tagint, tagint &, double[3]); }; } // namespace LAMMPS_NS From caafe2ff26f0cca2118563c5b0cffb7bc5cb0ecc Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 6 Feb 2022 15:31:02 -0500 Subject: [PATCH 02/91] bondlist option docs --- doc/src/replicate.rst | 53 +++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/doc/src/replicate.rst b/doc/src/replicate.rst index 24ec52cbb0..e5de48d96e 100644 --- a/doc/src/replicate.rst +++ b/doc/src/replicate.rst @@ -12,11 +12,12 @@ Syntax nx,ny,nz = replication factors in each dimension -* optional *keyword* = *bbox* +* optional *keyword* = *bbox* or *bondlist* .. parsed-literal:: *bbox* = only check atoms in replicas that overlap with a processor's sub-domain + *bondlist* = use a generalized algorithm that correctly replicates periodic loops Examples """""""" @@ -59,6 +60,33 @@ does require temporary use of more memory, specifically that each processor can store all atoms in the entire system before it is replicated. +The optional keyword *bondlist* correctly treats molecules that span +the box and are bonded to themselves across a periodic boundary, by +relying on self-consistent nearest-image assumptions (rather than +using image flags). Therefore, the *bondlist* keyword can also be +used in general for systems that may not have consistent image flags. +The *bondlist* algorithm builds off the *bbox* algorithm, so it is +fast when using a large number of processors, but does require +temporary use of more memory. Specifically, each processor must be +able to store arrays for all atoms in the entire system before it is +replicated. + +.. note:: + + For systems that contain a molecule that spans the box and is + bonded to itself across a periodic boundary (so that the molecule + is effectively a loop), the *bondlist* keyword must be used. A + simple example would be a linear polymer chain that spans the + simulation box and bonds back to itself across the periodic + boundary. More realistic examples would be a CNT (meant to be an + infinitely long CNT) or a graphene sheet or a bulk periodic crystal + where there are explicit bonds specified between near neighbors. + (Note that this restriction only applies to systems that have + permanent bonds as specified in the data file. A CNT that is just + atoms modeled with the :doc:`AIREBO potential ` has no + such permanent bonds, so it can be replicated without the + *bondlist* keyword.) + Restrictions """""""""""" @@ -68,29 +96,6 @@ If a simulation is non-periodic in a dimension, care should be used when replicating it in that dimension, as it may put atoms nearly on top of each other. -.. note:: - - You cannot use the replicate command on a system which has a - molecule that spans the box and is bonded to itself across a periodic - boundary, so that the molecule is effectively a loop. A simple - example would be a linear polymer chain that spans the simulation box - and bonds back to itself across the periodic boundary. More realistic - examples would be a CNT (meant to be an infinitely long CNT) or a - graphene sheet or a bulk periodic crystal where there are explicit - bonds specified between near neighbors. (Note that this only applies - to systems that have permanent bonds as specified in the data file. A - CNT that is just atoms modeled with the :doc:`AIREBO potential ` has no such permanent bonds, so it can be - replicated.) The reason replication does not work with those systems - is that the image flag settings described above cannot be made - consistent. I.e. it is not possible to define images flags so that - when every pair of bonded atoms is unwrapped (using the image flags), - they will be close to each other. The only way the replicate command - could work in this scenario is for it to break a bond, insert more - atoms, and re-connect the loop for the larger simulation box. But it - is not clever enough to do this. So you will have to construct a - larger version of your molecule as a pre-processing step and input a - new data file to LAMMPS. - If the current simulation was read in from a restart file (before a run is performed), there must not be any fix information stored in the file for individual atoms. Similarly, no fixes can be defined at From ac7db5041fa49bf6c15806a79355f1966f74cc01 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 6 Feb 2022 16:14:30 -0500 Subject: [PATCH 03/91] add example for bondlist option validation --- examples/replicate/in.replicate | 32 +++++ examples/replicate/log.7Jan22.replicate.g++.1 | 132 ++++++++++++++++++ examples/replicate/log.7Jan22.replicate.g++.4 | 132 ++++++++++++++++++ .../replicate/three_periodic_CNTs.data.gz | Bin 0 -> 328837 bytes 4 files changed, 296 insertions(+) create mode 100644 examples/replicate/in.replicate create mode 100644 examples/replicate/log.7Jan22.replicate.g++.1 create mode 100644 examples/replicate/log.7Jan22.replicate.g++.4 create mode 100644 examples/replicate/three_periodic_CNTs.data.gz diff --git a/examples/replicate/in.replicate b/examples/replicate/in.replicate new file mode 100644 index 0000000000..52140d4ce8 --- /dev/null +++ b/examples/replicate/in.replicate @@ -0,0 +1,32 @@ +# three orthogonal periodic CNTs +# demo for replicating triply looped system +# infinite loops in x, y, z +# includes bonded interactions across box corners +# includes bonds, angles, dihedrals, impropers (class2) + +units real + +boundary p p p + +atom_style full + +pair_style lj/class2 10 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data three_periodic_CNTs.data.gz + +replicate 2 2 2 bondlist + +fix 1 all nve + +run 100 + +# write_restart replicate.restart +# write_data replicate.data diff --git a/examples/replicate/log.7Jan22.replicate.g++.1 b/examples/replicate/log.7Jan22.replicate.g++.1 new file mode 100644 index 0000000000..2933535ae8 --- /dev/null +++ b/examples/replicate/log.7Jan22.replicate.g++.1 @@ -0,0 +1,132 @@ +LAMMPS (7 Jan 2022) +# three orthogonal periodic CNTs +# demo for replicating triply looped system +# infinite loops in x, y, z +# includes bonded interactions across box corners +# includes bonds, angles, dihedrals, impropers (class2) + +units real + +boundary p p p + +atom_style full + +pair_style lj/class2 10 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data three_periodic_CNTs.data.gz +Reading data file ... + orthogonal box = (0 0 0) to (80.96 80.96 80.96) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3168 atoms + reading velocities ... + 3168 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 3 = max angles/atom + scanning dihedrals ... + 12 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 4752 bonds + reading angles ... + 9504 angles + reading dihedrals ... + 19008 dihedrals + reading impropers ... + 3168 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 3 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 18 = max # of 1-4 neighbors + 18 = max # of special neighbors + special bonds CPU = 0.003 seconds + read_data CPU = 0.115 seconds + +replicate 2 2 2 bondlist +Replicating atoms ... + orthogonal box = (0 0 0) to (161.92 161.92 161.92) + 1 by 1 by 1 MPI processor grid + bounding box image = (0 0 0) to (0 0 0) + bounding box extra memory = 1.62 MB + average # of replicas added to proc = 8.00 out of 8 (100.00%) + 25344 atoms + 38016 bonds + 76032 angles + 152064 dihedrals + 25344 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 3 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 18 = max # of 1-4 neighbors + 18 = max # of special neighbors + special bonds CPU = 0.021 seconds + replicate CPU = 0.052 seconds + +fix 1 all nve + +run 100 + generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 27 27 27 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/class2, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +WARNING: Inconsistent image flags (../domain.cpp:814) +Per MPI rank memory allocation (min/avg/max) = 51.87 | 51.87 | 51.87 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -14266.189 1466925.5 1452659.3 -29908.753 + 100 2155.9128 -17224.188 1306769.8 1452409 1985.2082 +Loop time of 15.0972 on 1 procs for 100 steps with 25344 atoms + +Performance: 0.572 ns/day, 41.937 hours/ns, 6.624 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 3.7175 | 3.7175 | 3.7175 | 0.0 | 24.62 +Bond | 11.222 | 11.222 | 11.222 | 0.0 | 74.33 +Neigh | 0.1032 | 0.1032 | 0.1032 | 0.0 | 0.68 +Comm | 0.014487 | 0.014487 | 0.014487 | 0.0 | 0.10 +Output | 0.00010894 | 0.00010894 | 0.00010894 | 0.0 | 0.00 +Modify | 0.027112 | 0.027112 | 0.027112 | 0.0 | 0.18 +Other | | 0.01274 | | | 0.08 + +Nlocal: 25344 ave 25344 max 25344 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 22737 ave 22737 max 22737 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 2.89358e+06 ave 2.89358e+06 max 2.89358e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2893576 +Ave neighs/atom = 114.17203 +Ave special neighs/atom = 18 +Neighbor list builds = 1 +Dangerous builds = 0 + +# write_restart replicate.restart +# write_data replicate.data +Total wall time: 0:00:15 diff --git a/examples/replicate/log.7Jan22.replicate.g++.4 b/examples/replicate/log.7Jan22.replicate.g++.4 new file mode 100644 index 0000000000..79a13b1484 --- /dev/null +++ b/examples/replicate/log.7Jan22.replicate.g++.4 @@ -0,0 +1,132 @@ +LAMMPS (7 Jan 2022) +# three orthogonal periodic CNTs +# demo for replicating triply looped system +# infinite loops in x, y, z +# includes bonded interactions across box corners +# includes bonds, angles, dihedrals, impropers (class2) + +units real + +boundary p p p + +atom_style full + +pair_style lj/class2 10 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data three_periodic_CNTs.data.gz +Reading data file ... + orthogonal box = (0 0 0) to (80.96 80.96 80.96) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 3168 atoms + reading velocities ... + 3168 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 3 = max angles/atom + scanning dihedrals ... + 12 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 4752 bonds + reading angles ... + 9504 angles + reading dihedrals ... + 19008 dihedrals + reading impropers ... + 3168 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 3 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 18 = max # of 1-4 neighbors + 18 = max # of special neighbors + special bonds CPU = 0.001 seconds + read_data CPU = 0.315 seconds + +replicate 2 2 2 bondlist +Replicating atoms ... + orthogonal box = (0 0 0) to (161.92 161.92 161.92) + 1 by 2 by 2 MPI processor grid + bounding box image = (0 0 0) to (0 0 0) + bounding box extra memory = 1.62 MB + average # of replicas added to proc = 4.50 out of 8 (56.25%) + 25344 atoms + 38016 bonds + 76032 angles + 152064 dihedrals + 25344 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 3 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 18 = max # of 1-4 neighbors + 18 = max # of special neighbors + special bonds CPU = 0.007 seconds + replicate CPU = 0.020 seconds + +fix 1 all nve + +run 100 + generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 27 27 27 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/class2, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +WARNING: Inconsistent image flags (../domain.cpp:814) +Per MPI rank memory allocation (min/avg/max) = 28.69 | 28.69 | 28.69 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -14266.189 1466925.5 1452659.3 -29908.753 + 100 2155.9128 -17224.188 1306769.8 1452409 1985.2082 +Loop time of 4.13195 on 4 procs for 100 steps with 25344 atoms + +Performance: 2.091 ns/day, 11.478 hours/ns, 24.202 timesteps/s +100.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.99372 | 1.014 | 1.0672 | 3.1 | 24.54 +Bond | 2.9449 | 2.9795 | 3.0136 | 2.0 | 72.11 +Neigh | 0.026695 | 0.026706 | 0.026716 | 0.0 | 0.65 +Comm | 0.012404 | 0.099546 | 0.15425 | 18.7 | 2.41 +Output | 4.3822e-05 | 5.0693e-05 | 7.0516e-05 | 0.0 | 0.00 +Modify | 0.0074219 | 0.0074887 | 0.0075411 | 0.1 | 0.18 +Other | | 0.004616 | | | 0.11 + +Nlocal: 6336 ave 6336 max 6336 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 10558 ave 10558 max 10558 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 723394 ave 723394 max 723394 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2893576 +Ave neighs/atom = 114.17203 +Ave special neighs/atom = 18 +Neighbor list builds = 1 +Dangerous builds = 0 + +# write_restart replicate.restart +# write_data replicate.data +Total wall time: 0:00:04 diff --git a/examples/replicate/three_periodic_CNTs.data.gz b/examples/replicate/three_periodic_CNTs.data.gz new file mode 100644 index 0000000000000000000000000000000000000000..718c91896a81d350c43a1296a30e05f15d89d3e6 GIT binary patch literal 328837 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 Date: Mon, 7 Feb 2022 18:02:17 -0500 Subject: [PATCH 04/91] typo --- src/replicate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/replicate.cpp b/src/replicate.cpp index 90ffe35baa..69f04310e4 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -860,7 +860,7 @@ void Replicate::command(int narg, char **arg) reassign bond if > old boxlength / 2 ------------------------------------------------------------------------- */ -void Replicate::newtag(int atom0tag, int &tag2bond, double shiftsign[]) { +void Replicate::newtag(tagint atom0tag, tagint &tag2bond, double shiftsign[]) { double del[3]; int rep2bond[3], repshift[3] = {0, 0, 0}; int atom0 = old->map(atom0tag); From 2a4dbe5bbc8554a842dea8aee9bbd96534dc27da Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 13 Feb 2022 13:51:20 -0500 Subject: [PATCH 05/91] bondlist_flag correction --- src/replicate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/replicate.cpp b/src/replicate.cpp index 69f04310e4..aa4fc44c00 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -118,7 +118,7 @@ void Replicate::command(int narg, char **arg) _imagehi[1] = 0; _imagehi[2] = 0; - if (bbox_flag) { + if (bbox_flag || bondlist_flag) { for (i=0; inlocal; ++i) { imageint image = atom->image[i]; From 7288d78331ccd2be9db2470cf9aa978f1f94dd70 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 13 Feb 2022 14:06:19 -0500 Subject: [PATCH 06/91] reset image flag for bondlist option --- src/replicate.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/replicate.cpp b/src/replicate.cpp index aa4fc44c00..df0e363840 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -107,6 +107,11 @@ void Replicate::command(int narg, char **arg) maxmol = maxmol_all; } + // reset image flags for bondlist option + if (bondlist_flag) + for (i=0; inlocal; ++i) + atom->image[i] = 0; + // check image flags maximum extent // only efficient small image flags compared to new system From 437e7829cc37d17fbfe0e4a30578c0b8aafe57c6 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 13 Feb 2022 14:11:15 -0500 Subject: [PATCH 07/91] Update replicate.rst --- doc/src/replicate.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/src/replicate.rst b/doc/src/replicate.rst index e5de48d96e..9181f0e940 100644 --- a/doc/src/replicate.rst +++ b/doc/src/replicate.rst @@ -63,13 +63,13 @@ replicated. The optional keyword *bondlist* correctly treats molecules that span the box and are bonded to themselves across a periodic boundary, by relying on self-consistent nearest-image assumptions (rather than -using image flags). Therefore, the *bondlist* keyword can also be -used in general for systems that may not have consistent image flags. -The *bondlist* algorithm builds off the *bbox* algorithm, so it is -fast when using a large number of processors, but does require -temporary use of more memory. Specifically, each processor must be -able to store arrays for all atoms in the entire system before it is -replicated. +using image flags). The *bondlist* option resets all image flags to +zero. Therefore, the *bondlist* keyword can also be used in general +for systems that may not have consistent image flags. The *bondlist* +algorithm builds off the *bbox* algorithm, so it is fast when using a +large number of processors, but does require temporary use of more +memory. Specifically, each processor must be able to store arrays for +all atoms in the entire system before it is replicated. .. note:: From 44c3f4e5625c0843480a1609392c5664b2777023 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 13 Feb 2022 14:51:23 -0500 Subject: [PATCH 08/91] fix for breaking kokkos --- src/atom_vec.cpp | 8 ++++++++ src/atom_vec.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/atom_vec.cpp b/src/atom_vec.cpp index 816d48e2b5..1d64915a6a 100644 --- a/src/atom_vec.cpp +++ b/src/atom_vec.cpp @@ -1530,6 +1530,14 @@ int AtomVec::pack_restart(int i, double *buf) return m; } +/* ---------------------------------------------------------------------- + standard unpack_restart function using default atom instance +------------------------------------------------------------------------- */ +int AtomVec::unpack_restart(double *buf) +{ + return unpack_restart(buf, atom); +} + /* ---------------------------------------------------------------------- unpack data for one atom from restart file including extra quantities ------------------------------------------------------------------------- */ diff --git a/src/atom_vec.h b/src/atom_vec.h index caef3dc218..d7ea6b00d8 100644 --- a/src/atom_vec.h +++ b/src/atom_vec.h @@ -111,6 +111,7 @@ class AtomVec : protected Pointers { virtual int size_restart(); virtual int pack_restart(int, double *); + virtual int unpack_restart(double *); virtual int unpack_restart(double *, Atom *&); virtual void pack_restart_pre(int) {} From 5c1486661c5fc0d49e023af893885cffca2a1897 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 13 Feb 2022 14:53:16 -0500 Subject: [PATCH 09/91] revert now unnecessary edits --- src/read_restart.cpp | 8 ++++---- src/replicate.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/read_restart.cpp b/src/read_restart.cpp index a5d5e8e0cd..f8ac14534b 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -195,7 +195,7 @@ void ReadRestart::command(int narg, char **arg) } m = 0; - while (m < assignedChunkSize) m += avec->unpack_restart(&buf[m],atom); + while (m < assignedChunkSize) m += avec->unpack_restart(&buf[m]); } // input of single native file @@ -247,7 +247,7 @@ void ReadRestart::command(int narg, char **arg) if (coord[0] >= sublo[0] && coord[0] < subhi[0] && coord[1] >= sublo[1] && coord[1] < subhi[1] && coord[2] >= sublo[2] && coord[2] < subhi[2]) { - m += avec->unpack_restart(&buf[m],atom); + m += avec->unpack_restart(&buf[m]); } else m += static_cast (buf[m]); } } @@ -292,7 +292,7 @@ void ReadRestart::command(int narg, char **arg) utils::sfread(FLERR,buf,sizeof(double),n,fp,nullptr,error); m = 0; - while (m < n) m += avec->unpack_restart(&buf[m],atom); + while (m < n) m += avec->unpack_restart(&buf[m]); } fclose(fp); @@ -385,7 +385,7 @@ void ReadRestart::command(int narg, char **arg) if (i % nclusterprocs == me - fileproc) { m = 0; - while (m < n) m += avec->unpack_restart(&buf[m],atom); + while (m < n) m += avec->unpack_restart(&buf[m]); } } diff --git a/src/replicate.cpp b/src/replicate.cpp index df0e363840..45ecd3ec9a 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -621,7 +621,7 @@ void Replicate::command(int narg, char **arg) coord[1] >= sublo[1] && coord[1] < subhi[1] && coord[2] >= sublo[2] && coord[2] < subhi[2]) { - m += avec->unpack_restart(&buf_all[m],atom); + m += avec->unpack_restart(&buf_all[m]); i = atom->nlocal - 1; if (tag_enable) @@ -746,7 +746,7 @@ void Replicate::command(int narg, char **arg) coord[1] >= sublo[1] && coord[1] < subhi[1] && coord[2] >= sublo[2] && coord[2] < subhi[2]) { - m += avec->unpack_restart(&buf[m],atom); + m += avec->unpack_restart(&buf[m]); i = atom->nlocal - 1; if (tag_enable) From 2c0a9cf5724ba9a743c92e9b5e27b60eaa0b8aa5 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 13 Feb 2022 15:06:10 -0500 Subject: [PATCH 10/91] better contain bondlist code --- src/replicate.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/replicate.cpp b/src/replicate.cpp index 45ecd3ec9a..ae30814f68 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -437,11 +437,13 @@ void Replicate::command(int narg, char **arg) // let's repurpose the old atom class to allow atom->map for all atoms // tag and x for the whole system (before replication) stored in 'old' - m = 0; - old->nlocal = 0; - while (m < size_buf_all) m += old_avec->unpack_restart(&buf_all[m],old); - old->map_init(); - old->map_set(); + if (bondlist_flag) { + m = 0; + old->nlocal = 0; + while (m < size_buf_all) m += old_avec->unpack_restart(&buf_all[m],old); + old->map_init(); + old->map_set(); + } for (ix = 0; ix < nx; ix++) { for (iy = 0; iy < ny; iy++) { From 793cfe05f9773cd1ae0228251482890d83cf3bab Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 13 Feb 2022 15:09:32 -0500 Subject: [PATCH 11/91] spacing --- src/replicate.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/replicate.h b/src/replicate.h index 0edd7bf818..f8425cdf65 100644 --- a/src/replicate.h +++ b/src/replicate.h @@ -29,12 +29,12 @@ class Replicate : public Command { Replicate(class LAMMPS *); void command(int, char **) override; - private: - Atom *old; - double old_prd_half[3]; - tagint maxtag; - int thisrep[3], allnrep[3]; - void newtag(tagint, tagint &, double[3]); + private: + Atom *old; + double old_prd_half[3]; + tagint maxtag; + int thisrep[3], allnrep[3]; + void newtag(tagint, tagint &, double[3]); }; } // namespace LAMMPS_NS From 200ea62fd3474de3232ad70a2f76c3d98f87302d Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 13 Feb 2022 15:22:13 -0500 Subject: [PATCH 12/91] simplify things --- src/replicate.cpp | 44 +++++++++++++++++++++----------------------- src/replicate.h | 4 ++-- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/replicate.cpp b/src/replicate.cpp index ae30814f68..1eee50f49d 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -240,7 +240,6 @@ void Replicate::command(int narg, char **arg) double old_xprd = domain->xprd; double old_yprd = domain->yprd; double old_zprd = domain->zprd; - double old_center[3]; for (i = 0; i < 3; i++) { old_prd_half[i] = domain->prd_half[i]; old_center[i] = 0.5*(domain->boxlo[i]+domain->boxhi[i]); @@ -598,10 +597,6 @@ void Replicate::command(int narg, char **arg) m = 0; while (m < size_buf_all) { - for (j = 0; j < 3; j++) { - if (buf_all[m+j+1] > old_center[j]) shiftsign[j] = 1; - else shiftsign[j] = -1; - } image = ((imageint) IMGMAX << IMG2BITS) | ((imageint) IMGMAX << IMGBITS) | IMGMAX; if (triclinic == 0) { @@ -646,15 +641,15 @@ void Replicate::command(int narg, char **arg) if (atom->avec->bonds_allow) for (j = 0; j < atom->num_bond[i]; j++) { if (bondlist_flag) - newtag(atom0tag,atom->bond_atom[i][j],shiftsign); + newtag(atom0tag,atom->bond_atom[i][j]); else atom->bond_atom[i][j] += atom_offset; } if (atom->avec->angles_allow) for (j = 0; j < atom->num_angle[i]; j++) { if (bondlist_flag) { - newtag(atom0tag,atom->angle_atom1[i][j],shiftsign); - newtag(atom0tag,atom->angle_atom2[i][j],shiftsign); - newtag(atom0tag,atom->angle_atom3[i][j],shiftsign); + newtag(atom0tag,atom->angle_atom1[i][j]); + newtag(atom0tag,atom->angle_atom2[i][j]); + newtag(atom0tag,atom->angle_atom3[i][j]); } else { atom->angle_atom1[i][j] += atom_offset; atom->angle_atom2[i][j] += atom_offset; @@ -664,10 +659,10 @@ void Replicate::command(int narg, char **arg) if (atom->avec->dihedrals_allow) for (j = 0; j < atom->num_dihedral[i]; j++) { if (bondlist_flag) { - newtag(atom0tag,atom->dihedral_atom1[i][j],shiftsign); - newtag(atom0tag,atom->dihedral_atom2[i][j],shiftsign); - newtag(atom0tag,atom->dihedral_atom3[i][j],shiftsign); - newtag(atom0tag,atom->dihedral_atom4[i][j],shiftsign); + newtag(atom0tag,atom->dihedral_atom1[i][j]); + newtag(atom0tag,atom->dihedral_atom2[i][j]); + newtag(atom0tag,atom->dihedral_atom3[i][j]); + newtag(atom0tag,atom->dihedral_atom4[i][j]); } else { atom->dihedral_atom1[i][j] += atom_offset; atom->dihedral_atom2[i][j] += atom_offset; @@ -678,10 +673,10 @@ void Replicate::command(int narg, char **arg) if (atom->avec->impropers_allow) for (j = 0; j < atom->num_improper[i]; j++) { if (bondlist_flag) { - newtag(atom0tag,atom->improper_atom1[i][j],shiftsign); - newtag(atom0tag,atom->improper_atom2[i][j],shiftsign); - newtag(atom0tag,atom->improper_atom3[i][j],shiftsign); - newtag(atom0tag,atom->improper_atom4[i][j],shiftsign); + newtag(atom0tag,atom->improper_atom1[i][j]); + newtag(atom0tag,atom->improper_atom2[i][j]); + newtag(atom0tag,atom->improper_atom3[i][j]); + newtag(atom0tag,atom->improper_atom4[i][j]); } else { atom->improper_atom1[i][j] += atom_offset; atom->improper_atom2[i][j] += atom_offset; @@ -867,15 +862,18 @@ void Replicate::command(int narg, char **arg) reassign bond if > old boxlength / 2 ------------------------------------------------------------------------- */ -void Replicate::newtag(tagint atom0tag, tagint &tag2bond, double shiftsign[]) { - double del[3]; - int rep2bond[3], repshift[3] = {0, 0, 0}; +void Replicate::newtag(tagint atom0tag, tagint &tag2bond) { + double del; + int repshift,rep2bond[3]; int atom0 = old->map(atom0tag); int atom2bond = old->map(tag2bond); for (int i = 0; i < 3; i++) { - del[i] = fabs(old->x[atom0][i] - old->x[atom2bond][i]); - if (del[i] > old_prd_half[i]) repshift[i] = shiftsign[i]; - rep2bond[i] = thisrep[i] + repshift[i]; + del = fabs(old->x[atom0][i] - old->x[atom2bond][i]); + if (del > old_prd_half[i]) { + if (old->x[atom0][i] > old_center[i]) repshift = 1; + else repshift = -1; + } else repshift = 0; + rep2bond[i] = thisrep[i] + repshift; if (rep2bond[i] >= allnrep[i]) rep2bond[i] = 0; if (rep2bond[i] < 0) rep2bond[i] = allnrep[i]-1; } diff --git a/src/replicate.h b/src/replicate.h index f8425cdf65..938814e70b 100644 --- a/src/replicate.h +++ b/src/replicate.h @@ -31,10 +31,10 @@ class Replicate : public Command { private: Atom *old; - double old_prd_half[3]; + double old_prd_half[3], old_center[3]; tagint maxtag; int thisrep[3], allnrep[3]; - void newtag(tagint, tagint &, double[3]); + void newtag(tagint, tagint &); }; } // namespace LAMMPS_NS From be6c41a85a229e8d4953229b77af3f4c28863164 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Wed, 23 Feb 2022 00:44:39 -0500 Subject: [PATCH 13/91] delete now-unused variable --- src/replicate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/replicate.cpp b/src/replicate.cpp index 1eee50f49d..bc9939ce2c 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -356,7 +356,7 @@ void Replicate::command(int narg, char **arg) int ix,iy,iz; tagint atom_offset,mol_offset,atom0tag; imageint image; - double x[3],lamda[3],shiftsign[3]; + double x[3],lamda[3]; double *coord; int tag_enable = atom->tag_enable; From 78458a214390a8e9a83e8220c6eb76eb62892219 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Wed, 23 Feb 2022 01:04:04 -0500 Subject: [PATCH 14/91] add mention of example in docs --- doc/src/replicate.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/replicate.rst b/doc/src/replicate.rst index 9181f0e940..f6c637b200 100644 --- a/doc/src/replicate.rst +++ b/doc/src/replicate.rst @@ -22,6 +22,8 @@ nx,ny,nz = replication factors in each dimension Examples """""""" +For an example of replicating periodically looped carbon nanotubes, see examples/replicate. + .. code-block:: LAMMPS replicate 2 3 2 From b4c58c98283003dbe6b1ffd22d2deced27ed5c20 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Fri, 22 Apr 2022 21:19:53 -0400 Subject: [PATCH 15/91] actually reset image flags --- src/replicate.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/replicate.cpp b/src/replicate.cpp index bc9939ce2c..2f65aa7e46 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -110,7 +110,8 @@ void Replicate::command(int narg, char **arg) // reset image flags for bondlist option if (bondlist_flag) for (i=0; inlocal; ++i) - atom->image[i] = 0; + atom->image[i] = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; // check image flags maximum extent // only efficient small image flags compared to new system From 5bc1fb1580c799f9c5fe1661bcad3b5f0778a8eb Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Tue, 7 Jun 2022 10:47:18 -0400 Subject: [PATCH 16/91] revert unneeded changes to atom_vec --- src/atom_vec.cpp | 21 ++++++--------------- src/atom_vec.h | 1 - 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/atom_vec.cpp b/src/atom_vec.cpp index 266a774d6f..dbacf2237a 100644 --- a/src/atom_vec.cpp +++ b/src/atom_vec.cpp @@ -1482,28 +1482,19 @@ int AtomVec::pack_restart(int i, double *buf) return m; } -/* ---------------------------------------------------------------------- - standard unpack_restart function using default atom instance -------------------------------------------------------------------------- */ -int AtomVec::unpack_restart(double *buf) -{ - return unpack_restart(buf, atom); -} - /* ---------------------------------------------------------------------- unpack data for one atom from restart file including extra quantities ------------------------------------------------------------------------- */ -int AtomVec::unpack_restart(double *buf, Atom *&thisatom) +int AtomVec::unpack_restart(double *buf) { int mm, nn, datatype, cols, collength, ncols; void *pdata, *plength; - int nlocal = thisatom->nlocal; + int nlocal = atom->nlocal; if (nlocal == nmax) { grow(0); - if (thisatom->nextra_store) - memory->grow(thisatom->extra, nmax, thisatom->nextra_store, "atom:extra"); + if (atom->nextra_store) memory->grow(atom->extra, nmax, atom->nextra_store, "atom:extra"); } int m = 1; @@ -1584,13 +1575,13 @@ int AtomVec::unpack_restart(double *buf, Atom *&thisatom) // store extra restart info which fixes can unpack when instantiated - double **extra = thisatom->extra; - if (thisatom->nextra_store) { + double **extra = atom->extra; + if (atom->nextra_store) { int size = static_cast(buf[0]) - m; for (int i = 0; i < size; i++) extra[nlocal][i] = buf[m++]; } - thisatom->nlocal++; + atom->nlocal++; return m; } diff --git a/src/atom_vec.h b/src/atom_vec.h index e1959c6557..b8f6202e78 100644 --- a/src/atom_vec.h +++ b/src/atom_vec.h @@ -111,7 +111,6 @@ class AtomVec : protected Pointers { virtual int size_restart(); virtual int pack_restart(int, double *); virtual int unpack_restart(double *); - virtual int unpack_restart(double *, Atom *&); virtual void pack_restart_pre(int) {} virtual void pack_restart_post(int) {} From f024abfe34ffbd8b036e4024991cd031168a957a Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Tue, 7 Jun 2022 11:10:36 -0400 Subject: [PATCH 17/91] make simpler, faster, more self-contained (and fix bugs) --- src/replicate.cpp | 35 +++++++++++++++++++++++------------ src/replicate.h | 6 +++++- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/replicate.cpp b/src/replicate.cpp index 2f65aa7e46..460bd75715 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -166,7 +166,7 @@ void Replicate::command(int narg, char **arg) // atom = new replicated atom class // also set atomKK for Kokkos version of Atom class - old = atom; + Atom *old = atom; atomKK = nullptr; if (lmp->kokkos) atom = atomKK = new AtomKokkos(lmp); else atom = new Atom(lmp); @@ -434,15 +434,22 @@ void Replicate::command(int narg, char **arg) int num_replicas_added = 0; - // let's repurpose the old atom class to allow atom->map for all atoms - // tag and x for the whole system (before replication) stored in 'old' + // store x and tag for the whole system (before replication) if (bondlist_flag) { - m = 0; - old->nlocal = 0; - while (m < size_buf_all) m += old_avec->unpack_restart(&buf_all[m],old); - old->map_init(); - old->map_set(); + memory->create(old_x,old->natoms,3,"replicate:old_x"); + memory->create(old_tag,old->natoms,"replicate:old_tag"); + + i = m = 0; + while (m < size_buf_all) { + old_x[i][0] = buf_all[m+1]; + old_x[i][1] = buf_all[m+2]; + old_x[i][2] = buf_all[m+3]; + old_tag[i] = (tagint) ubuf(buf_all[m+4]).i; + old_map.insert({old_tag[i],i}); + m += static_cast (buf_all[m]); + i++; + } } for (ix = 0; ix < nx; ix++) { @@ -698,6 +705,10 @@ void Replicate::command(int narg, char **arg) memory->destroy(size_buf_rnk); memory->destroy(disp_buf_rnk); memory->destroy(buf_all); + if (bondlist_flag) { + memory->destroy(old_x); + memory->destroy(old_tag); + } int sum = 0; MPI_Reduce(&num_replicas_added, &sum, 1, MPI_INT, MPI_SUM, 0, world); @@ -866,12 +877,12 @@ void Replicate::command(int narg, char **arg) void Replicate::newtag(tagint atom0tag, tagint &tag2bond) { double del; int repshift,rep2bond[3]; - int atom0 = old->map(atom0tag); - int atom2bond = old->map(tag2bond); + int atom0 = old_map.find(atom0tag)->second; + int atom2bond = old_map.find(tag2bond)->second; for (int i = 0; i < 3; i++) { - del = fabs(old->x[atom0][i] - old->x[atom2bond][i]); + del = fabs(old_x[atom0][i] - old_x[atom2bond][i]); if (del > old_prd_half[i]) { - if (old->x[atom0][i] > old_center[i]) repshift = 1; + if (old_x[atom0][i] > old_center[i]) repshift = 1; else repshift = -1; } else repshift = 0; rep2bond[i] = thisrep[i] + repshift; diff --git a/src/replicate.h b/src/replicate.h index 8a1d7f7fc6..33b273ddf4 100644 --- a/src/replicate.h +++ b/src/replicate.h @@ -22,6 +22,8 @@ CommandStyle(replicate,Replicate); #include "command.h" +#include + namespace LAMMPS_NS { class Replicate : public Command { @@ -30,8 +32,10 @@ class Replicate : public Command { void command(int, char **) override; private: - Atom *old; + std::unordered_map old_map; + double **old_x; double old_prd_half[3], old_center[3]; + tagint *old_tag; tagint maxtag; int thisrep[3], allnrep[3]; void newtag(tagint, tagint &); From 0e07089de689663a06c9754621e17a306e67ba18 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Wed, 7 Jun 2023 22:04:28 -0400 Subject: [PATCH 18/91] create_atoms:overlap_keyword_w_atomic_molecules --- src/create_atoms.cpp | 103 ++++++++++++++++++++++++++++++++----------- src/create_atoms.h | 5 ++- 2 files changed, 81 insertions(+), 27 deletions(-) diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 32be85e647..146eb23915 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -308,6 +308,7 @@ void CreateAtoms::command(int narg, char **arg) onemol->compute_center(); ranmol = new RanMars(lmp, molseed + comm->me); + memory->create(xmol, onemol->natoms, 3, "create_atoms:xmol"); } if (style == MESH) { @@ -634,6 +635,7 @@ void CreateAtoms::command(int narg, char **arg) delete[] xstr; delete[] ystr; delete[] zstr; + if (mode == MOLECULE) memory->destroy(xmol); // for MOLECULE mode: // create special bond lists for molecular systems, @@ -697,7 +699,8 @@ void CreateAtoms::add_single() if (mode == ATOM) { atom->avec->create_atom(ntype, xone); } else { - add_molecule(xone); + get_xmol(xone); + add_molecule(); } } } @@ -708,15 +711,17 @@ void CreateAtoms::add_single() void CreateAtoms::add_random() { + int incr; double xlo, ylo, zlo, xhi, yhi, zhi, zmid; double delx, dely, delz, distsq, odistsq; double lamda[3], *coord; - double *boxlo, *boxhi; + double *boxlo, *boxhi, *xmolbuf; if (overlapflag) { double odist = overlap; - if (mode == MOLECULE) odist += onemol->molradius; odistsq = odist * odist; + if (mode == MOLECULE) + memory->create(xmolbuf, onemol->natoms*3, "create_atoms:xmolbuf"); } // random number generator, same for all procs @@ -799,25 +804,54 @@ void CreateAtoms::add_random() // check for overlap of new atom/mol with all other atoms // including prior insertions // minimum_image() needed to account for distances across PBC - // new molecule only checks its center pt against others - // odistsq is expanded for mode=MOLECULE to account for molecule size if (overlapflag) { double **x = atom->x; int nlocal = atom->nlocal; int reject = 0; - for (int i = 0; i < nlocal; i++) { - delx = xone[0] - x[i][0]; - dely = xone[1] - x[i][1]; - delz = xone[2] - x[i][2]; - domain->minimum_image(delx, dely, delz); - distsq = delx * delx + dely * dely + delz * delz; - if (distsq < odistsq) { - reject = 1; - break; + if (mode == ATOM) { + for (int i = 0; i < nlocal; i++) { + delx = xone[0] - x[i][0]; + dely = xone[1] - x[i][1]; + delz = xone[2] - x[i][2]; + domain->minimum_image(delx, dely, delz); + distsq = delx * delx + dely * dely + delz * delz; + if (distsq < odistsq) { + reject = 1; + break; + } + } + } else { + int incr; + if (comm->me == 0) { + get_xmol(xone); + incr = 0; + for (int i = 0; i < onemol->natoms; i++) + for (int j = 0; j < 3; j++) + xmolbuf[incr++] = xmol[i][j]; + } + MPI_Bcast(xmolbuf, onemol->natoms*3, MPI_DOUBLE, 0, world); + incr = 0; + for (int i = 0; i < onemol->natoms; i++) + for (int j = 0; j < 3; j++) + xmol[i][j] = xmolbuf[incr++]; + + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < onemol->natoms; j++) { + delx = xmol[j][0] - x[i][0]; + dely = xmol[j][1] - x[i][1]; + delz = xmol[j][2] - x[i][2]; + domain->minimum_image(delx, dely, delz); + distsq = delx * delx + dely * dely + delz * delz; + if (distsq < odistsq) { + reject = 1; + break; + } + } } } + int reject_any; MPI_Allreduce(&reject, &reject_any, 1, MPI_INT, MPI_MAX, world); if (reject_any) continue; @@ -844,7 +878,11 @@ void CreateAtoms::add_random() if (mode == ATOM) { atom->avec->create_atom(ntype, xone); } else { - add_molecule(xone); + + // atomic coordinates calculated above for overlap check + + if (!overlapflag) get_xmol(xone); + add_molecule(); } } } @@ -857,6 +895,7 @@ void CreateAtoms::add_random() // clean-up delete random; + if (overlapflag && mode == MOLECULE) memory->destroy(xmolbuf); } /* ---------------------------------------------------------------------- @@ -1346,7 +1385,8 @@ void CreateAtoms::loop_lattice(int action) if (mode == ATOM) { atom->avec->create_atom(basistype[m], x); } else { - add_molecule(x); + get_xmol(x); + add_molecule(); } } else if (action == COUNT) { if (nlatt == MAXSMALLINT) nlatt_overflow = 1; @@ -1354,7 +1394,8 @@ void CreateAtoms::loop_lattice(int action) if (mode == ATOM) { atom->avec->create_atom(basistype[m], x); } else { - add_molecule(x); + get_xmol(x); + add_molecule(); } } @@ -1369,7 +1410,7 @@ void CreateAtoms::loop_lattice(int action) add a molecule with its center at center ------------------------------------------------------------------------- */ -void CreateAtoms::add_molecule(double *center) +void CreateAtoms::get_xmol(double *center) { double r[3], rotmat[3][3]; @@ -1392,10 +1433,6 @@ void CreateAtoms::add_molecule(double *center) MathExtra::quat_to_mat(quatone, rotmat); - // create atoms in molecule with atom ID = 0 and mol ID = 0 - // IDs are reset in caller after all molecules created by all procs - // pass add_molecule_atom an offset of 0 since don't know - // max tag of atoms in previous molecules at this point // onemol->quat_external is used by atom->add_moleclue_atom() onemol->quat_external = quatone; @@ -1405,9 +1442,25 @@ void CreateAtoms::add_molecule(double *center) for (int m = 0; m < natoms; m++) { MathExtra::matvec(rotmat, onemol->dx[m], xnew); MathExtra::add3(xnew, center, xnew); - atom->avec->create_atom(ntype + onemol->type[m], xnew); - n = atom->nlocal - 1; - atom->add_molecule_atom(onemol, m, n, 0); + for (int i = 0; i < 3; i++) + xmol[m][i] = xnew[i]; + } +} + +/* ---------------------------------------------------------------------- + add a molecule with atom coordinates from xmol +------------------------------------------------------------------------- */ + +void CreateAtoms::add_molecule() +{ + // create atoms in molecule with atom ID = 0 and mol ID = 0 + // IDs are reset in caller after all molecules created by all procs + // pass add_molecule_atom an offset of 0 since don't know + // max tag of atoms in previous molecules at this point + + for (int m = 0; m < onemol->natoms; m++) { + atom->avec->create_atom(ntype + onemol->type[m], xmol[m]); + atom->add_molecule_atom(onemol, m, atom->nlocal - 1, 0); } } diff --git a/src/create_atoms.h b/src/create_atoms.h index ae6f1b9d33..f839e3f0df 100644 --- a/src/create_atoms.h +++ b/src/create_atoms.h @@ -40,7 +40,7 @@ class CreateAtoms : public Command { bigint nsubset; double subsetfrac; int *basistype; - double xone[3], quatone[4]; + double xone[3], quatone[4], **xmol; double radthresh, radscale, mesh_density; int varflag, vvar, xvar, yvar, zvar; @@ -71,7 +71,8 @@ class CreateAtoms : public Command { int add_quasirandom(const double[3][3], tagint); void add_lattice(); void loop_lattice(int); - void add_molecule(double *); + void get_xmol(double *); + void add_molecule(); int vartest(double *); // evaluate a variable with new atom position }; From 3e2d5098c029a40edc7968167f468bc3c0b9c288 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Wed, 7 Jun 2023 22:07:57 -0400 Subject: [PATCH 19/91] Update create_atoms.rst --- doc/src/create_atoms.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/doc/src/create_atoms.rst b/doc/src/create_atoms.rst index 5d1e7c872c..8748df9def 100644 --- a/doc/src/create_atoms.rst +++ b/doc/src/create_atoms.rst @@ -401,11 +401,9 @@ to. The *overlap* keyword only applies to the *random* style. It prevents newly created particles from being created closer than the specified -*Doverlap* distance from any other particle. When the particles being -created are molecules, the radius of the molecule (from its geometric -center) is added to *Doverlap*. If particles have finite size (see -:doc:`atom_style sphere ` for example) *Doverlap* should -be specified large enough to include the particle size in the +*Doverlap* distance from any other particle. If particles have finite +size (see :doc:`atom_style sphere ` for example) *Doverlap* +should be specified large enough to include the particle size in the non-overlapping criterion. .. note:: From 492b0641f2335fbcafec80f4dcc45c9d4d61c76e Mon Sep 17 00:00:00 2001 From: jrgissing Date: Fri, 16 Jun 2023 20:50:22 -0400 Subject: [PATCH 20/91] record element list from pair_coeff --- src/REAXFF/pair_reaxff.cpp | 5 ++++- src/REAXFF/pair_reaxff.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/REAXFF/pair_reaxff.cpp b/src/REAXFF/pair_reaxff.cpp index 1867aec81b..99f7510a49 100644 --- a/src/REAXFF/pair_reaxff.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -297,14 +297,17 @@ void PairReaxFF::coeff(int nargs, char **args) } int n = atom->ntypes; + eletype.resize(n+1); // pair_coeff element map - for (int i = 3; i < nargs; i++) + for (int i = 3; i < nargs; i++) { + eletype[i-2] = args[i]; for (int j = 0; j < nreax_types; j++) if (utils::lowercase(args[i]) == utils::lowercase(api->system->reax_param.sbp[j].name)) { map[i-2] = j; itmp ++; } + } // error check if (itmp != n) diff --git a/src/REAXFF/pair_reaxff.h b/src/REAXFF/pair_reaxff.h index 926e0060c9..a1c7e1c223 100644 --- a/src/REAXFF/pair_reaxff.h +++ b/src/REAXFF/pair_reaxff.h @@ -54,6 +54,7 @@ class PairReaxFF : public Pair { int fixbond_flag, fixspecies_flag; int **tmpid; double **tmpbo, **tmpr; + std::vector eletype; ReaxFF::API *api; typedef double rvec[3]; From d18d7edad99babd9e3d3ae48e23c93f158532e0e Mon Sep 17 00:00:00 2001 From: jrgissing Date: Fri, 16 Jun 2023 21:23:46 -0400 Subject: [PATCH 21/91] reaxff/species: default elements from pair reaxff --- src/REAXFF/fix_reaxff_species.cpp | 46 ++++++++----------------------- src/REAXFF/fix_reaxff_species.h | 3 +- 2 files changed, 14 insertions(+), 35 deletions(-) diff --git a/src/REAXFF/fix_reaxff_species.cpp b/src/REAXFF/fix_reaxff_species.cpp index 8fa06cafb3..0569abe1a0 100644 --- a/src/REAXFF/fix_reaxff_species.cpp +++ b/src/REAXFF/fix_reaxff_species.cpp @@ -65,7 +65,7 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), Name(nullptr), MolName(nullptr), NMol(nullptr), nd(nullptr), MolType(nullptr), molmap(nullptr), mark(nullptr), Mol2Spec(nullptr), clusterID(nullptr), x0(nullptr), BOCut(nullptr), fp(nullptr), pos(nullptr), fdel(nullptr), delete_Tcount(nullptr), - ele(nullptr), eletype(nullptr), filepos(nullptr), filedel(nullptr) + filepos(nullptr), filedel(nullptr) { if (narg < 7) utils::missing_cmd_args(FLERR, "fix reaxff/species", error); @@ -84,6 +84,7 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : nvalid = -1; ntypes = atom->ntypes; + eletype.resize(ntypes); nevery = utils::inumeric(FLERR, arg[3], false, lmp); nrepeat = utils::inumeric(FLERR, arg[4], false, lmp); @@ -156,8 +157,7 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : for (int j = 1; j < np1; j++) BOCut[i][j] = bo_cut; // optional args - eletype = nullptr; - ele = filepos = filedel = nullptr; + filepos = filedel = nullptr; eleflag = posflag = padflag = 0; delflag = specieslistflag = masslimitflag = 0; delete_Nlimit = delete_Nsteps = 0; @@ -191,13 +191,8 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : if (iarg + ntypes + 1 > narg) utils::missing_cmd_args(FLERR, "fix reaxff/species element", error); - eletype = (char **) malloc(ntypes * sizeof(char *)); - int len; - for (int i = 0; i < ntypes; i++) { - len = strlen(arg[iarg + 1 + i]) + 1; - eletype[i] = (char *) malloc(len * sizeof(char)); - strcpy(eletype[i], arg[iarg + 1 + i]); - } + for (int i = 0; i < ntypes; i++) + eletype[i] = arg[iarg + 1 + i]; eleflag = 1; iarg += ntypes + 1; @@ -285,13 +280,9 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Unknown fix reaxff/species keyword: {}", arg[iarg]); } - if (!eleflag) { - memory->create(ele, ntypes + 1, "reaxff/species:ele"); - ele[0] = 'C'; - if (ntypes > 1) ele[1] = 'H'; - if (ntypes > 2) ele[2] = 'O'; - if (ntypes > 3) ele[3] = 'N'; - } + if (!eleflag) + for (int i = 0; i < ntypes; i++) + eletype[i] = reaxff->eletype[i+1]; if (delflag && specieslistflag && masslimitflag) error->all(FLERR, "Incompatible combination fix reaxff/species command options"); @@ -312,7 +303,6 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : FixReaxFFSpecies::~FixReaxFFSpecies() { - memory->destroy(ele); memory->destroy(BOCut); memory->destroy(clusterID); memory->destroy(x0); @@ -749,10 +739,7 @@ void FixReaxFFSpecies::WriteFormulas(int Nmole, int Nspec) for (j = 0; j < ntypes; j++) { itemp = MolType[ntypes * i + j]; if (itemp != 0) { - if (eletype) - molname += eletype[j]; - else - molname += ele[j]; + molname += eletype[j]; if (itemp != 1) molname += std::to_string(itemp); } } @@ -857,10 +844,7 @@ void FixReaxFFSpecies::WritePos(int Nmole, int Nspec) fprintf(pos, "%d\t%d\t", m, count); for (n = 0; n < ntypes; n++) { if (Name[n] != 0) { - if (eletype) - fprintf(pos, "%s", eletype[n]); - else - fprintf(pos, "%c", ele[n]); + fprintf(pos, "%s", eletype[n].c_str()); if (Name[n] != 1) fprintf(pos, "%d", Name[n]); } } @@ -969,10 +953,7 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec) species_str = ""; for (j = 0; j < ntypes; j++) { if (Name[j] != 0) { - if (eletype) - species_str += eletype[j]; - else - species_str += ele[j]; + species_str += eletype[j]; if (Name[j] != 1) species_str += fmt::format("{}", Name[j]); } } @@ -1037,10 +1018,7 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec) for (j = 0; j < ntypes; j++) { int itemp = MolName[ntypes * m + j]; if (itemp != 0) { - if (eletype) - fprintf(fdel, "%s", eletype[j]); - else - fprintf(fdel, "%c", ele[j]); + fprintf(fdel, "%s", eletype[j].c_str()); if (itemp != 1) fprintf(fdel, "%d", itemp); } } diff --git a/src/REAXFF/fix_reaxff_species.h b/src/REAXFF/fix_reaxff_species.h index f711cdeb11..829ab61cd8 100644 --- a/src/REAXFF/fix_reaxff_species.h +++ b/src/REAXFF/fix_reaxff_species.h @@ -63,7 +63,8 @@ class FixReaxFFSpecies : public Fix { int delete_Nsteps, *delete_Tcount; double massmin, massmax; int singlepos_opened, multipos_opened, del_opened; - char *ele, **eletype, *filepos, *filedel; + char *filepos, *filedel; + std::vector eletype; void Output_ReaxFF_Bonds(bigint, FILE *); AtomCoord chAnchor(AtomCoord, AtomCoord); From 32e4aac9f73d72be28c21a7a3c0007f3ddf8d466 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Fri, 16 Jun 2023 21:34:06 -0400 Subject: [PATCH 22/91] Update fix_reaxff_species.rst --- doc/src/fix_reaxff_species.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/fix_reaxff_species.rst b/doc/src/fix_reaxff_species.rst index 6a171ede5e..9c3d1d01fd 100644 --- a/doc/src/fix_reaxff_species.rst +++ b/doc/src/fix_reaxff_species.rst @@ -110,10 +110,10 @@ all types from 1 to :math:`N`. A leading asterisk means all types from The optional keyword *element* can be used to specify the chemical symbol printed for each LAMMPS atom type. The number of symbols must match the number of LAMMPS atom types and each symbol must consist of -1 or 2 alphanumeric characters. Normally, these symbols should be -chosen to match the chemical identity of each LAMMPS atom type, as -specified using the :doc:`reaxff pair_coeff ` command and -the ReaxFF force field file. +1 or 2 alphanumeric characters. By default, these symbols are the same +as the chemical identity of each LAMMPS atom type, as specified by the +:doc:`reaxff pair_coeff ` command and the ReaxFF force +field file. The optional keyword *position* writes center-of-mass positions of each identified molecules to file *filepos* every *posfreq* timesteps. @@ -233,5 +233,5 @@ Default """"""" The default values for bond-order cutoffs are 0.3 for all I-J pairs. -The default element symbols are C, H, O, N. +The default element symbols are taken from the pair_coeff command. Position files are not written by default. From 33d82c30ca146b71ec238eb343ef175a9653de1e Mon Sep 17 00:00:00 2001 From: jrgissing Date: Thu, 22 Jun 2023 18:40:50 -0400 Subject: [PATCH 23/91] fix to allow reaxff/species before pair_coeff --- src/REAXFF/fix_reaxff_species.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/REAXFF/fix_reaxff_species.cpp b/src/REAXFF/fix_reaxff_species.cpp index 0569abe1a0..98c4280eef 100644 --- a/src/REAXFF/fix_reaxff_species.cpp +++ b/src/REAXFF/fix_reaxff_species.cpp @@ -280,10 +280,6 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Unknown fix reaxff/species keyword: {}", arg[iarg]); } - if (!eleflag) - for (int i = 0; i < ntypes; i++) - eletype[i] = reaxff->eletype[i+1]; - if (delflag && specieslistflag && masslimitflag) error->all(FLERR, "Incompatible combination fix reaxff/species command options"); @@ -350,6 +346,12 @@ void FixReaxFFSpecies::setup(int /*vflag*/) ntotal = static_cast(atom->natoms); if (Name == nullptr) memory->create(Name, ntypes, "reaxff/species:Name"); + if (!eleflag) + for (int i = 0; i < ntypes; i++) { + eletype[i] = reaxff->eletype[i+1]; + eleflag = 1; + } + post_integrate(); } From 6318b09a07d04c5cad74a06d3075eb266dcd8c8f Mon Sep 17 00:00:00 2001 From: jrgissing Date: Tue, 4 Jul 2023 20:29:31 -0400 Subject: [PATCH 24/91] report unique species when duplicate elements previously, duplicate species were reported when there were duplicate elements in the element-to-type mapping. for example, H2 and HH and multiple other H2s and HHs could appear in the 'species' and 'delete species' files --- src/REAXFF/fix_reaxff_species.cpp | 110 ++++++++++++++++++------------ src/REAXFF/fix_reaxff_species.h | 5 +- 2 files changed, 72 insertions(+), 43 deletions(-) diff --git a/src/REAXFF/fix_reaxff_species.cpp b/src/REAXFF/fix_reaxff_species.cpp index 98c4280eef..fade2c97d3 100644 --- a/src/REAXFF/fix_reaxff_species.cpp +++ b/src/REAXFF/fix_reaxff_species.cpp @@ -85,6 +85,8 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : ntypes = atom->ntypes; eletype.resize(ntypes); + ueletype.resize(ntypes); + ele2uele.resize(ntypes); nevery = utils::inumeric(FLERR, arg[3], false, lmp); nrepeat = utils::inumeric(FLERR, arg[4], false, lmp); @@ -193,7 +195,7 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : for (int i = 0; i < ntypes; i++) eletype[i] = arg[iarg + 1 + i]; - eleflag = 1; + GetUniqueElements(); iarg += ntypes + 1; // delete species @@ -344,13 +346,13 @@ int FixReaxFFSpecies::setmask() void FixReaxFFSpecies::setup(int /*vflag*/) { ntotal = static_cast(atom->natoms); - if (Name == nullptr) memory->create(Name, ntypes, "reaxff/species:Name"); + if (Name == nullptr) memory->create(Name, nutypes, "reaxff/species:Name"); - if (!eleflag) - for (int i = 0; i < ntypes; i++) { + if (!eleflag) { + for (int i = 0; i < ntypes; i++) eletype[i] = reaxff->eletype[i+1]; - eleflag = 1; - } + GetUniqueElements(); + } post_integrate(); } @@ -640,14 +642,14 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec) memory->destroy(MolName); MolName = nullptr; - memory->create(MolName, Nmole * (ntypes + 1), "reaxff/species:MolName"); + memory->create(MolName, Nmole * (nutypes + 1), "reaxff/species:MolName"); memory->destroy(NMol); NMol = nullptr; memory->create(NMol, Nmole, "reaxff/species:NMol"); for (m = 0; m < Nmole; m++) NMol[m] = 1; - memory->create(Nameall, ntypes, "reaxff/species:Nameall"); + memory->create(Nameall, nutypes, "reaxff/species:Nameall"); memory->create(NMolall, Nmole, "reaxff/species:NMolall"); memory->destroy(Mol2Spec); @@ -656,12 +658,12 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec) for (m = 0; m < Nmole; m++) Mol2Spec[m] = -1; for (m = 1, Nspec = 0; m <= Nmole; m++) { - for (n = 0; n < ntypes; n++) Name[n] = 0; + for (n = 0; n < nutypes; n++) Name[n] = 0; for (n = 0, flag_mol = 0; n < nlocal; n++) { if (!(mask[n] & groupbit)) continue; cid = nint(clusterID[n]); if (cid == m) { - itype = atom->type[n] - 1; + itype = ele2uele[atom->type[n] - 1]; Name[itype]++; flag_mol = 1; } @@ -669,15 +671,15 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec) MPI_Allreduce(&flag_mol, &flag_tmp, 1, MPI_INT, MPI_MAX, world); flag_mol = flag_tmp; - MPI_Allreduce(Name, Nameall, ntypes, MPI_INT, MPI_SUM, world); - for (n = 0; n < ntypes; n++) Name[n] = Nameall[n]; + MPI_Allreduce(Name, Nameall, nutypes, MPI_INT, MPI_SUM, world); + for (n = 0; n < nutypes; n++) Name[n] = Nameall[n]; if (flag_mol == 1) { flag_identity = 1; for (k = 0; k < Nspec; k++) { flag_spec = 0; - for (l = 0; l < ntypes; l++) - if (MolName[ntypes * k + l] != Name[l]) flag_spec = 1; + for (l = 0; l < nutypes; l++) + if (MolName[nutypes * k + l] != Name[l]) flag_spec = 1; if (flag_spec == 0) { NMol[k]++; Mol2Spec[m - 1] = k; @@ -685,7 +687,7 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec) flag_identity *= flag_spec; } if (Nspec == 0 || flag_identity == 1) { - for (l = 0; l < ntypes; l++) MolName[ntypes * Nspec + l] = Name[l]; + for (l = 0; l < nutypes; l++) MolName[nutypes * Nspec + l] = Name[l]; Mol2Spec[m - 1] = Nspec; Nspec++; } @@ -700,24 +702,24 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec) memory->destroy(MolType); MolType = nullptr; - memory->create(MolType, Nspec * (ntypes + 2), "reaxff/species:MolType"); + memory->create(MolType, Nspec * (nutypes + 2), "reaxff/species:MolType"); } /* ---------------------------------------------------------------------- */ -int FixReaxFFSpecies::CheckExistence(int id, int ntypes) +int FixReaxFFSpecies::CheckExistence(int id, int nutypes) { int i, j, molid, flag; for (i = 0; i < Nmoltype; i++) { flag = 0; - for (j = 0; j < ntypes; j++) { - molid = MolType[ntypes * i + j]; - if (molid != MolName[ntypes * id + j]) flag = 1; + for (j = 0; j < nutypes; j++) { + molid = MolType[nutypes * i + j]; + if (molid != MolName[nutypes * id + j]) flag = 1; } if (flag == 0) return i; } - for (i = 0; i < ntypes; i++) MolType[ntypes * Nmoltype + i] = MolName[ntypes * id + i]; + for (i = 0; i < nutypes; i++) MolType[nutypes * Nmoltype + i] = MolName[nutypes * id + i]; Nmoltype++; return Nmoltype - 1; @@ -725,6 +727,30 @@ int FixReaxFFSpecies::CheckExistence(int id, int ntypes) /* ---------------------------------------------------------------------- */ +void FixReaxFFSpecies::GetUniqueElements() +{ + // count unique 'element' labels + // map user input to unique list + + nutypes = 0; + int skipflag; + for (int i = 0; i < ntypes; i++) { + skipflag = 0; + for (int j = 0; j < nutypes; j++) + if (eletype[i] == ueletype[j]) { + ele2uele[i] = j; + skipflag = 1; + break; + } + if (skipflag) continue; + ele2uele[i] = nutypes; + ueletype[nutypes++] = eletype[i]; + } + eleflag = 1; +} + +/* ---------------------------------------------------------------------- */ + void FixReaxFFSpecies::WriteFormulas(int Nmole, int Nspec) { int i, j, itemp; @@ -734,14 +760,14 @@ void FixReaxFFSpecies::WriteFormulas(int Nmole, int Nspec) Nmoltype = 0; - for (i = 0; i < Nspec; i++) nd[i] = CheckExistence(i, ntypes); + for (i = 0; i < Nspec; i++) nd[i] = CheckExistence(i, nutypes); for (i = 0; i < Nmoltype; i++) { std::string molname; - for (j = 0; j < ntypes; j++) { - itemp = MolType[ntypes * i + j]; + for (j = 0; j < nutypes; j++) { + itemp = MolType[nutypes * i + j]; if (itemp != 0) { - molname += eletype[j]; + molname += ueletype[j]; if (itemp != 1) molname += std::to_string(itemp); } } @@ -799,20 +825,20 @@ void FixReaxFFSpecies::WritePos(int Nmole, int Nspec) } Nameall = nullptr; - memory->create(Nameall, ntypes, "reaxff/species:Nameall"); + memory->create(Nameall, nutypes, "reaxff/species:Nameall"); for (m = 1; m <= Nmole; m++) { count = 0; avq = 0.0; for (n = 0; n < 3; n++) avx[n] = 0.0; - for (n = 0; n < ntypes; n++) Name[n] = 0; + for (n = 0; n < nutypes; n++) Name[n] = 0; for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; cid = nint(clusterID[i]); if (cid == m) { - itype = atom->type[i] - 1; + itype = ele2uele[atom->type[i] - 1]; Name[itype]++; count++; avq += spec_atom[i][0]; @@ -839,14 +865,14 @@ void FixReaxFFSpecies::WritePos(int Nmole, int Nspec) MPI_Reduce(&count, &count_tmp, 1, MPI_INT, MPI_SUM, 0, world); count = count_tmp; - MPI_Reduce(Name, Nameall, ntypes, MPI_INT, MPI_SUM, 0, world); - for (n = 0; n < ntypes; n++) Name[n] = Nameall[n]; + MPI_Reduce(Name, Nameall, nutypes, MPI_INT, MPI_SUM, 0, world); + for (n = 0; n < nutypes; n++) Name[n] = Nameall[n]; if (comm->me == 0) { fprintf(pos, "%d\t%d\t", m, count); - for (n = 0; n < ntypes; n++) { + for (n = 0; n < nutypes; n++) { if (Name[n] != 0) { - fprintf(pos, "%s", eletype[n].c_str()); + fprintf(pos, "%s", ueletype[n].c_str()); if (Name[n] != 1) fprintf(pos, "%d", Name[n]); } } @@ -898,7 +924,7 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec) for (i = 0; i < nlocal; i++) mark[i] = 0; Nameall = nullptr; - memory->create(Nameall, ntypes, "reaxff/species:Nameall"); + memory->create(Nameall, nutypes, "reaxff/species:Nameall"); int ndelcomm; if (masslimitflag) @@ -930,13 +956,13 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec) if (this_delete_Tcount == headroom) break; m = molrange[mm]; localmass = totalmass = count = nmarklist = 0; - for (n = 0; n < ntypes; n++) Name[n] = 0; + for (n = 0; n < nutypes; n++) Name[n] = 0; for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; cid = nint(clusterID[i]); if (cid == m) { - itype = atom->type[i] - 1; + itype = ele2uele[atom->type[i] - 1]; Name[itype]++; count++; marklist[nmarklist++] = i; @@ -947,15 +973,15 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec) MPI_Allreduce(&count, &count_tmp, 1, MPI_INT, MPI_SUM, world); count = count_tmp; - MPI_Allreduce(Name, Nameall, ntypes, MPI_INT, MPI_SUM, world); - for (n = 0; n < ntypes; n++) Name[n] = Nameall[n]; + MPI_Allreduce(Name, Nameall, nutypes, MPI_INT, MPI_SUM, world); + for (n = 0; n < nutypes; n++) Name[n] = Nameall[n]; MPI_Allreduce(&localmass, &totalmass, 1, MPI_DOUBLE, MPI_SUM, world); species_str = ""; - for (j = 0; j < ntypes; j++) { + for (j = 0; j < nutypes; j++) { if (Name[j] != 0) { - species_str += eletype[j]; + species_str += ueletype[j]; if (Name[j] != 1) species_str += fmt::format("{}", Name[j]); } } @@ -1017,10 +1043,10 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec) printflag = 1; } fprintf(fdel, " %g ", deletecount[m]); - for (j = 0; j < ntypes; j++) { - int itemp = MolName[ntypes * m + j]; + for (j = 0; j < nutypes; j++) { + int itemp = MolName[nutypes * m + j]; if (itemp != 0) { - fprintf(fdel, "%s", eletype[j].c_str()); + fprintf(fdel, "%s", ueletype[j].c_str()); if (itemp != 1) fprintf(fdel, "%d", itemp); } } diff --git a/src/REAXFF/fix_reaxff_species.h b/src/REAXFF/fix_reaxff_species.h index 829ab61cd8..91cdad8246 100644 --- a/src/REAXFF/fix_reaxff_species.h +++ b/src/REAXFF/fix_reaxff_species.h @@ -44,7 +44,7 @@ class FixReaxFFSpecies : public Fix { double compute_vector(int) override; protected: - int nmax, nlocal, ntypes, ntotal; + int nmax, nlocal, ntypes, nutypes, ntotal; int nrepeat, nfreq, posfreq, compressed, ndelspec; int Nmoltype, vector_nmole, vector_nspec; int *Name, *MolName, *NMol, *nd, *MolType, *molmap, *mark; @@ -64,7 +64,9 @@ class FixReaxFFSpecies : public Fix { double massmin, massmax; int singlepos_opened, multipos_opened, del_opened; char *filepos, *filedel; + std::vector ele2uele; std::vector eletype; + std::vector ueletype; void Output_ReaxFF_Bonds(bigint, FILE *); AtomCoord chAnchor(AtomCoord, AtomCoord); @@ -74,6 +76,7 @@ class FixReaxFFSpecies : public Fix { void WriteFormulas(int, int); void DeleteSpecies(int, int); int CheckExistence(int, int); + void GetUniqueElements(); int nint(const double &); int pack_forward_comm(int, int *, double *, int, int *) override; From 4eba3791f3b201e7c9c3f07fcf84955b3031be53 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 9 Jul 2023 15:30:56 -0400 Subject: [PATCH 25/91] enforce order for printing CHON --- src/REAXFF/fix_reaxff_species.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/REAXFF/fix_reaxff_species.cpp b/src/REAXFF/fix_reaxff_species.cpp index fade2c97d3..2c0775b9d9 100644 --- a/src/REAXFF/fix_reaxff_species.cpp +++ b/src/REAXFF/fix_reaxff_species.cpp @@ -729,8 +729,9 @@ int FixReaxFFSpecies::CheckExistence(int id, int nutypes) void FixReaxFFSpecies::GetUniqueElements() { - // count unique 'element' labels - // map user input to unique list + eleflag = 1; + + // get unique 'element' labels nutypes = 0; int skipflag; @@ -738,15 +739,34 @@ void FixReaxFFSpecies::GetUniqueElements() skipflag = 0; for (int j = 0; j < nutypes; j++) if (eletype[i] == ueletype[j]) { - ele2uele[i] = j; skipflag = 1; break; } if (skipflag) continue; - ele2uele[i] = nutypes; ueletype[nutypes++] = eletype[i]; } - eleflag = 1; + + // reorder CHON, if necessary + + int incr = 0; + std::vector CHON = {"C", "H", "O", "N"}; + for (auto it = CHON.begin(); it != CHON.end(); ++it) + for (int j = incr; j < nutypes; j++) { + if (ueletype[j] == *it) { + ueletype.erase(ueletype.begin() + j); + ueletype.insert(ueletype.begin() + incr++, *it); + break; + } + } + + // map user input to unique list + + for (int i = 0; i < ntypes; i++) + for (int j = 0; j < nutypes; j++) + if (eletype[i] == ueletype[j]) { + ele2uele[i] = j; + break; + } } /* ---------------------------------------------------------------------- */ From 63f33aa3a428e81e2e5747cc3f9eb96182788c3b Mon Sep 17 00:00:00 2001 From: Dhairya Date: Sun, 4 Feb 2024 16:29:19 -0600 Subject: [PATCH 26/91] first --- src/GRANULAR/granular_model.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GRANULAR/granular_model.cpp b/src/GRANULAR/granular_model.cpp index c1ad692fb3..af095d1efc 100644 --- a/src/GRANULAR/granular_model.cpp +++ b/src/GRANULAR/granular_model.cpp @@ -10,7 +10,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ - + /* ---------------------------------------------------------------------- This class contains a series of tools for DEM contacts Multiple models can be defined and used to calculate forces From 5137e8697250650f10076495bdf8d43e69d9b1b3 Mon Sep 17 00:00:00 2001 From: Dhairya Date: Mon, 5 Feb 2024 16:30:44 -0600 Subject: [PATCH 27/91] en models incorporated --- src/GRANULAR/gran_sub_mod_damping.cpp | 50 +++++++++++++++++++++++++++ src/GRANULAR/gran_sub_mod_damping.h | 22 ++++++++++++ 2 files changed, 72 insertions(+) diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 7d6a02b8f0..2ea9eed0aa 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -17,6 +17,8 @@ #include "granular_model.h" #include "math_special.h" +#include + using namespace LAMMPS_NS; using namespace Granular_NS; @@ -24,6 +26,10 @@ using MathSpecial::cube; using MathSpecial::powint; using MathSpecial::square; +static constexpr double PISQ = 9.86960440108935799230; +static constexpr double TWOROOTFIVEBYSIX = 1.82574185835055380345; +static constexpr double ROOTTHREEBYTWO = 1.22474487139158894067; + /* ---------------------------------------------------------------------- Default damping model ------------------------------------------------------------------------- */ @@ -133,3 +139,47 @@ double GranSubModDampingTsuji::calculate_forces() damp_prefactor = damp * sqrt(gm->meff * gm->Fnormal / gm->delta); return -damp_prefactor * gm->vnnr; } + +/* ---------------------------------------------------------------------- + enhooke damping +------------------------------------------------------------------------- */ + +GranSubModDampingEnHooke::GranSubModDampingEnHooke(GranularModel *gm, LAMMPS *lmp) : + GranSubModDamping(gm, lmp) +{ +} + +void GranSubModDampingEnHooke::init() +{ + double cor = gm->normal_model->get_damp(); + double logcor = log(cor); + damp = -2*logcor/sqrt(PISQ + logcor*logcor); +} + +double GranSubModDampingEnHooke::calculate_forces() +{ + damp_prefactor = damp * sqrt(gm->meff * gm->Fnormal / gm->delta); + return -damp_prefactor * gm->vnnr; +} + +/* ---------------------------------------------------------------------- + enhertz damping +------------------------------------------------------------------------- */ + +GranSubModDampingEnHertz::GranSubModDampingEnHertz(GranularModel *gm, LAMMPS *lmp) : + GranSubModDamping(gm, lmp) +{ +} + +void GranSubModDampingEnHertz::init() +{ + double cor = gm->normal_model->get_damp(); + double logcor = log(cor); + damp = -ROOTTHREEBYTWO*TWOROOTFIVEBYSIX*logcor/sqrt(PISQ + logcor*logcor); +} + +double GranSubModDampingEnHertz::calculate_forces() +{ + damp_prefactor = damp * sqrt(gm->meff * gm->Fnormal / gm->delta); + 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 db5bb43ca5..33e88718fd 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -18,6 +18,8 @@ GranSubModStyle(velocity,GranSubModDampingVelocity,DAMPING); GranSubModStyle(mass_velocity,GranSubModDampingMassVelocity,DAMPING); GranSubModStyle(viscoelastic,GranSubModDampingViscoelastic,DAMPING); GranSubModStyle(tsuji,GranSubModDampingTsuji,DAMPING); +GranSubModStyle(enhooke,GranSubModDampingEnHooke,DAMPING); +GranSubModStyle(enhertz,GranSubModDampingEnHertz,DAMPING); // clang-format on #else @@ -84,6 +86,26 @@ namespace Granular_NS { double calculate_forces() override; }; + /* ---------------------------------------------------------------------- */ + + class GranSubModDampingEnHooke : public GranSubModDamping { + public: + GranSubModDampingEnHooke(class GranularModel *, class LAMMPS *); + void init() override; + double calculate_forces() override; + }; + + /* ---------------------------------------------------------------------- */ + + class GranSubModDampingEnHertz : public GranSubModDamping { + public: + GranSubModDampingEnHertz(class GranularModel *, class LAMMPS *); + void init() override; + double calculate_forces() override; + }; + + /* ---------------------------------------------------------------------- */ + } // namespace Granular_NS } // namespace LAMMPS_NS From febb3671d82c499dbe9a381a0a65d30572c409b7 Mon Sep 17 00:00:00 2001 From: Dhairya Date: Tue, 6 Feb 2024 18:03:17 -0600 Subject: [PATCH 28/91] removed whitespace --- src/GRANULAR/granular_model.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GRANULAR/granular_model.cpp b/src/GRANULAR/granular_model.cpp index af095d1efc..c1ad692fb3 100644 --- a/src/GRANULAR/granular_model.cpp +++ b/src/GRANULAR/granular_model.cpp @@ -10,7 +10,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ - + /* ---------------------------------------------------------------------- This class contains a series of tools for DEM contacts Multiple models can be defined and used to calculate forces From 26cff47386d94bdda1ff814ddb4f247120ce97be Mon Sep 17 00:00:00 2001 From: Dhairya Date: Wed, 7 Feb 2024 09:45:29 -0600 Subject: [PATCH 29/91] Removed whitespace --- src/GRANULAR/gran_sub_mod_damping.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 2ea9eed0aa..e57972db76 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -26,7 +26,7 @@ using MathSpecial::cube; using MathSpecial::powint; using MathSpecial::square; -static constexpr double PISQ = 9.86960440108935799230; +static constexpr double PISQ = 9.86960440108935799230; static constexpr double TWOROOTFIVEBYSIX = 1.82574185835055380345; static constexpr double ROOTTHREEBYTWO = 1.22474487139158894067; @@ -182,4 +182,4 @@ double GranSubModDampingEnHertz::calculate_forces() { damp_prefactor = damp * sqrt(gm->meff * gm->Fnormal / gm->delta); return -damp_prefactor * gm->vnnr; -} \ No newline at end of file +} From 194b45b7295bb9ad17c29dae482cdc51f1c575f9 Mon Sep 17 00:00:00 2001 From: Dhairya Date: Wed, 7 Feb 2024 09:52:02 -0600 Subject: [PATCH 30/91] Example file --- examples/granular/en_example/particles.dat | 18 ++++++++++++++++ examples/granular/en_example/start.lammps | 25 ++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 examples/granular/en_example/particles.dat create mode 100644 examples/granular/en_example/start.lammps diff --git a/examples/granular/en_example/particles.dat b/examples/granular/en_example/particles.dat new file mode 100644 index 0000000000..c9f3bd7a9c --- /dev/null +++ b/examples/granular/en_example/particles.dat @@ -0,0 +1,18 @@ +Python generated LAMMPS data file + +2 atoms +1 atom types + +0 0.08 xlo xhi +0 0.04 ylo yhi +0 0.08 zlo zhi + +Atoms # sphere + +1 1 0.004 2500 0.04 0.02 0.04 0 0 0 +2 1 0.004 2500 0.04 0.02 0.04416 0 0 0 + +Velocities + +1 0.0 0.0 1 0 0 0 +2 0.0 0.0 -1 0 0 0 diff --git a/examples/granular/en_example/start.lammps b/examples/granular/en_example/start.lammps new file mode 100644 index 0000000000..2bf0f54ddc --- /dev/null +++ b/examples/granular/en_example/start.lammps @@ -0,0 +1,25 @@ +units si +atom_style sphere + +boundary p p f +region box block 0 80e-3 0 40e-3 0 80e-3 open 3 open 4 +create_box 2 box + +read_data particles.dat add append +group mb type 1 + +pair_style granular +pair_coeff * * hertz/material 1e6 0.8 0.4 tangential mindlin NULL 0.0 0.5 damping enhertz +# pair_coeff * * hertz 1e6 0.3 tangential mindlin 1e4 1.0 0.5 damping enhertz +# pair_coeff * * hooke 1e6 0.5 tangential mindlin 1 1.0 0.0 damping enhooke +comm_modify vel yes + +timestep 1e-9 +fix 1 all nve/sphere +compute s all stress/atom NULL pair + +dump 1 all custom 2000000 op.dump id x y z vx vy vz +dump_modify 1 pad 8 +thermo_style custom step ke +run_style verlet +run 10000000 From f9ecdb5b546c1243b2669600cf2c2a25dec1b1fd Mon Sep 17 00:00:00 2001 From: Dhairya Date: Fri, 23 Feb 2024 15:21:56 -0600 Subject: [PATCH 31/91] Updated documentation --- doc/src/pair_granular.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index bc469412d9..f0eb139cb7 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -187,6 +187,8 @@ for the damping model currently supported are: 2. *mass_velocity* 3. *viscoelastic* 4. *tsuji* +5. *enhooke* +6. *enhertz* If the *damping* keyword is not specified, the *viscoelastic* model is used by default. @@ -248,6 +250,21 @@ The dimensionless coefficient of restitution :math:`e` specified as part of the normal contact model parameters should be between 0 and 1, but no error check is performed on this. +*enhooke* and *enhertz* models are useful for cases where a specific normal coefficient of restitution :math:`e` is required. In these models, the normal coefficient of restitution :math:`e` is specified as an input. Following the approach of :ref:`(Brilliantov et al) `, *enhooke* calculates the damping coefficient for the *hooke* model as: + +.. math:: + + \eta_n = \sqrt{\frac{4m_{eff}k_n}{1+\left( \frac{\pi}{\log(e)}\right)^2}}, + + +*enhertz* calculates the damping coefficient for the *hertz* and *hertz/material* models using: + +.. math:: + + \eta_n = -2\sqrt{\frac{5}{6}}\frac{\log(e)}{\sqrt{\pi^2+(\log(e))^2}}(R_{eff} \delta_{ij})^{\frac{1}{4}}\sqrt{\frac{3}{2}k_n m_{eff}} , + +where :math:`k_n = \frac{4}{3} E_{eff}` for the *hertz/material* model. Since these models calculate the damping coefficients by accounting for the effective mass, effective radius and pairwise overlaps (for *enhertz*), they accurately reproduce the specified coefficient of restitution for both monodisperse and polydisperse particle pairs. + The total normal force is computed as the sum of the elastic and damping components: From 8254d20b44c0ceb0ff3433c125058f8dd162ddbb Mon Sep 17 00:00:00 2001 From: jtclemm Date: Thu, 4 Apr 2024 11:29:02 -0600 Subject: [PATCH 32/91] Removing unnecessary comm calls fix heat/flow --- src/GRANULAR/fix_heat_flow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/GRANULAR/fix_heat_flow.cpp b/src/GRANULAR/fix_heat_flow.cpp index b7643c2c24..be8d93839f 100644 --- a/src/GRANULAR/fix_heat_flow.cpp +++ b/src/GRANULAR/fix_heat_flow.cpp @@ -16,6 +16,7 @@ #include "atom.h" #include "comm.h" #include "error.h" +#include "force.h" #include "memory.h" #include "modify.h" #include "update.h" @@ -127,7 +128,7 @@ void FixHeatFlow::final_integrate() if (igroup == atom->firstgroup) nlocal = atom->nfirst; // add ghost contributions to heatflow if first instance of fix - if (first_flag) comm->reverse_comm(this); + if (force->newton_pair && first_flag) comm->reverse_comm(this); if (rmass) { for (int i = 0; i < nlocal; i++) From 58d6f9ba2e176f2be63c4baa18c553344118dbf1 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Thu, 4 Apr 2024 11:29:28 -0600 Subject: [PATCH 33/91] Removing hrate from fix deform/pressure restart --- src/EXTRA-FIX/fix_deform_pressure.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/EXTRA-FIX/fix_deform_pressure.cpp b/src/EXTRA-FIX/fix_deform_pressure.cpp index 51ea75cfed..95788c23d6 100644 --- a/src/EXTRA-FIX/fix_deform_pressure.cpp +++ b/src/EXTRA-FIX/fix_deform_pressure.cpp @@ -788,7 +788,7 @@ void FixDeformPressure::apply_box() void FixDeformPressure::write_restart(FILE *fp) { if (comm->me == 0) { - int size = 9 * sizeof(double) + 7 * sizeof(Set) + 7 * sizeof(SetExtra); + int size = 7 * sizeof(Set) + 7 * sizeof(SetExtra); fwrite(&size, sizeof(int), 1, fp); fwrite(set, sizeof(Set), 6, fp); fwrite(&set_box, sizeof(Set), 1, fp); @@ -803,22 +803,16 @@ void FixDeformPressure::write_restart(FILE *fp) void FixDeformPressure::restart(char *buf) { int n = 0; - auto list = (double *) buf; - for (int i = 0; i < 6; i++) - h_rate[i] = list[n++]; - for (int i = 0; i < 3; i++) - h_ratelo[i] = list[n++]; - - n = n * sizeof(double); int samestyle = 1; - Set *set_restart = (Set *) &buf[n]; + Set *set_restart = (Set *) buf; for (int i = 0; i < 6; ++i) { // restore data from initial state set[i].lo_initial = set_restart[i].lo_initial; set[i].hi_initial = set_restart[i].hi_initial; set[i].vol_initial = set_restart[i].vol_initial; set[i].tilt_initial = set_restart[i].tilt_initial; - // check if style settings are consistent (should do the whole set?) + + // check if style settings are consistent if (set[i].style != set_restart[i].style) samestyle = 0; if (set[i].substyle != set_restart[i].substyle) From 84b6c6a088a2f36b80a7ebf6eb876c28120e1100 Mon Sep 17 00:00:00 2001 From: Dhairya Date: Fri, 5 Apr 2024 09:58:33 -0500 Subject: [PATCH 34/91] Added prefactors and errors for incorrect combinations. --- doc/src/pair_granular.rst | 10 +++++----- src/GRANULAR/gran_sub_mod_damping.cpp | 16 ++++++++-------- src/GRANULAR/gran_sub_mod_damping.h | 12 ++++++------ src/GRANULAR/granular_model.cpp | 4 ++++ 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index f0eb139cb7..9eb34c9de8 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -187,8 +187,8 @@ for the damping model currently supported are: 2. *mass_velocity* 3. *viscoelastic* 4. *tsuji* -5. *enhooke* -6. *enhertz* +5. *hooke/en* +6. *hertz/en* If the *damping* keyword is not specified, the *viscoelastic* model is used by default. @@ -250,20 +250,20 @@ The dimensionless coefficient of restitution :math:`e` specified as part of the normal contact model parameters should be between 0 and 1, but no error check is performed on this. -*enhooke* and *enhertz* models are useful for cases where a specific normal coefficient of restitution :math:`e` is required. In these models, the normal coefficient of restitution :math:`e` is specified as an input. Following the approach of :ref:`(Brilliantov et al) `, *enhooke* calculates the damping coefficient for the *hooke* model as: +*hooke/en* and *hertz/en* models are useful for cases where a specific normal coefficient of restitution :math:`e` is required. In these models, the normal coefficient of restitution :math:`e` is specified as an input. Following the approach of :ref:`(Brilliantov et al) `, *hooke/en* calculates the damping coefficient for the *hooke* model as: .. math:: \eta_n = \sqrt{\frac{4m_{eff}k_n}{1+\left( \frac{\pi}{\log(e)}\right)^2}}, -*enhertz* calculates the damping coefficient for the *hertz* and *hertz/material* models using: +*hertz/en* calculates the damping coefficient for the *hertz* and *hertz/material* models using: .. math:: \eta_n = -2\sqrt{\frac{5}{6}}\frac{\log(e)}{\sqrt{\pi^2+(\log(e))^2}}(R_{eff} \delta_{ij})^{\frac{1}{4}}\sqrt{\frac{3}{2}k_n m_{eff}} , -where :math:`k_n = \frac{4}{3} E_{eff}` for the *hertz/material* model. Since these models calculate the damping coefficients by accounting for the effective mass, effective radius and pairwise overlaps (for *enhertz*), they accurately reproduce the specified coefficient of restitution for both monodisperse and polydisperse particle pairs. +where :math:`k_n = \frac{4}{3} E_{eff}` for the *hertz/material* model. Since these models calculate the damping coefficients by accounting for the effective mass, effective radius and pairwise overlaps (for *hertz/en*), they accurately reproduce the specified coefficient of restitution for both monodisperse and polydisperse particle pairs. The total normal force is computed as the sum of the elastic and damping components: diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index e57972db76..12102575c3 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -141,44 +141,44 @@ double GranSubModDampingTsuji::calculate_forces() } /* ---------------------------------------------------------------------- - enhooke damping + hookeen damping ------------------------------------------------------------------------- */ -GranSubModDampingEnHooke::GranSubModDampingEnHooke(GranularModel *gm, LAMMPS *lmp) : +GranSubModDampingHookeEn::GranSubModDampingHookeEn(GranularModel *gm, LAMMPS *lmp) : GranSubModDamping(gm, lmp) { } -void GranSubModDampingEnHooke::init() +void GranSubModDampingHookeEn::init() { double cor = gm->normal_model->get_damp(); double logcor = log(cor); damp = -2*logcor/sqrt(PISQ + logcor*logcor); } -double GranSubModDampingEnHooke::calculate_forces() +double GranSubModDampingHookeEn::calculate_forces() { damp_prefactor = damp * sqrt(gm->meff * gm->Fnormal / gm->delta); return -damp_prefactor * gm->vnnr; } /* ---------------------------------------------------------------------- - enhertz damping + hertzen damping ------------------------------------------------------------------------- */ -GranSubModDampingEnHertz::GranSubModDampingEnHertz(GranularModel *gm, LAMMPS *lmp) : +GranSubModDampingHertzEn::GranSubModDampingHertzEn(GranularModel *gm, LAMMPS *lmp) : GranSubModDamping(gm, lmp) { } -void GranSubModDampingEnHertz::init() +void GranSubModDampingHertzEn::init() { double cor = gm->normal_model->get_damp(); double logcor = log(cor); damp = -ROOTTHREEBYTWO*TWOROOTFIVEBYSIX*logcor/sqrt(PISQ + logcor*logcor); } -double GranSubModDampingEnHertz::calculate_forces() +double GranSubModDampingHertzEn::calculate_forces() { damp_prefactor = damp * sqrt(gm->meff * gm->Fnormal / gm->delta); return -damp_prefactor * gm->vnnr; diff --git a/src/GRANULAR/gran_sub_mod_damping.h b/src/GRANULAR/gran_sub_mod_damping.h index 33e88718fd..9f37e14450 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -18,8 +18,8 @@ GranSubModStyle(velocity,GranSubModDampingVelocity,DAMPING); GranSubModStyle(mass_velocity,GranSubModDampingMassVelocity,DAMPING); GranSubModStyle(viscoelastic,GranSubModDampingViscoelastic,DAMPING); GranSubModStyle(tsuji,GranSubModDampingTsuji,DAMPING); -GranSubModStyle(enhooke,GranSubModDampingEnHooke,DAMPING); -GranSubModStyle(enhertz,GranSubModDampingEnHertz,DAMPING); +GranSubModStyle(hooke/en,GranSubModDampingHookeEn,DAMPING); +GranSubModStyle(hertz/en,GranSubModDampingHertzEn,DAMPING); // clang-format on #else @@ -88,18 +88,18 @@ namespace Granular_NS { /* ---------------------------------------------------------------------- */ - class GranSubModDampingEnHooke : public GranSubModDamping { + class GranSubModDampingHookeEn : public GranSubModDamping { public: - GranSubModDampingEnHooke(class GranularModel *, class LAMMPS *); + GranSubModDampingHookeEn(class GranularModel *, class LAMMPS *); void init() override; double calculate_forces() override; }; /* ---------------------------------------------------------------------- */ - class GranSubModDampingEnHertz : public GranSubModDamping { + class GranSubModDampingHertzEn : public GranSubModDamping { public: - GranSubModDampingEnHertz(class GranularModel *, class LAMMPS *); + GranSubModDampingHertzEn(class GranularModel *, class LAMMPS *); void init() override; double calculate_forces() override; }; diff --git a/src/GRANULAR/granular_model.cpp b/src/GRANULAR/granular_model.cpp index c1ad692fb3..ed3c00866e 100644 --- a/src/GRANULAR/granular_model.cpp +++ b/src/GRANULAR/granular_model.cpp @@ -238,6 +238,10 @@ void GranularModel::init() 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"); + //Check if correct damping model is being used with the normal model + if(normal_model->name =="hooke" && damping_model->name == "hertz/en") error->all(FLERR, "hooke should not be used with hertz/en damping model, please use hooke/en"); + if((normal_model->name =="hertz" || normal_model->name =="hertz/material") && damping_model->name == "hooke/en") error->all(FLERR, "hertz/material or hertz should not be used with hooke/en damping model, please use hertz/en"); + // Twisting, rolling, and heat are optional twisting_defined = rolling_defined = heat_defined = 1; if (twisting_model->name == "none") twisting_defined = 0; From 0344b6af707c7d36c199c3bfbb4546915c36627f Mon Sep 17 00:00:00 2001 From: Dhairya Date: Fri, 5 Apr 2024 10:14:07 -0500 Subject: [PATCH 35/91] updated the associated example file --- examples/granular/en_example/start.lammps | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/granular/en_example/start.lammps b/examples/granular/en_example/start.lammps index 2bf0f54ddc..7a2a56a0e9 100644 --- a/examples/granular/en_example/start.lammps +++ b/examples/granular/en_example/start.lammps @@ -9,9 +9,10 @@ read_data particles.dat add append group mb type 1 pair_style granular -pair_coeff * * hertz/material 1e6 0.8 0.4 tangential mindlin NULL 0.0 0.5 damping enhertz -# pair_coeff * * hertz 1e6 0.3 tangential mindlin 1e4 1.0 0.5 damping enhertz -# pair_coeff * * hooke 1e6 0.5 tangential mindlin 1 1.0 0.0 damping enhooke +pair_coeff * * hertz/material 1e6 0.8 0.4 tangential mindlin NULL 0.0 0.5 damping hertz/en +# pair_coeff * * hertz/material 1e6 0.8 0.4 tangential mindlin NULL 0.0 0.5 damping hooke/en #Should throw and error +# pair_coeff * * hertz 1e6 0.3 tangential mindlin 1e4 1.0 0.5 damping hertz/en +# pair_coeff * * hooke 1e6 0.5 tangential mindlin 1 1.0 0.0 damping hooke/en comm_modify vel yes timestep 1e-9 From c5ecef82c12dadad990f5cf9ce755002210d0df5 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Thu, 18 Apr 2024 08:49:18 -0600 Subject: [PATCH 36/91] Updating BPM reference information --- doc/src/Howto_bpm.rst | 9 ++++++++- src/BPM/bond_bpm.cpp | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/doc/src/Howto_bpm.rst b/doc/src/Howto_bpm.rst index 0ca4e85fbb..5aa277275d 100644 --- a/doc/src/Howto_bpm.rst +++ b/doc/src/Howto_bpm.rst @@ -15,7 +15,8 @@ orientation for rotational models. This produces a stress-free initial state. Furthermore, bonds are allowed to break under large strains, producing fracture. The examples/bpm directory has sample input scripts for simulations of the fragmentation of an impacted plate and the -pouring of extended, elastic bodies. +pouring of extended, elastic bodies. See :ref:`(Clemmer) ` +for more general information on the approach and the LAMMPS implementation. ---------- @@ -150,3 +151,9 @@ the following are currently compatible with BPM bond styles: interactions, one will need to switch between different *special_bonds* settings in the input script. An example is found in ``examples/bpm/impact``. + +---------- + +.. _howto-Clemmer: + +**(Clemmer)** Clemmer, Monti, Lechman, Soft Matter, 20, 1702 (2024). diff --git a/src/BPM/bond_bpm.cpp b/src/BPM/bond_bpm.cpp index f1482d4203..9c2c680cc5 100644 --- a/src/BPM/bond_bpm.cpp +++ b/src/BPM/bond_bpm.cpp @@ -14,6 +14,7 @@ #include "bond_bpm.h" #include "atom.h" +#include "citeme.h" #include "comm.h" #include "domain.h" #include "error.h" @@ -30,6 +31,19 @@ using namespace LAMMPS_NS; +static const char cite_bpm[] = + "BPM bond style: doi:10.1039/D3SM01373A\n\n" + "@Article{Clemmer2024,\n" + " author = {Clemmer, Joel T. and Monti, Joseph M. and Lechman, Jeremy B.},\n" + " title = {A soft departure from jamming: the compaction of deformable\n" + " granular matter under high pressures},\n" + " journal = {Soft Matter},\n" + " year = 2024,\n" + " volume = 20,\n" + " number = 8,\n" + " pages = {1702--1718}\n" + "}\n\n"; + /* ---------------------------------------------------------------------- */ BondBPM::BondBPM(LAMMPS *_lmp) : @@ -55,6 +69,8 @@ BondBPM::BondBPM(LAMMPS *_lmp) : id_fix_dummy2 = utils::strdup("BPM_DUMMY2"); modify->add_fix(fmt::format("{} all DUMMY ", id_fix_dummy2)); + + if (lmp->citeme) lmp->citeme->add(cite_bpm); } /* ---------------------------------------------------------------------- */ From 931417da0ae4c27bce30e87a72ebb19bb145139b Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Thu, 18 Apr 2024 11:00:02 -0400 Subject: [PATCH 37/91] always return integers for counts previously, atom, bond, angles, dihedral and improper counts were normalized by natoms when using LJ units --- doc/src/compute_count_type.rst | 3 ++- src/compute_count_type.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/doc/src/compute_count_type.rst b/doc/src/compute_count_type.rst index ca3b02ecdb..de28be75e9 100644 --- a/doc/src/compute_count_type.rst +++ b/doc/src/compute_count_type.rst @@ -112,7 +112,8 @@ These values can be used by any command that uses global scalar or vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar and vector values calculated by this compute are "extensive". +The scalar and vector values returned by this compute are non-negative +integers. Restrictions """""""""""" diff --git a/src/compute_count_type.cpp b/src/compute_count_type.cpp index d430b23e11..7b1651b61c 100644 --- a/src/compute_count_type.cpp +++ b/src/compute_count_type.cpp @@ -62,24 +62,24 @@ ComputeCountType::ComputeCountType(LAMMPS *lmp, int narg, char **arg) : if (mode == ATOM) { vector_flag = 1; size_vector = atom->ntypes; - extvector = 1; + extvector = 0; } else if (mode == BOND) { scalar_flag = vector_flag = 1; size_vector = atom->nbondtypes; - extscalar = 1; - extvector = 1; + extscalar = 0; + extvector = 0; } else if (mode == ANGLE) { vector_flag = 1; size_vector = atom->nangletypes; - extvector = 1; + extvector = 0; } else if (mode == DIHEDRAL) { vector_flag = 1; size_vector = atom->ndihedraltypes; - extvector = 1; + extvector = 0; } else if (mode == IMPROPER) { vector_flag = 1; size_vector = atom->nimpropertypes; - extvector = 1; + extvector = 0; } // output vector From 97d8ecbac161e1335d9eb6613230b8c7761c97c7 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Fri, 19 Apr 2024 15:14:42 -0600 Subject: [PATCH 38/91] Improvements & bug fixes to fix def/press --- doc/src/fix_deform_pressure.rst | 19 ++++- src/EXTRA-FIX/fix_deform_pressure.cpp | 100 ++++++++++++++++++++------ src/EXTRA-FIX/fix_deform_pressure.h | 3 + src/fix_deform.cpp | 2 +- src/fix_deform.h | 2 +- 5 files changed, 100 insertions(+), 26 deletions(-) diff --git a/doc/src/fix_deform_pressure.rst b/doc/src/fix_deform_pressure.rst index c814aa892f..09472ed0c9 100644 --- a/doc/src/fix_deform_pressure.rst +++ b/doc/src/fix_deform_pressure.rst @@ -29,10 +29,12 @@ Syntax NOTE: All other styles are documented by the :doc:`fix deform ` command *xy*, *xz*, *yz* args = style value - style = *final* or *delta* or *vel* or *erate* or *trate* or *wiggle* or *variable* or *pressure* + style = *final* or *delta* or *vel* or *erate* or *trate* or *wiggle* or *variable* or *pressure* or *erate/rescale* *pressure* values = target gain target = target pressure (pressure units) gain = proportional gain constant (1/(time * pressure) or 1/time units) + *erate/rescale* value = R + R = engineering shear strain rate (1/time units) NOTE: All other styles are documented by the :doc:`fix deform ` command *box* = style value @@ -159,6 +161,21 @@ details of a simulation and testing different values is recommended. One can also apply a maximum limit to the magnitude of the applied strain using the :ref:`max/rate ` option. +The *erate/rescale* style operates similarly to the *erate* style with +a specified strain rate in units of 1/time. The difference is that +the change in the tilt factor will depend on the current length of +the box perpendicular to the shear direction, L, instead of the +original length, L0. The tilt factor T as a function of time will +change as + +.. parsed-literal:: + + T(t) = T(t-1) + L\*erate\* \Delta t + +where T(t-1) is the tilt factor on the previous timestep and :math:`\Delta t` +is the timestep size. This option may be useful in scenarios where +L changes in time. + ---------- The *box* parameter provides an additional control over the *x*, *y*, diff --git a/src/EXTRA-FIX/fix_deform_pressure.cpp b/src/EXTRA-FIX/fix_deform_pressure.cpp index 95788c23d6..869129d742 100644 --- a/src/EXTRA-FIX/fix_deform_pressure.cpp +++ b/src/EXTRA-FIX/fix_deform_pressure.cpp @@ -110,6 +110,12 @@ FixDeformPressure::FixDeformPressure(LAMMPS *lmp, int narg, char **arg) : } set_extra[index].pgain = utils::numeric(FLERR, arg[iarg + 3], false, lmp); i += 4; + } else if (strcmp(arg[iarg + 1], "erate/rescale") == 0) { + if (iarg + 3 > narg) utils::missing_cmd_args(FLERR, "fix deform/pressure erate/rescale", error); + set[index].style = ERATERS; + set[index].rate = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + iarg += 3; + i += 3; } else error->all(FLERR, "Illegal fix deform/pressure command: {}", arg[iarg + 1]); } else if (strcmp(arg[iarg], "box") == 0) { @@ -424,16 +430,31 @@ void FixDeformPressure::init() if (!pressure) error->all(FLERR, "Pressure ID {} for fix deform/pressure does not exist", id_press); } + + // if yz [3] changes and will cause box flip, then xy [5] cannot be changing + // this is b/c the flips would induce continuous changes in xz + // in order to keep the edge vectors of the flipped shape matrix + // an integer combination of the edge vectors of the unflipped shape matrix + // error if style PRESSURE/ERATEER for yz, can't calculate if box flip occurs + + if (set[3].style && set[5].style) { + int flag = 0; + double lo,hi; + if (flipflag && set[3].style == PRESSURE) + error->all(FLERR, "Fix {} cannot use yz pressure with xy", style); + if (flipflag && set[3].style == ERATERS) + error->all(FLERR, "Fix {} cannot use yz erate/rescale with xy", style); + } } /* ---------------------------------------------------------------------- - compute T,P if needed before integrator starts + compute T,P before integrator starts ------------------------------------------------------------------------- */ void FixDeformPressure::setup(int /*vflag*/) { - // trigger virial computation on next timestep - if (pressure_flag) pressure->addstep(update->ntimestep+1); + // trigger virial computation, if needed, on next timestep + if (pressure_flag) pressure->addstep(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ @@ -446,7 +467,20 @@ void FixDeformPressure::end_of_step() // set new box size for strain-based dims - if (strain_flag) FixDeform::apply_strain(); + if (strain_flag) { + FixDeform::apply_strain(); + + for (int i = 3; i < 6; i++) { + if (set[i].style == ERATERS) { + double L = domain->zprd; + if (i == 5) L = domain->yprd; + + h_rate[i] = set[i].rate * L; + set_extra[i].cumulative_shift += update->dt * h_rate[i]; + set[i].tilt_target = set[i].tilt_start + set_extra[i].cumulative_shift; + } + } + } // set new box size for pressure-based dims @@ -479,12 +513,33 @@ void FixDeformPressure::end_of_step() for (int i = 0; i < 3; i++) { set_extra[i].prior_pressure = pressure->vector[i]; set_extra[i].prior_rate = ((set[i].hi_target - set[i].lo_target) / - (domain->boxhi[i] - domain->boxlo[i]) - 1.0) / update->dt; + domain->prd[i] - 1.0) / update->dt; } } if (varflag) modify->addstep_compute(update->ntimestep + nevery); + // If tilting while evolving linear dimension, sum remapping effects + // otherwise, update_domain() will inaccurately use the current + // linear dimension to apply prior remappings + + for (int i = 3; i < 6; i++) { + int idenom = 0; + if (i == 3) idenom = 1; + if (set[i].style && (set_box.style || set[idenom].style)) { + // Add prior remappings. If the box remaps this timestep, don't + // add it yet so update_domain() will first detect the remapping + set[i].tilt_target += set_extra[i].cumulative_remap; + + // Update remapping for next timestep + double prd = set[idenom].hi_target - set[idenom].lo_target; + double prdinv = 1.0 / prd; + if (set[i].tilt_target * prdinv < -0.5) + set_extra[i].cumulative_remap += prd; + if (set[i].tilt_target * prdinv > 0.5) + set_extra[i].cumulative_remap -= prd; + } + } FixDeform::update_domain(); @@ -556,26 +611,24 @@ void FixDeformPressure::apply_pressure() h_ratelo[i] = -0.5 * h_rate[i]; - double offset = 0.5 * (domain->boxhi[i] - domain->boxlo[i]) * (1.0 + update->dt * h_rate[i]); - set[i].lo_target = 0.5 * (set[i].lo_start + set[i].hi_start) - offset; - set[i].hi_target = 0.5 * (set[i].lo_start + set[i].hi_start) + offset; + double shift = domain->prd[i] * update->dt * h_rate[i]; + set_extra[i].cumulative_shift += shift; + set[i].lo_target = set[i].lo_start - 0.5 * set_extra[i].cumulative_shift; + set[i].hi_target = set[i].hi_start + 0.5 * set_extra[i].cumulative_shift; } for (int i = 3; i < 6; i++) { if (set[i].style != PRESSURE) continue; - double L, tilt, pcurrent; + double L, pcurrent; if (i == 3) { L = domain->zprd; - tilt = domain->yz; pcurrent = tensor[5]; } else if (i == 4) { L = domain->zprd; - tilt = domain->xz + update->dt; pcurrent = tensor[4]; } else { L = domain->yprd; - tilt = domain->xy; pcurrent = tensor[3]; } @@ -592,7 +645,8 @@ void FixDeformPressure::apply_pressure() if (fabs(h_rate[i]) > max_h_rate) h_rate[i] = max_h_rate * h_rate[i] / fabs(h_rate[i]); - set[i].tilt_target = tilt + update->dt * h_rate[i]; + set_extra[i].cumulative_shift += update->dt * h_rate[i]; + set[i].tilt_target = set[i].tilt_start + set_extra[i].cumulative_shift; } } @@ -629,9 +683,9 @@ void FixDeformPressure::apply_volume() double dt = update->dt; double e1i = set_extra[i].prior_rate; double e2i = set_extra[fixed].prior_rate; - double L1i = domain->boxhi[i] - domain->boxlo[i]; - double L2i = domain->boxhi[fixed] - domain->boxlo[fixed]; - double L3i = domain->boxhi[dynamic1] - domain->boxlo[dynamic1]; + double L1i = domain->prd[i]; + double L2i = domain->prd[fixed]; + double L3i = domain->prd[dynamic1]; double L3 = (set[dynamic1].hi_target - set[dynamic1].lo_target); double Vi = L1i * L2i * L3i; double V = L3 * L1i * L2i; @@ -680,7 +734,7 @@ void FixDeformPressure::apply_volume() } } - h_rate[i] = (2.0 * shift / (domain->boxhi[i] - domain->boxlo[i]) - 1.0) / update->dt; + h_rate[i] = (2.0 * shift / domain->prd[i] - 1.0) / update->dt; h_ratelo[i] = -0.5 * h_rate[i]; set[i].lo_target = 0.5 * (set[i].lo_start + set[i].hi_start) - shift; @@ -742,7 +796,7 @@ void FixDeformPressure::apply_box() set[i].hi_target = 0.5 * (set[i].lo_start + set[i].hi_start) + shift; // Recalculate h_rate - h_rate[i] = (set[i].hi_target - set[i].lo_target) / (domain->boxhi[i] - domain->boxlo[i]) - 1.0; + h_rate[i] = (set[i].hi_target - set[i].lo_target) / domain->prd[i] - 1.0; h_rate[i] /= update->dt; h_ratelo[i] = -0.5 * h_rate[i]; } @@ -767,14 +821,14 @@ void FixDeformPressure::apply_box() if (fabs(v_rate) > max_h_rate) v_rate = max_h_rate * v_rate / fabs(v_rate); - scale = (1.0 + update->dt * v_rate); for (i = 0; i < 3; i++) { - shift = 0.5 * (set[i].hi_target - set[i].lo_target) * scale; - set[i].lo_target = 0.5 * (set[i].lo_start + set[i].hi_start) - shift; - set[i].hi_target = 0.5 * (set[i].lo_start + set[i].hi_start) + shift; + shift = (set[i].hi_target - set[i].lo_target) * update->dt * v_rate; + set_extra[6].cumulative_vshift[i] += shift; + set[i].lo_target -= 0.5 * set_extra[6].cumulative_vshift[i]; + set[i].hi_target += 0.5 * set_extra[6].cumulative_vshift[i]; // Recalculate h_rate - h_rate[i] = (set[i].hi_target - set[i].lo_target) / (domain->boxhi[i] - domain->boxlo[i]) - 1.0; + h_rate[i] = (set[i].hi_target - set[i].lo_target) / domain->prd[i] - 1.0; h_rate[i] /= update->dt; h_ratelo[i] = -0.5 * h_rate[i]; } diff --git a/src/EXTRA-FIX/fix_deform_pressure.h b/src/EXTRA-FIX/fix_deform_pressure.h index 10af1e5ba3..7ce69b9bc5 100644 --- a/src/EXTRA-FIX/fix_deform_pressure.h +++ b/src/EXTRA-FIX/fix_deform_pressure.h @@ -51,6 +51,9 @@ class FixDeformPressure : public FixDeform { struct SetExtra { double ptarget, pgain; double prior_pressure, prior_rate; + double cumulative_shift; + double cumulative_vshift[3]; + double cumulative_remap; int saved; char *pstr; int pvar, pvar_flag; diff --git a/src/fix_deform.cpp b/src/fix_deform.cpp index bb27faeaa8..135d7176e6 100644 --- a/src/fix_deform.cpp +++ b/src/fix_deform.cpp @@ -63,7 +63,7 @@ irregular(nullptr), set(nullptr) int nskip; if (utils::strmatch(style, "^deform/pressure")) { child_parameters.insert("box"); - child_styles.insert({{"pressure", 4}, {"pressure/mean", 4}, {"volume", 2}}); + child_styles.insert({{"pressure", 4}, {"pressure/mean", 4}, {"erate/rescale", 3}, {"volume", 2}}); } // set defaults diff --git a/src/fix_deform.h b/src/fix_deform.h index b133729444..c524c2fe6c 100644 --- a/src/fix_deform.h +++ b/src/fix_deform.h @@ -29,7 +29,7 @@ class FixDeform : public Fix { int remapflag; // whether x,v are remapped across PBC int dimflag[6]; // which dims are deformed - enum { NONE, FINAL, DELTA, SCALE, VEL, ERATE, TRATE, VOLUME, WIGGLE, VARIABLE, PRESSURE, PMEAN }; + enum { NONE, FINAL, DELTA, SCALE, VEL, ERATE, TRATE, VOLUME, WIGGLE, VARIABLE, PRESSURE, PMEAN, ERATERS }; enum { ONE_FROM_ONE, ONE_FROM_TWO, TWO_FROM_ONE }; FixDeform(class LAMMPS *, int, char **); From 14dc82a2bf54698f187419190233e1ff50022678 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Fri, 19 Apr 2024 15:40:27 -0600 Subject: [PATCH 39/91] Adding periodicity check --- src/EXTRA-FIX/fix_deform_pressure.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EXTRA-FIX/fix_deform_pressure.cpp b/src/EXTRA-FIX/fix_deform_pressure.cpp index 869129d742..29506881fc 100644 --- a/src/EXTRA-FIX/fix_deform_pressure.cpp +++ b/src/EXTRA-FIX/fix_deform_pressure.cpp @@ -526,7 +526,7 @@ void FixDeformPressure::end_of_step() for (int i = 3; i < 6; i++) { int idenom = 0; if (i == 3) idenom = 1; - if (set[i].style && (set_box.style || set[idenom].style)) { + if (set[i].style && (set_box.style || set[idenom].style) && domain->periodicity[idenom]) { // Add prior remappings. If the box remaps this timestep, don't // add it yet so update_domain() will first detect the remapping set[i].tilt_target += set_extra[i].cumulative_remap; From 6bd57cd90a75cbf0dd045f53113cec0c250af723 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sun, 21 Apr 2024 23:20:20 -0400 Subject: [PATCH 40/91] fix atom/swap reports value as intensive --- doc/src/fix_atom_swap.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_atom_swap.rst b/doc/src/fix_atom_swap.rst index aa8127561c..c215fa4ff5 100644 --- a/doc/src/fix_atom_swap.rst +++ b/doc/src/fix_atom_swap.rst @@ -168,7 +168,7 @@ the following global cumulative quantities: * 1 = swap attempts * 2 = swap accepts -The vector values calculated by this fix are "extensive". +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 From 26c8a3a63996c7040d9f18f1991fa403535002a0 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sun, 21 Apr 2024 23:25:33 -0400 Subject: [PATCH 41/91] fix gcmc and widom also report 'intensively' --- doc/src/fix_gcmc.rst | 2 +- doc/src/fix_widom.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_gcmc.rst b/doc/src/fix_gcmc.rst index a21e85d803..f3bd0891b9 100644 --- a/doc/src/fix_gcmc.rst +++ b/doc/src/fix_gcmc.rst @@ -427,7 +427,7 @@ the following global cumulative quantities: * 7 = rotation attempts * 8 = rotation successes -The vector values calculated by this fix are "extensive". +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 diff --git a/doc/src/fix_widom.rst b/doc/src/fix_widom.rst index 43e081800f..c14b88a2e4 100644 --- a/doc/src/fix_widom.rst +++ b/doc/src/fix_widom.rst @@ -179,7 +179,7 @@ the following global cumulative quantities: * 2 = average difference in potential energy on each timestep * 3 = volume of the insertion region -The vector values calculated by this fix are "extensive". +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 From a50192a7d14400546f136aa373a4ad007df66620 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sun, 21 Apr 2024 23:29:27 -0400 Subject: [PATCH 42/91] mol/swap also flags output as intensive value! --- doc/src/fix_mol_swap.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_mol_swap.rst b/doc/src/fix_mol_swap.rst index b344b9c0e6..4f99c3748b 100644 --- a/doc/src/fix_mol_swap.rst +++ b/doc/src/fix_mol_swap.rst @@ -146,7 +146,7 @@ the following global cumulative quantities: * 1 = swap attempts * 2 = swap accepts -The vector values calculated by this fix are "extensive". +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 From e15f7a1e962d57249ed00bdae7e7112e42513d9b Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sun, 21 Apr 2024 23:38:15 -0400 Subject: [PATCH 43/91] clarify that sgcmc output is intensive --- doc/src/fix_sgcmc.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/fix_sgcmc.rst b/doc/src/fix_sgcmc.rst index bcdbdf2736..6be5cd2e1a 100644 --- a/doc/src/fix_sgcmc.rst +++ b/doc/src/fix_sgcmc.rst @@ -148,6 +148,8 @@ components of the vector represent the following quantities: * ... * N+2: The current global concentration of species *X* (= number of atoms of type *N* / total number of atoms) +The vector values calculated by this fix are "intensive". + Restrictions """""""""""" From 761cfdaabf08bdd599137ded80d9bfd6b4bb8605 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Apr 2024 07:26:02 -0400 Subject: [PATCH 44/91] switch markdown formatting to restructured text --- doc/src/compute_count_type.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/src/compute_count_type.rst b/doc/src/compute_count_type.rst index de28be75e9..02508cf8dd 100644 --- a/doc/src/compute_count_type.rst +++ b/doc/src/compute_count_type.rst @@ -12,7 +12,7 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * count/type = style name of this compute command -* mode = {atom} or {bond} or {angle} or {dihedral} or {improper} +* mode = *atom* or *bond* or *angle* or *dihedral* or *improper* Examples """""""" @@ -69,29 +69,29 @@ for each type: ---------- -If the {mode} setting is {atom} then the count of atoms for each atom +If the *mode* setting is *atom* then the count of atoms for each atom type is tallied. Only atoms in the specified group are counted. -If the {mode} setting is {bond} then the count of bonds for each bond +If the *mode* setting is *bond* then the count of bonds for each bond type is tallied. Only bonds with both atoms in the specified group are counted. -For {mode} = {bond}, broken bonds with a bond type of zero are also +For *mode* = *bond*, broken bonds with a bond type of zero are also counted. The :doc:`bond_style quartic ` and :doc:`BPM bond styles ` break bonds by doing this. See the :doc:` Howto broken bonds ` doc page for more details. Note that the group setting is ignored for broken bonds; all broken bonds in the system are counted. -If the {mode} setting is {angle} then the count of angles for each +If the *mode* setting is *angle* then the count of angles for each angle type is tallied. Only angles with all 3 atoms in the specified group are counted. -If the {mode} setting is {dihedral} then the count of dihedrals for +If the *mode* setting is *dihedral* then the count of dihedrals for each dihedral type is tallied. Only dihedrals with all 4 atoms in the specified group are counted. -If the {mode} setting is {improper} then the count of impropers for +If the *mode* setting is *improper* then the count of impropers for each improper type is tallied. Only impropers with all 4 atoms in the specified group are counted. @@ -101,11 +101,11 @@ Output info """"""""""" This compute calculates a global vector of counts. If the mode is -{atom} or {bond} or {angle} or {dihedral} or {improper}, then the +*atom* or *bond* or *angle* or *dihedral* or *improper*, then the vector length is the number of atom types or bond types or angle types or dihedral types or improper types, respectively. -If the mode is {bond} this compute also calculates a global scalar +If the mode is *bond* this compute also calculates a global scalar which is the number of broken bonds with type = 0, as explained above. These values can be used by any command that uses global scalar or From 3ab6997a5bb261c70eb0346a73c1c8d146c27215 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Apr 2024 07:28:53 -0400 Subject: [PATCH 45/91] fix broken link --- doc/src/compute_count_type.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/compute_count_type.rst b/doc/src/compute_count_type.rst index 02508cf8dd..b0985a1caf 100644 --- a/doc/src/compute_count_type.rst +++ b/doc/src/compute_count_type.rst @@ -78,8 +78,8 @@ are counted. For *mode* = *bond*, broken bonds with a bond type of zero are also counted. The :doc:`bond_style quartic ` and :doc:`BPM -bond styles ` break bonds by doing this. See the :doc:` -Howto broken bonds ` doc page for more details. +bond styles ` break bonds by doing this. See the +:doc:`Howto broken bonds ` doc page for more details. Note that the group setting is ignored for broken bonds; all broken bonds in the system are counted. From d896f307ba676a0b69a04c63b5705c09a553d932 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Mon, 22 Apr 2024 14:00:38 -0400 Subject: [PATCH 46/91] Update fix_hyper_local.rst --- doc/src/fix_hyper_local.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/src/fix_hyper_local.rst b/doc/src/fix_hyper_local.rst index 76b17cddc4..54a4516fd1 100644 --- a/doc/src/fix_hyper_local.rst +++ b/doc/src/fix_hyper_local.rst @@ -512,8 +512,7 @@ Value 27 computes the average boost for biased bonds only on this step. Value 28 is the count of bonds with an absolute value of strain >= q on this step. -The scalar value is an "extensive" quantity since it grows with the -system size; the vector values are all "intensive". +The scalar value and vector values are all "intensive". This fix also computes a local vector of length the number of bonds currently in the system. The value for each bond is its :math:`C_{ij}` From a88e8757e3cedfa0c13f5fec85fd0ab318ba2e2e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Apr 2024 19:55:52 -0400 Subject: [PATCH 47/91] guard against not setting extscalar, extvector, or extarray when required --- src/compute.cpp | 11 +++++++++++ src/fix.cpp | 20 ++++++++++++++++++-- src/fix.h | 1 + src/modify.cpp | 9 ++++++++- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/compute.cpp b/src/compute.cpp index a12373fd51..5d5a4d5246 100644 --- a/src/compute.cpp +++ b/src/compute.cpp @@ -59,6 +59,7 @@ Compute::Compute(LAMMPS *lmp, int narg, char **arg) : // set child class defaults scalar_flag = vector_flag = array_flag = 0; + extscalar = extvector = extarray = -1; peratom_flag = local_flag = pergrid_flag = 0; size_vector_variable = size_array_rows_variable = 0; @@ -116,6 +117,16 @@ void Compute::init_flags() initialized_flag = 1; invoked_scalar = invoked_vector = invoked_array = -1; invoked_peratom = invoked_local = -1; + + if (scalar_flag && (extscalar < 0)) + error->all(FLERR, "Must set 'extscalar' when setting 'scalar_flag' for compute {}. " + "Contact the developer.", style); + if (vector_flag && (extvector < 0)) + error->all(FLERR, "Must set 'extvector' when setting 'vector_flag' for compute {}. " + "Contact the developer.", style); + if (array_flag && (extarray < 0)) + error->all(FLERR, "Must set 'extarray' when setting 'array_flag' for compute {}. " + "Contact the developer.", style); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix.cpp b/src/fix.cpp index 754948fdd1..1e1ab8c928 100644 --- a/src/fix.cpp +++ b/src/fix.cpp @@ -81,6 +81,7 @@ Fix::Fix(LAMMPS *lmp, int /*narg*/, char **arg) : diam_flag = 0; scalar_flag = vector_flag = array_flag = 0; + extscalar = extvector = extarray = -1; peratom_flag = local_flag = pergrid_flag = 0; global_freq = local_freq = peratom_freq = pergrid_freq = -1; size_vector_variable = size_array_rows_variable = 0; @@ -119,13 +120,28 @@ Fix::~Fix() { if (copymode) return; - delete [] id; - delete [] style; + delete[] id; + delete[] style; memory->destroy(eatom); memory->destroy(vatom); memory->destroy(cvatom); } +/* ---------------------------------------------------------------------- */ + +void Fix::init_flags() +{ + if (scalar_flag && (extscalar < 0)) + error->all(FLERR, "Must set 'extscalar' when setting 'scalar_flag' for fix {}. " + "Contact the developer.", style); + if (vector_flag && (extvector < 0)) + error->all(FLERR, "Must set 'extvector' when setting 'vector_flag' for fix {}. " + "Contact the developer.", style); + if (array_flag && (extarray < 0)) + error->all(FLERR, "Must set 'extarray' when setting 'array_flag' for fix {}. " + "Contact the developer.", style); +} + /* ---------------------------------------------------------------------- process params common to all fixes here if unknown param, call modify_param specific to the fix diff --git a/src/fix.h b/src/fix.h index ca0a1ef84b..594fbb51bf 100644 --- a/src/fix.h +++ b/src/fix.h @@ -145,6 +145,7 @@ class Fix : protected Pointers { virtual void post_constructor() {} virtual void init() {} + void init_flags(); virtual void init_list(int, class NeighList *) {} virtual void setup(int) {} virtual void setup_pre_exchange() {} diff --git a/src/modify.cpp b/src/modify.cpp index ba04c5969a..1a9c056027 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -188,6 +188,8 @@ void Modify::init() // since any of them may be invoked by initial thermo // do not clear out invocation times stored within a compute, // b/c some may be holdovers from previous run, like for ave fixes + // perform check whether extscalar, extvector, and extarray have been + // set when scalar_flag, vector_flag, or array_flag are true. for (i = 0; i < ncompute; i++) { compute[i]->init(); @@ -200,8 +202,13 @@ void Modify::init() // used to b/c temperature computes called fix->dof() in their init, // and fix rigid required its own init before its dof() could be called, // but computes now do their DOF in setup() + // perform check whether extscalar, extvector, and extarray have been + // set when scalar_flag, vector_flag, or array_flag are true. - for (i = 0; i < nfix; i++) fix[i]->init(); + for (i = 0; i < nfix; i++) { + fix[i]->init(); + fix[i]->init_flags(); + } // set global flag if any fix has its restart_pbc flag set From 3ce628cf07c8abfd1e0812a6be3b2ef1299ced29 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Apr 2024 19:58:44 -0400 Subject: [PATCH 48/91] fix extscalar bugs in fix shake and fix sprint/rg --- src/EXTRA-FIX/fix_spring_rg.cpp | 1 + src/RIGID/fix_shake.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/EXTRA-FIX/fix_spring_rg.cpp b/src/EXTRA-FIX/fix_spring_rg.cpp index 46afa905b3..3207f92a8d 100644 --- a/src/EXTRA-FIX/fix_spring_rg.cpp +++ b/src/EXTRA-FIX/fix_spring_rg.cpp @@ -46,6 +46,7 @@ FixSpringRG::FixSpringRG(LAMMPS *lmp, int narg, char **arg) : restart_global = 1; scalar_flag = 1; + extscalar = 0; restart_global = 1; dynamic_group_allow = 1; respa_level_support = 1; diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 73c29d86bd..5df0f525e8 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -63,6 +63,7 @@ FixShake::FixShake(LAMMPS *lmp, int narg, char **arg) : create_attribute = 1; dof_flag = 1; scalar_flag = 1; + extscalar = 1; stores_ids = 1; centroidstressflag = CENTROID_AVAIL; next_output = -1; From 44bfcff550f0d369c724aecd1b12ca96e4497c0f Mon Sep 17 00:00:00 2001 From: jtclemm Date: Mon, 22 Apr 2024 19:08:29 -0600 Subject: [PATCH 49/91] Fixing variable pmean in deform/press --- src/EXTRA-FIX/fix_deform_pressure.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/EXTRA-FIX/fix_deform_pressure.cpp b/src/EXTRA-FIX/fix_deform_pressure.cpp index 29506881fc..e2bcdd7f4e 100644 --- a/src/EXTRA-FIX/fix_deform_pressure.cpp +++ b/src/EXTRA-FIX/fix_deform_pressure.cpp @@ -557,7 +557,7 @@ void FixDeformPressure::apply_pressure() { // If variable pressure, calculate current target for (int i = 0; i < 6; i++) - if (set[i].style == PRESSURE) + if (set[i].style == PRESSURE || set[i].style == PMEAN) if (set_extra[i].pvar_flag) set_extra[i].ptarget = input->variable->compute_equal(set_extra[i].pvar); @@ -824,6 +824,13 @@ void FixDeformPressure::apply_box() for (i = 0; i < 3; i++) { shift = (set[i].hi_target - set[i].lo_target) * update->dt * v_rate; set_extra[6].cumulative_vshift[i] += shift; + + if (set[i].style == NONE) { + // Overwrite default targets of current length + set[i].lo_target = set[i].lo_start; + set[i].hi_target = set[i].hi_start; + } + set[i].lo_target -= 0.5 * set_extra[6].cumulative_vshift[i]; set[i].hi_target += 0.5 * set_extra[6].cumulative_vshift[i]; From dc04a2ec5a19adc5c6894317780159d4e9810411 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Apr 2024 21:22:24 -0400 Subject: [PATCH 50/91] for vectors we have to check for either extvector or extlist --- src/compute.cpp | 4 ++-- src/fix.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compute.cpp b/src/compute.cpp index 5d5a4d5246..d703cbfe6a 100644 --- a/src/compute.cpp +++ b/src/compute.cpp @@ -121,8 +121,8 @@ void Compute::init_flags() if (scalar_flag && (extscalar < 0)) error->all(FLERR, "Must set 'extscalar' when setting 'scalar_flag' for compute {}. " "Contact the developer.", style); - if (vector_flag && (extvector < 0)) - error->all(FLERR, "Must set 'extvector' when setting 'vector_flag' for compute {}. " + if (vector_flag && (extvector < 0) && !extlist) + error->all(FLERR, "Must set 'extvector' or 'extlist' when setting 'vector_flag' for compute {}. " "Contact the developer.", style); if (array_flag && (extarray < 0)) error->all(FLERR, "Must set 'extarray' when setting 'array_flag' for compute {}. " diff --git a/src/fix.cpp b/src/fix.cpp index 1e1ab8c928..dba225549d 100644 --- a/src/fix.cpp +++ b/src/fix.cpp @@ -134,8 +134,8 @@ void Fix::init_flags() if (scalar_flag && (extscalar < 0)) error->all(FLERR, "Must set 'extscalar' when setting 'scalar_flag' for fix {}. " "Contact the developer.", style); - if (vector_flag && (extvector < 0)) - error->all(FLERR, "Must set 'extvector' when setting 'vector_flag' for fix {}. " + if (vector_flag && (extvector < 0) && !extlist) + error->all(FLERR, "Must set 'extvector' or 'extlist' when setting 'vector_flag' for fix {}. " "Contact the developer.", style); if (array_flag && (extarray < 0)) error->all(FLERR, "Must set 'extarray' when setting 'array_flag' for fix {}. " From f66ae5c28599a428d7e7aaacfeb195d7bc05459b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Apr 2024 21:23:42 -0400 Subject: [PATCH 51/91] output verbose info --- unittest/cplusplus/test_advanced_utils.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/unittest/cplusplus/test_advanced_utils.cpp b/unittest/cplusplus/test_advanced_utils.cpp index 0453ef0143..e20828a2a1 100644 --- a/unittest/cplusplus/test_advanced_utils.cpp +++ b/unittest/cplusplus/test_advanced_utils.cpp @@ -121,6 +121,7 @@ TEST_F(Advanced_utils, expand_args) command("fix 2 all nve"); command("run 1 post no"); auto output = END_CAPTURE_OUTPUT(); + if (verbose) std::cout << output << std::endl; char **args, **earg; constexpr int oarg = 9; From 400070d038f76ed066d6e1544ea206b9c51e0901 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Apr 2024 21:28:56 -0400 Subject: [PATCH 52/91] catch command errors --- unittest/cplusplus/test_advanced_utils.cpp | 35 +++++++++++++++------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/unittest/cplusplus/test_advanced_utils.cpp b/unittest/cplusplus/test_advanced_utils.cpp index e20828a2a1..1da9500b35 100644 --- a/unittest/cplusplus/test_advanced_utils.cpp +++ b/unittest/cplusplus/test_advanced_utils.cpp @@ -110,16 +110,31 @@ TEST_F(Advanced_utils, expand_args) { atomic_system(); BEGIN_CAPTURE_OUTPUT(); - command("compute temp all temp"); - command("variable temp vector c_temp"); - command("variable step equal step"); - command("variable pe equal pe"); - command("variable pe equal pe"); - command("variable epair equal epair"); - command("compute gofr all rdf 20 1 1 1 2"); - command("fix 1 all ave/time 1 1 1 v_step v_pe v_epair"); - command("fix 2 all nve"); - command("run 1 post no"); + try { + command("compute temp all temp"); + command("variable temp vector c_temp"); + command("variable step equal step"); + command("variable pe equal pe"); + command("variable pe equal pe"); + command("variable epair equal epair"); + command("compute gofr all rdf 20 1 1 1 2"); + command("fix 1 all ave/time 1 1 1 v_step v_pe v_epair"); + command("fix 2 all nve"); + command("run 1 post no"); + } catch (LAMMPSAbortException &ae) { + fprintf(stderr, "LAMMPS Error: %s\n", ae.what()); + exit(2); + } catch (LAMMPSException &e) { + fprintf(stderr, "LAMMPS Error: %s\n", e.what()); + exit(3); + } catch (fmt::format_error &fe) { + fprintf(stderr, "fmt::format_error: %s\n", fe.what()); + exit(4); + } catch (std::exception &e) { + fprintf(stderr, "General exception: %s\n", e.what()); + exit(5); + } + auto output = END_CAPTURE_OUTPUT(); if (verbose) std::cout << output << std::endl; From f815ded1b8709292a93d393da8b70adb8eec4a41 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Apr 2024 22:04:42 -0400 Subject: [PATCH 53/91] add a few more intensive vs. externsive settings --- src/GRANULAR/fix_pour.cpp | 1 + src/VORONOI/compute_voronoi_atom.cpp | 1 + src/fix_deposit.cpp | 1 + 3 files changed, 3 insertions(+) diff --git a/src/GRANULAR/fix_pour.cpp b/src/GRANULAR/fix_pour.cpp index cc5f0567e8..2dcaf9069f 100644 --- a/src/GRANULAR/fix_pour.cpp +++ b/src/GRANULAR/fix_pour.cpp @@ -59,6 +59,7 @@ FixPour::FixPour(LAMMPS *lmp, int narg, char **arg) : if (lmp->kokkos) error->all(FLERR, "Cannot yet use fix pour with the KOKKOS package"); scalar_flag = 1; + extscalar = 0; time_depend = 1; if (!atom->radius_flag || !atom->rmass_flag) diff --git a/src/VORONOI/compute_voronoi_atom.cpp b/src/VORONOI/compute_voronoi_atom.cpp index ca4ad4a85c..4aa6ebf559 100644 --- a/src/VORONOI/compute_voronoi_atom.cpp +++ b/src/VORONOI/compute_voronoi_atom.cpp @@ -126,6 +126,7 @@ ComputeVoronoi::ComputeVoronoi(LAMMPS *lmp, int narg, char **arg) : if (maxedge > 0) { vector_flag = 1; + extvector = 0; size_vector = maxedge+1; memory->create(edge,maxedge+1,"voronoi/atom:edge"); memory->create(sendvector,maxedge+1,"voronoi/atom:sendvector"); diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp index d8ea665149..ccf2cf51f1 100644 --- a/src/fix_deposit.cpp +++ b/src/fix_deposit.cpp @@ -54,6 +54,7 @@ FixDeposit::FixDeposit(LAMMPS *lmp, int narg, char **arg) : if (narg < 7) error->all(FLERR,"Illegal fix deposit command"); scalar_flag = 1; + extscalar = 0; restart_global = 1; time_depend = 1; From f6eeaaef6f9539825b37a62e5c4d854e196714e0 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Tue, 23 Apr 2024 19:45:14 -0400 Subject: [PATCH 54/91] Update compute_count_type.rst --- doc/src/compute_count_type.rst | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/doc/src/compute_count_type.rst b/doc/src/compute_count_type.rst index b0985a1caf..cd72050259 100644 --- a/doc/src/compute_count_type.rst +++ b/doc/src/compute_count_type.rst @@ -72,6 +72,19 @@ for each type: If the *mode* setting is *atom* then the count of atoms for each atom type is tallied. Only atoms in the specified group are counted. +The atom count for each type can be normalized by the total number of +atoms like so: + +.. code-block:: LAMMPS + + compute typevec all count/type atom # number of atoms of each type + variable normtypes vector c_typevec/atoms # divide by total number of atoms + variable ntypes equal extract_setting(ntypes) # number of atom types + thermo_style custom step v_normtypes[*$(v_ntypes)] # vector variable needs upper limit + +Similarly, bond counts can be normalized by the total number of bonds. +The same goes for angles, dihedrals, and impropers (see below). + If the *mode* setting is *bond* then the count of bonds for each bond type is tallied. Only bonds with both atoms in the specified group are counted. @@ -112,8 +125,8 @@ These values can be used by any command that uses global scalar or vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar and vector values returned by this compute are non-negative -integers. +The scalar and vector values calculated by this compute are both +"intensive". Restrictions """""""""""" From 80a0c5899ee2e4bfcf50a3d22bcbc90245f87162 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Tue, 23 Apr 2024 20:47:01 -0600 Subject: [PATCH 55/91] Fix coeff parsing classic gran model --- src/GRANULAR/granular_model.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/GRANULAR/granular_model.cpp b/src/GRANULAR/granular_model.cpp index 14431f41b4..9764ec42e9 100644 --- a/src/GRANULAR/granular_model.cpp +++ b/src/GRANULAR/granular_model.cpp @@ -216,9 +216,15 @@ int GranularModel::define_classic_model(char **arg, int iarg, int narg) // manually parse coeffs normal_model->coeffs[0] = kn; normal_model->coeffs[1] = gamman; - tangential_model->coeffs[0] = kt; - tangential_model->coeffs[1] = gammat / gamman; - tangential_model->coeffs[2] = xmu; + + if (tangential_model->num_coeffs == 2) { + tangential_model->coeffs[0] = gammat / gamman; + tangential_model->coeffs[1] = xmu; + } else { + tangential_model->coeffs[0] = kt; + tangential_model->coeffs[1] = gammat / gamman; + tangential_model->coeffs[2] = xmu; + } normal_model->coeffs_to_local(); tangential_model->coeffs_to_local(); From 3dbfe26b6df145d369dda65b02a9007f5fe5b74e Mon Sep 17 00:00:00 2001 From: jtclemm Date: Tue, 23 Apr 2024 20:58:20 -0600 Subject: [PATCH 56/91] Extra D2min options/checks for undercoord particles --- doc/src/fix_nonaffine_displacement.rst | 15 ++++- src/EXTRA-FIX/fix_nonaffine_displacement.cpp | 59 ++++++++++++++++---- src/EXTRA-FIX/fix_nonaffine_displacement.h | 4 +- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/doc/src/fix_nonaffine_displacement.rst b/doc/src/fix_nonaffine_displacement.rst index 0a271ebc32..becc47eec8 100644 --- a/doc/src/fix_nonaffine_displacement.rst +++ b/doc/src/fix_nonaffine_displacement.rst @@ -8,7 +8,7 @@ Syntax .. parsed-literal:: - fix ID group nonaffine/displacement style args reference/style nstep + fix ID group nonaffine/displacement style args reference/style nstep keyword values * ID, group are documented in :doc:`fix ` command * nonaffine/displacement = style name of this fix command @@ -32,6 +32,13 @@ Syntax *update* = update the reference frame every *nstep* timesteps *offset* = update the reference frame *nstep* timesteps before calculating the nonaffine displacement +* zero or more keyword/value pairs may be appended + + .. parsed-literal:: + + *z/min* values = zmin + zmin = minimum coordination number to calculate D2min + Examples """""""" @@ -76,6 +83,12 @@ is the identity tensor. This calculation is only performed on timesteps that are a multiple of *nevery* (including timestep zero). Data accessed before this occurs will simply be zeroed. +For particles with low coordination numbers, calculations of :math:`D^2_\mathrm{min}` +may have poor accuracy. An optional minimum coordination number can be defined using +the *z/min* keyword. If any particles have fewer than the specified number of particles +in the cutoff distance or in contact, the above calculations will be skipped and the +peratom array entries will be zero. + The *integrated* style simply integrates the velocity of particles every timestep to calculate a displacement. This style only works if used in conjunction with another fix that deforms the box and displaces diff --git a/src/EXTRA-FIX/fix_nonaffine_displacement.cpp b/src/EXTRA-FIX/fix_nonaffine_displacement.cpp index eaf45f4e59..846f434dce 100644 --- a/src/EXTRA-FIX/fix_nonaffine_displacement.cpp +++ b/src/EXTRA-FIX/fix_nonaffine_displacement.cpp @@ -46,6 +46,8 @@ enum { TYPE, RADIUS, CUSTOM }; enum { INTEGRATED, D2MIN }; enum { FIXED, OFFSET, UPDATE }; +static constexpr double EPSILON = 1.0e-15; + static const char cite_nonaffine_d2min[] = "@article{PhysRevE.57.7192,\n" " title = {Dynamics of viscoplastic deformation in amorphous solids},\n" @@ -66,7 +68,7 @@ static const char cite_nonaffine_d2min[] = FixNonaffineDisplacement::FixNonaffineDisplacement(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), id_fix(nullptr), fix(nullptr), D2min(nullptr), X(nullptr), Y(nullptr), - F(nullptr), norm(nullptr) + F(nullptr), norm(nullptr), singular(nullptr) { if (narg < 4) utils::missing_cmd_args(FLERR,"fix nonaffine/displacement", error); @@ -74,6 +76,8 @@ FixNonaffineDisplacement::FixNonaffineDisplacement(LAMMPS *lmp, int narg, char * if (nevery <= 0) error->all(FLERR,"Illegal nevery value {} in fix nonaffine/displacement", nevery); reference_timestep = update_timestep = offset_timestep = -1; + z_min = 0; + int iarg = 4; if (strcmp(arg[iarg], "integrated") == 0) { nad_style = INTEGRATED; @@ -117,6 +121,16 @@ FixNonaffineDisplacement::FixNonaffineDisplacement(LAMMPS *lmp, int narg, char * if ((offset_timestep <= 0) || (offset_timestep > nevery)) error->all(FLERR, "Illegal offset timestep {} in fix nonaffine/displacement", arg[iarg + 1]); } else error->all(FLERR,"Illegal reference style {} in fix nonaffine/displacement", arg[iarg]); + iarg += 2; + + while (iarg < narg) { + if (strcmp(arg[iarg], "z/min") == 0) { + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR,"fix nonaffine/displacement", error); + z_min = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + if (z_min < 0) error->all(FLERR, "Minimum coordination must be positive"); + iarg += 2; + } else error->all(FLERR,"Illegal keyword {} in fix nonaffine/displacement", arg[iarg]); + } if (nad_style == D2MIN) if (cut_style == RADIUS && (!atom->radius_flag)) @@ -151,6 +165,7 @@ FixNonaffineDisplacement::~FixNonaffineDisplacement() memory->destroy(Y); memory->destroy(F); memory->destroy(norm); + memory->destroy(singular); memory->destroy(D2min); } @@ -395,6 +410,7 @@ void FixNonaffineDisplacement::calculate_D2Min() } } norm[i] = 0; + singular[i] = 0; D2min[i] = 0; } @@ -471,14 +487,29 @@ void FixNonaffineDisplacement::calculate_D2Min() } if (dim == 3) { - invert3(Y_tmp, Y_inv); + denom = det3(Y_tmp); + if (fabs(denom) < EPSILON) { + singular[i] = 1; + for (j = 0; j < 3; j++) + for (k = 0; k < 3; k++) + Y_inv[j][k] = 0.0; + } else { + invert3(Y_tmp, Y_inv); + } } else { denom = Y_tmp[0][0] * Y_tmp[1][1] - Y_tmp[0][1] * Y_tmp[1][0]; - if (denom != 0.0) denom = 1.0 / denom; - Y_inv[0][0] = Y_tmp[1][1] * denom; - Y_inv[0][1] = -Y_tmp[0][1] * denom; - Y_inv[1][0] = -Y_tmp[1][0] * denom; - Y_inv[1][1] = Y_tmp[0][0] * denom; + if (fabs(denom) < EPSILON) { + singular[i] = 1; + for (j = 0; j < 2; j++) + for (k = 0; k < 2; k++) + Y_inv[j][k] = 0.0; + } else { + denom = 1.0 / denom; + Y_inv[0][0] = Y_tmp[1][1] * denom; + Y_inv[0][1] = -Y_tmp[0][1] * denom; + Y_inv[1][0] = -Y_tmp[1][0] * denom; + Y_inv[1][1] = Y_tmp[0][0] * denom; + } } times3(X_tmp, Y_inv, F_tmp); @@ -559,10 +590,14 @@ void FixNonaffineDisplacement::calculate_D2Min() for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; - if (norm[i] != 0) - D2min[i] /= norm[i]; - else - D2min[i] = 0.0; + if (norm[i] < z_min || singular[i] == 1) { + array_atom[i][0] = 0.0; + array_atom[i][1] = 0.0; + array_atom[i][2] = 0.0; + continue; + } + + D2min[i] /= norm[i]; for (j = 0; j < 3; j++) for (k = 0; k < 3; k++) @@ -743,10 +778,12 @@ void FixNonaffineDisplacement::grow_arrays(int nmax_new) memory->destroy(F); memory->destroy(D2min); memory->destroy(norm); + memory->destroy(singular); memory->create(X, nmax, 3, 3, "fix_nonaffine_displacement:X"); memory->create(Y, nmax, 3, 3, "fix_nonaffine_displacement:Y"); memory->create(F, nmax, 3, 3, "fix_nonaffine_displacement:F"); memory->create(D2min, nmax, "fix_nonaffine_displacement:D2min"); memory->create(norm, nmax, "fix_nonaffine_displacement:norm"); + memory->create(singular, nmax, "fix_nonaffine_displacement:singular"); } } diff --git a/src/EXTRA-FIX/fix_nonaffine_displacement.h b/src/EXTRA-FIX/fix_nonaffine_displacement.h index c7177bd3d9..b0e9c464ca 100644 --- a/src/EXTRA-FIX/fix_nonaffine_displacement.h +++ b/src/EXTRA-FIX/fix_nonaffine_displacement.h @@ -48,12 +48,12 @@ class FixNonaffineDisplacement : public Fix { int nmax, comm_flag; int nad_style, cut_style; int reference_style, offset_timestep, reference_timestep, update_timestep; - int reference_saved; + int reference_saved, z_min; double cutoff_custom, cutsq_custom, mycutneigh; double xprd0, yprd0, zprd0, xprd0_half, yprd0_half, zprd0_half, xy0, xz0, yz0; double *D2min, ***X, ***Y, ***F; - int *norm; + int *norm, *singular; class NeighList *list; // half neighbor list From 6de19ec109e625119c6914ab82b14498dd79d76f Mon Sep 17 00:00:00 2001 From: jtclemm Date: Tue, 23 Apr 2024 21:02:02 -0600 Subject: [PATCH 57/91] Tweaking doc text --- doc/src/fix_nonaffine_displacement.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/fix_nonaffine_displacement.rst b/doc/src/fix_nonaffine_displacement.rst index becc47eec8..fd9830cc48 100644 --- a/doc/src/fix_nonaffine_displacement.rst +++ b/doc/src/fix_nonaffine_displacement.rst @@ -84,10 +84,10 @@ are a multiple of *nevery* (including timestep zero). Data accessed before this occurs will simply be zeroed. For particles with low coordination numbers, calculations of :math:`D^2_\mathrm{min}` -may have poor accuracy. An optional minimum coordination number can be defined using -the *z/min* keyword. If any particles have fewer than the specified number of particles +may not be accurate. An optional minimum coordination number can be defined using +the *z/min* keyword. If any particle has fewer than the specified number of particles in the cutoff distance or in contact, the above calculations will be skipped and the -peratom array entries will be zero. +corresponding peratom array entries will be zero. The *integrated* style simply integrates the velocity of particles every timestep to calculate a displacement. This style only works if From b2aed19c88f6a06ace76138d6b57fd3fe08c8635 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Tue, 23 Apr 2024 23:32:27 -0400 Subject: [PATCH 58/91] Update doc/src/compute_count_type.rst Co-authored-by: Axel Kohlmeyer --- doc/src/compute_count_type.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/compute_count_type.rst b/doc/src/compute_count_type.rst index cd72050259..5fbe6175a3 100644 --- a/doc/src/compute_count_type.rst +++ b/doc/src/compute_count_type.rst @@ -80,7 +80,7 @@ atoms like so: compute typevec all count/type atom # number of atoms of each type variable normtypes vector c_typevec/atoms # divide by total number of atoms variable ntypes equal extract_setting(ntypes) # number of atom types - thermo_style custom step v_normtypes[*$(v_ntypes)] # vector variable needs upper limit + thermo_style custom step v_normtypes[*${ntypes}] # vector variable needs upper limit Similarly, bond counts can be normalized by the total number of bonds. The same goes for angles, dihedrals, and impropers (see below). From 8073cec0e4085cae50df70deda841782ad9cad32 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 01:55:13 -0400 Subject: [PATCH 59/91] make pip install packages in user area --- .github/workflows/unittest-macos.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index f9c2a838d6..cc6cac4923 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -43,8 +43,8 @@ jobs: working-directory: build run: | ccache -z - python3 -m pip install numpy - python3 -m pip install pyyaml + python3 -m pip install --user numpy + python3 -m pip install --user pyyaml cmake -C ../cmake/presets/clang.cmake \ -C ../cmake/presets/most.cmake \ -D DOWNLOAD_POTENTIALS=off \ From b993dadcdcc35945df357ecdc7d23afc060d25cc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 01:58:54 -0400 Subject: [PATCH 60/91] try virtual environment instead of user installation --- .github/workflows/unittest-macos.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index cc6cac4923..0a9d31bd84 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -43,8 +43,10 @@ jobs: working-directory: build run: | ccache -z - python3 -m pip install --user numpy - python3 -m pip install --user pyyaml + python3 -m venv macosenv + source macosenv/bin/activate + python3 -m pip install numpy + python3 -m pip install pyyaml cmake -C ../cmake/presets/clang.cmake \ -C ../cmake/presets/most.cmake \ -D DOWNLOAD_POTENTIALS=off \ From fc20b8c54694adc1d3612eba794f622fa108f64a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 01:55:13 -0400 Subject: [PATCH 61/91] make pip install packages in virtual environment --- .github/workflows/unittest-macos.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index f9c2a838d6..0a9d31bd84 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -43,6 +43,8 @@ jobs: working-directory: build run: | ccache -z + python3 -m venv macosenv + source macosenv/bin/activate python3 -m pip install numpy python3 -m pip install pyyaml cmake -C ../cmake/presets/clang.cmake \ From 83643ded91e7976976146e9bd957b1c64c54115e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 02:25:52 -0400 Subject: [PATCH 62/91] flag development --- src/version.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/version.h b/src/version.h index 37c44b49f2..64d5210270 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1,2 @@ #define LAMMPS_VERSION "17 Apr 2024" +#define LAMMPS_UPDATE "Development" From 4437891c30ec604029dd54a6117c34b9562c3743 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 Apr 2024 21:28:56 -0400 Subject: [PATCH 63/91] catch command errors --- unittest/cplusplus/test_advanced_utils.cpp | 35 +++++++++++++++------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/unittest/cplusplus/test_advanced_utils.cpp b/unittest/cplusplus/test_advanced_utils.cpp index 0453ef0143..43ac5dc9cf 100644 --- a/unittest/cplusplus/test_advanced_utils.cpp +++ b/unittest/cplusplus/test_advanced_utils.cpp @@ -110,16 +110,31 @@ TEST_F(Advanced_utils, expand_args) { atomic_system(); BEGIN_CAPTURE_OUTPUT(); - command("compute temp all temp"); - command("variable temp vector c_temp"); - command("variable step equal step"); - command("variable pe equal pe"); - command("variable pe equal pe"); - command("variable epair equal epair"); - command("compute gofr all rdf 20 1 1 1 2"); - command("fix 1 all ave/time 1 1 1 v_step v_pe v_epair"); - command("fix 2 all nve"); - command("run 1 post no"); + try { + command("compute temp all temp"); + command("variable temp vector c_temp"); + command("variable step equal step"); + command("variable pe equal pe"); + command("variable pe equal pe"); + command("variable epair equal epair"); + command("compute gofr all rdf 20 1 1 1 2"); + command("fix 1 all ave/time 1 1 1 v_step v_pe v_epair"); + command("fix 2 all nve"); + command("run 1 post no"); + } catch (LAMMPSAbortException &ae) { + fprintf(stderr, "LAMMPS Error: %s\n", ae.what()); + exit(2); + } catch (LAMMPSException &e) { + fprintf(stderr, "LAMMPS Error: %s\n", e.what()); + exit(3); + } catch (fmt::format_error &fe) { + fprintf(stderr, "fmt::format_error: %s\n", fe.what()); + exit(4); + } catch (std::exception &e) { + fprintf(stderr, "General exception: %s\n", e.what()); + exit(5); + } + auto output = END_CAPTURE_OUTPUT(); char **args, **earg; From a85b0603a24cca7446d8b107e177a2b6aa211d7b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 02:45:36 -0400 Subject: [PATCH 64/91] downgrade macOS to version 13 --- .github/workflows/unittest-macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index 0a9d31bd84..b0bc4b2727 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -15,7 +15,7 @@ jobs: build: name: MacOS Unit Test if: ${{ github.repository == 'lammps/lammps' }} - runs-on: macos-latest + runs-on: macos-13 env: CCACHE_DIR: ${{ github.workspace }}/.ccache From cfc811a1b39a1512712a7efc02f2f180afd771cf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 02:45:36 -0400 Subject: [PATCH 65/91] downgrade macOS to version 13 --- .github/workflows/unittest-macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index 0a9d31bd84..b0bc4b2727 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -15,7 +15,7 @@ jobs: build: name: MacOS Unit Test if: ${{ github.repository == 'lammps/lammps' }} - runs-on: macos-latest + runs-on: macos-13 env: CCACHE_DIR: ${{ github.workspace }}/.ccache From 0f3a8d6af80d3388fa12642ce51be1e803c4d071 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Thu, 25 Apr 2024 14:10:21 -0600 Subject: [PATCH 66/91] Adding warning for singular matrix --- src/EXTRA-FIX/fix_nonaffine_displacement.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/EXTRA-FIX/fix_nonaffine_displacement.cpp b/src/EXTRA-FIX/fix_nonaffine_displacement.cpp index 846f434dce..b651d5dc5e 100644 --- a/src/EXTRA-FIX/fix_nonaffine_displacement.cpp +++ b/src/EXTRA-FIX/fix_nonaffine_displacement.cpp @@ -591,6 +591,8 @@ void FixNonaffineDisplacement::calculate_D2Min() if (!(mask[i] & groupbit)) continue; if (norm[i] < z_min || singular[i] == 1) { + if (norm[i] >= z_min) + error->warning(FLERR, "Singular matrix detected for atom {}, defaulting output to zero", atom->tag[i]); array_atom[i][0] = 0.0; array_atom[i][1] = 0.0; array_atom[i][2] = 0.0; From 99ff5b2779de170af41413970c6f84de5b89ea12 Mon Sep 17 00:00:00 2001 From: Germain Clavier Date: Fri, 26 Apr 2024 14:46:30 +0200 Subject: [PATCH 67/91] Changed alpha_init initialization to avoid infinite loop with 0 starting value. --- src/min_linesearch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/min_linesearch.cpp b/src/min_linesearch.cpp index d33b7579b9..5dc3d6568b 100644 --- a/src/min_linesearch.cpp +++ b/src/min_linesearch.cpp @@ -686,7 +686,7 @@ int MinLineSearch::linemin_forcezero(double eoriginal, double &alpha) // choosing the initial alpha that we'll use // rough estimate that'll decrease energy to 1/10 - alpha_init = 0.1*fabs(eoriginal)/fdothall; + alpha_init = MAX(EPS_QUAD, 0.1*fabs(eoriginal)/fdothall); // initialize aplha to 0.0 From 1f9c33e65dd8cff1b940674d4f5f04f1206f8cbf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 01:55:13 -0400 Subject: [PATCH 68/91] make pip install packages in virtual environment --- .github/workflows/unittest-macos.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index f9c2a838d6..0a9d31bd84 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -43,6 +43,8 @@ jobs: working-directory: build run: | ccache -z + python3 -m venv macosenv + source macosenv/bin/activate python3 -m pip install numpy python3 -m pip install pyyaml cmake -C ../cmake/presets/clang.cmake \ From 69e9483bf7ef651b200227b3f0179c378d50278f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 02:45:36 -0400 Subject: [PATCH 69/91] downgrade macOS to version 13 --- .github/workflows/unittest-macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index 0a9d31bd84..b0bc4b2727 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -15,7 +15,7 @@ jobs: build: name: MacOS Unit Test if: ${{ github.repository == 'lammps/lammps' }} - runs-on: macos-latest + runs-on: macos-13 env: CCACHE_DIR: ${{ github.workspace }}/.ccache From 74b49b48cb161f6dc283c89c6c44fb7bb6d81501 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 01:55:13 -0400 Subject: [PATCH 70/91] make pip install packages in virtual environment --- .github/workflows/unittest-macos.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index f9c2a838d6..0a9d31bd84 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -43,6 +43,8 @@ jobs: working-directory: build run: | ccache -z + python3 -m venv macosenv + source macosenv/bin/activate python3 -m pip install numpy python3 -m pip install pyyaml cmake -C ../cmake/presets/clang.cmake \ From a394fcb5f39ca35b50ae422f6cbc8798250c246b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 Apr 2024 02:45:36 -0400 Subject: [PATCH 71/91] downgrade macOS to version 13 --- .github/workflows/unittest-macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unittest-macos.yml b/.github/workflows/unittest-macos.yml index 0a9d31bd84..b0bc4b2727 100644 --- a/.github/workflows/unittest-macos.yml +++ b/.github/workflows/unittest-macos.yml @@ -15,7 +15,7 @@ jobs: build: name: MacOS Unit Test if: ${{ github.repository == 'lammps/lammps' }} - runs-on: macos-latest + runs-on: macos-13 env: CCACHE_DIR: ${{ github.workspace }}/.ccache From e34aa0d02b2662b48965a5983c1eb9847b8f9019 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 28 Apr 2024 08:43:24 -0400 Subject: [PATCH 72/91] meam/c is no longer an alias for meam --- src/KOKKOS/pair_meam_kokkos.h | 3 --- src/MEAM/pair_meam.h | 1 - src/pair_deprecated.cpp | 3 +++ src/pair_deprecated.h | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/KOKKOS/pair_meam_kokkos.h b/src/KOKKOS/pair_meam_kokkos.h index 66b5700a72..82f48aa997 100644 --- a/src/KOKKOS/pair_meam_kokkos.h +++ b/src/KOKKOS/pair_meam_kokkos.h @@ -13,9 +13,6 @@ #ifdef PAIR_CLASS // clang-format off -PairStyle(meam/c/kk,PairMEAMKokkos); -PairStyle(meam/c/kk/device,PairMEAMKokkos); -PairStyle(meam/c/kk/host,PairMEAMKokkos); PairStyle(meam/kk,PairMEAMKokkos); PairStyle(meam/kk/device,PairMEAMKokkos); PairStyle(meam/kk/host,PairMEAMKokkos); diff --git a/src/MEAM/pair_meam.h b/src/MEAM/pair_meam.h index a89714bfa9..3d50ca9368 100644 --- a/src/MEAM/pair_meam.h +++ b/src/MEAM/pair_meam.h @@ -14,7 +14,6 @@ #ifdef PAIR_CLASS // clang-format off PairStyle(meam,PairMEAM); -PairStyle(meam/c,PairMEAM); // clang-format on #else diff --git a/src/pair_deprecated.cpp b/src/pair_deprecated.cpp index 298fc26fd0..2c86b252ea 100644 --- a/src/pair_deprecated.cpp +++ b/src/pair_deprecated.cpp @@ -56,6 +56,9 @@ void PairDeprecated::settings(int, char **) utils::logmesg(lmp, "\nPair style 'mesont/tpm' has been removed from LAMMPS. " "Please use pair style 'mesocnt' instead\n\n"); + } else if (utils::strmatch(my_style, "^meam/c")) { + if (lmp->comm->me == 0) + utils::logmesg(lmp, "\nPair style 'meam/c' has been renamed to 'meam'\n\n"); } error->all(FLERR, "This pair style is no longer available"); } diff --git a/src/pair_deprecated.h b/src/pair_deprecated.h index 1a705c9051..8db8b3541d 100644 --- a/src/pair_deprecated.h +++ b/src/pair_deprecated.h @@ -14,6 +14,7 @@ #ifdef PAIR_CLASS // clang-format off PairStyle(DEPRECATED,PairDeprecated); +PairStyle(meam/c,PairDeprecated); PairStyle(reax,PairDeprecated); PairStyle(reax/c,PairDeprecated); PairStyle(mesont/tpm,PairDeprecated); From b1e1b05e0bf6f72280e77861efef0aa7c0dd7000 Mon Sep 17 00:00:00 2001 From: Daniel Utt Date: Mon, 29 Apr 2024 13:51:26 +0200 Subject: [PATCH 73/91] Match dump_modify syntax for atom and custom dump styles --- src/dump_atom.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dump_atom.cpp b/src/dump_atom.cpp index 293ade6229..15f083ede2 100644 --- a/src/dump_atom.cpp +++ b/src/dump_atom.cpp @@ -166,11 +166,11 @@ int DumpAtom::modify_param(int narg, char **arg) } if (strcmp(arg[0],"triclinic/general") == 0) { - triclinic_general = 1; + if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); + triclinic_general = utils::logical(FLERR,arg[1],false,lmp); if (triclinic_general && !domain->triclinic_general) - error->all(FLERR,"Dump_modify triclinic/general cannot be used " - "if simulation box is not general triclinic"); - return 1; + error->all(FLERR,"Dump_modify triclinic/general invalid b/c simulation box is not"); + return 2; } return 0; From e9d22ec7f918a5bd98d773594c7150d0f63d57e6 Mon Sep 17 00:00:00 2001 From: Daniel Utt Date: Tue, 30 Apr 2024 09:19:03 +0200 Subject: [PATCH 74/91] Clarify error message --- src/dump_custom.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index fb07efd561..431dd62fb7 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -1766,7 +1766,8 @@ int DumpCustom::modify_param(int narg, char **arg) if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); triclinic_general = utils::logical(FLERR,arg[1],false,lmp); if (triclinic_general && !domain->triclinic_general) - error->all(FLERR,"Dump_modify triclinic/general invalid b/c simulation box is not"); + error->all(FLERR,"Dump_modify triclinic/general cannot be used " + "if simulation box is not general triclinic"); return 2; } From 149ffbb2b6f5934a1f4ccfafd2c989b084b3db46 Mon Sep 17 00:00:00 2001 From: Daniel Utt Date: Tue, 30 Apr 2024 09:20:19 +0200 Subject: [PATCH 75/91] Clarify error message --- src/dump_atom.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dump_atom.cpp b/src/dump_atom.cpp index 15f083ede2..dfacf8f2da 100644 --- a/src/dump_atom.cpp +++ b/src/dump_atom.cpp @@ -169,7 +169,8 @@ int DumpAtom::modify_param(int narg, char **arg) if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); triclinic_general = utils::logical(FLERR,arg[1],false,lmp); if (triclinic_general && !domain->triclinic_general) - error->all(FLERR,"Dump_modify triclinic/general invalid b/c simulation box is not"); + error->all(FLERR,"Dump_modify triclinic/general cannot be used " + "if simulation box is not general triclinic"); return 2; } From 39f039719dd0e3aa7ad24e463051c7333158c623 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 2 May 2024 11:53:41 -0400 Subject: [PATCH 76/91] QEq requires charges --- src/QEQ/fix_qeq.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 411bdfb60b..47ad3d260f 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -74,6 +74,9 @@ FixQEq::FixQEq(LAMMPS *lmp, int narg, char **arg) : if ((nevery <= 0) || (cutoff <= 0.0) || (tolerance <= 0.0) || (maxiter <= 0)) error->all(FLERR,"Illegal fix qeq command"); + // must have charges + if (!atom->q_flag) error->all(FLERR, "Fix {} requires atom attribute q", style); + alpha = 0.20; swa = 0.0; swb = cutoff; From daedaaccdc7289e306f847ea171191d71ba04540 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 5 May 2024 12:50:30 -0400 Subject: [PATCH 77/91] add missing false positive --- 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 20e0bd1f12..5dfbe48ffa 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -4162,6 +4162,7 @@ zenodo Zepeda zflag Zhang +Zhao Zhen zhi Zhigilei From 3d4bb44911d1440bda0472b32dbc4f4b75427f75 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Mon, 6 May 2024 16:39:29 -0600 Subject: [PATCH 78/91] Minor rearrangements to CoR, fix bug in granular single --- doc/src/pair_granular.rst | 21 +++-- .../data.particles} | 0 .../in.coeff_restitution} | 14 ++-- .../coeff_restitution/log.11Nov23.cor.g++.1 | 79 +++++++++++++++++++ src/GRANULAR/gran_sub_mod_damping.cpp | 45 ++++------- src/GRANULAR/gran_sub_mod_damping.h | 16 +--- src/GRANULAR/gran_sub_mod_normal.h | 3 +- src/GRANULAR/granular_model.cpp | 4 - src/GRANULAR/pair_granular.cpp | 2 +- 9 files changed, 120 insertions(+), 64 deletions(-) rename examples/granular/{en_example/particles.dat => coeff_restitution/data.particles} (100%) rename examples/granular/{en_example/start.lammps => coeff_restitution/in.coeff_restitution} (56%) create mode 100644 examples/granular/coeff_restitution/log.11Nov23.cor.g++.1 diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 9eb34c9de8..597869a05b 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -187,8 +187,7 @@ for the damping model currently supported are: 2. *mass_velocity* 3. *viscoelastic* 4. *tsuji* -5. *hooke/en* -6. *hertz/en* +5. *coeff_restitution* If the *damping* keyword is not specified, the *viscoelastic* model is used by default. @@ -250,20 +249,28 @@ The dimensionless coefficient of restitution :math:`e` specified as part of the normal contact model parameters should be between 0 and 1, but no error check is performed on this. -*hooke/en* and *hertz/en* models are useful for cases where a specific normal coefficient of restitution :math:`e` is required. In these models, the normal coefficient of restitution :math:`e` is specified as an input. Following the approach of :ref:`(Brilliantov et al) `, *hooke/en* calculates the damping coefficient for the *hooke* model as: +The *coeff_restitution* model is useful when a specific normal coefficient of +restitution :math:`e` is required. In these models, the normal coefficient of +restitution :math:`e` is specified as an input. Following the approach of +:ref:`(Brilliantov et al) `, when using the *hooke* normal model, +*coeff_restitution* calculates the damping coefficient as: .. math:: - - \eta_n = \sqrt{\frac{4m_{eff}k_n}{1+\left( \frac{\pi}{\log(e)}\right)^2}}, + \eta_n = \sqrt{\frac{4m_{eff}k_n}{1+\left( \frac{\pi}{\log(e)}\right)^2}} , -*hertz/en* calculates the damping coefficient for the *hertz* and *hertz/material* models using: +For any other normal model, e.g. the *hertz* and *hertz/material* models, the damping +coefficient is: .. math:: \eta_n = -2\sqrt{\frac{5}{6}}\frac{\log(e)}{\sqrt{\pi^2+(\log(e))^2}}(R_{eff} \delta_{ij})^{\frac{1}{4}}\sqrt{\frac{3}{2}k_n m_{eff}} , -where :math:`k_n = \frac{4}{3} E_{eff}` for the *hertz/material* model. Since these models calculate the damping coefficients by accounting for the effective mass, effective radius and pairwise overlaps (for *hertz/en*), they accurately reproduce the specified coefficient of restitution for both monodisperse and polydisperse particle pairs. +where :math:`k_n = \frac{4}{3} E_{eff}` for the *hertz/material* model. Since +*coeff_restitution* accounts for the effective mass, effective radius, and +pairwise overlaps (except when used with the *hooke* normal model) when calculating +the damping coefficient, it accurately reproduces the specified coefficient of +restitution for both monodisperse and polydisperse particle pairs. The total normal force is computed as the sum of the elastic and damping components: diff --git a/examples/granular/en_example/particles.dat b/examples/granular/coeff_restitution/data.particles similarity index 100% rename from examples/granular/en_example/particles.dat rename to examples/granular/coeff_restitution/data.particles diff --git a/examples/granular/en_example/start.lammps b/examples/granular/coeff_restitution/in.coeff_restitution similarity index 56% rename from examples/granular/en_example/start.lammps rename to examples/granular/coeff_restitution/in.coeff_restitution index 7a2a56a0e9..e441ed67a7 100644 --- a/examples/granular/en_example/start.lammps +++ b/examples/granular/coeff_restitution/in.coeff_restitution @@ -1,26 +1,24 @@ -units si +units si atom_style sphere boundary p p f region box block 0 80e-3 0 40e-3 0 80e-3 open 3 open 4 create_box 2 box -read_data particles.dat add append +read_data data.particles add append group mb type 1 pair_style granular -pair_coeff * * hertz/material 1e6 0.8 0.4 tangential mindlin NULL 0.0 0.5 damping hertz/en -# pair_coeff * * hertz/material 1e6 0.8 0.4 tangential mindlin NULL 0.0 0.5 damping hooke/en #Should throw and error -# pair_coeff * * hertz 1e6 0.3 tangential mindlin 1e4 1.0 0.5 damping hertz/en -# pair_coeff * * hooke 1e6 0.5 tangential mindlin 1 1.0 0.0 damping hooke/en +pair_coeff * * hertz/material 1e6 0.8 0.4 tangential mindlin NULL 0.0 0.5 damping coeff_restitution +# pair_coeff * * hooke 1e6 0.5 tangential mindlin 1 1.0 0.0 damping coeff_restitution comm_modify vel yes timestep 1e-9 fix 1 all nve/sphere compute s all stress/atom NULL pair -dump 1 all custom 2000000 op.dump id x y z vx vy vz -dump_modify 1 pad 8 +#dump 1 all custom 2000000 op.dump id x y z vx vy vz +#dump_modify 1 pad 8 thermo_style custom step ke run_style verlet run 10000000 diff --git a/examples/granular/coeff_restitution/log.11Nov23.cor.g++.1 b/examples/granular/coeff_restitution/log.11Nov23.cor.g++.1 new file mode 100644 index 0000000000..b4f53c84da --- /dev/null +++ b/examples/granular/coeff_restitution/log.11Nov23.cor.g++.1 @@ -0,0 +1,79 @@ +LAMMPS (21 Nov 2023 - Development - ) +units si +atom_style sphere + +boundary p p f +region box block 0 80e-3 0 40e-3 0 80e-3 open 3 open 4 +create_box 2 box +Created orthogonal box = (0 0 0) to (0.08 0.04 0.08) + 1 by 1 by 1 MPI processor grid + +read_data data.particles add append +Reading data file ... + orthogonal box = (0 0 0) to (0.08 0.04 0.08) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 2 atoms + reading velocities ... + 2 velocities + read_data CPU = 0.002 seconds +group mb type 1 +2 atoms in group mb + +pair_style granular +pair_coeff * * hertz/material 1e6 0.8 0.4 tangential mindlin NULL 0.0 0.5 damping coeff_restitution +# pair_coeff * * hooke 1e6 0.5 tangential mindlin 1 1.0 0.0 damping coeff_restitution +comm_modify vel yes + +timestep 1e-9 +fix 1 all nve/sphere +compute s all stress/atom NULL pair + +dump 1 all custom 2000000 op.dump id x y z vx vy vz +dump_modify 1 pad 8 +thermo_style custom step ke +run_style verlet +run 10000000 +Generated 0 of 1 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 = 0.005 + ghost atom cutoff = 0.005 + binsize = 0.0025, bins = 32 16 32 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair granular, perpetual + attributes: half, newton on, size, history + pair build: half/size/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 10.1 | 10.1 | 10.1 Mbytes + Step KinEng + 0 8.3775804e-05 + 10000000 5.3616513e-05 +Loop time of 5.06865 on 1 procs for 10000000 steps with 2 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.55389 | 0.55389 | 0.55389 | 0.0 | 10.93 +Neigh | 0.00022182 | 0.00022182 | 0.00022182 | 0.0 | 0.00 +Comm | 1.9988 | 1.9988 | 1.9988 | 0.0 | 39.43 +Output | 0.00023837 | 0.00023837 | 0.00023837 | 0.0 | 0.00 +Modify | 1.26 | 1.26 | 1.26 | 0.0 | 24.86 +Other | | 1.255 | | | 24.77 + +Nlocal: 2 ave 2 max 2 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 +Ave neighs/atom = 0 +Neighbor list builds = 14 +Dangerous builds = 0 +Total wall time: 0:00:05 diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 12102575c3..be87c70cd4 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -16,19 +16,20 @@ #include "gran_sub_mod_normal.h" #include "granular_model.h" #include "math_special.h" +#include "math_const.h" #include using namespace LAMMPS_NS; using namespace Granular_NS; +using namespace MathConst; using MathSpecial::cube; using MathSpecial::powint; using MathSpecial::square; -static constexpr double PISQ = 9.86960440108935799230; -static constexpr double TWOROOTFIVEBYSIX = 1.82574185835055380345; -static constexpr double ROOTTHREEBYTWO = 1.22474487139158894067; +static constexpr double TWOROOTFIVEBYSIX = 1.82574185835055380345; // 2/sqrt(5/6) +static constexpr double ROOTTHREEBYTWO = 1.22474487139158894067; // sqrt(3/2) /* ---------------------------------------------------------------------- Default damping model @@ -141,44 +142,28 @@ double GranSubModDampingTsuji::calculate_forces() } /* ---------------------------------------------------------------------- - hookeen damping + Coefficient of restitution damping ------------------------------------------------------------------------- */ -GranSubModDampingHookeEn::GranSubModDampingHookeEn(GranularModel *gm, LAMMPS *lmp) : +GranSubModDampingCoeffRestitution::GranSubModDampingCoeffRestitution(GranularModel *gm, LAMMPS *lmp) : GranSubModDamping(gm, lmp) { } -void GranSubModDampingHookeEn::init() +void GranSubModDampingCoeffRestitution::init() { + // Calculate prefactor, assume Hertzian as default double cor = gm->normal_model->get_damp(); double logcor = log(cor); - damp = -2*logcor/sqrt(PISQ + logcor*logcor); + if (gm->normal_model->name == "hooke") { + damp = -2 * logcor / sqrt(MY_PI * MY_PI + logcor * logcor); + } else { + damp = -ROOTTHREEBYTWO * TWOROOTFIVEBYSIX * logcor; + damp /= sqrt(MY_PI * MY_PI + logcor * logcor); + } } -double GranSubModDampingHookeEn::calculate_forces() -{ - damp_prefactor = damp * sqrt(gm->meff * gm->Fnormal / gm->delta); - return -damp_prefactor * gm->vnnr; -} - -/* ---------------------------------------------------------------------- - hertzen damping -------------------------------------------------------------------------- */ - -GranSubModDampingHertzEn::GranSubModDampingHertzEn(GranularModel *gm, LAMMPS *lmp) : - GranSubModDamping(gm, lmp) -{ -} - -void GranSubModDampingHertzEn::init() -{ - double cor = gm->normal_model->get_damp(); - double logcor = log(cor); - damp = -ROOTTHREEBYTWO*TWOROOTFIVEBYSIX*logcor/sqrt(PISQ + logcor*logcor); -} - -double GranSubModDampingHertzEn::calculate_forces() +double GranSubModDampingCoeffRestitution::calculate_forces() { damp_prefactor = damp * sqrt(gm->meff * gm->Fnormal / gm->delta); return -damp_prefactor * gm->vnnr; diff --git a/src/GRANULAR/gran_sub_mod_damping.h b/src/GRANULAR/gran_sub_mod_damping.h index 9f37e14450..c931e385cc 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -18,8 +18,7 @@ GranSubModStyle(velocity,GranSubModDampingVelocity,DAMPING); GranSubModStyle(mass_velocity,GranSubModDampingMassVelocity,DAMPING); GranSubModStyle(viscoelastic,GranSubModDampingViscoelastic,DAMPING); GranSubModStyle(tsuji,GranSubModDampingTsuji,DAMPING); -GranSubModStyle(hooke/en,GranSubModDampingHookeEn,DAMPING); -GranSubModStyle(hertz/en,GranSubModDampingHertzEn,DAMPING); +GranSubModStyle(coeff_restitution,GranSubModDampingCoeffRestitution,DAMPING); // clang-format on #else @@ -88,18 +87,9 @@ namespace Granular_NS { /* ---------------------------------------------------------------------- */ - class GranSubModDampingHookeEn : public GranSubModDamping { + class GranSubModDampingCoeffRestitution : public GranSubModDamping { public: - GranSubModDampingHookeEn(class GranularModel *, class LAMMPS *); - void init() override; - double calculate_forces() override; - }; - - /* ---------------------------------------------------------------------- */ - - class GranSubModDampingHertzEn : public GranSubModDamping { - public: - GranSubModDampingHertzEn(class GranularModel *, class LAMMPS *); + GranSubModDampingCoeffRestitution(class GranularModel *, class LAMMPS *); void init() override; double calculate_forces() override; }; diff --git a/src/GRANULAR/gran_sub_mod_normal.h b/src/GRANULAR/gran_sub_mod_normal.h index 6f2f3aabbe..c1ed36b6e1 100644 --- a/src/GRANULAR/gran_sub_mod_normal.h +++ b/src/GRANULAR/gran_sub_mod_normal.h @@ -38,7 +38,7 @@ namespace Granular_NS { virtual double calculate_contact_radius(); virtual double calculate_forces() = 0; - double get_cohesive_flag() const { return cohesive_flag; } + int get_cohesive_flag() const { return cohesive_flag; } double get_damp() const { return damp; } double get_emod() const { return Emod; } double get_fncrit() const { return Fncrit; } @@ -49,6 +49,7 @@ namespace Granular_NS { protected: double damp; // argument historically needed by damping + // typically (but not always) equals eta_n0 double Emod, poiss; double Fncrit; int material_properties, cohesive_flag; diff --git a/src/GRANULAR/granular_model.cpp b/src/GRANULAR/granular_model.cpp index ed3c00866e..c1ad692fb3 100644 --- a/src/GRANULAR/granular_model.cpp +++ b/src/GRANULAR/granular_model.cpp @@ -238,10 +238,6 @@ void GranularModel::init() 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"); - //Check if correct damping model is being used with the normal model - if(normal_model->name =="hooke" && damping_model->name == "hertz/en") error->all(FLERR, "hooke should not be used with hertz/en damping model, please use hooke/en"); - if((normal_model->name =="hertz" || normal_model->name =="hertz/material") && damping_model->name == "hooke/en") error->all(FLERR, "hertz/material or hertz should not be used with hooke/en damping model, please use hertz/en"); - // Twisting, rolling, and heat are optional twisting_defined = rolling_defined = heat_defined = 1; if (twisting_model->name == "none") twisting_defined = 0; diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 119feb1c38..480e908487 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -770,7 +770,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, // apply forces & torques // Calculate normal component, normalized by r - fforce = model->Fnormal * model->rinv; + fforce = model->Fntot * model->rinv; // set single_extra quantities svector[0] = model->fs[0]; From a4449fb6ff038574ddb2cb8d89a411fbebee6d65 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 6 May 2024 16:44:45 -0600 Subject: [PATCH 79/91] modified doc page, added examples --- doc/src/replicate.rst | 170 +++-- examples/README | 1 + examples/replicate/README | 23 + examples/replicate/data.bond.x | 22 + examples/replicate/data.bond.x.noloop | 21 + examples/replicate/data.bond.x.y | 43 ++ examples/replicate/data.bond.xy | 22 + examples/replicate/in.replicate.bond.x | 34 + examples/replicate/in.replicate.bond.x.noloop | 34 + examples/replicate/in.replicate.bond.x.y | 34 + examples/replicate/in.replicate.bond.xy | 34 + .../{in.replicate => in.replicate.cnt} | 2 +- .../log.6May24.replicate.bond.x.g++.1 | 125 ++++ .../log.6May24.replicate.bond.x.g++.4 | 126 ++++ .../log.6May24.replicate.bond.x.noloop.g++.1 | 121 ++++ .../log.6May24.replicate.bond.x.noloop.g++.4 | 122 ++++ .../log.6May24.replicate.bond.x.y.g++.1 | 125 ++++ .../log.6May24.replicate.bond.x.y.g++.4 | 126 ++++ .../log.6May24.replicate.bond.xy.g++.1 | 125 ++++ .../log.6May24.replicate.bond.xy.g++.4 | 126 ++++ ...e.g++.1 => log.6May24.replicate.cnt.g++.1} | 48 +- ...e.g++.4 => log.6May24.replicate.cnt.g++.4} | 49 +- src/replicate.cpp | 625 ++++++++++++++++-- src/replicate.h | 20 +- 24 files changed, 2015 insertions(+), 163 deletions(-) create mode 100644 examples/replicate/README create mode 100644 examples/replicate/data.bond.x create mode 100644 examples/replicate/data.bond.x.noloop create mode 100644 examples/replicate/data.bond.x.y create mode 100644 examples/replicate/data.bond.xy create mode 100644 examples/replicate/in.replicate.bond.x create mode 100644 examples/replicate/in.replicate.bond.x.noloop create mode 100644 examples/replicate/in.replicate.bond.x.y create mode 100644 examples/replicate/in.replicate.bond.xy rename examples/replicate/{in.replicate => in.replicate.cnt} (94%) create mode 100644 examples/replicate/log.6May24.replicate.bond.x.g++.1 create mode 100644 examples/replicate/log.6May24.replicate.bond.x.g++.4 create mode 100644 examples/replicate/log.6May24.replicate.bond.x.noloop.g++.1 create mode 100644 examples/replicate/log.6May24.replicate.bond.x.noloop.g++.4 create mode 100644 examples/replicate/log.6May24.replicate.bond.x.y.g++.1 create mode 100644 examples/replicate/log.6May24.replicate.bond.x.y.g++.4 create mode 100644 examples/replicate/log.6May24.replicate.bond.xy.g++.1 create mode 100644 examples/replicate/log.6May24.replicate.bond.xy.g++.4 rename examples/replicate/{log.7Jan22.replicate.g++.1 => log.6May24.replicate.cnt.g++.1} (67%) rename examples/replicate/{log.7Jan22.replicate.g++.4 => log.6May24.replicate.cnt.g++.4} (65%) diff --git a/doc/src/replicate.rst b/doc/src/replicate.rst index cea38e1af0..64d87e525a 100644 --- a/doc/src/replicate.rst +++ b/doc/src/replicate.rst @@ -8,113 +8,149 @@ Syntax .. code-block:: LAMMPS - replicate nx ny nz *keyword* + replicate nx ny nz *keyword* ... nx,ny,nz = replication factors in each dimension -* optional *keyword* = *bbox* or *bondlist* +* zero or more keywords may be appended +* keyword = *bbox* or *bond/periodic* .. parsed-literal:: *bbox* = only check atoms in replicas that overlap with a processor's subdomain - *bondlist* = use a generalized algorithm that correctly replicates periodic loops + *bond/periodic* = use a different algorithm that correctly replicates periodic bond loops Examples """""""" -For an example of replicating periodically looped carbon nanotubes, see examples/replicate. +For examples of replicating simple linear polymer chains (periodic or +non-periodic) or periodic carbon nanotubes, see examples/replicate. .. code-block:: LAMMPS replicate 2 3 2 + replicate 2 3 2 bbox + replicate 2 3 2 bond/periodic Description """"""""""" -Replicate the current simulation one or more times in each dimension. -For example, replication factors of 2,2,2 will create a simulation -with 8x as many atoms by doubling the simulation domain in each -dimension. A replication factor of 1 in a dimension leaves the -simulation domain unchanged. When the new simulation box is created -it is also partitioned into a regular 3d grid of rectangular bricks, -one per processor, based on the number of processors being used and -the settings of the :doc:`processors ` command. The -partitioning can later be changed by the :doc:`balance ` or -:doc:`fix balance ` commands. +Replicate the current system one or more times in each dimension. For +example, replication factors of 2,2,2 will create a simulation with 8x +as many atoms by doubling the size of the simulation box in each +dimension. A replication factor of 1 leaves the simulation domain +unchanged in that dimension. -All properties of the atoms are replicated, including their -velocities, which may or may not be desirable. New atom IDs are -assigned to new atoms, as are molecule IDs. Bonds and other topology -interactions are created between pairs of new atoms as well as between -old and new atoms. This is done by using the image flag for each atom -to "unwrap" it out of the periodic box before replicating it. +When the new simulation box is created it is partitioned into a +regular 3d grid of rectangular bricks, one per processor, based on the +number of processors being used and the settings of the +:doc:`processors ` command. The partitioning can be +changed by subsequent :doc:`balance ` or :doc:`fix balance +` commands. -This means that any molecular bond you specify in the original data -file that crosses a periodic boundary should be between two atoms with -image flags that differ by 1. This will allow the bond to be -unwrapped appropriately. - -The optional keyword *bbox* uses a bounding box to only check atoms in -replicas that overlap with a processor's subdomain when assigning -atoms to processors. It typically results in a substantial speedup -when using the replicate command on a large number of processors. It -does require temporary use of more memory, specifically that each -processor can store all atoms in the entire system before it is -replicated. - -The optional keyword *bondlist* correctly treats molecules that span -the box and are bonded to themselves across a periodic boundary, by -relying on self-consistent nearest-image assumptions (rather than -using image flags). The *bondlist* option resets all image flags to -zero. Therefore, the *bondlist* keyword can also be used in general -for systems that may not have consistent image flags. The *bondlist* -algorithm builds off the *bbox* algorithm, so it is fast when using a -large number of processors, but does require temporary use of more -memory. Specifically, each processor must be able to store arrays for -all atoms in the entire system before it is replicated. +All properties of each atom are replicated (except per-atom fix data, +see the Restrictions section below). This includes their velocities, +which may or may not be desirable. New atom IDs are assigned to new +atoms, as are new molecule IDs. Bonds and other topology interactions +are created between pairs of new atoms as well as between old and new +atoms. .. note:: + + The bond discussion which follows only refers to models with + permanent covalent bonds typically defined in LAMMPS via a data + file. It is not relevant to sytems modeled with many-body + potentials which can define bonds on-the-fly, based on the current + positions of nearby atoms, e.g. models using the :doc:`AIREBO + ` or :doc:`ReaxFF ` potentials. - For systems that contain a molecule that spans the box and is - bonded to itself across a periodic boundary (so that the molecule - is effectively a loop), the *bondlist* keyword must be used. A - simple example would be a linear polymer chain that spans the - simulation box and bonds back to itself across the periodic - boundary. More realistic examples would be a CNT (meant to be an - infinitely long CNT) or a graphene sheet or a bulk periodic crystal - where there are explicit bonds specified between near neighbors. - (Note that this restriction only applies to systems that have - permanent bonds as specified in the data file. A CNT that is just - atoms modeled with the :doc:`AIREBO potential ` has no - such permanent bonds, so it can be replicated without the - *bondlist* keyword.) +If the *bond/periodic* keyword is not specified, bond replication is +done by using the image flag for each atom to "unwrap" it out of the +periodic box before replicating it. After replication is performed, +atoms outside the new periodic box are wrapped back into it. This +assigns correct images flags to all atoms in the system. For this to +work, all original atoms in the original simulation box must have +consistent image flags. This means that if two atoms have a bond +between them which crosses a periodic boundary, their respective image +flags will differ by 1 in that dimension. -Restrictions +Image flag consistency is not possible if a system has a periodic bond +loop, meaning there is a chain of bonds which crosses an entire +dimension and re-connects to itself across a periodic boundary. In +this case you MUST use the *bond/periodic* keyword to correctly +replicate the system. This option zeroes the image flags for all +atoms and uses a different algorithm to find new (nearby) bond +neighbors in the replicated system. In the final replicated system +all image flags are zero (in each dimension). + +-- note: + + LAMMPS does not check for image flag consistency before performing + the replication (it does issue a warning about this before a + simulation is run). If the original image flags are inconsistent, + the replicated system will also have inconsistent image flags, but + will otherwise be correctly replicated. This is NOT the case if + there is a periodic bond loop. See the next note. + +-- note: + + LAMMPS does not check for periodic bond loops. If you use the + *bond/periodic* option for a system without periodic bond loops, + the system will be correctly replicated, but image flag information + will be lost (which may or may not be important to your model). If + you do not use the *bond/periodic* option for a system with + periodic bond loops, the replicated system will have invalid bonds + (typically very long), resulting in bad dynamics. + +If possible, the *bbox* keyword should be used when running on a large +number of processors, as it can result in a substantial speed-up for +the replication operation. It uses a bounding box to only check atoms +in replicas that overlap with each processor's new subdomain when +assigning atoms to processors. It also preserves image flag +information. The only drawback to the *bbox* option is that it +requires a temporary use of more memory. Each processor must be able +to store all atoms (and their per-atom data) in the original system, +before it is replicated. + +-- note: + + The algorithm used by the *bond/periodic* keyword builds on the + algorithm used by the *bbox* keyword and thus has the same memory + requirements. If you specify only the *bond/peridoic* keyword it + will internally set the *bbox* keyword as well. + +---------- + + Restrictions """""""""""" A 2d simulation cannot be replicated in the z dimension. If a simulation is non-periodic in a dimension, care should be used -when replicating it in that dimension, as it may put atoms nearly on -top of each other. +when replicating it in that dimension, as it may generate atoms nearly +on top of each other. If the current simulation was read in from a restart file (before a -run is performed), there must not be any fix information stored in -the file for individual atoms. Similarly, no fixes can be defined at -the time the replicate command is used that require vectors of atom +run is performed), there must not be any fix information stored in the +file for individual atoms. Similarly, no fixes can be defined at the +time the replicate command is used that require vectors of atom information to be stored. This is because the replicate command does not know how to replicate that information for new atoms it creates. -To work around this restriction, restart files may be converted into -data files and fixes may be undefined via the :doc:`unfix ` -command before and redefined after the replicate command. + +To work around this restriction two options are possible. (1) Fixes +which use the stored data in the restart file can be defined before +replication and then deleted via the :doc:`unfix ` command and +re-defined after it. Or (2) the restart file can be converted to a +data file (which deletes the stored fix infomation) and fixes defined +after the replicate command. In both these scenarios, the per-atom +fix information in the restart file is lost. Related commands """""""""""""""" none - Default """"""" -none +No settings for using the *bbox* or *bond/periodic* algorithms. diff --git a/examples/README b/examples/README index 86d14e7078..90831b49f0 100644 --- a/examples/README +++ b/examples/README @@ -104,6 +104,7 @@ prd: parallel replica dynamics of vacancy diffusion in bulk Si python: use of PYTHON package to invoke Python code from input script qeq: use of QEQ package for charge equilibration reaxff: RDX and TATB and several other models using ReaxFF +replicate: use of replicate command rerun: use of rerun and read_dump commands rigid: rigid bodies modeled as independent or coupled shear: sideways shear applied to 2d solid, with and without a void diff --git a/examples/replicate/README b/examples/replicate/README new file mode 100644 index 0000000000..1363158b37 --- /dev/null +++ b/examples/replicate/README @@ -0,0 +1,23 @@ +This directory has input scripts which demonstrate how to use the +replicate command both for systems with and without periodic bond +loops. A periodic bond loop is where a chain of bonds spans a +periodic dimension of the box and includes one or more bonds which +cross the periodic boundary to close the loop. + +To run these scripts, LAMMPS should be built with the MOLECULE and +CLASS2 packages. The latter is only needed for the CNT example. + +These scripts are tiny examples which illustrate both kinds of +systems. Each produces a series of images which can be visualized. +If the 3 lines for a dump movie command are uncommented, a MPG movie +is produced, assuming LAMMPS is build with FFMPEG support. + +in.replicate.bond.x # linear chains in x direction, bond loop in x +in.replcate.bond.x.y # 2d grid of bonded atoms, bond loops in x and y +in.replicate.bond.xy # linear chains in diagonal direction, bond loop in x and y +in.replicate.bond.noloop # linear chains in x direction, no bond loop + +This script is for a complex system of 3 orthogonal CNTs which has +periodic bond loops in all 3 dimensions xyz. + +in.replicate.cnt diff --git a/examples/replicate/data.bond.x b/examples/replicate/data.bond.x new file mode 100644 index 0000000000..b5f4d49f2d --- /dev/null +++ b/examples/replicate/data.bond.x @@ -0,0 +1,22 @@ +# system with periodic bonds in x + +3 atoms +3 bonds + +1 atom types +1 bond types + +0 3 xlo xhi +0 1 ylo yhi + +Atoms + +1 1 1 0.5 0.5 0 +2 1 1 1.5 0.5 0 +3 1 1 2.5 0.5 0 + +Bonds + +1 1 1 2 +2 1 2 3 +3 1 3 1 diff --git a/examples/replicate/data.bond.x.noloop b/examples/replicate/data.bond.x.noloop new file mode 100644 index 0000000000..4c096724be --- /dev/null +++ b/examples/replicate/data.bond.x.noloop @@ -0,0 +1,21 @@ +# system with non-periodic bonds in x + +3 atoms +2 bonds + +1 atom types +1 bond types + +0 3 xlo xhi +0 1 ylo yhi + +Atoms + +1 1 1 0.5 0.5 0 0 0 0 +2 1 1 1.5 0.5 0 0 0 0 +3 1 1 2.5 0.5 0 -1 0 0 + +Bonds + +1 1 1 2 +2 1 3 1 diff --git a/examples/replicate/data.bond.x.y b/examples/replicate/data.bond.x.y new file mode 100644 index 0000000000..7eaf19a2ae --- /dev/null +++ b/examples/replicate/data.bond.x.y @@ -0,0 +1,43 @@ +# system with periodic bonds in both x and y + +9 atoms +18 bonds + +1 atom types +1 bond types + +0 3 xlo xhi +0 3 ylo yhi + +Atoms + +1 1 1 0.5 0.5 0 +2 1 1 1.5 0.5 0 +3 1 1 2.5 0.5 0 +4 1 1 0.5 1.5 0 +5 1 1 1.5 1.5 0 +6 1 1 2.5 1.5 0 +7 1 1 0.5 2.5 0 +8 1 1 1.5 2.5 0 +9 1 1 2.5 2.5 0 + +Bonds + +1 1 1 2 +2 1 2 3 +3 1 3 1 +4 1 4 5 +5 1 5 6 +6 1 6 4 +7 1 7 8 +8 1 8 9 +9 1 9 7 +10 1 1 4 +11 1 4 7 +12 1 7 1 +13 1 2 5 +14 1 5 8 +15 1 8 2 +16 1 3 6 +17 1 6 9 +18 1 9 3 diff --git a/examples/replicate/data.bond.xy b/examples/replicate/data.bond.xy new file mode 100644 index 0000000000..31e9d8785a --- /dev/null +++ b/examples/replicate/data.bond.xy @@ -0,0 +1,22 @@ +# system with periodic bonds in xy direction + +3 atoms +3 bonds + +1 atom types +1 bond types + +0 3 xlo xhi +0 3 ylo yhi + +Atoms + +1 1 1 0.5 0.5 0 +2 1 1 1.5 1.5 0 +3 1 1 2.5 2.5 0 + +Bonds + +1 1 1 2 +2 1 2 3 +3 1 3 1 diff --git a/examples/replicate/in.replicate.bond.x b/examples/replicate/in.replicate.bond.x new file mode 100644 index 0000000000..868e05f177 --- /dev/null +++ b/examples/replicate/in.replicate.bond.x @@ -0,0 +1,34 @@ +# test of replicating system with periodic bonds in x + +dimension 2 +atom_style molecular + +read_data data.bond.x + +#replicate 3 3 1 +replicate 3 3 1 bond/periodic + +mass 1 1.0 +velocity all create 0.02 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 + +bond_style harmonic +bond_coeff 1 50.0 1.0 + +special_bonds fene + +fix 1 all nve + +write_data tmp.data.x + +dump 1 all image 100 tmp.image.x.*.ppm type type & + adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.x.mpg type type & +# adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 diff --git a/examples/replicate/in.replicate.bond.x.noloop b/examples/replicate/in.replicate.bond.x.noloop new file mode 100644 index 0000000000..b9862f844d --- /dev/null +++ b/examples/replicate/in.replicate.bond.x.noloop @@ -0,0 +1,34 @@ +# test of replicating system with periodic bonds in x + +dimension 2 +atom_style molecular + +read_data data.bond.x.noloop + +replicate 3 3 1 +#replicate 3 3 1 bond/periodic + +mass 1 1.0 +velocity all create 0.001 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 + +bond_style harmonic +bond_coeff 1 50.0 1.0 + +special_bonds fene + +fix 1 all nve + +write_data tmp.data.x.non + +dump 1 all image 100 tmp.image.x.non.*.ppm type type & + adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.x.non.mpg type type & +# adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 diff --git a/examples/replicate/in.replicate.bond.x.y b/examples/replicate/in.replicate.bond.x.y new file mode 100644 index 0000000000..100350dc18 --- /dev/null +++ b/examples/replicate/in.replicate.bond.x.y @@ -0,0 +1,34 @@ +# test of replicating system with periodic bonds in both x and y + +dimension 2 +atom_style molecular + +read_data data.bond.x.y + +#replicate 3 3 1 +replicate 3 3 1 bond/periodic + +mass 1 1.0 +velocity all create 0.02 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 + +bond_style harmonic +bond_coeff 1 50.0 1.0 + +special_bonds fene + +fix 1 all nve + +write_data tmp.data.x.y + +dump 1 all image 100 tmp.image.x.y.*.ppm type type & + adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.x.y.mpg type type & +# adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 diff --git a/examples/replicate/in.replicate.bond.xy b/examples/replicate/in.replicate.bond.xy new file mode 100644 index 0000000000..52ca79ace7 --- /dev/null +++ b/examples/replicate/in.replicate.bond.xy @@ -0,0 +1,34 @@ +# test of replicating system with periodic bonds in xy diagonal direction + +dimension 2 +atom_style molecular + +read_data data.bond.xy + +#replicate 3 3 1 +replicate 3 3 1 bond/periodic + +mass 1 1.0 +velocity all create 0.02 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.5 + +bond_style harmonic +bond_coeff 1 50.0 1.414 + +special_bonds fene + +fix 1 all nve + +write_data tmp.data.xy + +dump 1 all image 100 tmp.image.xy.*.ppm type type & + adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.xy.mpg type type & +# adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 diff --git a/examples/replicate/in.replicate b/examples/replicate/in.replicate.cnt similarity index 94% rename from examples/replicate/in.replicate rename to examples/replicate/in.replicate.cnt index 52140d4ce8..0b8b384bbb 100644 --- a/examples/replicate/in.replicate +++ b/examples/replicate/in.replicate.cnt @@ -22,7 +22,7 @@ improper_style class2 read_data three_periodic_CNTs.data.gz -replicate 2 2 2 bondlist +replicate 2 2 2 bond/periodic fix 1 all nve diff --git a/examples/replicate/log.6May24.replicate.bond.x.g++.1 b/examples/replicate/log.6May24.replicate.bond.x.g++.1 new file mode 100644 index 0000000000..3f65d11c15 --- /dev/null +++ b/examples/replicate/log.6May24.replicate.bond.x.g++.1 @@ -0,0 +1,125 @@ +LAMMPS (17 Apr 2024) +# test of replicating system with periodic bonds in x + +dimension 2 +atom_style molecular + +read_data data.bond.x +Reading data file ... + orthogonal box = (0 0 -0.5) to (3 1 0.5) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3 atoms + scanning bonds ... + 1 = max bonds/atom + orthogonal box = (0 0 -0.5) to (3 1 0.5) + 1 by 1 by 1 MPI processor grid + reading bonds ... + 3 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.004 seconds + +#replicate 3 3 1 +replicate 3 3 1 bond/periodic +Replication is creating a 3x3x1 = 9 times larger system... + orthogonal box = (0 0 -0.5) to (9 3 0.5) + 1 by 1 by 1 MPI processor grid + bounding box image = (0 0 0) to (0 0 0) + bounding box extra memory = 0.00 MB + average # of replicas added to proc = 9.00 out of 9 (100.00%) + 27 atoms + 27 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + replicate CPU = 0.001 seconds + +mass 1 1.0 +velocity all create 0.02 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 + +bond_style harmonic +bond_coeff 1 50.0 1.0 + +special_bonds fene +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 2 = max # of 1-2 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + +fix 1 all nve + +write_data tmp.data.x +System init for write_data ... +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 = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 7 3 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard + +dump 1 all image 100 tmp.image.x.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.x.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: Inconsistent image flags (../domain.cpp:1051) +Per MPI rank memory allocation (min/avg/max) = 6.302 | 6.302 | 6.302 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 0.02 -1.1250229 0 -1.1057636 9.028122 + 5000 0.54111971 -1.9054641 0.29066874 -1.0937172 3.4346743 +Loop time of 0.0764878 on 1 procs for 5000 steps with 27 atoms + +Performance: 28239805.842 tau/day, 65369.921 timesteps/s, 1.765 Matom-step/s +66.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.0048837 | 0.0048837 | 0.0048837 | 0.0 | 6.38 +Bond | 0.00065879 | 0.00065879 | 0.00065879 | 0.0 | 0.86 +Neigh | 0.0019897 | 0.0019897 | 0.0019897 | 0.0 | 2.60 +Comm | 0.0012815 | 0.0012815 | 0.0012815 | 0.0 | 1.68 +Output | 0.066351 | 0.066351 | 0.066351 | 0.0 | 86.75 +Modify | 0.00069789 | 0.00069789 | 0.00069789 | 0.0 | 0.91 +Other | | 0.0006247 | | | 0.82 + +Nlocal: 27 ave 27 max 27 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 108 ave 108 max 108 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 284 ave 284 max 284 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 284 +Ave neighs/atom = 10.518519 +Ave special neighs/atom = 2 +Neighbor list builds = 287 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/replicate/log.6May24.replicate.bond.x.g++.4 b/examples/replicate/log.6May24.replicate.bond.x.g++.4 new file mode 100644 index 0000000000..9e4423d5f6 --- /dev/null +++ b/examples/replicate/log.6May24.replicate.bond.x.g++.4 @@ -0,0 +1,126 @@ +LAMMPS (17 Apr 2024) +WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551) +# test of replicating system with periodic bonds in x + +dimension 2 +atom_style molecular + +read_data data.bond.x +Reading data file ... + orthogonal box = (0 0 -0.5) to (3 1 0.5) + 4 by 1 by 1 MPI processor grid + reading atoms ... + 3 atoms + scanning bonds ... + 1 = max bonds/atom + orthogonal box = (0 0 -0.5) to (3 1 0.5) + 4 by 1 by 1 MPI processor grid + reading bonds ... + 3 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.003 seconds + +#replicate 3 3 1 +replicate 3 3 1 bond/periodic +Replication is creating a 3x3x1 = 9 times larger system... + orthogonal box = (0 0 -0.5) to (9 3 0.5) + 4 by 1 by 1 MPI processor grid + bounding box image = (0 0 0) to (0 0 0) + bounding box extra memory = 0.00 MB + average # of replicas added to proc = 5.25 out of 9 (58.33%) + 27 atoms + 27 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + replicate CPU = 0.002 seconds + +mass 1 1.0 +velocity all create 0.02 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 + +bond_style harmonic +bond_coeff 1 50.0 1.0 + +special_bonds fene +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 2 = max # of 1-2 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + +fix 1 all nve + +write_data tmp.data.x +System init for write_data ... +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 = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 7 3 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard + +dump 1 all image 100 tmp.image.x.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.x.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: Inconsistent image flags (../domain.cpp:1051) +Per MPI rank memory allocation (min/avg/max) = 6.309 | 6.309 | 6.309 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 0.02 -1.1250229 0 -1.1057636 9.028122 + 5000 0.50911963 -1.7968226 0.21209852 -1.0944607 4.1676488 +Loop time of 0.21682 on 4 procs for 5000 steps with 27 atoms + +Performance: 9962160.612 tau/day, 23060.557 timesteps/s, 622.635 katom-step/s +93.9% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.001787 | 0.0021247 | 0.0028772 | 1.0 | 0.98 +Bond | 0.00039682 | 0.00045617 | 0.00059887 | 0.0 | 0.21 +Neigh | 0.0013626 | 0.0014006 | 0.0014798 | 0.1 | 0.65 +Comm | 0.017009 | 0.01791 | 0.018656 | 0.5 | 8.26 +Output | 0.06892 | 0.12188 | 0.18918 | 13.7 | 56.21 +Modify | 0.00060336 | 0.00072159 | 0.00088047 | 0.0 | 0.33 +Other | | 0.07233 | | | 33.36 + +Nlocal: 6.75 ave 7 max 6 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Nghost: 64.5 ave 65 max 63 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Neighs: 70.25 ave 77 max 60 min +Histogram: 1 0 0 0 0 1 0 0 1 1 + +Total # of neighbors = 281 +Ave neighs/atom = 10.407407 +Ave special neighs/atom = 2 +Neighbor list builds = 287 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/replicate/log.6May24.replicate.bond.x.noloop.g++.1 b/examples/replicate/log.6May24.replicate.bond.x.noloop.g++.1 new file mode 100644 index 0000000000..54893b449a --- /dev/null +++ b/examples/replicate/log.6May24.replicate.bond.x.noloop.g++.1 @@ -0,0 +1,121 @@ +LAMMPS (17 Apr 2024) +# test of replicating system with periodic bonds in x + +dimension 2 +atom_style molecular + +read_data data.bond.x.non +Reading data file ... + orthogonal box = (0 0 -0.5) to (3 1 0.5) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3 atoms + scanning bonds ... + 1 = max bonds/atom + orthogonal box = (0 0 -0.5) to (3 1 0.5) + 1 by 1 by 1 MPI processor grid + reading bonds ... + 2 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.004 seconds + +replicate 3 3 1 +Replication is creating a 3x3x1 = 9 times larger system... + orthogonal box = (0 0 -0.5) to (9 3 0.5) + 1 by 1 by 1 MPI processor grid + 27 atoms + 18 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + replicate CPU = 0.001 seconds +#replicate 3 3 1 bond/periodic + +mass 1 1.0 +velocity all create 0.001 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 + +bond_style harmonic +bond_coeff 1 50.0 1.0 + +special_bonds fene +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + +fix 1 all nve + +write_data tmp.data.x.non +System init for write_data ... +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 = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 7 3 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard + +dump 1 all image 100 tmp.image.x.non.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.x.non.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.052 | 6.052 | 6.052 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 0.001 -1.1250229 0 -1.1240599 13.009826 + 5000 0.62003692 -2.0147214 0.30861545 -1.1090334 8.0279226 +Loop time of 0.0734456 on 1 procs for 5000 steps with 27 atoms + +Performance: 29409520.548 tau/day, 68077.594 timesteps/s, 1.838 Matom-step/s +94.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.0051444 | 0.0051444 | 0.0051444 | 0.0 | 7.00 +Bond | 0.00048789 | 0.00048789 | 0.00048789 | 0.0 | 0.66 +Neigh | 0.0019333 | 0.0019333 | 0.0019333 | 0.0 | 2.63 +Comm | 0.001332 | 0.001332 | 0.001332 | 0.0 | 1.81 +Output | 0.063139 | 0.063139 | 0.063139 | 0.0 | 85.97 +Modify | 0.00077014 | 0.00077014 | 0.00077014 | 0.0 | 1.05 +Other | | 0.0006387 | | | 0.87 + +Nlocal: 27 ave 27 max 27 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 101 ave 101 max 101 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 288 ave 288 max 288 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 288 +Ave neighs/atom = 10.666667 +Ave special neighs/atom = 1.3333333 +Neighbor list builds = 322 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/replicate/log.6May24.replicate.bond.x.noloop.g++.4 b/examples/replicate/log.6May24.replicate.bond.x.noloop.g++.4 new file mode 100644 index 0000000000..54d9741781 --- /dev/null +++ b/examples/replicate/log.6May24.replicate.bond.x.noloop.g++.4 @@ -0,0 +1,122 @@ +LAMMPS (17 Apr 2024) +WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551) +# test of replicating system with periodic bonds in x + +dimension 2 +atom_style molecular + +read_data data.bond.x.non +Reading data file ... + orthogonal box = (0 0 -0.5) to (3 1 0.5) + 4 by 1 by 1 MPI processor grid + reading atoms ... + 3 atoms + scanning bonds ... + 1 = max bonds/atom + orthogonal box = (0 0 -0.5) to (3 1 0.5) + 4 by 1 by 1 MPI processor grid + reading bonds ... + 2 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.004 seconds + +replicate 3 3 1 +Replication is creating a 3x3x1 = 9 times larger system... + orthogonal box = (0 0 -0.5) to (9 3 0.5) + 4 by 1 by 1 MPI processor grid + 27 atoms + 18 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + replicate CPU = 0.002 seconds +#replicate 3 3 1 bond/periodic + +mass 1 1.0 +velocity all create 0.001 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 + +bond_style harmonic +bond_coeff 1 50.0 1.0 + +special_bonds fene +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + +fix 1 all nve + +write_data tmp.data.x.non +System init for write_data ... +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 = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 7 3 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard + +dump 1 all image 100 tmp.image.x.non.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.x.non.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.059 | 6.059 | 6.059 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 0.001 -1.1250229 0 -1.1240599 13.009826 + 5000 0.74931971 -2.233724 0.40158766 -1.1105692 5.6354701 +Loop time of 0.197835 on 4 procs for 5000 steps with 27 atoms + +Performance: 10918214.594 tau/day, 25273.645 timesteps/s, 682.388 katom-step/s +88.8% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.0018771 | 0.0021131 | 0.0027188 | 0.8 | 1.07 +Bond | 0.00032659 | 0.00038248 | 0.00049555 | 0.0 | 0.19 +Neigh | 0.001385 | 0.0014211 | 0.0014704 | 0.1 | 0.72 +Comm | 0.017163 | 0.017405 | 0.017805 | 0.2 | 8.80 +Output | 0.070971 | 0.11052 | 0.17112 | 12.1 | 55.87 +Modify | 0.00058993 | 0.00067708 | 0.00075608 | 0.0 | 0.34 +Other | | 0.06532 | | | 33.02 + +Nlocal: 6.75 ave 7 max 6 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Nghost: 59.75 ave 60 max 59 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Neighs: 72 ave 79 max 63 min +Histogram: 1 0 0 0 0 0 2 0 0 1 + +Total # of neighbors = 288 +Ave neighs/atom = 10.666667 +Ave special neighs/atom = 1.3333333 +Neighbor list builds = 323 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/replicate/log.6May24.replicate.bond.x.y.g++.1 b/examples/replicate/log.6May24.replicate.bond.x.y.g++.1 new file mode 100644 index 0000000000..45308d9a90 --- /dev/null +++ b/examples/replicate/log.6May24.replicate.bond.x.y.g++.1 @@ -0,0 +1,125 @@ +LAMMPS (17 Apr 2024) +# test of replicating system with periodic bonds in both x and y + +dimension 2 +atom_style molecular + +read_data data.bond.x.y +Reading data file ... + orthogonal box = (0 0 -0.5) to (3 3 0.5) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 9 atoms + scanning bonds ... + 2 = max bonds/atom + orthogonal box = (0 0 -0.5) to (3 3 0.5) + 1 by 1 by 1 MPI processor grid + reading bonds ... + 18 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 12 = max # of 1-3 neighbors + 48 = max # of 1-4 neighbors + 8 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.004 seconds + +#replicate 3 3 1 +replicate 3 3 1 bond/periodic +Replication is creating a 3x3x1 = 9 times larger system... + orthogonal box = (0 0 -0.5) to (9 9 0.5) + 1 by 1 by 1 MPI processor grid + bounding box image = (0 0 0) to (0 0 0) + bounding box extra memory = 0.00 MB + average # of replicas added to proc = 9.00 out of 9 (100.00%) + 81 atoms + 162 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 12 = max # of 1-3 neighbors + 48 = max # of 1-4 neighbors + 24 = max # of special neighbors + special bonds CPU = 0.000 seconds + replicate CPU = 0.001 seconds + +mass 1 1.0 +velocity all create 0.02 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 + +bond_style harmonic +bond_coeff 1 50.0 1.0 + +special_bonds fene +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 4 = max # of 1-2 neighbors + 24 = max # of special neighbors + special bonds CPU = 0.000 seconds + +fix 1 all nve + +write_data tmp.data.x.y +System init for write_data ... +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 = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 7 7 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard + +dump 1 all image 100 tmp.image.x.y.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.x.y.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: Inconsistent image flags (../domain.cpp:1051) +Per MPI rank memory allocation (min/avg/max) = 7.555 | 7.555 | 7.555 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 0.02 -1.1250229 0 -1.1052698 -2.9713842 + 5000 0.046175679 -1.2280388 0.080003864 -1.1024293 -4.1097897 +Loop time of 0.212344 on 1 procs for 5000 steps with 81 atoms + +Performance: 10172161.526 tau/day, 23546.670 timesteps/s, 1.907 Matom-step/s +93.0% 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.01283 | 0.01283 | 0.01283 | 0.0 | 6.04 +Bond | 0.0032785 | 0.0032785 | 0.0032785 | 0.0 | 1.54 +Neigh | 0.0018379 | 0.0018379 | 0.0018379 | 0.0 | 0.87 +Comm | 0.0016247 | 0.0016247 | 0.0016247 | 0.0 | 0.77 +Output | 0.18991 | 0.18991 | 0.18991 | 0.0 | 89.44 +Modify | 0.0018198 | 0.0018198 | 0.0018198 | 0.0 | 0.86 +Other | | 0.001039 | | | 0.49 + +Nlocal: 81 ave 81 max 81 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 144 ave 144 max 144 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 714 ave 714 max 714 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 714 +Ave neighs/atom = 8.8148148 +Ave special neighs/atom = 4 +Neighbor list builds = 72 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/replicate/log.6May24.replicate.bond.x.y.g++.4 b/examples/replicate/log.6May24.replicate.bond.x.y.g++.4 new file mode 100644 index 0000000000..f232a4e428 --- /dev/null +++ b/examples/replicate/log.6May24.replicate.bond.x.y.g++.4 @@ -0,0 +1,126 @@ +LAMMPS (17 Apr 2024) +WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551) +# test of replicating system with periodic bonds in both x and y + +dimension 2 +atom_style molecular + +read_data data.bond.x.y +Reading data file ... + orthogonal box = (0 0 -0.5) to (3 3 0.5) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 9 atoms + scanning bonds ... + 2 = max bonds/atom + orthogonal box = (0 0 -0.5) to (3 3 0.5) + 2 by 2 by 1 MPI processor grid + reading bonds ... + 18 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 12 = max # of 1-3 neighbors + 48 = max # of 1-4 neighbors + 8 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.003 seconds + +#replicate 3 3 1 +replicate 3 3 1 bond/periodic +Replication is creating a 3x3x1 = 9 times larger system... + orthogonal box = (0 0 -0.5) to (9 9 0.5) + 2 by 2 by 1 MPI processor grid + bounding box image = (0 0 0) to (0 0 0) + bounding box extra memory = 0.00 MB + average # of replicas added to proc = 6.25 out of 9 (69.44%) + 81 atoms + 162 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 12 = max # of 1-3 neighbors + 48 = max # of 1-4 neighbors + 24 = max # of special neighbors + special bonds CPU = 0.000 seconds + replicate CPU = 0.001 seconds + +mass 1 1.0 +velocity all create 0.02 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 + +bond_style harmonic +bond_coeff 1 50.0 1.0 + +special_bonds fene +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 4 = max # of 1-2 neighbors + 24 = max # of special neighbors + special bonds CPU = 0.000 seconds + +fix 1 all nve + +write_data tmp.data.x.y +System init for write_data ... +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 = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 7 7 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard + +dump 1 all image 100 tmp.image.x.y.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.x.y.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: Inconsistent image flags (../domain.cpp:1051) +Per MPI rank memory allocation (min/avg/max) = 7.552 | 7.552 | 7.552 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 0.02 -1.1250229 0 -1.1052698 -2.9713842 + 5000 0.046175679 -1.2280388 0.080003864 -1.1024293 -4.1097897 +Loop time of 0.273847 on 4 procs for 5000 steps with 81 atoms + +Performance: 7887622.810 tau/day, 18258.386 timesteps/s, 1.479 Matom-step/s +92.4% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.0039465 | 0.0042593 | 0.0046129 | 0.4 | 1.56 +Bond | 0.0011489 | 0.001207 | 0.0012757 | 0.2 | 0.44 +Neigh | 0.00079819 | 0.0008044 | 0.00081324 | 0.0 | 0.29 +Comm | 0.024107 | 0.024703 | 0.025269 | 0.3 | 9.02 +Output | 0.14406 | 0.18123 | 0.23779 | 8.7 | 66.18 +Modify | 0.00089401 | 0.00095321 | 0.0010422 | 0.0 | 0.35 +Other | | 0.06069 | | | 22.16 + +Nlocal: 20.25 ave 22 max 19 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Nghost: 81.5 ave 82 max 80 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Neighs: 178.5 ave 195 max 165 min +Histogram: 2 0 0 0 0 0 0 1 0 1 + +Total # of neighbors = 714 +Ave neighs/atom = 8.8148148 +Ave special neighs/atom = 4 +Neighbor list builds = 72 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/replicate/log.6May24.replicate.bond.xy.g++.1 b/examples/replicate/log.6May24.replicate.bond.xy.g++.1 new file mode 100644 index 0000000000..207b65ef9b --- /dev/null +++ b/examples/replicate/log.6May24.replicate.bond.xy.g++.1 @@ -0,0 +1,125 @@ +LAMMPS (17 Apr 2024) +# test of replicating system with periodic bonds in xy diagonal direction + +dimension 2 +atom_style molecular + +read_data data.bond.xy +Reading data file ... + orthogonal box = (0 0 -0.5) to (3 3 0.5) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3 atoms + scanning bonds ... + 1 = max bonds/atom + orthogonal box = (0 0 -0.5) to (3 3 0.5) + 1 by 1 by 1 MPI processor grid + reading bonds ... + 3 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.004 seconds + +#replicate 3 3 1 +replicate 3 3 1 bond/periodic +Replication is creating a 3x3x1 = 9 times larger system... + orthogonal box = (0 0 -0.5) to (9 9 0.5) + 1 by 1 by 1 MPI processor grid + bounding box image = (0 0 0) to (0 0 0) + bounding box extra memory = 0.00 MB + average # of replicas added to proc = 9.00 out of 9 (100.00%) + 27 atoms + 27 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + replicate CPU = 0.001 seconds + +mass 1 1.0 +velocity all create 0.02 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.5 + +bond_style harmonic +bond_coeff 1 50.0 1.414 + +special_bonds fene +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 2 = max # of 1-2 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + +fix 1 all nve + +write_data tmp.data.xy +System init for write_data ... +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 = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 7 7 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard + +dump 1 all image 100 tmp.image.xy.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.xy.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: Inconsistent image flags (../domain.cpp:1051) +Per MPI rank memory allocation (min/avg/max) = 6.302 | 6.302 | 6.302 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 0.02 -0.66256987 2.2804444e-06 -0.64330834 -0.59475371 + 5000 0.43110862 -1.1484506 0.16888799 -0.56442095 -0.3683968 +Loop time of 0.124095 on 1 procs for 5000 steps with 27 atoms + +Performance: 17406010.885 tau/day, 40291.692 timesteps/s, 1.088 Matom-step/s +82.3% 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.0013734 | 0.0013734 | 0.0013734 | 0.0 | 1.11 +Bond | 0.00064058 | 0.00064058 | 0.00064058 | 0.0 | 0.52 +Neigh | 0.00090424 | 0.00090424 | 0.00090424 | 0.0 | 0.73 +Comm | 0.00081732 | 0.00081732 | 0.00081732 | 0.0 | 0.66 +Output | 0.11905 | 0.11905 | 0.11905 | 0.0 | 95.93 +Modify | 0.0007252 | 0.0007252 | 0.0007252 | 0.0 | 0.58 +Other | | 0.0005888 | | | 0.47 + +Nlocal: 27 ave 27 max 27 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 45 ave 45 max 45 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 = 2.4444444 +Ave special neighs/atom = 2 +Neighbor list builds = 244 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/replicate/log.6May24.replicate.bond.xy.g++.4 b/examples/replicate/log.6May24.replicate.bond.xy.g++.4 new file mode 100644 index 0000000000..a8ef944ec7 --- /dev/null +++ b/examples/replicate/log.6May24.replicate.bond.xy.g++.4 @@ -0,0 +1,126 @@ +LAMMPS (17 Apr 2024) +WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551) +# test of replicating system with periodic bonds in xy diagonal direction + +dimension 2 +atom_style molecular + +read_data data.bond.xy +Reading data file ... + orthogonal box = (0 0 -0.5) to (3 3 0.5) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 3 atoms + scanning bonds ... + 1 = max bonds/atom + orthogonal box = (0 0 -0.5) to (3 3 0.5) + 2 by 2 by 1 MPI processor grid + reading bonds ... + 3 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.003 seconds + +#replicate 3 3 1 +replicate 3 3 1 bond/periodic +Replication is creating a 3x3x1 = 9 times larger system... + orthogonal box = (0 0 -0.5) to (9 9 0.5) + 2 by 2 by 1 MPI processor grid + bounding box image = (0 0 0) to (0 0 0) + bounding box extra memory = 0.00 MB + average # of replicas added to proc = 6.25 out of 9 (69.44%) + 27 atoms + 27 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 2 = max # of 1-2 neighbors + 2 = max # of 1-3 neighbors + 4 = max # of 1-4 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + replicate CPU = 0.001 seconds + +mass 1 1.0 +velocity all create 0.02 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.5 + +bond_style harmonic +bond_coeff 1 50.0 1.414 + +special_bonds fene +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 2 = max # of 1-2 neighbors + 6 = max # of special neighbors + special bonds CPU = 0.000 seconds + +fix 1 all nve + +write_data tmp.data.xy +System init for write_data ... +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 = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 7 7 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/2d + bin: standard + +dump 1 all image 100 tmp.image.xy.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6 +dump_modify 1 pad 5 + +#dump 2 all movie 100 tmp.movie.xy.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6 +#dump_modify 2 pad 5 + +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: Inconsistent image flags (../domain.cpp:1051) +Per MPI rank memory allocation (min/avg/max) = 6.301 | 6.301 | 6.301 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 0.02 -0.66256988 2.2804444e-06 -0.64330834 -0.59475371 + 5000 0.43110877 -1.1484507 0.168888 -0.56442093 -0.36839692 +Loop time of 0.286423 on 4 procs for 5000 steps with 27 atoms + +Performance: 7541285.935 tau/day, 17456.680 timesteps/s, 471.330 katom-step/s +92.9% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.00054941 | 0.00084836 | 0.0013689 | 0.0 | 0.30 +Bond | 0.00034068 | 0.00045816 | 0.00068461 | 0.0 | 0.16 +Neigh | 0.00092076 | 0.00098494 | 0.0010463 | 0.0 | 0.34 +Comm | 0.018151 | 0.018737 | 0.019531 | 0.4 | 6.54 +Output | 0.13261 | 0.19363 | 0.2596 | 10.7 | 67.60 +Modify | 0.00053153 | 0.00071381 | 0.0010268 | 0.0 | 0.25 +Other | | 0.07105 | | | 24.81 + +Nlocal: 6.75 ave 9 max 5 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Nghost: 26.25 ave 28 max 25 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +Neighs: 16.5 ave 23 max 10 min +Histogram: 1 1 0 0 0 0 0 0 1 1 + +Total # of neighbors = 66 +Ave neighs/atom = 2.4444444 +Ave special neighs/atom = 2 +Neighbor list builds = 244 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/replicate/log.7Jan22.replicate.g++.1 b/examples/replicate/log.6May24.replicate.cnt.g++.1 similarity index 67% rename from examples/replicate/log.7Jan22.replicate.g++.1 rename to examples/replicate/log.6May24.replicate.cnt.g++.1 index 2933535ae8..f44032e723 100644 --- a/examples/replicate/log.7Jan22.replicate.g++.1 +++ b/examples/replicate/log.6May24.replicate.cnt.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (7 Jan 2022) +LAMMPS (17 Apr 2024) # three orthogonal periodic CNTs # demo for replicating triply looped system # infinite loops in x, y, z @@ -37,6 +37,8 @@ Reading data file ... 12 = max dihedrals/atom scanning impropers ... 1 = max impropers/atom + orthogonal box = (0 0 0) to (80.96 80.96 80.96) + 1 by 1 by 1 MPI processor grid reading bonds ... 4752 bonds reading angles ... @@ -52,11 +54,11 @@ Finding 1-2 1-3 1-4 neighbors ... 6 = max # of 1-3 neighbors 18 = max # of 1-4 neighbors 18 = max # of special neighbors - special bonds CPU = 0.003 seconds - read_data CPU = 0.115 seconds + special bonds CPU = 0.002 seconds + read_data CPU = 0.056 seconds -replicate 2 2 2 bondlist -Replicating atoms ... +replicate 2 2 2 bond/periodic +Replication is creating a 2x2x2 = 8 times larger system... orthogonal box = (0 0 0) to (161.92 161.92 161.92) 1 by 1 by 1 MPI processor grid bounding box image = (0 0 0) to (0 0 0) @@ -74,15 +76,15 @@ Finding 1-2 1-3 1-4 neighbors ... 6 = max # of 1-3 neighbors 18 = max # of 1-4 neighbors 18 = max # of special neighbors - special bonds CPU = 0.021 seconds - replicate CPU = 0.052 seconds + special bonds CPU = 0.012 seconds + replicate CPU = 0.027 seconds fix 1 all nve run 100 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Generated 0 of 0 mixed pair_coeff terms from sixthpower/geometric mixing rule Neighbor list info ... - update every 1 steps, delay 10 steps, check yes + update: every = 1 steps, delay = 0 steps, check = yes max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 @@ -93,26 +95,26 @@ Neighbor list info ... pair build: half/bin/newton stencil: half/bin/3d bin: standard -WARNING: Inconsistent image flags (../domain.cpp:814) +WARNING: Inconsistent image flags (../domain.cpp:1051) Per MPI rank memory allocation (min/avg/max) = 51.87 | 51.87 | 51.87 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0 -14266.189 1466925.5 1452659.3 -29908.753 - 100 2155.9128 -17224.188 1306769.8 1452409 1985.2082 -Loop time of 15.0972 on 1 procs for 100 steps with 25344 atoms + Step Temp E_pair E_mol TotEng Press + 0 0 -14266.189 1466925.5 1452659.3 -29908.753 + 100 2155.9128 -17224.188 1306769.8 1452409 1985.2082 +Loop time of 5.0155 on 1 procs for 100 steps with 25344 atoms -Performance: 0.572 ns/day, 41.937 hours/ns, 6.624 timesteps/s +Performance: 1.723 ns/day, 13.932 hours/ns, 19.938 timesteps/s, 505.314 katom-step/s 100.0% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 3.7175 | 3.7175 | 3.7175 | 0.0 | 24.62 -Bond | 11.222 | 11.222 | 11.222 | 0.0 | 74.33 -Neigh | 0.1032 | 0.1032 | 0.1032 | 0.0 | 0.68 -Comm | 0.014487 | 0.014487 | 0.014487 | 0.0 | 0.10 -Output | 0.00010894 | 0.00010894 | 0.00010894 | 0.0 | 0.00 -Modify | 0.027112 | 0.027112 | 0.027112 | 0.0 | 0.18 -Other | | 0.01274 | | | 0.08 +Pair | 1.6557 | 1.6557 | 1.6557 | 0.0 | 33.01 +Bond | 3.2813 | 3.2813 | 3.2813 | 0.0 | 65.42 +Neigh | 0.047025 | 0.047025 | 0.047025 | 0.0 | 0.94 +Comm | 0.0085317 | 0.0085317 | 0.0085317 | 0.0 | 0.17 +Output | 7.8551e-05 | 7.8551e-05 | 7.8551e-05 | 0.0 | 0.00 +Modify | 0.014635 | 0.014635 | 0.014635 | 0.0 | 0.29 +Other | | 0.008159 | | | 0.16 Nlocal: 25344 ave 25344 max 25344 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -129,4 +131,4 @@ Dangerous builds = 0 # write_restart replicate.restart # write_data replicate.data -Total wall time: 0:00:15 +Total wall time: 0:00:05 diff --git a/examples/replicate/log.7Jan22.replicate.g++.4 b/examples/replicate/log.6May24.replicate.cnt.g++.4 similarity index 65% rename from examples/replicate/log.7Jan22.replicate.g++.4 rename to examples/replicate/log.6May24.replicate.cnt.g++.4 index 79a13b1484..57abdf767d 100644 --- a/examples/replicate/log.7Jan22.replicate.g++.4 +++ b/examples/replicate/log.6May24.replicate.cnt.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (7 Jan 2022) +LAMMPS (17 Apr 2024) +WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551) # three orthogonal periodic CNTs # demo for replicating triply looped system # infinite loops in x, y, z @@ -37,6 +38,8 @@ Reading data file ... 12 = max dihedrals/atom scanning impropers ... 1 = max impropers/atom + orthogonal box = (0 0 0) to (80.96 80.96 80.96) + 1 by 2 by 2 MPI processor grid reading bonds ... 4752 bonds reading angles ... @@ -53,10 +56,10 @@ Finding 1-2 1-3 1-4 neighbors ... 18 = max # of 1-4 neighbors 18 = max # of special neighbors special bonds CPU = 0.001 seconds - read_data CPU = 0.315 seconds + read_data CPU = 0.064 seconds -replicate 2 2 2 bondlist -Replicating atoms ... +replicate 2 2 2 bond/periodic +Replication is creating a 2x2x2 = 8 times larger system... orthogonal box = (0 0 0) to (161.92 161.92 161.92) 1 by 2 by 2 MPI processor grid bounding box image = (0 0 0) to (0 0 0) @@ -74,15 +77,15 @@ Finding 1-2 1-3 1-4 neighbors ... 6 = max # of 1-3 neighbors 18 = max # of 1-4 neighbors 18 = max # of special neighbors - special bonds CPU = 0.007 seconds - replicate CPU = 0.020 seconds + special bonds CPU = 0.004 seconds + replicate CPU = 0.012 seconds fix 1 all nve run 100 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Generated 0 of 0 mixed pair_coeff terms from sixthpower/geometric mixing rule Neighbor list info ... - update every 1 steps, delay 10 steps, check yes + update: every = 1 steps, delay = 0 steps, check = yes max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 @@ -93,26 +96,26 @@ Neighbor list info ... pair build: half/bin/newton stencil: half/bin/3d bin: standard -WARNING: Inconsistent image flags (../domain.cpp:814) +WARNING: Inconsistent image flags (../domain.cpp:1051) Per MPI rank memory allocation (min/avg/max) = 28.69 | 28.69 | 28.69 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0 -14266.189 1466925.5 1452659.3 -29908.753 - 100 2155.9128 -17224.188 1306769.8 1452409 1985.2082 -Loop time of 4.13195 on 4 procs for 100 steps with 25344 atoms + Step Temp E_pair E_mol TotEng Press + 0 0 -14266.189 1466925.5 1452659.3 -29908.753 + 100 2155.9128 -17224.188 1306769.8 1452409 1985.2082 +Loop time of 1.3667 on 4 procs for 100 steps with 25344 atoms -Performance: 2.091 ns/day, 11.478 hours/ns, 24.202 timesteps/s -100.0% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 6.322 ns/day, 3.796 hours/ns, 73.169 timesteps/s, 1.854 Matom-step/s +99.8% CPU use with 4 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.99372 | 1.014 | 1.0672 | 3.1 | 24.54 -Bond | 2.9449 | 2.9795 | 3.0136 | 2.0 | 72.11 -Neigh | 0.026695 | 0.026706 | 0.026716 | 0.0 | 0.65 -Comm | 0.012404 | 0.099546 | 0.15425 | 18.7 | 2.41 -Output | 4.3822e-05 | 5.0693e-05 | 7.0516e-05 | 0.0 | 0.00 -Modify | 0.0074219 | 0.0074887 | 0.0075411 | 0.1 | 0.18 -Other | | 0.004616 | | | 0.11 +Pair | 0.43424 | 0.43539 | 0.43741 | 0.2 | 31.86 +Bond | 0.88613 | 0.89013 | 0.90094 | 0.7 | 65.13 +Neigh | 0.013198 | 0.013199 | 0.013201 | 0.0 | 0.97 +Comm | 0.010742 | 0.020522 | 0.02546 | 4.1 | 1.50 +Output | 3.2788e-05 | 3.6302e-05 | 4.4556e-05 | 0.0 | 0.00 +Modify | 0.0042029 | 0.0042366 | 0.004267 | 0.0 | 0.31 +Other | | 0.003188 | | | 0.23 Nlocal: 6336 ave 6336 max 6336 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -129,4 +132,4 @@ Dangerous builds = 0 # write_restart replicate.restart # write_data replicate.data -Total wall time: 0:00:04 +Total wall time: 0:00:01 diff --git a/src/replicate.cpp b/src/replicate.cpp index ca432b32a8..e232160842 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -12,6 +12,12 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Contributing authors: + Chris Knight (ANL) for bbox option + Jake Gissinger (Stevens Institute of Technology) for bond/periodic option +------------------------------------------------------------------------- */ + #include "replicate.h" #include "accelerator_kokkos.h" @@ -70,13 +76,24 @@ void Replicate::command(int narg, char **arg) utils::logmesg(lmp, "Replication is creating a {}x{}x{} = {} times larger system...\n", nx, ny, nz, nrep); - int bbox_flag = 0; - int bondlist_flag = 0; - if (narg == 4) { - if (strcmp(arg[3],"bbox") == 0) bbox_flag = 1; - if (strcmp(arg[3],"bondlist") == 0) bondlist_flag = 1; + // optional keywords + + bbox_flag = 0; + bond_flag = 0; + + int iarg = 3; + while (iarg < narg) { + if (strcmp(arg[iarg],"bbox") == 0) { + bbox_flag = 1; + iarg++; + } else if (strcmp(arg[iarg],"bond/periodic") == 0) { + bond_flag = 1; + iarg++; + } else error->all(FLERR,"Illegal replicate command"); } + if (bond_flag) bbox_flag = 1; + // error and warning checks if (nx <= 0 || ny <= 0 || nz <= 0) @@ -91,7 +108,7 @@ void Replicate::command(int narg, char **arg) } if (atom->nextra_grow || atom->nextra_restart || atom->nextra_store) - error->all(FLERR,"Cannot replicate with fixes that store atom quantities"); + error->all(FLERR,"Cannot replicate with fixes that store per-atom quantities"); // record wall time for atom replication @@ -110,24 +127,24 @@ void Replicate::command(int narg, char **arg) // maxmol = largest molecule tag across all existing atoms - tagint maxmol = 0; + maxmol = 0; if (atom->molecule_flag) { for (i = 0; i < atom->nlocal; i++) maxmol = MAX(atom->molecule[i],maxmol); tagint maxmol_all; MPI_Allreduce(&maxmol,&maxmol_all,1,MPI_LMP_TAGINT,MPI_MAX,world); maxmol = maxmol_all; } - - // reset image flags for bondlist option - if (bondlist_flag) + + // reset image flags to zero for bond/periodic option + + if (bond_flag) for (i=0; inlocal; ++i) atom->image[i] = ((imageint) IMGMAX << IMG2BITS) | ((imageint) IMGMAX << IMGBITS) | IMGMAX; - // check image flags maximum extent + // _imagelo/hi = maximum extent of image flags in each dimension // only efficient small image flags compared to new system - int _imagelo[3], _imagehi[3]; _imagelo[0] = 0; _imagelo[1] = 0; _imagelo[2] = 0; @@ -135,7 +152,7 @@ void Replicate::command(int narg, char **arg) _imagehi[1] = 0; _imagehi[2] = 0; - if (bbox_flag || bondlist_flag) { + if (bbox_flag || bond_flag) { for (i=0; inlocal; ++i) { imageint image = atom->image[i]; @@ -157,14 +174,14 @@ void Replicate::command(int narg, char **arg) } // unmap existing atoms via image flags + // no-op for bond/periodic option for (i = 0; i < atom->nlocal; i++) domain->unmap(atom->x[i],atom->image[i]); - + // communication buffer for all my atom's info // max_size = largest buffer needed by any proc - // must do before new Atom class created, - // since size_restart() uses atom->nlocal + // must do before new Atom class created, since size_restart() uses atom->nlocal int max_size; int send_size = atom->avec->size_restart(); @@ -177,7 +194,7 @@ void Replicate::command(int narg, char **arg) // atom = new replicated atom class // also set atomKK for Kokkos version of Atom class - Atom *old = atom; + old = atom; atomKK = nullptr; if (lmp->kokkos) atom = atomKK = new AtomKokkos(lmp); else atom = new Atom(lmp); @@ -216,7 +233,7 @@ void Replicate::command(int narg, char **arg) nrep*old->nimpropers < 0 || nrep*old->nimpropers >= MAXBIGINT) error->all(FLERR,"Replicated system is too big"); - // assign atom and topology counts in new class from old one + // assign atom and topology counts in new Atom class from old Atom class atom->natoms = old->natoms * nrep; atom->nbonds = old->nbonds * nrep; @@ -258,18 +275,18 @@ void Replicate::command(int narg, char **arg) // store old simulation box int triclinic = domain->triclinic; - double old_xprd = domain->xprd; - double old_yprd = domain->yprd; - double old_zprd = domain->zprd; + old_xprd = domain->xprd; + old_yprd = domain->yprd; + old_zprd = domain->zprd; for (i = 0; i < 3; i++) { old_prd_half[i] = domain->prd_half[i]; old_center[i] = 0.5*(domain->boxlo[i]+domain->boxhi[i]); } - double old_xy = domain->xy; - double old_xz = domain->xz; - double old_yz = domain->yz; + old_xy = domain->xy; + old_xz = domain->xz; + old_yz = domain->yz; - // setup new simulation box + // define new simulation box domain->boxhi[0] = domain->boxlo[0] + nx*old_xprd; domain->boxhi[1] = domain->boxlo[1] + ny*old_yprd; @@ -280,15 +297,14 @@ void Replicate::command(int narg, char **arg) domain->yz *= nz; } - // new problem setup using new box boundaries + // setup of new system using new atom counts and new box boundaries + // allocate atom arrays to size N, rounded up by AtomVec->DELTA if (nprocs == 1) n = static_cast (atom->natoms); else n = static_cast (LB_FACTOR * atom->natoms / nprocs); atom->allocate_type_arrays(); - // allocate atom arrays to size N, rounded up by AtomVec->DELTA - bigint nbig = n; nbig = atom->avec->roundup(nbig); n = static_cast (nbig); @@ -362,15 +378,23 @@ void Replicate::command(int narg, char **arg) } } - // loop over all procs - // if this iteration of loop is me: - // pack my unmapped atom data into buf - // bcast it to all other procs - // performs 3d replicate loop with while loop over atoms in buf - // x = new replicated position, remapped into simulation box - // unpack atom into new atom class from buf if I own it - // adjust tag, mol #, coord, topology info as needed + // use + if (!bbox_flag) { + replicate_by_proc(nx,ny,nz,sublo,subhi,buf); + } else { + replicate_by_bbox(nx,ny,nz,sublo,subhi,buf); + } + + + + + + + + + + /* AtomVec *old_avec = old->avec; AtomVec *avec = atom->avec; @@ -381,7 +405,7 @@ void Replicate::command(int narg, char **arg) double *coord; int tag_enable = atom->tag_enable; - if (bbox_flag || bondlist_flag) { + if (bbox_flag || bond_flag) { // allgather size of buf on each proc @@ -456,7 +480,7 @@ void Replicate::command(int narg, char **arg) // store x and tag for the whole system (before replication) - if (bondlist_flag) { + if (bond_flag) { memory->create(old_x,old->natoms,3,"replicate:old_x"); memory->create(old_tag,old->natoms,"replicate:old_tag"); @@ -668,13 +692,13 @@ void Replicate::command(int narg, char **arg) if (atom->molecular == Atom::MOLECULAR) { if (atom->avec->bonds_allow) for (j = 0; j < atom->num_bond[i]; j++) { - if (bondlist_flag) + if (bond_flag) newtag(atom0tag,atom->bond_atom[i][j]); else atom->bond_atom[i][j] += atom_offset; } if (atom->avec->angles_allow) for (j = 0; j < atom->num_angle[i]; j++) { - if (bondlist_flag) { + if (bond_flag) { newtag(atom0tag,atom->angle_atom1[i][j]); newtag(atom0tag,atom->angle_atom2[i][j]); newtag(atom0tag,atom->angle_atom3[i][j]); @@ -686,7 +710,7 @@ void Replicate::command(int narg, char **arg) } if (atom->avec->dihedrals_allow) for (j = 0; j < atom->num_dihedral[i]; j++) { - if (bondlist_flag) { + if (bond_flag) { newtag(atom0tag,atom->dihedral_atom1[i][j]); newtag(atom0tag,atom->dihedral_atom2[i][j]); newtag(atom0tag,atom->dihedral_atom3[i][j]); @@ -700,7 +724,7 @@ void Replicate::command(int narg, char **arg) } if (atom->avec->impropers_allow) for (j = 0; j < atom->num_improper[i]; j++) { - if (bondlist_flag) { + if (bond_flag) { newtag(atom0tag,atom->improper_atom1[i][j]); newtag(atom0tag,atom->improper_atom2[i][j]); newtag(atom0tag,atom->improper_atom3[i][j]); @@ -725,7 +749,7 @@ void Replicate::command(int narg, char **arg) memory->destroy(size_buf_rnk); memory->destroy(disp_buf_rnk); memory->destroy(buf_all); - if (bondlist_flag) { + if (bond_flag) { memory->destroy(old_x); memory->destroy(old_tag); } @@ -825,8 +849,14 @@ void Replicate::command(int narg, char **arg) } } } - } // if (bbox_flag || bondlist_flag) + } // if (bbox_flag || bond_flag) + */ + + + + + // free communication buffer and old atom class memory->destroy(buf); @@ -889,8 +919,511 @@ void Replicate::command(int narg, char **arg) } /* ---------------------------------------------------------------------- - find new tag for the atom 'atom2bond' bonded to atom 'atom0' - for bondlist option, useful for periodic loops or inconsistent image flags + simple replication algorithm, suitable for small proc count +------------------------------------------------------------------------- */ + +void Replicate::replicate_by_proc(int nx, int ny, int nz, + double *sublo, double *subhi, double *buf) +{ + int i,j,m,n; + int ix,iy,iz; + + int me = comm->me; + int nprocs = comm->nprocs; + int triclinic = domain->triclinic; + int tag_enable = atom->tag_enable; + + AtomVec *old_avec = old->avec; + AtomVec *avec = atom->avec; + + tagint atom_offset,mol_offset; + imageint image; + double x[3],lamda[3]; + double *coord; + + // loop over all procs + // if this iteration of loop is me: + // pack my unmapped atom data into buf + // bcast it to all other procs + + for (int iproc = 0; iproc < nprocs; iproc++) { + if (me == iproc) { + n = 0; + for (i = 0; i < old->nlocal; i++) n += old_avec->pack_restart(i,&buf[n]); + } + MPI_Bcast(&n,1,MPI_INT,iproc,world); + MPI_Bcast(buf,n,MPI_DOUBLE,iproc,world); + + for (ix = 0; ix < nx; ix++) { + for (iy = 0; iy < ny; iy++) { + for (iz = 0; iz < nz; iz++) { + + // while loop over one proc's atom list + // x = new replicated position, remapped into new simulation box + // if atom is within my new subdomain, unpack it into new atom class + // adjust tag, mol #, coord, topology info as needed + + m = 0; + while (m < n) { + image = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + if (triclinic == 0) { + x[0] = buf[m+1] + ix*old_xprd; + x[1] = buf[m+2] + iy*old_yprd; + x[2] = buf[m+3] + iz*old_zprd; + } else { + x[0] = buf[m+1] + ix*old_xprd + iy*old_xy + iz*old_xz; + x[1] = buf[m+2] + iy*old_yprd + iz*old_yz; + x[2] = buf[m+3] + iz*old_zprd; + } + domain->remap(x,image); + if (triclinic) { + domain->x2lamda(x,lamda); + coord = lamda; + } else coord = x; + + if (coord[0] >= sublo[0] && coord[0] < subhi[0] && + coord[1] >= sublo[1] && coord[1] < subhi[1] && + coord[2] >= sublo[2] && coord[2] < subhi[2]) { + + m += avec->unpack_restart(&buf[m]); + + i = atom->nlocal - 1; + if (tag_enable) atom_offset = iz*ny*nx*maxtag + iy*nx*maxtag + ix*maxtag; + else atom_offset = 0; + mol_offset = iz*ny*nx*maxmol + iy*nx*maxmol + ix*maxmol; + + atom->x[i][0] = x[0]; + atom->x[i][1] = x[1]; + atom->x[i][2] = x[2]; + + atom->tag[i] += atom_offset; + atom->image[i] = image; + + if (atom->molecular != Atom::ATOMIC) { + if (atom->molecule[i] > 0) + atom->molecule[i] += mol_offset; + if (atom->molecular == Atom::MOLECULAR) { + if (atom->avec->bonds_allow) + for (j = 0; j < atom->num_bond[i]; j++) + atom->bond_atom[i][j] += atom_offset; + if (atom->avec->angles_allow) + for (j = 0; j < atom->num_angle[i]; j++) { + atom->angle_atom1[i][j] += atom_offset; + atom->angle_atom2[i][j] += atom_offset; + atom->angle_atom3[i][j] += atom_offset; + } + if (atom->avec->dihedrals_allow) + for (j = 0; j < atom->num_dihedral[i]; j++) { + atom->dihedral_atom1[i][j] += atom_offset; + atom->dihedral_atom2[i][j] += atom_offset; + atom->dihedral_atom3[i][j] += atom_offset; + atom->dihedral_atom4[i][j] += atom_offset; + } + if (atom->avec->impropers_allow) + for (j = 0; j < atom->num_improper[i]; j++) { + atom->improper_atom1[i][j] += atom_offset; + atom->improper_atom2[i][j] += atom_offset; + atom->improper_atom3[i][j] += atom_offset; + atom->improper_atom4[i][j] += atom_offset; + } + } + } + } else m += static_cast (buf[m]); + } + } + } + } + } +} + +/* ---------------------------------------------------------------------- + more complex replication algorithm + uses bounding box of each proc's subdomain to avoid checking individual atoms + faster for large processor counts + required for bond/periodic option +------------------------------------------------------------------------- */ + +void Replicate::replicate_by_bbox(int nx, int ny, int nz, + double *sublo, double *subhi, double *buf) +{ + int i,j,m,n; + int ix,iy,iz; + + int me = comm->me; + int nprocs = comm->nprocs; + int triclinic = domain->triclinic; + int tag_enable = atom->tag_enable; + + AtomVec *old_avec = old->avec; + AtomVec *avec = atom->avec; + + tagint atom_offset,mol_offset,atom0tag; + imageint image; + double x[3],lamda[3]; + double *coord; + + // allgather size of buf on each proc + + n = 0; + for (i = 0; i < old->nlocal; i++) n += old_avec->pack_restart(i,&buf[n]); + + int * size_buf_rnk; + memory->create(size_buf_rnk, nprocs, "replicate:size_buf_rnk"); + + MPI_Allgather(&n, 1, MPI_INT, size_buf_rnk, 1, MPI_INT, world); + + // size of buf_all + + int size_buf_all = 0; + MPI_Allreduce(&n, &size_buf_all, 1, MPI_INT, MPI_SUM, world); + + if (me == 0) { + auto mesg = fmt::format(" bounding box image = ({} {} {}) " + "to ({} {} {})\n", + _imagelo[0],_imagelo[1],_imagelo[2], + _imagehi[0],_imagehi[1],_imagehi[2]); + mesg += fmt::format(" bounding box extra memory = {:.2f} MB\n", + (double)size_buf_all*sizeof(double)/1024/1024); + utils::logmesg(lmp,mesg); + } + + // rnk offsets + + int *disp_buf_rnk; + memory->create(disp_buf_rnk, nprocs, "replicate:disp_buf_rnk"); + disp_buf_rnk[0] = 0; + for (i = 1; i < nprocs; i++) + disp_buf_rnk[i] = disp_buf_rnk[i-1] + size_buf_rnk[i-1]; + + // allgather buf_all + + double *buf_all; + memory->create(buf_all, size_buf_all, "replicate:buf_all"); + + MPI_Allgatherv(buf,n,MPI_DOUBLE,buf_all,size_buf_rnk,disp_buf_rnk, + MPI_DOUBLE,world); + + // bounding box of original unwrapped system + + double _orig_lo[3], _orig_hi[3]; + if (triclinic) { + _orig_lo[0] = domain->boxlo[0] + + _imagelo[0] * old_xprd + _imagelo[1] * old_xy + _imagelo[2] * old_xz; + _orig_lo[1] = domain->boxlo[1] + + _imagelo[1] * old_yprd + _imagelo[2] * old_yz; + _orig_lo[2] = domain->boxlo[2] + _imagelo[2] * old_zprd; + + _orig_hi[0] = domain->boxlo[0] + + (_imagehi[0]+1) * old_xprd + + (_imagehi[1]+1) * old_xy + (_imagehi[2]+1) * old_xz; + _orig_hi[1] = domain->boxlo[1] + + (_imagehi[1]+1) * old_yprd + (_imagehi[2]+1) * old_yz; + _orig_hi[2] = domain->boxlo[2] + (_imagehi[2]+1) * old_zprd; + } else { + _orig_lo[0] = domain->boxlo[0] + _imagelo[0] * old_xprd; + _orig_lo[1] = domain->boxlo[1] + _imagelo[1] * old_yprd; + _orig_lo[2] = domain->boxlo[2] + _imagelo[2] * old_zprd; + + _orig_hi[0] = domain->boxlo[0] + (_imagehi[0]+1) * old_xprd; + _orig_hi[1] = domain->boxlo[1] + (_imagehi[1]+1) * old_yprd; + _orig_hi[2] = domain->boxlo[2] + (_imagehi[2]+1) * old_zprd; + } + + double _lo[3], _hi[3]; + + int num_replicas_added = 0; + + // if bond/periodic option + // store old_x and old_tag for the entire original system + + if (bond_flag) { + memory->create(old_x,old->natoms,3,"replicate:old_x"); + memory->create(old_tag,old->natoms,"replicate:old_tag"); + + i = m = 0; + while (m < size_buf_all) { + old_x[i][0] = buf_all[m+1]; + old_x[i][1] = buf_all[m+2]; + old_x[i][2] = buf_all[m+3]; + old_tag[i] = (tagint) ubuf(buf_all[m+4]).i; + old_map.insert({old_tag[i],i}); + m += static_cast (buf_all[m]); + i++; + } + } + + // replication loop + + for (ix = 0; ix < nx; ix++) { + for (iy = 0; iy < ny; iy++) { + for (iz = 0; iz < nz; iz++) { + + thisrep[0] = ix; + thisrep[1] = iy; + thisrep[2] = iz; + + // domain->remap() overwrites coordinates, so always recompute here + + if (triclinic) { + _lo[0] = _orig_lo[0] + ix * old_xprd + iy * old_xy + iz * old_xz; + _hi[0] = _orig_hi[0] + ix * old_xprd + iy * old_xy + iz * old_xz; + + _lo[1] = _orig_lo[1] + iy * old_yprd + iz * old_yz; + _hi[1] = _orig_hi[1] + iy * old_yprd + iz * old_yz; + + _lo[2] = _orig_lo[2] + iz * old_zprd; + _hi[2] = _orig_hi[2] + iz * old_zprd; + } else { + _lo[0] = _orig_lo[0] + ix * old_xprd; + _hi[0] = _orig_hi[0] + ix * old_xprd; + + _lo[1] = _orig_lo[1] + iy * old_yprd; + _hi[1] = _orig_hi[1] + iy * old_yprd; + + _lo[2] = _orig_lo[2] + iz * old_zprd; + _hi[2] = _orig_hi[2] + iz * old_zprd; + } + + // test if bounding box of shifted replica overlaps sub-domain of proc + // if not, then can skip testing of any individual atoms + + int xoverlap = 1; + int yoverlap = 1; + int zoverlap = 1; + if (triclinic) { + double _llo[3]; + domain->x2lamda(_lo,_llo); + double _lhi[3]; + domain->x2lamda(_hi,_lhi); + + if (_llo[0] > (subhi[0] - EPSILON) + || _lhi[0] < (sublo[0] + EPSILON) ) xoverlap = 0; + if (_llo[1] > (subhi[1] - EPSILON) + || _lhi[1] < (sublo[1] + EPSILON) ) yoverlap = 0; + if (_llo[2] > (subhi[2] - EPSILON) + || _lhi[2] < (sublo[2] + EPSILON) ) zoverlap = 0; + } else { + if (_lo[0] > (subhi[0] - EPSILON) + || _hi[0] < (sublo[0] + EPSILON) ) xoverlap = 0; + if (_lo[1] > (subhi[1] - EPSILON) + || _hi[1] < (sublo[1] + EPSILON) ) yoverlap = 0; + if (_lo[2] > (subhi[2] - EPSILON) + || _hi[2] < (sublo[2] + EPSILON) ) zoverlap = 0; + } + + int overlap = 0; + if (xoverlap && yoverlap && zoverlap) overlap = 1; + + // if no overlap, test if bounding box wrapped back into new system + + if (!overlap) { + + // wrap back into cell + + imageint imagelo = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + domain->remap(&(_lo[0]), imagelo); + int xboxlo = (imagelo & IMGMASK) - IMGMAX; + int yboxlo = (imagelo >> IMGBITS & IMGMASK) - IMGMAX; + int zboxlo = (imagelo >> IMG2BITS) - IMGMAX; + + imageint imagehi = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + domain->remap(&(_hi[0]), imagehi); + int xboxhi = (imagehi & IMGMASK) - IMGMAX; + int yboxhi = (imagehi >> IMGBITS & IMGMASK) - IMGMAX; + int zboxhi = (imagehi >> IMG2BITS) - IMGMAX; + + if (triclinic) { + double _llo[3]; + _llo[0] = _lo[0]; _llo[1] = _lo[1]; _llo[2] = _lo[2]; + domain->x2lamda(_llo,_lo); + + double _lhi[3]; + _lhi[0] = _hi[0]; _lhi[1] = _hi[1]; _lhi[2] = _hi[2]; + domain->x2lamda(_lhi,_hi); + } + + // test all fragments for any overlap; ok to include false positives + + int _xoverlap1 = 0; + int _xoverlap2 = 0; + if (!xoverlap) { + if (xboxlo < 0) { + _xoverlap1 = 1; + if (_lo[0] > (subhi[0] - EPSILON)) _xoverlap1 = 0; + } + + if (xboxhi > 0) { + _xoverlap2 = 1; + if (_hi[0] < (sublo[0] + EPSILON)) _xoverlap2 = 0; + } + + if (_xoverlap1 || _xoverlap2) xoverlap = 1; + } + + int _yoverlap1 = 0; + int _yoverlap2 = 0; + if (!yoverlap) { + if (yboxlo < 0) { + _yoverlap1 = 1; + if (_lo[1] > (subhi[1] - EPSILON)) _yoverlap1 = 0; + } + + if (yboxhi > 0) { + _yoverlap2 = 1; + if (_hi[1] < (sublo[1] + EPSILON)) _yoverlap2 = 0; + } + + if (_yoverlap1 || _yoverlap2) yoverlap = 1; + } + + + int _zoverlap1 = 0; + int _zoverlap2 = 0; + if (!zoverlap) { + if (zboxlo < 0) { + _zoverlap1 = 1; + if (_lo[2] > (subhi[2] - EPSILON)) _zoverlap1 = 0; + } + + if (zboxhi > 0) { + _zoverlap2 = 1; + if (_hi[2] < (sublo[2] + EPSILON)) _zoverlap2 = 0; + } + + if (_zoverlap1 || _zoverlap2) zoverlap = 1; + } + + // does either fragment overlap w/ sub-domain + + if (xoverlap && yoverlap && zoverlap) overlap = 1; + } + + // while loop over one proc's atom list + + if (overlap) { + num_replicas_added++; + + m = 0; + while (m < size_buf_all) { + image = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + if (triclinic == 0) { + x[0] = buf_all[m+1] + ix*old_xprd; + x[1] = buf_all[m+2] + iy*old_yprd; + x[2] = buf_all[m+3] + iz*old_zprd; + } else { + x[0] = buf_all[m+1] + ix*old_xprd + iy*old_xy + iz*old_xz; + x[1] = buf_all[m+2] + iy*old_yprd + iz*old_yz; + x[2] = buf_all[m+3] + iz*old_zprd; + } + domain->remap(x,image); + if (triclinic) { + domain->x2lamda(x,lamda); + coord = lamda; + } else coord = x; + + if (coord[0] >= sublo[0] && coord[0] < subhi[0] && + coord[1] >= sublo[1] && coord[1] < subhi[1] && + coord[2] >= sublo[2] && coord[2] < subhi[2]) { + + m += avec->unpack_restart(&buf_all[m]); + + i = atom->nlocal - 1; + if (tag_enable) + atom_offset = iz*ny*nx*maxtag + iy*nx*maxtag + ix*maxtag; + else atom_offset = 0; + mol_offset = iz*ny*nx*maxmol + iy*nx*maxmol + ix*maxmol; + + atom->x[i][0] = x[0]; + atom->x[i][1] = x[1]; + atom->x[i][2] = x[2]; + + atom0tag = atom->tag[i]; + atom->tag[i] += atom_offset; + atom->image[i] = image; + + if (atom->molecular != Atom::ATOMIC) { + if (atom->molecule[i] > 0) + atom->molecule[i] += mol_offset; + if (atom->molecular == Atom::MOLECULAR) { + if (atom->avec->bonds_allow) + for (j = 0; j < atom->num_bond[i]; j++) { + if (bond_flag) + newtag(atom0tag,atom->bond_atom[i][j]); + else atom->bond_atom[i][j] += atom_offset; + } + if (atom->avec->angles_allow) + for (j = 0; j < atom->num_angle[i]; j++) { + if (bond_flag) { + newtag(atom0tag,atom->angle_atom1[i][j]); + newtag(atom0tag,atom->angle_atom2[i][j]); + newtag(atom0tag,atom->angle_atom3[i][j]); + } else { + atom->angle_atom1[i][j] += atom_offset; + atom->angle_atom2[i][j] += atom_offset; + atom->angle_atom3[i][j] += atom_offset; + } + } + if (atom->avec->dihedrals_allow) + for (j = 0; j < atom->num_dihedral[i]; j++) { + if (bond_flag) { + newtag(atom0tag,atom->dihedral_atom1[i][j]); + newtag(atom0tag,atom->dihedral_atom2[i][j]); + newtag(atom0tag,atom->dihedral_atom3[i][j]); + newtag(atom0tag,atom->dihedral_atom4[i][j]); + } else { + atom->dihedral_atom1[i][j] += atom_offset; + atom->dihedral_atom2[i][j] += atom_offset; + atom->dihedral_atom3[i][j] += atom_offset; + atom->dihedral_atom4[i][j] += atom_offset; + } + } + if (atom->avec->impropers_allow) + for (j = 0; j < atom->num_improper[i]; j++) { + if (bond_flag) { + newtag(atom0tag,atom->improper_atom1[i][j]); + newtag(atom0tag,atom->improper_atom2[i][j]); + newtag(atom0tag,atom->improper_atom3[i][j]); + newtag(atom0tag,atom->improper_atom4[i][j]); + } else { + atom->improper_atom1[i][j] += atom_offset; + atom->improper_atom2[i][j] += atom_offset; + atom->improper_atom3[i][j] += atom_offset; + atom->improper_atom4[i][j] += atom_offset; + } + } + } + } + } else m += static_cast (buf_all[m]); + } + } + } + } + } + + memory->destroy(size_buf_rnk); + memory->destroy(disp_buf_rnk); + memory->destroy(buf_all); + if (bond_flag) { + memory->destroy(old_x); + memory->destroy(old_tag); + } + + int sum = 0; + MPI_Reduce(&num_replicas_added, &sum, 1, MPI_INT, MPI_SUM, 0, world); + double avg = (double) sum / nprocs; + if (me == 0) + utils::logmesg(lmp," average # of replicas added to proc = {:.2f} out " + "of {} ({:.2f}%)\n",avg,nx*ny*nz,avg/(nx*ny*nz)*100.0); +} + +/* ---------------------------------------------------------------------- + find new tag for atom 'atom2bond' bonded to atom 'atom0' + for bond/periodic option + useful for periodic loops or inconsistent image flags reassign bond if > old boxlength / 2 ------------------------------------------------------------------------- */ diff --git a/src/replicate.h b/src/replicate.h index ae314d6a82..3877d2d720 100644 --- a/src/replicate.h +++ b/src/replicate.h @@ -31,13 +31,27 @@ class Replicate : public Command { Replicate(class LAMMPS *); void command(int, char **) override; - private: - std::unordered_map old_map; +private: + int bbox_flag, bond_flag; + + class Atom *old; + + double old_xprd, old_yprd, old_zprd; + double old_xy, old_xz, old_yz; + + int _imagelo[3], _imagehi[3]; + double **old_x; double old_prd_half[3], old_center[3]; tagint *old_tag; - tagint maxtag; + tagint maxtag, maxmol; int thisrep[3], allnrep[3]; + + std::unordered_map old_map; + + void replicate_by_proc(int, int, int, double *, double *, double *); + void replicate_by_bbox(int, int, int, double *, double *, double *); + void newtag(tagint, tagint &); }; From 1c11de8a64e42df23defad9041e372c9f8daa847 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 6 May 2024 16:47:38 -0600 Subject: [PATCH 80/91] comment tweak --- src/replicate.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/replicate.cpp b/src/replicate.cpp index e232160842..3b6704f734 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -920,6 +920,8 @@ void Replicate::command(int narg, char **arg) /* ---------------------------------------------------------------------- simple replication algorithm, suitable for small proc count + loop over procs, then over replication factors + check each atom to see if in my subdomain ------------------------------------------------------------------------- */ void Replicate::replicate_by_proc(int nx, int ny, int nz, From 3028b6f34c9db9e0345cc62237da01bec7f856e7 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 6 May 2024 19:16:06 -0600 Subject: [PATCH 81/91] clean up of docs and code --- doc/src/replicate.rst | 20 +- examples/replicate/README | 9 + src/replicate.cpp | 621 +++++--------------------------------- src/replicate.h | 4 +- 4 files changed, 96 insertions(+), 558 deletions(-) diff --git a/doc/src/replicate.rst b/doc/src/replicate.rst index 64d87e525a..eb62fbfa21 100644 --- a/doc/src/replicate.rst +++ b/doc/src/replicate.rst @@ -8,7 +8,7 @@ Syntax .. code-block:: LAMMPS - replicate nx ny nz *keyword* ... + replicate nx ny nz keyword ... nx,ny,nz = replication factors in each dimension @@ -17,8 +17,8 @@ nx,ny,nz = replication factors in each dimension .. parsed-literal:: - *bbox* = only check atoms in replicas that overlap with a processor's subdomain - *bond/periodic* = use a different algorithm that correctly replicates periodic bond loops + *bbox* = use a bounding-box algorithm which is faster for large proc counts + *bond/periodic* = use an algorithm that correctly replicates periodic bond loops Examples """""""" @@ -56,7 +56,7 @@ are created between pairs of new atoms as well as between old and new atoms. .. note:: - + The bond discussion which follows only refers to models with permanent covalent bonds typically defined in LAMMPS via a data file. It is not relevant to sytems modeled with many-body @@ -83,7 +83,7 @@ atoms and uses a different algorithm to find new (nearby) bond neighbors in the replicated system. In the final replicated system all image flags are zero (in each dimension). --- note: +.. note:: LAMMPS does not check for image flag consistency before performing the replication (it does issue a warning about this before a @@ -92,13 +92,13 @@ all image flags are zero (in each dimension). will otherwise be correctly replicated. This is NOT the case if there is a periodic bond loop. See the next note. --- note: +.. note:: LAMMPS does not check for periodic bond loops. If you use the - *bond/periodic* option for a system without periodic bond loops, + *bond/periodic* keyword for a system without periodic bond loops, the system will be correctly replicated, but image flag information will be lost (which may or may not be important to your model). If - you do not use the *bond/periodic* option for a system with + you do not use the *bond/periodic* keyword for a system with periodic bond loops, the replicated system will have invalid bonds (typically very long), resulting in bad dynamics. @@ -112,7 +112,7 @@ requires a temporary use of more memory. Each processor must be able to store all atoms (and their per-atom data) in the original system, before it is replicated. --- note: +.. note:: The algorithm used by the *bond/periodic* keyword builds on the algorithm used by the *bbox* keyword and thus has the same memory @@ -121,7 +121,7 @@ before it is replicated. ---------- - Restrictions +Restrictions """""""""""" A 2d simulation cannot be replicated in the z dimension. diff --git a/examples/replicate/README b/examples/replicate/README index 1363158b37..e33739672c 100644 --- a/examples/replicate/README +++ b/examples/replicate/README @@ -7,6 +7,8 @@ cross the periodic boundary to close the loop. To run these scripts, LAMMPS should be built with the MOLECULE and CLASS2 packages. The latter is only needed for the CNT example. +-------- + These scripts are tiny examples which illustrate both kinds of systems. Each produces a series of images which can be visualized. If the 3 lines for a dump movie command are uncommented, a MPG movie @@ -17,6 +19,13 @@ in.replcate.bond.x.y # 2d grid of bonded atoms, bond loops in x and y in.replicate.bond.xy # linear chains in diagonal direction, bond loop in x and y in.replicate.bond.noloop # linear chains in x direction, no bond loop +If you do not use the bond/periodic keyword with the replicate command +in the first 3 of these scripts (which have periodic bond loops), and +visualize the dynamics of hee simulation, you will see how the +replication creates a bogus system. + +-------- + This script is for a complex system of 3 orthogonal CNTs which has periodic bond loops in all 3 dimensions xyz. diff --git a/src/replicate.cpp b/src/replicate.cpp index 3b6704f734..e07c7d9a26 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -13,7 +13,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: + Contributing authors: Chris Knight (ANL) for bbox option Jake Gissinger (Stevens Institute of Technology) for bond/periodic option ------------------------------------------------------------------------- */ @@ -77,7 +77,7 @@ void Replicate::command(int narg, char **arg) nx, ny, nz, nrep); // optional keywords - + bbox_flag = 0; bond_flag = 0; @@ -134,9 +134,9 @@ void Replicate::command(int narg, char **arg) MPI_Allreduce(&maxmol,&maxmol_all,1,MPI_LMP_TAGINT,MPI_MAX,world); maxmol = maxmol_all; } - + // reset image flags to zero for bond/periodic option - + if (bond_flag) for (i=0; inlocal; ++i) atom->image[i] = ((imageint) IMGMAX << IMG2BITS) | @@ -178,7 +178,7 @@ void Replicate::command(int narg, char **arg) for (i = 0; i < atom->nlocal; i++) domain->unmap(atom->x[i],atom->image[i]); - + // communication buffer for all my atom's info // max_size = largest buffer needed by any proc // must do before new Atom class created, since size_restart() uses atom->nlocal @@ -378,485 +378,14 @@ void Replicate::command(int narg, char **arg) } } - // use + // use one of two algorithms for replication if (!bbox_flag) { replicate_by_proc(nx,ny,nz,sublo,subhi,buf); } else { replicate_by_bbox(nx,ny,nz,sublo,subhi,buf); } - - - - - - - - - /* - AtomVec *old_avec = old->avec; - AtomVec *avec = atom->avec; - - int ix,iy,iz; - tagint atom_offset,mol_offset,atom0tag; - imageint image; - double x[3],lamda[3]; - double *coord; - int tag_enable = atom->tag_enable; - - if (bbox_flag || bond_flag) { - - // allgather size of buf on each proc - - n = 0; - for (i = 0; i < old->nlocal; i++) n += old_avec->pack_restart(i,&buf[n]); - - int * size_buf_rnk; - memory->create(size_buf_rnk, nprocs, "replicate:size_buf_rnk"); - - MPI_Allgather(&n, 1, MPI_INT, size_buf_rnk, 1, MPI_INT, world); - - // size of buf_all - - int size_buf_all = 0; - MPI_Allreduce(&n, &size_buf_all, 1, MPI_INT, MPI_SUM, world); - - if (me == 0) { - auto mesg = fmt::format(" bounding box image = ({} {} {}) " - "to ({} {} {})\n", - _imagelo[0],_imagelo[1],_imagelo[2], - _imagehi[0],_imagehi[1],_imagehi[2]); - mesg += fmt::format(" bounding box extra memory = {:.2f} MB\n", - (double)size_buf_all*sizeof(double)/1024/1024); - utils::logmesg(lmp,mesg); - } - - // rnk offsets - - int *disp_buf_rnk; - memory->create(disp_buf_rnk, nprocs, "replicate:disp_buf_rnk"); - disp_buf_rnk[0] = 0; - for (i = 1; i < nprocs; i++) - disp_buf_rnk[i] = disp_buf_rnk[i-1] + size_buf_rnk[i-1]; - - // allgather buf_all - - double * buf_all; - memory->create(buf_all, size_buf_all, "replicate:buf_all"); - - MPI_Allgatherv(buf,n,MPI_DOUBLE,buf_all,size_buf_rnk,disp_buf_rnk, - MPI_DOUBLE,world); - - // bounding box of original unwrapped system - - double _orig_lo[3], _orig_hi[3]; - if (triclinic) { - _orig_lo[0] = domain->boxlo[0] + - _imagelo[0] * old_xprd + _imagelo[1] * old_xy + _imagelo[2] * old_xz; - _orig_lo[1] = domain->boxlo[1] + - _imagelo[1] * old_yprd + _imagelo[2] * old_yz; - _orig_lo[2] = domain->boxlo[2] + _imagelo[2] * old_zprd; - - _orig_hi[0] = domain->boxlo[0] + - (_imagehi[0]+1) * old_xprd + - (_imagehi[1]+1) * old_xy + (_imagehi[2]+1) * old_xz; - _orig_hi[1] = domain->boxlo[1] + - (_imagehi[1]+1) * old_yprd + (_imagehi[2]+1) * old_yz; - _orig_hi[2] = domain->boxlo[2] + (_imagehi[2]+1) * old_zprd; - } else { - _orig_lo[0] = domain->boxlo[0] + _imagelo[0] * old_xprd; - _orig_lo[1] = domain->boxlo[1] + _imagelo[1] * old_yprd; - _orig_lo[2] = domain->boxlo[2] + _imagelo[2] * old_zprd; - - _orig_hi[0] = domain->boxlo[0] + (_imagehi[0]+1) * old_xprd; - _orig_hi[1] = domain->boxlo[1] + (_imagehi[1]+1) * old_yprd; - _orig_hi[2] = domain->boxlo[2] + (_imagehi[2]+1) * old_zprd; - } - - double _lo[3], _hi[3]; - - int num_replicas_added = 0; - - // store x and tag for the whole system (before replication) - - if (bond_flag) { - memory->create(old_x,old->natoms,3,"replicate:old_x"); - memory->create(old_tag,old->natoms,"replicate:old_tag"); - - i = m = 0; - while (m < size_buf_all) { - old_x[i][0] = buf_all[m+1]; - old_x[i][1] = buf_all[m+2]; - old_x[i][2] = buf_all[m+3]; - old_tag[i] = (tagint) ubuf(buf_all[m+4]).i; - old_map.insert({old_tag[i],i}); - m += static_cast (buf_all[m]); - i++; - } - } - - for (ix = 0; ix < nx; ix++) { - for (iy = 0; iy < ny; iy++) { - for (iz = 0; iz < nz; iz++) { - - thisrep[0] = ix; - thisrep[1] = iy; - thisrep[2] = iz; - - // domain->remap() overwrites coordinates, so always recompute here - - if (triclinic) { - _lo[0] = _orig_lo[0] + ix * old_xprd + iy * old_xy + iz * old_xz; - _hi[0] = _orig_hi[0] + ix * old_xprd + iy * old_xy + iz * old_xz; - - _lo[1] = _orig_lo[1] + iy * old_yprd + iz * old_yz; - _hi[1] = _orig_hi[1] + iy * old_yprd + iz * old_yz; - - _lo[2] = _orig_lo[2] + iz * old_zprd; - _hi[2] = _orig_hi[2] + iz * old_zprd; - } else { - _lo[0] = _orig_lo[0] + ix * old_xprd; - _hi[0] = _orig_hi[0] + ix * old_xprd; - - _lo[1] = _orig_lo[1] + iy * old_yprd; - _hi[1] = _orig_hi[1] + iy * old_yprd; - - _lo[2] = _orig_lo[2] + iz * old_zprd; - _hi[2] = _orig_hi[2] + iz * old_zprd; - } - - // test if bounding box of shifted replica overlaps sub-domain of proc - // if not, then skip testing atoms - - int xoverlap = 1; - int yoverlap = 1; - int zoverlap = 1; - if (triclinic) { - double _llo[3]; - domain->x2lamda(_lo,_llo); - double _lhi[3]; - domain->x2lamda(_hi,_lhi); - - if (_llo[0] > (subhi[0] - EPSILON) - || _lhi[0] < (sublo[0] + EPSILON) ) xoverlap = 0; - if (_llo[1] > (subhi[1] - EPSILON) - || _lhi[1] < (sublo[1] + EPSILON) ) yoverlap = 0; - if (_llo[2] > (subhi[2] - EPSILON) - || _lhi[2] < (sublo[2] + EPSILON) ) zoverlap = 0; - } else { - if (_lo[0] > (subhi[0] - EPSILON) - || _hi[0] < (sublo[0] + EPSILON) ) xoverlap = 0; - if (_lo[1] > (subhi[1] - EPSILON) - || _hi[1] < (sublo[1] + EPSILON) ) yoverlap = 0; - if (_lo[2] > (subhi[2] - EPSILON) - || _hi[2] < (sublo[2] + EPSILON) ) zoverlap = 0; - } - - int overlap = 0; - if (xoverlap && yoverlap && zoverlap) overlap = 1; - - // if no overlap, test if bounding box wrapped back into new system - - if (!overlap) { - - // wrap back into cell - - imageint imagelo = ((imageint) IMGMAX << IMG2BITS) | - ((imageint) IMGMAX << IMGBITS) | IMGMAX; - domain->remap(&(_lo[0]), imagelo); - int xboxlo = (imagelo & IMGMASK) - IMGMAX; - int yboxlo = (imagelo >> IMGBITS & IMGMASK) - IMGMAX; - int zboxlo = (imagelo >> IMG2BITS) - IMGMAX; - - imageint imagehi = ((imageint) IMGMAX << IMG2BITS) | - ((imageint) IMGMAX << IMGBITS) | IMGMAX; - domain->remap(&(_hi[0]), imagehi); - int xboxhi = (imagehi & IMGMASK) - IMGMAX; - int yboxhi = (imagehi >> IMGBITS & IMGMASK) - IMGMAX; - int zboxhi = (imagehi >> IMG2BITS) - IMGMAX; - - if (triclinic) { - double _llo[3]; - _llo[0] = _lo[0]; _llo[1] = _lo[1]; _llo[2] = _lo[2]; - domain->x2lamda(_llo,_lo); - - double _lhi[3]; - _lhi[0] = _hi[0]; _lhi[1] = _hi[1]; _lhi[2] = _hi[2]; - domain->x2lamda(_lhi,_hi); - } - - // test all fragments for any overlap; ok to include false positives - - int _xoverlap1 = 0; - int _xoverlap2 = 0; - if (!xoverlap) { - if (xboxlo < 0) { - _xoverlap1 = 1; - if (_lo[0] > (subhi[0] - EPSILON)) _xoverlap1 = 0; - } - - if (xboxhi > 0) { - _xoverlap2 = 1; - if (_hi[0] < (sublo[0] + EPSILON)) _xoverlap2 = 0; - } - - if (_xoverlap1 || _xoverlap2) xoverlap = 1; - } - - int _yoverlap1 = 0; - int _yoverlap2 = 0; - if (!yoverlap) { - if (yboxlo < 0) { - _yoverlap1 = 1; - if (_lo[1] > (subhi[1] - EPSILON)) _yoverlap1 = 0; - } - - if (yboxhi > 0) { - _yoverlap2 = 1; - if (_hi[1] < (sublo[1] + EPSILON)) _yoverlap2 = 0; - } - - if (_yoverlap1 || _yoverlap2) yoverlap = 1; - } - - - int _zoverlap1 = 0; - int _zoverlap2 = 0; - if (!zoverlap) { - if (zboxlo < 0) { - _zoverlap1 = 1; - if (_lo[2] > (subhi[2] - EPSILON)) _zoverlap1 = 0; - } - - if (zboxhi > 0) { - _zoverlap2 = 1; - if (_hi[2] < (sublo[2] + EPSILON)) _zoverlap2 = 0; - } - - if (_zoverlap1 || _zoverlap2) zoverlap = 1; - } - - // does either fragment overlap w/ sub-domain - - if (xoverlap && yoverlap && zoverlap) overlap = 1; - } - - // while loop over one proc's atom list - - if (overlap) { - num_replicas_added++; - - m = 0; - while (m < size_buf_all) { - image = ((imageint) IMGMAX << IMG2BITS) | - ((imageint) IMGMAX << IMGBITS) | IMGMAX; - if (triclinic == 0) { - x[0] = buf_all[m+1] + ix*old_xprd; - x[1] = buf_all[m+2] + iy*old_yprd; - x[2] = buf_all[m+3] + iz*old_zprd; - } else { - x[0] = buf_all[m+1] + ix*old_xprd + iy*old_xy + iz*old_xz; - x[1] = buf_all[m+2] + iy*old_yprd + iz*old_yz; - x[2] = buf_all[m+3] + iz*old_zprd; - } - domain->remap(x,image); - if (triclinic) { - domain->x2lamda(x,lamda); - coord = lamda; - } else coord = x; - - if (coord[0] >= sublo[0] && coord[0] < subhi[0] && - coord[1] >= sublo[1] && coord[1] < subhi[1] && - coord[2] >= sublo[2] && coord[2] < subhi[2]) { - - m += avec->unpack_restart(&buf_all[m]); - - i = atom->nlocal - 1; - if (tag_enable) - atom_offset = iz*ny*nx*maxtag + iy*nx*maxtag + ix*maxtag; - else atom_offset = 0; - mol_offset = iz*ny*nx*maxmol + iy*nx*maxmol + ix*maxmol; - - atom->x[i][0] = x[0]; - atom->x[i][1] = x[1]; - atom->x[i][2] = x[2]; - - atom0tag = atom->tag[i]; - atom->tag[i] += atom_offset; - atom->image[i] = image; - - if (atom->molecular != Atom::ATOMIC) { - if (atom->molecule[i] > 0) - atom->molecule[i] += mol_offset; - if (atom->molecular == Atom::MOLECULAR) { - if (atom->avec->bonds_allow) - for (j = 0; j < atom->num_bond[i]; j++) { - if (bond_flag) - newtag(atom0tag,atom->bond_atom[i][j]); - else atom->bond_atom[i][j] += atom_offset; - } - if (atom->avec->angles_allow) - for (j = 0; j < atom->num_angle[i]; j++) { - if (bond_flag) { - newtag(atom0tag,atom->angle_atom1[i][j]); - newtag(atom0tag,atom->angle_atom2[i][j]); - newtag(atom0tag,atom->angle_atom3[i][j]); - } else { - atom->angle_atom1[i][j] += atom_offset; - atom->angle_atom2[i][j] += atom_offset; - atom->angle_atom3[i][j] += atom_offset; - } - } - if (atom->avec->dihedrals_allow) - for (j = 0; j < atom->num_dihedral[i]; j++) { - if (bond_flag) { - newtag(atom0tag,atom->dihedral_atom1[i][j]); - newtag(atom0tag,atom->dihedral_atom2[i][j]); - newtag(atom0tag,atom->dihedral_atom3[i][j]); - newtag(atom0tag,atom->dihedral_atom4[i][j]); - } else { - atom->dihedral_atom1[i][j] += atom_offset; - atom->dihedral_atom2[i][j] += atom_offset; - atom->dihedral_atom3[i][j] += atom_offset; - atom->dihedral_atom4[i][j] += atom_offset; - } - } - if (atom->avec->impropers_allow) - for (j = 0; j < atom->num_improper[i]; j++) { - if (bond_flag) { - newtag(atom0tag,atom->improper_atom1[i][j]); - newtag(atom0tag,atom->improper_atom2[i][j]); - newtag(atom0tag,atom->improper_atom3[i][j]); - newtag(atom0tag,atom->improper_atom4[i][j]); - } else { - atom->improper_atom1[i][j] += atom_offset; - atom->improper_atom2[i][j] += atom_offset; - atom->improper_atom3[i][j] += atom_offset; - atom->improper_atom4[i][j] += atom_offset; - } - } - } - } - } else m += static_cast (buf_all[m]); - } - } // if (overlap) - - } - } - } - - memory->destroy(size_buf_rnk); - memory->destroy(disp_buf_rnk); - memory->destroy(buf_all); - if (bond_flag) { - memory->destroy(old_x); - memory->destroy(old_tag); - } - - int sum = 0; - MPI_Reduce(&num_replicas_added, &sum, 1, MPI_INT, MPI_SUM, 0, world); - double avg = (double) sum / nprocs; - if (me == 0) - utils::logmesg(lmp," average # of replicas added to proc = {:.2f} out " - "of {} ({:.2f}%)\n",avg,nx*ny*nz,avg/(nx*ny*nz)*100.0); - } else { - - for (int iproc = 0; iproc < nprocs; iproc++) { - if (me == iproc) { - n = 0; - for (i = 0; i < old->nlocal; i++) n += old_avec->pack_restart(i,&buf[n]); - } - MPI_Bcast(&n,1,MPI_INT,iproc,world); - MPI_Bcast(buf,n,MPI_DOUBLE,iproc,world); - - for (ix = 0; ix < nx; ix++) { - for (iy = 0; iy < ny; iy++) { - for (iz = 0; iz < nz; iz++) { - - // while loop over one proc's atom list - - m = 0; - while (m < n) { - image = ((imageint) IMGMAX << IMG2BITS) | - ((imageint) IMGMAX << IMGBITS) | IMGMAX; - if (triclinic == 0) { - x[0] = buf[m+1] + ix*old_xprd; - x[1] = buf[m+2] + iy*old_yprd; - x[2] = buf[m+3] + iz*old_zprd; - } else { - x[0] = buf[m+1] + ix*old_xprd + iy*old_xy + iz*old_xz; - x[1] = buf[m+2] + iy*old_yprd + iz*old_yz; - x[2] = buf[m+3] + iz*old_zprd; - } - domain->remap(x,image); - if (triclinic) { - domain->x2lamda(x,lamda); - coord = lamda; - } else coord = x; - - if (coord[0] >= sublo[0] && coord[0] < subhi[0] && - coord[1] >= sublo[1] && coord[1] < subhi[1] && - coord[2] >= sublo[2] && coord[2] < subhi[2]) { - - m += avec->unpack_restart(&buf[m]); - - i = atom->nlocal - 1; - if (tag_enable) - atom_offset = iz*ny*nx*maxtag + iy*nx*maxtag + ix*maxtag; - else atom_offset = 0; - mol_offset = iz*ny*nx*maxmol + iy*nx*maxmol + ix*maxmol; - - atom->x[i][0] = x[0]; - atom->x[i][1] = x[1]; - atom->x[i][2] = x[2]; - - atom->tag[i] += atom_offset; - atom->image[i] = image; - - if (atom->molecular != Atom::ATOMIC) { - if (atom->molecule[i] > 0) - atom->molecule[i] += mol_offset; - if (atom->molecular == Atom::MOLECULAR) { - if (atom->avec->bonds_allow) - for (j = 0; j < atom->num_bond[i]; j++) - atom->bond_atom[i][j] += atom_offset; - if (atom->avec->angles_allow) - for (j = 0; j < atom->num_angle[i]; j++) { - atom->angle_atom1[i][j] += atom_offset; - atom->angle_atom2[i][j] += atom_offset; - atom->angle_atom3[i][j] += atom_offset; - } - if (atom->avec->dihedrals_allow) - for (j = 0; j < atom->num_dihedral[i]; j++) { - atom->dihedral_atom1[i][j] += atom_offset; - atom->dihedral_atom2[i][j] += atom_offset; - atom->dihedral_atom3[i][j] += atom_offset; - atom->dihedral_atom4[i][j] += atom_offset; - } - if (atom->avec->impropers_allow) - for (j = 0; j < atom->num_improper[i]; j++) { - atom->improper_atom1[i][j] += atom_offset; - atom->improper_atom2[i][j] += atom_offset; - atom->improper_atom3[i][j] += atom_offset; - atom->improper_atom4[i][j] += atom_offset; - } - } - } - } else m += static_cast (buf[m]); - } - } - } - } - } - } // if (bbox_flag || bond_flag) - - */ - - - - - // free communication buffer and old atom class memory->destroy(buf); @@ -955,16 +484,16 @@ void Replicate::replicate_by_proc(int nx, int ny, int nz, } MPI_Bcast(&n,1,MPI_INT,iproc,world); MPI_Bcast(buf,n,MPI_DOUBLE,iproc,world); - + for (ix = 0; ix < nx; ix++) { for (iy = 0; iy < ny; iy++) { for (iz = 0; iz < nz; iz++) { - + // while loop over one proc's atom list // x = new replicated position, remapped into new simulation box // if atom is within my new subdomain, unpack it into new atom class // adjust tag, mol #, coord, topology info as needed - + m = 0; while (m < n) { image = ((imageint) IMGMAX << IMG2BITS) | @@ -983,25 +512,25 @@ void Replicate::replicate_by_proc(int nx, int ny, int nz, domain->x2lamda(x,lamda); coord = lamda; } else coord = x; - + if (coord[0] >= sublo[0] && coord[0] < subhi[0] && coord[1] >= sublo[1] && coord[1] < subhi[1] && coord[2] >= sublo[2] && coord[2] < subhi[2]) { - + m += avec->unpack_restart(&buf[m]); - + i = atom->nlocal - 1; if (tag_enable) atom_offset = iz*ny*nx*maxtag + iy*nx*maxtag + ix*maxtag; else atom_offset = 0; mol_offset = iz*ny*nx*maxmol + iy*nx*maxmol + ix*maxmol; - + atom->x[i][0] = x[0]; atom->x[i][1] = x[1]; atom->x[i][2] = x[2]; - + atom->tag[i] += atom_offset; atom->image[i] = image; - + if (atom->molecular != Atom::ATOMIC) { if (atom->molecule[i] > 0) atom->molecule[i] += mol_offset; @@ -1072,14 +601,14 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, int * size_buf_rnk; memory->create(size_buf_rnk, nprocs, "replicate:size_buf_rnk"); - + MPI_Allgather(&n, 1, MPI_INT, size_buf_rnk, 1, MPI_INT, world); // size of buf_all - + int size_buf_all = 0; MPI_Allreduce(&n, &size_buf_all, 1, MPI_INT, MPI_SUM, world); - + if (me == 0) { auto mesg = fmt::format(" bounding box image = ({} {} {}) " "to ({} {} {})\n", @@ -1089,25 +618,25 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, (double)size_buf_all*sizeof(double)/1024/1024); utils::logmesg(lmp,mesg); } - + // rnk offsets - + int *disp_buf_rnk; memory->create(disp_buf_rnk, nprocs, "replicate:disp_buf_rnk"); disp_buf_rnk[0] = 0; for (i = 1; i < nprocs; i++) disp_buf_rnk[i] = disp_buf_rnk[i-1] + size_buf_rnk[i-1]; - + // allgather buf_all - + double *buf_all; memory->create(buf_all, size_buf_all, "replicate:buf_all"); - + MPI_Allgatherv(buf,n,MPI_DOUBLE,buf_all,size_buf_rnk,disp_buf_rnk, MPI_DOUBLE,world); - + // bounding box of original unwrapped system - + double _orig_lo[3], _orig_hi[3]; if (triclinic) { _orig_lo[0] = domain->boxlo[0] + @@ -1115,7 +644,7 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, _orig_lo[1] = domain->boxlo[1] + _imagelo[1] * old_yprd + _imagelo[2] * old_yz; _orig_lo[2] = domain->boxlo[2] + _imagelo[2] * old_zprd; - + _orig_hi[0] = domain->boxlo[0] + (_imagehi[0]+1) * old_xprd + (_imagehi[1]+1) * old_xy + (_imagehi[2]+1) * old_xz; @@ -1126,23 +655,23 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, _orig_lo[0] = domain->boxlo[0] + _imagelo[0] * old_xprd; _orig_lo[1] = domain->boxlo[1] + _imagelo[1] * old_yprd; _orig_lo[2] = domain->boxlo[2] + _imagelo[2] * old_zprd; - + _orig_hi[0] = domain->boxlo[0] + (_imagehi[0]+1) * old_xprd; _orig_hi[1] = domain->boxlo[1] + (_imagehi[1]+1) * old_yprd; _orig_hi[2] = domain->boxlo[2] + (_imagehi[2]+1) * old_zprd; } - + double _lo[3], _hi[3]; - + int num_replicas_added = 0; - + // if bond/periodic option // store old_x and old_tag for the entire original system - + if (bond_flag) { memory->create(old_x,old->natoms,3,"replicate:old_x"); memory->create(old_tag,old->natoms,"replicate:old_tag"); - + i = m = 0; while (m < size_buf_all) { old_x[i][0] = buf_all[m+1]; @@ -1156,40 +685,40 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, } // replication loop - + for (ix = 0; ix < nx; ix++) { for (iy = 0; iy < ny; iy++) { for (iz = 0; iz < nz; iz++) { - + thisrep[0] = ix; thisrep[1] = iy; thisrep[2] = iz; - + // domain->remap() overwrites coordinates, so always recompute here - + if (triclinic) { _lo[0] = _orig_lo[0] + ix * old_xprd + iy * old_xy + iz * old_xz; _hi[0] = _orig_hi[0] + ix * old_xprd + iy * old_xy + iz * old_xz; - + _lo[1] = _orig_lo[1] + iy * old_yprd + iz * old_yz; _hi[1] = _orig_hi[1] + iy * old_yprd + iz * old_yz; - + _lo[2] = _orig_lo[2] + iz * old_zprd; _hi[2] = _orig_hi[2] + iz * old_zprd; } else { _lo[0] = _orig_lo[0] + ix * old_xprd; _hi[0] = _orig_hi[0] + ix * old_xprd; - + _lo[1] = _orig_lo[1] + iy * old_yprd; _hi[1] = _orig_hi[1] + iy * old_yprd; - + _lo[2] = _orig_lo[2] + iz * old_zprd; _hi[2] = _orig_hi[2] + iz * old_zprd; } - + // test if bounding box of shifted replica overlaps sub-domain of proc // if not, then can skip testing of any individual atoms - + int xoverlap = 1; int yoverlap = 1; int zoverlap = 1; @@ -1198,7 +727,7 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, domain->x2lamda(_lo,_llo); double _lhi[3]; domain->x2lamda(_hi,_lhi); - + if (_llo[0] > (subhi[0] - EPSILON) || _lhi[0] < (sublo[0] + EPSILON) ) xoverlap = 0; if (_llo[1] > (subhi[1] - EPSILON) @@ -1213,42 +742,42 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, if (_lo[2] > (subhi[2] - EPSILON) || _hi[2] < (sublo[2] + EPSILON) ) zoverlap = 0; } - + int overlap = 0; if (xoverlap && yoverlap && zoverlap) overlap = 1; - + // if no overlap, test if bounding box wrapped back into new system - + if (!overlap) { - + // wrap back into cell - + imageint imagelo = ((imageint) IMGMAX << IMG2BITS) | ((imageint) IMGMAX << IMGBITS) | IMGMAX; domain->remap(&(_lo[0]), imagelo); int xboxlo = (imagelo & IMGMASK) - IMGMAX; int yboxlo = (imagelo >> IMGBITS & IMGMASK) - IMGMAX; int zboxlo = (imagelo >> IMG2BITS) - IMGMAX; - + imageint imagehi = ((imageint) IMGMAX << IMG2BITS) | ((imageint) IMGMAX << IMGBITS) | IMGMAX; domain->remap(&(_hi[0]), imagehi); int xboxhi = (imagehi & IMGMASK) - IMGMAX; int yboxhi = (imagehi >> IMGBITS & IMGMASK) - IMGMAX; int zboxhi = (imagehi >> IMG2BITS) - IMGMAX; - + if (triclinic) { double _llo[3]; _llo[0] = _lo[0]; _llo[1] = _lo[1]; _llo[2] = _lo[2]; domain->x2lamda(_llo,_lo); - + double _lhi[3]; _lhi[0] = _hi[0]; _lhi[1] = _hi[1]; _lhi[2] = _hi[2]; domain->x2lamda(_lhi,_hi); } - + // test all fragments for any overlap; ok to include false positives - + int _xoverlap1 = 0; int _xoverlap2 = 0; if (!xoverlap) { @@ -1256,15 +785,15 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, _xoverlap1 = 1; if (_lo[0] > (subhi[0] - EPSILON)) _xoverlap1 = 0; } - + if (xboxhi > 0) { _xoverlap2 = 1; if (_hi[0] < (sublo[0] + EPSILON)) _xoverlap2 = 0; } - + if (_xoverlap1 || _xoverlap2) xoverlap = 1; } - + int _yoverlap1 = 0; int _yoverlap2 = 0; if (!yoverlap) { @@ -1272,16 +801,16 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, _yoverlap1 = 1; if (_lo[1] > (subhi[1] - EPSILON)) _yoverlap1 = 0; } - + if (yboxhi > 0) { _yoverlap2 = 1; if (_hi[1] < (sublo[1] + EPSILON)) _yoverlap2 = 0; } - + if (_yoverlap1 || _yoverlap2) yoverlap = 1; } - - + + int _zoverlap1 = 0; int _zoverlap2 = 0; if (!zoverlap) { @@ -1289,25 +818,25 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, _zoverlap1 = 1; if (_lo[2] > (subhi[2] - EPSILON)) _zoverlap1 = 0; } - + if (zboxhi > 0) { _zoverlap2 = 1; if (_hi[2] < (sublo[2] + EPSILON)) _zoverlap2 = 0; } - + if (_zoverlap1 || _zoverlap2) zoverlap = 1; } - + // does either fragment overlap w/ sub-domain - + if (xoverlap && yoverlap && zoverlap) overlap = 1; } - + // while loop over one proc's atom list - + if (overlap) { num_replicas_added++; - + m = 0; while (m < size_buf_all) { image = ((imageint) IMGMAX << IMG2BITS) | @@ -1326,27 +855,27 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, domain->x2lamda(x,lamda); coord = lamda; } else coord = x; - + if (coord[0] >= sublo[0] && coord[0] < subhi[0] && coord[1] >= sublo[1] && coord[1] < subhi[1] && coord[2] >= sublo[2] && coord[2] < subhi[2]) { - + m += avec->unpack_restart(&buf_all[m]); - + i = atom->nlocal - 1; if (tag_enable) atom_offset = iz*ny*nx*maxtag + iy*nx*maxtag + ix*maxtag; else atom_offset = 0; mol_offset = iz*ny*nx*maxmol + iy*nx*maxmol + ix*maxmol; - + atom->x[i][0] = x[0]; atom->x[i][1] = x[1]; atom->x[i][2] = x[2]; - + atom0tag = atom->tag[i]; atom->tag[i] += atom_offset; atom->image[i] = image; - + if (atom->molecular != Atom::ATOMIC) { if (atom->molecule[i] > 0) atom->molecule[i] += mol_offset; @@ -1405,7 +934,7 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, } } } - + memory->destroy(size_buf_rnk); memory->destroy(disp_buf_rnk); memory->destroy(buf_all); @@ -1413,7 +942,7 @@ void Replicate::replicate_by_bbox(int nx, int ny, int nz, memory->destroy(old_x); memory->destroy(old_tag); } - + int sum = 0; MPI_Reduce(&num_replicas_added, &sum, 1, MPI_INT, MPI_SUM, 0, world); double avg = (double) sum / nprocs; diff --git a/src/replicate.h b/src/replicate.h index 3877d2d720..defb35d1c6 100644 --- a/src/replicate.h +++ b/src/replicate.h @@ -33,7 +33,7 @@ class Replicate : public Command { private: int bbox_flag, bond_flag; - + class Atom *old; double old_xprd, old_yprd, old_zprd; @@ -51,7 +51,7 @@ private: void replicate_by_proc(int, int, int, double *, double *, double *); void replicate_by_bbox(int, int, int, double *, double *, double *); - + void newtag(tagint, tagint &); }; From 05438d23579c86d3abe4b38dbc1ee045c6436824 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Wed, 8 May 2024 18:50:02 -0400 Subject: [PATCH 82/91] Update create_atoms.rst --- doc/src/create_atoms.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/src/create_atoms.rst b/doc/src/create_atoms.rst index 1e2ea38bbf..1b7bcecd13 100644 --- a/doc/src/create_atoms.rst +++ b/doc/src/create_atoms.rst @@ -471,7 +471,10 @@ newly created particles from being created closer than the specified *Doverlap* distance from any other particle. If particles have finite size (see :doc:`atom_style sphere ` for example) *Doverlap* should be specified large enough to include the particle size in the -non-overlapping criterion. +non-overlapping criterion. If molecules are being randomly inserted, then +an insertion is only accepted if each particle in the molecule meets the +overlap criterion with respect to other particles (not including particles +in the molecule itself). .. note:: From ada61d96fe1fdf8f708c09e3ecadaeb4e4e6ecc7 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Wed, 8 May 2024 19:46:07 -0400 Subject: [PATCH 83/91] Update fix_reaxff_species.rst --- doc/src/fix_reaxff_species.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_reaxff_species.rst b/doc/src/fix_reaxff_species.rst index bc8e9cf27f..76ecc934ff 100644 --- a/doc/src/fix_reaxff_species.rst +++ b/doc/src/fix_reaxff_species.rst @@ -20,7 +20,7 @@ Syntax * Nfreq = calculate average bond-order every this many timesteps * filename = name of output file * zero or more keyword/value pairs may be appended -* keyword = *cutoff* or *element* or *position* or *delete* +* keyword = *cutoff* or *element* or *position* or *delete* or *delete_rate_limit* .. parsed-literal:: @@ -233,5 +233,5 @@ Default """"""" The default values for bond-order cutoffs are 0.3 for all I-J pairs. -The default element symbols are taken from the pair_coeff command. +The default element symbols are taken from the ReaxFF pair_coeff command. Position files are not written by default. From 8e6a232dffde3112401dd910a69f18b35a9229f2 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Wed, 8 May 2024 23:31:36 -0400 Subject: [PATCH 84/91] Update fix_reaxff_species.rst --- doc/src/fix_reaxff_species.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_reaxff_species.rst b/doc/src/fix_reaxff_species.rst index 76ecc934ff..a6da15b161 100644 --- a/doc/src/fix_reaxff_species.rst +++ b/doc/src/fix_reaxff_species.rst @@ -112,7 +112,7 @@ symbol printed for each LAMMPS atom type. The number of symbols must match the number of LAMMPS atom types and each symbol must consist of 1 or 2 alphanumeric characters. By default, these symbols are the same as the chemical identity of each LAMMPS atom type, as specified by the -:doc:`reaxff pair_coeff ` command and the ReaxFF force +:doc:`ReaxFF pair_coeff ` command and the ReaxFF force field file. The optional keyword *position* writes center-of-mass positions of From b4f18700dc6dd20df812999c4f9398131b0c4c93 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Thu, 9 May 2024 00:06:10 -0400 Subject: [PATCH 85/91] Update fix_reaxff_species.h --- src/REAXFF/fix_reaxff_species.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/REAXFF/fix_reaxff_species.h b/src/REAXFF/fix_reaxff_species.h index 1968d413ca..b9afc5466a 100644 --- a/src/REAXFF/fix_reaxff_species.h +++ b/src/REAXFF/fix_reaxff_species.h @@ -63,9 +63,9 @@ class FixReaxFFSpecies : public Fix { double massmin, massmax; int singlepos_opened, multipos_opened, del_opened; char *filepos, *filedel; - std::vector ele2uele; - std::vector eletype; - std::vector ueletype; + std::vector ele2uele; // for element eletype[i], ele2uele[i] stores index of unique element + std::vector eletype; // list of ReaxFF elements of length ntypes + std::vector ueletype; // list of unique elements, of quantity nutypes void Output_ReaxFF_Bonds(bigint, FILE *); AtomCoord chAnchor(AtomCoord, AtomCoord); From a2616630b5d94880b2f174a7900b8b350ae9b92e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 9 May 2024 07:18:50 -0400 Subject: [PATCH 86/91] update OpenCL ICD loader source to latest release --- cmake/Modules/OpenCLLoader.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/OpenCLLoader.cmake b/cmake/Modules/OpenCLLoader.cmake index 4b5c5a1200..411058e0b1 100644 --- a/cmake/Modules/OpenCLLoader.cmake +++ b/cmake/Modules/OpenCLLoader.cmake @@ -1,6 +1,6 @@ message(STATUS "Downloading and building OpenCL loader library") -set(OPENCL_LOADER_URL "${LAMMPS_THIRDPARTY_URL}/opencl-loader-2024.02.09.tar.gz" CACHE STRING "URL for OpenCL loader tarball") -set(OPENCL_LOADER_MD5 "f3573cf9daa3558ba46fd5866517f38f" CACHE STRING "MD5 checksum of OpenCL loader tarball") +set(OPENCL_LOADER_URL "${LAMMPS_THIRDPARTY_URL}/opencl-loader-2024.05.09.tar.gz" CACHE STRING "URL for OpenCL loader tarball") +set(OPENCL_LOADER_MD5 "e7796826b21c059224fabe997e0f2075" CACHE STRING "MD5 checksum of OpenCL loader tarball") mark_as_advanced(OPENCL_LOADER_URL) mark_as_advanced(OPENCL_LOADER_MD5) From 46b4c090832412c77d93777976c8dee73bd5e468 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Fri, 10 May 2024 00:15:21 -0400 Subject: [PATCH 87/91] simplify xmol comm --- src/create_atoms.cpp | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index a0da871e97..2912701159 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -731,13 +731,11 @@ void CreateAtoms::add_random() double xlo, ylo, zlo, xhi, yhi, zhi; double delx, dely, delz, distsq, odistsq; double lamda[3], *coord; - double *boxlo, *boxhi, *xmolbuf; + double *boxlo, *boxhi; if (overlapflag) { double odist = overlap; odistsq = odist * odist; - if (mode == MOLECULE) - memory->create(xmolbuf, onemol->natoms*3, "create_atoms:xmolbuf"); } // random number generator, same for all procs @@ -836,19 +834,8 @@ void CreateAtoms::add_random() } } } else { - int incr; - if (comm->me == 0) { - get_xmol(xone); - incr = 0; - for (int i = 0; i < onemol->natoms; i++) - for (int j = 0; j < 3; j++) - xmolbuf[incr++] = xmol[i][j]; - } - MPI_Bcast(xmolbuf, onemol->natoms*3, MPI_DOUBLE, 0, world); - incr = 0; - for (int i = 0; i < onemol->natoms; i++) - for (int j = 0; j < 3; j++) - xmol[i][j] = xmolbuf[incr++]; + if (comm->me == 0) get_xmol(xone); + MPI_Bcast(&xmol[0][0], onemol->natoms*3, MPI_DOUBLE, 0, world); for (int i = 0; i < nlocal; i++) { for (int j = 0; j < onemol->natoms; j++) { @@ -908,7 +895,6 @@ void CreateAtoms::add_random() // clean-up delete random; - if (overlapflag && mode == MOLECULE) memory->destroy(xmolbuf); } /* ---------------------------------------------------------------------- From 74b3d15c3ba6a764d8d0375cfef19309f3e69263 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 10 May 2024 04:39:13 -0400 Subject: [PATCH 88/91] improve fix_modify error messages --- src/fix.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/fix.cpp b/src/fix.cpp index 754948fdd1..a93d4b954a 100644 --- a/src/fix.cpp +++ b/src/fix.cpp @@ -119,8 +119,8 @@ Fix::~Fix() { if (copymode) return; - delete [] id; - delete [] style; + delete[] id; + delete[] style; memory->destroy(eatom); memory->destroy(vatom); memory->destroy(cvatom); @@ -133,36 +133,37 @@ Fix::~Fix() void Fix::modify_params(int narg, char **arg) { - if (narg == 0) error->all(FLERR,"Illegal fix_modify command"); + if (narg == 0) utils::missing_cmd_args(FLERR, "fix_modify", error); int iarg = 0; while (iarg < narg) { if (strcmp(arg[iarg],"dynamic/dof") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix_modify dynamic/dof", error); dynamic = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"energy") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix_modify energy", error); thermo_energy = utils::logical(FLERR,arg[iarg+1],false,lmp); if (thermo_energy && !energy_global_flag && !energy_peratom_flag) error->all(FLERR,"Fix {} {} does not support fix_modify energy command", id, style); iarg += 2; } else if (strcmp(arg[iarg],"virial") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix_modify virial", error); thermo_virial = utils::logical(FLERR,arg[iarg+1],false,lmp); if (thermo_virial && !virial_global_flag && !virial_peratom_flag) error->all(FLERR,"Fix {} {} does not support fix_modify virial command", id, style); iarg += 2; } else if (strcmp(arg[iarg],"respa") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); - if (!respa_level_support) error->all(FLERR,"Illegal fix_modify command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix_modify respa", error); + if (!respa_level_support) error->all(FLERR,"Illegal fix_modify respa command"); int lvl = utils::inumeric(FLERR,arg[iarg+1],false,lmp); - if (lvl < 0) error->all(FLERR,"Illegal fix_modify command"); + if (lvl < 0) error->all(FLERR,"Illegal fix_modify respa command"); respa_level = lvl-1; iarg += 2; } else { int n = modify_param(narg-iarg,&arg[iarg]); - if (n == 0) error->all(FLERR,"Illegal fix_modify command"); + if (n == 0) + error->all(FLERR,"Fix {} {} does not support fix_modify {} command", id, style, arg[iarg]); iarg += n; } } From b65e41e5090a78f5ce1a6e2d57285e1d4abf0287 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 13 May 2024 10:45:34 -0600 Subject: [PATCH 89/91] Update version to development --- src/version.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/version.h b/src/version.h index 37c44b49f2..64d5210270 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1,2 @@ #define LAMMPS_VERSION "17 Apr 2024" +#define LAMMPS_UPDATE "Development" From 4e7bddaa0b3286658dcbaa1c062b2b79ba38ae4e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 13 May 2024 13:49:59 -0400 Subject: [PATCH 90/91] remove unused variables --- src/EXTRA-FIX/fix_deform_pressure.cpp | 2 -- src/ML-IAP/mliap_unified.cpp | 2 -- src/create_atoms.cpp | 2 +- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/EXTRA-FIX/fix_deform_pressure.cpp b/src/EXTRA-FIX/fix_deform_pressure.cpp index e2bcdd7f4e..672f097c2d 100644 --- a/src/EXTRA-FIX/fix_deform_pressure.cpp +++ b/src/EXTRA-FIX/fix_deform_pressure.cpp @@ -438,8 +438,6 @@ void FixDeformPressure::init() // error if style PRESSURE/ERATEER for yz, can't calculate if box flip occurs if (set[3].style && set[5].style) { - int flag = 0; - double lo,hi; if (flipflag && set[3].style == PRESSURE) error->all(FLERR, "Fix {} cannot use yz pressure with xy", style); if (flipflag && set[3].style == ERATERS) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index 7697204e44..3f0d0b2a8f 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -246,7 +246,6 @@ void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) { double e_total = 0.0; const auto nlistatoms = data->nlistatoms; - const auto nlocal = data->nlocal; for (int ii = 0; ii < nlistatoms; ii++) data->eatoms[ii] = 0; for (int ii = 0; ii < data->npairs; ii++) { @@ -268,7 +267,6 @@ void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) { //Bugfix: need to account for Null atoms in local atoms //const auto nlistatoms = data->nlistatoms; - const auto nlocal = data->nlocal; double **f = data->f; for (int ii = 0; ii < data->npairs; ii++) { int ii3 = ii * 3; diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 2912701159..ded040b567 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -1505,7 +1505,7 @@ void CreateAtoms::get_xmol(double *center) onemol->quat_external = quatone; - int n, natoms = onemol->natoms; + int natoms = onemol->natoms; double xnew[3]; for (int m = 0; m < natoms; m++) { MathExtra::matvec(rotmat, onemol->dx[m], xnew); From 74f29ba2f3fff1b5f3af958b52915b4a9127be12 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 13 May 2024 14:07:24 -0400 Subject: [PATCH 91/91] update example --- .../{coeff_restitution => }/data.particles | 0 .../in.coeff_restitution => in.restitution} | 0 ...or.g++.1 => log.13May23.restitution.g++.1} | 25 ++++++++++--------- 3 files changed, 13 insertions(+), 12 deletions(-) rename examples/granular/{coeff_restitution => }/data.particles (100%) rename examples/granular/{coeff_restitution/in.coeff_restitution => in.restitution} (100%) rename examples/granular/{coeff_restitution/log.11Nov23.cor.g++.1 => log.13May23.restitution.g++.1} (74%) diff --git a/examples/granular/coeff_restitution/data.particles b/examples/granular/data.particles similarity index 100% rename from examples/granular/coeff_restitution/data.particles rename to examples/granular/data.particles diff --git a/examples/granular/coeff_restitution/in.coeff_restitution b/examples/granular/in.restitution similarity index 100% rename from examples/granular/coeff_restitution/in.coeff_restitution rename to examples/granular/in.restitution diff --git a/examples/granular/coeff_restitution/log.11Nov23.cor.g++.1 b/examples/granular/log.13May23.restitution.g++.1 similarity index 74% rename from examples/granular/coeff_restitution/log.11Nov23.cor.g++.1 rename to examples/granular/log.13May23.restitution.g++.1 index b4f53c84da..e51709d10d 100644 --- a/examples/granular/coeff_restitution/log.11Nov23.cor.g++.1 +++ b/examples/granular/log.13May23.restitution.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (21 Nov 2023 - Development - ) +LAMMPS (17 Apr 2024 - Development - patch_17Apr2024-93-g4e7bddaa0b) + using 1 OpenMP thread(s) per MPI task units si atom_style sphere @@ -29,8 +30,8 @@ timestep 1e-9 fix 1 all nve/sphere compute s all stress/atom NULL pair -dump 1 all custom 2000000 op.dump id x y z vx vy vz -dump_modify 1 pad 8 +#dump 1 all custom 2000000 op.dump id x y z vx vy vz +#dump_modify 1 pad 8 thermo_style custom step ke run_style verlet run 10000000 @@ -51,19 +52,19 @@ Per MPI rank memory allocation (min/avg/max) = 10.1 | 10.1 | 10.1 Mbytes Step KinEng 0 8.3775804e-05 10000000 5.3616513e-05 -Loop time of 5.06865 on 1 procs for 10000000 steps with 2 atoms +Loop time of 5.99782 on 1 procs for 10000000 steps with 2 atoms -99.7% CPU use with 1 MPI tasks x no OpenMP threads +77.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 | 0.55389 | 0.55389 | 0.55389 | 0.0 | 10.93 -Neigh | 0.00022182 | 0.00022182 | 0.00022182 | 0.0 | 0.00 -Comm | 1.9988 | 1.9988 | 1.9988 | 0.0 | 39.43 -Output | 0.00023837 | 0.00023837 | 0.00023837 | 0.0 | 0.00 -Modify | 1.26 | 1.26 | 1.26 | 0.0 | 24.86 -Other | | 1.255 | | | 24.77 +Pair | 0.60235 | 0.60235 | 0.60235 | 0.0 | 10.04 +Neigh | 0.00021965 | 0.00021965 | 0.00021965 | 0.0 | 0.00 +Comm | 1.7939 | 1.7939 | 1.7939 | 0.0 | 29.91 +Output | 2.5955e-05 | 2.5955e-05 | 2.5955e-05 | 0.0 | 0.00 +Modify | 1.7622 | 1.7622 | 1.7622 | 0.0 | 29.38 +Other | | 1.839 | | | 30.66 Nlocal: 2 ave 2 max 2 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -76,4 +77,4 @@ Total # of neighbors = 0 Ave neighs/atom = 0 Neighbor list builds = 14 Dangerous builds = 0 -Total wall time: 0:00:05 +Total wall time: 0:00:06