From 858065029d27622049e64388a642a7d2b986b258 Mon Sep 17 00:00:00 2001 From: David Nicholson Date: Sun, 12 Nov 2017 15:46:51 -0500 Subject: [PATCH 01/73] Reverse communication compute fragment/aggregate --- src/compute_aggregate_atom.cpp | 45 +++++++++++++++++++++++++++++++++- src/compute_aggregate_atom.h | 2 ++ src/compute_fragment_atom.cpp | 45 +++++++++++++++++++++++++++++++++- src/compute_fragment_atom.h | 2 ++ 4 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index 1155ac437a..f92bf02cba 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -51,6 +51,7 @@ ComputeAggregateAtom::ComputeAggregateAtom(LAMMPS *lmp, int narg, char **arg) : peratom_flag = 1; size_peratom_cols = 0; comm_forward = 1; + comm_reverse = 1; nmax = 0; } @@ -163,6 +164,11 @@ void ComputeAggregateAtom::compute_peratom() while (1) { comm->forward_comm_compute(this); + // reverse communication when bonds are not stored on every processor + + if (force->newton_bond) + comm->reverse_comm_compute(this); + change = 0; while (1) { done = 1; @@ -252,13 +258,50 @@ void ComputeAggregateAtom::unpack_forward_comm(int n, int first, double *buf) m = 0; last = first + n; if (commflag) - for (i = first; i < last; i++) aggregateID[i] = buf[m++]; + for (i = first; i < last; i++) { + double x = buf[m++]; + + // only overwrite ghost IDs with values lower than current ones + + aggregateID[i] = MIN(x,aggregateID[i]); + } else { int *mask = atom->mask; for (i = first; i < last; i++) mask[i] = (int) ubuf(buf[m++]).i; } } +/* ---------------------------------------------------------------------- */ + +int ComputeAggregateAtom::pack_reverse_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = aggregateID[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeAggregateAtom::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + double x = buf[m++]; + + // only overwrite local IDs with values lower than current ones + + aggregateID[j] = MIN(x,aggregateID[j]); + } +} + /* ---------------------------------------------------------------------- memory usage of local atom-based array ------------------------------------------------------------------------- */ diff --git a/src/compute_aggregate_atom.h b/src/compute_aggregate_atom.h index 8170aabc7f..dc2e1d7b40 100644 --- a/src/compute_aggregate_atom.h +++ b/src/compute_aggregate_atom.h @@ -33,6 +33,8 @@ class ComputeAggregateAtom : public Compute { void compute_peratom(); int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); double memory_usage(); private: diff --git a/src/compute_fragment_atom.cpp b/src/compute_fragment_atom.cpp index 2dfb20a570..8606f54933 100644 --- a/src/compute_fragment_atom.cpp +++ b/src/compute_fragment_atom.cpp @@ -44,6 +44,7 @@ ComputeFragmentAtom::ComputeFragmentAtom(LAMMPS *lmp, int narg, char **arg) : peratom_flag = 1; size_peratom_cols = 0; comm_forward = 1; + comm_reverse = 1; nmax = 0; } @@ -122,6 +123,11 @@ void ComputeFragmentAtom::compute_peratom() while (1) { comm->forward_comm_compute(this); + // reverse communication when bonds are not stored on every processor + + if (force->newton_bond) + comm->reverse_comm_compute(this); + change = 0; while (1) { done = 1; @@ -183,13 +189,50 @@ void ComputeFragmentAtom::unpack_forward_comm(int n, int first, double *buf) m = 0; last = first + n; if (commflag) - for (i = first; i < last; i++) fragmentID[i] = buf[m++]; + for (i = first; i < last; i++) { + double x = buf[m++]; + + // only overwrite ghost IDs with values lower than current ones + + fragmentID[i] = MIN(x,fragmentID[i]); + } else { int *mask = atom->mask; for (i = first; i < last; i++) mask[i] = (int) ubuf(buf[m++]).i; } } +/* ---------------------------------------------------------------------- */ + +int ComputeFragmentAtom::pack_reverse_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = fragmentID[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeFragmentAtom::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + double x = buf[m++]; + + // only overwrite local IDs with values lower than current ones + + fragmentID[j] = MIN(x,fragmentID[j]); + } +} + /* ---------------------------------------------------------------------- memory usage of local atom-based array ------------------------------------------------------------------------- */ diff --git a/src/compute_fragment_atom.h b/src/compute_fragment_atom.h index a56239dbda..2365b6028b 100644 --- a/src/compute_fragment_atom.h +++ b/src/compute_fragment_atom.h @@ -32,6 +32,8 @@ class ComputeFragmentAtom : public Compute { void compute_peratom(); int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); double memory_usage(); private: From c16b7a3273f469c75a982a944b01865ecd0d303a Mon Sep 17 00:00:00 2001 From: David Nicholson Date: Sun, 12 Nov 2017 15:57:53 -0500 Subject: [PATCH 02/73] Multiple run fix for cluster/aggregate computes --- src/compute_aggregate_atom.cpp | 2 +- src/compute_cluster_atom.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index f92bf02cba..b3daf5f98c 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -121,7 +121,7 @@ void ComputeAggregateAtom::compute_peratom() // invoke full neighbor list (will copy or build if necessary) - neighbor->build_one(list); + neighbor->build_one(list,1); // if group is dynamic, insure ghost atom masks are current diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index 5ee6368504..d01402d480 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -113,7 +113,7 @@ void ComputeClusterAtom::compute_peratom() // invoke full neighbor list (will copy or build if necessary) - neighbor->build_one(list); + neighbor->build_one(list,1); inum = list->inum; ilist = list->ilist; From a085ee0c554024209762d9e4633c775aaf289e88 Mon Sep 17 00:00:00 2001 From: David Nicholson Date: Mon, 13 Nov 2017 04:53:16 -0500 Subject: [PATCH 03/73] Always build occasional lists on first step --- src/compute_aggregate_atom.cpp | 2 +- src/compute_cluster_atom.cpp | 2 +- src/neighbor.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index b3daf5f98c..f92bf02cba 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -121,7 +121,7 @@ void ComputeAggregateAtom::compute_peratom() // invoke full neighbor list (will copy or build if necessary) - neighbor->build_one(list,1); + neighbor->build_one(list); // if group is dynamic, insure ghost atom masks are current diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index d01402d480..5ee6368504 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -113,7 +113,7 @@ void ComputeClusterAtom::compute_peratom() // invoke full neighbor list (will copy or build if necessary) - neighbor->build_one(list,1); + neighbor->build_one(list); inum = list->inum; ilist = list->ilist; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index cc2e5d6d11..46b921191b 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -2144,7 +2144,7 @@ void Neighbor::build_one(class NeighList *mylist, int preflag) NPair *np = neigh_pair[mylist->index]; - if (preflag) { + if (preflag || update->firststep == update->ntimestep) { if (np->last_build > lastcall) return; } else { if (np->last_build >= lastcall) return; From e55c90cc443b4f3b40fd4c7ff5fa6222b835027c Mon Sep 17 00:00:00 2001 From: David Nicholson Date: Tue, 14 Nov 2017 14:01:07 -0500 Subject: [PATCH 04/73] Moved rerun bug fix to individual affected styles --- src/compute_aggregate_atom.cpp | 4 +++- src/compute_cluster_atom.cpp | 4 +++- src/compute_hexorder_atom.cpp | 4 +++- src/neighbor.cpp | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index f92bf02cba..674fecb8c0 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -120,8 +120,10 @@ void ComputeAggregateAtom::compute_peratom() } // invoke full neighbor list (will copy or build if necessary) + // on the first step of a run, set preflag to one in neighbor->build_one(...) - neighbor->build_one(list); + if (update->firststep == update->ntimestep) neighbor->build_one(list,1); + else neighbor->build_one(list); // if group is dynamic, insure ghost atom masks are current diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index 5ee6368504..9a7df03e49 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -112,8 +112,10 @@ void ComputeClusterAtom::compute_peratom() } // invoke full neighbor list (will copy or build if necessary) + // on the first step of a run, set preflag to one in neighbor->build_one(...) - neighbor->build_one(list); + if (update->firststep == update->ntimestep) neighbor->build_one(list,1); + else neighbor->build_one(list); inum = list->inum; ilist = list->ilist; diff --git a/src/compute_hexorder_atom.cpp b/src/compute_hexorder_atom.cpp index 013036f364..85324651c1 100644 --- a/src/compute_hexorder_atom.cpp +++ b/src/compute_hexorder_atom.cpp @@ -154,8 +154,10 @@ void ComputeHexOrderAtom::compute_peratom() } // invoke full neighbor list (will copy or build if necessary) + // on the first step of a run, set preflag to one in neighbor->build_one(...) - neighbor->build_one(list); + if (update->firststep == update->ntimestep) neighbor->build_one(list,1); + else neighbor->build_one(list); inum = list->inum; ilist = list->ilist; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 46b921191b..cc2e5d6d11 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -2144,7 +2144,7 @@ void Neighbor::build_one(class NeighList *mylist, int preflag) NPair *np = neigh_pair[mylist->index]; - if (preflag || update->firststep == update->ntimestep) { + if (preflag) { if (np->last_build > lastcall) return; } else { if (np->last_build >= lastcall) return; From 16d6dfcab6993b26d99c17e65fb9eb9f8bd39cc8 Mon Sep 17 00:00:00 2001 From: abbatux <31911482+abbatux@users.noreply.github.com> Date: Fri, 8 Dec 2017 11:40:44 +1100 Subject: [PATCH 05/73] Bugfix for effective plastic strain rate calc --- src/USER-SMD/pair_smd_tlsph.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/USER-SMD/pair_smd_tlsph.cpp b/src/USER-SMD/pair_smd_tlsph.cpp index d6ddc9c72d..8dac846017 100644 --- a/src/USER-SMD/pair_smd_tlsph.cpp +++ b/src/USER-SMD/pair_smd_tlsph.cpp @@ -775,9 +775,9 @@ void PairTlsph::AssembleStress() { // compute a characteristic time over which to average the plastic strain double tav = 1000 * radius[i] / (Lookup[SIGNAL_VELOCITY][itype]); - eff_plastic_strain_rate[i] -= eff_plastic_strain_rate[i] / tav; - eff_plastic_strain_rate[i] += (plastic_strain_increment / dt) / tav; - eff_plastic_strain_rate[i] = MAX(0.0, eff_plastic_strain_rate[i]); + eff_plastic_strain_rate[i] -= eff_plastic_strain_rate[i] * dt / tav; + eff_plastic_strain_rate[i] += plastic_strain_increment / tav; + eff_plastic_strain_rate[i] = MAX(0.0, eff_plastic_strain_rate[i]); /* * assemble total stress from pressure and deviatoric stress From 13c08225ed3e90bfe8b4d5f5fb8d42f092bc5fb5 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Tue, 23 Jan 2018 00:16:51 -0700 Subject: [PATCH 06/73] per-atom property dynamic group --- doc/src/group.txt | 7 ++++++- src/fix_group.cpp | 33 +++++++++++++++++++++++++++++++-- src/fix_group.h | 6 +++--- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/doc/src/group.txt b/doc/src/group.txt index afa218c5a3..8c307928f8 100644 --- a/doc/src/group.txt +++ b/doc/src/group.txt @@ -41,6 +41,7 @@ style = {delete} or {region} or {type} or {id} or {molecule} or {variable} or \ keyword = {region} or {var} or {every} {region} value = region-ID {var} value = name of variable + {property} value = name of per-atom property {every} value = N = update group every this many timesteps {static} = no args :pre :ule @@ -215,7 +216,11 @@ conditions are applied. If the {region} keyword is used, atoms not in the specified region are removed from the dynamic group. If the {var} keyword is used, the variable name must be an atom-style or atomfile-style variable. The variable is evaluated and atoms whose -per-atom values are 0.0, are removed from the dynamic group. +per-atom values are 0.0, are removed from the dynamic group. If the {property} +keyword is used, the per-atom property name must be a previously defined +per-atom property. The per-atom property is evaluated and atoms whose +values are 0.0 are removed from the dynamic group, otherwise they +are added to the group. The assignment of atoms to a dynamic group is done at the beginning of each run and on every timestep that is a multiple of {N}, which is the diff --git a/src/fix_group.cpp b/src/fix_group.cpp index fe2495d6c0..51abebdf29 100644 --- a/src/fix_group.cpp +++ b/src/fix_group.cpp @@ -33,7 +33,7 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixGroup::FixGroup(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), -idregion(NULL), idvar(NULL) +idregion(NULL), idvar(NULL), idprop(NULL) { // dgroupbit = bitmask of dynamic group // group ID is last part of fix ID @@ -49,6 +49,7 @@ idregion(NULL), idvar(NULL) regionflag = 0; varflag = 0; + propflag = 0; nevery = 1; int iarg = 3; @@ -73,7 +74,17 @@ idregion(NULL), idvar(NULL) idvar = new char[n]; strcpy(idvar,arg[iarg+1]); iarg += 2; - } else if (strcmp(arg[iarg],"every") == 0) { + } else if (strcmp(arg[iarg],"property") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); + if (atom->find_custom(arg[iarg+1],typeflag) < 0) + error->all(FLERR,"Per atom property for group dynamic does not exist"); + propflag = 1; + delete [] idprop; + int n = strlen(arg[iarg+1]) + 1; + idprop = new char[n]; + strcpy(idprop,arg[iarg+1]); + iarg += 2; + } else if (strcmp(arg[iarg],"every") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); nevery = force->inumeric(FLERR,arg[iarg+1]); if (nevery <= 0) error->all(FLERR,"Illegal group command"); @@ -88,6 +99,7 @@ FixGroup::~FixGroup() { delete [] idregion; delete [] idvar; + delete [] idprop; } /* ---------------------------------------------------------------------- */ @@ -130,6 +142,12 @@ void FixGroup::init() error->all(FLERR,"Variable for group dynamic is invalid style"); } + if (propflag) { + iprop = atom->find_custom(idprop,typeflag); + if (iprop < 0) + error->all(FLERR,"Per-atom property for group dynamic does not exist"); + } + // warn if any FixGroup is not at tail end of all post_integrate fixes Fix **fix = modify->fix; @@ -188,6 +206,9 @@ void FixGroup::set_group() // invoke atom-style variable if defined double *var = NULL; + int *ivector = NULL; + double *dvector = NULL; + if (varflag) { modify->clearstep_compute(); @@ -196,6 +217,12 @@ void FixGroup::set_group() modify->addstep_compute(update->ntimestep + nevery); } + // invoke per-atom property if defined + + if (propflag && !typeflag) ivector = atom->ivector[iprop]; //check nlocal > 0? + + if (propflag && typeflag) dvector = atom->dvector[iprop]; //check nlocal > 0? + // update region in case it has a variable dependence or is dynamic if (regionflag) region->prematch(); @@ -214,6 +241,8 @@ void FixGroup::set_group() inflag = 1; if (regionflag && !region->match(x[i][0],x[i][1],x[i][2])) inflag = 0; if (varflag && var[i] == 0.0) inflag = 0; + if (propflag && !typeflag && ivector[i] == 0) inflag = 0; + if (propflag && typeflag && dvector[i] == 0) inflag = 0; } else inflag = 0; if (inflag) mask[i] |= gbit; diff --git a/src/fix_group.h b/src/fix_group.h index 6ed842578d..662325492b 100644 --- a/src/fix_group.h +++ b/src/fix_group.h @@ -36,9 +36,9 @@ class FixGroup : public Fix { private: int gbit,gbitinverse; - int regionflag,varflag; - int iregion,ivar; - char *idregion,*idvar; + int regionflag,varflag,propflag,typeflag; + int iregion,ivar,iprop; + char *idregion,*idvar,*idprop; class Region *region; int nlevels_respa; From 1d403b2aa344fa9849f030b5550f37f64bb021e3 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Mon, 5 Feb 2018 13:29:14 -0700 Subject: [PATCH 07/73] Added warning to discourage use of group all and fixed some segfault cases --- doc/src/fix_gcmc.txt | 10 +++++-- examples/gcmc/in.gcmc.co2 | 8 +++--- examples/gcmc/in.gcmc.lj | 8 ++++-- src/MC/fix_gcmc.cpp | 55 ++++++++++++++++++++++++++------------- src/MC/fix_gcmc.h | 13 +++++++-- 5 files changed, 66 insertions(+), 28 deletions(-) diff --git a/doc/src/fix_gcmc.txt b/doc/src/fix_gcmc.txt index c78142a999..38f0fb95ce 100644 --- a/doc/src/fix_gcmc.txt +++ b/doc/src/fix_gcmc.txt @@ -95,8 +95,8 @@ which will result in roughly one MC move per atom or molecule per MC cycle. All inserted particles are always added to two groups: the default -group "all" and the fix group specified in the fix command (which can -also be "all"). In addition, particles are also added to any groups +group "all" and the fix group specified in the fix command. +In addition, particles are also added to any groups specified by the {group} and {grouptype} keywords. If inserted particles are individual atoms, they are assigned the atom type given by the type argument. If they are molecules, the type argument has no @@ -104,6 +104,12 @@ effect and must be set to zero. Instead, the type of each atom in the inserted molecule is specified in the file read by the "molecule"_molecule.html command. +NOTE: Care should be taken to apply fix gcmc only to +a group that contains only those atoms and molecules +that you wish to manipulate using Monte Carlo. +Hence it is generally not a good idea to specify +the default group "all" in the fix command, although it is allowed. + This fix cannot be used to perform GCMC insertions of gas atoms or molecules other than the exchanged type, but GCMC deletions, and MC translations, and rotations can be performed on any atom/molecule in diff --git a/examples/gcmc/in.gcmc.co2 b/examples/gcmc/in.gcmc.co2 index 128f05b489..bb6916fc48 100644 --- a/examples/gcmc/in.gcmc.co2 +++ b/examples/gcmc/in.gcmc.co2 @@ -58,21 +58,21 @@ timestep 1.0 # rigid constraints with thermostat -fix myrigidnvt all rigid/nvt/small molecule temp ${temp} ${temp} 100 mol co2mol +fix myrigidnvt co2 rigid/nvt/small molecule temp ${temp} ${temp} 100 mol co2mol fix_modify myrigidnvt dynamic/dof no # gcmc variable tfac equal 5.0/3.0 # (3 trans + 2 rot)/(3 trans) -fix mygcmc all gcmc 100 100 0 0 54341 ${temp} ${mu} ${disp} mol & +fix mygcmc co2 gcmc 100 100 0 0 54341 ${temp} ${mu} ${disp} mol & co2mol tfac_insert ${tfac} group co2 rigid myrigidnvt # atom counts variable carbon atom "type==1" variable oxygen atom "type==2" -group carbon dynamic all var carbon -group oxygen dynamic all var oxygen +group carbon dynamic co2 var carbon +group oxygen dynamic co2 var oxygen variable nC equal count(carbon) variable nO equal count(oxygen) diff --git a/examples/gcmc/in.gcmc.lj b/examples/gcmc/in.gcmc.lj index 3fe78efb25..a1c7c6eb10 100644 --- a/examples/gcmc/in.gcmc.lj +++ b/examples/gcmc/in.gcmc.lj @@ -29,14 +29,18 @@ create_box 1 box pair_coeff * * 1.0 1.0 mass * 1.0 +# we recommend setting up a dedicated group for gcmc + +group gcmcgroup type 1 + # gcmc -fix mygcmc all gcmc 1 100 100 1 29494 ${temp} ${mu} ${disp} +fix mygcmc gcmcgroup gcmc 1 100 100 1 29494 ${temp} ${mu} ${disp} # atom count variable type1 atom "type==1" -group type1 dynamic all var type1 +group type1 dynamic gcmcgroup var type1 variable n1 equal count(type1) # averaging diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index a50ca0fd21..f6843eb0a3 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -72,7 +72,8 @@ enum{MOVEATOM,MOVEMOL}; // movemode FixGCMC::FixGCMC(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), idregion(NULL), full_flag(0), ngroups(0), groupstrings(NULL), ngrouptypes(0), grouptypestrings(NULL), - grouptypebits(NULL), grouptypes(NULL), local_gas_list(NULL), molcoords(NULL), random_equal(NULL), random_unequal(NULL), + grouptypebits(NULL), grouptypes(NULL), local_gas_list(NULL), molcoords(NULL), molq(NULL), molimage(NULL), + random_equal(NULL), random_unequal(NULL), fixrigid(NULL), fixshake(NULL), idrigid(NULL), idshake(NULL) { if (narg < 11) error->all(FLERR,"Illegal fix gcmc command"); @@ -199,8 +200,8 @@ FixGCMC::FixGCMC(LAMMPS *lmp, int narg, char **arg) : if (exchmode == EXCHATOM) natoms_per_molecule = 1; else natoms_per_molecule = onemols[imol]->natoms; - nmaxmolcoords = natoms_per_molecule; - memory->create(molcoords,nmaxmolcoords,3,"gcmc:molcoords"); + nmaxmolatoms = natoms_per_molecule; + grow_molecule_arrays(nmaxmolatoms); // compute the number of MC cycles that occur nevery timesteps @@ -513,7 +514,7 @@ void FixGCMC::init() "Fix gcmc cannot exchange individual atoms belonging to a molecule"); } - // if molecules are exchanged are moves, check for unset mol IDs + // if molecules are exchanged or moved, check for unset mol IDs if (exchmode == EXCHMOL || movemode == MOVEMOL) { tagint *molecule = atom->molecule; @@ -683,6 +684,12 @@ void FixGCMC::init() imagezero = ((imageint) IMGMAX << IMG2BITS) | ((imageint) IMGMAX << IMGBITS) | IMGMAX; + // warning if group id is "all" + + if (groupbit & 1) + error->warning(FLERR, "Fix gcmc is being applied " + "to the default group all"); + // construct group bitmask for all new atoms // aggregated over all group keywords @@ -1153,10 +1160,8 @@ void FixGCMC::attempt_molecule_rotation() } } - if (nmolcoords > nmaxmolcoords) { - nmaxmolcoords = nmolcoords; - molcoords = memory->grow(molcoords,nmaxmolcoords,3,"gcmc:molcoords"); - } + if (nmolcoords > nmaxmolatoms) + grow_molecule_arrays(nmolcoords); double com[3]; com[0] = com[1] = com[2] = 0.0; @@ -1816,10 +1821,8 @@ void FixGCMC::attempt_molecule_rotation_full() } } - if (nmolcoords > nmaxmolcoords) { - nmaxmolcoords = nmolcoords; - molcoords = memory->grow(molcoords,nmaxmolcoords,3,"gcmc:molcoords"); - } + if (nmolcoords > nmaxmolatoms) + grow_molecule_arrays(nmolcoords); double com[3]; com[0] = com[1] = com[2] = 0.0; @@ -1844,14 +1847,14 @@ void FixGCMC::attempt_molecule_rotation_full() double **x = atom->x; imageint *image = atom->image; - imageint image_orig[natoms_per_molecule]; + int n = 0; for (int i = 0; i < atom->nlocal; i++) { if (mask[i] & molecule_group_bit) { molcoords[n][0] = x[i][0]; molcoords[n][1] = x[i][1]; molcoords[n][2] = x[i][2]; - image_orig[n] = image[i]; + molimage[n] = image[i]; double xtmp[3]; domain->unmap(x[i],image[i],xtmp); xtmp[0] -= com[0]; @@ -1884,7 +1887,7 @@ void FixGCMC::attempt_molecule_rotation_full() x[i][0] = molcoords[n][0]; x[i][1] = molcoords[n][1]; x[i][2] = molcoords[n][2]; - image[i] = image_orig[n]; + image[i] = molimage[n]; n++; } } @@ -1906,8 +1909,17 @@ void FixGCMC::attempt_molecule_deletion_full() double energy_before = energy_stored; + // check nmolq, grow arrays if necessary + + int nmolq = 0; + for (int i = 0; i < atom->nlocal; i++) + if (atom->molecule[i] == deletion_molecule) + if (atom->q_flag) nmolq++; + + if (nmolq > nmaxmolatoms) + grow_molecule_arrays(nmolq); + int m = 0; - double q_tmp[natoms_per_molecule]; int tmpmask[atom->nlocal]; for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == deletion_molecule) { @@ -1915,7 +1927,7 @@ void FixGCMC::attempt_molecule_deletion_full() atom->mask[i] = exclusion_group_bit; toggle_intramolecular(i); if (atom->q_flag) { - q_tmp[m] = atom->q[i]; + molq[m] = atom->q[i]; m++; atom->q[i] = 0.0; } @@ -1948,7 +1960,7 @@ void FixGCMC::attempt_molecule_deletion_full() atom->mask[i] = tmpmask[i]; toggle_intramolecular(i); if (atom->q_flag) { - atom->q[i] = q_tmp[m]; + atom->q[i] = molq[m]; m++; } } @@ -2521,3 +2533,10 @@ void FixGCMC::restart(char *buf) next_reneighbor = static_cast (list[n++]); } + +void FixGCMC::grow_molecule_arrays(int nmolatoms) { + nmaxmolatoms = nmolatoms; + molcoords = memory->grow(molcoords,nmaxmolatoms,3,"gcmc:molcoords"); + molq = memory->grow(molq,nmaxmolatoms,"gcmc:molq"); + molimage = memory->grow(molimage,nmaxmolatoms,"gcmc:molimage"); +} diff --git a/src/MC/fix_gcmc.h b/src/MC/fix_gcmc.h index fc6021efea..77dda17fda 100644 --- a/src/MC/fix_gcmc.h +++ b/src/MC/fix_gcmc.h @@ -57,7 +57,8 @@ class FixGCMC : public Fix { double memory_usage(); void write_restart(FILE *); void restart(char *); - + void grow_molecule_arrays(int); + private: int molecule_group,molecule_group_bit; int molecule_group_inversebit; @@ -78,7 +79,7 @@ class FixGCMC : public Fix { bool full_flag; // true if doing full system energy calculations int natoms_per_molecule; // number of atoms in each inserted molecule - int nmaxmolcoords; // number of atoms allocated for molcoords + int nmaxmolatoms; // number of atoms allocated for molecule arrays int groupbitall; // group bitmask for inserted atoms int ngroups; // number of group-ids for inserted atoms @@ -114,6 +115,8 @@ class FixGCMC : public Fix { int *local_gas_list; double **cutsq; double **molcoords; + double *molq; + imageint *molimage; imageint imagezero; double overlap_cutoffsq; // square distance cutoff for overlap int overlap_flag; @@ -224,6 +227,12 @@ W: Energy of old configuration in fix gcmc is > MAXENERGYTEST. This probably means that a pair of atoms are closer than the overlap cutoff distance for keyword overlap_cutoff. +W: Fix gcmc is being applied to the default group all + +This is allowed, but it will result in Monte Carlo moves +being performed on all the atoms in the system, which is +often not what is intended. + E: Invalid atom type in fix gcmc command The atom type specified in the gcmc command does not exist. From 669ae02a859c190384db2a1ff106ad1d5831c4fb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Feb 2018 14:56:55 +0100 Subject: [PATCH 08/73] apply pattern to ignore OPT package sources --- src/.gitignore | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/.gitignore b/src/.gitignore index f6cb63f613..659ae557a8 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -15,6 +15,8 @@ /*_kokkos.cpp /*_omp.h /*_omp.cpp +/*_opt.h +/*_opt.cpp /*_tally.h /*_tally.cpp /*_rx.h @@ -693,16 +695,10 @@ /pair_dsmc.h /pair_eam.cpp /pair_eam.h -/pair_eam_opt.cpp -/pair_eam_opt.h /pair_eam_alloy.cpp /pair_eam_alloy.h -/pair_eam_alloy_opt.cpp -/pair_eam_alloy_opt.h /pair_eam_fs.cpp /pair_eam_fs.h -/pair_eam_fs_opt.cpp -/pair_eam_fs_opt.h /pair_edip.cpp /pair_edip.h /pair_edip_multi.cpp @@ -746,8 +742,6 @@ /pair_lj_charmm_coul_charmm_implicit.h /pair_lj_charmm_coul_long.cpp /pair_lj_charmm_coul_long.h -/pair_lj_charmm_coul_long_opt.cpp -/pair_lj_charmm_coul_long_opt.h /pair_lj_charmm_coul_long_soft.cpp /pair_lj_charmm_coul_long_soft.h /pair_lj_charmm_coul_msm.cpp @@ -770,8 +764,6 @@ /pair_lj_cut_tip4p_cut.h /pair_lj_cut_coul_long.cpp /pair_lj_cut_coul_long.h -/pair_lj_cut_coul_long_opt.cpp -/pair_lj_cut_coul_long_opt.h /pair_lj_cut_coul_long_soft.cpp /pair_lj_cut_coul_long_soft.h /pair_lj_cut_coul_msm.cpp @@ -786,20 +778,14 @@ /pair_lj_cut_soft.h /pair_lj_cut_tip4p_long.cpp /pair_lj_cut_tip4p_long.h -/pair_lj_cut_tip4p_long_opt.cpp -/pair_lj_cut_tip4p_long_opt.h /pair_lj_cut_tip4p_long_soft.cpp /pair_lj_cut_tip4p_long_soft.h /pair_lj_long_coul_long.cpp /pair_lj_long_coul_long.h -/pair_lj_long_coul_long_opt.cpp -/pair_lj_long_coul_long_opt.h /pair_lj_long_dipole_long.cpp /pair_lj_long_dipole_long.h /pair_lj_long_tip4p_long.cpp /pair_lj_long_tip4p_long.h -/pair_lj_cut_opt.cpp -/pair_lj_cut_opt.h /pair_lj_cut_tgpu.cpp /pair_lj_cut_tgpu.h /pair_lj_sdk.cpp @@ -824,8 +810,6 @@ /pair_meam_spline.h /pair_meam_sw_spline.cpp /pair_meam_sw_spline.h -/pair_morse_opt.cpp -/pair_morse_opt.h /pair_morse_soft.cpp /pair_morse_soft.h /pair_nb3b_harmonic.cpp From f914da62e0388abc96f902ed7ff934f670c985da Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Feb 2018 14:55:26 +0100 Subject: [PATCH 09/73] fix typo --- python/lammps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/lammps.py b/python/lammps.py index 0492876476..c895037c00 100644 --- a/python/lammps.py +++ b/python/lammps.py @@ -406,7 +406,7 @@ class lammps(object): # returned data is a 1d vector - doc how it is ordered? # NOTE: how could we insure are converting to correct Python type # e.g. for Python list or NumPy, etc - # ditto for extact_atom() above + # ditto for extract_atom() above def gather_atoms(self,name,type,count): if name: name = name.encode() From 49745968f227d51832fef239386430176dd74b7f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 4 Feb 2018 14:39:19 +0100 Subject: [PATCH 10/73] make link unambiguous so sphinx is not confused --- doc/src/Section_tools.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Section_tools.txt b/doc/src/Section_tools.txt index 24c32c478a..e85c0d818f 100644 --- a/doc/src/Section_tools.txt +++ b/doc/src/Section_tools.txt @@ -184,7 +184,7 @@ doxygen tool :h4,link(doxygen) The tools/doxygen directory contains a shell script called doxygen.sh which can generate a call graph and API lists using -the "Doxygen"_http://doxygen.org software. +the "Doxygen software"_http://doxygen.org. See the included README file for details. From b49806d36a0c8a44b6e0d461a58e90d068e1460b Mon Sep 17 00:00:00 2001 From: Amulya Date: Wed, 7 Feb 2018 16:35:49 -0500 Subject: [PATCH 11/73] correct the logic for checking if fix is right previously had incorrect logic for checking if fix is acceptable --- src/USER-MISC/temper_npt.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/USER-MISC/temper_npt.cpp b/src/USER-MISC/temper_npt.cpp index 572a52b1a9..e405377d79 100644 --- a/src/USER-MISC/temper_npt.cpp +++ b/src/USER-MISC/temper_npt.cpp @@ -101,9 +101,9 @@ void TemperNPT::command(int narg, char **arg) // change the volume. This currently only applies to fix npt and // fix rigid/npt variants - if ((strncmp(modify->fix[whichfix]->style,"npt",3) == 0) - || (strncmp(modify->fix[whichfix]->style,"rigid/npt",9) == 0)) - error->universe_all(FLERR,"Tempering temperature fix is not supported"); + if ((strncmp(modify->fix[whichfix]->style,"npt",3) != 0) + && (strncmp(modify->fix[whichfix]->style,"rigid/npt",9) != 0)) + error->universe_all(FLERR,"Tempering temperature and pressure fix is not supported"); // setup for long tempering run From 21fe88ffa8fee86033c2d365224f48487cf154c7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 8 Feb 2018 13:07:56 -0500 Subject: [PATCH 12/73] remove dead code in various neighbor list related source files --- src/USER-DPD/fix_shardlow.cpp | 4 +--- src/USER-DPD/npair_half_bin_newton_ssa.cpp | 4 +--- src/USER-OMP/npair_half_size_bin_newton_omp.cpp | 3 +-- src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp | 3 +-- src/USER-OMP/npair_half_size_nsq_newton_omp.cpp | 2 +- src/npair_half_size_bin_newtoff.cpp | 3 +-- src/npair_half_size_bin_newton.cpp | 3 +-- src/npair_half_size_bin_newton_tri.cpp | 3 +-- src/npair_half_size_nsq_newtoff.cpp | 3 +-- src/npair_half_size_nsq_newton.cpp | 2 +- src/npair_skip_size.cpp | 6 +----- src/npair_skip_size_off2on.cpp | 2 +- src/npair_skip_size_off2on_oneside.cpp | 4 +--- 13 files changed, 13 insertions(+), 29 deletions(-) diff --git a/src/USER-DPD/fix_shardlow.cpp b/src/USER-DPD/fix_shardlow.cpp index 39b7ba2224..2b7a69503a 100644 --- a/src/USER-DPD/fix_shardlow.cpp +++ b/src/USER-DPD/fix_shardlow.cpp @@ -529,7 +529,7 @@ while (ct-- > 0) { void FixShardlow::initial_integrate(int vflag) { - int i,ii,inum; + int ii; int *ilist; int nlocal = atom->nlocal; @@ -592,9 +592,7 @@ void FixShardlow::initial_integrate(int vflag) // Allocate memory for v_t0 to hold the initial velocities for the ghosts v_t0 = (double (*)[3]) memory->smalloc(sizeof(double)*3*nghost, "FixShardlow:v_t0"); - inum = list->inum; ilist = list->ilist; - dtsqrt = sqrt(update->dt); // process neighbors in the local AIR diff --git a/src/USER-DPD/npair_half_bin_newton_ssa.cpp b/src/USER-DPD/npair_half_bin_newton_ssa.cpp index ce50f7603a..ba90ebc465 100644 --- a/src/USER-DPD/npair_half_bin_newton_ssa.cpp +++ b/src/USER-DPD/npair_half_bin_newton_ssa.cpp @@ -85,8 +85,6 @@ void NPairHalfBinNewtonSSA::build(NeighList *list) tagint *molecule = atom->molecule; tagint **special = atom->special; int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - if (includegroup) nlocal = atom->nfirst; int *molindex = atom->molindex; int *molatom = atom->molatom; @@ -168,7 +166,7 @@ void NPairHalfBinNewtonSSA::build(NeighList *list) for (int subphase = 0; subphase < 4; subphase++) { int s_ybin = ybin + ((subphase & 0x2) ? ns_ssa->sy : 0); int s_xbin = xbin + ((subphase & 0x1) ? ns_ssa->sx : 0); - int ibin, ct; + int ibin; if ((s_ybin < lbinylo) || (s_ybin >= lbinyhi)) continue; if ((s_xbin < lbinxlo) || (s_xbin >= lbinxhi)) continue; diff --git a/src/USER-OMP/npair_half_size_bin_newton_omp.cpp b/src/USER-OMP/npair_half_size_bin_newton_omp.cpp index d8e1e6da44..1f0dca79ac 100644 --- a/src/USER-OMP/npair_half_size_bin_newton_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newton_omp.cpp @@ -48,14 +48,13 @@ void NPairHalfSizeBinNewtonOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,k,m,n,nn,ibin; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; diff --git a/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp b/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp index 3c7b6b118f..1615effad3 100644 --- a/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp @@ -51,14 +51,13 @@ void NPairHalfSizeNsqNewtoffOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,m,n,nn; + int i,j,n; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; diff --git a/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp b/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp index 37a4181af7..e5de57aa51 100644 --- a/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp +++ b/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp @@ -52,7 +52,7 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,m,n,nn,itag,jtag; + int i,j,n,itag,jtag; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; diff --git a/src/npair_half_size_bin_newtoff.cpp b/src/npair_half_size_bin_newtoff.cpp index cf608b5d59..d575f3eb1f 100644 --- a/src/npair_half_size_bin_newtoff.cpp +++ b/src/npair_half_size_bin_newtoff.cpp @@ -36,14 +36,13 @@ NPairHalfSizeBinNewtoff::NPairHalfSizeBinNewtoff(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfSizeBinNewtoff::build(NeighList *list) { - int i,j,k,m,n,nn,ibin; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; diff --git a/src/npair_half_size_bin_newton.cpp b/src/npair_half_size_bin_newton.cpp index 662bf91d6e..da29cb2029 100644 --- a/src/npair_half_size_bin_newton.cpp +++ b/src/npair_half_size_bin_newton.cpp @@ -35,14 +35,13 @@ NPairHalfSizeBinNewton::NPairHalfSizeBinNewton(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfSizeBinNewton::build(NeighList *list) { - int i,j,k,m,n,nn,ibin; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; diff --git a/src/npair_half_size_bin_newton_tri.cpp b/src/npair_half_size_bin_newton_tri.cpp index e70c072280..044847ba8c 100644 --- a/src/npair_half_size_bin_newton_tri.cpp +++ b/src/npair_half_size_bin_newton_tri.cpp @@ -36,14 +36,13 @@ NPairHalfSizeBinNewtonTri::NPairHalfSizeBinNewtonTri(LAMMPS *lmp) : void NPairHalfSizeBinNewtonTri::build(NeighList *list) { - int i,j,k,m,n,nn,ibin; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; diff --git a/src/npair_half_size_nsq_newtoff.cpp b/src/npair_half_size_nsq_newtoff.cpp index e6f5cba657..50a32c87ba 100644 --- a/src/npair_half_size_nsq_newtoff.cpp +++ b/src/npair_half_size_nsq_newtoff.cpp @@ -36,14 +36,13 @@ NPairHalfSizeNsqNewtoff::NPairHalfSizeNsqNewtoff(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfSizeNsqNewtoff::build(NeighList *list) { - int i,j,m,n,nn,bitmask; + int i,j,n,bitmask; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; diff --git a/src/npair_half_size_nsq_newton.cpp b/src/npair_half_size_nsq_newton.cpp index 78811170cb..343172fb98 100644 --- a/src/npair_half_size_nsq_newton.cpp +++ b/src/npair_half_size_nsq_newton.cpp @@ -37,7 +37,7 @@ NPairHalfSizeNsqNewton::NPairHalfSizeNsqNewton(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfSizeNsqNewton::build(NeighList *list) { - int i,j,m,n,nn,itag,jtag,bitmask; + int i,j,n,itag,jtag,bitmask; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; diff --git a/src/npair_skip_size.cpp b/src/npair_skip_size.cpp index 075387f5b0..b75856dde4 100644 --- a/src/npair_skip_size.cpp +++ b/src/npair_skip_size.cpp @@ -33,14 +33,10 @@ NPairSkipSize::NPairSkipSize(LAMMPS *lmp) : NPair(lmp) {} void NPairSkipSize::build(NeighList *list) { - int i,j,ii,jj,m,n,nn,itype,jnum,joriginal,dnum,dnumbytes; - tagint jtag; + int i,j,ii,jj,n,itype,jnum,joriginal; int *neighptr,*jlist; - tagint *tag = atom->tag; int *type = atom->type; - int nlocal = atom->nlocal; - int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; diff --git a/src/npair_skip_size_off2on.cpp b/src/npair_skip_size_off2on.cpp index 92eae285d0..8d728a3c0a 100644 --- a/src/npair_skip_size_off2on.cpp +++ b/src/npair_skip_size_off2on.cpp @@ -34,7 +34,7 @@ NPairSkipSizeOff2on::NPairSkipSizeOff2on(LAMMPS *lmp) : NPair(lmp) {} void NPairSkipSizeOff2on::build(NeighList *list) { - int i,j,ii,jj,m,n,nn,itype,jnum,joriginal,dnum,dnumbytes; + int i,j,ii,jj,n,itype,jnum,joriginal; tagint itag,jtag; int *neighptr,*jlist; diff --git a/src/npair_skip_size_off2on_oneside.cpp b/src/npair_skip_size_off2on_oneside.cpp index f2fca7b128..a04fc7782c 100644 --- a/src/npair_skip_size_off2on_oneside.cpp +++ b/src/npair_skip_size_off2on_oneside.cpp @@ -37,11 +37,9 @@ NPairSkipSizeOff2onOneside::NPairSkipSizeOff2onOneside(LAMMPS *lmp) : void NPairSkipSizeOff2onOneside::build(NeighList *list) { - int i,j,ii,jj,m,n,nn,itype,jnum,joriginal,flip,dnum,dnumbytes,tmp; - tagint jtag; + int i,j,ii,jj,n,itype,jnum,joriginal,flip,tmp; int *surf,*jlist; - tagint *tag = atom->tag; int *type = atom->type; int nlocal = atom->nlocal; From a0de2f27a5390507566626be41c9345d583a1ddc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 8 Feb 2018 19:15:09 +0100 Subject: [PATCH 13/73] avoid segfaults in USER-MESO by checking for required atom style flags --- src/USER-MESO/fix_mvv_dpd.cpp | 3 +++ src/USER-MESO/pair_mdpd.cpp | 3 +++ src/USER-MESO/pair_mdpd_rhosum.cpp | 6 +++++- src/USER-MESO/pair_tdpd.cpp | 10 +++++++--- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/USER-MESO/fix_mvv_dpd.cpp b/src/USER-MESO/fix_mvv_dpd.cpp index 77a67273f6..299f453ea7 100644 --- a/src/USER-MESO/fix_mvv_dpd.cpp +++ b/src/USER-MESO/fix_mvv_dpd.cpp @@ -61,6 +61,9 @@ int FixMvvDPD::setmask() void FixMvvDPD::init() { + if (!atom->vest_flag) + error->all(FLERR,"Fix mvv/dpd requires atom attribute vest"); + dtv = update->dt; dtf = 0.5 * update->dt * force->ftm2v; } diff --git a/src/USER-MESO/pair_mdpd.cpp b/src/USER-MESO/pair_mdpd.cpp index bf78ea5af7..ba72304ddb 100644 --- a/src/USER-MESO/pair_mdpd.cpp +++ b/src/USER-MESO/pair_mdpd.cpp @@ -282,6 +282,9 @@ void PairMDPD::init_style() if (comm->ghost_velocity == 0) error->all(FLERR,"Pair mdpd requires ghost atoms store velocity"); + if (!atom->rho_flag) + error->all(FLERR,"Pair style mdpd requires atom attribute rho"); + // if newton off, forces between atoms ij will be double computed // using different random numbers diff --git a/src/USER-MESO/pair_mdpd_rhosum.cpp b/src/USER-MESO/pair_mdpd_rhosum.cpp index 9c4d6f804f..d2a4ad33d8 100644 --- a/src/USER-MESO/pair_mdpd_rhosum.cpp +++ b/src/USER-MESO/pair_mdpd_rhosum.cpp @@ -62,7 +62,11 @@ PairMDPDRhoSum::~PairMDPDRhoSum() { init specific to this pair style ------------------------------------------------------------------------- */ -void PairMDPDRhoSum::init_style() { +void PairMDPDRhoSum::init_style() +{ + if (!atom->rho_flag) + error->all(FLERR,"Pair style mdpd/rhosum requires atom attribute rho"); + // need a full neighbor list int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->half = 0; diff --git a/src/USER-MESO/pair_tdpd.cpp b/src/USER-MESO/pair_tdpd.cpp index 1f2bd4eb6c..42904d2b5a 100644 --- a/src/USER-MESO/pair_tdpd.cpp +++ b/src/USER-MESO/pair_tdpd.cpp @@ -315,13 +315,17 @@ void PairTDPD::coeff(int narg, char **arg) void PairTDPD::init_style() { if (comm->ghost_velocity == 0) - error->all(FLERR,"Pair tdpd requires ghost atoms store velocity"); + error->all(FLERR,"Pair style tdpd requires ghost atoms store velocity"); + + if (!atom->tdpd_flag) + error->all(FLERR,"Pair style tdpd requires atom properties cc/cc_flux"); // if newton off, forces between atoms ij will be double computed // using different random numbers - if (force->newton_pair == 0 && comm->me == 0) error->warning(FLERR, - "Pair tdpd needs newton pair on for momentum conservation"); + if (force->newton_pair == 0 && comm->me == 0) + error->warning(FLERR,"Pair tdpd needs newton pair on " + "for momentum conservation"); neighbor->request(this,instance_me); } From 3528f9ca27b18d40297c3f69f3dd37cdda84c805 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Feb 2018 15:19:01 +0100 Subject: [PATCH 14/73] fix bugs in documentation and implementation of atom style mdpd --- doc/src/read_data.txt | 2 +- src/USER-MESO/atom_vec_mdpd.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/read_data.txt b/doc/src/read_data.txt index 8c9aa02e22..4ea60163b2 100644 --- a/doc/src/read_data.txt +++ b/doc/src/read_data.txt @@ -547,7 +547,7 @@ charge: atom-ID atom-type q x y z dipole: atom-ID atom-type q x y z mux muy muz dpd: atom-ID atom-type theta x y z edpd: atom-ID atom-type edpd_temp edpd_cv x y z -mdpd: atom-ID atom-type x y z +mdpd: atom-ID atom-type rho x y z tdpd: atom-ID atom-type x y z cc1 cc2 ... ccNspecies electron: atom-ID atom-type q spin eradius x y z ellipsoid: atom-ID atom-type ellipsoidflag density x y z diff --git a/src/USER-MESO/atom_vec_mdpd.cpp b/src/USER-MESO/atom_vec_mdpd.cpp index 0a4d302c36..0d2350a645 100644 --- a/src/USER-MESO/atom_vec_mdpd.cpp +++ b/src/USER-MESO/atom_vec_mdpd.cpp @@ -43,9 +43,9 @@ AtomVecMDPD::AtomVecMDPD(LAMMPS *lmp) : AtomVec(lmp) size_reverse = 3 + 1; // 3 + drho size_border = 6 + 4; // 6 + rho + vest[3] size_velocity = 3; - size_data_atom = 5; + size_data_atom = 6; size_data_vel = 4; - xcol_data = 3; + xcol_data = 4; atom->rho_flag = 1; atom->vest_flag = 1; @@ -817,7 +817,7 @@ void AtomVecMDPD::data_atom(double *coord, imageint imagetmp, char **values) { vest[nlocal][1] = 0.0; vest[nlocal][2] = 0.0; - rho[nlocal] = 0.0; + rho[nlocal] = atof(values[2]); drho[nlocal] = 0.0; atom->nlocal++; From a6eb5214687c7377f758831ea897b770219c5e2d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Feb 2018 17:32:32 +0100 Subject: [PATCH 15/73] strip off unwanted ^M characters --- examples/USER/meso/edpd/in.edpd | 108 ++++++++++++++++---------------- examples/USER/meso/mdpd/in.mdpd | 104 +++++++++++++++--------------- examples/USER/meso/tdpd/in.tdpd | 108 ++++++++++++++++---------------- 3 files changed, 160 insertions(+), 160 deletions(-) diff --git a/examples/USER/meso/edpd/in.edpd b/examples/USER/meso/edpd/in.edpd index 316099bce3..af1a79d73d 100644 --- a/examples/USER/meso/edpd/in.edpd +++ b/examples/USER/meso/edpd/in.edpd @@ -1,54 +1,54 @@ -######################################################################## -### Heat conduction analog of periodic Poiseuille flow problem ### -### using energy-conserving DPD (eDPD) simulation ### -### ### -### Created : Zhen Li (zhen_li@brown.edu) ### -### Division of Applied Mathematics, Brown University. ### -### ### -### mDPD system setup follows Fig.12 in the publication: ### -### Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. ### -### "Energy-conserving dissipative particle dynamics with ### -### temperature-dependent properties". J. Comput. Phys., ### -### 2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003 ### -######################################################################## -units lj -dimension 3 -boundary p p p -neighbor 0.2 bin -neigh_modify every 1 delay 0 check yes - -atom_style edpd - -region edpd block -10 10 -10 10 -5 5 units box -create_box 1 edpd -create_atoms 1 random 16000 276438 NULL -mass 1 1.0 -set atom * edpd/temp 1.0 -set atom * edpd/cv 1.0E5 - -pair_style edpd 1.58 9872598 -#pair_coeff 1 1 18.75 4.5 0.41 1.58 1.45E-5 2.0 1.58 -pair_coeff 1 1 18.75 4.5 0.41 1.58 1.41E-5 2.0 1.58 & - power 10.54 -3.66 3.44 -4.10 & - kappa -0.44 -3.21 5.04 0.00 - -compute mythermo all temp -thermo 100 -thermo_modify temp mythermo -thermo_modify flush yes - -velocity all create 1.0 432982 loop local dist gaussian - -fix mvv all mvv/edpd 0.5 -fix upper all edpd/source cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 -fix lower all edpd/source cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 - -timestep 0.01 -run 500 -reset_timestep 0 - -compute temp all edpd/temp/atom -compute ccT all chunk/atom bin/1d y 0.0 1.0 -fix stat all ave/chunk 1 500 500 ccT c_temp density/number norm sample file temp.profile - -run 500 +######################################################################## +### Heat conduction analog of periodic Poiseuille flow problem ### +### using energy-conserving DPD (eDPD) simulation ### +### ### +### Created : Zhen Li (zhen_li@brown.edu) ### +### Division of Applied Mathematics, Brown University. ### +### ### +### mDPD system setup follows Fig.12 in the publication: ### +### Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. ### +### "Energy-conserving dissipative particle dynamics with ### +### temperature-dependent properties". J. Comput. Phys., ### +### 2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.2 bin +neigh_modify every 1 delay 0 check yes + +atom_style edpd + +region edpd block -10 10 -10 10 -5 5 units box +create_box 1 edpd +create_atoms 1 random 16000 276438 NULL +mass 1 1.0 +set atom * edpd/temp 1.0 +set atom * edpd/cv 1.0E5 + +pair_style edpd 1.58 9872598 +#pair_coeff 1 1 18.75 4.5 0.41 1.58 1.45E-5 2.0 1.58 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.41E-5 2.0 1.58 & + power 10.54 -3.66 3.44 -4.10 & + kappa -0.44 -3.21 5.04 0.00 + +compute mythermo all temp +thermo 100 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 432982 loop local dist gaussian + +fix mvv all mvv/edpd 0.5 +fix upper all edpd/source cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 +fix lower all edpd/source cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 + +timestep 0.01 +run 500 +reset_timestep 0 + +compute temp all edpd/temp/atom +compute ccT all chunk/atom bin/1d y 0.0 1.0 +fix stat all ave/chunk 1 500 500 ccT c_temp density/number norm sample file temp.profile + +run 500 diff --git a/examples/USER/meso/mdpd/in.mdpd b/examples/USER/meso/mdpd/in.mdpd index 201b4a340e..b0740c8227 100644 --- a/examples/USER/meso/mdpd/in.mdpd +++ b/examples/USER/meso/mdpd/in.mdpd @@ -1,52 +1,52 @@ -######################################################################## -#### 3D droplet oscilation using many-body DPD simulation ### -#### ### -#### Created : Zhen Li (zhen_li@brown.edu) ### -#### Division of Applied Mathematics, Brown University. ### -#### ### -#### mDPD parameters follow the choice of the publication: ### -#### Z. Li et al. "Three dimensional flow structures in a moving ### -#### droplet on substrate: a dissipative particle dynamics study" ### -#### Physics of Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366 ### -######################################################################## -units lj -dimension 3 -boundary p p p -neighbor 0.3 bin -neigh_modify every 1 delay 0 check yes - -atom_style mdpd - -region mdpd block -25 25 -10 10 -10 10 units box -create_box 1 mdpd - -lattice fcc 6 -region film block -20 20 -7.5 7.5 -2.0 2.0 units box -create_atoms 1 region film - -pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 9872598 -pair_coeff 1 1 mdpd/rhosum 0.75 -pair_coeff 1 1 mdpd -40 25 18.0 1.0 0.75 -mass 1 1.0 - -compute mythermo all temp -thermo 100 -thermo_modify temp mythermo -thermo_modify flush yes - -velocity all create 1.0 38497 loop local dist gaussian - -fix mvv all mvv/dpd - -#dump mydump all atom 100 atom.lammpstrj - -#dump jpg all image 200 image.*.jpg type type zoom 5 adiam 0.5 & -# view 90 90 box no 0 size 600 200 -#dump_modify jpg pad 4 - -#dump avi all movie 200 movie.avi type type zoom 5 adiam 0.5 & -# view 90 90 box no 0 size 600 200 -#dump_modify avi pad 4 - -timestep 0.01 -run 4000 +######################################################################## +#### 3D droplet oscilation using many-body DPD simulation ### +#### ### +#### Created : Zhen Li (zhen_li@brown.edu) ### +#### Division of Applied Mathematics, Brown University. ### +#### ### +#### mDPD parameters follow the choice of the publication: ### +#### Z. Li et al. "Three dimensional flow structures in a moving ### +#### droplet on substrate: a dissipative particle dynamics study" ### +#### Physics of Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.3 bin +neigh_modify every 1 delay 0 check yes + +atom_style mdpd + +region mdpd block -25 25 -10 10 -10 10 units box +create_box 1 mdpd + +lattice fcc 6 +region film block -20 20 -7.5 7.5 -2.0 2.0 units box +create_atoms 1 region film + +pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 9872598 +pair_coeff 1 1 mdpd/rhosum 0.75 +pair_coeff 1 1 mdpd -40 25 18.0 1.0 0.75 +mass 1 1.0 + +compute mythermo all temp +thermo 100 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 38497 loop local dist gaussian + +fix mvv all mvv/dpd + +#dump mydump all atom 100 atom.lammpstrj + +#dump jpg all image 200 image.*.jpg type type zoom 5 adiam 0.5 & +# view 90 90 box no 0 size 600 200 +#dump_modify jpg pad 4 + +#dump avi all movie 200 movie.avi type type zoom 5 adiam 0.5 & +# view 90 90 box no 0 size 600 200 +#dump_modify avi pad 4 + +timestep 0.01 +run 4000 diff --git a/examples/USER/meso/tdpd/in.tdpd b/examples/USER/meso/tdpd/in.tdpd index 748a4f5077..5107e7a454 100644 --- a/examples/USER/meso/tdpd/in.tdpd +++ b/examples/USER/meso/tdpd/in.tdpd @@ -1,54 +1,54 @@ -######################################################################## -### Pure diffusion with a reaction source term analog of a periodic ### -### Poiseuille flow problem using transport DPD (tDPD) simulation ### -### ### -### Created : Zhen Li (zhen_li@brown.edu) ### -### Division of Applied Mathematics, Brown University. ### -### ### -### tDPD system setup follows Fig.1 in the publication: ### -### Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. ### -### "Transport dissipative particle dynamics model for mesoscopic ### -### advection-diffusion-reaction problems. J. Chem. Phys., ### -### 2015, 143: 014101. DOI: 10.1063/1.4923254 ### -######################################################################## -units lj -dimension 3 -boundary p p p -neighbor 0.2 bin -neigh_modify every 1 delay 0 check yes - -atom_style tdpd 2 - -region tdpd block -10 10 -10 10 -5 5 units box -create_box 1 tdpd -create_atoms 1 random 16000 276438 NULL -mass 1 1.0 -set atom * cc 1 1.0 -set atom * cc 2 1.0 - -pair_style tdpd 1.0 1.58 9872598 -pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0 - -compute mythermo all temp -thermo 50 -thermo_modify temp mythermo -thermo_modify flush yes - -velocity all create 1.0 432982 loop local dist gaussian - -fix mvv all mvv/tdpd 0.5 -fix upper1 all tdpd/source 1 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 -fix lower1 all tdpd/source 1 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 -fix upper2 all tdpd/source 2 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 -0.01 -fix lower2 all tdpd/source 2 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 0.01 - -timestep 0.01 -run 500 -reset_timestep 0 - -compute cc1 all tdpd/cc/atom 1 -compute cc2 all tdpd/cc/atom 2 -compute bin all chunk/atom bin/1d y 0.0 1.0 -fix stat all ave/chunk 1 100 100 bin c_cc1 c_cc2 norm sample file cc.profile - -run 100 +######################################################################## +### Pure diffusion with a reaction source term analog of a periodic ### +### Poiseuille flow problem using transport DPD (tDPD) simulation ### +### ### +### Created : Zhen Li (zhen_li@brown.edu) ### +### Division of Applied Mathematics, Brown University. ### +### ### +### tDPD system setup follows Fig.1 in the publication: ### +### Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. ### +### "Transport dissipative particle dynamics model for mesoscopic ### +### advection-diffusion-reaction problems. J. Chem. Phys., ### +### 2015, 143: 014101. DOI: 10.1063/1.4923254 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.2 bin +neigh_modify every 1 delay 0 check yes + +atom_style tdpd 2 + +region tdpd block -10 10 -10 10 -5 5 units box +create_box 1 tdpd +create_atoms 1 random 16000 276438 NULL +mass 1 1.0 +set atom * cc 1 1.0 +set atom * cc 2 1.0 + +pair_style tdpd 1.0 1.58 9872598 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0 + +compute mythermo all temp +thermo 50 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 432982 loop local dist gaussian + +fix mvv all mvv/tdpd 0.5 +fix upper1 all tdpd/source 1 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 +fix lower1 all tdpd/source 1 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 +fix upper2 all tdpd/source 2 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 -0.01 +fix lower2 all tdpd/source 2 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 0.01 + +timestep 0.01 +run 500 +reset_timestep 0 + +compute cc1 all tdpd/cc/atom 1 +compute cc2 all tdpd/cc/atom 2 +compute bin all chunk/atom bin/1d y 0.0 1.0 +fix stat all ave/chunk 1 100 100 bin c_cc1 c_cc2 norm sample file cc.profile + +run 100 From 8a39ae858503c81696265ee0cea35a1d2d532230 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Feb 2018 17:32:42 +0100 Subject: [PATCH 16/73] remove dead code --- src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp b/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp index 6a1cb46ea6..fc101a33d2 100644 --- a/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp @@ -49,7 +49,7 @@ void NPairHalfSizeBinNewtoffOmp::build(NeighList *list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,k,m,n,nn,ibin; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; int *neighptr; @@ -58,7 +58,6 @@ void NPairHalfSizeBinNewtoffOmp::build(NeighList *list) double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; From 7e78738c7374cb30b6c73d57ec5c9c016944a756 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Fri, 9 Feb 2018 14:26:21 -0700 Subject: [PATCH 17/73] patch 5Feb18 --- doc/src/Manual.txt | 4 ++-- src/version.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 1a4d2eb779..3ef5a11cd5 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ LAMMPS Users Manual - + @@ -21,7 +21,7 @@

LAMMPS Documentation :c,h3 -17 Jan 2018 version :c,h4 +5 Feb 2018 version :c,h4 Version info: :h4 diff --git a/src/version.h b/src/version.h index f544f0203c..ad4b632883 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "17 Jan 2018" +#define LAMMPS_VERSION "5 Feb 2018" From 6efeab0f3a0cc2879b47b01f6112a24d92e0d7e8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 10 Feb 2018 20:40:02 +0100 Subject: [PATCH 18/73] avoid segfault when using a hash as map on an empty system --- src/atom_map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atom_map.cpp b/src/atom_map.cpp index 9d257d99de..4b1be77a06 100644 --- a/src/atom_map.cpp +++ b/src/atom_map.cpp @@ -57,7 +57,7 @@ void Atom::map_init(int check) map_nused = 0; map_free = 0; for (int i = 0; i < map_nhash; i++) map_hash[i].next = i+1; - map_hash[map_nhash-1].next = -1; + if (map_nhash > 0) map_hash[map_nhash-1].next = -1; } // recreating: delete old map and create new one for array or hash From afd39eb9b89c18a1d16a56ad371cd25ffe72fe81 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 11 Feb 2018 16:17:24 +0100 Subject: [PATCH 19/73] correctly represent, that the molecule summary refers to the largest type number and not the number of types --- src/molecule.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/molecule.cpp b/src/molecule.cpp index b93cf24e7e..78dc4b82b3 100644 --- a/src/molecule.cpp +++ b/src/molecule.cpp @@ -144,17 +144,17 @@ Molecule::Molecule(LAMMPS *lmp, int narg, char **arg, int &index) : if (me == 0) { if (screen) fprintf(screen,"Read molecule %s:\n" - " %d atoms with %d types\n %d bonds with %d types\n" - " %d angles with %d types\n %d dihedrals with %d types\n" - " %d impropers with %d types\n", + " %d atoms with max type %d\n %d bonds with max type %d\n" + " %d angles with max type %d\n %d dihedrals with max type %d\n" + " %d impropers with max type %d\n", id,natoms,ntypes, nbonds,nbondtypes,nangles,nangletypes, ndihedrals,ndihedraltypes,nimpropers,nimpropertypes); if (logfile) fprintf(logfile,"Read molecule %s:\n" - " %d atoms with %d types\n %d bonds with %d types\n" - " %d angles with %d types\n %d dihedrals with %d types\n" - " %d impropers with %d types\n", + " %d atoms with max type %d\n %d bonds with max type %d\n" + " %d angles with max type %d\n %d dihedrals with max type %d\n" + " %d impropers with max type %d\n", id,natoms,ntypes, nbonds,nbondtypes,nangles,nangletypes, ndihedrals,ndihedraltypes,nimpropers,nimpropertypes); From b9eaf98702c4b1903f82372d0a61e7fc7ed90fdb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 11 Feb 2018 17:09:06 +0100 Subject: [PATCH 20/73] avoid uninitialized memory access errors reports from valgrind with fix qeq --- src/QEQ/fix_qeq.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 757eae5dd2..b9dfbdae19 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -362,6 +362,7 @@ int FixQEq::CG( double *b, double *x ) i = ilist[ii]; if (atom->mask[i] & groupbit) d[i] = r[i] * Hdia_inv[i]; + else d[i] = 0.0; } b_norm = parallel_norm( b, inum ); @@ -594,6 +595,7 @@ double FixQEq::parallel_norm( double *v, int n ) ilist = list->ilist; my_sum = 0.0; + norm_sqr = 0.0; for( ii = 0; ii < n; ++ii ) { i = ilist[ii]; if (atom->mask[i] & groupbit) From 776f5887468400d988885beb0d6a825ac4e071a7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 Feb 2018 18:43:30 +0100 Subject: [PATCH 21/73] add support for UFM pair style support to OpenCL compilation makefile --- lib/gpu/Opencl.makefile | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/gpu/Opencl.makefile b/lib/gpu/Opencl.makefile index f116508ae5..bb07151447 100644 --- a/lib/gpu/Opencl.makefile +++ b/lib/gpu/Opencl.makefile @@ -65,7 +65,8 @@ OBJS = $(OBJ_DIR)/lal_atom.o $(OBJ_DIR)/lal_answer.o \ $(OBJ_DIR)/lal_coul.o $(OBJ_DIR)/lal_coul_ext.o \ $(OBJ_DIR)/lal_coul_debye.o $(OBJ_DIR)/lal_coul_debye_ext.o \ $(OBJ_DIR)/lal_zbl.o $(OBJ_DIR)/lal_zbl_ext.o \ - $(OBJ_DIR)/lal_lj_cubic.o $(OBJ_DIR)/lal_lj_cubic_ext.o + $(OBJ_DIR)/lal_lj_cubic.o $(OBJ_DIR)/lal_lj_cubic_ext.o \ + $(OBJ_DIR)/lal_ufm.o $(OBJ_DIR)/lal_ufm_ext.o KERS = $(OBJ_DIR)/device_cl.h $(OBJ_DIR)/atom_cl.h \ $(OBJ_DIR)/neighbor_cpu_cl.h $(OBJ_DIR)/pppm_cl.h \ @@ -93,7 +94,8 @@ KERS = $(OBJ_DIR)/device_cl.h $(OBJ_DIR)/atom_cl.h \ $(OBJ_DIR)/tersoff_cl.h $(OBJ_DIR)/tersoff_zbl_cl.h \ $(OBJ_DIR)/tersoff_mod_cl.h $(OBJ_DIR)/coul_cl.h \ $(OBJ_DIR)/coul_debye_cl.h $(OBJ_DIR)/zbl_cl.h \ - $(OBJ_DIR)/lj_cubic_cl.h $(OBJ_DIR)/vashishta_cl.h + $(OBJ_DIR)/lj_cubic_cl.h $(OBJ_DIR)/vashishta_cl.h \ + $(OBJ_DIR)/ufm_cl.h OCL_EXECS = $(BIN_DIR)/ocl_get_devices @@ -577,6 +579,15 @@ $(OBJ_DIR)/lal_lj_cubic.o: $(ALL_H) lal_lj_cubic.h lal_lj_cubic.cpp $(OBJ_DIR)/ $(OBJ_DIR)/lal_lj_cubic_ext.o: $(ALL_H) lal_lj_cubic.h lal_lj_cubic_ext.cpp lal_base_atomic.h $(OCL) -o $@ -c lal_lj_cubic_ext.cpp -I$(OBJ_DIR) +$(OBJ_DIR)/ufm_cl.h: lal_ufm.cu $(PRE1_H) + $(BSH) ./geryon/file_to_cstr.sh ufm $(PRE1_H) lal_ufm.cu $(OBJ_DIR)/ufm_cl.h; + +$(OBJ_DIR)/lal_ufm.o: $(ALL_H) lal_ufm.h lal_ufm.cpp $(OBJ_DIR)/ufm_cl.h $(OBJ_DIR)/ufm_cl.h $(OBJ_DIR)/lal_base_atomic.o + $(OCL) -o $@ -c lal_ufm.cpp -I$(OBJ_DIR) + +$(OBJ_DIR)/lal_ufm_ext.o: $(ALL_H) lal_ufm.h lal_ufm_ext.cpp lal_base_atomic.h + $(OCL) -o $@ -c lal_ufm_ext.cpp -I$(OBJ_DIR) + $(BIN_DIR)/ocl_get_devices: ./geryon/ucl_get_devices.cpp $(OCL) -o $@ ./geryon/ucl_get_devices.cpp -DUCL_OPENCL $(OCL_LINK) From 378c5071bf8668c0a199ce53bcea915109f248f3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 Feb 2018 14:26:05 -0500 Subject: [PATCH 22/73] protect library interface from issuing lammps commands during run and minimize --- src/library.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 8f87d6fab2..0544aa5a4a 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -203,7 +203,10 @@ void lammps_file(void *ptr, char *str) BEGIN_CAPTURE { - lmp->input->file(str); + if (lmp->update->whichflag != 0) + lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); + else + lmp->input->file(str); } END_CAPTURE } @@ -221,7 +224,10 @@ char *lammps_command(void *ptr, char *str) BEGIN_CAPTURE { - result = lmp->input->one(str); + if (lmp->update->whichflag != 0) + lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); + else + result = lmp->input->one(str); } END_CAPTURE @@ -270,6 +276,13 @@ void lammps_commands_string(void *ptr, char *str) { LAMMPS *lmp = (LAMMPS *) ptr; + BEGIN_CAPTURE + { + if (lmp->update->whichflag != 0) + lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); + } + END_CAPTURE + // make copy of str so can strtok() it int n = strlen(str) + 1; From 3a909e15ae34b32c90633a40650ae975179ed6ab Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 11:43:52 +0100 Subject: [PATCH 23/73] remove non-functional doxygen generated navigation header from AtC doc files --- doc/src/USER/atc/man_add_molecule.html | 12 ------------ doc/src/USER/atc/man_add_species.html | 12 ------------ doc/src/USER/atc/man_atom_element_map.html | 12 ------------ doc/src/USER/atc/man_atom_weight.html | 12 ------------ doc/src/USER/atc/man_atomic_charge.html | 12 ------------ doc/src/USER/atc/man_boundary.html | 12 ------------ doc/src/USER/atc/man_boundary_dynamics.html | 12 ------------ doc/src/USER/atc/man_boundary_faceset.html | 12 ------------ doc/src/USER/atc/man_boundary_integral.html | 14 +------------- .../USER/atc/man_consistent_fe_initialization.html | 12 ------------ doc/src/USER/atc/man_contour_integral.html | 14 +------------- doc/src/USER/atc/man_control.html | 12 ------------ doc/src/USER/atc/man_control_momentum.html | 12 ------------ doc/src/USER/atc/man_control_thermal.html | 12 ------------ ..._control_thermal_correction_max_iterations.html | 12 ------------ doc/src/USER/atc/man_decomposition.html | 12 ------------ doc/src/USER/atc/man_electron_integration.html | 14 +------------- doc/src/USER/atc/man_equilibrium_start.html | 12 ------------ doc/src/USER/atc/man_extrinsic_exchange.html | 14 +------------- doc/src/USER/atc/man_fe_md_boundary.html | 12 ------------ doc/src/USER/atc/man_filter_scale.html | 12 ------------ doc/src/USER/atc/man_filter_type.html | 12 ------------ doc/src/USER/atc/man_fix_atc.html | 12 ------------ doc/src/USER/atc/man_fix_flux.html | 12 ------------ doc/src/USER/atc/man_fix_nodes.html | 12 ------------ doc/src/USER/atc/man_hardy_computes.html | 14 +------------- doc/src/USER/atc/man_hardy_fields.html | 14 +------------- doc/src/USER/atc/man_hardy_gradients.html | 14 +------------- doc/src/USER/atc/man_hardy_kernel.html | 14 +------------- doc/src/USER/atc/man_hardy_on_the_fly.html | 14 +------------- doc/src/USER/atc/man_hardy_rates.html | 14 +------------- doc/src/USER/atc/man_initial.html | 12 ------------ doc/src/USER/atc/man_internal_atom_integrate.html | 12 ------------ doc/src/USER/atc/man_internal_element_set.html | 12 ------------ doc/src/USER/atc/man_internal_quadrature.html | 12 ------------ doc/src/USER/atc/man_kernel_function.html | 14 +------------- doc/src/USER/atc/man_localized_lambda.html | 12 ------------ doc/src/USER/atc/man_lumped_lambda_solve.html | 12 ------------ doc/src/USER/atc/man_mask_direction.html | 12 ------------ doc/src/USER/atc/man_mass_matrix.html | 12 ------------ doc/src/USER/atc/man_material.html | 12 ------------ doc/src/USER/atc/man_mesh_add_to_nodeset.html | 12 ------------ doc/src/USER/atc/man_mesh_create.html | 12 ------------ doc/src/USER/atc/man_mesh_create_elementset.html | 12 ------------ doc/src/USER/atc/man_mesh_create_faceset_box.html | 12 ------------ .../USER/atc/man_mesh_create_faceset_plane.html | 12 ------------ doc/src/USER/atc/man_mesh_create_nodeset.html | 12 ------------ doc/src/USER/atc/man_mesh_delete_elements.html | 12 ------------ .../USER/atc/man_mesh_nodeset_to_elementset.html | 12 ------------ doc/src/USER/atc/man_mesh_output.html | 12 ------------ doc/src/USER/atc/man_mesh_quadrature.html | 12 ------------ doc/src/USER/atc/man_mesh_read.html | 12 ------------ doc/src/USER/atc/man_mesh_write.html | 12 ------------ .../USER/atc/man_momentum_time_integration.html | 14 +------------- doc/src/USER/atc/man_output.html | 14 +------------- doc/src/USER/atc/man_output_elementset.html | 14 +------------- doc/src/USER/atc/man_output_nodeset.html | 14 +------------- doc/src/USER/atc/man_pair_interactions.html | 12 ------------ doc/src/USER/atc/man_poisson_solver.html | 12 ------------ doc/src/USER/atc/man_read_restart.html | 12 ------------ doc/src/USER/atc/man_remove_molecule.html | 12 ------------ doc/src/USER/atc/man_remove_source.html | 12 ------------ doc/src/USER/atc/man_remove_species.html | 12 ------------ .../atc/man_reset_atomic_reference_positions.html | 12 ------------ doc/src/USER/atc/man_reset_time.html | 12 ------------ doc/src/USER/atc/man_sample_frequency.html | 14 +------------- doc/src/USER/atc/man_set.html | 14 +------------- doc/src/USER/atc/man_source.html | 12 ------------ doc/src/USER/atc/man_source_integration.html | 12 ------------ doc/src/USER/atc/man_temperature_definition.html | 12 ------------ doc/src/USER/atc/man_thermal_time_integration.html | 14 +------------- doc/src/USER/atc/man_time_filter.html | 12 ------------ doc/src/USER/atc/man_track_displacement.html | 12 ------------ doc/src/USER/atc/man_unfix_flux.html | 12 ------------ doc/src/USER/atc/man_unfix_nodes.html | 12 ------------ doc/src/USER/atc/man_write_atom_weights.html | 12 ------------ doc/src/USER/atc/man_write_restart.html | 12 ------------ 77 files changed, 18 insertions(+), 942 deletions(-) diff --git a/doc/src/USER/atc/man_add_molecule.html b/doc/src/USER/atc/man_add_molecule.html index 99270c7276..9eeebfac7d 100644 --- a/doc/src/USER/atc/man_add_molecule.html +++ b/doc/src/USER/atc/man_add_molecule.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_add_species.html b/doc/src/USER/atc/man_add_species.html index 95192034d9..06b8c0b91c 100644 --- a/doc/src/USER/atc/man_add_species.html +++ b/doc/src/USER/atc/man_add_species.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_atom_element_map.html b/doc/src/USER/atc/man_atom_element_map.html index 3073c0f920..351447e07e 100644 --- a/doc/src/USER/atc/man_atom_element_map.html +++ b/doc/src/USER/atc/man_atom_element_map.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_atom_weight.html b/doc/src/USER/atc/man_atom_weight.html index 18b0dcae6e..def587b98b 100644 --- a/doc/src/USER/atc/man_atom_weight.html +++ b/doc/src/USER/atc/man_atom_weight.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_atomic_charge.html b/doc/src/USER/atc/man_atomic_charge.html index 718f8a433f..e0988cb98e 100644 --- a/doc/src/USER/atc/man_atomic_charge.html +++ b/doc/src/USER/atc/man_atomic_charge.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_boundary.html b/doc/src/USER/atc/man_boundary.html index 3e877355f1..ad7fe96cf4 100644 --- a/doc/src/USER/atc/man_boundary.html +++ b/doc/src/USER/atc/man_boundary.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_boundary_dynamics.html b/doc/src/USER/atc/man_boundary_dynamics.html index 87696b8b43..a68d1a252f 100644 --- a/doc/src/USER/atc/man_boundary_dynamics.html +++ b/doc/src/USER/atc/man_boundary_dynamics.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_boundary_faceset.html b/doc/src/USER/atc/man_boundary_faceset.html index 2e96330d6c..0e13df41e3 100644 --- a/doc/src/USER/atc/man_boundary_faceset.html +++ b/doc/src/USER/atc/man_boundary_faceset.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_boundary_integral.html b/doc/src/USER/atc/man_boundary_integral.html index 3e78f12963..6ba17562ee 100644 --- a/doc/src/USER/atc/man_boundary_integral.html +++ b/doc/src/USER/atc/man_boundary_integral.html @@ -8,18 +8,6 @@ -
@@ -39,7 +27,7 @@ description

Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file

restrictions

-

Must be used with the hardy/field type of AtC fix ( see fix atc command )

+

Must be used with the hardy/field type of AtC fix ( see fix atc command )

related

diff --git a/doc/src/USER/atc/man_consistent_fe_initialization.html b/doc/src/USER/atc/man_consistent_fe_initialization.html index f4c33f5076..16abc2593f 100644 --- a/doc/src/USER/atc/man_consistent_fe_initialization.html +++ b/doc/src/USER/atc/man_consistent_fe_initialization.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_contour_integral.html b/doc/src/USER/atc/man_contour_integral.html index c321605e88..da43a1d863 100644 --- a/doc/src/USER/atc/man_contour_integral.html +++ b/doc/src/USER/atc/man_contour_integral.html @@ -8,18 +8,6 @@ -
@@ -40,7 +28,7 @@ description

Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file

restrictions

-

Must be used with the hardy/field type of AtC fix ( see fix atc command )

+

Must be used with the hardy/field type of AtC fix ( see fix atc command )

related

diff --git a/doc/src/USER/atc/man_control.html b/doc/src/USER/atc/man_control.html index af0236f30e..b63c07b327 100644 --- a/doc/src/USER/atc/man_control.html +++ b/doc/src/USER/atc/man_control.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_control_momentum.html b/doc/src/USER/atc/man_control_momentum.html index 805c12567a..03e1264164 100644 --- a/doc/src/USER/atc/man_control_momentum.html +++ b/doc/src/USER/atc/man_control_momentum.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_control_thermal.html b/doc/src/USER/atc/man_control_thermal.html index 301297f306..0f70c595cc 100644 --- a/doc/src/USER/atc/man_control_thermal.html +++ b/doc/src/USER/atc/man_control_thermal.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html b/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html index 8a511019f9..45f4d9246e 100644 --- a/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html +++ b/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_decomposition.html b/doc/src/USER/atc/man_decomposition.html index 15725073d3..b57a276e31 100644 --- a/doc/src/USER/atc/man_decomposition.html +++ b/doc/src/USER/atc/man_decomposition.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_electron_integration.html b/doc/src/USER/atc/man_electron_integration.html index b14c14d86d..bb9a4f72bd 100644 --- a/doc/src/USER/atc/man_electron_integration.html +++ b/doc/src/USER/atc/man_electron_integration.html @@ -8,18 +8,6 @@ -
@@ -42,7 +30,7 @@ description

Switches between integration scheme for the electron temperature. The number of subcyling steps used to integrate the electron temperature 1 LAMMPS timestep can be manually adjusted to capture fast electron dynamics.

restrictions

-

For use only with two_temperature type of AtC fix ( see fix atc command )
+

For use only with two_temperature type of AtC fix ( see fix atc command )

default

diff --git a/doc/src/USER/atc/man_equilibrium_start.html b/doc/src/USER/atc/man_equilibrium_start.html index 3723cf98bf..08106f1174 100644 --- a/doc/src/USER/atc/man_equilibrium_start.html +++ b/doc/src/USER/atc/man_equilibrium_start.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_extrinsic_exchange.html b/doc/src/USER/atc/man_extrinsic_exchange.html index 8f6533ad64..dca429e3b8 100644 --- a/doc/src/USER/atc/man_extrinsic_exchange.html +++ b/doc/src/USER/atc/man_extrinsic_exchange.html @@ -8,18 +8,6 @@ -
@@ -38,7 +26,7 @@ restrictions

Only valid for use with two_temperature type of AtC fix.

related

-

see fix atc command

+

see fix atc command

default

on

diff --git a/doc/src/USER/atc/man_fe_md_boundary.html b/doc/src/USER/atc/man_fe_md_boundary.html index 06bca2b337..d83821b867 100644 --- a/doc/src/USER/atc/man_fe_md_boundary.html +++ b/doc/src/USER/atc/man_fe_md_boundary.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_filter_scale.html b/doc/src/USER/atc/man_filter_scale.html index 975f87e949..bca799804f 100644 --- a/doc/src/USER/atc/man_filter_scale.html +++ b/doc/src/USER/atc/man_filter_scale.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_filter_type.html b/doc/src/USER/atc/man_filter_type.html index 8d9dbd3d12..8b7d7ad58e 100644 --- a/doc/src/USER/atc/man_filter_type.html +++ b/doc/src/USER/atc/man_filter_type.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_fix_atc.html b/doc/src/USER/atc/man_fix_atc.html index e710c28ed2..0e14498ffe 100644 --- a/doc/src/USER/atc/man_fix_atc.html +++ b/doc/src/USER/atc/man_fix_atc.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_fix_flux.html b/doc/src/USER/atc/man_fix_flux.html index d8369a8785..46400e9103 100644 --- a/doc/src/USER/atc/man_fix_flux.html +++ b/doc/src/USER/atc/man_fix_flux.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_fix_nodes.html b/doc/src/USER/atc/man_fix_nodes.html index cf5c93590a..4745e241c6 100644 --- a/doc/src/USER/atc/man_fix_nodes.html +++ b/doc/src/USER/atc/man_fix_nodes.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_hardy_computes.html b/doc/src/USER/atc/man_hardy_computes.html index c16550742b..e6fb1430a6 100644 --- a/doc/src/USER/atc/man_hardy_computes.html +++ b/doc/src/USER/atc/man_hardy_computes.html @@ -8,18 +8,6 @@ -
@@ -50,7 +38,7 @@ description

restrictions

-

Must be used with the hardy/field type of AtC fix ( see fix atc command )
+

Must be used with the hardy/field type of AtC fix ( see fix atc command )
Per-atom compute must be specified before corresponding continuum field can be requested

diff --git a/doc/src/USER/atc/man_hardy_fields.html b/doc/src/USER/atc/man_hardy_fields.html index 1f55fd5e37..c393bcba2a 100644 --- a/doc/src/USER/atc/man_hardy_fields.html +++ b/doc/src/USER/atc/man_hardy_fields.html @@ -8,18 +8,6 @@ -
@@ -68,7 +56,7 @@ description

will only output the velocity and temperature fields.

restrictions

-

Must be used with the hardy/field type of AtC fix, see fix atc command. Currently, the stress and heat flux formulas are only correct for central force potentials, e.g. Lennard-Jones and EAM but not Stillinger-Weber.

+

Must be used with the hardy/field type of AtC fix, see fix atc command. Currently, the stress and heat flux formulas are only correct for central force potentials, e.g. Lennard-Jones and EAM but not Stillinger-Weber.

related

See fix_modify AtC gradients , fix_modify AtC rates and fix_modify AtC computes

diff --git a/doc/src/USER/atc/man_hardy_gradients.html b/doc/src/USER/atc/man_hardy_gradients.html index 708fecbca1..12a80c2166 100644 --- a/doc/src/USER/atc/man_hardy_gradients.html +++ b/doc/src/USER/atc/man_hardy_gradients.html @@ -8,18 +8,6 @@ -
@@ -43,7 +31,7 @@ description

Requests calculation and ouput of gradients of the fields from the transfer class. These gradients will be with regard to spatial or material coordinate for eulerian or lagrangian analysis, respectively, as specified by atom_element_map (see fix_modify AtC atom_element_map )

restrictions

-

Must be used with the hardy/field type of AtC fix ( see fix atc command )

+

Must be used with the hardy/field type of AtC fix ( see fix atc command )

related

diff --git a/doc/src/USER/atc/man_hardy_kernel.html b/doc/src/USER/atc/man_hardy_kernel.html index 3d81b367dd..6c8ddd9923 100644 --- a/doc/src/USER/atc/man_hardy_kernel.html +++ b/doc/src/USER/atc/man_hardy_kernel.html @@ -8,18 +8,6 @@ -
@@ -51,7 +39,7 @@ restrictions

Must be used with the hardy AtC fix
For bar kernel types, half-width oriented along x-direction
For cylinder kernel types, cylindrical axis is assumed to be in z-direction
- ( see fix atc command )

+ ( see fix atc command )

related

diff --git a/doc/src/USER/atc/man_hardy_on_the_fly.html b/doc/src/USER/atc/man_hardy_on_the_fly.html index d140cf6840..bc2d71a17b 100644 --- a/doc/src/USER/atc/man_hardy_on_the_fly.html +++ b/doc/src/USER/atc/man_hardy_on_the_fly.html @@ -8,18 +8,6 @@ -
@@ -45,7 +33,7 @@ description

restrictions

-

Must be used with the hardy/field type of AtC fix ( see fix atc command )

+

Must be used with the hardy/field type of AtC fix ( see fix atc command )

related

diff --git a/doc/src/USER/atc/man_hardy_rates.html b/doc/src/USER/atc/man_hardy_rates.html index ab0315cb65..4edec12d68 100644 --- a/doc/src/USER/atc/man_hardy_rates.html +++ b/doc/src/USER/atc/man_hardy_rates.html @@ -8,18 +8,6 @@ -
@@ -44,7 +32,7 @@ description

restrictions

-

Must be used with the hardy/field type of AtC fix ( see fix atc command )

+

Must be used with the hardy/field type of AtC fix ( see fix atc command )

related

diff --git a/doc/src/USER/atc/man_initial.html b/doc/src/USER/atc/man_initial.html index c0a0be3852..539d8afd59 100644 --- a/doc/src/USER/atc/man_initial.html +++ b/doc/src/USER/atc/man_initial.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_internal_atom_integrate.html b/doc/src/USER/atc/man_internal_atom_integrate.html index b15bf71aad..5a8704c46f 100644 --- a/doc/src/USER/atc/man_internal_atom_integrate.html +++ b/doc/src/USER/atc/man_internal_atom_integrate.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_internal_element_set.html b/doc/src/USER/atc/man_internal_element_set.html index 31bee57860..bf1cb007f6 100644 --- a/doc/src/USER/atc/man_internal_element_set.html +++ b/doc/src/USER/atc/man_internal_element_set.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_internal_quadrature.html b/doc/src/USER/atc/man_internal_quadrature.html index 172187c298..8ad3399e86 100644 --- a/doc/src/USER/atc/man_internal_quadrature.html +++ b/doc/src/USER/atc/man_internal_quadrature.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_kernel_function.html b/doc/src/USER/atc/man_kernel_function.html index 08ec827dec..e2702cd9fc 100644 --- a/doc/src/USER/atc/man_kernel_function.html +++ b/doc/src/USER/atc/man_kernel_function.html @@ -8,18 +8,6 @@ -
@@ -50,7 +38,7 @@ restrictions

Must be used with the hardy AtC fix
For bar kernel types, half-width oriented along x-direction
For cylinder kernel types, cylindrical axis is assumed to be in z-direction
- ( see fix atc command )

+ ( see fix atc command )

related

diff --git a/doc/src/USER/atc/man_localized_lambda.html b/doc/src/USER/atc/man_localized_lambda.html index 5dadb9d730..e435504233 100644 --- a/doc/src/USER/atc/man_localized_lambda.html +++ b/doc/src/USER/atc/man_localized_lambda.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_lumped_lambda_solve.html b/doc/src/USER/atc/man_lumped_lambda_solve.html index bb3f8cfde8..43eee362e2 100644 --- a/doc/src/USER/atc/man_lumped_lambda_solve.html +++ b/doc/src/USER/atc/man_lumped_lambda_solve.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mask_direction.html b/doc/src/USER/atc/man_mask_direction.html index 01ca9d192b..07cf7a9418 100644 --- a/doc/src/USER/atc/man_mask_direction.html +++ b/doc/src/USER/atc/man_mask_direction.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mass_matrix.html b/doc/src/USER/atc/man_mass_matrix.html index 5f543fc20c..40f489985d 100644 --- a/doc/src/USER/atc/man_mass_matrix.html +++ b/doc/src/USER/atc/man_mass_matrix.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_material.html b/doc/src/USER/atc/man_material.html index 9867e90f77..8460b04a82 100644 --- a/doc/src/USER/atc/man_material.html +++ b/doc/src/USER/atc/man_material.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_add_to_nodeset.html b/doc/src/USER/atc/man_mesh_add_to_nodeset.html index cf5ad52f60..5318e60cd1 100644 --- a/doc/src/USER/atc/man_mesh_add_to_nodeset.html +++ b/doc/src/USER/atc/man_mesh_add_to_nodeset.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_create.html b/doc/src/USER/atc/man_mesh_create.html index efaf7f4307..c128d03916 100644 --- a/doc/src/USER/atc/man_mesh_create.html +++ b/doc/src/USER/atc/man_mesh_create.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_create_elementset.html b/doc/src/USER/atc/man_mesh_create_elementset.html index 51bdae4faa..9d87a5be37 100644 --- a/doc/src/USER/atc/man_mesh_create_elementset.html +++ b/doc/src/USER/atc/man_mesh_create_elementset.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_create_faceset_box.html b/doc/src/USER/atc/man_mesh_create_faceset_box.html index 163a6b442c..ddbeb7eccf 100644 --- a/doc/src/USER/atc/man_mesh_create_faceset_box.html +++ b/doc/src/USER/atc/man_mesh_create_faceset_box.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_create_faceset_plane.html b/doc/src/USER/atc/man_mesh_create_faceset_plane.html index 3ca1108d1a..af79885ed5 100644 --- a/doc/src/USER/atc/man_mesh_create_faceset_plane.html +++ b/doc/src/USER/atc/man_mesh_create_faceset_plane.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_create_nodeset.html b/doc/src/USER/atc/man_mesh_create_nodeset.html index 9d5d155654..32ac7f67e1 100644 --- a/doc/src/USER/atc/man_mesh_create_nodeset.html +++ b/doc/src/USER/atc/man_mesh_create_nodeset.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_delete_elements.html b/doc/src/USER/atc/man_mesh_delete_elements.html index cc269c8e65..d43fe91565 100644 --- a/doc/src/USER/atc/man_mesh_delete_elements.html +++ b/doc/src/USER/atc/man_mesh_delete_elements.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html b/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html index 45d03fc986..0fba4885ae 100644 --- a/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html +++ b/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_output.html b/doc/src/USER/atc/man_mesh_output.html index be1b4c194f..fb1d91f153 100644 --- a/doc/src/USER/atc/man_mesh_output.html +++ b/doc/src/USER/atc/man_mesh_output.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_quadrature.html b/doc/src/USER/atc/man_mesh_quadrature.html index d5291d99db..f5d5e4873d 100644 --- a/doc/src/USER/atc/man_mesh_quadrature.html +++ b/doc/src/USER/atc/man_mesh_quadrature.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_read.html b/doc/src/USER/atc/man_mesh_read.html index a497a2ed04..10bf2a644a 100644 --- a/doc/src/USER/atc/man_mesh_read.html +++ b/doc/src/USER/atc/man_mesh_read.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_mesh_write.html b/doc/src/USER/atc/man_mesh_write.html index 21754a1e68..e484b0466d 100644 --- a/doc/src/USER/atc/man_mesh_write.html +++ b/doc/src/USER/atc/man_mesh_write.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_momentum_time_integration.html b/doc/src/USER/atc/man_momentum_time_integration.html index 3b987f70ef..e4ad7256b9 100644 --- a/doc/src/USER/atc/man_momentum_time_integration.html +++ b/doc/src/USER/atc/man_momentum_time_integration.html @@ -8,18 +8,6 @@ -
@@ -48,7 +36,7 @@ examples

description

related

-

see fix atc command

+

see fix atc command

default

none

diff --git a/doc/src/USER/atc/man_output.html b/doc/src/USER/atc/man_output.html index 3129ff30c9..892424a902 100644 --- a/doc/src/USER/atc/man_output.html +++ b/doc/src/USER/atc/man_output.html @@ -8,18 +8,6 @@ -
@@ -51,7 +39,7 @@ description restrictions

related

-

see fix atc command

+

see fix atc command

default

no default format output indexed by time

diff --git a/doc/src/USER/atc/man_output_elementset.html b/doc/src/USER/atc/man_output_elementset.html index be259388ba..ae1da8d878 100644 --- a/doc/src/USER/atc/man_output_elementset.html +++ b/doc/src/USER/atc/man_output_elementset.html @@ -8,18 +8,6 @@ -
@@ -42,7 +30,7 @@ description restrictions

related

-

see fix atc command

+

see fix atc command

default

none

diff --git a/doc/src/USER/atc/man_output_nodeset.html b/doc/src/USER/atc/man_output_nodeset.html index db76c8008e..3005057d0d 100644 --- a/doc/src/USER/atc/man_output_nodeset.html +++ b/doc/src/USER/atc/man_output_nodeset.html @@ -8,18 +8,6 @@ -
@@ -43,7 +31,7 @@ description restrictions

related

-

see fix atc command

+

see fix atc command

default

none

diff --git a/doc/src/USER/atc/man_pair_interactions.html b/doc/src/USER/atc/man_pair_interactions.html index d46dcb1234..0393b29d56 100644 --- a/doc/src/USER/atc/man_pair_interactions.html +++ b/doc/src/USER/atc/man_pair_interactions.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_poisson_solver.html b/doc/src/USER/atc/man_poisson_solver.html index d69d74db1a..52022222f1 100644 --- a/doc/src/USER/atc/man_poisson_solver.html +++ b/doc/src/USER/atc/man_poisson_solver.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_read_restart.html b/doc/src/USER/atc/man_read_restart.html index 96168fccc7..b6da026bc8 100644 --- a/doc/src/USER/atc/man_read_restart.html +++ b/doc/src/USER/atc/man_read_restart.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_remove_molecule.html b/doc/src/USER/atc/man_remove_molecule.html index 054291efda..0e288c9bee 100644 --- a/doc/src/USER/atc/man_remove_molecule.html +++ b/doc/src/USER/atc/man_remove_molecule.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_remove_source.html b/doc/src/USER/atc/man_remove_source.html index d1d249eb76..837a2a94e4 100644 --- a/doc/src/USER/atc/man_remove_source.html +++ b/doc/src/USER/atc/man_remove_source.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_remove_species.html b/doc/src/USER/atc/man_remove_species.html index ba94a52658..0fc06d1cf9 100644 --- a/doc/src/USER/atc/man_remove_species.html +++ b/doc/src/USER/atc/man_remove_species.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_reset_atomic_reference_positions.html b/doc/src/USER/atc/man_reset_atomic_reference_positions.html index cb82f61bbb..bc9ca16806 100644 --- a/doc/src/USER/atc/man_reset_atomic_reference_positions.html +++ b/doc/src/USER/atc/man_reset_atomic_reference_positions.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_reset_time.html b/doc/src/USER/atc/man_reset_time.html index 35d75ccb97..a20cf9d0bf 100644 --- a/doc/src/USER/atc/man_reset_time.html +++ b/doc/src/USER/atc/man_reset_time.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_sample_frequency.html b/doc/src/USER/atc/man_sample_frequency.html index 13f468b222..ba2544edc4 100644 --- a/doc/src/USER/atc/man_sample_frequency.html +++ b/doc/src/USER/atc/man_sample_frequency.html @@ -8,18 +8,6 @@ -
@@ -37,7 +25,7 @@ description

Specifies a frequency at which fields are computed for the case where time filters are being applied.

restrictions

-

Must be used with the hardy/field AtC fix ( see fix atc command ) and is only relevant when time filters are being used.

+

Must be used with the hardy/field AtC fix ( see fix atc command ) and is only relevant when time filters are being used.

related

diff --git a/doc/src/USER/atc/man_set.html b/doc/src/USER/atc/man_set.html index d104e535b6..993d9948d8 100644 --- a/doc/src/USER/atc/man_set.html +++ b/doc/src/USER/atc/man_set.html @@ -8,18 +8,6 @@ -
@@ -42,7 +30,7 @@ description

Used to set various quantities for the post-processing algorithms. It sets the zero point for the potential energy density using the value provided for all nodes, or from the current configuration of the lattice if no value is provided, or values provided within the specified filename.

restrictions

-

Must be used with the hardy/field type of AtC fix ( see fix atc command )

+

Must be used with the hardy/field type of AtC fix ( see fix atc command )

related

diff --git a/doc/src/USER/atc/man_source.html b/doc/src/USER/atc/man_source.html index 833b2a866f..81cb7cee4a 100644 --- a/doc/src/USER/atc/man_source.html +++ b/doc/src/USER/atc/man_source.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_source_integration.html b/doc/src/USER/atc/man_source_integration.html index 70f62d2e57..80b66edb80 100644 --- a/doc/src/USER/atc/man_source_integration.html +++ b/doc/src/USER/atc/man_source_integration.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_temperature_definition.html b/doc/src/USER/atc/man_temperature_definition.html index f4fb21471c..18f89798cc 100644 --- a/doc/src/USER/atc/man_temperature_definition.html +++ b/doc/src/USER/atc/man_temperature_definition.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_thermal_time_integration.html b/doc/src/USER/atc/man_thermal_time_integration.html index c2f636134f..8cceba845d 100644 --- a/doc/src/USER/atc/man_thermal_time_integration.html +++ b/doc/src/USER/atc/man_thermal_time_integration.html @@ -8,18 +8,6 @@ -
@@ -47,7 +35,7 @@ examples

description

related

-

see fix atc command

+

see fix atc command

default

none

diff --git a/doc/src/USER/atc/man_time_filter.html b/doc/src/USER/atc/man_time_filter.html index ec70fed871..d75dc0703f 100644 --- a/doc/src/USER/atc/man_time_filter.html +++ b/doc/src/USER/atc/man_time_filter.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_track_displacement.html b/doc/src/USER/atc/man_track_displacement.html index 8f729cffe3..c9b13d4094 100644 --- a/doc/src/USER/atc/man_track_displacement.html +++ b/doc/src/USER/atc/man_track_displacement.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_unfix_flux.html b/doc/src/USER/atc/man_unfix_flux.html index b2a19a7fd0..786a3f243a 100644 --- a/doc/src/USER/atc/man_unfix_flux.html +++ b/doc/src/USER/atc/man_unfix_flux.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_unfix_nodes.html b/doc/src/USER/atc/man_unfix_nodes.html index 498d549f9e..08266b4012 100644 --- a/doc/src/USER/atc/man_unfix_nodes.html +++ b/doc/src/USER/atc/man_unfix_nodes.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_write_atom_weights.html b/doc/src/USER/atc/man_write_atom_weights.html index 939506a28e..c91a51487c 100644 --- a/doc/src/USER/atc/man_write_atom_weights.html +++ b/doc/src/USER/atc/man_write_atom_weights.html @@ -8,18 +8,6 @@ -
diff --git a/doc/src/USER/atc/man_write_restart.html b/doc/src/USER/atc/man_write_restart.html index 6ea350d5e8..42f43e3e9c 100644 --- a/doc/src/USER/atc/man_write_restart.html +++ b/doc/src/USER/atc/man_write_restart.html @@ -8,18 +8,6 @@ -
From f890cdfb9e728250391aae83f376a8665e7010d6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 11:44:07 +0100 Subject: [PATCH 24/73] correct formatting in fix atc docs --- doc/src/fix_atc.txt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/doc/src/fix_atc.txt b/doc/src/fix_atc.txt index 75a82f063a..49014f0591 100644 --- a/doc/src/fix_atc.txt +++ b/doc/src/fix_atc.txt @@ -90,13 +90,11 @@ likewise for this post-processing example: run 1000 :pre the mesh's linear interpolation functions can be used as the localization function - by using the field option: +by using the field option: fix AtC internal atc field - fix_modify AtC mesh create 1 1 1 box p p p - - ... + ... :pre Note coupling and post-processing can be combined in the same simulations using separate fixes. @@ -108,11 +106,10 @@ No information about this fix is written to "binary restart files"_restart.html. [Restrictions:] -Thermal and two_temperature (coupling) types use a Verlet time-integration algorithm. The hardy type does not contain its own time-integrator and must be used with a separate fix that does contain one, e.g. nve, nvt, etc. +Thermal and two_temperature (coupling) types use a Verlet time-integration algorithm. The hardy type does not contain its own time-integrator and must be used with a separate fix that does contain one, e.g. nve, nvt, etc. In addition, currently: -Currently, -- the coupling is restricted to thermal physics -- the FE computations are done in serial on each processor. :ul +the coupling is restricted to thermal physics :ulb,l +the FE computations are done in serial on each processor. :l,ule [Related commands:] From 3ceec36b8494b698f22e61178b4e47dde8ef5e4a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 12:38:48 +0100 Subject: [PATCH 25/73] improve format --- doc/src/Manual.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 1a4d2eb779..127ff0dfa4 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -3,7 +3,7 @@ LAMMPS Users Manual - + From 44faa8e9f50fbd9981d8ad8ab5fa302e0d5ecde8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 12:43:32 +0100 Subject: [PATCH 26/73] insert new toplevel text into USER-ATC docs, change header levels. --- doc/src/USER/atc/man_add_molecule.html | 38 ++++++++---- doc/src/USER/atc/man_add_species.html | 38 ++++++++---- doc/src/USER/atc/man_atom_element_map.html | 38 ++++++++---- doc/src/USER/atc/man_atom_weight.html | 38 ++++++++---- doc/src/USER/atc/man_atomic_charge.html | 38 ++++++++---- doc/src/USER/atc/man_boundary.html | 34 +++++++--- doc/src/USER/atc/man_boundary_dynamics.html | 34 +++++++--- doc/src/USER/atc/man_boundary_faceset.html | 38 ++++++++---- doc/src/USER/atc/man_boundary_integral.html | 38 ++++++++---- .../atc/man_consistent_fe_initialization.html | 38 ++++++++---- doc/src/USER/atc/man_contour_integral.html | 38 ++++++++---- doc/src/USER/atc/man_control.html | 38 ++++++++---- doc/src/USER/atc/man_control_momentum.html | 38 ++++++++---- doc/src/USER/atc/man_control_thermal.html | 38 ++++++++---- ...rol_thermal_correction_max_iterations.html | 38 ++++++++---- doc/src/USER/atc/man_decomposition.html | 38 ++++++++---- .../USER/atc/man_electron_integration.html | 34 +++++++--- doc/src/USER/atc/man_equilibrium_start.html | 38 ++++++++---- doc/src/USER/atc/man_extrinsic_exchange.html | 38 ++++++++---- doc/src/USER/atc/man_fe_md_boundary.html | 38 ++++++++---- doc/src/USER/atc/man_fem_mesh.html | 39 ++++++++---- doc/src/USER/atc/man_filter_scale.html | 38 ++++++++---- doc/src/USER/atc/man_filter_type.html | 38 ++++++++---- doc/src/USER/atc/man_fix_atc.html | 38 ++++++++---- doc/src/USER/atc/man_fix_flux.html | 38 ++++++++---- doc/src/USER/atc/man_fix_nodes.html | 38 ++++++++---- doc/src/USER/atc/man_hardy_computes.html | 38 ++++++++---- doc/src/USER/atc/man_hardy_fields.html | 38 ++++++++---- doc/src/USER/atc/man_hardy_gradients.html | 38 ++++++++---- doc/src/USER/atc/man_hardy_kernel.html | 38 ++++++++---- doc/src/USER/atc/man_hardy_on_the_fly.html | 38 ++++++++---- doc/src/USER/atc/man_hardy_rates.html | 38 ++++++++---- doc/src/USER/atc/man_initial.html | 34 +++++++--- .../USER/atc/man_internal_atom_integrate.html | 26 ++++++-- .../USER/atc/man_internal_element_set.html | 38 ++++++++---- doc/src/USER/atc/man_internal_quadrature.html | 42 ++++++++----- doc/src/USER/atc/man_kernel_function.html | 38 ++++++++---- doc/src/USER/atc/man_localized_lambda.html | 38 ++++++++---- doc/src/USER/atc/man_lumped_lambda_solve.html | 38 ++++++++---- doc/src/USER/atc/man_mask_direction.html | 38 ++++++++---- doc/src/USER/atc/man_mass_matrix.html | 38 ++++++++---- doc/src/USER/atc/man_material.html | 38 ++++++++---- doc/src/USER/atc/man_mesh_add_to_nodeset.html | 38 ++++++++---- doc/src/USER/atc/man_mesh_create.html | 38 ++++++++---- .../USER/atc/man_mesh_create_elementset.html | 38 ++++++++---- .../USER/atc/man_mesh_create_faceset_box.html | 38 ++++++++---- .../atc/man_mesh_create_faceset_plane.html | 38 ++++++++---- doc/src/USER/atc/man_mesh_create_nodeset.html | 38 ++++++++---- .../USER/atc/man_mesh_delete_elements.html | 38 ++++++++---- .../atc/man_mesh_nodeset_to_elementset.html | 38 ++++++++---- doc/src/USER/atc/man_mesh_output.html | 38 ++++++++---- doc/src/USER/atc/man_mesh_quadrature.html | 38 ++++++++---- doc/src/USER/atc/man_mesh_read.html | 38 ++++++++---- doc/src/USER/atc/man_mesh_write.html | 38 ++++++++---- .../atc/man_momentum_time_integration.html | 38 ++++++++---- doc/src/USER/atc/man_output.html | 38 ++++++++---- doc/src/USER/atc/man_output_elementset.html | 38 ++++++++---- doc/src/USER/atc/man_output_nodeset.html | 38 ++++++++---- doc/src/USER/atc/man_pair_interactions.html | 38 ++++++++---- doc/src/USER/atc/man_poisson_solver.html | 38 ++++++++---- doc/src/USER/atc/man_read_restart.html | 38 ++++++++---- doc/src/USER/atc/man_remove_molecule.html | 38 ++++++++---- doc/src/USER/atc/man_remove_source.html | 38 ++++++++---- doc/src/USER/atc/man_remove_species.html | 38 ++++++++---- .../man_reset_atomic_reference_positions.html | 38 ++++++++---- doc/src/USER/atc/man_reset_time.html | 62 ++++++++++++------- doc/src/USER/atc/man_sample_frequency.html | 38 ++++++++---- doc/src/USER/atc/man_set.html | 38 ++++++++---- doc/src/USER/atc/man_source.html | 38 ++++++++---- doc/src/USER/atc/man_source_integration.html | 38 ++++++++---- .../USER/atc/man_temperature_definition.html | 34 +++++++--- .../atc/man_thermal_time_integration.html | 38 ++++++++---- doc/src/USER/atc/man_time_filter.html | 38 ++++++++---- doc/src/USER/atc/man_track_displacement.html | 34 +++++++--- doc/src/USER/atc/man_unfix_flux.html | 38 ++++++++---- doc/src/USER/atc/man_unfix_nodes.html | 38 ++++++++---- doc/src/USER/atc/man_write_atom_weights.html | 38 ++++++++---- doc/src/USER/atc/man_write_restart.html | 38 ++++++++---- 78 files changed, 2024 insertions(+), 933 deletions(-) diff --git a/doc/src/USER/atc/man_add_molecule.html b/doc/src/USER/atc/man_add_molecule.html index 9eeebfac7d..a535b871a9 100644 --- a/doc/src/USER/atc/man_add_molecule.html +++ b/doc/src/USER/atc/man_add_molecule.html @@ -7,12 +7,26 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC add_molecule

-syntax

+

fix_modify AtC add_molecule

+syntax

fix_modify_AtC add_molecule <small|large> <TAG> <GROUP_NAME>

    @@ -23,21 +37,21 @@ syntax
  • <GROUP_NAME> = name of group that tracking will be applied to
-

-examples

+

+examples

group WATERGROUP type 1 2
fix_modify AtC add_molecule small water WATERGROUP

-

-description

+

+description

Associates a tag with all molecules corresponding to a specified group.

-

-restrictions

-

-related

-

-default

+

+restrictions

+

+related

+

+default

No defaults for this command.


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_add_species.html b/doc/src/USER/atc/man_add_species.html index 06b8c0b91c..5166ccfa2d 100644 --- a/doc/src/USER/atc/man_add_species.html +++ b/doc/src/USER/atc/man_add_species.html @@ -7,12 +7,26 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC add_species

-syntax

+

fix_modify AtC add_species

+syntax

fix_modify_AtC add_species <TAG> <group|type> <ID>

    @@ -23,21 +37,21 @@ syntax
  • <ID> = name of group or type number
-

-examples

+

+examples

fix_modify AtC add_species gold type 1
group GOLDGROUP type 1
fix_modify AtC add_species gold group GOLDGROUP

-

-description

+

+description

Associates a tag with all atoms of a specified type or within a specified group.

-

-restrictions

-

-related

-

-default

+

+restrictions

+

+related

+

+default

No defaults for this command.


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_atom_element_map.html b/doc/src/USER/atc/man_atom_element_map.html index 351447e07e..47ea0f20c9 100644 --- a/doc/src/USER/atc/man_atom_element_map.html +++ b/doc/src/USER/atc/man_atom_element_map.html @@ -7,30 +7,44 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC atom_element_map

-syntax

+

fix_modify AtC atom_element_map

+syntax

fix_modify AtC atom_element_map <eulerian|lagrangian> <frequency>

  • frequency (int) : frequency of updating atom-to-continuum maps based on the current configuration - only for eulerian
-

-examples

+

+examples

fix_modify atc atom_element_map eulerian 100

-

-description

+

+description

Changes frame of reference from eulerian to lagrangian and sets the frequency for which the map from atoms to elements is reformed and all the attendant data is recalculated.

-

-restrictions

+

+restrictions

Cannot change map type after initialization.

-

-related

-

-default

+

+related

+

+default

lagrangian


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_atom_weight.html b/doc/src/USER/atc/man_atom_weight.html index def587b98b..9161b54f32 100644 --- a/doc/src/USER/atc/man_atom_weight.html +++ b/doc/src/USER/atc/man_atom_weight.html @@ -7,12 +7,26 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC atom_weight

-syntax

+

fix_modify AtC atom_weight

+syntax

fix_modify AtC atom_weight <method> <arguments>

  • <method> =
    @@ -24,22 +38,22 @@ syntax read_in: list of values for atoms are read-in from specified file
-

-examples

+

+examples

fix_modify atc atom_weight constant myatoms 11.8
fix_modify atc atom_weight lattice
fix_modify atc atom_weight read-in atm_wt_file.txt

-

-description

+

+description

Command for assigning the value of atomic weights used for atomic integration in atom-continuum coupled simulations.

-

-restrictions

+

+restrictions

Use of lattice option requires a lattice type and parameter is already specified.

-

-related

-

-default

+

+related

+

+default

lattice


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_atomic_charge.html b/doc/src/USER/atc/man_atomic_charge.html index e0988cb98e..3507a5598b 100644 --- a/doc/src/USER/atc/man_atomic_charge.html +++ b/doc/src/USER/atc/man_atomic_charge.html @@ -7,29 +7,43 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC atomic_charge

-syntax

+

fix_modify AtC atomic_charge

+syntax

fix_modify AtC <include | omit> atomic_charge

  • <include | omit> = switch to activiate/deactiviate inclusion of intrinsic atomic charge in ATC
-

-examples

+

+examples

fix_modify atc compute include atomic_charge

-

-description

+

+description

Determines whether AtC tracks the total charge as a finite element field

-

-restrictions

+

+restrictions

Required for: electrostatics

-

-related

-

-default

+

+related

+

+default

if the atom charge is defined, default is on, otherwise default is off


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_boundary.html b/doc/src/USER/atc/man_boundary.html index ad7fe96cf4..6694311981 100644 --- a/doc/src/USER/atc/man_boundary.html +++ b/doc/src/USER/atc/man_boundary.html @@ -7,26 +7,40 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC boundary

-syntax

+

fix_modify AtC boundary

+syntax

fix_modify AtC boundary type <atom-type-id>

  • <atom-type-id> = type id for atoms that represent a ficticious boundary internal to the FE mesh
-

-examples

+

+examples

fix_modify AtC boundary type ghost_atoms

-

-description

+

+description

Command to define the atoms that represent the ficticious boundary internal to the FE mesh. For fully overlapped MD/FE domains with periodic boundary conditions no boundary atoms should be defined.

-

-restrictions

-

-default

+

+restrictions

+

+default

none


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_boundary_dynamics.html b/doc/src/USER/atc/man_boundary_dynamics.html index a68d1a252f..3a7cb141a7 100644 --- a/doc/src/USER/atc/man_boundary_dynamics.html +++ b/doc/src/USER/atc/man_boundary_dynamics.html @@ -7,24 +7,38 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC boundary_dynamics

-syntax

+

fix_modify AtC boundary_dynamics

+syntax

fix_modify AtC boundary_dynamics < on | damped_harmonic | prescribed | coupled | none > [args]

-

-description

+

+description

Sets different schemes for controlling boundary atoms. On will integrate the boundary atoms using the velocity-verlet algorithm. Damped harmonic uses a mass/spring/dashpot for the boundary atoms with added arguments of the damping and spring constants followed by the ratio of the boundary type mass to the desired mass. Prescribed forces the boundary atoms to follow the finite element displacement. Coupled does the same.

-

-restrictions

+

+restrictions

Boundary atoms must be specified. When using swaps between internal and boundary atoms, the initial configuration must have already correctly partitioned the two.

-

-related

-

-default

+

+related

+

+default

prescribed on


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_boundary_faceset.html b/doc/src/USER/atc/man_boundary_faceset.html index 0e13df41e3..2e2fce7bdb 100644 --- a/doc/src/USER/atc/man_boundary_faceset.html +++ b/doc/src/USER/atc/man_boundary_faceset.html @@ -7,26 +7,40 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC boundary_faceset

-syntax

+

fix_modify AtC boundary_faceset

+syntax

fix_modify AtC boundary_faceset <is | add> [args]

-

-examples

+

+examples

fix_modify AtC boundary_faceset is obndy

-

-description

+

+description

This command species the faceset name when using a faceset to compute the MD/FE boundary fluxes. The faceset must already exist.

-

-restrictions

+

+restrictions

This is only valid when fe_md_boundary is set to faceset.

-

-related

-

-default

+

+related

+

+default


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_boundary_integral.html b/doc/src/USER/atc/man_boundary_integral.html index 6ba17562ee..e1933a9465 100644 --- a/doc/src/USER/atc/man_boundary_integral.html +++ b/doc/src/USER/atc/man_boundary_integral.html @@ -7,31 +7,45 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC output boundary_integral

-syntax

+

fix_modify AtC output boundary_integral

+syntax

fix_modify AtC output boundary_integral [field] faceset [name]

  • field (string) : name of hardy field
  • name (string) : name of faceset
-

-examples

+

+examples

fix_modify AtC output boundary_integral stress faceset loop1

-

-description

+

+description

Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file

-

-restrictions

+

+restrictions

Must be used with the hardy/field type of AtC fix ( see fix atc command )

-

-related

-

-default

+

+related

+

+default

none


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_consistent_fe_initialization.html b/doc/src/USER/atc/man_consistent_fe_initialization.html index 16abc2593f..a74acda5e9 100644 --- a/doc/src/USER/atc/man_consistent_fe_initialization.html +++ b/doc/src/USER/atc/man_consistent_fe_initialization.html @@ -7,29 +7,43 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC consistent_fe_initialization

-syntax

+

fix_modify AtC consistent_fe_initialization

+syntax

fix_modify AtC consistent_fe_initialization <on | off>

  • <on|off> = switch to activiate/deactiviate the initial setting of FE intrinsic field to match the projected MD field
-

-examples

+

+examples

fix_modify atc consistent_fe_initialization on

-

-description

+

+description

Determines whether AtC initializes FE intrinsic fields (e.g., temperature) to match the projected MD values. This is particularly useful for fully overlapping simulations.

-

-restrictions

+

+restrictions

Can be used with: thermal, two_temperature. Cannot be used with time filtering on. Does not include boundary nodes.

-

-related

-

-default

+

+related

+

+default

Default is off


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_contour_integral.html b/doc/src/USER/atc/man_contour_integral.html index da43a1d863..304b4bec66 100644 --- a/doc/src/USER/atc/man_contour_integral.html +++ b/doc/src/USER/atc/man_contour_integral.html @@ -7,32 +7,46 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC output contour_integral

-syntax

+

fix_modify AtC output contour_integral

+syntax

fix_modify AtC output contour_integral [field] faceset [name] <axis [x | y | z ]>

  • field (string) : name of hardy field
  • name (string) : name of faceset
  • axis (string) : x or y or z
-

-examples

+

+examples

fix_modify AtC output contour_integral stress faceset loop1

-

-description

+

+description

Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file

-

-restrictions

+

+restrictions

Must be used with the hardy/field type of AtC fix ( see fix atc command )

-

-related

-

-default

+

+related

+

+default

none


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_control.html b/doc/src/USER/atc/man_control.html index b63c07b327..2c42fa2d6a 100644 --- a/doc/src/USER/atc/man_control.html +++ b/doc/src/USER/atc/man_control.html @@ -7,12 +7,26 @@ + +
+ USER-AtC Manual +
+ + +
+
-

fix_modify AtC control

-syntax

+

fix_modify AtC control

+syntax

fix_modify AtC control <physics_type> <solution_parameter>


@@ -34,22 +48,22 @@ syntax
  • tolerance (float) = relative tolerance to which matrix equations will be solved
  • -

    -examples

    +

    +examples

    fix_modify AtC control thermal max_iterations 10
    fix_modify AtC control momentum tolerance 1.e-5

    -

    -description

    +

    +description

    Sets the numerical parameters for the matrix solvers used in the specified control algorithm. Many solution approaches require iterative solvers, and these methods enable users to provide the maximum number of iterations and the relative tolerance.

    -

    -restrictions

    +

    +restrictions

    only for be used with specific controllers : thermal, momentum
    They are ignored if a lumped solution is requested

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    max_iterations is the number of rows in the matrix
    tolerance is 1.e-10

    diff --git a/doc/src/USER/atc/man_control_momentum.html b/doc/src/USER/atc/man_control_momentum.html index 03e1264164..fd9aadf1d7 100644 --- a/doc/src/USER/atc/man_control_momentum.html +++ b/doc/src/USER/atc/man_control_momentum.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC control momentum

    -syntax

    +

    fix_modify AtC control momentum

    +syntax

    fix_modify AtC control momentum none

    fix_modify AtC control momentum rescale <frequency>
    @@ -32,21 +46,21 @@ syntax

  • face_set_id (string) = id of boundary face set, if not specified (or not possible when the atomic domain does not line up with mesh boundaries) defaults to an atomic-quadrature approximate evaulation
  • -

    -examples

    +

    +examples

    fix_modify AtC control momentum glc_velocity
    fix_modify AtC control momentum flux faceset bndy_faces

    -

    -description

    -

    -restrictions

    +

    +description

    +

    +restrictions

    only to be used with specific transfers : elastic
    rescale not valid with time filtering activated

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_control_thermal.html b/doc/src/USER/atc/man_control_thermal.html index 0f70c595cc..b6af089baf 100644 --- a/doc/src/USER/atc/man_control_thermal.html +++ b/doc/src/USER/atc/man_control_thermal.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC control thermal

    -syntax

    +

    fix_modify AtC control thermal

    +syntax

    fix_modify AtC control thermal <control_type> <optional_args>

    • control_type (string) = none | rescale | hoover | flux
      @@ -34,25 +48,25 @@ syntax
    • face_set_id (string), optional = id of boundary face set, if not specified (or not possible when the atomic domain does not line up with mesh boundaries) defaults to an atomic-quadrature approximate evaulation, does not work with interpolate
    -

    -examples

    +

    +examples

    fix_modify AtC control thermal none
    fix_modify AtC control thermal rescale 10
    fix_modify AtC control thermal hoover
    fix_modify AtC control thermal flux
    fix_modify AtC control thermal flux faceset bndy_faces

    -

    -description

    +

    +description

    Sets the energy exchange mechansim from the finite elements to the atoms, managed through a control algorithm. Rescale computes a scale factor for each atom to match the finite element temperature. Hoover is a Gaussian least-constraint isokinetic thermostat enforces that the nodal restricted atomic temperature matches the finite element temperature. Flux is a similar mode, but rather adds energy to the atoms based on conservation of energy. Hoover and flux allows the prescription of sources or fixed temperatures on the atoms.

    -

    -restrictions

    +

    +restrictions

    only for be used with specific transfers : thermal (rescale, hoover, flux), two_temperature (flux)
    rescale not valid with time filtering activated

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    none
    rescale frequency is 1
    flux boundary_integration_type is interpolate

    diff --git a/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html b/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html index 45f4d9246e..2a939d1693 100644 --- a/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html +++ b/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html @@ -7,31 +7,45 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC control thermal correction_max_iterations

    -syntax

    +

    fix_modify AtC control thermal correction_max_iterations

    +syntax

    fix_modify AtC control thermal correction_max_iterations <max_iterations>

    • max_iterations (int) = maximum number of iterations that will be used by iterative matrix solvers
    -

    -examples

    +

    +examples

    fix_modify AtC control thermal correction_max_iterations 10

    -

    -description

    +

    +description

    Sets the maximum number of iterations to compute the 2nd order in time correction term for lambda with the fractional step method. The method uses the same tolerance as the controller's matrix solver.

    -

    -restrictions

    +

    +restrictions

    only for use with thermal physics using the fractional step method.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    correction_max_iterations is 20


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_decomposition.html b/doc/src/USER/atc/man_decomposition.html index b57a276e31..fd8986b19d 100644 --- a/doc/src/USER/atc/man_decomposition.html +++ b/doc/src/USER/atc/man_decomposition.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC decomposition

    -syntax

    +

    fix_modify AtC decomposition

    +syntax

    fix_modify AtC decomposition <type>

    • <type> =
      @@ -20,20 +34,20 @@ syntax distributed_memory: only owned nodal information on processor
    -

    -examples

    +

    +examples

    fix_modify atc decomposition distributed_memory

    -

    -description

    +

    +description

    Command for assigning the distribution of work and memory for parallel runs.

    -

    -restrictions

    +

    +restrictions

    replicated_memory is appropriate for simulations were the number of nodes << number of atoms

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    replicated_memory


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_electron_integration.html b/doc/src/USER/atc/man_electron_integration.html index bb9a4f72bd..ab00b5d45f 100644 --- a/doc/src/USER/atc/man_electron_integration.html +++ b/doc/src/USER/atc/man_electron_integration.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC extrinsic electron_integration

    -syntax

    +

    fix_modify AtC extrinsic electron_integration

    +syntax

    fix_modify AtC extrinsic electron_integration <integration_type> <num_subcyle_steps(optional)>

      @@ -20,20 +34,20 @@ syntax
    • num_subcycle_steps (int), optional = number of subcycle steps for the electron time integration
    -

    -examples

    +

    +examples

    fix_modify AtC extrinsic electron_integration implicit
    fix_modify AtC extrinsic electron_integration explicit 100

    -

    -description

    +

    +description

    Switches between integration scheme for the electron temperature. The number of subcyling steps used to integrate the electron temperature 1 LAMMPS timestep can be manually adjusted to capture fast electron dynamics.

    -

    -restrictions

    +

    +restrictions

    For use only with two_temperature type of AtC fix ( see fix atc command )

    -

    -default

    +

    +default

    implicit
    subcycle_steps = 1

    diff --git a/doc/src/USER/atc/man_equilibrium_start.html b/doc/src/USER/atc/man_equilibrium_start.html index 08106f1174..ba19dbf53a 100644 --- a/doc/src/USER/atc/man_equilibrium_start.html +++ b/doc/src/USER/atc/man_equilibrium_start.html @@ -7,28 +7,42 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC equilibrium_start

    -syntax

    +

    fix_modify AtC equilibrium_start

    +syntax

    fix_modify AtC equilibrium_start <on|off>

    -

    -examples

    +

    +examples

    fix_modify atc equilibrium_start on

    -

    -description

    +

    +description

    Starts filtered calculations assuming they start in equilibrium, i.e. perfect finite element force balance.

    -

    -restrictions

    +

    +restrictions

    only needed before filtering is begun

    -

    -related

    +

    +related

    see fix_modify AtC filter

    -

    -default

    +

    +default

    on


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_extrinsic_exchange.html b/doc/src/USER/atc/man_extrinsic_exchange.html index dca429e3b8..5b3b4315e1 100644 --- a/doc/src/USER/atc/man_extrinsic_exchange.html +++ b/doc/src/USER/atc/man_extrinsic_exchange.html @@ -7,28 +7,42 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC extrinsic exchange

    -syntax

    +

    fix_modify AtC extrinsic exchange

    +syntax

    fix_modify AtC extrinsic exchange <on|off>

    -

    -examples

    +

    +examples

    fix_modify AtC extrinsic exchange on

    -

    -description

    +

    +description

    Switches energy exchange between the MD system and electron system on and off

    -

    -restrictions

    +

    +restrictions

    Only valid for use with two_temperature type of AtC fix.

    -

    -related

    +

    +related

    see fix atc command

    -

    -default

    +

    +default

    on


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fe_md_boundary.html b/doc/src/USER/atc/man_fe_md_boundary.html index d83821b867..aa1b6f6bb3 100644 --- a/doc/src/USER/atc/man_fe_md_boundary.html +++ b/doc/src/USER/atc/man_fe_md_boundary.html @@ -7,28 +7,42 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC fe_md_boundary

    -syntax

    +

    fix_modify AtC fe_md_boundary

    +syntax

    fix_modify AtC fe_md_boundary <faceset | interpolate | no_boundary> [args]

    -

    -examples

    +

    +examples

    fix_modify atc fe_md_boundary interpolate

    -

    -description

    +

    +description

    Specifies different methods for computing fluxes between between the MD and FE integration regions. Faceset defines a faceset separating the MD and FE regions and uses finite element face quadrature to compute the flux. Interpolate uses a reconstruction scheme to approximate the flux, which is more robust but less accurate if the MD/FE boundary does correspond to a faceset. No boundary results in no fluxes between the systems being computed.

    -

    -restrictions

    +

    +restrictions

    If faceset is used, all the AtC non-boundary atoms must lie within and completely fill the domain enclosed by the faceset.

    -

    -related

    +

    +related

    see for how to specify the faceset name.

    -

    -default

    +

    +default

    Interpolate.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fem_mesh.html b/doc/src/USER/atc/man_fem_mesh.html index 2abd84d6ce..3b6f0ddc34 100644 --- a/doc/src/USER/atc/man_fem_mesh.html +++ b/doc/src/USER/atc/man_fem_mesh.html @@ -3,21 +3,34 @@ ATC: fix_modify AtC fem create mesh - -

    fix_modify AtC fem create mesh

    -syntax

    + +
    + USER-AtC Manual +
    + + +
    + +

    fix_modify AtC fem create mesh

    +syntax

    fix_modify AtC fem create mesh <nx> <ny> <nz> <region-id> <f|p> <f|p> <f|p>
    • nx ny nz = number of elements in x, y, z
    • region-id = id of region that is to be meshed
    • f p p = perioidicity flags for x, y, z
    -

    -examples

    - fix_modify AtC fem create mesh 10 1 1 feRegion p p p

    -description

    -Creates a uniform mesh in a rectangular region

    -restrictions

    -creates only uniform rectangular grids in a rectangular region

    -related

    -

    -default

    +

    +examples

    + fix_modify AtC fem create mesh 10 1 1 feRegion p p p

    +description

    +Creates a uniform mesh in a rectangular region

    +restrictions

    +creates only uniform rectangular grids in a rectangular region

    +related

    +

    +default

    none
    Generated on Mon Aug 17 09:35:16 2009 for ATC by  doxygen 1.3.9.1
    diff --git a/doc/src/USER/atc/man_filter_scale.html b/doc/src/USER/atc/man_filter_scale.html index bca799804f..68eb5ef370 100644 --- a/doc/src/USER/atc/man_filter_scale.html +++ b/doc/src/USER/atc/man_filter_scale.html @@ -7,33 +7,47 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC filter scale

    -syntax

    +

    fix_modify AtC filter scale

    +syntax

    fix_modify AtC filter scale <scale>

    • scale (real) = characteristic time scale of the filter
    -

    -examples

    +

    +examples

    fix_modify AtC filter scale 10.0

    -

    -description

    +

    +description

    Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics

    -

    -restrictions

    +

    +restrictions

    only for be used with specific transfers: thermal, two_temperature

    -

    -related

    +

    +related

    fix_modify AtC filter fix_modify AtC filter type

    -

    -default

    +

    +default

    0.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_filter_type.html b/doc/src/USER/atc/man_filter_type.html index 8b7d7ad58e..919dff505f 100644 --- a/doc/src/USER/atc/man_filter_type.html +++ b/doc/src/USER/atc/man_filter_type.html @@ -7,29 +7,43 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC filter type

    -syntax

    +

    fix_modify AtC filter type

    +syntax

    fix_modify AtC filter type <exponential | step | no_filter>

    -

    -examples

    +

    +examples

    fix_modify AtC filter type exponential

    -

    -description

    +

    +description

    Specifies the type of time filter used.

    -

    -restrictions

    +

    +restrictions

    only for be used with specific transfers: thermal, two_temperature

    -

    -related

    +

    +related

    fix_modify AtC filter fix_modify AtC filter scale

    -

    -default

    +

    +default

    No default.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fix_atc.html b/doc/src/USER/atc/man_fix_atc.html index 0e14498ffe..9e82ded3de 100644 --- a/doc/src/USER/atc/man_fix_atc.html +++ b/doc/src/USER/atc/man_fix_atc.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix atc command

    -syntax

    +

    fix atc command

    +syntax

    fix <fixID> <group> atc <type> <parameter_file>

    • fixID = name of fix
    • @@ -26,15 +40,15 @@ syntax
    • parameter_file = name of the file with material parameters.
      note: Neither hardy nor field requires a parameter file
    -

    -examples

    +

    +examples

    fix AtC internal atc thermal Ar_thermal.dat
    fix AtC internal atc two_temperature Ar_ttm.mat
    fix AtC internal atc hardy
    fix AtC internal atc field

    -

    -description

    +

    +description

    This fix is the beginning to creating a coupled FE/MD simulation and/or an on-the-fly estimation of continuum fields. The coupled versions of this fix do Verlet integration and the /post-processing does not. After instantiating this fix, several other fix_modify commands will be needed to set up the problem, e.g. define the finite element mesh and prescribe initial and boundary conditions.

    The following coupling example is typical, but non-exhaustive:

    @@ -122,16 +136,16 @@ description

    Please refer to the standard finite element (FE) texts, e.g. T.J.R Hughes The finite element method , Dover 2003, for the basics of FE simulation.

    -

    -restrictions

    +

    +restrictions

    Thermal and two_temperature (coupling) types use a Verlet time-integration algorithm. The hardy type does not contain its own time-integrator and must be used with a separate fix that does contain one, e.g. nve, nvt, etc.

    Currently,

    • the coupling is restricted to thermal physics
    • the FE computations are done in serial on each processor.
    -

    -related

    +

    +related

    fix_modify commands for setup:

    Note: a set of example input files with the attendant material files are included with this package

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fix_flux.html b/doc/src/USER/atc/man_fix_flux.html index 46400e9103..a5b98d8c64 100644 --- a/doc/src/USER/atc/man_fix_flux.html +++ b/doc/src/USER/atc/man_fix_flux.html @@ -7,32 +7,46 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC fix_flux

    -syntax

    +

    fix_modify AtC fix_flux

    +syntax

    fix_modify AtC fix_flux <field> <face_set> <value | function>

    • <field> = field name valid for type of physics, temperature | electron_temperature
    • <face_set> = name of set of element faces
    -

    -examples

    +

    +examples

    fix_modify atc fix_flux temperature faceSet 10.0

    -

    -description

    +

    +description

    Command for fixing normal fluxes e.g. heat_flux. This command only prescribes the normal component of the physical flux, e.g. heat (energy) flux. The units are in AtC units, i.e. derived from the LAMMPS length, time, and mass scales.

    -

    -restrictions

    +

    +restrictions

    Only normal fluxes (Neumann data) can be prescribed.

    -

    -related

    +

    +related

    see fix_modify AtC unfix_flux

    -

    -default

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fix_nodes.html b/doc/src/USER/atc/man_fix_nodes.html index 4745e241c6..b8d20002b5 100644 --- a/doc/src/USER/atc/man_fix_nodes.html +++ b/doc/src/USER/atc/man_fix_nodes.html @@ -7,34 +7,48 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC fix

    -syntax

    +

    fix_modify AtC fix

    +syntax

    fix_modify AtC fix <field> <nodeset> <constant | function>

    • <field> = field name valid for type of physics
    • <nodeset> = name of set of nodes to apply boundary condition
    • <constant | function> = value or name of function followed by its parameters
    -

    -examples

    +

    +examples

    fix_modify AtC fix temperature groupNAME 10.
    fix_modify AtC fix temperature groupNAME 0 0 0 10.0 0 0 1.0

    -

    -description

    +

    +description

    Creates a constraint on the values of the specified field at specified nodes.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in nodeset name

    -

    -related

    +

    +related

    see fix_modify AtC unfix

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_computes.html b/doc/src/USER/atc/man_hardy_computes.html index e6fb1430a6..9c4ea9340d 100644 --- a/doc/src/USER/atc/man_hardy_computes.html +++ b/doc/src/USER/atc/man_hardy_computes.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC computes

    -syntax

    +

    fix_modify AtC computes

    +syntax

    fix_modify AtC computes <add | delete> [per-atom compute id] <volume | number>

      @@ -23,8 +37,8 @@ syntax
    • volume | number (keyword) = field created is a per-unit-volume quantity or a per-atom quantity as weighted by kernel functions
    -

    -examples

    +

    +examples

    compute virial all stress/atom
    fix_modify AtC computes add virial volume
    fix_modify AtC computes delete virial
    @@ -32,20 +46,20 @@ examples compute centrosymmetry all centro/atom
    fix_modify AtC computes add centrosymmetry number

    -

    -description

    +

    +description

    Calculates continuum fields corresponding to specified per-atom computes created by LAMMPS

    -

    -restrictions

    +

    +restrictions

    Must be used with the hardy/field type of AtC fix ( see fix atc command )
    Per-atom compute must be specified before corresponding continuum field can be requested

    -

    -related

    +

    +related

    See manual page for compute

    -

    -default

    +

    +default

    No defaults exist for this command


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_fields.html b/doc/src/USER/atc/man_hardy_fields.html index c393bcba2a..79cbbb5d56 100644 --- a/doc/src/USER/atc/man_hardy_fields.html +++ b/doc/src/USER/atc/man_hardy_fields.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC fields

    -syntax

    +

    fix_modify AtC fields

    +syntax

    fix_modify AtC fields <all | none>
    fix_modify AtC fields <add | delete> <list_of_fields>

    @@ -44,24 +58,24 @@ syntax type_concentration: volume fraction of a specific atom type
    -

    -examples

    +

    +examples

    fix_modify AtC fields add velocity temperature

    -

    -description

    +

    +description

    Allows modification of the fields calculated and output by the transfer class. The commands are cumulative, e.g.
    fix_modify AtC fields none
    followed by
    fix_modify AtC fields add velocity temperature
    will only output the velocity and temperature fields.

    -

    -restrictions

    +

    +restrictions

    Must be used with the hardy/field type of AtC fix, see fix atc command. Currently, the stress and heat flux formulas are only correct for central force potentials, e.g. Lennard-Jones and EAM but not Stillinger-Weber.

    -

    -related

    +

    +related

    See fix_modify AtC gradients , fix_modify AtC rates and fix_modify AtC computes

    -

    -default

    +

    +default

    By default, no fields are output


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_gradients.html b/doc/src/USER/atc/man_hardy_gradients.html index 12a80c2166..30016b591a 100644 --- a/doc/src/USER/atc/man_hardy_gradients.html +++ b/doc/src/USER/atc/man_hardy_gradients.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC gradients

    -syntax

    +

    fix_modify AtC gradients

    +syntax

    fix_modify AtC gradients <add | delete> <list_of_fields>

      @@ -21,21 +35,21 @@ syntax
    • fields (keyword) =
      gradients can be calculated for all fields listed in fix_modify AtC fields
    -

    -examples

    +

    +examples

    fix_modify AtC gradients add temperature velocity stress
    fix_modify AtC gradients delete velocity

    -

    -description

    +

    +description

    Requests calculation and ouput of gradients of the fields from the transfer class. These gradients will be with regard to spatial or material coordinate for eulerian or lagrangian analysis, respectively, as specified by atom_element_map (see fix_modify AtC atom_element_map )

    -

    -restrictions

    +

    +restrictions

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    No gradients are calculated by default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_kernel.html b/doc/src/USER/atc/man_hardy_kernel.html index 6c8ddd9923..a37fdd22d9 100644 --- a/doc/src/USER/atc/man_hardy_kernel.html +++ b/doc/src/USER/atc/man_hardy_kernel.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC kernel

    -syntax

    +

    fix_modify AtC kernel

    +syntax

    fix_modify AtC kernel <type> <parameters>

    • type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, quartic_bar, quartic_cylinder, quartic_sphere
      @@ -28,22 +42,22 @@ syntax quartic_sphere = radius (double)
    -

    -examples

    +

    +examples

    fix_modify AtC kernel cell 1.0 1.0 1.0
    fix_modify AtC kernel quartic_sphere 10.0

    -

    -description

    -

    -restrictions

    +

    +description

    +

    +restrictions

    Must be used with the hardy AtC fix
    For bar kernel types, half-width oriented along x-direction
    For cylinder kernel types, cylindrical axis is assumed to be in z-direction
    ( see fix atc command )

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    No default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_on_the_fly.html b/doc/src/USER/atc/man_hardy_on_the_fly.html index bc2d71a17b..043926d555 100644 --- a/doc/src/USER/atc/man_hardy_on_the_fly.html +++ b/doc/src/USER/atc/man_hardy_on_the_fly.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC on_the_fly

    -syntax

    +

    fix_modify AtC on_the_fly

    +syntax

    fix_modify AtC on_the_fly <bond | kernel> <optional on | off>
    - bond | kernel (keyword) = specifies on-the-fly calculation of bond or kernel matrix elements

    @@ -20,24 +34,24 @@ syntax
  • on | off (keyword) = activate or discontinue on-the-fly mode
  • -

    -examples

    +

    +examples

    fix_modify AtC on_the_fly bond on
    fix_modify AtC on_the_fly kernel
    fix_modify AtC on_the_fly kernel off

    -

    -description

    +

    +description

    Overrides normal mode of pre-calculating and storing bond pair-to-node a nd kernel atom-to-node matrices. If activated, will calculate elements of t hese matrices during repeated calls of field computations (i.e. "on-the-fly") and not store them for future use.
    on flag is optional - if omitted, on_the_fly will be activated for the s pecified matrix. Can be deactivated using off flag.

    -

    -restrictions

    +

    +restrictions

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    By default, on-the-fly calculation is not active (i.e. off). However, code does a memory allocation check to determine if it can store all needed bond and kernel matrix ele ments. If this allocation fails, on-the-fly is activated.

    diff --git a/doc/src/USER/atc/man_hardy_rates.html b/doc/src/USER/atc/man_hardy_rates.html index 4edec12d68..775df82f94 100644 --- a/doc/src/USER/atc/man_hardy_rates.html +++ b/doc/src/USER/atc/man_hardy_rates.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC rates

    -syntax

    +

    fix_modify AtC rates

    +syntax

    fix_modify AtC rates <add | delete> <list_of_fields>

      @@ -21,22 +35,22 @@ syntax
    • fields (keyword) =
      rates can be calculated for all fields listed in fix_modify AtC fields
    -

    -examples

    +

    +examples

    fix_modify AtC rates add temperature velocity stress
    fix_modify AtC rates delete stress

    -

    -description

    +

    +description

    Requests calculation and ouput of rates (time derivatives) of the fields from the transfer class. For eulerian analysis (see fix_modify AtC atom_element_map ), these rates are the partial time derivatives of the nodal fields, not the full (material) time derivatives.

    -

    -restrictions

    +

    +restrictions

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    No rates are calculated by default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_initial.html b/doc/src/USER/atc/man_initial.html index 539d8afd59..429bd25af6 100644 --- a/doc/src/USER/atc/man_initial.html +++ b/doc/src/USER/atc/man_initial.html @@ -7,29 +7,43 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC initial

    -syntax

    +

    fix_modify AtC initial

    +syntax

    fix_modify AtC initial <field> <nodeset> <constant | function>

    • <field> = field name valid for type of physics, temperature | electron_temperature
    • <nodeset> = name of set of nodes to apply initial condition
    • <constant | function> = value or name of function followed by its parameters
    -

    -examples

    +

    +examples

    fix_modify atc initial temperature groupNAME 10.

    -

    -description

    +

    +description

    Sets the initial values for the specified field at the specified nodes.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in nodeset name

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_internal_atom_integrate.html b/doc/src/USER/atc/man_internal_atom_integrate.html index 5a8704c46f..2f2987ec68 100644 --- a/doc/src/USER/atc/man_internal_atom_integrate.html +++ b/doc/src/USER/atc/man_internal_atom_integrate.html @@ -7,18 +7,32 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC internal_atom_integrate

    -syntax

    +

    fix_modify AtC internal_atom_integrate

    +syntax

    fix_modify AtC internal_atom_integrate <on | off> fix_modify AtC internal_atom_integrate on

    -

    -description

    +

    +description

    Has AtC perform time integration for the atoms in the group on which it operates. This does not include boundary atoms.

    -

    -default

    +

    +default

    on for coupling methods, off for post-processors off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_internal_element_set.html b/doc/src/USER/atc/man_internal_element_set.html index bf1cb007f6..dbd1d1e026 100644 --- a/doc/src/USER/atc/man_internal_element_set.html +++ b/doc/src/USER/atc/man_internal_element_set.html @@ -7,30 +7,44 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC internal_element_set

    -syntax

    +

    fix_modify AtC internal_element_set

    +syntax

    fix_modify AtC internal_element_set <element-set-name>

    • <element-set-name> = name of element set defining internal region, or off
    -

    -examples

    +

    +examples

    fix_modify AtC internal_element_set myElementSet fix_modify AtC internal_element_set off

    -

    -description

    +

    +description

    Enables AtC to base the region for internal atoms to be an element set. If no ghost atoms are used, all the AtC atoms must be constrained to remain in this element set by the user, e.g., with walls. If boundary atoms are used in conjunction with Eulerian atom maps AtC will partition all atoms of a boundary or internal type to be of type internal if they are in the internal region or to be of type boundary otherwise.

    -

    -restrictions

    +

    +restrictions

    If boundary atoms are used in conjunction with Eulerian atom maps, the Eulerian reset frequency must be an integer multiple of the Lammps reneighbor frequency

    -

    -related

    +

    +related

    see atom_element_map_type and boundary

    -

    -default

    +

    +default

    off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_internal_quadrature.html b/doc/src/USER/atc/man_internal_quadrature.html index 8ad3399e86..1a36ab4606 100644 --- a/doc/src/USER/atc/man_internal_quadrature.html +++ b/doc/src/USER/atc/man_internal_quadrature.html @@ -7,28 +7,42 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC internal_quadrature

    -syntax

    +

    fix_modify AtC internal_quadrature

    +syntax

    fix_modify atc internal_quadrature <on | off> [region]

    -

    -examples

    +

    +examples

    fix_modify atc internal_quadrature off

    -

    -description

    +

    +description

    Command to use or not use atomic quadrature on internal elements fully filled with atoms. By turning the internal quadrature off these elements do not contribute to the governing PDE and the fields at the internal nodes follow the weighted averages of the atomic data.

    -

    -optional

    +

    +optional

    Optional region tag specifies which finite element nodes will be treated as being within the MD region. This option is only valid with internal_quadrature off.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    on


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_kernel_function.html b/doc/src/USER/atc/man_kernel_function.html index e2702cd9fc..f87735b38b 100644 --- a/doc/src/USER/atc/man_kernel_function.html +++ b/doc/src/USER/atc/man_kernel_function.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC kernel

    -syntax

    +

    fix_modify AtC kernel

    +syntax

    fix_modify AtC kernel <type> <parameters>

    • type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, quartic_bar, quartic_cylinder, quartic_sphere
      @@ -28,21 +42,21 @@ syntax quartic_sphere = radius (double)
    -

    -examples

    +

    +examples

    fix_modify AtC kernel cell 1.0 1.0 1.0 fix_modify AtC kernel quartic_sphere 10.0

    -

    -description

    -

    -restrictions

    +

    +description

    +

    +restrictions

    Must be used with the hardy AtC fix
    For bar kernel types, half-width oriented along x-direction
    For cylinder kernel types, cylindrical axis is assumed to be in z-direction
    ( see fix atc command )

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    No default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_localized_lambda.html b/doc/src/USER/atc/man_localized_lambda.html index e435504233..8b729f567b 100644 --- a/doc/src/USER/atc/man_localized_lambda.html +++ b/doc/src/USER/atc/man_localized_lambda.html @@ -7,26 +7,40 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC control localized_lambda

    -syntax

    +

    fix_modify AtC control localized_lambda

    +syntax

    fix_modify AtC control localized_lambda <on|off>

    -

    -examples

    +

    +examples

    fix_modify atc control localized_lambda on

    -

    -description

    +

    +description

    Turns on localization algorithms for control algorithms to restrict the influence of FE coupling or boundary conditions to a region near the boundary of the MD region. Control algorithms will not affect atoms in elements not possessing faces on the boundary of the region. Flux-based control is localized via row-sum lumping while quantity control is done by solving a truncated matrix equation.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    Default is off.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_lumped_lambda_solve.html b/doc/src/USER/atc/man_lumped_lambda_solve.html index 43eee362e2..a38edfff09 100644 --- a/doc/src/USER/atc/man_lumped_lambda_solve.html +++ b/doc/src/USER/atc/man_lumped_lambda_solve.html @@ -7,26 +7,40 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC control lumped_lambda_solve

    -syntax

    +

    fix_modify AtC control lumped_lambda_solve

    +syntax

    fix_modify AtC control lumped_lambda_solve <on|off>

    -

    -examples

    +

    +examples

    fix_modify atc control lumped_lambda_solve on

    -

    -description

    +

    +description

    Command to use or not use lumped matrix for lambda solve

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mask_direction.html b/doc/src/USER/atc/man_mask_direction.html index 07cf7a9418..951b5c1911 100644 --- a/doc/src/USER/atc/man_mask_direction.html +++ b/doc/src/USER/atc/man_mask_direction.html @@ -7,26 +7,40 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC control mask_direction

    -syntax

    +

    fix_modify AtC control mask_direction

    +syntax

    fix_modify AtC control mask_direction <direction> <on|off>

    -

    -examples

    +

    +examples

    fix_modify atc control mask_direction 0 on

    -

    -description

    +

    +description

    Command to mask out certain dimensions from the atomic regulator

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mass_matrix.html b/doc/src/USER/atc/man_mass_matrix.html index 40f489985d..4661348e55 100644 --- a/doc/src/USER/atc/man_mass_matrix.html +++ b/doc/src/USER/atc/man_mass_matrix.html @@ -7,29 +7,43 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mass_matrix

    -syntax

    +

    fix_modify AtC mass_matrix

    +syntax

    fix_modify AtC mass_matrix <fe | md_fe>

    • <fe | md_fe> = activiate/deactiviate using the FE mass matrix in the MD region
    -

    -examples

    +

    +examples

    fix_modify atc mass_matrix fe

    -

    -description

    +

    +description

    Determines whether AtC uses the FE mass matrix based on Gaussian quadrature or based on atomic quadrature in the MD region. This is useful for fully overlapping simulations to improve efficiency.

    -

    -restrictions

    +

    +restrictions

    Should not be used unless the FE region is contained within the MD region, otherwise the method will be unstable and inaccurate

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    Default is off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_material.html b/doc/src/USER/atc/man_material.html index 8460b04a82..956642bd9d 100644 --- a/doc/src/USER/atc/man_material.html +++ b/doc/src/USER/atc/man_material.html @@ -7,27 +7,41 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC material

    -syntax

    +

    fix_modify AtC material

    +syntax

    fix_modify AtC material [elementset_name] [material_id]

    -

    -examples

    +

    +examples

    fix_modify AtC material gap_region 2

    -

    -description

    +

    +description

    Sets the material model in elementset_name to be of type material_id.

    -

    -restrictions

    +

    +restrictions

    The element set must already be created and the material must be specified in the material file given the the atc fix on construction

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    All elements default to the first material in the material file.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_add_to_nodeset.html b/doc/src/USER/atc/man_mesh_add_to_nodeset.html index 5318e60cd1..7b5ea6bd60 100644 --- a/doc/src/USER/atc/man_mesh_add_to_nodeset.html +++ b/doc/src/USER/atc/man_mesh_add_to_nodeset.html @@ -7,29 +7,43 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh add_to_nodeset

    -syntax

    +

    fix_modify AtC mesh add_to_nodeset

    +syntax

    fix_modify AtC mesh add_to_nodeset <id> <xmin> <xmax> <ymin> <ymax> <zmin> <zmax>

    • <id> = id of FE nodeset to be added to
    • <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of the bounding box that contains the desired nodes to be added
    -

    -examples

    +

    +examples

    fix_modify AtC mesh add_to_nodeset lbc -11.9 -11 -12 12 -12 12

    -

    -description

    +

    +description

    Command to add nodes to an already existing FE nodeset.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    Coordinates are assumed to be in lattice units.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create.html b/doc/src/USER/atc/man_mesh_create.html index c128d03916..d4ea2be031 100644 --- a/doc/src/USER/atc/man_mesh_create.html +++ b/doc/src/USER/atc/man_mesh_create.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh create

    -syntax

    +

    fix_modify AtC mesh create

    +syntax

    fix_modify AtC mesh create <nx> <ny> <nz> <region-id> <f|p> <f|p> <f|p>

      @@ -20,21 +34,21 @@ syntax
    • region-id = id of region that is to be meshed
    • f p p = periodicity flags for x, y, z
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create 10 1 1 feRegion p p p

    -

    -description

    +

    +description

    Creates a uniform mesh in a rectangular region

    -

    -restrictions

    +

    +restrictions

    Creates only uniform rectangular grids in a rectangular region

    -

    -related

    +

    +related

    fix_modify AtC mesh quadrature

    -

    -default

    +

    +default

    When created, mesh defaults to gauss2 (2-point Gaussian) quadrature. Use "mesh quadrature" command to change quadrature style.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create_elementset.html b/doc/src/USER/atc/man_mesh_create_elementset.html index 9d87a5be37..188d85ceff 100644 --- a/doc/src/USER/atc/man_mesh_create_elementset.html +++ b/doc/src/USER/atc/man_mesh_create_elementset.html @@ -7,30 +7,44 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh create_elementset

    -syntax

    +

    fix_modify AtC mesh create_elementset

    +syntax

    fix_modify AtC create_elementset <id> <xmin> <xmax> <ymin> <ymax> <zmin> <zmax>

    • <id> = id to assign to the collection of FE element
    • <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of the bounding box that contains only the desired elements
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create_elementset middle -4.1 4.1 -100 100 -100 1100

    -

    -description

    +

    +description

    Command to assign an id to a set of FE elements to be used subsequently in defining material and mesh-based operations.

    -

    -restrictions

    +

    +restrictions

    Only viable for rectangular grids.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    Coordinates are assumed to be in lattice units.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create_faceset_box.html b/doc/src/USER/atc/man_mesh_create_faceset_box.html index ddbeb7eccf..a406cace8b 100644 --- a/doc/src/USER/atc/man_mesh_create_faceset_box.html +++ b/doc/src/USER/atc/man_mesh_create_faceset_box.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh create_faceset box

    -syntax

    +

    fix_modify AtC mesh create_faceset box

    +syntax

    fix_modify AtC mesh create_faceset <id> box <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> <in|out> [units]

    • <id> = id to assign to the collection of FE faces
    • @@ -20,19 +34,19 @@ syntax
    • <in|out> = "in" gives inner faces to the box, "out" gives the outer faces to the box
    • units = option to specify real as opposed to lattice units
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create_faceset obndy box -4.0 4.0 -12 12 -12 12 out

    -

    -description

    +

    +description

    Command to assign an id to a set of FE faces.

    -

    -restrictions

    +

    +restrictions

    Only viable for rectangular grids.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    The default options are units = lattice and the use of outer faces


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create_faceset_plane.html b/doc/src/USER/atc/man_mesh_create_faceset_plane.html index af79885ed5..4f21be0def 100644 --- a/doc/src/USER/atc/man_mesh_create_faceset_plane.html +++ b/doc/src/USER/atc/man_mesh_create_faceset_plane.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh create_faceset plane

    -syntax

    +

    fix_modify AtC mesh create_faceset plane

    +syntax

    fix_modify AtC mesh create_faceset <id> plane <x|y|z> <val1> <x|y|z> <lval2> <uval2> [units]

    • <id> = id to assign to the collection of FE faces
    • @@ -20,19 +34,19 @@ syntax
    • <val1>,<lval2>,<uval2> = plane is specified as the x|y|z=val1 plane bounded by the segments x|y|z = [lval2,uval2]
    • units = option to specify real as opposed to lattice units
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create_faceset xyplane plane y 0 x -4 0

    -

    -description

    +

    +description

    Command to assign an id to a set of FE faces.

    -

    -restrictions

    +

    +restrictions

    Only viable for rectangular grids.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    The default option is units = lattice.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create_nodeset.html b/doc/src/USER/atc/man_mesh_create_nodeset.html index 32ac7f67e1..4c4fb68fe7 100644 --- a/doc/src/USER/atc/man_mesh_create_nodeset.html +++ b/doc/src/USER/atc/man_mesh_create_nodeset.html @@ -7,29 +7,43 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh create_nodeset

    -syntax

    +

    fix_modify AtC mesh create_nodeset

    +syntax

    fix_modify AtC mesh create_nodeset <id> <xmin> <xmax> <ymin> <ymax> <zmin> <zmax>

    • <id> = id to assign to the collection of FE nodes
    • <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of the bounding box that contains only the desired nodes
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12

    -

    -description

    +

    +description

    Command to assign an id to a set of FE nodes to be used subsequently in defining boundary conditions.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    Coordinates are assumed to be in lattice units.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_delete_elements.html b/doc/src/USER/atc/man_mesh_delete_elements.html index d43fe91565..071b67c1e1 100644 --- a/doc/src/USER/atc/man_mesh_delete_elements.html +++ b/doc/src/USER/atc/man_mesh_delete_elements.html @@ -7,28 +7,42 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh delete_elements

    -syntax

    +

    fix_modify AtC mesh delete_elements

    +syntax

    fix_modify AtC mesh delete_elements <element_set>

    • <element_set> = name of an element set
    -

    -examples

    +

    +examples

    fix_modify AtC delete_elements gap

    -

    -description

    +

    +description

    Deletes a group of elements from the mesh.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html b/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html index 0fba4885ae..5e45d8dfa2 100644 --- a/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html +++ b/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html @@ -7,31 +7,45 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh nodeset_to_elementset

    -syntax

    +

    fix_modify AtC mesh nodeset_to_elementset

    +syntax

    fix_modify AtC nodeset_to_elementset <nodeset_id> <elementset_id> <max/min>

    • <nodeset_id> = id of desired nodeset from which to create elementset
    • <elementset_id> = id to assign to the collection of FE element
    • <max/min> = flag to choose either the maximal or minimal elementset
    -

    -examples

    +

    +examples

    fix_modify AtC mesh nodeset_to_elementset myNodeset myElementset min

    -

    -description

    +

    +description

    Command to create an elementset from an existing nodeset. Either the minimal element set of elements with all nodes in the set, or maximal element set with all elements with at least one node in the set, can be created

    -

    -restrictions

    +

    +restrictions

    None.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    Unless specified, the maximal element set is created


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_output.html b/doc/src/USER/atc/man_mesh_output.html index fb1d91f153..95a0c10ed4 100644 --- a/doc/src/USER/atc/man_mesh_output.html +++ b/doc/src/USER/atc/man_mesh_output.html @@ -7,27 +7,41 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh output

    -syntax

    +

    fix_modify AtC mesh output

    +syntax

    fix_modify AtC mesh output <file_prefix>

    -

    -examples

    +

    +examples

    fix_modify AtC mesh output meshData

    -

    -description

    +

    +description

    Command to output mesh and associated data: nodesets, facesets, and elementsets. This data is only output once upon initialization since currently the mesh is static. Creates (binary, "gold" format) Ensight output of mesh data.

    -

    -restrictions

    +

    +restrictions

    none

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_quadrature.html b/doc/src/USER/atc/man_mesh_quadrature.html index f5d5e4873d..dc1e987d87 100644 --- a/doc/src/USER/atc/man_mesh_quadrature.html +++ b/doc/src/USER/atc/man_mesh_quadrature.html @@ -7,29 +7,43 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh quadrature

    -syntax

    +

    fix_modify AtC mesh quadrature

    +syntax

    fix_modify AtC mesh quadrature <quad>

    • quad = one of <nodal|gauss1|gauss2|gauss3|face> --- when a mesh is created it defaults to gauss2, use this call to change it after the fact
    -

    -examples

    +

    +examples

    fix_modify AtC mesh quadrature face

    -

    -description

    +

    +description

    (Re-)assigns the quadrature style for the existing mesh.

    -

    -restrictions

    -

    -related

    +

    +restrictions

    +

    +related

    fix_modify AtC mesh create

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_read.html b/doc/src/USER/atc/man_mesh_read.html index 10bf2a644a..e108177b9c 100644 --- a/doc/src/USER/atc/man_mesh_read.html +++ b/doc/src/USER/atc/man_mesh_read.html @@ -7,30 +7,44 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh read

    -syntax

    +

    fix_modify AtC mesh read

    +syntax

    fix_modify AtC mesh read <filename> <f|p> <f|p> <f|p>

    • filename = name of file containing mesh to be read
    • f p p = periodicity flags for x, y, z
    -

    -examples

    +

    +examples

    fix_modify AtC mesh read myComponent.mesh p p p
    fix_modify AtC mesh read myOtherComponent.exo

    -

    -description

    +

    +description

    Reads a mesh from a text or exodus file, and assigns periodic boundary conditions if needed.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    periodicity flags are false by default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_write.html b/doc/src/USER/atc/man_mesh_write.html index e484b0466d..05208a3488 100644 --- a/doc/src/USER/atc/man_mesh_write.html +++ b/doc/src/USER/atc/man_mesh_write.html @@ -7,29 +7,43 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC mesh write

    -syntax

    +

    fix_modify AtC mesh write

    +syntax

    fix_modify AtC mesh write <filename>

    • filename = name of file to write mesh
    -

    -examples

    +

    +examples

    fix_modify AtC mesh write myMesh.mesh

    -

    -description

    +

    +description

    Writes a mesh to a text file.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_momentum_time_integration.html b/doc/src/USER/atc/man_momentum_time_integration.html index e4ad7256b9..9721d4dadc 100644 --- a/doc/src/USER/atc/man_momentum_time_integration.html +++ b/doc/src/USER/atc/man_momentum_time_integration.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC time_integration (momentum)

    -syntax

    +

    fix_modify AtC time_integration (momentum)

    +syntax

    fix_modify AtC time_integration <descriptor>

      @@ -21,24 +35,24 @@ syntax

    various time integration methods for the finite elements

    -

    -description

    +

    +description

    verlet - atomic velocity update with 2nd order Verlet, nodal temperature update with 2nd order Verlet, kinetostats based on controlling force
    fractional_step - atomic velocity update with 2nd order Verlet, mixed nodal momentum update, 2nd order Verlet for continuum and exact 2nd order Verlet for atomic contributions, kinetostats based on controlling discrete momentum changes
    gear - atomic velocity update with 2nd order Verlet, nodal temperature update with 3rd or 4th order Gear, kinetostats based on controlling power

    -

    -examples

    +

    +examples

    fix_modify atc time_integration verlet
    fix_modify atc time_integration fractional_step

    -

    -description

    -

    -related

    +

    +description

    +

    +related

    see fix atc command

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_output.html b/doc/src/USER/atc/man_output.html index 892424a902..99196ded15 100644 --- a/doc/src/USER/atc/man_output.html +++ b/doc/src/USER/atc/man_output.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC output

    -syntax

    +

    fix_modify AtC output

    +syntax

    fix_modify AtC output <filename_prefix> <frequency> [text | full_text | binary | vector_components | tensor_components ] fix_modify AtC output index [step | time ]

    • filename_prefix (string) = prefix for data files
    • @@ -25,23 +39,23 @@ syntax tensor_components = outputs tensor as scalar components (use this for Paraview)
    -

    -examples

    +

    +examples

    fix_modify AtC output heatFE 100
    fix_modify AtC output hardyFE 1 text tensor_components
    fix_modify AtC output hardyFE 10 text binary tensor_components
    fix_modify AtC output index step

    -

    -description

    +

    +description

    Creates text and/or binary (Ensight, "gold" format) output of nodal/mesh data which is transfer/physics specific. Output indexed by step or time is possible.

    -

    -restrictions

    -

    -related

    +

    +restrictions

    +

    +related

    see fix atc command

    -

    -default

    +

    +default

    no default format output indexed by time


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_output_elementset.html b/doc/src/USER/atc/man_output_elementset.html index ae1da8d878..03780e58e0 100644 --- a/doc/src/USER/atc/man_output_elementset.html +++ b/doc/src/USER/atc/man_output_elementset.html @@ -7,32 +7,46 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC output elementset

    -syntax

    +

    fix_modify AtC output elementset

    +syntax

    fix_modify AtC output volume_integral <eset_name> <field> {`

    • set_name (string) = name of elementset to be integrated over
    • fieldname (string) = name of field to integrate csum = creates nodal sum over nodes in specified nodeset
    -

    -examples

    +

    +examples

    fix_modify AtC output eset1 mass_density

    -

    -description

    +

    +description

    Performs volume integration of specified field over elementset and outputs resulting variable values to GLOBALS file.

    -

    -restrictions

    -

    -related

    +

    +restrictions

    +

    +related

    see fix atc command

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_output_nodeset.html b/doc/src/USER/atc/man_output_nodeset.html index 3005057d0d..90536b4cb9 100644 --- a/doc/src/USER/atc/man_output_nodeset.html +++ b/doc/src/USER/atc/man_output_nodeset.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC output nodeset

    -syntax

    +

    fix_modify AtC output nodeset

    +syntax

    fix_modify AtC output nodeset <nodeset_name> <operation>

    • nodeset_name (string) = name of nodeset to be operated on
    • @@ -20,20 +34,20 @@ syntax sum = creates nodal sum over nodes in specified nodeset
    -

    -examples

    +

    +examples

    fix_modify AtC output nodeset nset1 sum

    -

    -description

    +

    +description

    Performs operation over the nodes belonging to specified nodeset and outputs resulting variable values to GLOBALS file.

    -

    -restrictions

    -

    -related

    +

    +restrictions

    +

    +related

    see fix atc command

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_pair_interactions.html b/doc/src/USER/atc/man_pair_interactions.html index 0393b29d56..3c6d65432c 100644 --- a/doc/src/USER/atc/man_pair_interactions.html +++ b/doc/src/USER/atc/man_pair_interactions.html @@ -7,28 +7,42 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC pair_interactions/bond_interactions

    -syntax

    +

    fix_modify AtC pair_interactions/bond_interactions

    +syntax

    fix_modify AtC pair_interactions <on|off>
    fix_modify AtC bond_interactions <on|off>

    -

    -examples

    +

    +examples

    fix_modify AtC bond_interactions on

    -

    -description

    +

    +description

    include bonds and/or pairs in the stress and heat flux computations

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    pair interactions: on, bond interactions: off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_poisson_solver.html b/doc/src/USER/atc/man_poisson_solver.html index 52022222f1..2aa4be52a5 100644 --- a/doc/src/USER/atc/man_poisson_solver.html +++ b/doc/src/USER/atc/man_poisson_solver.html @@ -7,31 +7,45 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC poisson_solver

    -syntax

    +

    fix_modify AtC poisson_solver

    +syntax

    fix_modify AtC poisson_solver mesh create <nx> <ny> <nz> <region-id> <f|p> <f|p> <f|p>

    • nx ny nz = number of elements in x, y, z
    • region-id = id of region that is to be meshed
    • f p p = perioidicity flags for x, y, z
    -

    -examples

    +

    +examples

    fix_modify AtC poisson_solver mesh create 10 1 1 feRegion p p p

    -

    -description

    +

    +description

    Creates a uniform mesh in a rectangular region

    -

    -restrictions

    +

    +restrictions

    creates only uniform rectangular grids in a rectangular region

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_read_restart.html b/doc/src/USER/atc/man_read_restart.html index b6da026bc8..1e7c0be0e8 100644 --- a/doc/src/USER/atc/man_read_restart.html +++ b/doc/src/USER/atc/man_read_restart.html @@ -7,29 +7,43 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC read_restart

    -syntax

    +

    fix_modify AtC read_restart

    +syntax

    fix_modify AtC read_restart [file_name]

    -

    -examples

    +

    +examples

    fix_modify AtC read_restart ATC_state

    -

    -description

    +

    +description

    Reads the current state of the fields from a named text-based restart file.

    -

    -restrictions

    +

    +restrictions

    The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize the fix are not saved e.g. an identical mesh containing the same atoms will have to be recreated.

    -

    -related

    +

    +related

    see write_restart fix_modify AtC write_restart

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_remove_molecule.html b/doc/src/USER/atc/man_remove_molecule.html index 0e288c9bee..0a850dcac3 100644 --- a/doc/src/USER/atc/man_remove_molecule.html +++ b/doc/src/USER/atc/man_remove_molecule.html @@ -7,32 +7,46 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC remove_molecule

    -syntax

    +

    fix_modify AtC remove_molecule

    +syntax

    fix_modify_AtC remove_molecule <TAG>

    • <TAG> = tag for tracking a molecule type
    -

    -examples

    +

    +examples

    fix_modify AtC remove_molecule water

    -

    -description

    +

    +description

    Removes tag designated for tracking a specified set of molecules.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    No defaults for this command.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_remove_source.html b/doc/src/USER/atc/man_remove_source.html index 837a2a94e4..f550e2d024 100644 --- a/doc/src/USER/atc/man_remove_source.html +++ b/doc/src/USER/atc/man_remove_source.html @@ -7,31 +7,45 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC remove_source

    -syntax

    +

    fix_modify AtC remove_source

    +syntax

    fix_modify AtC remove_source <field> <element_set>

    • <field> = field name valid for type of physics
    • <element_set> = name of set of elements
    -

    -examples

    +

    +examples

    fix_modify atc remove_source temperature groupNAME

    -

    -description

    +

    +description

    Remove a domain source.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in element_set name

    -

    -related

    +

    +related

    see fix_modify AtC source

    -

    -default

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_remove_species.html b/doc/src/USER/atc/man_remove_species.html index 0fc06d1cf9..ad563fcd79 100644 --- a/doc/src/USER/atc/man_remove_species.html +++ b/doc/src/USER/atc/man_remove_species.html @@ -7,32 +7,46 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC remove_species

    -syntax

    +

    fix_modify AtC remove_species

    +syntax

    fix_modify_AtC delete_species <TAG>

    • <TAG> = tag for tracking a species
    -

    -examples

    +

    +examples

    fix_modify AtC remove_species gold

    -

    -description

    +

    +description

    Removes tag designated for tracking a specified species.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    No defaults for this command.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_reset_atomic_reference_positions.html b/doc/src/USER/atc/man_reset_atomic_reference_positions.html index bc9ca16806..4262ce7b4a 100644 --- a/doc/src/USER/atc/man_reset_atomic_reference_positions.html +++ b/doc/src/USER/atc/man_reset_atomic_reference_positions.html @@ -7,27 +7,41 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC reset_atomic_reference_positions

    -syntax

    +

    fix_modify AtC reset_atomic_reference_positions

    +syntax

    fix_modify AtC reset_atomic_reference_positions

    -

    -examples

    +

    +examples

    fix_modify atc reset_atomic_reference_positions

    -

    -description

    +

    +description

    Resets the atomic positions ATC uses to perform point to field operations. In can be used to use perfect lattice sites in ATC but a thermalized or deformed lattice in LAMMPS.

    -

    -restrictions

    +

    +restrictions

    -

    -related

    +

    +related

    -

    -default

    +

    +default

    Default is off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_reset_time.html b/doc/src/USER/atc/man_reset_time.html index a20cf9d0bf..28a9559900 100644 --- a/doc/src/USER/atc/man_reset_time.html +++ b/doc/src/USER/atc/man_reset_time.html @@ -7,43 +7,57 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC reset_time

    -syntax

    +

    fix_modify AtC reset_time

    +syntax

    fix_modify AtC reset_time

    -

    -examples

    +

    +examples

    fix_modify atc reset_time 0.0

    -

    -description

    +

    +description

    Resets the simulation time counter.

    -

    -restrictions

    -

    -related

    -

    -default

    -

    -syntax

    +

    +restrictions

    +

    +related

    +

    +default

    +

    +syntax

    fix_modify AtC kernel_bandwidth

    -

    -examples

    +

    +examples

    fix_modify atc reset_time 8

    -

    -description

    +

    +description

    Sets a maximum parallel bandwidth for the kernel functions during parallel communication. If the command is not issued, the default will be to assume the bandwidth of the kernel matrix corresponds to the number of sampling locations.

    -

    -restrictions

    +

    +restrictions

    Only is used if kernel functions are being used.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    Number of sample locations.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_sample_frequency.html b/doc/src/USER/atc/man_sample_frequency.html index ba2544edc4..988a2cac50 100644 --- a/doc/src/USER/atc/man_sample_frequency.html +++ b/doc/src/USER/atc/man_sample_frequency.html @@ -7,30 +7,44 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC sample_frequency

    -syntax

    +

    fix_modify AtC sample_frequency

    +syntax

    fix_modify AtC sample_frequency [freq]

    • freq (int) : frequency to sample field in number of steps
    -

    -examples

    +

    +examples

    fix_modify AtC sample_frequency 10

    -

    -description

    +

    +description

    Specifies a frequency at which fields are computed for the case where time filters are being applied.

    -

    -restrictions

    +

    +restrictions

    Must be used with the hardy/field AtC fix ( see fix atc command ) and is only relevant when time filters are being used.

    -

    -related

    +

    +related

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_set.html b/doc/src/USER/atc/man_set.html index 993d9948d8..6543a6458a 100644 --- a/doc/src/USER/atc/man_set.html +++ b/doc/src/USER/atc/man_set.html @@ -7,34 +7,48 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC set

    -syntax

    +

    fix_modify AtC set

    +syntax

    fix_modify AtC set reference_potential_energy <value_or_filename(optional)>

    • value (double) : optional user specified zero point for PE in native LAMMPS energy units
    • filename (string) : optional user specified string for file of nodal PE values to be read-in
    -

    -examples

    +

    +examples

    fix_modify AtC set reference_potential_energy
    fix_modify AtC set reference_potential_energy -0.05
    fix_modify AtC set reference_potential_energy myPEvalues

    -

    -description

    +

    +description

    Used to set various quantities for the post-processing algorithms. It sets the zero point for the potential energy density using the value provided for all nodes, or from the current configuration of the lattice if no value is provided, or values provided within the specified filename.

    -

    -restrictions

    +

    +restrictions

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    Defaults to lammps zero point i.e. isolated atoms


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_source.html b/doc/src/USER/atc/man_source.html index 81cb7cee4a..5b8f47f483 100644 --- a/doc/src/USER/atc/man_source.html +++ b/doc/src/USER/atc/man_source.html @@ -7,31 +7,45 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC source

    -syntax

    +

    fix_modify AtC source

    +syntax

    fix_modify AtC source <field> <element_set> <value | function>

    • <field> = field name valid for type of physics
    • <element_set> = name of set of elements
    -

    -examples

    +

    +examples

    fix_modify atc source temperature middle temporal_ramp 10. 0.

    -

    -description

    +

    +description

    Add domain sources to the mesh. The units are consistent with LAMMPS's units for mass, length and time and are defined by the PDE being solved, e.g. for thermal transfer the balance equation is for energy and source is energy per time.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in element_set name

    -

    -related

    +

    +related

    see fix_modify AtC remove_source

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_source_integration.html b/doc/src/USER/atc/man_source_integration.html index 80b66edb80..3ce3342458 100644 --- a/doc/src/USER/atc/man_source_integration.html +++ b/doc/src/USER/atc/man_source_integration.html @@ -7,24 +7,38 @@ + +
    + USER-AtC Manual +
    + + +
    +
    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_temperature_definition.html b/doc/src/USER/atc/man_temperature_definition.html index 18f89798cc..f7d212cad2 100644 --- a/doc/src/USER/atc/man_temperature_definition.html +++ b/doc/src/USER/atc/man_temperature_definition.html @@ -7,25 +7,39 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC temperature_definition

    -syntax

    +

    fix_modify AtC temperature_definition

    +syntax

    fix_modify AtC temperature_definition <kinetic|total>

    -

    -examples

    +

    +examples

    fix_modify atc temperature_definition kinetic

    -

    -description

    +

    +description

    Change the definition for the atomic temperature used to create the finite element temperature. The kinetic option is based only on the kinetic energy of the atoms while the total option uses the total energy (kinetic + potential) of an atom.

    -

    -restrictions

    +

    +restrictions

    This command is only valid when using thermal coupling. Also, while not a formal restriction, the user should ensure that associating a potential energy with each atom makes physical sense for the total option to be meaningful.

    -

    -default

    +

    +default

    kinetic


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_thermal_time_integration.html b/doc/src/USER/atc/man_thermal_time_integration.html index 8cceba845d..c9205550e9 100644 --- a/doc/src/USER/atc/man_thermal_time_integration.html +++ b/doc/src/USER/atc/man_thermal_time_integration.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC time_integration (thermal)

    -syntax

    +

    fix_modify AtC time_integration (thermal)

    +syntax

    fix_modify AtC time_integration <descriptor>

      @@ -21,23 +35,23 @@ syntax

    various time integration methods for the finite elements

    -

    -description

    +

    +description

    gear - atomic velocity update with 2nd order Verlet, nodal temperature update with 3rd or 4th order Gear, thermostats based on controlling power
    fractional_step - atomic velocity update with 2nd order Verlet, mixed nodal temperature update, 3/4 Gear for continuum and 2 Verlet for atomic contributions, thermostats based on controlling discrete energy changes

    -

    -examples

    +

    +examples

    fix_modify atc time_integration gear
    fix_modify atc time_integration fractional_step

    -

    -description

    -

    -related

    +

    +description

    +

    +related

    see fix atc command

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_time_filter.html b/doc/src/USER/atc/man_time_filter.html index d75dc0703f..02b8bcabaa 100644 --- a/doc/src/USER/atc/man_time_filter.html +++ b/doc/src/USER/atc/man_time_filter.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC filter

    -syntax

    +

    fix_modify AtC filter

    +syntax

    fix_modify AtC filter <on | off | equilibrate>

      @@ -20,22 +34,22 @@ syntax
    • equilibrate = runs dynamics without filtering but initializes filtered quantities
    -

    -examples

    +

    +examples

    fix_modify atc transfer filter on

    -

    -description

    +

    +description

    Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics

    -

    -restrictions

    +

    +restrictions

    only for be used with specific transfers: thermal, two_temperature

    -

    -related

    +

    +related

    fix_modify AtC filter scale
    fix_modify AtC equilibrium_start

    -

    -default

    +

    +default

    off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_track_displacement.html b/doc/src/USER/atc/man_track_displacement.html index c9b13d4094..d77cf879c4 100644 --- a/doc/src/USER/atc/man_track_displacement.html +++ b/doc/src/USER/atc/man_track_displacement.html @@ -7,26 +7,40 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC track_displacement

    -syntax

    +

    fix_modify AtC track_displacement

    +syntax

    fix_modify AtC track_displacement <on/off>

    -

    -examples

    +

    +examples

    fix_modify atc track_displacement on

    -

    -description

    +

    +description

    Determines whether displacement is tracked or not. For solids problems this is a useful quantity, but for fluids it is not relevant.

    -

    -restrictions

    +

    +restrictions

    Some constitutive models require the displacement field

    -

    -default

    +

    +default

    on


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_unfix_flux.html b/doc/src/USER/atc/man_unfix_flux.html index 786a3f243a..76d24653f1 100644 --- a/doc/src/USER/atc/man_unfix_flux.html +++ b/doc/src/USER/atc/man_unfix_flux.html @@ -7,31 +7,45 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC unfix_flux

    -syntax

    +

    fix_modify AtC unfix_flux

    +syntax

    fix_modify AtC fix_flux <field> <face_set> <value | function>

    • <field> = field name valid for type of physics, temperature | electron_temperature
    • <face_set> = name of set of element faces
    -

    -examples

    +

    +examples

    fix_modify atc unfix_flux temperature faceSet

    -

    -description

    +

    +description

    Command for removing prescribed normal fluxes e.g. heat_flux, stress.

    -

    -restrictions

    -

    -related

    +

    +restrictions

    +

    +related

    see fix_modify AtC unfix_flux

    -

    -default

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_unfix_nodes.html b/doc/src/USER/atc/man_unfix_nodes.html index 08266b4012..4ef1460138 100644 --- a/doc/src/USER/atc/man_unfix_nodes.html +++ b/doc/src/USER/atc/man_unfix_nodes.html @@ -7,31 +7,45 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC unfix

    -syntax

    +

    fix_modify AtC unfix

    +syntax

    fix_modify AtC unfix <field> <nodeset>

    • <field> = field name valid for type of physics
    • <nodeset> = name of set of nodes
    -

    -examples

    +

    +examples

    fix_modify AtC unfix temperature groupNAME

    -

    -description

    +

    +description

    Removes constraint on field values for specified nodes.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in nodeset name

    -

    -related

    +

    +related

    see fix_modify AtC fix

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_write_atom_weights.html b/doc/src/USER/atc/man_write_atom_weights.html index c91a51487c..864b9e43f9 100644 --- a/doc/src/USER/atc/man_write_atom_weights.html +++ b/doc/src/USER/atc/man_write_atom_weights.html @@ -7,12 +7,26 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC write_atom_weights

    -syntax

    +

    fix_modify AtC write_atom_weights

    +syntax

    fix_modify AtC write_atom_weights <filename> <frequency>

    • <filename> = name of file that atomic weights are written to
      @@ -20,19 +34,19 @@ syntax
    • <frequency> = how often writes will occur
    -

    -examples

    +

    +examples

    fix_modify atc write_atom_weights atm_wt_file.txt 10

    -

    -description

    +

    +description

    Command for writing the values of atomic weights to a specified file.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_write_restart.html b/doc/src/USER/atc/man_write_restart.html index 42f43e3e9c..8c0dae9f6f 100644 --- a/doc/src/USER/atc/man_write_restart.html +++ b/doc/src/USER/atc/man_write_restart.html @@ -7,29 +7,43 @@ + +
    + USER-AtC Manual +
    + + +
    +
    -

    fix_modify AtC write_restart

    -syntax

    +

    fix_modify AtC write_restart

    +syntax

    fix_modify AtC write_restart [file_name]

    -

    -examples

    +

    +examples

    fix_modify AtC write_restart restart.mydata

    -

    -description

    +

    +description

    Dumps the current state of the fields to a named text-based restart file. This done when the command is invoked and not repeated, unlike the similar lammps command.

    -

    -restrictions

    +

    +restrictions

    The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize the fix are not saved e.g. an identical mesh containing the same atoms will have to be recreated.

    -

    -related

    +

    +related

    see read_restart fix_modify AtC read_restart

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  From b0d8fb217002bcd4216bf7312771a7b95fad4193 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 12:43:56 +0100 Subject: [PATCH 27/73] promote header levels for better formatting in pdf manual --- doc/src/body.txt | 2 +- doc/src/manifolds.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/body.txt b/doc/src/body.txt index 54ec157c74..344e5b1d65 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -6,7 +6,7 @@ :line -Body particles :h3 +Body particles :h1 [Overview:] diff --git a/doc/src/manifolds.txt b/doc/src/manifolds.txt index c9bb1ce57f..36c6caacb7 100644 --- a/doc/src/manifolds.txt +++ b/doc/src/manifolds.txt @@ -6,7 +6,7 @@ :line -Manifolds (surfaces) :h3 +Manifolds (surfaces) :h1 [Overview:] From 7b551bb59416da7e6b54066538c13b29cd844bad Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 12:47:05 +0100 Subject: [PATCH 28/73] add a short command overview page for the PDF manual only --- doc/src/lammps_commands.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/src/lammps_commands.txt diff --git a/doc/src/lammps_commands.txt b/doc/src/lammps_commands.txt new file mode 100644 index 0000000000..f9c2e7366a --- /dev/null +++ b/doc/src/lammps_commands.txt @@ -0,0 +1,10 @@ + +LAMMPS Commands :h1 + +The following pages contain the detailed documentation of all +LAMMPS commands included in this version of LAMMPS. Generic +commands are listed first (in alphabetical order) followed by +command categories like compute styles or pair styles and so on. + +The documentation for the USER-ATC package fix_modify commands +follow at the very end of this manual. From 60f411d655fa3518a5d2ef8110b8cbe9a74bcbe6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 12:47:36 +0100 Subject: [PATCH 29/73] update manual content list for recent updates --- doc/src/lammps.book | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/src/lammps.book b/doc/src/lammps.book index d4e73453b0..400018d248 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -28,6 +28,7 @@ tutorial_pylammps.html body.html manifolds.html +lammps_commands.html angle_coeff.html angle_style.html atom_modify.html @@ -138,7 +139,6 @@ fix_adapt_fep.html fix_addforce.html fix_addtorque.html fix_append_atoms.html -fix_atc.html fix_atom_swap.html fix_ave_atom.html fix_ave_chunk.html @@ -276,6 +276,7 @@ fix_spring_self.html fix_srd.html fix_store_force.html fix_store_state.html +fix_surface_global.html fix_temp_berendsen.html fix_temp_csvr.html fix_temp_rescale.html @@ -422,11 +423,13 @@ pair_airebo.html pair_awpmd.html pair_beck.html pair_body.html +pair_body_rounded_polygon.html pair_bop.html pair_born.html pair_brownian.html pair_buck.html pair_buck_long.html +pair_buck6d_coul_gauss.html pair_charmm.html pair_class2.html pair_colloid.html @@ -538,6 +541,7 @@ bond_zero.html angle_charmm.html angle_class2.html angle_cosine.html +angle_cosine_buck6d.html angle_cosine_delta.html angle_cosine_periodic.html angle_cosine_shift.html @@ -577,11 +581,13 @@ improper_distance.html improper_fourier.html improper_harmonic.html improper_hybrid.html +improper_inversion_harmonic.html improper_none.html improper_ring.html improper_umbrella.html improper_zero.html +fix_atc.html USER/atc/man_add_molecule.html USER/atc/man_add_species.html USER/atc/man_atom_element_map.html From 63714c7079410d3e21a24573d4a840a54ac7fb93 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 13:10:20 +0100 Subject: [PATCH 30/73] remove PDF-only .txt file from Sphinx documentation processing --- doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index 4072e01c4a..b10b15d057 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -21,7 +21,7 @@ HAS_VIRTUALENV = YES endif SPHINXEXTRA = -j $(shell $(PYTHON) -c 'import multiprocessing;print(multiprocessing.cpu_count())') -SOURCES=$(wildcard src/*.txt) +SOURCES=$(filter-out src/lammps_commands.txt,$(wildcard src/*.txt)) OBJECTS=$(SOURCES:src/%.txt=$(RSTDIR)/%.rst) .PHONY: help clean-all clean epub html pdf old venv spelling anchor_check From 1a213363f1d402e594ba641d1677c84f2076c404 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 14:54:30 +0100 Subject: [PATCH 31/73] add group style to create an empty group directly --- doc/src/group.txt | 8 +++++++- src/group.cpp | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/src/group.txt b/doc/src/group.txt index afa218c5a3..81c38c106e 100644 --- a/doc/src/group.txt +++ b/doc/src/group.txt @@ -13,11 +13,13 @@ group command :h3 group ID style args :pre ID = user-defined name of the group :ulb,l -style = {delete} or {region} or {type} or {id} or {molecule} or {variable} or \ +style = {delete} or {clear} or {empty} or {region} or \ + {type} or {id} or {molecule} or {variable} or \ {include} or {subtract} or {union} or {intersect} or \ {dynamic} or {static} :l {delete} = no args {clear} = no args + {empty} = no args {region} args = region-ID {type} or {id} or {molecule} args = list of one or more atom types, atom IDs, or molecule IDs @@ -99,6 +101,10 @@ e.g. using the "run every"_run.html command if a fix or compute or other operation expects the atoms in the group to remain constant, but LAMMPS does not check for this. +The {empty} style creates an empty group, which is useful for commands +like "fix gcmc"_fix_gcmc.html or with complex scripts that add atoms +to a group. + The {region} style puts all atoms in the region volume into the group. Note that this is a static one-time assignment. The atoms remain assigned (or not assigned) to the group even in they later move out of diff --git a/src/group.cpp b/src/group.cpp index 76275f301d..93c9c12bcf 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -188,6 +188,12 @@ void Group::assign(int narg, char **arg) if (domain->regions[iregion]->match(x[i][0],x[i][1],x[i][2])) mask[i] |= bit; + // create an empty group + + } else if (strcmp(arg[1],"empty") == 0) { + + ; // nothing to do here + // style = type, molecule, id // add to group if atom matches type/molecule/id or condition From b3693f891b6ea6e39825ddecff1626528f5a3858 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 16:40:50 +0100 Subject: [PATCH 32/73] different style of AtC page headers that works well with html and pdf --- doc/src/USER/atc/man_add_molecule.html | 16 +++--- doc/src/USER/atc/man_add_species.html | 16 +++--- doc/src/USER/atc/man_atom_element_map.html | 16 +++--- doc/src/USER/atc/man_atom_weight.html | 16 +++--- doc/src/USER/atc/man_atomic_charge.html | 16 +++--- doc/src/USER/atc/man_boundary.html | 16 +++--- doc/src/USER/atc/man_boundary_dynamics.html | 16 +++--- doc/src/USER/atc/man_boundary_faceset.html | 16 +++--- doc/src/USER/atc/man_boundary_integral.html | 16 +++--- .../atc/man_consistent_fe_initialization.html | 16 +++--- doc/src/USER/atc/man_contour_integral.html | 16 +++--- doc/src/USER/atc/man_control.html | 16 +++--- doc/src/USER/atc/man_control_momentum.html | 16 +++--- doc/src/USER/atc/man_control_thermal.html | 16 +++--- ...rol_thermal_correction_max_iterations.html | 16 +++--- doc/src/USER/atc/man_decomposition.html | 16 +++--- .../USER/atc/man_electron_integration.html | 16 +++--- doc/src/USER/atc/man_equilibrium_start.html | 16 +++--- doc/src/USER/atc/man_extrinsic_exchange.html | 16 +++--- doc/src/USER/atc/man_fe_md_boundary.html | 16 +++--- doc/src/USER/atc/man_fem_mesh.html | 50 +++++++++++-------- doc/src/USER/atc/man_filter_scale.html | 16 +++--- doc/src/USER/atc/man_filter_type.html | 16 +++--- doc/src/USER/atc/man_fix_atc.html | 16 +++--- doc/src/USER/atc/man_fix_flux.html | 16 +++--- doc/src/USER/atc/man_fix_nodes.html | 16 +++--- doc/src/USER/atc/man_hardy_computes.html | 16 +++--- doc/src/USER/atc/man_hardy_fields.html | 16 +++--- doc/src/USER/atc/man_hardy_gradients.html | 16 +++--- doc/src/USER/atc/man_hardy_kernel.html | 16 +++--- doc/src/USER/atc/man_hardy_on_the_fly.html | 16 +++--- doc/src/USER/atc/man_hardy_rates.html | 16 +++--- doc/src/USER/atc/man_initial.html | 16 +++--- .../USER/atc/man_internal_atom_integrate.html | 16 +++--- .../USER/atc/man_internal_element_set.html | 16 +++--- doc/src/USER/atc/man_internal_quadrature.html | 16 +++--- doc/src/USER/atc/man_kernel_function.html | 16 +++--- doc/src/USER/atc/man_localized_lambda.html | 16 +++--- doc/src/USER/atc/man_lumped_lambda_solve.html | 16 +++--- doc/src/USER/atc/man_mask_direction.html | 16 +++--- doc/src/USER/atc/man_mass_matrix.html | 16 +++--- doc/src/USER/atc/man_material.html | 16 +++--- doc/src/USER/atc/man_mesh_add_to_nodeset.html | 16 +++--- doc/src/USER/atc/man_mesh_create.html | 16 +++--- .../USER/atc/man_mesh_create_elementset.html | 16 +++--- .../USER/atc/man_mesh_create_faceset_box.html | 16 +++--- .../atc/man_mesh_create_faceset_plane.html | 16 +++--- doc/src/USER/atc/man_mesh_create_nodeset.html | 16 +++--- .../USER/atc/man_mesh_delete_elements.html | 16 +++--- .../atc/man_mesh_nodeset_to_elementset.html | 16 +++--- doc/src/USER/atc/man_mesh_output.html | 16 +++--- doc/src/USER/atc/man_mesh_quadrature.html | 16 +++--- doc/src/USER/atc/man_mesh_read.html | 16 +++--- doc/src/USER/atc/man_mesh_write.html | 16 +++--- .../atc/man_momentum_time_integration.html | 16 +++--- doc/src/USER/atc/man_output.html | 16 +++--- doc/src/USER/atc/man_output_elementset.html | 16 +++--- doc/src/USER/atc/man_output_nodeset.html | 16 +++--- doc/src/USER/atc/man_pair_interactions.html | 16 +++--- doc/src/USER/atc/man_poisson_solver.html | 16 +++--- doc/src/USER/atc/man_read_restart.html | 16 +++--- doc/src/USER/atc/man_remove_molecule.html | 16 +++--- doc/src/USER/atc/man_remove_source.html | 16 +++--- doc/src/USER/atc/man_remove_species.html | 16 +++--- .../man_reset_atomic_reference_positions.html | 16 +++--- doc/src/USER/atc/man_reset_time.html | 16 +++--- doc/src/USER/atc/man_sample_frequency.html | 16 +++--- doc/src/USER/atc/man_set.html | 16 +++--- doc/src/USER/atc/man_source.html | 16 +++--- doc/src/USER/atc/man_source_integration.html | 16 +++--- .../USER/atc/man_temperature_definition.html | 16 +++--- .../atc/man_thermal_time_integration.html | 16 +++--- doc/src/USER/atc/man_time_filter.html | 16 +++--- doc/src/USER/atc/man_track_displacement.html | 16 +++--- doc/src/USER/atc/man_unfix_flux.html | 16 +++--- doc/src/USER/atc/man_unfix_nodes.html | 16 +++--- doc/src/USER/atc/man_write_atom_weights.html | 16 +++--- doc/src/USER/atc/man_write_restart.html | 16 +++--- 78 files changed, 491 insertions(+), 791 deletions(-) diff --git a/doc/src/USER/atc/man_add_molecule.html b/doc/src/USER/atc/man_add_molecule.html index a535b871a9..8d9625e1bd 100644 --- a/doc/src/USER/atc/man_add_molecule.html +++ b/doc/src/USER/atc/man_add_molecule.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_add_species.html b/doc/src/USER/atc/man_add_species.html index 5166ccfa2d..9beded1b16 100644 --- a/doc/src/USER/atc/man_add_species.html +++ b/doc/src/USER/atc/man_add_species.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_atom_element_map.html b/doc/src/USER/atc/man_atom_element_map.html index 47ea0f20c9..6725170928 100644 --- a/doc/src/USER/atc/man_atom_element_map.html +++ b/doc/src/USER/atc/man_atom_element_map.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_atom_weight.html b/doc/src/USER/atc/man_atom_weight.html index 9161b54f32..28bc90fa01 100644 --- a/doc/src/USER/atc/man_atom_weight.html +++ b/doc/src/USER/atc/man_atom_weight.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_atomic_charge.html b/doc/src/USER/atc/man_atomic_charge.html index 3507a5598b..ef787f53ac 100644 --- a/doc/src/USER/atc/man_atomic_charge.html +++ b/doc/src/USER/atc/man_atomic_charge.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_boundary.html b/doc/src/USER/atc/man_boundary.html index 6694311981..61596d3b31 100644 --- a/doc/src/USER/atc/man_boundary.html +++ b/doc/src/USER/atc/man_boundary.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_boundary_dynamics.html b/doc/src/USER/atc/man_boundary_dynamics.html index 3a7cb141a7..40b82f3f61 100644 --- a/doc/src/USER/atc/man_boundary_dynamics.html +++ b/doc/src/USER/atc/man_boundary_dynamics.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_boundary_faceset.html b/doc/src/USER/atc/man_boundary_faceset.html index 2e2fce7bdb..7eb950f78e 100644 --- a/doc/src/USER/atc/man_boundary_faceset.html +++ b/doc/src/USER/atc/man_boundary_faceset.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_boundary_integral.html b/doc/src/USER/atc/man_boundary_integral.html index e1933a9465..0663dba176 100644 --- a/doc/src/USER/atc/man_boundary_integral.html +++ b/doc/src/USER/atc/man_boundary_integral.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_consistent_fe_initialization.html b/doc/src/USER/atc/man_consistent_fe_initialization.html index a74acda5e9..a731b09116 100644 --- a/doc/src/USER/atc/man_consistent_fe_initialization.html +++ b/doc/src/USER/atc/man_consistent_fe_initialization.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_contour_integral.html b/doc/src/USER/atc/man_contour_integral.html index 304b4bec66..690f0fcc98 100644 --- a/doc/src/USER/atc/man_contour_integral.html +++ b/doc/src/USER/atc/man_contour_integral.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_control.html b/doc/src/USER/atc/man_control.html index 2c42fa2d6a..900952ba0b 100644 --- a/doc/src/USER/atc/man_control.html +++ b/doc/src/USER/atc/man_control.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_control_momentum.html b/doc/src/USER/atc/man_control_momentum.html index fd9aadf1d7..8f4f486595 100644 --- a/doc/src/USER/atc/man_control_momentum.html +++ b/doc/src/USER/atc/man_control_momentum.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_control_thermal.html b/doc/src/USER/atc/man_control_thermal.html index b6af089baf..eab186f715 100644 --- a/doc/src/USER/atc/man_control_thermal.html +++ b/doc/src/USER/atc/man_control_thermal.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html b/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html index 2a939d1693..a337a495e0 100644 --- a/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html +++ b/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_decomposition.html b/doc/src/USER/atc/man_decomposition.html index fd8986b19d..d54a201034 100644 --- a/doc/src/USER/atc/man_decomposition.html +++ b/doc/src/USER/atc/man_decomposition.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_electron_integration.html b/doc/src/USER/atc/man_electron_integration.html index ab00b5d45f..ab454c16d2 100644 --- a/doc/src/USER/atc/man_electron_integration.html +++ b/doc/src/USER/atc/man_electron_integration.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_equilibrium_start.html b/doc/src/USER/atc/man_equilibrium_start.html index ba19dbf53a..d01253c4b3 100644 --- a/doc/src/USER/atc/man_equilibrium_start.html +++ b/doc/src/USER/atc/man_equilibrium_start.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_extrinsic_exchange.html b/doc/src/USER/atc/man_extrinsic_exchange.html index 5b3b4315e1..4f1f5962d9 100644 --- a/doc/src/USER/atc/man_extrinsic_exchange.html +++ b/doc/src/USER/atc/man_extrinsic_exchange.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_fe_md_boundary.html b/doc/src/USER/atc/man_fe_md_boundary.html index aa1b6f6bb3..e517dd4855 100644 --- a/doc/src/USER/atc/man_fe_md_boundary.html +++ b/doc/src/USER/atc/man_fe_md_boundary.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_fem_mesh.html b/doc/src/USER/atc/man_fem_mesh.html index 3b6f0ddc34..b8ba584816 100644 --- a/doc/src/USER/atc/man_fem_mesh.html +++ b/doc/src/USER/atc/man_fem_mesh.html @@ -1,37 +1,45 @@ - - + + + + ATC: fix_modify AtC fem create mesh - - -
    - Website + + + + +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     Commands -
    -
    - USER-AtC Manual -
    - +
    -

    fix_modify AtC fem create mesh

    + + +
    + +

    fix_modify AtC fem create mesh

    syntax

    fix_modify AtC fem create mesh <nx> <ny> <nz> <region-id> <f|p> <f|p> <f|p>
    • nx ny nz = number of elements in x, y, z
    • region-id = id of region that is to be meshed
    • f p p = perioidicity flags for x, y, z
    -

    +

    examples

    - fix_modify AtC fem create mesh 10 1 1 feRegion p p p

    +

    fix_modify AtC fem create mesh 10 1 1 feRegion p p p
    +

    +

    description

    -Creates a uniform mesh in a rectangular region

    +

    Creates a uniform mesh in a rectangular region

    +

    restrictions

    -creates only uniform rectangular grids in a rectangular region

    +

    creates only uniform rectangular grids in a rectangular region

    +

    related

    -

    +

    default

    -none
    Generated on Mon Aug 17 09:35:16 2009 for ATC by  +none +
    Generated on Mon Aug 17 09:35:16 2009 for ATC by  doxygen 1.3.9.1
    diff --git a/doc/src/USER/atc/man_filter_scale.html b/doc/src/USER/atc/man_filter_scale.html index 68eb5ef370..7a871f5c81 100644 --- a/doc/src/USER/atc/man_filter_scale.html +++ b/doc/src/USER/atc/man_filter_scale.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_filter_type.html b/doc/src/USER/atc/man_filter_type.html index 919dff505f..2711d128e9 100644 --- a/doc/src/USER/atc/man_filter_type.html +++ b/doc/src/USER/atc/man_filter_type.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_fix_atc.html b/doc/src/USER/atc/man_fix_atc.html index 9e82ded3de..7cc6cfea5b 100644 --- a/doc/src/USER/atc/man_fix_atc.html +++ b/doc/src/USER/atc/man_fix_atc.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_fix_flux.html b/doc/src/USER/atc/man_fix_flux.html index a5b98d8c64..42815def6b 100644 --- a/doc/src/USER/atc/man_fix_flux.html +++ b/doc/src/USER/atc/man_fix_flux.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_fix_nodes.html b/doc/src/USER/atc/man_fix_nodes.html index b8d20002b5..03cf86eb92 100644 --- a/doc/src/USER/atc/man_fix_nodes.html +++ b/doc/src/USER/atc/man_fix_nodes.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_hardy_computes.html b/doc/src/USER/atc/man_hardy_computes.html index 9c4ea9340d..b45b7dfb01 100644 --- a/doc/src/USER/atc/man_hardy_computes.html +++ b/doc/src/USER/atc/man_hardy_computes.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_hardy_fields.html b/doc/src/USER/atc/man_hardy_fields.html index 79cbbb5d56..17903aabd0 100644 --- a/doc/src/USER/atc/man_hardy_fields.html +++ b/doc/src/USER/atc/man_hardy_fields.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_hardy_gradients.html b/doc/src/USER/atc/man_hardy_gradients.html index 30016b591a..00935f0ae2 100644 --- a/doc/src/USER/atc/man_hardy_gradients.html +++ b/doc/src/USER/atc/man_hardy_gradients.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_hardy_kernel.html b/doc/src/USER/atc/man_hardy_kernel.html index a37fdd22d9..f97037784c 100644 --- a/doc/src/USER/atc/man_hardy_kernel.html +++ b/doc/src/USER/atc/man_hardy_kernel.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_hardy_on_the_fly.html b/doc/src/USER/atc/man_hardy_on_the_fly.html index 043926d555..79c1006c97 100644 --- a/doc/src/USER/atc/man_hardy_on_the_fly.html +++ b/doc/src/USER/atc/man_hardy_on_the_fly.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_hardy_rates.html b/doc/src/USER/atc/man_hardy_rates.html index 775df82f94..e51cbc9873 100644 --- a/doc/src/USER/atc/man_hardy_rates.html +++ b/doc/src/USER/atc/man_hardy_rates.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_initial.html b/doc/src/USER/atc/man_initial.html index 429bd25af6..41ae06eb8c 100644 --- a/doc/src/USER/atc/man_initial.html +++ b/doc/src/USER/atc/man_initial.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_internal_atom_integrate.html b/doc/src/USER/atc/man_internal_atom_integrate.html index 2f2987ec68..dfa19474e5 100644 --- a/doc/src/USER/atc/man_internal_atom_integrate.html +++ b/doc/src/USER/atc/man_internal_atom_integrate.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_internal_element_set.html b/doc/src/USER/atc/man_internal_element_set.html index dbd1d1e026..849e8f0671 100644 --- a/doc/src/USER/atc/man_internal_element_set.html +++ b/doc/src/USER/atc/man_internal_element_set.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_internal_quadrature.html b/doc/src/USER/atc/man_internal_quadrature.html index 1a36ab4606..7f10e17076 100644 --- a/doc/src/USER/atc/man_internal_quadrature.html +++ b/doc/src/USER/atc/man_internal_quadrature.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_kernel_function.html b/doc/src/USER/atc/man_kernel_function.html index f87735b38b..92db590198 100644 --- a/doc/src/USER/atc/man_kernel_function.html +++ b/doc/src/USER/atc/man_kernel_function.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_localized_lambda.html b/doc/src/USER/atc/man_localized_lambda.html index 8b729f567b..fd845d0a71 100644 --- a/doc/src/USER/atc/man_localized_lambda.html +++ b/doc/src/USER/atc/man_localized_lambda.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_lumped_lambda_solve.html b/doc/src/USER/atc/man_lumped_lambda_solve.html index a38edfff09..ade780ddee 100644 --- a/doc/src/USER/atc/man_lumped_lambda_solve.html +++ b/doc/src/USER/atc/man_lumped_lambda_solve.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mask_direction.html b/doc/src/USER/atc/man_mask_direction.html index 951b5c1911..31c18b4f1f 100644 --- a/doc/src/USER/atc/man_mask_direction.html +++ b/doc/src/USER/atc/man_mask_direction.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mass_matrix.html b/doc/src/USER/atc/man_mass_matrix.html index 4661348e55..140b745f09 100644 --- a/doc/src/USER/atc/man_mass_matrix.html +++ b/doc/src/USER/atc/man_mass_matrix.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_material.html b/doc/src/USER/atc/man_material.html index 956642bd9d..c31ab4938d 100644 --- a/doc/src/USER/atc/man_material.html +++ b/doc/src/USER/atc/man_material.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_add_to_nodeset.html b/doc/src/USER/atc/man_mesh_add_to_nodeset.html index 7b5ea6bd60..25a5c2cdae 100644 --- a/doc/src/USER/atc/man_mesh_add_to_nodeset.html +++ b/doc/src/USER/atc/man_mesh_add_to_nodeset.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_create.html b/doc/src/USER/atc/man_mesh_create.html index d4ea2be031..a7ee112614 100644 --- a/doc/src/USER/atc/man_mesh_create.html +++ b/doc/src/USER/atc/man_mesh_create.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_create_elementset.html b/doc/src/USER/atc/man_mesh_create_elementset.html index 188d85ceff..2ac383a974 100644 --- a/doc/src/USER/atc/man_mesh_create_elementset.html +++ b/doc/src/USER/atc/man_mesh_create_elementset.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_create_faceset_box.html b/doc/src/USER/atc/man_mesh_create_faceset_box.html index a406cace8b..e62a827a78 100644 --- a/doc/src/USER/atc/man_mesh_create_faceset_box.html +++ b/doc/src/USER/atc/man_mesh_create_faceset_box.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_create_faceset_plane.html b/doc/src/USER/atc/man_mesh_create_faceset_plane.html index 4f21be0def..b1969cb79d 100644 --- a/doc/src/USER/atc/man_mesh_create_faceset_plane.html +++ b/doc/src/USER/atc/man_mesh_create_faceset_plane.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_create_nodeset.html b/doc/src/USER/atc/man_mesh_create_nodeset.html index 4c4fb68fe7..39bfffd119 100644 --- a/doc/src/USER/atc/man_mesh_create_nodeset.html +++ b/doc/src/USER/atc/man_mesh_create_nodeset.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_delete_elements.html b/doc/src/USER/atc/man_mesh_delete_elements.html index 071b67c1e1..60a2fe59a1 100644 --- a/doc/src/USER/atc/man_mesh_delete_elements.html +++ b/doc/src/USER/atc/man_mesh_delete_elements.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html b/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html index 5e45d8dfa2..d05429ebab 100644 --- a/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html +++ b/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_output.html b/doc/src/USER/atc/man_mesh_output.html index 95a0c10ed4..f768a29c41 100644 --- a/doc/src/USER/atc/man_mesh_output.html +++ b/doc/src/USER/atc/man_mesh_output.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_quadrature.html b/doc/src/USER/atc/man_mesh_quadrature.html index dc1e987d87..46487fdce7 100644 --- a/doc/src/USER/atc/man_mesh_quadrature.html +++ b/doc/src/USER/atc/man_mesh_quadrature.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_read.html b/doc/src/USER/atc/man_mesh_read.html index e108177b9c..e0571ccf88 100644 --- a/doc/src/USER/atc/man_mesh_read.html +++ b/doc/src/USER/atc/man_mesh_read.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_mesh_write.html b/doc/src/USER/atc/man_mesh_write.html index 05208a3488..756cf49922 100644 --- a/doc/src/USER/atc/man_mesh_write.html +++ b/doc/src/USER/atc/man_mesh_write.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_momentum_time_integration.html b/doc/src/USER/atc/man_momentum_time_integration.html index 9721d4dadc..60fbfcd888 100644 --- a/doc/src/USER/atc/man_momentum_time_integration.html +++ b/doc/src/USER/atc/man_momentum_time_integration.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_output.html b/doc/src/USER/atc/man_output.html index 99196ded15..aec1d5d55a 100644 --- a/doc/src/USER/atc/man_output.html +++ b/doc/src/USER/atc/man_output.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_output_elementset.html b/doc/src/USER/atc/man_output_elementset.html index 03780e58e0..54079027c5 100644 --- a/doc/src/USER/atc/man_output_elementset.html +++ b/doc/src/USER/atc/man_output_elementset.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_output_nodeset.html b/doc/src/USER/atc/man_output_nodeset.html index 90536b4cb9..2fc6e02681 100644 --- a/doc/src/USER/atc/man_output_nodeset.html +++ b/doc/src/USER/atc/man_output_nodeset.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_pair_interactions.html b/doc/src/USER/atc/man_pair_interactions.html index 3c6d65432c..2cb2cb6113 100644 --- a/doc/src/USER/atc/man_pair_interactions.html +++ b/doc/src/USER/atc/man_pair_interactions.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_poisson_solver.html b/doc/src/USER/atc/man_poisson_solver.html index 2aa4be52a5..b6fabbb27c 100644 --- a/doc/src/USER/atc/man_poisson_solver.html +++ b/doc/src/USER/atc/man_poisson_solver.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_read_restart.html b/doc/src/USER/atc/man_read_restart.html index 1e7c0be0e8..5fc21282f6 100644 --- a/doc/src/USER/atc/man_read_restart.html +++ b/doc/src/USER/atc/man_read_restart.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_remove_molecule.html b/doc/src/USER/atc/man_remove_molecule.html index 0a850dcac3..e6ad418de6 100644 --- a/doc/src/USER/atc/man_remove_molecule.html +++ b/doc/src/USER/atc/man_remove_molecule.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_remove_source.html b/doc/src/USER/atc/man_remove_source.html index f550e2d024..acea7a5607 100644 --- a/doc/src/USER/atc/man_remove_source.html +++ b/doc/src/USER/atc/man_remove_source.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_remove_species.html b/doc/src/USER/atc/man_remove_species.html index ad563fcd79..561364518f 100644 --- a/doc/src/USER/atc/man_remove_species.html +++ b/doc/src/USER/atc/man_remove_species.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_reset_atomic_reference_positions.html b/doc/src/USER/atc/man_reset_atomic_reference_positions.html index 4262ce7b4a..88e6748001 100644 --- a/doc/src/USER/atc/man_reset_atomic_reference_positions.html +++ b/doc/src/USER/atc/man_reset_atomic_reference_positions.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_reset_time.html b/doc/src/USER/atc/man_reset_time.html index 28a9559900..a6429bf6d6 100644 --- a/doc/src/USER/atc/man_reset_time.html +++ b/doc/src/USER/atc/man_reset_time.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_sample_frequency.html b/doc/src/USER/atc/man_sample_frequency.html index 988a2cac50..4e48c4bb29 100644 --- a/doc/src/USER/atc/man_sample_frequency.html +++ b/doc/src/USER/atc/man_sample_frequency.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_set.html b/doc/src/USER/atc/man_set.html index 6543a6458a..cf775c9b36 100644 --- a/doc/src/USER/atc/man_set.html +++ b/doc/src/USER/atc/man_set.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_source.html b/doc/src/USER/atc/man_source.html index 5b8f47f483..c7239f2c41 100644 --- a/doc/src/USER/atc/man_source.html +++ b/doc/src/USER/atc/man_source.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_source_integration.html b/doc/src/USER/atc/man_source_integration.html index 3ce3342458..3f43340af8 100644 --- a/doc/src/USER/atc/man_source_integration.html +++ b/doc/src/USER/atc/man_source_integration.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_temperature_definition.html b/doc/src/USER/atc/man_temperature_definition.html index f7d212cad2..a07ba29cab 100644 --- a/doc/src/USER/atc/man_temperature_definition.html +++ b/doc/src/USER/atc/man_temperature_definition.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_thermal_time_integration.html b/doc/src/USER/atc/man_thermal_time_integration.html index c9205550e9..fe293138be 100644 --- a/doc/src/USER/atc/man_thermal_time_integration.html +++ b/doc/src/USER/atc/man_thermal_time_integration.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_time_filter.html b/doc/src/USER/atc/man_time_filter.html index 02b8bcabaa..732eaa3a36 100644 --- a/doc/src/USER/atc/man_time_filter.html +++ b/doc/src/USER/atc/man_time_filter.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_track_displacement.html b/doc/src/USER/atc/man_track_displacement.html index d77cf879c4..f5410816d7 100644 --- a/doc/src/USER/atc/man_track_displacement.html +++ b/doc/src/USER/atc/man_track_displacement.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_unfix_flux.html b/doc/src/USER/atc/man_unfix_flux.html index 76d24653f1..95e1f4be5a 100644 --- a/doc/src/USER/atc/man_unfix_flux.html +++ b/doc/src/USER/atc/man_unfix_flux.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_unfix_nodes.html b/doc/src/USER/atc/man_unfix_nodes.html index 4ef1460138..78495c928a 100644 --- a/doc/src/USER/atc/man_unfix_nodes.html +++ b/doc/src/USER/atc/man_unfix_nodes.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_write_atom_weights.html b/doc/src/USER/atc/man_write_atom_weights.html index 864b9e43f9..8a0e5b62a8 100644 --- a/doc/src/USER/atc/man_write_atom_weights.html +++ b/doc/src/USER/atc/man_write_atom_weights.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    diff --git a/doc/src/USER/atc/man_write_restart.html b/doc/src/USER/atc/man_write_restart.html index 8c0dae9f6f..6dca57673b 100644 --- a/doc/src/USER/atc/man_write_restart.html +++ b/doc/src/USER/atc/man_write_restart.html @@ -7,20 +7,16 @@ - -
    - USER-AtC Manual -
    - +
    +
    From 69f813b22ec3d8b08035454980c2643f640fccdb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 16:41:23 +0100 Subject: [PATCH 33/73] fix up formatting of tutorials for PDF manual --- doc/Makefile | 2 +- doc/src/lammps.book | 1 + doc/src/lammps_tutorials.txt | 6 ++++ doc/src/tutorial_pylammps.txt | 52 +++++++++++++++++------------------ 4 files changed, 34 insertions(+), 27 deletions(-) create mode 100644 doc/src/lammps_tutorials.txt diff --git a/doc/Makefile b/doc/Makefile index b10b15d057..6e6f36a378 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -21,7 +21,7 @@ HAS_VIRTUALENV = YES endif SPHINXEXTRA = -j $(shell $(PYTHON) -c 'import multiprocessing;print(multiprocessing.cpu_count())') -SOURCES=$(filter-out src/lammps_commands.txt,$(wildcard src/*.txt)) +SOURCES=$(filter-out src/lammps_commands.txt src/lammps_tutorials.txt,$(wildcard src/*.txt)) OBJECTS=$(SOURCES:src/%.txt=$(RSTDIR)/%.rst) .PHONY: help clean-all clean epub html pdf old venv spelling anchor_check diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 400018d248..878e4ad355 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -20,6 +20,7 @@ Section_python.html Section_errors.html Section_history.html +lammps_tutorials.html tutorial_bash_on_windows.html tutorial_drude.html tutorial_github.html diff --git a/doc/src/lammps_tutorials.txt b/doc/src/lammps_tutorials.txt new file mode 100644 index 0000000000..5ceda65b60 --- /dev/null +++ b/doc/src/lammps_tutorials.txt @@ -0,0 +1,6 @@ + +Tutorials :h2 + +The following pages contain some in-depth tutorials for +selected topics, that did not fit into any other place +in the manual. diff --git a/doc/src/tutorial_pylammps.txt b/doc/src/tutorial_pylammps.txt index 52eb6415db..11cddb3cbf 100644 --- a/doc/src/tutorial_pylammps.txt +++ b/doc/src/tutorial_pylammps.txt @@ -6,14 +6,14 @@ :line -PyLammps Tutorial :h1 +PyLammps Tutorial :h3 -Overview :h2 +Overview :h4 PyLammps is a Python wrapper class which can be created on its own or use an existing lammps Python object. It creates a simpler, Python-like interface to @@ -23,16 +23,16 @@ C++ code implementation. Finally, the IPyLammps wrapper builds on top of PyLammps and adds some additional features for IPython integration into IPython notebooks, e.g. for embedded visualization output from dump/image. -Comparison of lammps and PyLammps interfaces :h3 +Comparison of lammps and PyLammps interfaces :h5 -lammps.lammps :h4 +lammps.lammps :h6 uses C-Types direct memory access to native C++ data provides functions to send and receive data to LAMMPS requires knowledge of how LAMMPS internally works (C pointers, etc) :ul -lammps.PyLammps :h4 +lammps.PyLammps :h6 higher-level abstraction built on top of original C-Types interface manipulation of Python objects @@ -41,11 +41,11 @@ shorter, more concise Python better IPython integration, designed for quick prototyping :ul -Quick Start :h2 +Quick Start :h4 -System-wide Installation :h3 +System-wide Installation :h5 -Step 1: Building LAMMPS as a shared library :h4 +Step 1: Building LAMMPS as a shared library :h6 To use LAMMPS inside of Python it has to be compiled as shared library. This library is then loaded by the Python interface. In this example we enable the @@ -60,7 +60,7 @@ make yes-MOLECULE :pre # compile shared library using Makefile make mpi mode=shlib LMP_INC="-DLAMMPS_PNG -DLAMMPS_JPEG -DLAMMPS_FFMPEG -DLAMMPS_EXCEPTIONS" JPG_LIB="-lpng -ljpeg" :pre -Step 2: Installing the LAMMPS Python package :h4 +Step 2: Installing the LAMMPS Python package :h6 PyLammps is part of the lammps Python package. To install it simply install that package into your current Python installation. @@ -71,12 +71,12 @@ python install.py :pre NOTE: Recompiling the shared library requires reinstalling the Python package -Installation inside of a virtualenv :h3 +Installation inside of a virtualenv :h5 You can use virtualenv to create a custom Python environment specifically tuned for your workflow. -Benefits of using a virtualenv :h4 +Benefits of using a virtualenv :h6 isolation of your system Python installation from your development installation installation can happen in your user directory without root access (useful for HPC clusters) @@ -87,7 +87,7 @@ you can even install specific old versions of a package if necessary :ul apt-get install python-virtualenv :pre -Creating a virtualenv with lammps installed :h4 +Creating a virtualenv with lammps installed :h6 # create virtualenv name 'testing' :pre @@ -107,7 +107,7 @@ source testing/bin/activate :pre (testing) deactivate :pre -Creating a new instance of PyLammps :h2 +Creating a new instance of PyLammps :h4 To create a PyLammps object you need to first import the class from the lammps module. By using the default constructor, a new {lammps} instance is created. @@ -121,7 +121,7 @@ from lammps import lammps, PyLammps lmp = lammps() L = PyLammps(ptr=lmp) :pre -Commands :h2 +Commands :h4 Sending a LAMMPS command with the existing library interfaces is done using the command method of the lammps object instance. @@ -155,7 +155,7 @@ them automatically to a final command string. L.region("box block", xlo, xhi, ylo, yhi, zlo, zhi) :pre -System state :h2 +System state :h4 In addition to dispatching commands directly through the PyLammps object, it also provides several properties which allow you to query the system state. @@ -208,7 +208,7 @@ List of groups present in the current system :dd :dle -Working with LAMMPS variables :h2 +Working with LAMMPS variables :h4 LAMMPS variables can be both defined and accessed via the PyLammps interface. @@ -229,7 +229,7 @@ property of this object. print(a.value) a.value = 4 :pre -Retrieving the value of an arbitrary LAMMPS expressions :h2 +Retrieving the value of an arbitrary LAMMPS expressions :h4 LAMMPS expressions can be immediately evaluated by using the eval method. The passed string parameter can be any expression containing global thermo values, @@ -240,7 +240,7 @@ result = L.eval("pe") # potential energy :pre result = L.eval("v_t/2.0") :pre -Accessing atom data :h2 +Accessing atom data :h4 All atoms in the current simulation can be accessed by using the L.atoms list. Each element of this list is an object which exposes its properties (id, type, @@ -263,7 +263,7 @@ L.atoms\[0\].position = (1.0, 0.0) :pre # set position in 3D simulation L.atoms\[0\].position = (1.0, 0.0, 1.) :pre -Evaluating thermo data :h2 +Evaluating thermo data :h4 Each simulation run usually produces thermo output based on system state, computes, fixes or variables. The trajectories of these values can be queried @@ -291,7 +291,7 @@ steps = L.runs\[0\].step ke = L.runs\[0\].ke plt.plot(steps, ke) :pre -Error handling with PyLammps :h2 +Error handling with PyLammps :h4 Compiling the shared library with C++ exception support provides a better error handling experience. Without exceptions the LAMMPS code will terminate the @@ -304,7 +304,7 @@ current LAMMPS process is in an illegal state and must be terminated. It is advised to save your data and terminate the Python instance as quickly as possible. -Using PyLammps in IPython notebooks and Jupyter :h2 +Using PyLammps in IPython notebooks and Jupyter :h4 If the LAMMPS Python package is installed for the same Python interpreter as IPython, you can use PyLammps directly inside of an IPython notebook inside of @@ -320,7 +320,7 @@ Python environment (this assumes you followed the Quick Start instructions): jupyter notebook :pre -IPyLammps Examples :h2 +IPyLammps Examples :h4 Examples of IPython notebooks can be found in the python/examples/pylammps subdirectory. To open these notebooks launch {jupyter notebook} inside this @@ -328,7 +328,7 @@ directory and navigate to one of them. If you compiled and installed a LAMMPS shared library with exceptions, PNG, JPEG and FFMPEG support you should be able to rerun all of these notebooks. -Validating a dihedral potential :h3 +Validating a dihedral potential :h5 This example showcases how an IPython Notebook can be used to compare a simple LAMMPS simulation of a harmonic dihedral potential to its analytical solution. @@ -353,7 +353,7 @@ plot inside the IPython notebook. :c,image(JPG/pylammps_dihedral.jpg) -Running a Monte Carlo relaxation :h3 +Running a Monte Carlo relaxation :h5 This second example shows how to use PyLammps to create a 2D Monte Carlo Relaxation simulation, computing and plotting energy terms and even embedding video output. @@ -424,7 +424,7 @@ The energies of each iteration are collected in a Python list and finally plotte The IPython notebook also shows how to use dump commands and embed video files inside of the IPython notebook. -Using PyLammps and mpi4py (Experimental) :h2 +Using PyLammps and mpi4py (Experimental) :h4 PyLammps can be run in parallel using mpi4py. This python package can be installed using @@ -451,7 +451,7 @@ mpirun -np 4 python melt.py :pre IMPORTANT NOTE: Any command must be executed by all MPI processes. However, evaluations and querying the system state is only available on rank 0. -Feedback and Contributing :h2 +Feedback and Contributing :h4 If you find this Python interface useful, please feel free to provide feedback and ideas on how to improve it to Richard Berger (richard.berger@temple.edu). We also From 4210abfc795fdbefc6ea61b6eb2cc5e1476ad96a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Feb 2018 18:15:17 +0100 Subject: [PATCH 34/73] bugifx for using compute chunk/atom with compress via rerun or right at the beginning of a run --- src/compute_chunk_atom.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/compute_chunk_atom.cpp b/src/compute_chunk_atom.cpp index dcfd2ff131..aa1210caad 100644 --- a/src/compute_chunk_atom.cpp +++ b/src/compute_chunk_atom.cpp @@ -712,13 +712,14 @@ void ComputeChunkAtom::compute_ichunk() return; } - invoked_ichunk = update->ntimestep; - // assign chunk IDs to atoms // will exclude atoms not in group or in optional region // already invoked if this is same timestep as last setup_chunks() + // however, when between runs or using rerun, we need it again. - if (update->ntimestep > invoked_setup) assign_chunk_ids(); + if ((update->ntimestep > invoked_setup) || (invoked_ichunk < 0)) assign_chunk_ids(); + + invoked_ichunk = update->ntimestep; // compress chunk IDs via hash of the original uncompressed IDs // also apply discard rule except for binning styles which already did From 2aa693c46c32af56f167f315e6e0bdcbc09f40ce Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Feb 2018 05:06:54 -0500 Subject: [PATCH 35/73] update authors list and packages from http://lammps.sandia.gov/authors.html --- doc/src/Section_intro.txt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/doc/src/Section_intro.txt b/doc/src/Section_intro.txt index bfb6ef3901..604df6c1ae 100644 --- a/doc/src/Section_intro.txt +++ b/doc/src/Section_intro.txt @@ -507,11 +507,15 @@ we'll be pleased to add them to the "Movies"_http://lammps.sandia.gov/movies.html pages of the LAMMPS WWW site. -The core group of LAMMPS developers is at Sandia National Labs: +The primary LAMMPS developers are at Sandia National Labs and Temple University: Steve Plimpton, sjplimp at sandia.gov Aidan Thompson, athomps at sandia.gov -Paul Crozier, pscrozi at sandia.gov :ul +Stan Moore, stamoor at sandia.gov +Axel Kohlmeyer, akohlmey at gmail.com :ul + +Past primary developers include Paul Crozier and Mark Stevens, +both at Sandia, and Ray Shan, now at Materials Design. The following folks are responsible for significant contributions to the code, or other aspects of the LAMMPS development effort. Many of @@ -519,19 +523,20 @@ the packages they have written are somewhat unique to LAMMPS and the code would not be as general-purpose as it is without their expertise and efforts. -Axel Kohlmeyer (Temple U), akohlmey at gmail.com, SVN and Git repositories, indefatigable mail list responder, USER-CGSDK and USER-OMP packages +Axel Kohlmeyer (Temple U), akohlmey at gmail.com, SVN and Git repositories, indefatigable mail list responder, USER-CGSDK, USER-OMP, USER-COLVARS, USER-MOLFILE, USER-QMMM, USER-TALLY, and COMPRESS packages Roy Pollock (LLNL), Ewald and PPPM solvers -Mike Brown (ORNL), brownw at ornl.gov, GPU package +Mike Brown (ORNL), brownw at ornl.gov, GPU and USER-INTEL package Greg Wagner (Sandia), gjwagne at sandia.gov, MEAM package for MEAM potential Mike Parks (Sandia), mlparks at sandia.gov, PERI package for Peridynamics Rudra Mukherjee (JPL), Rudranarayan.M.Mukherjee at jpl.nasa.gov, POEMS package for articulated rigid body motion Reese Jones (Sandia) and collaborators, rjones at sandia.gov, USER-ATC package for atom/continuum coupling Ilya Valuev (JIHT), valuev at physik.hu-berlin.de, USER-AWPMD package for wave-packet MD -Christian Trott (U Tech Ilmenau), christian.trott at tu-ilmenau.de, USER-CUDA package +Christian Trott (U Tech Ilmenau), christian.trott at tu-ilmenau.de, USER-CUDA and KOKKOS packages Andres Jaramillo-Botero (Caltech), ajaramil at wag.caltech.edu, USER-EFF package for electron force field Christoph Kloss (JKU), Christoph.Kloss at jku.at, USER-LIGGGHTS package for granular models and granular/fluid coupling Metin Aktulga (LBL), hmaktulga at lbl.gov, USER-REAXC package for C version of ReaxFF -Georg Gunzenmuller (EMI), georg.ganzenmueller at emi.fhg.de, USER-SPH package :ul +Georg Gunzenmuller (EMI), georg.ganzenmueller at emi.fhg.de, USER-SMD and USER-SPH packages +Colin Denniston (U Western Ontario), cdennist at uwo.ca, USER-LB package :ul As discussed in "Section 13"_Section_history.html, LAMMPS originated as a cooperative project between DOE labs and industrial From f8daea5f3e371caa983883185fb426b98346305c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Feb 2018 05:13:59 -0500 Subject: [PATCH 36/73] make dihedrals and impropers header output consistent with bonds and angles --- src/write_data.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/write_data.cpp b/src/write_data.cpp index bf00249e51..7c8838628e 100644 --- a/src/write_data.cpp +++ b/src/write_data.cpp @@ -243,11 +243,11 @@ void WriteData::header() fprintf(fp,"%d angle types\n",atom->nangletypes); } if (atom->ndihedrals || atom->ndihedraltypes) { - fprintf(fp,BIGINT_FORMAT " dihedrals\n",atom->ndihedrals); + fprintf(fp,BIGINT_FORMAT " dihedrals\n",ndihedrals); fprintf(fp,"%d dihedral types\n",atom->ndihedraltypes); } if (atom->nimpropers || atom->nimpropertypes) { - fprintf(fp,BIGINT_FORMAT " impropers\n",atom->nimpropers); + fprintf(fp,BIGINT_FORMAT " impropers\n",nimpropers); fprintf(fp,"%d improper types\n",atom->nimpropertypes); } } From 2c4287630dedd0dcb108d79cb7ebd606b64dbf5a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Feb 2018 05:17:15 -0500 Subject: [PATCH 37/73] allow dynamics groups for fix nve/limit and fix temp/rescale --- src/fix_nve_limit.cpp | 1 + src/fix_temp_rescale.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/fix_nve_limit.cpp b/src/fix_nve_limit.cpp index 966fcfbb09..6f85d107f1 100644 --- a/src/fix_nve_limit.cpp +++ b/src/fix_nve_limit.cpp @@ -38,6 +38,7 @@ FixNVELimit::FixNVELimit(LAMMPS *lmp, int narg, char **arg) : scalar_flag = 1; global_freq = 1; extscalar = 1; + dynamic_group_allow = 1; xlimit = force->numeric(FLERR,arg[3]); diff --git a/src/fix_temp_rescale.cpp b/src/fix_temp_rescale.cpp index fe52a31788..52e2da7b3d 100644 --- a/src/fix_temp_rescale.cpp +++ b/src/fix_temp_rescale.cpp @@ -48,6 +48,7 @@ FixTempRescale::FixTempRescale(LAMMPS *lmp, int narg, char **arg) : scalar_flag = 1; global_freq = nevery; extscalar = 1; + dynamic_group_allow = 1; tstr = NULL; if (strstr(arg[4],"v_") == arg[4]) { From a30ede80a658624727e90d1aa413c5a1ad39d1d4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Feb 2018 12:12:19 +0100 Subject: [PATCH 38/73] avoid triggering misformatting of manual overview table with txt2html --- doc/src/Manual.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 127ff0dfa4..a40da29c62 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -176,11 +176,11 @@ END_RST --> 5.1 "Measuring performance"_acc_1 :ulb,b 5.2 "Algorithms and code options to boost performace"_acc_2 :b 5.3 "Accelerator packages with optimized styles"_acc_3 :b - 5.3.1 "GPU package"_accelerate_gpu.html :ulb,b + 5.3.1 "GPU package"_accelerate_gpu.html :b 5.3.2 "USER-INTEL package"_accelerate_intel.html :b 5.3.3 "KOKKOS package"_accelerate_kokkos.html :b 5.3.4 "USER-OMP package"_accelerate_omp.html :b - 5.3.5 "OPT package"_accelerate_opt.html :ule,b + 5.3.5 "OPT package"_accelerate_opt.html :b 5.4 "Comparison of various accelerator packages"_acc_4 :ule,b "How-to discussions"_Section_howto.html :l 6.1 "Restarting a simulation"_howto_1 :ulb,b From b220b647d46b458d67ef8a5a36f0fca9d5772f57 Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 16 Feb 2018 10:49:08 +0100 Subject: [PATCH 39/73] Update error.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When compiling with g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18) an error occurs: error.cpp: In member function ‘void Error::generate_error(unsigned int, std::string, std::string)’: error.cpp:146: error: ‘exit’ was not declared in this scope The fix is to include the #include where the exit() function is decleared in the error.cpp file --- tools/pymol_asphere/src/error.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/pymol_asphere/src/error.cpp b/tools/pymol_asphere/src/error.cpp index 0bbd090566..9491ca04a4 100644 --- a/tools/pymol_asphere/src/error.cpp +++ b/tools/pymol_asphere/src/error.cpp @@ -13,7 +13,8 @@ #include "error.h" #include - +#include + Notice::Notice() { nullout=new ostream(NULL); noteout=&cout; From a641e40e79621e8ebb96b8fd38ae9b3a3fde3bd6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Feb 2018 14:11:58 +0100 Subject: [PATCH 40/73] use Error::message() instead of Error::warning() to report whether coulomb tables are used or not --- src/kspace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kspace.cpp b/src/kspace.cpp index c2113cdf76..1ce69ac818 100644 --- a/src/kspace.cpp +++ b/src/kspace.cpp @@ -318,7 +318,7 @@ double KSpace::estimate_table_accuracy(double q2_over_sqrt, double spr) sprintf(str,"Using %d-bit tables for long-range coulomb",nctb); else sprintf(str,"Using polynomial approximation for long-range coulomb"); - error->warning(FLERR,str); + error->message(FLERR,str); } if (nctb) { From c4ea2f2b34f4a0a8f107e4902d1c1134abe80a46 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Feb 2018 14:24:33 +0100 Subject: [PATCH 41/73] update long-range coulomb message formatting, so it fits better into other kspace output --- src/kspace.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kspace.cpp b/src/kspace.cpp index 1ce69ac818..07e117e162 100644 --- a/src/kspace.cpp +++ b/src/kspace.cpp @@ -315,9 +315,9 @@ double KSpace::estimate_table_accuracy(double q2_over_sqrt, double spr) if (comm->me == 0) { char str[128]; if (nctb) - sprintf(str,"Using %d-bit tables for long-range coulomb",nctb); + sprintf(str," using %d-bit tables for long-range coulomb",nctb); else - sprintf(str,"Using polynomial approximation for long-range coulomb"); + sprintf(str," using polynomial approximation for long-range coulomb"); error->message(FLERR,str); } From c864e55adb71eb91fe881165a6fa7c326a283564 Mon Sep 17 00:00:00 2001 From: vishalkenchan Date: Sun, 18 Feb 2018 14:20:59 +0100 Subject: [PATCH 42/73] Lennard-Jones potential with Coulomb interactions accounted through Wolf summations --- doc/src/pair_lj.txt | 27 ++ src/pair_lj_cut_coul_wolf.cpp | 473 ++++++++++++++++++++++++++++++++++ src/pair_lj_cut_coul_wolf.h | 76 ++++++ 3 files changed, 576 insertions(+) create mode 100644 src/pair_lj_cut_coul_wolf.cpp create mode 100644 src/pair_lj_cut_coul_wolf.h diff --git a/doc/src/pair_lj.txt b/doc/src/pair_lj.txt index 058d54fb59..1f3805643a 100644 --- a/doc/src/pair_lj.txt +++ b/doc/src/pair_lj.txt @@ -32,6 +32,7 @@ pair_style lj/cut/coul/long/omp command :h3 pair_style lj/cut/coul/msm command :h3 pair_style lj/cut/coul/msm/gpu command :h3 pair_style lj/cut/coul/msm/omp command :h3 +pair_style lj/cut/coul/wolf command :h3 pair_style lj/cut/tip4p/cut command :h3 pair_style lj/cut/tip4p/cut/omp command :h3 pair_style lj/cut/tip4p/long command :h3 @@ -63,6 +64,10 @@ args = list of arguments for a particular style :ul {lj/cut/coul/msm} args = cutoff (cutoff2) cutoff = global cutoff for LJ (and Coulombic if only 1 arg) (distance units) cutoff2 = global cutoff for Coulombic (optional) (distance units) + {lj/cut/coul/wolf} args = alpha cutoff (cutoff2) + alpha = damping parameter (inverse distance units) + cutoff = global cutoff for LJ (and Coulombic if only 2 arg) (distance units) + cutoff2 = global cutoff for Coulombic (optional) (distance units) {lj/cut/tip4p/cut} args = otype htype btype atype qdist cutoff (cutoff2) otype,htype = atom types for TIP4P O and H btype,atype = bond and angle types for TIP4P waters @@ -115,6 +120,10 @@ pair_style lj/cut/tip4p/cut 1 2 7 8 0.15 12.0 10.0 pair_coeff * * 100.0 3.0 pair_coeff 1 1 100.0 3.5 9.0 :pre +pair_style lj/cut/coul/wolf 0.2 5. 10.0 +pair_coeff * * 1.0 1.0 +pair_coeff 1 1 1.0 1.0 2.5 :pre + pair_style lj/cut/tip4p/long 1 2 7 8 0.15 12.0 pair_style lj/cut/tip4p/long 1 2 7 8 0.15 12.0 10.0 pair_coeff * * 100.0 3.0 @@ -179,6 +188,24 @@ that a term is added for the "core/shell model"_Section_howto.html#howto_25 to allow charges on core and shell particles to be separated by r = 0.0. +Style {coul/wolf} adds a Coulombic pairwise interaction via the Wolf +summation method, described in "Wolf"_#Wolf1, given by: + +:c,image(Eqs/pair_coul_wolf.jpg) + +where {alpha} is the damping parameter, and erfc() is the +complementary error-function terms. This potential +is essentially a short-range, spherically-truncated, +charge-neutralized, shifted, pairwise {1/r} summation. With a +manipulation of adding and subtracting a self term (for i = j) to the +first and second term on the right-hand-side, respectively, and a +small enough {alpha} damping parameter, the second term shrinks and +the potential becomes a rapidly-converging real-space summation. With +a long enough cutoff and small enough alpha parameter, the energy and +forces calculated by the Wolf summation method approach those of the +Ewald sum. So it is a means of getting effective long-range +interactions with a short-range potential. + Styles {lj/cut/tip4p/cut} and {lj/cut/tip4p/long} implement the TIP4P water model of "(Jorgensen)"_#Jorgensen2, which introduces a massless site located a short distance away from the oxygen atom along the diff --git a/src/pair_lj_cut_coul_wolf.cpp b/src/pair_lj_cut_coul_wolf.cpp new file mode 100644 index 0000000000..538c5499a8 --- /dev/null +++ b/src/pair_lj_cut_coul_wolf.cpp @@ -0,0 +1,473 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Vishal Boddu (FAU) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_lj_cut_coul_wolf.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "update.h" +#include "integrate.h" +#include "respa.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +/* ---------------------------------------------------------------------- */ + +PairLJCutCoulWolf::PairLJCutCoulWolf(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; // NOTE: single() method is not implemented + respa_enable = 1; + writedata = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairLJCutCoulWolf::~PairLJCutCoulWolf() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair; + double rsq,r2inv,r6inv,forcelj,factor_lj,forcecoul,factor_coul; + double prefactor; + double r; + int *ilist,*jlist,*numneigh,**firstneigh; + double erfcc,erfcd,v_sh,dvdrr,e_self,e_shift,f_shift,qisq; + + evdwl = 0.0; + ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double *q = atom->q; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + double *special_coul = force->special_coul; + int newton_pair = force->newton_pair; + double qqrd2e = force->qqrd2e; + + // self and shifted Coulombic energy + + e_self = v_sh = 0.0; + e_shift = erfc(alf*cut_coul)/cut_coul; + f_shift = -(e_shift+ 2.0*alf/MY_PIS * exp(-alf*alf*cut_coul*cut_coul)) / + cut_coul; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + qtmp = q[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + qisq = qtmp*qtmp; + e_self = -(e_shift/2.0 + alf/MY_PIS) * qisq*qqrd2e; + if (eflag) ev_tally(i,i,nlocal,0,0.0,e_self,0.0,0.0,0.0,0.0); + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + factor_coul = special_coul[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + + if (rsq < cut_coulsq) { + r = sqrt(rsq); + prefactor = qqrd2e*qtmp*q[j]/r; + erfcc = erfc(alf*r); + erfcd = exp(-alf*alf*r*r); + v_sh = (erfcc - e_shift*r) * prefactor; + dvdrr = (erfcc/rsq + 2.0*alf/MY_PIS * erfcd/r) + f_shift; + forcecoul = dvdrr*rsq*prefactor; + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor; + } else forcecoul = 0.0; + + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]); + } else forcelj = 0.0; + + fpair = (forcecoul + factor_lj*forcelj) * r2inv; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + if (rsq < cut_ljsq[itype][jtype]) { + evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) - + offset[itype][jtype]; + evdwl *= factor_lj; + } else evdwl = 0.0; + if (rsq < cut_coulsq) { + ecoul = v_sh; + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + } else ecoul = 0.0; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,ecoul,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cut_lj,n+1,n+1,"pair:cut"); + memory->create(cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memory->create(epsilon,n+1,n+1,"pair:epsilon"); + memory->create(sigma,n+1,n+1,"pair:sigma"); + memory->create(lj1,n+1,n+1,"pair:lj1"); + memory->create(lj2,n+1,n+1,"pair:lj2"); + memory->create(lj3,n+1,n+1,"pair:lj3"); + memory->create(lj4,n+1,n+1,"pair:lj4"); + memory->create(offset,n+1,n+1,"pair:offset"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::settings(int narg, char **arg) +{ + if (narg < 2 || narg > 3) error->all(FLERR,"Illegal pair_style command"); + + alf = force->numeric(FLERR,arg[0]); + cut_lj_global = force->numeric(FLERR,arg[1]); + if (narg == 2) cut_coul = cut_lj_global; + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::coeff(int narg, char **arg) +{ + if (narg < 4 || narg > 5) + error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double epsilon_one = force->numeric(FLERR,arg[2]); + double sigma_one = force->numeric(FLERR,arg[3]); + + double cut_lj_one = cut_lj_global; + if (narg == 5) cut_lj_one = force->numeric(FLERR,arg[4]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + epsilon[i][j] = epsilon_one; + sigma[i][j] = sigma_one; + cut_lj[i][j] = cut_lj_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::init_style() +{ + if (!atom->q_flag) + error->all(FLERR,"Pair style lj/cut/coul/wolf requires atom attribute q"); + + cut_coulsq = cut_coul * cut_coul; + + // request regular or rRESPA neighbor list + + int irequest; + int respa = 0; + + if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { + if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; + if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + } + + irequest = neighbor->request(this,instance_me); + + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; + + // set rRESPA cutoffs + + if (strstr(update->integrate_style,"respa") && + ((Respa *) update->integrate)->level_inner >= 0) + cut_respa = ((Respa *) update->integrate)->cutoff; + else cut_respa = NULL; +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairLJCutCoulWolf::init_one(int i, int j) +{ + if (setflag[i][j] == 0) { + epsilon[i][j] = mix_energy(epsilon[i][i],epsilon[j][j], + sigma[i][i],sigma[j][j]); + sigma[i][j] = mix_distance(sigma[i][i],sigma[j][j]); + cut_lj[i][j] = mix_distance(cut_lj[i][i],cut_lj[j][j]); + } + + double cut = MAX(cut_lj[i][j],cut_coul); + cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; + + lj1[i][j] = 48.0 * epsilon[i][j] * pow(sigma[i][j],12.0); + lj2[i][j] = 24.0 * epsilon[i][j] * pow(sigma[i][j],6.0); + lj3[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],12.0); + lj4[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],6.0); + + if (offset_flag && (cut_lj[i][j] > 0.0)) { + double ratio = sigma[i][j] / cut_lj[i][j]; + offset[i][j] = 4.0 * epsilon[i][j] * (pow(ratio,12.0) - pow(ratio,6.0)); + } else offset[i][j] = 0.0; + + lj1[j][i] = lj1[i][j]; + lj2[j][i] = lj2[i][j]; + lj3[j][i] = lj3[i][j]; + lj4[j][i] = lj4[i][j]; + offset[j][i] = offset[i][j]; + + // check interior rRESPA cutoff + + if (cut_respa && cut_lj[i][j] < cut_respa[3]) + error->all(FLERR,"Pair cutoff < Respa interior cutoff"); + + // compute I,J contribution to long-range tail correction + // count total # of atoms of type I and J via Allreduce + + if (tail_flag) { + int *type = atom->type; + int nlocal = atom->nlocal; + + double count[2],all[2]; + count[0] = count[1] = 0.0; + for (int k = 0; k < nlocal; k++) { + if (type[k] == i) count[0] += 1.0; + if (type[k] == j) count[1] += 1.0; + } + MPI_Allreduce(count,all,2,MPI_DOUBLE,MPI_SUM,world); + + double sig2 = sigma[i][j]*sigma[i][j]; + double sig6 = sig2*sig2*sig2; + double rc3 = cut_lj[i][j]*cut_lj[i][j]*cut_lj[i][j]; + double rc6 = rc3*rc3; + double rc9 = rc3*rc6; + etail_ij = 8.0*MY_PI*all[0]*all[1]*epsilon[i][j] * + sig6 * (sig6 - 3.0*rc6) / (9.0*rc9); + ptail_ij = 16.0*MY_PI*all[0]*all[1]*epsilon[i][j] * + sig6 * (2.0*sig6 - 3.0*rc6) / (9.0*rc9); + } + + return cut; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&epsilon[i][j],sizeof(double),1,fp); + fwrite(&sigma[i][j],sizeof(double),1,fp); + fwrite(&cut_lj[i][j],sizeof(double),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&epsilon[i][j],sizeof(double),1,fp); + fread(&sigma[i][j],sizeof(double),1,fp); + fread(&cut_lj[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj[i][j],1,MPI_DOUBLE,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::write_restart_settings(FILE *fp) +{ + fwrite(&alf,sizeof(double),1,fp); + fwrite(&cut_lj_global,sizeof(double),1,fp); + fwrite(&cut_coul,sizeof(double),1,fp); + fwrite(&offset_flag,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); + fwrite(&tail_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::read_restart_settings(FILE *fp) +{ + int me = comm->me; + if (me == 0) { + fread(&alf,sizeof(double),1,fp); + fread(&cut_lj_global,sizeof(double),1,fp); + fread(&cut_coul,sizeof(double),1,fp); + fread(&offset_flag,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + fread(&tail_flag,sizeof(int),1,fp); + } + MPI_Bcast(&alf,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_coul,1,MPI_DOUBLE,0,world); + MPI_Bcast(&offset_flag,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + MPI_Bcast(&tail_flag,1,MPI_INT,0,world); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp,"%d %g %g\n",i,epsilon[i][i],sigma[i][i]); +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp,"%d %d %g %g %g\n",i,j,epsilon[i][j],sigma[i][j],cut_lj[i][j]); +} diff --git a/src/pair_lj_cut_coul_wolf.h b/src/pair_lj_cut_coul_wolf.h new file mode 100644 index 0000000000..97e270b486 --- /dev/null +++ b/src/pair_lj_cut_coul_wolf.h @@ -0,0 +1,76 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(lj/cut/coul/wolf,PairLJCutCoulWolf) + +#else + +#ifndef LMP_PAIR_LJ_CUT_COUL_WOLF_H +#define LMP_PAIR_LJ_CUT_COUL_WOLF_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairLJCutCoulWolf : public Pair { + public: + PairLJCutCoulWolf(class LAMMPS *); + virtual ~PairLJCutCoulWolf(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + void init_style(); + double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void write_data(FILE *); + void write_data_all(FILE *); + + protected: + double cut_lj_global; + double **cut_lj,**cut_ljsq; + double **epsilon,**sigma; + double **lj1,**lj2,**lj3,**lj4,**offset; + double *cut_respa; + double cut_coul,cut_coulsq,alf; + + virtual void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair cutoff < Respa interior cutoff + +One or more pairwise cutoffs are too short to use with the specified +rRESPA cutoffs. + +*/ From 65870843a5a7ab3783b9a8f1d43edd6f740d282f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Feb 2018 15:37:35 +0100 Subject: [PATCH 43/73] fix typo in stride2() description in variable command docs reported by Jerome Guterl --- doc/src/variable.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/variable.txt b/doc/src/variable.txt index e3b7c5de0d..c0851464c3 100644 --- a/doc/src/variable.txt +++ b/doc/src/variable.txt @@ -689,7 +689,7 @@ increase in increments of z, starting at x, until a is reached. At that point the timestep increases in increments of c, from a to b, then after b, increments by z are resumed until y is reached. For any current timestep, the next timestep in the sequence is returned. Thus -if stride(1000,2000,100,1350,1360,1) is used in a variable by the +if stride2(1000,2000,100,1350,1360,1) is used in a variable by the "dump_modify every"_dump_modify.html command, it will generate the sequence of output timesteps: From 98bcf51a4513aa710f452bccac9aef66ff407696 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Feb 2018 16:07:00 +0100 Subject: [PATCH 44/73] there is no support for multi-cutoff r-RESPA in lj/cut/coul/wolf --- src/pair_lj_cut_coul_wolf.cpp | 25 ++----------------------- src/pair_lj_cut_coul_wolf.h | 5 ----- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/src/pair_lj_cut_coul_wolf.cpp b/src/pair_lj_cut_coul_wolf.cpp index 538c5499a8..bcbb0a3b55 100644 --- a/src/pair_lj_cut_coul_wolf.cpp +++ b/src/pair_lj_cut_coul_wolf.cpp @@ -28,8 +28,8 @@ #include "neigh_request.h" #include "update.h" #include "integrate.h" -#include "respa.h" #include "math_const.h" +#include "math_special.h" #include "memory.h" #include "error.h" @@ -40,8 +40,7 @@ using namespace MathConst; PairLJCutCoulWolf::PairLJCutCoulWolf(LAMMPS *lmp) : Pair(lmp) { - single_enable = 0; // NOTE: single() method is not implemented - respa_enable = 1; + single_enable = 0; writedata = 1; } @@ -277,27 +276,7 @@ void PairLJCutCoulWolf::init_style() // request regular or rRESPA neighbor list int irequest; - int respa = 0; - - if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { - if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; - if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; - } - irequest = neighbor->request(this,instance_me); - - if (respa >= 1) { - neighbor->requests[irequest]->respaouter = 1; - neighbor->requests[irequest]->respainner = 1; - } - if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; - - // set rRESPA cutoffs - - if (strstr(update->integrate_style,"respa") && - ((Respa *) update->integrate)->level_inner >= 0) - cut_respa = ((Respa *) update->integrate)->cutoff; - else cut_respa = NULL; } /* ---------------------------------------------------------------------- diff --git a/src/pair_lj_cut_coul_wolf.h b/src/pair_lj_cut_coul_wolf.h index 97e270b486..ddbcaad2bd 100644 --- a/src/pair_lj_cut_coul_wolf.h +++ b/src/pair_lj_cut_coul_wolf.h @@ -68,9 +68,4 @@ E: Incorrect args for pair coefficients Self-explanatory. Check the input script or data file. -E: Pair cutoff < Respa interior cutoff - -One or more pairwise cutoffs are too short to use with the specified -rRESPA cutoffs. - */ From 44285f818f8c808ae60b8231c7447883bbadec2b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Feb 2018 16:37:41 +0100 Subject: [PATCH 45/73] more cleanup and respa code removal --- src/pair_lj_cut_coul_wolf.cpp | 11 +++-------- src/pair_lj_cut_coul_wolf.h | 1 - 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/pair_lj_cut_coul_wolf.cpp b/src/pair_lj_cut_coul_wolf.cpp index bcbb0a3b55..1527180eac 100644 --- a/src/pair_lj_cut_coul_wolf.cpp +++ b/src/pair_lj_cut_coul_wolf.cpp @@ -29,7 +29,6 @@ #include "update.h" #include "integrate.h" #include "math_const.h" -#include "math_special.h" #include "memory.h" #include "error.h" @@ -95,8 +94,8 @@ void PairLJCutCoulWolf::compute(int eflag, int vflag) e_self = v_sh = 0.0; e_shift = erfc(alf*cut_coul)/cut_coul; - f_shift = -(e_shift+ 2.0*alf/MY_PIS * exp(-alf*alf*cut_coul*cut_coul)) / - cut_coul; + f_shift = -(e_shift+ 2.0*alf/MY_PIS + * exp(-alf*alf*cut_coul*cut_coul)) / cut_coul; inum = list->inum; ilist = list->ilist; @@ -167,6 +166,7 @@ void PairLJCutCoulWolf::compute(int eflag, int vflag) offset[itype][jtype]; evdwl *= factor_lj; } else evdwl = 0.0; + if (rsq < cut_coulsq) { ecoul = v_sh; if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; @@ -311,11 +311,6 @@ double PairLJCutCoulWolf::init_one(int i, int j) lj4[j][i] = lj4[i][j]; offset[j][i] = offset[i][j]; - // check interior rRESPA cutoff - - if (cut_respa && cut_lj[i][j] < cut_respa[3]) - error->all(FLERR,"Pair cutoff < Respa interior cutoff"); - // compute I,J contribution to long-range tail correction // count total # of atoms of type I and J via Allreduce diff --git a/src/pair_lj_cut_coul_wolf.h b/src/pair_lj_cut_coul_wolf.h index ddbcaad2bd..aa4e08f9b7 100644 --- a/src/pair_lj_cut_coul_wolf.h +++ b/src/pair_lj_cut_coul_wolf.h @@ -45,7 +45,6 @@ class PairLJCutCoulWolf : public Pair { double **cut_lj,**cut_ljsq; double **epsilon,**sigma; double **lj1,**lj2,**lj3,**lj4,**offset; - double *cut_respa; double cut_coul,cut_coulsq,alf; virtual void allocate(); From 7ec4a5818d50a91453a15168ac6a7a1ae35d6304 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Feb 2018 16:38:11 +0100 Subject: [PATCH 46/73] add USER-OMP versions of lj/cut/coul/wolf --- doc/src/pair_lj.txt | 1 + src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp | 204 +++++++++++++++++++++ src/USER-OMP/pair_lj_cut_coul_wolf_omp.h | 48 +++++ 3 files changed, 253 insertions(+) create mode 100644 src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp create mode 100644 src/USER-OMP/pair_lj_cut_coul_wolf_omp.h diff --git a/doc/src/pair_lj.txt b/doc/src/pair_lj.txt index 1f3805643a..e297d479bc 100644 --- a/doc/src/pair_lj.txt +++ b/doc/src/pair_lj.txt @@ -33,6 +33,7 @@ pair_style lj/cut/coul/msm command :h3 pair_style lj/cut/coul/msm/gpu command :h3 pair_style lj/cut/coul/msm/omp command :h3 pair_style lj/cut/coul/wolf command :h3 +pair_style lj/cut/coul/wolf/omp command :h3 pair_style lj/cut/tip4p/cut command :h3 pair_style lj/cut/tip4p/cut/omp command :h3 pair_style lj/cut/tip4p/long command :h3 diff --git a/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp new file mode 100644 index 0000000000..f5dc03e368 --- /dev/null +++ b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp @@ -0,0 +1,204 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + This software is distributed under the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#include +#include "pair_lj_cut_coul_wolf_omp.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" + +#include "suffix.h" +#include "math_const.h" +using namespace LAMMPS_NS; +using namespace MathConst; + +/* ---------------------------------------------------------------------- */ + +PairLJCutCoulWolfOMP::PairLJCutCoulWolfOMP(LAMMPS *lmp) : + PairLJCutCoulWolf(lmp), ThrOMP(lmp, THR_PAIR) +{ + suffix_flag |= Suffix::OMP; + respa_enable = 0; +} + +/* ---------------------------------------------------------------------- */ + +void PairLJCutCoulWolfOMP::compute(int eflag, int vflag) +{ + if (eflag || vflag) { + ev_setup(eflag,vflag); + } else evflag = vflag_fdotr = 0; + + const int nall = atom->nlocal + atom->nghost; + const int nthreads = comm->nthreads; + const int inum = list->inum; + +#if defined(_OPENMP) +#pragma omp parallel default(none) shared(eflag,vflag) +#endif + { + int ifrom, ito, tid; + + loop_setup_thr(ifrom, ito, tid, inum, nthreads); + ThrData *thr = fix->get_thr(tid); + thr->timer(Timer::START); + ev_setup_thr(eflag, vflag, nall, eatom, vatom, thr); + + if (evflag) { + if (eflag) { + if (force->newton_pair) eval<1,1,1>(ifrom, ito, thr); + else eval<1,1,0>(ifrom, ito, thr); + } else { + if (force->newton_pair) eval<1,0,1>(ifrom, ito, thr); + else eval<1,0,0>(ifrom, ito, thr); + } + } else { + if (force->newton_pair) eval<0,0,1>(ifrom, ito, thr); + else eval<0,0,0>(ifrom, ito, thr); + } + + thr->timer(Timer::PAIR); + reduce_thr(this, eflag, vflag, thr); + } // end of omp parallel region +} + +/* ---------------------------------------------------------------------- */ + +template +void PairLJCutCoulWolfOMP::eval(int iifrom, int iito, ThrData * const thr) +{ + int i,j,ii,jj,jnum,itype,jtype; + double qitmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair; + double r,rsq,r2inv,r6inv,forcecoul,forcelj,factor_coul,factor_lj; + double prefactor,erfcc,erfcd,v_sh,dvdrr,e_self,qisq; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + + const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; + dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; + const double * _noalias const q = atom->q; + const int * _noalias const type = atom->type; + const int nlocal = atom->nlocal; + const double * _noalias const special_coul = force->special_coul; + const double * _noalias const special_lj = force->special_lj; + const double qqrd2e = force->qqrd2e; + double fxtmp,fytmp,fztmp; + + // self and shifted Coulombic energy + + e_self = v_sh = 0.0; + const double e_shift = erfc(alf*cut_coul)/cut_coul; + const double f_shift = -(e_shift+ 2.0*alf/MY_PIS + * exp(-alf*alf*cut_coul*cut_coul)) / cut_coul; + + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = iifrom; ii < iito; ++ii) { + + i = ilist[ii]; + qitmp = q[i]; + xtmp = x[i].x; + ytmp = x[i].y; + ztmp = x[i].z; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + fxtmp=fytmp=fztmp=0.0; + + if (EFLAG) { + e_self = -(e_shift/2.0 + alf/MY_PIS) * qitmp*qitmp*qqrd2e; + ev_tally_thr(this,i,i,nlocal,0,0.0,e_self,0.0,0.0,0.0,0.0,thr); + } + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + factor_coul = special_coul[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j].x; + dely = ytmp - x[j].y; + delz = ztmp - x[j].z; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + + if (rsq < cut_coulsq) { + r = sqrt(rsq); + prefactor = qqrd2e*qitmp*q[j]/r; + erfcc = erfc(alf*r); + erfcd = exp(-alf*alf*r*r); + v_sh = (erfcc - e_shift*r) * prefactor; + dvdrr = (erfcc/rsq + 2.0*alf/MY_PIS * erfcd/r) + f_shift; + forcecoul = dvdrr*rsq*prefactor; + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor; + } else forcecoul = 0.0; + + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]); + } else forcelj = 0.0; + + fpair = (forcecoul + factor_lj*forcelj) * r2inv; + + fxtmp += delx*fpair; + fytmp += dely*fpair; + fztmp += delz*fpair; + if (NEWTON_PAIR || j < nlocal) { + f[j].x -= delx*fpair; + f[j].y -= dely*fpair; + f[j].z -= delz*fpair; + } + + if (EFLAG) { + if (rsq < cut_ljsq[itype][jtype]) { + evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) - + offset[itype][jtype]; + evdwl *= factor_lj; + } else evdwl = 0.0; + + if (rsq < cut_coulsq) { + ecoul = v_sh; + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + } else ecoul = 0.0; + } + + if (EVFLAG) ev_tally_thr(this, i,j,nlocal,NEWTON_PAIR, + evdwl,ecoul,fpair,delx,dely,delz,thr); + } + } + f[i].x += fxtmp; + f[i].y += fytmp; + f[i].z += fztmp; + } +} + +/* ---------------------------------------------------------------------- */ + +double PairLJCutCoulWolfOMP::memory_usage() +{ + double bytes = memory_usage_thr(); + bytes += PairLJCutCoulWolf::memory_usage(); + + return bytes; +} diff --git a/src/USER-OMP/pair_lj_cut_coul_wolf_omp.h b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.h new file mode 100644 index 0000000000..4e56808c7b --- /dev/null +++ b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.h @@ -0,0 +1,48 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(lj/cut/coul/wolf/omp,PairLJCutCoulWolfOMP) + +#else + +#ifndef LMP_PAIR_LJ_CUT_COUL_WOLF_OMP_H +#define LMP_PAIR_LJ_CUT_COUL_WOLF_OMP_H + +#include "pair_lj_cut_coul_wolf.h" +#include "thr_omp.h" + +namespace LAMMPS_NS { + +class PairLJCutCoulWolfOMP : public PairLJCutCoulWolf, public ThrOMP { + + public: + PairLJCutCoulWolfOMP(class LAMMPS *); + + virtual void compute(int, int); + virtual double memory_usage(); + + private: + template + void eval(int ifrom, int ito, ThrData * const thr); +}; + +} + +#endif +#endif From 7bd089aa6df6ee34462824a9bddff4540cd749e2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 19 Feb 2018 14:05:50 +0100 Subject: [PATCH 47/73] fix typo --- tools/msi2lmp/src/msi2lmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/msi2lmp/src/msi2lmp.c b/tools/msi2lmp/src/msi2lmp.c index 15cfddd258..b0bc7815ba 100644 --- a/tools/msi2lmp/src/msi2lmp.c +++ b/tools/msi2lmp/src/msi2lmp.c @@ -273,7 +273,7 @@ int main (int argc, char *argv[]) shift[2] = atof(argv[++n]); } else if (strncmp(argv[n],"-i",2) == 0 ) { iflag = 1; - } else if (strncmp(argv[n],"-n",4) == 0 ) { + } else if (strncmp(argv[n],"-n",2) == 0 ) { centerflag = 0; } else if (strncmp(argv[n],"-o",2) == 0 ) { hintflag = 0; From 54dc73c771627be181bf335bcf13cc7e83308850 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 19 Feb 2018 14:06:26 +0100 Subject: [PATCH 48/73] correctly compute adjusted box lengths for triclinic boxes. code taken from topotools --- tools/msi2lmp/src/ReadCarFile.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tools/msi2lmp/src/ReadCarFile.c b/tools/msi2lmp/src/ReadCarFile.c index 73209bc994..c6db96cf92 100644 --- a/tools/msi2lmp/src/ReadCarFile.c +++ b/tools/msi2lmp/src/ReadCarFile.c @@ -73,7 +73,6 @@ void ReadCarFile(void) int skip; /* lines to skip at beginning of file */ double lowest, highest; /* temp coordinate finding variables */ double total_q; - double sq_c; double cos_alpha; /* Added by SLTM Sept 13, 2010 */ double cos_gamma; double sin_gamma; @@ -261,7 +260,7 @@ void ReadCarFile(void) box[2][k] = 0.0; } } else { - sq_c = pbc[2]*pbc[2]; + double ly,lz; cos_alpha = cos(pbc[3]*PI_180); cos_gamma = cos(pbc[5]*PI_180); sin_gamma = sin(pbc[5]*PI_180); @@ -275,16 +274,23 @@ void ReadCarFile(void) B = pbc[1]; C = pbc[2]; + /* compute xy, xz, and yz */ + box[2][0] = B * cos_gamma; + box[2][1] = C * cos_beta; + if (fabs(sin_gamma) > 0.0001) + box[2][2] = C*(cos_alpha-cos_gamma*cos_beta)/sin_gamma; + else box[2][2] = 0.0; box[0][0] = -0.5*A + center[0] + shift[0]; box[1][0] = 0.5*A + center[0] + shift[0]; - box[0][1] = -0.5*B*sin_gamma + center[1] + shift[1]; - box[1][1] = 0.5*B*sin_gamma + center[1] + shift[1]; - box[0][2] = -0.5*sqrt(sq_c * sin_beta*sin_beta - C*(cos_alpha-cos_gamma*cos_beta)/sin_gamma) + center[2] + shift[2]; - box[1][2] = 0.5*sqrt(sq_c * sin_beta*sin_beta - C*(cos_alpha-cos_gamma*cos_beta)/sin_gamma) + center[2] + shift[2]; - box[2][0] = B * cos_gamma; /* This is xy SLTM */ - box[2][1] = C * cos_beta; /* This is xz SLTM */ - box[2][2] = C*(cos_alpha-cos_gamma*cos_beta)/sin_gamma; /* This is yz SLTM */ + + /* compute adjusted box length for y and z and apply */ + ly = sqrt(B*B - box[2][0]*box[2][0]); + lz = sqrt(C*C - box[2][1]*box[2][1] - box[2][2]*box[2][2]); + box[0][1] = -0.5*ly + center[1] + shift[1]; + box[1][1] = 0.5*ly + center[1] + shift[1]; + box[0][2] = -0.5*lz + center[2] + shift[2]; + box[1][2] = 0.5*lz + center[2] + shift[2]; } } From a8a38216ae0712fd66f9c443c5d69535da6ed564 Mon Sep 17 00:00:00 2001 From: Jc112358 Date: Tue, 20 Feb 2018 10:06:24 -0500 Subject: [PATCH 49/73] added old tangent to fix_neb for AGNI potential --- src/REPLICA/fix_neb.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 98e5539872..ff37954233 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -425,10 +425,14 @@ void FixNEB::min_post_force(int vflag) tangent[i][0] = vmax*delxn + vmin*delxp; tangent[i][1] = vmax*delyn + vmin*delyp; tangent[i][2] = vmax*delzn + vmin*delzp; - } else { + } else if(vnext < vprev) { tangent[i][0] = vmin*delxn + vmax*delxp; tangent[i][1] = vmin*delyn + vmax*delyp; tangent[i][2] = vmin*delzn + vmax*delzp; + } else { //AGNI "old-tangent" method + tangent[i][0] = delxn + delxp; + tangent[i][1] = delyn + delyp; + tangent[i][2] = delzn + delzp; } } From 9f7b837f34c8c40a130f357b64084b8225ff10e8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Feb 2018 17:18:56 +0100 Subject: [PATCH 50/73] replace non-ASCII character --- src/USER-MOLFILE/molfile_interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/USER-MOLFILE/molfile_interface.cpp b/src/USER-MOLFILE/molfile_interface.cpp index 37f343736d..9c0c15f1ee 100644 --- a/src/USER-MOLFILE/molfile_interface.cpp +++ b/src/USER-MOLFILE/molfile_interface.cpp @@ -107,7 +107,7 @@ extern "C" { * J. Phys. Chem., 68, 441 - 452, 1964, * except the value for H, which is taken from R.S. Rowland & R. Taylor, * J.Phys.Chem., 100, 7384 - 7391, 1996. Radii that are not available in - * either of these publications have RvdW = 2.00 Å. + * either of these publications have RvdW = 2.00 \AA. * The radii for Ions (Na, K, Cl, Ca, Mg, and Cs are based on the CHARMM27 * Rmin/2 parameters for (SOD, POT, CLA, CAL, MG, CES) by default. */ From c399b75decd44afdf5b426356fbb6f23bf672cca Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Tue, 20 Feb 2018 12:52:12 -0700 Subject: [PATCH 51/73] 2nd try on LATTE error returns, plus a couple minor doc edits --- doc/src/Section_commands.txt | 3 +- examples/USER/mgpt/log.lammps | 78 ----------------------------------- examples/latte/latte.in | 2 +- src/LATTE/fix_latte.cpp | 15 +++---- src/fix.cpp | 2 - 5 files changed, 11 insertions(+), 89 deletions(-) delete mode 100644 examples/USER/mgpt/log.lammps diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 02ce6f2882..faf254f93d 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -978,6 +978,7 @@ KOKKOS, o = USER-OMP, t = OPT. "lj/cut/coul/long (gikot)"_pair_lj.html, "lj/cut/coul/long/cs"_pair_lj.html, "lj/cut/coul/msm (go)"_pair_lj.html, +"lj/cut/coul/wolf (o)"_pair_lj.html, "lj/cut/dipole/cut (go)"_pair_dipole.html, "lj/cut/dipole/long"_pair_dipole.html, "lj/cut/tip4p/cut (o)"_pair_lj.html, @@ -1011,7 +1012,7 @@ KOKKOS, o = USER-OMP, t = OPT. "reax"_pair_reax.html, "rebo (oi)"_pair_airebo.html, "resquared (go)"_pair_resquared.html, -"snap"_pair_snap.html, +"snap (k)"_pair_snap.html, "soft (go)"_pair_soft.html, "sw (giko)"_pair_sw.html, "table (gko)"_pair_table.html, diff --git a/examples/USER/mgpt/log.lammps b/examples/USER/mgpt/log.lammps deleted file mode 100644 index 9485c36e47..0000000000 --- a/examples/USER/mgpt/log.lammps +++ /dev/null @@ -1,78 +0,0 @@ -LAMMPS (23 Oct 2015) -# script for mgpt t=0 eos with relaxed vacancy in bcc structure: -# input for relaxed vacancy formation energy at constant pressure - -echo screen -Lattice spacing in x,y,z = 6.23812 6.23812 6.23812 -Created orthogonal box = (0 0 0) to (31.1906 31.1906 31.1906) - 1 by 1 by 1 MPI processor grid -Created 250 atoms -Deleted 1 atoms, new total = 249 -Reading potential file Ta6.8x.mgpt.potin with DATE: 2015-07-30 -Neighbor list info ... - 2 neighbor list requests - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 13.1712 - ghost atom cutoff = 13.1712 - binsize = 6.58562 -> bins = 5 5 5 -Memory usage per processor = 4.66978 Mbytes -Step Volume Temp PotEng TotEng Press - 0 30343.887 0 -73.994511 -73.994511 -1.0504398e+09 - 10 30343.887 0 -74.002332 -74.002332 -1.107516e+09 - 20 30343.887 0 -74.00485 -74.00485 -1.1316373e+09 - 30 30343.887 0 -74.005762 -74.005762 -1.143304e+09 - 40 30343.887 0 -74.006116 -74.006116 -1.149395e+09 - 50 30343.887 0 -74.006262 -74.006262 -1.1527914e+09 - 60 30343.887 0 -74.006323 -74.006323 -1.1547677e+09 - 70 30343.887 0 -74.00635 -74.00635 -1.1559529e+09 - 80 30343.887 0 -74.006361 -74.006361 -1.1566763e+09 - 90 30343.887 0 -74.006366 -74.006366 -1.1571256e+09 - 100 30343.887 0 -74.006369 -74.006369 -1.1574093e+09 - 110 30343.887 0 -74.00637 -74.00637 -1.1575908e+09 - 120 30343.887 0 -74.00637 -74.00637 -1.1577083e+09 - 130 30343.887 0 -74.00637 -74.00637 -1.1577849e+09 - 139 30343.887 0 -74.006371 -74.006371 -1.1578311e+09 -Loop time of 4.33109 on 1 procs for 139 steps with 249 atoms - -92.4% CPU use with 1 MPI tasks x no OpenMP threads - -Minimization stats: - Stopping criterion = energy tolerance - Energy initial, next-to-last, final = - -73.9945109564 -74.0063705487 -74.0063705557 - Force two-norm initial, final = 0.0366227 8.09081e-05 - Force max component initial, final = 0.00730948 8.05242e-06 - Final line search alpha, max atom move = 1 8.05242e-06 - Iterations, force evaluations = 139 139 - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 4.3064 | 4.3064 | 4.3064 | 0.0 | 99.43 -Neigh | 0.019113 | 0.019113 | 0.019113 | 0.0 | 0.44 -Comm | 0.0017624 | 0.0017624 | 0.0017624 | 0.0 | 0.04 -Output | 0.00084376 | 0.00084376 | 0.00084376 | 0.0 | 0.02 -Modify | 0 | 0 | 0 | 0.0 | 0.00 -Other | | 0.00297 | | | 0.07 - -Nlocal: 249 ave 249 max 249 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 1479 ave 1479 max 1479 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 7936 ave 7936 max 7936 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -FullNghs: 15872 ave 15872 max 15872 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 15872 -Ave neighs/atom = 63.743 -Neighbor list builds = 4 -Dangerous builds = 0 -number of atoms = 249 -atomic volume (a.u.) = 121.863 -total energy (ry/atom) = -0.594428679162064 -pressure (gpa) = -1.15783109519801 -249 121.863 -148.012741111354 -1.15783109519801 -121.863 -0.594428679162064 -1.15783109519801 -Total wall time: 0:00:04 diff --git a/examples/latte/latte.in b/examples/latte/latte.in index 7df354a742..b8b214b78b 100644 --- a/examples/latte/latte.in +++ b/examples/latte/latte.in @@ -12,7 +12,7 @@ CONTROL{ xControl= 1 BASISTYPE= NONORTHO COORDSFILE= "./coords.dat" - PARAMPATH= "/home/user/LATTE/TBparam" + PARAMPATH= "./TBparam" KBT= 0.0 ENTROPYKIND= 1 PPOTON= 1 diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp index f74b05624f..165dfff597 100644 --- a/src/LATTE/fix_latte.cpp +++ b/src/LATTE/fix_latte.cpp @@ -38,7 +38,7 @@ extern "C" { void latte(int *, int *, double *, int *, int *, double *, double *, double *, double *, double *, double *, double *, int*, - double *, double *, double *, double * ); + double *, double *, double *, double *, bool *); } #define INVOKED_PERATOM 8 @@ -267,7 +267,7 @@ void FixLatte::post_force(int vflag) flags[1] = coulombflag; // 1 for LAMMPS computes Coulombics, 0 for LATTE flags[2] = eflag_atom; // 1 to return per-atom energies, 0 for no flags[3] = vflag_global && thermo_virial; // 1 to return global/per-atom - flags[4] = vflag_atom && thermo_virial; // virial, 0 for no + flags[4] = vflag_atom && thermo_virial; // virial, 0 for no flags[5] = neighflag; // 1 to pass neighbor list to LATTE, 0 for no // setup LATTE arguments @@ -279,16 +279,17 @@ void FixLatte::post_force(int vflag) double *mass = &atom->mass[1]; double *boxlo = domain->boxlo; double *boxhi = domain->boxhi; - double *forces; + bool latteerror = 0; if (coulomb) forces = &flatte[0][0]; else forces = &atom->f[0][0]; - int maxiter = -1; - + latte(flags,&natoms,coords,type,&ntypes,mass,boxlo,boxhi,&domain->xy, - &domain->xz,&domain->yz, - forces,&maxiter,&latte_energy,&atom->v[0][0],&update->dt,virial); + &domain->xz,&domain->yz,forces,&maxiter,&latte_energy, + &atom->v[0][0],&update->dt,virial,&latteerror); + + if (latteerror) error->all(FLERR,"Internal LATTE problem"); // sum LATTE forces to LAMMPS forces // e.g. LAMMPS may compute Coulombics at some point diff --git a/src/fix.cpp b/src/fix.cpp index 80fa00f4b3..297d184967 100644 --- a/src/fix.cpp +++ b/src/fix.cpp @@ -350,7 +350,6 @@ void Fix::v_tally(int n, int *list, double total, double *v) void Fix::v_tally(int i, double *v) { - if (vflag_global) { virial[0] += v[0]; virial[1] += v[1]; @@ -384,7 +383,6 @@ void Fix::v_tally(int i, double *v) void Fix::v_tally(int n, int i, double vn) { - if (vflag_global) virial[n] += vn; From a5a47899a354689d097e6de2ae38b64a9ff97e73 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Feb 2018 22:10:21 +0100 Subject: [PATCH 52/73] make XDR support for dump style xtc compile on MacOSX --- src/MISC/xdr_compat.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MISC/xdr_compat.h b/src/MISC/xdr_compat.h index ac318aa58c..c33cc37db5 100644 --- a/src/MISC/xdr_compat.h +++ b/src/MISC/xdr_compat.h @@ -60,7 +60,7 @@ extern "C" { typedef int bool_t; -#if defined(__MINGW32__) +#if defined(__MINGW32__) || defined(__APPLE) typedef char * caddr_t; typedef unsigned int u_int; #endif From 911529ab24bda484ff43179514ac031c715d3bd8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Feb 2018 08:43:33 +0100 Subject: [PATCH 53/73] correct typo --- src/MISC/xdr_compat.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MISC/xdr_compat.h b/src/MISC/xdr_compat.h index c33cc37db5..605374c47f 100644 --- a/src/MISC/xdr_compat.h +++ b/src/MISC/xdr_compat.h @@ -60,7 +60,7 @@ extern "C" { typedef int bool_t; -#if defined(__MINGW32__) || defined(__APPLE) +#if defined(__MINGW32__) || defined(__APPLE__) typedef char * caddr_t; typedef unsigned int u_int; #endif From a67287418678ec9644cb4db47b8045bac9383c43 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Feb 2018 10:04:13 +0100 Subject: [PATCH 54/73] Update comment Clarify the comment as to why this else branch was added and what this represents. --- src/REPLICA/fix_neb.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index ff37954233..33f834a140 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -425,11 +425,11 @@ void FixNEB::min_post_force(int vflag) tangent[i][0] = vmax*delxn + vmin*delxp; tangent[i][1] = vmax*delyn + vmin*delyp; tangent[i][2] = vmax*delzn + vmin*delzp; - } else if(vnext < vprev) { + } else if (vnext < vprev) { tangent[i][0] = vmin*delxn + vmax*delxp; tangent[i][1] = vmin*delyn + vmax*delyp; tangent[i][2] = vmin*delzn + vmax*delzp; - } else { //AGNI "old-tangent" method + } else { // vnext == vprev, e.g. for potentials that do not compute an energy tangent[i][0] = delxn + delxp; tangent[i][1] = delyn + delyp; tangent[i][2] = delzn + delzp; From bcef43c7d149b89dac901dd88fa4356e6ee30e64 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Feb 2018 12:11:02 -0500 Subject: [PATCH 55/73] add code to check the ABI version of the LATTE library --- src/LATTE/fix_latte.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp index 165dfff597..4594f26f8f 100644 --- a/src/LATTE/fix_latte.cpp +++ b/src/LATTE/fix_latte.cpp @@ -39,6 +39,7 @@ extern "C" { double *, double *, double *, double *, double *, double *, double *, int*, double *, double *, double *, double *, bool *); + int latte_abiversion(); } #define INVOKED_PERATOM 8 @@ -54,6 +55,9 @@ FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : if (comm->nprocs != 1) error->all(FLERR,"Fix latte currently runs only in serial"); + if (20180207 != latte_abiversion()) + error->all(FLERR,"LAMMPS is linked against incompatible LATTE library"); + if (narg != 4) error->all(FLERR,"Illegal fix latte command"); scalar_flag = 1; From cf3887c5e074683b093ca1698d9b2dd90380cc12 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Feb 2018 07:53:58 -0500 Subject: [PATCH 56/73] default arguments on polymorph/pure methods can lead to unexpected overloading in derived classes argument for Integrate::setup() made explicit --- src/KOKKOS/verlet_kokkos.h | 2 +- src/REPLICA/prd.cpp | 6 +++--- src/REPLICA/tad.cpp | 6 +++--- src/REPLICA/temper.cpp | 2 +- src/REPLICA/verlet_split.cpp | 4 ++-- src/REPLICA/verlet_split.h | 2 +- src/USER-MISC/temper_grem.cpp | 2 +- src/USER-MISC/temper_npt.cpp | 2 +- src/USER-OMP/respa_omp.cpp | 30 ++++++++++++++++-------------- src/USER-OMP/respa_omp.h | 2 +- src/integrate.h | 2 +- src/respa.h | 2 +- src/run.cpp | 4 ++-- src/verlet.h | 2 +- 14 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/KOKKOS/verlet_kokkos.h b/src/KOKKOS/verlet_kokkos.h index 7b140b6f81..1e36b1cf6e 100644 --- a/src/KOKKOS/verlet_kokkos.h +++ b/src/KOKKOS/verlet_kokkos.h @@ -31,7 +31,7 @@ class VerletKokkos : public Verlet { public: VerletKokkos(class LAMMPS *, int, char **); ~VerletKokkos() {} - void setup(int flag=1); + void setup(int); void setup_minimal(int); void run(int); diff --git a/src/REPLICA/prd.cpp b/src/REPLICA/prd.cpp index 14eeac8d66..f7d369cee6 100644 --- a/src/REPLICA/prd.cpp +++ b/src/REPLICA/prd.cpp @@ -293,7 +293,7 @@ void PRD::command(int narg, char **arg) update->whichflag = 1; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); if (temp_flag == 0) { if (universe->iworld == 0) temp_dephase = temperature->compute_scalar(); @@ -390,7 +390,7 @@ void PRD::command(int narg, char **arg) update->whichflag = 1; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); timer->barrier_start(); @@ -545,7 +545,7 @@ void PRD::dynamics(int nsteps, double &time_category) update->nsteps = nsteps; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); // this may be needed if don't do full init //modify->addstep_compute_all(update->ntimestep); bigint ncalls = neighbor->ncalls; diff --git a/src/REPLICA/tad.cpp b/src/REPLICA/tad.cpp index 347cd3ba67..958a57e4e8 100644 --- a/src/REPLICA/tad.cpp +++ b/src/REPLICA/tad.cpp @@ -264,7 +264,7 @@ void TAD::command(int narg, char **arg) update->whichflag = 1; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); // main loop: look for events until out of time // (1) dynamics, store state, quench, check event, restore state @@ -342,7 +342,7 @@ void TAD::command(int narg, char **arg) update->whichflag = 1; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); // write restart file of hot coords @@ -448,7 +448,7 @@ void TAD::dynamics() update->nsteps = t_event; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); // this may be needed if don't do full init //modify->addstep_compute_all(update->ntimestep); int ncalls = neighbor->ncalls; diff --git a/src/REPLICA/temper.cpp b/src/REPLICA/temper.cpp index 667f2893c6..d7e8c981bb 100644 --- a/src/REPLICA/temper.cpp +++ b/src/REPLICA/temper.cpp @@ -212,7 +212,7 @@ void Temper::command(int narg, char **arg) if (me_universe == 0 && universe->uscreen) fprintf(universe->uscreen,"Setting up tempering ...\n"); - update->integrate->setup(); + update->integrate->setup(1); if (me_universe == 0) { if (universe->uscreen) { diff --git a/src/REPLICA/verlet_split.cpp b/src/REPLICA/verlet_split.cpp index 4572170f34..3d4e25b7b4 100644 --- a/src/REPLICA/verlet_split.cpp +++ b/src/REPLICA/verlet_split.cpp @@ -239,13 +239,13 @@ void VerletSplit::init() servant partition only sets up KSpace calculation ------------------------------------------------------------------------- */ -void VerletSplit::setup() +void VerletSplit::setup(int flag) { if (comm->me == 0 && screen) fprintf(screen,"Setting up Verlet/split run ...\n"); if (!master) force->kspace->setup(); - else Verlet::setup(); + else Verlet::setup(flag); } /* ---------------------------------------------------------------------- diff --git a/src/REPLICA/verlet_split.h b/src/REPLICA/verlet_split.h index 2d25131df3..b3ee87e580 100644 --- a/src/REPLICA/verlet_split.h +++ b/src/REPLICA/verlet_split.h @@ -29,7 +29,7 @@ class VerletSplit : public Verlet { VerletSplit(class LAMMPS *, int, char **); ~VerletSplit(); void init(); - void setup(); + void setup(int); void setup_minimal(int); void run(int); bigint memory_usage(); diff --git a/src/USER-MISC/temper_grem.cpp b/src/USER-MISC/temper_grem.cpp index 6ce7da8d6a..9e5a4c5c3b 100644 --- a/src/USER-MISC/temper_grem.cpp +++ b/src/USER-MISC/temper_grem.cpp @@ -214,7 +214,7 @@ void TemperGrem::command(int narg, char **arg) if (me_universe == 0 && universe->uscreen) fprintf(universe->uscreen,"Setting up tempering ...\n"); - update->integrate->setup(); + update->integrate->setup(1); if (me_universe == 0) { if (universe->uscreen) { diff --git a/src/USER-MISC/temper_npt.cpp b/src/USER-MISC/temper_npt.cpp index e405377d79..60f9313fdd 100644 --- a/src/USER-MISC/temper_npt.cpp +++ b/src/USER-MISC/temper_npt.cpp @@ -190,7 +190,7 @@ void TemperNPT::command(int narg, char **arg) if (me_universe == 0 && universe->uscreen) fprintf(universe->uscreen,"Setting up tempering ...\n"); - update->integrate->setup(); + update->integrate->setup(1); if (me_universe == 0) { if (universe->uscreen) { diff --git a/src/USER-OMP/respa_omp.cpp b/src/USER-OMP/respa_omp.cpp index aa4aa65a4f..ac1c2d53d4 100644 --- a/src/USER-OMP/respa_omp.cpp +++ b/src/USER-OMP/respa_omp.cpp @@ -67,24 +67,26 @@ void RespaOMP::init() setup before run ------------------------------------------------------------------------- */ -void RespaOMP::setup() +void RespaOMP::setup(int flag) { if (comm->me == 0 && screen) { fprintf(screen,"Setting up r-RESPA/omp run ...\n"); - fprintf(screen," Unit style : %s\n", update->unit_style); - fprintf(screen," Current step : " BIGINT_FORMAT "\n", update->ntimestep); - fprintf(screen," Time steps :"); - for (int ilevel=0; ilevel < nlevels; ++ilevel) - fprintf(screen," %d:%g",ilevel+1, step[ilevel]); - fprintf(screen,"\n r-RESPA fixes :"); - for (int l=0; l < modify->n_post_force_respa; ++l) { - Fix *f = modify->fix[modify->list_post_force_respa[l]]; - if (f->respa_level >= 0) - fprintf(screen," %d:%s[%s]", - MIN(f->respa_level+1,nlevels),f->style,f->id); + if (flag) { + fprintf(screen," Unit style : %s\n", update->unit_style); + fprintf(screen," Current step : " BIGINT_FORMAT "\n", update->ntimestep); + fprintf(screen," Time steps :"); + for (int ilevel=0; ilevel < nlevels; ++ilevel) + fprintf(screen," %d:%g",ilevel+1, step[ilevel]); + fprintf(screen,"\n r-RESPA fixes :"); + for (int l=0; l < modify->n_post_force_respa; ++l) { + Fix *f = modify->fix[modify->list_post_force_respa[l]]; + if (f->respa_level >= 0) + fprintf(screen," %d:%s[%s]", + MIN(f->respa_level+1,nlevels),f->style,f->id); + } + fprintf(screen,"\n"); + timer->print_timeout(screen); } - fprintf(screen,"\n"); - timer->print_timeout(screen); } update->setupflag = 1; diff --git a/src/USER-OMP/respa_omp.h b/src/USER-OMP/respa_omp.h index 89ddbe78af..dc01e3dc5b 100644 --- a/src/USER-OMP/respa_omp.h +++ b/src/USER-OMP/respa_omp.h @@ -30,7 +30,7 @@ class RespaOMP : public Respa, public ThrOMP { RespaOMP(class LAMMPS *, int, char **); virtual ~RespaOMP() {} virtual void init(); - virtual void setup(); + virtual void setup(int); virtual void setup_minimal(int); protected: diff --git a/src/integrate.h b/src/integrate.h index 4ca3a788fa..9a50fad1f7 100644 --- a/src/integrate.h +++ b/src/integrate.h @@ -23,7 +23,7 @@ class Integrate : protected Pointers { Integrate(class LAMMPS *, int, char **); virtual ~Integrate(); virtual void init(); - virtual void setup(int flag=1) = 0; + virtual void setup(int flag) = 0; virtual void setup_minimal(int) = 0; virtual void run(int) = 0; virtual void cleanup() {} diff --git a/src/respa.h b/src/respa.h index 0b08b12bd7..f910f0c666 100644 --- a/src/respa.h +++ b/src/respa.h @@ -48,7 +48,7 @@ class Respa : public Integrate { Respa(class LAMMPS *, int, char **); virtual ~Respa(); virtual void init(); - virtual void setup(int flag=1); + virtual void setup(int); virtual void setup_minimal(int); virtual void run(int); virtual void cleanup(); diff --git a/src/run.cpp b/src/run.cpp index 3317545342..37af977e34 100644 --- a/src/run.cpp +++ b/src/run.cpp @@ -175,7 +175,7 @@ void Run::command(int narg, char **arg) if (preflag || update->first_update == 0) { lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); } else output->setup(0); timer->init(); @@ -216,7 +216,7 @@ void Run::command(int narg, char **arg) if (preflag || iter == 0) { lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); } else output->setup(0); timer->init(); diff --git a/src/verlet.h b/src/verlet.h index 29bd3f16b3..e71932a861 100644 --- a/src/verlet.h +++ b/src/verlet.h @@ -29,7 +29,7 @@ class Verlet : public Integrate { Verlet(class LAMMPS *, int, char **); virtual ~Verlet() {} virtual void init(); - virtual void setup(int flag=1); + virtual void setup(int flag); virtual void setup_minimal(int); virtual void run(int); void cleanup(); From 65acd233ce112a086b98f8a429ea4587625b10b9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Feb 2018 08:13:54 -0500 Subject: [PATCH 57/73] forgot to remove one default argument on a method derived from Integrate::setup() --- src/USER-INTEL/verlet_lrt_intel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/USER-INTEL/verlet_lrt_intel.h b/src/USER-INTEL/verlet_lrt_intel.h index 0d7154ff64..7380cc6376 100644 --- a/src/USER-INTEL/verlet_lrt_intel.h +++ b/src/USER-INTEL/verlet_lrt_intel.h @@ -41,7 +41,7 @@ class VerletLRTIntel : public Verlet { VerletLRTIntel(class LAMMPS *, int, char **); virtual ~VerletLRTIntel(); virtual void init(); - virtual void setup(int flag = 1); + virtual void setup(int flag); virtual void run(int); protected: From 99d5957a01ceb51fbae8ec6d261c679ab06331f1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Feb 2018 08:42:36 -0500 Subject: [PATCH 58/73] make default argument of virtual function Neighbor::build() explicit --- src/KOKKOS/verlet_kokkos.cpp | 6 +++--- src/MC/fix_atom_swap.cpp | 10 +++++----- src/MC/fix_gcmc.cpp | 2 +- src/REPLICA/verlet_split.cpp | 2 +- src/USER-INTEL/verlet_lrt_intel.cpp | 4 ++-- src/USER-MISC/fix_srp.cpp | 2 +- src/USER-OMP/respa_omp.cpp | 6 +++--- src/USER-UEF/fix_nh_uef.cpp | 4 ++-- src/create_bonds.cpp | 2 +- src/delete_atoms.cpp | 2 +- src/min.cpp | 6 +++--- src/neighbor.h | 2 +- src/respa.cpp | 6 +++--- src/verlet.cpp | 6 +++--- 14 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp index 5fa03a0989..b2b107284e 100644 --- a/src/KOKKOS/verlet_kokkos.cpp +++ b/src/KOKKOS/verlet_kokkos.cpp @@ -119,7 +119,7 @@ void VerletKokkos::setup(int flag) atomKK->modified(Host,ALL_MASK); - neighbor->build(); + neighbor->build(1); neighbor->ncalls = 0; // compute all forces @@ -222,7 +222,7 @@ void VerletKokkos::setup_minimal(int flag) atomKK->modified(Host,ALL_MASK); - neighbor->build(); + neighbor->build(1); neighbor->ncalls = 0; } @@ -378,7 +378,7 @@ void VerletKokkos::run(int n) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); } diff --git a/src/MC/fix_atom_swap.cpp b/src/MC/fix_atom_swap.cpp index 80bebefec0..6500707bf3 100644 --- a/src/MC/fix_atom_swap.cpp +++ b/src/MC/fix_atom_swap.cpp @@ -316,7 +316,7 @@ void FixAtomSwap::pre_exchange() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); energy_stored = energy_full(); @@ -366,7 +366,7 @@ int FixAtomSwap::attempt_semi_grand() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); } else { comm->forward_comm_fix(this); } @@ -408,7 +408,7 @@ int FixAtomSwap::attempt_semi_grand() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); } else { comm->forward_comm_fix(this); } @@ -447,7 +447,7 @@ int FixAtomSwap::attempt_swap() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); } else { comm->forward_comm_fix(this); } @@ -489,7 +489,7 @@ int FixAtomSwap::attempt_swap() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); } else { comm->forward_comm_fix(this); } diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index f6843eb0a3..0230084490 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -2250,7 +2250,7 @@ double FixGCMC::energy_full() comm->borders(); if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); int eflag = 1; int vflag = 0; diff --git a/src/REPLICA/verlet_split.cpp b/src/REPLICA/verlet_split.cpp index 4572170f34..4a30f8c00b 100644 --- a/src/REPLICA/verlet_split.cpp +++ b/src/REPLICA/verlet_split.cpp @@ -344,7 +344,7 @@ void VerletSplit::run(int n) if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); timer->stamp(Timer::COMM); if (n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); } } diff --git a/src/USER-INTEL/verlet_lrt_intel.cpp b/src/USER-INTEL/verlet_lrt_intel.cpp index 9ff5f85176..1b9c305e9c 100644 --- a/src/USER-INTEL/verlet_lrt_intel.cpp +++ b/src/USER-INTEL/verlet_lrt_intel.cpp @@ -142,7 +142,7 @@ void VerletLRTIntel::setup(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); neighbor->ncalls = 0; // compute all forces @@ -276,7 +276,7 @@ void VerletLRTIntel::run(int n) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); } diff --git a/src/USER-MISC/fix_srp.cpp b/src/USER-MISC/fix_srp.cpp index e1e5f579b8..aeaf2f78ba 100644 --- a/src/USER-MISC/fix_srp.cpp +++ b/src/USER-MISC/fix_srp.cpp @@ -304,7 +304,7 @@ void FixSRP::setup_pre_force(int zz) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); neighbor->ncalls = 0; // new atom counts diff --git a/src/USER-OMP/respa_omp.cpp b/src/USER-OMP/respa_omp.cpp index aa4aa65a4f..e721842e48 100644 --- a/src/USER-OMP/respa_omp.cpp +++ b/src/USER-OMP/respa_omp.cpp @@ -107,7 +107,7 @@ void RespaOMP::setup() domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); modify->setup_post_neighbor(); neighbor->ncalls = 0; @@ -200,7 +200,7 @@ void RespaOMP::setup_minimal(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -311,7 +311,7 @@ void RespaOMP::recurse(int ilevel) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); if (modify->n_post_neighbor) { modify->post_neighbor(); diff --git a/src/USER-UEF/fix_nh_uef.cpp b/src/USER-UEF/fix_nh_uef.cpp index dd639c34db..36494b0d49 100644 --- a/src/USER-UEF/fix_nh_uef.cpp +++ b/src/USER-UEF/fix_nh_uef.cpp @@ -734,7 +734,7 @@ void FixNHUef::end_of_step() comm->borders(); domain->lamda2x(atom->nlocal+atom->nghost); timer->stamp(Timer::COMM); - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); } } @@ -754,7 +754,7 @@ void FixNHUef::post_run() comm->borders(); domain->lamda2x(atom->nlocal+atom->nghost); timer->stamp(Timer::COMM); - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); } diff --git a/src/create_bonds.cpp b/src/create_bonds.cpp index 4752002ac9..48f12406b6 100644 --- a/src/create_bonds.cpp +++ b/src/create_bonds.cpp @@ -209,7 +209,7 @@ void CreateBonds::many() comm->exchange(); comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - neighbor->build(); + neighbor->build(1); // build neighbor list this command needs based on earlier request diff --git a/src/delete_atoms.cpp b/src/delete_atoms.cpp index 489c5bf5d5..a5b15f5f52 100644 --- a/src/delete_atoms.cpp +++ b/src/delete_atoms.cpp @@ -311,7 +311,7 @@ void DeleteAtoms::delete_overlap(int narg, char **arg) comm->exchange(); comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - neighbor->build(); + neighbor->build(1); // build neighbor list this command needs based on earlier request diff --git a/src/min.cpp b/src/min.cpp index 653cac71e6..0caa9a9acf 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -245,7 +245,7 @@ void Min::setup(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); modify->setup_post_neighbor(); neighbor->ncalls = 0; @@ -345,7 +345,7 @@ void Min::setup_minimal(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -508,7 +508,7 @@ double Min::energy_force(int resetflag) modify->min_pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); if (modify->n_min_post_neighbor) { modify->min_post_neighbor(); diff --git a/src/neighbor.h b/src/neighbor.h index 9244bc575d..c054cddb2b 100644 --- a/src/neighbor.h +++ b/src/neighbor.h @@ -111,7 +111,7 @@ class Neighbor : protected Pointers { int decide(); // decide whether to build or not virtual int check_distance(); // check max distance moved since last build void setup_bins(); // setup bins based on box and cutoff - virtual void build(int topoflag=1); // build all perpetual neighbor lists + virtual void build(int); // build all perpetual neighbor lists virtual void build_topology(); // pairwise topology neighbor lists void build_one(class NeighList *list, int preflag=0); // create a one-time pairwise neigh list diff --git a/src/respa.cpp b/src/respa.cpp index 23cd941834..18630c06d6 100644 --- a/src/respa.cpp +++ b/src/respa.cpp @@ -441,7 +441,7 @@ void Respa::setup(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); modify->setup_post_neighbor(); neighbor->ncalls = 0; @@ -517,7 +517,7 @@ void Respa::setup_minimal(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -668,7 +668,7 @@ void Respa::recurse(int ilevel) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); if (modify->n_post_neighbor) { modify->post_neighbor(); diff --git a/src/verlet.cpp b/src/verlet.cpp index d74906556b..019f3f2f05 100644 --- a/src/verlet.cpp +++ b/src/verlet.cpp @@ -120,7 +120,7 @@ void Verlet::setup(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); modify->setup_post_neighbor(); neighbor->ncalls = 0; @@ -182,7 +182,7 @@ void Verlet::setup_minimal(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -284,7 +284,7 @@ void Verlet::run(int n) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); if (n_post_neighbor) { modify->post_neighbor(); From bfdf464ee3ed2be28a6faf42f6ead28516e9eb66 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Thu, 22 Feb 2018 08:46:03 -0700 Subject: [PATCH 59/73] patch 22Feb18 --- doc/src/Manual.txt | 4 ++-- src/version.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 72839da8dc..ac6bfee64a 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ LAMMPS Users Manual - + @@ -21,7 +21,7 @@

    LAMMPS Documentation :c,h3 -5 Feb 2018 version :c,h4 +22 Feb 2018 version :c,h4 Version info: :h4 diff --git a/src/version.h b/src/version.h index ad4b632883..8342aa8ef1 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "5 Feb 2018" +#define LAMMPS_VERSION "22 Feb 2018" From 939b1b2d05257ef627d64396878b52cb9a17b160 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 22 Feb 2018 14:27:23 -0700 Subject: [PATCH 60/73] Workaround issue in pair_snap_kokkos_impl --- src/KOKKOS/pair_snap_kokkos_impl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index b2c8bbcd99..6165c3e9f7 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -188,7 +188,7 @@ void PairSNAPKokkos::compute(int eflag_in, int vflag_in) int team_size_max = Kokkos::TeamPolicy::team_size_max(*this); int vector_length = 8; #ifdef KOKKOS_ENABLE_CUDA - int team_size = 20;//max_neighs; + int team_size = 32;//max_neighs; if (team_size*vector_length > team_size_max) team_size = team_size_max/vector_length; #else From 523978b4c7d536cff704e599b51b2a94868f7e9c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Feb 2018 12:04:15 +0100 Subject: [PATCH 61/73] dead code and uninitialized variables detected by clang --- src/USER-MISC/pair_edip_multi.cpp | 2 +- src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/USER-MISC/pair_edip_multi.cpp b/src/USER-MISC/pair_edip_multi.cpp index d52b2e4a47..3345549ae3 100644 --- a/src/USER-MISC/pair_edip_multi.cpp +++ b/src/USER-MISC/pair_edip_multi.cpp @@ -364,7 +364,7 @@ void PairEDIPMulti::edip_fc(double r, Param *param, double &f, double &fdr) double c = param->cutoffC; double alpha = param->alpha; double x; - double v1, v2, v3; + double v1, v2; if(r < c + 1E-6) { diff --git a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp index c6490b0824..60445d2d86 100644 --- a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp @@ -1700,6 +1700,7 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th jnum = numneigh[i]; offseti = offset[itype]; lj1i = lj1[itype]; lj2i = lj2[itype]; lj3i = lj3[itype]; lj4i = lj4[itype]; + fxtmp = fytmp = fztmp = 0.0; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; From 0003bb6766d79e87fb18bb9e7bbf0c7a0c1f7e49 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Feb 2018 14:20:39 +0100 Subject: [PATCH 62/73] merge capture regions, so the library interface code can compiled with exceptions --- src/library.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 0544aa5a4a..f0bd7f7ca6 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -276,13 +276,6 @@ void lammps_commands_string(void *ptr, char *str) { LAMMPS *lmp = (LAMMPS *) ptr; - BEGIN_CAPTURE - { - if (lmp->update->whichflag != 0) - lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); - } - END_CAPTURE - // make copy of str so can strtok() it int n = strlen(str) + 1; @@ -291,6 +284,11 @@ void lammps_commands_string(void *ptr, char *str) BEGIN_CAPTURE { + if (lmp->update->whichflag != 0) { + delete [] copy; + lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); + } + char *ptr = copy; for (int i=0; i < n-1; ++i) { From f3cf407a21511fa902bdc732955ec26b78a6555f Mon Sep 17 00:00:00 2001 From: Giacomo Fiorin Date: Fri, 23 Feb 2018 08:34:53 -0500 Subject: [PATCH 63/73] Collected fixes and updates to Colvars library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit includes several fixes to moving restraints; also added is support for runtime integration of 2D and 3D PMFs from ABF. Mostly changes to existing member functions, with few additions in classes not directly accessible by LAMMPS. Also removed are calls to std::pow(), replaced by a copy of MathSpecial::powint(). Relevant commits in Colvars repository: 7307b5c 2017-12-14 Doc improvements [Giacomo Fiorin] 7f86f37 2017-12-14 Allow K-changing restraints computing accumulated work; fix staged-k TI estimator [Giacomo Fiorin] 7c1c175 2017-12-14 Fix 1D ABF trying to do pABF [Jérôme Hénin] b94aa7e 2017-11-16 Unify PMF output for 1D, 2D and 3D in ABF [Jérôme Hénin] 771a88f 2017-11-15 Poisson integration for all BC in 2d and 3d [Jérôme Hénin] 6af4d60 2017-12-01 Print message when issuing cv delete in VMD [Giacomo Fiorin] 4413972 2017-11-30 Check for homogeneous colvar to set it periodic [Jérôme Hénin] 95fe4b2 2017-11-06 Allow abf_integrate to start in bin with 1 sample [Jérôme Hénin] 06eea27 2017-10-23 Shorten a few constructs by using the power function [Giacomo Fiorin] 3165dfb 2017-10-20 Move includes of colvarproxy.h from headers to files [Giacomo Fiorin] 32a867b 2017-10-20 Add optimized powint function from LAMMPS headers [Giacomo Fiorin] 3ad070a 2017-10-20 Remove some unused includes, isolate calls to std::pow() [Giacomo Fiorin] 0aaf540 2017-10-20 Replace all calls to std::pow() where the exponent is not an integer [Giacomo Fiorin] --- doc/src/PDF/colvars-refman-lammps.pdf | Bin 600504 -> 608198 bytes lib/colvars/colvar.cpp | 2 +- lib/colvars/colvar.h | 16 +- lib/colvars/colvar_UIestimator.h | 4 +- lib/colvars/colvaratoms.cpp | 2 + lib/colvars/colvaratoms.h | 1 + lib/colvars/colvarbias.cpp | 1 + lib/colvars/colvarbias_abf.cpp | 247 +++++-- lib/colvars/colvarbias_abf.h | 60 +- lib/colvars/colvarbias_alb.cpp | 66 +- lib/colvars/colvarbias_histogram.cpp | 14 +- lib/colvars/colvarbias_meta.cpp | 3 +- lib/colvars/colvarbias_restraint.cpp | 189 +++-- lib/colvars/colvarbias_restraint.h | 22 +- lib/colvars/colvarcomp.h | 64 +- lib/colvars/colvarcomp_distances.cpp | 33 +- lib/colvars/colvardeps.cpp | 11 +- lib/colvars/colvardeps.h | 2 + lib/colvars/colvargrid.cpp | 698 +++++++++++++++++- lib/colvars/colvargrid.h | 278 +++++-- lib/colvars/colvarmodule.cpp | 141 +++- lib/colvars/colvarmodule.h | 115 +-- lib/colvars/colvarparse.cpp | 3 +- lib/colvars/colvarproxy.cpp | 162 +++- lib/colvars/colvarproxy.h | 57 +- lib/colvars/colvars_version.h | 2 +- lib/colvars/colvarscript.cpp | 12 +- src/USER-COLVARS/colvarproxy_lammps_version.h | 2 +- 28 files changed, 1776 insertions(+), 431 deletions(-) diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf index daa1393269b953d569aff9846a135480dcdd42c7..2d28758819a9a7a0dac700cd4a8239f51257b8e1 100644 GIT binary patch delta 229816 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≧T>>9guvqm{!CzTW38VV=E;1CMyCP1kHs&36 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
  • =-dtgfMgKc}Q@un43CZS1ti1d)_nrU^8elgILNA54)`hMEtaExcs_s$mPE zbN6uJ%9T;ev~DDSZO$(OZ5Pb^9$>Zt9T&GC8aoz#tBuPuGXEzaXtZ5u`^HFm-?8xR zar#Es6zyC?rP|ptqLQ*CCjKma;cd)guLbvd2#!0nT1oOJ_#xMnA(Sk#96^z>Vl1OpuTDci;cxO`|ATvVTL8J*}>OSf0iV^91} z86PZ<6{1C8+h&4Paf6&vVL!2u{A)2snZPrISkw?|ijXYz;^Qi9D%%gd8^B|*5>OkU z5*U-)22R#MH}!F?pzs@0p9gN%z&`W|t)Q}!IH8$h@1YR}HI}`eH1DyQ(vb~CJLwJY zLIIh<|4i+E*s|A7t($swM{F3!&u;HudEE7boDvLMVh6@mram zM;jUU^@f@~0$wk^?KorvbbQn<1Y=^I1M#SL*}UPfzYQkEzx4W ziBM7a_%!LUwi(F&u8HB#1Yuq*;I}5=48f8$xXC?g+A!lL(03-3#}8>bJ zx%|;Zo8YvcJKK0z6HKQKSt3Y|Mw!|CC>k<{}8Cc{7>`$oBp30 zYTDr*m5aBs0f(WF!$O^30c<^0kulNFupxw)&MG7S2?j9pK)HPzCQcXw`5!HKGIco3 z;`?NU9V!NefKDTkix%*|gYXC%bQ)6_ng6a&jeZfL@>*pl=*p7sWZ#Y)M~mAt!8dAP z5xN2H}S?clQZMLao_Ds?CLZ(32 zo3F{ec(&S)P_KRN`0B5k?S)do_9~hl;4^nzVl=R{#qpv;p!Yg=eDqGN_d35a@IJT{ zz|nMHu)>!*^Z=mg{Q#ZMS=GAHM1SKEZbB)k?FI<-R1pVsr4M&sK z9;grzszpdqoHy__B^0HLDwLj=+=e@BzKK6}D0o2k8A>SUrgPY^Wt7BVDv(4so2vnl>apE(Q z%1MA!Wwfzk7nwVPYuZ#B3|Se|k>x)KhNUS3N(hQ-QKBhFQE1{kAJQh1e?pRC;4gW z;t0M@`lF4Rp$)(oU3MvNz)QvG_99GtZXf^yC=a+@^9$S?m*ZMWM7;rew9tOw28!s0 z%v@p3m>G`}))&r(oIt!@Ww<+{!H8N5B+>~|mIU>e5o(HzWOb5SH?;Fq#`CV?C;{4V z0xSf2l==QHX@uMwixin^DQw|5L(oowxJ5VgpcJ!-B*^m28J0KT`LWy1~XQUi~+AeBC!lH#N~6Nr67@(;PwG z)v8jBf(^hz;NHVN@uk(Uj!WQT7XhBvrKE5*019CR!mE_J+*E{h@f*LKJ z=6?b_UoI@x>;+3BSBw?VS6+iRH|@4d!Khd)QlUf4QkA)o93nE^}}YvA4jZ z=l!&)T{a4?%8#3yon<;TboD*(>$p_9zKg6X^;q_rF;s1@vH8p`omCa!as&3UR`3jd z4D=7$fvSNUUwD+e+v}X1-SyXaMH}c5IsA&?ix4tE>e<Fy&f z#q;YOTh-LkVnv^0caEk`-gUsGk@^%&WmT!I!L}R(53J)X*-v23V=*}M3E_0PMc2bj zu9E>*l}Bpe+Ui)p$tUx`Z1*JtIRpvcx?L5H8obEzDl1l@BZ8aRv2--s#w4yaM>CjA zVntSU$q%Q(Sl^o3?I^4AuafnC2<(uL#yE_kzO@dteYCk4wRhF{`#=e?^*U(C~BN~?$3u> z@5h^$`R#mTnzdVe>$v$aqZ0me2)>i`F_r~$iK|vIxk&%!i0W&FW#z6-&{C*>)g z%`|}H%fGD)S1B9n>kF{lZ0RlifpZnng;TsFqG>@Ld|NuuH*NL-bC+sHnLS^&yc6s| zr~6G2&>8vN&HkZLH8*8@Zhzea!v+TvqG*~+uz7CP%dRnfzPX4DZ zVO`5bjyMxH?sfsme7areUMs%W!mlD@CMD#{gW0(bE(>Bsadv>Y(FNZ1gW{NQh5xNH zSHE)E^?d5;$YFW;h@XoRYB%Gjj1}}Nc#*1}=TlS>li5q@XL?5k2VLfhK<$XQ8HXhK zabgS8fyfrPP`)nn!w_S(Pp`-O$?kiS{hYr;+5sPg1DtwOH)~xj?E>}>s=Ws@YVa+L z-UgI(zB!_QPmciKH{yZ4-2KL47cNNMjq}jw*17rvi~4Y4;tjEK9$(g_nz9+ZsK+H zx()p(18#l5U55HsdKeO({MzYUOJ@@;^)5j-YuGN+H!jZwt1s>wY9O=rDm&r@{h`Y*3j=T_@HSt4t}HHbDz+Fo zm!a}LCIH?Kjo-|Y>B85Yls#H@Jsq{eOUXY%!Y#EjBkd){Fzu{)efji4R)ogq!gtU- zX9+G{y5sMgsQ&vQJGW|Er4Gg7aY7 z@?bzkgK#)G|NqsqaQ~m2dzmfmxxtAtcKwCHuL8}o+J1D*ZEf(jzs$6JZkzlB5}h!t zMy8g~eBk#M2v6gXM4}Uy{zf511$)O8ocU^cs+p{aJ)bc~-JgNq?`7!Uo0-%7HbMnO zfklPHO2sxL9tQ6Rk76YUb`b47S`;EK&HrY3cMh9k2`V}rYjSf2_0xEaNu zHt?(DAV`|RfG`V*MdAq09SZZxix3@Qt8y8SXa2}uy^{?<+h$E=(SWv4McJT7k~|_P zD`IK<#e>OikRqBFl|g9EXh>)<{g@{%H*d}|lLgml0*mf^n=2vA0#oFk)xB>`CKP4( z1qJd$d$YTQ$uxu?*x{P+7*-%;abvhZF-2(T7Irt)h|^KHy?yxj*l*0Z+Chb&!WZ7? z?wJVFgUIa=NY7ZdvYRUNp&}M*Byci_hNl2Yqf+jBYKOJT22Hg{n4)5P;>Tq7eAy(r zwNIIM9Pt_zXOY6H#>u%odW2b{Qjcp+nlhhQ=L-Av9a4S;1lkfKV5d6?i7iD%p=Z^< z?W>sL-?&TUF&^QxI`%(~f6oqhW(@MJVidEFT)!7(+iuJ;41R2qG|zEgV(@Fg7Up$G zWp->gPRl6c%&5odF=kFrX#2D?E{cEo3YL-;Yi5dPd&^5y*CQC5i|6U@JL#AYkuB6^ zN)6UB{S4;@+WiWRGvm}UYZF7FM~K=?=1PzIbBeY7jfGiOz6 zrLZ>uQ;RHz!rVW4^>5kX%IUaE`QZk;7tc2n!grIgO?lL=jmqh$^_fX!cQ8{KH^gMx zE||v;Ipot@2&3rns**%L*|Ay4(r)QKw)No!8}qS*YS<4_tdHeHiD_5#YP?e%Q#Eu^ z(8}mwEUZ()-`XAdz~1s~v*-In1DrYe0vj0s>ulnRD002!Ypo8^6WDdVhVP4DT(I|L z!p53u5c>-a2L)?#y*5;;HKj{7=tZj6Mus>$tz@IAfjHjAYL(JO1UWMg{QEU8@q@+K zN_fnvR7$RxRCo^BsIc|QODJi}-#FYD_awchEA*|K8-a;}yK_Au{CVzQHM{y_S_LoK3UEO9Vh0bURs}$Sd=g{H{G0Goo#>mWia;N&EZfj%JNn;U51?O> zTDL~kwSvp=cv0=h)$sqq)16G0m$mO6vY9R9_ivS`J+50SS4ilh4X1()uq)b#&r+g7 zMo42@(~#>!o00*W?Xu=`ZTF?d-eWQtaysB#@Sxx_4BAbtSGs2qP@M#(78*fR7 z*71ri^3`)D#o5r`e|tHzA9}zwxt@YHh1Q-wN2mBn9Z~(7lPG2ZH=*8(4% z=_A`|h8p$T!-mUdW4qxa3jt|DNp|;#R)RaZJ7gXLf%BJ7P~lR%=csDKpRL4meykFK zm^aP^Xb!b}HwHQ?_%x*-uu0CqoZ=ZX@)ADpIV5^^-t26I{LO)gJu!tGUU>u6zi9FD z%iRaxc9~@H_+aF~OVB$rniay%G_r!QuPM}zwAzQZNQ@>KcFD7UQHbhfR$A@;PSc2% z%LxH2y0fz$^&S^~1qc@U=Mvi?tP>p1RBx)e*S=#xCsuza`v;M(3d%@B|i| zp3T8loV8qK^V+hSUKT!eB`T0N-%;#*7W4v-}umSIi zPfj?#FQyWcqR(YnUh`}Nz2)u~w}4kpM~#$E<)xO|^}>>v!`rmDoa@5(VN1TW=uINO zZK+CsqdX{aPtk4bGe>Jc?xecwbrl@nWCd(|L$*uVSnV@8PiN1$4{VJEggLQID1v*w zQGavB4bLVal$A&i`%POiz-|M-mNWjmvr9wz!2xNd+4sxArfZets)sY{V?YMN8m8;j z{&lj$0g==SrST3C0m^m_16WXs(jMF zz4Ar*=iFb6f2x$ZA31=GUz;T&^@xjc z$^N#H;%5|zG_}1s9X@=!?XnHoTAcOXodw`+A2l&US&~`;tG5l5;;7sKVm>4Rm&hbtx%v>9k%%A(Q=(M z$yzW{N52F5L}QmI@O9Zqu!O^lEqY&P&1XZKX%R5Z;1o5&ehMZnK%ND$*euSPG#8r= zo{rb^j}b7D=TUw*AT&s`nPzAm<16y>Bb)IU$qRFimrqbtn**|O=5B`sPEMCeF_GQR zX4M5sr^618O(R=_$P3Xp$t^f&cox^gtj41fA?%QL(Bfh=iLuNPS`O7lk=md( z-D%&b8zNMuLe$()_xyj6|Da1M8Leg}(_1ivG48S;*aBMQ=zE-4P0q#>Q93woHP{5@ zP}`)gyNo81SOATY+~}MFKQiBtsa#IO(xF`-_YEp_r73qLJXuAkW{F51_gyHsH_n{x z0y4qaluB!2cPv>{JDwG*AFRj=?og&5T4JtO{wc~6%>MiSpI-tY;AOi;&<*}KjiK-u zL3W_|@W8|*s1yeDS_8@8h^3_^dtdSE`IEowz2<{iS63RaR9Lqm;XM+Szj%MrM168( z)1aH`zvWlldpU)<)x1@>URfqI%nh>oc?bNJSNBlklwEJG+9=gu3DjynKkuY9|ChFo z-?7syzx1#{Ue1_oqnSVDAbXUC)n&g^duFl10E`ZpSJzAWXs7F<%EP3|cXVzo>*{EJ zmU+A~r~iH++8b%ye0V&Gy86v1CZrf|g)@Z=!o*Zw_0?6?W%DDa!k%QnhLQ~wUikdZ zN8NtxXO_U>Mk76`7$oL^P6**B!z|Xf{feW9z}8>#=jpV74TpEj?AlPr2)uwGIr!D0 zYrrFVz*|P=TEoAmn)DFMb|ks8vaqtEGrp~P%bn}U--qua?dbhg){tY$=GD%(>#~aD za~100BpI&o`}Lt6<9HV51nBmXTxzXbF-M*m$b3^=S`mv!ndbFVeLT8rrCoV62|;>w zcpj_BLq4wM&G6ReOz7C*Q0mVZ$^0i&1uXr;O=+*_w4ts2rrBS6aU5>WR)4In;;iyf zb|6M{<6b*Q+#huBseIoc;OxDvB7d9n3!v?C-}np9P0C+ieI3iNQ{BThl>OAiy|7~o zkhQNF2>qC)+&7jy2yOE8cmut1@ZTB$p|qdkVCNcjc|yq&N}Z7eB_Lx(EUU451IY1Q zcC1h9Tv~W5ONVT}<+X@=82qs5?|pb`@ALcmA1UY_9^hD<7DQ*#AAO{F?Oh?b1C9X0 z@H9n^#X(820o12RPY+;gNmfUL%UyL!QS?Gj2nR674wG8W_j_xISv`3HS#A7Ee!5&p&{tTEbpDL-T23>?gsf$Ki~Z+tjH zs;^E7^WxVVe2lL4YM;&^1q1#05C6xKbnW>$9>Rf%E7=j3ry%j2Gv@+W!YI z9(2S2C#-o>UjGCA-+(P|&MP4PIrj`oVD31*>pY-c^7LiS?yK=KO`R*F{Dt}3{OkPV zLk5}4M9phjeZG>0K}S+U#nTo)^?`?`Onn~fkHNfu%bp-XPD<#|m1sC-s+-xiWa#XT zFxK${!zzt6*}P^2$n{+s<{JB69W{nBKn*oGfFX zB1|2uq{%f(Oc`r-*Ll+{Tb$S9E2;6GH@-Z39FPv(a~B)DYWLLPxs0bBRseSE|Jx_bRjR#d zl6yXh+`S=ZI&|*pZNAEdP&iZv69zlXcvYUBq4g9e4T8)NuhLMRUyYQ6|E(C`GEli& zT!@EIJ^gF%?bybU{7H;XlnXb%J zYbvHG=nYM{?`MtK51{e)$$=V`la?wCO|UYgl)G7CdTi@hX3n-D59x0NN0Y?A-Q7-- zBXh`-T7Zkc6MF=qgn?I;h`}ngSoOYD$YYtCR;-uB(cvJCvcVQrao^!UjneiOu}NP6 z8!Rb>ko6gkx-Q1i3rO-vV#qW^NcHG|aP@sXR+Kk8$Yck55`d!kbNqLf1g9B>4bLb=6_f!tR(=@cbL?x#XQQ`VH-Frc{iE?a`4cTpo3eB-&jWwVBfmp^Ys3 z2*QqM0%kYv1hrg0bznF<7^o$~YJq4}mLysfI?CW$qiCax=#W*yU@WmLjr`AXpHvC} zTwv02#tXpz1iqCUG6GQ+d7xjls78q8!rbE0%o&Pc!CHi8uxA8oZ0nBxG~W4KG_0VD z*&Hgdry7OCG4j4@5tT3!Oj!jf)f_!WQ#6co8{G-ukm|-;unSi&gX$B0jOh%MyoSXs z)4evFsVkz?gpca>IA`Q6N^A8Z9x<#MzqzJe(63ixbA~-WvK@l~H7nfhxq)PKp%wmy_qg2{# z!s7}gXp2hYHs{h)x^2vyWtpPGU&JzNc0d20%IAN2GwjUV|Cc+F&i4ul3(msMp1wy8 zLknDH>AMzjVuW4a)3-M>86_sXoa!f0ow;?|TV!X>x^2MYno0g3(Tuo!+o^*90|F0z zCe4JqqQi_r37wn@T=TpP&6L?1{fI(e(b1}PUvl{McCKS$yu_DZt1#=JAgE`u16GUP zfm-iyj0KVx%-jmb<)T-NM7ewtc?|+xc=n$&AXN3IXXcMUvFB2m`ib*^6=S3szt9Xe zEywk0=T97N=D-=gfQ)q_C+cF}jj+|+8}A;>?yui(eI2`*JPIdj^ZcA;V>!_wM`DYE z3+c9fHIHkf%vs#3_+1X3!G)i7_VylvY%T-C;JT7sdOz@go(7_n6V46LtoKJi8+QX( zANdAR{jkFAqAbUdQ=ZI|x~{v{D3T<83?}`aU^ovb_sHnJX`Wvu7=OWxwxM=9EW*%x$?}0iD{Chc)Qu5>$XsM$IW@$<9*R`jq~M#AQ>g=V z5WM#kHa~R*Pi#CKTwHg!YR|U?#W#?pK0?g(viBFN_D$!6|9i@PuMh*@?JJiqOAUBm z`u5SR`CAxJ(oPwa1(8>SkjZYJ=GJ=HftG3VtRR3PDB3B=qUFg|A~5v8{#y7aoTi4Y zd@_hZXM}w$iZT}0df^CC)`~C$sh9aK-}F*QQ1u!`HG;5b&~t$IXF=#c(>kESh~N0u zVbGoN#QPLC(VuA)S$Io+M+Sra$k5vXn?*X3dz=R*K8^uTc$v*?P8u)0Lg(nUke0u3 zA&>|AR$ykn0lk&Wy|Bi5{Pdb>5|X`QWAZYotSZM6KPr2s`Lp`LV~X{H$&`7xPSQ5K zjMhOwSO=TgcpRlEc1ncPBLFZsz9sPjm2fPI*aJ68)fCS*Ske%PI3Z7Mmf{#Nmgk$V zUZR}Eq19orN=~IQ?WD^v&Q>vs1{e}k-1Cd9sYtE*TR6mESek!Bt}FAr=sIC;2eJj?l}&-|_3QVIN9O5>{fA#c4I zo2}g&Gp({dflnN)sfjx18-;6NYBxRIax4O&Tou6?R4QZNQ-phMFb6$$Nl^4FRCLJU zW5%&WFRjs{>U}crVF-t~Lx%tX6pUOXFw5^Gv^hP9o~fc`V_E`Y=|?GsdG}ME#cE<| zg&C~sol5FX^Dmsv*%A!u?X8iV9h~X-LNwOt_0; zqu_8bSMp|Ci`K6^6t)+p4)woo>A->*OC?`TE4mj_6v_;tp_q!WV{c}&IhW7XzrXv< zaet>#%~fg+yPmipNhjSnDLuM>b%W5)MU}BL_KVa}Z?djT{u)@iP+o>2(wkW>Dz~Le z(Vmie-;_%0NV}MANA4>kitM~~0OUkVR;_KSDm#iVGlaTCvqZ4_j5EGqGGgK1%jK6? zOIm+VrHmAFBcO-BWYE^yns7u^GCQI4dK228lHRybE94CVhut^S+uZ?g+cP1i-Uz-uvZPEQ!x`5w!R)K0)H{ zY?(~9^CEdWGPa?5UjcMN>B?6kEZ$V<*XL~GzeJw7E>G;9-NX$T2V*v*e}og;jUsoU zB-&hM%5IyqQDfST^(|(aL78r{e zbr#Na;VE!*FizHVVHpV8bo@e46aek9u>o3WxeGR--wDds87${)%gv91HWoKMt9T2yk{Oy=5LI z3vq1d3{t z*w*koujwn!PHA*pK>QFn2B@3T$e~^TZZp2vVtc9Pbzcm=^2ystx39ZA19drt4rjcD zo9_JQfe*E9MKS#TRJk`$BT$Z~F7%;`eYIb>9v11TiCI*69&V53OR=uzWk04%BH4w@ zUdya;x)V%d2h$_hy&?0c?s_=U5y}}Rvm`Kwn2g5$H#m{`myEAdDPTPvLvu2f+{|2y z7admijJHm?Ql+D3z3a_L_Wi`6B1-e{a@>H`c@yb^L)Ji3Xw6gP2i2mfNZYD1%pMa zqqFUj(U_YC2PASoDX?|l--IR7`1e<>>NP%=*#3!fquP>?yJb64x9^(-4{bW=NiFZM z<+opD44!r*F$g**s*JB6zZ7w)rdosFwCR6w5JCL%BZ3%Ycoc{7#(#4fBFu57)C$RD z8XUhQ&rFmvgGn!cqBN9g?WXp=4aLSaR#Ag4yaNGc=OfS8#{fbF<9<-G<1lJvgg0cK z1?S>hg=1Mv9&o`CJf*&=n9u!ZmX}YXpS8c(t|z~F<7NDSiLi!C`he(U>#9_DeyNDy zY|>vAxvDDA>*0Aka6`MNn_N{yZ`;#Ae!jr!r)3;%3*s5*up0b0$Fp$4hHV={vk7L( z95Eup2}|$qN&!5+gBqv?2+kQ1M7l-6g2&UfdlM=mu-St+c$#vJViRF1oqfYN7!vbK zT^SOhQx@Mh@SMS-W`|P?(@&*NCRD|wwX7aedMIq48oOgI#Ah#$=v6>=X<3HhS(v}~ zv##dteO_@a4Ie{>krVW%dET36wR;~zuFH2Maia6g7=Sk_Y(?_-UOxkJ$v3c%Igd|6 z+znV%FQ!xS7ttonO|YxJm?_(FRUz3s+ln715H90(tT@r+v$ameuSbPSwG%;Mn#vB+ z(udHBr%a;)4nt+`7|JL>mpx!Gl=xDRGdL7YZ(YY6Pfdq?*S8nIfd-%Wc83-{Q5f=P z&4T)16+mt>=kKAFw}^E^;Tf|c;}{k1B32x~m{ze0=Gm>n1>2358!r^KHX_o=$=7bx zd+{K6Sv?>3556#h7p5&9qMsH=vGL0#EzY6bA7pDpeQz~gE>dc@G{a&|vDrmUa^51G z-Z#+2QubVJCY?qTLK<;jccPk3vHQA9>r2-O1&(pis-GhMCc>rDqlYPMjGSD)KB!SWWI>dZd97cBG$*r90mk(7|r3I@<@Ts~Uim z0!VuBAjLQ?i8-`)IsOak_Chy#{=U4K(+tiXA`Yqpm=?cH57bpDyHL%Jz1WlfX364= zP7xA&vi#F>7ev2QP9Wox^e>?^ePE}4lde-85bgIK5Oqbv@n>Q!#4YK#K(#~MRZ@4~ zI2$Zvdd7Xbl)2o0$%Y4=Ldt0@~DE zaa3saJBsduhV%Z&ODpJTx&3piwSFi6Cx)ui8alv$IwzqDsl4{bmE)mO>7+^u;q+YA zo5<_hYM{|3x>d7or(+%#=1QrSvF#BHK^b4P#68OW;b;&8r(juOrNyM)bnhrjRlyNV zh@4Fn$F4&ml#%Uh*T(7b+7fQg1Nd|5p_pbiBhS?%D1Vfrd&wTLP9L3eAjC7`RZ1q{PLENROGU9bBX; zIeN}MjKLoI4-N{ubi++kUVx+12)PY1Zp$nqUGa;n=LOL!LbPRgz^lyxR-&;^>F z7`TJ62SI~bLE2VTdt9>Kj_p*S9@W03Zc5#DlKPiJqI^5RCX zp@RU;^vTpNTyjC*)9W(IyNmhPR+d#)8?~SgAimdoHg0Ww^NT+n9!SWf_XS=)PJ8QG zTxy2>IjkfDmUN|+{`~0iNS|uKP?Fg?mDTdFAGvL zU=Z729DJmUkqO=i7A&u;p zlUxQ%T(T~|m$zNDx*&RPhTuKf$FTS@$*6jji6=RyQik$#E1euOmL|2RZh}?&(R%g~ z?&#QV6p8;R|0!-cKsGw&?K`R_MoE#d`;~~%`(olLZ9n-Ez+ws>N9-a9y$IW1cD~RP z1H0*E9XvMY?f{)jG(Bo{c+Tgs>@Ql@a(mMJCI54io*H`?oSz9B*W_(tUBSnmn7~EF zm;n203jCnYBE35x?!Q0hjQD(+S^>a@Ls47dc<{8vdiwo_aY5e-^v(-oWEZEs4$KG%_v=u|l|ZswW_#Ff zbGci(+efOqjG9*Ks_LR2mQ4G<-Z?&WRmnBlO9VnMn+DdwB_>Zh~M5}E5 zS^4VJSkz@KV8Ls6D$uK6#U2q=`Qi0+ndzB5Tp>9=2^g1ApZ$AU%nva8IG(mM*0)}D zu<+ZFy^Y0rmUp{#rT`$fvZhQp!lG(lD~Qv>mOmwODKJa9ZuGw5+RevNS6Gf6jy=>m*Ol_Y zD`xJtSdL#&`0f^zfA5@Fag?OQiWW}~sQ><2h|eYg#Vk>_q(i?56e6~*BDT8FL+a%- zb=S_!1TGle^) z42>c6x*u!uXp@e{T;| z1u|ehB%IK#&Q=U4X`_`r!-0N@!|NPFQ_kNow2J;E)D5B1!LRsXq9qK{Y-g;YYDu@T zL9!b4nep!sDj3II$fw}z#0S;75%$P|Ua^lT=?OU7>^&tPy9vLh;1Z}zR6uYtS?en| zPJQc94D{1FxIuOeud?i~_b6of@A{1b0cadPRr53M4toV^rLrQ!VjKhuy#L@x&gbO|0@T7SwfFN?;PonA z-syzf&U2%+J9qcVvVhn44y>B#^PCL+GP}}d9^+Z9G=|6c-ys-@*2JzWq}T64b<{8^#t91c}5Z9x_PbT@$ zv?<@M4IUicXSMl%y>XVAVsqWvyfw=7~==Y~g6>jC= zd7wb~B+aMNA7T_FrO^$>c33oA%oQj5zu;S1{7;lY4iAckJ%&E+g|5rxoEk-%S~W;> z)UD1_Quqj7)TcWd^o^(&3qF5S7^41;qQWM`Daq-L@ULMGxMVQA3M9l`c!9zy1<+)V z0)sYHEHMTe_kN%nh*n8CUBQFFskXAL$$(BM@Wd@Ob7DQbQwURYVeR8;uNtD_ow&Gh zSh>;p6}(V#o4#SsD?oxClkeY+A`N9NG6Lpwtg6x|hh#VXj#gwU#*i4iY6qiLPOD0j zU!%ieGg03V*yBU7f_K_DtLkr#B&5d| zYi($Ry-cXE6ws8NgX}*PK5VUaf0sJ2=755+cIUIDKIX94S|!mAGpMZ|O(+8hP*WpnjA62W2qGi~8-n6gc@( zf&Wa9d$D1d3NR!?h_(L`?B$B}rTJlUQym3Ad`53nlMU`pG9%5w#s$+^QoLhho#B%~ z^tCo~b|1YZ&o~@B-IAFc%lGV?LVx%mNPp9WnHdHFr2hUp|L!&W6TXQMDc8C z)nJtS&22m9<=w$Y!y%crjl`5QF%$3%X>QR#O}Bqkdx$Zu?ysTosk<2 z5gkxqh~y=&C;wy-Q2#sD4vfGG1i)f~kPH!HSX*(CaBZ^r9aMAr_e<^R#?p*i_NpW^ zL_7th@aI;%$h=>F=JD{#%-2#LzV6;~m&(u~$FZGFC*?$f@ne0X9(^P8j0HJ5)_y@( zROki&uS5;k|L&pv7Y{L>hol3xv~}w?+ED}M>X_%lSAR|)iLV^euGwL2Ky8rt-YMC^ zsij%##!_^4<|Kn3j(LU=$ov<*DV}IW_Gguk3mfY2V-x*yx_^q*BHWPlbJx3Fnj5-~ z&XyGFhAT?lWjLzP+9J@fo;0i0U{Sw2zvy|^zn`8%cG%a@0*JF`O zorC%5?|Y{^2md+@5^Oqpk}Yngl+1R4d2cz0wU>IE7?^dbY!L1m_Vf)FFW4J;i2D$9M;3{=S7H)lf9?v^Q zaReC-U<#8Ji65{G5cMG6ZlWTA3Rp<0=0E5Z=~Rdi!s?1s6q1>}|CTQ5yDB!vQt7bf zmpZb|P5b+oMITsexq%($wg`MUzE2`<-zT)`6#2zNNR4aGI3EE}jzB>3+ZI}=oHp2X z7zw{0b$>)u^rK@Z`8`;LDk2<6R=8uo{vTOSL?Z$iNV{qz8%6e8>-i)&{t12MG!6fa zpLAH^HkIP%a4N7a+&G8+e*%fN@)ra1thO^O4FCRaSOyYNQ&s5@uCgxtT4jQTx){E9 zCB$O`*w;#aRI&hG30;iV#B*wvuM@F&Jv9pie1CoyGWwCah12wNxVKuW{&3W{3g*-v zCzpIRm~;|>>{O*E)xrx~-2e3%<_4X%l^m2T3rRmghU!!KCkasm3j%z^as3~~VF(ek zQ&gZZ_;xf)@IhytM;1(6=dyelQ5#8Mgi3;z&lltZL^?a5JApnLnzQ~c2~K*~;M+;z zioyoTHvGU8p@K*F{e?6DS$$2>^h;dQN$)RZdPWmXgh0CJt#cD1k0f)q_)q;+t|W%E zA?%I{x|q`v^2m@Tuj7Had%b+VVHN7-8u7u#mCJonRmj$RU!H`lT{b5W&z2Lxe-_Gc zVB%O;3uEa-ddYATlG>B8|>w$hbvUv$tvviw%~xBxte?^DdKB+0UOYAX4cq z+d>21QF=@XDd9gABrPNIm|J~ zF1Ry)EFX08W%eLf#C%kR@z1|afY#fV2h-_(HY^lK=z(2!EdD@YNc?qBm$7LF8IBUN zDtSr#K8l^t-_%prbwRGKU7in}nx;Cu#eRpTr{Bt7uqVx&M+D5jD83>x#j|f zIjym^U6~WGYPG${C^<_eR5EC3aRr~kJ3DJAFlL>-EfYSp3IhjAH;DB}%qz0Cf-5&6 zMLAQbRQ~8utR57H=AlN4$B)0~v`u}fPqqt!Z!3IN8N)ILYy8L=wi5WVw%sSj;Rf%%&e$I#A)WzCVFCkbp9Cq?Hf#m^_l#9fCYI)qnr#uLf^%qf z(rS}V19mNxdK!Y19Z~SV-OTe>7W1x*YcdTagb8INq~$D8EA|=-G`8uj!4zzqSRPGV znvR^MMVV79C1Kr8N^aJoOlZd5NLp&28~u; zd7E_ZuGD@UTw(UZM@`7zzNX0xpRRrAaY9&l19zk8BmYykbj2q-FKhhGh!hl!@P{h_T!5a~HDoEx zcju+jYvt!~i(+-d=}UTA=TD$mIu@(mjNuANbFz;mo$SphD}pf3=wJIN?wb`VLg@M} z-uX=uhXJ)W`;h#!_DV{IiRa+lb!Mp@!t(bayZVj_8V3(esz==xQ)IHz%RWZd$c%Zy z@&@U5=Mp6MU=qP%$d!qg!oEQaMY;{ zyfn!u?}kVf1?gN|yCK$J-~GSl*OByENthgoUHMPd_h8C&o)jGg_|SG%tp$a?WO|*$ z1LuPV@Mk>}?{G}w{^)?t9D<;8D|M52Gw-4IO91=E(w7Ir>xVzMvC77VFF*UM*R-`_ zPHN39*j2$5ly@I^ExgzkMYB_mm?lNoqr`U=6Ad}2{;`GUXv+GV1)6*y(Q<7Xh&06I zW+2^j=cm~}Mg1ndYVrBmsD?)?EFKxEv8!^<{OP@$GZ3FeO&_2_HYLRFDk=XIUml13n&V>0cm!0@t*ob`W;s`rh84#F7>nyI#`X!^bP|UnFgQhkKbMP zx_NJn75Up=fXB1ubR^TsaAGzUiw66qC$xW;hV|h`KouEv9n{u>=LI`o>A9b;(PV2y zM#WL0VbA!~d5};B;h(qQv|9~L?>hKWfZ(o^>0QP1zwnhv*`{`F{3^Pi)~w}rH)iIn z{n~TqaeObSy@qWfa0%^zVNorvr~~l}Ig?-ATA8m4P~(HqcZyz~na>Y1SPhcpOzkwV zS<_SDapY@rya#@)vBGYR6R&Y-pFHalOW0m(6TvJ;T8(v=lCtgc%)k8A&TGYef*xm| z-BZvcg3dsJKHIJ>lH#fJ&?Go0xV2pSQJEs{fJ3Pv<0y@~AHgt&&gq6z>`Lz$>>Mh_ zV}{%VT;i)F_m2F>g`@~I4n9}ov?AdokvZ6AA*DwJP!2u}-^{#|lcU7e5%J>>-qJg3 zn{;!y9>os|ZJi{VGAiM@CS49BWmTJ&5~JycJY6pEvo4 zW9ACR7JvU46u)mhiC5Nrh_$lf>a2cd-TD^|T#oMQ*YK#VOolJ0ZhvT&6yjnN6LLGP zQ}xae@L)NQwlPe?qjNt#8N{*m@GA(#=nD~UectpZh94vf^~KnqI@v`P=q&nE{}+&dU8;HY*j?fKSz#!rW4sTwkkS04-ZW7)k{asVded~Nk^koR zUpihS!YAh+)^m_ugJT;n2Vvtf#;VJ|gcQN&ad%mj8#Ff3fcY-J@;7?eJVr>n!p(X7 z_@3NZUuUMh-t~(_Jd`f!$_u2q%1Tnixs-(N4AvU!w(wGxHTch*EQmc;3B#@X@l&D) z7Efd<<@#)M`QV#576J z*}>)Q!KW)tWGuD6uSvTSeo62Rp~%EvE2)5zmLSP4w6MV8o6pHL7GV4Q%SpYZqI__D zU%-xw=BGF0mks6bt~@Q#;732jP-I|MA$2z_KFD%>SU=rWn)YByAI}$Vxhf99@$#hcHAHRv?wcjUX_<2yK*{7G)G#meR zuKJf;o7}yKAuEA=sh31f9<$68fE^6!ZbWf0aMe{9lgod~h|ETEJ`L+GT$BygtDCtH zr#YZsK_1)R-_J>hQ0J~Wlk#>AF@UDUHP1riO#>CyL(m075Zj6%0mH6^{B0Hj-lg!9 z7~y^<-jj>i(aO;AsLoGJ8_W_}RZJ5=6A*X`3UO90I@we+v4fZ({f1acZl;4MNm$Tm+MKAY-o{ZdOfUE6+ zNa|G#I;2}BrnGIwHrcEK$j>K1Tgp!0G+U>D@}KE;#s~)CbReoTo7~Ck3HUtTLjUsW z#{`>9R7K?|tbm@SP;sdIfE_1{hiZy?*j$U)7AELCa~GDBCJ#t;an`{7Em@+ZzfM*ExVx*mtE;-J?p15=b?v~?U?E}Izv9v>3RS(#5i`-|wNA1OICg6i zjGETJW#Xghge;$!IJQBwyK@Hka2P^Uuf&~GZ;%)CV(7_%P<*I_On2BtOxpv1(2me3 zP4PI0nvcGTkcfAlj_(1N3n`_z7Bj_UWxO0p1}7fG_hRha1UYUPV>vq~Sm&BBu&(rf z&`hi))r+o;evR6Gst#pjz4yVD)gqs5n^*<8@5ScVS9%{$20N09?C-EHGm0VQM-Nc> zhJ6ioaO%xq!0EfpX*&kLSDOJH7fX@KIA*qH;2=*5|046xG@Ay@e2xokxDA{wHg+{h z=PPOm&>-PJ)gzUe-5-XV|4JqufWw0x&#>xbvNNv6D;acfwS1wu?gX#!wjVwrn#OzP z81~z`YlO--rp)%?JO4Nln!rUa@_TuQcbE5sMa!?OZ*aIFazw35Q?%|hIh)P^!SION z;`%~z-+u)F4cGz{8(j5&M(k7NzD`4!-_JS3ya0`@xlU4eG8l?Xd%O&zFS4fEmq3~Q z+~5EtB-+PmC`3J|V!k~N{AZ-vNj|XPP!g5g4UepEqNDK88B;aKnN~z?dFIeMBN*yC z%hRXVT1n|i8=8JwDp=fFT`54Dxj}>t4>`R4+4p(d*fKMV z1wq%i)i@|SMz?41iL3sW`vJ{9?Qr30jOyc)k)J!R`1I`Zv!fjSUy-gDrrxM6EQK|V0|Ti01)o~IzFlZCvaRqkQiXh-=tINA|Tktl|` zZy7-Em*#-LBgC<;j&A(svS&Q}0yNp$Y!?{~&u>mbsE>*XFr?{CSl+bjA>?V8$%Haj zu6*{q?Tprx8@eqlz9vF#Qg}+=-$44t1_MIl635G*54#*NNbxh-1?+JcIg`vcI9P#2 zpY5g?`AC>z_g$$+oOAi0eCH(gN0o+6G7SnR^Z|f5_jQQ$&U7DSu3$Tl5d32W#t?|h zN|REyPhuz}NT32OjCD-~lSrFLspiz%7T@iLuwdWUEJGV_30}t1& zUMK?&sB4K&1ZeH8-TVz@S|z5sg|0Sy;{@g7{mAum`IX^}Xb(1)PRcV`LUy>j_dJmb zS2O^NpP9~}9mFY1LziRV_2MpqNi3$8gA>UGt`Q{yA=gLLhWJ!bOzO+3j*WPaT&F4{ z55!xY*e}#~I@7+eTYC&(+_#53D498YQM>pUPCFI04a9m_5oH@kXsLnIiFmYwybg3a zbxeaybnd&Rr6YG$BoDjv;)ZBbLbD`T6*2%~CJD4IdUPu1;Z&(ZIXlylv<*gCLm{uG+U3+%&dJ%K<^#0f_bs_a^Jo9 z#HSFZ`L%Pe%@T>Oed@EPqTiG?#}B_+?OesfiXXu9+Zv`!UU0|89a}-Nq zd~8R1;UR;K(?4`Swuk=m&9`TUYWixcgG=5y>pFZ01Na>>>&ke3>teWk6g$qSZNAyP zmta%L9CskIrshFYV`FBG&K&PsF3L=i3S7^fRO2*%5uHUrbvAKTxd?eyE+z_{*rRk< zdvF6LWqp8~GTw|VN+wwb|7|Nj5SORHdjGGo{V!qrF9Y`mjtauWmd4l$N(~s&l!^P7 zOYgp^nNCS#tEzhxYN&V@7W z-Cgi$^KeZk+o@KDd(5VgSd6Cg;&jH|=(J!YpO4hW}s&A8FRVXqZG$UEFN!nS^Sh`+JsbtgO z{nsvL-6#6qJ`wj(F={PgW~o8YQO}S?Ojyw@wET>)bJXg)woIt5TkN?)T40g&lI#>8 z6ZXCO36(n9My{*U9}WDkMPpkAe*dUNKGH6{G1CMv%s|9%?AptQPw2iTAw#@}SrfrhSSgE@kq3qG=83#E*AunX0-b$rUkW)k#V&}x}Pp8OC?nMXj+!qXF zYRX9Yp`M`N|GjGucS9AyF`r?qu^1MZ9m7yAnIs_5){L986YE29!51Yj4+e4%Mnzm>ru-7z*-Ru$-<8{SCx< z3Dkidk>bSE=nKaMNGtloonM3Z{>Ze>zq+~XTuEr)k%KKG>yhEXgYuNVu5u;{MMlMJ z1gcdwl|bN5Dgo%FxiBEgBRr9yN-*doTC;l(v(nLq!%OxjtQKi?G@#p}f5ns_rbe3Q zl`>@th%ifVI;#8aW09tRtcz2AwcsNKf|Hhp{_dn zpxJVnjTi|laY@F$S#lcL2sfnFefBEjI?B&x>SXz$I|EWx`YA3=EW|g49-Rag$dPVi^*k&W!ta|+Yrd@Fj-7CKd|?g zSInS5Wv5ny%f&itrY7$l!#NW)@t@%ylqH25O!d%gH*71-+Vxf&x$x~k%>qM)%BRDe zaD~?VeE@>y1o%2}g=jCR(bHOMDCBJ-AjGooAZH()JdJW{yE;%;vqH9rEVu4~aU<>b zPx6>8{>X-nvi2KBgy6{Ot^GbuzXlT5p+)b_aHpckPXfJoX&4<-n76rshTHA*$T$Dg zl@e?qr>@5K&Yy&#NV(f;ypm5Ma)i}1<`MH|(E}I-hHOB9mQ+ex&x_B!igwpW7F9&Y zquo!4iXXb46@7lY3o?px_MfWa(-X4i^xz1Gl1~t9nhus@$#+kN)Sme^;XnIM8j?ay zl*D%AX-<3mg@!}}>Re_7t_~YPG6nuUt-C@>w)6+4VaUH#*-7>E&EJ3781DKMN+_`; zTmbM?e#r!LP=v9vHzGM2K?PkANR?c

    xJzJG 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 z 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

    r1ayM~M)~~5!9Kb;J zLC^5+(3dov+E-TON8x^?s%=v{$g7dgRED%_q`mZB~~-Z@uvAQ^t5w{0h_u(ust{QKQ2nk20K4+*AT`3 z5j)Dk$dSVQ2965K!pQWW9WW|@rgXv~2XgmJO)0KwU*dA|;R+Ji9LogCg#W1@Lh^`{ z!bUkYIQ_;e6Yo?Fg)$YtVh_Y~EroP)rA!fX&!^J&@pVkg-t}e|tlNoh?Z*~?mw&tK z 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 r`X5AOIrV#~ob+*3Q`vu>=c}c{3 zln>OGt@wYcMIA=s-Kz@_kEi|{sW$X{j4!WL#-ew0SYD)}^^#aTQu~215u{n)x$QIB zx2A2=sb&diqtH$pso89oE?(=H%i-evHNAembpHx0EFbJ7Caym=RduXkj@K~ga#{z! zo2K?lgPiUcW#6L_Udc>ErYLvRKWay&L8H3fPxF7%y&(gI$4?WAjqeG&^}M}4Ft7-r zrutCAtR9aJ@Pb52g`W={4Nz@|TAgOm?XKy3|Dou29gTH2fqmt$>AI<#Bd|D1? z=6Zkku(I(ZP_^A}|BMLQIuQQkfikFGfOtAGgTRwLasZV)PiA}k^{|0sd)b;#M^l%J zJLN*eX_AGBAl9La$$Vc73(`((WoCOSn>{Ih>-W|5upS+Y$T={csfE8J2jK27;rF(+ zeQ#=NAgC>3ri^o$1}Sk}So58M_1gZ-{&at=0QOlBK=Ws`l-~vOLVfSGIm=_2&(Q6I z5YjWxCsrC~Y6S9Qe>nC_!iy|s!wJV;_;``w#O!MX)g^x58bv;8=K`b2rrS%IMl-aT zFjOLDd_66!mErUov(jN z`S`6eeX+TNW3Xian@oeT=?Mt0EyA||J=`|!A^>P`+38o}F0g%F(=W*-l3)tZhI=3IKmZ(-Mky)GqvQId$dOwZ0TAI&Sf1x2C<+8r4rr z0e;7zgTyg|6LGv+vtShAmYRC+A^{npe%aQ!8)%`8IAS6KDpu|zHvCu>ZnE-mfs8h0 zZ~DNa*!ISADd=a^NNBuy?iY43BoGv($jIq?U~+5w-Gs-+hRs9lwRABvJtTh>`*~E0 z$?a$bBlScr#`y0F{7J^aXM^|CJQ;3KPlnO@JkGTiE_XQ%3g$49P23f*9n+89qI`e| zgLuD~erA6s0ccA-ba8G>aGfERTabXuJWkTVEbLhLlTMHIM?h-xxnE4HR2oY? zL>Y5dyT5iwnDF+xU31)Th(2}`-7SkfH38!HrtIw)!-ku8p`#sj0fK)7l=SAAp__f^RGxB@dU59u@37GBi1X z>x&oH7oRS;FH#7lVkLj`l?2H_|5jyn@%|%QZQvtBUyzSvt6Mj;T1l^d`_(TOfA=-I z>6&orDHo0x6W+CLEkq4*|G7UO^SY>h=~Q_RY4p>JWn;l(8DewDTgB55_AI(Grk+|} zTR;nsa1LE3XoF>n2g2rHt$%sgT<0JJ76`$@?-7eEr~6Y}P%M8IV{m&OjDBiDVCQgk zNEkxa0i>^2uz9HldO}V#MY09C1mq`L^DpC-Or=ZY{w(3jq3P^>w`W0KY~Gmme_r^m z&FxQcQFE1exC;K**a_4xNzTMh9I)(Zu@lTV8$02c^r^8^&O@}5s4;d*WQd&-NhXX$ zeXQ0lRstFW2{(U?(tIR+?t^5=^MG{qRUb4#YLUvtpy?96QjM!MSc$>{Uq_v8c_dtI zl*kh>p?NO(!=ePVuET^qS*XEEF19OEV3}om+*A7`Hgf#8VL|Jc4jV>#`OsyW045}7 zwCa8ZRZP+^Ffd5FQa&q{x+fF{B7&uL9nlU~S*SQe$54Mb1bTS40NVNqoxQ1Dlv@^c z?-E~pEb#dx#GbC~#PrCpv!IcokPhvGX(6nvin_$t3&B-z2kr8(|UFs@Koot$_27pm@

    ShqghqJ4L{gv-UoAc6*7A zz7(o|m5$%kB|}ea6NGfN%{&S~WH*i@!D7E0 zW9WZa^3V;{QsbkRZTW91Z}UK?0x#K9Q9C4J$mc%PX1*{4U&C`aJADr4 z1OMTF9ROgooE1n=4`IyAK?%mmLuHsvdk>|i|8@X5|9=6<3>$XsRUp2eSU#|WM_3>Q2zuHK=iGa0V?bYQbNaT9k)^&R+qxCKQh^}DW9*3%J zdj5XM@3{Bc{BY{k_Ea0mroOXkI_}Dk$GR%=nTBDX5BzP{at~CAXnohx5~zQ$lPU7L zIMw=RGk?IAKji%S(+{tVhC5m#ElR*jVaAI(s39-!n*2}|{c{o+?Y$ByL^Cgem9^-5 zDWio1>=mqp@Uke9WUtJVNq{d}8Y-1BYC1P+AiY>bR%-9Ed*p@TDDfld(YrG=CCHBfV&wL46#an?Hj2A0eC$)A#S2 z)2ZKxYxNQT^S7c<$05J2%{p%`1$?zWss6dkI#~b%+VT3Ko1Aw!63Z>t@ltK`Q$3sw z;~XWCUg(dTiLDQui}%tnn6KTXN(wK9FHNdKp1@!D(dEqtZZ)UFwd&l9!6}c!^VRf4 zSAXe)=UhS@dRdm)aj)2G;>es;YRBtd4W?HgC~7q9aA@fRN>ao4@0rJ;$9kNHQx?VR zxBE)(BmSxeBVi<)cHj?rd4oQ&Hd{^uwEApr%#;_)1b9FwOxB0CGpzwX@AHOV+Qxog z&J8`|X~0_yw8A>fPrO<*dR{HHs)NCiXMa|vGJ0~0cjg__)f&sHAK-qcs^9Yml^1&# z%1jdp;B?!rJ#dRr42>48j%)%mhMB+qeme?uMua9qPc{R8%<)HKG&H7nX$JkL86E2i zWHb%RJFS1F;rz@jnR>3PydTG%tthe!D(X|IN{c!cnbbqT)Siap$(+3RzAx=zr++#0 z&$!*6ioJOkL@jy9_x(t8QtKlhIsw~y#Juo z@w=+7dl&S^(u*cE`84Ri?W(~TNV}A=a#@iV-c;o&uelGW&9t;n&i4R&Zgm)gyJA9; z0q3&EV}jJ6o%~l~f>r+|LE*Y>YkviJ_*0@n@NiUUw_E2JMrwXuK8e-vrFe`HZ}+Nk z4IlWPFQk2ljl&!59Rnop;W&m8M=4kGt45u5q|&We8w0 zL2yZmL+zdYG=^^U`K8omj@HV~sVfaq4+<(x#$?LnJ zDj=Q46vYmhSST_~tZjCERVx0%deDs4J2E7oCJ~8=lq7J-Kae|sdag|m#WZ??LHCt* zPWoFf0KEtw$|%%Pi~2Ng{g@Z#$NAi%_3QiuJ$ci+f(C_O$F=~f;>23KQ`c4Vpch00 zed7*dc`<_4)ny7eHeSGFJb#vJUZ^_q+tB632X5-nKwZ2!5}Vo&ZFlGVihV9i-d4%G z|ICTnVdjY}v=h4}wA0vm)#bmcLaTQ<8>~aQjs+{W+9nJFFFdEL$4+fkNBD7$^^DqI zfb@?{cZsbs_2dMDpN0B4Kk9b3YY==0T$tBLU8CuocxC5KO=zhAo@ujJSaVKM0v59 zmoo|o8GA_@JhJcSYmS0(&BP+jjEH?t1L=lMk-@(roW?X=ns=6TW#>uPWE19pd2QyMN3zBD)H6w(E9ZX+oIz>q4hMXi%Mnp0>_HZOsSqoQgH3e{Y0`>R?*E>MGT9TLaBpjHk%k zBvK!~5G^3%A+7@RC&_3Fq*g<9tkoN(OFd54$^0d<-}6MUAAiR=ef%(J;ymEllIBX#EG1(_FT|8q|0Qi8Y?g-@SL$J_e-%TF)t+fOR{tW!Z{2S2sd4bYo0xeOz7 zK+t(@I&eTrZrK$6w^LPoAQD8KH&u_!s`}lal8mG$Q@L~qeK16(i>Q?;S<)*V9C~W< zs~gOOsA-tcMt}NJlUVA*A#meujMzOLoJQRe)p*sZ-%hG2oV+N_ykKGxWvk4TbiqZB z)goWlw3psA5<5oD!1vQ}(~YaXQ6S^p@aXtLlDkA_4n+ZUVo;k1oFof?9mM^D&=#yi zQ?C9l?+$H4yja)7s5Fg{yS!?K{>imzGBuS%tSaiD5P!sF>NKP1wQo!Qz*TB=UYlRp zIjBeTdGx3T99&mz&`FN-A(+KZM3QpR9_GV+&?7 zR8-)g*ZKVEy+3tZ&E^V4`C6FB_4f^bVqSqpK`d6MT?2P;d21%|0?y65&~wM3El;&B zkRbuwkG{B=kP$W6^8Jeh?582`MbUP=-)EH>N`E(X(@YPf*3^DWMgG-Pb27OII3krE zg)CkN|iuE^606?q8dzfy!*vpmG}l*dLc;Tt(H8jESl7-pD+Gp z?ti_OB|W1mMk*{49#OiC7Lyo2CN+5TfrXNADI}3piU_k$>~f`aSq*8R3|AXi*p~~_ zEz>WgeN)WGw)$>e*%TB%j#foZmiQ(F2MIA^FNSHflz-o-fe5irPqHeghzP`)S+nKU z6p|d|xeL4Aj+39JmSBNM?W7lor5%=r#edv_Fjyfvh%^{28#vYqi^_}?#*tWV=hDw8 zqwF&UwuA;-D#7bdT%o5= z6BbbawZ4C(e#T?Eyli&0Q9VZrde;~Xk)k~uG}`i|r@oI!xU{9}QWJwD1+mwqet({$ z5iw9VX#7p&1A&5XK&T*)*QQQjZwQCGBY0U|n;YQvK#5;zcrnnNXt~8HTg5lEho)^d zbZ=1RU3nj)&aWiR4D9lVVz>I*Vc^_B#EAZ9<$x=`a?*d%-3!0u*BnoEP~a|e+tBmd zV1EON?_eBcFTJj)QD3c^9VMF7?tigz<$?tn;j~QUr^h`!I6tCiCp})xq_ja6a~va$ z3j`vJI9&!ihd@d)2XkAHjMjIz)I^|h7Hbv-pxde(oaHA;>y-0!iK?$k8_i%$w_9=J z&FhQRJM3(>4n47~shI%5#}7CYBxjWp8v^rLE;@Ichds+Uqs|{UB~sR=hkuN{{urqi zzjBRX_S>nc^eHPJ^iFrICI1MhNQkG69bXn~aRSLad#1E{ZL}0w^^ZCKT zBB`#DB9)1wcwrF=yAk41#((8hPYAvu%j^>0BP(+#-1uIM7HC8oMvDrqh-PBQJ;iwR zzj1g??1^k-Xu=hM5qJ>*;lxoa{wTA_9;GCei~qpi5zS{(k8vRR_M zFkMK&jQ;`Mr=J;@k^KY{moWJS6azCeFqh#Y2q~9v`2_@j+%^)v`&aa_2biHHQcq*C zK%NUPkYJI_?jDjoXe4%z)@rG(hwb*S-+GXg*u!xW2LW=}lO(c8Ruzj?UlsN8{)d0W zyW{jC+8uY%?r-k-<^7A7-=^6vjzk%i@$UYxD+*DnY?nu+h!SXNc0cW3A8zhstoB2% z@0#|c`>7p&`l`c5xgSREd>l^0QTKXSCT=(_-P{8GO}zJpsQsv?d92!gHk8$gKjT&nG`EP;7T$7S2hkD=LBWJ&6(=cyme5}iKG{8pJ~OB(|( zjXqSci~RAf>J~F(IE3Vk6D1;<+l6AmTcKbt5_z>3U)$f^7gnhZB3u@pjx&@>>P${f)#q?uA= z$`U+uL;VKqJBhRX`^UC^WLZv?5vm^gxq>s(_Wb>Glt%WwYMOS2gT!C+V4h$sq-hDF z$Az!xX@)~ojg8s3GYt<&nn$2Dw|Di>y{pE5DI|+3U=3*rfxGzXP#uP@8*XF@#@HXZ z>CH_X?KK+m7+N$(<+K-Ib9@@)CrQB8@XMyOgO%#$3muOjF57+Hu3yAEJT2pK$1gwFbvN2VOHa28U$f~kAQRXSN8Xy%CS8kv zXV%;OL=?HNBW^^4cxbE1X_vhuy;R+0YR%yVm+?3>6YY?%>Ntr+9LwLMYhxfmb;G%m zk^JM-y)n*bHJ;GxpGV_)B9h2jcltRRAC~#N%-{5SJYIroFJck>fkwVv|C6fE&_Tq1 z8r4e$Za({6js<{2t-l(2^rdqs1QZZ|;bKSr_zVbGJ;0B3)#=8%OPHKrYrBLKeSwX0 zyGBnySbzwMJ!}H&^{nd_x7g12a0$7085bf|&OC75pm&$~R&cA%Yk3nuMyoqB6v>w2 zP9<#VUN8b3&icdrD#T%u3zcTi#BG0WL+S&Hy4L5pdgzQU-(j3V#1i&Vr4reHdRorI z1P26T);kPR?&#F*2{3Dj1vB1b;cE{q+4Y0M<`Ue2T9Hx|T*OdaEi%<(OJO`HSeA*r zaC>wANFXZ89JHp-9H0}mPR0=N-54Ui*1oNmKHLHK?!5b(peGV4-<%zulkfp9jav)& z#=t&kI1jV#=N7XABt*N{Z$IIGERaabD{n!zDgajH<^KMrfCIy`LFTcH79S~qYPqq= z)CLnsO(tNVCU}B*M`1DrctJ)njq$S{=vY%2OjVTJ(>a9>a!BxO*qqvi&Lwt$>5nkJ zqcw5@vDnVI30|hR3+FcQPN#kC%-3UH2hR=&v;nHyEFkkwjv)->MLF1ieT8UL<{5=p z0Z1U?ybMAd?4dKj?aUU^}~x-KS1Z6VqeBz}=60p;5ysL%4l9k&RR{+Gm#Rr}m=; zL(1R~e~Xio0Rv@AXQI}Bz`QCYW+gL4CG4yC;f@nbV~-Q9Vf{LO@yf|Qj`;fx40?GQ zIx|ykXHE75^r3BL&>RwDqbKA`CVNcpR8+$A*lB)!-_DPwF_SQ$gaSDi~s7~39y`t0<^H<=d;_z-vL{O>7SEPJTrUk*uZUudRFh*J0u6-EW<%ErD!-=Vi z03mS=&)H7nHu%;R6g`*@$2WJ!_e0>YqyS+GI#SBmaTJmQ^36i+HdGjM%gDr0;FiQ8 zH3L^zUPbT(Xv_)RFQ*48tg;wAdaXmE2TW<#NE z1Vw^Uh?Qi2yT6lQ2=@)cl4P^j{7GO#Q3%0Li`Sp5)E=(bsD}~u;XL#W#@bJYRRj^p zQgEkEI&=2zxoXKoExD^!)voVH*Y?E6>A7EsfMf;0+e%vHn*_DS;rSmYb zLc(j!V91@GnJ*F(8VQQ}OtX%F#w3)`z`&`V2O}bXKb>@&?u~>L3hZppi;6k7jFYXX zZzCh)+xXUm-x9KBbyco>E0IiP`?u;jT`0(8^YTg;S+NKB+>DD+N0zfX@Hun;s*a5E zA8H%sYPPT*nqdw^>Chq=dc8h)^qyU0n9EGuan@ryG;IxzU7ICHq0lv50Aa#L>B$Pt z0(f$NyOMj|4U@J$56t;!JSi4?y-*j76lU180vJd@M(a%9KWbBr0n@FQu9{t0#ZBvn zBbSiyV59s-`;eGw4w z6$W&We}N|gyq2UaxhzhN{Fp8iByqDo5iB%+DG9XO!We0QR$bGHk?etZ^Wb%qnj--8 z1S+ljfW%5f#g$(idIY;k#u-GC?oY#LS~m9{@U@i>>8P-uU^ZiNol#Tr08PhnSk9A~ z_Q2%6$4tu{00vV`!^tdISCb|YGJxvCN8NjKWPZLylU8Pq2OV;d-c4O5_YasFE_Bj= z$e3C(#nSWG&_lNz*xnC@mT#fZS#@Rua6k{}1hScuH#0*VaBA1tc?c$I+{Ddw#vf2+VB74j_gkMH-( z369-4sL;F=@%op`L}WDo!^K;-!pm7cvcpi`waD7nFA`voO9l>PS(1r&JOp>uJ zeD*{CQIDq0S;?(;caW@64BmN0h55=xH8M>_3I6B05_%#rBgKk|Bm$lq@+i%%6Nz!l zzhiaPG#fblL<^w#bp1uUaqEv2q*DwjpwD*zu!9CXn0WyZI8rkn zN8E*A2Tx!keE|(Jsun)~X$TDrKu_afRJxPCkXE;Mi z)Y0ZNNKv$X67S^PzPael{-+=1=G?ssH|I^b`P2CQ!~WHqhd9~DP~>4QH~Z5j&xK0$ zCJl2DMlf>R{59x`tqOx*w=xdQal2Dl6jXmTes$1a3=OoV>x;Ih&WA8mSF`infQrX?zM@csKawNX$o)kS-#`nG64({Oh$N@hcIqA!0w zd#hqt*}cX$ZFVw?g-#SSw1}geUQ;2%@+7D_{H8%SoNyQNudK{g26aypeM1X}&QPPj zxIN9iubP@hi~2|nQx^v(0iU}v*CI)@<3}^}z}fH0a<~oGqBqB%oA%=x7o|)^nr3bv z-1Met*Dlaf$S_)*f4^TVb9`vp(yV_SzSEHcuEaifo+_XcDT~9v6y=3lmc{TT)q}>2 z*E9foBGgwU)?qR|}+s~%|VYq?D z+&d;J^Grzz4J}@OS)&`2HyVur&N`UZC$h7L+a~DfIA+?aKCj&=RU$&I+>w73uZcWn zE2Tx2WInUsHFa-3^>5ci8l^(Vqe)(h_SV!@xq3D)^^OMZGWXspq$L1E5(dR}Fx}fV zrl5k3Y`ZsI)mJE95~P!GZ?Jnd?dmJ&2>Xbb&UtUTvaPJCtX`T#LQS~zh*}rvpaV8v z%?_aLY-r>|7>6aWs;Y-(=%9ZmX&m67?hr-_yaJ3KM&saU(3ES_@uCZ#Qae#Y+lo43 zu)#Z7@Od&G2MP-o$x}^c$SxbQqQe)K$ zHk_<+(i)(kFY2DjgAup~MDSz<*B-mY6=Z%WQ0jMgQ&vd11yUG5OJ0A)iZ~V71omW8 z@A!o)QcAT*lL=c^@n;tS0>L7mPxfSsKkt~hRgeooada|s7CO+eV+v>7|G-_X~n^qn&w&rGjl{8N!4`ZOfs333`p+IPZ))h`obaC!msuyE?Tyg zk0>;-KkA`WJ~>F-X_$X{WP}C$@2gSO5n!LIw1wS@0jV>6w}9e$1;VUek5EQT&pjoG zav?`ty_*r{3Viw5K7UPEQ7FPRpJe3&yw1VzXX;xZo_v?Djvm@(iHN3`zl`udw^eVJ z-fL)EQ?qm?6~HCUVkrpZZ>H=U8+WiQMT@y^DJA0$9vF>2lN)EEJDaJ~05b6iFgp))mllWz)0K z$0vAT*)NRr$L}9FUTd4%OOfijMNeU@{T8#Z&pOl@sFr`lwH)dFH%GW%N)3Fp(UHib z7hy13!eHtmB4`xTH8fyj4ZP4gN$X7J>p9@D3V{82l!NP<#rhei$!CK1(AgqN_yVBD zLdGxPDX;lIg46gvfTj~FZS-g_ucc`8AQJ zhn{$ii|&7IB!_0b4%rFlg;ZaU*wV%?i#rjqtpZ1ok4u^ROk@~WQSNe$d|_E2!I@>j zG{e+<$ANOIs;yXhK-?RHwx`f+UU)?Tde&&!@MbJJfo*b-o4NfIV%_TO62p zi@mB_qo=CN>u|&!GS4i^n>v9FD~EdBG%&{0kXlX^A20(K9S`-#&PJ(R z>BLcfyfr}Bd8}GcO>3Xf8#{ zL*;-6bYUtYp#YS^5b$JX?0BMQ>|osXLBs7p#05d5 zmK`5YpQbjuV|6oi2MP_Aw4#m36XJ&iUo-N9dNc6BKKUW#{+ZY!55&SJU!sj81N zAEnvbJwMl0tFYm`0l7ytZJUnp%Gco*Fs} zCpgmd7hYwvQyDNakpWZ4;EH(k1i=0=IKdfUe&>$wpNzW;%Xp?7yxR7PaAq7t>q-vp$EHkdk;LyE(4p4-p`8GX(nd5?4m!Oo(#l8VgF@iE#$XN+8xiO6;8Zy5h_+BAQ_sTvBlcgX<< zXcGq5;C?h>Kh*b93&Ku5hl?qBMR z)_D3?xTv-i$7AJ`eC4;{sd4c$Q2N$qtjqxUrAT!AjlTvFtyljIX5csTf4yX~{%_Ep z{uMt5L8)ecTYjS|tRpUwWVy%O|I#W(-PF69a-}Wm^h>`9XYvhG`x6{vi7exsA`ZPp zf84+NC#SN>v6qqk1QVAC#{~_S4etX712Zr)moc~lDSy=(%Z}qV@;+bTqZ?^6q}~d! zhdgG2Ss+1>XWDi*7X^`<|6`0)p| zdz@a#-Q!N~zID&99$tL@Dou7uic*$p_i);krHJx)m&;Pf1ZJAuPy285sk(LZ-62Zl z{HMq)BPFnCh{;&h5}!yxDqD zmIjXer8lKlF!x>v6b;*Rt48dYK}E3 zFVTJ;XcG2qM;=z=ohtT^dZzc^?xNJld=kiMP6B`rmib6B*$z34+llr7+UB;u4L3qi z>|a)fT>vrCAgHdIK!AZ$jk83+&x#+&1Jb^~UEa+4I)#qwU{`qjfA`JZL6s7=gk^>h zxqpASE98FQ`Ra1*G>wnLe5R4^n~6qvfcP}5n!#B06CA;%Ld8Kr$Y}XGwU=9GzVQ2b zxOEMqXPEKE9|22{^IU)N0I9KCk=-Zm!)>a9xm+FZIRW}VZI$E^O z$`BiW)c?A*U3(m>nW26{qQN7|o!X7)7IE<7w=aNJRq!|RmN4^+@Mly3+$ADO3V%Mr zC`vsDI!h(WG>wdVHQv=b%U39fuYC!6Dy5C+| zd|B7}I#>kFk1A(AZTtQc?tuhDHuj+BvcalVp`lYgn~FqAQZ$YsDF^!UyR&Q z{N^A4>(JfEkK;5sh{URPx~O*Isdh@?4`!RTp26T7nms-(>jNT%s3h`$iN5^(I`ld$ zRwXlVozAeY)mU9LWDCT8T;@WlO~!-Xe$q&`EI|AnNtwJfM8<6Y6_P1SP>Yk1J!D|0 z7|JS!T(S>YtW2FlU?#w}gk#&bZQC{{wr&1#GO=yj$;7tJiEUeN-o0<}cD?RRSD#Z= zA9gtBAQuoF0|1GlY!XPg#i#JkvTz)j?tHjcdR45ELcb@N6N!AIU@rV2xEK@U?EH=t zg>r_H_+fh(q)H9T`sRtCBP|D4#TuggDO;Mp29<<$0UPz zzCn)pVfb&{aW?dJ5pl!pC?W^?5PBQ@jNVfOHYyExPa)Iodh>2`07%P8OENjD#1!0o zwdiG))FI6mlpU40Mrtkxlh#>=5slh8os1@Xt{l^|uy+C-bmDS#+b#H*HF#ns8&;H) zz2k^z5y0vnNdpVd3#2(VFnXq6j$gO-PljNV$H@A2N&bkV;jq=xr+N{L5yR}7o_nk$ zhrH-kqe+mugU*x}y|bz4J0F+4gd|d$dEop%lQK9~m-ibee6)Pu!ydc9Lw7-=O&RR* zb~#F&QZWY1TAM5xuF%eT&q`O+pl(vVAsB~AHK5u~ju@O(T`>zN6p7X%jJ4KVJ{wss zfK^crJnV1674lIt^mzN7FBnvr7-;2Te!eF?)S;|*FC3}p?wy8-CDptATVuEBE+ITT-gp5=bPhxt7D!KE{U!Lh#YZs|RR#VSfU*Ou-QzF<* zM8_d^Z}GY_$p!vvT_Jp&$7~r9T{=CAkaD1DP$Exu zkz9mEFBnbvc=@rv4|zi4rj=&JhWWoE^#Nr%QR};?qJhw^kNxfPY>-sI2D5MjZX^SE z8S?Rh$7adXRAc*-F+SX?pDR&?v7ReqfY@hU;`=EFn!_jz83R~g$C6M~;rQ?%MM?d} zQ<3XOJOLZk0wV_PVC>l;ZdzG}aTQiuKej6pvUapaV^c=%NP z<}my(rXje*p}G5MGqa=5GTWqtpF9k+*3ZVLPW+9;?Mh5j zr{(ILT6H=z@N~BmhqiIND@wzK_YTOs7m26-ZE2TdllnXi?1S9s%Xyn=LMc z-HCRz%2Kn$!yY7810;IRO7WH`!C6(mP%<~O7bTjAA)|N0%%~GZzV1jrNs@)rNc5sl zHUG#nOz0-cM}a&Z0&O=c5m>~}_;{kVO`tFBh;#yv?xHQqGahP6zVmL)-$F{4->Lf&TdiKYfYTF!^Pbty<9i(=&Rj1)q%A9<&Q z+Ysz6UsY$Xuml-rz}RT+Jml1+8u&17DpWjuR*Dc3Fv|)*rM$*&OQn(PDmoFbAY$q1 z1*MDrG_(ULb_W@A5a)R-QqvSE@;${&o0p7|Z$YKBrh$JKTy3`3@Bk3!R$4@=e}&;lqog zKb$x~HK~}zq2=*sB}aslqsKAk8YCO7u-DX!m46!9hqAJSu-dCkGj0ykS$ejIhpa9Y zEAkKr8VCSuo>FCOVM*X?t*KZeZ{pH5gKj7^L}>DD!7fv4*aa-{JQQH3-6Pw>M!cnC z_aRT2_=vRx-W)`^V6rawo9!8Cw&$8!*Ot;=mZVlbu7a?WNFyQLBk6> z=i;dHq7axOJ~~lDUsrUB5CG-73T{c9caybtu&uEr^i8XJK7%HKO&NX^=48;YBsdzy z@joEC87_Ekh5{5nqqtW=K&9#$<@K_nQgtgpz?o!DP&HIsDD&k|DdoFl!;)-^ARdqSL#_s<@nDX!5w_-yKcE>q&O-4NIdbHXN|!Kp-($qYtW!$D zGRkP54zWv+-fy@2f>F#U(LiU!KT`rkG)z%SXPf3xMD z*}6I9%0|O|aikgZszkjT3hrW#PSv~qZBWS|vQ%niS(VhUo5dJN1JIZe0>ud*5-5&9 zfB#ea`=hJ6-nsSGc4_lXZI+Mr&hM}1<0D0tDN7O8!m~?v*2PSwVGEjhGGwNv-0qwo z%S?4Wyv;(Mu3w-2AB>)q|Awncr6B{}sn2;?!--Zr4zcFKCsq4;iA+uIE_N;KS2Ii3 z*SgKTc;pWpb(m~fgM)b(YBN>dX8z>}@>zr%m{H`4hU|+Rx$YL95XW&z+||)pwV$mQ zAX@A-PPV1v@$xgOBpEQ-sm#iTRG|Ig;7Jc%eE))P7P7+J1-IWQfLawx$))RijMh}> zG1XLiSBt+-OIqVb%@x+1T9~-HZYI_)w>N>=I*UlN@L0hp^yH%UsdCyjbmAgZnD&z5 zhsM%LWEnrCbuY^WT5n$u^}WlbRvSEw2zIEbtbrwavCe-EuV!fF?upUkZ|UIA*WR|a z`vi>UZKY}hSVutL02Hl-WFTaZXd&@yENtX_R}rnu&#Z|RGqE1x2tEB3>6p(GCsmEs za&P1EE2UF9&7j-ODZPc5#Amgt#0oF6-Lj?&SXC*wk5{G|4i@&e7qgsAe^RB8ji5!i zfLU(|#PiHHK3)ttf$f!2(Kmi{@mga8pS$vRdu9fyCZ#eX01e^rdgf-CNP*tPn$lFu z!lYxqf!SjG*{G>*0{TMf8F<}l(3oP5({~`&V3;la)@3A})-qZfZ<5+Mpe=60W7{H0 z$xXK+{#w1&1MlH$5F$u4Jo<{G2QBcXB5Q`h8(jA-!dN`%?CD`<`PZtOXf_8!a4LBo z!`3HZ2&Ty%04N)rT*pM3D>>5c`{&Vx%jte&)FHiVhR&|PbRI=(d>Zue=w5GW>FLQ% zAQaj`ZPDIUKdZ8PUUzR~naD9e!PPf6q^uHTxHRT3w_q4}xS5V6p# z*D+JpU_@d`(dPEoA55e4hI-i_3{%Rkp^piStemTa0D(x$6s~WwaUm=QAfHbsv#syr zr>ki~0oSwW-_ee{>gLfQ@R55zWasVsW8K1cK72jM$Q zlEJc{bs8;|P>2rlZ5S6m(*0Ej0thFF{LPr4F0M9is-UvRo5&ZU66}EaeQ1Q6u{@PobJ6Pghr*W>I$V@RD!!o+n&E6btu)0cKG3RC<#SL z0t#V$&^n~P;7;$i7Uzys9OJwcS#3O_oUw1gn@~qYQ6k&nO<|EF(+|sscn`57`z>UuLyfxvRI^=l6|-U_|n#b7!jS0CrUf>%+qCDKo8E5OQl4l}jAk)#AxY{Bq1R zxYe5fjY7==$%7b^w~}}lb7Qz)tF?hD^FQKb%nj~^%(LAZ*{@q~SCvN?p1ODp`NI`6 z)%A~Ca64lzNP1~w08VDy!GW{`O|?*(8f%^4!5v+0aRF#*N2~nV&mJRnHnKsIfSS6I z?9%=Kp}CI24T?^`X{LH|cNp9L-$f+4h<5Pe+Q2G2zmwj+)mn$0^@K|1(UyrB=k{(gs7RgNLEp03ABENaHAL3ALS@_MUS1c3Hfj39AXn78^BFGhzFV zZBaP}@gUA5tg|kd9GHRq-CDaY<)one?m|uVH{!T`3v<$>X*g+~2ho7wg=IA6z7k)h(dtJV7?vJeqXz zxU=iWK~Zuk5Y_>7fVP`tz$7z?FajAw4fPHoJMDddEJ$c(TX9aaC1T{w<5?g!q}N*o zbU-KPRqZd%JvcneOykw%V|%zELxVzV%*g2~*nole{4eYC)TD00rMCJ(2gw5%Yujq^ z9^HfG3jW-URY+9_LGk6-k{W-38pIcX(o;IC#bcH-KSdaeU*dTufR+2*4d@VEPrWe; z0!+;(hX7EK*}y#F$vu^ML?jyPr&zzPIckP1o1MxQ{A;oFDY$4Cl8;ERwXX1Ya8NLL z3_<%r3jZDx>_^gX(9p2KVwdEd*!To`T$d>uz;^*hWGOzawVlSW zzzrR<`8Yin%F{U|KtNh;NB(Wzg7Q=y`$=Pb?J#QnAICI&cnhDk13~@lOn8ENV4Zb|*m)B5Sd#U($bWwiQ6kg% zf<+mDMJaIC4M49B2ow);GD6dVAXqkO> zIeIsb%I&=36`UOOyCmgJxHtN!>4OXB-bP*fJ8&xgcxk~0Z2V~5nOhKXah*JLPJF8j zg#Hl2oZNQxUF0W3g0)TtJp?PDY#XP;`9hT0)&$&W0m=~o^-_C2K~gAZ$FFuGn**pI z2J|FN;Hr!xw_>^9KgBJo1-K9v4jq(S^?o`0+H|36t^6)$>>ir9t1`|W7@E5qVK4bY zI&*J#hZQcpm>~jj>{IPvfa#7?U&6SZkSD<%CJH4$@;eC}#tZ)`G;ghFZV+JZH=x@6 z&B$g1@YZ*XLcvBm7wg4rPwMen&yJ4f=hipWJF}&Z*5Y)I^16z~{&1kEu?SMxlM&`zX!fef013`~ezp#?Scw;?v&L!Ppvx zi<_B_JL|#JA@-@TX@7hL3i7&ccJYk&m-e7BYHms}?DmRadUq_}&S#j~X zc$ycla23yGf}seu#<%QR20}~92FgNn|LHqEkwtobz_a$~1|yGd!fP(pW);u6?FF}C zH=PMod6p0_($ED6gVq>IgPLKmsSw$RK!DS%<6^19+9zWh;0-(QCf5wD)7ksXFX;zZ9B50a9PzXL~$p(!FD)5w@|xzViISUqd%XJKWP!Afx$(#{_eaUwe$U}h{IAZD5` z)0n!{*&Hhd`rEg}08QM=i~6qLtOV3xt>LMlvh*$4j|P zzN@VZkooomal&Tg0y&-H_5|Rsg@Q$^VyV!DR`5&kHH->)DtF&5*X}`{4aHt_8z+OF{s>5IaDR>jf0}pH5j2&6MtZl#u=? z@=Z}u>z`Xc-`#KzWvi=I)3)Ew&j+O+Ul+?yf))=JRZnF{?|vcyrHBs($AAn$fZ|r% z`seh$^FP#MHfcRDo%3VcH2Wyb7_qsN{``$qTN~8FAER&UCwuf`#sNb6)HFbcuHW~K z@fYCE+Ua5R_HZ2ThoXL%i~{Ir215Z2Jb=q+^4Qu9-)%J-bI&grSJe~s81V5S2t)=X zVFHR#>mUgDcC05f%wcC~J5du9lK@-JzNBmsLtGK=6$Gqzd3S2treb0~csS^zBBVtL zJ)9_l^7jLp-X@oyO0zCxhk!vFw)hP|9s!A}KcKnDjv_z7pch~0)fU~oASmO1e}Jq4 zrLM0b5QO>O5CO**Pv`enC>Kb_bp~B<4<3_@S+_=Q&2^Z)^cD{%_4Z!f?ZRRah%ew> z+FP}ZX`J{89%bJhpRO&Qt?wuu z0ZO|aO1EakM?NgXci>!kW6<%u^U(mOK+cg5PoS1TgrCUe1pAie6OEm^S*NP`l^Px6 zj($}=<~Di;tk%)LgzbXvZT^-ETE+)t2?f0MRik0@$>TyWJ?*PnZ$J%O{#_@nQmBcx zgRI0%kzy<-Yj~`$u{mXz$>ixHF959|J-bzuR;pSzp_jF1T}QDQg%|F~&syp<%`CG| zH!o1jLouEL`g8%}o^qoq=CpcxiXli{w0}-(TvlBYz9hZpR2*U(y-Nv9K{cI_HJ+H% zXG2EU0$+sRa34lD`)E&|b-Gj->+h2#$0m+X0lA3w0paeg!0T~G1REy=IDlDxvq|P9 z7kFs^-Oebts2J>A@L~TGyV9Y^P@k~UnTAP)AXgU_ld#BXMD4idFOn`WF-lD=qR0wa7(t-|YXV=u(p$3v2BFY@|aCxtmp08KNe4loTCYAyll_+d#Hf~rFLJP@qcdbAokgqQdy8D~On2FbR)Jnc@$<(SoL(FF>(jZ(oM6_!p-LA5~;%N?d*iGK@ zHiz|UjS)G?1YAV-0|E6zJ#ayx@MbL9?VXr#SU+@kT!x>6ByN}bL}m_*NCcgjj&=0y ztEqo);1emQZ7PVZmhyL>Vc-Ypa?(|#z?AuOm$B?Lx zaGOeRmbT|wKmck1ZN$7NN2fQuG$yiqU7$T(ziR4g3%a}p3<2({9hj(6G~i?Q*uUvh zX?%Vu^*H_JlM$bZIu;fL7zETnB)C=*vTQ>Y5t1Gv%C?JwFE%vjdNQWM#>AMNxn)1{ zDA+FWAv+Zw-=wKL@|Xz=6#niwG}vJ7Zq)*Gba%Oqa~Pc>1>TO|L1TeUfE%Mk4dT?K z5ZXlt$TkvjvjJjYSTF{^FPCGB6XL}0iCyq+$n!7-gZ;;Lx(z9xOa&Efk49If;+Blu zgD*d1FEpMXN?3RdXsi~vWX61kqzTp>DUt38F3;3y9}kVnyR>(2HWE~x;|o!H5#Nq~ zeUX`Jy=)`D$*wnH)U<|2X;{esgBBp6lLSf`BY@KlE(5e78+pegx*P7j8u(8=@*nT> z<21F{bJ{c|O8dV3#1L*llEDJp=+}130?4QXzquunIJfqO66m>2{ zw5TTuXzE|8)V6Ei)2J&Yk-0Q3hoAAEPg5-62p5OgUy*$NF$dv(|By6-A69Is+B%tu z)F~ZUWC@o2J0Ywd4kgYl$T#Yn87e*S<`@o=i4_Ia8a@0Jxng!xJp`^BEs z7gkowHz`e14~fZU#=-nqZ9`J&C!uQMo?TkOIyfpQ6D!AmOD@>|m0Tc)fKvm0{XdK7 zAr+e2jSfdvGj$}%8eTJ1qTgS%+ z<)7Xz7>mK&r!~TMp$9QAsAI88QYGnul5h#td;%pF*bg?G@753Yg!a zSDX&jo)v`CSUS$<-RKRkS=Mp#b}&4WRh>QRrPsVzu*Wt4dl4k^$OZVR$3dY(Dknm3&N-lx*mY5k>O0h0S_D%|@E`sXTTCYMTSEHfxKx_U z^ao>c1E-tIcJP;P;i{?^gbt?)u|Ke)fbVPD%E?lKh&4=-*DX8#4zgkOl9T;#ZSTx? zmRWyFLuDU;AF%c=_v9_2Fh=rTWnQ!Kh?7#!l!yq4pvWnpPHkb(14Pog@rJ4OE(E~)RO$T}(Voy-~+Ft^p zb|VyTbeH~bB2<5g?HuKtiWfHbrLO|&3I`tR*&GIdmG#aoooZH5WhLah7{Ze3lIyW& zEt-CDZ@09NV|>xFYHh-w)fRh6g06erEDsAG3(sVtkk$C6oX48lmoH#8WN}NJ){+`C zH1Ez*@Bx zx7Y^&dax823~EiZok9~xzh%L^p-$1|{ zUtv5NFpOhqAfM;6)WGk=x05VCI9k=qPWW(xNTq&)ig6$M;zGX>DBobfx&LUj(eLgK33npYiFai9h;Z(q8IH-72|30L1qv)*Mh>b+}zPuW=Tzl8?_88u#ZwWH+c2yj-GajcQG%5ZK1I z4pv_?U|__Y>r7CGdR!XLmcYCM#tusYSw^(mV^EmBrCDy=vjTrF=<0c#q?VBaco&~K z7?l1XvH`ajQg#yuT3CP~{>?(sbA=oYfd%5YBbx{TqMYi-)B#3CXf<{`d`d{0^%Vg%N=60NkfAf3z0P2&T2I9TPEJM%T{y@N>_~t`yeqaw5)VWN&`e|z*-e3nqLqYm?8nmrq>6SLdY;=>^V&G)^ZGW#VPoT1e*_y3g1K?!JE<^> zE;nw0Qs&<<~QfKy>kxgHnk58-fv)q#z#YjO+Y%DCI? zqQTA?JRcc;qI?w^Ppd83nof~kjx#u5j}6TZKJt)2WQ0iXU?brlIQ)xqUKhjoEuJL} z$kOE)cldiP7FjJ~yawv{a$EaD%!vr5p^6PQ2`Sw$fCv=(5#zw}AJ?*S~O01}`CIAFLyCV0(qBWGu)wP7n@qqEPXt;d}ym~&2kIL2W#J6oS8 z?$@lh+N>*9eYn^>Oe$?$4fJ_qu$vYc?VsNE4YKowTO>qUqBut&)-y%A+yrjMC2^S& zSet(%U4nc>9G>=<(rhi(K1T~RJE>8Xp+J&lJaSEdfb8kbZ;D|6By_6;uygTdMRv!o z7Py541ScR3y(wQ^Z$MTPYEkuh93kwfvk2ESb1nf6Il~h_p{~|;KCVee6C7`vPgRv!SV_r^SDsC@IoZO<8=(ZYI_C{3Z(jtbnuxL ztITL5{4Yg}=w$@FLTkwC@0Y;N1V35YKZ+#<5FYRaE+sR>!<23ax=D922iBUXAjXQq zEJz-|`fY^D=< z0q%@8IIe$EB%^(WaIYcJiNjFL2oPEg+Y#37W&~i$uWvQN!b6o7xl)2mc~%QSEULT$ zeO~FD8QOW^NOk*$x#1yqp$?O!YzWTxGI7pntiwzJ;o7@rWI*4sRq27W&Bo-j^=K~; zMYf$G9w#Vej%H?sL1u0vBNnmzvR`?2KrRg$|BPx!x?aeYjeCAzzjb%A%SY|`^7yVt z`3n7A##nPamP(Y_pQz8%;Sf@GeB0V%1?I(jg}@QakYgJ!X>@{zYb!AEPP8Foo6mb! zvSwldSe-&bV=xA(Q+k;R(xw`!h{&*4bT#T?Oj&(%cGn!%m4DGcc`g8piuB?2{l~Vh(fTtzAGS z(Fl22)KqhQ`JIcB6B?Hb&I};M*`}nN3L9@Wj_UHaO_C4FF>VU#S6LWzyJN%7j{D04 zvrQF44BiEffyyFU$w&bxN7n6hVb$iJsGmzji=GV`ZObR zdC??x(WD3F!}sPc8;B4bm|ehFUSGOan1AQ^*3GEO7YQ9>hlPTOY`w4rSY-hcLr%glCP12V@JDLTtQM3O zF-ya|xL(<_3CaEObVa)?2vjPRj*}`5E&yREJZb&iHV3;NH~#K_8zU%|gHX|O*aHMs z+=(d8j2-&}H^Be#^f)>EQWZ$W@;o58k$7KzXTYhl zYhQ&!-OvH{cY|;7&v@@lj05P4H>7|SKAAEbakY_dufYDnMielE(%UaL`t!-Nyf;AM zngWsMI<$`aXaCT?w|qziC7nszgH%(_-naZ^Xsz04q#-gaRL}2kv3>gb!ZwzNJfP~u zYW6gYEVTEz_>18iK(W(Mfk6LfyHHpsd`1mEiNOybbM#`J)k8!7fe+6x#KC8BZd|>0 zeMn`w89H9yWb(7CdsKqI8!@r8N5Q5N{{chAqA!E=fqMdyx$n=Yaion!ISVP({oEO$ zJu*{$8)jM!o3d!#!$L zIu{2dS9#w=8?buy4BSu;rJi*I);F2qAASSrS)o7{Nx!`I>4|GW)UvJ2ri;Dy(IUE9cYDq-dr)pq^tm_f6B}FQpJf5Te zelgDQKVZS#MW?n4ZJ?etrN& z*498wG;K!@#UxWE$GFDku5?$X2cC3q`GP(=G9l&eRKo2QuH=#+mrcaZ)-oXri?n)= z2QoR7ughsln0Ai|8ICxdHZ5(>f1$6YI4(HkD)`llul%Z^?CwW0h*%RuLrsV|>ZhR@ zm2Do_jm}G&)lmxx$@r+<9i;E`H!Q&FokZEv!l~M2ejs6wb2+*)>RAB&+xH?zvS(vj zpkZ2+>(|luDh5Vj{!>U-qgD9R0=0~5 z)G~u139^GZPyKuYg;@5q`2`Rf+*;`$3n+~}g!I>Se5!N{%h|M6(!jkFM;5?eQp_0s z$J4*OEhc&@JLLRxu`!@m?3BJt&YLY3y|}2$r6+bD?mlyeeCeeBGJTcQSHlB&=1?yz zzj2pzJiR*|oNoOa{1>o*V8rjTyWS_wvgd^_JVRPrU4c&#@+yNY&b*~K5Ngsux^ZSS zEOOm%{uDDl(?DkEt0M?)r6>WS3s}1EMR^b(TtR*LJ{mwYwO;74flB{@hAt>HQJ@W6_JbgMf3xtp_k~XzXkI>s# z5EKp*^!HcA=W!Ga0C4~y-x|0;gUVRG4LR=B1E8xSU8fk(|LDh59=-<{SUQEYWMe>f5^pQVR3}9%=oCyD8UL6h} z-U(N_yHP0pd!OF|sGK58>FVP*2%kPq0^6Wm!R;X099qhwJ1GXBoTzI+&aKHO2QIt! zwJ2kMLQlDr3RRp6s2aW@q)Cj@G@T3gmS<4wSEdJxB9@cUD6Mm0S|l85k5FV34n?jV zn4fL6N#!XS7BW9&5^gTm!;_M!?^WY3I3tppbqyG!DjBMF;QQ+ykZmK9aRp=tCP*?+<2ox)FFM^f;+l48PKcClZg5Xql#I##t|ek%ghS0icO;C zX7}ibv+zSw$!o#7>U&|wb61gCqqS)-1=TwW6iGf{yS zD61qCxMygf!0)Ijo6s?5|S@heHiYs{sBQv^vc~V z*q_0+vopH@LmDxQgg+NY5oMIkSml_6kag4_-*nlUX3PX z-jN;X!?vb0PQubReJsDzv$T|{RXFbnXU;e92xN=9>MOlB zb7EIl-WOG7R}+dV10#4B!}M8c_SFDtg(fA+cN-bN0G9ucnE+tep#)L3-{JxL@#C^! zpZgGs?9gNn+X;oh@^m9p`a}j#DOWOW{I@(dLXXvnDa{}>!{EP$n3K{VdN`H9et8oo z?*SOV&~5OJg5Dk#_<;t_9lKdLfzJ@kv-xk845g1R^?NO1*H)It!w}ODs%$vE z>l84^a3LyCDphz&9FC41n%je1Q`DDhRUkFZA2#EA1DucHp3rV(kwGqeQsTBXc=YJHg~z9Up1Eg z9bQj@Z_zzq|0lKC|0}iAR)E3i0XlX6Du(@E>eeLb_c83|1b!DwkXdj&OozUIUO)XYb`j*;%ld%d@nskM zaeO&^z|`(Q4ocC+aJY`e#daWL#8wyA~lhm)nC>F;>OcA6O!_AlCGZSPlny)AV3io{8o6(fk z>hzIUfjszhtE#9+C2#W1(hDT#=bub$=BZIQid(>BnE_%uxoS2Mrwvd-9#@jfPu}*) z8Hnq};N^9WtTz(N0D>hWPCmGzj(CFhDbpcYep#>{^n66V1F283KIB_@KySgwMO`kC z+XTwj!T=atKO_ie9+@)h0-m~Fm64F!XfB2Thh@$~ai_{f#|yzQ!Y`;3rVPakgsCR0 zs(Gb8;snbli%h+As9)xLFJ)j?1Rv4`GaJ+v{!Mfss^gy606*!Q?-ll|a`NFXP!9y7 z2Cvb8FEisax+ZjGMNw0_Z3}`yu6>s1FWD!dm~QOTXOrdT5R;Kgq?p=D`&dL%?Q59p zGvnSG2AZMW*Vc+B%7y$SGN?r5oxK-_EsxM#LBme70cU-!#o?Cu8IZ6n7>tK06n)zG zY8>?+v}F$ofN{mqB4UxA4^~yGyLMlg*i!cF(mL)tG#bHa=e400)@i$38xQ3f3{(KD zQH|7-GIme8L&#Ci^=Z5 zDLdQwwQ~cb#T~pbB8^LG#L~nDP2aoNezf%KoKgW0U|^ezk-)8o8P(W*1d@GeR|&c% zpv5ozRV)@Fp@?drHb1^L)pzZKGJ4b{-;fW8Aq=8ektqiJbuI-~-BYUOSI%GLzrq(X;+aS&8WmsbPO>&9;a^c zwNMkl$-=1X{}5EdnwT9_Hn1QL?vyFr((=0zK$oPUKsq#lbfo(mec!eCWK&f&PXpq* zD)PPQsIAoBoEDafQ3B)3p^Vb!*~Ll?Jd z01>{f9nlzrDLb`+&Z!O8SS8_ApdeTpyMgzV;Hv&{R=$ z;myC%V91x%iZ2d@$bwCU1HLbl1<2MlKxo9YrW2uFwB6+}c=s(1FclEmEt<&Fr*8^^ z%__0n1tJaqQGb3eCc8dOW#RhC1nBZ#OT zv3gYJ)tlXt0^>Ov9od!>GLyAEV?#Qz46ESb{84g;jJbmnAMw=o{9dat18_@8r9VU8 zJq88O?u5*h@6yTN{}_`+dyT^|{Cr8Je-T0fYJ}1o3blZVG1}dj)Yr7?#w^f=(imX8 z)xEs!ND6~sY5*OT&u_S@r5?ac42#?@P7@chc)tz_Av<%7`b^%7(oeA3hxvxGu^&F` zCyjGsuV`>}HXK{jz)rt%0G~{TS z8vC|S`imf9d8egQSd+?yYmArk7198(FQR4CNBtOjkOIL9$P-!)ctN%Gx#;O5xP03n zm|V2DUKm76E<8(>E=_zKxdq3JTVr^gGMKsxyJZJyt9)jqdr11eSs%Z3_^a;9Dl08Z z+$88}CT1lA0BaTQ%>10>R`&vDyDNAW#=>mHDM)8WfTbWTzPX7K#|bSGs_!$$O;G-X zX>PS+Umlr-G|#M4Phg5OHQ9`&SygwkT=IjA$(#;z!W4vDBZ{ZnChbj+?+T%>?6_&` z=cf_F1gjq?W8su;--RH2K&<_-30q~=Px$DYQI; zjjsK+&=uxpPJrVnwE!4@J!WRwH#_r=+01lw&9!&Ep*`*=p5Xe{ca<&r6RehEX}+H{ zNEup|`d9i-oQL8!bj#=2)qgZCFjHE7AQ(C*Gy8wg8UJ+^j3E09_KL*u2(=tA{Xym)Xb>Pxj0LXRg#*IsYeHJX+rMgMCFn^@j_;vG4>s`CKg_5>onMye!A zk6%IpLaY!R=$^VO+&_8-5d#=<6zEV%#Brcra!p%X$wVTAoIECvI@rAcoklF$KmM{u z8)$xuVHOmtUOGpc!DoM!uIol03hERf4{|f@EPhFDY06(&WxjmldYnam#!H%i+t^al zp^{05)u`o4$XRjdQdGeo)t^iye9bL&zpV)Zo|b%N=-Kv&B8jppFS7Kq2#ZjCHrD^{ zpoelljolK_t!?btc9b!5TVzw=Xz=z~yJWbQbunelWZ!e#$e%&Ts;Z5C&WU?Dqt0k~ zn{S`whl2|$yR(s!U=t-1B3u^*kbfBZ^Pc#3Is8qL(7sF3);BdQq1`wS*@&yH12ZxP z#E%L-m&Tq&l!%!HTBg1DEPfl`y^6ZL@;h{{O|dB(;)51fF>p9Zu+V@?tB#)ZZwftN zuJt0>>;gHQc38%im2$MCq!=p1IkI~-czCRkaG1HVxk0MbCx+~SaCsPxifiJIpd{AY z){b=zoAqHl6mkuU5uoT+-&FbE7_`d*w7W;owzDwOokSIWAG!~sw)+Qi*urD=aJ=3! z3kDVJhk15{)opDzW&8!c4LYlTi&F+e?uU%*Vla7_OLpWb-(O6zN)$#N?D_B!b2w;Y z=>JvOacUB&hP`)IFOu-5`>c|$Qc3zZ$jh1ZNzYWJ2$_&DW+l~hCz(;pzmQV|0Nuw; zC?JbL@V!%SGh5N~q6R1IzK7eL%8Go1F|yQ79`cmB%KId2jnxCcJHBYjhI3~HaL(3w zNbZrAWaXgUxV>BGE(&YWHr+X)aD-;klMOD`7CXmzPDKb|DNaWDW=={^K zGer*GIu#E8SJRAeTFX;Jg*)EJbe|6Ya*1F4H0{nD@)cN-s^4ShO8&%v_h3}(Dz~O! zZ+Zol?UYLIeQ^M;!3KgZrulWcXxMpcb5Rc9fG?hK!(93gS)%i-~@LF5Fog_yE|OI?>*l==hXe@ z*4|aUdsX*LbyZK-JZr6fei|qv0@4D=+tQkkJcrLS>P%QF+g$JkN7uG5xqrxr`uUWP z`9GZO0TXV2dY;d#KgDw1+?{L|X1Ffs(!RTFiGTy&D|Vj22yD_oV2DtZI4h*}r7<$= zSXbRq&t+e!DsfIZmdQ4&^-Za&ykN^;B{6F()It~loJ9`t>ljh*D90}NZi7Fk1oMJs zw84mT?*KEO!Pk!(GdOzVmIHs$UBT4g*Fa?xfD=d40Y7c$ucp5Dr|-|Lhajqx`=(f! z-e;y;7!`&%gx5$!s@aoGL@1|S`XISvd|`#vJHwMgNY1&C1G4fFe>XhEYcA@*jrrU$ zQNJtPm`49kKJ=^myDjn#RYBXH0(75le%|d-Y@3{BT=#r-eqEr{H0{Loss7G+pG&ll z0m#DBHrbXbSyb>GM-sm=wHQZIFt4}&v#P#1$Vu)JAn4z%t=9VadPawVG8gp~DzB$l z{IUaHz9RMIs^cK6FFN%KvPCKU@5a(MMNJ;d{j`a3lg4Ij%_7InDpc)riqHXl14l5X zK!N?TE+tgZH|_fvg}(DGRTz2vj&Q=7KERmkb6|NO%26LR$ty&mt1bkY|1Ihpg?C>p zs(9WvFSp=LtQJgs@BnnX7piU7H-XQ_|A6qt*I@?JpeV2 zIc@&(B3zO*@6wC4CwzQ8e1V?}lik|zD5I3v<>?!hI2-0Oo=x%?e<4=HWVA;qXnt4Y zUaJ`g45-jqh98MXKe=i#rfFadK3Yvfq1Pm+quXj>9{l!YSVs@CH06zvhiIdkv^q=9c5*Ml$5U5PvKfoVyufg3wYy92A9Cjl)a| zhq*dJYg8(9cowJdDycrkyjhU2$m{GzqdgP1Bl|l0q&qtceoBdQ`@KteR}DZTW3^8w zm}?yi$M*)u*kaT@59Ot>^z-D%VpR28rqiQaPcLY7|8gD1yd zK2Dso8Qp)l-ehn8kJrATpi6bs$e}ny9nWcO<_#D{U7ZNFqR0Iw-_b~(reQJ#=Fr2SH~Aywt}w%fmaX}2yFn`a zGQF@?nc13bAXg$RB7Px2`PV zI=dZJ(=%73aS^UDrWVnYIvqzJQI{FVTmWbq037ZetX#m4{@}*ep-lu{i!zpaOy-U^KP^K(V^lqSoH?Ia&+R1S8N}S* z+}O5H6x%o}U-CX5XOW49j%cd)w?n6T%S2e(lteyrZ)2MwXN(dk=O{2O(OBf}cjJ5Y zC;gbL3LcRiT;TCT))!oL()@Ksnc9DbI;umCHj>P0R~Yz8Qwu1h6~y8)`;^U~%i7+c z5v6{VsfK%V6OBZW<^m;fZ3hL@fnMLlnuJ9OYe%f#ur8bWCD>X@xY*SKk~{ZH;S%26 z+07$&%R*TXeLO8PU%$jPY0A%mne3G5@>g-Wz8==Eym9< zpvv5jE5EEI{R9A-ZY_k@s-}HNBl?7wTP8<98oaJCtHlwx`hn$kUZlB@mR2{i!UcHPT(@kWH z0ZxzMzYZ5yNur@VckG|$9o^*xEI<9&$N=ApviVYwBpq&8jCIQ?Yl>$?`?oiD21PzN zd6OR0m;lzuqYv7_FJ7-qmmv&&UMKl|dwhDg_m`nPfFC%`Zpgr{$wa5!%i&W>ax zG5YD3-nsbb(7&Q?roO&eFyJiU|G2r_7rgXhB|@X<+}SU6aPd658F^c##$(c_E#Ib1 zyv=24;t&2Hm90R?PrOOF$ygpeg@6q?>lvO0?slQ5hxg9{+Rm->XkHuX9aQp;$%jcNB>R%ZVTx`@@QPZ`ul zXkSURW*#}-GAQ;p?7~_W(i!dN?oRf@!T= zJE|(0L=rQHly+Olr`;?24G0E~kyz@n>%zaD_2+)GDR!%f-fhTLxaunzRED ziW({ck8e2y8CN)#9)8oL?!oF27;AHTJRb9kk1vjgPelNbDI^JiFS#g8ijF!dV5|^J z$GA?T`YA6iIHGtwn=akMIYky2uw$Er+uHHjVHt)a95%|WxfbudttgB@Kn5bh+J1sh zXi;jx*o#WD*|f;Q!*XPRtqMA4?8xZ{e7H_iqjVX4FUSDDatL)UFpeXgrF zRZZqYwKCQ^Yi)$kk~5Vj=ccZ;iX=OuVGW0j27MLaz$CJL&f9Ze8;cHJAm1hN%)wS0 zuTArG{kWV}JAHmldnMN^ZaDhIo%mR)iZ@MYb_fTS$QpEK5ndR6E1Gz~zgjWYmWY!{ zyzgr?VD+7y^gJsg1peL~;JhtGB$l5ww@K;FTWQPVGQ)eqRefBx}ULgowV~p$xM=l;N%K#`khtKi5Qp>c+ zg`0yC5vJ5Jmeb4%Mvonbxs%_E13#}%fN0%VN&tk$m#Tkd^9 zg?qso@%^e+Q=jvhBpl5mqAxsQQW|rDU^gPZ2ymHz1pBJrN}}n;FYj}kGNpRtbcpzY zWI9X8h1mePH?3}sZfQE_*t!KAP|)vR7X#m*OUEBIhJ_;U?1@9@d$$lCo)}b)49M~U z8bHc#q+fi!U*;KuUAPlOFcgB|N8+G-fpB4%y)KAuIXLn{V!nv+q>+fJ0aHNF$!ID= zB9ky~?!kF5OLUXii@`Q7|xb zO-uP-E)_T11N|kou5kvAb$Ikd3|8Ct>C}sFifN3Gq1xzzreXU_gdG&c*}5mZqA>8b zxVlFrfK}Y+Tqc%^5P55A8jrX@C9J)AO4)a>;?T4K0^}?>dU`a1)Ng)%PEnkIxs6tw zU~PZUgP(=rsPdAP0-vWz0FSz;DwVbrK})ZBYuouGvEg4`$u|1+72j1!cxo#(<*|0- zQ!G)@3wVM7Y|{aka0>~wPwRc}C8aT}2;aX8A8;VHEAf|2kd{xki=fN`d^wOVd(2bh z?0k4NDUuMCv&9{NB`=NFSD&j-VX$wQg~ElpZ&r_ zBhSMNe!j_LK|OryKe*0c3%xkp;gjj5NX|cI~P;h*!<0sjy`JP zRCo}B^$K=bs1NX#dUXuU@N`6@4P9Cl;r~9Sfh}F`nhl_ce4o;NK?o!P@f~Q zROiW}+iViqL%&;HzMMbu6R-DeNfdEK>6+g@evWUv>-QVv`h_jJJAHga>Y)qnCyVpf z1U7CO#QX%%T-h%=qgSy90IemwT)&*K8v4&K{krs+qs;~t==+_Or>6wDdy;%fEvt0Cex+pa2jb$v#K& z*%rT^GUXa=p8sa5K0VwKY~NCD6c3l)tgpa*dyHuo^KR4^|3%=oG4sX#K%$Av=SX-t z3YB%2c{%Fy;+v9GuV<~>u>L5y*F+h2=UClOUScq3x;|wSg>}xZz+?j&m)phDvwPhg0sN~)psX^Nh(oQiqY!Rsr%;ZI=o#Zuo$~IpcT39NnlJJeT0YyWf)^TsmVs2b#@% zYNLSWvi9fJv-SQg<%VL`K95dN*}%Tpv(Ubpq9iq`QOdbzRlM)8fvur`Tz@M=r1HHp zcJ_j-*pvoS6JYt+a|S;(51{hwbqwnKg!r_!_4-`<4dAP#(80|gkW~YznB$=g+Zb*6 z^_8=|pRFc7Ns7Z?jMj=M;1&@|XYu{}a8Xe+*Eq+P)bfbGnYB+Q<1t^+TNT82zjNm< z`2Mg7g>ro|#)|$X*1*Q3*WPvybE(`@za%;LEL zqY$T6I2Ri5kAr*&)Pidnz6(3irzIP&BoEFyQmn6p!$9*6TKEmxWR`*hGa+$$}U2$m|Mlku8{XkkO&m2kZmi>pP9}lE}%(b;o_MQChm94wFIVLa0$`hihv0ou3yhOP29(|v7AE|Cb>>-AtGvNV=Cj4{olFL%Ja1TFpI-P*S(d2cq z-Hma0j&FQ#$1lmu)Z?`~`F=`^SIv$vvjv=b9dGs_NHaOnG<$PXL;aNxBM1HGJcNxDtR50(~`Yydu5 zHVq*s*_Kn8aYEV!C5BrKjUsYVb)P;hi3YN8JmwQZ^CG7cwAzDRRh4Z1e0E#2cG`C- z;M#pPBUuDO4vy4bhTb*LS^DvP>ke@4)Vr7l|3tDv*>pmpN&=(oPP(R6R|?GfmO#RyxxCG~CFCGMvnv5+ZD)Kgf@(bQ_CDG6vK_BbCp~ zOD1rxaSYBjdGX8lV#X`~rA&r#x(->yhZCP))aDuz<7n-5&-;VS@)x9M_vyOjK|)GJ zEhf=ui@C(1+7pqR5l@A)t*dQETtV>`6Z?@@J#Lzuk4A6JVBzR0T6N(&tvDCwo&yC( z!jlh298cS}mD0T5+(NB<^#dS2To5?d(dKKpwxWay*m<;-pMl{ybqkE^CP_bD#sNC> zt2{GleE6L^^6S0}Oe!Ug8>J^sJxH)9-^(fPnchr20=T_h_FQ z#`FB^_~Ws@9}91M%KECYq6FOjqi8voPynUxHZ_X?64bC6!!?1-V`_vsSU<(1Z zAx2?p^bJ!y{XmnRGJRE=?`V^lzw#Uc=H0wS-%^3hmt&Iw`3Cqmq-XQcH9y8VdC-0A6jDb0TDDc)7h9s`Fekk+(;#-!rXeNXov38+P1Q}xH*k)j ztRf7Kq$t3ZMpnxwm7dkl4BTHsupNFRZcB zwK_y|E)Rj`nMB5tQO~NeeQilyp6RsZZ{ALuVIKg~&w%Q*#Rf_S%Q7jZ7T!a+m}H`3&sly4OrR1y*al~ z&jnQbcUNK)qBKfPsLWJLs893ii!?|s%F5@>I!u~LRW(we(b{l9F<=VfBp~NaqE=%} zdJ?b+HT;$m<3YP6s^%!=^^MbqqaEP)T+wV}XK!|$=&n@eUxbqG!zcP+V}(2LhdnR! zsW`e2pbPfqX((-T$QQE06r}mqb^zegANm|v6F02;Dd(EeQV5-`=Z2UncuaPG z-=#jnHJc|R#L)0|$zT;AptRM&1tVn%e{-wzdCtj6F}pn3+Pd1ayxhAE%W!=QyN&{6 zGXH34f3p2{%L+vP`#f-t+hrmQklWs|y!`&n3u}$RmV2Hxo^q^Lm=br)RU;w<<`s|~ zLZ{ZdrK0=d^LWR}Y#eN2^x@9|3Y%bKGY35#U)&rbyor$_)ej<$&cvHDxo~aD!( zBulOjaYCeF$^K2{=usq|g^w{vv@V|-K2^o<5@>t5IiIdT+b@~tG9U3T!W_~(Qlwc1 zSMFK=N!v{Af%^NIdvrID0BB&_3kJ;hl^6DzN6hO|YiPy(MrE$ApmxV@sY}Gwh6wx4 z?UtBKxz#73O_@dsWSiG@3%WiFd}Vn_te%3$H;>yECF1~-@>3BTTO`i4ntCPclrh#cBhDJ?uAC@J8bqJmVqzAPB*2eg&XWrpsm`G1VM}-b_iN{se#p>VJoGk*<{`GgjNwounhREQQwr+ zG6HpFG+7i{*m9J9xi&Lvoq3z-rB%>Mi^;cCHSXBkfc^Ri8!+-i<&=N6%;NIMLnzr_ zyQJLZ*wDG+Gd6W2SrNY{{qdFu(?{E{<+LeAWfaTTd}*3S8OAzfrtVO)8jt3Vw?nG8 zUc;|9+nGP@pfpo8crV}=5}9|~;MS8L1GLmd910;I%I`w25DCGHj4!dA>Q^G8-Js|V zHyx+$Hy~9XmmyWBI}rIjW}F%MFRv8a+cDW{ zq^(&JX*nCyp>6Nem8)o{^kXE8?U}LC&bsT^I2##*O=(n%bwUm_T4v(-Q=DY3ssuyb z8BV?C(=zQXFs%BfJB>BcELN!jL#J0%E2{o^lK+~3e{a4Tm3~^YdFE?+j&)QDn`T6i zZ_N|$gb-QIBi>! z4KTGg6mM9n-9t_iEYGe%*(o&Sf9?7Wh|M>lMyySVxXa_*5HzHuMovqN^|j$$L?5@a z1mNHi?9L1N)s{hjl+d6=ie(xZCU5O&LYW@bYYFuuI`h7xp$P)Ob?G{XiV5UF#3rYU`nTdE5;4hl>`&)Lx ztD|inGSo?htdlAEGpQ1z-fJh;?+^0E?R%9@D_)UEVvCIoH&MS#MdqeizqZI_DInWN zi|uQpDa@>ThIK8L zo+C%`vosY-Iw>bI+}|)%jHMIsrV3dF+ICLj>y`f0vwC2}OFY{(?#wnJHew^_d_nBh zfBGTu$R*5k^wR)u5``W!h_T%7IeJDEKhPZ)ny-++J1AC^3SOeg7%)iJ$Uy`zjob(_ zkPuezM+)bq3O6K2qe!IIc@{3aiR;AG(c%b$)UZjCD#SMH)S8_;7!5CkOOH}OX-xuy z&+Ud+CD-yKa-Hfdy-^?!K`R;xf6yRVA+G-D^e)QvT!f>BHmnAIms92G63NZC{@|-e zIgV<_?o-5CQj;r(0U+ZvhJvQ+U5IfhruGIqWm&(|2c?pWlU1#lqpQ>I_L*)p)WKpBcIqEXJZQ{`~5KzzX;dE4Z%PS$@u zc6yK^S9!vj!Shl;8!Y$$jer19wK#b#Qwmg2_l7xHFF$-?TCc%yd_vFz%s_W(*nj)Z zrP!0hBBt~-Kwv|0aPa?QEVrw_?q0x){^Q=HXM0sSMk?UpGPO`)Np!{1TVFLZ$4 z%_+qMJ!t0`+>PvL^Ppp+U;Uus;P)=>-cC(iLoavukuZ9Dm_OpX1W43eODx|wnxs~V zT}|J`!Jv!j!z%sU8{dBIeRvxQor5Eq0jzI-&~XtyE#Ks_tnt%&^bJ}oD@I?zzo&~i zia7?27h{warV`^>hpB) z3!gm|Q%qO;eS0F|M4YWK5m*l-2oT3=$pYs!1Pj`J^Eg9}d&%El;|SVp6j5pqu}Cx7 zNQ>S-`VBqN5TyR6#~JJMWO_=V4ggUy3t4!30Smi?HS$s#kp?i^-u-jZ$AicF&q3b} zbrsL&zxq@OcPce(gDL19?PNqD#Ykum=5;+BQe`tb`_zdeKY@;>s1u1WBQ;mlReH

    LxyMzF=5a2yM8Uh16YTZWWL<{ONruQ#>`%@EBdi_e9koJ63E4L~p2111M!rKfmP z57Y<6LR<)jSWyRLfqB)kRR;kJ{piSKyYXK_oA$HQb0T+K{jq}O7#muPRala?BPk6t z!}U8x4n>TLU%8EDh5l~4gx$)-P^on`*g49N)S zFKQFVGWbGmsV1Rz6KZyAiQmmFIXFPH`tKuw5P%+1l;!*J1<<24R_FrS^OO`{k@^s< zm32t&(982%T)xGgDc)oXY~=~I zSsJX^3~6I)>m^Y}Z`UNgQn7q79bW53(MF)uBj(n1QZ4CWrws0k$kkR@-7ut?#SP?g zljuq|cx@zBW!RltL@YNLts)a2)jo8EVEG~ePvg6d!XTi6|ND$Upo60nF7Ws?5SJsr z;1c)>2!b(C8B#{SGxMS4SWhfS!DF1Svzp$_CUqSlpj25?783ETSDP??|K9dKkE)eK zBk>qdP4J8UlU{ZEpFr`64P-jPOd}OKXSN`NwYxLUc zgaW=Q#)-cJ-a=Q?I&#ebPvIHb&YsH0!Gk?+nxDY&7+=}zf)dG=zg8YqCf#_6F3eb; zy1+1P9V4f9mtvEdrU!HwsKgLAV|09^ z897>AhRZ3Vpm8BB8QhThyCwfpMCA6#l0wV=G_q)f+yR__IjJT%-pD5YP7lwOxp+1- ze>+f4NmsHai70SO%IQ8VP$b^CL=M;F?4GZl>d>7xXAXrB`OHqA=UxYKChxgY<8!zR zOJ&%@%?kB%=BLKsKoMZslYlH~5PqR59CQKZ%b-xo%{*N*gw!CopA%mhBq6*=8V4$s zMox{3#Fm5L)h4I$H!(1mxzJ$-J$SdeGaXRlyL)9*6gM=7Jb7x1U9(`7t=%^;TE1*c ziiD5ANPk8ryxJlTu2_X2i16@5eUV@!fJ!FUM^00Uo%=W=5g@%Sh~k4hK)fOeVf$Pi zMk&P_FUc^VP93J1!GZpfjWVJmR%F{2MBr(3H9|>1|A!naYOWhw=an8J8AbLvX) ztAw$dkyn9y0Zi4$ZD7ZTWd-+ zGDN6U`Y7n3Od0>pcNjo=b7CHo*VM>ZQI9WnWqC_nVu#BRxLxA-qSR*t>NZt!Fm==@ z0J78(@lFj&)pno~&22JCL01tu^&!#J?Q>dbl3Gt+0McxH#wf=&IZ48`LMKwE)Ja0E zvZWk#ll=#c{C$XsSx}abX8oM-Q&dKTPlo)GicluF#lmn_R@T;t*WT}rIf#u#g@r}e ziP!ueC$1k}wkOcu+XVdXA8w{E52YkM3Q4<72eSSJ8EY<`oiYwi6$TdC$5#y-t1`Jzy5*P}lNI4NhqjP2zXg09e7!miS?cBjnx%!bU)?q-j*6u-gM6* zV-4WWjir|ii>G3Qs}nP3JmytaqQffo)9Ok!UyU>XJm`lDVUm)Fq%=_}mtP(9KBX zjpQUiy9z%~?W>qSWJz*kUW@?2Y}_;4fb?-KE~t`y6spwf5#B5bjS{5{@!5?)WrNZ` zQ=v5knP8pVrVE}RjR?Nkk@(s@Q^7EM*>-cggcG+2t+l#adCyiW-w=Rjl-(d^oLV4x zNb-^;s{Qgq|EA{h10%KiGnQr=R)mt{c10|CCD9`>D_avN;=abe3gff5q$Q1OnPYne zHST(CXq7H){nOw;^eIn+8HqvRES;m_$%1i6aHHL^fVGLkqH#$7Qk_U#%S>HIsL}V) zxzj82(K|%1)+Qx2>u-QOBgJn3qsmjwF9SthhdlHjs}h$oqbHV-`AsOhM8u8e&5H@Z zE0K*v)U7AIu;1fuN(|sf-gvvm@2=JhXOo;Rz`ftQUwem0JHR*P^6pS{r>`P~qN}?r zqc3A9Y`^DJrAOanIq-3?&O+r4BHH-*!L)frMC8YJ?|!MUKEUcR-{!^J!>xedi%zt+ z&##O=rT{XsY_a7gSMalnVGdcBu)kpRxzFPn*-*}p&iAuRdwk65TGG>|_LWt!O{Zo2 zl-=IEtcg^glO3X*k0clBFx*MdG|vFsEZkAhUQj3M+z{#V{c(5P?Ee}WRD5zy(JQ9J ztpaZDJA1?9asP^(MX!*w3b}djoDHwWwNZKhEAYiqaRhD=ZU^cP_>lXM`y}o^>9;Yw z7*|jARqju8CW(NMo7c|CzXJ(W|IbM2q=&@=j0V2Au2%t6;6v3zonP(e=rf9B*8HP9 zPnN}3ItTQ9Bk3XONcwYS(3_ksh8iv7q_h)th0_9WbC1aQwW2d%=5V3|7pg&X*BY^m zB(_S~(vSk0VQP!j3XKKi=${}>Nvtj`trj{XmMDF5z6BO8clSl$wFar^zmZ>o-f|iP9h~y-6 zFrkGU>*aH+8$H+VkWLOL*~+XG80HiNIt+@)#h3FY2k49PYSWUYa|%tX?1doeA|)z8 zE4G{n&<8hgM)DzXzqv6-r*fxK8~VBc4a6vfL|s{QN|Y4rix`?I(r0ncI#AT7&dE(y zlP8mBb}423w4Rt@+UQLd-Che`IMCjaGoF|cJgSSyz$~vj{(+@2t-Vi&?prfIRfzO-UNzqWVRcOE=ue*8c<``QR$uk{QO$3%5_C(!9H!2CNPY@uer5O4LjTbi_) zWBj6*rl@VcnLv#dDwJ5PS%;*3;uG-aXh$zr#5x2k@M`)$A~vOL5e5m8i!%k{910tf z^WSw9CV;_*gvI{g!EbP++3G@vk8bngc?(U?d9E(1dOzjjr`aHdBZ4E|{Rak&Ek-do zTkcM7MxvqipZTBu$jG&4OcZyAM=_0tql~6Hh<4?ebod5GLojnSNScnN$ik0JhK4$a z6z@iwP;O82uzWMVl8fJX7IS(_f2TjYY&yTp1sqD!GtYeid@*u^>CZ{-F)w)J%rGR# zadNaVl4^c?Pw!=YbF@Ff{g-w%g5>l$h-B)B+c2=;^a*_zKzc!^_S^ z!CB}{-Q`=T1i>5Y1`BjR>9M&8BOX#?S{4(_HE2CZ%ce=Zg#n~|d zwMfeAs}N59Zq_L+od~_T^|}$Jp$ihmNSUrXC3t+A!@bvpVPud-VDU9(DAnzqcZC&7-G@x%!o8cL@$IJaF`i zdAu;cwM2Ic=W~viltvy%Tl&0^=L;DFNEms#FO`SfpZ{L271uY-ZC)$K?^tAA!r>7m z2{lEbtVq&f0Fr@i`E>9-@*7p)KlSe**EJ*PGTMOM)a>bHq{#TTrlz4CxXmc@7BWA7 zu|lg}h3pN2KUj6*nwUUU9u3%{!tUt!MlUV)6{9it9zX4uML8L)cmTl{Se-^VLO6*i`s6z;+5SLDhemA^E9^N9PVV z*^)YvAX=ek5nk}->9`gYQr8W~vtehY5&~sPrL>ku(0ULkPF@&zgTzn&dhaf3%IyFyg>C-Vck2=NgNv>1!lkj*>$~)3H&-9>fqDw z2Odn8TrPHovyk8$6r6nE=^7$XLGxPqVd7FFH?&GJf#d+DOhp+AeFe{>k#gzpZS07K zH68Y3r82u+t$W08V15T+yR7-;^{-FhWm3ODrdTIZQPI>|cD`2Gn^Qp=Yyj_O@U8eh z8P_-+5#e%=+lKPNv9GFH0b;D+)-y2XDB7$Xm z@0b-3U#$cdujViRLd(h53n*o8(pd8wAd7KB%MlaGTBTR7T|;H1{Lxhj=@fA__BPhT zA&&`G!;dU~ZPEIar@D@$6~v>kzWldTwIz(sbK@AvOo5+HPdFY^#2=D6>f%_!r^@1k z1=%K0uw%1fD6Ry6Xutj-8Z(O)5WD)-acik0FEukB4Gz9NHT8l}YB217>)gVIl-q$` zi-X+zX}@LufIPDIoT=B?UvSTR3_Dbd2}%gww(a^nmH!_4_oW*N<$FgZ9SM|<`E7rv zf$%RX$wq&-8X+#fRFhYvROQT+|2z%<#WDLpNu;=t!@@vv^ZiqJ{-5HQo9CY_Uxz_Y zv{5t4>ckhDMW-8S4Qv`y({Au_gE$g?6P^k(o8eb=XcTKmU*s0Rx|GpnhZh&;a5WX0GO2l70fIti4eC=~9SO5SdOn&+om z@tMa^&P};LI9*ijTK(koaPdy~fZ!2sBKXZ1T3)Qpm^I`WyKaM3SwgpDhXP#A=1W;L zy;Ae&%j^7A3BJm+7HJkZ@gWQ^G5-}TQE;FH%Hl2aqp8ST~HbkUh*9~YXN@$?aiOsX*urHVL+p4Kh z>MC`vu$MXm))h3|j@tqNgsQLGAFX%_gYNJYcH6DEf@nGOq~8fd=dphw=P-p-_wBQP zb?)2$o##zLB^)0<$n+4JIO+pe8xdxK^D_Z?{V;rXQ`nd9@WL3XY9{QNS(QF1xRp6K zJQRv(0h6vi79*eY=lTWLNNuM-^r1`s0DGeu;MqlYRkZOIEb6cTn1{Yi%{p}9ThD{VLjg;*MFR2D?AAjL%6;h_Aaa71fKBr|OC$tbu7hxnY859ZXJ^&( zx7TMQevz&&fKR(X$Lmwf(B-uWpyPdh{4gwRqHD$fhw~zZKmY6FP0DoCJ@=0mfsWSa z8~n9;x5WHByBHWi@~(~r*z|;<&P(`Scx5egdfDaaa&uLRzXKWY@VYH_o|X}jZA4uvtqneCs{bDu@4Jz4ztiotL@_A zRDct)9a|}RWUT}Tk>&F+B*^TNZ6Zh`xM?e6e&cja$PECbB2gqvHnC(u4E+}Lw}m8;)_PGK z4ZG^E?;<)tGV=<{s-WRjA$Osd2@iFc^p+gaxD}BRC*6?Eu!uq)iKO2QmPWr@_qx>s zr(PAnXi@SyDl1W?_?>~MXzM&4jT4$yj>>6cqQ+%H2HNy8hua@oT#@Zrkvy-MOP z(H)5e{0_TVuf&-Y`&YJ>wM4>RRxWJvfLrs3VA2}EOpyFXb`eDYvkk6hbH!bH$bW3< z;%Y?O0_-U`O2_on?#7L<84g+rf!23&m`9`Ju;(wZT%4P==MO^uwGyN=q@0pz&n@M! zh?&Io_k*p1Q>&cd$g_e-4vQzUiMW^p-ITWX&V^7J8E*8?vp(~2p`iTeB98PBqGA|Q=g&#-Yaa=$(R z_V;d%Hs4&89~CR>m5KJ4$__4`9(uCBzdmkGFAGhgmCUo5giN=!Imc}Fz3cDr_^f3b ze>y*VyNt?`j=4YW>k{^ReK~Y`QEgs-Jv~b?5qrD1U_my}K56oB5HJC}{A^YM<)8ML z?X#u&gp&?_wIOw%+!v2W8-{yh7qv$PM56WoOGQG-;mTD<8;DqU28@O?d|b8m&cL_f}hV-?IU314}ze}EB<3k$pwEha$c zQWI$@slOrE!(sBY6KG&g(|4k1E*nhWbl}Bg7TTYOIGh%|uyZT9B@Yu^F3W^l9NCD5Pp#-uQLhM2uu0A&oC{Xo`pLm+&Cxh z^N#IG%i-Ri-jB1gDfzR_f}#J!E@IK54V}yPqzJX1DJ-oN|Mo8{;~(ipK%$u!%4n-- z7_vq4)E=bKD7%oggV2Q4^OZ^{n9F*(ui7K^dq^sEv=`G2aRLF7Y&4~YY^N7XxaH`) z5{u2ePwH`RV{R*JvgTwqvGpn^jl6Plx~F{^^r>F6+tQp2F1AayApD$+P9>H=xy#|4 zsvePcWtD@0kY_3JZU$>TAmF2Kr1emrQ6lrsBxf(#wbiG3q6o8rDWa9v5aFs3j2Y;) z%idu|IOet1MPSa*YuHCr5O7=1r9(NU?bjo(JU8vwscXmn!pAy{p=ZoSmx0}v(?#MBs&X5^6ZLbfL3Zk%8w}?4 zReORi$rtNY6Pmlx>mSvA`u?2IjXY2a3$?Tcm#-uyL=)9gb; z*?PHNPU_kBioGt@>SfV$q4TQ!?=Ywb>*$bpm=&LwD|{^047{D0)f_*>@GiU<`zRr}b{+xMCLl&Q_ze++)1j)cb3+70Co9%KP>GbkY5oV#W; z^d^04+-(5YWfM$9`)5ZxLyRv4wPe02!T$^z#DhZ*8wxY;@2z9CTh6kSw=S`VtW?Z=4k*5MSj7x5!kigXf9L2# zoHSB~K^WM(*Vz~K6gCxDN%-YAp6=za#A^Rb!@@YZIK9$OGXQZcgddd5lB%Y>WU02! zq~}|;nWFfBrU+XL!knVQ{eWi3$=J42Jt94-Q9br|c;;oXwTC6AD*QlaiA?L~o}w>K zhO>uqp2e+xf`@WS zbx6AODl*vUw0Myw=&$!ygnplttODKtX#nNoHCQ2 z(D;Umq|jpgF1RWprcfEz3m2Oxp5H71F~dXl>8VT-_-dMvyklt%gC4R4)lAwPDQ0Bk zw^zS>%f#E31zudV_H(~ID)H7IZ;348H23o4QtD?mwP-WBS337o}aa9HYs_g zzUjVT55^QN57*f#M3Dtvh^%=HHiAItT)135wScWJW{D{*x(=y>W>oIl8o#x92g{kq!&6UuhQsNUZLFJZubKwaEdU2puNu1+g)i1B3zzCv6_oei zZ5vp1$n__ET?anyOl8Z;q@pkOQNQ$uS|Cto&q&MVx3JmG8qV8UFQK`kMAt zX`5tk5o>Ju_FtH$mBT|~**E1h8DF*GsfsYnVoWb&Nm)^s9OhR3*tl&16GCO&0%%u$ zxQVT49s)!{KwG`PQ(f6{FzlTItHL!5B`?O^S5hX7?_S~cRYD0P zUG)uWX1eFYIlGh?++!DDr(LX29<^5k+!`bKlifD`@g2#RpVzviL_G+J3B3sflVQl#`L zNy6TsXm3rfv5~BdDUdfs1dHGdflZ;e_lK3LI$p-Oc`1ga#u&1`ae+8C00z!(v&l+#390^Z~M%98K=Zxu}z z4CN$$R^_0u0?A6a(@-_i8Km?9)RsZ;H@t`Zrt_c%nwg%1%5H*CG8*D+qrf@Zmvkem z8*lM^NDfp~u60?KJn!hyK6cxL5WBtKfI8w%gFIv@IiJH^>TozxPky3~+21EK#Nh5ROC;I65DH`7Bs&dB#c5&H=SPbQHao z$&eixO8&JLDXY-z1K%2N!lK;1lT*ez^-QtfIT>-oLC`|hk><57i@15hF9GGffUa@V zaix=fpC~cxMmxiTos^KLmlT|*0sUrYc}foPF0KUrbf9s}+Xz$u^WJ&?2%D1@@UqT3?JV!#bj1}e0vc}Pi8R0b-G8i~J^ z8N$r3R+Ep#qA&%+#GQ(5rGp=vK$AE!06nhBuO9UL8ah_lsRtQ}BJGCqi>UsUvcFEq zg{eya_ptte0l!5JXZ4wdwpvc+&b>l5>0BJE(cD(6^iUfDY%jipm0exQG^TFkpSAEe ze+siom?f+9Qre#{L%^dWvirawQJamX+T$z^R!!nHW-2 z*!Q+QXJ-RVBN}(6*hFIQ<(9vm6=ZriGOwh(>=^FKl=k8lZ>mM#mpz*kcE3M{BP)Ky`;RHrni5NPjiuG4n) zZcqyT-PZ6|F98F;pbqSw0xJJqj;i0y#_|MuNhjv&8sc-f$_Fs0V^3zN6TC$)!207M zJv3GGC@;37LC-?Gi-eukG+-^)HZa(d2E<8NnGdfTJ5R3)>)f4T$LFD!QTq9ob7wy# zfB2vYVo8R7U3WTkyQ*Ftk>VS!jW}=EQdab1QA7r;nc{T0N!Lyf(Cul;YIYWRZmeGT zm>;!QmHO+?L@)Ut5aH+Uqqq#Eow7meYe)QRv!aMCBjHtU6|KcEEZU0tML(D+bi$_M z{jNcOUXCYHCy^ncc*+1cs21Z#{lmnkI>oK_AA6-ufjc{u8<#`2VpzkoAPgo`60CIy z5Y%uGC*OPLKbxf(fYz`|g^&>DtqMK^krvS-2lk>OcaKPj;y^J!c13=i8x+p4@jzc# z8>f;9LRYgnIS$Hhb~jbRZ1d%RT<6rInamkn-&ga|ZdFAEhz!f}c{( z&zwAzYW~Xi$|%CyrHKZ|b=9n91oG+!hKq8+Rd>@ET=!vB1GX80J)VrG9;D2*wP5R8 zxc|hY)moGw-?bY&*>05=9B&A^Fu5;WYJX}q8?|=9jv><8ZFKob`=YC_bp5))c<|zc z>dTNz2y#HQf>7C)6^MxC@?#yfPdILH>jClb=9wcOdUTa9YZiMf75ihbma6I!@%GE8 z;Y!&g0|#%{2WVz1B!)=5CFZf(Gzq#ykHn@`g~#bJVWj9IO_~^l4YcLx<+iiq41L9s z;yzgCiH1__CE;UNtyjQcz#gZlD}y1TdqczUm`PmSpG0-teB2#o+wN;4vj2kw}r#9=0K2M0n1>}X;mj*|`1uF(iH;nmfU*6Gm)IF}k@!Fus4B5$wcCUXIBoH+$Pjg(q02O3Few(3D ztSmBs1kQFl-5&8u$^dlBbDa`CoNxSF=ohlm6kc~-?OSSvW7JnsEkAK3#%v~8;9RaU zsEPYt5eJQJcVyh0mq7EKqK~;!C}w~2NG2&Cj47e)c@+F^>B!qn3+eIQoh^ftO9M5=*+2bI$n(6eEm$e410!~Ax9Ejk7W;3^OK6adIcl7bBerb z0C(6Mtli^XY!x+}k;G<%M`!^xd(gRJows;hS=ELT+ByBJz%l`IMfa`X8X}SfGCKCQ zgx@VXhfSG7uo3Yb3CBLe)c#!MveWsF){c@=l-Xq6_-)^-4~q&E4GGLh4Vf4?MmE+n z!Any&SI=bMeKj`2jyGrkp583Ppgw$zdd*q3*zml<#j5FZO{p%ES1=(r=r-qf&SHgi z^%dWZk3lVXz{odr7{+>EE%URNQEh4k#pzrB!7ZRm&6*72Pv%7LP)m_M<2oUb&D-gH zZx{k1Zu_6bE;cI{%m1Tb{6EoRW@e`UdYv0JWF6PJkh_jGPo%&w#+!>a5*kJwIC>$& zYsKU5dRC&uD+slvx0XJCh9Yq{krfIBbcP*th~2zegb*D+da`NXQ;};^khgks=1eOJ z7|0|m1;VM!n0+Le(T_?6g!?bD{1A&}d*yiL=-zrEk1Zt!-<+f_hMrcD0B>9NU;?t= zLFmS2(^FmC3hnX4Q|q&$hB%!&ST?&^DdR7jEwE;9m%huWrW<36{| zENR5KbD2L``|f@I6M+f+tDdO1rU>6*!*Oqo03K?)-DQ3s`L%$}Jt=3H`qhY5E*L+^ z7dj;=fr?Zbk;r?D;#e`Nw2uZyGz$5Y(@mr|ntYQMCecSo;4sjb;`SX5brm2KY~qt1 zUN?h}DUjefOmutsd)n|Z%t5yTEhm`nd{lev`HaX(R|VD$w5J;C0(%y!xbPR=E9l4Xc5^NMb&J+b6|=y8XS1&#%lCGI zF{bkMG5V$C%RZM@>Gv)b8E}Ad5VZ9hn1574-qttgz7$FtWn}u^Pk)ptR+c__GO`V~ z43uxI=@(3W+A3q)*uB_TF(^?m823UEd(nrt!5z1WjPM1`P zYZF{m@X$&$u0kFfI~PJctsyB5Zo5%!?XCJ-(ssnvJf?`dr6V$~ZqiJ2Nmg;*> zASNpGaR*lqhv1=z6cja9f&*yrxuyS&ssGrwa?(iuA$lJ(GgPH**k2LEG`Bm{pgXiXCBwHn4-o_oR{`c z`HmgR=26e--4V)8=sk|tGFwb|N8ZO0^y^g+RKSM|uJZ{&_j-H<6W)?da3Dp&#Amy$ zZzN0vso2`L&?6i!dTWLFQ$BW&t~`IaN!Zs~_hj9GtXDJDqtydgmLhLM!0diZt}5&$ zN;Y^DeyyR-Z_Jow7l1v`HQo6ULc`!|iad-Pv|InL@^TtP*?EwENa?UaZMrC zwX()UMVIp9aUa(HaJpM-464m9uK7m@Vr{weoWEOK2Y=Ry*gN}#2wl!E!vm^>s-+tu zKF?8VugCvuS?)wlw*C5z`;qHq?lgJ**zGwUyxvasPkZKraqh4D*p;S?12R31@#l7f zJ)LmCWJXmK21W1CaUn^tuq30TWQ+;wKqa144jZmp?UnC?Pw*M(8L^)DKi{2itgP`! zREXSM|F2Sd>UBOS9iXEetKRzM!R;oE-AvtBsU?uaC8 zCV#nl<$koV&|Yw@TB(QXjq@2Ee%|Byusc>_$dW10q5V0~O&UIFl2`gb2qvpT1Idss z4bRuO^>v!n*Ic`jwO%>I(wm6b%mOY}#BU<>0;q(`ggjDc0Q(ZQF^6U>irWLBYCIJs z;fuG)6376B^Zm?ll2$r16zhzQRR9ww5J6YQPjXmkbp+8iO#_SBzep(1j4YqcHE_E#D1?)Jk69MA7Z{Nt| zDGivRQfx4Xs=OvLz-j3heZLk1Hs-`N3AoZ$LkC|nDaN-MQ3!*SoXJ8UnpR69k=8Z} zzqog}E0OTDWDVA4_D0h~QgZm<1MY2HtVy6)TTKMPf%PLT#&Zyw3*(T44I{&0n++Yo zoySo;%#*lVNUxaUmj2NGfDL0MzKDQfw79bxbts1`p{3m~ri@75tYR$eJkvSEbpjp^ zSQjVDXegaL`?w>gV_2|zClcQ;f1EL+ol$e`m6n+!%TKsy0s6Tbg5oT~5O{c9q|LoJ zYQ&~?q`(7Wqll^aiT#ehY#eIB!oHM}sgT9e7EnU@(D30y zAyR~y{%ZeCATje1?U~#`ecwWEwDqWd^-ud5zMo2lF5g`-g+t;43hoG9&`SiTfyfjC z#A)*$8U%9laW4A_P4t6`jHB2c?}8kfxxRi9Ta91zY)Rfhxmv;^54xHmCGY-jya3zV zVwOc9@^X?(sJP?}$V)VJ2^G~j0Jj{bPeNJ25;_T44=AL`lW+)O0`0crZprC1zs_co zf)FM40VzJ*QZPo98z+wGauOJA@`Q#29HoB!trunT0<&}n6?+8}g5TPKLS_nMj9*Sk z5o*hdw`DRBC&yL6PK#qPjr9s|KS6?C{h}~j6CJVm+d7&cyKqrRL1M(5(1pX$x>Iz1 zkxGqUM*^1fU6^1;%=4Qwq8fM|so5~Al5(6*bM`lNUI>^Z&#)9DB|&kR1g8ZG0CMqy zAkirPk5Gvz>WFL#wwo;SqX6g)iw)A({_ofAJ!S&^o8a#hgZhWlBM^%dY1bg6@{SRpvWe1#17D%IDZz{sW~sNj3$ zC0L_aOdPY=oo+;mR#5?wX|W`>g3M?{ZH@aPf^F7|pa7*myIMA)S>iO2av(HPP?Rl} z`+oR09T+xJ-z2JU8Zgp`P)vV|GCzL9xvp*&>FJ`!av0nph>!kp9AMK$obPy)O=)FZ$A9y~x??~7g$5sW^#yj%dL>-W+s_5Bd7a)T@*YNC?n%loOOeF$zuSnF) zgp!v5l7AuD$P&s_dC%d(?8^>k*fy(mACirD%l5F-a->H1;CAAJ%UC$g_CHuCBo8AUySIL4$s5NP0W?F^Y1rOtoOEpZ8hiuCHW5qeZVP z5XaeR&-x$-z9~lPgYZK4U-+oDn(-R|KxiQBdP1Q6n42S>d^Y ze;;x{7Yi>&qs2?03Swi|X+Q&?+imeMfT}eQ|CZx4AR8mcV=y1K-iYh?yGL>L0aV!; zK#jz1BAF{|v3Jc2o`?6d|9BAfBB$*>tlSD$gY3sX#gKsd`Kz$je9Lmw*& zQjV%!C{EYG1ytgK5BAhu7{Asl)LcIf=t-d-*MNZd9u8nZ_t_^g&PwgxVOdpN9HgBE z-X92*2kw8zI=0hChDS+0Xd@n!KX1d&_ddJ$mK&BM4W;SllPNq$9|EkqhH3J>J>KJI zbzgFS70c&{W*!3nw_*5wwe^OAD`%vDz%95v(T*U9W^rl*dxG&27}hsr0FHh4`bhr5 zxp6Boczsl5JE_S`BnkF+nY?64$T`ys{H&B6oOXf3*bwy}XZiw%#4X7ZOh@7}Ruzpc zm|xg)qH+;Q#64QYI-h@76MGX>qvPl1`~V&;E=)TV(&HsQkj4;a_fzxvAkn`uv8N&jL!&p# zXh43K17l<2Z1yRDtTO%TasPKf2okD{0*sBB`M(g99_j%93$p$fzDYp|5q!b_Sy8os zGQj(Soc|pi34j`={DS{8Rq_Yw2RSHPYOg&w+85&y)FeC@8_WL;VXZ+OL4QH^rhTZd zshy4GKPE7mKQEx(zYf6iUlScnbREU;sg(5~?P(sp1>|Oo!vJ_B+QP0A-P;ozI zxo*2|y{;2I=uF=lPIp&W0xKPQ5=zSI*h8Q{(SnA;BO(Jxguse2gRn4dVwcc55hT4p zuk#xCAsDM+P(uShBZtub<^WDU_^3fkHN(3<&@37Ax;m+pzQLnIiT2bXTRXqu(mz`g z521ZyyAf+MehZLr!rwp(7Tc#mh$>9Q!;cQ~Zf!4&b6TU9bwSV z)Te2J;1(|A5VrwPf*t5L_P5HI&|L-K{Qkl@N6Ih{Lkk`r6Dknk2P!MBv0(f2lz#%D zcq{F_0mKA_>pT)lyTHSTW>N+&BqI&&cQOd{Tgy{^PY;xne|g_|;1a_|*$3J6m4^PLxwplA3Jzk%R45 zoDh=zAMq+^7hwS;v(Uuop^v$pROgI4SQjUUr{P4?S8#o~@2*$B2C$$*U;7AXN~oA) zZcx5spdbvJmsJQ9C1&>@j0e%iIR9T`iFjVV7BJk{;473FO-&et%A+Ar{%LZ5m$CPJ=I(DOv! zXt>@3BQT!~vSWW8CGQ5K-8|3|32Zcrf`$tlsGTr)5i2kuSmH_oEW%ZfCG?Xi`!M4* zYq{Ubee!;eMFtz>JJYI^B#}RGmzB%OiRRCFJKW6298{d5P4nVPf_s;m35JywTyWsa z__dfGzr)qJc%^mRjWl4USj5`CP`s4j3L0er56DZ`D4XyI>;zP&C5aAEu7yi}h8>IR z8E#mquP|d*F38yR5T-J!eH|Fgi-utCc}uvibNlnzeR#2D*>%Is?MG*@h>x>PEAAdJ3C4qX^)kz`Yu+A4yj+GJt z!@HW1E+^ABsD{BgcAR53p&IxSP0D#ll`B;~jmNk4_FMP9g+_}$F1&()NR$)&%sm{6 zRV5?W^`Q7aGItAD!Ts=)bdx!wgz4al6Faeiik`RX6MbZ!&8t=Fvm6)>2}@Mk7q4ks&LkiSyej$e*U{so&PdPf|B|Rgi-@Vw;l}btvg{PPfX8ICY7-1Bo9(hm9PL$d^N>U5qs>rWq+A~9}_B3 zb01{`{$-kx84zL!B&s|=G7XAid`wfF6NKM3=euytwP{(#&4_AwC~Mp(ckJz-`Qmed z;@IvDjk?Hdjq5Zs@(g`zOa0;kiFn< z-KNA*clVR#7{P2DMeSw%TU*9}z~V@R(QLfZ==}ih<3)V2dD{RctEyDg+r7kKQ)o{` zNp{GGad`)2P^_XylplD5^C7fVb`GW6(Qpa<`k1y zDW2OV?y$NqB4=}W&Td235Jymwd~qix6meJ|PIOrV&9IeAhZS_rQL9t|d{w5y+|M*} zFQL=rOby-U3no)3j)vjuWa7kG>*evXn3eZ8-@6}#(`LXQp;ohg=Eob9S_reYPOUE` zrJ4wzvkdzjcAuTsh(B_H+E2vesTL>0Vw}$u_Nf7_6NznR_ndpGL>LjRQ5OX_DNBjN z^NHdxPwlY$-QM62@fHZcRnlZv{GNHFpBk5pj-d!8N!RmB^5>Xj&R@=R`}6sSa9LsB zJJpnm>e)TE2+wsncUvjsg-9Y6?NvI)Poa*d*~!8%++msp3^VP4@RTQG5j=;32reYr zbABZ=D@~-YugwX*MGLt0#lr5*(@@ih5g92^zUOa#vx%;@OrD8d0E_ZW_)c z{VjW1RL&t7D44w+tD@7gNL`%B?s`34CUnpYg1R|>Ba)69l&FFZRO($c1mw5x!&Q3F zabg#iiuG_3m0n^;xN}&C9&L4LyrT~1_H@3c@iQb*ZBlj}G^}L7^A@#db zoH3$Ro6Qj-QG9lp885A2&7j3+Xwg*Y2dkR2?;-`B+bGOd^sm7$D<~1Ok=4^l)}?0F zgW5-ZAV$_6SrPY5dWe#cXo-Pp>Y{A!t;%`L$p}QIO~QkKn6>I}7Ulfw*j9`$P2n8J zFf#9e5&5gM_ucEDj)>}rfH=0s{i#`%8Rv~Lj1!roqRcmQZyc>jY?!k$jq;?dPia!a z@Uu2n^J6%cwRL0EmSs<;0L3(K&DL#YHw%^oSqD_@!a;czybfeaqUn$;oUj*#8lmRDl15>y2^lB z2VD=UFCYK@oV(5NrPv%`abYi-t`75@-WJN`PhK58v9l5Za8;`xTt4BTQqqR>Szh<^(v;0mJtL6J{7%e}0PO7*iMx~wD zvOeYwxFW|6Q`!AgO!w!Ezzs&2OI%B!(K<;l%WOINEXnw&j9F{uOf*e2lXvis$-1V9__c+rSY< zU{am`MnvXmp!I8NOJSEZLyLC*vrDMozF3{Y&$Fhd>u9!uL`skK^xQO=aC$0+Vhtdx)L}#Xjd28L7**i$mmcZFcr27t z6|}LsrN{ReCg9I>CY8Rwmfs^E#4e2m04e+D#+q^ZL~WB@3^N_ zY3wl|-oyl-j3r*DjNh`N+%V-pdBCNXibg>eS$5Ipa;E2dFU3>HQ>R*edb)7eV-d!g z3x-$&WQr_CzX@^9aOET++n;K_rUp^L7LM$&RGI#pqHZO&nY=>SZdGVA&(bVg*oyiD z_vFck1;9};q*!?)xEr2jVm*Tmm`wJ-Z89~_A>&fjY%t#y;E9X)i1nRtEhzYbC4YO=4{D(-{df84yUKc3D!UtjI62VrY}JUZaEBREh7VL zL=CC8U1PhiQliEm{~l!=@`?WZl#4bVe{O}p2ARx)H2W?DxoAkFzpuFs6}gxZ^2_hX zHO%4m90qw8nK(4awjplfjes2VcnI5p%FyLv;3>=AI<|K)XY8*k;4WD2dg3J>*-&I3 zmEzGI0Q2T5fq20*Ktp8V$yz^MyBt+vnep>8V*e7bwRQ~Ai*5d9+A5``hUV+Ca6z}V5mbW88ef8L?b8G;Ytp#(I({m@YOWiP4GutMid|6_s&vMVR53l z+bBb?@`c>nQ=uu}5%vsCzn%ASeonLmXm`-^L3#O2hv`*}{&q1^p_u6e4Ox6?np@DK z(mOU%S~#P1OS)piJx!aEreuqoOV7pUj2VSRL8-zTEHeQvAVL6qh-Ly0M|1tU28u5m z1u-#3phf5Qnv%JAe*M>B{a7d#dx`hS(_aBD`&%uo^4ne%*FPs%exmyaGN_MUE~UiV z`ad)Z_lA=*MpZC%!oS4iaJQ)!y;YY6ez$#7U0tvzvRhBDE*DWe@Nk^(h%ynWY#(=# zK5%T#a+#HI1RNCEAT|_t@)&O>S7N4lS5jc<)_d%b~lb@dptdZpy)l| zH{!-|e=X#$F&CpsMuPBm%Enl~6blX5R$eH``pfRvl zJ-dss_*<-PYrHT}mOJDwx2V2n$}OULrG&loB+4HP0#M#?oG%Y9MqjuZvq0tKg(tXP z!m_XH+CRKeKy=N~z0dxMn1;aBBtNRlkr89FX){}soyMtb_(c#xOJk_>aenfBNgX1> zT<)(tMwmCc<;Rb?0<$hPl73u0RX?)awCo2KcJ#8p(EJtX-_I4~=7e13yS6QrNn|bc zkh=J#O@JI9kL1BX%{}+|FAAWXVVpCC;#?6;T`smTon?88YZYeb_kB7^3&o25CbRYQ zb%~?!E(Z-``v@Jp_yFc-k{}#a2TnXvu0658dqzJ7^kOeN7xKbsPj_yw<*iehkMl%M zs=h&8)K4uI$M@bFy#FC57k(~hR9ps|Lw@*;#S5G>e^=jrD=1GUumRQkXuX~|oruBp zxTp=jh!%EM0J9FE5qou^6}+Gy2(2~;msM-H5!7t2^?iOzx>?{Wmw(ruX+)|NqM7Zl zbeOResa(yloit3b!}4(SomeEo%?dy2=>o48h@R7IzBJwLz+ZPZv|>=3o~)K}J73MP z?<*SEn(s)pzPc0; zdzn9x)$jitB%fVFeWf$`tJiq0_-!>;3Gwl5!Of8-T1X}%0~SLq&h}`OC!S)+zEy8f zW>T=bsqsa^@F9)D^P*^T^~Y#OBo!r;_7rY;E88xdf@EgmkujnQrLQna?PamQWNkBNLv&T!tpX>vmkY zW{X+B2jAn89@kHho4IQBd}}=l3BH}Lw99h6MEcq*el-aW*4g8#8;mtIFIwmmnF_qo z-BP|tMT2x^`9>`xKy7z>k1aXlJ~T;qz)ppvU#{s7mV{xNpIz~ z{J}&!rEyJCNWMBxfKs5Cb?Q)6M-I63`Q*WSo00S-N1zqPa_Qc(`AS$j^XvK>JlB5~ zC#MlNEz(+Tr%yLJ&;OY#wl0#M_iI;vGVaSG_7qxGUp{VVz6#S35Bg2kU zkUsI{{C$;E^hKAj4+o{}7-#)2NT(8;W&CK1#ZonpaD8^AZj-p&E{Fh8=qEaN4k;L&+JnC{#x!fbF1>3Lf6>86PInE zKX2jEx42{O&BM{T5(h1X>>16E+fp)Z_2Isxn#3V8)(SjriA|o9u@hk4)_M$xMt01D z+Q*mYUgy$IJ1Q(A{K*J&4VTZ@vWA1MNucvj=|j!cav*BUcQk9v=A#3J zB!61$E3!VtJm)DOvtb>33X@%ult;1Frn!CkH}R$=plBp{?j&r`Xm=_!b>Ako&+;oR z&xgZ1&>K2aXE`lRMGJt^{ZkouJYOM`S_G$>>w=8at};058M7HCnhq=(*^XY$ z)6~wabM&D4pH}fC^za!4yJb}-+MynQ|HV^Sry@aJFsf&2ubgy8DlNN*yB0`*w@0s|vmq9*8mG*E zG;x8ml|&cFm&^fn?PQ_vZBq>ZXk%k2(U~7^!!SQR;DO@|rY;>?Cc&q7>#^*2c*^*= z+P?!JMSKju{_AaL{f`$Nqq&U?+7AYdjrD)dZv_VEWQ;HPA1^va>Z=GeA{Y}F+kbr9 z5X|h{tZb>Z#b8uGWwW_b(dHaQ1m{c(Z!pK@oD^7ed%Nzg!tN#8<^SCfqvu=N+xssb zv(ld_r?OuyFCPm@bF%AP%&Rtd3#g?Il1~8Kb=+^__Vz+|6Yz2yAlk0BqEwRNy0+T7 z->toI@@lzvscHNeFMoFzoY8jN*&Sg9YrH z+(e~62nqKO1Q=~*kmR%qSRr^TFgK=}ZzH@oI_Y?zMU&C~95F&R{^6BiJ%6{M{NpR5 zYo7%xxdE29!Ix8LCJ?SQ(CCTJ5>WkUe~-_W6A%v}C|g&_;qGk^S4scUpa6uED|n$M z5LY}hI;wpD`mHf@wZ zv5Zi|{)}gBXM1p`DEoQy9{hX;fs?k*^-V}f6POWfgbx5Qb(Q3$18eSX{0v;>PWy}u zNi1xQJ_VTbz_>u<5%8lb{bOPP;}4Th*6h!}X#cw19gQq44F2y?JG7w zfFU6?F9~hkne7CSvQOS*oR3$r568HtZt0badKa zXWelBt~eq8J;pQFfWG-zg3S2?gt$~^pPCT?jjhS+pPF-kL^G3W&{kisocm~4? zyt~87b^y&PJ|PFTtapkq19|E1nQ;g{Y#m*d=J%1?%DRgOX_(DD+GU^|(Znik@59Pn zm#fxiJF#e$=(M-)WhooHV}t_uM_PC}DXRb5?zm|4(Q<)7LXKZO@?T3<>ejEh10$8q z?Hnbg1qSaRk}MlbcmGb`q6Z4ssoOzfphonDL#8Tn=v>GeM6`TVkh?fa(A)QkgNcWa zZN(2^vprNX69YlA*VO+a+e;(?#AV*IrJVD{|EKd&1DGm~d)<7J9;OKp#_nJzo5)6Ip*DorTEyVxvC?ET!9SJ5 zPk%(&feQym5%TpYy0X-=E(yujX)H7-y|Y{hf4aj4K)*Nl;@KSbKhylmN>2*$X zn=Br+@E%Qm&pQwMaz9P3}K1AZIKI@fSKKvXay(&K^&0G&Q1n(;)x%$ves zJ@(o3O3KecDz9p+uG=0|CYk2-qB~dK&$P66){l~&`$uWGk4I^S#cts{(@fmIr2cR? zxNpT92D19q%>hoq-$bX`;6X0N#BV0Ar>oJB+)!G5Q8o2ovLT3s0ho%2M4%DvA+W55 zRCfx3E0K|ysADI}DIzh|fw{N@rO;`vN*W{6RUhLYao>GqOV+=TndfWuq z3NKCY_*qTLIOVwpyIx`(lUZT0;BS_Ti3~$CXTeYX(%fPJrZo!9DDB@En~U3YYzEba zH8XU({4tHnYh86X>fU?P5D670{n$%|Ei-LSrH6OMil$Aiq{9~Pr${Ve`AbxCJdDQf z;q^VAy^5;)|5^eizt7Au{AuX(I!`m#Jf9bLVH`Lt8GZpN0Y7VpNQHN>t7~|a43zrS+J3h1=qn^_JKt!=XFWrU9kVqh zrY<+EvU;H{S3Qqt&(VgV7Uz^@YCojO9FP`I_oq<-DC?C>P7?{Q(mZEfd$H&VY`gY1 z5c+rx2j(FPFEgl1Sj;2Qe=X}%NDQ2jY8+J)@B}gtuUSM3Ut-Lze~*^=k)B$wm!F-8 zY0Fie4Ima2=XUD0wktX2-kJo@c@_or5ME6ntSu?Y-25|8%o60ZBvP`(395;*c`7O- zg#LH})ttG?Cb7(-&F(2#Hp=ULlurS(jcdLWQt#fLQDN`FQy0bI=_GG3JasyCCPaC>zXmMB}8Is6WOmSb&x6C@sowEz7(W9V61uN477coy?udEF` z7+~>C%jY!n-32ZyWlphxYxesYb)b|pv!xSg39>n;e46M)SsF zmdN_@f)$!e&B|9=EQXHQ=q_?QdW%F#8l9?Fj;zJi>3u*niva#0+`rMK)E` zGZ9{`aTeF&y(!hSEb8VrrMiOzByNFlo!;ZR&dC7Asis( zTb2Y_?JwWS3rVXuvAPiq5XT4C<^gaVc~F#*yf{8&7qf zV!uYyf}eh0nJsfG=^UW~Drk_K&cd!y>`Jr%O$Eu47q z6LN>QYjwud_=fb(9O{t9I?LeWJkRgI$Y`NEc%HK!;S%l6BY04nd-8u}M#iFhWE~&1 z*7MY(ZIQH{Eu}s^naa!_v=e!}`X^zCYu4a($=iDc0~O&FQHoT6>`$eso$@n?IXo;I zU)>q;j)_S|kzZn^o~Zjcv1@=gHu2H+zU`%v7XI1*tOQMLjqUpks~gC5*XKx z?W=f$g4*N-lquYMU!hDA&&@?4B*HD(#89YGtTeRvvlYd+P^v6vI2BIQG4QrqNE#4i zvF{dM=TZMHuCxCH#L|`W$}C5q4k_YW(Uy>+eP6<9A}(!lU{S=#F#q|_2Vt``(DuXLaOKhH@cA^qhCM9}WeLyR zF?G+eN$v&{$_@(!ogm$LF!TDv)=HQAt;oQEBhebK01RpwP_ybvqF!ya9Sa9%x~Mxz z^|Ka;4mCk|V5Cwl+OS?ee zsWEK`0d0s|`U;IsYkRPY?MX07b8&hnJwc&&SX-)Pvuj1OMr>mL_QPq|m||U}I>F0j zbm6N|S$)_N__anYz1b#+@R0vf5smNf4!Gz??YG-A*L1zviFPG=k$@wmwOAk{?Nc3g z=0+1@CX}UpgJ=>+r^GVV)JQ2nESCs6>XfxspR2E%1YZ&###*l+hy8^@wrbB=-*{>7 zgr#pZQHu6-Px_kr+TOOZk}h(a)e8O@o0F(qISxrEDqf)Ha?;+WG{vUi9oB-yKHiRX z+S6G9^jZ0?QG}n&{VwMJ{L>PP(XggY2;K_RQT;wTiGSnP_)bLi&a;aAIc*V_nUy_L z-F*2SO0QLs#R0tx;3O#0Ayw8;m>>_6V;zqd1$g@^i+;Tr zZ~p6V-Rvd~!SO~*NT_z4(NS#b_n)WKI`C}+jgb4$Y99}*_AJY69ZnaB8*7*vP5y_m zoz4C;lRSYvB*{kNdQ1ppxX#?mwH7}Je`65F9_wO3Ime^bMSLd({trAhUlvHhAcT7j zpmnPO<=LLU0uhQzA6r+Zx<%Y{;=J*Ge_k$dZ zi-W~E5QAtq*BAOL+c1(omL?9Jo9RP(pssKj@-m5*;{sL6;U`t+1F@X&IAn^mXp+Xy z_fg~04qmm9M%^<*mQ{MegD2CZ1`0Df!P^;8Lpa6>XJ5u82Gvp(_MWCBqo%0IsG;u& zNm+SN5Dg4kF|u3Lo$@FRBYEh@-Yf%flqVsxY{JYL`r&eFXoDJ3`SFHjt<|Ucz&nJj zA{A$?(%+?W!1hkj8Wv*X1#w+nha0Xb9@A3SlApoeX$HZGi5+DDR)vD^NQAW~jL(K# z_J?z=$k&%Wx6k#U@*SX{8idJPVBWdg@6c%{2typ?4(^C8-+C2_Ig(PHq7Cn~a&Qm@1P@UAoEfK12V!cKOJkLDiSfU3qIZu2kw zz6ITWEu%}%_&Epk%)MlD$(0RYiKR1QSVMiV&K$dad&TJ8S&5tIpr-M@G#IpYIADIC zO;+yAeNP>Id&~%yuA$K`b?hfMrN{4_*9jO_J}QfZ+vC1nX^o-=DOk(>)0b2GGlqK% z7sA804YlM>I}Aq^YcwBPK$e4_Je(&6<2egKtw<2vQGp=whxE&AK)azgrr|VVCk-Zw zyYWZ68h2-K4`b3;>(VvZ=$l4;n*>W^OHwqVhOVQ>)AwI!&Pon!3-o5fZ@gPKlMZEIXYj- z7@i&Z#1`oOeQV{>@Yr>_w(emj4voWpVKu9m8uK64h}RNpdR;?@42ITOV-)T6V+{fY z54Y2K$5(krN{(Rs=0cmYi*mVR9o*JE2@=@*{{eUvCan8P>DEG4c~TPX z=cpq})D>ic`07iA97*G8jaFuu$1Y>?3Q{>^iS;^Ds&t~oEf~3!q9(kdy0E<8=?T+9 zolYSPkmMW@s~PF1f$J?yK`q1T7rYV#%`z@xu*PaLYNerMX$61u!tfWq(x(RzfjBrF z3wbF3hMlC-p86JXhAS*E1P{$Z^m!#p_!ZhU*%~lh_2*wwz3F<;5%^?JsejPdrkcr#FC8(R z_iNp2RI)Mp@J3hl2@f+z;)&5L(TuKEH?QGm! zTLX$SNBl%{Lv^u@~7H2R7< zy)1CKir{JOxsNu}RzZU;Q1tTelJ*G`Wm|?U5DQV1}OUMj6GO9gVs(II)?Bu`k2o;90yU&@D{VB#9($6UKM1JFWay0Ibd4E zi6-@mf(CzuZroz^FL4Dz4#y*TI&HVtg27hwmBBtx$PI&GQjyv5dt%X}6~iGtXOuW^ zN2YVa+Y>NyZe!>U9)4sjv(^_*X1`@gY&DNqcjan0MbH`r#1h1c1x zW?)=T)s93(;~C_Q`Jz3N!3RjhcU6ziqmU%t9T0z^s?JCm-{SpXpfB$|Al%2w-{0#f zdM00Wo@Gn%MPk>{>;>dN5u~-Bm1l>hCM6C~c}AokRC%f?sTGc1p*LZ!ImjTh`Fd$~ zsk!?3JMR@1(oF9?s*Wd~NHb=O{A{TB$S5)yuyXKE2ajhVdDb~fD7mu5E<&f6uML&X zjQD@4zion(VvDXZ+x?n|vEM=-7^4BcrZF0->tlgX*<3RRJLLisEMiC7kifGWGY6Wp zxpA>G)Rhw_?_F#akCzLIxh`PJn#(CA_8|)|(Gl<=O4 znIGZDac`m^J=(DmKdLr-2fnK5lNZFG2+Vy`DNe-?vCuESC^5hbnVmQ@f?-cFpq78m z4=k%Z+p`dxNM0syrT!HAl4NLW`!i26MU_cW&Z=WN@ccthWJX!|^NyYLJ@*Obx4u~B4BwEM;8)C^Z9-us zKnPfZKB08Sw;g&>?l&$*09?5rOZsL68PTH_@=351NqzFL(d7umxMZC zIm359a+xN938YtfAps~@PltaS?oF$&kwX+%Qo`M#JQx0*3<>5>OJ~0N1pv6@w>%X# z*y!>;&s9P#FX-_@&<|Vh=vpJ}y8R@h*$_^p#f{pFC@I7uw$g&r7v0t4549LQdeAg% z(w+z^3Lh|1t`F9r`aob}JL#O8+Y!HENOL9Sh%UEK3jjxPTAB9~sfvH^oq9+4lFk3b z03}K*N#J#P{k#g-I!weV0)NN@o4vtKzSTKseWdj$xC(O$@6n-lD^EbwJC&?!J8f5U zCmu@^`QQYE% zCKfEzt=SJUO@vPpcKv_!qoYhT6nlO4*~iQ|iI%#GJ`%YJy*wF@pR}I=Z*L zXV0gl+g(d_9S>5_E6H;_`M9&0Zh(BtUBJjkd?+N6jfObzScEU#27>i?pdpN7Cj5-e zMwN@!;*vyJ$u-U|hN|Syy_ka006rOmHvl9)!=|KENRF56TCyijodl4?l(@XJmg5wzRU41aIH$l@y>!`3g#f(p%$Yo zW6vbz*{{Q`w=X=u%Gxxje+FJEW0NJ{ZWLkypHzef4IzzmW^(|^c`~C~os1X4kZRjhcNF2XJMmf8y%hi69W#}P0`5hK z&ED@2a=00r`j+fNo1!97&8$IvTaZm)3wo4#ta+P{CLHim9N(v0eBT~HR$TX~z} zYEZ=<6wLA}8>Qy(Apv^6*cvvOa79jv$p9n8{Idroc3XFXL)S41zJfCl+&X93^x3p} zX4816%C_Tm`8XtVXP+RbUcdC+vglX&r=>cm_{s)&xAUfK9=`Jy1va z{(<`WXS{#Omz64if#F;x2qc2Q8t*RxbUguJ#xs)+pKkQ#ET8<9Yc=gK=vI3$a@%S1 z%Gteu<4%JQtT+6TeIfj;x?%EGi6_O911T`=xnmqYO5lh8j>!JS<4`N-5?T?P-M){` zZY4b4w;eD`|MSE@YoigcGo$NqiR`l!kr{Y??^Kj>LfQXu`vK1!9mUs#5Lj)WPeHfV{uQ`Q{Sxw zZ~=R}CG6mGs8;Xap?dht-cI}bGRUXQ#X0VI;KPS_jh}w1NEsj~(f&EqM*{K6eFh~% zSXP;~7sX3(7)`h9q;D}HoIHl98wOVElFxsU3f~AmHc|}21G?J4JCLzLnHE?SJXh0* zUs|wQW_!YUsAzJ;{G}YyE{>VcFDNOBd~expUnBrv=Cru|ZpneYT#p>xA>Z*^i9H-jr|F8F&JS=W~QL~ZPbLIAaxxIB*&9dw`Na-q<|{L=gS&E4tk9}h+5S2qhU@VaVv~#jpJ*V?r#MBYurdr?WeKYv_nO ztUmkHElVEYZH8XCq)l@wQ`x<3yvYmEh79KkY^9*`n$mc=pPd*g#!7#B)@zLsVwb4z z*9!XFGI)v6|;(?e9hk1lnJ}u`J8{5hPY7n zv&f4Q{gDv%StE~7O*t6Ef?sx1~9 zMSH=_$nG?JE?H+dkcAdsf**e}Y3h#WrQlFHxxg?gOL2v1G^^O zmP|UyQW4Hg(%z-clZgNm@-pgY+AM9ir4FLR(jyHVK=Pax8hO+}53!(*$bG~RL-&WD ztSk0VD+k3al0rt{nkP9_`PeyfMMTIoKRWz=@G`5HFjpMtbp*VZ=-Ge%6)s-If$zck zQ&+*;M<#B#+y~R7=W&9LeE!nDffw{``s!LPoZ zavjf)PVe-P^2ubQcOndX_&S^5xj*x^+JMe$s|}p(v}^THD#!7l`=vY)ZE-?1%g~kh zdH8gZk@wDBuW-eDsUm+7AAgqZ&F)83Vzf$tV3JF-`Fu+K;B~1+D&I(nzGnR@6RL5JNb>_%WCDc}DHhOJBW48V}6d%7+?QWkq8)L%TNU7khv~&T#M5LF;9r zjsV@edh(gEJ;v6k)5?{|+eY*rw3Vl&X5&|6eG{1R-rJcJw+reQ>lyf2Gqr0(+8I9V_;)uj{ZZY429PrVJ2O zt^`1P?i#&BMWTfi5o(tF`a!YQwW(T7n5ZoVv2V6H%3^;hVZlk44vyw9QD96FA5WKs zII=h<8bm-IVdHy%Z4VY)#J$KQvQi@w!8t$*E-mz~wBaeqzf(8#A^u&z$q2l>vBKWb z^Ozqd*(?lP&4cFSB%!IxalBOa&qru^=y&IU=$Av>zmrcyZv= zY}YZTj@N(cTK-5vuA*mn>zv2ZXf(7qE^BO8S-MW5ajWkOB#y!p9+;K0Zw2&GBK%G} z%7IY`aKNTMfp}HRV=pW{O~@VXZV`F9G1Lzm9C?BS6Gf}XQ~$#_rL?9?FZS!=DguaYo9Zn22myccHW?>wp z{x&1L1N5UQYB)|Ge#fyRSRB89ib99cDK4jXbG`GEaYM<5RUH!%gav!k(@?B-q!D~> zx+j18#M=~n{Q^xsY${PU>Y}**fGo8;-?vC@c@Iz5Mt zN!o9DiEA^IWAPQvwB@jG&vLWV0tGphmw$0!T)!2X2f_Z4=i$0k)J$D*v(iJ{26=<=y;4c^vWYJqx#_3zz|03^Qi~G;6kHl# z1jzzn`2IBi3k|Vs@6pbaVx3b8#e_J=I=B|3CoCkkQ%gSNMrE6N4p(}Vx=2C)ReToJ zgo1LHMiE7!p`*(H6slzgK^`yBg<^le(Zp!5u@E{GysY2hhw{H7z^Xs~rzz(f#h?s(N#;5TWz?oHp!Pwg+1 z(iiW3Q+rVu%Chcx-@6kFWy-}YYj8V!!&}V3|K82vRQ|~F`t!*hh=g>`KoE(gaJcH= zx;Au>9g9Hdedf*X8N%^s8ZdugqVeLw9Q{%M=g`CQJ4+o}U>G0v~6q;1=xurd^HyMAAUl4$_iw}Uh zC4&CpH&!mohJiaAe|52+ru%G4KYZe~$ARrdPEQBy*nlRD>J_N2tNU^lDOit`1TU1$ ztj+%JB75$(^fT1USE#@3GY|vMm*MEFVd2LxPEMeC37vb?mnyb%GE(aC8*oDrQ^2v_ z7w9gm3x5W0p@?#WMmIiSVu?hhi!vP zMe&2H!*}DfEqx8=Uy#n1ETzEXtW7{rELIp^=|95nID(^JSI&R_@ML`;jyKOssXQ-w5upwA z0Fl__^@QIxhhmm<>0BgHQ*0nXCLi`VE^Lw0o5n+OUxi^AEhdM^slXrfTX$Q*L_z4w z7C19L?pSe98dVA8;gCT#ll05=!id|q@_Eoz1LzK}Xjy-B4dX=$S=&kP%oY^IkFJt* zdE-X}gcMI9fUfi3+?%PkBiK6tN%8t&u@!T`js;;-! zw0qv7JeqS(GAn=@TD_JwjVTd4KITFigbBi zojYA@U-y3`Go6Sw((bF2LtTD!5(T80U**Dg=)nJ^r(iKA(jwz6`SXimVelpB>U5$0 z((m$ns&4%-E#LI(ZDPFhHqq268*zOJGl6eLo$3TCL=7)ug~Q$;ca z&gUHoq*n~Vp&HwvE{|Y{KJXA=o0gbdD^_D|*~OOOTW<^RwG!5O*h-+<-l|C_`@`D! z4tIxDcWC`?&oyWiq;*)X)lCZ3l-;6V0g^y&eB(G;Ab}*drCauGc_u{9-VqhRB%~nJ zg!z90Sw@?kvvuIl9I4lrRPaFAu>V<-^796-vAeGqs}Z0@x3P3`&{peZ4XZ-Uf6;7S zsLySu9VfMPvE5PqxTYp)z*+>CuAQ=|i!{~C78?g4(GSCyxpk;r_caWxS#9xoEsy8U zh*1BwROi=<`_>*DD3V;r_&|{!1J-C^TUviR92I}{WwVLa$eYMOjNBfH8ep(r^x5d& z#pau)l`YNrbKd=BoPtFXN=SiAg6o=?I2RUuHBS{Wo9$-6Vyz;v?Bh0dR#U;}G+IWA zI+qWcgthS4-mqQm6l@^k)TDELXw!F7a|EZzd6aXaNnI9M_}*4mTf6$R>zCrt!jFH4 zGWHsD?s#Ocr2NNmnjYjy`9XG~yDQuvwi+ppuBO?D1lA|tnN|#U&$6oUyN<--kCyU# zk|7-|;iHm22u|v`yO6dpYk zEYqk}`pirW6v!RKu*Lq4io%5bowa|z*!=8P)xt|wsQW@)VK_*XoCHFq%V_Jzz&(Yv zXD;B^|CqWFpb*D}c`3FG-K;S`YH4Qh60ePL7GGcha444TXn+pY@9<)Q><(H3blr$X zn2+Nw4T)zG{63b%YsEG?dbl=5`L};WUDb}J z?H;ZfaP!ly_j|m91s~s~k~8v6!Ft+~z>#gEPR!1D{u#^D!6O`#q!D|A%kyYSH_6+b z_slZHX5##>qqOgNl!9*PV!&$q!=c4b)9^VI$$O}M+0f0{{3CXMT`P%5(U6duiSJAy z!SmBg-tv_wPVIAC6io=Nu)BY9SqJDig50n)NxEE*?Upn&XEP@%eQ*faWV_v54^$d$ zV`<;;^D@j_Y}}I-zN^UmpnxzsrjU8}O=X?l&Cu?uP+j&|yc-jLtrS|p8uPILE4|T- zoX=Uko%yb;8E|bUmVd&lS2%=PNV82NdRMZf>f5rea{9Z*Nc|?}#36saw?4wPaxX1x zEHatbYAJSwV)&}mkxcKg@Nj-L7Z>g-vDk1B6F(tJF*_YBF;bae=4&@6G^g&->qL-5 za>6)pIgZgvwHhij^OVi6fIYWfQf0OSCCCZiyHtKiRQ0TQ)^ylRr z;I>yr0&UC9?!fYJ!lQo#;nO(Lqm1$~&C<9JaA6%F>`e)ir*@WChqk(y?uqdYZ|DMs zpJSKE5cD(YY+q{I2>3{g&%3BDDViRswSbYsoEgrc-|z%C5dME8B&a0!BzqFU%9W{J zm0eHcDkEr~CPYanrEa3`S`Bb_p&&9BDKjC`-e=b@ zb!HbGHhjn=WBh-J^6c${0vDYHK+LDI6}RG6-PN&m-Q3jRc9Q7&V@EnNwgP?gM-r*f3%KV&(g(t=Cv}!Nngq`?jF%_JmAdPQFpbz0;45~V0 zf-yj-GI*JcZ@*nXA`=P{{6bCdxU2AXJZ3LC8^oMYtbTtwM4+OYCE=uV)o~{{i9Ny| z`JC6vAIEy|7Y)bETJKDcw8ol1!MA9Iw= zn~6%{VpNRx(hmKw&BY+* z*}XnUPPcFevzy)pU6&$nuJ}<7qhGF4fa(IKAkTkK7$_%+ltjuRc!mh)YsrqcvsUlC z(MEIm5t^ku)?+aX-_EcIzUC`5NX~nLck*2^bg)q$ODTH2NO_63JxVJeLL`ZDpaE5v zKL;DLn+xs52%mCiT;Rir@DB8nLsfaKvZ{vBhdEYH<4e9nJo`ok6_XrH^O16)2Doq# zWm|t6q`WYlY=`#XoAWvNTPGDhRfTA?4pnk84E|6ci$lxxv}HKZ@rjCXdy1EXa3SAV zZbL*ErpjE1C>98t2DyL}G^)+ID-4CNxh6kRec|%G+y9lcZIv2Wx-q*vx`r0>wuS17 zA48TUD(m)hJ&S%vIx-Wd@;$q2kE(H^UBrJC8(vg*Svyg3uU?({o7N|b9t%59m$@d_ zoEZy)#ohW{fGYGeQPaUTAOjwWJDsZ(2s0S=wG?vSg;zsh)$1LqjhrNy(I zWpMRuXg=nb4_r>9Q!s*BEt2f?FIp55|olP_a&~!p5LLwDXTKazv z0<5ay2tBIt#DxTUgabww^=h)2Nkz!xrQFve%=hF(F9L`ZPo@rKOlhG)E-E!cdMkN#byABJ} z)!_#p&e5CXHoA8o!Y+>-{Lb4k4?}+pBjp7ldP-oMp9S3TqZcHju9|23by{AlbmJoA zozG1A<`zi=4YY{}%YI5&0DpB9tTKv``obJkBN4&1^3Ri@Z!CDefO6`ra+e7t^mad$ zMP7Dr&iK9e)CQKZZo5{9JPsXDMFy(7%w(Ex4vn`xO}>E-)g1JiR#c1C=~90s=PZE> zu}*}^N#KrKT=>N(`I@yyRa!4FIR1riRdv=`ub|K^-$5)!wd0XyrTP`>9B3YMC^ihc z{hUlG3%keZRj|UxqNDQrXEU41Y&{lAiZThy1(!$L+TDxFOJ*5f zTlVK7tl9;M>NiK!m58zsr_z78^C`GiU8dwuS(o;6J@%}@4uKk$->>NidN!`!0+g1M z!+bAD7irX+D{CG#)_GJ(TqMYboVa$si`8(VRoRKba!=U4;2@0QnBdM83y#^@m2KP3 zoF6)|Wk$thxrwm5U=pCo3ApdAI%(UL*$Ii#UsivTBhkc+RttRO z@YlM2r%n@%dznFjvwyc#ZcD&Pgr#mihL+D_JK#KCIAc_A{ARmC4{2TiS|+zEPOid# zFMMiaR%Wdu+WHNzwlOQ(9d>9ujwRo<7Bxh;JSQnLfuooC`(*q!>7KlCVxHhQ|^;x5zyB;GbA) zh1kvOcsp{9p}P!T+NSl3I~bWGS=07`886?fv}~r>U-K*`jgjxYD&}pW#VOK5q>DFv zpd_6)y7n2-&u)V-q$+mA?hy>sK9_#`?f6hiJa+OEZZH9)qpp9dnS9dDy7ooTP8HI+llu@` zP705HhzNX!xe-Ycs{cdTkS zD6-gM+1dKAC1b+1c^~LL{QA1|Gw4Fx4n9LWRULh`&3Fm~V>dfWXjMJGh8?1i_}r;z zWL@@lZDggw=ooI{;djjk?iD}?W=8$;ZRHE4Gz;JcULSwy8E=P%Os2Sf{rY-NK(~gc z>*$uJdg%$bbh}=mdP1A6UBpk3PjEB1jV0uLUu#&JN(zNmQ0j*Yh39MU_9chhgf&?46BQ-86hwdKw2*ujYAD<21#iStQR?a;{jKoF zMWIUi7?pMB!xz>DXhV{>G?KkK=3p%DvE<>7qtpq~rL!A7AyX)Sh%U%Yp5s{qg8yD{^zU6!&x%wR4VI40rlj=8lFk)cpv0rhF* zW{rPW)*hpKb;gL;AZ*zlTA4iCd&oX_D&GkSMNG=s7N+3i{?PuFld6d@r+yYeEB{7< zBYI83Yk;W4jHwjM!y$E^T+}I7$NcK_RnYND*{r`zunLsBQn_e7_0y3c#Mk7wrGa4l zEl~lsVYOB|zD{FP?jhzkd{k?*J?gmRT9khnqDV4^Z2^O@#_d%HBi$}%x7dI{M79xB zdimq<8T;>iCEl15@Wl4*U4fs$RYuhAqG-&Bd9i`TKd}w42SI8!)pj+ZNPGbt4MIc@ zRt{}^7w>zx>L@`X**o&>)FmUGj`z7#INM^N0-F{)t%0OAth{DSK9>X6#V&G$6mWkT zI;a}7q`FH&0@NsNx2J0ST@#BJn($@P(RiOAR(v=VoC1s!QXE4WL8ysV%Zh?F`SdAh z%HqklzFuO9zUpRON<9tAIE?dmw}<-+`$$O%PH5i%wmf!=-QSo_by7;U9~&50yOPY* zcm*>Y*=u>QcEPwIs;&CjGh|so2bq5$A_*GP*Lks&BY>g^WA+=$V}nU*6MB`QX|exC z_RV9Rs6TZ37FJF&ZwiTC=dw06)Vt`+KIG~KF>D26IUl^vTO5BG>gjOa z^0B(;!%3uRAN!s`Xaf4_WA(ylK{7jZFLJq1$Pb*<4~CgZ;Beoy%;`LmtN@vYwv3JNFgXFY#@53ie6A?$tKUB{)nO{AngH4#lxe@cYxlD#0Cc~!*H z+1DE+k<-FICu{DcDK|tehszU0$;(7GgyjOsU+r(V_q!3&&GK z0VnFKzg$!zq8`!egR_qMJSp0y7e6=9+s@5W-Vo7`^{+i2)kjV-ilu)sU6pmO7Nu?G zxk(OC^6?}t&P*oatlJI2J;>Es~S!KL`CM45z7sYQ(~7YeyS6F9t&PjgAW;@EvDuPCW>am`oT zQFWrCEk)5%m!02nH8l$kqx5p~*P^n)nszoqz~$AQHM&RPhW$Q_h~0dNj~)S9&4kOU zF0>cHFq9xK_6C3dZ6g_WkPOn$>8Fm2Mdk4yo|+^^Dv6=AD)Y>*bxiP&9%oI1+I+35 zW`9VMLPu2MZLU?;M2k;B<-%Dk+ylH3vLRwYACzF{w?@fE(D*`AH8$O5Tuo3IgFdu9WX3sh4bhqzTr2$Eo6TehdCl3rEV`AE-5RD6-A{# zz1zL>Z?lf8d@F*L=k%SGnNv0`Hdf=8JXmpiDuy=2!JZ#kYZ|Zf-6#n9MCV1|fb$xA zWC+rgO%UFowFHa(vp1g~X_C@Mj+K4DRI6#X+pxmJIl`)t%;3?@2N}z`jkoe8!B_sY z6Y$6AQ!9V*k(;yk3y{oc_i~dSJEJsqru2jGqOj$Ggx_fhVde*bz6iS&w%J=3O2+k7 z+%YRet%Cfg$R(AeORYwzm!Et^3)%=@sRvfWLcB}Y@5j{m&o~Z?Rw)5%_bg((KsiQI z`hr@x1xL&=W{CtZAs_8N)daOSTA{QoxfW*Qf%bnnRhnI&i)EB{u^td1-dwe}^!~{5 zRMu|A$$%4!h$qV#N~0#JyVzwtan;)V*@P%C_(O+&52_iOaqn`z2pAufgUN!_?t1F%E5{zx7GT ziri`kRvN?n5FMW~rzkhc@QF1}g?}lTz|DU>{)NP@RxA~%%#3LDEeWCIjhjAT1+I@k z?W5EIIUPJcsB0N+Y@k-lEYU26)Sv!mEDR}SUg!_bT|7~7zFy05UOKfOXG-7I5DCFH zed0M5cv1IGUR=1+a=o(M+}~QA8_9Bo39GUqW5Sxu;td*&_cD`$L#Je!VK|`V zSt+R_GNw2VDrLqwr*|sjRx#{p=vlT0J(CHhXQWKm@BRA7%~5+9+*Ggask zdm>YcQ%`2P&l&rlA=5emr>Hpc9p(Fi36pd<&nLV()Z;HL_d&<4$+ zK^i0R9gbF7lFe);3_%I%2+$f7VFG$2s6oC6pyFl^kzi7T1VZCDTY!~Fp%P4mh%p7S zW)^`_94X@rg{VpdUnyoXMdLKI3XQG|aMH>^5Ac5mJ@8!#dRYNIU4X77!yW^@O603K zB2h?aKqG_7;^zdgMD?^n2qYR5ghlBkJOc*k6Ew{jy(bW9ZDE!u6!yUTM1j*w7{kE> znJH8WJ(vvEL@$LIK!u^dVh{YDTbN-4Xv_`Hkid@{oFT2*BXa}TJmVT?XuzDKhTv{R z#!-K3V*wqmaE662;fS3n0WGv8v*_F$m9h-5;{s+_4tC^1V6T*W9G%{xr8w$pr38AY zs#W0ioZ$@gDzqxI7>^t^w+6g}qvqD)40J(T!VCsDK+ghBAP)mK*L%M!rXQM5d%qjb zA9A=W!5%`u{oVd2wrC%4g}<-lLR2t~{@;JTKugG!nT8}~pulKI{t&a7fOMfDO=4eL zC~}a>uum5xRV)ii=?pS2&DB_3L`k1%NJNm4=snW0K$qw#+j2(Q3Q`wd5=uMHRgi=v z(gGO-Bq_XyG0JHAynXh497A*AbI7?Qt1QDE=-Pr(72a`t@e}^jP^7ptL=Q>>@kM`~ z3?$|Ff|3KZ2y#9O8Sc0YA*ETT3=$w=bcnT zJ_nQGW%1$;YFwBQjD_$_hg1Mj(LRBIv4lN%l2jIQif^$3gw{Y67-*Fhn1iT|--EZ{ zd!-(N)s1;*Lt7f0MXeF~A@eOPHt>H_*G4qs)}U(9g$sg*GTcnbKu*`jv$U`e%YoJw zDBEVsI0@=+P=i4_-@*b5FRc-g?JX>_kjEWbKi<=Bc@Rg}TEdbsdhoClu>KV+!RWT_ zsh|lZA>~Los$(s#nh;xuLdtH-tsI!;m%8}D=9|QqVjqaw7*{tpX>g4~{2YH**QaRi z_3qLV)sW)uKJ5-fsTqD7`1O?Q4~u z@JXe~CK~#%ltg=yeGIcmrIg4AtO~W4TJ7j)tUo2%4$?Rd;RO;XG3<3ofk!FEN`sRq z2$2Bp4rYC>H<*i{DL*^ZBqYdZ_g2=VJbsg0Lk3F9hFhs!Z__*7_ zr!hSh*$7*g9#bxNxnhnn-#CoC`7lWq4kvo61tuF?Ag&4#H5T#1aYB=R3`cmg!vd-# zs}LRcj^=vmE@_h!dHQWq<}G^_pz9Rn9-O~d51XrpXt|1HalwTPG;V*$U+5~_GR!Cn zWZ1pJq7L8Sm@#qbb0%qJfPLK42R`7*V9|~~@kEaY4q-grk^WtMG|9^o#0U-H5& zH1R^%IB%cB!j$BLy*Pf3`k{RB*l;IaO1IB6j`;V9lyyJgGJc*X_)@G3U9oSa7`% zy6BFZp^HawE)2+3?hv{RGgt`S!rmIX$l<=B8{8jhgbU@w!#N5yZIW;dAs9ke_&p|t zWVGLGL)C|M9P;Svp&#~}0XM13HYVbb4fi;tTiJcz4CozXj4^+SL!3f5sTlpxrNhLc zN7B8(w1azPn^u`NEvRUbM?r3jHh-fKIN04|wOaKeet4G4u^@VLhj-3J{5u@$#t%6s z+y|V~P`rwBLHEuEtATVSYa`EWRWij77Z#+^URYQ}(Rx?wN!mCs^PV7VScF;n zto1r$yK&xAV>*9sbsZ6n-BVeXRu-5{?&0!Uvvey+j%|soT>0Q-rW%Z=gL8XB$$&I!SwXdj{<+XRN>LwR?v}5(b+e)j_y*3 z5r)2@q0g-B-i7$~@BHNs>9hD6G+%GMbRYAj-Y*j~g@O?7p$NuiZ@nM9yj=_Wi$b)U z_i68+|J=*ZzF*f_{%kQ{KdDz2%jSB$SnkpD>uLs{ym@i<{^{cfhx3cYe6^TX>*}vY z?jJ0s6BvIrtu9xYbi)r07T>bp_ZiRjSqTs_*l=p7+xer_MLl1`Dpl;|kE`n!b#r+I zkKFF%$Pz!>XGZPihwEzETs)dzPV21L%TL$!>|Mqf-^)MvNm3i2aaAo(>vi^D`J?2KgwSLNN)h9xA{qa3Sj*TaJ_Es)n9*s$Ex`TMqXbn>pEZmxgc}@nSaZ_=YQpY z)yqZC@@5yyAHO|&_5Sd|<5y2Vuwpm{xXku>iQgXMSG30P&f2nwja@{h)Rgk|5|@r*YnA$L1cQ?D|fNp z$6pT~9XJGQCvQR5lQC6g5mbK#6n{X~)>U;ms_1A+slVJ*(~)S0Fz+ECc0u6X ztCvUbeggzfPsbq8%t26=h(I}x06yLU0b?Tsq>K^x(oN+Fkb<(YY-V*xF;FFD z4OD9))-%mc72)vZn`h5Yz%*xPqk#rahATQ)W9m{zPR3Yb7<_CE1B>R}!|bxHpG#Nz zdYbK&Ef0?$9sKg1G_%8sDO7(9*7g#1IA!_6iWz-h#rRIC@$Hkd_m7`Hcy)U4YRqJ? z+1|&KTrQ-*qt&Q}>t1dwJKaWWcpOMt#EPBt6xk`meSClX@z*C0maEUJ(X^25<2eQ6 z5_fC1(<8|VrYJ_W*vB=v(}PEq3_Lp4AIRvpthWTpB;^0W^u)Xe|=cs zAAuGu3TsvL!rCM$%Z`8+2R6n~huM>Qx~}r$2Fe#y94ujZazOt?`)Yc9Rpo!@H9#;SApWSXud94o z&CVwkF7nn5?lL}q&abbU{2KmWHTm*t0cH6TJZN3rzy=Oye`|Uu?UW!7KAgRL`PfI) z$zt|;Q6BBTswd3|LfS%Zk^cMtGC9B~(?wJn@7{P(j^>sm^|S3e^=_Z;a?E?$ou6;r zkdN-dla2Vs2E2dWd*5Zl{UwT9++EY=WQRSr*r^&EzkG3e_G`~*TQVUUjs9wwjK*br z>SPn6sbn3(^c^yxRK;zlD=#)8Zt z0o!A`(bBm7b^(DFJHfO&kg2}bKj;nZ@k_nJEY_aG(C~lo;AYTM_ujpXj%#L(({t3d z@C@KC4z^RBef0A9=-HD22SaZdb28XoapTfv&&hP^WI8$8EJc4crG__)TT;U|C&TnG zkOjyO$N@%T|88Nw#kAc~>K3yM)bXeDi^T-&45Fgz$f^oryAbs39F-1K}Lif#MN}4_8QDLIM5D`5Q$Eg$(&3d8LapijLr{-fdxH z?MClf7!GR{#GT*E?^q7&9*)v zg{0zA48U}d=U#;9v%?6X~Hvat+*A4!>&tKU{0L^3mYIpv(DFzC8ymoy-T80*3b!vzvEh$e#b|IA zyMx=Xw%OkOwsLm^-STDXhKw5?%af4dvXg&N7R67IarA&{!Q{=EAH<Z`bTs!J1T6M&&^zqAD4~GoM%fSTk z=4L%@<~Wlwa^@ERn2_n;e4r;s)U-1j*zIQ`Y@#1!!v8f{(5anxysW>{KZX(KaW^}x zxpB5gW{-^LVLT6|YLFZE%aVWmb^Q%#l~KK+f1#t(uYGd*?X#36_w|ohs;w+V!g4@- z?l+M{i*2LjH+zm2@2#;strmE0w*k+MNN9-xT2^FwB#@?Kf4&3ExH)l#TH2X5oaKk#Ahp| zbCY7AD*PMkT&H`Np*#i^0XLV1FbRV(H!(0WFflVRI5jaXFf=DHFefPrFHLV`L}7Gg zASgsSGB7bWF)%VPF*7kZH8CwPG?zLt36TRdG&PYB8yYz{3NJ=!a&vSbIWRa1FHB`_ zXLM*FGcqf=xN{9_xKoW)^oK5`Zn!m#;B;+8BOHA; zu91d58`UW2=~_dtO{1aLqA`X&;>tA^dZii%y<&}nUYf?kUw?{*GZ+Zha1IMWQ8`Qm zKEQ?>vV#pLW5sDzM#c&@Od%xMFkqFPbx>SQwBTWI4-6854VvIKxXTcn1PvPC3oy95 z3=&)u+}$-~a1w^#5W>I!2?GQVI!J)vw*Q|J7u?>(ohyYB7N)peSc zL9ab)wn)2CMQB{x>ksd=GanE>%HM2{u*g4x?XsUq;b!{PfifxAraZ}F3-i)FcYg79H-WH zW;tkij-Ow~&sjIX(GK;*;P;o5!QH$o^4<3_0y?m(DmlL!QO(Z30S94fma!Dg-BS*RA(v+d zrtR;GjH#|PxlD;V!uoSlzs)yFZcE0^Zt24vH}sucx!>^{DMNfk1cr>WLQ@boal4a9;YcCG7At*j0E?(iA6|=|jJ=tqg5h82Ss(7nCd6;BBJb(P3qGXu9w^LQm+Q69{xyksH?jPi>wb^m0Pm1UPd$K>l&JN|q z)z9;0sPonKU0Qz??b>Jj+5;Oq7>Jp3G1PH_QR;;{vq?2GgoRu+R(7)a#GZY@UwkzK zWLHT;>SfX3Hx8o4Rl8Zk-@yhB>|(GB?JEJYS;wMp!;bCR;yPN;DpP5ON_w5j1*v4+ zu5o{Ha-ZQ2?JMK@5IvNyxJ6)|o1>e~fRDJA_f*Ew42KSWZM|T6^7J}&VN4B=04kVv ziU;LmwjqOA6DiMkxO-sUyI+3bS&>KF;5AmF2e+u!%p{&q8$9Z+^i@t4f0pt0*Sn-S&%oM!$`%ydA@{e)W&Mf50OUsmpYkc>hgcpR7^<%e`{yctGLYIB9T9Em87m3E6SJb z(^;Um_(xTGUANxwqD=07>AbVhxVCI@<$VDnu=q<@mmFh9aK9ubkqTBj@;Wt}!asYN zTv9IL_^zo^gQkQwbVBOBagkl*y$AhB6dQHAcb><;*8;isPY`?V)#9W98E%27-+jVAJOS$+Qvxz@Su5vi(QuL309x=msw zR^+P@|ArFnCL(oqhEU=05)p)5I{2JQoBJTYMF*Yk0xFnT?se0(LSVT1mUZ5$A6= zddt|ZU%FhE<9{cSa`POcwe6(=l zJx_J{^&yWiMcOtu&RVjIADb|x)FsP{kK4attjtsR~rzq$wl+xp)8DHWXuy1cy>vYS5G8O|MNw>ajOW?>`}m)HBShS zQlWaLCh5axX~*1|tu6hxHjJRo2!em-^gLoxp+ge<*C-`Liuh1!k^2vHt42e(r;XwNkrSPFf z)8$3=p8)?K?h-am3DdX+zou;bh7Ki&A*(;9Dp+@a6cIQc7Y`KUXeDWB;L`jw-r{9v zoPrQXiPJ@^yb$dsZROu0nuG5jNbi)wvqAdcv2xZItK!0t1snr}Vi+h#^W3kj@? zIAkxfU_LvsR^qw1zo`}^`W-t-DKa-32?jtd(>6dGBwpH1rfL7+E@m16TDvC9c({5^ zEtN@9IhGb80YhRxlWGAsUo4bLUn<*{w#4ygjciNxc1@Yd({@5+xgCfz(!KB?HPuwI ztA3mm-8ydt16S=&>^WH%SA@H!f?&$CWSqR5o2BZjcJS!Xb0ba?*Sfml#_|21HOX6v zb5eV)4#Eq$G@5*$h8&zojmPSpNKH+r$Z$;Ny$57{rNhh9N5GHwb{8j(=eZrDwOjA`1&`a!t$D@W{TVI4fR6#zS5U<^>T77osu@wwb z$ob=ee=LRtT|P18|Bn8QB6>Mz%S>p3iV=;eaTKPn2z=%#_2;bX0w*3NM7U~%7h-J% zeTiagyHxx<%O*D9WL9Bc=P3-ky7uolA0#+~91#F1s>N)0R|j%+B#lvQVkX!}U!>A% zV-fXi0ohsmD;*M>^kF9{FV+Z-2BH(`!a5%_S6&_uU9nte1#Q(g5ZXP%XYLcGP$*^* z@ac{7$bP+J+y}1fb!HkE4)Oi^eK6#P<=J^(4~xL2il8dpk+&@)FkKiXO#dL?1p_}k z?z^`irl$Hp*`D0u`qq`bTs*QRXlu9Ci;D>dvLwFVPT7&n*iATm(kv}veB(sAXDcA^ zYkihw-)iUvF{I-uEJc^@{jWGZpjaVzow+{{b?N`+7rUp`eesJaz$eg+!QVdanc~yi zpcS$2Q;Xg`GE3|JhO!+@Nwdf472mT@-Fl87C)skP#W8;qgm2Hb+i%u9P?mo;W+A7b z+s}7MjILg>70Na2`rY(U&pzE$(MiAwP^mL4bOqB#6u_{M3IpA+G>p=d{Ll1BGJ98o zh!qBwlCmTgG;j>E0|`Iq#DXRub77DuNce&3ySw}ROT|G#Abny%4L5uDe@%)1G*v<7 zvS1MvWr&i9sG6#hurfqVLQP3bTvY-hrlczVph}6$gZ}?bDF1Eq;Oc)RUSdMo!kswW zFwR_a7pCV-!&8?BMgPd8gfcG13u=UnO~wm$>4e04d)vzBt`BMyNSZuNNv3QtgnWU6 z`0K6#JcRKH1h{9|te%hb(-f66tLOwMAchS!&tyTRGn5pej+|LeiZw=+t1I8Li~T=a z9xW^%dtsG8h#;CVFHB!zIn|G)F};fU$1wkFgKz1s*Le%UbbEOlD&yq< zR0io&PteZ_XN5O{DWce+1k-0ZDS*T(M)-^@z8X@XWS25EQW%~HHHW4|Z9uyv7DTai zOZdx-phdXVNVoDaG-?$_infHS<)yD4#QYL3<)+<6Q0E#`o4Ia5-p!;D+W$LRTydw$7mlZz+??hM7pw3*$ubM89G# zJ&F3~1DkJeMm@L|TN-kPq5h8RPV;f|;lrY%>Z-;{i%EX@T#n=IC9aT-D?1KhX9!A1 zaE4=O!5D4@h82aXQH-Le)sSw;iiFqwF@zoR<`xe(OdH)O>}2X^aOYNz5y zod=!V8CG-ik4r8%Na>0GQT_5Ftq{xS;DEYB#=!xrP*R3ur+b0AWWfGf%rd4)kFH5( zrg4vcXKkl;*K<#50!xa0VzW{^>n0)kcNvJ=CZR~AwuNUXp~FkBd2~l$fybTk6M!r( z0v3dLE4*^u;fJgST9L=&4OCt3Is7f{cul`kXhLvSwTOEbwn%zr>oUUzy6j@uA>4OYnwO1W>?CdS zaO{p`Smo+;`pVK*9z}-`^I%#6bo4WM&@JIy^i#dUPOQ2_Jrq{Mc6Vs^`u+al#P$|M zF)#yIT<~ghknJh0)Q8b{h%TR(?K@!N1M-5+QNx6*(%-)?2;b!KG}HF!HvOl)veql+ z!L&7OgXga21Fv8IeqZmz$|+?tYUJ}Mt#^WY#ckR%$vG3!uCAf0_*>rK*1Y`BxS4d% zPaCqaASK1wSf+#Jz9*`RBS zviYI=0b=-jg9{xH3)}n6bI7J=;~qH2CzXpw#`ZABE{r zw>&vwFIUW^Q?5Cux2W=Ni9se(fn(<$qiVY1UajvG0N=I2#{`ApHJhq1&ZnGRwkMDH zqKusK0751B)JnLvh|s1?CH@+mb88?JD_@Bn3ZOxfwujRqiO~q-7BYAgd5M?rkShDs zzL~Vn*(C#d5BpOI#Q~tFpSgwZ0O!tH;RT*F7I~B#a8h8$kVnPHpBb<2;Y!1~lyXIy z4apaUlGuh!MYwfDdN?qn$n@}QcMN06o_Rk0Y>@Ldwh{Wt)*_k`$p6?f=I5C7scZ?< zya)f;+&nFU?D&y|_;jJ%bw~axZ70r|pZ({w9pj@Y&SNZD052Ad>8Z!%{_*#<=7HC- zedH62SyBs~E@e}ns{bMaVo%67n1*GN{K>e2woI8K$H>!}xMX13emMt13pT9-Z(_%q zfId-bz=y?GVF}3r?!TNYf*BZkXU7z|O+Lj`BqQtp1Jkl-)3HG>dFxAn4J3-aN!g7W zaEo0g?_u(jIq(bEJ)T)>W)Pp&YTkdEtIa9RBITiqu<0=9N?q24$ot7;{`rA14Bx0U zSZI85mk}QZ16QQiEt!N)$@1(HNQ?gKBIke>TeoKst7qBLgJKmv;24Wa$>_8Te+Xfj zXP|1>HdofY?CFXLDyQ=<(6v@s0B3H{v=a;sZijc9x^ZTw7ycTwkTJ{J7}=YZfw5!M`kFVe)6QAM-&jTrAu<%;T2n1)P^ zFfVmlW>k3V2d~F3_>6}Ul8>=fxPtzQ-R0Mnq`NQ?09SF-{D=$i9S|InB;O*qg~;p? zoI*}zuuvTb`KjDs`c4wuzxr^k=5>?;tekAp=@lRCV? zV_J2!r19$h5#+$Bkh;If5H(40!bZBTA7#gs5Yaf0w%D^m4b`-%!~xi{;X+diYhiXr;z=~TrT85M82m?Ta_1@|QF z`Dh6Y-lyy4U3NW1d!{fw&ZMd^^p|&Cr;}d{X12inx&U0yp-MFLudScah=*wM!Sub- zs3IO}iu5%~Rt>UoQgWASxaVII^v#gp2`s3OscEv!kX^uL%0KZrn63k%_y8((RS;!_ zhHo5pDG@1kgb*%(>M;d?l28@&C;|a}*OYgeeJaiJj|Noe1ofBZk~NZET?51!p^7^k z*Fu(-jl_=A12IIn;I>i{s_fvyIM~hrYKe+az%aq2im*KNj|QJ|dHjmSTw6<=wP{tW z7FdiPBXP25gt7a?-H$Ax=Po76i>1mdS=fFi30?0?-BXBzSbrsY!=9Fm=%n;e5OTvk zAW!14`8s%%y1NpmhuB2477XPo;(p-+5v(=DD+HMkh{ADyQ$6Mfd?17kvOP*vFBHeTUmQs;t@v~Yu-N~w*7AvBMv`131X>slu!H;MkraQT zaICRNBUyz=VdRl2t3r~16aYy|1f>wME>>XJ*kJLkRjMOtQocT_c}|u{Hv+XvnuF`m zFC~QczyCgz769+n|6?|<;&&3!K1^bUC2aqGIS&@T2!d7CSNN$2VnpavXu#4%=aJ{i z#^;gH)Enjtxx?W91hD^y{P(~Q%+~!|?zz7j5&?*eZb8RH#sII?v52PxMgK)PSxSxC zum+@&{a5dwM_~U~JpVoK|Msc*p)g{nc=!;Q zruBQWT-u5n@m!WPJ$P$#W@b%%uI&wicF9~_g)9HcmN(KG95T)u*K?;HemBnNUI|b# zH`lp3fwi?wX7pW{xVGj0-mgdR32k*$!C`Zb<44*~^%EH@OvrgZgZs^-cE23-uTV7F z(Md+3C(_Lzc!vbNC)}1A44-p$T2Y5bpNyF*c4cZuI2v?ZG5s+<-&J2p5Q5hUMqh`- zlp2vX+Cphm>aSy}QU$MrYV-sin++j(VvL31bw^IuX~RdxSIazo=9SmYd(KbhbYPi# zeRZkeYvM{h(T8U!L=53`fgUs#IJgzvScE#6NW*ix1Q)||xdb7@bD9LP@Vd`^{1F6- t#RBJzzu(n5U)uN2`pWa)vfSGE31=5RCt@Uf$n+#c#fUjMA$n@W{{gUobh7{e diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index ce76b3b9eb..5a4e8b617a 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -195,7 +195,7 @@ int colvar::init(std::string const &conf) // - it is homogeneous // - all cvcs are periodic // - all cvcs have the same period - if (cvcs[0]->b_periodic) { // TODO make this a CVC feature + if (is_enabled(f_cv_homogeneous) && cvcs[0]->b_periodic) { // TODO make this a CVC feature bool b_periodic = true; period = cvcs[0]->period; for (i = 1; i < cvcs.size(); i++) { diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 20dad2771b..32c329460d 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -11,8 +11,6 @@ #define COLVAR_H #include -#include -#include #include "colvarmodule.h" #include "colvarvalue.h" @@ -60,10 +58,13 @@ public: /// \brief Current actual value (not extended DOF) colvarvalue const & actual_value() const; - + + /// \brief Current running average (if calculated as set by analysis flag) + colvarvalue const & run_ave() const; + /// \brief Force constant of the spring cvm::real const & force_constant() const; - + /// \brief Current velocity (previously set by calc() or by read_traj()) colvarvalue const & velocity() const; @@ -516,7 +517,7 @@ public: // collective variable component base class class cvc; - // currently available collective variable components + // list of available collective variable components // scalar colvar components class distance; @@ -611,12 +612,15 @@ inline colvarvalue const & colvar::value() const return x_reported; } - inline colvarvalue const & colvar::actual_value() const { return x; } +inline colvarvalue const & colvar::run_ave() const +{ + return runave; +} inline colvarvalue const & colvar::velocity() const { diff --git a/lib/colvars/colvar_UIestimator.h b/lib/colvars/colvar_UIestimator.h index 7fc7f870a1..36ed938119 100644 --- a/lib/colvars/colvar_UIestimator.h +++ b/lib/colvars/colvar_UIestimator.h @@ -45,7 +45,7 @@ namespace UIestimator { this->width = width; this->dimension = lowerboundary.size(); this->y_size = y_size; // keep in mind the internal (spare) matrix is stored in diagonal form - this->y_total_size = int(pow(double(y_size), dimension) + EPSILON); + this->y_total_size = int(std::pow(double(y_size), double(dimension)) + EPSILON); // the range of the matrix is [lowerboundary, upperboundary] x_total_size = 1; @@ -121,7 +121,7 @@ namespace UIestimator { int index = 0; for (i = 0; i < dimension; i++) { if (i + 1 < dimension) - index += temp[i] * int(pow(double(y_size), dimension - i - 1) + EPSILON); + index += temp[i] * int(std::pow(double(y_size), double(dimension - i - 1)) + EPSILON); else index += temp[i]; } diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index d2a0f0a807..1be6f42e59 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -8,9 +8,11 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarparse.h" #include "colvaratoms.h" + cvm::atom::atom() { index = -1; diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index 71c587e230..0dda6ab792 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -11,6 +11,7 @@ #define COLVARATOMS_H #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarparse.h" #include "colvardeps.h" diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp index 301e83e730..29620fbee8 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -8,6 +8,7 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarvalue.h" #include "colvarbias.h" #include "colvargrid.h" diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index e4aea8eb86..b3b5b3eb16 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -8,6 +8,7 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvar.h" #include "colvarbias_abf.h" @@ -18,16 +19,18 @@ colvarbias_abf::colvarbias_abf(char const *key) b_CZAR_estimator(false), system_force(NULL), gradients(NULL), + pmf(NULL), samples(NULL), z_gradients(NULL), z_samples(NULL), czar_gradients(NULL), + czar_pmf(NULL), last_gradients(NULL), - last_samples(NULL) + last_samples(NULL), + pabf_freq(0) { } - int colvarbias_abf::init(std::string const &conf) { colvarbias::init(conf); @@ -91,7 +94,7 @@ int colvarbias_abf::init(std::string const &conf) // ************* checking the associated colvars ******************* - if (colvars.size() == 0) { + if (num_variables() == 0) { cvm::error("Error: no collective variables specified for the ABF bias.\n"); return COLVARS_ERROR; } @@ -102,7 +105,8 @@ int colvarbias_abf::init(std::string const &conf) } bool b_extended = false; - for (size_t i = 0; i < colvars.size(); i++) { + size_t i; + for (i = 0; i < num_variables(); i++) { if (colvars[i]->value().type() != colvarvalue::type_scalar) { cvm::error("Error: ABF bias can only use scalar-type variables.\n"); @@ -132,10 +136,10 @@ int colvarbias_abf::init(std::string const &conf) } if (get_keyval(conf, "maxForce", max_force)) { - if (max_force.size() != colvars.size()) { + if (max_force.size() != num_variables()) { cvm::error("Error: Number of parameters to maxForce does not match number of colvars."); } - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { if (max_force[i] < 0.0) { cvm::error("Error: maxForce should be non-negative."); } @@ -145,9 +149,9 @@ int colvarbias_abf::init(std::string const &conf) cap_force = false; } - bin.assign(colvars.size(), 0); - force_bin.assign(colvars.size(), 0); - system_force = new cvm::real [colvars.size()]; + bin.assign(num_variables(), 0); + force_bin.assign(num_variables(), 0); + system_force = new cvm::real [num_variables()]; // Construct empty grids based on the colvars if (cvm::debug()) { @@ -159,14 +163,14 @@ int colvarbias_abf::init(std::string const &conf) gradients->samples = samples; samples->has_parent_data = true; - // Data for eABF z-based estimator - if (b_extended) { + // Data for eAB F z-based estimator + if ( b_extended ) { get_keyval(conf, "CZARestimator", b_CZAR_estimator, true); // CZAR output files for stratified eABF get_keyval(conf, "writeCZARwindowFile", b_czar_window_file, false, colvarparse::parse_silent); - z_bin.assign(colvars.size(), 0); + z_bin.assign(num_variables(), 0); z_samples = new colvar_grid_count(colvars); z_samples->request_actual_value(); z_gradients = new colvar_grid_gradient(colvars); @@ -176,6 +180,27 @@ int colvarbias_abf::init(std::string const &conf) czar_gradients = new colvar_grid_gradient(colvars); } + // For now, we integrate on-the-fly iff the grid is < 3D + if ( num_variables() <= 3 ) { + pmf = new integrate_potential(colvars, gradients); + if ( b_CZAR_estimator ) { + czar_pmf = new integrate_potential(colvars, czar_gradients); + } + get_keyval(conf, "integrate", b_integrate, true); // Integrate for output + if ( num_variables() > 1 ) { + // Projected ABF + get_keyval(conf, "pABFintegrateFreq", pabf_freq, 0); + // Parameters for integrating initial (and final) gradient data + get_keyval(conf, "integrateInitSteps", integrate_initial_steps, 1e4); + get_keyval(conf, "integrateInitTol", integrate_initial_tol, 1e-6); + // for updating the integrated PMF on the fly + get_keyval(conf, "integrateSteps", integrate_steps, 100); + get_keyval(conf, "integrateTol", integrate_tol, 1e-4); + } + } else { + b_integrate = false; + } + // For shared ABF, we store a second set of grids. // This used to be only if "shared" was defined, // but now we allow calling share externally (e.g. from Tcl). @@ -188,6 +213,8 @@ int colvarbias_abf::init(std::string const &conf) // If custom grids are provided, read them if ( input_prefix.size() > 0 ) { read_gradients_samples(); + // Update divergence to account for input data + pmf->set_div(); } // if extendedLangrangian is on, then call UI estimator @@ -202,7 +229,7 @@ int colvarbias_abf::init(std::string const &conf) bool UI_restart = (input_prefix.size() > 0); - for (size_t i = 0; i < colvars.size(); i++) + for (i = 0; i < num_variables(); i++) { UI_lowerboundary.push_back(colvars[i]->lower_boundary); UI_upperboundary.push_back(colvars[i]->upper_boundary); @@ -238,6 +265,11 @@ colvarbias_abf::~colvarbias_abf() gradients = NULL; } + if (pmf) { + delete pmf; + pmf = NULL; + } + if (z_samples) { delete z_samples; z_samples = NULL; @@ -253,6 +285,11 @@ colvarbias_abf::~colvarbias_abf() czar_gradients = NULL; } + if (czar_pmf) { + delete czar_pmf; + czar_pmf = NULL; + } + // shared ABF // We used to only do this if "shared" was defined, // but now we can call shared externally @@ -278,44 +315,48 @@ colvarbias_abf::~colvarbias_abf() int colvarbias_abf::update() { + int iter; + if (cvm::debug()) cvm::log("Updating ABF bias " + this->name); - if (cvm::step_relative() == 0) { + size_t i; + for (i = 0; i < num_variables(); i++) { + bin[i] = samples->current_bin_scalar(i); + } + if (cvm::proxy->total_forces_same_step()) { + // e.g. in LAMMPS, total forces are current + force_bin = bin; + } - // At first timestep, do only: - // initialization stuff (file operations relying on n_abf_biases - // compute current value of colvars + if (cvm::step_relative() > 0 || cvm::proxy->total_forces_same_step()) { - for (size_t i = 0; i < colvars.size(); i++) { - bin[i] = samples->current_bin_scalar(i); - } + if (update_bias) { +// if (b_adiabatic_reweighting) { +// // Update gradients non-locally based on conditional distribution of +// // fictitious variable TODO +// +// } else + if (samples->index_ok(force_bin)) { + // Only if requested and within bounds of the grid... - } else { - - for (size_t i = 0; i < colvars.size(); i++) { - bin[i] = samples->current_bin_scalar(i); - } - - if ( update_bias && samples->index_ok(force_bin) ) { - // Only if requested and within bounds of the grid... - - for (size_t i = 0; i < colvars.size(); i++) { - // get total forces (lagging by 1 timestep) from colvars - // and subtract previous ABF force if necessary - update_system_force(i); + for (i = 0; i < num_variables(); i++) { + // get total forces (lagging by 1 timestep) from colvars + // and subtract previous ABF force if necessary + update_system_force(i); + } + gradients->acc_force(force_bin, system_force); + if ( b_integrate ) { + pmf->update_div_neighbors(force_bin); + } } - if (cvm::proxy->total_forces_same_step()) { - // e.g. in LAMMPS, total forces are current - force_bin = bin; - } - gradients->acc_force(force_bin, system_force); } + if ( z_gradients && update_bias ) { - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { z_bin[i] = z_samples->current_bin_scalar(i); } if ( z_samples->index_ok(z_bin) ) { - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { // If we are outside the range of xi, the force has not been obtained above // the function is just an accessor, so cheap to call again anyway update_system_force(i); @@ -323,6 +364,14 @@ int colvarbias_abf::update() z_gradients->acc_force(z_bin, system_force); } } + + if ( b_integrate ) { + if ( pabf_freq && cvm::step_relative() % pabf_freq == 0 ) { + cvm::real err; + iter = pmf->integrate(integrate_steps, integrate_tol, err); + pmf->set_zero_minimum(); // TODO: do this only when necessary + } + } } if (!cvm::proxy->total_forces_same_step()) { @@ -332,14 +381,14 @@ int colvarbias_abf::update() } // Reset biasing forces from previous timestep - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvar_forces[i].reset(); } // Compute and apply the new bias, if applicable if (is_enabled(f_cvb_apply_force) && samples->index_ok(bin)) { - size_t count = samples->value(bin); + cvm::real count = samples->value(bin); cvm::real fact = 1.0; // Factor that ensures smooth introduction of the force @@ -348,21 +397,34 @@ int colvarbias_abf::update() (cvm::real(count - min_samples)) / (cvm::real(full_samples - min_samples)); } - const cvm::real * grad = &(gradients->value(bin)); + std::vector grad(num_variables()); + if ( pabf_freq ) { + // In projected ABF, the force is the PMF gradient estimate + pmf->vector_gradient_finite_diff(bin, grad); + } else { + // Normal ABF + gradients->vector_value(bin, grad); + } + +// if ( b_adiabatic_reweighting) { +// // Average of force according to conditional distribution of fictitious variable +// // need freshly integrated PMF, gradient TODO +// } else if ( fact != 0.0 ) { - if ( (colvars.size() == 1) && colvars[0]->periodic_boundaries() ) { + if ( (num_variables() == 1) && colvars[0]->periodic_boundaries() ) { // Enforce a zero-mean bias on periodic, 1D coordinates // in other words: boundary condition is that the biasing potential is periodic - colvar_forces[0].real_value = fact * (grad[0] / cvm::real(count) - gradients->average()); + // This is enforced naturally if using integrated PMF + colvar_forces[0].real_value = fact * (grad[0] - gradients->average ()); } else { - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { // subtracting the mean force (opposite of the FE gradient) means adding the gradient - colvar_forces[i].real_value = fact * grad[i] / cvm::real(count); + colvar_forces[i].real_value = fact * grad[i]; } } if (cap_force) { - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { if ( colvar_forces[i].real_value * colvar_forces[i].real_value > max_force[i] * max_force[i] ) { colvar_forces[i].real_value = (colvar_forces[i].real_value > 0 ? max_force[i] : -1.0 * max_force[i]); } @@ -407,9 +469,9 @@ int colvarbias_abf::update() // update UI estimator every step if (b_UI_estimator) { - std::vector x(colvars.size(),0); - std::vector y(colvars.size(),0); - for (size_t i = 0; i < colvars.size(); i++) + std::vector x(num_variables(),0); + std::vector y(num_variables(),0); + for (size_t i = 0; i < num_variables(); i++) { x[i] = colvars[i]->actual_value(); y[i] = colvars[i]->value(); @@ -509,26 +571,60 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(samples_out_name, mode); if (!samples_os) { cvm::error("Error opening ABF samples file " + samples_out_name + " for writing"); + return; } samples->write_multicol(*samples_os); cvm::proxy->close_output_stream(samples_out_name); + // In dimension higher than 2, dx is easier to handle and visualize + if (num_variables() > 2) { + std::string samples_dx_out_name = prefix + ".count.dx"; + std::ostream *samples_dx_os = cvm::proxy->output_stream(samples_dx_out_name, mode); + if (!samples_os) { + cvm::error("Error opening samples file " + samples_dx_out_name + " for writing"); + return; + } + samples->write_opendx(*samples_dx_os); + *samples_dx_os << std::endl; + cvm::proxy->close_output_stream(samples_dx_out_name); + } + std::ostream *gradients_os = cvm::proxy->output_stream(gradients_out_name, mode); if (!gradients_os) { cvm::error("Error opening ABF gradient file " + gradients_out_name + " for writing"); + return; } gradients->write_multicol(*gradients_os); cvm::proxy->close_output_stream(gradients_out_name); - if (colvars.size() == 1) { - // Do numerical integration and output a PMF + if (b_integrate) { + // Do numerical integration (to high precision) and output a PMF + cvm::real err; + pmf->integrate(integrate_initial_steps, integrate_initial_tol, err); + pmf->set_zero_minimum(); + std::string pmf_out_name = prefix + ".pmf"; std::ostream *pmf_os = cvm::proxy->output_stream(pmf_out_name, mode); if (!pmf_os) { cvm::error("Error opening pmf file " + pmf_out_name + " for writing"); + return; } - gradients->write_1D_integral(*pmf_os); + pmf->write_multicol(*pmf_os); + + // In dimension higher than 2, dx is easier to handle and visualize + if (num_variables() > 2) { + std::string pmf_dx_out_name = prefix + ".pmf.dx"; + std::ostream *pmf_dx_os = cvm::proxy->output_stream(pmf_dx_out_name, mode); + if (!pmf_dx_os) { + cvm::error("Error opening pmf file " + pmf_dx_out_name + " for writing"); + return; + } + pmf->write_opendx(*pmf_dx_os); + *pmf_dx_os << std::endl; + cvm::proxy->close_output_stream(pmf_dx_out_name); + } + *pmf_os << std::endl; cvm::proxy->close_output_stream(pmf_out_name); } @@ -542,6 +638,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(z_samples_out_name, mode); if (!z_samples_os) { cvm::error("Error opening eABF z-histogram file " + z_samples_out_name + " for writing"); + return; } z_samples->write_multicol(*z_samples_os); cvm::proxy->close_output_stream(z_samples_out_name); @@ -553,6 +650,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(z_gradients_out_name, mode); if (!z_gradients_os) { cvm::error("Error opening eABF z-gradient file " + z_gradients_out_name + " for writing"); + return; } z_gradients->write_multicol(*z_gradients_os); cvm::proxy->close_output_stream(z_gradients_out_name); @@ -563,8 +661,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app czar_gradients->index_ok(ix); czar_gradients->incr(ix)) { for (size_t n = 0; n < czar_gradients->multiplicity(); n++) { czar_gradients->set_value(ix, z_gradients->value_output(ix, n) - - cvm::temperature() * cvm::boltzmann() * z_samples->log_gradient_finite_diff(ix, n), - n); + - cvm::temperature() * cvm::boltzmann() * z_samples->log_gradient_finite_diff(ix, n), n); } } @@ -574,17 +671,39 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(czar_gradients_out_name, mode); if (!czar_gradients_os) { cvm::error("Error opening CZAR gradient file " + czar_gradients_out_name + " for writing"); + return; } czar_gradients->write_multicol(*czar_gradients_os); cvm::proxy->close_output_stream(czar_gradients_out_name); - if (colvars.size() == 1) { - // Do numerical integration and output a PMF + if (b_integrate) { + // Do numerical integration (to high precision) and output a PMF + cvm::real err; + czar_pmf->set_div(); + czar_pmf->integrate(integrate_initial_steps, integrate_initial_tol, err); + czar_pmf->set_zero_minimum(); + std::string czar_pmf_out_name = prefix + ".czar.pmf"; - std::ostream *czar_pmf_os = - cvm::proxy->output_stream(czar_pmf_out_name, mode); - if (!czar_pmf_os) cvm::error("Error opening CZAR pmf file " + czar_pmf_out_name + " for writing"); - czar_gradients->write_1D_integral(*czar_pmf_os); + std::ostream *czar_pmf_os = cvm::proxy->output_stream(czar_pmf_out_name, mode); + if (!czar_pmf_os) { + cvm::error("Error opening CZAR pmf file " + czar_pmf_out_name + " for writing"); + return; + } + czar_pmf->write_multicol(*czar_pmf_os); + + // In dimension higher than 2, dx is easier to handle and visualize + if (num_variables() > 2) { + std::string czar_pmf_dx_out_name = prefix + ".czar.pmf.dx"; + std::ostream *czar_pmf_dx_os = cvm::proxy->output_stream(czar_pmf_dx_out_name, mode); + if (!czar_pmf_dx_os) { + cvm::error("Error opening CZAR pmf file " + czar_pmf_dx_out_name + " for writing"); + return; + } + czar_pmf->write_opendx(*czar_pmf_dx_os); + *czar_pmf_dx_os << std::endl; + cvm::proxy->close_output_stream(czar_pmf_dx_out_name); + } + *czar_pmf_os << std::endl; cvm::proxy->close_output_stream(czar_pmf_out_name); } @@ -708,6 +827,10 @@ std::istream & colvarbias_abf::read_state_data(std::istream& is) if (! gradients->read_raw(is)) { return is; } + if (b_integrate) { + // Update divergence to account for restart data + pmf->set_div(); + } if (b_CZAR_estimator) { diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h index 1defe72268..0260401292 100644 --- a/lib/colvars/colvarbias_abf.h +++ b/lib/colvars/colvarbias_abf.h @@ -40,28 +40,44 @@ private: /// Base filename(s) for reading previous gradient data (replaces data from restart file) std::vector input_prefix; - bool update_bias; - bool hide_Jacobian; - size_t full_samples; - size_t min_samples; + bool update_bias; + bool hide_Jacobian; + bool b_integrate; + + size_t full_samples; + size_t min_samples; /// frequency for updating output files - int output_freq; + int output_freq; /// Write combined files with a history of all output data? - bool b_history_files; + bool b_history_files; /// Write CZAR output file for stratified eABF (.zgrad) - bool b_czar_window_file; - size_t history_freq; + bool b_czar_window_file; + size_t history_freq; /// Umbrella Integration estimator of free energy from eABF UIestimator::UIestimator eabf_UI; - // Run UI estimator? - bool b_UI_estimator; - // Run CZAR estimator? - bool b_CZAR_estimator; + /// Run UI estimator? + bool b_UI_estimator; + /// Run CZAR estimator? + bool b_CZAR_estimator; - /// Cap applied biasing force? + /// Frequency for updating pABF PMF (if zero, pABF is not used) + int pabf_freq; + /// Max number of CG iterations for integrating PMF at startup and for file output + int integrate_initial_steps; + /// Tolerance for integrating PMF at startup and for file output + cvm::real integrate_initial_tol; + /// Max number of CG iterations for integrating PMF at on-the-fly pABF updates + int integrate_steps; + /// Tolerance for integrating PMF at on-the-fly pABF updates + cvm::real integrate_tol; + + /// Cap the biasing force to be applied? bool cap_force; std::vector max_force; + // Frequency for updating 2D gradients + int integrate_freq; + // Internal data and methods std::vector bin, force_bin, z_bin; @@ -71,12 +87,16 @@ private: colvar_grid_gradient *gradients; /// n-dim grid of number of samples colvar_grid_count *samples; + /// n-dim grid of pmf (dimension 1 to 3) + integrate_potential *pmf; /// n-dim grid: average force on "real" coordinate for eABF z-based estimator colvar_grid_gradient *z_gradients; /// n-dim grid of number of samples on "real" coordinate for eABF z-based estimator colvar_grid_count *z_samples; /// n-dim grid contining CZAR estimator of "real" free energy gradients colvar_grid_gradient *czar_gradients; + /// n-dim grid of CZAR pmf (dimension 1 to 3) + integrate_potential *czar_pmf; inline int update_system_force(size_t i) { @@ -96,9 +116,9 @@ private: } // shared ABF - bool shared_on; - size_t shared_freq; - int shared_last_step; + bool shared_on; + size_t shared_freq; + int shared_last_step; // Share between replicas -- may be called independently of update virtual int replica_share(); @@ -114,12 +134,12 @@ private: //// Give the count at a given bin index. virtual int bin_count(int bin_index); - /// Write human-readable FE gradients and sample count - void write_gradients_samples(const std::string &prefix, bool append = false); - void write_last_gradients_samples(const std::string &prefix, bool append = false); + /// Write human-readable FE gradients and sample count, and DX file in dim > 2 + void write_gradients_samples(const std::string &prefix, bool append = false); + void write_last_gradients_samples(const std::string &prefix, bool append = false); /// Read human-readable FE gradients and sample count (if not using restart) - void read_gradients_samples(); + void read_gradients_samples(); std::istream& read_state_data(std::istream&); std::ostream& write_state_data(std::ostream&); diff --git a/lib/colvars/colvarbias_alb.cpp b/lib/colvars/colvarbias_alb.cpp index 124a15c5da..187ecc363a 100644 --- a/lib/colvars/colvarbias_alb.cpp +++ b/lib/colvars/colvarbias_alb.cpp @@ -7,13 +7,11 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. -#include -#include -#include +#include #include "colvarmodule.h" -#include "colvarbias_alb.h" #include "colvarbias.h" +#include "colvarbias_alb.h" #ifdef _MSC_VER #if _MSC_VER <= 1700 @@ -45,22 +43,22 @@ int colvarbias_alb::init(std::string const &conf) size_t i; // get the initial restraint centers - colvar_centers.resize(colvars.size()); + colvar_centers.resize(num_variables()); - means.resize(colvars.size()); - ssd.resize(colvars.size()); //sum of squares of differences from mean + means.resize(num_variables()); + ssd.resize(num_variables()); //sum of squares of differences from mean //setup force vectors - max_coupling_range.resize(colvars.size()); - max_coupling_rate.resize(colvars.size()); - coupling_accum.resize(colvars.size()); - set_coupling.resize(colvars.size()); - current_coupling.resize(colvars.size()); - coupling_rate.resize(colvars.size()); + max_coupling_range.resize(num_variables()); + max_coupling_rate.resize(num_variables()); + coupling_accum.resize(num_variables()); + set_coupling.resize(num_variables()); + current_coupling.resize(num_variables()); + coupling_rate.resize(num_variables()); enable(f_cvb_apply_force); - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvar_centers[i].type(colvars[i]->value()); //zero moments means[i] = ssd[i] = 0; @@ -70,7 +68,7 @@ int colvarbias_alb::init(std::string const &conf) } if (get_keyval(conf, "centers", colvar_centers, colvar_centers)) { - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvar_centers[i].apply_constraints(); } } else { @@ -78,7 +76,7 @@ int colvarbias_alb::init(std::string const &conf) cvm::fatal_error("Error: must define the initial centers of adaptive linear bias .\n"); } - if (colvar_centers.size() != colvars.size()) + if (colvar_centers.size() != num_variables()) cvm::fatal_error("Error: number of centers does not match " "that of collective variables.\n"); @@ -100,17 +98,17 @@ int colvarbias_alb::init(std::string const &conf) //initial guess if (!get_keyval(conf, "forceConstant", set_coupling, set_coupling)) - for (i =0 ; i < colvars.size(); i++) + for (i =0 ; i < num_variables(); i++) set_coupling[i] = 0.; //how we're going to increase to that point - for (i = 0; i < colvars.size(); i++) + for (i = 0; i < num_variables(); i++) coupling_rate[i] = (set_coupling[i] - current_coupling[i]) / update_freq; if (!get_keyval(conf, "forceRange", max_coupling_range, max_coupling_range)) { //set to default - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { if (cvm::temperature() > 0) max_coupling_range[i] = 3 * cvm::temperature() * cvm::boltzmann(); else @@ -120,7 +118,7 @@ int colvarbias_alb::init(std::string const &conf) if (!get_keyval(conf, "rateMax", max_coupling_rate, max_coupling_rate)) { //set to default - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { max_coupling_rate[i] = max_coupling_range[i] / (10 * update_freq); } } @@ -151,7 +149,7 @@ int colvarbias_alb::update() // Force and energy calculation bool finished_equil_flag = 1; cvm::real delta; - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { colvar_forces[i] = -1.0 * restraint_force(restraint_convert_k(current_coupling[i], colvars[i]->width), colvars[i], colvar_centers[i]); @@ -168,7 +166,9 @@ int colvarbias_alb::update() } else { //check if we've reached the setpoint - if (coupling_rate[i] == 0 || pow(current_coupling[i] - set_coupling[i],2) < pow(coupling_rate[i],2)) { + cvm::real const coupling_diff = current_coupling[i] - set_coupling[i]; + if ((coupling_rate[i] == 0) || + ((coupling_diff*coupling_diff) < (coupling_rate[i]*coupling_rate[i]))) { finished_equil_flag &= 1; //we continue equilibrating as long as we haven't reached all the set points } else { @@ -209,7 +209,7 @@ int colvarbias_alb::update() cvm::real temp; //reset means and sum of squares of differences - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { temp = 2. * (means[i] / (static_cast (colvar_centers[i])) - 1) * ssd[i] / (update_calls - 1); @@ -222,7 +222,7 @@ int colvarbias_alb::update() ssd[i] = 0; //stochastic if we do that update or not - if (colvars.size() == 1 || rand() < RAND_MAX / ((int) colvars.size())) { + if (num_variables() == 1 || rand() < RAND_MAX / ((int) num_variables())) { coupling_accum[i] += step_size * step_size; current_coupling[i] = set_coupling[i]; set_coupling[i] += max_coupling_range[i] / sqrt(coupling_accum[i]) * step_size; @@ -284,37 +284,37 @@ std::string const colvarbias_alb::get_state_params() const std::ostringstream os; os << " setCoupling "; size_t i; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << set_coupling[i] << "\n"; } os << " currentCoupling "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << current_coupling[i] << "\n"; } os << " maxCouplingRange "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << max_coupling_range[i] << "\n"; } os << " couplingRate "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << coupling_rate[i] << "\n"; } os << " couplingAccum "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << coupling_accum[i] << "\n"; } os << " mean "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << means[i] << "\n"; } os << " ssd "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << ssd[i] << "\n"; } @@ -350,7 +350,7 @@ std::ostream & colvarbias_alb::write_traj_label(std::ostream &os) } if (b_output_centers) - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { size_t const this_cv_width = (colvars[i]->value()).output_width(cvm::cv_width); os << " x0_" << cvm::wrap_string(colvars[i]->name, this_cv_width-3); @@ -378,7 +378,7 @@ std::ostream & colvarbias_alb::write_traj(std::ostream &os) if (b_output_centers) - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { os << " " << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) << colvar_centers[i]; diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp index 0722e6384d..329b1d9dc0 100644 --- a/lib/colvars/colvarbias_histogram.cpp +++ b/lib/colvars/colvarbias_histogram.cpp @@ -8,10 +8,10 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvar.h" #include "colvarbias_histogram.h" -/// Histogram "bias" constructor colvarbias_histogram::colvarbias_histogram(char const *key) : colvarbias(key), @@ -44,7 +44,7 @@ int colvarbias_histogram::init(std::string const &conf) get_keyval(conf, "gatherVectorColvars", colvar_array, colvar_array); if (colvar_array) { - for (i = 0; i < colvars.size(); i++) { // should be all vector + for (i = 0; i < num_variables(); i++) { // should be all vector if (colvars[i]->value().type() != colvarvalue::type_vector) { cvm::error("Error: used gatherVectorColvars with non-vector colvar.\n", INPUT_ERROR); return INPUT_ERROR; @@ -63,7 +63,7 @@ int colvarbias_histogram::init(std::string const &conf) } } } else { - for (i = 0; i < colvars.size(); i++) { // should be all scalar + for (i = 0; i < num_variables(); i++) { // should be all scalar if (colvars[i]->value().type() != colvarvalue::type_scalar) { cvm::error("Error: only scalar colvars are supported when gatherVectorColvars is off.\n", INPUT_ERROR); return INPUT_ERROR; @@ -77,7 +77,7 @@ int colvarbias_histogram::init(std::string const &conf) get_keyval(conf, "weights", weights, weights); } - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvars[i]->enable(f_cv_grid); } @@ -116,7 +116,7 @@ int colvarbias_histogram::update() } // assign a valid bin size - bin.assign(colvars.size(), 0); + bin.assign(num_variables(), 0); if (out_name.size() == 0) { // At the first timestep, we need to assign out_name since @@ -137,7 +137,7 @@ int colvarbias_histogram::update() if (colvar_array_size == 0) { // update indices for scalar values size_t i; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { bin[i] = grid->current_bin_scalar(i); } @@ -148,7 +148,7 @@ int colvarbias_histogram::update() // update indices for vector/array values size_t iv, i; for (iv = 0; iv < colvar_array_size; iv++) { - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { bin[i] = grid->current_bin_scalar(i, iv); } diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index b0d154dfc9..f3ae3631a0 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -27,7 +27,8 @@ #define PATHSEP "/" #endif - +#include "colvarmodule.h" +#include "colvarproxy.h" #include "colvar.h" #include "colvarbias_meta.h" diff --git a/lib/colvars/colvarbias_restraint.cpp b/lib/colvars/colvarbias_restraint.cpp index 23534f56eb..4ed1a95f94 100644 --- a/lib/colvars/colvarbias_restraint.cpp +++ b/lib/colvars/colvarbias_restraint.cpp @@ -7,7 +7,10 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. +#include + #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarvalue.h" #include "colvarbias_restraint.h" @@ -150,13 +153,14 @@ colvarbias_restraint_k::colvarbias_restraint_k(char const *key) : colvarbias(key), colvarbias_ti(key), colvarbias_restraint(key) { force_k = -1.0; + check_positive_k = true; } int colvarbias_restraint_k::init(std::string const &conf) { get_keyval(conf, "forceConstant", force_k, (force_k > 0.0 ? force_k : 1.0)); - if (force_k < 0.0) { + if (check_positive_k && (force_k < 0.0)) { cvm::error("Error: undefined or invalid force constant.\n", INPUT_ERROR); return INPUT_ERROR; } @@ -177,6 +181,7 @@ colvarbias_restraint_moving::colvarbias_restraint_moving(char const *key) target_nstages = 0; target_nsteps = 0; stage = 0; + acc_work = 0.0; b_chg_centers = false; b_chg_force_k = false; } @@ -203,6 +208,14 @@ int colvarbias_restraint_moving::init(std::string const &conf) cvm::error("Error: targetNumStages and lambdaSchedule are incompatible.\n", INPUT_ERROR); return cvm::get_error(); } + + get_keyval_feature(this, conf, "outputAccumulatedWork", + f_cvb_output_acc_work, + is_enabled(f_cvb_output_acc_work)); + if (is_enabled(f_cvb_output_acc_work) && (target_nstages > 0)) { + return cvm::error("Error: outputAccumulatedWork and targetNumStages " + "are incompatible.\n", INPUT_ERROR); + } } return COLVARS_OK; @@ -246,8 +259,6 @@ colvarbias_restraint_centers_moving::colvarbias_restraint_centers_moving(char co { b_chg_centers = false; b_output_centers = false; - b_output_acc_work = false; - acc_work = 0.0; } @@ -288,9 +299,6 @@ int colvarbias_restraint_centers_moving::init(std::string const &conf) 0.5); } - get_keyval(conf, "outputAccumulatedWork", b_output_acc_work, - b_output_acc_work); // TODO this conflicts with stages - } else { target_centers.clear(); } @@ -382,12 +390,14 @@ int colvarbias_restraint_centers_moving::update() int colvarbias_restraint_centers_moving::update_acc_work() { - if (b_output_acc_work) { - if ((cvm::step_relative() > 0) && - (cvm::step_absolute() <= target_nsteps)) { - for (size_t i = 0; i < num_variables(); i++) { - // project forces on the calculated increments at this step - acc_work += colvar_forces[i] * centers_incr[i]; + if (b_chg_centers) { + if (is_enabled(f_cvb_output_acc_work)) { + if ((cvm::step_relative() > 0) && + (cvm::step_absolute() <= target_nsteps)) { + for (size_t i = 0; i < num_variables(); i++) { + // project forces on the calculated increments at this step + acc_work += colvar_forces[i] * centers_incr[i]; + } } } } @@ -410,7 +420,7 @@ std::string const colvarbias_restraint_centers_moving::get_state_params() const } os << "\n"; - if (b_output_acc_work) { + if (is_enabled(f_cvb_output_acc_work)) { os << "accumulatedWork " << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << acc_work << "\n"; @@ -429,7 +439,7 @@ int colvarbias_restraint_centers_moving::set_state_params(std::string const &con // cvm::log ("Reading the updated restraint centers from the restart.\n"); if (!get_keyval(conf, "centers", colvar_centers)) cvm::error("Error: restraint centers are missing from the restart.\n"); - if (b_output_acc_work) { + if (is_enabled(f_cvb_output_acc_work)) { if (!get_keyval(conf, "accumulatedWork", acc_work)) cvm::error("Error: accumulatedWork is missing from the restart.\n"); } @@ -449,7 +459,7 @@ std::ostream & colvarbias_restraint_centers_moving::write_traj_label(std::ostrea } } - if (b_output_acc_work) { + if (b_chg_centers && is_enabled(f_cvb_output_acc_work)) { os << " W_" << cvm::wrap_string(this->name, cvm::en_width-2); } @@ -468,7 +478,7 @@ std::ostream & colvarbias_restraint_centers_moving::write_traj(std::ostream &os) } } - if (b_output_acc_work) { + if (b_chg_centers && is_enabled(f_cvb_output_acc_work)) { os << " " << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << acc_work; @@ -488,10 +498,11 @@ colvarbias_restraint_k_moving::colvarbias_restraint_k_moving(char const *key) { b_chg_force_k = false; target_equil_steps = 0; - target_force_k = 0.0; - starting_force_k = 0.0; + target_force_k = -1.0; + starting_force_k = -1.0; force_k_exp = 1.0; restraint_FE = 0.0; + force_k_incr = 0.0; } @@ -569,14 +580,13 @@ int colvarbias_restraint_k_moving::update() if (target_equil_steps == 0 || cvm::step_absolute() % target_nsteps >= target_equil_steps) { // Start averaging after equilibration period, if requested - // Square distance normalized by square colvar width - cvm::real dist_sq = 0.0; + // Derivative of energy with respect to force_k + cvm::real dU_dk = 0.0; for (size_t i = 0; i < num_variables(); i++) { - dist_sq += d_restraint_potential_dk(i); + dU_dk += d_restraint_potential_dk(i); } - - restraint_FE += 0.5 * force_k_exp * std::pow(lambda, force_k_exp - 1.0) - * (target_force_k - starting_force_k) * dist_sq; + restraint_FE += force_k_exp * std::pow(lambda, force_k_exp - 1.0) + * (target_force_k - starting_force_k) * dU_dk; } // Finish current stage... @@ -607,10 +617,13 @@ int colvarbias_restraint_k_moving::update() } else if (cvm::step_absolute() <= target_nsteps) { + // update force constant (slow growth) lambda = cvm::real(cvm::step_absolute()) / cvm::real(target_nsteps); + cvm::real const force_k_old = force_k; force_k = starting_force_k + (target_force_k - starting_force_k) * std::pow(lambda, force_k_exp); + force_k_incr = force_k - force_k_old; } } @@ -618,6 +631,23 @@ int colvarbias_restraint_k_moving::update() } +int colvarbias_restraint_k_moving::update_acc_work() +{ + if (b_chg_force_k) { + if (is_enabled(f_cvb_output_acc_work)) { + if (cvm::step_relative() > 0) { + cvm::real dU_dk = 0.0; + for (size_t i = 0; i < num_variables(); i++) { + dU_dk += d_restraint_potential_dk(i); + } + acc_work += dU_dk * force_k_incr; + } + } + } + return COLVARS_OK; +} + + std::string const colvarbias_restraint_k_moving::get_state_params() const { std::ostringstream os; @@ -626,6 +656,12 @@ std::string const colvarbias_restraint_k_moving::get_state_params() const os << "forceConstant " << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << force_k << "\n"; + + if (is_enabled(f_cvb_output_acc_work)) { + os << "accumulatedWork " + << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) + << acc_work << "\n"; + } } return os.str(); } @@ -639,6 +675,10 @@ int colvarbias_restraint_k_moving::set_state_params(std::string const &conf) // cvm::log ("Reading the updated force constant from the restart.\n"); if (!get_keyval(conf, "forceConstant", force_k, force_k)) cvm::error("Error: force constant is missing from the restart.\n"); + if (is_enabled(f_cvb_output_acc_work)) { + if (!get_keyval(conf, "accumulatedWork", acc_work)) + cvm::error("Error: accumulatedWork is missing from the restart.\n"); + } } return COLVARS_OK; @@ -647,12 +687,21 @@ int colvarbias_restraint_k_moving::set_state_params(std::string const &conf) std::ostream & colvarbias_restraint_k_moving::write_traj_label(std::ostream &os) { + if (b_chg_force_k && is_enabled(f_cvb_output_acc_work)) { + os << " W_" + << cvm::wrap_string(this->name, cvm::en_width-2); + } return os; } std::ostream & colvarbias_restraint_k_moving::write_traj(std::ostream &os) { + if (b_chg_force_k && is_enabled(f_cvb_output_acc_work)) { + os << " " + << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) + << acc_work; + } return os; } @@ -765,6 +814,7 @@ int colvarbias_restraint_harmonic::update() // update accumulated work using the current forces error_code |= colvarbias_restraint_centers_moving::update_acc_work(); + error_code |= colvarbias_restraint_k_moving::update_acc_work(); return error_code; } @@ -876,8 +926,8 @@ colvarbias_restraint_harmonic_walls::colvarbias_restraint_harmonic_walls(char co colvarbias_restraint_moving(key), colvarbias_restraint_k_moving(key) { - lower_wall_k = 0.0; - upper_wall_k = 0.0; + lower_wall_k = -1.0; + upper_wall_k = -1.0; } @@ -887,26 +937,6 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) colvarbias_restraint_moving::init(conf); colvarbias_restraint_k_moving::init(conf); - get_keyval(conf, "lowerWallConstant", lower_wall_k, - (lower_wall_k > 0.0) ? lower_wall_k : force_k); - get_keyval(conf, "upperWallConstant", upper_wall_k, - (upper_wall_k > 0.0) ? upper_wall_k : force_k); - - if (lower_wall_k * upper_wall_k > 0.0) { - for (size_t i = 0; i < num_variables(); i++) { - if (variables(i)->width != 1.0) - cvm::log("The lower and upper wall force constants for colvar \""+ - variables(i)->name+ - "\" will be rescaled to "+ - cvm::to_str(lower_wall_k / - (variables(i)->width * variables(i)->width))+ - " and "+ - cvm::to_str(upper_wall_k / - (variables(i)->width * variables(i)->width))+ - " according to the specified width.\n"); - } - } - enable(f_cvb_scalar_variables); size_t i; @@ -942,16 +972,23 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) } if ((lower_walls.size() == 0) && (upper_walls.size() == 0)) { - cvm::error("Error: no walls provided.\n", INPUT_ERROR); - return INPUT_ERROR; + return cvm::error("Error: no walls provided.\n", INPUT_ERROR); + } + + if (lower_walls.size() > 0) { + get_keyval(conf, "lowerWallConstant", lower_wall_k, + (lower_wall_k > 0.0) ? lower_wall_k : force_k); + } + if (upper_walls.size() > 0) { + get_keyval(conf, "upperWallConstant", upper_wall_k, + (upper_wall_k > 0.0) ? upper_wall_k : force_k); } if ((lower_walls.size() == 0) || (upper_walls.size() == 0)) { for (i = 0; i < num_variables(); i++) { if (variables(i)->is_enabled(f_cv_periodic)) { - cvm::error("Error: at least one variable is periodic, " - "both walls must be provided.\n", INPUT_ERROR); - return INPUT_ERROR; + return cvm::error("Error: at least one variable is periodic, " + "both walls must be provided.\n", INPUT_ERROR); } } } @@ -972,19 +1009,49 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) INPUT_ERROR); return INPUT_ERROR; } - force_k = lower_wall_k * upper_wall_k; - // transform the two constants to relative values + force_k = std::sqrt(lower_wall_k * upper_wall_k); + // transform the two constants to relative values using gemetric mean as ref + // to preserve force_k if provided as single parameter // (allow changing both via force_k) lower_wall_k /= force_k; upper_wall_k /= force_k; + } else { + // If only one wall is defined, need to rescale as well + if (lower_walls.size() > 0) { + force_k = lower_wall_k; + lower_wall_k = 1.0; + } + if (upper_walls.size() > 0) { + force_k = upper_wall_k; + upper_wall_k = 1.0; + } } - for (i = 0; i < num_variables(); i++) { - if (variables(i)->width != 1.0) - cvm::log("The force constant for colvar \""+variables(i)->name+ - "\" will be rescaled to "+ - cvm::to_str(force_k / (variables(i)->width * variables(i)->width))+ - " according to the specified width.\n"); + // Initialize starting value of the force constant (in case it's changing) + starting_force_k = force_k; + + if (lower_walls.size() > 0) { + for (i = 0; i < num_variables(); i++) { + if (variables(i)->width != 1.0) + cvm::log("The lower wall force constant for colvar \""+ + variables(i)->name+ + "\" will be rescaled to "+ + cvm::to_str(lower_wall_k * force_k / + (variables(i)->width * variables(i)->width))+ + " according to the specified width.\n"); + } + } + + if (upper_walls.size() > 0) { + for (i = 0; i < num_variables(); i++) { + if (variables(i)->width != 1.0) + cvm::log("The upper wall force constant for colvar \""+ + variables(i)->name+ + "\" will be rescaled to "+ + cvm::to_str(upper_wall_k * force_k / + (variables(i)->width * variables(i)->width))+ + " according to the specified width.\n"); + } } return COLVARS_OK; @@ -1001,6 +1068,8 @@ int colvarbias_restraint_harmonic_walls::update() error_code |= colvarbias_restraint::update(); + error_code |= colvarbias_restraint_k_moving::update_acc_work(); + return error_code; } @@ -1134,6 +1203,7 @@ colvarbias_restraint_linear::colvarbias_restraint_linear(char const *key) colvarbias_restraint_centers_moving(key), colvarbias_restraint_k_moving(key) { + check_positive_k = false; } @@ -1177,6 +1247,7 @@ int colvarbias_restraint_linear::update() // update accumulated work using the current forces error_code |= colvarbias_restraint_centers_moving::update_acc_work(); + error_code |= colvarbias_restraint_k_moving::update_acc_work(); return error_code; } diff --git a/lib/colvars/colvarbias_restraint.h b/lib/colvars/colvarbias_restraint.h index b10649cab1..3ee999c262 100644 --- a/lib/colvars/colvarbias_restraint.h +++ b/lib/colvars/colvarbias_restraint.h @@ -89,8 +89,12 @@ public: virtual int change_configuration(std::string const &conf); protected: + /// \brief Restraint force constant cvm::real force_k; + + /// \brief Whether the force constant should be positive + bool check_positive_k; }; @@ -129,6 +133,9 @@ protected: /// \brief Number of steps required to reach the target force constant /// or restraint centers long target_nsteps; + + /// \brief Accumulated work (computed when outputAccumulatedWork == true) + cvm::real acc_work; }; @@ -157,8 +164,7 @@ protected: /// \brief Initial value of the restraint centers std::vector initial_centers; - /// \brief Amplitude of the restraint centers' increment at each step - /// towards the new values (calculated from target_nsteps) + /// \brief Increment of the restraint centers at each step std::vector centers_incr; /// \brief Update the centers by interpolating between initial and target @@ -167,12 +173,6 @@ protected: /// Whether to write the current restraint centers to the trajectory file bool b_output_centers; - /// Whether to write the current accumulated work to the trajectory file - bool b_output_acc_work; - - /// \brief Accumulated work - cvm::real acc_work; - /// Update the accumulated work int update_acc_work(); }; @@ -212,6 +212,12 @@ protected: /// \brief Equilibration steps for restraint FE calculation through TI cvm::real target_equil_steps; + + /// \brief Increment of the force constant at each step + cvm::real force_k_incr; + + /// Update the accumulated work + int update_acc_work(); }; diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index b94d798be9..52078a3a30 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -20,52 +20,48 @@ // simple_scalar_dist_functions (derived_class) -#include -#include - - #include "colvarmodule.h" #include "colvar.h" #include "colvaratoms.h" -/// \brief Colvar component (base class); most implementations of -/// \link cvc \endlink utilize one or more \link -/// colvarmodule::atom \endlink or \link colvarmodule::atom_group -/// \endlink objects to access atoms. +/// \brief Colvar component (base class for collective variables) /// /// A \link cvc \endlink object (or an object of a -/// cvc-derived class) specifies how to calculate a collective -/// variable, its gradients and other related physical quantities -/// which do not depend only on the numeric value (the \link colvar -/// \endlink class already serves this purpose). +/// cvc-derived class) implements the calculation of a collective +/// variable, its gradients and any other related physical quantities +/// that depend on microscopic degrees of freedom. /// -/// No restriction is set to what kind of calculation a \link -/// cvc \endlink object performs (usually calculate an -/// analytical function of atomic coordinates). The only constraint -/// is that the value calculated is implemented as a \link colvarvalue -/// \endlink object. This serves to provide a unique way to calculate -/// scalar and non-scalar collective variables, and specify if and how -/// they can be combined together by the parent \link colvar \endlink -/// object. +/// No restriction is set to what kind of calculation a \link cvc \endlink +/// object performs (usually an analytical function of atomic coordinates). +/// The only constraints are that: \par +/// +/// - The value is calculated by the \link calc_value() \endlink +/// method, and is an object of \link colvarvalue \endlink class. This +/// provides a transparent way to treat scalar and non-scalar variables +/// alike, and allows an automatic selection of the applicable algorithms. +/// +/// - The object provides an implementation \link apply_force() \endlink to +/// apply forces to atoms. Typically, one or more \link cvm::atom_group +/// \endlink objects are used, but this is not a requirement for as long as +/// the \link cvc \endlink object communicates with the simulation program. /// /// If you wish to implement a new collective variable component, you /// should write your own class by inheriting directly from \link -/// cvc \endlink, or one of its derived classes (for instance, -/// \link distance \endlink is frequently used, because it provides +/// colvar::cvc \endlink, or one of its derived classes (for instance, +/// \link colvar::distance \endlink is frequently used, because it provides /// useful data and function members for any colvar based on two -/// atom groups). The steps are: \par -/// 1. add the name of this class under colvar.h \par -/// 2. add a call to the parser in colvar.C, within the function colvar::colvar() \par -/// 3. declare the class in colvarcomp.h \par -/// 4. implement the class in one of the files colvarcomp_*.C +/// atom groups). +/// +/// The steps are: \par +/// 1. Declare the new class as a derivative of \link colvar::cvc \endlink +/// in the file \link colvarcomp.h \endlink +/// 2. Implement the new class in a file named colvarcomp_.cpp +/// 3. Declare the name of the new class inside the \link colvar \endlink class +/// in \link colvar.h \endlink (see "list of available components") +/// 4. Add a call for the new class in colvar::init_components() +//// (file: colvar.cpp) /// -/// -/// The cvm::atom and cvm::atom_group classes are available to -/// transparently communicate with the simulation program. However, -/// they are not strictly needed, as long as all the degrees of -/// freedom associated to the cvc are properly evolved by a simple -/// call to e.g. apply_force(). class colvar::cvc : public colvarparse, public colvardeps @@ -155,7 +151,7 @@ public: /// \brief Calculate the atomic gradients, to be reused later in /// order to apply forces - virtual void calc_gradients() = 0; + virtual void calc_gradients() {} /// \brief Calculate the atomic fit gradients void calc_fit_gradients(); diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index ce8055843f..9911f4c87e 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -581,6 +581,12 @@ colvar::distance_inv::distance_inv(std::string const &conf) } } + if (is_enabled(f_cvc_debug_gradient)) { + cvm::log("Warning: debugGradients will not give correct results " + "for distanceInv, because its value and gradients are computed " + "simultaneously.\n"); + } + x.type(colvarvalue::type_scalar); } @@ -601,11 +607,9 @@ void colvar::distance_inv::calc_value() for (cvm::atom_iter ai2 = group2->begin(); ai2 != group2->end(); ai2++) { cvm::rvector const dv = ai2->pos - ai1->pos; cvm::real const d2 = dv.norm2(); - cvm::real dinv = 1.0; - for (int ne = 0; ne < exponent/2; ne++) - dinv *= 1.0/d2; + cvm::real const dinv = cvm::integer_power(d2, -1*(exponent/2)); x.real_value += dinv; - cvm::rvector const dsumddv = -(cvm::real(exponent)) * dinv/d2 * dv; + cvm::rvector const dsumddv = -1.0*(exponent/2) * dinv/d2 * 2.0 * dv; ai1->grad += -1.0 * dsumddv; ai2->grad += dsumddv; } @@ -615,11 +619,9 @@ void colvar::distance_inv::calc_value() for (cvm::atom_iter ai2 = group2->begin(); ai2 != group2->end(); ai2++) { cvm::rvector const dv = cvm::position_distance(ai1->pos, ai2->pos); cvm::real const d2 = dv.norm2(); - cvm::real dinv = 1.0; - for (int ne = 0; ne < exponent/2; ne++) - dinv *= 1.0/d2; + cvm::real const dinv = cvm::integer_power(d2, -1*(exponent/2)); x.real_value += dinv; - cvm::rvector const dsumddv = -(cvm::real(exponent)) * dinv/d2 * dv; + cvm::rvector const dsumddv = -1.0*(exponent/2) * dinv/d2 * 2.0 * dv; ai1->grad += -1.0 * dsumddv; ai2->grad += dsumddv; } @@ -627,13 +629,11 @@ void colvar::distance_inv::calc_value() } x.real_value *= 1.0 / cvm::real(group1->size() * group2->size()); - x.real_value = std::pow(x.real_value, -1.0/(cvm::real(exponent))); -} + x.real_value = std::pow(x.real_value, -1.0/cvm::real(exponent)); - -void colvar::distance_inv::calc_gradients() -{ - cvm::real const dxdsum = (-1.0/(cvm::real(exponent))) * std::pow(x.real_value, exponent+1) / cvm::real(group1->size() * group2->size()); + cvm::real const dxdsum = (-1.0/(cvm::real(exponent))) * + cvm::integer_power(x.real_value, exponent+1) / + cvm::real(group1->size() * group2->size()); for (cvm::atom_iter ai1 = group1->begin(); ai1 != group1->end(); ai1++) { ai1->grad *= dxdsum; } @@ -643,6 +643,11 @@ void colvar::distance_inv::calc_gradients() } +void colvar::distance_inv::calc_gradients() +{ +} + + void colvar::distance_inv::apply_force(colvarvalue const &force) { if (!group1->noforce) diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index ac906e7be7..a058ad55c2 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -8,10 +8,16 @@ // Colvars repository at GitHub. +#include "colvarmodule.h" +#include "colvarproxy.h" #include "colvardeps.h" + colvardeps::colvardeps() - : time_step_factor (1) {} +{ + time_step_factor = 1; +} + colvardeps::~colvardeps() { size_t i; @@ -416,6 +422,9 @@ void colvardeps::init_cvb_requires() { init_feature(f_cvb_get_total_force, "obtain total force", f_type_dynamic); f_req_children(f_cvb_get_total_force, f_cv_total_force); + init_feature(f_cvb_output_acc_work, "output accumulated work", f_type_user); + f_req_self(f_cvb_output_acc_work, f_cvb_apply_force); + init_feature(f_cvb_history_dependent, "history-dependent", f_type_static); init_feature(f_cvb_time_dependent, "time-dependent", f_type_static); diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index bd892fbca8..940eefb01b 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -225,6 +225,8 @@ public: f_cvb_apply_force, /// \brief requires total forces f_cvb_get_total_force, + /// \brief whether this bias should record the accumulated work + f_cvb_output_acc_work, /// \brief depends on simulation history f_cvb_history_dependent, /// \brief depends on time diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index 9016e2c23a..1ac4aae133 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -14,6 +14,7 @@ #include "colvarcomp.h" #include "colvargrid.h" +#include colvar_grid_count::colvar_grid_count() : colvar_grid() @@ -22,43 +23,37 @@ colvar_grid_count::colvar_grid_count() } colvar_grid_count::colvar_grid_count(std::vector const &nx_i, - size_t const &def_count) + size_t const &def_count) : colvar_grid(nx_i, def_count, 1) {} colvar_grid_count::colvar_grid_count(std::vector &colvars, - size_t const &def_count) - : colvar_grid(colvars, def_count, 1) + size_t const &def_count, + bool margin) + : colvar_grid(colvars, def_count, 1, margin) {} colvar_grid_scalar::colvar_grid_scalar() - : colvar_grid(), samples(NULL), grad(NULL) + : colvar_grid(), samples(NULL) {} colvar_grid_scalar::colvar_grid_scalar(colvar_grid_scalar const &g) - : colvar_grid(g), samples(NULL), grad(NULL) + : colvar_grid(g), samples(NULL) { - grad = new cvm::real[nd]; } colvar_grid_scalar::colvar_grid_scalar(std::vector const &nx_i) - : colvar_grid(nx_i, 0.0, 1), samples(NULL), grad(NULL) + : colvar_grid(nx_i, 0.0, 1), samples(NULL) { - grad = new cvm::real[nd]; } colvar_grid_scalar::colvar_grid_scalar(std::vector &colvars, bool margin) - : colvar_grid(colvars, 0.0, 1, margin), samples(NULL), grad(NULL) + : colvar_grid(colvars, 0.0, 1, margin), samples(NULL) { - grad = new cvm::real[nd]; } colvar_grid_scalar::~colvar_grid_scalar() { - if (grad) { - delete [] grad; - grad = NULL; - } } cvm::real colvar_grid_scalar::maximum_value() const @@ -143,18 +138,18 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) os << "# xi A(xi)\n"; - if ( cv.size() != 1 ) { + if (cv.size() != 1) { cvm::error("Cannot write integral for multi-dimensional gradient grids."); return; } integral = 0.0; - int_vals.push_back( 0.0 ); + int_vals.push_back(0.0); min = 0.0; // correction for periodic colvars, so that the PMF is periodic cvm::real corr; - if ( periodic[0] ) { + if (periodic[0]) { corr = average(); } else { corr = 0.0; @@ -171,7 +166,7 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) } if ( integral < min ) min = integral; - int_vals.push_back( integral ); + int_vals.push_back(integral); } bin = 0.0; @@ -192,3 +187,670 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) +integrate_potential::integrate_potential(std::vector &colvars, colvar_grid_gradient * gradients) + : colvar_grid_scalar(colvars, true), + gradients(gradients) +{ + // parent class colvar_grid_scalar is constructed with margin option set to true + // hence PMF grid is wider than gradient grid if non-PBC + + if (nd > 1) { + divergence.resize(nt); + + // Compute inverse of Laplacian diagonal for Jacobi preconditioning + // For now all code related to preconditioning is commented out + // until a method better than Jacobi is implemented +// cvm::log("Preparing inverse diagonal for preconditioning..."); +// inv_lap_diag.resize(nt); +// std::vector id(nt), lap_col(nt); +// for (int i = 0; i < nt; i++) { +// if (i % (nt / 100) == 0) +// cvm::log(cvm::to_str(i)); +// id[i] = 1.; +// atimes(id, lap_col); +// id[i] = 0.; +// inv_lap_diag[i] = 1. / lap_col[i]; +// } +// cvm::log("Done."); + } +} + + +int integrate_potential::integrate(const int itmax, const cvm::real &tol, cvm::real & err) +{ + int iter = 0; + + if (nd == 1) { + + cvm::real sum = 0.0; + cvm::real corr; + if ( periodic[0] ) { + corr = gradients->average(); // Enforce PBC by subtracting average gradient + } else { + corr = 0.0; + } + + std::vector ix; + // Iterate over valid indices in gradient grid + for (ix = new_index(); gradients->index_ok(ix); incr(ix)) { + set_value(ix, sum); + sum += (gradients->value_output(ix) - corr) * widths[0]; + } + if (index_ok(ix)) { + // This will happen if non-periodic: then PMF grid has one extra bin wrt gradient grid + set_value(ix, sum); + } + + } else if (nd <= 3) { + + nr_linbcg_sym(divergence, data, tol, itmax, iter, err); + cvm::log("Integrated in " + cvm::to_str(iter) + " steps, error: " + cvm::to_str(err)); + + } else { + cvm::error("Cannot integrate PMF in dimension > 3\n"); + } + + return iter; +} + + +void integrate_potential::set_div() +{ + if (nd == 1) return; + for (std::vector ix = new_index(); index_ok(ix); incr(ix)) { + update_div_local(ix); + } +} + + +void integrate_potential::update_div_neighbors(const std::vector &ix0) +{ + std::vector ix(ix0); + int i, j, k; + + // If not periodic, expanded grid ensures that neighbors of ix0 are valid grid points + if (nd == 1) { + return; + + } else if (nd == 2) { + + update_div_local(ix); + ix[0]++; wrap(ix); + update_div_local(ix); + ix[1]++; wrap(ix); + update_div_local(ix); + ix[0]--; wrap(ix); + update_div_local(ix); + + } else if (nd == 3) { + + for (i = 0; i<2; i++) { + ix[1] = ix0[1]; + for (j = 0; j<2; j++) { + ix[2] = ix0[2]; + for (k = 0; k<2; k++) { + wrap(ix); + update_div_local(ix); + ix[2]++; + } + ix[1]++; + } + ix[0]++; + } + } +} + +void integrate_potential::get_grad(cvm::real * g, std::vector &ix) +{ + size_t count, i; + bool edge = gradients->wrap_edge(ix); // Detect edge if non-PBC + + if (gradients->samples) { + count = gradients->samples->value(ix); + } else { + count = 1; + } + + if (!edge && count) { + cvm::real const *grad = &(gradients->value(ix)); + cvm::real const fact = 1.0 / count; + for ( i = 0; i &ix0) +{ + const int linear_index = address(ix0); + int i, j, k; + std::vector ix = ix0; + const cvm::real * g; + + if (nd == 2) { + // gradients at grid points surrounding the current scalar grid point + cvm::real g00[2], g01[2], g10[2], g11[2]; + + get_grad(g11, ix); + ix[0] = ix0[0] - 1; + get_grad(g01, ix); + ix[1] = ix0[1] - 1; + get_grad(g00, ix); + ix[0] = ix0[0]; + get_grad(g10, ix); + + divergence[linear_index] = ((g10[0]-g00[0] + g11[0]-g01[0]) / widths[0] + + (g01[1]-g00[1] + g11[1]-g10[1]) / widths[1]) * 0.5; + } else if (nd == 3) { + cvm::real gc[24]; // stores 3d gradients in 8 contiguous bins + int index = 0; + + ix[0] = ix0[0] - 1; + for (i = 0; i<2; i++) { + ix[1] = ix0[1] - 1; + for (j = 0; j<2; j++) { + ix[2] = ix0[2] - 1; + for (k = 0; k<2; k++) { + get_grad(gc + index, ix); + index += 3; + ix[2]++; + } + ix[1]++; + } + ix[0]++; + } + + divergence[linear_index] = + ((gc[3*4]-gc[0] + gc[3*5]-gc[3*1] + gc[3*6]-gc[3*2] + gc[3*7]-gc[3*3]) + / widths[0] + + (gc[3*2+1]-gc[0+1] + gc[3*3+1]-gc[3*1+1] + gc[3*6+1]-gc[3*4+1] + gc[3*7+1]-gc[3*5+1]) + / widths[1] + + (gc[3*1+2]-gc[0+2] + gc[3*3+2]-gc[3*2+2] + gc[3*5+2]-gc[3*4+2] + gc[3*7+2]-gc[3*6+2]) + / widths[2]) * 0.25; + } +} + + +/// Multiplication by sparse matrix representing Laplacian +/// NOTE: Laplacian must be symmetric for solving with CG +void integrate_potential::atimes(const std::vector &A, std::vector &LA) +{ + if (nd == 2) { + // DIMENSION 2 + + size_t index, index2; + int i, j; + cvm::real fact; + const cvm::real ffx = 1.0 / (widths[0] * widths[0]); + const cvm::real ffy = 1.0 / (widths[1] * widths[1]); + const int h = nx[1]; + const int w = nx[0]; + // offsets for 4 reference points of the Laplacian stencil + int xm = -h; + int xp = h; + int ym = -1; + int yp = 1; + + // NOTE on performance: this version is slightly sub-optimal because + // it contains two double loops on the core of the array (for x and y terms) + // The slightly faster version is in commit 0254cb5a2958cb2e135f268371c4b45fad34866b + // yet it is much uglier, and probably horrible to extend to dimension 3 + // All terms in the matrix are assigned (=) during the x loops, then updated (+=) + // with the y (and z) contributions + + + // All x components except on x edges + index = h; // Skip first column + + // Halve the term on y edges (if any) to preserve symmetry of the Laplacian matrix + // (Long Chen, Finite Difference Methods, UCI, 2017) + fact = periodic[1] ? 1.0 : 0.5; + + for (i=1; i &b, std::vector &x) +{ + for (size_t i=0; i &b, std::vector &x, const cvm::real &tol, + const int itmax, int &iter, cvm::real &err) +{ + cvm::real ak,akden,bk,bkden,bknum,bnrm; + const cvm::real EPS=1.0e-14; + int j; + std::vector p(nt), r(nt), z(nt); + + iter=0; + atimes(x,r); + for (j=0;j &colvars, - size_t const &def_count = 0); + size_t const &def_count = 0, + bool margin = false); /// Increment the counter at given position inline void incr_count(std::vector const &ix) @@ -1210,12 +1236,13 @@ public: int A0, A1, A2; std::vector ix = ix0; + // TODO this can be rewritten more concisely with wrap_edge() if (periodic[n]) { ix[n]--; wrap(ix); - A0 = data[address(ix)]; + A0 = value(ix); ix = ix0; ix[n]++; wrap(ix); - A1 = data[address(ix)]; + A1 = value(ix); if (A0 * A1 == 0) { return 0.; // can't handle empty bins } else { @@ -1224,10 +1251,10 @@ public: } } else if (ix[n] > 0 && ix[n] < nx[n]-1) { // not an edge ix[n]--; - A0 = data[address(ix)]; + A0 = value(ix); ix = ix0; ix[n]++; - A1 = data[address(ix)]; + A1 = value(ix); if (A0 * A1 == 0) { return 0.; // can't handle empty bins } else { @@ -1238,9 +1265,9 @@ public: // edge: use 2nd order derivative int increment = (ix[n] == 0 ? 1 : -1); // move right from left edge, or the other way around - A0 = data[address(ix)]; - ix[n] += increment; A1 = data[address(ix)]; - ix[n] += increment; A2 = data[address(ix)]; + A0 = value(ix); + ix[n] += increment; A1 = value(ix); + ix[n] += increment; A2 = value(ix); if (A0 * A1 * A2 == 0) { return 0.; // can't handle empty bins } else { @@ -1249,6 +1276,49 @@ public: } } } + + /// \brief Return the gradient of discrete count from finite differences + /// on the *same* grid for dimension n + inline cvm::real gradient_finite_diff(const std::vector &ix0, + int n = 0) + { + int A0, A1, A2; + std::vector ix = ix0; + + // FIXME this can be rewritten more concisely with wrap_edge() + if (periodic[n]) { + ix[n]--; wrap(ix); + A0 = value(ix); + ix = ix0; + ix[n]++; wrap(ix); + A1 = value(ix); + if (A0 * A1 == 0) { + return 0.; // can't handle empty bins + } else { + return cvm::real(A1 - A0) / (widths[n] * 2.); + } + } else if (ix[n] > 0 && ix[n] < nx[n]-1) { // not an edge + ix[n]--; + A0 = value(ix); + ix = ix0; + ix[n]++; + A1 = value(ix); + if (A0 * A1 == 0) { + return 0.; // can't handle empty bins + } else { + return cvm::real(A1 - A0) / (widths[n] * 2.); + } + } else { + // edge: use 2nd order derivative + int increment = (ix[n] == 0 ? 1 : -1); + // move right from left edge, or the other way around + A0 = value(ix); + ix[n] += increment; A1 = value(ix); + ix[n] += increment; A2 = value(ix); + return (-1.5 * cvm::real(A0) + 2. * cvm::real(A1) + - 0.5 * cvm::real(A2)) * increment / widths[n]; + } + } }; @@ -1289,27 +1359,57 @@ public: has_data = true; } - /// Return the gradient of the scalar field from finite differences - inline const cvm::real * gradient_finite_diff( const std::vector &ix0 ) + /// \brief Return the gradient of the scalar field from finite differences + /// Input coordinates are those of gradient grid, shifted wrt scalar grid + /// Should not be called on edges of scalar grid, provided the latter has margins + /// wrt gradient grid + inline void vector_gradient_finite_diff( const std::vector &ix0, std::vector &grad) { cvm::real A0, A1; std::vector ix; - if (nd != 2) { - cvm::error("Finite differences available in dimension 2 only."); - return grad; - } - for (unsigned int n = 0; n < nd; n++) { + size_t i, j, k, n; + + if (nd == 2) { + for (n = 0; n < 2; n++) { + ix = ix0; + A0 = value(ix); + ix[n]++; wrap(ix); + A1 = value(ix); + ix[1-n]++; wrap(ix); + A1 += value(ix); + ix[n]--; wrap(ix); + A0 += value(ix); + grad[n] = 0.5 * (A1 - A0) / widths[n]; + } + } else if (nd == 3) { + + cvm::real p[8]; // potential values within cube, indexed in binary (4 i + 2 j + k) ix = ix0; - A0 = data[address(ix)]; - ix[n]++; wrap(ix); - A1 = data[address(ix)]; - ix[1-n]++; wrap(ix); - A1 += data[address(ix)]; - ix[n]--; wrap(ix); - A0 += data[address(ix)]; - grad[n] = 0.5 * (A1 - A0) / widths[n]; + int index = 0; + for (i = 0; i<2; i++) { + ix[1] = ix0[1]; + for (j = 0; j<2; j++) { + ix[2] = ix0[2]; + for (k = 0; k<2; k++) { + wrap(ix); + p[index++] = value(ix); + ix[2]++; + } + ix[1]++; + } + ix[0]++; + } + + // The following would be easier to read using binary literals + // 100 101 110 111 000 001 010 011 + grad[0] = 0.25 * ((p[4] + p[5] + p[6] + p[7]) - (p[0] + p[1] + p[2] + p[3])) / widths[0]; + // 010 011 110 111 000 001 100 101 + grad[1] = 0.25 * ((p[2] + p[3] + p[6] + p[7]) - (p[0] + p[1] + p[4] + p[5])) / widths[0]; + // 001 011 101 111 000 010 100 110 + grad[2] = 0.25 * ((p[1] + p[3] + p[5] + p[7]) - (p[0] + p[2] + p[4] + p[6])) / widths[0]; + } else { + cvm::error("Finite differences available in dimension 2 and 3 only."); } - return grad; } /// \brief Return the value of the function at ix divided by its @@ -1373,10 +1473,6 @@ public: /// \brief Assuming that the map is a normalized probability density, /// calculates the entropy (uses widths if they are defined) cvm::real entropy() const; - -private: - // gradient - cvm::real * grad; }; @@ -1390,6 +1486,10 @@ public: /// should be divided colvar_grid_count *samples; + /// \brief Provide the floating point weights by which each binned value + /// should be divided (alternate to samples, only one should be non-null) + colvar_grid_scalar *weights; + /// Default constructor colvar_grid_gradient(); @@ -1403,6 +1503,29 @@ public: /// Constructor from a vector of colvars colvar_grid_gradient(std::vector &colvars); + /// \brief Get a vector with the binned value(s) indexed by ix, normalized if applicable + inline void vector_value(std::vector const &ix, std::vector &v) const + { + cvm::real const * p = &value(ix); + if (samples) { + int count = samples->value(ix); + if (count) { + cvm::real invcount = 1.0 / count; + for (size_t i = 0; i < mult; i++) { + v[i] = invcount * p[i]; + } + } else { + for (size_t i = 0; i < mult; i++) { + v[i] = 0.0; + } + } + } else { + for (size_t i = 0; i < mult; i++) { + v[i] = p[i]; + } + } + } + /// \brief Accumulate the value inline void acc_value(std::vector const &ix, std::vector const &values) { for (size_t imult = 0; imult < mult; imult++) { @@ -1412,15 +1535,6 @@ public: samples->incr_count(ix); } - /// \brief Accumulate the gradient - inline void acc_grad(std::vector const &ix, cvm::real const *grads) { - for (size_t imult = 0; imult < mult; imult++) { - data[address(ix) + imult] += grads[imult]; - } - if (samples) - samples->incr_count(ix); - } - /// \brief Accumulate the gradient based on the force (i.e. sums the /// opposite of the force) inline void acc_force(std::vector const &ix, cvm::real const *forces) { @@ -1431,6 +1545,17 @@ public: samples->incr_count(ix); } + /// \brief Accumulate the gradient based on the force (i.e. sums the + /// opposite of the force) with a non-integer weight + inline void acc_force_weighted(std::vector const &ix, + cvm::real const *forces, + cvm::real weight) { + for (size_t imult = 0; imult < mult; imult++) { + data[address(ix) + imult] -= forces[imult] * weight; + } + weights->acc_value(ix, weight); + } + /// \brief Return the value of the function at ix divided by its /// number of samples (if the count grid is defined) virtual inline cvm::real value_output(std::vector const &ix, @@ -1498,5 +1623,70 @@ public: }; + +/// Integrate (1D, 2D or 3D) gradients + +class integrate_potential : public colvar_grid_scalar +{ + public: + + integrate_potential(); + + virtual ~integrate_potential() + {} + + /// Constructor from a vector of colvars + gradient grid + integrate_potential (std::vector &colvars, colvar_grid_gradient * gradients); + + /// \brief Calculate potential from divergence (in 2D); return number of steps + int integrate (const int itmax, const cvm::real & tol, cvm::real & err); + + /// \brief Update matrix containing divergence and boundary conditions + /// based on new gradient point value, in neighboring bins + void update_div_neighbors(const std::vector &ix); + + /// \brief Set matrix containing divergence and boundary conditions + /// based on complete gradient grid + void set_div(); + + /// \brief Add constant to potential so that its minimum value is zero + /// Useful e.g. for output + inline void set_zero_minimum() { + add_constant(-1.0 * minimum_value()); + } + + protected: + + // Reference to gradient grid + colvar_grid_gradient *gradients; + + /// Array holding divergence + boundary terms (modified Neumann) if not periodic + std::vector divergence; + +// std::vector inv_lap_diag; // Inverse of the diagonal of the Laplacian; for conditioning + + /// \brief Update matrix containing divergence and boundary conditions + /// called by update_div_neighbors + void update_div_local(const std::vector &ix); + + /// Obtain the gradient vector at given location ix, if available + /// or zero if it is on the edge of the gradient grid + /// ix gets wrapped in PBC + void get_grad(cvm::real * g, std::vector &ix); + + /// \brief Solve linear system based on CG, valid for symmetric matrices only + void nr_linbcg_sym(const std::vector &b, std::vector &x, + const cvm::real &tol, const int itmax, int &iter, cvm::real &err); + + /// l2 norm of a vector + cvm::real l2norm(const std::vector &x); + + /// Multiplication by sparse matrix representing Lagrangian (or its transpose) + void atimes(const std::vector &x, std::vector &r); + +// /// Inversion of preconditioner matrix +// void asolve(const std::vector &b, std::vector &x); +}; + #endif diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 200c2d6848..9898e2d5e8 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -24,6 +24,7 @@ #include "colvaratoms.h" #include "colvarcomp.h" + colvarmodule::colvarmodule(colvarproxy *proxy_in) { depth_s = 0; @@ -417,10 +418,10 @@ int colvarmodule::parse_biases(std::string const &conf) "Please ensure that their forces do not counteract each other.\n"); } - if (biases.size() || use_scripted_forces) { + if (num_biases() || use_scripted_forces) { cvm::log(cvm::line_marker); cvm::log("Collective variables biases initialized, "+ - cvm::to_str(biases.size())+" in total.\n"); + cvm::to_str(num_biases())+" in total.\n"); } else { if (!use_scripted_forces) { cvm::log("No collective variables biases were defined.\n"); @@ -431,12 +432,37 @@ int colvarmodule::parse_biases(std::string const &conf) } +int colvarmodule::num_variables() const +{ + return colvars.size(); +} + + +int colvarmodule::num_variables_feature(int feature_id) const +{ + size_t n = 0; + for (std::vector::const_iterator cvi = colvars.begin(); + cvi != colvars.end(); + cvi++) { + if ((*cvi)->is_enabled(feature_id)) { + n++; + } + } + return n; +} + + +int colvarmodule::num_biases() const +{ + return biases.size(); +} + + int colvarmodule::num_biases_feature(int feature_id) const { - colvarmodule *cv = cvm::main(); size_t n = 0; - for (std::vector::iterator bi = cv->biases.begin(); - bi != cv->biases.end(); + for (std::vector::const_iterator bi = biases.begin(); + bi != biases.end(); bi++) { if ((*bi)->is_enabled(feature_id)) { n++; @@ -448,10 +474,9 @@ int colvarmodule::num_biases_feature(int feature_id) const int colvarmodule::num_biases_type(std::string const &type) const { - colvarmodule *cv = cvm::main(); size_t n = 0; - for (std::vector::iterator bi = cv->biases.begin(); - bi != cv->biases.end(); + for (std::vector::const_iterator bi = biases.begin(); + bi != biases.end(); bi++) { if ((*bi)->bias_type == type) { n++; @@ -465,7 +490,7 @@ std::vector const colvarmodule::time_dependent_biases() const { size_t i; std::vector biases_names; - for (i = 0; i < biases.size(); i++) { + for (i = 0; i < num_biases(); i++) { if (biases[i]->is_enabled(colvardeps::f_cvb_apply_force) && biases[i]->is_enabled(colvardeps::f_cvb_active) && (biases[i]->is_enabled(colvardeps::f_cvb_history_dependent) || @@ -790,7 +815,7 @@ int colvarmodule::calc_biases() { // update the biases and communicate their forces to the collective // variables - if (cvm::debug() && biases.size()) + if (cvm::debug() && num_biases()) cvm::log("Updating collective variable biases.\n"); std::vector::iterator bi; @@ -852,7 +877,7 @@ int colvarmodule::update_colvar_forces() std::vector::iterator bi; // sum the forces from all biases for each collective variable - if (cvm::debug() && biases.size()) + if (cvm::debug() && num_biases()) cvm::log("Collecting forces from all biases.\n"); cvm::increase_depth(); for (bi = biases_active()->begin(); bi != biases_active()->end(); bi++) { @@ -1073,8 +1098,6 @@ int colvarmodule::reset() int colvarmodule::setup_input() { - if (this->size() == 0) return cvm::get_error(); - std::string restart_in_name(""); // read the restart configuration, if available @@ -1107,14 +1130,12 @@ int colvarmodule::setup_input() } } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return cvm::get_error(); } int colvarmodule::setup_output() { - if (this->size() == 0) return cvm::get_error(); - int error_code = COLVARS_OK; // output state file (restart) @@ -1123,7 +1144,8 @@ int colvarmodule::setup_output() std::string(""); if (restart_out_name.size()) { - cvm::log("The restart output state file will be \""+restart_out_name+"\".\n"); + cvm::log("The restart output state file will be \""+ + restart_out_name+"\".\n"); } output_prefix() = proxy->output_prefix(); @@ -1154,7 +1176,7 @@ int colvarmodule::setup_output() set_error_bits(FILE_ERROR); } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return cvm::get_error(); } @@ -1738,6 +1760,89 @@ int cvm::load_coords_xyz(char const *filename, } + +// Wrappers to proxy functions: these may go in the future + +cvm::real cvm::unit_angstrom() +{ + return proxy->unit_angstrom(); +} + + +cvm::real cvm::boltzmann() +{ + return proxy->boltzmann(); +} + + +cvm::real cvm::temperature() +{ + return proxy->temperature(); +} + + +cvm::real cvm::dt() +{ + return proxy->dt(); +} + + +void cvm::request_total_force() +{ + proxy->request_total_force(true); +} + +cvm::rvector cvm::position_distance(atom_pos const &pos1, + atom_pos const &pos2) +{ + return proxy->position_distance(pos1, pos2); +} + +cvm::real cvm::position_dist2(cvm::atom_pos const &pos1, + cvm::atom_pos const &pos2) +{ + return proxy->position_dist2(pos1, pos2); +} + +cvm::real cvm::rand_gaussian(void) +{ + return proxy->rand_gaussian(); +} + + + +bool cvm::replica_enabled() +{ + return proxy->replica_enabled(); +} + +int cvm::replica_index() +{ + return proxy->replica_index(); +} + +int cvm::replica_num() +{ + return proxy->replica_num(); +} + +void cvm::replica_comm_barrier() +{ + return proxy->replica_comm_barrier(); +} + +int cvm::replica_comm_recv(char* msg_data, int buf_len, int src_rep) +{ + return proxy->replica_comm_recv(msg_data,buf_len,src_rep); +} + +int cvm::replica_comm_send(char* msg_data, int msg_len, int dest_rep) +{ + return proxy->replica_comm_send(msg_data,msg_len,dest_rep); +} + + + // shared pointer to the proxy object colvarproxy *colvarmodule::proxy = NULL; diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index 14e5d56701..64a98b77a0 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -39,16 +39,14 @@ You can browse the class hierarchy or the list of source files. #define FILE_ERROR (1<<4) #define MEMORY_ERROR (1<<5) #define FATAL_ERROR (1<<6) // Should be set, or not, together with other bits -#define DELETE_COLVARS (1<<7) // Instruct the caller to delete cvm +//#define DELETE_COLVARS (1<<7) // Instruct the caller to delete cvm #define COLVARS_NO_SUCH_FRAME (1<<8) // Cannot load the requested frame #include #include -#include -#include -#include #include -#include +#include +#include #include #include @@ -84,12 +82,18 @@ public: /// Defining an abstract real number allows to switch precision typedef double real; - /// Override std::pow with a product for n positive integer - static inline real integer_power(real x, int n) + /// Override std::pow with a product for n integer + static inline real integer_power(real const &x, int const n) { - real result = 1.0; - for (int i = 0; i < n; i++) result *= x; - return result; + // Original code: math_special.h in LAMMPS + double yy, ww; + if (x == 0.0) return 0.0; + int nn = (n > 0) ? n : -n; + ww = x; + for (yy = 1.0; nn != 0; nn >>= 1, ww *=ww) { + if (nn & 1) yy *= ww; + } + return (n > 0) ? yy : 1.0/yy; } /// Residue identifier @@ -301,13 +305,23 @@ private: public: + /// Return how many variables are defined + int num_variables() const; + + /// Return how many variables have this feature enabled + int num_variables_feature(int feature_id) const; + + /// Return how many biases are defined + int num_biases() const; + /// Return how many biases have this feature enabled int num_biases_feature(int feature_id) const; - /// Return how many biases are defined with this type + /// Return how many biases of this type are defined int num_biases_type(std::string const &type) const; - /// Return the names of time-dependent biases with forces enabled + /// Return the names of time-dependent biases with forces enabled (ABF, + /// metadynamics, etc) std::vector const time_dependent_biases() const; private: @@ -602,16 +616,14 @@ public: typedef colvarmodule cvm; -#include "colvartypes.h" - std::ostream & operator << (std::ostream &os, cvm::rvector const &v); std::istream & operator >> (std::istream &is, cvm::rvector &v); template std::string cvm::to_str(T const &x, - size_t const &width, - size_t const &prec) { + size_t const &width, + size_t const &prec) { std::ostringstream os; if (width) os.width(width); if (prec) { @@ -622,9 +634,10 @@ template std::string cvm::to_str(T const &x, return os.str(); } + template std::string cvm::to_str(std::vector const &x, - size_t const &width, - size_t const &prec) { + size_t const &width, + size_t const &prec) { if (!x.size()) return std::string(""); std::ostringstream os; if (prec) { @@ -645,70 +658,4 @@ template std::string cvm::to_str(std::vector const &x, } -#include "colvarproxy.h" - - -inline cvm::real cvm::unit_angstrom() -{ - return proxy->unit_angstrom(); -} - -inline cvm::real cvm::boltzmann() -{ - return proxy->boltzmann(); -} - -inline cvm::real cvm::temperature() -{ - return proxy->temperature(); -} - -inline cvm::real cvm::dt() -{ - return proxy->dt(); -} - -// Replica exchange commands -inline bool cvm::replica_enabled() { - return proxy->replica_enabled(); -} -inline int cvm::replica_index() { - return proxy->replica_index(); -} -inline int cvm::replica_num() { - return proxy->replica_num(); -} -inline void cvm::replica_comm_barrier() { - return proxy->replica_comm_barrier(); -} -inline int cvm::replica_comm_recv(char* msg_data, int buf_len, int src_rep) { - return proxy->replica_comm_recv(msg_data,buf_len,src_rep); -} -inline int cvm::replica_comm_send(char* msg_data, int msg_len, int dest_rep) { - return proxy->replica_comm_send(msg_data,msg_len,dest_rep); -} - - -inline void cvm::request_total_force() -{ - proxy->request_total_force(true); -} - -inline cvm::rvector cvm::position_distance(atom_pos const &pos1, - atom_pos const &pos2) -{ - return proxy->position_distance(pos1, pos2); -} - -inline cvm::real cvm::position_dist2(cvm::atom_pos const &pos1, - cvm::atom_pos const &pos2) -{ - return proxy->position_dist2(pos1, pos2); -} - -inline cvm::real cvm::rand_gaussian(void) -{ - return proxy->rand_gaussian(); -} - #endif diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 9f333b7b76..43c8c69c04 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -553,7 +553,8 @@ bool colvarparse::key_lookup(std::string const &conf, size_t *save_pos) { if (cvm::debug()) { - cvm::log("Looking for the keyword \""+std::string(key_in)+"\" and its value.\n"); + cvm::log("Looking for the keyword \""+std::string(key_in)+ + "\" and its value.\n"); } // add this keyword to the register (in its camelCase version) diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp index 8160144c6b..8767d5f459 100644 --- a/lib/colvars/colvarproxy.cpp +++ b/lib/colvars/colvarproxy.cpp @@ -14,6 +14,11 @@ #include #endif +#if defined(NAMD_TCL) || defined(VMDTCL) +#define COLVARS_TCL +#include +#endif + #include "colvarmodule.h" #include "colvarproxy.h" #include "colvarscript.h" @@ -420,8 +425,10 @@ colvarproxy_script::colvarproxy_script() colvarproxy_script::~colvarproxy_script() {} -char *colvarproxy_script::script_obj_to_str(unsigned char *obj) +char const *colvarproxy_script::script_obj_to_str(unsigned char *obj) { + cvm::error("Error: trying to print a script object without a scripting " + "language interface.\n", BUG_ERROR); return reinterpret_cast(obj); } @@ -451,6 +458,140 @@ int colvarproxy_script::run_colvar_gradient_callback( +colvarproxy_tcl::colvarproxy_tcl() +{ + _tcl_interp = NULL; +} + + +colvarproxy_tcl::~colvarproxy_tcl() +{ +} + + +void colvarproxy_tcl::init_tcl_pointers() +{ + cvm::error("Error: Tcl support is currently unavailable " + "outside NAMD or VMD.\n", COLVARS_NOT_IMPLEMENTED); +} + + +char const *colvarproxy_tcl::tcl_obj_to_str(unsigned char *obj) +{ +#if defined(COLVARS_TCL) + return Tcl_GetString(reinterpret_cast(obj)); +#else + return NULL; +#endif +} + + +int colvarproxy_tcl::tcl_run_force_callback() +{ +#if defined(COLVARS_TCL) + Tcl_Interp *const tcl_interp = reinterpret_cast(_tcl_interp); + std::string cmd = std::string("calc_colvar_forces ") + + cvm::to_str(cvm::step_absolute()); + int err = Tcl_Eval(tcl_interp, cmd.c_str()); + if (err != TCL_OK) { + cvm::log(std::string("Error while executing calc_colvar_forces:\n")); + cvm::error(Tcl_GetStringResult(tcl_interp)); + return COLVARS_ERROR; + } + return cvm::get_error(); +#else + return COLVARS_NOT_IMPLEMENTED; +#endif +} + + +int colvarproxy_tcl::tcl_run_colvar_callback( + std::string const &name, + std::vector const &cvc_values, + colvarvalue &value) +{ +#if defined(COLVARS_TCL) + + Tcl_Interp *const tcl_interp = reinterpret_cast(_tcl_interp); + size_t i; + std::string cmd = std::string("calc_") + name; + for (i = 0; i < cvc_values.size(); i++) { + cmd += std::string(" {") + (*(cvc_values[i])).to_simple_string() + + std::string("}"); + } + int err = Tcl_Eval(tcl_interp, cmd.c_str()); + const char *result = Tcl_GetStringResult(tcl_interp); + if (err != TCL_OK) { + return cvm::error(std::string("Error while executing ") + + cmd + std::string(":\n") + + std::string(Tcl_GetStringResult(tcl_interp)), COLVARS_ERROR); + } + std::istringstream is(result); + if (value.from_simple_string(is.str()) != COLVARS_OK) { + cvm::log("Error parsing colvar value from script:"); + cvm::error(result); + return COLVARS_ERROR; + } + return cvm::get_error(); + +#else + + return COLVARS_NOT_IMPLEMENTED; + +#endif +} + + +int colvarproxy_tcl::tcl_run_colvar_gradient_callback( + std::string const &name, + std::vector const &cvc_values, + std::vector > &gradient) +{ +#if defined(COLVARS_TCL) + + Tcl_Interp *const tcl_interp = reinterpret_cast(_tcl_interp); + size_t i; + std::string cmd = std::string("calc_") + name + "_gradient"; + for (i = 0; i < cvc_values.size(); i++) { + cmd += std::string(" {") + (*(cvc_values[i])).to_simple_string() + + std::string("}"); + } + int err = Tcl_Eval(tcl_interp, cmd.c_str()); + if (err != TCL_OK) { + return cvm::error(std::string("Error while executing ") + + cmd + std::string(":\n") + + std::string(Tcl_GetStringResult(tcl_interp)), COLVARS_ERROR); + } + Tcl_Obj **list; + int n; + Tcl_ListObjGetElements(tcl_interp, Tcl_GetObjResult(tcl_interp), + &n, &list); + if (n != int(gradient.size())) { + cvm::error("Error parsing list of gradient values from script: found " + + cvm::to_str(n) + " values instead of " + + cvm::to_str(gradient.size())); + return COLVARS_ERROR; + } + for (i = 0; i < gradient.size(); i++) { + std::istringstream is(Tcl_GetString(list[i])); + if (gradient[i].from_simple_string(is.str()) != COLVARS_OK) { + cvm::log("Gradient matrix size: " + cvm::to_str(gradient[i].size())); + cvm::log("Gradient string: " + cvm::to_str(Tcl_GetString(list[i]))); + cvm::error("Error parsing gradient value from script", COLVARS_ERROR); + return COLVARS_ERROR; + } + } + + return cvm::get_error(); + +#else + + return COLVARS_NOT_IMPLEMENTED; + +#endif +} + + colvarproxy_io::colvarproxy_io() {} @@ -541,6 +682,7 @@ colvarproxy::colvarproxy() { colvars = NULL; b_simulation_running = true; + b_delete_requested = false; } @@ -556,6 +698,14 @@ int colvarproxy::reset() } +int colvarproxy::request_deletion() +{ + return cvm::error("Error: \"delete\" command is only available in VMD; " + "please use \"reset\" instead.\n", + COLVARS_NOT_IMPLEMENTED); +} + + int colvarproxy::setup() { return COLVARS_OK; @@ -579,13 +729,3 @@ size_t colvarproxy::restart_frequency() return 0; } - - - - - - - - - - diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index e51ddfbe3b..bf29048270 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -415,7 +415,7 @@ public: }; -/// Method for scripting language interface (Tcl or Python) +/// Methods for scripting language interface (Tcl or Python) class colvarproxy_script { public: @@ -427,7 +427,7 @@ public: virtual ~colvarproxy_script(); /// Convert a script object (Tcl or Python call argument) to a C string - virtual char *script_obj_to_str(unsigned char *obj); + virtual char const *script_obj_to_str(unsigned char *obj); /// Pointer to the scripting interface object /// (does not need to be allocated in a new interface) @@ -454,6 +454,46 @@ public: }; +/// Methods for using Tcl within Colvars +class colvarproxy_tcl { + +public: + + /// Constructor + colvarproxy_tcl(); + + /// Destructor + virtual ~colvarproxy_tcl(); + + /// Is Tcl available? (trigger initialization if needed) + int tcl_available(); + + /// Tcl implementation of script_obj_to_str() + char const *tcl_obj_to_str(unsigned char *obj); + + /// Run a user-defined colvar forces script + int tcl_run_force_callback(); + + int tcl_run_colvar_callback( + std::string const &name, + std::vector const &cvcs, + colvarvalue &value); + + int tcl_run_colvar_gradient_callback( + std::string const &name, + std::vector const &cvcs, + std::vector > &gradient); + +protected: + + /// Pointer to Tcl interpreter object + void *_tcl_interp; + + /// Set Tcl pointers + virtual void init_tcl_pointers(); +}; + + /// Methods for data input/output class colvarproxy_io { @@ -540,6 +580,7 @@ class colvarproxy public colvarproxy_smp, public colvarproxy_replicas, public colvarproxy_script, + public colvarproxy_tcl, public colvarproxy_io { @@ -554,6 +595,15 @@ public: /// Destructor virtual ~colvarproxy(); + /// Request deallocation of the module (currently only implemented by VMD) + virtual int request_deletion(); + + /// Whether deallocation was requested + inline bool delete_requested() + { + return b_delete_requested; + } + /// \brief Reset proxy state, e.g. requested atoms virtual int reset(); @@ -591,6 +641,9 @@ protected: /// Whether a simulation is running (warn against irrecovarable errors) bool b_simulation_running; + /// Whether the entire module should be deallocated by the host engine + bool b_delete_requested; + }; diff --git a/lib/colvars/colvars_version.h b/lib/colvars/colvars_version.h index a92a776f8a..dc4b8bd07e 100644 --- a/lib/colvars/colvars_version.h +++ b/lib/colvars/colvars_version.h @@ -1,5 +1,5 @@ #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2017-10-20" +#define COLVARS_VERSION "2018-01-17" // This file is part of the Collective Variables module (Colvars). // The original version of Colvars and its updates are located at: // https://github.com/colvars/colvars diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index 9570acd832..0977496b9e 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -74,7 +74,9 @@ int colvarscript::run(int objc, unsigned char *const objv[]) } if (objc < 2) { - return exec_command(cv_help, NULL, objc, objv); + set_str_result("No commands given: use \"cv help\" " + "for a list of commands."); + return COLVARSCRIPT_ERROR; } std::string const cmd(obj_to_str(objv[1])); @@ -123,8 +125,7 @@ int colvarscript::run(int objc, unsigned char *const objv[]) if (cmd == "delete") { // Note: the delete bit may be ignored by some backends // it is mostly useful in VMD - colvars->set_error_bits(DELETE_COLVARS); - return COLVARS_OK; + return proxy->request_deletion(); } if (cmd == "update") { @@ -272,6 +273,11 @@ int colvarscript::proc_colvar(colvar *cv, int objc, unsigned char *const objv[]) return COLVARS_OK; } + if (subcmd == "run_ave") { + result = (cv->run_ave()).to_simple_string(); + return COLVARS_OK; + } + if (subcmd == "width") { result = cvm::to_str(cv->width, 0, cvm::cv_prec); return COLVARS_OK; diff --git a/src/USER-COLVARS/colvarproxy_lammps_version.h b/src/USER-COLVARS/colvarproxy_lammps_version.h index 45ecea867f..79f77dad4e 100644 --- a/src/USER-COLVARS/colvarproxy_lammps_version.h +++ b/src/USER-COLVARS/colvarproxy_lammps_version.h @@ -1,5 +1,5 @@ #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2017-10-20" +#define COLVARPROXY_VERSION "2017-12-01" // This file is part of the Collective Variables module (Colvars). // The original version of Colvars and its updates are located at: // https://github.com/colvars/colvars From 4a875dc67df5ce640eed198f9ca7de25c74e3a2f Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Fri, 23 Feb 2018 09:01:34 -0700 Subject: [PATCH 64/73] Workaround for compiler bug in gcc v4.9.3, manifest in KOKKOS SNAP --- src/SNAP/pair_snap.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h index 9d330f0d6f..e0d7c45063 100644 --- a/src/SNAP/pair_snap.h +++ b/src/SNAP/pair_snap.h @@ -37,8 +37,11 @@ public: virtual double init_one(int, int); virtual double memory_usage(); + double rcutfac, quadraticflag; // declared public to workaround gcc 4.9 + int ncoeff; // compiler bug, manifest in KOKKOS package + protected: - int ncoeff, ncoeffq, ncoeffall; + int ncoeffq, ncoeffall; double **bvec, ***dbvec; class SNA** sna; int nmax; @@ -97,8 +100,8 @@ protected: double *wjelem; // elements weights double **coeffelem; // element bispectrum coefficients int *map; // mapping from atom types to elements - int twojmax, diagonalstyle, switchflag, bzeroflag, quadraticflag; - double rcutfac, rfac0, rmin0, wj1, wj2; + int twojmax, diagonalstyle, switchflag, bzeroflag; + double rfac0, rmin0, wj1, wj2; int rcutfacflag, twojmaxflag; // flags for required parameters }; From bba4bd148985896dde1096e4a7d1c0ad726fde8f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Feb 2018 18:02:05 -0500 Subject: [PATCH 65/73] support offsets for molecule IDs (if available) in read_data similar to atomIDs suggested by felipe perez in https://sourceforge.net/p/lammps/mailman/message/36236631/ --- doc/src/read_data.txt | 35 +++++++++++++++++++++-------------- src/atom.cpp | 5 +++-- src/atom.h | 2 +- src/read_data.cpp | 28 +++++++++++++++++++++------- src/read_data.h | 2 +- 5 files changed, 47 insertions(+), 25 deletions(-) diff --git a/doc/src/read_data.txt b/doc/src/read_data.txt index 4ea60163b2..fd297e36c1 100644 --- a/doc/src/read_data.txt +++ b/doc/src/read_data.txt @@ -15,10 +15,11 @@ read_data file keyword args ... :pre file = name of data file to read in :ulb,l zero or more keyword/arg pairs may be appended :l keyword = {add} or {offset} or {shift} or {extra/atom/types} or {extra/bond/types} or {extra/angle/types} or {extra/dihedral/types} or {extra/improper/types} or {extra/bond/per/atom} or {extra/angle/per/atom} or {extra/dihedral/per/atom} or {extra/improper/per/atom} or {group} or {nocoeff} or {fix} :l - {add} arg = {append} or {Nstart} or {merge} - append = add new atoms with IDs appended to current IDs - Nstart = add new atoms with IDs starting with Nstart - merge = add new atoms with their IDs unchanged + {add} arg = {append} or {IDoffset} or {IDoffset MOLoffset} or {merge} + append = add new atoms with atom IDs appended to current IDs + IDoffset = add new atoms with atom IDs having IDoffset added + MOLoffset = add new atoms with molecule IDs having MOLoffset added (only when molecule IDs are enabled) + merge = add new atoms with their atom IDs (and molecule IDs) unchanged {offset} args = toff boff aoff doff ioff toff = offset to add to atom types boff = offset to add to bond types @@ -120,20 +121,26 @@ boundary, then the atoms may become far apart if the box size grows. This will separate the atoms in the bond, which can lead to "lost" bond atoms or bad dynamics. -The three choices for the {add} argument affect how the IDs of atoms -in the data file are treated. If {append} is specified, atoms in the -data file are added to the current system, with their atom IDs reset -so that an atomID = M in the data file becomes atomID = N+M, where N -is the largest atom ID in the current system. This rule is applied to -all occurrences of atom IDs in the data file, e.g. in the Velocity or -Bonds section. If {Nstart} is specified, then {Nstart} is a numeric -value is given, e.g. 1000, so that an atomID = M in the data file -becomes atomID = 1000+M. If {merge} is specified, the data file atoms +The three choices for the {add} argument affect how the atom IDs and +molecule IDs of atoms in the data file are treated. If {append} is +specified, atoms in the data file are added to the current system, +with their atom IDs reset so that an atomID = M in the data file +becomes atomID = N+M, where N is the largest atom ID in the current +system. This rule is applied to all occurrences of atom IDs in the +data file, e.g. in the Velocity or Bonds section. This is also done +for molecule IDs, if the atom style does support molecule IDs or +they are enabled via fix property/atom. If {IDoffset} is specified, +then {IDoffset} is a numeric value is given, e.g. 1000, so that an +atomID = M in the data file becomes atomID = 1000+M. For systems +with enabled molecule IDs, another numerical argument {MOLoffset} +is required representing the equivalent offset for molecule IDs. +If {merge} is specified, the data file atoms are added to the current system without changing their IDs. They are assumed to merge (without duplication) with the currently defined atoms. It is up to you to insure there are no multiply defined atom IDs, as LAMMPS only performs an incomplete check that this is the case -by insuring the resulting max atomID >= the number of atoms. +by insuring the resulting max atomID >= the number of atoms. For +molecule IDs, there is no check done at all. The {offset} and {shift} keywords can only be used if the {add} keyword is also specified. diff --git a/src/atom.cpp b/src/atom.cpp index 3fa470efd5..fa86046d23 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -822,8 +822,8 @@ void Atom::deallocate_topology() call style-specific routine to parse line ------------------------------------------------------------------------- */ -void Atom::data_atoms(int n, char *buf, tagint id_offset, int type_offset, - int shiftflag, double *shift) +void Atom::data_atoms(int n, char *buf, tagint id_offset, tagint mol_offset, + int type_offset, int shiftflag, double *shift) { int m,xptr,iptr; imageint imagedata; @@ -948,6 +948,7 @@ void Atom::data_atoms(int n, char *buf, tagint id_offset, int type_offset, coord[2] >= sublo[2] && coord[2] < subhi[2]) { avec->data_atom(xdata,imagedata,values); if (id_offset) tag[nlocal-1] += id_offset; + if (mol_offset) molecule[nlocal-1] += mol_offset; if (type_offset) { type[nlocal-1] += type_offset; if (type[nlocal-1] > ntypes) diff --git a/src/atom.h b/src/atom.h index 007142a1c0..62c2d64ca7 100644 --- a/src/atom.h +++ b/src/atom.h @@ -229,7 +229,7 @@ class Atom : protected Pointers { void deallocate_topology(); - void data_atoms(int, char *, tagint, int, int, double *); + void data_atoms(int, char *, tagint, tagint, int, int, double *); void data_vels(int, char *, tagint); void data_bonds(int, char *, int *, tagint, int); void data_angles(int, char *, int *, tagint, int); diff --git a/src/read_data.cpp b/src/read_data.cpp index b1a42608c0..3b93098a6e 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -124,7 +124,7 @@ void ReadData::command(int narg, char **arg) addflag = NONE; coeffflag = 1; - id_offset = 0; + id_offset = mol_offset = 0; offsetflag = shiftflag = 0; toffset = boffset = aoffset = doffset = ioffset = 0; shift[0] = shift[1] = shift[2] = 0.0; @@ -145,11 +145,21 @@ void ReadData::command(int narg, char **arg) if (strcmp(arg[iarg+1],"append") == 0) addflag = APPEND; else if (strcmp(arg[iarg+1],"merge") == 0) addflag = MERGE; else { + if (atom->molecule_flag && (iarg+3 > narg)) + error->all(FLERR,"Illegal read_data command"); addflag = VALUE; bigint offset = force->bnumeric(FLERR,arg[iarg+1]); if (offset > MAXTAGINT) - error->all(FLERR,"Read data add offset is too big"); + error->all(FLERR,"Read data add atomID offset is too big"); id_offset = offset; + + if (atom->molecule_flag) { + offset = force->bnumeric(FLERR,arg[iarg+2]); + if (offset > MAXTAGINT) + error->all(FLERR,"Read data add molID offset is too big"); + mol_offset = offset; + iarg++; + } } iarg += 2; } else if (strcmp(arg[iarg],"offset") == 0) { @@ -310,14 +320,18 @@ void ReadData::command(int narg, char **arg) update->ntimestep = 0; } - // compute atomID offset for addflag = MERGE + // compute atomID and optionally moleculeID offset for addflag = APPEND if (addflag == APPEND) { tagint *tag = atom->tag; + tagint *molecule = atom->molecule; int nlocal = atom->nlocal; - tagint max = 0; - for (int i = 0; i < nlocal; i++) max = MAX(max,tag[i]); - MPI_Allreduce(&max,&id_offset,1,MPI_LMP_TAGINT,MPI_MAX,world); + tagint maxid = 0, maxmol = 0; + for (int i = 0; i < nlocal; i++) maxid = MAX(maxid,tag[i]); + if (atom->molecule_flag) + for (int i = 0; i < nlocal; i++) maxmol = MAX(maxmol,molecule[i]); + MPI_Allreduce(&maxid,&id_offset,1,MPI_LMP_TAGINT,MPI_MAX,world); + MPI_Allreduce(&maxmol,&mol_offset,1,MPI_LMP_TAGINT,MPI_MAX,world); } // set up pointer to hold original styles while we replace them with "zero" @@ -1137,7 +1151,7 @@ void ReadData::atoms() nchunk = MIN(natoms-nread,CHUNK); eof = comm->read_lines_from_file(fp,nchunk,MAXLINE,buffer); if (eof) error->all(FLERR,"Unexpected end of data file"); - atom->data_atoms(nchunk,buffer,id_offset,toffset,shiftflag,shift); + atom->data_atoms(nchunk,buffer,id_offset,mol_offset,toffset,shiftflag,shift); nread += nchunk; } diff --git a/src/read_data.h b/src/read_data.h index 730229c722..b85ed67dcd 100644 --- a/src/read_data.h +++ b/src/read_data.h @@ -39,7 +39,7 @@ class ReadData : protected Pointers { int narg,maxarg; char argoffset1[8],argoffset2[8]; - bigint id_offset; + bigint id_offset, mol_offset; int nlocal_previous; bigint natoms; From fb6e7e8aeaa88592b838b2fe60d72fa23724dcd2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Feb 2018 16:41:10 +0100 Subject: [PATCH 66/73] add sanity checks for ring communication we do not call memcpy() unless nbytes != 0 and source/target pointer is not NULL we error out on illegal combinations of nbytes and inbuf/outbuf --- src/comm.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index 88edf98ca6..9fae8347e0 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -696,10 +696,15 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, if (maxbytes == 0) return; + // sanity check 1 + + if ((nbytes > 0) && inbuf == NULL) + error->one(FLERR,"Cannot put data on ring from NULL pointer"); + char *buf,*bufcopy; memory->create(buf,maxbytes,"comm:buf"); memory->create(bufcopy,maxbytes,"comm:bufcopy"); - memcpy(buf,inbuf,nbytes); + if (nbytes && inbuf) memcpy(buf,inbuf,nbytes); int next = me + 1; int prev = me - 1; @@ -712,12 +717,17 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, MPI_Send(buf,nbytes,MPI_CHAR,next,messtag,world); MPI_Wait(&request,&status); MPI_Get_count(&status,MPI_CHAR,&nbytes); - memcpy(buf,bufcopy,nbytes); + if (nbytes) memcpy(buf,bufcopy,nbytes); } if (self || loop < nprocs-1) callback(nbytes/nper,buf,ptr); } - if (outbuf) memcpy(outbuf,buf,nbytes); + // sanity check 2 + + if ((nbytes > 0) && outbuf == NULL) + error->one(FLERR,"Cannot put data from ring to NULL pointer"); + + if (nbytes && outbuf) memcpy(outbuf,buf,nbytes); memory->destroy(buf); memory->destroy(bufcopy); From 948f4783aadcf4d628099d88a6b608642a36c592 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Feb 2018 17:17:45 +0100 Subject: [PATCH 67/73] ring communication *is* called with outbut set to NULL, so don't error out on that. --- src/comm.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index 9fae8347e0..d997c2914f 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -696,7 +696,7 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, if (maxbytes == 0) return; - // sanity check 1 + // sanity check if ((nbytes > 0) && inbuf == NULL) error->one(FLERR,"Cannot put data on ring from NULL pointer"); @@ -722,11 +722,6 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, if (self || loop < nprocs-1) callback(nbytes/nper,buf,ptr); } - // sanity check 2 - - if ((nbytes > 0) && outbuf == NULL) - error->one(FLERR,"Cannot put data from ring to NULL pointer"); - if (nbytes && outbuf) memcpy(outbuf,buf,nbytes); memory->destroy(buf); From 5fb2979da73ff9e1e06c55b8793d46185e5cb0a6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Feb 2018 13:50:42 -0500 Subject: [PATCH 68/73] allow dynamic groups for some standard walls interacting with point particles --- src/fix_wall_harmonic.cpp | 5 ++++- src/fix_wall_lj1043.cpp | 5 ++++- src/fix_wall_lj126.cpp | 5 ++++- src/fix_wall_lj93.cpp | 5 ++++- src/fix_wall_reflect.cpp | 2 ++ src/fix_wall_region.cpp | 2 ++ 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/fix_wall_harmonic.cpp b/src/fix_wall_harmonic.cpp index f91295d469..20d5dbebd4 100644 --- a/src/fix_wall_harmonic.cpp +++ b/src/fix_wall_harmonic.cpp @@ -22,7 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixWallHarmonic::FixWallHarmonic(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- interaction of all particles in group with a wall diff --git a/src/fix_wall_lj1043.cpp b/src/fix_wall_lj1043.cpp index e8e706ed5e..064a5a8d60 100644 --- a/src/fix_wall_lj1043.cpp +++ b/src/fix_wall_lj1043.cpp @@ -26,7 +26,10 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ FixWallLJ1043::FixWallLJ1043(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/fix_wall_lj126.cpp b/src/fix_wall_lj126.cpp index 22199fed5b..f556952ab3 100644 --- a/src/fix_wall_lj126.cpp +++ b/src/fix_wall_lj126.cpp @@ -22,7 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixWallLJ126::FixWallLJ126(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/fix_wall_lj93.cpp b/src/fix_wall_lj93.cpp index 281a1fafc4..f5d6a7e147 100644 --- a/src/fix_wall_lj93.cpp +++ b/src/fix_wall_lj93.cpp @@ -22,7 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixWallLJ93::FixWallLJ93(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/fix_wall_reflect.cpp b/src/fix_wall_reflect.cpp index dba7cf7036..86607dbe8e 100644 --- a/src/fix_wall_reflect.cpp +++ b/src/fix_wall_reflect.cpp @@ -39,6 +39,8 @@ FixWallReflect::FixWallReflect(LAMMPS *lmp, int narg, char **arg) : { if (narg < 4) error->all(FLERR,"Illegal fix wall/reflect command"); + dynamic_group_allow = 1; + // parse args nwall = 0; diff --git a/src/fix_wall_region.cpp b/src/fix_wall_region.cpp index 1d22e6141b..67b0bcd713 100644 --- a/src/fix_wall_region.cpp +++ b/src/fix_wall_region.cpp @@ -67,6 +67,8 @@ FixWallRegion::FixWallRegion(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[4],"harmonic") == 0) style = HARMONIC; else error->all(FLERR,"Illegal fix wall/region command"); + if (style != COLLOID) dynamic_group_allow = 1; + epsilon = force->numeric(FLERR,arg[5]); sigma = force->numeric(FLERR,arg[6]); cutoff = force->numeric(FLERR,arg[7]); From 58e01a9eee0b700a807da11cf3f4bb130c74e8a3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Feb 2018 14:03:07 +0100 Subject: [PATCH 69/73] plug memory leak in pair style lj/class2/coul/long with coulomb tables --- src/CLASS2/pair_lj_class2_coul_long.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CLASS2/pair_lj_class2_coul_long.cpp b/src/CLASS2/pair_lj_class2_coul_long.cpp index 5d2ae891d0..9278703e2a 100644 --- a/src/CLASS2/pair_lj_class2_coul_long.cpp +++ b/src/CLASS2/pair_lj_class2_coul_long.cpp @@ -66,6 +66,7 @@ PairLJClass2CoulLong::~PairLJClass2CoulLong() memory->destroy(offset); } } + if (ftable) free_tables(); } /* ---------------------------------------------------------------------- */ From eadac1546651b38af5f53e8135f72f8c6aba8522 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Feb 2018 14:02:16 +0100 Subject: [PATCH 70/73] avoid multiple calls to delete [] on the same pointer. thanks to @ExHP for pointing out this issue --- src/library.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/library.cpp b/src/library.cpp index f0bd7f7ca6..233bb3122c 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -285,7 +285,6 @@ void lammps_commands_string(void *ptr, char *str) BEGIN_CAPTURE { if (lmp->update->whichflag != 0) { - delete [] copy; lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); } From 8d0fdb17a6aaab437d0a672d4d48b5eb0647f5b2 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 1 Mar 2018 10:39:06 -0700 Subject: [PATCH 71/73] Add make package-installed command --- doc/src/Section_start.txt | 4 ++++ src/Makefile | 7 +++++++ src/Package.sh | 7 +++++++ 3 files changed, 18 insertions(+) diff --git a/doc/src/Section_start.txt b/doc/src/Section_start.txt index affcae1e54..6473c346dc 100644 --- a/doc/src/Section_start.txt +++ b/doc/src/Section_start.txt @@ -803,6 +803,10 @@ currently installed. For those that are installed, it will list any files that are different in the src directory and package sub-directory. +Typing "make package-installed" or "make pi" will list which packages are +currently installed, without listing the status of packages that are not +installed. + Typing "make package-update" or "make pu" will overwrite src files with files from the package sub-directories if the package is installed. It should be used after a patch has been applied, since diff --git a/src/Makefile b/src/Makefile index e0f0db77fe..03f4072132 100644 --- a/src/Makefile +++ b/src/Makefile @@ -100,6 +100,7 @@ help: @echo '' @echo 'make package list available packages and their dependencies' @echo 'make package-status (ps) status of all packages' + @echo 'make package-installed (pi) list of installed packages' @echo 'make yes-package install a single pgk in src dir' @echo 'make no-package remove a single pkg from src dir' @echo 'make yes-all install all pgks in src dir' @@ -260,6 +261,7 @@ package: @echo 'make package list available packages' @echo 'make package list available packages' @echo 'make package-status (ps) status of all packages' + @echo 'make package-installed (pi) list of installed packages' @echo 'make yes-package install a single pgk in src dir' @echo 'make no-package remove a single pkg from src dir' @echo 'make yes-all install all pgks in src dir' @@ -354,6 +356,7 @@ lib-%: fi; touch main.cpp # status = list src files that differ from package files +# installed = list of installed packages # update = replace src files with newer package files # overwrite = overwrite package files with newer src files # diff = show differences between src and package files @@ -364,6 +367,10 @@ package-status ps: @echo '' @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p status; done +package-installed pi: + @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p installed; done + @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p installed; done + package-update pu: purge @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p update; done @echo '' diff --git a/src/Package.sh b/src/Package.sh index ce3819b590..72e8761e21 100644 --- a/src/Package.sh +++ b/src/Package.sh @@ -34,6 +34,13 @@ if (test $2 = "status") then echo "Installed NO: package $1" fi +# installed, list only if installed + +elif (test $2 = "installed") then + if (test $installed = 1) then + echo "Installed YES: package $1" + fi + # update, only if installed # perform a re-install, but only if the package is already installed From b1d3b56a17ae4ccf1fd728209d5f4d66ed2cbfaa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 2 Mar 2018 04:33:13 -0500 Subject: [PATCH 72/73] apply bugfix reported in issue #820 --- src/compute_chunk_atom.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compute_chunk_atom.cpp b/src/compute_chunk_atom.cpp index aa1210caad..d08f462907 100644 --- a/src/compute_chunk_atom.cpp +++ b/src/compute_chunk_atom.cpp @@ -1809,13 +1809,13 @@ void ComputeChunkAtom::atom2binsphere() } yremap = x[i][1]; if (periodicity[1]) { - if (xremap < boxlo[1]) yremap += prd[1]; - if (xremap >= boxhi[1]) yremap -= prd[1]; + if (yremap < boxlo[1]) yremap += prd[1]; + if (yremap >= boxhi[1]) yremap -= prd[1]; } zremap = x[i][2]; if (periodicity[2]) { - if (xremap < boxlo[2]) zremap += prd[2]; - if (xremap >= boxhi[2]) zremap -= prd[2]; + if (zremap < boxlo[2]) zremap += prd[2]; + if (zremap >= boxhi[2]) zremap -= prd[2]; } dx = xremap - sorigin[0]; From d18ba3b18834187bda0dd7240fb443271f1288d5 Mon Sep 17 00:00:00 2001 From: Anders Hafreager Date: Thu, 1 Mar 2018 23:22:03 -0800 Subject: [PATCH 73/73] Added error if gcmc is used with molecules on more than one processor --- src/MC/fix_gcmc.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 0230084490..61629aa30d 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -714,6 +714,12 @@ void FixGCMC::init() } } + // Current implementation is broken using + // full_flag on molecules on more than one processor. + // Print error if this is the current mode + if (full_flag && (exchmode == EXCHMOL || movemode == MOVEMOL) && comm->nprocs > 1) + error->all(FLERR,"fix gcmc does currently not support full_energy option with molecules on more than 1 MPI process."); + } /* ----------------------------------------------------------------------