From 862e4ba67af6606ac37114f8c7bb95b673fe823d Mon Sep 17 00:00:00 2001 From: Sievers Date: Mon, 21 Mar 2022 22:45:28 -0700 Subject: [PATCH 01/57] Added different pytorch modules that allow different handling of element types and proposal for __init__.py bug fix --- python/lammps/mliap/__init__.py | 8 +- python/lammps/mliap/pytorch.py | 277 +++++++++++++++++++++++++++++++- 2 files changed, 276 insertions(+), 9 deletions(-) diff --git a/python/lammps/mliap/__init__.py b/python/lammps/mliap/__init__.py index 0d63cc810b..bfd5fdc754 100644 --- a/python/lammps/mliap/__init__.py +++ b/python/lammps/mliap/__init__.py @@ -5,7 +5,13 @@ import sysconfig import ctypes library = sysconfig.get_config_vars('INSTSONAME')[0] -pylib = ctypes.CDLL(library) +try: + pylib = ctypes.CDLL(library) +except OSError as e: + if pylib.endswith(".a"): + pylib.strip(".a") + ".so" + else: + raise e if not pylib.Py_IsInitialized(): raise RuntimeError("This interpreter is not compatible with python-based mliap for LAMMPS.") del sysconfig, ctypes, library, pylib diff --git a/python/lammps/mliap/pytorch.py b/python/lammps/mliap/pytorch.py index 7ec6c2552a..9aa2da80f4 100644 --- a/python/lammps/mliap/pytorch.py +++ b/python/lammps/mliap/pytorch.py @@ -19,10 +19,75 @@ import numpy as np import torch def calc_n_params(model): + """ + Returns the sum of two decimal numbers in binary digits. + + Parameters: + model (torch.nn.Module): Network model that maps descriptors to a per atom attribute + + Returns: + n_params (int): Number of NN model parameters + """ return sum(p.nelement() for p in model.parameters()) class TorchWrapper(torch.nn.Module): - def __init__(self, model,n_descriptors,n_elements,n_params=None,device=None,dtype=torch.float64): + """ + A class to wrap Modules to ensure lammps mliap compatability. + + ... + + Attributes + ---------- + model : torch.nn.Module + Network model that maps descriptors to a per atom attribute + + device : torch.nn.Module (None) + Accelerator device + + dtype : torch.dtype (torch.float64) + Dtype to use on device + + n_params : torch.nn.Module (None) + Number of NN model parameters + + n_descriptors : int + Max number of per atom descriptors + + n_elements : int + Max number of elements + + + Methods + ------- + forward(descriptors, elems): + Feeds descriptors to network model to produce per atom energies and forces. + """ + + def __init__(self, model, n_descriptors, n_elements, n_params=None, device=None, dtype=torch.float64): + """ + Constructs all the necessary attributes for the network module. + + Parameters + ---------- + model : torch.nn.Module + Network model that maps descriptors to a per atom attribute + + n_descriptors : int + Max number of per atom descriptors + + n_elements : int + Max number of elements + + n_params : torch.nn.Module (None) + Number of NN model parameters + + device : torch.nn.Module (None) + Accelerator device + + dtype : torch.dtype (torch.float64) + Dtype to use on device + """ + super().__init__() self.model = model @@ -40,26 +105,222 @@ class TorchWrapper(torch.nn.Module): self.n_descriptors = n_descriptors self.n_elements = n_elements - def forward(self, elems, bispectrum, beta, energy): + def forward(self, elems, descriptors, beta, energy): + """ + Takes element types and descriptors calculated via lammps and + calculates the per atom energies and forces. - bispectrum = torch.from_numpy(bispectrum).to(dtype=self.dtype, device=self.device).requires_grad_(True) + Parameters + ---------- + elems : numpy.array + Per atom element types + + descriptors : numpy.array + Per atom descriptors + + beta : numpy.array + Expired beta array to be filled with new betas + + energy : numpy.array + Expired per atom energy array to be filled with new per atom energy + (Note: This is a pointer to the lammps per atom energies) + + + Returns + ------- + None + """ + + descriptors = torch.from_numpy(descriptors).to(dtype=self.dtype, device=self.device).requires_grad_(True) elems = torch.from_numpy(elems).to(dtype=torch.long, device=self.device) - 1 with torch.autograd.enable_grad(): - energy_nn = self.model(bispectrum, elems) + energy_nn = self.model(descriptors, elems) if energy_nn.ndim > 1: energy_nn = energy_nn.flatten() - beta_nn = torch.autograd.grad(energy_nn.sum(), bispectrum)[0] + beta_nn = torch.autograd.grad(energy_nn.sum(), descriptors)[0] beta[:] = beta_nn.detach().cpu().numpy().astype(np.float64) energy[:] = energy_nn.detach().cpu().numpy().astype(np.float64) + class IgnoreElems(torch.nn.Module): - def __init__(self,subnet): + """ + A class to represent a NN model agnostic of element typing. + + ... + + Attributes + ---------- + subnet : torch.nn.Module + Network model that maps descriptors to a per atom attribute + + Methods + ------- + forward(descriptors, elems): + Feeds descriptors to network model + """ + + def __init__(self, subnet): + """ + Constructs all the necessary attributes for the network module. + + Parameters + ---------- + subnet : torch.nn.Module + Network model that maps descriptors to a per atom attribute + """ + super().__init__() self.subnet = subnet - def forward(self,bispectrum,elems): - return self.subnet(bispectrum) + def forward(self, descriptors, elems): + """ + Feeds descriptors to network model + + Parameters + ---------- + descriptors : torch.tensor + Per atom descriptors + + elems : torch.tensor + Per atom element types + + Returns + ------- + self.subnet(descriptors) : torch.tensor + Per atom attribute computed by the network model + """ + + return self.subnet(descriptors) + + +class UnpackElems(torch.nn.Module): + """ + A class to represent a NN model pseudo-agnostic of element typing for + systems with multiple element typings. + + ... + + Attributes + ---------- + subnet : torch.nn.Module + Network model that maps descriptors to a per atom attribute + + n_types : int + Number of atom types used in training the NN model. + + Methods + ------- + forward(descriptors, elems): + Feeds descriptors to network model after adding zeros into + descriptor columns relating to different atom types + """ + + def __init__(self, subnet, n_types): + """ + Constructs all the necessary attributes for the network module. + + Parameters + ---------- + subnet : torch.nn.Module + Network model that maps descriptors to a per atom attribute. + + n_types : int + Number of atom types used in training the NN model. + """ + super().__init__() + self.subnet = subnet + self.n_types = n_types + + def forward(self, descriptors, elems): + """ + Feeds descriptors to network model after adding zeros into + descriptor columns relating to different atom types + + Parameters + ---------- + descriptors : torch.tensor + Per atom descriptors + + elems : torch.tensor + Per atom element types + + Returns + ------- + self.subnet(descriptors) : torch.tensor + Per atom attribute computed by the network model + """ + + unpacked_descriptors = torch.zeros(elems.shape[0], self.n_types, descriptors.shape[1], dtype=torch.float64) + for i, ind in enumerate(elems): + unpacked_descriptors[i, ind, :] = descriptors[i] + return self.subnet(torch.reshape(unpacked_descriptors, (elems.shape[0], -1)), elems) + + +class ElemwiseModels(torch.nn.Module): + """ + A class to represent a NN model dependent on element typing. + + ... + + Attributes + ---------- + subnets : list of torch.nn.Modules + Per element type network models that maps per element type + descriptors to a per atom attribute. + + n_types : int + Number of atom types used in training the NN model. + + Methods + ------- + forward(descriptors, elems): + Feeds descriptors to network model after adding zeros into + descriptor columns relating to different atom types + """ + + def __init__(self, subnets, n_types): + """ + Constructs all the necessary attributes for the network module. + + Parameters + ---------- + subnets : list of torch.nn.Modules + Per element type network models that maps per element + type descriptors to a per atom attribute. + + n_types : int + Number of atom types used in training the NN model. + """ + + super().__init__() + self.subnets = subnets + self.n_types = n_types + + def forward(self, descriptors, elems): + """ + Feeds descriptors to network model after adding zeros into + descriptor columns relating to different atom types + + Parameters + ---------- + descriptors : torch.tensor + Per atom descriptors + + elems : torch.tensor + Per atom element types + + Returns + ------- + self.subnets(descriptors) : torch.tensor + Per atom attribute computed by the network model + """ + + per_atom_attributes = torch.zeros(elems.size[0]) + given_elems, elem_indices = torch.unique(elems, return_inverse=True) + for i, elem in enumerate(given_elems): + per_atom_attribute[elem_indices == i] = self.subnets[elem](descriptors[elem_indices == i]) + return per_atom_attributes From 2e539918c161806c370e8bf5dbaa6ecca54d971a Mon Sep 17 00:00:00 2001 From: Sievers Date: Mon, 21 Mar 2022 22:55:28 -0700 Subject: [PATCH 02/57] slight change in __init__.py to fix *.a bug --- python/lammps/mliap/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/lammps/mliap/__init__.py b/python/lammps/mliap/__init__.py index bfd5fdc754..57fe97d803 100644 --- a/python/lammps/mliap/__init__.py +++ b/python/lammps/mliap/__init__.py @@ -10,6 +10,7 @@ try: except OSError as e: if pylib.endswith(".a"): pylib.strip(".a") + ".so" + pylib = ctypes.CDLL(library) else: raise e if not pylib.Py_IsInitialized(): From ace6c67697f9ac77d5a45cf8c9415fd153bd5f1e Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Wed, 23 Mar 2022 22:26:44 +0800 Subject: [PATCH 03/57] Copy .h & .cpp from compute_fep for comparison --- src/FEP/compute_fep_ta.cpp | 655 +++++++++++++++++++++++++++++++++++++ src/FEP/compute_fep_ta.h | 112 +++++++ 2 files changed, 767 insertions(+) create mode 100644 src/FEP/compute_fep_ta.cpp create mode 100644 src/FEP/compute_fep_ta.h diff --git a/src/FEP/compute_fep_ta.cpp b/src/FEP/compute_fep_ta.cpp new file mode 100644 index 0000000000..787c8a29e6 --- /dev/null +++ b/src/FEP/compute_fep_ta.cpp @@ -0,0 +1,655 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, 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: Agilio Padua (ENS de Lyon & CNRS) +------------------------------------------------------------------------- */ + +#include "compute_fep.h" + +#include "atom.h" +#include "comm.h" +#include "domain.h" +#include "error.h" +#include "fix.h" +#include "force.h" +#include "input.h" +#include "kspace.h" +#include "memory.h" +#include "modify.h" +#include "pair.h" +#include "pair_hybrid.h" +#include "timer.h" +#include "update.h" +#include "variable.h" + +#include +#include + +using namespace LAMMPS_NS; + +enum{PAIR,ATOM}; +enum{CHARGE}; + +/* ---------------------------------------------------------------------- */ + +ComputeFEP::ComputeFEP(LAMMPS *lmp, int narg, char **arg) : + Compute(lmp, narg, arg) +{ + if (narg < 5) error->all(FLERR,"Illegal number of arguments in compute fep"); + + scalar_flag = 0; + vector_flag = 1; + size_vector = 3; + extvector = 0; + + vector = new double[size_vector]; + + fepinitflag = 0; // avoid init to run entirely when called by write_data + + temp_fep = utils::numeric(FLERR,arg[3],false,lmp); + + // count # of perturbations + + npert = 0; + int iarg = 4; + while (iarg < narg) { + if (strcmp(arg[iarg],"pair") == 0) { + if (iarg+6 > narg) error->all(FLERR, + "Illegal pair attribute in compute fep"); + npert++; + iarg += 6; + } else if (strcmp(arg[iarg],"atom") == 0) { + if (iarg+4 > narg) error->all(FLERR, + "Illegal atom attribute in compute fep"); + npert++; + iarg += 4; + } else break; + } + + if (npert == 0) error->all(FLERR,"Illegal syntax in compute fep"); + perturb = new Perturb[npert]; + + // parse keywords + + npert = 0; + chgflag = 0; + + iarg = 4; + while (iarg < narg) { + if (strcmp(arg[iarg],"pair") == 0) { + perturb[npert].which = PAIR; + perturb[npert].pstyle = utils::strdup(arg[iarg+1]); + perturb[npert].pparam = utils::strdup(arg[iarg+2]); + utils::bounds(FLERR,arg[iarg+3],1,atom->ntypes, + perturb[npert].ilo,perturb[npert].ihi,error); + utils::bounds(FLERR,arg[iarg+4],1,atom->ntypes, + perturb[npert].jlo,perturb[npert].jhi,error); + if (utils::strmatch(arg[iarg+5],"^v_")) { + perturb[npert].var = utils::strdup(arg[iarg+5]+2); + } else error->all(FLERR,"Illegal variable in compute fep"); + npert++; + iarg += 6; + } else if (strcmp(arg[iarg],"atom") == 0) { + perturb[npert].which = ATOM; + if (strcmp(arg[iarg+1],"charge") == 0) { + perturb[npert].aparam = CHARGE; + chgflag = 1; + } else error->all(FLERR,"Illegal atom argument in compute fep"); + utils::bounds(FLERR,arg[iarg+2],1,atom->ntypes, + perturb[npert].ilo,perturb[npert].ihi,error); + if (utils::strmatch(arg[iarg+3],"^v_")) { + perturb[npert].var = utils::strdup(arg[iarg+3]+2); + } else error->all(FLERR,"Illegal variable in compute fep"); + npert++; + iarg += 4; + } else break; + } + + // optional keywords + + tailflag = 0; + volumeflag = 0; + + while (iarg < narg) { + if (strcmp(arg[iarg],"tail") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal optional keyword in compute fep"); + tailflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + iarg += 2; + } else if (strcmp(arg[iarg],"volume") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal optional keyword in compute fep"); + volumeflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + iarg += 2; + } else + error->all(FLERR,"Illegal optional keyword in compute fep"); + } + + // allocate pair style arrays + + int ntype = atom->ntypes; + for (int m = 0; m < npert; m++) { + if (perturb[m].which == PAIR) + memory->create(perturb[m].array_orig,ntype+1,ntype+1,"fep:array_orig"); + } + + // allocate space for charge, force, energy, virial arrays + + f_orig = nullptr; + q_orig = nullptr; + peatom_orig = keatom_orig = nullptr; + pvatom_orig = kvatom_orig = nullptr; + + allocate_storage(); + + fixgpu = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +ComputeFEP::~ComputeFEP() +{ + delete [] vector; + + for (int m = 0; m < npert; m++) { + delete [] perturb[m].var; + if (perturb[m].which == PAIR) { + delete [] perturb[m].pstyle; + delete [] perturb[m].pparam; + memory->destroy(perturb[m].array_orig); + } + } + delete [] perturb; + + deallocate_storage(); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeFEP::init() +{ + int i,j; + + if (!fepinitflag) // avoid init to run entirely when called by write_data + fepinitflag = 1; + else return; + + // setup and error checks + + pairflag = 0; + + for (int m = 0; m < npert; m++) { + Perturb *pert = &perturb[m]; + + pert->ivar = input->variable->find(pert->var); + if (pert->ivar < 0) + error->all(FLERR,"Variable name for compute fep does not exist"); + if (!input->variable->equalstyle(pert->ivar)) + error->all(FLERR,"Variable for compute fep is of invalid style"); + + if (force->pair == nullptr) + error->all(FLERR,"compute fep pair requires pair interactions"); + + if (pert->which == PAIR) { + pairflag = 1; + + Pair *pair = force->pair_match(pert->pstyle,1); + if (pair == nullptr) error->all(FLERR,"compute fep pair style " + "does not exist"); + void *ptr = pair->extract(pert->pparam,pert->pdim); + if (ptr == nullptr) + error->all(FLERR,"compute fep pair style param not supported"); + + pert->array = (double **) ptr; + + // if pair hybrid, test that ilo,ihi,jlo,jhi are valid for sub-style + + if ((strcmp(force->pair_style,"hybrid") == 0 || + strcmp(force->pair_style,"hybrid/overlay") == 0)) { + PairHybrid *pair = (PairHybrid *) force->pair; + for (i = pert->ilo; i <= pert->ihi; i++) + for (j = MAX(pert->jlo,i); j <= pert->jhi; j++) + if (!pair->check_ijtype(i,j,pert->pstyle)) + error->all(FLERR,"compute fep type pair range is not valid for " + "pair hybrid sub-style"); + } + + } else if (pert->which == ATOM) { + if (pert->aparam == CHARGE) { + if (!atom->q_flag) + error->all(FLERR,"compute fep requires atom attribute charge"); + } + } + } + + if (tailflag) { + if (force->pair->tail_flag == 0) + error->all(FLERR,"Compute fep tail when pair style does not " + "compute tail corrections"); + } + + // detect if package gpu is present + + int ifixgpu = modify->find_fix("package_gpu"); + if (ifixgpu >= 0) fixgpu = modify->fix[ifixgpu]; + + if (comm->me == 0) { + if (screen) { + fprintf(screen, "FEP settings ...\n"); + fprintf(screen, " temperature = %f\n", temp_fep); + fprintf(screen, " tail %s\n", (tailflag ? "yes":"no")); + for (int m = 0; m < npert; m++) { + Perturb *pert = &perturb[m]; + if (pert->which == PAIR) + fprintf(screen, " pair %s %s %d-%d %d-%d\n", pert->pstyle, + pert->pparam, + pert->ilo, pert->ihi, pert->jlo, pert->jhi); + else if (pert->which == ATOM) + fprintf(screen, " atom charge %d-%d\n", pert->ilo, pert->ihi); + } + } + if (logfile) { + fprintf(logfile, "FEP settings ...\n"); + fprintf(logfile, " temperature = %f\n", temp_fep); + fprintf(logfile, " tail %s\n", (tailflag ? "yes":"no")); + for (int m = 0; m < npert; m++) { + Perturb *pert = &perturb[m]; + if (pert->which == PAIR) + fprintf(logfile, " pair %s %s %d-%d %d-%d\n", pert->pstyle, + pert->pparam, + pert->ilo, pert->ihi, pert->jlo, pert->jhi); + else if (pert->which == ATOM) + fprintf(logfile, " atom charge %d-%d\n", pert->ilo, pert->ihi); + } + } + } + +} + +/* ---------------------------------------------------------------------- */ + + +void ComputeFEP::compute_vector() +{ + double pe0,pe1; + + eflag = 1; + vflag = 0; + + invoked_vector = update->ntimestep; + + if (atom->nmax > nmax) { // reallocate working arrays if necessary + deallocate_storage(); + allocate_storage(); + } + + backup_qfev(); // backup charge, force, energy, virial array values + backup_params(); // backup pair parameters + + timer->stamp(); + if (force->pair && force->pair->compute_flag) { + force->pair->compute(eflag,vflag); + timer->stamp(Timer::PAIR); + } + if (chgflag && force->kspace && force->kspace->compute_flag) { + force->kspace->compute(eflag,vflag); + timer->stamp(Timer::KSPACE); + } + + // accumulate force/energy/virial from /gpu pair styles + if (fixgpu) fixgpu->post_force(vflag); + + pe0 = compute_epair(); + + perturb_params(); + + timer->stamp(); + if (force->pair && force->pair->compute_flag) { + force->pair->compute(eflag,vflag); + timer->stamp(Timer::PAIR); + } + if (chgflag && force->kspace && force->kspace->compute_flag) { + force->kspace->compute(eflag,vflag); + timer->stamp(Timer::KSPACE); + } + + // accumulate force/energy/virial from /gpu pair styles + // this is required as to empty the answer queue, + // otherwise the force compute on the GPU in the next step would be incorrect + if (fixgpu) fixgpu->post_force(vflag); + + pe1 = compute_epair(); + + restore_qfev(); // restore charge, force, energy, virial array values + restore_params(); // restore pair parameters + + vector[0] = pe1-pe0; + vector[1] = exp(-(pe1-pe0)/(force->boltz*temp_fep)); + vector[2] = domain->xprd * domain->yprd * domain->zprd; + if (volumeflag) + vector[1] *= vector[2]; +} + + +/* ---------------------------------------------------------------------- + obtain pair energy from lammps accumulators +------------------------------------------------------------------------- */ + +double ComputeFEP::compute_epair() +{ + double eng, eng_pair; + + eng = 0.0; + if (force->pair) + eng = force->pair->eng_vdwl + force->pair->eng_coul; + MPI_Allreduce(&eng,&eng_pair,1,MPI_DOUBLE,MPI_SUM,world); + + if (tailflag) { + double volume = domain->xprd * domain->yprd * domain->zprd; + eng_pair += force->pair->etail / volume; + } + + if (chgflag && force->kspace) eng_pair += force->kspace->energy; + + return eng_pair; +} + + +/* ---------------------------------------------------------------------- + apply perturbation to pair, atom parameters based on variable evaluation +------------------------------------------------------------------------- */ + +void ComputeFEP::perturb_params() +{ + int i,j; + + for (int m = 0; m < npert; m++) { + Perturb *pert = &perturb[m]; + + double delta = input->variable->compute_equal(pert->ivar); + + if (pert->which == PAIR) { // modify pair parameters + for (i = pert->ilo; i <= pert->ihi; i++) + for (j = MAX(pert->jlo,i); j <= pert->jhi; j++) + pert->array[i][j] = pert->array_orig[i][j] + delta; + + } else if (pert->which == ATOM) { + + if (pert->aparam == CHARGE) { // modify charges + int *atype = atom->type; + double *q = atom->q; + int *mask = atom->mask; + int natom = atom->nlocal + atom->nghost; + + for (i = 0; i < natom; i++) + if (atype[i] >= pert->ilo && atype[i] <= pert->ihi) + if (mask[i] & groupbit) + q[i] += delta; + + } + } + } + + // re-initialize pair styles if any PAIR settings were changed + // this resets other coeffs that may depend on changed values, + // and also offset and tail corrections + + if (pairflag) force->pair->reinit(); + + // reset KSpace charges if charges have changed + + if (chgflag && force->kspace) force->kspace->qsum_qsq(); +} + + +/* ---------------------------------------------------------------------- + backup pair parameters +------------------------------------------------------------------------- */ + +void ComputeFEP::backup_params() +{ + int i,j; + + for (int m = 0; m < npert; m++) { + Perturb *pert = &perturb[m]; + if (pert->which == PAIR) { + for (i = pert->ilo; i <= pert->ihi; i++) + for (j = MAX(pert->jlo,i); j <= pert->jhi; j++) + pert->array_orig[i][j] = pert->array[i][j]; + } + } +} + + +/* ---------------------------------------------------------------------- + restore pair parameters to original values +------------------------------------------------------------------------- */ + +void ComputeFEP::restore_params() +{ + int i,j; + + for (int m = 0; m < npert; m++) { + Perturb *pert = &perturb[m]; + if (pert->which == PAIR) { + for (i = pert->ilo; i <= pert->ihi; i++) + for (j = MAX(pert->jlo,i); j <= pert->jhi; j++) + pert->array[i][j] = pert->array_orig[i][j]; + } + } + + if (pairflag) force->pair->reinit(); + + // reset KSpace charges if charges have changed + + if (chgflag && force->kspace) force->kspace->qsum_qsq(); +} + + +/* ---------------------------------------------------------------------- + manage storage for charge, force, energy, virial arrays +------------------------------------------------------------------------- */ + +void ComputeFEP::allocate_storage() +{ + nmax = atom->nmax; + memory->create(f_orig,nmax,3,"fep:f_orig"); + memory->create(peatom_orig,nmax,"fep:peatom_orig"); + memory->create(pvatom_orig,nmax,6,"fep:pvatom_orig"); + if (chgflag) { + memory->create(q_orig,nmax,"fep:q_orig"); + if (force->kspace) { + memory->create(keatom_orig,nmax,"fep:keatom_orig"); + memory->create(kvatom_orig,nmax,6,"fep:kvatom_orig"); + } + } +} + +/* ---------------------------------------------------------------------- */ + +void ComputeFEP::deallocate_storage() +{ + memory->destroy(f_orig); + memory->destroy(peatom_orig); + memory->destroy(pvatom_orig); + memory->destroy(q_orig); + memory->destroy(keatom_orig); + memory->destroy(kvatom_orig); + + f_orig = nullptr; + q_orig = nullptr; + peatom_orig = keatom_orig = nullptr; + pvatom_orig = kvatom_orig = nullptr; +} + + +/* ---------------------------------------------------------------------- + backup and restore arrays with charge, force, energy, virial +------------------------------------------------------------------------- */ + +void ComputeFEP::backup_qfev() +{ + int i; + + int nall = atom->nlocal + atom->nghost; + int natom = atom->nlocal; + if (force->newton || force->kspace->tip4pflag) + natom += atom->nghost; + + double **f = atom->f; + for (i = 0; i < natom; i++) { + f_orig[i][0] = f[i][0]; + f_orig[i][1] = f[i][1]; + f_orig[i][2] = f[i][2]; + } + + eng_vdwl_orig = force->pair->eng_vdwl; + eng_coul_orig = force->pair->eng_coul; + + pvirial_orig[0] = force->pair->virial[0]; + pvirial_orig[1] = force->pair->virial[1]; + pvirial_orig[2] = force->pair->virial[2]; + pvirial_orig[3] = force->pair->virial[3]; + pvirial_orig[4] = force->pair->virial[4]; + pvirial_orig[5] = force->pair->virial[5]; + + if (update->eflag_atom) { + double *peatom = force->pair->eatom; + for (i = 0; i < natom; i++) + peatom_orig[i] = peatom[i]; + } + if (update->vflag_atom) { + double **pvatom = force->pair->vatom; + for (i = 0; i < natom; i++) { + pvatom_orig[i][0] = pvatom[i][0]; + pvatom_orig[i][1] = pvatom[i][1]; + pvatom_orig[i][2] = pvatom[i][2]; + pvatom_orig[i][3] = pvatom[i][3]; + pvatom_orig[i][4] = pvatom[i][4]; + pvatom_orig[i][5] = pvatom[i][5]; + } + } + + if (chgflag) { + double *q = atom->q; + for (i = 0; i < nall; i++) + q_orig[i] = q[i]; + + if (force->kspace) { + energy_orig = force->kspace->energy; + kvirial_orig[0] = force->kspace->virial[0]; + kvirial_orig[1] = force->kspace->virial[1]; + kvirial_orig[2] = force->kspace->virial[2]; + kvirial_orig[3] = force->kspace->virial[3]; + kvirial_orig[4] = force->kspace->virial[4]; + kvirial_orig[5] = force->kspace->virial[5]; + + if (update->eflag_atom) { + double *keatom = force->kspace->eatom; + for (i = 0; i < natom; i++) + keatom_orig[i] = keatom[i]; + } + if (update->vflag_atom) { + double **kvatom = force->kspace->vatom; + for (i = 0; i < natom; i++) { + kvatom_orig[i][0] = kvatom[i][0]; + kvatom_orig[i][1] = kvatom[i][1]; + kvatom_orig[i][2] = kvatom[i][2]; + kvatom_orig[i][3] = kvatom[i][3]; + kvatom_orig[i][4] = kvatom[i][4]; + kvatom_orig[i][5] = kvatom[i][5]; + } + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +void ComputeFEP::restore_qfev() +{ + int i; + + int nall = atom->nlocal + atom->nghost; + int natom = atom->nlocal; + if (force->newton || force->kspace->tip4pflag) + natom += atom->nghost; + + double **f = atom->f; + for (i = 0; i < natom; i++) { + f[i][0] = f_orig[i][0]; + f[i][1] = f_orig[i][1]; + f[i][2] = f_orig[i][2]; + } + + force->pair->eng_vdwl = eng_vdwl_orig; + force->pair->eng_coul = eng_coul_orig; + + force->pair->virial[0] = pvirial_orig[0]; + force->pair->virial[1] = pvirial_orig[1]; + force->pair->virial[2] = pvirial_orig[2]; + force->pair->virial[3] = pvirial_orig[3]; + force->pair->virial[4] = pvirial_orig[4]; + force->pair->virial[5] = pvirial_orig[5]; + + if (update->eflag_atom) { + double *peatom = force->pair->eatom; + for (i = 0; i < natom; i++) + peatom[i] = peatom_orig[i]; + } + if (update->vflag_atom) { + double **pvatom = force->pair->vatom; + for (i = 0; i < natom; i++) { + pvatom[i][0] = pvatom_orig[i][0]; + pvatom[i][1] = pvatom_orig[i][1]; + pvatom[i][2] = pvatom_orig[i][2]; + pvatom[i][3] = pvatom_orig[i][3]; + pvatom[i][4] = pvatom_orig[i][4]; + pvatom[i][5] = pvatom_orig[i][5]; + } + } + + if (chgflag) { + double *q = atom->q; + for (i = 0; i < nall; i++) + q[i] = q_orig[i]; + + if (force->kspace) { + force->kspace->energy = energy_orig; + force->kspace->virial[0] = kvirial_orig[0]; + force->kspace->virial[1] = kvirial_orig[1]; + force->kspace->virial[2] = kvirial_orig[2]; + force->kspace->virial[3] = kvirial_orig[3]; + force->kspace->virial[4] = kvirial_orig[4]; + force->kspace->virial[5] = kvirial_orig[5]; + + if (update->eflag_atom) { + double *keatom = force->kspace->eatom; + for (i = 0; i < natom; i++) + keatom[i] = keatom_orig[i]; + } + if (update->vflag_atom) { + double **kvatom = force->kspace->vatom; + for (i = 0; i < natom; i++) { + kvatom[i][0] = kvatom_orig[i][0]; + kvatom[i][1] = kvatom_orig[i][1]; + kvatom[i][2] = kvatom_orig[i][2]; + kvatom[i][3] = kvatom_orig[i][3]; + kvatom[i][4] = kvatom_orig[i][4]; + kvatom[i][5] = kvatom_orig[i][5]; + } + } + } + } +} + diff --git a/src/FEP/compute_fep_ta.h b/src/FEP/compute_fep_ta.h new file mode 100644 index 0000000000..8f576124e0 --- /dev/null +++ b/src/FEP/compute_fep_ta.h @@ -0,0 +1,112 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, 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: Agilio Padua (ENS de Lyon & CNRS) +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS +// clang-format off +ComputeStyle(fep,ComputeFEP); +// clang-format on +#else + +#ifndef COMPUTE_FEP_H +#define COMPUTE_FEP_H + +#include "compute.h" + +namespace LAMMPS_NS { + +class ComputeFEP : public Compute { + public: + ComputeFEP(class LAMMPS *, int, char **); + ~ComputeFEP() override; + void init() override; + void compute_vector() override; + + private: + int npert; + int pairflag; + int chgflag; + int tailflag, volumeflag; + int fepinitflag; + int eflag, vflag; + double temp_fep; + + int nmax; + double *q_orig; + double **f_orig; + double eng_vdwl_orig, eng_coul_orig; + double pvirial_orig[6]; + double *peatom_orig, **pvatom_orig; + double energy_orig; + double kvirial_orig[6]; + double *keatom_orig, **kvatom_orig; + + class Fix *fixgpu; + + struct Perturb { + int which, ivar; + char *var; + char *pstyle, *pparam; + int ilo, ihi, jlo, jhi; + int pdim; + double **array, **array_orig; + int aparam; + }; + + Perturb *perturb; + + double compute_epair(); + void perturb_params(); + void backup_params(); + void restore_params(); + void allocate_storage(); + void deallocate_storage(); + void backup_qfev(); + void restore_qfev(); +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Variable name for compute fep does not exist + +Self-explanatory. + +E: Variable for compute fep is invalid style + +Self-explanatory. + +E: Compute fep pair style does not exist + +Self-explanatory. + +E: Energy was not tallied on needed timestep + +You are using a thermo keyword that requires potentials to +have tallied energy, but they didn't on this timestep. See the +variable doc page for ideas on how to make this work. + +*/ From 2ae448d9d0c2296ef2cdd7849f90bdc69434c7ce Mon Sep 17 00:00:00 2001 From: J Todd Date: Fri, 25 Mar 2022 11:05:09 +0000 Subject: [PATCH 04/57] Add kokkos-sycl.cmake & relevant compiler flags --- cmake/presets/kokkos-sycl.cmake | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 cmake/presets/kokkos-sycl.cmake diff --git a/cmake/presets/kokkos-sycl.cmake b/cmake/presets/kokkos-sycl.cmake new file mode 100644 index 0000000000..68ee858edf --- /dev/null +++ b/cmake/presets/kokkos-sycl.cmake @@ -0,0 +1,16 @@ +# preset that enables KOKKOS and selects CUDA compilation with OpenMP +# enabled as well. This preselects CC 5.0 as default GPU arch, since +# that is compatible with all higher CC, but not the default CC 3.5 +set(PKG_KOKKOS ON CACHE BOOL "" FORCE) +set(Kokkos_ENABLE_SERIAL ON CACHE BOOL "" FORCE) +set(Kokkos_ENABLE_OPENMP ON CACHE BOOL "" FORCE) +set(Kokkos_ENABLE_CUDA OFF CACHE BOOL "" FORCE) +set(Kokkos_ENABLE_SYCL ON CACHE BOOL "" FORCE) +set(Kokkos_ARCH_MAXWELL50 on CACHE BOOL "" FORCE) +set(BUILD_OMP ON CACHE BOOL "" FORCE) + +set(CMAKE_CXX_COMPILER clang++ CACHE STRING "" FORCE) +set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE) +set(CMAKE_CXX_STANDARD 17 CACHE STRING "" FORCE) +set(CMAKE_SHARED_LINKER_FLAGS "-Xsycl-target-frontend -O3" CACHE STRING "" FORCE) +set(CMAKE_TUNE_FLAGS "-fgpu-inline-threshold=100000 -Xsycl-target-frontend -O3 -Xsycl-target-frontend -ffp-contract=on -Wno-unknown-cuda-version" CACHE STRING "" FORCE) From 29ada4e263ca49cad26783fec7907629693a9369 Mon Sep 17 00:00:00 2001 From: J Todd Date: Fri, 25 Mar 2022 11:19:59 +0000 Subject: [PATCH 05/57] Update description header --- cmake/presets/kokkos-sycl.cmake | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cmake/presets/kokkos-sycl.cmake b/cmake/presets/kokkos-sycl.cmake index 68ee858edf..01abe7762f 100644 --- a/cmake/presets/kokkos-sycl.cmake +++ b/cmake/presets/kokkos-sycl.cmake @@ -1,6 +1,5 @@ -# preset that enables KOKKOS and selects CUDA compilation with OpenMP -# enabled as well. This preselects CC 5.0 as default GPU arch, since -# that is compatible with all higher CC, but not the default CC 3.5 +# preset that enables KOKKOS and selects SYCL compilation with OpenMP +# enabled as well. Also sets some performance related compiler flags. set(PKG_KOKKOS ON CACHE BOOL "" FORCE) set(Kokkos_ENABLE_SERIAL ON CACHE BOOL "" FORCE) set(Kokkos_ENABLE_OPENMP ON CACHE BOOL "" FORCE) From 274db39aa55af2fc39f8d13f5c0ae91b3e421d7a Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Fri, 25 Mar 2022 22:41:39 +0800 Subject: [PATCH 06/57] demo of new compute style fep/ta --- src/FEP/compute_fep_ta.cpp | 465 +++++++++++++------------------------ src/FEP/compute_fep_ta.h | 59 ++--- 2 files changed, 180 insertions(+), 344 deletions(-) diff --git a/src/FEP/compute_fep_ta.cpp b/src/FEP/compute_fep_ta.cpp index 787c8a29e6..cc301a0ac5 100644 --- a/src/FEP/compute_fep_ta.cpp +++ b/src/FEP/compute_fep_ta.cpp @@ -13,10 +13,10 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Agilio Padua (ENS de Lyon & CNRS) + Contributing author: Shifeng Ke (Zhejiang University) ------------------------------------------------------------------------- */ -#include "compute_fep.h" +#include "compute_fep_ta.h" #include "atom.h" #include "comm.h" @@ -24,34 +24,31 @@ #include "error.h" #include "fix.h" #include "force.h" -#include "input.h" #include "kspace.h" #include "memory.h" #include "modify.h" +#include "neighbor.h" #include "pair.h" -#include "pair_hybrid.h" #include "timer.h" #include "update.h" -#include "variable.h" #include #include using namespace LAMMPS_NS; -enum{PAIR,ATOM}; -enum{CHARGE}; +enum{X,Y,Z}; /* ---------------------------------------------------------------------- */ -ComputeFEP::ComputeFEP(LAMMPS *lmp, int narg, char **arg) : +ComputeFEPTA::ComputeFEPTA(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { - if (narg < 5) error->all(FLERR,"Illegal number of arguments in compute fep"); + if (narg < 6) error->all(FLERR,"Illegal number of arguments in compute fep/ta"); scalar_flag = 0; vector_flag = 1; - size_vector = 3; + size_vector = 2; extvector = 0; vector = new double[size_vector]; @@ -60,93 +57,39 @@ ComputeFEP::ComputeFEP(LAMMPS *lmp, int narg, char **arg) : temp_fep = utils::numeric(FLERR,arg[3],false,lmp); - // count # of perturbations + if (strcmp(arg[4],"xy") == 0) { + tan_axis1 = X; + tan_axis2 = Y; + norm_axis = Z; + } else if (strcmp(arg[4],"xz") == 0) { + tan_axis1 = X; + tan_axis2 = Z; + norm_axis = Y; + } else if (strcmp(arg[4],"yz") == 0) { + tan_axis1 = Y; + tan_axis2 = Z; + norm_axis = X; + } else error->all(FLERR,"Illegal arguments in compute fep/ta"); - npert = 0; - int iarg = 4; - while (iarg < narg) { - if (strcmp(arg[iarg],"pair") == 0) { - if (iarg+6 > narg) error->all(FLERR, - "Illegal pair attribute in compute fep"); - npert++; - iarg += 6; - } else if (strcmp(arg[iarg],"atom") == 0) { - if (iarg+4 > narg) error->all(FLERR, - "Illegal atom attribute in compute fep"); - npert++; - iarg += 4; - } else break; - } - - if (npert == 0) error->all(FLERR,"Illegal syntax in compute fep"); - perturb = new Perturb[npert]; - - // parse keywords - - npert = 0; - chgflag = 0; - - iarg = 4; - while (iarg < narg) { - if (strcmp(arg[iarg],"pair") == 0) { - perturb[npert].which = PAIR; - perturb[npert].pstyle = utils::strdup(arg[iarg+1]); - perturb[npert].pparam = utils::strdup(arg[iarg+2]); - utils::bounds(FLERR,arg[iarg+3],1,atom->ntypes, - perturb[npert].ilo,perturb[npert].ihi,error); - utils::bounds(FLERR,arg[iarg+4],1,atom->ntypes, - perturb[npert].jlo,perturb[npert].jhi,error); - if (utils::strmatch(arg[iarg+5],"^v_")) { - perturb[npert].var = utils::strdup(arg[iarg+5]+2); - } else error->all(FLERR,"Illegal variable in compute fep"); - npert++; - iarg += 6; - } else if (strcmp(arg[iarg],"atom") == 0) { - perturb[npert].which = ATOM; - if (strcmp(arg[iarg+1],"charge") == 0) { - perturb[npert].aparam = CHARGE; - chgflag = 1; - } else error->all(FLERR,"Illegal atom argument in compute fep"); - utils::bounds(FLERR,arg[iarg+2],1,atom->ntypes, - perturb[npert].ilo,perturb[npert].ihi,error); - if (utils::strmatch(arg[iarg+3],"^v_")) { - perturb[npert].var = utils::strdup(arg[iarg+3]+2); - } else error->all(FLERR,"Illegal variable in compute fep"); - npert++; - iarg += 4; - } else break; - } + scale_factor = utils::numeric(FLERR,arg[5],false,lmp); // optional keywords tailflag = 0; - volumeflag = 0; + int iarg = 6; while (iarg < narg) { if (strcmp(arg[iarg],"tail") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal optional keyword in compute fep"); + if (iarg+2 > narg) error->all(FLERR,"Illegal optional keyword in compute fep/ta"); tailflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; - } else if (strcmp(arg[iarg],"volume") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal optional keyword in compute fep"); - volumeflag = utils::logical(FLERR,arg[iarg+1],false,lmp); - iarg += 2; - } else - error->all(FLERR,"Illegal optional keyword in compute fep"); + } else error->all(FLERR,"Illegal optional keyword in compute fep/ta"); } - // allocate pair style arrays - - int ntype = atom->ntypes; - for (int m = 0; m < npert; m++) { - if (perturb[m].which == PAIR) - memory->create(perturb[m].array_orig,ntype+1,ntype+1,"fep:array_orig"); - } - - // allocate space for charge, force, energy, virial arrays + // allocate space for position, charge, force, energy, virial arrays + x_orig = nullptr; f_orig = nullptr; - q_orig = nullptr; peatom_orig = keatom_orig = nullptr; pvatom_orig = kvatom_orig = nullptr; @@ -157,26 +100,16 @@ ComputeFEP::ComputeFEP(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -ComputeFEP::~ComputeFEP() +ComputeFEPTA::~ComputeFEPTA() { delete [] vector; - for (int m = 0; m < npert; m++) { - delete [] perturb[m].var; - if (perturb[m].which == PAIR) { - delete [] perturb[m].pstyle; - delete [] perturb[m].pparam; - memory->destroy(perturb[m].array_orig); - } - } - delete [] perturb; - deallocate_storage(); } /* ---------------------------------------------------------------------- */ -void ComputeFEP::init() +void ComputeFEPTA::init() { int i,j; @@ -188,53 +121,9 @@ void ComputeFEP::init() pairflag = 0; - for (int m = 0; m < npert; m++) { - Perturb *pert = &perturb[m]; - - pert->ivar = input->variable->find(pert->var); - if (pert->ivar < 0) - error->all(FLERR,"Variable name for compute fep does not exist"); - if (!input->variable->equalstyle(pert->ivar)) - error->all(FLERR,"Variable for compute fep is of invalid style"); - - if (force->pair == nullptr) - error->all(FLERR,"compute fep pair requires pair interactions"); - - if (pert->which == PAIR) { - pairflag = 1; - - Pair *pair = force->pair_match(pert->pstyle,1); - if (pair == nullptr) error->all(FLERR,"compute fep pair style " - "does not exist"); - void *ptr = pair->extract(pert->pparam,pert->pdim); - if (ptr == nullptr) - error->all(FLERR,"compute fep pair style param not supported"); - - pert->array = (double **) ptr; - - // if pair hybrid, test that ilo,ihi,jlo,jhi are valid for sub-style - - if ((strcmp(force->pair_style,"hybrid") == 0 || - strcmp(force->pair_style,"hybrid/overlay") == 0)) { - PairHybrid *pair = (PairHybrid *) force->pair; - for (i = pert->ilo; i <= pert->ihi; i++) - for (j = MAX(pert->jlo,i); j <= pert->jhi; j++) - if (!pair->check_ijtype(i,j,pert->pstyle)) - error->all(FLERR,"compute fep type pair range is not valid for " - "pair hybrid sub-style"); - } - - } else if (pert->which == ATOM) { - if (pert->aparam == CHARGE) { - if (!atom->q_flag) - error->all(FLERR,"compute fep requires atom attribute charge"); - } - } - } - if (tailflag) { if (force->pair->tail_flag == 0) - error->all(FLERR,"Compute fep tail when pair style does not " + error->all(FLERR,"Compute fep/ta tail when pair style does not " "compute tail corrections"); } @@ -245,32 +134,16 @@ void ComputeFEP::init() if (comm->me == 0) { if (screen) { - fprintf(screen, "FEP settings ...\n"); + fprintf(screen, "FEP/TA settings ...\n"); fprintf(screen, " temperature = %f\n", temp_fep); + fprintf(screen, " scale factor = %f\n", scale_factor); fprintf(screen, " tail %s\n", (tailflag ? "yes":"no")); - for (int m = 0; m < npert; m++) { - Perturb *pert = &perturb[m]; - if (pert->which == PAIR) - fprintf(screen, " pair %s %s %d-%d %d-%d\n", pert->pstyle, - pert->pparam, - pert->ilo, pert->ihi, pert->jlo, pert->jhi); - else if (pert->which == ATOM) - fprintf(screen, " atom charge %d-%d\n", pert->ilo, pert->ihi); - } } if (logfile) { - fprintf(logfile, "FEP settings ...\n"); + fprintf(logfile, "FEP/TA settings ...\n"); fprintf(logfile, " temperature = %f\n", temp_fep); + fprintf(screen, " scale factor = %f\n", scale_factor); fprintf(logfile, " tail %s\n", (tailflag ? "yes":"no")); - for (int m = 0; m < npert; m++) { - Perturb *pert = &perturb[m]; - if (pert->which == PAIR) - fprintf(logfile, " pair %s %s %d-%d %d-%d\n", pert->pstyle, - pert->pparam, - pert->ilo, pert->ihi, pert->jlo, pert->jhi); - else if (pert->which == ATOM) - fprintf(logfile, " atom charge %d-%d\n", pert->ilo, pert->ihi); - } } } @@ -279,7 +152,7 @@ void ComputeFEP::init() /* ---------------------------------------------------------------------- */ -void ComputeFEP::compute_vector() +void ComputeFEPTA::compute_vector() { double pe0,pe1; @@ -293,15 +166,15 @@ void ComputeFEP::compute_vector() allocate_storage(); } - backup_qfev(); // backup charge, force, energy, virial array values - backup_params(); // backup pair parameters + backup_xfev(); // backup position, force, energy, virial array values + backup_box(); // backup box size timer->stamp(); if (force->pair && force->pair->compute_flag) { force->pair->compute(eflag,vflag); timer->stamp(Timer::PAIR); } - if (chgflag && force->kspace && force->kspace->compute_flag) { + if (force->kspace && force->kspace->compute_flag) { force->kspace->compute(eflag,vflag); timer->stamp(Timer::KSPACE); } @@ -311,14 +184,14 @@ void ComputeFEP::compute_vector() pe0 = compute_epair(); - perturb_params(); + change_box(); timer->stamp(); if (force->pair && force->pair->compute_flag) { force->pair->compute(eflag,vflag); timer->stamp(Timer::PAIR); } - if (chgflag && force->kspace && force->kspace->compute_flag) { + if (force->kspace && force->kspace->compute_flag) { force->kspace->compute(eflag,vflag); timer->stamp(Timer::KSPACE); } @@ -330,14 +203,11 @@ void ComputeFEP::compute_vector() pe1 = compute_epair(); - restore_qfev(); // restore charge, force, energy, virial array values - restore_params(); // restore pair parameters + restore_xfev(); // restore position, force, energy, virial array values + restore_box(); // restore box size vector[0] = pe1-pe0; vector[1] = exp(-(pe1-pe0)/(force->boltz*temp_fep)); - vector[2] = domain->xprd * domain->yprd * domain->zprd; - if (volumeflag) - vector[1] *= vector[2]; } @@ -345,7 +215,7 @@ void ComputeFEP::compute_vector() obtain pair energy from lammps accumulators ------------------------------------------------------------------------- */ -double ComputeFEP::compute_epair() +double ComputeFEPTA::compute_epair() { double eng, eng_pair; @@ -359,145 +229,130 @@ double ComputeFEP::compute_epair() eng_pair += force->pair->etail / volume; } - if (chgflag && force->kspace) eng_pair += force->kspace->energy; + if (force->kspace) eng_pair += force->kspace->energy; return eng_pair; } /* ---------------------------------------------------------------------- - apply perturbation to pair, atom parameters based on variable evaluation + apply changes to box ------------------------------------------------------------------------- */ -void ComputeFEP::perturb_params() +void ComputeFEPTA::change_box() { - int i,j; + // insure atoms are in current box + domain->pbc(); - for (int m = 0; m < npert; m++) { - Perturb *pert = &perturb[m]; + int i; + double **x = atom->x; + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) + domain->x2lamda(x[i],x[i]); - double delta = input->variable->compute_equal(pert->ivar); + domain->boxhi[tan_axis1] *= sqrt(scale_factor); + domain->boxlo[tan_axis1] *= sqrt(scale_factor); + domain->boxhi[tan_axis2] *= sqrt(scale_factor); + domain->boxlo[tan_axis2] *= sqrt(scale_factor); + domain->boxhi[norm_axis] /= scale_factor; + domain->boxlo[norm_axis] /= scale_factor; + + domain->set_global_box(); + domain->set_local_box(); - if (pert->which == PAIR) { // modify pair parameters - for (i = pert->ilo; i <= pert->ihi; i++) - for (j = MAX(pert->jlo,i); j <= pert->jhi; j++) - pert->array[i][j] = pert->array_orig[i][j] + delta; + // remap atom position + for (i = 0; i < nlocal; i++) + domain->lamda2x(x[i],x[i]); - } else if (pert->which == ATOM) { + comm->setup(); + neighbor->setup_bins(); + if (modify->n_pre_neighbor) modify->setup_pre_neighbor(); + neighbor->build(1); + if (modify->n_post_neighbor) modify->setup_post_neighbor(); - if (pert->aparam == CHARGE) { // modify charges - int *atype = atom->type; - double *q = atom->q; - int *mask = atom->mask; - int natom = atom->nlocal + atom->nghost; - - for (i = 0; i < natom; i++) - if (atype[i] >= pert->ilo && atype[i] <= pert->ihi) - if (mask[i] & groupbit) - q[i] += delta; - - } - } - } - - // re-initialize pair styles if any PAIR settings were changed - // this resets other coeffs that may depend on changed values, - // and also offset and tail corrections - - if (pairflag) force->pair->reinit(); - - // reset KSpace charges if charges have changed - - if (chgflag && force->kspace) force->kspace->qsum_qsq(); + if (force->kspace) force->kspace->setup(); } /* ---------------------------------------------------------------------- - backup pair parameters + backup box size ------------------------------------------------------------------------- */ -void ComputeFEP::backup_params() +void ComputeFEPTA::backup_box() { - int i,j; - - for (int m = 0; m < npert; m++) { - Perturb *pert = &perturb[m]; - if (pert->which == PAIR) { - for (i = pert->ilo; i <= pert->ihi; i++) - for (j = MAX(pert->jlo,i); j <= pert->jhi; j++) - pert->array_orig[i][j] = pert->array[i][j]; - } + for (int i=0; i < domain->dimension; i++) { + boxhi_orig[i] = domain->boxhi[i]; + boxlo_orig[i] = domain->boxlo[i]; } + + area_orig = domain->prd[tan_axis1]*domain->prd[tan_axis2]; } /* ---------------------------------------------------------------------- - restore pair parameters to original values + restore box size to original values ------------------------------------------------------------------------- */ -void ComputeFEP::restore_params() +void ComputeFEPTA::restore_box() { - int i,j; - - for (int m = 0; m < npert; m++) { - Perturb *pert = &perturb[m]; - if (pert->which == PAIR) { - for (i = pert->ilo; i <= pert->ihi; i++) - for (j = MAX(pert->jlo,i); j <= pert->jhi; j++) - pert->array[i][j] = pert->array_orig[i][j]; - } + for (int i=0; i < domain->dimension; i++) { + domain->boxhi[i] = boxhi_orig[i]; + domain->boxlo[i] = boxlo_orig[i]; } + + domain->set_global_box(); + domain->set_local_box(); - if (pairflag) force->pair->reinit(); + comm->setup(); + neighbor->setup_bins(); + if (modify->n_pre_neighbor) modify->setup_pre_neighbor(); + neighbor->build(1); + if (modify->n_post_neighbor) modify->setup_post_neighbor(); - // reset KSpace charges if charges have changed - - if (chgflag && force->kspace) force->kspace->qsum_qsq(); + if (force->kspace) force->kspace->setup(); } /* ---------------------------------------------------------------------- - manage storage for charge, force, energy, virial arrays + manage storage for position, force, energy, virial arrays ------------------------------------------------------------------------- */ -void ComputeFEP::allocate_storage() +void ComputeFEPTA::allocate_storage() { nmax = atom->nmax; + memory->create(x_orig,nmax,3,"fep:x_orig"); memory->create(f_orig,nmax,3,"fep:f_orig"); memory->create(peatom_orig,nmax,"fep:peatom_orig"); memory->create(pvatom_orig,nmax,6,"fep:pvatom_orig"); - if (chgflag) { - memory->create(q_orig,nmax,"fep:q_orig"); - if (force->kspace) { - memory->create(keatom_orig,nmax,"fep:keatom_orig"); - memory->create(kvatom_orig,nmax,6,"fep:kvatom_orig"); - } + if (force->kspace) { + memory->create(keatom_orig,nmax,"fep:keatom_orig"); + memory->create(kvatom_orig,nmax,6,"fep:kvatom_orig"); } } /* ---------------------------------------------------------------------- */ -void ComputeFEP::deallocate_storage() +void ComputeFEPTA::deallocate_storage() { + memory->destroy(x_orig); memory->destroy(f_orig); memory->destroy(peatom_orig); memory->destroy(pvatom_orig); - memory->destroy(q_orig); memory->destroy(keatom_orig); memory->destroy(kvatom_orig); + x_orig = nullptr; f_orig = nullptr; - q_orig = nullptr; peatom_orig = keatom_orig = nullptr; pvatom_orig = kvatom_orig = nullptr; } /* ---------------------------------------------------------------------- - backup and restore arrays with charge, force, energy, virial + backup and restore arrays with position, force, energy, virial ------------------------------------------------------------------------- */ -void ComputeFEP::backup_qfev() +void ComputeFEPTA::backup_xfev() { int i; @@ -506,6 +361,13 @@ void ComputeFEP::backup_qfev() if (force->newton || force->kspace->tip4pflag) natom += atom->nghost; + double **x = atom->x; + for (i = 0; i < natom; i++) { + x_orig[i][0] = x[i][0]; + x_orig[i][1] = x[i][1]; + x_orig[i][2] = x[i][2]; + } + double **f = atom->f; for (i = 0; i < natom; i++) { f_orig[i][0] = f[i][0]; @@ -540,35 +402,29 @@ void ComputeFEP::backup_qfev() } } - if (chgflag) { - double *q = atom->q; - for (i = 0; i < nall; i++) - q_orig[i] = q[i]; + if (force->kspace) { + energy_orig = force->kspace->energy; + kvirial_orig[0] = force->kspace->virial[0]; + kvirial_orig[1] = force->kspace->virial[1]; + kvirial_orig[2] = force->kspace->virial[2]; + kvirial_orig[3] = force->kspace->virial[3]; + kvirial_orig[4] = force->kspace->virial[4]; + kvirial_orig[5] = force->kspace->virial[5]; - if (force->kspace) { - energy_orig = force->kspace->energy; - kvirial_orig[0] = force->kspace->virial[0]; - kvirial_orig[1] = force->kspace->virial[1]; - kvirial_orig[2] = force->kspace->virial[2]; - kvirial_orig[3] = force->kspace->virial[3]; - kvirial_orig[4] = force->kspace->virial[4]; - kvirial_orig[5] = force->kspace->virial[5]; - - if (update->eflag_atom) { - double *keatom = force->kspace->eatom; - for (i = 0; i < natom; i++) - keatom_orig[i] = keatom[i]; - } - if (update->vflag_atom) { - double **kvatom = force->kspace->vatom; - for (i = 0; i < natom; i++) { - kvatom_orig[i][0] = kvatom[i][0]; - kvatom_orig[i][1] = kvatom[i][1]; - kvatom_orig[i][2] = kvatom[i][2]; - kvatom_orig[i][3] = kvatom[i][3]; - kvatom_orig[i][4] = kvatom[i][4]; - kvatom_orig[i][5] = kvatom[i][5]; - } + if (update->eflag_atom) { + double *keatom = force->kspace->eatom; + for (i = 0; i < natom; i++) + keatom_orig[i] = keatom[i]; + } + if (update->vflag_atom) { + double **kvatom = force->kspace->vatom; + for (i = 0; i < natom; i++) { + kvatom_orig[i][0] = kvatom[i][0]; + kvatom_orig[i][1] = kvatom[i][1]; + kvatom_orig[i][2] = kvatom[i][2]; + kvatom_orig[i][3] = kvatom[i][3]; + kvatom_orig[i][4] = kvatom[i][4]; + kvatom_orig[i][5] = kvatom[i][5]; } } } @@ -576,7 +432,7 @@ void ComputeFEP::backup_qfev() /* ---------------------------------------------------------------------- */ -void ComputeFEP::restore_qfev() +void ComputeFEPTA::restore_xfev() { int i; @@ -585,6 +441,13 @@ void ComputeFEP::restore_qfev() if (force->newton || force->kspace->tip4pflag) natom += atom->nghost; + double **x = atom->x; + for (i = 0; i < natom; i++) { + x[i][0] = x_orig[i][0]; + x[i][1] = x_orig[i][1]; + x[i][2] = x_orig[i][2]; + } + double **f = atom->f; for (i = 0; i < natom; i++) { f[i][0] = f_orig[i][0]; @@ -619,35 +482,29 @@ void ComputeFEP::restore_qfev() } } - if (chgflag) { - double *q = atom->q; - for (i = 0; i < nall; i++) - q[i] = q_orig[i]; + if (force->kspace) { + force->kspace->energy = energy_orig; + force->kspace->virial[0] = kvirial_orig[0]; + force->kspace->virial[1] = kvirial_orig[1]; + force->kspace->virial[2] = kvirial_orig[2]; + force->kspace->virial[3] = kvirial_orig[3]; + force->kspace->virial[4] = kvirial_orig[4]; + force->kspace->virial[5] = kvirial_orig[5]; - if (force->kspace) { - force->kspace->energy = energy_orig; - force->kspace->virial[0] = kvirial_orig[0]; - force->kspace->virial[1] = kvirial_orig[1]; - force->kspace->virial[2] = kvirial_orig[2]; - force->kspace->virial[3] = kvirial_orig[3]; - force->kspace->virial[4] = kvirial_orig[4]; - force->kspace->virial[5] = kvirial_orig[5]; - - if (update->eflag_atom) { - double *keatom = force->kspace->eatom; - for (i = 0; i < natom; i++) - keatom[i] = keatom_orig[i]; - } - if (update->vflag_atom) { - double **kvatom = force->kspace->vatom; - for (i = 0; i < natom; i++) { - kvatom[i][0] = kvatom_orig[i][0]; - kvatom[i][1] = kvatom_orig[i][1]; - kvatom[i][2] = kvatom_orig[i][2]; - kvatom[i][3] = kvatom_orig[i][3]; - kvatom[i][4] = kvatom_orig[i][4]; - kvatom[i][5] = kvatom_orig[i][5]; - } + if (update->eflag_atom) { + double *keatom = force->kspace->eatom; + for (i = 0; i < natom; i++) + keatom[i] = keatom_orig[i]; + } + if (update->vflag_atom) { + double **kvatom = force->kspace->vatom; + for (i = 0; i < natom; i++) { + kvatom[i][0] = kvatom_orig[i][0]; + kvatom[i][1] = kvatom_orig[i][1]; + kvatom[i][2] = kvatom_orig[i][2]; + kvatom[i][3] = kvatom_orig[i][3]; + kvatom[i][4] = kvatom_orig[i][4]; + kvatom[i][5] = kvatom_orig[i][5]; } } } diff --git a/src/FEP/compute_fep_ta.h b/src/FEP/compute_fep_ta.h index 8f576124e0..04bcf23bb3 100644 --- a/src/FEP/compute_fep_ta.h +++ b/src/FEP/compute_fep_ta.h @@ -12,40 +12,43 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Agilio Padua (ENS de Lyon & CNRS) + Contributing author: Shifeng Ke (Zhejiang University) ------------------------------------------------------------------------- */ #ifdef COMPUTE_CLASS // clang-format off -ComputeStyle(fep,ComputeFEP); +ComputeStyle(fep/ta,ComputeFEPTA); // clang-format on #else -#ifndef COMPUTE_FEP_H -#define COMPUTE_FEP_H +#ifndef COMPUTE_FEP_TA_H +#define COMPUTE_FEP_TA_H #include "compute.h" namespace LAMMPS_NS { -class ComputeFEP : public Compute { +class ComputeFEPTA : public Compute { public: - ComputeFEP(class LAMMPS *, int, char **); - ~ComputeFEP() override; + ComputeFEPTA(class LAMMPS *, int, char **); // compute ID groupID fep/ta temp xy/xz/yz scale_factor + ~ComputeFEPTA() override; void init() override; void compute_vector() override; private: - int npert; int pairflag; - int chgflag; - int tailflag, volumeflag; + int tailflag; int fepinitflag; int eflag, vflag; double temp_fep; + double scale_factor; + int tan_axis1, tan_axis2, norm_axis; + + double boxlo_orig[3], boxhi_orig[3]; + double area_orig; int nmax; - double *q_orig; + double **x_orig; double **f_orig; double eng_vdwl_orig, eng_coul_orig; double pvirial_orig[6]; @@ -56,26 +59,14 @@ class ComputeFEP : public Compute { class Fix *fixgpu; - struct Perturb { - int which, ivar; - char *var; - char *pstyle, *pparam; - int ilo, ihi, jlo, jhi; - int pdim; - double **array, **array_orig; - int aparam; - }; - - Perturb *perturb; - double compute_epair(); - void perturb_params(); - void backup_params(); - void restore_params(); + void change_box(); + void backup_box(); + void restore_box(); void allocate_storage(); void deallocate_storage(); - void backup_qfev(); - void restore_qfev(); + void backup_xfev(); + void restore_xfev(); }; } // namespace LAMMPS_NS @@ -91,18 +82,6 @@ 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: Variable name for compute fep does not exist - -Self-explanatory. - -E: Variable for compute fep is invalid style - -Self-explanatory. - -E: Compute fep pair style does not exist - -Self-explanatory. - E: Energy was not tallied on needed timestep You are using a thermo keyword that requires potentials to From 2e8470022404a42549f72588efbb622d2aeee026 Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Sat, 26 Mar 2022 13:55:22 +0800 Subject: [PATCH 07/57] delete unused variable "pairflag" --- src/FEP/compute_fep_ta.cpp | 2 -- src/FEP/compute_fep_ta.h | 1 - 2 files changed, 3 deletions(-) diff --git a/src/FEP/compute_fep_ta.cpp b/src/FEP/compute_fep_ta.cpp index cc301a0ac5..7183d48378 100644 --- a/src/FEP/compute_fep_ta.cpp +++ b/src/FEP/compute_fep_ta.cpp @@ -119,8 +119,6 @@ void ComputeFEPTA::init() // setup and error checks - pairflag = 0; - if (tailflag) { if (force->pair->tail_flag == 0) error->all(FLERR,"Compute fep/ta tail when pair style does not " diff --git a/src/FEP/compute_fep_ta.h b/src/FEP/compute_fep_ta.h index 04bcf23bb3..a1eeb28347 100644 --- a/src/FEP/compute_fep_ta.h +++ b/src/FEP/compute_fep_ta.h @@ -36,7 +36,6 @@ class ComputeFEPTA : public Compute { void compute_vector() override; private: - int pairflag; int tailflag; int fepinitflag; int eflag, vflag; From 7c333b8e07178cbaa3b85dc87da481067232e64d Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Sun, 27 Mar 2022 20:22:16 +0800 Subject: [PATCH 08/57] include bonded eng, cancel neigh build & fix bugs --- src/FEP/compute_fep_ta.cpp | 67 +++++++++++++++++++++----------------- src/FEP/compute_fep_ta.h | 1 + 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/FEP/compute_fep_ta.cpp b/src/FEP/compute_fep_ta.cpp index 7183d48378..55209f696a 100644 --- a/src/FEP/compute_fep_ta.cpp +++ b/src/FEP/compute_fep_ta.cpp @@ -18,12 +18,16 @@ #include "compute_fep_ta.h" +#include "angle.h" #include "atom.h" +#include "bond.h" #include "comm.h" +#include "dihedral.h" #include "domain.h" #include "error.h" #include "fix.h" #include "force.h" +#include "improper.h" #include "kspace.h" #include "memory.h" #include "modify.h" @@ -140,7 +144,7 @@ void ComputeFEPTA::init() if (logfile) { fprintf(logfile, "FEP/TA settings ...\n"); fprintf(logfile, " temperature = %f\n", temp_fep); - fprintf(screen, " scale factor = %f\n", scale_factor); + fprintf(logfile, " scale factor = %f\n", scale_factor); fprintf(logfile, " tail %s\n", (tailflag ? "yes":"no")); } } @@ -167,28 +171,25 @@ void ComputeFEPTA::compute_vector() backup_xfev(); // backup position, force, energy, virial array values backup_box(); // backup box size - timer->stamp(); - if (force->pair && force->pair->compute_flag) { - force->pair->compute(eflag,vflag); - timer->stamp(Timer::PAIR); - } - if (force->kspace && force->kspace->compute_flag) { - force->kspace->compute(eflag,vflag); - timer->stamp(Timer::KSPACE); - } - - // accumulate force/energy/virial from /gpu pair styles - if (fixgpu) fixgpu->post_force(vflag); - pe0 = compute_epair(); change_box(); + comm->forward_comm(); timer->stamp(); if (force->pair && force->pair->compute_flag) { force->pair->compute(eflag,vflag); timer->stamp(Timer::PAIR); } + + if (atom->molecular != Atom::ATOMIC) { + if (force->bond) force->bond->compute(eflag,vflag); + if (force->angle) force->angle->compute(eflag,vflag); + if (force->dihedral) force->dihedral->compute(eflag,vflag); + if (force->improper) force->improper->compute(eflag,vflag); + timer->stamp(Timer::BOND); + } + if (force->kspace && force->kspace->compute_flag) { force->kspace->compute(eflag,vflag); timer->stamp(Timer::KSPACE); @@ -203,6 +204,7 @@ void ComputeFEPTA::compute_vector() restore_xfev(); // restore position, force, energy, virial array values restore_box(); // restore box size + comm->forward_comm(); vector[0] = pe1-pe0; vector[1] = exp(-(pe1-pe0)/(force->boltz*temp_fep)); @@ -220,6 +222,14 @@ double ComputeFEPTA::compute_epair() eng = 0.0; if (force->pair) eng = force->pair->eng_vdwl + force->pair->eng_coul; + + if (atom->molecular != Atom::ATOMIC) { + if (force->bond) eng += force->bond->energy; + if (force->angle) eng += force->angle->energy; + if (force->dihedral) eng += force->dihedral->energy; + if (force->improper) eng += force->improper->energy; + } + MPI_Allreduce(&eng,&eng_pair,1,MPI_DOUBLE,MPI_SUM,world); if (tailflag) { @@ -239,9 +249,6 @@ double ComputeFEPTA::compute_epair() void ComputeFEPTA::change_box() { - // insure atoms are in current box - domain->pbc(); - int i; double **x = atom->x; int nlocal = atom->nlocal; @@ -262,12 +269,6 @@ void ComputeFEPTA::change_box() for (i = 0; i < nlocal; i++) domain->lamda2x(x[i],x[i]); - comm->setup(); - neighbor->setup_bins(); - if (modify->n_pre_neighbor) modify->setup_pre_neighbor(); - neighbor->build(1); - if (modify->n_post_neighbor) modify->setup_post_neighbor(); - if (force->kspace) force->kspace->setup(); } @@ -301,12 +302,6 @@ void ComputeFEPTA::restore_box() domain->set_global_box(); domain->set_local_box(); - comm->setup(); - neighbor->setup_bins(); - if (modify->n_pre_neighbor) modify->setup_pre_neighbor(); - neighbor->build(1); - if (modify->n_post_neighbor) modify->setup_post_neighbor(); - if (force->kspace) force->kspace->setup(); } @@ -376,6 +371,13 @@ void ComputeFEPTA::backup_xfev() eng_vdwl_orig = force->pair->eng_vdwl; eng_coul_orig = force->pair->eng_coul; + if (atom->molecular != Atom::ATOMIC) { + if (force->bond) eng_bond_orig = force->bond->energy; + if (force->angle) eng_angle_orig = force->angle->energy; + if (force->dihedral) eng_dihedral_orig = force->dihedral->energy; + if (force->improper) eng_improper_orig = force->improper->energy; + } + pvirial_orig[0] = force->pair->virial[0]; pvirial_orig[1] = force->pair->virial[1]; pvirial_orig[2] = force->pair->virial[2]; @@ -456,6 +458,13 @@ void ComputeFEPTA::restore_xfev() force->pair->eng_vdwl = eng_vdwl_orig; force->pair->eng_coul = eng_coul_orig; + if (atom->molecular != Atom::ATOMIC) { + if (force->bond) force->bond->energy = eng_bond_orig; + if (force->angle) force->angle->energy = eng_angle_orig; + if (force->dihedral) force->dihedral->energy = eng_dihedral_orig; + if (force->improper) force->improper->energy = eng_improper_orig; + } + force->pair->virial[0] = pvirial_orig[0]; force->pair->virial[1] = pvirial_orig[1]; force->pair->virial[2] = pvirial_orig[2]; diff --git a/src/FEP/compute_fep_ta.h b/src/FEP/compute_fep_ta.h index a1eeb28347..67b09f5a2b 100644 --- a/src/FEP/compute_fep_ta.h +++ b/src/FEP/compute_fep_ta.h @@ -50,6 +50,7 @@ class ComputeFEPTA : public Compute { double **x_orig; double **f_orig; double eng_vdwl_orig, eng_coul_orig; + double eng_bond_orig, eng_angle_orig, eng_dihedral_orig, eng_improper_orig; double pvirial_orig[6]; double *peatom_orig, **pvatom_orig; double energy_orig; From 603136a93b0dd27e07253c4ce0a922d84755d263 Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Sun, 27 Mar 2022 20:52:00 +0800 Subject: [PATCH 09/57] rename some function & variable, output delta area --- src/FEP/compute_fep_ta.cpp | 23 ++++++++++++----------- src/FEP/compute_fep_ta.h | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/FEP/compute_fep_ta.cpp b/src/FEP/compute_fep_ta.cpp index 55209f696a..592d752190 100644 --- a/src/FEP/compute_fep_ta.cpp +++ b/src/FEP/compute_fep_ta.cpp @@ -52,7 +52,7 @@ ComputeFEPTA::ComputeFEPTA(LAMMPS *lmp, int narg, char **arg) : scalar_flag = 0; vector_flag = 1; - size_vector = 2; + size_vector = 3; extvector = 0; vector = new double[size_vector]; @@ -90,7 +90,7 @@ ComputeFEPTA::ComputeFEPTA(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal optional keyword in compute fep/ta"); } - // allocate space for position, charge, force, energy, virial arrays + // allocate space for position, force, energy, virial arrays x_orig = nullptr; f_orig = nullptr; @@ -171,7 +171,7 @@ void ComputeFEPTA::compute_vector() backup_xfev(); // backup position, force, energy, virial array values backup_box(); // backup box size - pe0 = compute_epair(); + pe0 = compute_pe(); change_box(); comm->forward_comm(); @@ -200,7 +200,7 @@ void ComputeFEPTA::compute_vector() // otherwise the force compute on the GPU in the next step would be incorrect if (fixgpu) fixgpu->post_force(vflag); - pe1 = compute_epair(); + pe1 = compute_pe(); restore_xfev(); // restore position, force, energy, virial array values restore_box(); // restore box size @@ -208,16 +208,17 @@ void ComputeFEPTA::compute_vector() vector[0] = pe1-pe0; vector[1] = exp(-(pe1-pe0)/(force->boltz*temp_fep)); + vector[2] = area_orig*(scale_factor-1.0); } /* ---------------------------------------------------------------------- - obtain pair energy from lammps accumulators + obtain potential energy from lammps accumulators ------------------------------------------------------------------------- */ -double ComputeFEPTA::compute_epair() +double ComputeFEPTA::compute_pe() { - double eng, eng_pair; + double eng, eng_potential; eng = 0.0; if (force->pair) @@ -230,16 +231,16 @@ double ComputeFEPTA::compute_epair() if (force->improper) eng += force->improper->energy; } - MPI_Allreduce(&eng,&eng_pair,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&eng,&eng_potential,1,MPI_DOUBLE,MPI_SUM,world); if (tailflag) { double volume = domain->xprd * domain->yprd * domain->zprd; - eng_pair += force->pair->etail / volume; + eng_potential += force->pair->etail / volume; } - if (force->kspace) eng_pair += force->kspace->energy; + if (force->kspace) eng_potential += force->kspace->energy; - return eng_pair; + return eng_potential; } diff --git a/src/FEP/compute_fep_ta.h b/src/FEP/compute_fep_ta.h index 67b09f5a2b..76f9f5e526 100644 --- a/src/FEP/compute_fep_ta.h +++ b/src/FEP/compute_fep_ta.h @@ -59,7 +59,7 @@ class ComputeFEPTA : public Compute { class Fix *fixgpu; - double compute_epair(); + double compute_pe(); void change_box(); void backup_box(); void restore_box(); From cf17fd2306b2404cc0e4daefb20d7ac9e5b91482 Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Sun, 27 Mar 2022 21:49:51 +0800 Subject: [PATCH 10/57] remap ghost atoms, no need to forward_comm() --- src/FEP/compute_fep_ta.cpp | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/FEP/compute_fep_ta.cpp b/src/FEP/compute_fep_ta.cpp index 592d752190..71856abcdc 100644 --- a/src/FEP/compute_fep_ta.cpp +++ b/src/FEP/compute_fep_ta.cpp @@ -174,7 +174,6 @@ void ComputeFEPTA::compute_vector() pe0 = compute_pe(); change_box(); - comm->forward_comm(); timer->stamp(); if (force->pair && force->pair->compute_flag) { @@ -204,7 +203,6 @@ void ComputeFEPTA::compute_vector() restore_xfev(); // restore position, force, energy, virial array values restore_box(); // restore box size - comm->forward_comm(); vector[0] = pe1-pe0; vector[1] = exp(-(pe1-pe0)/(force->boltz*temp_fep)); @@ -252,8 +250,9 @@ void ComputeFEPTA::change_box() { int i; double **x = atom->x; - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) + int natom = atom->nlocal + atom->nghost; + + for (i = 0; i < natom; i++) domain->x2lamda(x[i],x[i]); domain->boxhi[tan_axis1] *= sqrt(scale_factor); @@ -267,7 +266,7 @@ void ComputeFEPTA::change_box() domain->set_local_box(); // remap atom position - for (i = 0; i < nlocal; i++) + for (i = 0; i < natom; i++) domain->lamda2x(x[i],x[i]); if (force->kspace) force->kspace->setup(); @@ -350,10 +349,7 @@ void ComputeFEPTA::backup_xfev() { int i; - int nall = atom->nlocal + atom->nghost; - int natom = atom->nlocal; - if (force->newton || force->kspace->tip4pflag) - natom += atom->nghost; + int natom = atom->nlocal + atom->nghost; double **x = atom->x; for (i = 0; i < natom; i++) { @@ -437,10 +433,7 @@ void ComputeFEPTA::restore_xfev() { int i; - int nall = atom->nlocal + atom->nghost; - int natom = atom->nlocal; - if (force->newton || force->kspace->tip4pflag) - natom += atom->nghost; + int natom = atom->nlocal + atom->nghost; double **x = atom->x; for (i = 0; i < natom; i++) { From 13228ca29a0ffabebdda4b58ba7773320fa9b7b9 Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Mon, 28 Mar 2022 13:34:36 +0800 Subject: [PATCH 11/57] add dimension check --- src/FEP/compute_fep_ta.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/FEP/compute_fep_ta.cpp b/src/FEP/compute_fep_ta.cpp index 71856abcdc..0045119f85 100644 --- a/src/FEP/compute_fep_ta.cpp +++ b/src/FEP/compute_fep_ta.cpp @@ -123,6 +123,10 @@ void ComputeFEPTA::init() // setup and error checks + if (domain->dimension == 2) { + error->all(FLERR,"Cannot compute fep/ta in 2d simulation"); + } + if (tailflag) { if (force->pair->tail_flag == 0) error->all(FLERR,"Compute fep/ta tail when pair style does not " From ebf2b1e7064864942f889ed3ec658a73267218aa Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Mon, 28 Mar 2022 20:01:59 +0800 Subject: [PATCH 12/57] add doc for compute fep/ta --- doc/src/compute_fep_ta.rst | 93 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 doc/src/compute_fep_ta.rst diff --git a/doc/src/compute_fep_ta.rst b/doc/src/compute_fep_ta.rst new file mode 100644 index 0000000000..55f8fcfe09 --- /dev/null +++ b/doc/src/compute_fep_ta.rst @@ -0,0 +1,93 @@ +.. index:: compute fep/ta + +compute fep/ta command +====================== + +Syntax +"""""" + +.. parsed-literal:: + + compute ID group-ID fep/ta temp plane scale_factor keyword value ... + +* ID, group-ID are documented in the :doc:`compute ` command +* fep/ta = name of this compute command +* temp = external temperature (as specified for constant-temperature run) +* plane = *xy* or *xz* or *yz* +* scale_factor = multiplicative factor for change in plane area +* zero or more keyword/value pairs may be appended +* keyword = *tail* + + .. parsed-literal:: + + *tail* value = *no* or *yes* + *no* = ignore tail correction to pair energies (usually small in fep) + *yes* = include tail correction to pair energies + +Examples +"""""""" + +.. code-block:: LAMMPS + + compute 1 all fep/ta 298 xy 1.0005 + +Description +""""""""""" +Define a computation that calculates the change in the free energy due +to a test-area (TA) perturbation :ref:`(Gloor) `. The test-area +approach can be used to determine the interfacial tension of the system +in a single simulation: + +.. math:: + + \gamma = \lim_{\Delta \mathcal{A} \to 0} \left( \frac{\Delta A_{0 \to 1 }}{\Delta \mathcal{A}}\right)_{N,V,T} + = - \frac{kT}{\Delta \mathcal{A}} \ln \left< \exp(-(U_1 - U_0)/kT) \right>_0 + +During the perturbation, both axes of *plane* are scaled by multiplying :math:`\sqrt{scale\_factor}`, +while the other axis divided by *scale_factor* such that the overall +volume of the system is maintained. + +The *tail* keyword controls the calculation of the tail correction to +"van der Waals" pair energies beyond the cutoff, if this has been +activated via the :doc:`pair_modify ` command. If the +perturbation is small, the tail contribution to the energy difference +between the reference and perturbed systems should be negligible. + +---------- + +Output info +""""""""""" + +This compute calculates a global vector of length 3 which contains the +energy difference ( :math:`U_1-U_0` ) as c_ID[1], the +Boltzmann factor :math:`\exp(-(U_1-U_0)/kT)`, as c_ID[2] and the +change in the *plane* area :math:`\Delta \mathcal{A}` as c_ID[3]. :math:`U_1` is the +potential energy of the perturbed state and +:math:`U_0` is the potential energy of the reference state. +The energies include kspace terms if these are used in the simulation. + +These output results can be used by any command that uses a global +scalar or vector from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output +options. For example, the computed values can be averaged using :doc:`fix ave/time `. + +Restrictions +"""""""""""" + +This compute is distributed as the FEP package. It is only +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. + +Related commands +"""""""""""""""" + +:doc:`compute fep ` + +Default +""""""" + +The option defaults are *tail* = *no*\ . + +---------- + +.. _Gloor: + +**(Gloor)** Gloor, J Chem Phys, 123, 134703 (2005) From af4afb7e0332e6b084e456b0b0b16cd8181eb862 Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Mon, 28 Mar 2022 21:14:13 +0800 Subject: [PATCH 13/57] modify error/warning message --- src/FEP/compute_fep_ta.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/FEP/compute_fep_ta.h b/src/FEP/compute_fep_ta.h index 76f9f5e526..b95266eb1a 100644 --- a/src/FEP/compute_fep_ta.h +++ b/src/FEP/compute_fep_ta.h @@ -82,10 +82,8 @@ 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: Energy was not tallied on needed timestep +E: Cannot compute fep/ta in 2d simulation -You are using a thermo keyword that requires potentials to -have tallied energy, but they didn't on this timestep. See the -variable doc page for ideas on how to make this work. +Self-explanatory. */ From a60e1546b26981a98701f08f2f1ef379f9cb04ff Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 28 Mar 2022 16:47:57 -0400 Subject: [PATCH 14/57] properly integrate into build system and docs --- doc/src/Commands_compute.rst | 1 + doc/src/compute.rst | 3 ++- doc/src/compute_fep_ta.rst | 30 ++++++++++++--------- doc/utils/sphinx-config/false_positives.txt | 2 ++ src/.gitignore | 2 ++ src/FEP/Install.sh | 2 ++ 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/doc/src/Commands_compute.rst b/doc/src/Commands_compute.rst index 6ad5ed4435..6309fe83e2 100644 --- a/doc/src/Commands_compute.rst +++ b/doc/src/Commands_compute.rst @@ -63,6 +63,7 @@ KOKKOS, o = OPENMP, t = OPT. * :doc:`event/displace ` * :doc:`fabric ` * :doc:`fep ` + * :doc:`fep/ta ` * :doc:`force/tally ` * :doc:`fragment/atom ` * :doc:`global/atom ` diff --git a/doc/src/compute.rst b/doc/src/compute.rst index 2768543179..a149a752b0 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -208,7 +208,8 @@ The individual style names on the :doc:`Commands compute ` pag * :doc:`erotate/sphere/atom ` - rotational energy for each spherical particle * :doc:`event/displace ` - detect event on atom displacement * :doc:`fabric ` - calculates fabric tensors from pair interactions -* :doc:`fep ` - +* :doc:`fep ` - compute free energies for alchemical transformation from perturbation theory +* :doc:`fep/ta ` - compute free energies for a test area perturbation * :doc:`force/tally ` - force between two groups of atoms via the tally callback mechanism * :doc:`fragment/atom ` - fragment ID for each atom * :doc:`global/atom ` - diff --git a/doc/src/compute_fep_ta.rst b/doc/src/compute_fep_ta.rst index 55f8fcfe09..ad6b1ede82 100644 --- a/doc/src/compute_fep_ta.rst +++ b/doc/src/compute_fep_ta.rst @@ -33,6 +33,7 @@ Examples Description """"""""""" + Define a computation that calculates the change in the free energy due to a test-area (TA) perturbation :ref:`(Gloor) `. The test-area approach can be used to determine the interfacial tension of the system @@ -43,9 +44,9 @@ in a single simulation: \gamma = \lim_{\Delta \mathcal{A} \to 0} \left( \frac{\Delta A_{0 \to 1 }}{\Delta \mathcal{A}}\right)_{N,V,T} = - \frac{kT}{\Delta \mathcal{A}} \ln \left< \exp(-(U_1 - U_0)/kT) \right>_0 -During the perturbation, both axes of *plane* are scaled by multiplying :math:`\sqrt{scale\_factor}`, -while the other axis divided by *scale_factor* such that the overall -volume of the system is maintained. +During the perturbation, both axes of *plane* are scaled by multiplying +:math:`\sqrt{scale\_factor}`, while the other axis divided by +*scale_factor* such that the overall volume of the system is maintained. The *tail* keyword controls the calculation of the tail correction to "van der Waals" pair energies beyond the cutoff, if this has been @@ -59,22 +60,25 @@ Output info """"""""""" This compute calculates a global vector of length 3 which contains the -energy difference ( :math:`U_1-U_0` ) as c_ID[1], the -Boltzmann factor :math:`\exp(-(U_1-U_0)/kT)`, as c_ID[2] and the -change in the *plane* area :math:`\Delta \mathcal{A}` as c_ID[3]. :math:`U_1` is the -potential energy of the perturbed state and -:math:`U_0` is the potential energy of the reference state. -The energies include kspace terms if these are used in the simulation. +energy difference ( :math:`U_1-U_0` ) as c_ID[1], the Boltzmann factor +:math:`\exp(-(U_1-U_0)/kT)`, as c_ID[2] and the change in the *plane* +area :math:`\Delta \mathcal{A}` as c_ID[3]. :math:`U_1` is the potential +energy of the perturbed state and :math:`U_0` is the potential energy of +the reference state. The energies include kspace terms if these are +used in the simulation. These output results can be used by any command that uses a global -scalar or vector from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output -options. For example, the computed values can be averaged using :doc:`fix ave/time `. +scalar or vector from a compute as input. See the :doc:`Howto output +` page for an overview of LAMMPS output options. For +example, the computed values can be averaged using :doc:`fix ave/time +`. Restrictions """""""""""" -This compute is distributed as the FEP package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +This compute is distributed as the FEP package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 6799e62d24..3947e8a071 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1177,6 +1177,7 @@ Gladky gld gle globbing +Gloor Glosli Glotzer gmail @@ -1425,6 +1426,7 @@ interal interatomic Interatomic interconvert +interfacial interial interlayer intermolecular diff --git a/src/.gitignore b/src/.gitignore index 8803d8a7e3..3305ec9e73 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -460,6 +460,8 @@ /compute_fabric.h /compute_fep.cpp /compute_fep.h +/compute_fep_ta.cpp +/compute_fep_ta.h /compute_force_tally.cpp /compute_force_tally.h /compute_gyration_shape.cpp diff --git a/src/FEP/Install.sh b/src/FEP/Install.sh index c6e7a53aa1..1d7a1c7a48 100755 --- a/src/FEP/Install.sh +++ b/src/FEP/Install.sh @@ -30,6 +30,8 @@ action () { action compute_fep.cpp action compute_fep.h +action compute_fep_ta.cpp +action compute_fep_ta.h action fix_adapt_fep.cpp action fix_adapt_fep.h action pair_coul_cut_soft.cpp From 64077457817969fee9da49d7ab11232d21c81c6f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 28 Mar 2022 16:49:11 -0400 Subject: [PATCH 15/57] update programming style and enable/apply clang-format --- src/FEP/compute_fep_ta.cpp | 158 ++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 91 deletions(-) diff --git a/src/FEP/compute_fep_ta.cpp b/src/FEP/compute_fep_ta.cpp index 0045119f85..24e5b21959 100644 --- a/src/FEP/compute_fep_ta.cpp +++ b/src/FEP/compute_fep_ta.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -36,19 +35,18 @@ #include "timer.h" #include "update.h" -#include #include +#include using namespace LAMMPS_NS; -enum{X,Y,Z}; +enum { X, Y, Z }; /* ---------------------------------------------------------------------- */ -ComputeFEPTA::ComputeFEPTA(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg) +ComputeFEPTA::ComputeFEPTA(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { - if (narg < 6) error->all(FLERR,"Illegal number of arguments in compute fep/ta"); + if (narg < 6) error->all(FLERR, "Illegal number of arguments in compute fep/ta"); scalar_flag = 0; vector_flag = 1; @@ -59,23 +57,24 @@ ComputeFEPTA::ComputeFEPTA(LAMMPS *lmp, int narg, char **arg) : fepinitflag = 0; // avoid init to run entirely when called by write_data - temp_fep = utils::numeric(FLERR,arg[3],false,lmp); + temp_fep = utils::numeric(FLERR, arg[3], false, lmp); - if (strcmp(arg[4],"xy") == 0) { + if (strcmp(arg[4], "xy") == 0) { tan_axis1 = X; tan_axis2 = Y; norm_axis = Z; - } else if (strcmp(arg[4],"xz") == 0) { + } else if (strcmp(arg[4], "xz") == 0) { tan_axis1 = X; tan_axis2 = Z; norm_axis = Y; - } else if (strcmp(arg[4],"yz") == 0) { + } else if (strcmp(arg[4], "yz") == 0) { tan_axis1 = Y; tan_axis2 = Z; norm_axis = X; - } else error->all(FLERR,"Illegal arguments in compute fep/ta"); + } else + error->all(FLERR, "Illegal arguments in compute fep/ta"); - scale_factor = utils::numeric(FLERR,arg[5],false,lmp); + scale_factor = utils::numeric(FLERR, arg[5], false, lmp); // optional keywords @@ -83,11 +82,12 @@ ComputeFEPTA::ComputeFEPTA(LAMMPS *lmp, int narg, char **arg) : int iarg = 6; while (iarg < narg) { - if (strcmp(arg[iarg],"tail") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal optional keyword in compute fep/ta"); - tailflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + if (strcmp(arg[iarg], "tail") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal optional keyword in compute fep/ta"); + tailflag = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else error->all(FLERR,"Illegal optional keyword in compute fep/ta"); + } else + error->all(FLERR, "Illegal optional keyword in compute fep/ta"); } // allocate space for position, force, energy, virial arrays @@ -106,7 +106,7 @@ ComputeFEPTA::ComputeFEPTA(LAMMPS *lmp, int narg, char **arg) : ComputeFEPTA::~ComputeFEPTA() { - delete [] vector; + delete[] vector; deallocate_storage(); } @@ -115,21 +115,21 @@ ComputeFEPTA::~ComputeFEPTA() void ComputeFEPTA::init() { - int i,j; + int i, j; if (!fepinitflag) // avoid init to run entirely when called by write_data - fepinitflag = 1; - else return; + fepinitflag = 1; + else + return; // setup and error checks - if (domain->dimension == 2) { - error->all(FLERR,"Cannot compute fep/ta in 2d simulation"); - } + if (domain->dimension == 2) { error->all(FLERR, "Cannot compute fep/ta in 2d simulation"); } if (tailflag) { if (force->pair->tail_flag == 0) - error->all(FLERR,"Compute fep/ta tail when pair style does not " + error->all(FLERR, + "Compute fep/ta tail when pair style does not " "compute tail corrections"); } @@ -139,41 +139,31 @@ void ComputeFEPTA::init() if (ifixgpu >= 0) fixgpu = modify->fix[ifixgpu]; if (comm->me == 0) { - if (screen) { - fprintf(screen, "FEP/TA settings ...\n"); - fprintf(screen, " temperature = %f\n", temp_fep); - fprintf(screen, " scale factor = %f\n", scale_factor); - fprintf(screen, " tail %s\n", (tailflag ? "yes":"no")); - } - if (logfile) { - fprintf(logfile, "FEP/TA settings ...\n"); - fprintf(logfile, " temperature = %f\n", temp_fep); - fprintf(logfile, " scale factor = %f\n", scale_factor); - fprintf(logfile, " tail %s\n", (tailflag ? "yes":"no")); - } + auto mesg = fmt::format("FEP/TA settings ...\n temperature = {:f}\n", temp_fep); + mesg += fmt::format(" scale factor = {:f}\n", scale_factor); + mesg += fmt::format(" tail {}\n", (tailflag ? "yes" : "no")); + utils::logmesg(lmp, mesg); } - } /* ---------------------------------------------------------------------- */ - void ComputeFEPTA::compute_vector() { - double pe0,pe1; + double pe0, pe1; eflag = 1; vflag = 0; invoked_vector = update->ntimestep; - if (atom->nmax > nmax) { // reallocate working arrays if necessary + if (atom->nmax > nmax) { // reallocate working arrays if necessary deallocate_storage(); allocate_storage(); } - backup_xfev(); // backup position, force, energy, virial array values - backup_box(); // backup box size + backup_xfev(); // backup position, force, energy, virial array values + backup_box(); // backup box size pe0 = compute_pe(); @@ -181,20 +171,20 @@ void ComputeFEPTA::compute_vector() timer->stamp(); if (force->pair && force->pair->compute_flag) { - force->pair->compute(eflag,vflag); + force->pair->compute(eflag, vflag); timer->stamp(Timer::PAIR); } if (atom->molecular != Atom::ATOMIC) { - if (force->bond) force->bond->compute(eflag,vflag); - if (force->angle) force->angle->compute(eflag,vflag); - if (force->dihedral) force->dihedral->compute(eflag,vflag); - if (force->improper) force->improper->compute(eflag,vflag); + if (force->bond) force->bond->compute(eflag, vflag); + if (force->angle) force->angle->compute(eflag, vflag); + if (force->dihedral) force->dihedral->compute(eflag, vflag); + if (force->improper) force->improper->compute(eflag, vflag); timer->stamp(Timer::BOND); } if (force->kspace && force->kspace->compute_flag) { - force->kspace->compute(eflag,vflag); + force->kspace->compute(eflag, vflag); timer->stamp(Timer::KSPACE); } @@ -205,15 +195,14 @@ void ComputeFEPTA::compute_vector() pe1 = compute_pe(); - restore_xfev(); // restore position, force, energy, virial array values - restore_box(); // restore box size + restore_xfev(); // restore position, force, energy, virial array values + restore_box(); // restore box size - vector[0] = pe1-pe0; - vector[1] = exp(-(pe1-pe0)/(force->boltz*temp_fep)); - vector[2] = area_orig*(scale_factor-1.0); + vector[0] = pe1 - pe0; + vector[1] = exp(-(pe1 - pe0) / (force->boltz * temp_fep)); + vector[2] = area_orig * (scale_factor - 1.0); } - /* ---------------------------------------------------------------------- obtain potential energy from lammps accumulators ------------------------------------------------------------------------- */ @@ -223,8 +212,7 @@ double ComputeFEPTA::compute_pe() double eng, eng_potential; eng = 0.0; - if (force->pair) - eng = force->pair->eng_vdwl + force->pair->eng_coul; + if (force->pair) eng = force->pair->eng_vdwl + force->pair->eng_coul; if (atom->molecular != Atom::ATOMIC) { if (force->bond) eng += force->bond->energy; @@ -233,7 +221,7 @@ double ComputeFEPTA::compute_pe() if (force->improper) eng += force->improper->energy; } - MPI_Allreduce(&eng,&eng_potential,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&eng, &eng_potential, 1, MPI_DOUBLE, MPI_SUM, world); if (tailflag) { double volume = domain->xprd * domain->yprd * domain->zprd; @@ -245,7 +233,6 @@ double ComputeFEPTA::compute_pe() return eng_potential; } - /* ---------------------------------------------------------------------- apply changes to box ------------------------------------------------------------------------- */ @@ -256,8 +243,7 @@ void ComputeFEPTA::change_box() double **x = atom->x; int natom = atom->nlocal + atom->nghost; - for (i = 0; i < natom; i++) - domain->x2lamda(x[i],x[i]); + for (i = 0; i < natom; i++) domain->x2lamda(x[i], x[i]); domain->boxhi[tan_axis1] *= sqrt(scale_factor); domain->boxlo[tan_axis1] *= sqrt(scale_factor); @@ -265,51 +251,47 @@ void ComputeFEPTA::change_box() domain->boxlo[tan_axis2] *= sqrt(scale_factor); domain->boxhi[norm_axis] /= scale_factor; domain->boxlo[norm_axis] /= scale_factor; - + domain->set_global_box(); domain->set_local_box(); // remap atom position - for (i = 0; i < natom; i++) - domain->lamda2x(x[i],x[i]); + for (i = 0; i < natom; i++) domain->lamda2x(x[i], x[i]); if (force->kspace) force->kspace->setup(); } - /* ---------------------------------------------------------------------- backup box size ------------------------------------------------------------------------- */ void ComputeFEPTA::backup_box() { - for (int i=0; i < domain->dimension; i++) { + for (int i = 0; i < domain->dimension; i++) { boxhi_orig[i] = domain->boxhi[i]; boxlo_orig[i] = domain->boxlo[i]; } - area_orig = domain->prd[tan_axis1]*domain->prd[tan_axis2]; + area_orig = domain->prd[tan_axis1] * domain->prd[tan_axis2]; } - /* ---------------------------------------------------------------------- restore box size to original values ------------------------------------------------------------------------- */ void ComputeFEPTA::restore_box() { - for (int i=0; i < domain->dimension; i++) { + for (int i = 0; i < domain->dimension; i++) { domain->boxhi[i] = boxhi_orig[i]; domain->boxlo[i] = boxlo_orig[i]; } - + domain->set_global_box(); domain->set_local_box(); if (force->kspace) force->kspace->setup(); } - /* ---------------------------------------------------------------------- manage storage for position, force, energy, virial arrays ------------------------------------------------------------------------- */ @@ -317,13 +299,13 @@ void ComputeFEPTA::restore_box() void ComputeFEPTA::allocate_storage() { nmax = atom->nmax; - memory->create(x_orig,nmax,3,"fep:x_orig"); - memory->create(f_orig,nmax,3,"fep:f_orig"); - memory->create(peatom_orig,nmax,"fep:peatom_orig"); - memory->create(pvatom_orig,nmax,6,"fep:pvatom_orig"); + memory->create(x_orig, nmax, 3, "fep:x_orig"); + memory->create(f_orig, nmax, 3, "fep:f_orig"); + memory->create(peatom_orig, nmax, "fep:peatom_orig"); + memory->create(pvatom_orig, nmax, 6, "fep:pvatom_orig"); if (force->kspace) { - memory->create(keatom_orig,nmax,"fep:keatom_orig"); - memory->create(kvatom_orig,nmax,6,"fep:kvatom_orig"); + memory->create(keatom_orig, nmax, "fep:keatom_orig"); + memory->create(kvatom_orig, nmax, 6, "fep:kvatom_orig"); } } @@ -344,7 +326,6 @@ void ComputeFEPTA::deallocate_storage() pvatom_orig = kvatom_orig = nullptr; } - /* ---------------------------------------------------------------------- backup and restore arrays with position, force, energy, virial ------------------------------------------------------------------------- */ @@ -361,7 +342,7 @@ void ComputeFEPTA::backup_xfev() x_orig[i][1] = x[i][1]; x_orig[i][2] = x[i][2]; } - + double **f = atom->f; for (i = 0; i < natom; i++) { f_orig[i][0] = f[i][0]; @@ -373,10 +354,10 @@ void ComputeFEPTA::backup_xfev() eng_coul_orig = force->pair->eng_coul; if (atom->molecular != Atom::ATOMIC) { - if (force->bond) eng_bond_orig = force->bond->energy; - if (force->angle) eng_angle_orig = force->angle->energy; - if (force->dihedral) eng_dihedral_orig = force->dihedral->energy; - if (force->improper) eng_improper_orig = force->improper->energy; + if (force->bond) eng_bond_orig = force->bond->energy; + if (force->angle) eng_angle_orig = force->angle->energy; + if (force->dihedral) eng_dihedral_orig = force->dihedral->energy; + if (force->improper) eng_improper_orig = force->improper->energy; } pvirial_orig[0] = force->pair->virial[0]; @@ -388,8 +369,7 @@ void ComputeFEPTA::backup_xfev() if (update->eflag_atom) { double *peatom = force->pair->eatom; - for (i = 0; i < natom; i++) - peatom_orig[i] = peatom[i]; + for (i = 0; i < natom; i++) peatom_orig[i] = peatom[i]; } if (update->vflag_atom) { double **pvatom = force->pair->vatom; @@ -414,8 +394,7 @@ void ComputeFEPTA::backup_xfev() if (update->eflag_atom) { double *keatom = force->kspace->eatom; - for (i = 0; i < natom; i++) - keatom_orig[i] = keatom[i]; + for (i = 0; i < natom; i++) keatom_orig[i] = keatom[i]; } if (update->vflag_atom) { double **kvatom = force->kspace->vatom; @@ -472,8 +451,7 @@ void ComputeFEPTA::restore_xfev() if (update->eflag_atom) { double *peatom = force->pair->eatom; - for (i = 0; i < natom; i++) - peatom[i] = peatom_orig[i]; + for (i = 0; i < natom; i++) peatom[i] = peatom_orig[i]; } if (update->vflag_atom) { double **pvatom = force->pair->vatom; @@ -498,8 +476,7 @@ void ComputeFEPTA::restore_xfev() if (update->eflag_atom) { double *keatom = force->kspace->eatom; - for (i = 0; i < natom; i++) - keatom[i] = keatom_orig[i]; + for (i = 0; i < natom; i++) keatom[i] = keatom_orig[i]; } if (update->vflag_atom) { double **kvatom = force->kspace->vatom; @@ -514,4 +491,3 @@ void ComputeFEPTA::restore_xfev() } } } - From db5e4e05a8e1053ae3f60c049dd37f9d407af1ee Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Tue, 29 Mar 2022 15:35:23 +0800 Subject: [PATCH 16/57] fix bug that happens when fix ave/time Nfreq < thermo freq --- src/FEP/compute_fep_ta.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/FEP/compute_fep_ta.cpp b/src/FEP/compute_fep_ta.cpp index 24e5b21959..70fdb5c0b0 100644 --- a/src/FEP/compute_fep_ta.cpp +++ b/src/FEP/compute_fep_ta.cpp @@ -165,6 +165,30 @@ void ComputeFEPTA::compute_vector() backup_xfev(); // backup position, force, energy, virial array values backup_box(); // backup box size + timer->stamp(); + if (force->pair && force->pair->compute_flag) { + force->pair->compute(eflag, vflag); + timer->stamp(Timer::PAIR); + } + + if (atom->molecular != Atom::ATOMIC) { + if (force->bond) force->bond->compute(eflag, vflag); + if (force->angle) force->angle->compute(eflag, vflag); + if (force->dihedral) force->dihedral->compute(eflag, vflag); + if (force->improper) force->improper->compute(eflag, vflag); + timer->stamp(Timer::BOND); + } + + if (force->kspace && force->kspace->compute_flag) { + force->kspace->compute(eflag, vflag); + timer->stamp(Timer::KSPACE); + } + + // accumulate force/energy/virial from /gpu pair styles + // this is required as to empty the answer queue, + // otherwise the force compute on the GPU in the next step would be incorrect + if (fixgpu) fixgpu->post_force(vflag); + pe0 = compute_pe(); change_box(); From 14f54aae40a3b82a1549cc4acd8824f996c589a3 Mon Sep 17 00:00:00 2001 From: Evan Weinberg Date: Wed, 30 Mar 2022 08:23:41 -0700 Subject: [PATCH 17/57] Reax: Preprocessing optimizations to ComputeAngular,Torsion. Modularity boosts + memory reductions for BuildLists --- src/KOKKOS/kokkos_type.h | 9 + src/KOKKOS/pair_reaxff_kokkos.cpp | 1543 ++++++++++++++++++++++++----- src/KOKKOS/pair_reaxff_kokkos.h | 116 ++- 3 files changed, 1425 insertions(+), 243 deletions(-) diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index 22620f0d3d..090f22d6e9 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -1214,6 +1214,15 @@ struct params_lj_coul { F_FLOAT cut_ljsq,cut_coulsq,lj1,lj2,lj3,lj4,offset; }; +#ifdef OPT_ANGULAR_TORSION +// ReaxFF + +struct alignas(4 * sizeof(int)) reax_int4 { + int i0, i1, i2, i3; +}; + +#endif + // Pair SNAP #define SNAP_KOKKOS_REAL double diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index fd73bd7c4c..23a2be2cb8 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -77,6 +77,14 @@ PairReaxFFKokkos::PairReaxFFKokkos(LAMMPS *lmp) : PairReaxFF(lmp) k_error_flag = DAT::tdual_int_scalar("pair:error_flag"); k_nbuf_local = DAT::tdual_int_scalar("pair:nbuf_local"); +#ifdef OPT_ANGULAR_TORSION + d_torsion_pack = t_reax_int4_2d("reaxff:torsion_pack",1,2); + d_angular_pack = t_reax_int4_2d("reaxff:angular_pack",1,2); + + k_count_angular_torsion = DAT::tdual_int_1d("PairReaxFF::count_angular_torsion",2); + d_count_angular_torsion = k_count_angular_torsion.template view(); +#endif + if (execution_space == Host) list_blocking_flag = 1; } @@ -935,6 +943,93 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) pvector[3] = 0.0; ev_all.evdwl += ev.ereax[0] + ev.ereax[1] + ev.ereax[2]; +#ifdef OPT_ANGULAR_TORSION + + int count_angular = 0; + int count_torsion = 0; + + auto& h_count_angular_torsion = k_count_angular_torsion.h_view; + h_count_angular_torsion(0) = 0; + h_count_angular_torsion(1) = 0; + k_count_angular_torsion.template modify(); + k_count_angular_torsion.template sync(); + + // separate kernels for counting of Angular, Torsion + // may make a difference for occupancy/cache thrashing +#ifdef OPT_SPLIT_COUNT_ANGULAR_TORSION + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); +#else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); +#endif + + k_count_angular_torsion.template modify(); + k_count_angular_torsion.template sync(); + count_angular = h_count_angular_torsion(0); + count_torsion = h_count_angular_torsion(1); + + if (count_angular > d_angular_pack.extent(0)) { + d_angular_pack = t_reax_int4_2d("reaxff:angular_pack",(int)(count_angular * 1.1),2); + } + if (count_torsion > d_torsion_pack.extent(0)) { + d_torsion_pack = t_reax_int4_2d("reaxff:torsion_pack",(int)(count_torsion * 1.1),2); + } + + // need to zero to re-count + h_count_angular_torsion(0) = 0; + h_count_angular_torsion(1) = 0; + k_count_angular_torsion.template modify(); + k_count_angular_torsion.template sync(); + +#ifdef OPT_SPLIT_COUNT_ANGULAR_TORSION + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); +#else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); +#endif + + // no need to re-sync count_angular, count_torsion + + // Angular + if (neighflag == HALF) { + if (evflag) + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,count_angular),*this,ev); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,count_angular),*this); + ev_all += ev; + } else { //if (neighflag == HALFTHREAD) { + if (evflag) + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,count_angular),*this,ev); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,count_angular),*this); + ev_all += ev; + } + pvector[4] = ev.ereax[3]; + pvector[5] = ev.ereax[4]; + pvector[6] = ev.ereax[5]; + ev_all.evdwl += ev.ereax[3] + ev.ereax[4] + ev.ereax[5]; + + // Torsion + if (neighflag == HALF) { + if (evflag) + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,count_torsion),*this,ev); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,count_torsion),*this); + ev_all += ev; + } else { //if (neighflag == HALFTHREAD) { + if (evflag) + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,count_torsion),*this,ev); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,count_torsion),*this); + ev_all += ev; + } + pvector[8] = ev.ereax[6]; + pvector[9] = ev.ereax[7]; + ev_all.evdwl += ev.ereax[6] + ev.ereax[7]; + +#else + + // Angular if (neighflag == HALF) { if (evflag) @@ -994,6 +1089,8 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) pvector[9] = ev.ereax[7]; ev_all.evdwl += ev.ereax[6] + ev.ereax[7]; +#endif + // Hydrogen Bond if (cut_hbsq > 0.0) { if (neighflag == HALF) { @@ -1514,6 +1611,10 @@ void PairReaxFFKokkos::allocate_array() d_BO_pi = typename AT::t_ffloat_2d_dl("reaxff/kk:BO_pi",nmax,maxbo); d_BO_pi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:BO_pi2",nmax,maxbo); +#ifdef OPT_REDUCE_DXDYDZ + d_dln_BOp_pi = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi",nmax,maxbo); + d_dln_BOp_pi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2",nmax,maxbo); +#else d_dln_BOp_pix = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pix",nmax,maxbo); d_dln_BOp_piy = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_piy",nmax,maxbo); d_dln_BOp_piz = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_piz",nmax,maxbo); @@ -1521,6 +1622,7 @@ void PairReaxFFKokkos::allocate_array() d_dln_BOp_pi2x = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2x",nmax,maxbo); d_dln_BOp_pi2y = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2y",nmax,maxbo); d_dln_BOp_pi2z = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2z",nmax,maxbo); +#endif d_C1dbo = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C1dbo",nmax,maxbo); d_C2dbo = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C2dbo",nmax,maxbo); @@ -1536,9 +1638,13 @@ void PairReaxFFKokkos::allocate_array() d_C3dbopi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C3dbopi2",nmax,maxbo); d_C4dbopi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C4dbopi2",nmax,maxbo); +#ifdef OPT_REDUCE_DXDYDZ + d_dBOp = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOp",nmax,maxbo); +#else d_dBOpx = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOpx",nmax,maxbo); d_dBOpy = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOpy",nmax,maxbo); d_dBOpz = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOpz",nmax,maxbo); +#endif d_dDeltap_self = typename AT::t_ffloat_2d_dl("reaxff/kk:dDeltap_self",nmax,3); d_Deltap_boc = typename AT::t_ffloat_1d("reaxff/kk:Deltap_boc",nmax); @@ -1561,6 +1667,11 @@ void PairReaxFFKokkos::allocate_array() d_abo = typename AT::t_ffloat_2d("reaxff/kk:abo",nmax,maxbo); d_neighid = typename AT::t_tagint_2d("reaxff/kk:neighid",nmax,maxbo); d_numneigh_bonds = typename AT::t_int_1d("reaxff/kk:numneigh_bonds",nmax); + +#ifdef OPT_ANGULAR_TORSION + // ComputeAngular intermediates + d_angular_intermediates = typename AT::t_ffloat_2d("reaxff/kk:angular_intermediates",nmax,4); +#endif } /* ---------------------------------------------------------------------- */ @@ -1582,6 +1693,10 @@ void PairReaxFFKokkos::deallocate_array() d_BO_pi = typename AT::t_ffloat_2d_dl(); d_BO_pi2 = typename AT::t_ffloat_2d_dl(); +#ifdef OPT_REDUCE_DXDYDZ + d_dln_BOp_pi = typename AT::t_ffloat_2d_dl(); + d_dln_BOp_pi2 = typename AT::t_ffloat_2d_dl(); +#else d_dln_BOp_pix = typename AT::t_ffloat_2d_dl(); d_dln_BOp_piy = typename AT::t_ffloat_2d_dl(); d_dln_BOp_piz = typename AT::t_ffloat_2d_dl(); @@ -1589,6 +1704,7 @@ void PairReaxFFKokkos::deallocate_array() d_dln_BOp_pi2x = typename AT::t_ffloat_2d_dl(); d_dln_BOp_pi2y = typename AT::t_ffloat_2d_dl(); d_dln_BOp_pi2z = typename AT::t_ffloat_2d_dl(); +#endif d_C1dbo = typename AT::t_ffloat_2d_dl(); d_C2dbo = typename AT::t_ffloat_2d_dl(); @@ -1604,9 +1720,13 @@ void PairReaxFFKokkos::deallocate_array() d_C3dbopi2 = typename AT::t_ffloat_2d_dl(); d_C4dbopi2 = typename AT::t_ffloat_2d_dl(); +#ifdef OPT_REDUCE_DXDYDZ + d_dBOp = typename AT::t_ffloat_2d_dl(); +#else d_dBOpx = typename AT::t_ffloat_2d_dl(); d_dBOpy = typename AT::t_ffloat_2d_dl(); d_dBOpz = typename AT::t_ffloat_2d_dl(); +#endif d_dDeltap_self = typename AT::t_ffloat_2d_dl(); d_Deltap_boc = typename AT::t_ffloat_1d(); @@ -1629,6 +1749,11 @@ void PairReaxFFKokkos::deallocate_array() d_abo = typename AT::t_ffloat_2d(); d_neighid = typename AT::t_tagint_2d(); d_numneigh_bonds = typename AT::t_int_1d(); + +#ifdef OPT_ANGULAR_TORSION + // ComputeAngular intermediates + d_angular_intermediates = typename AT::t_ffloat_2d(); +#endif } /* ---------------------------------------------------------------------- */ @@ -1665,8 +1790,10 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< const int itype = type(i); const int jnum = d_numneigh[i]; - const int three = 3; - F_FLOAT C12, C34, C56, BO_s, BO_pi, BO_pi2, BO, delij[three], dBOp_i[three], dln_BOp_pi_i[three], dln_BOp_pi2_i[three]; + F_FLOAT C12, C34, C56, BO_s, BO_pi, BO_pi2, BO, delij[3], dBOp_i[3]; +#ifndef OPT_REDUCE_DXDYDZ + F_FLOAT dln_BOp_pi_i[3], dln_BOp_pi2_i[3]; +#endif F_FLOAT dDeltap_self_i[3] = {0.0,0.0,0.0}; F_FLOAT total_bo_i = 0.0; @@ -1675,7 +1802,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< const int bo_first_i = d_bo_first[i]; int ihb = -1; - int jhb = -1; int hb_first_i; if (cut_hbsq > 0.0) { @@ -1729,101 +1855,43 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< const F_FLOAT rsq = delij[0]*delij[0] + delij[1]*delij[1] + delij[2]*delij[2]; // hbond list - if (i < nlocal && cut_hbsq > 0.0 && (ihb == 1 || ihb == 2) && rsq <= cut_hbsq) { - jhb = paramssing(jtype).p_hbond; - if (ihb == 1 && jhb == 2) { - if (NEIGHFLAG == HALF) { - j_index = hb_first_i + d_hb_num[i]; - d_hb_num[i]++; - } else - j_index = hb_first_i + Kokkos::atomic_fetch_add(&d_hb_num[i],1); - - const int jj_index = j_index - hb_first_i; - - if (jj_index >= maxhb) - d_resize_hb() = MAX(d_resize_hb(),jj_index+1); - else - d_hb_list[j_index] = j; - } else if (j < nlocal && ihb == 2 && jhb == 1) { - if (NEIGHFLAG == HALF) { - i_index = d_hb_first[j] + d_hb_num[j]; - d_hb_num[j]++; - } else - i_index = d_hb_first[j] + Kokkos::atomic_fetch_add(&d_hb_num[j],1); - - const int ii_index = i_index - d_hb_first[j]; - - if (ii_index >= maxhb) - d_resize_hb() = MAX(d_resize_hb(),ii_index+1); - else - d_hb_list[i_index] = i; - } - } + build_hb_list(rsq, i, hb_first_i, ihb, j, jtype); if (rsq > cut_bosq) continue; - // bond_list + // bond_list const F_FLOAT rij = sqrt(rsq); - const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1; const F_FLOAT p_bo2 = paramstwbp(itype,jtype).p_bo2; - const F_FLOAT p_bo3 = paramstwbp(itype,jtype).p_bo3; const F_FLOAT p_bo4 = paramstwbp(itype,jtype).p_bo4; - const F_FLOAT p_bo5 = paramstwbp(itype,jtype).p_bo5; const F_FLOAT p_bo6 = paramstwbp(itype,jtype).p_bo6; - const F_FLOAT r_s = paramstwbp(itype,jtype).r_s; - const F_FLOAT r_pi = paramstwbp(itype,jtype).r_pi; - const F_FLOAT r_pi2 = paramstwbp(itype,jtype).r_pi2; - if (paramssing(itype).r_s > 0.0 && paramssing(jtype).r_s > 0.0) { - C12 = p_bo1 * ((p_bo2 != 0) ? (pow(rij/r_s,p_bo2)) : 1.0); - BO_s = (1.0+bo_cut)*exp(C12); - } else BO_s = C12 = 0.0; - - if (paramssing(itype).r_pi > 0.0 && paramssing(jtype).r_pi > 0.0) { - C34 = p_bo3 * ((p_bo4 != 0) ? (pow(rij/r_pi,p_bo4)) : 1.0); - BO_pi = exp(C34); - } else BO_pi = C34 = 0.0; - - if (paramssing(itype).r_pi2 > 0.0 && paramssing(jtype).r_pi2 > 0.0) { - C56 = p_bo5 * ((p_bo6 != 0) ? (pow(rij/r_pi2,p_bo6)) : 1.0); - BO_pi2 = exp(C56); - } else BO_pi2 = C56 = 0.0; + // returns BO_*, C** by reference + compute_bo(rij, itype, jtype, p_bo2, p_bo4, p_bo6, + BO_s, BO_pi, BO_pi2, C12, C34, C56); BO = BO_s + BO_pi + BO_pi2; if (BO < bo_cut) continue; - if (NEIGHFLAG == HALF) { - j_index = bo_first_i + d_bo_num[i]; - i_index = d_bo_first[j] + d_bo_num[j]; - d_bo_num[i]++; - d_bo_num[j]++; - } else { - j_index = bo_first_i + Kokkos::atomic_fetch_add(&d_bo_num[i],1); - i_index = d_bo_first[j] + Kokkos::atomic_fetch_add(&d_bo_num[j],1); - } - - const int jj_index = j_index - bo_first_i; - const int ii_index = i_index - d_bo_first[j]; - - if (jj_index >= maxbo || ii_index >= maxbo) { - const int max_val = MAX(ii_index+1,jj_index+1); - d_resize_bo() = MAX(d_resize_bo(),max_val); - } else { - d_bo_list[j_index] = j; - d_bo_list[i_index] = i; + int ii_index = -1; + int jj_index = -1; + if (build_bo_list(bo_first_i, i, j, i_index, j_index, ii_index, jj_index)) { // from BondOrder1 +#ifndef OPT_REDUCE_DXDYDZ d_BO(i,jj_index) = BO; d_BO_s(i,jj_index) = BO_s; - d_BO_pi(i,jj_index) = BO_pi; - d_BO_pi2(i,jj_index) = BO_pi2; d_BO(j,ii_index) = BO; d_BO_s(j,ii_index) = BO_s; +#endif + d_BO_pi(j,ii_index) = BO_pi; d_BO_pi2(j,ii_index) = BO_pi2; + d_BO_pi(i,jj_index) = BO_pi; + d_BO_pi2(i,jj_index) = BO_pi2; + F_FLOAT Cln_BOp_s = p_bo2 * C12 / rij / rij; F_FLOAT Cln_BOp_pi = p_bo4 * C34 / rij / rij; F_FLOAT Cln_BOp_pi2 = p_bo6 * C56 / rij / rij; @@ -1831,12 +1899,23 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< if (nlocal == 0) Cln_BOp_s = Cln_BOp_pi = Cln_BOp_pi2 = 0.0; - for (int d = 0; d < 3; d++) dln_BOp_pi_i[d] = -(BO_pi*Cln_BOp_pi)*delij[d]; - for (int d = 0; d < 3; d++) dln_BOp_pi2_i[d] = -(BO_pi2*Cln_BOp_pi2)*delij[d]; for (int d = 0; d < 3; d++) dBOp_i[d] = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2)*delij[d]; for (int d = 0; d < 3; d++) dDeltap_self_i[d] += dBOp_i[d]; for (int d = 0; d < 3; d++) a_dDeltap_self(j,d) += -dBOp_i[d]; +#ifdef OPT_REDUCE_DXDYDZ + d_dln_BOp_pi(i,jj_index) = -(BO_pi*Cln_BOp_pi); + d_dln_BOp_pi(j,ii_index) = -(BO_pi*Cln_BOp_pi); + + d_dln_BOp_pi2(i,jj_index) = -(BO_pi2*Cln_BOp_pi2); + d_dln_BOp_pi2(j,ii_index) = -(BO_pi2*Cln_BOp_pi2); + + d_dBOp(i,jj_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); + d_dBOp(j,ii_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); +#else + for (int d = 0; d < 3; d++) dln_BOp_pi_i[d] = -(BO_pi*Cln_BOp_pi)*delij[d]; + for (int d = 0; d < 3; d++) dln_BOp_pi2_i[d] = -(BO_pi2*Cln_BOp_pi2)*delij[d]; + d_dln_BOp_pix(i,jj_index) = dln_BOp_pi_i[0]; d_dln_BOp_piy(i,jj_index) = dln_BOp_pi_i[1]; d_dln_BOp_piz(i,jj_index) = dln_BOp_pi_i[2]; @@ -1860,6 +1939,16 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< d_dBOpx(j,ii_index) = -dBOp_i[0]; d_dBOpy(j,ii_index) = -dBOp_i[1]; d_dBOpz(j,ii_index) = -dBOp_i[2]; +#endif + +#ifdef OPT_REDUCE_DXDYDZ + d_BO(i,jj_index) = BO - bo_cut; + d_BO(j,ii_index) = BO - bo_cut; + d_BO_s(i,jj_index) = BO_s - bo_cut; + d_BO_s(j,ii_index) = BO_s - bo_cut; + total_bo_i += (BO - bo_cut); + a_total_bo[j] += (BO - bo_cut); +#else d_BO(i,jj_index) -= bo_cut; d_BO(j,ii_index) -= bo_cut; @@ -1867,6 +1956,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< d_BO_s(j,ii_index) -= bo_cut; total_bo_i += d_BO(i,jj_index); a_total_bo[j] += d_BO(j,ii_index); +#endif } } } @@ -1899,7 +1989,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlockingP const int bo_first_i = d_bo_first[i]; int ihb = -1; - int jhb = -1; int hb_first_i; if (cut_hbsq > 0.0) { @@ -1954,89 +2043,26 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlockingP const F_FLOAT rsq = delij[0]*delij[0] + delij[1]*delij[1] + delij[2]*delij[2]; // hbond list - if (i < nlocal && cut_hbsq > 0.0 && (ihb == 1 || ihb == 2) && rsq <= cut_hbsq) { - jhb = paramssing(jtype).p_hbond; - if (ihb == 1 && jhb == 2) { - if (NEIGHFLAG == HALF) { - j_index = hb_first_i + d_hb_num[i]; - d_hb_num[i]++; - } else - j_index = hb_first_i + Kokkos::atomic_fetch_add(&d_hb_num[i],1); - - const int jj_index = j_index - hb_first_i; - - if (jj_index >= maxhb) - d_resize_hb() = MAX(d_resize_hb(),jj_index+1); - else - d_hb_list[j_index] = j; - } else if (j < nlocal && ihb == 2 && jhb == 1) { - if (NEIGHFLAG == HALF) { - i_index = d_hb_first[j] + d_hb_num[j]; - d_hb_num[j]++; - } else - i_index = d_hb_first[j] + Kokkos::atomic_fetch_add(&d_hb_num[j],1); - - const int ii_index = i_index - d_hb_first[j]; - - if (ii_index >= maxhb) - d_resize_hb() = MAX(d_resize_hb(),ii_index+1); - else - d_hb_list[i_index] = i; - } - } + build_hb_list(rsq, i, hb_first_i, ihb, j, jtype); if (rsq > cut_bosq) continue; - // bond_list + // bond_list const F_FLOAT rij = sqrt(rsq); - const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1; const F_FLOAT p_bo2 = paramstwbp(itype,jtype).p_bo2; - const F_FLOAT p_bo3 = paramstwbp(itype,jtype).p_bo3; const F_FLOAT p_bo4 = paramstwbp(itype,jtype).p_bo4; - const F_FLOAT p_bo5 = paramstwbp(itype,jtype).p_bo5; const F_FLOAT p_bo6 = paramstwbp(itype,jtype).p_bo6; - const F_FLOAT r_s = paramstwbp(itype,jtype).r_s; - const F_FLOAT r_pi = paramstwbp(itype,jtype).r_pi; - const F_FLOAT r_pi2 = paramstwbp(itype,jtype).r_pi2; - if (paramssing(itype).r_s > 0.0 && paramssing(jtype).r_s > 0.0) { - C12 = p_bo1 * ((p_bo2 != 0) ? (pow(rij/r_s,p_bo2)) : 1.0); - BO_s = (1.0+bo_cut)*exp(C12); - } else BO_s = C12 = 0.0; - - if (paramssing(itype).r_pi > 0.0 && paramssing(jtype).r_pi > 0.0) { - C34 = p_bo3 * ((p_bo4 != 0) ? (pow(rij/r_pi,p_bo4)) : 1.0); - BO_pi = exp(C34); - } else BO_pi = C34 = 0.0; - - if (paramssing(itype).r_pi2 > 0.0 && paramssing(jtype).r_pi2 > 0.0) { - C56 = p_bo5 * ((p_bo6 != 0) ? (pow(rij/r_pi2,p_bo6)) : 1.0); - BO_pi2 = exp(C56); - } else BO_pi2 = C56 = 0.0; + // returns BO_*, C** by reference + compute_bo(rij, itype, jtype, p_bo2, p_bo4, p_bo6, + BO_s, BO_pi, BO_pi2, C12, C34, C56); BO = BO_s + BO_pi + BO_pi2; if (BO < bo_cut) continue; - if (NEIGHFLAG == HALF) { - j_index = bo_first_i + d_bo_num[i]; - i_index = d_bo_first[j] + d_bo_num[j]; - d_bo_num[i]++; - d_bo_num[j]++; - } else { - j_index = bo_first_i + Kokkos::atomic_fetch_add(&d_bo_num[i],1); - i_index = d_bo_first[j] + Kokkos::atomic_fetch_add(&d_bo_num[j],1); - } - - const int jj_index = j_index - bo_first_i; - const int ii_index = i_index - d_bo_first[j]; - - if (jj_index >= maxbo || ii_index >= maxbo) { - const int max_val = MAX(ii_index+1,jj_index+1); - d_resize_bo() = MAX(d_resize_bo(),max_val); - } else { - d_bo_list[j_index] = j; - d_bo_list[i_index] = i; - } + int ii_index = -1; + int jj_index = -1; + build_bo_list(bo_first_i, i, j, i_index, j_index, ii_index, jj_index); } } } @@ -2062,7 +2088,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfPreview 0.0) { @@ -2087,90 +2112,106 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfPreview 0.0 && (ihb == 1 || ihb == 2) && rsq <= cut_hbsq) { - jhb = paramssing(jtype).p_hbond; - if (ihb == 1 && jhb == 2) { - if (NEIGHFLAG == HALF) { - j_index = hb_first_i + d_hb_num[i]; - d_hb_num[i]++; - } else - j_index = hb_first_i + Kokkos::atomic_fetch_add(&d_hb_num[i],1); - - const int jj_index = j_index - hb_first_i; - - if (jj_index >= maxhb) - d_resize_hb() = MAX(d_resize_hb(),jj_index+1); - else - d_hb_list[j_index] = j; - } else if (j < nlocal && ihb == 2 && jhb == 1) { - if (NEIGHFLAG == HALF) { - i_index = d_hb_first[j] + d_hb_num[j]; - d_hb_num[j]++; - } else - i_index = d_hb_first[j] + Kokkos::atomic_fetch_add(&d_hb_num[j],1); - - const int ii_index = i_index - d_hb_first[j]; - - if (ii_index >= maxhb) - d_resize_hb() = MAX(d_resize_hb(),ii_index+1); - else - d_hb_list[i_index] = i; - } - } + build_hb_list(rsq, i, hb_first_i, ihb, j, jtype); if (rsq > cut_bosq) continue; // bond_list const F_FLOAT rij = sqrt(rsq); - const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1; const F_FLOAT p_bo2 = paramstwbp(itype,jtype).p_bo2; - const F_FLOAT p_bo3 = paramstwbp(itype,jtype).p_bo3; const F_FLOAT p_bo4 = paramstwbp(itype,jtype).p_bo4; - const F_FLOAT p_bo5 = paramstwbp(itype,jtype).p_bo5; const F_FLOAT p_bo6 = paramstwbp(itype,jtype).p_bo6; - const F_FLOAT r_s = paramstwbp(itype,jtype).r_s; - const F_FLOAT r_pi = paramstwbp(itype,jtype).r_pi; - const F_FLOAT r_pi2 = paramstwbp(itype,jtype).r_pi2; - if (paramssing(itype).r_s > 0.0 && paramssing(jtype).r_s > 0.0) { - C12 = p_bo1 * ((p_bo2 != 0) ? (pow(rij/r_s,p_bo2)) : 1.0); - BO_s = (1.0+bo_cut)*exp(C12); - } else BO_s = C12 = 0.0; - - if (paramssing(itype).r_pi > 0.0 && paramssing(jtype).r_pi > 0.0) { - C34 = p_bo3 * ((p_bo4 != 0) ? (pow(rij/r_pi,p_bo4)) : 1.0); - BO_pi = exp(C34); - } else BO_pi = C34 = 0.0; - - if (paramssing(itype).r_pi2 > 0.0 && paramssing(jtype).r_pi2 > 0.0) { - C56 = p_bo5 * ((p_bo6 != 0) ? (pow(rij/r_pi2,p_bo6)) : 1.0); - BO_pi2 = exp(C56); - } else BO_pi2 = C56 = 0.0; + // returns BO_*, C** by reference + compute_bo(rij, itype, jtype, p_bo2, p_bo4, p_bo6, + BO_s, BO_pi, BO_pi2, C12, C34, C56); BO = BO_s + BO_pi + BO_pi2; if (BO < bo_cut) continue; - if (NEIGHFLAG == HALF) { - j_index = bo_first_i + d_bo_num[i]; - i_index = d_bo_first[j] + d_bo_num[j]; - d_bo_num[i]++; - d_bo_num[j]++; - } else { - j_index = bo_first_i + Kokkos::atomic_fetch_add(&d_bo_num[i],1); - i_index = d_bo_first[j] + Kokkos::atomic_fetch_add(&d_bo_num[j],1); - } + int ii_index = -1; + int jj_index = -1; - const int jj_index = j_index - bo_first_i; - const int ii_index = i_index - d_bo_first[j]; + build_bo_list(bo_first_i, i, j, i_index, j_index, ii_index, jj_index); + } +} - if (jj_index >= maxbo || ii_index >= maxbo) { - const int max_val = MAX(ii_index+1,jj_index+1); - d_resize_bo() = MAX(d_resize_bo(),max_val); - } else { - d_bo_list[j_index] = j; - d_bo_list[i_index] = i; +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::build_hb_list(F_FLOAT rsq, int i, int hb_first_i, int ihb, int j, int jtype) const { + + int i_index, j_index; + int jhb = -1; + if (i < nlocal && cut_hbsq > 0.0 && (ihb == 1 || ihb == 2) && rsq <= cut_hbsq) { + jhb = paramssing(jtype).p_hbond; + if (ihb == 1 && jhb == 2) { + if (NEIGHFLAG == HALF) { + j_index = hb_first_i + d_hb_num[i]; + d_hb_num[i]++; + } else + j_index = hb_first_i + Kokkos::atomic_fetch_add(&d_hb_num[i],1); + + const int jj_index = j_index - hb_first_i; + + if (jj_index >= maxhb) + d_resize_hb() = MAX(d_resize_hb(),jj_index+1); + else + d_hb_list[j_index] = j; + } else if (j < nlocal && ihb == 2 && jhb == 1) { + if (NEIGHFLAG == HALF) { + i_index = d_hb_first[j] + d_hb_num[j]; + d_hb_num[j]++; + } else + i_index = d_hb_first[j] + Kokkos::atomic_fetch_add(&d_hb_num[j],1); + + const int ii_index = i_index - d_hb_first[j]; + + if (ii_index >= maxhb) + d_resize_hb() = MAX(d_resize_hb(),ii_index+1); + else + d_hb_list[i_index] = i; } } + +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +bool PairReaxFFKokkos::build_bo_list(int bo_first_i, int i, int j, int i_index, int j_index, int& ii_index, int& jj_index) const { + + if (NEIGHFLAG == HALF) { + j_index = bo_first_i + d_bo_num[i]; + i_index = d_bo_first[j] + d_bo_num[j]; + d_bo_num[i]++; + d_bo_num[j]++; + } else { + j_index = bo_first_i + Kokkos::atomic_fetch_add(&d_bo_num[i],1); + i_index = d_bo_first[j] + Kokkos::atomic_fetch_add(&d_bo_num[j],1); + } + + jj_index = j_index - bo_first_i; + ii_index = i_index - d_bo_first[j]; + + bool set_dB_flag = true; + + if (jj_index >= maxbo || ii_index >= maxbo) { + const int max_val = MAX(ii_index+1,jj_index+1); + d_resize_bo() = MAX(d_resize_bo(),max_val); + set_dB_flag = false; + } else { + d_bo_list[j_index] = j; + d_bo_list[i_index] = i; + set_dB_flag = true; + } + + return set_dB_flag; + } /* ---------------------------------------------------------------------- */ @@ -2185,7 +2226,10 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i const X_FLOAT ztmp = x(i,2); const int itype = type(i); - F_FLOAT C12, C34, C56, BO_s, BO_pi, BO_pi2, BO, delij[3], dBOp_i[3], dln_BOp_pi_i[3], dln_BOp_pi2_i[3]; + F_FLOAT C12, C34, C56, BO_s, BO_pi, BO_pi2, BO, delij[3], dBOp_i[3]; +#ifndef OPT_REDUCE_DXDYDZ + F_FLOAT dln_BOp_pi_i[3], dln_BOp_pi2_i[3]; +#endif F_FLOAT dDeltap_self_i[3] = {0.0,0.0,0.0}; F_FLOAT total_bo_i = 0.0; @@ -2202,39 +2246,24 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i const F_FLOAT rsq = delij[0]*delij[0] + delij[1]*delij[1] + delij[2]*delij[2]; const F_FLOAT rsq_inv = 1.0 / rsq; - // bond_list + // bond_list const F_FLOAT rij = sqrt(rsq); - const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1; const F_FLOAT p_bo2 = paramstwbp(itype,jtype).p_bo2; - const F_FLOAT p_bo3 = paramstwbp(itype,jtype).p_bo3; const F_FLOAT p_bo4 = paramstwbp(itype,jtype).p_bo4; - const F_FLOAT p_bo5 = paramstwbp(itype,jtype).p_bo5; const F_FLOAT p_bo6 = paramstwbp(itype,jtype).p_bo6; - const F_FLOAT r_s = paramstwbp(itype,jtype).r_s; - const F_FLOAT r_pi = paramstwbp(itype,jtype).r_pi; - const F_FLOAT r_pi2 = paramstwbp(itype,jtype).r_pi2; - if (paramssing(itype).r_s > 0.0 && paramssing(jtype).r_s > 0.0) { - C12 = p_bo1 * ((p_bo2 != 0) ? (pow(rij/r_s,p_bo2)) : 1.0); - BO_s = (1.0+bo_cut)*exp(C12); - } else BO_s = C12 = 0.0; - - if (paramssing(itype).r_pi > 0.0 && paramssing(jtype).r_pi > 0.0) { - C34 = p_bo3 * ((p_bo4 != 0) ? (pow(rij/r_pi,p_bo4)) : 1.0); - BO_pi = exp(C34); - } else BO_pi = C34 = 0.0; - - if (paramssing(itype).r_pi2 > 0.0 && paramssing(jtype).r_pi2 > 0.0) { - C56 = p_bo5 * ((p_bo6 != 0) ? (pow(rij/r_pi2,p_bo6)) : 1.0); - BO_pi2 = exp(C56); - } else BO_pi2 = C56 = 0.0; + // returns BO_*, C** by reference + compute_bo(rij, itype, jtype, p_bo2, p_bo4, p_bo6, + BO_s, BO_pi, BO_pi2, C12, C34, C56); BO = BO_s + BO_pi + BO_pi2; // from BondOrder1 +#ifndef OPT_REDUCE_DXDYDZ d_BO(i,j_index) = BO; d_BO_s(i,j_index) = BO_s; +#endif d_BO_pi(i,j_index) = BO_pi; d_BO_pi2(i,j_index) = BO_pi2; @@ -2245,11 +2274,20 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i if (nlocal == 0) Cln_BOp_s = Cln_BOp_pi = Cln_BOp_pi2 = 0.0; - for (int d = 0; d < 3; d++) dln_BOp_pi_i[d] = -(BO_pi*Cln_BOp_pi)*delij[d]; - for (int d = 0; d < 3; d++) dln_BOp_pi2_i[d] = -(BO_pi2*Cln_BOp_pi2)*delij[d]; for (int d = 0; d < 3; d++) dBOp_i[d] = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2)*delij[d]; for (int d = 0; d < 3; d++) dDeltap_self_i[d] += dBOp_i[d]; +#ifdef OPT_REDUCE_DXDYDZ + + d_dln_BOp_pi(i,j_index) = -(BO_pi*Cln_BOp_pi); + d_dln_BOp_pi2(i,j_index) = -(BO_pi2*Cln_BOp_pi2); + d_dBOp(i,j_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); + +#else + + for (int d = 0; d < 3; d++) dln_BOp_pi_i[d] = -(BO_pi*Cln_BOp_pi)*delij[d]; + for (int d = 0; d < 3; d++) dln_BOp_pi2_i[d] = -(BO_pi2*Cln_BOp_pi2)*delij[d]; + d_dln_BOp_pix(i,j_index) = dln_BOp_pi_i[0]; d_dln_BOp_piy(i,j_index) = dln_BOp_pi_i[1]; d_dln_BOp_piz(i,j_index) = dln_BOp_pi_i[2]; @@ -2262,9 +2300,17 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i d_dBOpy(i,j_index) = dBOp_i[1]; d_dBOpz(i,j_index) = dBOp_i[2]; +#endif + +#ifdef OPT_REDUCE_DXDYDZ + d_BO(i,j_index) = BO - bo_cut; + d_BO_s(i,j_index) = BO_s - bo_cut; + total_bo_i += (BO - bo_cut); +#else d_BO(i,j_index) -= bo_cut; d_BO_s(i,j_index) -= bo_cut; total_bo_i += d_BO(i,j_index); +#endif } for (int d = 0; d < 3; d++) @@ -2275,6 +2321,37 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i /* ---------------------------------------------------------------------- */ +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::compute_bo(F_FLOAT rij, int itype, int jtype, F_FLOAT p_bo2, F_FLOAT p_bo4, F_FLOAT p_bo6, + F_FLOAT& BO_s, F_FLOAT& BO_pi, F_FLOAT& BO_pi2, F_FLOAT& C12, F_FLOAT& C34, F_FLOAT& C56) const { + + const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1; + const F_FLOAT p_bo3 = paramstwbp(itype,jtype).p_bo3; + const F_FLOAT p_bo5 = paramstwbp(itype,jtype).p_bo5; + const F_FLOAT r_s = paramstwbp(itype,jtype).r_s; + const F_FLOAT r_pi = paramstwbp(itype,jtype).r_pi; + const F_FLOAT r_pi2 = paramstwbp(itype,jtype).r_pi2; + + if (paramssing(itype).r_s > 0.0 && paramssing(jtype).r_s > 0.0) { + C12 = p_bo1 * ((p_bo2 != 0) ? (pow(rij/r_s,p_bo2)) : 1.0); + BO_s = (1.0+bo_cut)*exp(C12); + } else BO_s = C12 = 0.0; + + if (paramssing(itype).r_pi > 0.0 && paramssing(jtype).r_pi > 0.0) { + C34 = p_bo3 * ((p_bo4 != 0) ? (pow(rij/r_pi,p_bo4)) : 1.0); + BO_pi = exp(C34); + } else BO_pi = C34 = 0.0; + + if (paramssing(itype).r_pi2 > 0.0 && paramssing(jtype).r_pi2 > 0.0) { + C56 = p_bo5 * ((p_bo6 != 0) ? (pow(rij/r_pi2,p_bo6)) : 1.0); + BO_pi2 = exp(C56); + } else BO_pi2 = C56 = 0.0; + +} + +/* ---------------------------------------------------------------------- */ + template KOKKOS_INLINE_FUNCTION void PairReaxFFKokkos::operator()(TagPairReaxBondOrder1, const int &ii) const { @@ -2640,6 +2717,955 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeMulti2template operator()(TagPairReaxComputeMulti2(), ii, ev); } + +#ifdef OPT_ANGULAR_TORSION + +#ifdef OPT_SPLIT_COUNT_ANGULAR_TORSION + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::operator()(TagPairReaxCountAngular, const int &ii) const { + + // in reaxff_torsion_angles: j = i, k = j, i = k; + + const int i = d_ilist[ii]; + const int itype = type(i); + + const int j_start = d_bo_first[i]; + const int j_end = j_start + d_bo_num[i]; + + if (POPULATE) { + // Computes and stores SBO2, CSBO2, dSBO1, dSBO2 + compute_angular_sbo(i, itype, j_start, j_end); + } + + // Angular + + // Count buffer size for `i` + int location_angular = 0; // dummy declaration + int count_angular = preprocess_angular(i, itype, j_start, j_end, location_angular); + location_angular = Kokkos::atomic_fetch_add(&d_count_angular_torsion(0), count_angular); + + if (POPULATE) { + // Fill buffer for `i` + preprocess_angular(i, itype, j_start, j_end, location_angular); + } + +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::operator()(TagPairReaxCountTorsion, const int &ii) const { + + // in reaxff_torsion_angles: j = i, k = j, i = k; + + const int i = d_ilist[ii]; + const int itype = type(i); + const int j_start = d_bo_first[i]; + const int j_end = j_start + d_bo_num[i]; + + const tagint itag = tag(i); + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + + // Count buffer size for `i` + int location_torsion = 0; // dummy declaration + int count_torsion = preprocess_torsion(i, itype, itag, xtmp, ytmp, ztmp, j_start, j_end, location_torsion); + location_torsion = Kokkos::atomic_fetch_add(&d_count_angular_torsion(1), count_torsion); + + if (POPULATE) { + // Fill buffer for `i` + preprocess_torsion(i, itype, itag, xtmp, ytmp, ztmp, j_start, j_end, location_torsion); + } + +} + +#else + + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::operator()(TagPairReaxCountAngularTorsion, const int &ii) const { + + const int i = d_ilist[ii]; + const int itype = type(i); + + const int j_start = d_bo_first[i]; + const int j_end = j_start + d_bo_num[i]; + + if (POPULATE) { + // Computes and stores SBO2, CSBO2, dSBO1, dSBO2 + compute_angular_sbo(i, itype, j_start, j_end); + } + + // Angular + + // Count buffer size for `i` + int location_angular = 0; // dummy declaration + int count_angular = preprocess_angular(i, itype, j_start, j_end, location_angular); + location_angular = Kokkos::atomic_fetch_add(&d_count_angular_torsion(0), count_angular); + + if (POPULATE) { + // Fill buffer for `i` + preprocess_angular(i, itype, j_start, j_end, location_angular); + } + + // Torsion + + const tagint itag = tag(i); + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + + // Count buffer size for `i` + int location_torsion = 0; // dummy declaration + int count_torsion = preprocess_torsion(i, itype, itag, xtmp, ytmp, ztmp, j_start, j_end, location_torsion); + location_torsion = Kokkos::atomic_fetch_add(&d_count_angular_torsion(1), count_torsion); + + if (POPULATE) { + // Fill buffer for `i` + preprocess_torsion(i, itype, itag, xtmp, ytmp, ztmp, j_start, j_end, location_torsion); + } + +} + +#endif + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::compute_angular_sbo(int i, int itype, int j_start, int j_end) const { + + F_FLOAT SBO2, CSBO2, dSBO1, dSBO2; + + const F_FLOAT p_val8 = gp[33]; + const F_FLOAT p_val9 = gp[16]; + + const F_FLOAT Delta_val = d_total_bo[i] - paramssing(itype).valency_val; + + F_FLOAT SBOp = 0.0; + F_FLOAT prod_SBO = 1.0; + + for (int jj = j_start; jj < j_end; jj++) { + int j = d_bo_list[jj]; + j &= NEIGHMASK; + const int j_index = jj - j_start; + const F_FLOAT bo_ij = d_BO(i,j_index); + + SBOp += (d_BO_pi(i,j_index) + d_BO_pi2(i,j_index)); + F_FLOAT temp = SQR(bo_ij); + temp *= temp; + temp *= temp; + prod_SBO *= exp(-temp); + } + + F_FLOAT vlpadj; + + const F_FLOAT Delta_e = d_total_bo[i] - paramssing(itype).valency_e; + const F_FLOAT vlpex = Delta_e - 2.0 * (int)(Delta_e/2.0); + const F_FLOAT explp1 = exp(-gp[15] * SQR(2.0 + vlpex)); + const F_FLOAT nlp = explp1 - (int)(Delta_e / 2.0); + if (vlpex >= 0.0) { + vlpadj = 0.0; + dSBO2 = prod_SBO - 1.0; + } else { + vlpadj = nlp; + dSBO2 = (prod_SBO - 1.0) * (1.0 - p_val8 * d_dDelta_lp[i]); + } + + const F_FLOAT SBO = SBOp + (1.0 - prod_SBO) * (-d_Delta_boc[i] - p_val8 * vlpadj); + dSBO1 = -8.0 * prod_SBO * (d_Delta_boc[i] + p_val8 * vlpadj); + + if (SBO <= 0.0) { + SBO2 = 0.0; + CSBO2 = 0.0; + } else if (SBO > 0.0 && SBO <= 1.0) { + SBO2 = pow(SBO, p_val9); + CSBO2 = p_val9 * pow(SBO, p_val9 - 1.0); + } else if (SBO > 1.0 && SBO < 2.0) { + SBO2 = 2.0 - pow(2.0-SBO, p_val9); + CSBO2 = p_val9 * pow(2.0 - SBO, p_val9 - 1.0); + } else { + SBO2 = 2.0; + CSBO2 = 0.0; + } + + d_angular_intermediates(i, 0) = SBO2; + d_angular_intermediates(i, 1) = CSBO2; + d_angular_intermediates(i, 2) = dSBO1; + d_angular_intermediates(i, 3) = dSBO2; + +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +int PairReaxFFKokkos::preprocess_angular(int i, int itype, int j_start, int j_end, int location_angular) const { + + int count_angular = 0; + + for (int jj = j_start; jj < j_end; jj++) { + int j = d_bo_list[jj]; + j &= NEIGHMASK; + const int j_index = jj - j_start; + const F_FLOAT bo_ij = d_BO(i,j_index); + + if (bo_ij <= thb_cut) continue; + if (i >= nlocal && j >= nlocal) continue; + + const int i_index = maxbo + j_index; + const int jtype = type(j); + + for (int kk = jj+1; kk < j_end; kk++) { + //for (int kk = j_start; kk < j_end; kk++) { + int k = d_bo_list[kk]; + k &= NEIGHMASK; + if (k == j) continue; + + const int k_index = kk - j_start; + const F_FLOAT bo_ik = d_BO(i,k_index); + + if (bo_ij <= thb_cut || bo_ik <= thb_cut || bo_ij * bo_ik <= thb_cutsq) continue; + + const int ktype = type(k); + + F_FLOAT p_val1 = paramsthbp(jtype,itype,ktype).p_val1; + + if (fabs(p_val1) <= 0.001) continue; + + if (POPULATE) { + reax_int4 pack; + + // First pack stores i, j, k, and j_start + pack.i0 = i; + pack.i1 = j; + pack.i2 = k; + pack.i3 = j_start; + d_angular_pack(location_angular, 0) = pack; + + // Second pack stores i_index, j_index, k_index, and j_end + pack.i0 = i_index; + pack.i1 = j_index; + pack.i2 = k_index; + pack.i3 = j_end; + d_angular_pack(location_angular, 1) = pack; + + location_angular++; + } else { + count_angular++; + } + } + + } + + return count_angular; +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +int PairReaxFFKokkos::preprocess_torsion(int i, int itype, int itag, + F_FLOAT xtmp, F_FLOAT ytmp, F_FLOAT ztmp, int j_start, int j_end, int location_torsion) const { + + // in reaxff_torsion_angles: j = i, k = j, i = k; + + int count_torsion = 0; + + for (int jj = j_start; jj < j_end; jj++) { + int j = d_bo_list[jj]; + j &= NEIGHMASK; + const tagint jtag = tag(j); + const int jtype = type(j); + const int j_index = jj - j_start; + + // skip half of the interactions + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (x(j,2) < ztmp) continue; + if (x(j,2) == ztmp && x(j,1) < ytmp) continue; + if (x(j,2) == ztmp && x(j,1) == ytmp && x(j,0) < xtmp) continue; + } + + const F_FLOAT bo_ij = d_BO(i,j_index); + if (bo_ij < thb_cut) continue; + + const int l_start = d_bo_first[j]; + const int l_end = l_start + d_bo_num[j]; + + for (int kk = j_start; kk < j_end; kk++) { + int k = d_bo_list[kk]; + k &= NEIGHMASK; + if (k == j) continue; + const int k_index = kk - j_start; + + const F_FLOAT bo_ik = d_BO(i,k_index); + if (bo_ik < thb_cut) continue; + + + for (int ll = l_start; ll < l_end; ll++) { + int l = d_bo_list[ll]; + l &= NEIGHMASK; + if (l == i) continue; + const int l_index = ll - l_start; + + const F_FLOAT bo_jl = d_BO(j,l_index); + if (l == k || bo_jl < thb_cut || bo_ij*bo_ik*bo_jl < thb_cut) continue; + + if (POPULATE) { + reax_int4 pack; + + pack.i0 = i; + pack.i1 = j; + pack.i2 = k; + pack.i3 = l; + d_torsion_pack(location_torsion, 0) = pack; + + pack.i0 = 0; // no i_index + pack.i1 = j_index; + pack.i2 = k_index; + pack.i3 = l_index; + d_torsion_pack(location_torsion, 1) = pack; + + location_torsion++; + } else { + count_torsion++; + } + + } + } + } + + return count_torsion; +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::operator()(TagPairReaxComputeAngularPreprocessed, const int &apack, EV_FLOAT_REAX& ev) const { + + auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); + auto a_f = v_f.template access::value>(); + Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbo = d_Cdbo; + Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbopi = d_Cdbopi; + Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbopi2 = d_Cdbopi2; + + auto v_CdDelta = ScatterViewHelper::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); + auto a_CdDelta = v_CdDelta.template access::value>(); + + F_FLOAT temp, temp_bo_jt, pBOjt7; + F_FLOAT p_val1, p_val2, p_val3, p_val4, p_val5; + F_FLOAT p_val6, p_val7, p_val10; + F_FLOAT p_pen1, p_pen2, p_pen3, p_pen4; + F_FLOAT p_coa1, p_coa2, p_coa3, p_coa4; + F_FLOAT trm8, expval6, expval7, expval2theta, expval12theta, exp3ij, exp3jk; + F_FLOAT exp_pen2ij, exp_pen2jk, exp_pen3, exp_pen4, trm_pen34, exp_coa2; + F_FLOAT dSBO1, dSBO2, SBO2, CSBO2; + F_FLOAT CEval1, CEval2, CEval3, CEval4, CEval5, CEval6, CEval7, CEval8; + F_FLOAT CEpen1, CEpen2, CEpen3; + F_FLOAT e_ang, e_coa, e_pen; + F_FLOAT CEcoa1, CEcoa2, CEcoa3, CEcoa4, CEcoa5; + F_FLOAT Cf7ij, Cf7jk, Cf8j, Cf9j; + F_FLOAT f7_ij, f7_jk, f8_Dj, f9_Dj; + F_FLOAT Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; + F_FLOAT BOA_ij, BOA_ik, rij, bo_ij, bo_ik; + F_FLOAT dcos_theta_di[3], dcos_theta_dj[3], dcos_theta_dk[3]; + F_FLOAT eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; + F_FLOAT delij[3], delik[3], delji[3], delki[3]; + + p_val6 = gp[14]; + p_val10 = gp[17]; + + p_pen2 = gp[19]; + p_pen3 = gp[20]; + p_pen4 = gp[21]; + + p_coa2 = gp[2]; + p_coa3 = gp[38]; + p_coa4 = gp[30]; + + reax_int4 pack = d_angular_pack(apack,0); + const int i = pack.i0; + const int j = pack.i1; + const int k = pack.i2; + const int j_start = pack.i3; + + pack = d_angular_pack(apack, 1); + const int i_index = pack.i0; + const int j_index = pack.i1; + const int k_index = pack.i2; + const int j_end = pack.i3; + + const int itype = type(i); + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + + p_val3 = paramssing(itype).p_val3; + p_val5 = paramssing(itype).p_val5; + + const F_FLOAT Delta_val = d_total_bo[i] - paramssing(itype).valency_val; + + SBO2 = d_angular_intermediates(i, 0); + CSBO2 = d_angular_intermediates(i, 1); + dSBO1 = d_angular_intermediates(i, 2); + dSBO2 = d_angular_intermediates(i, 3); + + expval6 = exp(p_val6 * d_Delta_boc[i]); + + F_FLOAT CdDelta_i = 0.0; + F_FLOAT fitmp[3],fjtmp[3]; + for (int j = 0; j < 3; j++) fitmp[j] = 0.0; + + delij[0] = x(j,0) - xtmp; + delij[1] = x(j,1) - ytmp; + delij[2] = x(j,2) - ztmp; + const F_FLOAT rsqij = delij[0]*delij[0] + delij[1]*delij[1] + delij[2]*delij[2]; + rij = sqrt(rsqij); + bo_ij = d_BO(i,j_index); + + BOA_ij = bo_ij - thb_cut; + + const int jtype = type(j); + + F_FLOAT CdDelta_j = 0.0; + for (int k = 0; k < 3; k++) fjtmp[k] = 0.0; + + delik[0] = x(k,0) - xtmp; + delik[1] = x(k,1) - ytmp; + delik[2] = x(k,2) - ztmp; + const F_FLOAT rsqik = delik[0]*delik[0] + delik[1]*delik[1] + delik[2]*delik[2]; + const F_FLOAT rik = sqrt(rsqik); + bo_ik = d_BO(i,k_index); + BOA_ik = bo_ik - thb_cut; + + const int ktype = type(k); + + // theta and derivatives + + cos_theta = (delij[0]*delik[0]+delij[1]*delik[1]+delij[2]*delik[2])/(rij*rik); + if (cos_theta > 1.0) cos_theta = 1.0; + if (cos_theta < -1.0) cos_theta = -1.0; + theta = acos(cos_theta); + + const F_FLOAT inv_dists = 1.0 / (rij * rik); + const F_FLOAT Cdot_inv3 = cos_theta * inv_dists * inv_dists; + + for (int t = 0; t < 3; t++) { + dcos_theta_di[t] = -(delik[t] + delij[t]) * inv_dists + Cdot_inv3 * (rsqik * delij[t] + rsqij * delik[t]); + dcos_theta_dj[t] = delik[t] * inv_dists - Cdot_inv3 * rsqik * delij[t]; + dcos_theta_dk[t] = delij[t] * inv_dists - Cdot_inv3 * rsqij * delik[t]; + } + + sin_theta = sin(theta); + if (sin_theta < 1.0e-5) sin_theta = 1.0e-5; + p_val1 = paramsthbp(jtype,itype,ktype).p_val1; + + // ANGLE ENERGY + + p_val1 = paramsthbp(jtype,itype,ktype).p_val1; + p_val2 = paramsthbp(jtype,itype,ktype).p_val2; + p_val4 = paramsthbp(jtype,itype,ktype).p_val4; + p_val7 = paramsthbp(jtype,itype,ktype).p_val7; + theta_00 = paramsthbp(jtype,itype,ktype).theta_00; + + exp3ij = exp(-p_val3 * pow(BOA_ij, p_val4)); + f7_ij = 1.0 - exp3ij; + Cf7ij = p_val3 * p_val4 * pow(BOA_ij, p_val4 - 1.0) * exp3ij; + exp3jk = exp(-p_val3 * pow(BOA_ik, p_val4)); + f7_jk = 1.0 - exp3jk; + Cf7jk = p_val3 * p_val4 * pow(BOA_ik, p_val4 - 1.0) * exp3jk; + expval7 = exp(-p_val7 * d_Delta_boc[i]); + trm8 = 1.0 + expval6 + expval7; + f8_Dj = p_val5 - ((p_val5 - 1.0) * (2.0 + expval6) / trm8); + Cf8j = ((1.0 - p_val5) / (trm8*trm8)) * + (p_val6 * expval6 * trm8 - (2.0 + expval6) * (p_val6*expval6 - p_val7*expval7)); + theta_0 = 180.0 - theta_00 * (1.0 - exp(-p_val10 * (2.0 - SBO2))); + theta_0 = theta_0*constPI/180.0; + + expval2theta = exp(-p_val2 * (theta_0-theta)*(theta_0-theta)); + if (p_val1 >= 0) + expval12theta = p_val1 * (1.0 - expval2theta); + else // To avoid linear Me-H-Me angles (6/6/06) + expval12theta = p_val1 * -expval2theta; + + CEval1 = Cf7ij * f7_jk * f8_Dj * expval12theta; + CEval2 = Cf7jk * f7_ij * f8_Dj * expval12theta; + CEval3 = Cf8j * f7_ij * f7_jk * expval12theta; + CEval4 = -2.0 * p_val1 * p_val2 * f7_ij * f7_jk * f8_Dj * expval2theta * (theta_0 - theta); + Ctheta_0 = p_val10 * theta_00*constPI/180.0 * exp(-p_val10 * (2.0 - SBO2)); + CEval5 = -CEval4 * Ctheta_0 * CSBO2; + CEval6 = CEval5 * dSBO1; + CEval7 = CEval5 * dSBO2; + CEval8 = -CEval4 / sin_theta; + + e_ang = f7_ij * f7_jk * f8_Dj * expval12theta; + if (eflag) ev.ereax[3] += e_ang; + + // Penalty energy + + p_pen1 = paramsthbp(jtype,itype,ktype).p_pen1; + + exp_pen2ij = exp(-p_pen2 * (BOA_ij - 2.0)*(BOA_ij - 2.0)); + exp_pen2jk = exp(-p_pen2 * (BOA_ik - 2.0)*(BOA_ik - 2.0)); + exp_pen3 = exp(-p_pen3 * d_Delta[i]); + exp_pen4 = exp(p_pen4 * d_Delta[i]); + trm_pen34 = 1.0 + exp_pen3 + exp_pen4; + f9_Dj = (2.0 + exp_pen3) / trm_pen34; + Cf9j = (-p_pen3 * exp_pen3 * trm_pen34 - (2.0 + exp_pen3) * + (-p_pen3 * exp_pen3 + p_pen4 * exp_pen4))/(trm_pen34*trm_pen34); + + e_pen = p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; + if (eflag) ev.ereax[4] += e_pen; + + CEpen1 = e_pen * Cf9j / f9_Dj; + temp = -2.0 * p_pen2 * e_pen; + CEpen2 = temp * (BOA_ij - 2.0); + CEpen3 = temp * (BOA_ik - 2.0); + + // ConjAngle energy + + p_coa1 = paramsthbp(jtype,itype,ktype).p_coa1; + exp_coa2 = exp(p_coa2 * Delta_val); + e_coa = p_coa1 / (1. + exp_coa2) * + exp(-p_coa3 * SQR(d_total_bo[j]-BOA_ij)) * + exp(-p_coa3 * SQR(d_total_bo[k]-BOA_ik)) * + exp(-p_coa4 * SQR(BOA_ij - 1.5)) * + exp(-p_coa4 * SQR(BOA_ik - 1.5)); + + CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; + CEcoa2 = -2 * p_coa4 * (BOA_ik - 1.5) * e_coa; + CEcoa3 = -p_coa2 * exp_coa2 * e_coa / (1 + exp_coa2); + CEcoa4 = -2 * p_coa3 * (d_total_bo[j]-BOA_ij) * e_coa; + CEcoa5 = -2 * p_coa3 * (d_total_bo[k]-BOA_ik) * e_coa; + + if (eflag) ev.ereax[5] += e_coa; + + // Forces + + a_Cdbo(i,j_index) += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); + a_Cdbo(j,i_index) += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); + a_Cdbo(i,k_index) += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); + a_Cdbo(k,i_index) += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); + + CdDelta_i += ((CEval3 + CEval7) + CEpen1 + CEcoa3); + CdDelta_j += CEcoa4; + a_CdDelta[k] += CEcoa5; + + for (int ll = j_start; ll < j_end; ll++) { + int l = d_bo_list[ll]; + l &= NEIGHMASK; + const int l_index = ll - j_start; + + temp_bo_jt = d_BO(i,l_index); + temp = temp_bo_jt * temp_bo_jt * temp_bo_jt; + pBOjt7 = temp * temp * temp_bo_jt; + + a_Cdbo(i,l_index) += (CEval6 * pBOjt7); + a_Cdbopi(i,l_index) += CEval5; + a_Cdbopi2(i,l_index) += CEval5; + } + + for (int d = 0; d < 3; d++) fi_tmp[d] = CEval8 * dcos_theta_di[d]; + for (int d = 0; d < 3; d++) fj_tmp[d] = CEval8 * dcos_theta_dj[d]; + for (int d = 0; d < 3; d++) fk_tmp[d] = CEval8 * dcos_theta_dk[d]; + for (int d = 0; d < 3; d++) fitmp[d] -= fi_tmp[d]; + for (int d = 0; d < 3; d++) fjtmp[d] -= fj_tmp[d]; + for (int d = 0; d < 3; d++) a_f(k,d) -= fk_tmp[d]; + + // energy/virial tally + if (EVFLAG) { + eng_tmp = e_ang + e_pen + e_coa; + //if (eflag_atom) this->template ev_tally(ev,i,j,eng_tmp,0.0,0.0,0.0,0.0); + for (int d = 0; d < 3; d++) delki[d] = -1.0 * delik[d]; + for (int d = 0; d < 3; d++) delji[d] = -1.0 * delij[d]; + if (eflag_atom) this->template e_tally(ev,i,j,eng_tmp); + if (vflag_either) this->template v_tally3(ev,i,j,k,fj_tmp,fk_tmp,delji,delki); + } + + a_CdDelta[j] += CdDelta_j; + for (int d = 0; d < 3; d++) a_f(j,d) += fjtmp[d]; + a_CdDelta[i] += CdDelta_i; + for (int d = 0; d < 3; d++) a_f(i,d) += fitmp[d]; +} + + +template +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::operator()(TagPairReaxComputeAngularPreprocessed, const int &apack) const { + EV_FLOAT_REAX ev; + this->template operator()(TagPairReaxComputeAngularPreprocessed(), apack, ev); + +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsionPreprocessed, const int &tpack, EV_FLOAT_REAX& ev) const { + + auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); + auto a_f = v_f.template access::value>(); + + auto v_CdDelta = ScatterViewHelper::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); + auto a_CdDelta = v_CdDelta.template access::value>(); + Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbo = d_Cdbo; + Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbopi = d_Cdbopi; + //auto a_Cdbo = dup_Cdbo.template access::value>(); + + // in reaxff_torsion_angles: j = i, k = j, i = k; + + F_FLOAT Delta_i, Delta_j, bo_ij, bo_ik, bo_jl, BOA_ij, BOA_ik, BOA_jl; + F_FLOAT p_tor1, p_cot1, V1, V2, V3; + F_FLOAT exp_tor2_ij, exp_tor2_ik, exp_tor2_jl, exp_tor1, exp_tor3_DiDj, exp_tor4_DiDj, exp_tor34_inv; + F_FLOAT exp_cot2_ij, exp_cot2_ik, exp_cot2_jl, fn10, f11_DiDj, dfn11, fn12; + F_FLOAT theta_ijk, theta_jil, sin_ijk, sin_jil, cos_ijk, cos_jil, tan_ijk_i, tan_jil_i; + F_FLOAT cos_omega, cos2omega, cos3omega; + F_FLOAT CV, cmn, CEtors1, CEtors2, CEtors3, CEtors4; + F_FLOAT CEtors5, CEtors6, CEtors7, CEtors8, CEtors9; + F_FLOAT Cconj, CEconj1, CEconj2, CEconj3, CEconj4, CEconj5, CEconj6; + F_FLOAT e_tor, e_con, eng_tmp; + + F_FLOAT delij[3], delik[3], deljl[3], dellk[3], delil[3], delkl[3]; + F_FLOAT fi_tmp[3], fj_tmp[3], fk_tmp[3]; + F_FLOAT dcos_ijk_di[3], dcos_ijk_dj[3], dcos_ijk_dk[3], dcos_jil_di[3], dcos_jil_dj[3], dcos_jil_dk[3]; + + F_FLOAT p_tor2 = gp[23]; + F_FLOAT p_tor3 = gp[24]; + F_FLOAT p_tor4 = gp[25]; + F_FLOAT p_cot2 = gp[27]; + + reax_int4 pack = d_torsion_pack(tpack,0); + const int i = pack.i0; + const int j = pack.i1; + const int k = pack.i2; + const int l = pack.i3; + + pack = d_torsion_pack(tpack, 1); + //const int i = pack.i0; + const int j_index = pack.i1; + const int k_index = pack.i2; + const int l_index = pack.i3; + + const int itype = type(i); + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + Delta_i = d_Delta_boc[i]; + + const int jtype = type(j); + + bo_ij = d_BO(i,j_index); + + delij[0] = x(j,0) - xtmp; + delij[1] = x(j,1) - ytmp; + delij[2] = x(j,2) - ztmp; + const F_FLOAT rsqij = delij[0]*delij[0] + delij[1]*delij[1] + delij[2]*delij[2]; + const F_FLOAT rij = sqrt(rsqij); + + BOA_ij = bo_ij - thb_cut; + Delta_j = d_Delta_boc[j]; + exp_tor2_ij = exp(-p_tor2 * BOA_ij); + exp_cot2_ij = exp(-p_cot2 * SQR(BOA_ij - 1.5)); + exp_tor3_DiDj = exp(-p_tor3 * (Delta_i + Delta_j)); + exp_tor4_DiDj = exp(p_tor4 * (Delta_i + Delta_j)); + exp_tor34_inv = 1.0 / (1.0 + exp_tor3_DiDj + exp_tor4_DiDj); + f11_DiDj = (2.0 + exp_tor3_DiDj) * exp_tor34_inv; + + const int ktype = type(k); + + bo_ik = d_BO(i,k_index); + + BOA_ik = bo_ik - thb_cut; + for (int d = 0; d < 3; d ++) delik[d] = x(k,d) - x(i,d); + const F_FLOAT rsqik = delik[0]*delik[0] + delik[1]*delik[1] + delik[2]*delik[2]; + const F_FLOAT rik = sqrt(rsqik); + + cos_ijk = (delij[0]*delik[0]+delij[1]*delik[1]+delij[2]*delik[2])/(rij*rik); + if (cos_ijk > 1.0) cos_ijk = 1.0; + if (cos_ijk < -1.0) cos_ijk = -1.0; + theta_ijk = acos(cos_ijk); + + // dcos_ijk + const F_FLOAT inv_dists = 1.0 / (rij * rik); + const F_FLOAT cos_ijk_tmp = cos_ijk / ((rij*rik)*(rij*rik)); + + for (int d = 0; d < 3; d++) { + dcos_ijk_di[d] = -(delik[d] + delij[d]) * inv_dists + cos_ijk_tmp * (rsqik * delij[d] + rsqij * delik[d]); + dcos_ijk_dj[d] = delik[d] * inv_dists - cos_ijk_tmp * rsqik * delij[d]; + dcos_ijk_dk[d] = delij[d] * inv_dists - cos_ijk_tmp * rsqij * delik[d]; + } + + sin_ijk = sin(theta_ijk); + if (sin_ijk >= 0 && sin_ijk <= 1e-10) + tan_ijk_i = cos_ijk / 1e-10; + else if (sin_ijk <= 0 && sin_ijk >= -1e-10) + tan_ijk_i = -cos_ijk / 1e-10; + else tan_ijk_i = cos_ijk / sin_ijk; + + exp_tor2_ik = exp(-p_tor2 * BOA_ik); + exp_cot2_ik = exp(-p_cot2 * SQR(BOA_ik -1.5)); + + const int ltype = type(l); + + bo_jl = d_BO(j,l_index); + + for (int d = 0; d < 3; d ++) deljl[d] = x(l,d) - x(j,d); + const F_FLOAT rsqjl = deljl[0]*deljl[0] + deljl[1]*deljl[1] + deljl[2]*deljl[2]; + const F_FLOAT rjl = sqrt(rsqjl); + BOA_jl = bo_jl - thb_cut; + + cos_jil = -(delij[0]*deljl[0]+delij[1]*deljl[1]+delij[2]*deljl[2])/(rij*rjl); + if (cos_jil > 1.0) cos_jil = 1.0; + if (cos_jil < -1.0) cos_jil = -1.0; + theta_jil = acos(cos_jil); + + // dcos_jil + const F_FLOAT inv_distjl = 1.0 / (rij * rjl); + const F_FLOAT cos_jil_tmp = cos_jil / ((rij*rjl)*(rij*rjl)); + + for (int d = 0; d < 3; d++) { + dcos_jil_di[d] = deljl[d] * inv_distjl - cos_jil_tmp * rsqjl * -delij[d]; + dcos_jil_dj[d] = (-deljl[d] + delij[d]) * inv_distjl - cos_jil_tmp * (rsqjl * delij[d] + rsqij * -deljl[d]); + dcos_jil_dk[d] = -delij[d] * inv_distjl - cos_jil_tmp * rsqij * deljl[d]; + } + + sin_jil = sin(theta_jil); + if (sin_jil >= 0 && sin_jil <= 1e-10) + tan_jil_i = cos_jil / 1e-10; + else if (sin_jil <= 0 && sin_jil >= -1e-10) + tan_jil_i = -cos_jil / 1e-10; + else tan_jil_i = cos_jil / sin_jil; + + for (int d = 0; d < 3; d ++) dellk[d] = x(k,d) - x(l,d); + const F_FLOAT rsqlk = dellk[0]*dellk[0] + dellk[1]*dellk[1] + dellk[2]*dellk[2]; + const F_FLOAT rlk = sqrt(rsqlk); + + F_FLOAT unnorm_cos_omega, unnorm_sin_omega, omega; + F_FLOAT htra, htrb, htrc, hthd, hthe, hnra, hnrc, hnhd, hnhe; + F_FLOAT arg, poem, tel; + F_FLOAT cross_ij_jl[3]; + + // omega + + F_FLOAT dot_ij_jk = -(delij[0]*delik[0]+delij[1]*delik[1]+delij[2]*delik[2]); + F_FLOAT dot_ij_lj = delij[0]*deljl[0]+delij[1]*deljl[1]+delij[2]*deljl[2]; + F_FLOAT dot_ik_jl = delik[0]*deljl[0]+delik[1]*deljl[1]+delik[2]*deljl[2]; + unnorm_cos_omega = dot_ij_jk * dot_ij_lj + rsqij * dot_ik_jl; + + cross_ij_jl[0] = delij[1]*deljl[2] - delij[2]*deljl[1]; + cross_ij_jl[1] = delij[2]*deljl[0] - delij[0]*deljl[2]; + cross_ij_jl[2] = delij[0]*deljl[1] - delij[1]*deljl[0]; + + unnorm_sin_omega = -rij*(delik[0]*cross_ij_jl[0]+delik[1]*cross_ij_jl[1]+delik[2]*cross_ij_jl[2]); + omega = atan2(unnorm_sin_omega, unnorm_cos_omega); + + htra = rik + cos_ijk * (rjl * cos_jil - rij); + htrb = rij - rik * cos_ijk - rjl * cos_jil; + htrc = rjl + cos_jil * (rik * cos_ijk - rij); + hthd = rik * sin_ijk * (rij - rjl * cos_jil); + hthe = rjl * sin_jil * (rij - rik * cos_ijk); + hnra = rjl * sin_ijk * sin_jil; + hnrc = rik * sin_ijk * sin_jil; + hnhd = rik * rjl * cos_ijk * sin_jil; + hnhe = rik * rjl * sin_ijk * cos_jil; + + poem = 2.0 * rik * rjl * sin_ijk * sin_jil; + if (poem < 1e-20) poem = 1e-20; + + tel = SQR(rik) + SQR(rij) + SQR(rjl) - SQR(rlk) - + 2.0 * (rik * rij * cos_ijk - rik * rjl * cos_ijk * cos_jil + rij * rjl * cos_jil); + + F_FLOAT inv_poem = 1.0 / poem; + + arg = tel * inv_poem; + if (arg > 1.0) arg = 1.0; + if (arg < -1.0) arg = -1.0; + + F_FLOAT sin_ijk_rnd = sin_ijk; + F_FLOAT sin_jil_rnd = sin_jil; + + if (sin_ijk >= 0 && sin_ijk <= 1e-10) sin_ijk_rnd = 1e-10; + else if (sin_ijk <= 0 && sin_ijk >= -1e-10) sin_ijk_rnd = -1e-10; + if (sin_jil >= 0 && sin_jil <= 1e-10) sin_jil_rnd = 1e-10; + else if (sin_jil <= 0 && sin_jil >= -1e-10) sin_jil_rnd = -1e-10; + + cos_omega = cos(omega); + cos2omega = cos(2. * omega); + cos3omega = cos(3. * omega); + + // torsion energy + + p_tor1 = paramsfbp(ktype,itype,jtype,ltype).p_tor1; + p_cot1 = paramsfbp(ktype,itype,jtype,ltype).p_cot1; + V1 = paramsfbp(ktype,itype,jtype,ltype).V1; + V2 = paramsfbp(ktype,itype,jtype,ltype).V2; + V3 = paramsfbp(ktype,itype,jtype,ltype).V3; + + exp_tor1 = exp(p_tor1 * SQR(2.0 - d_BO_pi(i,j_index) - f11_DiDj)); + exp_tor2_jl = exp(-p_tor2 * BOA_jl); + exp_cot2_jl = exp(-p_cot2 * SQR(BOA_jl - 1.5)); + fn10 = (1.0 - exp_tor2_ik) * (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jl); + + CV = 0.5 * (V1 * (1.0 + cos_omega) + V2 * exp_tor1 * (1.0 - cos2omega) + V3 * (1.0 + cos3omega)); + + e_tor = fn10 * sin_ijk * sin_jil * CV; + if (eflag) ev.ereax[6] += e_tor; + + dfn11 = (-p_tor3 * exp_tor3_DiDj + (p_tor3 * exp_tor3_DiDj - p_tor4 * exp_tor4_DiDj) * + (2.0 + exp_tor3_DiDj) * exp_tor34_inv) * exp_tor34_inv; + + CEtors1 = sin_ijk * sin_jil * CV; + + CEtors2 = -fn10 * 2.0 * p_tor1 * V2 * exp_tor1 * (2.0 - d_BO_pi(i,j_index) - f11_DiDj) * + (1.0 - SQR(cos_omega)) * sin_ijk * sin_jil; + CEtors3 = CEtors2 * dfn11; + + CEtors4 = CEtors1 * p_tor2 * exp_tor2_ik * (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jl); + CEtors5 = CEtors1 * p_tor2 * (1.0 - exp_tor2_ik) * exp_tor2_ij * (1.0 - exp_tor2_jl); + CEtors6 = CEtors1 * p_tor2 * (1.0 - exp_tor2_ik) * (1.0 - exp_tor2_ij) * exp_tor2_jl; + + cmn = -fn10 * CV; + CEtors7 = cmn * sin_jil * tan_ijk_i; + CEtors8 = cmn * sin_ijk * tan_jil_i; + + CEtors9 = fn10 * sin_ijk * sin_jil * + (0.5 * V1 - 2.0 * V2 * exp_tor1 * cos_omega + 1.5 * V3 * (cos2omega + 2.0 * SQR(cos_omega))); + + // 4-body conjugation energy + + fn12 = exp_cot2_ik * exp_cot2_ij * exp_cot2_jl; + e_con = p_cot1 * fn12 * (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jil); + if (eflag) ev.ereax[7] += e_con; + + Cconj = -2.0 * fn12 * p_cot1 * p_cot2 * (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jil); + + CEconj1 = Cconj * (BOA_ik - 1.5e0); + CEconj2 = Cconj * (BOA_ij - 1.5e0); + CEconj3 = Cconj * (BOA_jl - 1.5e0); + + CEconj4 = -p_cot1 * fn12 * (SQR(cos_omega) - 1.0) * sin_jil * tan_ijk_i; + CEconj5 = -p_cot1 * fn12 * (SQR(cos_omega) - 1.0) * sin_ijk * tan_jil_i; + CEconj6 = 2.0 * p_cot1 * fn12 * cos_omega * sin_ijk * sin_jil; + + // forces + + // contribution to bond order + + a_Cdbopi(i,j_index) += CEtors2; + + a_CdDelta[j] += CEtors3; + a_CdDelta[i] += CEtors3; + + a_Cdbo(i,k_index) += CEtors4 + CEconj1; + a_Cdbo(i,j_index) += CEtors5 + CEconj2; + a_Cdbo(j,l_index) += CEtors6 + CEconj3; // trouble + + const F_FLOAT coeff74 = CEtors7 + CEconj4; + const F_FLOAT coeff85 = CEtors8 + CEconj5; + const F_FLOAT coeff96 = CEtors9 + CEconj6; + + const F_FLOAT inv_rij = 1.0 / rij; + const F_FLOAT inv_rik = 1.0 / rik; + const F_FLOAT inv_rjl = 1.0 / rjl; + const F_FLOAT inv_sin_ijk_rnd = 1.0 / sin_ijk_rnd; + const F_FLOAT inv_sin_jil_rnd = 1.0 / sin_jil_rnd; + + #pragma unroll + for (int d = 0; d < 3; d++) { + // dcos_omega_di + F_FLOAT dcos_omega_dk = ((htra-arg*hnra) * inv_rik) * delik[d] - dellk[d]; + dcos_omega_dk += (hthd-arg*hnhd) * inv_sin_ijk_rnd * -dcos_ijk_dk[d]; + dcos_omega_dk *= 2.0 * inv_poem; + + // dcos_omega_dj + F_FLOAT dcos_omega_di = -((htra-arg*hnra) * inv_rik) * delik[d] - htrb * inv_rij * delij[d]; + dcos_omega_di += -(hthd-arg*hnhd) * inv_sin_ijk_rnd * dcos_ijk_di[d]; + dcos_omega_di += -(hthe-arg*hnhe) * inv_sin_jil_rnd * dcos_jil_di[d]; + dcos_omega_di *= 2.0 * inv_poem; + + // dcos_omega_dk + F_FLOAT dcos_omega_dj = -((htrc-arg*hnrc) * inv_rjl) * deljl[d] + htrb * inv_rij * delij[d]; + dcos_omega_dj += -(hthd-arg*hnhd) * inv_sin_ijk_rnd * dcos_ijk_dj[d]; + dcos_omega_dj += -(hthe-arg*hnhe) * inv_sin_jil_rnd * dcos_jil_dj[d]; + dcos_omega_dj *= 2.0 * inv_poem; + + // dcos_omega_dl + F_FLOAT dcos_omega_dl = ((htrc-arg*hnrc) * inv_rjl) * deljl[d] + dellk[d]; + dcos_omega_dl += (hthe-arg*hnhe) * inv_sin_jil_rnd * -dcos_jil_dk[d]; + dcos_omega_dl *= 2.0 * inv_poem; + + // dcos_theta_ijk + fi_tmp[d] = (coeff74) * dcos_ijk_di[d]; + fj_tmp[d] = (coeff74) * dcos_ijk_dj[d]; + fk_tmp[d] = (coeff74) * dcos_ijk_dk[d]; + + // dcos_theta_jil + fi_tmp[d] += (coeff85) * dcos_jil_di[d]; + fj_tmp[d] += (coeff85) * dcos_jil_dj[d]; + F_FLOAT fl_tmp = (coeff85) * dcos_jil_dk[d]; + + // dcos_omega + fi_tmp[d] += (coeff96) * dcos_omega_di; + fj_tmp[d] += (coeff96) * dcos_omega_dj; + fk_tmp[d] += (coeff96) * dcos_omega_dk; + fl_tmp += (coeff96) * dcos_omega_dl; + + // total forces + a_f(i,d) -= fi_tmp[d]; + a_f(j,d) -= fj_tmp[d]; + a_f(k,d) -= fk_tmp[d]; + a_f(l,d) -= fl_tmp; + } + + // per-atom energy/virial tally + + if (EVFLAG) { + eng_tmp = e_tor + e_con; + //if (eflag_atom) this->template ev_tally(ev,i,j,eng_tmp,0.0,0.0,0.0,0.0); + if (eflag_atom) this->template e_tally(ev,i,j,eng_tmp); + if (vflag_either) { + for (int d = 0; d < 3; d ++) delil[d] = x(l,d) - x(i,d); + for (int d = 0; d < 3; d ++) delkl[d] = x(l,d) - x(k,d); + this->template v_tally4(ev,k,i,j,l,fk_tmp,fi_tmp,fj_tmp,delkl,delil,deljl); + } + } + + +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsionPreprocessed, const int &tpack) const { + EV_FLOAT_REAX ev; + this->template operator()(TagPairReaxComputeTorsionPreprocessed(), tpack, ev); + +} + +#else + /* ---------------------------------------------------------------------- */ template @@ -3469,6 +4495,8 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsiontemplate operator()(TagPairReaxComputeTorsion(), ii, ev); } +#endif + /* ---------------------------------------------------------------------- */ template @@ -3870,6 +4898,17 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2template v_tally(ev,k,temp,tmpvec); } @@ -3953,9 +5005,16 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2template v_tally(ev,k,temp,tmpvec); } diff --git a/src/KOKKOS/pair_reaxff_kokkos.h b/src/KOKKOS/pair_reaxff_kokkos.h index 34faabfd1e..f79bfa7a6a 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.h +++ b/src/KOKKOS/pair_reaxff_kokkos.h @@ -90,6 +90,26 @@ struct TagPairReaxComputeMulti1{}; template struct TagPairReaxComputeMulti2{}; +#ifdef OPT_ANGULAR_TORSION + +#ifdef OPT_SPLIT_COUNT_ANGULAR_TORSION +template +struct TagPairReaxCountAngular{}; + +template +struct TagPairReaxCountTorsion{}; +#else +template +struct TagPairReaxCountAngularTorsion{}; +#endif +template +struct TagPairReaxComputeAngularPreprocessed{}; + +template +struct TagPairReaxComputeTorsionPreprocessed{}; + +#else + template struct TagPairReaxComputeAngular{}; @@ -98,6 +118,8 @@ struct TagPairReaxComputeTorsionPreview{}; template struct TagPairReaxComputeTorsion{}; +#endif + template struct TagPairReaxComputeHydrogen{}; @@ -120,7 +142,7 @@ class PairReaxFFKokkos : public PairReaxFF { // "Blocking" factors to reduce thread divergence within some kernels using blocking_t = unsigned short int; - // "PairReaxFFComputeTorsionBlocking" + // "PairReaxFFComputeTorsion" static constexpr int compute_torsion_blocksize = 8; // "PairReaxBuildListsHalfBlocking" @@ -176,9 +198,28 @@ class PairReaxFFKokkos : public PairReaxFF { KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxBuildListsHalfPreview, const int&) const; + // Isolated function that builds the hbond list, reused across + // TagPairReaxBuildListsHalfBlocking, HalfBlockingPreview, HalfPreview + template + KOKKOS_INLINE_FUNCTION + void build_hb_list(F_FLOAT, int, int, int, int, int) const; + + // Isolated function that builds the bond order list, reused across + // TagPairReaxBuildListsHalfBlocking, HalfBlockingPreview, HalfPreview + // Returns if we need to populate d_d* functions or not + template + KOKKOS_INLINE_FUNCTION + bool build_bo_list(int, int, int, int, int, int&, int&) const; + KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxBuildListsFull, const int&) const; + // Isolated function that computes bond order parameters + // Returns BO_s, BO_pi, BO_pi2, C12, C34, C56 by reference + KOKKOS_INLINE_FUNCTION + void compute_bo(F_FLOAT, int, int, F_FLOAT, F_FLOAT, F_FLOAT, + F_FLOAT&, F_FLOAT&, F_FLOAT&, F_FLOAT&, F_FLOAT&, F_FLOAT&) const; + KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxZero, const int&) const; @@ -222,6 +263,53 @@ class PairReaxFFKokkos : public PairReaxFF { KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxComputeMulti2, const int&) const; +#ifdef OPT_ANGULAR_TORSION + +#ifdef OPT_SPLIT_COUNT_ANGULAR_TORSION + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairReaxCountAngular, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairReaxCountTorsion, const int&) const; +#else + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairReaxCountAngularTorsion, const int&) const; +#endif + + // Abstraction for computing SBSO2, CSBO2, dSBO1, dsBO2 + KOKKOS_INLINE_FUNCTION + void compute_angular_sbo(int, int, int, int) const; + + // Abstraction for counting and populating angular intermediates + template + KOKKOS_INLINE_FUNCTION + int preprocess_angular(int, int, int, int, int) const; + + // Abstraction for counting and populating torsion intermediated + template + KOKKOS_INLINE_FUNCTION + int preprocess_torsion(int, int, int, F_FLOAT, F_FLOAT, F_FLOAT, int, int, int) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairReaxComputeAngularPreprocessed, const int&, EV_FLOAT_REAX&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairReaxComputeAngularPreprocessed, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairReaxComputeTorsionPreprocessed, const int&, EV_FLOAT_REAX&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairReaxComputeTorsionPreprocessed, const int&) const; + +#else template KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxComputeAngular, const int&, EV_FLOAT_REAX&) const; @@ -241,6 +329,8 @@ class PairReaxFFKokkos : public PairReaxFF { KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxComputeTorsion, const int&) const; +#endif + template KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxComputeHydrogen, const int&, EV_FLOAT_REAX&) const; @@ -395,9 +485,13 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_float_1d d_bo_rij, d_hb_rsq, d_Deltap, d_Deltap_boc, d_total_bo, d_s; typename AT::t_float_1d d_Delta, d_Delta_boc, d_Delta_lp, d_dDelta_lp, d_Delta_lp_temp, d_CdDelta; - typename AT::t_ffloat_2d_dl d_BO, d_BO_s, d_BO_pi, d_BO_pi2, d_dBOp; + typename AT::t_ffloat_2d_dl d_BO, d_BO_s, d_BO_pi, d_BO_pi2; +#ifdef OPT_REDUCE_DXDYDZ + typename AT::t_ffloat_2d_dl d_dln_BOp_pi, d_dln_BOp_pi2; +#else typename AT::t_ffloat_2d_dl d_dln_BOp_pix, d_dln_BOp_piy, d_dln_BOp_piz; typename AT::t_ffloat_2d_dl d_dln_BOp_pi2x, d_dln_BOp_pi2y, d_dln_BOp_pi2z; +#endif typename AT::t_ffloat_2d_dl d_C1dbo, d_C2dbo, d_C3dbo; typename AT::t_ffloat_2d_dl d_C1dbopi, d_C2dbopi, d_C3dbopi, d_C4dbopi; typename AT::t_ffloat_2d_dl d_C1dbopi2, d_C2dbopi2, d_C3dbopi2, d_C4dbopi2; @@ -447,7 +541,11 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_int_scalar d_resize_bo, d_resize_hb; typename AT::t_ffloat_2d_dl d_sum_ovun; +#ifdef OPT_REDUCE_DXDYDZ + typename AT::t_ffloat_2d_dl d_dBOp; +#else typename AT::t_ffloat_2d_dl d_dBOpx, d_dBOpy, d_dBOpz; +#endif int neighflag, newton_pair, maxnumneigh, maxhb, maxbo; int nlocal,nn,NN,eflag,vflag,acks2_flag; @@ -480,6 +578,19 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_ffloat_1d d_buf; DAT::tdual_int_scalar k_nbuf_local; +#ifdef OPT_ANGULAR_TORSION + + typedef Kokkos::View t_reax_int4_2d; + + t_reax_int4_2d d_angular_pack, d_torsion_pack; + + typename AT::t_ffloat_2d d_angular_intermediates; + + typename AT::tdual_int_1d k_count_angular_torsion; + typename AT::t_int_1d d_count_angular_torsion; + +#else + // for fast ComputeTorsion preprocessor kernel typedef Kokkos::View t_hostpinned_int_1d; @@ -489,6 +600,7 @@ class PairReaxFFKokkos : public PairReaxFF { t_hostpinned_int_1d counters_jj_max; t_hostpinned_int_1d counters_kk_min; t_hostpinned_int_1d counters_kk_max; +#endif }; template From acd9c7950e2ef83e9793fb07bbcabb2f52afa015 Mon Sep 17 00:00:00 2001 From: davidfir3 <491197586@qq.com> Date: Thu, 31 Mar 2022 12:25:10 +0800 Subject: [PATCH 18/57] update doc and example --- doc/src/compute_fep_ta.rst | 2 + examples/PACKAGES/fep/README.md | 2 + examples/PACKAGES/fep/ta/data.spce | 6174 ++++++++++++++++++++++++++ examples/PACKAGES/fep/ta/in.spce.lmp | 49 + examples/PACKAGES/fep/ta/log.spce | 689 +++ examples/PACKAGES/fep/ta/spce.fep.ta | 22 + 6 files changed, 6938 insertions(+) create mode 100644 examples/PACKAGES/fep/ta/data.spce create mode 100644 examples/PACKAGES/fep/ta/in.spce.lmp create mode 100644 examples/PACKAGES/fep/ta/log.spce create mode 100644 examples/PACKAGES/fep/ta/spce.fep.ta diff --git a/doc/src/compute_fep_ta.rst b/doc/src/compute_fep_ta.rst index ad6b1ede82..eeb4a10915 100644 --- a/doc/src/compute_fep_ta.rst +++ b/doc/src/compute_fep_ta.rst @@ -76,6 +76,8 @@ example, the computed values can be averaged using :doc:`fix ave/time Restrictions """""""""""" +Constraints, like fix shake, may lead to incorrect values for energy difference. + This compute is distributed as the FEP package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. diff --git a/examples/PACKAGES/fep/README.md b/examples/PACKAGES/fep/README.md index d8f0935115..0ccf3d10c3 100644 --- a/examples/PACKAGES/fep/README.md +++ b/examples/PACKAGES/fep/README.md @@ -23,3 +23,5 @@ to the final states. * `quicktests` -- very short runs with charged Lennard-Jones atoms to test *compute fep*, *fix adapt/fep* and *pair lj/cut/coul/long/soft*. + +* `ta` -- surface tension of SPCE water without constraints. Test-area method. diff --git a/examples/PACKAGES/fep/ta/data.spce b/examples/PACKAGES/fep/ta/data.spce new file mode 100644 index 0000000000..7ed4c1cedc --- /dev/null +++ b/examples/PACKAGES/fep/ta/data.spce @@ -0,0 +1,6174 @@ +LAMMPS Description + + 3072 atoms + 2048 bonds + 1024 angles + 0 dihedrals + 0 impropers + + 2 atom types + 1 bond types + 1 angle types + + 0.0 30 xlo xhi + 0.0 30 ylo yhi + 0.0 100 zlo zhi + +Masses + +1 15.9994 # O +2 1.008 # H + +Atoms # full + +1 1 1 -0.8476 0.0 0.0 25.0 +2 1 2 0.4238 0.8164904 0.0 25.577359 +3 1 2 0.4238 -0.8164904 0.0 25.577359 +4 2 1 -0.8476 0.0 0.0 28.10342 +5 2 2 0.4238 0.8164904 0.0 28.680779 +6 2 2 0.4238 -0.8164904 0.0 28.680779 +7 3 1 -0.8476 0.0 0.0 31.20684 +8 3 2 0.4238 0.8164904 0.0 31.784199 +9 3 2 0.4238 -0.8164904 0.0 31.784199 +10 4 1 -0.8476 0.0 0.0 34.31026 +11 4 2 0.4238 0.8164904 0.0 34.887619 +12 4 2 0.4238 -0.8164904 0.0 34.887619 +13 5 1 -0.8476 0.0 0.0 37.41368 +14 5 2 0.4238 0.8164904 0.0 37.991039 +15 5 2 0.4238 -0.8164904 0.0 37.991039 +16 6 1 -0.8476 0.0 0.0 40.5171 +17 6 2 0.4238 0.8164904 0.0 41.094459 +18 6 2 0.4238 -0.8164904 0.0 41.094459 +19 7 1 -0.8476 0.0 0.0 43.62052 +20 7 2 0.4238 0.8164904 0.0 44.197879 +21 7 2 0.4238 -0.8164904 0.0 44.197879 +22 8 1 -0.8476 0.0 0.0 46.72394 +23 8 2 0.4238 0.8164904 0.0 47.301299 +24 8 2 0.4238 -0.8164904 0.0 47.301299 +25 9 1 -0.8476 0.0 0.0 49.82736 +26 9 2 0.4238 0.8164904 0.0 50.404719 +27 9 2 0.4238 -0.8164904 0.0 50.404719 +28 10 1 -0.8476 0.0 0.0 52.93078 +29 10 2 0.4238 0.8164904 0.0 53.508139 +30 10 2 0.4238 -0.8164904 0.0 53.508139 +31 11 1 -0.8476 0.0 0.0 56.0342 +32 11 2 0.4238 0.8164904 0.0 56.611559 +33 11 2 0.4238 -0.8164904 0.0 56.611559 +34 12 1 -0.8476 0.0 0.0 59.13762 +35 12 2 0.4238 0.8164904 0.0 59.714979 +36 12 2 0.4238 -0.8164904 0.0 59.714979 +37 13 1 -0.8476 0.0 0.0 62.24104 +38 13 2 0.4238 0.8164904 0.0 62.818399 +39 13 2 0.4238 -0.8164904 0.0 62.818399 +40 14 1 -0.8476 0.0 0.0 65.34446 +41 14 2 0.4238 0.8164904 0.0 65.921819 +42 14 2 0.4238 -0.8164904 0.0 65.921819 +43 15 1 -0.8476 0.0 0.0 68.44788 +44 15 2 0.4238 0.8164904 0.0 69.025239 +45 15 2 0.4238 -0.8164904 0.0 69.025239 +46 16 1 -0.8476 0.0 0.0 71.5513 +47 16 2 0.4238 0.8164904 0.0 72.128659 +48 16 2 0.4238 -0.8164904 0.0 72.128659 +49 17 1 -0.8476 0.0 3.10342 25.0 +50 17 2 0.4238 0.8164904 3.10342 25.577359 +51 17 2 0.4238 -0.8164904 3.10342 25.577359 +52 18 1 -0.8476 0.0 3.10342 28.10342 +53 18 2 0.4238 0.8164904 3.10342 28.680779 +54 18 2 0.4238 -0.8164904 3.10342 28.680779 +55 19 1 -0.8476 0.0 3.10342 31.20684 +56 19 2 0.4238 0.8164904 3.10342 31.784199 +57 19 2 0.4238 -0.8164904 3.10342 31.784199 +58 20 1 -0.8476 0.0 3.10342 34.31026 +59 20 2 0.4238 0.8164904 3.10342 34.887619 +60 20 2 0.4238 -0.8164904 3.10342 34.887619 +61 21 1 -0.8476 0.0 3.10342 37.41368 +62 21 2 0.4238 0.8164904 3.10342 37.991039 +63 21 2 0.4238 -0.8164904 3.10342 37.991039 +64 22 1 -0.8476 0.0 3.10342 40.5171 +65 22 2 0.4238 0.8164904 3.10342 41.094459 +66 22 2 0.4238 -0.8164904 3.10342 41.094459 +67 23 1 -0.8476 0.0 3.10342 43.62052 +68 23 2 0.4238 0.8164904 3.10342 44.197879 +69 23 2 0.4238 -0.8164904 3.10342 44.197879 +70 24 1 -0.8476 0.0 3.10342 46.72394 +71 24 2 0.4238 0.8164904 3.10342 47.301299 +72 24 2 0.4238 -0.8164904 3.10342 47.301299 +73 25 1 -0.8476 0.0 3.10342 49.82736 +74 25 2 0.4238 0.8164904 3.10342 50.404719 +75 25 2 0.4238 -0.8164904 3.10342 50.404719 +76 26 1 -0.8476 0.0 3.10342 52.93078 +77 26 2 0.4238 0.8164904 3.10342 53.508139 +78 26 2 0.4238 -0.8164904 3.10342 53.508139 +79 27 1 -0.8476 0.0 3.10342 56.0342 +80 27 2 0.4238 0.8164904 3.10342 56.611559 +81 27 2 0.4238 -0.8164904 3.10342 56.611559 +82 28 1 -0.8476 0.0 3.10342 59.13762 +83 28 2 0.4238 0.8164904 3.10342 59.714979 +84 28 2 0.4238 -0.8164904 3.10342 59.714979 +85 29 1 -0.8476 0.0 3.10342 62.24104 +86 29 2 0.4238 0.8164904 3.10342 62.818399 +87 29 2 0.4238 -0.8164904 3.10342 62.818399 +88 30 1 -0.8476 0.0 3.10342 65.34446 +89 30 2 0.4238 0.8164904 3.10342 65.921819 +90 30 2 0.4238 -0.8164904 3.10342 65.921819 +91 31 1 -0.8476 0.0 3.10342 68.44788 +92 31 2 0.4238 0.8164904 3.10342 69.025239 +93 31 2 0.4238 -0.8164904 3.10342 69.025239 +94 32 1 -0.8476 0.0 3.10342 71.5513 +95 32 2 0.4238 0.8164904 3.10342 72.128659 +96 32 2 0.4238 -0.8164904 3.10342 72.128659 +97 33 1 -0.8476 0.0 6.20684 25.0 +98 33 2 0.4238 0.8164904 6.20684 25.577359 +99 33 2 0.4238 -0.8164904 6.20684 25.577359 +100 34 1 -0.8476 0.0 6.20684 28.10342 +101 34 2 0.4238 0.8164904 6.20684 28.680779 +102 34 2 0.4238 -0.8164904 6.20684 28.680779 +103 35 1 -0.8476 0.0 6.20684 31.20684 +104 35 2 0.4238 0.8164904 6.20684 31.784199 +105 35 2 0.4238 -0.8164904 6.20684 31.784199 +106 36 1 -0.8476 0.0 6.20684 34.31026 +107 36 2 0.4238 0.8164904 6.20684 34.887619 +108 36 2 0.4238 -0.8164904 6.20684 34.887619 +109 37 1 -0.8476 0.0 6.20684 37.41368 +110 37 2 0.4238 0.8164904 6.20684 37.991039 +111 37 2 0.4238 -0.8164904 6.20684 37.991039 +112 38 1 -0.8476 0.0 6.20684 40.5171 +113 38 2 0.4238 0.8164904 6.20684 41.094459 +114 38 2 0.4238 -0.8164904 6.20684 41.094459 +115 39 1 -0.8476 0.0 6.20684 43.62052 +116 39 2 0.4238 0.8164904 6.20684 44.197879 +117 39 2 0.4238 -0.8164904 6.20684 44.197879 +118 40 1 -0.8476 0.0 6.20684 46.72394 +119 40 2 0.4238 0.8164904 6.20684 47.301299 +120 40 2 0.4238 -0.8164904 6.20684 47.301299 +121 41 1 -0.8476 0.0 6.20684 49.82736 +122 41 2 0.4238 0.8164904 6.20684 50.404719 +123 41 2 0.4238 -0.8164904 6.20684 50.404719 +124 42 1 -0.8476 0.0 6.20684 52.93078 +125 42 2 0.4238 0.8164904 6.20684 53.508139 +126 42 2 0.4238 -0.8164904 6.20684 53.508139 +127 43 1 -0.8476 0.0 6.20684 56.0342 +128 43 2 0.4238 0.8164904 6.20684 56.611559 +129 43 2 0.4238 -0.8164904 6.20684 56.611559 +130 44 1 -0.8476 0.0 6.20684 59.13762 +131 44 2 0.4238 0.8164904 6.20684 59.714979 +132 44 2 0.4238 -0.8164904 6.20684 59.714979 +133 45 1 -0.8476 0.0 6.20684 62.24104 +134 45 2 0.4238 0.8164904 6.20684 62.818399 +135 45 2 0.4238 -0.8164904 6.20684 62.818399 +136 46 1 -0.8476 0.0 6.20684 65.34446 +137 46 2 0.4238 0.8164904 6.20684 65.921819 +138 46 2 0.4238 -0.8164904 6.20684 65.921819 +139 47 1 -0.8476 0.0 6.20684 68.44788 +140 47 2 0.4238 0.8164904 6.20684 69.025239 +141 47 2 0.4238 -0.8164904 6.20684 69.025239 +142 48 1 -0.8476 0.0 6.20684 71.5513 +143 48 2 0.4238 0.8164904 6.20684 72.128659 +144 48 2 0.4238 -0.8164904 6.20684 72.128659 +145 49 1 -0.8476 0.0 9.31026 25.0 +146 49 2 0.4238 0.8164904 9.31026 25.577359 +147 49 2 0.4238 -0.8164904 9.31026 25.577359 +148 50 1 -0.8476 0.0 9.31026 28.10342 +149 50 2 0.4238 0.8164904 9.31026 28.680779 +150 50 2 0.4238 -0.8164904 9.31026 28.680779 +151 51 1 -0.8476 0.0 9.31026 31.20684 +152 51 2 0.4238 0.8164904 9.31026 31.784199 +153 51 2 0.4238 -0.8164904 9.31026 31.784199 +154 52 1 -0.8476 0.0 9.31026 34.31026 +155 52 2 0.4238 0.8164904 9.31026 34.887619 +156 52 2 0.4238 -0.8164904 9.31026 34.887619 +157 53 1 -0.8476 0.0 9.31026 37.41368 +158 53 2 0.4238 0.8164904 9.31026 37.991039 +159 53 2 0.4238 -0.8164904 9.31026 37.991039 +160 54 1 -0.8476 0.0 9.31026 40.5171 +161 54 2 0.4238 0.8164904 9.31026 41.094459 +162 54 2 0.4238 -0.8164904 9.31026 41.094459 +163 55 1 -0.8476 0.0 9.31026 43.62052 +164 55 2 0.4238 0.8164904 9.31026 44.197879 +165 55 2 0.4238 -0.8164904 9.31026 44.197879 +166 56 1 -0.8476 0.0 9.31026 46.72394 +167 56 2 0.4238 0.8164904 9.31026 47.301299 +168 56 2 0.4238 -0.8164904 9.31026 47.301299 +169 57 1 -0.8476 0.0 9.31026 49.82736 +170 57 2 0.4238 0.8164904 9.31026 50.404719 +171 57 2 0.4238 -0.8164904 9.31026 50.404719 +172 58 1 -0.8476 0.0 9.31026 52.93078 +173 58 2 0.4238 0.8164904 9.31026 53.508139 +174 58 2 0.4238 -0.8164904 9.31026 53.508139 +175 59 1 -0.8476 0.0 9.31026 56.0342 +176 59 2 0.4238 0.8164904 9.31026 56.611559 +177 59 2 0.4238 -0.8164904 9.31026 56.611559 +178 60 1 -0.8476 0.0 9.31026 59.13762 +179 60 2 0.4238 0.8164904 9.31026 59.714979 +180 60 2 0.4238 -0.8164904 9.31026 59.714979 +181 61 1 -0.8476 0.0 9.31026 62.24104 +182 61 2 0.4238 0.8164904 9.31026 62.818399 +183 61 2 0.4238 -0.8164904 9.31026 62.818399 +184 62 1 -0.8476 0.0 9.31026 65.34446 +185 62 2 0.4238 0.8164904 9.31026 65.921819 +186 62 2 0.4238 -0.8164904 9.31026 65.921819 +187 63 1 -0.8476 0.0 9.31026 68.44788 +188 63 2 0.4238 0.8164904 9.31026 69.025239 +189 63 2 0.4238 -0.8164904 9.31026 69.025239 +190 64 1 -0.8476 0.0 9.31026 71.5513 +191 64 2 0.4238 0.8164904 9.31026 72.128659 +192 64 2 0.4238 -0.8164904 9.31026 72.128659 +193 65 1 -0.8476 0.0 12.41368 25.0 +194 65 2 0.4238 0.8164904 12.41368 25.577359 +195 65 2 0.4238 -0.8164904 12.41368 25.577359 +196 66 1 -0.8476 0.0 12.41368 28.10342 +197 66 2 0.4238 0.8164904 12.41368 28.680779 +198 66 2 0.4238 -0.8164904 12.41368 28.680779 +199 67 1 -0.8476 0.0 12.41368 31.20684 +200 67 2 0.4238 0.8164904 12.41368 31.784199 +201 67 2 0.4238 -0.8164904 12.41368 31.784199 +202 68 1 -0.8476 0.0 12.41368 34.31026 +203 68 2 0.4238 0.8164904 12.41368 34.887619 +204 68 2 0.4238 -0.8164904 12.41368 34.887619 +205 69 1 -0.8476 0.0 12.41368 37.41368 +206 69 2 0.4238 0.8164904 12.41368 37.991039 +207 69 2 0.4238 -0.8164904 12.41368 37.991039 +208 70 1 -0.8476 0.0 12.41368 40.5171 +209 70 2 0.4238 0.8164904 12.41368 41.094459 +210 70 2 0.4238 -0.8164904 12.41368 41.094459 +211 71 1 -0.8476 0.0 12.41368 43.62052 +212 71 2 0.4238 0.8164904 12.41368 44.197879 +213 71 2 0.4238 -0.8164904 12.41368 44.197879 +214 72 1 -0.8476 0.0 12.41368 46.72394 +215 72 2 0.4238 0.8164904 12.41368 47.301299 +216 72 2 0.4238 -0.8164904 12.41368 47.301299 +217 73 1 -0.8476 0.0 12.41368 49.82736 +218 73 2 0.4238 0.8164904 12.41368 50.404719 +219 73 2 0.4238 -0.8164904 12.41368 50.404719 +220 74 1 -0.8476 0.0 12.41368 52.93078 +221 74 2 0.4238 0.8164904 12.41368 53.508139 +222 74 2 0.4238 -0.8164904 12.41368 53.508139 +223 75 1 -0.8476 0.0 12.41368 56.0342 +224 75 2 0.4238 0.8164904 12.41368 56.611559 +225 75 2 0.4238 -0.8164904 12.41368 56.611559 +226 76 1 -0.8476 0.0 12.41368 59.13762 +227 76 2 0.4238 0.8164904 12.41368 59.714979 +228 76 2 0.4238 -0.8164904 12.41368 59.714979 +229 77 1 -0.8476 0.0 12.41368 62.24104 +230 77 2 0.4238 0.8164904 12.41368 62.818399 +231 77 2 0.4238 -0.8164904 12.41368 62.818399 +232 78 1 -0.8476 0.0 12.41368 65.34446 +233 78 2 0.4238 0.8164904 12.41368 65.921819 +234 78 2 0.4238 -0.8164904 12.41368 65.921819 +235 79 1 -0.8476 0.0 12.41368 68.44788 +236 79 2 0.4238 0.8164904 12.41368 69.025239 +237 79 2 0.4238 -0.8164904 12.41368 69.025239 +238 80 1 -0.8476 0.0 12.41368 71.5513 +239 80 2 0.4238 0.8164904 12.41368 72.128659 +240 80 2 0.4238 -0.8164904 12.41368 72.128659 +241 81 1 -0.8476 0.0 15.5171 25.0 +242 81 2 0.4238 0.8164904 15.5171 25.577359 +243 81 2 0.4238 -0.8164904 15.5171 25.577359 +244 82 1 -0.8476 0.0 15.5171 28.10342 +245 82 2 0.4238 0.8164904 15.5171 28.680779 +246 82 2 0.4238 -0.8164904 15.5171 28.680779 +247 83 1 -0.8476 0.0 15.5171 31.20684 +248 83 2 0.4238 0.8164904 15.5171 31.784199 +249 83 2 0.4238 -0.8164904 15.5171 31.784199 +250 84 1 -0.8476 0.0 15.5171 34.31026 +251 84 2 0.4238 0.8164904 15.5171 34.887619 +252 84 2 0.4238 -0.8164904 15.5171 34.887619 +253 85 1 -0.8476 0.0 15.5171 37.41368 +254 85 2 0.4238 0.8164904 15.5171 37.991039 +255 85 2 0.4238 -0.8164904 15.5171 37.991039 +256 86 1 -0.8476 0.0 15.5171 40.5171 +257 86 2 0.4238 0.8164904 15.5171 41.094459 +258 86 2 0.4238 -0.8164904 15.5171 41.094459 +259 87 1 -0.8476 0.0 15.5171 43.62052 +260 87 2 0.4238 0.8164904 15.5171 44.197879 +261 87 2 0.4238 -0.8164904 15.5171 44.197879 +262 88 1 -0.8476 0.0 15.5171 46.72394 +263 88 2 0.4238 0.8164904 15.5171 47.301299 +264 88 2 0.4238 -0.8164904 15.5171 47.301299 +265 89 1 -0.8476 0.0 15.5171 49.82736 +266 89 2 0.4238 0.8164904 15.5171 50.404719 +267 89 2 0.4238 -0.8164904 15.5171 50.404719 +268 90 1 -0.8476 0.0 15.5171 52.93078 +269 90 2 0.4238 0.8164904 15.5171 53.508139 +270 90 2 0.4238 -0.8164904 15.5171 53.508139 +271 91 1 -0.8476 0.0 15.5171 56.0342 +272 91 2 0.4238 0.8164904 15.5171 56.611559 +273 91 2 0.4238 -0.8164904 15.5171 56.611559 +274 92 1 -0.8476 0.0 15.5171 59.13762 +275 92 2 0.4238 0.8164904 15.5171 59.714979 +276 92 2 0.4238 -0.8164904 15.5171 59.714979 +277 93 1 -0.8476 0.0 15.5171 62.24104 +278 93 2 0.4238 0.8164904 15.5171 62.818399 +279 93 2 0.4238 -0.8164904 15.5171 62.818399 +280 94 1 -0.8476 0.0 15.5171 65.34446 +281 94 2 0.4238 0.8164904 15.5171 65.921819 +282 94 2 0.4238 -0.8164904 15.5171 65.921819 +283 95 1 -0.8476 0.0 15.5171 68.44788 +284 95 2 0.4238 0.8164904 15.5171 69.025239 +285 95 2 0.4238 -0.8164904 15.5171 69.025239 +286 96 1 -0.8476 0.0 15.5171 71.5513 +287 96 2 0.4238 0.8164904 15.5171 72.128659 +288 96 2 0.4238 -0.8164904 15.5171 72.128659 +289 97 1 -0.8476 0.0 18.62052 25.0 +290 97 2 0.4238 0.8164904 18.62052 25.577359 +291 97 2 0.4238 -0.8164904 18.62052 25.577359 +292 98 1 -0.8476 0.0 18.62052 28.10342 +293 98 2 0.4238 0.8164904 18.62052 28.680779 +294 98 2 0.4238 -0.8164904 18.62052 28.680779 +295 99 1 -0.8476 0.0 18.62052 31.20684 +296 99 2 0.4238 0.8164904 18.62052 31.784199 +297 99 2 0.4238 -0.8164904 18.62052 31.784199 +298 100 1 -0.8476 0.0 18.62052 34.31026 +299 100 2 0.4238 0.8164904 18.62052 34.887619 +300 100 2 0.4238 -0.8164904 18.62052 34.887619 +301 101 1 -0.8476 0.0 18.62052 37.41368 +302 101 2 0.4238 0.8164904 18.62052 37.991039 +303 101 2 0.4238 -0.8164904 18.62052 37.991039 +304 102 1 -0.8476 0.0 18.62052 40.5171 +305 102 2 0.4238 0.8164904 18.62052 41.094459 +306 102 2 0.4238 -0.8164904 18.62052 41.094459 +307 103 1 -0.8476 0.0 18.62052 43.62052 +308 103 2 0.4238 0.8164904 18.62052 44.197879 +309 103 2 0.4238 -0.8164904 18.62052 44.197879 +310 104 1 -0.8476 0.0 18.62052 46.72394 +311 104 2 0.4238 0.8164904 18.62052 47.301299 +312 104 2 0.4238 -0.8164904 18.62052 47.301299 +313 105 1 -0.8476 0.0 18.62052 49.82736 +314 105 2 0.4238 0.8164904 18.62052 50.404719 +315 105 2 0.4238 -0.8164904 18.62052 50.404719 +316 106 1 -0.8476 0.0 18.62052 52.93078 +317 106 2 0.4238 0.8164904 18.62052 53.508139 +318 106 2 0.4238 -0.8164904 18.62052 53.508139 +319 107 1 -0.8476 0.0 18.62052 56.0342 +320 107 2 0.4238 0.8164904 18.62052 56.611559 +321 107 2 0.4238 -0.8164904 18.62052 56.611559 +322 108 1 -0.8476 0.0 18.62052 59.13762 +323 108 2 0.4238 0.8164904 18.62052 59.714979 +324 108 2 0.4238 -0.8164904 18.62052 59.714979 +325 109 1 -0.8476 0.0 18.62052 62.24104 +326 109 2 0.4238 0.8164904 18.62052 62.818399 +327 109 2 0.4238 -0.8164904 18.62052 62.818399 +328 110 1 -0.8476 0.0 18.62052 65.34446 +329 110 2 0.4238 0.8164904 18.62052 65.921819 +330 110 2 0.4238 -0.8164904 18.62052 65.921819 +331 111 1 -0.8476 0.0 18.62052 68.44788 +332 111 2 0.4238 0.8164904 18.62052 69.025239 +333 111 2 0.4238 -0.8164904 18.62052 69.025239 +334 112 1 -0.8476 0.0 18.62052 71.5513 +335 112 2 0.4238 0.8164904 18.62052 72.128659 +336 112 2 0.4238 -0.8164904 18.62052 72.128659 +337 113 1 -0.8476 0.0 21.72394 25.0 +338 113 2 0.4238 0.8164904 21.72394 25.577359 +339 113 2 0.4238 -0.8164904 21.72394 25.577359 +340 114 1 -0.8476 0.0 21.72394 28.10342 +341 114 2 0.4238 0.8164904 21.72394 28.680779 +342 114 2 0.4238 -0.8164904 21.72394 28.680779 +343 115 1 -0.8476 0.0 21.72394 31.20684 +344 115 2 0.4238 0.8164904 21.72394 31.784199 +345 115 2 0.4238 -0.8164904 21.72394 31.784199 +346 116 1 -0.8476 0.0 21.72394 34.31026 +347 116 2 0.4238 0.8164904 21.72394 34.887619 +348 116 2 0.4238 -0.8164904 21.72394 34.887619 +349 117 1 -0.8476 0.0 21.72394 37.41368 +350 117 2 0.4238 0.8164904 21.72394 37.991039 +351 117 2 0.4238 -0.8164904 21.72394 37.991039 +352 118 1 -0.8476 0.0 21.72394 40.5171 +353 118 2 0.4238 0.8164904 21.72394 41.094459 +354 118 2 0.4238 -0.8164904 21.72394 41.094459 +355 119 1 -0.8476 0.0 21.72394 43.62052 +356 119 2 0.4238 0.8164904 21.72394 44.197879 +357 119 2 0.4238 -0.8164904 21.72394 44.197879 +358 120 1 -0.8476 0.0 21.72394 46.72394 +359 120 2 0.4238 0.8164904 21.72394 47.301299 +360 120 2 0.4238 -0.8164904 21.72394 47.301299 +361 121 1 -0.8476 0.0 21.72394 49.82736 +362 121 2 0.4238 0.8164904 21.72394 50.404719 +363 121 2 0.4238 -0.8164904 21.72394 50.404719 +364 122 1 -0.8476 0.0 21.72394 52.93078 +365 122 2 0.4238 0.8164904 21.72394 53.508139 +366 122 2 0.4238 -0.8164904 21.72394 53.508139 +367 123 1 -0.8476 0.0 21.72394 56.0342 +368 123 2 0.4238 0.8164904 21.72394 56.611559 +369 123 2 0.4238 -0.8164904 21.72394 56.611559 +370 124 1 -0.8476 0.0 21.72394 59.13762 +371 124 2 0.4238 0.8164904 21.72394 59.714979 +372 124 2 0.4238 -0.8164904 21.72394 59.714979 +373 125 1 -0.8476 0.0 21.72394 62.24104 +374 125 2 0.4238 0.8164904 21.72394 62.818399 +375 125 2 0.4238 -0.8164904 21.72394 62.818399 +376 126 1 -0.8476 0.0 21.72394 65.34446 +377 126 2 0.4238 0.8164904 21.72394 65.921819 +378 126 2 0.4238 -0.8164904 21.72394 65.921819 +379 127 1 -0.8476 0.0 21.72394 68.44788 +380 127 2 0.4238 0.8164904 21.72394 69.025239 +381 127 2 0.4238 -0.8164904 21.72394 69.025239 +382 128 1 -0.8476 0.0 21.72394 71.5513 +383 128 2 0.4238 0.8164904 21.72394 72.128659 +384 128 2 0.4238 -0.8164904 21.72394 72.128659 +385 129 1 -0.8476 3.10342 0.0 25.0 +386 129 2 0.4238 3.9199104 0.0 25.577359 +387 129 2 0.4238 2.2869295999999997 0.0 25.577359 +388 130 1 -0.8476 3.10342 0.0 28.10342 +389 130 2 0.4238 3.9199104 0.0 28.680779 +390 130 2 0.4238 2.2869295999999997 0.0 28.680779 +391 131 1 -0.8476 3.10342 0.0 31.20684 +392 131 2 0.4238 3.9199104 0.0 31.784199 +393 131 2 0.4238 2.2869295999999997 0.0 31.784199 +394 132 1 -0.8476 3.10342 0.0 34.31026 +395 132 2 0.4238 3.9199104 0.0 34.887619 +396 132 2 0.4238 2.2869295999999997 0.0 34.887619 +397 133 1 -0.8476 3.10342 0.0 37.41368 +398 133 2 0.4238 3.9199104 0.0 37.991039 +399 133 2 0.4238 2.2869295999999997 0.0 37.991039 +400 134 1 -0.8476 3.10342 0.0 40.5171 +401 134 2 0.4238 3.9199104 0.0 41.094459 +402 134 2 0.4238 2.2869295999999997 0.0 41.094459 +403 135 1 -0.8476 3.10342 0.0 43.62052 +404 135 2 0.4238 3.9199104 0.0 44.197879 +405 135 2 0.4238 2.2869295999999997 0.0 44.197879 +406 136 1 -0.8476 3.10342 0.0 46.72394 +407 136 2 0.4238 3.9199104 0.0 47.301299 +408 136 2 0.4238 2.2869295999999997 0.0 47.301299 +409 137 1 -0.8476 3.10342 0.0 49.82736 +410 137 2 0.4238 3.9199104 0.0 50.404719 +411 137 2 0.4238 2.2869295999999997 0.0 50.404719 +412 138 1 -0.8476 3.10342 0.0 52.93078 +413 138 2 0.4238 3.9199104 0.0 53.508139 +414 138 2 0.4238 2.2869295999999997 0.0 53.508139 +415 139 1 -0.8476 3.10342 0.0 56.0342 +416 139 2 0.4238 3.9199104 0.0 56.611559 +417 139 2 0.4238 2.2869295999999997 0.0 56.611559 +418 140 1 -0.8476 3.10342 0.0 59.13762 +419 140 2 0.4238 3.9199104 0.0 59.714979 +420 140 2 0.4238 2.2869295999999997 0.0 59.714979 +421 141 1 -0.8476 3.10342 0.0 62.24104 +422 141 2 0.4238 3.9199104 0.0 62.818399 +423 141 2 0.4238 2.2869295999999997 0.0 62.818399 +424 142 1 -0.8476 3.10342 0.0 65.34446 +425 142 2 0.4238 3.9199104 0.0 65.921819 +426 142 2 0.4238 2.2869295999999997 0.0 65.921819 +427 143 1 -0.8476 3.10342 0.0 68.44788 +428 143 2 0.4238 3.9199104 0.0 69.025239 +429 143 2 0.4238 2.2869295999999997 0.0 69.025239 +430 144 1 -0.8476 3.10342 0.0 71.5513 +431 144 2 0.4238 3.9199104 0.0 72.128659 +432 144 2 0.4238 2.2869295999999997 0.0 72.128659 +433 145 1 -0.8476 3.10342 3.10342 25.0 +434 145 2 0.4238 3.9199104 3.10342 25.577359 +435 145 2 0.4238 2.2869295999999997 3.10342 25.577359 +436 146 1 -0.8476 3.10342 3.10342 28.10342 +437 146 2 0.4238 3.9199104 3.10342 28.680779 +438 146 2 0.4238 2.2869295999999997 3.10342 28.680779 +439 147 1 -0.8476 3.10342 3.10342 31.20684 +440 147 2 0.4238 3.9199104 3.10342 31.784199 +441 147 2 0.4238 2.2869295999999997 3.10342 31.784199 +442 148 1 -0.8476 3.10342 3.10342 34.31026 +443 148 2 0.4238 3.9199104 3.10342 34.887619 +444 148 2 0.4238 2.2869295999999997 3.10342 34.887619 +445 149 1 -0.8476 3.10342 3.10342 37.41368 +446 149 2 0.4238 3.9199104 3.10342 37.991039 +447 149 2 0.4238 2.2869295999999997 3.10342 37.991039 +448 150 1 -0.8476 3.10342 3.10342 40.5171 +449 150 2 0.4238 3.9199104 3.10342 41.094459 +450 150 2 0.4238 2.2869295999999997 3.10342 41.094459 +451 151 1 -0.8476 3.10342 3.10342 43.62052 +452 151 2 0.4238 3.9199104 3.10342 44.197879 +453 151 2 0.4238 2.2869295999999997 3.10342 44.197879 +454 152 1 -0.8476 3.10342 3.10342 46.72394 +455 152 2 0.4238 3.9199104 3.10342 47.301299 +456 152 2 0.4238 2.2869295999999997 3.10342 47.301299 +457 153 1 -0.8476 3.10342 3.10342 49.82736 +458 153 2 0.4238 3.9199104 3.10342 50.404719 +459 153 2 0.4238 2.2869295999999997 3.10342 50.404719 +460 154 1 -0.8476 3.10342 3.10342 52.93078 +461 154 2 0.4238 3.9199104 3.10342 53.508139 +462 154 2 0.4238 2.2869295999999997 3.10342 53.508139 +463 155 1 -0.8476 3.10342 3.10342 56.0342 +464 155 2 0.4238 3.9199104 3.10342 56.611559 +465 155 2 0.4238 2.2869295999999997 3.10342 56.611559 +466 156 1 -0.8476 3.10342 3.10342 59.13762 +467 156 2 0.4238 3.9199104 3.10342 59.714979 +468 156 2 0.4238 2.2869295999999997 3.10342 59.714979 +469 157 1 -0.8476 3.10342 3.10342 62.24104 +470 157 2 0.4238 3.9199104 3.10342 62.818399 +471 157 2 0.4238 2.2869295999999997 3.10342 62.818399 +472 158 1 -0.8476 3.10342 3.10342 65.34446 +473 158 2 0.4238 3.9199104 3.10342 65.921819 +474 158 2 0.4238 2.2869295999999997 3.10342 65.921819 +475 159 1 -0.8476 3.10342 3.10342 68.44788 +476 159 2 0.4238 3.9199104 3.10342 69.025239 +477 159 2 0.4238 2.2869295999999997 3.10342 69.025239 +478 160 1 -0.8476 3.10342 3.10342 71.5513 +479 160 2 0.4238 3.9199104 3.10342 72.128659 +480 160 2 0.4238 2.2869295999999997 3.10342 72.128659 +481 161 1 -0.8476 3.10342 6.20684 25.0 +482 161 2 0.4238 3.9199104 6.20684 25.577359 +483 161 2 0.4238 2.2869295999999997 6.20684 25.577359 +484 162 1 -0.8476 3.10342 6.20684 28.10342 +485 162 2 0.4238 3.9199104 6.20684 28.680779 +486 162 2 0.4238 2.2869295999999997 6.20684 28.680779 +487 163 1 -0.8476 3.10342 6.20684 31.20684 +488 163 2 0.4238 3.9199104 6.20684 31.784199 +489 163 2 0.4238 2.2869295999999997 6.20684 31.784199 +490 164 1 -0.8476 3.10342 6.20684 34.31026 +491 164 2 0.4238 3.9199104 6.20684 34.887619 +492 164 2 0.4238 2.2869295999999997 6.20684 34.887619 +493 165 1 -0.8476 3.10342 6.20684 37.41368 +494 165 2 0.4238 3.9199104 6.20684 37.991039 +495 165 2 0.4238 2.2869295999999997 6.20684 37.991039 +496 166 1 -0.8476 3.10342 6.20684 40.5171 +497 166 2 0.4238 3.9199104 6.20684 41.094459 +498 166 2 0.4238 2.2869295999999997 6.20684 41.094459 +499 167 1 -0.8476 3.10342 6.20684 43.62052 +500 167 2 0.4238 3.9199104 6.20684 44.197879 +501 167 2 0.4238 2.2869295999999997 6.20684 44.197879 +502 168 1 -0.8476 3.10342 6.20684 46.72394 +503 168 2 0.4238 3.9199104 6.20684 47.301299 +504 168 2 0.4238 2.2869295999999997 6.20684 47.301299 +505 169 1 -0.8476 3.10342 6.20684 49.82736 +506 169 2 0.4238 3.9199104 6.20684 50.404719 +507 169 2 0.4238 2.2869295999999997 6.20684 50.404719 +508 170 1 -0.8476 3.10342 6.20684 52.93078 +509 170 2 0.4238 3.9199104 6.20684 53.508139 +510 170 2 0.4238 2.2869295999999997 6.20684 53.508139 +511 171 1 -0.8476 3.10342 6.20684 56.0342 +512 171 2 0.4238 3.9199104 6.20684 56.611559 +513 171 2 0.4238 2.2869295999999997 6.20684 56.611559 +514 172 1 -0.8476 3.10342 6.20684 59.13762 +515 172 2 0.4238 3.9199104 6.20684 59.714979 +516 172 2 0.4238 2.2869295999999997 6.20684 59.714979 +517 173 1 -0.8476 3.10342 6.20684 62.24104 +518 173 2 0.4238 3.9199104 6.20684 62.818399 +519 173 2 0.4238 2.2869295999999997 6.20684 62.818399 +520 174 1 -0.8476 3.10342 6.20684 65.34446 +521 174 2 0.4238 3.9199104 6.20684 65.921819 +522 174 2 0.4238 2.2869295999999997 6.20684 65.921819 +523 175 1 -0.8476 3.10342 6.20684 68.44788 +524 175 2 0.4238 3.9199104 6.20684 69.025239 +525 175 2 0.4238 2.2869295999999997 6.20684 69.025239 +526 176 1 -0.8476 3.10342 6.20684 71.5513 +527 176 2 0.4238 3.9199104 6.20684 72.128659 +528 176 2 0.4238 2.2869295999999997 6.20684 72.128659 +529 177 1 -0.8476 3.10342 9.31026 25.0 +530 177 2 0.4238 3.9199104 9.31026 25.577359 +531 177 2 0.4238 2.2869295999999997 9.31026 25.577359 +532 178 1 -0.8476 3.10342 9.31026 28.10342 +533 178 2 0.4238 3.9199104 9.31026 28.680779 +534 178 2 0.4238 2.2869295999999997 9.31026 28.680779 +535 179 1 -0.8476 3.10342 9.31026 31.20684 +536 179 2 0.4238 3.9199104 9.31026 31.784199 +537 179 2 0.4238 2.2869295999999997 9.31026 31.784199 +538 180 1 -0.8476 3.10342 9.31026 34.31026 +539 180 2 0.4238 3.9199104 9.31026 34.887619 +540 180 2 0.4238 2.2869295999999997 9.31026 34.887619 +541 181 1 -0.8476 3.10342 9.31026 37.41368 +542 181 2 0.4238 3.9199104 9.31026 37.991039 +543 181 2 0.4238 2.2869295999999997 9.31026 37.991039 +544 182 1 -0.8476 3.10342 9.31026 40.5171 +545 182 2 0.4238 3.9199104 9.31026 41.094459 +546 182 2 0.4238 2.2869295999999997 9.31026 41.094459 +547 183 1 -0.8476 3.10342 9.31026 43.62052 +548 183 2 0.4238 3.9199104 9.31026 44.197879 +549 183 2 0.4238 2.2869295999999997 9.31026 44.197879 +550 184 1 -0.8476 3.10342 9.31026 46.72394 +551 184 2 0.4238 3.9199104 9.31026 47.301299 +552 184 2 0.4238 2.2869295999999997 9.31026 47.301299 +553 185 1 -0.8476 3.10342 9.31026 49.82736 +554 185 2 0.4238 3.9199104 9.31026 50.404719 +555 185 2 0.4238 2.2869295999999997 9.31026 50.404719 +556 186 1 -0.8476 3.10342 9.31026 52.93078 +557 186 2 0.4238 3.9199104 9.31026 53.508139 +558 186 2 0.4238 2.2869295999999997 9.31026 53.508139 +559 187 1 -0.8476 3.10342 9.31026 56.0342 +560 187 2 0.4238 3.9199104 9.31026 56.611559 +561 187 2 0.4238 2.2869295999999997 9.31026 56.611559 +562 188 1 -0.8476 3.10342 9.31026 59.13762 +563 188 2 0.4238 3.9199104 9.31026 59.714979 +564 188 2 0.4238 2.2869295999999997 9.31026 59.714979 +565 189 1 -0.8476 3.10342 9.31026 62.24104 +566 189 2 0.4238 3.9199104 9.31026 62.818399 +567 189 2 0.4238 2.2869295999999997 9.31026 62.818399 +568 190 1 -0.8476 3.10342 9.31026 65.34446 +569 190 2 0.4238 3.9199104 9.31026 65.921819 +570 190 2 0.4238 2.2869295999999997 9.31026 65.921819 +571 191 1 -0.8476 3.10342 9.31026 68.44788 +572 191 2 0.4238 3.9199104 9.31026 69.025239 +573 191 2 0.4238 2.2869295999999997 9.31026 69.025239 +574 192 1 -0.8476 3.10342 9.31026 71.5513 +575 192 2 0.4238 3.9199104 9.31026 72.128659 +576 192 2 0.4238 2.2869295999999997 9.31026 72.128659 +577 193 1 -0.8476 3.10342 12.41368 25.0 +578 193 2 0.4238 3.9199104 12.41368 25.577359 +579 193 2 0.4238 2.2869295999999997 12.41368 25.577359 +580 194 1 -0.8476 3.10342 12.41368 28.10342 +581 194 2 0.4238 3.9199104 12.41368 28.680779 +582 194 2 0.4238 2.2869295999999997 12.41368 28.680779 +583 195 1 -0.8476 3.10342 12.41368 31.20684 +584 195 2 0.4238 3.9199104 12.41368 31.784199 +585 195 2 0.4238 2.2869295999999997 12.41368 31.784199 +586 196 1 -0.8476 3.10342 12.41368 34.31026 +587 196 2 0.4238 3.9199104 12.41368 34.887619 +588 196 2 0.4238 2.2869295999999997 12.41368 34.887619 +589 197 1 -0.8476 3.10342 12.41368 37.41368 +590 197 2 0.4238 3.9199104 12.41368 37.991039 +591 197 2 0.4238 2.2869295999999997 12.41368 37.991039 +592 198 1 -0.8476 3.10342 12.41368 40.5171 +593 198 2 0.4238 3.9199104 12.41368 41.094459 +594 198 2 0.4238 2.2869295999999997 12.41368 41.094459 +595 199 1 -0.8476 3.10342 12.41368 43.62052 +596 199 2 0.4238 3.9199104 12.41368 44.197879 +597 199 2 0.4238 2.2869295999999997 12.41368 44.197879 +598 200 1 -0.8476 3.10342 12.41368 46.72394 +599 200 2 0.4238 3.9199104 12.41368 47.301299 +600 200 2 0.4238 2.2869295999999997 12.41368 47.301299 +601 201 1 -0.8476 3.10342 12.41368 49.82736 +602 201 2 0.4238 3.9199104 12.41368 50.404719 +603 201 2 0.4238 2.2869295999999997 12.41368 50.404719 +604 202 1 -0.8476 3.10342 12.41368 52.93078 +605 202 2 0.4238 3.9199104 12.41368 53.508139 +606 202 2 0.4238 2.2869295999999997 12.41368 53.508139 +607 203 1 -0.8476 3.10342 12.41368 56.0342 +608 203 2 0.4238 3.9199104 12.41368 56.611559 +609 203 2 0.4238 2.2869295999999997 12.41368 56.611559 +610 204 1 -0.8476 3.10342 12.41368 59.13762 +611 204 2 0.4238 3.9199104 12.41368 59.714979 +612 204 2 0.4238 2.2869295999999997 12.41368 59.714979 +613 205 1 -0.8476 3.10342 12.41368 62.24104 +614 205 2 0.4238 3.9199104 12.41368 62.818399 +615 205 2 0.4238 2.2869295999999997 12.41368 62.818399 +616 206 1 -0.8476 3.10342 12.41368 65.34446 +617 206 2 0.4238 3.9199104 12.41368 65.921819 +618 206 2 0.4238 2.2869295999999997 12.41368 65.921819 +619 207 1 -0.8476 3.10342 12.41368 68.44788 +620 207 2 0.4238 3.9199104 12.41368 69.025239 +621 207 2 0.4238 2.2869295999999997 12.41368 69.025239 +622 208 1 -0.8476 3.10342 12.41368 71.5513 +623 208 2 0.4238 3.9199104 12.41368 72.128659 +624 208 2 0.4238 2.2869295999999997 12.41368 72.128659 +625 209 1 -0.8476 3.10342 15.5171 25.0 +626 209 2 0.4238 3.9199104 15.5171 25.577359 +627 209 2 0.4238 2.2869295999999997 15.5171 25.577359 +628 210 1 -0.8476 3.10342 15.5171 28.10342 +629 210 2 0.4238 3.9199104 15.5171 28.680779 +630 210 2 0.4238 2.2869295999999997 15.5171 28.680779 +631 211 1 -0.8476 3.10342 15.5171 31.20684 +632 211 2 0.4238 3.9199104 15.5171 31.784199 +633 211 2 0.4238 2.2869295999999997 15.5171 31.784199 +634 212 1 -0.8476 3.10342 15.5171 34.31026 +635 212 2 0.4238 3.9199104 15.5171 34.887619 +636 212 2 0.4238 2.2869295999999997 15.5171 34.887619 +637 213 1 -0.8476 3.10342 15.5171 37.41368 +638 213 2 0.4238 3.9199104 15.5171 37.991039 +639 213 2 0.4238 2.2869295999999997 15.5171 37.991039 +640 214 1 -0.8476 3.10342 15.5171 40.5171 +641 214 2 0.4238 3.9199104 15.5171 41.094459 +642 214 2 0.4238 2.2869295999999997 15.5171 41.094459 +643 215 1 -0.8476 3.10342 15.5171 43.62052 +644 215 2 0.4238 3.9199104 15.5171 44.197879 +645 215 2 0.4238 2.2869295999999997 15.5171 44.197879 +646 216 1 -0.8476 3.10342 15.5171 46.72394 +647 216 2 0.4238 3.9199104 15.5171 47.301299 +648 216 2 0.4238 2.2869295999999997 15.5171 47.301299 +649 217 1 -0.8476 3.10342 15.5171 49.82736 +650 217 2 0.4238 3.9199104 15.5171 50.404719 +651 217 2 0.4238 2.2869295999999997 15.5171 50.404719 +652 218 1 -0.8476 3.10342 15.5171 52.93078 +653 218 2 0.4238 3.9199104 15.5171 53.508139 +654 218 2 0.4238 2.2869295999999997 15.5171 53.508139 +655 219 1 -0.8476 3.10342 15.5171 56.0342 +656 219 2 0.4238 3.9199104 15.5171 56.611559 +657 219 2 0.4238 2.2869295999999997 15.5171 56.611559 +658 220 1 -0.8476 3.10342 15.5171 59.13762 +659 220 2 0.4238 3.9199104 15.5171 59.714979 +660 220 2 0.4238 2.2869295999999997 15.5171 59.714979 +661 221 1 -0.8476 3.10342 15.5171 62.24104 +662 221 2 0.4238 3.9199104 15.5171 62.818399 +663 221 2 0.4238 2.2869295999999997 15.5171 62.818399 +664 222 1 -0.8476 3.10342 15.5171 65.34446 +665 222 2 0.4238 3.9199104 15.5171 65.921819 +666 222 2 0.4238 2.2869295999999997 15.5171 65.921819 +667 223 1 -0.8476 3.10342 15.5171 68.44788 +668 223 2 0.4238 3.9199104 15.5171 69.025239 +669 223 2 0.4238 2.2869295999999997 15.5171 69.025239 +670 224 1 -0.8476 3.10342 15.5171 71.5513 +671 224 2 0.4238 3.9199104 15.5171 72.128659 +672 224 2 0.4238 2.2869295999999997 15.5171 72.128659 +673 225 1 -0.8476 3.10342 18.62052 25.0 +674 225 2 0.4238 3.9199104 18.62052 25.577359 +675 225 2 0.4238 2.2869295999999997 18.62052 25.577359 +676 226 1 -0.8476 3.10342 18.62052 28.10342 +677 226 2 0.4238 3.9199104 18.62052 28.680779 +678 226 2 0.4238 2.2869295999999997 18.62052 28.680779 +679 227 1 -0.8476 3.10342 18.62052 31.20684 +680 227 2 0.4238 3.9199104 18.62052 31.784199 +681 227 2 0.4238 2.2869295999999997 18.62052 31.784199 +682 228 1 -0.8476 3.10342 18.62052 34.31026 +683 228 2 0.4238 3.9199104 18.62052 34.887619 +684 228 2 0.4238 2.2869295999999997 18.62052 34.887619 +685 229 1 -0.8476 3.10342 18.62052 37.41368 +686 229 2 0.4238 3.9199104 18.62052 37.991039 +687 229 2 0.4238 2.2869295999999997 18.62052 37.991039 +688 230 1 -0.8476 3.10342 18.62052 40.5171 +689 230 2 0.4238 3.9199104 18.62052 41.094459 +690 230 2 0.4238 2.2869295999999997 18.62052 41.094459 +691 231 1 -0.8476 3.10342 18.62052 43.62052 +692 231 2 0.4238 3.9199104 18.62052 44.197879 +693 231 2 0.4238 2.2869295999999997 18.62052 44.197879 +694 232 1 -0.8476 3.10342 18.62052 46.72394 +695 232 2 0.4238 3.9199104 18.62052 47.301299 +696 232 2 0.4238 2.2869295999999997 18.62052 47.301299 +697 233 1 -0.8476 3.10342 18.62052 49.82736 +698 233 2 0.4238 3.9199104 18.62052 50.404719 +699 233 2 0.4238 2.2869295999999997 18.62052 50.404719 +700 234 1 -0.8476 3.10342 18.62052 52.93078 +701 234 2 0.4238 3.9199104 18.62052 53.508139 +702 234 2 0.4238 2.2869295999999997 18.62052 53.508139 +703 235 1 -0.8476 3.10342 18.62052 56.0342 +704 235 2 0.4238 3.9199104 18.62052 56.611559 +705 235 2 0.4238 2.2869295999999997 18.62052 56.611559 +706 236 1 -0.8476 3.10342 18.62052 59.13762 +707 236 2 0.4238 3.9199104 18.62052 59.714979 +708 236 2 0.4238 2.2869295999999997 18.62052 59.714979 +709 237 1 -0.8476 3.10342 18.62052 62.24104 +710 237 2 0.4238 3.9199104 18.62052 62.818399 +711 237 2 0.4238 2.2869295999999997 18.62052 62.818399 +712 238 1 -0.8476 3.10342 18.62052 65.34446 +713 238 2 0.4238 3.9199104 18.62052 65.921819 +714 238 2 0.4238 2.2869295999999997 18.62052 65.921819 +715 239 1 -0.8476 3.10342 18.62052 68.44788 +716 239 2 0.4238 3.9199104 18.62052 69.025239 +717 239 2 0.4238 2.2869295999999997 18.62052 69.025239 +718 240 1 -0.8476 3.10342 18.62052 71.5513 +719 240 2 0.4238 3.9199104 18.62052 72.128659 +720 240 2 0.4238 2.2869295999999997 18.62052 72.128659 +721 241 1 -0.8476 3.10342 21.72394 25.0 +722 241 2 0.4238 3.9199104 21.72394 25.577359 +723 241 2 0.4238 2.2869295999999997 21.72394 25.577359 +724 242 1 -0.8476 3.10342 21.72394 28.10342 +725 242 2 0.4238 3.9199104 21.72394 28.680779 +726 242 2 0.4238 2.2869295999999997 21.72394 28.680779 +727 243 1 -0.8476 3.10342 21.72394 31.20684 +728 243 2 0.4238 3.9199104 21.72394 31.784199 +729 243 2 0.4238 2.2869295999999997 21.72394 31.784199 +730 244 1 -0.8476 3.10342 21.72394 34.31026 +731 244 2 0.4238 3.9199104 21.72394 34.887619 +732 244 2 0.4238 2.2869295999999997 21.72394 34.887619 +733 245 1 -0.8476 3.10342 21.72394 37.41368 +734 245 2 0.4238 3.9199104 21.72394 37.991039 +735 245 2 0.4238 2.2869295999999997 21.72394 37.991039 +736 246 1 -0.8476 3.10342 21.72394 40.5171 +737 246 2 0.4238 3.9199104 21.72394 41.094459 +738 246 2 0.4238 2.2869295999999997 21.72394 41.094459 +739 247 1 -0.8476 3.10342 21.72394 43.62052 +740 247 2 0.4238 3.9199104 21.72394 44.197879 +741 247 2 0.4238 2.2869295999999997 21.72394 44.197879 +742 248 1 -0.8476 3.10342 21.72394 46.72394 +743 248 2 0.4238 3.9199104 21.72394 47.301299 +744 248 2 0.4238 2.2869295999999997 21.72394 47.301299 +745 249 1 -0.8476 3.10342 21.72394 49.82736 +746 249 2 0.4238 3.9199104 21.72394 50.404719 +747 249 2 0.4238 2.2869295999999997 21.72394 50.404719 +748 250 1 -0.8476 3.10342 21.72394 52.93078 +749 250 2 0.4238 3.9199104 21.72394 53.508139 +750 250 2 0.4238 2.2869295999999997 21.72394 53.508139 +751 251 1 -0.8476 3.10342 21.72394 56.0342 +752 251 2 0.4238 3.9199104 21.72394 56.611559 +753 251 2 0.4238 2.2869295999999997 21.72394 56.611559 +754 252 1 -0.8476 3.10342 21.72394 59.13762 +755 252 2 0.4238 3.9199104 21.72394 59.714979 +756 252 2 0.4238 2.2869295999999997 21.72394 59.714979 +757 253 1 -0.8476 3.10342 21.72394 62.24104 +758 253 2 0.4238 3.9199104 21.72394 62.818399 +759 253 2 0.4238 2.2869295999999997 21.72394 62.818399 +760 254 1 -0.8476 3.10342 21.72394 65.34446 +761 254 2 0.4238 3.9199104 21.72394 65.921819 +762 254 2 0.4238 2.2869295999999997 21.72394 65.921819 +763 255 1 -0.8476 3.10342 21.72394 68.44788 +764 255 2 0.4238 3.9199104 21.72394 69.025239 +765 255 2 0.4238 2.2869295999999997 21.72394 69.025239 +766 256 1 -0.8476 3.10342 21.72394 71.5513 +767 256 2 0.4238 3.9199104 21.72394 72.128659 +768 256 2 0.4238 2.2869295999999997 21.72394 72.128659 +769 257 1 -0.8476 6.20684 0.0 25.0 +770 257 2 0.4238 7.0233304 0.0 25.577359 +771 257 2 0.4238 5.3903495999999995 0.0 25.577359 +772 258 1 -0.8476 6.20684 0.0 28.10342 +773 258 2 0.4238 7.0233304 0.0 28.680779 +774 258 2 0.4238 5.3903495999999995 0.0 28.680779 +775 259 1 -0.8476 6.20684 0.0 31.20684 +776 259 2 0.4238 7.0233304 0.0 31.784199 +777 259 2 0.4238 5.3903495999999995 0.0 31.784199 +778 260 1 -0.8476 6.20684 0.0 34.31026 +779 260 2 0.4238 7.0233304 0.0 34.887619 +780 260 2 0.4238 5.3903495999999995 0.0 34.887619 +781 261 1 -0.8476 6.20684 0.0 37.41368 +782 261 2 0.4238 7.0233304 0.0 37.991039 +783 261 2 0.4238 5.3903495999999995 0.0 37.991039 +784 262 1 -0.8476 6.20684 0.0 40.5171 +785 262 2 0.4238 7.0233304 0.0 41.094459 +786 262 2 0.4238 5.3903495999999995 0.0 41.094459 +787 263 1 -0.8476 6.20684 0.0 43.62052 +788 263 2 0.4238 7.0233304 0.0 44.197879 +789 263 2 0.4238 5.3903495999999995 0.0 44.197879 +790 264 1 -0.8476 6.20684 0.0 46.72394 +791 264 2 0.4238 7.0233304 0.0 47.301299 +792 264 2 0.4238 5.3903495999999995 0.0 47.301299 +793 265 1 -0.8476 6.20684 0.0 49.82736 +794 265 2 0.4238 7.0233304 0.0 50.404719 +795 265 2 0.4238 5.3903495999999995 0.0 50.404719 +796 266 1 -0.8476 6.20684 0.0 52.93078 +797 266 2 0.4238 7.0233304 0.0 53.508139 +798 266 2 0.4238 5.3903495999999995 0.0 53.508139 +799 267 1 -0.8476 6.20684 0.0 56.0342 +800 267 2 0.4238 7.0233304 0.0 56.611559 +801 267 2 0.4238 5.3903495999999995 0.0 56.611559 +802 268 1 -0.8476 6.20684 0.0 59.13762 +803 268 2 0.4238 7.0233304 0.0 59.714979 +804 268 2 0.4238 5.3903495999999995 0.0 59.714979 +805 269 1 -0.8476 6.20684 0.0 62.24104 +806 269 2 0.4238 7.0233304 0.0 62.818399 +807 269 2 0.4238 5.3903495999999995 0.0 62.818399 +808 270 1 -0.8476 6.20684 0.0 65.34446 +809 270 2 0.4238 7.0233304 0.0 65.921819 +810 270 2 0.4238 5.3903495999999995 0.0 65.921819 +811 271 1 -0.8476 6.20684 0.0 68.44788 +812 271 2 0.4238 7.0233304 0.0 69.025239 +813 271 2 0.4238 5.3903495999999995 0.0 69.025239 +814 272 1 -0.8476 6.20684 0.0 71.5513 +815 272 2 0.4238 7.0233304 0.0 72.128659 +816 272 2 0.4238 5.3903495999999995 0.0 72.128659 +817 273 1 -0.8476 6.20684 3.10342 25.0 +818 273 2 0.4238 7.0233304 3.10342 25.577359 +819 273 2 0.4238 5.3903495999999995 3.10342 25.577359 +820 274 1 -0.8476 6.20684 3.10342 28.10342 +821 274 2 0.4238 7.0233304 3.10342 28.680779 +822 274 2 0.4238 5.3903495999999995 3.10342 28.680779 +823 275 1 -0.8476 6.20684 3.10342 31.20684 +824 275 2 0.4238 7.0233304 3.10342 31.784199 +825 275 2 0.4238 5.3903495999999995 3.10342 31.784199 +826 276 1 -0.8476 6.20684 3.10342 34.31026 +827 276 2 0.4238 7.0233304 3.10342 34.887619 +828 276 2 0.4238 5.3903495999999995 3.10342 34.887619 +829 277 1 -0.8476 6.20684 3.10342 37.41368 +830 277 2 0.4238 7.0233304 3.10342 37.991039 +831 277 2 0.4238 5.3903495999999995 3.10342 37.991039 +832 278 1 -0.8476 6.20684 3.10342 40.5171 +833 278 2 0.4238 7.0233304 3.10342 41.094459 +834 278 2 0.4238 5.3903495999999995 3.10342 41.094459 +835 279 1 -0.8476 6.20684 3.10342 43.62052 +836 279 2 0.4238 7.0233304 3.10342 44.197879 +837 279 2 0.4238 5.3903495999999995 3.10342 44.197879 +838 280 1 -0.8476 6.20684 3.10342 46.72394 +839 280 2 0.4238 7.0233304 3.10342 47.301299 +840 280 2 0.4238 5.3903495999999995 3.10342 47.301299 +841 281 1 -0.8476 6.20684 3.10342 49.82736 +842 281 2 0.4238 7.0233304 3.10342 50.404719 +843 281 2 0.4238 5.3903495999999995 3.10342 50.404719 +844 282 1 -0.8476 6.20684 3.10342 52.93078 +845 282 2 0.4238 7.0233304 3.10342 53.508139 +846 282 2 0.4238 5.3903495999999995 3.10342 53.508139 +847 283 1 -0.8476 6.20684 3.10342 56.0342 +848 283 2 0.4238 7.0233304 3.10342 56.611559 +849 283 2 0.4238 5.3903495999999995 3.10342 56.611559 +850 284 1 -0.8476 6.20684 3.10342 59.13762 +851 284 2 0.4238 7.0233304 3.10342 59.714979 +852 284 2 0.4238 5.3903495999999995 3.10342 59.714979 +853 285 1 -0.8476 6.20684 3.10342 62.24104 +854 285 2 0.4238 7.0233304 3.10342 62.818399 +855 285 2 0.4238 5.3903495999999995 3.10342 62.818399 +856 286 1 -0.8476 6.20684 3.10342 65.34446 +857 286 2 0.4238 7.0233304 3.10342 65.921819 +858 286 2 0.4238 5.3903495999999995 3.10342 65.921819 +859 287 1 -0.8476 6.20684 3.10342 68.44788 +860 287 2 0.4238 7.0233304 3.10342 69.025239 +861 287 2 0.4238 5.3903495999999995 3.10342 69.025239 +862 288 1 -0.8476 6.20684 3.10342 71.5513 +863 288 2 0.4238 7.0233304 3.10342 72.128659 +864 288 2 0.4238 5.3903495999999995 3.10342 72.128659 +865 289 1 -0.8476 6.20684 6.20684 25.0 +866 289 2 0.4238 7.0233304 6.20684 25.577359 +867 289 2 0.4238 5.3903495999999995 6.20684 25.577359 +868 290 1 -0.8476 6.20684 6.20684 28.10342 +869 290 2 0.4238 7.0233304 6.20684 28.680779 +870 290 2 0.4238 5.3903495999999995 6.20684 28.680779 +871 291 1 -0.8476 6.20684 6.20684 31.20684 +872 291 2 0.4238 7.0233304 6.20684 31.784199 +873 291 2 0.4238 5.3903495999999995 6.20684 31.784199 +874 292 1 -0.8476 6.20684 6.20684 34.31026 +875 292 2 0.4238 7.0233304 6.20684 34.887619 +876 292 2 0.4238 5.3903495999999995 6.20684 34.887619 +877 293 1 -0.8476 6.20684 6.20684 37.41368 +878 293 2 0.4238 7.0233304 6.20684 37.991039 +879 293 2 0.4238 5.3903495999999995 6.20684 37.991039 +880 294 1 -0.8476 6.20684 6.20684 40.5171 +881 294 2 0.4238 7.0233304 6.20684 41.094459 +882 294 2 0.4238 5.3903495999999995 6.20684 41.094459 +883 295 1 -0.8476 6.20684 6.20684 43.62052 +884 295 2 0.4238 7.0233304 6.20684 44.197879 +885 295 2 0.4238 5.3903495999999995 6.20684 44.197879 +886 296 1 -0.8476 6.20684 6.20684 46.72394 +887 296 2 0.4238 7.0233304 6.20684 47.301299 +888 296 2 0.4238 5.3903495999999995 6.20684 47.301299 +889 297 1 -0.8476 6.20684 6.20684 49.82736 +890 297 2 0.4238 7.0233304 6.20684 50.404719 +891 297 2 0.4238 5.3903495999999995 6.20684 50.404719 +892 298 1 -0.8476 6.20684 6.20684 52.93078 +893 298 2 0.4238 7.0233304 6.20684 53.508139 +894 298 2 0.4238 5.3903495999999995 6.20684 53.508139 +895 299 1 -0.8476 6.20684 6.20684 56.0342 +896 299 2 0.4238 7.0233304 6.20684 56.611559 +897 299 2 0.4238 5.3903495999999995 6.20684 56.611559 +898 300 1 -0.8476 6.20684 6.20684 59.13762 +899 300 2 0.4238 7.0233304 6.20684 59.714979 +900 300 2 0.4238 5.3903495999999995 6.20684 59.714979 +901 301 1 -0.8476 6.20684 6.20684 62.24104 +902 301 2 0.4238 7.0233304 6.20684 62.818399 +903 301 2 0.4238 5.3903495999999995 6.20684 62.818399 +904 302 1 -0.8476 6.20684 6.20684 65.34446 +905 302 2 0.4238 7.0233304 6.20684 65.921819 +906 302 2 0.4238 5.3903495999999995 6.20684 65.921819 +907 303 1 -0.8476 6.20684 6.20684 68.44788 +908 303 2 0.4238 7.0233304 6.20684 69.025239 +909 303 2 0.4238 5.3903495999999995 6.20684 69.025239 +910 304 1 -0.8476 6.20684 6.20684 71.5513 +911 304 2 0.4238 7.0233304 6.20684 72.128659 +912 304 2 0.4238 5.3903495999999995 6.20684 72.128659 +913 305 1 -0.8476 6.20684 9.31026 25.0 +914 305 2 0.4238 7.0233304 9.31026 25.577359 +915 305 2 0.4238 5.3903495999999995 9.31026 25.577359 +916 306 1 -0.8476 6.20684 9.31026 28.10342 +917 306 2 0.4238 7.0233304 9.31026 28.680779 +918 306 2 0.4238 5.3903495999999995 9.31026 28.680779 +919 307 1 -0.8476 6.20684 9.31026 31.20684 +920 307 2 0.4238 7.0233304 9.31026 31.784199 +921 307 2 0.4238 5.3903495999999995 9.31026 31.784199 +922 308 1 -0.8476 6.20684 9.31026 34.31026 +923 308 2 0.4238 7.0233304 9.31026 34.887619 +924 308 2 0.4238 5.3903495999999995 9.31026 34.887619 +925 309 1 -0.8476 6.20684 9.31026 37.41368 +926 309 2 0.4238 7.0233304 9.31026 37.991039 +927 309 2 0.4238 5.3903495999999995 9.31026 37.991039 +928 310 1 -0.8476 6.20684 9.31026 40.5171 +929 310 2 0.4238 7.0233304 9.31026 41.094459 +930 310 2 0.4238 5.3903495999999995 9.31026 41.094459 +931 311 1 -0.8476 6.20684 9.31026 43.62052 +932 311 2 0.4238 7.0233304 9.31026 44.197879 +933 311 2 0.4238 5.3903495999999995 9.31026 44.197879 +934 312 1 -0.8476 6.20684 9.31026 46.72394 +935 312 2 0.4238 7.0233304 9.31026 47.301299 +936 312 2 0.4238 5.3903495999999995 9.31026 47.301299 +937 313 1 -0.8476 6.20684 9.31026 49.82736 +938 313 2 0.4238 7.0233304 9.31026 50.404719 +939 313 2 0.4238 5.3903495999999995 9.31026 50.404719 +940 314 1 -0.8476 6.20684 9.31026 52.93078 +941 314 2 0.4238 7.0233304 9.31026 53.508139 +942 314 2 0.4238 5.3903495999999995 9.31026 53.508139 +943 315 1 -0.8476 6.20684 9.31026 56.0342 +944 315 2 0.4238 7.0233304 9.31026 56.611559 +945 315 2 0.4238 5.3903495999999995 9.31026 56.611559 +946 316 1 -0.8476 6.20684 9.31026 59.13762 +947 316 2 0.4238 7.0233304 9.31026 59.714979 +948 316 2 0.4238 5.3903495999999995 9.31026 59.714979 +949 317 1 -0.8476 6.20684 9.31026 62.24104 +950 317 2 0.4238 7.0233304 9.31026 62.818399 +951 317 2 0.4238 5.3903495999999995 9.31026 62.818399 +952 318 1 -0.8476 6.20684 9.31026 65.34446 +953 318 2 0.4238 7.0233304 9.31026 65.921819 +954 318 2 0.4238 5.3903495999999995 9.31026 65.921819 +955 319 1 -0.8476 6.20684 9.31026 68.44788 +956 319 2 0.4238 7.0233304 9.31026 69.025239 +957 319 2 0.4238 5.3903495999999995 9.31026 69.025239 +958 320 1 -0.8476 6.20684 9.31026 71.5513 +959 320 2 0.4238 7.0233304 9.31026 72.128659 +960 320 2 0.4238 5.3903495999999995 9.31026 72.128659 +961 321 1 -0.8476 6.20684 12.41368 25.0 +962 321 2 0.4238 7.0233304 12.41368 25.577359 +963 321 2 0.4238 5.3903495999999995 12.41368 25.577359 +964 322 1 -0.8476 6.20684 12.41368 28.10342 +965 322 2 0.4238 7.0233304 12.41368 28.680779 +966 322 2 0.4238 5.3903495999999995 12.41368 28.680779 +967 323 1 -0.8476 6.20684 12.41368 31.20684 +968 323 2 0.4238 7.0233304 12.41368 31.784199 +969 323 2 0.4238 5.3903495999999995 12.41368 31.784199 +970 324 1 -0.8476 6.20684 12.41368 34.31026 +971 324 2 0.4238 7.0233304 12.41368 34.887619 +972 324 2 0.4238 5.3903495999999995 12.41368 34.887619 +973 325 1 -0.8476 6.20684 12.41368 37.41368 +974 325 2 0.4238 7.0233304 12.41368 37.991039 +975 325 2 0.4238 5.3903495999999995 12.41368 37.991039 +976 326 1 -0.8476 6.20684 12.41368 40.5171 +977 326 2 0.4238 7.0233304 12.41368 41.094459 +978 326 2 0.4238 5.3903495999999995 12.41368 41.094459 +979 327 1 -0.8476 6.20684 12.41368 43.62052 +980 327 2 0.4238 7.0233304 12.41368 44.197879 +981 327 2 0.4238 5.3903495999999995 12.41368 44.197879 +982 328 1 -0.8476 6.20684 12.41368 46.72394 +983 328 2 0.4238 7.0233304 12.41368 47.301299 +984 328 2 0.4238 5.3903495999999995 12.41368 47.301299 +985 329 1 -0.8476 6.20684 12.41368 49.82736 +986 329 2 0.4238 7.0233304 12.41368 50.404719 +987 329 2 0.4238 5.3903495999999995 12.41368 50.404719 +988 330 1 -0.8476 6.20684 12.41368 52.93078 +989 330 2 0.4238 7.0233304 12.41368 53.508139 +990 330 2 0.4238 5.3903495999999995 12.41368 53.508139 +991 331 1 -0.8476 6.20684 12.41368 56.0342 +992 331 2 0.4238 7.0233304 12.41368 56.611559 +993 331 2 0.4238 5.3903495999999995 12.41368 56.611559 +994 332 1 -0.8476 6.20684 12.41368 59.13762 +995 332 2 0.4238 7.0233304 12.41368 59.714979 +996 332 2 0.4238 5.3903495999999995 12.41368 59.714979 +997 333 1 -0.8476 6.20684 12.41368 62.24104 +998 333 2 0.4238 7.0233304 12.41368 62.818399 +999 333 2 0.4238 5.3903495999999995 12.41368 62.818399 +1000 334 1 -0.8476 6.20684 12.41368 65.34446 +1001 334 2 0.4238 7.0233304 12.41368 65.921819 +1002 334 2 0.4238 5.3903495999999995 12.41368 65.921819 +1003 335 1 -0.8476 6.20684 12.41368 68.44788 +1004 335 2 0.4238 7.0233304 12.41368 69.025239 +1005 335 2 0.4238 5.3903495999999995 12.41368 69.025239 +1006 336 1 -0.8476 6.20684 12.41368 71.5513 +1007 336 2 0.4238 7.0233304 12.41368 72.128659 +1008 336 2 0.4238 5.3903495999999995 12.41368 72.128659 +1009 337 1 -0.8476 6.20684 15.5171 25.0 +1010 337 2 0.4238 7.0233304 15.5171 25.577359 +1011 337 2 0.4238 5.3903495999999995 15.5171 25.577359 +1012 338 1 -0.8476 6.20684 15.5171 28.10342 +1013 338 2 0.4238 7.0233304 15.5171 28.680779 +1014 338 2 0.4238 5.3903495999999995 15.5171 28.680779 +1015 339 1 -0.8476 6.20684 15.5171 31.20684 +1016 339 2 0.4238 7.0233304 15.5171 31.784199 +1017 339 2 0.4238 5.3903495999999995 15.5171 31.784199 +1018 340 1 -0.8476 6.20684 15.5171 34.31026 +1019 340 2 0.4238 7.0233304 15.5171 34.887619 +1020 340 2 0.4238 5.3903495999999995 15.5171 34.887619 +1021 341 1 -0.8476 6.20684 15.5171 37.41368 +1022 341 2 0.4238 7.0233304 15.5171 37.991039 +1023 341 2 0.4238 5.3903495999999995 15.5171 37.991039 +1024 342 1 -0.8476 6.20684 15.5171 40.5171 +1025 342 2 0.4238 7.0233304 15.5171 41.094459 +1026 342 2 0.4238 5.3903495999999995 15.5171 41.094459 +1027 343 1 -0.8476 6.20684 15.5171 43.62052 +1028 343 2 0.4238 7.0233304 15.5171 44.197879 +1029 343 2 0.4238 5.3903495999999995 15.5171 44.197879 +1030 344 1 -0.8476 6.20684 15.5171 46.72394 +1031 344 2 0.4238 7.0233304 15.5171 47.301299 +1032 344 2 0.4238 5.3903495999999995 15.5171 47.301299 +1033 345 1 -0.8476 6.20684 15.5171 49.82736 +1034 345 2 0.4238 7.0233304 15.5171 50.404719 +1035 345 2 0.4238 5.3903495999999995 15.5171 50.404719 +1036 346 1 -0.8476 6.20684 15.5171 52.93078 +1037 346 2 0.4238 7.0233304 15.5171 53.508139 +1038 346 2 0.4238 5.3903495999999995 15.5171 53.508139 +1039 347 1 -0.8476 6.20684 15.5171 56.0342 +1040 347 2 0.4238 7.0233304 15.5171 56.611559 +1041 347 2 0.4238 5.3903495999999995 15.5171 56.611559 +1042 348 1 -0.8476 6.20684 15.5171 59.13762 +1043 348 2 0.4238 7.0233304 15.5171 59.714979 +1044 348 2 0.4238 5.3903495999999995 15.5171 59.714979 +1045 349 1 -0.8476 6.20684 15.5171 62.24104 +1046 349 2 0.4238 7.0233304 15.5171 62.818399 +1047 349 2 0.4238 5.3903495999999995 15.5171 62.818399 +1048 350 1 -0.8476 6.20684 15.5171 65.34446 +1049 350 2 0.4238 7.0233304 15.5171 65.921819 +1050 350 2 0.4238 5.3903495999999995 15.5171 65.921819 +1051 351 1 -0.8476 6.20684 15.5171 68.44788 +1052 351 2 0.4238 7.0233304 15.5171 69.025239 +1053 351 2 0.4238 5.3903495999999995 15.5171 69.025239 +1054 352 1 -0.8476 6.20684 15.5171 71.5513 +1055 352 2 0.4238 7.0233304 15.5171 72.128659 +1056 352 2 0.4238 5.3903495999999995 15.5171 72.128659 +1057 353 1 -0.8476 6.20684 18.62052 25.0 +1058 353 2 0.4238 7.0233304 18.62052 25.577359 +1059 353 2 0.4238 5.3903495999999995 18.62052 25.577359 +1060 354 1 -0.8476 6.20684 18.62052 28.10342 +1061 354 2 0.4238 7.0233304 18.62052 28.680779 +1062 354 2 0.4238 5.3903495999999995 18.62052 28.680779 +1063 355 1 -0.8476 6.20684 18.62052 31.20684 +1064 355 2 0.4238 7.0233304 18.62052 31.784199 +1065 355 2 0.4238 5.3903495999999995 18.62052 31.784199 +1066 356 1 -0.8476 6.20684 18.62052 34.31026 +1067 356 2 0.4238 7.0233304 18.62052 34.887619 +1068 356 2 0.4238 5.3903495999999995 18.62052 34.887619 +1069 357 1 -0.8476 6.20684 18.62052 37.41368 +1070 357 2 0.4238 7.0233304 18.62052 37.991039 +1071 357 2 0.4238 5.3903495999999995 18.62052 37.991039 +1072 358 1 -0.8476 6.20684 18.62052 40.5171 +1073 358 2 0.4238 7.0233304 18.62052 41.094459 +1074 358 2 0.4238 5.3903495999999995 18.62052 41.094459 +1075 359 1 -0.8476 6.20684 18.62052 43.62052 +1076 359 2 0.4238 7.0233304 18.62052 44.197879 +1077 359 2 0.4238 5.3903495999999995 18.62052 44.197879 +1078 360 1 -0.8476 6.20684 18.62052 46.72394 +1079 360 2 0.4238 7.0233304 18.62052 47.301299 +1080 360 2 0.4238 5.3903495999999995 18.62052 47.301299 +1081 361 1 -0.8476 6.20684 18.62052 49.82736 +1082 361 2 0.4238 7.0233304 18.62052 50.404719 +1083 361 2 0.4238 5.3903495999999995 18.62052 50.404719 +1084 362 1 -0.8476 6.20684 18.62052 52.93078 +1085 362 2 0.4238 7.0233304 18.62052 53.508139 +1086 362 2 0.4238 5.3903495999999995 18.62052 53.508139 +1087 363 1 -0.8476 6.20684 18.62052 56.0342 +1088 363 2 0.4238 7.0233304 18.62052 56.611559 +1089 363 2 0.4238 5.3903495999999995 18.62052 56.611559 +1090 364 1 -0.8476 6.20684 18.62052 59.13762 +1091 364 2 0.4238 7.0233304 18.62052 59.714979 +1092 364 2 0.4238 5.3903495999999995 18.62052 59.714979 +1093 365 1 -0.8476 6.20684 18.62052 62.24104 +1094 365 2 0.4238 7.0233304 18.62052 62.818399 +1095 365 2 0.4238 5.3903495999999995 18.62052 62.818399 +1096 366 1 -0.8476 6.20684 18.62052 65.34446 +1097 366 2 0.4238 7.0233304 18.62052 65.921819 +1098 366 2 0.4238 5.3903495999999995 18.62052 65.921819 +1099 367 1 -0.8476 6.20684 18.62052 68.44788 +1100 367 2 0.4238 7.0233304 18.62052 69.025239 +1101 367 2 0.4238 5.3903495999999995 18.62052 69.025239 +1102 368 1 -0.8476 6.20684 18.62052 71.5513 +1103 368 2 0.4238 7.0233304 18.62052 72.128659 +1104 368 2 0.4238 5.3903495999999995 18.62052 72.128659 +1105 369 1 -0.8476 6.20684 21.72394 25.0 +1106 369 2 0.4238 7.0233304 21.72394 25.577359 +1107 369 2 0.4238 5.3903495999999995 21.72394 25.577359 +1108 370 1 -0.8476 6.20684 21.72394 28.10342 +1109 370 2 0.4238 7.0233304 21.72394 28.680779 +1110 370 2 0.4238 5.3903495999999995 21.72394 28.680779 +1111 371 1 -0.8476 6.20684 21.72394 31.20684 +1112 371 2 0.4238 7.0233304 21.72394 31.784199 +1113 371 2 0.4238 5.3903495999999995 21.72394 31.784199 +1114 372 1 -0.8476 6.20684 21.72394 34.31026 +1115 372 2 0.4238 7.0233304 21.72394 34.887619 +1116 372 2 0.4238 5.3903495999999995 21.72394 34.887619 +1117 373 1 -0.8476 6.20684 21.72394 37.41368 +1118 373 2 0.4238 7.0233304 21.72394 37.991039 +1119 373 2 0.4238 5.3903495999999995 21.72394 37.991039 +1120 374 1 -0.8476 6.20684 21.72394 40.5171 +1121 374 2 0.4238 7.0233304 21.72394 41.094459 +1122 374 2 0.4238 5.3903495999999995 21.72394 41.094459 +1123 375 1 -0.8476 6.20684 21.72394 43.62052 +1124 375 2 0.4238 7.0233304 21.72394 44.197879 +1125 375 2 0.4238 5.3903495999999995 21.72394 44.197879 +1126 376 1 -0.8476 6.20684 21.72394 46.72394 +1127 376 2 0.4238 7.0233304 21.72394 47.301299 +1128 376 2 0.4238 5.3903495999999995 21.72394 47.301299 +1129 377 1 -0.8476 6.20684 21.72394 49.82736 +1130 377 2 0.4238 7.0233304 21.72394 50.404719 +1131 377 2 0.4238 5.3903495999999995 21.72394 50.404719 +1132 378 1 -0.8476 6.20684 21.72394 52.93078 +1133 378 2 0.4238 7.0233304 21.72394 53.508139 +1134 378 2 0.4238 5.3903495999999995 21.72394 53.508139 +1135 379 1 -0.8476 6.20684 21.72394 56.0342 +1136 379 2 0.4238 7.0233304 21.72394 56.611559 +1137 379 2 0.4238 5.3903495999999995 21.72394 56.611559 +1138 380 1 -0.8476 6.20684 21.72394 59.13762 +1139 380 2 0.4238 7.0233304 21.72394 59.714979 +1140 380 2 0.4238 5.3903495999999995 21.72394 59.714979 +1141 381 1 -0.8476 6.20684 21.72394 62.24104 +1142 381 2 0.4238 7.0233304 21.72394 62.818399 +1143 381 2 0.4238 5.3903495999999995 21.72394 62.818399 +1144 382 1 -0.8476 6.20684 21.72394 65.34446 +1145 382 2 0.4238 7.0233304 21.72394 65.921819 +1146 382 2 0.4238 5.3903495999999995 21.72394 65.921819 +1147 383 1 -0.8476 6.20684 21.72394 68.44788 +1148 383 2 0.4238 7.0233304 21.72394 69.025239 +1149 383 2 0.4238 5.3903495999999995 21.72394 69.025239 +1150 384 1 -0.8476 6.20684 21.72394 71.5513 +1151 384 2 0.4238 7.0233304 21.72394 72.128659 +1152 384 2 0.4238 5.3903495999999995 21.72394 72.128659 +1153 385 1 -0.8476 9.31026 0.0 25.0 +1154 385 2 0.4238 10.126750399999999 0.0 25.577359 +1155 385 2 0.4238 8.4937696 0.0 25.577359 +1156 386 1 -0.8476 9.31026 0.0 28.10342 +1157 386 2 0.4238 10.126750399999999 0.0 28.680779 +1158 386 2 0.4238 8.4937696 0.0 28.680779 +1159 387 1 -0.8476 9.31026 0.0 31.20684 +1160 387 2 0.4238 10.126750399999999 0.0 31.784199 +1161 387 2 0.4238 8.4937696 0.0 31.784199 +1162 388 1 -0.8476 9.31026 0.0 34.31026 +1163 388 2 0.4238 10.126750399999999 0.0 34.887619 +1164 388 2 0.4238 8.4937696 0.0 34.887619 +1165 389 1 -0.8476 9.31026 0.0 37.41368 +1166 389 2 0.4238 10.126750399999999 0.0 37.991039 +1167 389 2 0.4238 8.4937696 0.0 37.991039 +1168 390 1 -0.8476 9.31026 0.0 40.5171 +1169 390 2 0.4238 10.126750399999999 0.0 41.094459 +1170 390 2 0.4238 8.4937696 0.0 41.094459 +1171 391 1 -0.8476 9.31026 0.0 43.62052 +1172 391 2 0.4238 10.126750399999999 0.0 44.197879 +1173 391 2 0.4238 8.4937696 0.0 44.197879 +1174 392 1 -0.8476 9.31026 0.0 46.72394 +1175 392 2 0.4238 10.126750399999999 0.0 47.301299 +1176 392 2 0.4238 8.4937696 0.0 47.301299 +1177 393 1 -0.8476 9.31026 0.0 49.82736 +1178 393 2 0.4238 10.126750399999999 0.0 50.404719 +1179 393 2 0.4238 8.4937696 0.0 50.404719 +1180 394 1 -0.8476 9.31026 0.0 52.93078 +1181 394 2 0.4238 10.126750399999999 0.0 53.508139 +1182 394 2 0.4238 8.4937696 0.0 53.508139 +1183 395 1 -0.8476 9.31026 0.0 56.0342 +1184 395 2 0.4238 10.126750399999999 0.0 56.611559 +1185 395 2 0.4238 8.4937696 0.0 56.611559 +1186 396 1 -0.8476 9.31026 0.0 59.13762 +1187 396 2 0.4238 10.126750399999999 0.0 59.714979 +1188 396 2 0.4238 8.4937696 0.0 59.714979 +1189 397 1 -0.8476 9.31026 0.0 62.24104 +1190 397 2 0.4238 10.126750399999999 0.0 62.818399 +1191 397 2 0.4238 8.4937696 0.0 62.818399 +1192 398 1 -0.8476 9.31026 0.0 65.34446 +1193 398 2 0.4238 10.126750399999999 0.0 65.921819 +1194 398 2 0.4238 8.4937696 0.0 65.921819 +1195 399 1 -0.8476 9.31026 0.0 68.44788 +1196 399 2 0.4238 10.126750399999999 0.0 69.025239 +1197 399 2 0.4238 8.4937696 0.0 69.025239 +1198 400 1 -0.8476 9.31026 0.0 71.5513 +1199 400 2 0.4238 10.126750399999999 0.0 72.128659 +1200 400 2 0.4238 8.4937696 0.0 72.128659 +1201 401 1 -0.8476 9.31026 3.10342 25.0 +1202 401 2 0.4238 10.126750399999999 3.10342 25.577359 +1203 401 2 0.4238 8.4937696 3.10342 25.577359 +1204 402 1 -0.8476 9.31026 3.10342 28.10342 +1205 402 2 0.4238 10.126750399999999 3.10342 28.680779 +1206 402 2 0.4238 8.4937696 3.10342 28.680779 +1207 403 1 -0.8476 9.31026 3.10342 31.20684 +1208 403 2 0.4238 10.126750399999999 3.10342 31.784199 +1209 403 2 0.4238 8.4937696 3.10342 31.784199 +1210 404 1 -0.8476 9.31026 3.10342 34.31026 +1211 404 2 0.4238 10.126750399999999 3.10342 34.887619 +1212 404 2 0.4238 8.4937696 3.10342 34.887619 +1213 405 1 -0.8476 9.31026 3.10342 37.41368 +1214 405 2 0.4238 10.126750399999999 3.10342 37.991039 +1215 405 2 0.4238 8.4937696 3.10342 37.991039 +1216 406 1 -0.8476 9.31026 3.10342 40.5171 +1217 406 2 0.4238 10.126750399999999 3.10342 41.094459 +1218 406 2 0.4238 8.4937696 3.10342 41.094459 +1219 407 1 -0.8476 9.31026 3.10342 43.62052 +1220 407 2 0.4238 10.126750399999999 3.10342 44.197879 +1221 407 2 0.4238 8.4937696 3.10342 44.197879 +1222 408 1 -0.8476 9.31026 3.10342 46.72394 +1223 408 2 0.4238 10.126750399999999 3.10342 47.301299 +1224 408 2 0.4238 8.4937696 3.10342 47.301299 +1225 409 1 -0.8476 9.31026 3.10342 49.82736 +1226 409 2 0.4238 10.126750399999999 3.10342 50.404719 +1227 409 2 0.4238 8.4937696 3.10342 50.404719 +1228 410 1 -0.8476 9.31026 3.10342 52.93078 +1229 410 2 0.4238 10.126750399999999 3.10342 53.508139 +1230 410 2 0.4238 8.4937696 3.10342 53.508139 +1231 411 1 -0.8476 9.31026 3.10342 56.0342 +1232 411 2 0.4238 10.126750399999999 3.10342 56.611559 +1233 411 2 0.4238 8.4937696 3.10342 56.611559 +1234 412 1 -0.8476 9.31026 3.10342 59.13762 +1235 412 2 0.4238 10.126750399999999 3.10342 59.714979 +1236 412 2 0.4238 8.4937696 3.10342 59.714979 +1237 413 1 -0.8476 9.31026 3.10342 62.24104 +1238 413 2 0.4238 10.126750399999999 3.10342 62.818399 +1239 413 2 0.4238 8.4937696 3.10342 62.818399 +1240 414 1 -0.8476 9.31026 3.10342 65.34446 +1241 414 2 0.4238 10.126750399999999 3.10342 65.921819 +1242 414 2 0.4238 8.4937696 3.10342 65.921819 +1243 415 1 -0.8476 9.31026 3.10342 68.44788 +1244 415 2 0.4238 10.126750399999999 3.10342 69.025239 +1245 415 2 0.4238 8.4937696 3.10342 69.025239 +1246 416 1 -0.8476 9.31026 3.10342 71.5513 +1247 416 2 0.4238 10.126750399999999 3.10342 72.128659 +1248 416 2 0.4238 8.4937696 3.10342 72.128659 +1249 417 1 -0.8476 9.31026 6.20684 25.0 +1250 417 2 0.4238 10.126750399999999 6.20684 25.577359 +1251 417 2 0.4238 8.4937696 6.20684 25.577359 +1252 418 1 -0.8476 9.31026 6.20684 28.10342 +1253 418 2 0.4238 10.126750399999999 6.20684 28.680779 +1254 418 2 0.4238 8.4937696 6.20684 28.680779 +1255 419 1 -0.8476 9.31026 6.20684 31.20684 +1256 419 2 0.4238 10.126750399999999 6.20684 31.784199 +1257 419 2 0.4238 8.4937696 6.20684 31.784199 +1258 420 1 -0.8476 9.31026 6.20684 34.31026 +1259 420 2 0.4238 10.126750399999999 6.20684 34.887619 +1260 420 2 0.4238 8.4937696 6.20684 34.887619 +1261 421 1 -0.8476 9.31026 6.20684 37.41368 +1262 421 2 0.4238 10.126750399999999 6.20684 37.991039 +1263 421 2 0.4238 8.4937696 6.20684 37.991039 +1264 422 1 -0.8476 9.31026 6.20684 40.5171 +1265 422 2 0.4238 10.126750399999999 6.20684 41.094459 +1266 422 2 0.4238 8.4937696 6.20684 41.094459 +1267 423 1 -0.8476 9.31026 6.20684 43.62052 +1268 423 2 0.4238 10.126750399999999 6.20684 44.197879 +1269 423 2 0.4238 8.4937696 6.20684 44.197879 +1270 424 1 -0.8476 9.31026 6.20684 46.72394 +1271 424 2 0.4238 10.126750399999999 6.20684 47.301299 +1272 424 2 0.4238 8.4937696 6.20684 47.301299 +1273 425 1 -0.8476 9.31026 6.20684 49.82736 +1274 425 2 0.4238 10.126750399999999 6.20684 50.404719 +1275 425 2 0.4238 8.4937696 6.20684 50.404719 +1276 426 1 -0.8476 9.31026 6.20684 52.93078 +1277 426 2 0.4238 10.126750399999999 6.20684 53.508139 +1278 426 2 0.4238 8.4937696 6.20684 53.508139 +1279 427 1 -0.8476 9.31026 6.20684 56.0342 +1280 427 2 0.4238 10.126750399999999 6.20684 56.611559 +1281 427 2 0.4238 8.4937696 6.20684 56.611559 +1282 428 1 -0.8476 9.31026 6.20684 59.13762 +1283 428 2 0.4238 10.126750399999999 6.20684 59.714979 +1284 428 2 0.4238 8.4937696 6.20684 59.714979 +1285 429 1 -0.8476 9.31026 6.20684 62.24104 +1286 429 2 0.4238 10.126750399999999 6.20684 62.818399 +1287 429 2 0.4238 8.4937696 6.20684 62.818399 +1288 430 1 -0.8476 9.31026 6.20684 65.34446 +1289 430 2 0.4238 10.126750399999999 6.20684 65.921819 +1290 430 2 0.4238 8.4937696 6.20684 65.921819 +1291 431 1 -0.8476 9.31026 6.20684 68.44788 +1292 431 2 0.4238 10.126750399999999 6.20684 69.025239 +1293 431 2 0.4238 8.4937696 6.20684 69.025239 +1294 432 1 -0.8476 9.31026 6.20684 71.5513 +1295 432 2 0.4238 10.126750399999999 6.20684 72.128659 +1296 432 2 0.4238 8.4937696 6.20684 72.128659 +1297 433 1 -0.8476 9.31026 9.31026 25.0 +1298 433 2 0.4238 10.126750399999999 9.31026 25.577359 +1299 433 2 0.4238 8.4937696 9.31026 25.577359 +1300 434 1 -0.8476 9.31026 9.31026 28.10342 +1301 434 2 0.4238 10.126750399999999 9.31026 28.680779 +1302 434 2 0.4238 8.4937696 9.31026 28.680779 +1303 435 1 -0.8476 9.31026 9.31026 31.20684 +1304 435 2 0.4238 10.126750399999999 9.31026 31.784199 +1305 435 2 0.4238 8.4937696 9.31026 31.784199 +1306 436 1 -0.8476 9.31026 9.31026 34.31026 +1307 436 2 0.4238 10.126750399999999 9.31026 34.887619 +1308 436 2 0.4238 8.4937696 9.31026 34.887619 +1309 437 1 -0.8476 9.31026 9.31026 37.41368 +1310 437 2 0.4238 10.126750399999999 9.31026 37.991039 +1311 437 2 0.4238 8.4937696 9.31026 37.991039 +1312 438 1 -0.8476 9.31026 9.31026 40.5171 +1313 438 2 0.4238 10.126750399999999 9.31026 41.094459 +1314 438 2 0.4238 8.4937696 9.31026 41.094459 +1315 439 1 -0.8476 9.31026 9.31026 43.62052 +1316 439 2 0.4238 10.126750399999999 9.31026 44.197879 +1317 439 2 0.4238 8.4937696 9.31026 44.197879 +1318 440 1 -0.8476 9.31026 9.31026 46.72394 +1319 440 2 0.4238 10.126750399999999 9.31026 47.301299 +1320 440 2 0.4238 8.4937696 9.31026 47.301299 +1321 441 1 -0.8476 9.31026 9.31026 49.82736 +1322 441 2 0.4238 10.126750399999999 9.31026 50.404719 +1323 441 2 0.4238 8.4937696 9.31026 50.404719 +1324 442 1 -0.8476 9.31026 9.31026 52.93078 +1325 442 2 0.4238 10.126750399999999 9.31026 53.508139 +1326 442 2 0.4238 8.4937696 9.31026 53.508139 +1327 443 1 -0.8476 9.31026 9.31026 56.0342 +1328 443 2 0.4238 10.126750399999999 9.31026 56.611559 +1329 443 2 0.4238 8.4937696 9.31026 56.611559 +1330 444 1 -0.8476 9.31026 9.31026 59.13762 +1331 444 2 0.4238 10.126750399999999 9.31026 59.714979 +1332 444 2 0.4238 8.4937696 9.31026 59.714979 +1333 445 1 -0.8476 9.31026 9.31026 62.24104 +1334 445 2 0.4238 10.126750399999999 9.31026 62.818399 +1335 445 2 0.4238 8.4937696 9.31026 62.818399 +1336 446 1 -0.8476 9.31026 9.31026 65.34446 +1337 446 2 0.4238 10.126750399999999 9.31026 65.921819 +1338 446 2 0.4238 8.4937696 9.31026 65.921819 +1339 447 1 -0.8476 9.31026 9.31026 68.44788 +1340 447 2 0.4238 10.126750399999999 9.31026 69.025239 +1341 447 2 0.4238 8.4937696 9.31026 69.025239 +1342 448 1 -0.8476 9.31026 9.31026 71.5513 +1343 448 2 0.4238 10.126750399999999 9.31026 72.128659 +1344 448 2 0.4238 8.4937696 9.31026 72.128659 +1345 449 1 -0.8476 9.31026 12.41368 25.0 +1346 449 2 0.4238 10.126750399999999 12.41368 25.577359 +1347 449 2 0.4238 8.4937696 12.41368 25.577359 +1348 450 1 -0.8476 9.31026 12.41368 28.10342 +1349 450 2 0.4238 10.126750399999999 12.41368 28.680779 +1350 450 2 0.4238 8.4937696 12.41368 28.680779 +1351 451 1 -0.8476 9.31026 12.41368 31.20684 +1352 451 2 0.4238 10.126750399999999 12.41368 31.784199 +1353 451 2 0.4238 8.4937696 12.41368 31.784199 +1354 452 1 -0.8476 9.31026 12.41368 34.31026 +1355 452 2 0.4238 10.126750399999999 12.41368 34.887619 +1356 452 2 0.4238 8.4937696 12.41368 34.887619 +1357 453 1 -0.8476 9.31026 12.41368 37.41368 +1358 453 2 0.4238 10.126750399999999 12.41368 37.991039 +1359 453 2 0.4238 8.4937696 12.41368 37.991039 +1360 454 1 -0.8476 9.31026 12.41368 40.5171 +1361 454 2 0.4238 10.126750399999999 12.41368 41.094459 +1362 454 2 0.4238 8.4937696 12.41368 41.094459 +1363 455 1 -0.8476 9.31026 12.41368 43.62052 +1364 455 2 0.4238 10.126750399999999 12.41368 44.197879 +1365 455 2 0.4238 8.4937696 12.41368 44.197879 +1366 456 1 -0.8476 9.31026 12.41368 46.72394 +1367 456 2 0.4238 10.126750399999999 12.41368 47.301299 +1368 456 2 0.4238 8.4937696 12.41368 47.301299 +1369 457 1 -0.8476 9.31026 12.41368 49.82736 +1370 457 2 0.4238 10.126750399999999 12.41368 50.404719 +1371 457 2 0.4238 8.4937696 12.41368 50.404719 +1372 458 1 -0.8476 9.31026 12.41368 52.93078 +1373 458 2 0.4238 10.126750399999999 12.41368 53.508139 +1374 458 2 0.4238 8.4937696 12.41368 53.508139 +1375 459 1 -0.8476 9.31026 12.41368 56.0342 +1376 459 2 0.4238 10.126750399999999 12.41368 56.611559 +1377 459 2 0.4238 8.4937696 12.41368 56.611559 +1378 460 1 -0.8476 9.31026 12.41368 59.13762 +1379 460 2 0.4238 10.126750399999999 12.41368 59.714979 +1380 460 2 0.4238 8.4937696 12.41368 59.714979 +1381 461 1 -0.8476 9.31026 12.41368 62.24104 +1382 461 2 0.4238 10.126750399999999 12.41368 62.818399 +1383 461 2 0.4238 8.4937696 12.41368 62.818399 +1384 462 1 -0.8476 9.31026 12.41368 65.34446 +1385 462 2 0.4238 10.126750399999999 12.41368 65.921819 +1386 462 2 0.4238 8.4937696 12.41368 65.921819 +1387 463 1 -0.8476 9.31026 12.41368 68.44788 +1388 463 2 0.4238 10.126750399999999 12.41368 69.025239 +1389 463 2 0.4238 8.4937696 12.41368 69.025239 +1390 464 1 -0.8476 9.31026 12.41368 71.5513 +1391 464 2 0.4238 10.126750399999999 12.41368 72.128659 +1392 464 2 0.4238 8.4937696 12.41368 72.128659 +1393 465 1 -0.8476 9.31026 15.5171 25.0 +1394 465 2 0.4238 10.126750399999999 15.5171 25.577359 +1395 465 2 0.4238 8.4937696 15.5171 25.577359 +1396 466 1 -0.8476 9.31026 15.5171 28.10342 +1397 466 2 0.4238 10.126750399999999 15.5171 28.680779 +1398 466 2 0.4238 8.4937696 15.5171 28.680779 +1399 467 1 -0.8476 9.31026 15.5171 31.20684 +1400 467 2 0.4238 10.126750399999999 15.5171 31.784199 +1401 467 2 0.4238 8.4937696 15.5171 31.784199 +1402 468 1 -0.8476 9.31026 15.5171 34.31026 +1403 468 2 0.4238 10.126750399999999 15.5171 34.887619 +1404 468 2 0.4238 8.4937696 15.5171 34.887619 +1405 469 1 -0.8476 9.31026 15.5171 37.41368 +1406 469 2 0.4238 10.126750399999999 15.5171 37.991039 +1407 469 2 0.4238 8.4937696 15.5171 37.991039 +1408 470 1 -0.8476 9.31026 15.5171 40.5171 +1409 470 2 0.4238 10.126750399999999 15.5171 41.094459 +1410 470 2 0.4238 8.4937696 15.5171 41.094459 +1411 471 1 -0.8476 9.31026 15.5171 43.62052 +1412 471 2 0.4238 10.126750399999999 15.5171 44.197879 +1413 471 2 0.4238 8.4937696 15.5171 44.197879 +1414 472 1 -0.8476 9.31026 15.5171 46.72394 +1415 472 2 0.4238 10.126750399999999 15.5171 47.301299 +1416 472 2 0.4238 8.4937696 15.5171 47.301299 +1417 473 1 -0.8476 9.31026 15.5171 49.82736 +1418 473 2 0.4238 10.126750399999999 15.5171 50.404719 +1419 473 2 0.4238 8.4937696 15.5171 50.404719 +1420 474 1 -0.8476 9.31026 15.5171 52.93078 +1421 474 2 0.4238 10.126750399999999 15.5171 53.508139 +1422 474 2 0.4238 8.4937696 15.5171 53.508139 +1423 475 1 -0.8476 9.31026 15.5171 56.0342 +1424 475 2 0.4238 10.126750399999999 15.5171 56.611559 +1425 475 2 0.4238 8.4937696 15.5171 56.611559 +1426 476 1 -0.8476 9.31026 15.5171 59.13762 +1427 476 2 0.4238 10.126750399999999 15.5171 59.714979 +1428 476 2 0.4238 8.4937696 15.5171 59.714979 +1429 477 1 -0.8476 9.31026 15.5171 62.24104 +1430 477 2 0.4238 10.126750399999999 15.5171 62.818399 +1431 477 2 0.4238 8.4937696 15.5171 62.818399 +1432 478 1 -0.8476 9.31026 15.5171 65.34446 +1433 478 2 0.4238 10.126750399999999 15.5171 65.921819 +1434 478 2 0.4238 8.4937696 15.5171 65.921819 +1435 479 1 -0.8476 9.31026 15.5171 68.44788 +1436 479 2 0.4238 10.126750399999999 15.5171 69.025239 +1437 479 2 0.4238 8.4937696 15.5171 69.025239 +1438 480 1 -0.8476 9.31026 15.5171 71.5513 +1439 480 2 0.4238 10.126750399999999 15.5171 72.128659 +1440 480 2 0.4238 8.4937696 15.5171 72.128659 +1441 481 1 -0.8476 9.31026 18.62052 25.0 +1442 481 2 0.4238 10.126750399999999 18.62052 25.577359 +1443 481 2 0.4238 8.4937696 18.62052 25.577359 +1444 482 1 -0.8476 9.31026 18.62052 28.10342 +1445 482 2 0.4238 10.126750399999999 18.62052 28.680779 +1446 482 2 0.4238 8.4937696 18.62052 28.680779 +1447 483 1 -0.8476 9.31026 18.62052 31.20684 +1448 483 2 0.4238 10.126750399999999 18.62052 31.784199 +1449 483 2 0.4238 8.4937696 18.62052 31.784199 +1450 484 1 -0.8476 9.31026 18.62052 34.31026 +1451 484 2 0.4238 10.126750399999999 18.62052 34.887619 +1452 484 2 0.4238 8.4937696 18.62052 34.887619 +1453 485 1 -0.8476 9.31026 18.62052 37.41368 +1454 485 2 0.4238 10.126750399999999 18.62052 37.991039 +1455 485 2 0.4238 8.4937696 18.62052 37.991039 +1456 486 1 -0.8476 9.31026 18.62052 40.5171 +1457 486 2 0.4238 10.126750399999999 18.62052 41.094459 +1458 486 2 0.4238 8.4937696 18.62052 41.094459 +1459 487 1 -0.8476 9.31026 18.62052 43.62052 +1460 487 2 0.4238 10.126750399999999 18.62052 44.197879 +1461 487 2 0.4238 8.4937696 18.62052 44.197879 +1462 488 1 -0.8476 9.31026 18.62052 46.72394 +1463 488 2 0.4238 10.126750399999999 18.62052 47.301299 +1464 488 2 0.4238 8.4937696 18.62052 47.301299 +1465 489 1 -0.8476 9.31026 18.62052 49.82736 +1466 489 2 0.4238 10.126750399999999 18.62052 50.404719 +1467 489 2 0.4238 8.4937696 18.62052 50.404719 +1468 490 1 -0.8476 9.31026 18.62052 52.93078 +1469 490 2 0.4238 10.126750399999999 18.62052 53.508139 +1470 490 2 0.4238 8.4937696 18.62052 53.508139 +1471 491 1 -0.8476 9.31026 18.62052 56.0342 +1472 491 2 0.4238 10.126750399999999 18.62052 56.611559 +1473 491 2 0.4238 8.4937696 18.62052 56.611559 +1474 492 1 -0.8476 9.31026 18.62052 59.13762 +1475 492 2 0.4238 10.126750399999999 18.62052 59.714979 +1476 492 2 0.4238 8.4937696 18.62052 59.714979 +1477 493 1 -0.8476 9.31026 18.62052 62.24104 +1478 493 2 0.4238 10.126750399999999 18.62052 62.818399 +1479 493 2 0.4238 8.4937696 18.62052 62.818399 +1480 494 1 -0.8476 9.31026 18.62052 65.34446 +1481 494 2 0.4238 10.126750399999999 18.62052 65.921819 +1482 494 2 0.4238 8.4937696 18.62052 65.921819 +1483 495 1 -0.8476 9.31026 18.62052 68.44788 +1484 495 2 0.4238 10.126750399999999 18.62052 69.025239 +1485 495 2 0.4238 8.4937696 18.62052 69.025239 +1486 496 1 -0.8476 9.31026 18.62052 71.5513 +1487 496 2 0.4238 10.126750399999999 18.62052 72.128659 +1488 496 2 0.4238 8.4937696 18.62052 72.128659 +1489 497 1 -0.8476 9.31026 21.72394 25.0 +1490 497 2 0.4238 10.126750399999999 21.72394 25.577359 +1491 497 2 0.4238 8.4937696 21.72394 25.577359 +1492 498 1 -0.8476 9.31026 21.72394 28.10342 +1493 498 2 0.4238 10.126750399999999 21.72394 28.680779 +1494 498 2 0.4238 8.4937696 21.72394 28.680779 +1495 499 1 -0.8476 9.31026 21.72394 31.20684 +1496 499 2 0.4238 10.126750399999999 21.72394 31.784199 +1497 499 2 0.4238 8.4937696 21.72394 31.784199 +1498 500 1 -0.8476 9.31026 21.72394 34.31026 +1499 500 2 0.4238 10.126750399999999 21.72394 34.887619 +1500 500 2 0.4238 8.4937696 21.72394 34.887619 +1501 501 1 -0.8476 9.31026 21.72394 37.41368 +1502 501 2 0.4238 10.126750399999999 21.72394 37.991039 +1503 501 2 0.4238 8.4937696 21.72394 37.991039 +1504 502 1 -0.8476 9.31026 21.72394 40.5171 +1505 502 2 0.4238 10.126750399999999 21.72394 41.094459 +1506 502 2 0.4238 8.4937696 21.72394 41.094459 +1507 503 1 -0.8476 9.31026 21.72394 43.62052 +1508 503 2 0.4238 10.126750399999999 21.72394 44.197879 +1509 503 2 0.4238 8.4937696 21.72394 44.197879 +1510 504 1 -0.8476 9.31026 21.72394 46.72394 +1511 504 2 0.4238 10.126750399999999 21.72394 47.301299 +1512 504 2 0.4238 8.4937696 21.72394 47.301299 +1513 505 1 -0.8476 9.31026 21.72394 49.82736 +1514 505 2 0.4238 10.126750399999999 21.72394 50.404719 +1515 505 2 0.4238 8.4937696 21.72394 50.404719 +1516 506 1 -0.8476 9.31026 21.72394 52.93078 +1517 506 2 0.4238 10.126750399999999 21.72394 53.508139 +1518 506 2 0.4238 8.4937696 21.72394 53.508139 +1519 507 1 -0.8476 9.31026 21.72394 56.0342 +1520 507 2 0.4238 10.126750399999999 21.72394 56.611559 +1521 507 2 0.4238 8.4937696 21.72394 56.611559 +1522 508 1 -0.8476 9.31026 21.72394 59.13762 +1523 508 2 0.4238 10.126750399999999 21.72394 59.714979 +1524 508 2 0.4238 8.4937696 21.72394 59.714979 +1525 509 1 -0.8476 9.31026 21.72394 62.24104 +1526 509 2 0.4238 10.126750399999999 21.72394 62.818399 +1527 509 2 0.4238 8.4937696 21.72394 62.818399 +1528 510 1 -0.8476 9.31026 21.72394 65.34446 +1529 510 2 0.4238 10.126750399999999 21.72394 65.921819 +1530 510 2 0.4238 8.4937696 21.72394 65.921819 +1531 511 1 -0.8476 9.31026 21.72394 68.44788 +1532 511 2 0.4238 10.126750399999999 21.72394 69.025239 +1533 511 2 0.4238 8.4937696 21.72394 69.025239 +1534 512 1 -0.8476 9.31026 21.72394 71.5513 +1535 512 2 0.4238 10.126750399999999 21.72394 72.128659 +1536 512 2 0.4238 8.4937696 21.72394 72.128659 +1537 513 1 -0.8476 12.41368 0.0 25.0 +1538 513 2 0.4238 13.230170399999999 0.0 25.577359 +1539 513 2 0.4238 11.5971896 0.0 25.577359 +1540 514 1 -0.8476 12.41368 0.0 28.10342 +1541 514 2 0.4238 13.230170399999999 0.0 28.680779 +1542 514 2 0.4238 11.5971896 0.0 28.680779 +1543 515 1 -0.8476 12.41368 0.0 31.20684 +1544 515 2 0.4238 13.230170399999999 0.0 31.784199 +1545 515 2 0.4238 11.5971896 0.0 31.784199 +1546 516 1 -0.8476 12.41368 0.0 34.31026 +1547 516 2 0.4238 13.230170399999999 0.0 34.887619 +1548 516 2 0.4238 11.5971896 0.0 34.887619 +1549 517 1 -0.8476 12.41368 0.0 37.41368 +1550 517 2 0.4238 13.230170399999999 0.0 37.991039 +1551 517 2 0.4238 11.5971896 0.0 37.991039 +1552 518 1 -0.8476 12.41368 0.0 40.5171 +1553 518 2 0.4238 13.230170399999999 0.0 41.094459 +1554 518 2 0.4238 11.5971896 0.0 41.094459 +1555 519 1 -0.8476 12.41368 0.0 43.62052 +1556 519 2 0.4238 13.230170399999999 0.0 44.197879 +1557 519 2 0.4238 11.5971896 0.0 44.197879 +1558 520 1 -0.8476 12.41368 0.0 46.72394 +1559 520 2 0.4238 13.230170399999999 0.0 47.301299 +1560 520 2 0.4238 11.5971896 0.0 47.301299 +1561 521 1 -0.8476 12.41368 0.0 49.82736 +1562 521 2 0.4238 13.230170399999999 0.0 50.404719 +1563 521 2 0.4238 11.5971896 0.0 50.404719 +1564 522 1 -0.8476 12.41368 0.0 52.93078 +1565 522 2 0.4238 13.230170399999999 0.0 53.508139 +1566 522 2 0.4238 11.5971896 0.0 53.508139 +1567 523 1 -0.8476 12.41368 0.0 56.0342 +1568 523 2 0.4238 13.230170399999999 0.0 56.611559 +1569 523 2 0.4238 11.5971896 0.0 56.611559 +1570 524 1 -0.8476 12.41368 0.0 59.13762 +1571 524 2 0.4238 13.230170399999999 0.0 59.714979 +1572 524 2 0.4238 11.5971896 0.0 59.714979 +1573 525 1 -0.8476 12.41368 0.0 62.24104 +1574 525 2 0.4238 13.230170399999999 0.0 62.818399 +1575 525 2 0.4238 11.5971896 0.0 62.818399 +1576 526 1 -0.8476 12.41368 0.0 65.34446 +1577 526 2 0.4238 13.230170399999999 0.0 65.921819 +1578 526 2 0.4238 11.5971896 0.0 65.921819 +1579 527 1 -0.8476 12.41368 0.0 68.44788 +1580 527 2 0.4238 13.230170399999999 0.0 69.025239 +1581 527 2 0.4238 11.5971896 0.0 69.025239 +1582 528 1 -0.8476 12.41368 0.0 71.5513 +1583 528 2 0.4238 13.230170399999999 0.0 72.128659 +1584 528 2 0.4238 11.5971896 0.0 72.128659 +1585 529 1 -0.8476 12.41368 3.10342 25.0 +1586 529 2 0.4238 13.230170399999999 3.10342 25.577359 +1587 529 2 0.4238 11.5971896 3.10342 25.577359 +1588 530 1 -0.8476 12.41368 3.10342 28.10342 +1589 530 2 0.4238 13.230170399999999 3.10342 28.680779 +1590 530 2 0.4238 11.5971896 3.10342 28.680779 +1591 531 1 -0.8476 12.41368 3.10342 31.20684 +1592 531 2 0.4238 13.230170399999999 3.10342 31.784199 +1593 531 2 0.4238 11.5971896 3.10342 31.784199 +1594 532 1 -0.8476 12.41368 3.10342 34.31026 +1595 532 2 0.4238 13.230170399999999 3.10342 34.887619 +1596 532 2 0.4238 11.5971896 3.10342 34.887619 +1597 533 1 -0.8476 12.41368 3.10342 37.41368 +1598 533 2 0.4238 13.230170399999999 3.10342 37.991039 +1599 533 2 0.4238 11.5971896 3.10342 37.991039 +1600 534 1 -0.8476 12.41368 3.10342 40.5171 +1601 534 2 0.4238 13.230170399999999 3.10342 41.094459 +1602 534 2 0.4238 11.5971896 3.10342 41.094459 +1603 535 1 -0.8476 12.41368 3.10342 43.62052 +1604 535 2 0.4238 13.230170399999999 3.10342 44.197879 +1605 535 2 0.4238 11.5971896 3.10342 44.197879 +1606 536 1 -0.8476 12.41368 3.10342 46.72394 +1607 536 2 0.4238 13.230170399999999 3.10342 47.301299 +1608 536 2 0.4238 11.5971896 3.10342 47.301299 +1609 537 1 -0.8476 12.41368 3.10342 49.82736 +1610 537 2 0.4238 13.230170399999999 3.10342 50.404719 +1611 537 2 0.4238 11.5971896 3.10342 50.404719 +1612 538 1 -0.8476 12.41368 3.10342 52.93078 +1613 538 2 0.4238 13.230170399999999 3.10342 53.508139 +1614 538 2 0.4238 11.5971896 3.10342 53.508139 +1615 539 1 -0.8476 12.41368 3.10342 56.0342 +1616 539 2 0.4238 13.230170399999999 3.10342 56.611559 +1617 539 2 0.4238 11.5971896 3.10342 56.611559 +1618 540 1 -0.8476 12.41368 3.10342 59.13762 +1619 540 2 0.4238 13.230170399999999 3.10342 59.714979 +1620 540 2 0.4238 11.5971896 3.10342 59.714979 +1621 541 1 -0.8476 12.41368 3.10342 62.24104 +1622 541 2 0.4238 13.230170399999999 3.10342 62.818399 +1623 541 2 0.4238 11.5971896 3.10342 62.818399 +1624 542 1 -0.8476 12.41368 3.10342 65.34446 +1625 542 2 0.4238 13.230170399999999 3.10342 65.921819 +1626 542 2 0.4238 11.5971896 3.10342 65.921819 +1627 543 1 -0.8476 12.41368 3.10342 68.44788 +1628 543 2 0.4238 13.230170399999999 3.10342 69.025239 +1629 543 2 0.4238 11.5971896 3.10342 69.025239 +1630 544 1 -0.8476 12.41368 3.10342 71.5513 +1631 544 2 0.4238 13.230170399999999 3.10342 72.128659 +1632 544 2 0.4238 11.5971896 3.10342 72.128659 +1633 545 1 -0.8476 12.41368 6.20684 25.0 +1634 545 2 0.4238 13.230170399999999 6.20684 25.577359 +1635 545 2 0.4238 11.5971896 6.20684 25.577359 +1636 546 1 -0.8476 12.41368 6.20684 28.10342 +1637 546 2 0.4238 13.230170399999999 6.20684 28.680779 +1638 546 2 0.4238 11.5971896 6.20684 28.680779 +1639 547 1 -0.8476 12.41368 6.20684 31.20684 +1640 547 2 0.4238 13.230170399999999 6.20684 31.784199 +1641 547 2 0.4238 11.5971896 6.20684 31.784199 +1642 548 1 -0.8476 12.41368 6.20684 34.31026 +1643 548 2 0.4238 13.230170399999999 6.20684 34.887619 +1644 548 2 0.4238 11.5971896 6.20684 34.887619 +1645 549 1 -0.8476 12.41368 6.20684 37.41368 +1646 549 2 0.4238 13.230170399999999 6.20684 37.991039 +1647 549 2 0.4238 11.5971896 6.20684 37.991039 +1648 550 1 -0.8476 12.41368 6.20684 40.5171 +1649 550 2 0.4238 13.230170399999999 6.20684 41.094459 +1650 550 2 0.4238 11.5971896 6.20684 41.094459 +1651 551 1 -0.8476 12.41368 6.20684 43.62052 +1652 551 2 0.4238 13.230170399999999 6.20684 44.197879 +1653 551 2 0.4238 11.5971896 6.20684 44.197879 +1654 552 1 -0.8476 12.41368 6.20684 46.72394 +1655 552 2 0.4238 13.230170399999999 6.20684 47.301299 +1656 552 2 0.4238 11.5971896 6.20684 47.301299 +1657 553 1 -0.8476 12.41368 6.20684 49.82736 +1658 553 2 0.4238 13.230170399999999 6.20684 50.404719 +1659 553 2 0.4238 11.5971896 6.20684 50.404719 +1660 554 1 -0.8476 12.41368 6.20684 52.93078 +1661 554 2 0.4238 13.230170399999999 6.20684 53.508139 +1662 554 2 0.4238 11.5971896 6.20684 53.508139 +1663 555 1 -0.8476 12.41368 6.20684 56.0342 +1664 555 2 0.4238 13.230170399999999 6.20684 56.611559 +1665 555 2 0.4238 11.5971896 6.20684 56.611559 +1666 556 1 -0.8476 12.41368 6.20684 59.13762 +1667 556 2 0.4238 13.230170399999999 6.20684 59.714979 +1668 556 2 0.4238 11.5971896 6.20684 59.714979 +1669 557 1 -0.8476 12.41368 6.20684 62.24104 +1670 557 2 0.4238 13.230170399999999 6.20684 62.818399 +1671 557 2 0.4238 11.5971896 6.20684 62.818399 +1672 558 1 -0.8476 12.41368 6.20684 65.34446 +1673 558 2 0.4238 13.230170399999999 6.20684 65.921819 +1674 558 2 0.4238 11.5971896 6.20684 65.921819 +1675 559 1 -0.8476 12.41368 6.20684 68.44788 +1676 559 2 0.4238 13.230170399999999 6.20684 69.025239 +1677 559 2 0.4238 11.5971896 6.20684 69.025239 +1678 560 1 -0.8476 12.41368 6.20684 71.5513 +1679 560 2 0.4238 13.230170399999999 6.20684 72.128659 +1680 560 2 0.4238 11.5971896 6.20684 72.128659 +1681 561 1 -0.8476 12.41368 9.31026 25.0 +1682 561 2 0.4238 13.230170399999999 9.31026 25.577359 +1683 561 2 0.4238 11.5971896 9.31026 25.577359 +1684 562 1 -0.8476 12.41368 9.31026 28.10342 +1685 562 2 0.4238 13.230170399999999 9.31026 28.680779 +1686 562 2 0.4238 11.5971896 9.31026 28.680779 +1687 563 1 -0.8476 12.41368 9.31026 31.20684 +1688 563 2 0.4238 13.230170399999999 9.31026 31.784199 +1689 563 2 0.4238 11.5971896 9.31026 31.784199 +1690 564 1 -0.8476 12.41368 9.31026 34.31026 +1691 564 2 0.4238 13.230170399999999 9.31026 34.887619 +1692 564 2 0.4238 11.5971896 9.31026 34.887619 +1693 565 1 -0.8476 12.41368 9.31026 37.41368 +1694 565 2 0.4238 13.230170399999999 9.31026 37.991039 +1695 565 2 0.4238 11.5971896 9.31026 37.991039 +1696 566 1 -0.8476 12.41368 9.31026 40.5171 +1697 566 2 0.4238 13.230170399999999 9.31026 41.094459 +1698 566 2 0.4238 11.5971896 9.31026 41.094459 +1699 567 1 -0.8476 12.41368 9.31026 43.62052 +1700 567 2 0.4238 13.230170399999999 9.31026 44.197879 +1701 567 2 0.4238 11.5971896 9.31026 44.197879 +1702 568 1 -0.8476 12.41368 9.31026 46.72394 +1703 568 2 0.4238 13.230170399999999 9.31026 47.301299 +1704 568 2 0.4238 11.5971896 9.31026 47.301299 +1705 569 1 -0.8476 12.41368 9.31026 49.82736 +1706 569 2 0.4238 13.230170399999999 9.31026 50.404719 +1707 569 2 0.4238 11.5971896 9.31026 50.404719 +1708 570 1 -0.8476 12.41368 9.31026 52.93078 +1709 570 2 0.4238 13.230170399999999 9.31026 53.508139 +1710 570 2 0.4238 11.5971896 9.31026 53.508139 +1711 571 1 -0.8476 12.41368 9.31026 56.0342 +1712 571 2 0.4238 13.230170399999999 9.31026 56.611559 +1713 571 2 0.4238 11.5971896 9.31026 56.611559 +1714 572 1 -0.8476 12.41368 9.31026 59.13762 +1715 572 2 0.4238 13.230170399999999 9.31026 59.714979 +1716 572 2 0.4238 11.5971896 9.31026 59.714979 +1717 573 1 -0.8476 12.41368 9.31026 62.24104 +1718 573 2 0.4238 13.230170399999999 9.31026 62.818399 +1719 573 2 0.4238 11.5971896 9.31026 62.818399 +1720 574 1 -0.8476 12.41368 9.31026 65.34446 +1721 574 2 0.4238 13.230170399999999 9.31026 65.921819 +1722 574 2 0.4238 11.5971896 9.31026 65.921819 +1723 575 1 -0.8476 12.41368 9.31026 68.44788 +1724 575 2 0.4238 13.230170399999999 9.31026 69.025239 +1725 575 2 0.4238 11.5971896 9.31026 69.025239 +1726 576 1 -0.8476 12.41368 9.31026 71.5513 +1727 576 2 0.4238 13.230170399999999 9.31026 72.128659 +1728 576 2 0.4238 11.5971896 9.31026 72.128659 +1729 577 1 -0.8476 12.41368 12.41368 25.0 +1730 577 2 0.4238 13.230170399999999 12.41368 25.577359 +1731 577 2 0.4238 11.5971896 12.41368 25.577359 +1732 578 1 -0.8476 12.41368 12.41368 28.10342 +1733 578 2 0.4238 13.230170399999999 12.41368 28.680779 +1734 578 2 0.4238 11.5971896 12.41368 28.680779 +1735 579 1 -0.8476 12.41368 12.41368 31.20684 +1736 579 2 0.4238 13.230170399999999 12.41368 31.784199 +1737 579 2 0.4238 11.5971896 12.41368 31.784199 +1738 580 1 -0.8476 12.41368 12.41368 34.31026 +1739 580 2 0.4238 13.230170399999999 12.41368 34.887619 +1740 580 2 0.4238 11.5971896 12.41368 34.887619 +1741 581 1 -0.8476 12.41368 12.41368 37.41368 +1742 581 2 0.4238 13.230170399999999 12.41368 37.991039 +1743 581 2 0.4238 11.5971896 12.41368 37.991039 +1744 582 1 -0.8476 12.41368 12.41368 40.5171 +1745 582 2 0.4238 13.230170399999999 12.41368 41.094459 +1746 582 2 0.4238 11.5971896 12.41368 41.094459 +1747 583 1 -0.8476 12.41368 12.41368 43.62052 +1748 583 2 0.4238 13.230170399999999 12.41368 44.197879 +1749 583 2 0.4238 11.5971896 12.41368 44.197879 +1750 584 1 -0.8476 12.41368 12.41368 46.72394 +1751 584 2 0.4238 13.230170399999999 12.41368 47.301299 +1752 584 2 0.4238 11.5971896 12.41368 47.301299 +1753 585 1 -0.8476 12.41368 12.41368 49.82736 +1754 585 2 0.4238 13.230170399999999 12.41368 50.404719 +1755 585 2 0.4238 11.5971896 12.41368 50.404719 +1756 586 1 -0.8476 12.41368 12.41368 52.93078 +1757 586 2 0.4238 13.230170399999999 12.41368 53.508139 +1758 586 2 0.4238 11.5971896 12.41368 53.508139 +1759 587 1 -0.8476 12.41368 12.41368 56.0342 +1760 587 2 0.4238 13.230170399999999 12.41368 56.611559 +1761 587 2 0.4238 11.5971896 12.41368 56.611559 +1762 588 1 -0.8476 12.41368 12.41368 59.13762 +1763 588 2 0.4238 13.230170399999999 12.41368 59.714979 +1764 588 2 0.4238 11.5971896 12.41368 59.714979 +1765 589 1 -0.8476 12.41368 12.41368 62.24104 +1766 589 2 0.4238 13.230170399999999 12.41368 62.818399 +1767 589 2 0.4238 11.5971896 12.41368 62.818399 +1768 590 1 -0.8476 12.41368 12.41368 65.34446 +1769 590 2 0.4238 13.230170399999999 12.41368 65.921819 +1770 590 2 0.4238 11.5971896 12.41368 65.921819 +1771 591 1 -0.8476 12.41368 12.41368 68.44788 +1772 591 2 0.4238 13.230170399999999 12.41368 69.025239 +1773 591 2 0.4238 11.5971896 12.41368 69.025239 +1774 592 1 -0.8476 12.41368 12.41368 71.5513 +1775 592 2 0.4238 13.230170399999999 12.41368 72.128659 +1776 592 2 0.4238 11.5971896 12.41368 72.128659 +1777 593 1 -0.8476 12.41368 15.5171 25.0 +1778 593 2 0.4238 13.230170399999999 15.5171 25.577359 +1779 593 2 0.4238 11.5971896 15.5171 25.577359 +1780 594 1 -0.8476 12.41368 15.5171 28.10342 +1781 594 2 0.4238 13.230170399999999 15.5171 28.680779 +1782 594 2 0.4238 11.5971896 15.5171 28.680779 +1783 595 1 -0.8476 12.41368 15.5171 31.20684 +1784 595 2 0.4238 13.230170399999999 15.5171 31.784199 +1785 595 2 0.4238 11.5971896 15.5171 31.784199 +1786 596 1 -0.8476 12.41368 15.5171 34.31026 +1787 596 2 0.4238 13.230170399999999 15.5171 34.887619 +1788 596 2 0.4238 11.5971896 15.5171 34.887619 +1789 597 1 -0.8476 12.41368 15.5171 37.41368 +1790 597 2 0.4238 13.230170399999999 15.5171 37.991039 +1791 597 2 0.4238 11.5971896 15.5171 37.991039 +1792 598 1 -0.8476 12.41368 15.5171 40.5171 +1793 598 2 0.4238 13.230170399999999 15.5171 41.094459 +1794 598 2 0.4238 11.5971896 15.5171 41.094459 +1795 599 1 -0.8476 12.41368 15.5171 43.62052 +1796 599 2 0.4238 13.230170399999999 15.5171 44.197879 +1797 599 2 0.4238 11.5971896 15.5171 44.197879 +1798 600 1 -0.8476 12.41368 15.5171 46.72394 +1799 600 2 0.4238 13.230170399999999 15.5171 47.301299 +1800 600 2 0.4238 11.5971896 15.5171 47.301299 +1801 601 1 -0.8476 12.41368 15.5171 49.82736 +1802 601 2 0.4238 13.230170399999999 15.5171 50.404719 +1803 601 2 0.4238 11.5971896 15.5171 50.404719 +1804 602 1 -0.8476 12.41368 15.5171 52.93078 +1805 602 2 0.4238 13.230170399999999 15.5171 53.508139 +1806 602 2 0.4238 11.5971896 15.5171 53.508139 +1807 603 1 -0.8476 12.41368 15.5171 56.0342 +1808 603 2 0.4238 13.230170399999999 15.5171 56.611559 +1809 603 2 0.4238 11.5971896 15.5171 56.611559 +1810 604 1 -0.8476 12.41368 15.5171 59.13762 +1811 604 2 0.4238 13.230170399999999 15.5171 59.714979 +1812 604 2 0.4238 11.5971896 15.5171 59.714979 +1813 605 1 -0.8476 12.41368 15.5171 62.24104 +1814 605 2 0.4238 13.230170399999999 15.5171 62.818399 +1815 605 2 0.4238 11.5971896 15.5171 62.818399 +1816 606 1 -0.8476 12.41368 15.5171 65.34446 +1817 606 2 0.4238 13.230170399999999 15.5171 65.921819 +1818 606 2 0.4238 11.5971896 15.5171 65.921819 +1819 607 1 -0.8476 12.41368 15.5171 68.44788 +1820 607 2 0.4238 13.230170399999999 15.5171 69.025239 +1821 607 2 0.4238 11.5971896 15.5171 69.025239 +1822 608 1 -0.8476 12.41368 15.5171 71.5513 +1823 608 2 0.4238 13.230170399999999 15.5171 72.128659 +1824 608 2 0.4238 11.5971896 15.5171 72.128659 +1825 609 1 -0.8476 12.41368 18.62052 25.0 +1826 609 2 0.4238 13.230170399999999 18.62052 25.577359 +1827 609 2 0.4238 11.5971896 18.62052 25.577359 +1828 610 1 -0.8476 12.41368 18.62052 28.10342 +1829 610 2 0.4238 13.230170399999999 18.62052 28.680779 +1830 610 2 0.4238 11.5971896 18.62052 28.680779 +1831 611 1 -0.8476 12.41368 18.62052 31.20684 +1832 611 2 0.4238 13.230170399999999 18.62052 31.784199 +1833 611 2 0.4238 11.5971896 18.62052 31.784199 +1834 612 1 -0.8476 12.41368 18.62052 34.31026 +1835 612 2 0.4238 13.230170399999999 18.62052 34.887619 +1836 612 2 0.4238 11.5971896 18.62052 34.887619 +1837 613 1 -0.8476 12.41368 18.62052 37.41368 +1838 613 2 0.4238 13.230170399999999 18.62052 37.991039 +1839 613 2 0.4238 11.5971896 18.62052 37.991039 +1840 614 1 -0.8476 12.41368 18.62052 40.5171 +1841 614 2 0.4238 13.230170399999999 18.62052 41.094459 +1842 614 2 0.4238 11.5971896 18.62052 41.094459 +1843 615 1 -0.8476 12.41368 18.62052 43.62052 +1844 615 2 0.4238 13.230170399999999 18.62052 44.197879 +1845 615 2 0.4238 11.5971896 18.62052 44.197879 +1846 616 1 -0.8476 12.41368 18.62052 46.72394 +1847 616 2 0.4238 13.230170399999999 18.62052 47.301299 +1848 616 2 0.4238 11.5971896 18.62052 47.301299 +1849 617 1 -0.8476 12.41368 18.62052 49.82736 +1850 617 2 0.4238 13.230170399999999 18.62052 50.404719 +1851 617 2 0.4238 11.5971896 18.62052 50.404719 +1852 618 1 -0.8476 12.41368 18.62052 52.93078 +1853 618 2 0.4238 13.230170399999999 18.62052 53.508139 +1854 618 2 0.4238 11.5971896 18.62052 53.508139 +1855 619 1 -0.8476 12.41368 18.62052 56.0342 +1856 619 2 0.4238 13.230170399999999 18.62052 56.611559 +1857 619 2 0.4238 11.5971896 18.62052 56.611559 +1858 620 1 -0.8476 12.41368 18.62052 59.13762 +1859 620 2 0.4238 13.230170399999999 18.62052 59.714979 +1860 620 2 0.4238 11.5971896 18.62052 59.714979 +1861 621 1 -0.8476 12.41368 18.62052 62.24104 +1862 621 2 0.4238 13.230170399999999 18.62052 62.818399 +1863 621 2 0.4238 11.5971896 18.62052 62.818399 +1864 622 1 -0.8476 12.41368 18.62052 65.34446 +1865 622 2 0.4238 13.230170399999999 18.62052 65.921819 +1866 622 2 0.4238 11.5971896 18.62052 65.921819 +1867 623 1 -0.8476 12.41368 18.62052 68.44788 +1868 623 2 0.4238 13.230170399999999 18.62052 69.025239 +1869 623 2 0.4238 11.5971896 18.62052 69.025239 +1870 624 1 -0.8476 12.41368 18.62052 71.5513 +1871 624 2 0.4238 13.230170399999999 18.62052 72.128659 +1872 624 2 0.4238 11.5971896 18.62052 72.128659 +1873 625 1 -0.8476 12.41368 21.72394 25.0 +1874 625 2 0.4238 13.230170399999999 21.72394 25.577359 +1875 625 2 0.4238 11.5971896 21.72394 25.577359 +1876 626 1 -0.8476 12.41368 21.72394 28.10342 +1877 626 2 0.4238 13.230170399999999 21.72394 28.680779 +1878 626 2 0.4238 11.5971896 21.72394 28.680779 +1879 627 1 -0.8476 12.41368 21.72394 31.20684 +1880 627 2 0.4238 13.230170399999999 21.72394 31.784199 +1881 627 2 0.4238 11.5971896 21.72394 31.784199 +1882 628 1 -0.8476 12.41368 21.72394 34.31026 +1883 628 2 0.4238 13.230170399999999 21.72394 34.887619 +1884 628 2 0.4238 11.5971896 21.72394 34.887619 +1885 629 1 -0.8476 12.41368 21.72394 37.41368 +1886 629 2 0.4238 13.230170399999999 21.72394 37.991039 +1887 629 2 0.4238 11.5971896 21.72394 37.991039 +1888 630 1 -0.8476 12.41368 21.72394 40.5171 +1889 630 2 0.4238 13.230170399999999 21.72394 41.094459 +1890 630 2 0.4238 11.5971896 21.72394 41.094459 +1891 631 1 -0.8476 12.41368 21.72394 43.62052 +1892 631 2 0.4238 13.230170399999999 21.72394 44.197879 +1893 631 2 0.4238 11.5971896 21.72394 44.197879 +1894 632 1 -0.8476 12.41368 21.72394 46.72394 +1895 632 2 0.4238 13.230170399999999 21.72394 47.301299 +1896 632 2 0.4238 11.5971896 21.72394 47.301299 +1897 633 1 -0.8476 12.41368 21.72394 49.82736 +1898 633 2 0.4238 13.230170399999999 21.72394 50.404719 +1899 633 2 0.4238 11.5971896 21.72394 50.404719 +1900 634 1 -0.8476 12.41368 21.72394 52.93078 +1901 634 2 0.4238 13.230170399999999 21.72394 53.508139 +1902 634 2 0.4238 11.5971896 21.72394 53.508139 +1903 635 1 -0.8476 12.41368 21.72394 56.0342 +1904 635 2 0.4238 13.230170399999999 21.72394 56.611559 +1905 635 2 0.4238 11.5971896 21.72394 56.611559 +1906 636 1 -0.8476 12.41368 21.72394 59.13762 +1907 636 2 0.4238 13.230170399999999 21.72394 59.714979 +1908 636 2 0.4238 11.5971896 21.72394 59.714979 +1909 637 1 -0.8476 12.41368 21.72394 62.24104 +1910 637 2 0.4238 13.230170399999999 21.72394 62.818399 +1911 637 2 0.4238 11.5971896 21.72394 62.818399 +1912 638 1 -0.8476 12.41368 21.72394 65.34446 +1913 638 2 0.4238 13.230170399999999 21.72394 65.921819 +1914 638 2 0.4238 11.5971896 21.72394 65.921819 +1915 639 1 -0.8476 12.41368 21.72394 68.44788 +1916 639 2 0.4238 13.230170399999999 21.72394 69.025239 +1917 639 2 0.4238 11.5971896 21.72394 69.025239 +1918 640 1 -0.8476 12.41368 21.72394 71.5513 +1919 640 2 0.4238 13.230170399999999 21.72394 72.128659 +1920 640 2 0.4238 11.5971896 21.72394 72.128659 +1921 641 1 -0.8476 15.5171 0.0 25.0 +1922 641 2 0.4238 16.3335904 0.0 25.577359 +1923 641 2 0.4238 14.7006096 0.0 25.577359 +1924 642 1 -0.8476 15.5171 0.0 28.10342 +1925 642 2 0.4238 16.3335904 0.0 28.680779 +1926 642 2 0.4238 14.7006096 0.0 28.680779 +1927 643 1 -0.8476 15.5171 0.0 31.20684 +1928 643 2 0.4238 16.3335904 0.0 31.784199 +1929 643 2 0.4238 14.7006096 0.0 31.784199 +1930 644 1 -0.8476 15.5171 0.0 34.31026 +1931 644 2 0.4238 16.3335904 0.0 34.887619 +1932 644 2 0.4238 14.7006096 0.0 34.887619 +1933 645 1 -0.8476 15.5171 0.0 37.41368 +1934 645 2 0.4238 16.3335904 0.0 37.991039 +1935 645 2 0.4238 14.7006096 0.0 37.991039 +1936 646 1 -0.8476 15.5171 0.0 40.5171 +1937 646 2 0.4238 16.3335904 0.0 41.094459 +1938 646 2 0.4238 14.7006096 0.0 41.094459 +1939 647 1 -0.8476 15.5171 0.0 43.62052 +1940 647 2 0.4238 16.3335904 0.0 44.197879 +1941 647 2 0.4238 14.7006096 0.0 44.197879 +1942 648 1 -0.8476 15.5171 0.0 46.72394 +1943 648 2 0.4238 16.3335904 0.0 47.301299 +1944 648 2 0.4238 14.7006096 0.0 47.301299 +1945 649 1 -0.8476 15.5171 0.0 49.82736 +1946 649 2 0.4238 16.3335904 0.0 50.404719 +1947 649 2 0.4238 14.7006096 0.0 50.404719 +1948 650 1 -0.8476 15.5171 0.0 52.93078 +1949 650 2 0.4238 16.3335904 0.0 53.508139 +1950 650 2 0.4238 14.7006096 0.0 53.508139 +1951 651 1 -0.8476 15.5171 0.0 56.0342 +1952 651 2 0.4238 16.3335904 0.0 56.611559 +1953 651 2 0.4238 14.7006096 0.0 56.611559 +1954 652 1 -0.8476 15.5171 0.0 59.13762 +1955 652 2 0.4238 16.3335904 0.0 59.714979 +1956 652 2 0.4238 14.7006096 0.0 59.714979 +1957 653 1 -0.8476 15.5171 0.0 62.24104 +1958 653 2 0.4238 16.3335904 0.0 62.818399 +1959 653 2 0.4238 14.7006096 0.0 62.818399 +1960 654 1 -0.8476 15.5171 0.0 65.34446 +1961 654 2 0.4238 16.3335904 0.0 65.921819 +1962 654 2 0.4238 14.7006096 0.0 65.921819 +1963 655 1 -0.8476 15.5171 0.0 68.44788 +1964 655 2 0.4238 16.3335904 0.0 69.025239 +1965 655 2 0.4238 14.7006096 0.0 69.025239 +1966 656 1 -0.8476 15.5171 0.0 71.5513 +1967 656 2 0.4238 16.3335904 0.0 72.128659 +1968 656 2 0.4238 14.7006096 0.0 72.128659 +1969 657 1 -0.8476 15.5171 3.10342 25.0 +1970 657 2 0.4238 16.3335904 3.10342 25.577359 +1971 657 2 0.4238 14.7006096 3.10342 25.577359 +1972 658 1 -0.8476 15.5171 3.10342 28.10342 +1973 658 2 0.4238 16.3335904 3.10342 28.680779 +1974 658 2 0.4238 14.7006096 3.10342 28.680779 +1975 659 1 -0.8476 15.5171 3.10342 31.20684 +1976 659 2 0.4238 16.3335904 3.10342 31.784199 +1977 659 2 0.4238 14.7006096 3.10342 31.784199 +1978 660 1 -0.8476 15.5171 3.10342 34.31026 +1979 660 2 0.4238 16.3335904 3.10342 34.887619 +1980 660 2 0.4238 14.7006096 3.10342 34.887619 +1981 661 1 -0.8476 15.5171 3.10342 37.41368 +1982 661 2 0.4238 16.3335904 3.10342 37.991039 +1983 661 2 0.4238 14.7006096 3.10342 37.991039 +1984 662 1 -0.8476 15.5171 3.10342 40.5171 +1985 662 2 0.4238 16.3335904 3.10342 41.094459 +1986 662 2 0.4238 14.7006096 3.10342 41.094459 +1987 663 1 -0.8476 15.5171 3.10342 43.62052 +1988 663 2 0.4238 16.3335904 3.10342 44.197879 +1989 663 2 0.4238 14.7006096 3.10342 44.197879 +1990 664 1 -0.8476 15.5171 3.10342 46.72394 +1991 664 2 0.4238 16.3335904 3.10342 47.301299 +1992 664 2 0.4238 14.7006096 3.10342 47.301299 +1993 665 1 -0.8476 15.5171 3.10342 49.82736 +1994 665 2 0.4238 16.3335904 3.10342 50.404719 +1995 665 2 0.4238 14.7006096 3.10342 50.404719 +1996 666 1 -0.8476 15.5171 3.10342 52.93078 +1997 666 2 0.4238 16.3335904 3.10342 53.508139 +1998 666 2 0.4238 14.7006096 3.10342 53.508139 +1999 667 1 -0.8476 15.5171 3.10342 56.0342 +2000 667 2 0.4238 16.3335904 3.10342 56.611559 +2001 667 2 0.4238 14.7006096 3.10342 56.611559 +2002 668 1 -0.8476 15.5171 3.10342 59.13762 +2003 668 2 0.4238 16.3335904 3.10342 59.714979 +2004 668 2 0.4238 14.7006096 3.10342 59.714979 +2005 669 1 -0.8476 15.5171 3.10342 62.24104 +2006 669 2 0.4238 16.3335904 3.10342 62.818399 +2007 669 2 0.4238 14.7006096 3.10342 62.818399 +2008 670 1 -0.8476 15.5171 3.10342 65.34446 +2009 670 2 0.4238 16.3335904 3.10342 65.921819 +2010 670 2 0.4238 14.7006096 3.10342 65.921819 +2011 671 1 -0.8476 15.5171 3.10342 68.44788 +2012 671 2 0.4238 16.3335904 3.10342 69.025239 +2013 671 2 0.4238 14.7006096 3.10342 69.025239 +2014 672 1 -0.8476 15.5171 3.10342 71.5513 +2015 672 2 0.4238 16.3335904 3.10342 72.128659 +2016 672 2 0.4238 14.7006096 3.10342 72.128659 +2017 673 1 -0.8476 15.5171 6.20684 25.0 +2018 673 2 0.4238 16.3335904 6.20684 25.577359 +2019 673 2 0.4238 14.7006096 6.20684 25.577359 +2020 674 1 -0.8476 15.5171 6.20684 28.10342 +2021 674 2 0.4238 16.3335904 6.20684 28.680779 +2022 674 2 0.4238 14.7006096 6.20684 28.680779 +2023 675 1 -0.8476 15.5171 6.20684 31.20684 +2024 675 2 0.4238 16.3335904 6.20684 31.784199 +2025 675 2 0.4238 14.7006096 6.20684 31.784199 +2026 676 1 -0.8476 15.5171 6.20684 34.31026 +2027 676 2 0.4238 16.3335904 6.20684 34.887619 +2028 676 2 0.4238 14.7006096 6.20684 34.887619 +2029 677 1 -0.8476 15.5171 6.20684 37.41368 +2030 677 2 0.4238 16.3335904 6.20684 37.991039 +2031 677 2 0.4238 14.7006096 6.20684 37.991039 +2032 678 1 -0.8476 15.5171 6.20684 40.5171 +2033 678 2 0.4238 16.3335904 6.20684 41.094459 +2034 678 2 0.4238 14.7006096 6.20684 41.094459 +2035 679 1 -0.8476 15.5171 6.20684 43.62052 +2036 679 2 0.4238 16.3335904 6.20684 44.197879 +2037 679 2 0.4238 14.7006096 6.20684 44.197879 +2038 680 1 -0.8476 15.5171 6.20684 46.72394 +2039 680 2 0.4238 16.3335904 6.20684 47.301299 +2040 680 2 0.4238 14.7006096 6.20684 47.301299 +2041 681 1 -0.8476 15.5171 6.20684 49.82736 +2042 681 2 0.4238 16.3335904 6.20684 50.404719 +2043 681 2 0.4238 14.7006096 6.20684 50.404719 +2044 682 1 -0.8476 15.5171 6.20684 52.93078 +2045 682 2 0.4238 16.3335904 6.20684 53.508139 +2046 682 2 0.4238 14.7006096 6.20684 53.508139 +2047 683 1 -0.8476 15.5171 6.20684 56.0342 +2048 683 2 0.4238 16.3335904 6.20684 56.611559 +2049 683 2 0.4238 14.7006096 6.20684 56.611559 +2050 684 1 -0.8476 15.5171 6.20684 59.13762 +2051 684 2 0.4238 16.3335904 6.20684 59.714979 +2052 684 2 0.4238 14.7006096 6.20684 59.714979 +2053 685 1 -0.8476 15.5171 6.20684 62.24104 +2054 685 2 0.4238 16.3335904 6.20684 62.818399 +2055 685 2 0.4238 14.7006096 6.20684 62.818399 +2056 686 1 -0.8476 15.5171 6.20684 65.34446 +2057 686 2 0.4238 16.3335904 6.20684 65.921819 +2058 686 2 0.4238 14.7006096 6.20684 65.921819 +2059 687 1 -0.8476 15.5171 6.20684 68.44788 +2060 687 2 0.4238 16.3335904 6.20684 69.025239 +2061 687 2 0.4238 14.7006096 6.20684 69.025239 +2062 688 1 -0.8476 15.5171 6.20684 71.5513 +2063 688 2 0.4238 16.3335904 6.20684 72.128659 +2064 688 2 0.4238 14.7006096 6.20684 72.128659 +2065 689 1 -0.8476 15.5171 9.31026 25.0 +2066 689 2 0.4238 16.3335904 9.31026 25.577359 +2067 689 2 0.4238 14.7006096 9.31026 25.577359 +2068 690 1 -0.8476 15.5171 9.31026 28.10342 +2069 690 2 0.4238 16.3335904 9.31026 28.680779 +2070 690 2 0.4238 14.7006096 9.31026 28.680779 +2071 691 1 -0.8476 15.5171 9.31026 31.20684 +2072 691 2 0.4238 16.3335904 9.31026 31.784199 +2073 691 2 0.4238 14.7006096 9.31026 31.784199 +2074 692 1 -0.8476 15.5171 9.31026 34.31026 +2075 692 2 0.4238 16.3335904 9.31026 34.887619 +2076 692 2 0.4238 14.7006096 9.31026 34.887619 +2077 693 1 -0.8476 15.5171 9.31026 37.41368 +2078 693 2 0.4238 16.3335904 9.31026 37.991039 +2079 693 2 0.4238 14.7006096 9.31026 37.991039 +2080 694 1 -0.8476 15.5171 9.31026 40.5171 +2081 694 2 0.4238 16.3335904 9.31026 41.094459 +2082 694 2 0.4238 14.7006096 9.31026 41.094459 +2083 695 1 -0.8476 15.5171 9.31026 43.62052 +2084 695 2 0.4238 16.3335904 9.31026 44.197879 +2085 695 2 0.4238 14.7006096 9.31026 44.197879 +2086 696 1 -0.8476 15.5171 9.31026 46.72394 +2087 696 2 0.4238 16.3335904 9.31026 47.301299 +2088 696 2 0.4238 14.7006096 9.31026 47.301299 +2089 697 1 -0.8476 15.5171 9.31026 49.82736 +2090 697 2 0.4238 16.3335904 9.31026 50.404719 +2091 697 2 0.4238 14.7006096 9.31026 50.404719 +2092 698 1 -0.8476 15.5171 9.31026 52.93078 +2093 698 2 0.4238 16.3335904 9.31026 53.508139 +2094 698 2 0.4238 14.7006096 9.31026 53.508139 +2095 699 1 -0.8476 15.5171 9.31026 56.0342 +2096 699 2 0.4238 16.3335904 9.31026 56.611559 +2097 699 2 0.4238 14.7006096 9.31026 56.611559 +2098 700 1 -0.8476 15.5171 9.31026 59.13762 +2099 700 2 0.4238 16.3335904 9.31026 59.714979 +2100 700 2 0.4238 14.7006096 9.31026 59.714979 +2101 701 1 -0.8476 15.5171 9.31026 62.24104 +2102 701 2 0.4238 16.3335904 9.31026 62.818399 +2103 701 2 0.4238 14.7006096 9.31026 62.818399 +2104 702 1 -0.8476 15.5171 9.31026 65.34446 +2105 702 2 0.4238 16.3335904 9.31026 65.921819 +2106 702 2 0.4238 14.7006096 9.31026 65.921819 +2107 703 1 -0.8476 15.5171 9.31026 68.44788 +2108 703 2 0.4238 16.3335904 9.31026 69.025239 +2109 703 2 0.4238 14.7006096 9.31026 69.025239 +2110 704 1 -0.8476 15.5171 9.31026 71.5513 +2111 704 2 0.4238 16.3335904 9.31026 72.128659 +2112 704 2 0.4238 14.7006096 9.31026 72.128659 +2113 705 1 -0.8476 15.5171 12.41368 25.0 +2114 705 2 0.4238 16.3335904 12.41368 25.577359 +2115 705 2 0.4238 14.7006096 12.41368 25.577359 +2116 706 1 -0.8476 15.5171 12.41368 28.10342 +2117 706 2 0.4238 16.3335904 12.41368 28.680779 +2118 706 2 0.4238 14.7006096 12.41368 28.680779 +2119 707 1 -0.8476 15.5171 12.41368 31.20684 +2120 707 2 0.4238 16.3335904 12.41368 31.784199 +2121 707 2 0.4238 14.7006096 12.41368 31.784199 +2122 708 1 -0.8476 15.5171 12.41368 34.31026 +2123 708 2 0.4238 16.3335904 12.41368 34.887619 +2124 708 2 0.4238 14.7006096 12.41368 34.887619 +2125 709 1 -0.8476 15.5171 12.41368 37.41368 +2126 709 2 0.4238 16.3335904 12.41368 37.991039 +2127 709 2 0.4238 14.7006096 12.41368 37.991039 +2128 710 1 -0.8476 15.5171 12.41368 40.5171 +2129 710 2 0.4238 16.3335904 12.41368 41.094459 +2130 710 2 0.4238 14.7006096 12.41368 41.094459 +2131 711 1 -0.8476 15.5171 12.41368 43.62052 +2132 711 2 0.4238 16.3335904 12.41368 44.197879 +2133 711 2 0.4238 14.7006096 12.41368 44.197879 +2134 712 1 -0.8476 15.5171 12.41368 46.72394 +2135 712 2 0.4238 16.3335904 12.41368 47.301299 +2136 712 2 0.4238 14.7006096 12.41368 47.301299 +2137 713 1 -0.8476 15.5171 12.41368 49.82736 +2138 713 2 0.4238 16.3335904 12.41368 50.404719 +2139 713 2 0.4238 14.7006096 12.41368 50.404719 +2140 714 1 -0.8476 15.5171 12.41368 52.93078 +2141 714 2 0.4238 16.3335904 12.41368 53.508139 +2142 714 2 0.4238 14.7006096 12.41368 53.508139 +2143 715 1 -0.8476 15.5171 12.41368 56.0342 +2144 715 2 0.4238 16.3335904 12.41368 56.611559 +2145 715 2 0.4238 14.7006096 12.41368 56.611559 +2146 716 1 -0.8476 15.5171 12.41368 59.13762 +2147 716 2 0.4238 16.3335904 12.41368 59.714979 +2148 716 2 0.4238 14.7006096 12.41368 59.714979 +2149 717 1 -0.8476 15.5171 12.41368 62.24104 +2150 717 2 0.4238 16.3335904 12.41368 62.818399 +2151 717 2 0.4238 14.7006096 12.41368 62.818399 +2152 718 1 -0.8476 15.5171 12.41368 65.34446 +2153 718 2 0.4238 16.3335904 12.41368 65.921819 +2154 718 2 0.4238 14.7006096 12.41368 65.921819 +2155 719 1 -0.8476 15.5171 12.41368 68.44788 +2156 719 2 0.4238 16.3335904 12.41368 69.025239 +2157 719 2 0.4238 14.7006096 12.41368 69.025239 +2158 720 1 -0.8476 15.5171 12.41368 71.5513 +2159 720 2 0.4238 16.3335904 12.41368 72.128659 +2160 720 2 0.4238 14.7006096 12.41368 72.128659 +2161 721 1 -0.8476 15.5171 15.5171 25.0 +2162 721 2 0.4238 16.3335904 15.5171 25.577359 +2163 721 2 0.4238 14.7006096 15.5171 25.577359 +2164 722 1 -0.8476 15.5171 15.5171 28.10342 +2165 722 2 0.4238 16.3335904 15.5171 28.680779 +2166 722 2 0.4238 14.7006096 15.5171 28.680779 +2167 723 1 -0.8476 15.5171 15.5171 31.20684 +2168 723 2 0.4238 16.3335904 15.5171 31.784199 +2169 723 2 0.4238 14.7006096 15.5171 31.784199 +2170 724 1 -0.8476 15.5171 15.5171 34.31026 +2171 724 2 0.4238 16.3335904 15.5171 34.887619 +2172 724 2 0.4238 14.7006096 15.5171 34.887619 +2173 725 1 -0.8476 15.5171 15.5171 37.41368 +2174 725 2 0.4238 16.3335904 15.5171 37.991039 +2175 725 2 0.4238 14.7006096 15.5171 37.991039 +2176 726 1 -0.8476 15.5171 15.5171 40.5171 +2177 726 2 0.4238 16.3335904 15.5171 41.094459 +2178 726 2 0.4238 14.7006096 15.5171 41.094459 +2179 727 1 -0.8476 15.5171 15.5171 43.62052 +2180 727 2 0.4238 16.3335904 15.5171 44.197879 +2181 727 2 0.4238 14.7006096 15.5171 44.197879 +2182 728 1 -0.8476 15.5171 15.5171 46.72394 +2183 728 2 0.4238 16.3335904 15.5171 47.301299 +2184 728 2 0.4238 14.7006096 15.5171 47.301299 +2185 729 1 -0.8476 15.5171 15.5171 49.82736 +2186 729 2 0.4238 16.3335904 15.5171 50.404719 +2187 729 2 0.4238 14.7006096 15.5171 50.404719 +2188 730 1 -0.8476 15.5171 15.5171 52.93078 +2189 730 2 0.4238 16.3335904 15.5171 53.508139 +2190 730 2 0.4238 14.7006096 15.5171 53.508139 +2191 731 1 -0.8476 15.5171 15.5171 56.0342 +2192 731 2 0.4238 16.3335904 15.5171 56.611559 +2193 731 2 0.4238 14.7006096 15.5171 56.611559 +2194 732 1 -0.8476 15.5171 15.5171 59.13762 +2195 732 2 0.4238 16.3335904 15.5171 59.714979 +2196 732 2 0.4238 14.7006096 15.5171 59.714979 +2197 733 1 -0.8476 15.5171 15.5171 62.24104 +2198 733 2 0.4238 16.3335904 15.5171 62.818399 +2199 733 2 0.4238 14.7006096 15.5171 62.818399 +2200 734 1 -0.8476 15.5171 15.5171 65.34446 +2201 734 2 0.4238 16.3335904 15.5171 65.921819 +2202 734 2 0.4238 14.7006096 15.5171 65.921819 +2203 735 1 -0.8476 15.5171 15.5171 68.44788 +2204 735 2 0.4238 16.3335904 15.5171 69.025239 +2205 735 2 0.4238 14.7006096 15.5171 69.025239 +2206 736 1 -0.8476 15.5171 15.5171 71.5513 +2207 736 2 0.4238 16.3335904 15.5171 72.128659 +2208 736 2 0.4238 14.7006096 15.5171 72.128659 +2209 737 1 -0.8476 15.5171 18.62052 25.0 +2210 737 2 0.4238 16.3335904 18.62052 25.577359 +2211 737 2 0.4238 14.7006096 18.62052 25.577359 +2212 738 1 -0.8476 15.5171 18.62052 28.10342 +2213 738 2 0.4238 16.3335904 18.62052 28.680779 +2214 738 2 0.4238 14.7006096 18.62052 28.680779 +2215 739 1 -0.8476 15.5171 18.62052 31.20684 +2216 739 2 0.4238 16.3335904 18.62052 31.784199 +2217 739 2 0.4238 14.7006096 18.62052 31.784199 +2218 740 1 -0.8476 15.5171 18.62052 34.31026 +2219 740 2 0.4238 16.3335904 18.62052 34.887619 +2220 740 2 0.4238 14.7006096 18.62052 34.887619 +2221 741 1 -0.8476 15.5171 18.62052 37.41368 +2222 741 2 0.4238 16.3335904 18.62052 37.991039 +2223 741 2 0.4238 14.7006096 18.62052 37.991039 +2224 742 1 -0.8476 15.5171 18.62052 40.5171 +2225 742 2 0.4238 16.3335904 18.62052 41.094459 +2226 742 2 0.4238 14.7006096 18.62052 41.094459 +2227 743 1 -0.8476 15.5171 18.62052 43.62052 +2228 743 2 0.4238 16.3335904 18.62052 44.197879 +2229 743 2 0.4238 14.7006096 18.62052 44.197879 +2230 744 1 -0.8476 15.5171 18.62052 46.72394 +2231 744 2 0.4238 16.3335904 18.62052 47.301299 +2232 744 2 0.4238 14.7006096 18.62052 47.301299 +2233 745 1 -0.8476 15.5171 18.62052 49.82736 +2234 745 2 0.4238 16.3335904 18.62052 50.404719 +2235 745 2 0.4238 14.7006096 18.62052 50.404719 +2236 746 1 -0.8476 15.5171 18.62052 52.93078 +2237 746 2 0.4238 16.3335904 18.62052 53.508139 +2238 746 2 0.4238 14.7006096 18.62052 53.508139 +2239 747 1 -0.8476 15.5171 18.62052 56.0342 +2240 747 2 0.4238 16.3335904 18.62052 56.611559 +2241 747 2 0.4238 14.7006096 18.62052 56.611559 +2242 748 1 -0.8476 15.5171 18.62052 59.13762 +2243 748 2 0.4238 16.3335904 18.62052 59.714979 +2244 748 2 0.4238 14.7006096 18.62052 59.714979 +2245 749 1 -0.8476 15.5171 18.62052 62.24104 +2246 749 2 0.4238 16.3335904 18.62052 62.818399 +2247 749 2 0.4238 14.7006096 18.62052 62.818399 +2248 750 1 -0.8476 15.5171 18.62052 65.34446 +2249 750 2 0.4238 16.3335904 18.62052 65.921819 +2250 750 2 0.4238 14.7006096 18.62052 65.921819 +2251 751 1 -0.8476 15.5171 18.62052 68.44788 +2252 751 2 0.4238 16.3335904 18.62052 69.025239 +2253 751 2 0.4238 14.7006096 18.62052 69.025239 +2254 752 1 -0.8476 15.5171 18.62052 71.5513 +2255 752 2 0.4238 16.3335904 18.62052 72.128659 +2256 752 2 0.4238 14.7006096 18.62052 72.128659 +2257 753 1 -0.8476 15.5171 21.72394 25.0 +2258 753 2 0.4238 16.3335904 21.72394 25.577359 +2259 753 2 0.4238 14.7006096 21.72394 25.577359 +2260 754 1 -0.8476 15.5171 21.72394 28.10342 +2261 754 2 0.4238 16.3335904 21.72394 28.680779 +2262 754 2 0.4238 14.7006096 21.72394 28.680779 +2263 755 1 -0.8476 15.5171 21.72394 31.20684 +2264 755 2 0.4238 16.3335904 21.72394 31.784199 +2265 755 2 0.4238 14.7006096 21.72394 31.784199 +2266 756 1 -0.8476 15.5171 21.72394 34.31026 +2267 756 2 0.4238 16.3335904 21.72394 34.887619 +2268 756 2 0.4238 14.7006096 21.72394 34.887619 +2269 757 1 -0.8476 15.5171 21.72394 37.41368 +2270 757 2 0.4238 16.3335904 21.72394 37.991039 +2271 757 2 0.4238 14.7006096 21.72394 37.991039 +2272 758 1 -0.8476 15.5171 21.72394 40.5171 +2273 758 2 0.4238 16.3335904 21.72394 41.094459 +2274 758 2 0.4238 14.7006096 21.72394 41.094459 +2275 759 1 -0.8476 15.5171 21.72394 43.62052 +2276 759 2 0.4238 16.3335904 21.72394 44.197879 +2277 759 2 0.4238 14.7006096 21.72394 44.197879 +2278 760 1 -0.8476 15.5171 21.72394 46.72394 +2279 760 2 0.4238 16.3335904 21.72394 47.301299 +2280 760 2 0.4238 14.7006096 21.72394 47.301299 +2281 761 1 -0.8476 15.5171 21.72394 49.82736 +2282 761 2 0.4238 16.3335904 21.72394 50.404719 +2283 761 2 0.4238 14.7006096 21.72394 50.404719 +2284 762 1 -0.8476 15.5171 21.72394 52.93078 +2285 762 2 0.4238 16.3335904 21.72394 53.508139 +2286 762 2 0.4238 14.7006096 21.72394 53.508139 +2287 763 1 -0.8476 15.5171 21.72394 56.0342 +2288 763 2 0.4238 16.3335904 21.72394 56.611559 +2289 763 2 0.4238 14.7006096 21.72394 56.611559 +2290 764 1 -0.8476 15.5171 21.72394 59.13762 +2291 764 2 0.4238 16.3335904 21.72394 59.714979 +2292 764 2 0.4238 14.7006096 21.72394 59.714979 +2293 765 1 -0.8476 15.5171 21.72394 62.24104 +2294 765 2 0.4238 16.3335904 21.72394 62.818399 +2295 765 2 0.4238 14.7006096 21.72394 62.818399 +2296 766 1 -0.8476 15.5171 21.72394 65.34446 +2297 766 2 0.4238 16.3335904 21.72394 65.921819 +2298 766 2 0.4238 14.7006096 21.72394 65.921819 +2299 767 1 -0.8476 15.5171 21.72394 68.44788 +2300 767 2 0.4238 16.3335904 21.72394 69.025239 +2301 767 2 0.4238 14.7006096 21.72394 69.025239 +2302 768 1 -0.8476 15.5171 21.72394 71.5513 +2303 768 2 0.4238 16.3335904 21.72394 72.128659 +2304 768 2 0.4238 14.7006096 21.72394 72.128659 +2305 769 1 -0.8476 18.62052 0.0 25.0 +2306 769 2 0.4238 19.4370104 0.0 25.577359 +2307 769 2 0.4238 17.8040296 0.0 25.577359 +2308 770 1 -0.8476 18.62052 0.0 28.10342 +2309 770 2 0.4238 19.4370104 0.0 28.680779 +2310 770 2 0.4238 17.8040296 0.0 28.680779 +2311 771 1 -0.8476 18.62052 0.0 31.20684 +2312 771 2 0.4238 19.4370104 0.0 31.784199 +2313 771 2 0.4238 17.8040296 0.0 31.784199 +2314 772 1 -0.8476 18.62052 0.0 34.31026 +2315 772 2 0.4238 19.4370104 0.0 34.887619 +2316 772 2 0.4238 17.8040296 0.0 34.887619 +2317 773 1 -0.8476 18.62052 0.0 37.41368 +2318 773 2 0.4238 19.4370104 0.0 37.991039 +2319 773 2 0.4238 17.8040296 0.0 37.991039 +2320 774 1 -0.8476 18.62052 0.0 40.5171 +2321 774 2 0.4238 19.4370104 0.0 41.094459 +2322 774 2 0.4238 17.8040296 0.0 41.094459 +2323 775 1 -0.8476 18.62052 0.0 43.62052 +2324 775 2 0.4238 19.4370104 0.0 44.197879 +2325 775 2 0.4238 17.8040296 0.0 44.197879 +2326 776 1 -0.8476 18.62052 0.0 46.72394 +2327 776 2 0.4238 19.4370104 0.0 47.301299 +2328 776 2 0.4238 17.8040296 0.0 47.301299 +2329 777 1 -0.8476 18.62052 0.0 49.82736 +2330 777 2 0.4238 19.4370104 0.0 50.404719 +2331 777 2 0.4238 17.8040296 0.0 50.404719 +2332 778 1 -0.8476 18.62052 0.0 52.93078 +2333 778 2 0.4238 19.4370104 0.0 53.508139 +2334 778 2 0.4238 17.8040296 0.0 53.508139 +2335 779 1 -0.8476 18.62052 0.0 56.0342 +2336 779 2 0.4238 19.4370104 0.0 56.611559 +2337 779 2 0.4238 17.8040296 0.0 56.611559 +2338 780 1 -0.8476 18.62052 0.0 59.13762 +2339 780 2 0.4238 19.4370104 0.0 59.714979 +2340 780 2 0.4238 17.8040296 0.0 59.714979 +2341 781 1 -0.8476 18.62052 0.0 62.24104 +2342 781 2 0.4238 19.4370104 0.0 62.818399 +2343 781 2 0.4238 17.8040296 0.0 62.818399 +2344 782 1 -0.8476 18.62052 0.0 65.34446 +2345 782 2 0.4238 19.4370104 0.0 65.921819 +2346 782 2 0.4238 17.8040296 0.0 65.921819 +2347 783 1 -0.8476 18.62052 0.0 68.44788 +2348 783 2 0.4238 19.4370104 0.0 69.025239 +2349 783 2 0.4238 17.8040296 0.0 69.025239 +2350 784 1 -0.8476 18.62052 0.0 71.5513 +2351 784 2 0.4238 19.4370104 0.0 72.128659 +2352 784 2 0.4238 17.8040296 0.0 72.128659 +2353 785 1 -0.8476 18.62052 3.10342 25.0 +2354 785 2 0.4238 19.4370104 3.10342 25.577359 +2355 785 2 0.4238 17.8040296 3.10342 25.577359 +2356 786 1 -0.8476 18.62052 3.10342 28.10342 +2357 786 2 0.4238 19.4370104 3.10342 28.680779 +2358 786 2 0.4238 17.8040296 3.10342 28.680779 +2359 787 1 -0.8476 18.62052 3.10342 31.20684 +2360 787 2 0.4238 19.4370104 3.10342 31.784199 +2361 787 2 0.4238 17.8040296 3.10342 31.784199 +2362 788 1 -0.8476 18.62052 3.10342 34.31026 +2363 788 2 0.4238 19.4370104 3.10342 34.887619 +2364 788 2 0.4238 17.8040296 3.10342 34.887619 +2365 789 1 -0.8476 18.62052 3.10342 37.41368 +2366 789 2 0.4238 19.4370104 3.10342 37.991039 +2367 789 2 0.4238 17.8040296 3.10342 37.991039 +2368 790 1 -0.8476 18.62052 3.10342 40.5171 +2369 790 2 0.4238 19.4370104 3.10342 41.094459 +2370 790 2 0.4238 17.8040296 3.10342 41.094459 +2371 791 1 -0.8476 18.62052 3.10342 43.62052 +2372 791 2 0.4238 19.4370104 3.10342 44.197879 +2373 791 2 0.4238 17.8040296 3.10342 44.197879 +2374 792 1 -0.8476 18.62052 3.10342 46.72394 +2375 792 2 0.4238 19.4370104 3.10342 47.301299 +2376 792 2 0.4238 17.8040296 3.10342 47.301299 +2377 793 1 -0.8476 18.62052 3.10342 49.82736 +2378 793 2 0.4238 19.4370104 3.10342 50.404719 +2379 793 2 0.4238 17.8040296 3.10342 50.404719 +2380 794 1 -0.8476 18.62052 3.10342 52.93078 +2381 794 2 0.4238 19.4370104 3.10342 53.508139 +2382 794 2 0.4238 17.8040296 3.10342 53.508139 +2383 795 1 -0.8476 18.62052 3.10342 56.0342 +2384 795 2 0.4238 19.4370104 3.10342 56.611559 +2385 795 2 0.4238 17.8040296 3.10342 56.611559 +2386 796 1 -0.8476 18.62052 3.10342 59.13762 +2387 796 2 0.4238 19.4370104 3.10342 59.714979 +2388 796 2 0.4238 17.8040296 3.10342 59.714979 +2389 797 1 -0.8476 18.62052 3.10342 62.24104 +2390 797 2 0.4238 19.4370104 3.10342 62.818399 +2391 797 2 0.4238 17.8040296 3.10342 62.818399 +2392 798 1 -0.8476 18.62052 3.10342 65.34446 +2393 798 2 0.4238 19.4370104 3.10342 65.921819 +2394 798 2 0.4238 17.8040296 3.10342 65.921819 +2395 799 1 -0.8476 18.62052 3.10342 68.44788 +2396 799 2 0.4238 19.4370104 3.10342 69.025239 +2397 799 2 0.4238 17.8040296 3.10342 69.025239 +2398 800 1 -0.8476 18.62052 3.10342 71.5513 +2399 800 2 0.4238 19.4370104 3.10342 72.128659 +2400 800 2 0.4238 17.8040296 3.10342 72.128659 +2401 801 1 -0.8476 18.62052 6.20684 25.0 +2402 801 2 0.4238 19.4370104 6.20684 25.577359 +2403 801 2 0.4238 17.8040296 6.20684 25.577359 +2404 802 1 -0.8476 18.62052 6.20684 28.10342 +2405 802 2 0.4238 19.4370104 6.20684 28.680779 +2406 802 2 0.4238 17.8040296 6.20684 28.680779 +2407 803 1 -0.8476 18.62052 6.20684 31.20684 +2408 803 2 0.4238 19.4370104 6.20684 31.784199 +2409 803 2 0.4238 17.8040296 6.20684 31.784199 +2410 804 1 -0.8476 18.62052 6.20684 34.31026 +2411 804 2 0.4238 19.4370104 6.20684 34.887619 +2412 804 2 0.4238 17.8040296 6.20684 34.887619 +2413 805 1 -0.8476 18.62052 6.20684 37.41368 +2414 805 2 0.4238 19.4370104 6.20684 37.991039 +2415 805 2 0.4238 17.8040296 6.20684 37.991039 +2416 806 1 -0.8476 18.62052 6.20684 40.5171 +2417 806 2 0.4238 19.4370104 6.20684 41.094459 +2418 806 2 0.4238 17.8040296 6.20684 41.094459 +2419 807 1 -0.8476 18.62052 6.20684 43.62052 +2420 807 2 0.4238 19.4370104 6.20684 44.197879 +2421 807 2 0.4238 17.8040296 6.20684 44.197879 +2422 808 1 -0.8476 18.62052 6.20684 46.72394 +2423 808 2 0.4238 19.4370104 6.20684 47.301299 +2424 808 2 0.4238 17.8040296 6.20684 47.301299 +2425 809 1 -0.8476 18.62052 6.20684 49.82736 +2426 809 2 0.4238 19.4370104 6.20684 50.404719 +2427 809 2 0.4238 17.8040296 6.20684 50.404719 +2428 810 1 -0.8476 18.62052 6.20684 52.93078 +2429 810 2 0.4238 19.4370104 6.20684 53.508139 +2430 810 2 0.4238 17.8040296 6.20684 53.508139 +2431 811 1 -0.8476 18.62052 6.20684 56.0342 +2432 811 2 0.4238 19.4370104 6.20684 56.611559 +2433 811 2 0.4238 17.8040296 6.20684 56.611559 +2434 812 1 -0.8476 18.62052 6.20684 59.13762 +2435 812 2 0.4238 19.4370104 6.20684 59.714979 +2436 812 2 0.4238 17.8040296 6.20684 59.714979 +2437 813 1 -0.8476 18.62052 6.20684 62.24104 +2438 813 2 0.4238 19.4370104 6.20684 62.818399 +2439 813 2 0.4238 17.8040296 6.20684 62.818399 +2440 814 1 -0.8476 18.62052 6.20684 65.34446 +2441 814 2 0.4238 19.4370104 6.20684 65.921819 +2442 814 2 0.4238 17.8040296 6.20684 65.921819 +2443 815 1 -0.8476 18.62052 6.20684 68.44788 +2444 815 2 0.4238 19.4370104 6.20684 69.025239 +2445 815 2 0.4238 17.8040296 6.20684 69.025239 +2446 816 1 -0.8476 18.62052 6.20684 71.5513 +2447 816 2 0.4238 19.4370104 6.20684 72.128659 +2448 816 2 0.4238 17.8040296 6.20684 72.128659 +2449 817 1 -0.8476 18.62052 9.31026 25.0 +2450 817 2 0.4238 19.4370104 9.31026 25.577359 +2451 817 2 0.4238 17.8040296 9.31026 25.577359 +2452 818 1 -0.8476 18.62052 9.31026 28.10342 +2453 818 2 0.4238 19.4370104 9.31026 28.680779 +2454 818 2 0.4238 17.8040296 9.31026 28.680779 +2455 819 1 -0.8476 18.62052 9.31026 31.20684 +2456 819 2 0.4238 19.4370104 9.31026 31.784199 +2457 819 2 0.4238 17.8040296 9.31026 31.784199 +2458 820 1 -0.8476 18.62052 9.31026 34.31026 +2459 820 2 0.4238 19.4370104 9.31026 34.887619 +2460 820 2 0.4238 17.8040296 9.31026 34.887619 +2461 821 1 -0.8476 18.62052 9.31026 37.41368 +2462 821 2 0.4238 19.4370104 9.31026 37.991039 +2463 821 2 0.4238 17.8040296 9.31026 37.991039 +2464 822 1 -0.8476 18.62052 9.31026 40.5171 +2465 822 2 0.4238 19.4370104 9.31026 41.094459 +2466 822 2 0.4238 17.8040296 9.31026 41.094459 +2467 823 1 -0.8476 18.62052 9.31026 43.62052 +2468 823 2 0.4238 19.4370104 9.31026 44.197879 +2469 823 2 0.4238 17.8040296 9.31026 44.197879 +2470 824 1 -0.8476 18.62052 9.31026 46.72394 +2471 824 2 0.4238 19.4370104 9.31026 47.301299 +2472 824 2 0.4238 17.8040296 9.31026 47.301299 +2473 825 1 -0.8476 18.62052 9.31026 49.82736 +2474 825 2 0.4238 19.4370104 9.31026 50.404719 +2475 825 2 0.4238 17.8040296 9.31026 50.404719 +2476 826 1 -0.8476 18.62052 9.31026 52.93078 +2477 826 2 0.4238 19.4370104 9.31026 53.508139 +2478 826 2 0.4238 17.8040296 9.31026 53.508139 +2479 827 1 -0.8476 18.62052 9.31026 56.0342 +2480 827 2 0.4238 19.4370104 9.31026 56.611559 +2481 827 2 0.4238 17.8040296 9.31026 56.611559 +2482 828 1 -0.8476 18.62052 9.31026 59.13762 +2483 828 2 0.4238 19.4370104 9.31026 59.714979 +2484 828 2 0.4238 17.8040296 9.31026 59.714979 +2485 829 1 -0.8476 18.62052 9.31026 62.24104 +2486 829 2 0.4238 19.4370104 9.31026 62.818399 +2487 829 2 0.4238 17.8040296 9.31026 62.818399 +2488 830 1 -0.8476 18.62052 9.31026 65.34446 +2489 830 2 0.4238 19.4370104 9.31026 65.921819 +2490 830 2 0.4238 17.8040296 9.31026 65.921819 +2491 831 1 -0.8476 18.62052 9.31026 68.44788 +2492 831 2 0.4238 19.4370104 9.31026 69.025239 +2493 831 2 0.4238 17.8040296 9.31026 69.025239 +2494 832 1 -0.8476 18.62052 9.31026 71.5513 +2495 832 2 0.4238 19.4370104 9.31026 72.128659 +2496 832 2 0.4238 17.8040296 9.31026 72.128659 +2497 833 1 -0.8476 18.62052 12.41368 25.0 +2498 833 2 0.4238 19.4370104 12.41368 25.577359 +2499 833 2 0.4238 17.8040296 12.41368 25.577359 +2500 834 1 -0.8476 18.62052 12.41368 28.10342 +2501 834 2 0.4238 19.4370104 12.41368 28.680779 +2502 834 2 0.4238 17.8040296 12.41368 28.680779 +2503 835 1 -0.8476 18.62052 12.41368 31.20684 +2504 835 2 0.4238 19.4370104 12.41368 31.784199 +2505 835 2 0.4238 17.8040296 12.41368 31.784199 +2506 836 1 -0.8476 18.62052 12.41368 34.31026 +2507 836 2 0.4238 19.4370104 12.41368 34.887619 +2508 836 2 0.4238 17.8040296 12.41368 34.887619 +2509 837 1 -0.8476 18.62052 12.41368 37.41368 +2510 837 2 0.4238 19.4370104 12.41368 37.991039 +2511 837 2 0.4238 17.8040296 12.41368 37.991039 +2512 838 1 -0.8476 18.62052 12.41368 40.5171 +2513 838 2 0.4238 19.4370104 12.41368 41.094459 +2514 838 2 0.4238 17.8040296 12.41368 41.094459 +2515 839 1 -0.8476 18.62052 12.41368 43.62052 +2516 839 2 0.4238 19.4370104 12.41368 44.197879 +2517 839 2 0.4238 17.8040296 12.41368 44.197879 +2518 840 1 -0.8476 18.62052 12.41368 46.72394 +2519 840 2 0.4238 19.4370104 12.41368 47.301299 +2520 840 2 0.4238 17.8040296 12.41368 47.301299 +2521 841 1 -0.8476 18.62052 12.41368 49.82736 +2522 841 2 0.4238 19.4370104 12.41368 50.404719 +2523 841 2 0.4238 17.8040296 12.41368 50.404719 +2524 842 1 -0.8476 18.62052 12.41368 52.93078 +2525 842 2 0.4238 19.4370104 12.41368 53.508139 +2526 842 2 0.4238 17.8040296 12.41368 53.508139 +2527 843 1 -0.8476 18.62052 12.41368 56.0342 +2528 843 2 0.4238 19.4370104 12.41368 56.611559 +2529 843 2 0.4238 17.8040296 12.41368 56.611559 +2530 844 1 -0.8476 18.62052 12.41368 59.13762 +2531 844 2 0.4238 19.4370104 12.41368 59.714979 +2532 844 2 0.4238 17.8040296 12.41368 59.714979 +2533 845 1 -0.8476 18.62052 12.41368 62.24104 +2534 845 2 0.4238 19.4370104 12.41368 62.818399 +2535 845 2 0.4238 17.8040296 12.41368 62.818399 +2536 846 1 -0.8476 18.62052 12.41368 65.34446 +2537 846 2 0.4238 19.4370104 12.41368 65.921819 +2538 846 2 0.4238 17.8040296 12.41368 65.921819 +2539 847 1 -0.8476 18.62052 12.41368 68.44788 +2540 847 2 0.4238 19.4370104 12.41368 69.025239 +2541 847 2 0.4238 17.8040296 12.41368 69.025239 +2542 848 1 -0.8476 18.62052 12.41368 71.5513 +2543 848 2 0.4238 19.4370104 12.41368 72.128659 +2544 848 2 0.4238 17.8040296 12.41368 72.128659 +2545 849 1 -0.8476 18.62052 15.5171 25.0 +2546 849 2 0.4238 19.4370104 15.5171 25.577359 +2547 849 2 0.4238 17.8040296 15.5171 25.577359 +2548 850 1 -0.8476 18.62052 15.5171 28.10342 +2549 850 2 0.4238 19.4370104 15.5171 28.680779 +2550 850 2 0.4238 17.8040296 15.5171 28.680779 +2551 851 1 -0.8476 18.62052 15.5171 31.20684 +2552 851 2 0.4238 19.4370104 15.5171 31.784199 +2553 851 2 0.4238 17.8040296 15.5171 31.784199 +2554 852 1 -0.8476 18.62052 15.5171 34.31026 +2555 852 2 0.4238 19.4370104 15.5171 34.887619 +2556 852 2 0.4238 17.8040296 15.5171 34.887619 +2557 853 1 -0.8476 18.62052 15.5171 37.41368 +2558 853 2 0.4238 19.4370104 15.5171 37.991039 +2559 853 2 0.4238 17.8040296 15.5171 37.991039 +2560 854 1 -0.8476 18.62052 15.5171 40.5171 +2561 854 2 0.4238 19.4370104 15.5171 41.094459 +2562 854 2 0.4238 17.8040296 15.5171 41.094459 +2563 855 1 -0.8476 18.62052 15.5171 43.62052 +2564 855 2 0.4238 19.4370104 15.5171 44.197879 +2565 855 2 0.4238 17.8040296 15.5171 44.197879 +2566 856 1 -0.8476 18.62052 15.5171 46.72394 +2567 856 2 0.4238 19.4370104 15.5171 47.301299 +2568 856 2 0.4238 17.8040296 15.5171 47.301299 +2569 857 1 -0.8476 18.62052 15.5171 49.82736 +2570 857 2 0.4238 19.4370104 15.5171 50.404719 +2571 857 2 0.4238 17.8040296 15.5171 50.404719 +2572 858 1 -0.8476 18.62052 15.5171 52.93078 +2573 858 2 0.4238 19.4370104 15.5171 53.508139 +2574 858 2 0.4238 17.8040296 15.5171 53.508139 +2575 859 1 -0.8476 18.62052 15.5171 56.0342 +2576 859 2 0.4238 19.4370104 15.5171 56.611559 +2577 859 2 0.4238 17.8040296 15.5171 56.611559 +2578 860 1 -0.8476 18.62052 15.5171 59.13762 +2579 860 2 0.4238 19.4370104 15.5171 59.714979 +2580 860 2 0.4238 17.8040296 15.5171 59.714979 +2581 861 1 -0.8476 18.62052 15.5171 62.24104 +2582 861 2 0.4238 19.4370104 15.5171 62.818399 +2583 861 2 0.4238 17.8040296 15.5171 62.818399 +2584 862 1 -0.8476 18.62052 15.5171 65.34446 +2585 862 2 0.4238 19.4370104 15.5171 65.921819 +2586 862 2 0.4238 17.8040296 15.5171 65.921819 +2587 863 1 -0.8476 18.62052 15.5171 68.44788 +2588 863 2 0.4238 19.4370104 15.5171 69.025239 +2589 863 2 0.4238 17.8040296 15.5171 69.025239 +2590 864 1 -0.8476 18.62052 15.5171 71.5513 +2591 864 2 0.4238 19.4370104 15.5171 72.128659 +2592 864 2 0.4238 17.8040296 15.5171 72.128659 +2593 865 1 -0.8476 18.62052 18.62052 25.0 +2594 865 2 0.4238 19.4370104 18.62052 25.577359 +2595 865 2 0.4238 17.8040296 18.62052 25.577359 +2596 866 1 -0.8476 18.62052 18.62052 28.10342 +2597 866 2 0.4238 19.4370104 18.62052 28.680779 +2598 866 2 0.4238 17.8040296 18.62052 28.680779 +2599 867 1 -0.8476 18.62052 18.62052 31.20684 +2600 867 2 0.4238 19.4370104 18.62052 31.784199 +2601 867 2 0.4238 17.8040296 18.62052 31.784199 +2602 868 1 -0.8476 18.62052 18.62052 34.31026 +2603 868 2 0.4238 19.4370104 18.62052 34.887619 +2604 868 2 0.4238 17.8040296 18.62052 34.887619 +2605 869 1 -0.8476 18.62052 18.62052 37.41368 +2606 869 2 0.4238 19.4370104 18.62052 37.991039 +2607 869 2 0.4238 17.8040296 18.62052 37.991039 +2608 870 1 -0.8476 18.62052 18.62052 40.5171 +2609 870 2 0.4238 19.4370104 18.62052 41.094459 +2610 870 2 0.4238 17.8040296 18.62052 41.094459 +2611 871 1 -0.8476 18.62052 18.62052 43.62052 +2612 871 2 0.4238 19.4370104 18.62052 44.197879 +2613 871 2 0.4238 17.8040296 18.62052 44.197879 +2614 872 1 -0.8476 18.62052 18.62052 46.72394 +2615 872 2 0.4238 19.4370104 18.62052 47.301299 +2616 872 2 0.4238 17.8040296 18.62052 47.301299 +2617 873 1 -0.8476 18.62052 18.62052 49.82736 +2618 873 2 0.4238 19.4370104 18.62052 50.404719 +2619 873 2 0.4238 17.8040296 18.62052 50.404719 +2620 874 1 -0.8476 18.62052 18.62052 52.93078 +2621 874 2 0.4238 19.4370104 18.62052 53.508139 +2622 874 2 0.4238 17.8040296 18.62052 53.508139 +2623 875 1 -0.8476 18.62052 18.62052 56.0342 +2624 875 2 0.4238 19.4370104 18.62052 56.611559 +2625 875 2 0.4238 17.8040296 18.62052 56.611559 +2626 876 1 -0.8476 18.62052 18.62052 59.13762 +2627 876 2 0.4238 19.4370104 18.62052 59.714979 +2628 876 2 0.4238 17.8040296 18.62052 59.714979 +2629 877 1 -0.8476 18.62052 18.62052 62.24104 +2630 877 2 0.4238 19.4370104 18.62052 62.818399 +2631 877 2 0.4238 17.8040296 18.62052 62.818399 +2632 878 1 -0.8476 18.62052 18.62052 65.34446 +2633 878 2 0.4238 19.4370104 18.62052 65.921819 +2634 878 2 0.4238 17.8040296 18.62052 65.921819 +2635 879 1 -0.8476 18.62052 18.62052 68.44788 +2636 879 2 0.4238 19.4370104 18.62052 69.025239 +2637 879 2 0.4238 17.8040296 18.62052 69.025239 +2638 880 1 -0.8476 18.62052 18.62052 71.5513 +2639 880 2 0.4238 19.4370104 18.62052 72.128659 +2640 880 2 0.4238 17.8040296 18.62052 72.128659 +2641 881 1 -0.8476 18.62052 21.72394 25.0 +2642 881 2 0.4238 19.4370104 21.72394 25.577359 +2643 881 2 0.4238 17.8040296 21.72394 25.577359 +2644 882 1 -0.8476 18.62052 21.72394 28.10342 +2645 882 2 0.4238 19.4370104 21.72394 28.680779 +2646 882 2 0.4238 17.8040296 21.72394 28.680779 +2647 883 1 -0.8476 18.62052 21.72394 31.20684 +2648 883 2 0.4238 19.4370104 21.72394 31.784199 +2649 883 2 0.4238 17.8040296 21.72394 31.784199 +2650 884 1 -0.8476 18.62052 21.72394 34.31026 +2651 884 2 0.4238 19.4370104 21.72394 34.887619 +2652 884 2 0.4238 17.8040296 21.72394 34.887619 +2653 885 1 -0.8476 18.62052 21.72394 37.41368 +2654 885 2 0.4238 19.4370104 21.72394 37.991039 +2655 885 2 0.4238 17.8040296 21.72394 37.991039 +2656 886 1 -0.8476 18.62052 21.72394 40.5171 +2657 886 2 0.4238 19.4370104 21.72394 41.094459 +2658 886 2 0.4238 17.8040296 21.72394 41.094459 +2659 887 1 -0.8476 18.62052 21.72394 43.62052 +2660 887 2 0.4238 19.4370104 21.72394 44.197879 +2661 887 2 0.4238 17.8040296 21.72394 44.197879 +2662 888 1 -0.8476 18.62052 21.72394 46.72394 +2663 888 2 0.4238 19.4370104 21.72394 47.301299 +2664 888 2 0.4238 17.8040296 21.72394 47.301299 +2665 889 1 -0.8476 18.62052 21.72394 49.82736 +2666 889 2 0.4238 19.4370104 21.72394 50.404719 +2667 889 2 0.4238 17.8040296 21.72394 50.404719 +2668 890 1 -0.8476 18.62052 21.72394 52.93078 +2669 890 2 0.4238 19.4370104 21.72394 53.508139 +2670 890 2 0.4238 17.8040296 21.72394 53.508139 +2671 891 1 -0.8476 18.62052 21.72394 56.0342 +2672 891 2 0.4238 19.4370104 21.72394 56.611559 +2673 891 2 0.4238 17.8040296 21.72394 56.611559 +2674 892 1 -0.8476 18.62052 21.72394 59.13762 +2675 892 2 0.4238 19.4370104 21.72394 59.714979 +2676 892 2 0.4238 17.8040296 21.72394 59.714979 +2677 893 1 -0.8476 18.62052 21.72394 62.24104 +2678 893 2 0.4238 19.4370104 21.72394 62.818399 +2679 893 2 0.4238 17.8040296 21.72394 62.818399 +2680 894 1 -0.8476 18.62052 21.72394 65.34446 +2681 894 2 0.4238 19.4370104 21.72394 65.921819 +2682 894 2 0.4238 17.8040296 21.72394 65.921819 +2683 895 1 -0.8476 18.62052 21.72394 68.44788 +2684 895 2 0.4238 19.4370104 21.72394 69.025239 +2685 895 2 0.4238 17.8040296 21.72394 69.025239 +2686 896 1 -0.8476 18.62052 21.72394 71.5513 +2687 896 2 0.4238 19.4370104 21.72394 72.128659 +2688 896 2 0.4238 17.8040296 21.72394 72.128659 +2689 897 1 -0.8476 21.72394 0.0 25.0 +2690 897 2 0.4238 22.540430399999998 0.0 25.577359 +2691 897 2 0.4238 20.9074496 0.0 25.577359 +2692 898 1 -0.8476 21.72394 0.0 28.10342 +2693 898 2 0.4238 22.540430399999998 0.0 28.680779 +2694 898 2 0.4238 20.9074496 0.0 28.680779 +2695 899 1 -0.8476 21.72394 0.0 31.20684 +2696 899 2 0.4238 22.540430399999998 0.0 31.784199 +2697 899 2 0.4238 20.9074496 0.0 31.784199 +2698 900 1 -0.8476 21.72394 0.0 34.31026 +2699 900 2 0.4238 22.540430399999998 0.0 34.887619 +2700 900 2 0.4238 20.9074496 0.0 34.887619 +2701 901 1 -0.8476 21.72394 0.0 37.41368 +2702 901 2 0.4238 22.540430399999998 0.0 37.991039 +2703 901 2 0.4238 20.9074496 0.0 37.991039 +2704 902 1 -0.8476 21.72394 0.0 40.5171 +2705 902 2 0.4238 22.540430399999998 0.0 41.094459 +2706 902 2 0.4238 20.9074496 0.0 41.094459 +2707 903 1 -0.8476 21.72394 0.0 43.62052 +2708 903 2 0.4238 22.540430399999998 0.0 44.197879 +2709 903 2 0.4238 20.9074496 0.0 44.197879 +2710 904 1 -0.8476 21.72394 0.0 46.72394 +2711 904 2 0.4238 22.540430399999998 0.0 47.301299 +2712 904 2 0.4238 20.9074496 0.0 47.301299 +2713 905 1 -0.8476 21.72394 0.0 49.82736 +2714 905 2 0.4238 22.540430399999998 0.0 50.404719 +2715 905 2 0.4238 20.9074496 0.0 50.404719 +2716 906 1 -0.8476 21.72394 0.0 52.93078 +2717 906 2 0.4238 22.540430399999998 0.0 53.508139 +2718 906 2 0.4238 20.9074496 0.0 53.508139 +2719 907 1 -0.8476 21.72394 0.0 56.0342 +2720 907 2 0.4238 22.540430399999998 0.0 56.611559 +2721 907 2 0.4238 20.9074496 0.0 56.611559 +2722 908 1 -0.8476 21.72394 0.0 59.13762 +2723 908 2 0.4238 22.540430399999998 0.0 59.714979 +2724 908 2 0.4238 20.9074496 0.0 59.714979 +2725 909 1 -0.8476 21.72394 0.0 62.24104 +2726 909 2 0.4238 22.540430399999998 0.0 62.818399 +2727 909 2 0.4238 20.9074496 0.0 62.818399 +2728 910 1 -0.8476 21.72394 0.0 65.34446 +2729 910 2 0.4238 22.540430399999998 0.0 65.921819 +2730 910 2 0.4238 20.9074496 0.0 65.921819 +2731 911 1 -0.8476 21.72394 0.0 68.44788 +2732 911 2 0.4238 22.540430399999998 0.0 69.025239 +2733 911 2 0.4238 20.9074496 0.0 69.025239 +2734 912 1 -0.8476 21.72394 0.0 71.5513 +2735 912 2 0.4238 22.540430399999998 0.0 72.128659 +2736 912 2 0.4238 20.9074496 0.0 72.128659 +2737 913 1 -0.8476 21.72394 3.10342 25.0 +2738 913 2 0.4238 22.540430399999998 3.10342 25.577359 +2739 913 2 0.4238 20.9074496 3.10342 25.577359 +2740 914 1 -0.8476 21.72394 3.10342 28.10342 +2741 914 2 0.4238 22.540430399999998 3.10342 28.680779 +2742 914 2 0.4238 20.9074496 3.10342 28.680779 +2743 915 1 -0.8476 21.72394 3.10342 31.20684 +2744 915 2 0.4238 22.540430399999998 3.10342 31.784199 +2745 915 2 0.4238 20.9074496 3.10342 31.784199 +2746 916 1 -0.8476 21.72394 3.10342 34.31026 +2747 916 2 0.4238 22.540430399999998 3.10342 34.887619 +2748 916 2 0.4238 20.9074496 3.10342 34.887619 +2749 917 1 -0.8476 21.72394 3.10342 37.41368 +2750 917 2 0.4238 22.540430399999998 3.10342 37.991039 +2751 917 2 0.4238 20.9074496 3.10342 37.991039 +2752 918 1 -0.8476 21.72394 3.10342 40.5171 +2753 918 2 0.4238 22.540430399999998 3.10342 41.094459 +2754 918 2 0.4238 20.9074496 3.10342 41.094459 +2755 919 1 -0.8476 21.72394 3.10342 43.62052 +2756 919 2 0.4238 22.540430399999998 3.10342 44.197879 +2757 919 2 0.4238 20.9074496 3.10342 44.197879 +2758 920 1 -0.8476 21.72394 3.10342 46.72394 +2759 920 2 0.4238 22.540430399999998 3.10342 47.301299 +2760 920 2 0.4238 20.9074496 3.10342 47.301299 +2761 921 1 -0.8476 21.72394 3.10342 49.82736 +2762 921 2 0.4238 22.540430399999998 3.10342 50.404719 +2763 921 2 0.4238 20.9074496 3.10342 50.404719 +2764 922 1 -0.8476 21.72394 3.10342 52.93078 +2765 922 2 0.4238 22.540430399999998 3.10342 53.508139 +2766 922 2 0.4238 20.9074496 3.10342 53.508139 +2767 923 1 -0.8476 21.72394 3.10342 56.0342 +2768 923 2 0.4238 22.540430399999998 3.10342 56.611559 +2769 923 2 0.4238 20.9074496 3.10342 56.611559 +2770 924 1 -0.8476 21.72394 3.10342 59.13762 +2771 924 2 0.4238 22.540430399999998 3.10342 59.714979 +2772 924 2 0.4238 20.9074496 3.10342 59.714979 +2773 925 1 -0.8476 21.72394 3.10342 62.24104 +2774 925 2 0.4238 22.540430399999998 3.10342 62.818399 +2775 925 2 0.4238 20.9074496 3.10342 62.818399 +2776 926 1 -0.8476 21.72394 3.10342 65.34446 +2777 926 2 0.4238 22.540430399999998 3.10342 65.921819 +2778 926 2 0.4238 20.9074496 3.10342 65.921819 +2779 927 1 -0.8476 21.72394 3.10342 68.44788 +2780 927 2 0.4238 22.540430399999998 3.10342 69.025239 +2781 927 2 0.4238 20.9074496 3.10342 69.025239 +2782 928 1 -0.8476 21.72394 3.10342 71.5513 +2783 928 2 0.4238 22.540430399999998 3.10342 72.128659 +2784 928 2 0.4238 20.9074496 3.10342 72.128659 +2785 929 1 -0.8476 21.72394 6.20684 25.0 +2786 929 2 0.4238 22.540430399999998 6.20684 25.577359 +2787 929 2 0.4238 20.9074496 6.20684 25.577359 +2788 930 1 -0.8476 21.72394 6.20684 28.10342 +2789 930 2 0.4238 22.540430399999998 6.20684 28.680779 +2790 930 2 0.4238 20.9074496 6.20684 28.680779 +2791 931 1 -0.8476 21.72394 6.20684 31.20684 +2792 931 2 0.4238 22.540430399999998 6.20684 31.784199 +2793 931 2 0.4238 20.9074496 6.20684 31.784199 +2794 932 1 -0.8476 21.72394 6.20684 34.31026 +2795 932 2 0.4238 22.540430399999998 6.20684 34.887619 +2796 932 2 0.4238 20.9074496 6.20684 34.887619 +2797 933 1 -0.8476 21.72394 6.20684 37.41368 +2798 933 2 0.4238 22.540430399999998 6.20684 37.991039 +2799 933 2 0.4238 20.9074496 6.20684 37.991039 +2800 934 1 -0.8476 21.72394 6.20684 40.5171 +2801 934 2 0.4238 22.540430399999998 6.20684 41.094459 +2802 934 2 0.4238 20.9074496 6.20684 41.094459 +2803 935 1 -0.8476 21.72394 6.20684 43.62052 +2804 935 2 0.4238 22.540430399999998 6.20684 44.197879 +2805 935 2 0.4238 20.9074496 6.20684 44.197879 +2806 936 1 -0.8476 21.72394 6.20684 46.72394 +2807 936 2 0.4238 22.540430399999998 6.20684 47.301299 +2808 936 2 0.4238 20.9074496 6.20684 47.301299 +2809 937 1 -0.8476 21.72394 6.20684 49.82736 +2810 937 2 0.4238 22.540430399999998 6.20684 50.404719 +2811 937 2 0.4238 20.9074496 6.20684 50.404719 +2812 938 1 -0.8476 21.72394 6.20684 52.93078 +2813 938 2 0.4238 22.540430399999998 6.20684 53.508139 +2814 938 2 0.4238 20.9074496 6.20684 53.508139 +2815 939 1 -0.8476 21.72394 6.20684 56.0342 +2816 939 2 0.4238 22.540430399999998 6.20684 56.611559 +2817 939 2 0.4238 20.9074496 6.20684 56.611559 +2818 940 1 -0.8476 21.72394 6.20684 59.13762 +2819 940 2 0.4238 22.540430399999998 6.20684 59.714979 +2820 940 2 0.4238 20.9074496 6.20684 59.714979 +2821 941 1 -0.8476 21.72394 6.20684 62.24104 +2822 941 2 0.4238 22.540430399999998 6.20684 62.818399 +2823 941 2 0.4238 20.9074496 6.20684 62.818399 +2824 942 1 -0.8476 21.72394 6.20684 65.34446 +2825 942 2 0.4238 22.540430399999998 6.20684 65.921819 +2826 942 2 0.4238 20.9074496 6.20684 65.921819 +2827 943 1 -0.8476 21.72394 6.20684 68.44788 +2828 943 2 0.4238 22.540430399999998 6.20684 69.025239 +2829 943 2 0.4238 20.9074496 6.20684 69.025239 +2830 944 1 -0.8476 21.72394 6.20684 71.5513 +2831 944 2 0.4238 22.540430399999998 6.20684 72.128659 +2832 944 2 0.4238 20.9074496 6.20684 72.128659 +2833 945 1 -0.8476 21.72394 9.31026 25.0 +2834 945 2 0.4238 22.540430399999998 9.31026 25.577359 +2835 945 2 0.4238 20.9074496 9.31026 25.577359 +2836 946 1 -0.8476 21.72394 9.31026 28.10342 +2837 946 2 0.4238 22.540430399999998 9.31026 28.680779 +2838 946 2 0.4238 20.9074496 9.31026 28.680779 +2839 947 1 -0.8476 21.72394 9.31026 31.20684 +2840 947 2 0.4238 22.540430399999998 9.31026 31.784199 +2841 947 2 0.4238 20.9074496 9.31026 31.784199 +2842 948 1 -0.8476 21.72394 9.31026 34.31026 +2843 948 2 0.4238 22.540430399999998 9.31026 34.887619 +2844 948 2 0.4238 20.9074496 9.31026 34.887619 +2845 949 1 -0.8476 21.72394 9.31026 37.41368 +2846 949 2 0.4238 22.540430399999998 9.31026 37.991039 +2847 949 2 0.4238 20.9074496 9.31026 37.991039 +2848 950 1 -0.8476 21.72394 9.31026 40.5171 +2849 950 2 0.4238 22.540430399999998 9.31026 41.094459 +2850 950 2 0.4238 20.9074496 9.31026 41.094459 +2851 951 1 -0.8476 21.72394 9.31026 43.62052 +2852 951 2 0.4238 22.540430399999998 9.31026 44.197879 +2853 951 2 0.4238 20.9074496 9.31026 44.197879 +2854 952 1 -0.8476 21.72394 9.31026 46.72394 +2855 952 2 0.4238 22.540430399999998 9.31026 47.301299 +2856 952 2 0.4238 20.9074496 9.31026 47.301299 +2857 953 1 -0.8476 21.72394 9.31026 49.82736 +2858 953 2 0.4238 22.540430399999998 9.31026 50.404719 +2859 953 2 0.4238 20.9074496 9.31026 50.404719 +2860 954 1 -0.8476 21.72394 9.31026 52.93078 +2861 954 2 0.4238 22.540430399999998 9.31026 53.508139 +2862 954 2 0.4238 20.9074496 9.31026 53.508139 +2863 955 1 -0.8476 21.72394 9.31026 56.0342 +2864 955 2 0.4238 22.540430399999998 9.31026 56.611559 +2865 955 2 0.4238 20.9074496 9.31026 56.611559 +2866 956 1 -0.8476 21.72394 9.31026 59.13762 +2867 956 2 0.4238 22.540430399999998 9.31026 59.714979 +2868 956 2 0.4238 20.9074496 9.31026 59.714979 +2869 957 1 -0.8476 21.72394 9.31026 62.24104 +2870 957 2 0.4238 22.540430399999998 9.31026 62.818399 +2871 957 2 0.4238 20.9074496 9.31026 62.818399 +2872 958 1 -0.8476 21.72394 9.31026 65.34446 +2873 958 2 0.4238 22.540430399999998 9.31026 65.921819 +2874 958 2 0.4238 20.9074496 9.31026 65.921819 +2875 959 1 -0.8476 21.72394 9.31026 68.44788 +2876 959 2 0.4238 22.540430399999998 9.31026 69.025239 +2877 959 2 0.4238 20.9074496 9.31026 69.025239 +2878 960 1 -0.8476 21.72394 9.31026 71.5513 +2879 960 2 0.4238 22.540430399999998 9.31026 72.128659 +2880 960 2 0.4238 20.9074496 9.31026 72.128659 +2881 961 1 -0.8476 21.72394 12.41368 25.0 +2882 961 2 0.4238 22.540430399999998 12.41368 25.577359 +2883 961 2 0.4238 20.9074496 12.41368 25.577359 +2884 962 1 -0.8476 21.72394 12.41368 28.10342 +2885 962 2 0.4238 22.540430399999998 12.41368 28.680779 +2886 962 2 0.4238 20.9074496 12.41368 28.680779 +2887 963 1 -0.8476 21.72394 12.41368 31.20684 +2888 963 2 0.4238 22.540430399999998 12.41368 31.784199 +2889 963 2 0.4238 20.9074496 12.41368 31.784199 +2890 964 1 -0.8476 21.72394 12.41368 34.31026 +2891 964 2 0.4238 22.540430399999998 12.41368 34.887619 +2892 964 2 0.4238 20.9074496 12.41368 34.887619 +2893 965 1 -0.8476 21.72394 12.41368 37.41368 +2894 965 2 0.4238 22.540430399999998 12.41368 37.991039 +2895 965 2 0.4238 20.9074496 12.41368 37.991039 +2896 966 1 -0.8476 21.72394 12.41368 40.5171 +2897 966 2 0.4238 22.540430399999998 12.41368 41.094459 +2898 966 2 0.4238 20.9074496 12.41368 41.094459 +2899 967 1 -0.8476 21.72394 12.41368 43.62052 +2900 967 2 0.4238 22.540430399999998 12.41368 44.197879 +2901 967 2 0.4238 20.9074496 12.41368 44.197879 +2902 968 1 -0.8476 21.72394 12.41368 46.72394 +2903 968 2 0.4238 22.540430399999998 12.41368 47.301299 +2904 968 2 0.4238 20.9074496 12.41368 47.301299 +2905 969 1 -0.8476 21.72394 12.41368 49.82736 +2906 969 2 0.4238 22.540430399999998 12.41368 50.404719 +2907 969 2 0.4238 20.9074496 12.41368 50.404719 +2908 970 1 -0.8476 21.72394 12.41368 52.93078 +2909 970 2 0.4238 22.540430399999998 12.41368 53.508139 +2910 970 2 0.4238 20.9074496 12.41368 53.508139 +2911 971 1 -0.8476 21.72394 12.41368 56.0342 +2912 971 2 0.4238 22.540430399999998 12.41368 56.611559 +2913 971 2 0.4238 20.9074496 12.41368 56.611559 +2914 972 1 -0.8476 21.72394 12.41368 59.13762 +2915 972 2 0.4238 22.540430399999998 12.41368 59.714979 +2916 972 2 0.4238 20.9074496 12.41368 59.714979 +2917 973 1 -0.8476 21.72394 12.41368 62.24104 +2918 973 2 0.4238 22.540430399999998 12.41368 62.818399 +2919 973 2 0.4238 20.9074496 12.41368 62.818399 +2920 974 1 -0.8476 21.72394 12.41368 65.34446 +2921 974 2 0.4238 22.540430399999998 12.41368 65.921819 +2922 974 2 0.4238 20.9074496 12.41368 65.921819 +2923 975 1 -0.8476 21.72394 12.41368 68.44788 +2924 975 2 0.4238 22.540430399999998 12.41368 69.025239 +2925 975 2 0.4238 20.9074496 12.41368 69.025239 +2926 976 1 -0.8476 21.72394 12.41368 71.5513 +2927 976 2 0.4238 22.540430399999998 12.41368 72.128659 +2928 976 2 0.4238 20.9074496 12.41368 72.128659 +2929 977 1 -0.8476 21.72394 15.5171 25.0 +2930 977 2 0.4238 22.540430399999998 15.5171 25.577359 +2931 977 2 0.4238 20.9074496 15.5171 25.577359 +2932 978 1 -0.8476 21.72394 15.5171 28.10342 +2933 978 2 0.4238 22.540430399999998 15.5171 28.680779 +2934 978 2 0.4238 20.9074496 15.5171 28.680779 +2935 979 1 -0.8476 21.72394 15.5171 31.20684 +2936 979 2 0.4238 22.540430399999998 15.5171 31.784199 +2937 979 2 0.4238 20.9074496 15.5171 31.784199 +2938 980 1 -0.8476 21.72394 15.5171 34.31026 +2939 980 2 0.4238 22.540430399999998 15.5171 34.887619 +2940 980 2 0.4238 20.9074496 15.5171 34.887619 +2941 981 1 -0.8476 21.72394 15.5171 37.41368 +2942 981 2 0.4238 22.540430399999998 15.5171 37.991039 +2943 981 2 0.4238 20.9074496 15.5171 37.991039 +2944 982 1 -0.8476 21.72394 15.5171 40.5171 +2945 982 2 0.4238 22.540430399999998 15.5171 41.094459 +2946 982 2 0.4238 20.9074496 15.5171 41.094459 +2947 983 1 -0.8476 21.72394 15.5171 43.62052 +2948 983 2 0.4238 22.540430399999998 15.5171 44.197879 +2949 983 2 0.4238 20.9074496 15.5171 44.197879 +2950 984 1 -0.8476 21.72394 15.5171 46.72394 +2951 984 2 0.4238 22.540430399999998 15.5171 47.301299 +2952 984 2 0.4238 20.9074496 15.5171 47.301299 +2953 985 1 -0.8476 21.72394 15.5171 49.82736 +2954 985 2 0.4238 22.540430399999998 15.5171 50.404719 +2955 985 2 0.4238 20.9074496 15.5171 50.404719 +2956 986 1 -0.8476 21.72394 15.5171 52.93078 +2957 986 2 0.4238 22.540430399999998 15.5171 53.508139 +2958 986 2 0.4238 20.9074496 15.5171 53.508139 +2959 987 1 -0.8476 21.72394 15.5171 56.0342 +2960 987 2 0.4238 22.540430399999998 15.5171 56.611559 +2961 987 2 0.4238 20.9074496 15.5171 56.611559 +2962 988 1 -0.8476 21.72394 15.5171 59.13762 +2963 988 2 0.4238 22.540430399999998 15.5171 59.714979 +2964 988 2 0.4238 20.9074496 15.5171 59.714979 +2965 989 1 -0.8476 21.72394 15.5171 62.24104 +2966 989 2 0.4238 22.540430399999998 15.5171 62.818399 +2967 989 2 0.4238 20.9074496 15.5171 62.818399 +2968 990 1 -0.8476 21.72394 15.5171 65.34446 +2969 990 2 0.4238 22.540430399999998 15.5171 65.921819 +2970 990 2 0.4238 20.9074496 15.5171 65.921819 +2971 991 1 -0.8476 21.72394 15.5171 68.44788 +2972 991 2 0.4238 22.540430399999998 15.5171 69.025239 +2973 991 2 0.4238 20.9074496 15.5171 69.025239 +2974 992 1 -0.8476 21.72394 15.5171 71.5513 +2975 992 2 0.4238 22.540430399999998 15.5171 72.128659 +2976 992 2 0.4238 20.9074496 15.5171 72.128659 +2977 993 1 -0.8476 21.72394 18.62052 25.0 +2978 993 2 0.4238 22.540430399999998 18.62052 25.577359 +2979 993 2 0.4238 20.9074496 18.62052 25.577359 +2980 994 1 -0.8476 21.72394 18.62052 28.10342 +2981 994 2 0.4238 22.540430399999998 18.62052 28.680779 +2982 994 2 0.4238 20.9074496 18.62052 28.680779 +2983 995 1 -0.8476 21.72394 18.62052 31.20684 +2984 995 2 0.4238 22.540430399999998 18.62052 31.784199 +2985 995 2 0.4238 20.9074496 18.62052 31.784199 +2986 996 1 -0.8476 21.72394 18.62052 34.31026 +2987 996 2 0.4238 22.540430399999998 18.62052 34.887619 +2988 996 2 0.4238 20.9074496 18.62052 34.887619 +2989 997 1 -0.8476 21.72394 18.62052 37.41368 +2990 997 2 0.4238 22.540430399999998 18.62052 37.991039 +2991 997 2 0.4238 20.9074496 18.62052 37.991039 +2992 998 1 -0.8476 21.72394 18.62052 40.5171 +2993 998 2 0.4238 22.540430399999998 18.62052 41.094459 +2994 998 2 0.4238 20.9074496 18.62052 41.094459 +2995 999 1 -0.8476 21.72394 18.62052 43.62052 +2996 999 2 0.4238 22.540430399999998 18.62052 44.197879 +2997 999 2 0.4238 20.9074496 18.62052 44.197879 +2998 1000 1 -0.8476 21.72394 18.62052 46.72394 +2999 1000 2 0.4238 22.540430399999998 18.62052 47.301299 +3000 1000 2 0.4238 20.9074496 18.62052 47.301299 +3001 1001 1 -0.8476 21.72394 18.62052 49.82736 +3002 1001 2 0.4238 22.540430399999998 18.62052 50.404719 +3003 1001 2 0.4238 20.9074496 18.62052 50.404719 +3004 1002 1 -0.8476 21.72394 18.62052 52.93078 +3005 1002 2 0.4238 22.540430399999998 18.62052 53.508139 +3006 1002 2 0.4238 20.9074496 18.62052 53.508139 +3007 1003 1 -0.8476 21.72394 18.62052 56.0342 +3008 1003 2 0.4238 22.540430399999998 18.62052 56.611559 +3009 1003 2 0.4238 20.9074496 18.62052 56.611559 +3010 1004 1 -0.8476 21.72394 18.62052 59.13762 +3011 1004 2 0.4238 22.540430399999998 18.62052 59.714979 +3012 1004 2 0.4238 20.9074496 18.62052 59.714979 +3013 1005 1 -0.8476 21.72394 18.62052 62.24104 +3014 1005 2 0.4238 22.540430399999998 18.62052 62.818399 +3015 1005 2 0.4238 20.9074496 18.62052 62.818399 +3016 1006 1 -0.8476 21.72394 18.62052 65.34446 +3017 1006 2 0.4238 22.540430399999998 18.62052 65.921819 +3018 1006 2 0.4238 20.9074496 18.62052 65.921819 +3019 1007 1 -0.8476 21.72394 18.62052 68.44788 +3020 1007 2 0.4238 22.540430399999998 18.62052 69.025239 +3021 1007 2 0.4238 20.9074496 18.62052 69.025239 +3022 1008 1 -0.8476 21.72394 18.62052 71.5513 +3023 1008 2 0.4238 22.540430399999998 18.62052 72.128659 +3024 1008 2 0.4238 20.9074496 18.62052 72.128659 +3025 1009 1 -0.8476 21.72394 21.72394 25.0 +3026 1009 2 0.4238 22.540430399999998 21.72394 25.577359 +3027 1009 2 0.4238 20.9074496 21.72394 25.577359 +3028 1010 1 -0.8476 21.72394 21.72394 28.10342 +3029 1010 2 0.4238 22.540430399999998 21.72394 28.680779 +3030 1010 2 0.4238 20.9074496 21.72394 28.680779 +3031 1011 1 -0.8476 21.72394 21.72394 31.20684 +3032 1011 2 0.4238 22.540430399999998 21.72394 31.784199 +3033 1011 2 0.4238 20.9074496 21.72394 31.784199 +3034 1012 1 -0.8476 21.72394 21.72394 34.31026 +3035 1012 2 0.4238 22.540430399999998 21.72394 34.887619 +3036 1012 2 0.4238 20.9074496 21.72394 34.887619 +3037 1013 1 -0.8476 21.72394 21.72394 37.41368 +3038 1013 2 0.4238 22.540430399999998 21.72394 37.991039 +3039 1013 2 0.4238 20.9074496 21.72394 37.991039 +3040 1014 1 -0.8476 21.72394 21.72394 40.5171 +3041 1014 2 0.4238 22.540430399999998 21.72394 41.094459 +3042 1014 2 0.4238 20.9074496 21.72394 41.094459 +3043 1015 1 -0.8476 21.72394 21.72394 43.62052 +3044 1015 2 0.4238 22.540430399999998 21.72394 44.197879 +3045 1015 2 0.4238 20.9074496 21.72394 44.197879 +3046 1016 1 -0.8476 21.72394 21.72394 46.72394 +3047 1016 2 0.4238 22.540430399999998 21.72394 47.301299 +3048 1016 2 0.4238 20.9074496 21.72394 47.301299 +3049 1017 1 -0.8476 21.72394 21.72394 49.82736 +3050 1017 2 0.4238 22.540430399999998 21.72394 50.404719 +3051 1017 2 0.4238 20.9074496 21.72394 50.404719 +3052 1018 1 -0.8476 21.72394 21.72394 52.93078 +3053 1018 2 0.4238 22.540430399999998 21.72394 53.508139 +3054 1018 2 0.4238 20.9074496 21.72394 53.508139 +3055 1019 1 -0.8476 21.72394 21.72394 56.0342 +3056 1019 2 0.4238 22.540430399999998 21.72394 56.611559 +3057 1019 2 0.4238 20.9074496 21.72394 56.611559 +3058 1020 1 -0.8476 21.72394 21.72394 59.13762 +3059 1020 2 0.4238 22.540430399999998 21.72394 59.714979 +3060 1020 2 0.4238 20.9074496 21.72394 59.714979 +3061 1021 1 -0.8476 21.72394 21.72394 62.24104 +3062 1021 2 0.4238 22.540430399999998 21.72394 62.818399 +3063 1021 2 0.4238 20.9074496 21.72394 62.818399 +3064 1022 1 -0.8476 21.72394 21.72394 65.34446 +3065 1022 2 0.4238 22.540430399999998 21.72394 65.921819 +3066 1022 2 0.4238 20.9074496 21.72394 65.921819 +3067 1023 1 -0.8476 21.72394 21.72394 68.44788 +3068 1023 2 0.4238 22.540430399999998 21.72394 69.025239 +3069 1023 2 0.4238 20.9074496 21.72394 69.025239 +3070 1024 1 -0.8476 21.72394 21.72394 71.5513 +3071 1024 2 0.4238 22.540430399999998 21.72394 72.128659 +3072 1024 2 0.4238 20.9074496 21.72394 72.128659 + +Bonds + +1 1 1 2 +2 1 1 3 +3 1 4 5 +4 1 4 6 +5 1 7 8 +6 1 7 9 +7 1 10 11 +8 1 10 12 +9 1 13 14 +10 1 13 15 +11 1 16 17 +12 1 16 18 +13 1 19 20 +14 1 19 21 +15 1 22 23 +16 1 22 24 +17 1 25 26 +18 1 25 27 +19 1 28 29 +20 1 28 30 +21 1 31 32 +22 1 31 33 +23 1 34 35 +24 1 34 36 +25 1 37 38 +26 1 37 39 +27 1 40 41 +28 1 40 42 +29 1 43 44 +30 1 43 45 +31 1 46 47 +32 1 46 48 +33 1 49 50 +34 1 49 51 +35 1 52 53 +36 1 52 54 +37 1 55 56 +38 1 55 57 +39 1 58 59 +40 1 58 60 +41 1 61 62 +42 1 61 63 +43 1 64 65 +44 1 64 66 +45 1 67 68 +46 1 67 69 +47 1 70 71 +48 1 70 72 +49 1 73 74 +50 1 73 75 +51 1 76 77 +52 1 76 78 +53 1 79 80 +54 1 79 81 +55 1 82 83 +56 1 82 84 +57 1 85 86 +58 1 85 87 +59 1 88 89 +60 1 88 90 +61 1 91 92 +62 1 91 93 +63 1 94 95 +64 1 94 96 +65 1 97 98 +66 1 97 99 +67 1 100 101 +68 1 100 102 +69 1 103 104 +70 1 103 105 +71 1 106 107 +72 1 106 108 +73 1 109 110 +74 1 109 111 +75 1 112 113 +76 1 112 114 +77 1 115 116 +78 1 115 117 +79 1 118 119 +80 1 118 120 +81 1 121 122 +82 1 121 123 +83 1 124 125 +84 1 124 126 +85 1 127 128 +86 1 127 129 +87 1 130 131 +88 1 130 132 +89 1 133 134 +90 1 133 135 +91 1 136 137 +92 1 136 138 +93 1 139 140 +94 1 139 141 +95 1 142 143 +96 1 142 144 +97 1 145 146 +98 1 145 147 +99 1 148 149 +100 1 148 150 +101 1 151 152 +102 1 151 153 +103 1 154 155 +104 1 154 156 +105 1 157 158 +106 1 157 159 +107 1 160 161 +108 1 160 162 +109 1 163 164 +110 1 163 165 +111 1 166 167 +112 1 166 168 +113 1 169 170 +114 1 169 171 +115 1 172 173 +116 1 172 174 +117 1 175 176 +118 1 175 177 +119 1 178 179 +120 1 178 180 +121 1 181 182 +122 1 181 183 +123 1 184 185 +124 1 184 186 +125 1 187 188 +126 1 187 189 +127 1 190 191 +128 1 190 192 +129 1 193 194 +130 1 193 195 +131 1 196 197 +132 1 196 198 +133 1 199 200 +134 1 199 201 +135 1 202 203 +136 1 202 204 +137 1 205 206 +138 1 205 207 +139 1 208 209 +140 1 208 210 +141 1 211 212 +142 1 211 213 +143 1 214 215 +144 1 214 216 +145 1 217 218 +146 1 217 219 +147 1 220 221 +148 1 220 222 +149 1 223 224 +150 1 223 225 +151 1 226 227 +152 1 226 228 +153 1 229 230 +154 1 229 231 +155 1 232 233 +156 1 232 234 +157 1 235 236 +158 1 235 237 +159 1 238 239 +160 1 238 240 +161 1 241 242 +162 1 241 243 +163 1 244 245 +164 1 244 246 +165 1 247 248 +166 1 247 249 +167 1 250 251 +168 1 250 252 +169 1 253 254 +170 1 253 255 +171 1 256 257 +172 1 256 258 +173 1 259 260 +174 1 259 261 +175 1 262 263 +176 1 262 264 +177 1 265 266 +178 1 265 267 +179 1 268 269 +180 1 268 270 +181 1 271 272 +182 1 271 273 +183 1 274 275 +184 1 274 276 +185 1 277 278 +186 1 277 279 +187 1 280 281 +188 1 280 282 +189 1 283 284 +190 1 283 285 +191 1 286 287 +192 1 286 288 +193 1 289 290 +194 1 289 291 +195 1 292 293 +196 1 292 294 +197 1 295 296 +198 1 295 297 +199 1 298 299 +200 1 298 300 +201 1 301 302 +202 1 301 303 +203 1 304 305 +204 1 304 306 +205 1 307 308 +206 1 307 309 +207 1 310 311 +208 1 310 312 +209 1 313 314 +210 1 313 315 +211 1 316 317 +212 1 316 318 +213 1 319 320 +214 1 319 321 +215 1 322 323 +216 1 322 324 +217 1 325 326 +218 1 325 327 +219 1 328 329 +220 1 328 330 +221 1 331 332 +222 1 331 333 +223 1 334 335 +224 1 334 336 +225 1 337 338 +226 1 337 339 +227 1 340 341 +228 1 340 342 +229 1 343 344 +230 1 343 345 +231 1 346 347 +232 1 346 348 +233 1 349 350 +234 1 349 351 +235 1 352 353 +236 1 352 354 +237 1 355 356 +238 1 355 357 +239 1 358 359 +240 1 358 360 +241 1 361 362 +242 1 361 363 +243 1 364 365 +244 1 364 366 +245 1 367 368 +246 1 367 369 +247 1 370 371 +248 1 370 372 +249 1 373 374 +250 1 373 375 +251 1 376 377 +252 1 376 378 +253 1 379 380 +254 1 379 381 +255 1 382 383 +256 1 382 384 +257 1 385 386 +258 1 385 387 +259 1 388 389 +260 1 388 390 +261 1 391 392 +262 1 391 393 +263 1 394 395 +264 1 394 396 +265 1 397 398 +266 1 397 399 +267 1 400 401 +268 1 400 402 +269 1 403 404 +270 1 403 405 +271 1 406 407 +272 1 406 408 +273 1 409 410 +274 1 409 411 +275 1 412 413 +276 1 412 414 +277 1 415 416 +278 1 415 417 +279 1 418 419 +280 1 418 420 +281 1 421 422 +282 1 421 423 +283 1 424 425 +284 1 424 426 +285 1 427 428 +286 1 427 429 +287 1 430 431 +288 1 430 432 +289 1 433 434 +290 1 433 435 +291 1 436 437 +292 1 436 438 +293 1 439 440 +294 1 439 441 +295 1 442 443 +296 1 442 444 +297 1 445 446 +298 1 445 447 +299 1 448 449 +300 1 448 450 +301 1 451 452 +302 1 451 453 +303 1 454 455 +304 1 454 456 +305 1 457 458 +306 1 457 459 +307 1 460 461 +308 1 460 462 +309 1 463 464 +310 1 463 465 +311 1 466 467 +312 1 466 468 +313 1 469 470 +314 1 469 471 +315 1 472 473 +316 1 472 474 +317 1 475 476 +318 1 475 477 +319 1 478 479 +320 1 478 480 +321 1 481 482 +322 1 481 483 +323 1 484 485 +324 1 484 486 +325 1 487 488 +326 1 487 489 +327 1 490 491 +328 1 490 492 +329 1 493 494 +330 1 493 495 +331 1 496 497 +332 1 496 498 +333 1 499 500 +334 1 499 501 +335 1 502 503 +336 1 502 504 +337 1 505 506 +338 1 505 507 +339 1 508 509 +340 1 508 510 +341 1 511 512 +342 1 511 513 +343 1 514 515 +344 1 514 516 +345 1 517 518 +346 1 517 519 +347 1 520 521 +348 1 520 522 +349 1 523 524 +350 1 523 525 +351 1 526 527 +352 1 526 528 +353 1 529 530 +354 1 529 531 +355 1 532 533 +356 1 532 534 +357 1 535 536 +358 1 535 537 +359 1 538 539 +360 1 538 540 +361 1 541 542 +362 1 541 543 +363 1 544 545 +364 1 544 546 +365 1 547 548 +366 1 547 549 +367 1 550 551 +368 1 550 552 +369 1 553 554 +370 1 553 555 +371 1 556 557 +372 1 556 558 +373 1 559 560 +374 1 559 561 +375 1 562 563 +376 1 562 564 +377 1 565 566 +378 1 565 567 +379 1 568 569 +380 1 568 570 +381 1 571 572 +382 1 571 573 +383 1 574 575 +384 1 574 576 +385 1 577 578 +386 1 577 579 +387 1 580 581 +388 1 580 582 +389 1 583 584 +390 1 583 585 +391 1 586 587 +392 1 586 588 +393 1 589 590 +394 1 589 591 +395 1 592 593 +396 1 592 594 +397 1 595 596 +398 1 595 597 +399 1 598 599 +400 1 598 600 +401 1 601 602 +402 1 601 603 +403 1 604 605 +404 1 604 606 +405 1 607 608 +406 1 607 609 +407 1 610 611 +408 1 610 612 +409 1 613 614 +410 1 613 615 +411 1 616 617 +412 1 616 618 +413 1 619 620 +414 1 619 621 +415 1 622 623 +416 1 622 624 +417 1 625 626 +418 1 625 627 +419 1 628 629 +420 1 628 630 +421 1 631 632 +422 1 631 633 +423 1 634 635 +424 1 634 636 +425 1 637 638 +426 1 637 639 +427 1 640 641 +428 1 640 642 +429 1 643 644 +430 1 643 645 +431 1 646 647 +432 1 646 648 +433 1 649 650 +434 1 649 651 +435 1 652 653 +436 1 652 654 +437 1 655 656 +438 1 655 657 +439 1 658 659 +440 1 658 660 +441 1 661 662 +442 1 661 663 +443 1 664 665 +444 1 664 666 +445 1 667 668 +446 1 667 669 +447 1 670 671 +448 1 670 672 +449 1 673 674 +450 1 673 675 +451 1 676 677 +452 1 676 678 +453 1 679 680 +454 1 679 681 +455 1 682 683 +456 1 682 684 +457 1 685 686 +458 1 685 687 +459 1 688 689 +460 1 688 690 +461 1 691 692 +462 1 691 693 +463 1 694 695 +464 1 694 696 +465 1 697 698 +466 1 697 699 +467 1 700 701 +468 1 700 702 +469 1 703 704 +470 1 703 705 +471 1 706 707 +472 1 706 708 +473 1 709 710 +474 1 709 711 +475 1 712 713 +476 1 712 714 +477 1 715 716 +478 1 715 717 +479 1 718 719 +480 1 718 720 +481 1 721 722 +482 1 721 723 +483 1 724 725 +484 1 724 726 +485 1 727 728 +486 1 727 729 +487 1 730 731 +488 1 730 732 +489 1 733 734 +490 1 733 735 +491 1 736 737 +492 1 736 738 +493 1 739 740 +494 1 739 741 +495 1 742 743 +496 1 742 744 +497 1 745 746 +498 1 745 747 +499 1 748 749 +500 1 748 750 +501 1 751 752 +502 1 751 753 +503 1 754 755 +504 1 754 756 +505 1 757 758 +506 1 757 759 +507 1 760 761 +508 1 760 762 +509 1 763 764 +510 1 763 765 +511 1 766 767 +512 1 766 768 +513 1 769 770 +514 1 769 771 +515 1 772 773 +516 1 772 774 +517 1 775 776 +518 1 775 777 +519 1 778 779 +520 1 778 780 +521 1 781 782 +522 1 781 783 +523 1 784 785 +524 1 784 786 +525 1 787 788 +526 1 787 789 +527 1 790 791 +528 1 790 792 +529 1 793 794 +530 1 793 795 +531 1 796 797 +532 1 796 798 +533 1 799 800 +534 1 799 801 +535 1 802 803 +536 1 802 804 +537 1 805 806 +538 1 805 807 +539 1 808 809 +540 1 808 810 +541 1 811 812 +542 1 811 813 +543 1 814 815 +544 1 814 816 +545 1 817 818 +546 1 817 819 +547 1 820 821 +548 1 820 822 +549 1 823 824 +550 1 823 825 +551 1 826 827 +552 1 826 828 +553 1 829 830 +554 1 829 831 +555 1 832 833 +556 1 832 834 +557 1 835 836 +558 1 835 837 +559 1 838 839 +560 1 838 840 +561 1 841 842 +562 1 841 843 +563 1 844 845 +564 1 844 846 +565 1 847 848 +566 1 847 849 +567 1 850 851 +568 1 850 852 +569 1 853 854 +570 1 853 855 +571 1 856 857 +572 1 856 858 +573 1 859 860 +574 1 859 861 +575 1 862 863 +576 1 862 864 +577 1 865 866 +578 1 865 867 +579 1 868 869 +580 1 868 870 +581 1 871 872 +582 1 871 873 +583 1 874 875 +584 1 874 876 +585 1 877 878 +586 1 877 879 +587 1 880 881 +588 1 880 882 +589 1 883 884 +590 1 883 885 +591 1 886 887 +592 1 886 888 +593 1 889 890 +594 1 889 891 +595 1 892 893 +596 1 892 894 +597 1 895 896 +598 1 895 897 +599 1 898 899 +600 1 898 900 +601 1 901 902 +602 1 901 903 +603 1 904 905 +604 1 904 906 +605 1 907 908 +606 1 907 909 +607 1 910 911 +608 1 910 912 +609 1 913 914 +610 1 913 915 +611 1 916 917 +612 1 916 918 +613 1 919 920 +614 1 919 921 +615 1 922 923 +616 1 922 924 +617 1 925 926 +618 1 925 927 +619 1 928 929 +620 1 928 930 +621 1 931 932 +622 1 931 933 +623 1 934 935 +624 1 934 936 +625 1 937 938 +626 1 937 939 +627 1 940 941 +628 1 940 942 +629 1 943 944 +630 1 943 945 +631 1 946 947 +632 1 946 948 +633 1 949 950 +634 1 949 951 +635 1 952 953 +636 1 952 954 +637 1 955 956 +638 1 955 957 +639 1 958 959 +640 1 958 960 +641 1 961 962 +642 1 961 963 +643 1 964 965 +644 1 964 966 +645 1 967 968 +646 1 967 969 +647 1 970 971 +648 1 970 972 +649 1 973 974 +650 1 973 975 +651 1 976 977 +652 1 976 978 +653 1 979 980 +654 1 979 981 +655 1 982 983 +656 1 982 984 +657 1 985 986 +658 1 985 987 +659 1 988 989 +660 1 988 990 +661 1 991 992 +662 1 991 993 +663 1 994 995 +664 1 994 996 +665 1 997 998 +666 1 997 999 +667 1 1000 1001 +668 1 1000 1002 +669 1 1003 1004 +670 1 1003 1005 +671 1 1006 1007 +672 1 1006 1008 +673 1 1009 1010 +674 1 1009 1011 +675 1 1012 1013 +676 1 1012 1014 +677 1 1015 1016 +678 1 1015 1017 +679 1 1018 1019 +680 1 1018 1020 +681 1 1021 1022 +682 1 1021 1023 +683 1 1024 1025 +684 1 1024 1026 +685 1 1027 1028 +686 1 1027 1029 +687 1 1030 1031 +688 1 1030 1032 +689 1 1033 1034 +690 1 1033 1035 +691 1 1036 1037 +692 1 1036 1038 +693 1 1039 1040 +694 1 1039 1041 +695 1 1042 1043 +696 1 1042 1044 +697 1 1045 1046 +698 1 1045 1047 +699 1 1048 1049 +700 1 1048 1050 +701 1 1051 1052 +702 1 1051 1053 +703 1 1054 1055 +704 1 1054 1056 +705 1 1057 1058 +706 1 1057 1059 +707 1 1060 1061 +708 1 1060 1062 +709 1 1063 1064 +710 1 1063 1065 +711 1 1066 1067 +712 1 1066 1068 +713 1 1069 1070 +714 1 1069 1071 +715 1 1072 1073 +716 1 1072 1074 +717 1 1075 1076 +718 1 1075 1077 +719 1 1078 1079 +720 1 1078 1080 +721 1 1081 1082 +722 1 1081 1083 +723 1 1084 1085 +724 1 1084 1086 +725 1 1087 1088 +726 1 1087 1089 +727 1 1090 1091 +728 1 1090 1092 +729 1 1093 1094 +730 1 1093 1095 +731 1 1096 1097 +732 1 1096 1098 +733 1 1099 1100 +734 1 1099 1101 +735 1 1102 1103 +736 1 1102 1104 +737 1 1105 1106 +738 1 1105 1107 +739 1 1108 1109 +740 1 1108 1110 +741 1 1111 1112 +742 1 1111 1113 +743 1 1114 1115 +744 1 1114 1116 +745 1 1117 1118 +746 1 1117 1119 +747 1 1120 1121 +748 1 1120 1122 +749 1 1123 1124 +750 1 1123 1125 +751 1 1126 1127 +752 1 1126 1128 +753 1 1129 1130 +754 1 1129 1131 +755 1 1132 1133 +756 1 1132 1134 +757 1 1135 1136 +758 1 1135 1137 +759 1 1138 1139 +760 1 1138 1140 +761 1 1141 1142 +762 1 1141 1143 +763 1 1144 1145 +764 1 1144 1146 +765 1 1147 1148 +766 1 1147 1149 +767 1 1150 1151 +768 1 1150 1152 +769 1 1153 1154 +770 1 1153 1155 +771 1 1156 1157 +772 1 1156 1158 +773 1 1159 1160 +774 1 1159 1161 +775 1 1162 1163 +776 1 1162 1164 +777 1 1165 1166 +778 1 1165 1167 +779 1 1168 1169 +780 1 1168 1170 +781 1 1171 1172 +782 1 1171 1173 +783 1 1174 1175 +784 1 1174 1176 +785 1 1177 1178 +786 1 1177 1179 +787 1 1180 1181 +788 1 1180 1182 +789 1 1183 1184 +790 1 1183 1185 +791 1 1186 1187 +792 1 1186 1188 +793 1 1189 1190 +794 1 1189 1191 +795 1 1192 1193 +796 1 1192 1194 +797 1 1195 1196 +798 1 1195 1197 +799 1 1198 1199 +800 1 1198 1200 +801 1 1201 1202 +802 1 1201 1203 +803 1 1204 1205 +804 1 1204 1206 +805 1 1207 1208 +806 1 1207 1209 +807 1 1210 1211 +808 1 1210 1212 +809 1 1213 1214 +810 1 1213 1215 +811 1 1216 1217 +812 1 1216 1218 +813 1 1219 1220 +814 1 1219 1221 +815 1 1222 1223 +816 1 1222 1224 +817 1 1225 1226 +818 1 1225 1227 +819 1 1228 1229 +820 1 1228 1230 +821 1 1231 1232 +822 1 1231 1233 +823 1 1234 1235 +824 1 1234 1236 +825 1 1237 1238 +826 1 1237 1239 +827 1 1240 1241 +828 1 1240 1242 +829 1 1243 1244 +830 1 1243 1245 +831 1 1246 1247 +832 1 1246 1248 +833 1 1249 1250 +834 1 1249 1251 +835 1 1252 1253 +836 1 1252 1254 +837 1 1255 1256 +838 1 1255 1257 +839 1 1258 1259 +840 1 1258 1260 +841 1 1261 1262 +842 1 1261 1263 +843 1 1264 1265 +844 1 1264 1266 +845 1 1267 1268 +846 1 1267 1269 +847 1 1270 1271 +848 1 1270 1272 +849 1 1273 1274 +850 1 1273 1275 +851 1 1276 1277 +852 1 1276 1278 +853 1 1279 1280 +854 1 1279 1281 +855 1 1282 1283 +856 1 1282 1284 +857 1 1285 1286 +858 1 1285 1287 +859 1 1288 1289 +860 1 1288 1290 +861 1 1291 1292 +862 1 1291 1293 +863 1 1294 1295 +864 1 1294 1296 +865 1 1297 1298 +866 1 1297 1299 +867 1 1300 1301 +868 1 1300 1302 +869 1 1303 1304 +870 1 1303 1305 +871 1 1306 1307 +872 1 1306 1308 +873 1 1309 1310 +874 1 1309 1311 +875 1 1312 1313 +876 1 1312 1314 +877 1 1315 1316 +878 1 1315 1317 +879 1 1318 1319 +880 1 1318 1320 +881 1 1321 1322 +882 1 1321 1323 +883 1 1324 1325 +884 1 1324 1326 +885 1 1327 1328 +886 1 1327 1329 +887 1 1330 1331 +888 1 1330 1332 +889 1 1333 1334 +890 1 1333 1335 +891 1 1336 1337 +892 1 1336 1338 +893 1 1339 1340 +894 1 1339 1341 +895 1 1342 1343 +896 1 1342 1344 +897 1 1345 1346 +898 1 1345 1347 +899 1 1348 1349 +900 1 1348 1350 +901 1 1351 1352 +902 1 1351 1353 +903 1 1354 1355 +904 1 1354 1356 +905 1 1357 1358 +906 1 1357 1359 +907 1 1360 1361 +908 1 1360 1362 +909 1 1363 1364 +910 1 1363 1365 +911 1 1366 1367 +912 1 1366 1368 +913 1 1369 1370 +914 1 1369 1371 +915 1 1372 1373 +916 1 1372 1374 +917 1 1375 1376 +918 1 1375 1377 +919 1 1378 1379 +920 1 1378 1380 +921 1 1381 1382 +922 1 1381 1383 +923 1 1384 1385 +924 1 1384 1386 +925 1 1387 1388 +926 1 1387 1389 +927 1 1390 1391 +928 1 1390 1392 +929 1 1393 1394 +930 1 1393 1395 +931 1 1396 1397 +932 1 1396 1398 +933 1 1399 1400 +934 1 1399 1401 +935 1 1402 1403 +936 1 1402 1404 +937 1 1405 1406 +938 1 1405 1407 +939 1 1408 1409 +940 1 1408 1410 +941 1 1411 1412 +942 1 1411 1413 +943 1 1414 1415 +944 1 1414 1416 +945 1 1417 1418 +946 1 1417 1419 +947 1 1420 1421 +948 1 1420 1422 +949 1 1423 1424 +950 1 1423 1425 +951 1 1426 1427 +952 1 1426 1428 +953 1 1429 1430 +954 1 1429 1431 +955 1 1432 1433 +956 1 1432 1434 +957 1 1435 1436 +958 1 1435 1437 +959 1 1438 1439 +960 1 1438 1440 +961 1 1441 1442 +962 1 1441 1443 +963 1 1444 1445 +964 1 1444 1446 +965 1 1447 1448 +966 1 1447 1449 +967 1 1450 1451 +968 1 1450 1452 +969 1 1453 1454 +970 1 1453 1455 +971 1 1456 1457 +972 1 1456 1458 +973 1 1459 1460 +974 1 1459 1461 +975 1 1462 1463 +976 1 1462 1464 +977 1 1465 1466 +978 1 1465 1467 +979 1 1468 1469 +980 1 1468 1470 +981 1 1471 1472 +982 1 1471 1473 +983 1 1474 1475 +984 1 1474 1476 +985 1 1477 1478 +986 1 1477 1479 +987 1 1480 1481 +988 1 1480 1482 +989 1 1483 1484 +990 1 1483 1485 +991 1 1486 1487 +992 1 1486 1488 +993 1 1489 1490 +994 1 1489 1491 +995 1 1492 1493 +996 1 1492 1494 +997 1 1495 1496 +998 1 1495 1497 +999 1 1498 1499 +1000 1 1498 1500 +1001 1 1501 1502 +1002 1 1501 1503 +1003 1 1504 1505 +1004 1 1504 1506 +1005 1 1507 1508 +1006 1 1507 1509 +1007 1 1510 1511 +1008 1 1510 1512 +1009 1 1513 1514 +1010 1 1513 1515 +1011 1 1516 1517 +1012 1 1516 1518 +1013 1 1519 1520 +1014 1 1519 1521 +1015 1 1522 1523 +1016 1 1522 1524 +1017 1 1525 1526 +1018 1 1525 1527 +1019 1 1528 1529 +1020 1 1528 1530 +1021 1 1531 1532 +1022 1 1531 1533 +1023 1 1534 1535 +1024 1 1534 1536 +1025 1 1537 1538 +1026 1 1537 1539 +1027 1 1540 1541 +1028 1 1540 1542 +1029 1 1543 1544 +1030 1 1543 1545 +1031 1 1546 1547 +1032 1 1546 1548 +1033 1 1549 1550 +1034 1 1549 1551 +1035 1 1552 1553 +1036 1 1552 1554 +1037 1 1555 1556 +1038 1 1555 1557 +1039 1 1558 1559 +1040 1 1558 1560 +1041 1 1561 1562 +1042 1 1561 1563 +1043 1 1564 1565 +1044 1 1564 1566 +1045 1 1567 1568 +1046 1 1567 1569 +1047 1 1570 1571 +1048 1 1570 1572 +1049 1 1573 1574 +1050 1 1573 1575 +1051 1 1576 1577 +1052 1 1576 1578 +1053 1 1579 1580 +1054 1 1579 1581 +1055 1 1582 1583 +1056 1 1582 1584 +1057 1 1585 1586 +1058 1 1585 1587 +1059 1 1588 1589 +1060 1 1588 1590 +1061 1 1591 1592 +1062 1 1591 1593 +1063 1 1594 1595 +1064 1 1594 1596 +1065 1 1597 1598 +1066 1 1597 1599 +1067 1 1600 1601 +1068 1 1600 1602 +1069 1 1603 1604 +1070 1 1603 1605 +1071 1 1606 1607 +1072 1 1606 1608 +1073 1 1609 1610 +1074 1 1609 1611 +1075 1 1612 1613 +1076 1 1612 1614 +1077 1 1615 1616 +1078 1 1615 1617 +1079 1 1618 1619 +1080 1 1618 1620 +1081 1 1621 1622 +1082 1 1621 1623 +1083 1 1624 1625 +1084 1 1624 1626 +1085 1 1627 1628 +1086 1 1627 1629 +1087 1 1630 1631 +1088 1 1630 1632 +1089 1 1633 1634 +1090 1 1633 1635 +1091 1 1636 1637 +1092 1 1636 1638 +1093 1 1639 1640 +1094 1 1639 1641 +1095 1 1642 1643 +1096 1 1642 1644 +1097 1 1645 1646 +1098 1 1645 1647 +1099 1 1648 1649 +1100 1 1648 1650 +1101 1 1651 1652 +1102 1 1651 1653 +1103 1 1654 1655 +1104 1 1654 1656 +1105 1 1657 1658 +1106 1 1657 1659 +1107 1 1660 1661 +1108 1 1660 1662 +1109 1 1663 1664 +1110 1 1663 1665 +1111 1 1666 1667 +1112 1 1666 1668 +1113 1 1669 1670 +1114 1 1669 1671 +1115 1 1672 1673 +1116 1 1672 1674 +1117 1 1675 1676 +1118 1 1675 1677 +1119 1 1678 1679 +1120 1 1678 1680 +1121 1 1681 1682 +1122 1 1681 1683 +1123 1 1684 1685 +1124 1 1684 1686 +1125 1 1687 1688 +1126 1 1687 1689 +1127 1 1690 1691 +1128 1 1690 1692 +1129 1 1693 1694 +1130 1 1693 1695 +1131 1 1696 1697 +1132 1 1696 1698 +1133 1 1699 1700 +1134 1 1699 1701 +1135 1 1702 1703 +1136 1 1702 1704 +1137 1 1705 1706 +1138 1 1705 1707 +1139 1 1708 1709 +1140 1 1708 1710 +1141 1 1711 1712 +1142 1 1711 1713 +1143 1 1714 1715 +1144 1 1714 1716 +1145 1 1717 1718 +1146 1 1717 1719 +1147 1 1720 1721 +1148 1 1720 1722 +1149 1 1723 1724 +1150 1 1723 1725 +1151 1 1726 1727 +1152 1 1726 1728 +1153 1 1729 1730 +1154 1 1729 1731 +1155 1 1732 1733 +1156 1 1732 1734 +1157 1 1735 1736 +1158 1 1735 1737 +1159 1 1738 1739 +1160 1 1738 1740 +1161 1 1741 1742 +1162 1 1741 1743 +1163 1 1744 1745 +1164 1 1744 1746 +1165 1 1747 1748 +1166 1 1747 1749 +1167 1 1750 1751 +1168 1 1750 1752 +1169 1 1753 1754 +1170 1 1753 1755 +1171 1 1756 1757 +1172 1 1756 1758 +1173 1 1759 1760 +1174 1 1759 1761 +1175 1 1762 1763 +1176 1 1762 1764 +1177 1 1765 1766 +1178 1 1765 1767 +1179 1 1768 1769 +1180 1 1768 1770 +1181 1 1771 1772 +1182 1 1771 1773 +1183 1 1774 1775 +1184 1 1774 1776 +1185 1 1777 1778 +1186 1 1777 1779 +1187 1 1780 1781 +1188 1 1780 1782 +1189 1 1783 1784 +1190 1 1783 1785 +1191 1 1786 1787 +1192 1 1786 1788 +1193 1 1789 1790 +1194 1 1789 1791 +1195 1 1792 1793 +1196 1 1792 1794 +1197 1 1795 1796 +1198 1 1795 1797 +1199 1 1798 1799 +1200 1 1798 1800 +1201 1 1801 1802 +1202 1 1801 1803 +1203 1 1804 1805 +1204 1 1804 1806 +1205 1 1807 1808 +1206 1 1807 1809 +1207 1 1810 1811 +1208 1 1810 1812 +1209 1 1813 1814 +1210 1 1813 1815 +1211 1 1816 1817 +1212 1 1816 1818 +1213 1 1819 1820 +1214 1 1819 1821 +1215 1 1822 1823 +1216 1 1822 1824 +1217 1 1825 1826 +1218 1 1825 1827 +1219 1 1828 1829 +1220 1 1828 1830 +1221 1 1831 1832 +1222 1 1831 1833 +1223 1 1834 1835 +1224 1 1834 1836 +1225 1 1837 1838 +1226 1 1837 1839 +1227 1 1840 1841 +1228 1 1840 1842 +1229 1 1843 1844 +1230 1 1843 1845 +1231 1 1846 1847 +1232 1 1846 1848 +1233 1 1849 1850 +1234 1 1849 1851 +1235 1 1852 1853 +1236 1 1852 1854 +1237 1 1855 1856 +1238 1 1855 1857 +1239 1 1858 1859 +1240 1 1858 1860 +1241 1 1861 1862 +1242 1 1861 1863 +1243 1 1864 1865 +1244 1 1864 1866 +1245 1 1867 1868 +1246 1 1867 1869 +1247 1 1870 1871 +1248 1 1870 1872 +1249 1 1873 1874 +1250 1 1873 1875 +1251 1 1876 1877 +1252 1 1876 1878 +1253 1 1879 1880 +1254 1 1879 1881 +1255 1 1882 1883 +1256 1 1882 1884 +1257 1 1885 1886 +1258 1 1885 1887 +1259 1 1888 1889 +1260 1 1888 1890 +1261 1 1891 1892 +1262 1 1891 1893 +1263 1 1894 1895 +1264 1 1894 1896 +1265 1 1897 1898 +1266 1 1897 1899 +1267 1 1900 1901 +1268 1 1900 1902 +1269 1 1903 1904 +1270 1 1903 1905 +1271 1 1906 1907 +1272 1 1906 1908 +1273 1 1909 1910 +1274 1 1909 1911 +1275 1 1912 1913 +1276 1 1912 1914 +1277 1 1915 1916 +1278 1 1915 1917 +1279 1 1918 1919 +1280 1 1918 1920 +1281 1 1921 1922 +1282 1 1921 1923 +1283 1 1924 1925 +1284 1 1924 1926 +1285 1 1927 1928 +1286 1 1927 1929 +1287 1 1930 1931 +1288 1 1930 1932 +1289 1 1933 1934 +1290 1 1933 1935 +1291 1 1936 1937 +1292 1 1936 1938 +1293 1 1939 1940 +1294 1 1939 1941 +1295 1 1942 1943 +1296 1 1942 1944 +1297 1 1945 1946 +1298 1 1945 1947 +1299 1 1948 1949 +1300 1 1948 1950 +1301 1 1951 1952 +1302 1 1951 1953 +1303 1 1954 1955 +1304 1 1954 1956 +1305 1 1957 1958 +1306 1 1957 1959 +1307 1 1960 1961 +1308 1 1960 1962 +1309 1 1963 1964 +1310 1 1963 1965 +1311 1 1966 1967 +1312 1 1966 1968 +1313 1 1969 1970 +1314 1 1969 1971 +1315 1 1972 1973 +1316 1 1972 1974 +1317 1 1975 1976 +1318 1 1975 1977 +1319 1 1978 1979 +1320 1 1978 1980 +1321 1 1981 1982 +1322 1 1981 1983 +1323 1 1984 1985 +1324 1 1984 1986 +1325 1 1987 1988 +1326 1 1987 1989 +1327 1 1990 1991 +1328 1 1990 1992 +1329 1 1993 1994 +1330 1 1993 1995 +1331 1 1996 1997 +1332 1 1996 1998 +1333 1 1999 2000 +1334 1 1999 2001 +1335 1 2002 2003 +1336 1 2002 2004 +1337 1 2005 2006 +1338 1 2005 2007 +1339 1 2008 2009 +1340 1 2008 2010 +1341 1 2011 2012 +1342 1 2011 2013 +1343 1 2014 2015 +1344 1 2014 2016 +1345 1 2017 2018 +1346 1 2017 2019 +1347 1 2020 2021 +1348 1 2020 2022 +1349 1 2023 2024 +1350 1 2023 2025 +1351 1 2026 2027 +1352 1 2026 2028 +1353 1 2029 2030 +1354 1 2029 2031 +1355 1 2032 2033 +1356 1 2032 2034 +1357 1 2035 2036 +1358 1 2035 2037 +1359 1 2038 2039 +1360 1 2038 2040 +1361 1 2041 2042 +1362 1 2041 2043 +1363 1 2044 2045 +1364 1 2044 2046 +1365 1 2047 2048 +1366 1 2047 2049 +1367 1 2050 2051 +1368 1 2050 2052 +1369 1 2053 2054 +1370 1 2053 2055 +1371 1 2056 2057 +1372 1 2056 2058 +1373 1 2059 2060 +1374 1 2059 2061 +1375 1 2062 2063 +1376 1 2062 2064 +1377 1 2065 2066 +1378 1 2065 2067 +1379 1 2068 2069 +1380 1 2068 2070 +1381 1 2071 2072 +1382 1 2071 2073 +1383 1 2074 2075 +1384 1 2074 2076 +1385 1 2077 2078 +1386 1 2077 2079 +1387 1 2080 2081 +1388 1 2080 2082 +1389 1 2083 2084 +1390 1 2083 2085 +1391 1 2086 2087 +1392 1 2086 2088 +1393 1 2089 2090 +1394 1 2089 2091 +1395 1 2092 2093 +1396 1 2092 2094 +1397 1 2095 2096 +1398 1 2095 2097 +1399 1 2098 2099 +1400 1 2098 2100 +1401 1 2101 2102 +1402 1 2101 2103 +1403 1 2104 2105 +1404 1 2104 2106 +1405 1 2107 2108 +1406 1 2107 2109 +1407 1 2110 2111 +1408 1 2110 2112 +1409 1 2113 2114 +1410 1 2113 2115 +1411 1 2116 2117 +1412 1 2116 2118 +1413 1 2119 2120 +1414 1 2119 2121 +1415 1 2122 2123 +1416 1 2122 2124 +1417 1 2125 2126 +1418 1 2125 2127 +1419 1 2128 2129 +1420 1 2128 2130 +1421 1 2131 2132 +1422 1 2131 2133 +1423 1 2134 2135 +1424 1 2134 2136 +1425 1 2137 2138 +1426 1 2137 2139 +1427 1 2140 2141 +1428 1 2140 2142 +1429 1 2143 2144 +1430 1 2143 2145 +1431 1 2146 2147 +1432 1 2146 2148 +1433 1 2149 2150 +1434 1 2149 2151 +1435 1 2152 2153 +1436 1 2152 2154 +1437 1 2155 2156 +1438 1 2155 2157 +1439 1 2158 2159 +1440 1 2158 2160 +1441 1 2161 2162 +1442 1 2161 2163 +1443 1 2164 2165 +1444 1 2164 2166 +1445 1 2167 2168 +1446 1 2167 2169 +1447 1 2170 2171 +1448 1 2170 2172 +1449 1 2173 2174 +1450 1 2173 2175 +1451 1 2176 2177 +1452 1 2176 2178 +1453 1 2179 2180 +1454 1 2179 2181 +1455 1 2182 2183 +1456 1 2182 2184 +1457 1 2185 2186 +1458 1 2185 2187 +1459 1 2188 2189 +1460 1 2188 2190 +1461 1 2191 2192 +1462 1 2191 2193 +1463 1 2194 2195 +1464 1 2194 2196 +1465 1 2197 2198 +1466 1 2197 2199 +1467 1 2200 2201 +1468 1 2200 2202 +1469 1 2203 2204 +1470 1 2203 2205 +1471 1 2206 2207 +1472 1 2206 2208 +1473 1 2209 2210 +1474 1 2209 2211 +1475 1 2212 2213 +1476 1 2212 2214 +1477 1 2215 2216 +1478 1 2215 2217 +1479 1 2218 2219 +1480 1 2218 2220 +1481 1 2221 2222 +1482 1 2221 2223 +1483 1 2224 2225 +1484 1 2224 2226 +1485 1 2227 2228 +1486 1 2227 2229 +1487 1 2230 2231 +1488 1 2230 2232 +1489 1 2233 2234 +1490 1 2233 2235 +1491 1 2236 2237 +1492 1 2236 2238 +1493 1 2239 2240 +1494 1 2239 2241 +1495 1 2242 2243 +1496 1 2242 2244 +1497 1 2245 2246 +1498 1 2245 2247 +1499 1 2248 2249 +1500 1 2248 2250 +1501 1 2251 2252 +1502 1 2251 2253 +1503 1 2254 2255 +1504 1 2254 2256 +1505 1 2257 2258 +1506 1 2257 2259 +1507 1 2260 2261 +1508 1 2260 2262 +1509 1 2263 2264 +1510 1 2263 2265 +1511 1 2266 2267 +1512 1 2266 2268 +1513 1 2269 2270 +1514 1 2269 2271 +1515 1 2272 2273 +1516 1 2272 2274 +1517 1 2275 2276 +1518 1 2275 2277 +1519 1 2278 2279 +1520 1 2278 2280 +1521 1 2281 2282 +1522 1 2281 2283 +1523 1 2284 2285 +1524 1 2284 2286 +1525 1 2287 2288 +1526 1 2287 2289 +1527 1 2290 2291 +1528 1 2290 2292 +1529 1 2293 2294 +1530 1 2293 2295 +1531 1 2296 2297 +1532 1 2296 2298 +1533 1 2299 2300 +1534 1 2299 2301 +1535 1 2302 2303 +1536 1 2302 2304 +1537 1 2305 2306 +1538 1 2305 2307 +1539 1 2308 2309 +1540 1 2308 2310 +1541 1 2311 2312 +1542 1 2311 2313 +1543 1 2314 2315 +1544 1 2314 2316 +1545 1 2317 2318 +1546 1 2317 2319 +1547 1 2320 2321 +1548 1 2320 2322 +1549 1 2323 2324 +1550 1 2323 2325 +1551 1 2326 2327 +1552 1 2326 2328 +1553 1 2329 2330 +1554 1 2329 2331 +1555 1 2332 2333 +1556 1 2332 2334 +1557 1 2335 2336 +1558 1 2335 2337 +1559 1 2338 2339 +1560 1 2338 2340 +1561 1 2341 2342 +1562 1 2341 2343 +1563 1 2344 2345 +1564 1 2344 2346 +1565 1 2347 2348 +1566 1 2347 2349 +1567 1 2350 2351 +1568 1 2350 2352 +1569 1 2353 2354 +1570 1 2353 2355 +1571 1 2356 2357 +1572 1 2356 2358 +1573 1 2359 2360 +1574 1 2359 2361 +1575 1 2362 2363 +1576 1 2362 2364 +1577 1 2365 2366 +1578 1 2365 2367 +1579 1 2368 2369 +1580 1 2368 2370 +1581 1 2371 2372 +1582 1 2371 2373 +1583 1 2374 2375 +1584 1 2374 2376 +1585 1 2377 2378 +1586 1 2377 2379 +1587 1 2380 2381 +1588 1 2380 2382 +1589 1 2383 2384 +1590 1 2383 2385 +1591 1 2386 2387 +1592 1 2386 2388 +1593 1 2389 2390 +1594 1 2389 2391 +1595 1 2392 2393 +1596 1 2392 2394 +1597 1 2395 2396 +1598 1 2395 2397 +1599 1 2398 2399 +1600 1 2398 2400 +1601 1 2401 2402 +1602 1 2401 2403 +1603 1 2404 2405 +1604 1 2404 2406 +1605 1 2407 2408 +1606 1 2407 2409 +1607 1 2410 2411 +1608 1 2410 2412 +1609 1 2413 2414 +1610 1 2413 2415 +1611 1 2416 2417 +1612 1 2416 2418 +1613 1 2419 2420 +1614 1 2419 2421 +1615 1 2422 2423 +1616 1 2422 2424 +1617 1 2425 2426 +1618 1 2425 2427 +1619 1 2428 2429 +1620 1 2428 2430 +1621 1 2431 2432 +1622 1 2431 2433 +1623 1 2434 2435 +1624 1 2434 2436 +1625 1 2437 2438 +1626 1 2437 2439 +1627 1 2440 2441 +1628 1 2440 2442 +1629 1 2443 2444 +1630 1 2443 2445 +1631 1 2446 2447 +1632 1 2446 2448 +1633 1 2449 2450 +1634 1 2449 2451 +1635 1 2452 2453 +1636 1 2452 2454 +1637 1 2455 2456 +1638 1 2455 2457 +1639 1 2458 2459 +1640 1 2458 2460 +1641 1 2461 2462 +1642 1 2461 2463 +1643 1 2464 2465 +1644 1 2464 2466 +1645 1 2467 2468 +1646 1 2467 2469 +1647 1 2470 2471 +1648 1 2470 2472 +1649 1 2473 2474 +1650 1 2473 2475 +1651 1 2476 2477 +1652 1 2476 2478 +1653 1 2479 2480 +1654 1 2479 2481 +1655 1 2482 2483 +1656 1 2482 2484 +1657 1 2485 2486 +1658 1 2485 2487 +1659 1 2488 2489 +1660 1 2488 2490 +1661 1 2491 2492 +1662 1 2491 2493 +1663 1 2494 2495 +1664 1 2494 2496 +1665 1 2497 2498 +1666 1 2497 2499 +1667 1 2500 2501 +1668 1 2500 2502 +1669 1 2503 2504 +1670 1 2503 2505 +1671 1 2506 2507 +1672 1 2506 2508 +1673 1 2509 2510 +1674 1 2509 2511 +1675 1 2512 2513 +1676 1 2512 2514 +1677 1 2515 2516 +1678 1 2515 2517 +1679 1 2518 2519 +1680 1 2518 2520 +1681 1 2521 2522 +1682 1 2521 2523 +1683 1 2524 2525 +1684 1 2524 2526 +1685 1 2527 2528 +1686 1 2527 2529 +1687 1 2530 2531 +1688 1 2530 2532 +1689 1 2533 2534 +1690 1 2533 2535 +1691 1 2536 2537 +1692 1 2536 2538 +1693 1 2539 2540 +1694 1 2539 2541 +1695 1 2542 2543 +1696 1 2542 2544 +1697 1 2545 2546 +1698 1 2545 2547 +1699 1 2548 2549 +1700 1 2548 2550 +1701 1 2551 2552 +1702 1 2551 2553 +1703 1 2554 2555 +1704 1 2554 2556 +1705 1 2557 2558 +1706 1 2557 2559 +1707 1 2560 2561 +1708 1 2560 2562 +1709 1 2563 2564 +1710 1 2563 2565 +1711 1 2566 2567 +1712 1 2566 2568 +1713 1 2569 2570 +1714 1 2569 2571 +1715 1 2572 2573 +1716 1 2572 2574 +1717 1 2575 2576 +1718 1 2575 2577 +1719 1 2578 2579 +1720 1 2578 2580 +1721 1 2581 2582 +1722 1 2581 2583 +1723 1 2584 2585 +1724 1 2584 2586 +1725 1 2587 2588 +1726 1 2587 2589 +1727 1 2590 2591 +1728 1 2590 2592 +1729 1 2593 2594 +1730 1 2593 2595 +1731 1 2596 2597 +1732 1 2596 2598 +1733 1 2599 2600 +1734 1 2599 2601 +1735 1 2602 2603 +1736 1 2602 2604 +1737 1 2605 2606 +1738 1 2605 2607 +1739 1 2608 2609 +1740 1 2608 2610 +1741 1 2611 2612 +1742 1 2611 2613 +1743 1 2614 2615 +1744 1 2614 2616 +1745 1 2617 2618 +1746 1 2617 2619 +1747 1 2620 2621 +1748 1 2620 2622 +1749 1 2623 2624 +1750 1 2623 2625 +1751 1 2626 2627 +1752 1 2626 2628 +1753 1 2629 2630 +1754 1 2629 2631 +1755 1 2632 2633 +1756 1 2632 2634 +1757 1 2635 2636 +1758 1 2635 2637 +1759 1 2638 2639 +1760 1 2638 2640 +1761 1 2641 2642 +1762 1 2641 2643 +1763 1 2644 2645 +1764 1 2644 2646 +1765 1 2647 2648 +1766 1 2647 2649 +1767 1 2650 2651 +1768 1 2650 2652 +1769 1 2653 2654 +1770 1 2653 2655 +1771 1 2656 2657 +1772 1 2656 2658 +1773 1 2659 2660 +1774 1 2659 2661 +1775 1 2662 2663 +1776 1 2662 2664 +1777 1 2665 2666 +1778 1 2665 2667 +1779 1 2668 2669 +1780 1 2668 2670 +1781 1 2671 2672 +1782 1 2671 2673 +1783 1 2674 2675 +1784 1 2674 2676 +1785 1 2677 2678 +1786 1 2677 2679 +1787 1 2680 2681 +1788 1 2680 2682 +1789 1 2683 2684 +1790 1 2683 2685 +1791 1 2686 2687 +1792 1 2686 2688 +1793 1 2689 2690 +1794 1 2689 2691 +1795 1 2692 2693 +1796 1 2692 2694 +1797 1 2695 2696 +1798 1 2695 2697 +1799 1 2698 2699 +1800 1 2698 2700 +1801 1 2701 2702 +1802 1 2701 2703 +1803 1 2704 2705 +1804 1 2704 2706 +1805 1 2707 2708 +1806 1 2707 2709 +1807 1 2710 2711 +1808 1 2710 2712 +1809 1 2713 2714 +1810 1 2713 2715 +1811 1 2716 2717 +1812 1 2716 2718 +1813 1 2719 2720 +1814 1 2719 2721 +1815 1 2722 2723 +1816 1 2722 2724 +1817 1 2725 2726 +1818 1 2725 2727 +1819 1 2728 2729 +1820 1 2728 2730 +1821 1 2731 2732 +1822 1 2731 2733 +1823 1 2734 2735 +1824 1 2734 2736 +1825 1 2737 2738 +1826 1 2737 2739 +1827 1 2740 2741 +1828 1 2740 2742 +1829 1 2743 2744 +1830 1 2743 2745 +1831 1 2746 2747 +1832 1 2746 2748 +1833 1 2749 2750 +1834 1 2749 2751 +1835 1 2752 2753 +1836 1 2752 2754 +1837 1 2755 2756 +1838 1 2755 2757 +1839 1 2758 2759 +1840 1 2758 2760 +1841 1 2761 2762 +1842 1 2761 2763 +1843 1 2764 2765 +1844 1 2764 2766 +1845 1 2767 2768 +1846 1 2767 2769 +1847 1 2770 2771 +1848 1 2770 2772 +1849 1 2773 2774 +1850 1 2773 2775 +1851 1 2776 2777 +1852 1 2776 2778 +1853 1 2779 2780 +1854 1 2779 2781 +1855 1 2782 2783 +1856 1 2782 2784 +1857 1 2785 2786 +1858 1 2785 2787 +1859 1 2788 2789 +1860 1 2788 2790 +1861 1 2791 2792 +1862 1 2791 2793 +1863 1 2794 2795 +1864 1 2794 2796 +1865 1 2797 2798 +1866 1 2797 2799 +1867 1 2800 2801 +1868 1 2800 2802 +1869 1 2803 2804 +1870 1 2803 2805 +1871 1 2806 2807 +1872 1 2806 2808 +1873 1 2809 2810 +1874 1 2809 2811 +1875 1 2812 2813 +1876 1 2812 2814 +1877 1 2815 2816 +1878 1 2815 2817 +1879 1 2818 2819 +1880 1 2818 2820 +1881 1 2821 2822 +1882 1 2821 2823 +1883 1 2824 2825 +1884 1 2824 2826 +1885 1 2827 2828 +1886 1 2827 2829 +1887 1 2830 2831 +1888 1 2830 2832 +1889 1 2833 2834 +1890 1 2833 2835 +1891 1 2836 2837 +1892 1 2836 2838 +1893 1 2839 2840 +1894 1 2839 2841 +1895 1 2842 2843 +1896 1 2842 2844 +1897 1 2845 2846 +1898 1 2845 2847 +1899 1 2848 2849 +1900 1 2848 2850 +1901 1 2851 2852 +1902 1 2851 2853 +1903 1 2854 2855 +1904 1 2854 2856 +1905 1 2857 2858 +1906 1 2857 2859 +1907 1 2860 2861 +1908 1 2860 2862 +1909 1 2863 2864 +1910 1 2863 2865 +1911 1 2866 2867 +1912 1 2866 2868 +1913 1 2869 2870 +1914 1 2869 2871 +1915 1 2872 2873 +1916 1 2872 2874 +1917 1 2875 2876 +1918 1 2875 2877 +1919 1 2878 2879 +1920 1 2878 2880 +1921 1 2881 2882 +1922 1 2881 2883 +1923 1 2884 2885 +1924 1 2884 2886 +1925 1 2887 2888 +1926 1 2887 2889 +1927 1 2890 2891 +1928 1 2890 2892 +1929 1 2893 2894 +1930 1 2893 2895 +1931 1 2896 2897 +1932 1 2896 2898 +1933 1 2899 2900 +1934 1 2899 2901 +1935 1 2902 2903 +1936 1 2902 2904 +1937 1 2905 2906 +1938 1 2905 2907 +1939 1 2908 2909 +1940 1 2908 2910 +1941 1 2911 2912 +1942 1 2911 2913 +1943 1 2914 2915 +1944 1 2914 2916 +1945 1 2917 2918 +1946 1 2917 2919 +1947 1 2920 2921 +1948 1 2920 2922 +1949 1 2923 2924 +1950 1 2923 2925 +1951 1 2926 2927 +1952 1 2926 2928 +1953 1 2929 2930 +1954 1 2929 2931 +1955 1 2932 2933 +1956 1 2932 2934 +1957 1 2935 2936 +1958 1 2935 2937 +1959 1 2938 2939 +1960 1 2938 2940 +1961 1 2941 2942 +1962 1 2941 2943 +1963 1 2944 2945 +1964 1 2944 2946 +1965 1 2947 2948 +1966 1 2947 2949 +1967 1 2950 2951 +1968 1 2950 2952 +1969 1 2953 2954 +1970 1 2953 2955 +1971 1 2956 2957 +1972 1 2956 2958 +1973 1 2959 2960 +1974 1 2959 2961 +1975 1 2962 2963 +1976 1 2962 2964 +1977 1 2965 2966 +1978 1 2965 2967 +1979 1 2968 2969 +1980 1 2968 2970 +1981 1 2971 2972 +1982 1 2971 2973 +1983 1 2974 2975 +1984 1 2974 2976 +1985 1 2977 2978 +1986 1 2977 2979 +1987 1 2980 2981 +1988 1 2980 2982 +1989 1 2983 2984 +1990 1 2983 2985 +1991 1 2986 2987 +1992 1 2986 2988 +1993 1 2989 2990 +1994 1 2989 2991 +1995 1 2992 2993 +1996 1 2992 2994 +1997 1 2995 2996 +1998 1 2995 2997 +1999 1 2998 2999 +2000 1 2998 3000 +2001 1 3001 3002 +2002 1 3001 3003 +2003 1 3004 3005 +2004 1 3004 3006 +2005 1 3007 3008 +2006 1 3007 3009 +2007 1 3010 3011 +2008 1 3010 3012 +2009 1 3013 3014 +2010 1 3013 3015 +2011 1 3016 3017 +2012 1 3016 3018 +2013 1 3019 3020 +2014 1 3019 3021 +2015 1 3022 3023 +2016 1 3022 3024 +2017 1 3025 3026 +2018 1 3025 3027 +2019 1 3028 3029 +2020 1 3028 3030 +2021 1 3031 3032 +2022 1 3031 3033 +2023 1 3034 3035 +2024 1 3034 3036 +2025 1 3037 3038 +2026 1 3037 3039 +2027 1 3040 3041 +2028 1 3040 3042 +2029 1 3043 3044 +2030 1 3043 3045 +2031 1 3046 3047 +2032 1 3046 3048 +2033 1 3049 3050 +2034 1 3049 3051 +2035 1 3052 3053 +2036 1 3052 3054 +2037 1 3055 3056 +2038 1 3055 3057 +2039 1 3058 3059 +2040 1 3058 3060 +2041 1 3061 3062 +2042 1 3061 3063 +2043 1 3064 3065 +2044 1 3064 3066 +2045 1 3067 3068 +2046 1 3067 3069 +2047 1 3070 3071 +2048 1 3070 3072 + +Angles + +1 1 2 1 3 +2 1 5 4 6 +3 1 8 7 9 +4 1 11 10 12 +5 1 14 13 15 +6 1 17 16 18 +7 1 20 19 21 +8 1 23 22 24 +9 1 26 25 27 +10 1 29 28 30 +11 1 32 31 33 +12 1 35 34 36 +13 1 38 37 39 +14 1 41 40 42 +15 1 44 43 45 +16 1 47 46 48 +17 1 50 49 51 +18 1 53 52 54 +19 1 56 55 57 +20 1 59 58 60 +21 1 62 61 63 +22 1 65 64 66 +23 1 68 67 69 +24 1 71 70 72 +25 1 74 73 75 +26 1 77 76 78 +27 1 80 79 81 +28 1 83 82 84 +29 1 86 85 87 +30 1 89 88 90 +31 1 92 91 93 +32 1 95 94 96 +33 1 98 97 99 +34 1 101 100 102 +35 1 104 103 105 +36 1 107 106 108 +37 1 110 109 111 +38 1 113 112 114 +39 1 116 115 117 +40 1 119 118 120 +41 1 122 121 123 +42 1 125 124 126 +43 1 128 127 129 +44 1 131 130 132 +45 1 134 133 135 +46 1 137 136 138 +47 1 140 139 141 +48 1 143 142 144 +49 1 146 145 147 +50 1 149 148 150 +51 1 152 151 153 +52 1 155 154 156 +53 1 158 157 159 +54 1 161 160 162 +55 1 164 163 165 +56 1 167 166 168 +57 1 170 169 171 +58 1 173 172 174 +59 1 176 175 177 +60 1 179 178 180 +61 1 182 181 183 +62 1 185 184 186 +63 1 188 187 189 +64 1 191 190 192 +65 1 194 193 195 +66 1 197 196 198 +67 1 200 199 201 +68 1 203 202 204 +69 1 206 205 207 +70 1 209 208 210 +71 1 212 211 213 +72 1 215 214 216 +73 1 218 217 219 +74 1 221 220 222 +75 1 224 223 225 +76 1 227 226 228 +77 1 230 229 231 +78 1 233 232 234 +79 1 236 235 237 +80 1 239 238 240 +81 1 242 241 243 +82 1 245 244 246 +83 1 248 247 249 +84 1 251 250 252 +85 1 254 253 255 +86 1 257 256 258 +87 1 260 259 261 +88 1 263 262 264 +89 1 266 265 267 +90 1 269 268 270 +91 1 272 271 273 +92 1 275 274 276 +93 1 278 277 279 +94 1 281 280 282 +95 1 284 283 285 +96 1 287 286 288 +97 1 290 289 291 +98 1 293 292 294 +99 1 296 295 297 +100 1 299 298 300 +101 1 302 301 303 +102 1 305 304 306 +103 1 308 307 309 +104 1 311 310 312 +105 1 314 313 315 +106 1 317 316 318 +107 1 320 319 321 +108 1 323 322 324 +109 1 326 325 327 +110 1 329 328 330 +111 1 332 331 333 +112 1 335 334 336 +113 1 338 337 339 +114 1 341 340 342 +115 1 344 343 345 +116 1 347 346 348 +117 1 350 349 351 +118 1 353 352 354 +119 1 356 355 357 +120 1 359 358 360 +121 1 362 361 363 +122 1 365 364 366 +123 1 368 367 369 +124 1 371 370 372 +125 1 374 373 375 +126 1 377 376 378 +127 1 380 379 381 +128 1 383 382 384 +129 1 386 385 387 +130 1 389 388 390 +131 1 392 391 393 +132 1 395 394 396 +133 1 398 397 399 +134 1 401 400 402 +135 1 404 403 405 +136 1 407 406 408 +137 1 410 409 411 +138 1 413 412 414 +139 1 416 415 417 +140 1 419 418 420 +141 1 422 421 423 +142 1 425 424 426 +143 1 428 427 429 +144 1 431 430 432 +145 1 434 433 435 +146 1 437 436 438 +147 1 440 439 441 +148 1 443 442 444 +149 1 446 445 447 +150 1 449 448 450 +151 1 452 451 453 +152 1 455 454 456 +153 1 458 457 459 +154 1 461 460 462 +155 1 464 463 465 +156 1 467 466 468 +157 1 470 469 471 +158 1 473 472 474 +159 1 476 475 477 +160 1 479 478 480 +161 1 482 481 483 +162 1 485 484 486 +163 1 488 487 489 +164 1 491 490 492 +165 1 494 493 495 +166 1 497 496 498 +167 1 500 499 501 +168 1 503 502 504 +169 1 506 505 507 +170 1 509 508 510 +171 1 512 511 513 +172 1 515 514 516 +173 1 518 517 519 +174 1 521 520 522 +175 1 524 523 525 +176 1 527 526 528 +177 1 530 529 531 +178 1 533 532 534 +179 1 536 535 537 +180 1 539 538 540 +181 1 542 541 543 +182 1 545 544 546 +183 1 548 547 549 +184 1 551 550 552 +185 1 554 553 555 +186 1 557 556 558 +187 1 560 559 561 +188 1 563 562 564 +189 1 566 565 567 +190 1 569 568 570 +191 1 572 571 573 +192 1 575 574 576 +193 1 578 577 579 +194 1 581 580 582 +195 1 584 583 585 +196 1 587 586 588 +197 1 590 589 591 +198 1 593 592 594 +199 1 596 595 597 +200 1 599 598 600 +201 1 602 601 603 +202 1 605 604 606 +203 1 608 607 609 +204 1 611 610 612 +205 1 614 613 615 +206 1 617 616 618 +207 1 620 619 621 +208 1 623 622 624 +209 1 626 625 627 +210 1 629 628 630 +211 1 632 631 633 +212 1 635 634 636 +213 1 638 637 639 +214 1 641 640 642 +215 1 644 643 645 +216 1 647 646 648 +217 1 650 649 651 +218 1 653 652 654 +219 1 656 655 657 +220 1 659 658 660 +221 1 662 661 663 +222 1 665 664 666 +223 1 668 667 669 +224 1 671 670 672 +225 1 674 673 675 +226 1 677 676 678 +227 1 680 679 681 +228 1 683 682 684 +229 1 686 685 687 +230 1 689 688 690 +231 1 692 691 693 +232 1 695 694 696 +233 1 698 697 699 +234 1 701 700 702 +235 1 704 703 705 +236 1 707 706 708 +237 1 710 709 711 +238 1 713 712 714 +239 1 716 715 717 +240 1 719 718 720 +241 1 722 721 723 +242 1 725 724 726 +243 1 728 727 729 +244 1 731 730 732 +245 1 734 733 735 +246 1 737 736 738 +247 1 740 739 741 +248 1 743 742 744 +249 1 746 745 747 +250 1 749 748 750 +251 1 752 751 753 +252 1 755 754 756 +253 1 758 757 759 +254 1 761 760 762 +255 1 764 763 765 +256 1 767 766 768 +257 1 770 769 771 +258 1 773 772 774 +259 1 776 775 777 +260 1 779 778 780 +261 1 782 781 783 +262 1 785 784 786 +263 1 788 787 789 +264 1 791 790 792 +265 1 794 793 795 +266 1 797 796 798 +267 1 800 799 801 +268 1 803 802 804 +269 1 806 805 807 +270 1 809 808 810 +271 1 812 811 813 +272 1 815 814 816 +273 1 818 817 819 +274 1 821 820 822 +275 1 824 823 825 +276 1 827 826 828 +277 1 830 829 831 +278 1 833 832 834 +279 1 836 835 837 +280 1 839 838 840 +281 1 842 841 843 +282 1 845 844 846 +283 1 848 847 849 +284 1 851 850 852 +285 1 854 853 855 +286 1 857 856 858 +287 1 860 859 861 +288 1 863 862 864 +289 1 866 865 867 +290 1 869 868 870 +291 1 872 871 873 +292 1 875 874 876 +293 1 878 877 879 +294 1 881 880 882 +295 1 884 883 885 +296 1 887 886 888 +297 1 890 889 891 +298 1 893 892 894 +299 1 896 895 897 +300 1 899 898 900 +301 1 902 901 903 +302 1 905 904 906 +303 1 908 907 909 +304 1 911 910 912 +305 1 914 913 915 +306 1 917 916 918 +307 1 920 919 921 +308 1 923 922 924 +309 1 926 925 927 +310 1 929 928 930 +311 1 932 931 933 +312 1 935 934 936 +313 1 938 937 939 +314 1 941 940 942 +315 1 944 943 945 +316 1 947 946 948 +317 1 950 949 951 +318 1 953 952 954 +319 1 956 955 957 +320 1 959 958 960 +321 1 962 961 963 +322 1 965 964 966 +323 1 968 967 969 +324 1 971 970 972 +325 1 974 973 975 +326 1 977 976 978 +327 1 980 979 981 +328 1 983 982 984 +329 1 986 985 987 +330 1 989 988 990 +331 1 992 991 993 +332 1 995 994 996 +333 1 998 997 999 +334 1 1001 1000 1002 +335 1 1004 1003 1005 +336 1 1007 1006 1008 +337 1 1010 1009 1011 +338 1 1013 1012 1014 +339 1 1016 1015 1017 +340 1 1019 1018 1020 +341 1 1022 1021 1023 +342 1 1025 1024 1026 +343 1 1028 1027 1029 +344 1 1031 1030 1032 +345 1 1034 1033 1035 +346 1 1037 1036 1038 +347 1 1040 1039 1041 +348 1 1043 1042 1044 +349 1 1046 1045 1047 +350 1 1049 1048 1050 +351 1 1052 1051 1053 +352 1 1055 1054 1056 +353 1 1058 1057 1059 +354 1 1061 1060 1062 +355 1 1064 1063 1065 +356 1 1067 1066 1068 +357 1 1070 1069 1071 +358 1 1073 1072 1074 +359 1 1076 1075 1077 +360 1 1079 1078 1080 +361 1 1082 1081 1083 +362 1 1085 1084 1086 +363 1 1088 1087 1089 +364 1 1091 1090 1092 +365 1 1094 1093 1095 +366 1 1097 1096 1098 +367 1 1100 1099 1101 +368 1 1103 1102 1104 +369 1 1106 1105 1107 +370 1 1109 1108 1110 +371 1 1112 1111 1113 +372 1 1115 1114 1116 +373 1 1118 1117 1119 +374 1 1121 1120 1122 +375 1 1124 1123 1125 +376 1 1127 1126 1128 +377 1 1130 1129 1131 +378 1 1133 1132 1134 +379 1 1136 1135 1137 +380 1 1139 1138 1140 +381 1 1142 1141 1143 +382 1 1145 1144 1146 +383 1 1148 1147 1149 +384 1 1151 1150 1152 +385 1 1154 1153 1155 +386 1 1157 1156 1158 +387 1 1160 1159 1161 +388 1 1163 1162 1164 +389 1 1166 1165 1167 +390 1 1169 1168 1170 +391 1 1172 1171 1173 +392 1 1175 1174 1176 +393 1 1178 1177 1179 +394 1 1181 1180 1182 +395 1 1184 1183 1185 +396 1 1187 1186 1188 +397 1 1190 1189 1191 +398 1 1193 1192 1194 +399 1 1196 1195 1197 +400 1 1199 1198 1200 +401 1 1202 1201 1203 +402 1 1205 1204 1206 +403 1 1208 1207 1209 +404 1 1211 1210 1212 +405 1 1214 1213 1215 +406 1 1217 1216 1218 +407 1 1220 1219 1221 +408 1 1223 1222 1224 +409 1 1226 1225 1227 +410 1 1229 1228 1230 +411 1 1232 1231 1233 +412 1 1235 1234 1236 +413 1 1238 1237 1239 +414 1 1241 1240 1242 +415 1 1244 1243 1245 +416 1 1247 1246 1248 +417 1 1250 1249 1251 +418 1 1253 1252 1254 +419 1 1256 1255 1257 +420 1 1259 1258 1260 +421 1 1262 1261 1263 +422 1 1265 1264 1266 +423 1 1268 1267 1269 +424 1 1271 1270 1272 +425 1 1274 1273 1275 +426 1 1277 1276 1278 +427 1 1280 1279 1281 +428 1 1283 1282 1284 +429 1 1286 1285 1287 +430 1 1289 1288 1290 +431 1 1292 1291 1293 +432 1 1295 1294 1296 +433 1 1298 1297 1299 +434 1 1301 1300 1302 +435 1 1304 1303 1305 +436 1 1307 1306 1308 +437 1 1310 1309 1311 +438 1 1313 1312 1314 +439 1 1316 1315 1317 +440 1 1319 1318 1320 +441 1 1322 1321 1323 +442 1 1325 1324 1326 +443 1 1328 1327 1329 +444 1 1331 1330 1332 +445 1 1334 1333 1335 +446 1 1337 1336 1338 +447 1 1340 1339 1341 +448 1 1343 1342 1344 +449 1 1346 1345 1347 +450 1 1349 1348 1350 +451 1 1352 1351 1353 +452 1 1355 1354 1356 +453 1 1358 1357 1359 +454 1 1361 1360 1362 +455 1 1364 1363 1365 +456 1 1367 1366 1368 +457 1 1370 1369 1371 +458 1 1373 1372 1374 +459 1 1376 1375 1377 +460 1 1379 1378 1380 +461 1 1382 1381 1383 +462 1 1385 1384 1386 +463 1 1388 1387 1389 +464 1 1391 1390 1392 +465 1 1394 1393 1395 +466 1 1397 1396 1398 +467 1 1400 1399 1401 +468 1 1403 1402 1404 +469 1 1406 1405 1407 +470 1 1409 1408 1410 +471 1 1412 1411 1413 +472 1 1415 1414 1416 +473 1 1418 1417 1419 +474 1 1421 1420 1422 +475 1 1424 1423 1425 +476 1 1427 1426 1428 +477 1 1430 1429 1431 +478 1 1433 1432 1434 +479 1 1436 1435 1437 +480 1 1439 1438 1440 +481 1 1442 1441 1443 +482 1 1445 1444 1446 +483 1 1448 1447 1449 +484 1 1451 1450 1452 +485 1 1454 1453 1455 +486 1 1457 1456 1458 +487 1 1460 1459 1461 +488 1 1463 1462 1464 +489 1 1466 1465 1467 +490 1 1469 1468 1470 +491 1 1472 1471 1473 +492 1 1475 1474 1476 +493 1 1478 1477 1479 +494 1 1481 1480 1482 +495 1 1484 1483 1485 +496 1 1487 1486 1488 +497 1 1490 1489 1491 +498 1 1493 1492 1494 +499 1 1496 1495 1497 +500 1 1499 1498 1500 +501 1 1502 1501 1503 +502 1 1505 1504 1506 +503 1 1508 1507 1509 +504 1 1511 1510 1512 +505 1 1514 1513 1515 +506 1 1517 1516 1518 +507 1 1520 1519 1521 +508 1 1523 1522 1524 +509 1 1526 1525 1527 +510 1 1529 1528 1530 +511 1 1532 1531 1533 +512 1 1535 1534 1536 +513 1 1538 1537 1539 +514 1 1541 1540 1542 +515 1 1544 1543 1545 +516 1 1547 1546 1548 +517 1 1550 1549 1551 +518 1 1553 1552 1554 +519 1 1556 1555 1557 +520 1 1559 1558 1560 +521 1 1562 1561 1563 +522 1 1565 1564 1566 +523 1 1568 1567 1569 +524 1 1571 1570 1572 +525 1 1574 1573 1575 +526 1 1577 1576 1578 +527 1 1580 1579 1581 +528 1 1583 1582 1584 +529 1 1586 1585 1587 +530 1 1589 1588 1590 +531 1 1592 1591 1593 +532 1 1595 1594 1596 +533 1 1598 1597 1599 +534 1 1601 1600 1602 +535 1 1604 1603 1605 +536 1 1607 1606 1608 +537 1 1610 1609 1611 +538 1 1613 1612 1614 +539 1 1616 1615 1617 +540 1 1619 1618 1620 +541 1 1622 1621 1623 +542 1 1625 1624 1626 +543 1 1628 1627 1629 +544 1 1631 1630 1632 +545 1 1634 1633 1635 +546 1 1637 1636 1638 +547 1 1640 1639 1641 +548 1 1643 1642 1644 +549 1 1646 1645 1647 +550 1 1649 1648 1650 +551 1 1652 1651 1653 +552 1 1655 1654 1656 +553 1 1658 1657 1659 +554 1 1661 1660 1662 +555 1 1664 1663 1665 +556 1 1667 1666 1668 +557 1 1670 1669 1671 +558 1 1673 1672 1674 +559 1 1676 1675 1677 +560 1 1679 1678 1680 +561 1 1682 1681 1683 +562 1 1685 1684 1686 +563 1 1688 1687 1689 +564 1 1691 1690 1692 +565 1 1694 1693 1695 +566 1 1697 1696 1698 +567 1 1700 1699 1701 +568 1 1703 1702 1704 +569 1 1706 1705 1707 +570 1 1709 1708 1710 +571 1 1712 1711 1713 +572 1 1715 1714 1716 +573 1 1718 1717 1719 +574 1 1721 1720 1722 +575 1 1724 1723 1725 +576 1 1727 1726 1728 +577 1 1730 1729 1731 +578 1 1733 1732 1734 +579 1 1736 1735 1737 +580 1 1739 1738 1740 +581 1 1742 1741 1743 +582 1 1745 1744 1746 +583 1 1748 1747 1749 +584 1 1751 1750 1752 +585 1 1754 1753 1755 +586 1 1757 1756 1758 +587 1 1760 1759 1761 +588 1 1763 1762 1764 +589 1 1766 1765 1767 +590 1 1769 1768 1770 +591 1 1772 1771 1773 +592 1 1775 1774 1776 +593 1 1778 1777 1779 +594 1 1781 1780 1782 +595 1 1784 1783 1785 +596 1 1787 1786 1788 +597 1 1790 1789 1791 +598 1 1793 1792 1794 +599 1 1796 1795 1797 +600 1 1799 1798 1800 +601 1 1802 1801 1803 +602 1 1805 1804 1806 +603 1 1808 1807 1809 +604 1 1811 1810 1812 +605 1 1814 1813 1815 +606 1 1817 1816 1818 +607 1 1820 1819 1821 +608 1 1823 1822 1824 +609 1 1826 1825 1827 +610 1 1829 1828 1830 +611 1 1832 1831 1833 +612 1 1835 1834 1836 +613 1 1838 1837 1839 +614 1 1841 1840 1842 +615 1 1844 1843 1845 +616 1 1847 1846 1848 +617 1 1850 1849 1851 +618 1 1853 1852 1854 +619 1 1856 1855 1857 +620 1 1859 1858 1860 +621 1 1862 1861 1863 +622 1 1865 1864 1866 +623 1 1868 1867 1869 +624 1 1871 1870 1872 +625 1 1874 1873 1875 +626 1 1877 1876 1878 +627 1 1880 1879 1881 +628 1 1883 1882 1884 +629 1 1886 1885 1887 +630 1 1889 1888 1890 +631 1 1892 1891 1893 +632 1 1895 1894 1896 +633 1 1898 1897 1899 +634 1 1901 1900 1902 +635 1 1904 1903 1905 +636 1 1907 1906 1908 +637 1 1910 1909 1911 +638 1 1913 1912 1914 +639 1 1916 1915 1917 +640 1 1919 1918 1920 +641 1 1922 1921 1923 +642 1 1925 1924 1926 +643 1 1928 1927 1929 +644 1 1931 1930 1932 +645 1 1934 1933 1935 +646 1 1937 1936 1938 +647 1 1940 1939 1941 +648 1 1943 1942 1944 +649 1 1946 1945 1947 +650 1 1949 1948 1950 +651 1 1952 1951 1953 +652 1 1955 1954 1956 +653 1 1958 1957 1959 +654 1 1961 1960 1962 +655 1 1964 1963 1965 +656 1 1967 1966 1968 +657 1 1970 1969 1971 +658 1 1973 1972 1974 +659 1 1976 1975 1977 +660 1 1979 1978 1980 +661 1 1982 1981 1983 +662 1 1985 1984 1986 +663 1 1988 1987 1989 +664 1 1991 1990 1992 +665 1 1994 1993 1995 +666 1 1997 1996 1998 +667 1 2000 1999 2001 +668 1 2003 2002 2004 +669 1 2006 2005 2007 +670 1 2009 2008 2010 +671 1 2012 2011 2013 +672 1 2015 2014 2016 +673 1 2018 2017 2019 +674 1 2021 2020 2022 +675 1 2024 2023 2025 +676 1 2027 2026 2028 +677 1 2030 2029 2031 +678 1 2033 2032 2034 +679 1 2036 2035 2037 +680 1 2039 2038 2040 +681 1 2042 2041 2043 +682 1 2045 2044 2046 +683 1 2048 2047 2049 +684 1 2051 2050 2052 +685 1 2054 2053 2055 +686 1 2057 2056 2058 +687 1 2060 2059 2061 +688 1 2063 2062 2064 +689 1 2066 2065 2067 +690 1 2069 2068 2070 +691 1 2072 2071 2073 +692 1 2075 2074 2076 +693 1 2078 2077 2079 +694 1 2081 2080 2082 +695 1 2084 2083 2085 +696 1 2087 2086 2088 +697 1 2090 2089 2091 +698 1 2093 2092 2094 +699 1 2096 2095 2097 +700 1 2099 2098 2100 +701 1 2102 2101 2103 +702 1 2105 2104 2106 +703 1 2108 2107 2109 +704 1 2111 2110 2112 +705 1 2114 2113 2115 +706 1 2117 2116 2118 +707 1 2120 2119 2121 +708 1 2123 2122 2124 +709 1 2126 2125 2127 +710 1 2129 2128 2130 +711 1 2132 2131 2133 +712 1 2135 2134 2136 +713 1 2138 2137 2139 +714 1 2141 2140 2142 +715 1 2144 2143 2145 +716 1 2147 2146 2148 +717 1 2150 2149 2151 +718 1 2153 2152 2154 +719 1 2156 2155 2157 +720 1 2159 2158 2160 +721 1 2162 2161 2163 +722 1 2165 2164 2166 +723 1 2168 2167 2169 +724 1 2171 2170 2172 +725 1 2174 2173 2175 +726 1 2177 2176 2178 +727 1 2180 2179 2181 +728 1 2183 2182 2184 +729 1 2186 2185 2187 +730 1 2189 2188 2190 +731 1 2192 2191 2193 +732 1 2195 2194 2196 +733 1 2198 2197 2199 +734 1 2201 2200 2202 +735 1 2204 2203 2205 +736 1 2207 2206 2208 +737 1 2210 2209 2211 +738 1 2213 2212 2214 +739 1 2216 2215 2217 +740 1 2219 2218 2220 +741 1 2222 2221 2223 +742 1 2225 2224 2226 +743 1 2228 2227 2229 +744 1 2231 2230 2232 +745 1 2234 2233 2235 +746 1 2237 2236 2238 +747 1 2240 2239 2241 +748 1 2243 2242 2244 +749 1 2246 2245 2247 +750 1 2249 2248 2250 +751 1 2252 2251 2253 +752 1 2255 2254 2256 +753 1 2258 2257 2259 +754 1 2261 2260 2262 +755 1 2264 2263 2265 +756 1 2267 2266 2268 +757 1 2270 2269 2271 +758 1 2273 2272 2274 +759 1 2276 2275 2277 +760 1 2279 2278 2280 +761 1 2282 2281 2283 +762 1 2285 2284 2286 +763 1 2288 2287 2289 +764 1 2291 2290 2292 +765 1 2294 2293 2295 +766 1 2297 2296 2298 +767 1 2300 2299 2301 +768 1 2303 2302 2304 +769 1 2306 2305 2307 +770 1 2309 2308 2310 +771 1 2312 2311 2313 +772 1 2315 2314 2316 +773 1 2318 2317 2319 +774 1 2321 2320 2322 +775 1 2324 2323 2325 +776 1 2327 2326 2328 +777 1 2330 2329 2331 +778 1 2333 2332 2334 +779 1 2336 2335 2337 +780 1 2339 2338 2340 +781 1 2342 2341 2343 +782 1 2345 2344 2346 +783 1 2348 2347 2349 +784 1 2351 2350 2352 +785 1 2354 2353 2355 +786 1 2357 2356 2358 +787 1 2360 2359 2361 +788 1 2363 2362 2364 +789 1 2366 2365 2367 +790 1 2369 2368 2370 +791 1 2372 2371 2373 +792 1 2375 2374 2376 +793 1 2378 2377 2379 +794 1 2381 2380 2382 +795 1 2384 2383 2385 +796 1 2387 2386 2388 +797 1 2390 2389 2391 +798 1 2393 2392 2394 +799 1 2396 2395 2397 +800 1 2399 2398 2400 +801 1 2402 2401 2403 +802 1 2405 2404 2406 +803 1 2408 2407 2409 +804 1 2411 2410 2412 +805 1 2414 2413 2415 +806 1 2417 2416 2418 +807 1 2420 2419 2421 +808 1 2423 2422 2424 +809 1 2426 2425 2427 +810 1 2429 2428 2430 +811 1 2432 2431 2433 +812 1 2435 2434 2436 +813 1 2438 2437 2439 +814 1 2441 2440 2442 +815 1 2444 2443 2445 +816 1 2447 2446 2448 +817 1 2450 2449 2451 +818 1 2453 2452 2454 +819 1 2456 2455 2457 +820 1 2459 2458 2460 +821 1 2462 2461 2463 +822 1 2465 2464 2466 +823 1 2468 2467 2469 +824 1 2471 2470 2472 +825 1 2474 2473 2475 +826 1 2477 2476 2478 +827 1 2480 2479 2481 +828 1 2483 2482 2484 +829 1 2486 2485 2487 +830 1 2489 2488 2490 +831 1 2492 2491 2493 +832 1 2495 2494 2496 +833 1 2498 2497 2499 +834 1 2501 2500 2502 +835 1 2504 2503 2505 +836 1 2507 2506 2508 +837 1 2510 2509 2511 +838 1 2513 2512 2514 +839 1 2516 2515 2517 +840 1 2519 2518 2520 +841 1 2522 2521 2523 +842 1 2525 2524 2526 +843 1 2528 2527 2529 +844 1 2531 2530 2532 +845 1 2534 2533 2535 +846 1 2537 2536 2538 +847 1 2540 2539 2541 +848 1 2543 2542 2544 +849 1 2546 2545 2547 +850 1 2549 2548 2550 +851 1 2552 2551 2553 +852 1 2555 2554 2556 +853 1 2558 2557 2559 +854 1 2561 2560 2562 +855 1 2564 2563 2565 +856 1 2567 2566 2568 +857 1 2570 2569 2571 +858 1 2573 2572 2574 +859 1 2576 2575 2577 +860 1 2579 2578 2580 +861 1 2582 2581 2583 +862 1 2585 2584 2586 +863 1 2588 2587 2589 +864 1 2591 2590 2592 +865 1 2594 2593 2595 +866 1 2597 2596 2598 +867 1 2600 2599 2601 +868 1 2603 2602 2604 +869 1 2606 2605 2607 +870 1 2609 2608 2610 +871 1 2612 2611 2613 +872 1 2615 2614 2616 +873 1 2618 2617 2619 +874 1 2621 2620 2622 +875 1 2624 2623 2625 +876 1 2627 2626 2628 +877 1 2630 2629 2631 +878 1 2633 2632 2634 +879 1 2636 2635 2637 +880 1 2639 2638 2640 +881 1 2642 2641 2643 +882 1 2645 2644 2646 +883 1 2648 2647 2649 +884 1 2651 2650 2652 +885 1 2654 2653 2655 +886 1 2657 2656 2658 +887 1 2660 2659 2661 +888 1 2663 2662 2664 +889 1 2666 2665 2667 +890 1 2669 2668 2670 +891 1 2672 2671 2673 +892 1 2675 2674 2676 +893 1 2678 2677 2679 +894 1 2681 2680 2682 +895 1 2684 2683 2685 +896 1 2687 2686 2688 +897 1 2690 2689 2691 +898 1 2693 2692 2694 +899 1 2696 2695 2697 +900 1 2699 2698 2700 +901 1 2702 2701 2703 +902 1 2705 2704 2706 +903 1 2708 2707 2709 +904 1 2711 2710 2712 +905 1 2714 2713 2715 +906 1 2717 2716 2718 +907 1 2720 2719 2721 +908 1 2723 2722 2724 +909 1 2726 2725 2727 +910 1 2729 2728 2730 +911 1 2732 2731 2733 +912 1 2735 2734 2736 +913 1 2738 2737 2739 +914 1 2741 2740 2742 +915 1 2744 2743 2745 +916 1 2747 2746 2748 +917 1 2750 2749 2751 +918 1 2753 2752 2754 +919 1 2756 2755 2757 +920 1 2759 2758 2760 +921 1 2762 2761 2763 +922 1 2765 2764 2766 +923 1 2768 2767 2769 +924 1 2771 2770 2772 +925 1 2774 2773 2775 +926 1 2777 2776 2778 +927 1 2780 2779 2781 +928 1 2783 2782 2784 +929 1 2786 2785 2787 +930 1 2789 2788 2790 +931 1 2792 2791 2793 +932 1 2795 2794 2796 +933 1 2798 2797 2799 +934 1 2801 2800 2802 +935 1 2804 2803 2805 +936 1 2807 2806 2808 +937 1 2810 2809 2811 +938 1 2813 2812 2814 +939 1 2816 2815 2817 +940 1 2819 2818 2820 +941 1 2822 2821 2823 +942 1 2825 2824 2826 +943 1 2828 2827 2829 +944 1 2831 2830 2832 +945 1 2834 2833 2835 +946 1 2837 2836 2838 +947 1 2840 2839 2841 +948 1 2843 2842 2844 +949 1 2846 2845 2847 +950 1 2849 2848 2850 +951 1 2852 2851 2853 +952 1 2855 2854 2856 +953 1 2858 2857 2859 +954 1 2861 2860 2862 +955 1 2864 2863 2865 +956 1 2867 2866 2868 +957 1 2870 2869 2871 +958 1 2873 2872 2874 +959 1 2876 2875 2877 +960 1 2879 2878 2880 +961 1 2882 2881 2883 +962 1 2885 2884 2886 +963 1 2888 2887 2889 +964 1 2891 2890 2892 +965 1 2894 2893 2895 +966 1 2897 2896 2898 +967 1 2900 2899 2901 +968 1 2903 2902 2904 +969 1 2906 2905 2907 +970 1 2909 2908 2910 +971 1 2912 2911 2913 +972 1 2915 2914 2916 +973 1 2918 2917 2919 +974 1 2921 2920 2922 +975 1 2924 2923 2925 +976 1 2927 2926 2928 +977 1 2930 2929 2931 +978 1 2933 2932 2934 +979 1 2936 2935 2937 +980 1 2939 2938 2940 +981 1 2942 2941 2943 +982 1 2945 2944 2946 +983 1 2948 2947 2949 +984 1 2951 2950 2952 +985 1 2954 2953 2955 +986 1 2957 2956 2958 +987 1 2960 2959 2961 +988 1 2963 2962 2964 +989 1 2966 2965 2967 +990 1 2969 2968 2970 +991 1 2972 2971 2973 +992 1 2975 2974 2976 +993 1 2978 2977 2979 +994 1 2981 2980 2982 +995 1 2984 2983 2985 +996 1 2987 2986 2988 +997 1 2990 2989 2991 +998 1 2993 2992 2994 +999 1 2996 2995 2997 +1000 1 2999 2998 3000 +1001 1 3002 3001 3003 +1002 1 3005 3004 3006 +1003 1 3008 3007 3009 +1004 1 3011 3010 3012 +1005 1 3014 3013 3015 +1006 1 3017 3016 3018 +1007 1 3020 3019 3021 +1008 1 3023 3022 3024 +1009 1 3026 3025 3027 +1010 1 3029 3028 3030 +1011 1 3032 3031 3033 +1012 1 3035 3034 3036 +1013 1 3038 3037 3039 +1014 1 3041 3040 3042 +1015 1 3044 3043 3045 +1016 1 3047 3046 3048 +1017 1 3050 3049 3051 +1018 1 3053 3052 3054 +1019 1 3056 3055 3057 +1020 1 3059 3058 3060 +1021 1 3062 3061 3063 +1022 1 3065 3064 3066 +1023 1 3068 3067 3069 +1024 1 3071 3070 3072 + diff --git a/examples/PACKAGES/fep/ta/in.spce.lmp b/examples/PACKAGES/fep/ta/in.spce.lmp new file mode 100644 index 0000000000..a9464cc7be --- /dev/null +++ b/examples/PACKAGES/fep/ta/in.spce.lmp @@ -0,0 +1,49 @@ + +units real +boundary p p p + +atom_style full +bond_style harmonic +angle_style harmonic + +special_bonds lj/coul 0.0 0.0 0.5 + +pair_style lj/cut/coul/long 12.0 12.0 +pair_modify tail no +kspace_style pppm 1.0e-5 + +read_data data.spce # 8x8x16 SPCE molecules in a 30x30x100 box + +bond_coeff 1 517.630258 1.0 +angle_coeff 1 37.950526 109.47 +pair_coeff 1 1 0.1553 3.166 # O O +pair_coeff 1 2 0.0 1.0 # O H +pair_coeff 2 2 0.0 1.0 # H H + +# don't use fix shake with compute fep/ta +# fix SHAKE all shake 0.0001 20 0 b 1 + +neighbor 2.0 bin +# neigh_modify delay 0 every 1 check yes + +timestep 1.0 + +variable TK equal 300.0 +compute TA all fep/ta ${TK} xy 1.0005 + +velocity all create ${TK} 12345 + +thermo_style custom step temp press etotal pe c_TA[*] +thermo 5000 + +fix NVT all nvt temp ${TK} ${TK} 100 +run 300000 + +reset_timestep 0 + +variable gamma_v equal 100*(pzz-0.5*(pxx+pyy))/2/100 # surface tension via the mechanical route + +fix FEP all ave/time 100 1000 100000 c_TA[*] v_gamma_v ave running file spce.fep.ta + +run 2000000 + diff --git a/examples/PACKAGES/fep/ta/log.spce b/examples/PACKAGES/fep/ta/log.spce new file mode 100644 index 0000000000..96bb1bd351 --- /dev/null +++ b/examples/PACKAGES/fep/ta/log.spce @@ -0,0 +1,689 @@ +LAMMPS (17 Feb 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +package gpu 0 + +units real +boundary p p p + +atom_style full +bond_style harmonic +angle_style harmonic + +special_bonds lj/coul 0.0 0.0 0.5 + +pair_style lj/cut/coul/long 12.0 12.0 +pair_modify tail no +kspace_style pppm 1.0e-5 + +read_data data.spce # 8x8x16 SPCE molecules in a 30x30x100 box +Reading data file ... + orthogonal box = (0 0 0) to (30 30 100) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3072 atoms + scanning bonds ... + 2 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 2048 bonds + reading angles ... + 1024 angles +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0.5 + special bond factors coul: 0 0 0.5 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.001 seconds + read_data CPU = 0.006 seconds + +bond_coeff 1 517.630258 1.0 +angle_coeff 1 37.950526 109.47 +pair_coeff 1 1 0.1553 3.166 # O O +pair_coeff 1 2 0.0 1.0 # O H +pair_coeff 2 2 0.0 1.0 # H H + +# don't use fix shake with compute fep/ta +# fix SHAKE all shake 0.0001 20 0 b 1 + +neighbor 2.0 bin +# neigh_modify delay 0 every 1 check yes + +timestep 1.0 + +variable TK equal 300.0 +compute TA all fep/ta ${TK} xy 1.0005 +compute TA all fep/ta 300 xy 1.0005 + +velocity all create ${TK} 12345 +velocity all create 300 12345 + +thermo_style custom step temp press etotal pe c_TA[*] +thermo 5000 + +fix NVT all nvt temp ${TK} ${TK} 100 +fix NVT all nvt temp 300 ${TK} 100 +fix NVT all nvt temp 300 300 100 +run 300000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- GPU package (short-range, long-range and three-body potentials): + +@Article{Brown11, + author = {W. M. Brown, P. Wang, S. J. Plimpton, A. N. Tharrington}, + title = {Implementing Molecular Dynamics on Hybrid High Performance Computers - Short Range Forces}, + journal = {Comp.~Phys.~Comm.}, + year = 2011, + volume = 182, + pages = {898--911} +} + +@Article{Brown12, + author = {W. M. Brown, A. Kohlmeyer, S. J. Plimpton, A. N. Tharrington}, + title = {Implementing Molecular Dynamics on Hybrid High Performance Computers - Particle-Particle Particle-Mesh}, + journal = {Comp.~Phys.~Comm.}, + year = 2012, + volume = 183, + pages = {449--459} +} + +@Article{Brown13, + author = {W. M. Brown, Y. Masako}, + title = {Implementing Molecular Dynamics on Hybrid High Performance Computers – Three-Body Potentials}, + journal = {Comp.~Phys.~Comm.}, + year = 2013, + volume = 184, + pages = {2785--2793} +} + +@Article{Trung15, + author = {T. D. Nguyen, S. J. Plimpton}, + title = {Accelerating dissipative particle dynamics simulations for soft matter systems}, + journal = {Comput.~Mater.~Sci.}, + year = 2015, + volume = 100, + pages = {173--180} +} + +@Article{Trung17, + author = {T. D. Nguyen}, + title = {GPU-accelerated Tersoff potentials for massively parallel Molecular Dynamics simulations}, + journal = {Comp.~Phys.~Comm.}, + year = 2017, + volume = 212, + pages = {113--122} +} + +@Article{Nikolskiy19, + author = {V. Nikolskiy, V. Stegailov}, + title = {GPU acceleration of four-site water models in LAMMPS}, + journal = {Proceeding of the International Conference on Parallel Computing (ParCo 2019), Prague, Czech Republic}, + year = 2019 +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:340) + G vector (1/distance) = 0.24270009 + grid = 20 20 50 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0037271514 + estimated relative force accuracy = 1.1224206e-05 + using double precision FFTW3 + 3d grid and FFT values/proc = 40824 20000 + generated 0 of 1 mixed pair_coeff terms from geometric mixing rule +FEP/TA settings ... + temperature = 300.000000 + scale factor = 1.000500 + tail no +Per MPI rank memory allocation (min/avg/max) = 10.59 | 10.59 | 10.59 Mbytes + Step Temp Press TotEng PotEng c_TA[1] c_TA[2] c_TA[3] + 0 300 5742.8831 8061.6965 5315.4762 -10.940045 93249708 0.45 + 5000 301.43029 -118.64017 -7888.4723 -10647.786 -0.13617205 1.2566061 0.45 + 10000 294.49018 -301.44062 -8063.3808 -10759.164 -0.14897537 1.2838851 0.45 + 15000 294.36123 -407.07728 -8189.2912 -10883.894 0.34568257 0.55998421 0.45 + 20000 300.95171 111.50248 -8104.1193 -10859.052 0.11293291 0.82742794 0.45 + 25000 300.28473 388.00598 -8147.8655 -10896.692 0.11270184 0.82774872 0.45 + 30000 306.62229 -113.93849 -8191.7529 -10998.594 0.26068823 0.6457922 0.45 + 35000 303.66349 -426.81556 -8269.8364 -11049.593 0.78191631 0.26939311 0.45 + 40000 291.70214 -50.50854 -8368.0775 -11038.339 0.20120788 0.71354814 0.45 + 45000 299.74326 -289.18081 -8346.2716 -11090.142 0.4163404 0.49739645 0.45 + 50000 300.53193 36.834691 -8367.5726 -11118.662 0.20517137 0.70881996 0.45 + 55000 298.20207 -107.76906 -8274.386 -11004.148 0.7409946 0.2885342 0.45 + 60000 298.32558 -65.20542 -8433.4884 -11164.381 0.16210976 0.76191344 0.45 + 65000 297.3149 -102.87381 -8379.2515 -11100.892 0.21193701 0.70082127 0.45 + 70000 300.78423 -463.75811 -8381.3317 -11134.731 0.32109349 0.58356406 0.45 + 75000 299.53099 -53.264996 -8495.159 -11237.086 0.44828935 0.47144212 0.45 + 80000 295.55879 -590.1244 -8432.3435 -11137.909 0.28788374 0.61699451 0.45 + 85000 298.73289 -234.73297 -8473.8721 -11208.493 -0.11723275 1.2173128 0.45 + 90000 307.02709 -264.9035 -8303.7625 -11114.309 -0.098959935 1.1805672 0.45 + 95000 304.79112 199.8891 -8364.2553 -11154.334 0.036986735 0.93984396 0.45 + 100000 295.49748 -743.18974 -8453.8066 -11158.811 0.249981 0.65749559 0.45 + 105000 303.11352 -163.70166 -8324.4846 -11099.206 -0.012286442 1.0208231 0.45 + 110000 294.30278 -33.731015 -8512.8168 -11206.884 -0.0129379 1.0219392 0.45 + 115000 293.65421 393.24871 -8481.1933 -11169.324 0.75255277 0.28299408 0.45 + 120000 300.56448 16.832298 -8507.3819 -11258.769 0.13389897 0.79883437 0.45 + 125000 297.92506 -398.77893 -8576.4403 -11303.666 0.07292658 0.88485917 0.45 + 130000 303.007 -589.11865 -8560.7259 -11334.472 0.42876446 0.48713794 0.45 + 135000 310.82674 -203.4991 -8565.3181 -11410.647 0.075268046 0.88139064 0.45 + 140000 303.68345 -710.20709 -8570.895 -11350.834 -0.1023741 1.1873476 0.45 + 145000 293.86825 129.05781 -8457.0747 -11147.165 0.39475138 0.51573896 0.45 + 150000 296.93136 -734.03863 -8577.2763 -11295.406 0.73600373 0.29095985 0.45 + 155000 296.67522 -290.20206 -8631.0579 -11346.843 -0.30049664 1.6554154 0.45 + 160000 301.5685 -656.03394 -8646.3196 -11406.898 0.08494101 0.86720512 0.45 + 165000 295.8808 342.45206 -8602.0309 -11310.544 -0.30873864 1.6784606 0.45 + 170000 303.33048 -64.144957 -8580.8446 -11357.552 0.13622456 0.79572423 0.45 + 175000 300.75245 -908.44969 -8566.8005 -11319.909 0.15795135 0.76724659 0.45 + 180000 301.34603 -350.00512 -8489.0111 -11247.553 0.21089487 0.70204744 0.45 + 185000 305.96254 62.840515 -8458.0542 -11258.856 -0.050029338 1.0875408 0.45 + 190000 300.14392 256.935 -8684.6591 -11432.197 0.40144188 0.50998337 0.45 + 195000 299.32366 -218.70113 -8505.3328 -11245.362 -0.19428451 1.3852659 0.45 + 200000 307.89424 -569.89954 -8615.1541 -11433.639 0.55121888 0.39668508 0.45 + 205000 299.34873 334.69765 -8657.6353 -11397.894 0.17751997 0.74247109 0.45 + 210000 298.54619 -261.12193 -8601.2439 -11334.156 0.74219016 0.28795615 0.45 + 215000 304.02395 -306.81112 -8531.9913 -11315.047 0.86987192 0.23244073 0.45 + 220000 299.95916 278.60921 -8682.394 -11428.24 -0.26474202 1.559051 0.45 + 225000 302.839 -226.36906 -8515.0815 -11287.29 0.060381353 0.90367684 0.45 + 230000 299.54085 240.08589 -8636.8991 -11378.916 -0.46699438 2.1887589 0.45 + 235000 297.62792 -138.20813 -8627.0888 -11351.595 -0.035013312 1.0604901 0.45 + 240000 299.15558 442.88999 -8749.2731 -11487.763 0.14696819 0.78151268 0.45 + 245000 291.76323 174.70322 -8597.8808 -11268.701 -0.3979188 1.9492946 0.45 + 250000 308.21961 37.282506 -8603.7127 -11425.176 0.021882894 0.96395922 0.45 + 255000 307.18484 -493.77408 -8459.5942 -11271.585 0.16914044 0.75298079 0.45 + 260000 294.17364 -238.05366 -8677.8379 -11370.723 -0.35710078 1.8202968 0.45 + 265000 289.14461 -304.12454 -8727.2613 -11374.111 0.18045129 0.73882932 0.45 + 270000 301.51228 -255.75558 -8640.9577 -11401.022 0.49252861 0.43772444 0.45 + 275000 294.98349 -351.00974 -8678.3965 -11378.695 -0.31576914 1.6983718 0.45 + 280000 294.37376 279.87325 -8668.9575 -11363.675 0.26328091 0.64298978 0.45 + 285000 295.68351 249.3086 -8748.533 -11455.24 0.6820904 0.31849899 0.45 + 290000 298.74266 -749.43024 -8583.8679 -11318.578 0.030414997 0.95026156 0.45 + 295000 292.67215 -573.39647 -8713.3223 -11392.463 0.25656615 0.65027291 0.45 + 300000 302.48853 186.71329 -8655.8918 -11424.892 0.20319721 0.71117107 0.45 +Loop time of 706.805 on 1 procs for 300000 steps with 3072 atoms + +Performance: 36.672 ns/day, 0.654 hours/ns, 424.445 timesteps/s +95.4% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 149.88 | 149.88 | 149.88 | 0.0 | 21.21 +Bond | 17.824 | 17.824 | 17.824 | 0.0 | 2.52 +Kspace | 517.46 | 517.46 | 517.46 | 0.0 | 73.21 +Neigh | 1.3789 | 1.3789 | 1.3789 | 0.0 | 0.20 +Comm | 9.412 | 9.412 | 9.412 | 0.0 | 1.33 +Output | 0.092 | 0.092 | 0.092 | 0.0 | 0.01 +Modify | 8.3026 | 8.3026 | 8.3026 | 0.0 | 1.17 +Other | | 2.458 | | | 0.35 + +Nlocal: 3072 ave 3072 max 3072 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 8370 ave 8370 max 8370 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = -1 +Ave neighs/atom = -0.00032552083 +Ave special neighs/atom = 2 +Neighbor list builds = 14698 +Dangerous builds = 21 + +reset_timestep 0 + +variable gamma_v equal 100*(pzz-0.5*(pxx+pyy))/2/100 # surface tension via the mechanical route + +fix FEP all ave/time 100 1000 100000 c_TA[*] v_gamma_v ave running file spce.fep.ta + +run 2000000 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:340) + G vector (1/distance) = 0.24270009 + grid = 20 20 50 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0037271514 + estimated relative force accuracy = 1.1224206e-05 + using double precision FFTW3 + 3d grid and FFT values/proc = 40824 20000 + generated 0 of 1 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 10.61 | 10.61 | 10.61 Mbytes + Step Temp Press TotEng PotEng c_TA[1] c_TA[2] c_TA[3] + 0 302.48853 186.71327 -8655.8918 -11424.892 0.20325452 0.71110271 0.45 + 5000 296.71986 -573.544 -8510.0832 -11226.277 0.43636365 0.48096787 0.45 + 10000 302.58189 314.36295 -8636.8139 -11406.669 0.005932853 0.99009761 0.45 + 15000 296.98096 -950.66627 -8635.9066 -11354.49 0.48058674 0.44658101 0.45 + 20000 297.11923 -474.65836 -8666.9864 -11386.836 0.27933535 0.62590536 0.45 + 25000 302.26474 -621.83271 -8655.4227 -11422.375 0.01931686 0.96811729 0.45 + 30000 300.37645 -358.95128 -8568.7732 -11318.44 0.25415456 0.65290873 0.45 + 35000 296.5436 179.71411 -8665.0335 -11379.614 0.1911473 0.72569185 0.45 + 40000 300.79459 92.193193 -8617.7807 -11371.275 0.27587113 0.629553 0.45 + 45000 298.87827 220.06674 -8695.83 -11431.782 0.28715816 0.61774591 0.45 + 50000 304.4095 -375.31266 -8614.4396 -11401.025 -0.18683272 1.3680584 0.45 + 55000 305.11287 128.51602 -8559.8245 -11352.848 0.24122754 0.66722084 0.45 + 60000 296.56241 302.30371 -8725.6357 -11440.388 -0.27104279 1.5756158 0.45 + 65000 295.78468 -393.18931 -8716.4616 -11424.095 0.39132466 0.51871194 0.45 + 70000 297.67504 155.75977 -8641.2451 -11366.182 0.031194864 0.94901929 0.45 + 75000 298.81381 -207.51201 -8622.9859 -11358.348 -0.11330086 1.2093106 0.45 + 80000 296.17928 -360.65589 -8679.0048 -11390.25 0.68794433 0.31538684 0.45 + 85000 303.90294 488.01134 -8643.2028 -11425.151 0.41330713 0.49993365 0.45 + 90000 296.49425 14.901201 -8636.0539 -11350.182 -0.21538319 1.4351695 0.45 + 95000 308.63505 137.10659 -8570.395 -11395.661 0.51407684 0.42218544 0.45 + 100000 302.56638 -402.80803 -8635.0157 -11404.729 0.1552006 0.77079493 0.45 + 105000 293.79289 -417.74599 -8626.2538 -11315.654 -0.13491963 1.253969 0.45 + 110000 293.52504 -808.94658 -8684.9259 -11371.874 0.20573374 0.70815164 0.45 + 115000 307.6821 132.78071 -8639.817 -11456.36 -0.67060193 3.0798018 0.45 + 120000 303.22974 121.87128 -8714.7295 -11490.515 0.3675961 0.5397742 0.45 + 125000 303.8202 -34.518279 -8625.1384 -11406.329 0.17151619 0.74998608 0.45 + 130000 294.5718 -508.86133 -8684.9608 -11381.491 0.23323323 0.67622827 0.45 + 135000 302.79866 -445.99091 -8627.6163 -11399.456 0.3300839 0.57482965 0.45 + 140000 297.84052 -78.442467 -8621.5234 -11347.976 0.39157424 0.51849484 0.45 + 145000 303.64247 463.89678 -8673.8591 -11453.423 0.39692857 0.51385891 0.45 + 150000 288.38239 28.567607 -8789.6464 -11429.518 -0.045509865 1.0793274 0.45 + 155000 296.02581 -111.35664 -8674.295 -11384.135 0.23313764 0.67633671 0.45 + 160000 307.72004 -410.73956 -8578.8169 -11395.707 0.28485416 0.62013794 0.45 + 165000 300.42279 -483.56039 -8598.0354 -11348.126 0.38342507 0.52563101 0.45 + 170000 302.51326 -150.99512 -8626.2426 -11395.469 0.2439355 0.66419697 0.45 + 175000 295.41161 -554.9058 -8760.0201 -11464.238 0.38186652 0.52700696 0.45 + 180000 296.21987 -194.97724 -8645.4143 -11357.031 0.098453456 0.84777037 0.45 + 185000 296.52352 -186.85833 -8690.0538 -11404.45 0.6348999 0.34473516 0.45 + 190000 304.72799 -60.2868 -8667.2005 -11456.701 0.1885985 0.72880108 0.45 + 195000 306.65221 -871.17267 -8679.3434 -11486.458 0.56138735 0.38997638 0.45 + 200000 301.07509 362.96369 -8616.9867 -11373.048 -0.53126323 2.4379049 0.45 + 205000 303.65587 -216.8767 -8564.3182 -11344.005 0.11046546 0.83085967 0.45 + 210000 296.20891 -474.08356 -8698.3778 -11409.894 -0.11237476 1.2074335 0.45 + 215000 295.37276 422.46284 -8714.4636 -11418.326 0.042757549 0.93079022 0.45 + 220000 301.20663 -202.20616 -8577.1827 -11334.449 0.30387837 0.60066105 0.45 + 225000 306.20481 -90.566175 -8503.5134 -11306.533 0.29188403 0.6128683 0.45 + 230000 303.54253 -24.255163 -8641.8724 -11420.521 -0.38522168 1.9082173 0.45 + 235000 300.29265 -572.08074 -8664.2779 -11413.177 0.48055356 0.44660587 0.45 + 240000 302.90712 -226.88617 -8636.6962 -11409.528 -0.15295452 1.2924832 0.45 + 245000 305.05222 -68.241521 -8591.0885 -11383.557 -0.19850824 1.3951152 0.45 + 250000 300.27784 -46.680162 -8746.7288 -11495.492 -0.0098493376 1.0166585 0.45 + 255000 308.23091 -424.64171 -8573.7405 -11395.307 0.1366107 0.79520901 0.45 + 260000 296.11619 4.6901264 -8742.1916 -11452.859 -0.12450429 1.2322516 0.45 + 265000 301.62359 134.42152 -8565.5323 -11326.615 -0.028534957 1.0490284 0.45 + 270000 306.71999 -62.484213 -8690.7983 -11498.534 0.28432443 0.62068922 0.45 + 275000 292.91982 532.15442 -8779.2684 -11460.676 -0.40898808 1.9858264 0.45 + 280000 306.88024 -339.05165 -8557.2761 -11366.479 0.12573772 0.80984534 0.45 + 285000 303.38798 617.66326 -8630.5787 -11407.813 -0.1310487 1.2458532 0.45 + 290000 299.66094 302.90333 -8692.267 -11435.383 0.65063395 0.33575584 0.45 + 295000 304.49009 656.72392 -8710.7918 -11498.115 -0.16849302 1.3266137 0.45 + 300000 303.80861 -221.66912 -8688.9465 -11470.031 -0.24985266 1.5205954 0.45 + 305000 300.67136 -498.92059 -8669.6648 -11422.031 0.19219443 0.72441833 0.45 + 310000 305.7021 -521.59218 -8505.6751 -11304.093 0.52013748 0.4179152 0.45 + 315000 302.66313 -359.25677 -8682.4925 -11453.091 -0.26135382 1.5502155 0.45 + 320000 304.5646 441.04962 -8610.9569 -11398.962 0.41662005 0.49716319 0.45 + 325000 300.04934 -142.59053 -8698.3246 -11444.997 -0.23029219 1.4715132 0.45 + 330000 305.55522 -212.47771 -8576.3678 -11373.441 0.091594168 0.85758093 0.45 + 335000 294.79439 -151.62761 -8762.4565 -11461.024 0.14345357 0.78613362 0.45 + 340000 302.4373 463.41717 -8643.2588 -11411.79 0.36279978 0.54413438 0.45 + 345000 295.91624 -272.3623 -8678.9725 -11387.81 0.1032874 0.84092407 0.45 + 350000 300.60829 62.418773 -8633.2343 -11385.023 -0.040578988 1.0704371 0.45 + 355000 301.41802 -860.82496 -8573.5867 -11332.788 0.04947461 0.9203617 0.45 + 360000 298.03103 -265.05516 -8619.4232 -11347.619 -0.20903224 1.4199617 0.45 + 365000 298.08727 -359.76277 -8612.4898 -11341.201 0.040109682 0.93493354 0.45 + 370000 301.55162 -339.05976 -8687.3746 -11447.799 0.1705358 0.75122045 0.45 + 375000 299.3933 -290.38029 -8723.9515 -11464.618 -0.1476 1.2809266 0.45 + 380000 303.02442 -1104.7914 -8626.7252 -11400.631 0.3211992 0.58346059 0.45 + 385000 301.49421 -613.53228 -8662.2479 -11422.146 -0.42642873 2.0447796 0.45 + 390000 302.01134 -351.23257 -8662.4664 -11427.099 0.23747904 0.67142935 0.45 + 395000 307.32962 -443.86959 -8624.8646 -11438.181 0.17359502 0.74737541 0.45 + 400000 301.67955 -253.92045 -8690.6143 -11452.209 -0.43779134 2.0841261 0.45 + 405000 302.60773 -97.544471 -8646.8281 -11416.92 0.071259831 0.88733652 0.45 + 410000 302.48853 -630.99507 -8710.4497 -11479.45 0.28763517 0.61725182 0.45 + 415000 296.46562 -443.33457 -8763.0661 -11476.932 0.088532948 0.86199583 0.45 + 420000 295.37803 -70.515081 -8720.0027 -11423.913 0.06359365 0.89882065 0.45 + 425000 299.31069 -48.284153 -8678.6115 -11418.522 0.063520704 0.89893064 0.45 + 430000 296.37918 -651.48627 -8784.4246 -11497.5 -0.0094249768 1.0159351 0.45 + 435000 303.07145 -284.10404 -8558.3149 -11332.651 0.034731239 0.94340646 0.45 + 440000 293.1823 -280.18182 -8707.2432 -11391.054 0.14151034 0.78870025 0.45 + 445000 305.55617 -286.4858 -8646.9315 -11444.013 0.26166889 0.64473078 0.45 + 450000 300.67206 102.89156 -8705.2376 -11457.61 0.88202179 0.2277515 0.45 + 455000 304.23258 9.5792632 -8571.8771 -11356.843 -0.42835558 2.0513992 0.45 + 460000 292.30355 265.8009 -8707.4453 -11383.212 0.20592758 0.70792142 0.45 + 465000 297.62746 193.66269 -8716.5132 -11441.015 0.36938368 0.53815813 0.45 + 470000 292.53483 -75.549804 -8728.3188 -11406.202 0.49993961 0.43231669 0.45 + 475000 296.10181 -202.26042 -8657.5804 -11368.116 -0.29829888 1.6493239 0.45 + 480000 300.24953 249.20038 -8688.6705 -11437.175 0.4372485 0.48025452 0.45 + 485000 296.41241 -73.46156 -8558.9344 -11272.314 -0.15947631 1.3067001 0.45 + 490000 302.51379 -654.60188 -8571.28 -11340.512 0.36608136 0.54114742 0.45 + 495000 300.50497 -127.55361 -8724.7069 -11475.55 0.029571506 0.95160701 0.45 + 500000 303.60879 183.79306 -8568.3539 -11347.609 0.050255275 0.91915729 0.45 + 505000 303.19721 -181.45226 -8614.403 -11389.891 0.32941264 0.57547725 0.45 + 510000 296.74554 -22.844257 -8659.5977 -11376.026 0.017555998 0.97098101 0.45 + 515000 304.94785 184.89151 -8657.5502 -11449.063 0.36892431 0.53857296 0.45 + 520000 297.55996 -618.66865 -8737.5039 -11461.388 0.0057510291 0.99039963 0.45 + 525000 301.79028 298.59479 -8629.0889 -11391.698 0.34316268 0.56235619 0.45 + 530000 309.73127 127.43322 -8551.5448 -11386.846 0.76278829 0.27817682 0.45 + 535000 296.10155 231.50902 -8700.9183 -11411.452 0.44398766 0.47485618 0.45 + 540000 299.71005 -102.1096 -8655.905 -11399.471 0.76085637 0.27907974 0.45 + 545000 300.14982 -206.19313 -8714.8486 -11462.44 0.22627441 0.68416793 0.45 + 550000 294.79885 -643.7432 -8605.2486 -11303.857 -0.057557071 1.1013603 0.45 + 555000 294.17638 -19.930168 -8726.0381 -11418.949 0.40954478 0.50309869 0.45 + 560000 297.03199 -369.45853 -8470.404 -11189.455 -0.6540448 2.9954437 0.45 + 565000 291.48707 -349.3956 -8714.1576 -11382.45 0.16175418 0.76236802 0.45 + 570000 310.66906 -63.356318 -8637.4971 -11481.383 0.025729917 0.95775884 0.45 + 575000 300.62447 -741.10788 -8620.5725 -11372.509 0.16003059 0.76457532 0.45 + 580000 303.7169 -69.625554 -8649.3106 -11429.556 0.13011667 0.80391862 0.45 + 585000 296.8583 22.033506 -8781.0388 -11498.5 0.05826221 0.9068948 0.45 + 590000 295.12104 251.36802 -8661.2354 -11362.793 0.0042041083 0.99297285 0.45 + 595000 291.91551 264.01646 -8784.286 -11456.5 -0.3176707 1.7037977 0.45 + 600000 299.51751 -425.6209 -8680.4016 -11422.205 0.063170047 0.89945954 0.45 + 605000 296.04489 -702.56187 -8648.8336 -11358.848 0.44150563 0.47683729 0.45 + 610000 293.08062 387.21018 -8636.9022 -11319.782 0.430424 0.48578377 0.45 + 615000 300.1062 -406.07366 -8651.5383 -11398.731 0.16393273 0.75958719 0.45 + 620000 304.45492 -717.77411 -8466.6335 -11253.634 0.14754207 0.78076073 0.45 + 625000 300.25467 394.44177 -8545.7468 -11294.298 -0.098814662 1.1802796 0.45 + 630000 301.25687 315.97468 -8555.4413 -11313.167 -0.30209606 1.6598626 0.45 + 635000 296.62552 -313.8236 -8661.4264 -11376.756 0.82351209 0.25123759 0.45 + 640000 300.49659 458.65236 -8648.2545 -11399.021 -0.2575 1.5402266 0.45 + 645000 299.08458 -40.905776 -8589.4621 -11327.303 0.07180479 0.88652576 0.45 + 650000 299.78807 286.71966 -8663.8862 -11408.166 -0.10586303 1.1943167 0.45 + 655000 300.2646 175.76273 -8685.9588 -11434.601 -0.4131303 1.9996722 0.45 + 660000 296.01304 69.482635 -8722.0849 -11431.808 0.65234529 0.33479341 0.45 + 665000 307.08179 -192.78965 -8554.9636 -11366.011 0.37228163 0.53554848 0.45 + 670000 298.81489 46.512873 -8651.3386 -11386.71 -0.34071772 1.7709545 0.45 + 675000 298.09695 -320.42123 -8744.4868 -11473.286 0.21787637 0.6938739 0.45 + 680000 291.73582 -346.08326 -8809.3602 -11479.93 0.35114775 0.55487414 0.45 + 685000 299.8583 -53.573198 -8742.9543 -11487.877 -0.032502983 1.056034 0.45 + 690000 299.56857 -129.53024 -8600.751 -11343.022 0.11604588 0.82311864 0.45 + 695000 287.63895 77.534045 -8889.5114 -11522.578 0.16150699 0.76268419 0.45 + 700000 294.71917 -187.77101 -8824.4116 -11522.291 0.33093056 0.57401387 0.45 + 705000 301.78978 -269.32554 -8594.7858 -11357.39 -0.098783804 1.1802185 0.45 + 710000 305.58313 -214.43945 -8518.1241 -11315.453 -0.03149037 1.0542418 0.45 + 715000 306.30354 -121.41526 -8617.5112 -11421.435 0.10640694 0.83653526 0.45 + 720000 304.94559 91.460869 -8587.9126 -11379.405 -0.4078455 1.982024 0.45 + 725000 295.36839 -505.69412 -8724.4826 -11428.305 0.71800645 0.29987744 0.45 + 730000 298.79826 -9.9970862 -8716.023 -11451.242 0.59730469 0.36717499 0.45 + 735000 300.95964 286.58072 -8641.7744 -11396.779 0.23910326 0.66960256 0.45 + 740000 298.32007 -198.81619 -8685.7142 -11416.556 0.16840724 0.75390743 0.45 + 745000 296.06461 157.22083 -8605.3591 -11315.555 0.3149783 0.58958082 0.45 + 750000 297.27956 -277.36948 -8673.9548 -11395.272 0.058965185 0.90582605 0.45 + 755000 296.79569 203.4854 -8671.4835 -11388.371 0.097863507 0.84860972 0.45 + 760000 296.34981 -296.05791 -8699.7009 -11412.507 0.34644945 0.55926433 0.45 + 765000 302.19536 -657.32604 -8674.9726 -11441.289 -0.25940717 1.5451618 0.45 + 770000 301.91884 -775.45423 -8695.1619 -11458.947 -0.12199652 1.227079 0.45 + 775000 299.9563 -211.10367 -8637.8471 -11383.667 0.3478892 0.55791532 0.45 + 780000 296.00862 -396.64708 -8721.8097 -11431.493 0.25358512 0.65353267 0.45 + 785000 295.12431 -24.44772 -8734.6065 -11436.194 -0.19904079 1.396362 0.45 + 790000 308.18585 -171.55104 -8659.2474 -11480.402 0.30853408 0.59598847 0.45 + 795000 296.45675 -137.73831 -8648.3419 -11362.127 -0.32469954 1.7240046 0.45 + 800000 301.11214 53.405034 -8663.3832 -11419.784 0.1323728 0.800882 0.45 + 805000 305.74305 -320.69662 -8642.7722 -11441.565 0.15136393 0.77577146 0.45 + 810000 305.37725 -264.53003 -8671.4307 -11466.875 0.3113551 0.59317494 0.45 + 815000 304.38239 -240.94118 -8474.7091 -11261.046 -0.080564405 1.1446952 0.45 + 820000 296.05915 -369.13085 -8698.3399 -11408.485 -0.028085872 1.0482385 0.45 + 825000 299.79549 123.66824 -8712.0882 -11456.436 -0.36082461 1.8317026 0.45 + 830000 296.0201 231.08408 -8726.975 -11436.763 -0.22224484 1.4517833 0.45 + 835000 294.90197 -293.4635 -8750.8202 -11450.373 -0.13935283 1.2633285 0.45 + 840000 301.79184 -18.424101 -8689.643 -11452.266 0.19065717 0.72628873 0.45 + 845000 303.63406 232.88156 -8607.7816 -11387.268 0.16521847 0.75795075 0.45 + 850000 300.78823 -301.92537 -8697.521 -11450.957 0.043047914 0.93033698 0.45 + 855000 300.26171 -407.09613 -8617.7866 -11366.403 0.30989277 0.59463173 0.45 + 860000 303.77064 192.13208 -8630.0944 -11410.831 0.44012319 0.47794432 0.45 + 865000 300.12867 323.6738 -8735.2213 -11482.619 0.098660075 0.8474766 0.45 + 870000 299.40232 -213.89349 -8642.3645 -11383.114 0.1478115 0.78040795 0.45 + 875000 300.46794 23.703316 -8624.9835 -11375.487 0.021260277 0.96496648 0.45 + 880000 298.40697 20.053507 -8834.9602 -11566.598 0.25906036 0.647558 0.45 + 885000 299.89193 -56.830889 -8726.8039 -11472.035 -0.14632707 1.2781945 0.45 + 890000 297.49341 -718.63083 -8683.0987 -11406.373 0.017721028 0.97071226 0.45 + 895000 293.34825 -483.14011 -8698.5638 -11383.894 -0.34844876 1.7940698 0.45 + 900000 303.8984 71.405143 -8703.2466 -11485.153 -0.0040127852 1.0067537 0.45 + 905000 296.96955 99.337161 -8644.502 -11362.981 0.29986926 0.60471403 0.45 + 910000 294.13396 -276.63831 -8661.5829 -11354.105 -0.24102928 1.4982558 0.45 + 915000 303.26417 -43.876545 -8575.252 -11351.353 0.013417579 0.97774479 0.45 + 920000 305.27911 -346.57544 -8582.8329 -11377.379 -0.20901843 1.4199288 0.45 + 925000 307.27639 482.10278 -8628.8226 -11441.652 -0.26779925 1.5670667 0.45 + 930000 305.11633 324.47709 -8579.3587 -11372.414 0.68253083 0.31826378 0.45 + 935000 300.11916 -9.8766723 -8780.2986 -11527.61 -0.13402188 1.2520821 0.45 + 940000 295.78408 -67.021801 -8735.3706 -11442.998 0.46658388 0.45719462 0.45 + 945000 300.211 161.55245 -8703.5002 -11451.652 0.062310593 0.90075717 0.45 + 950000 302.51856 -145.81508 -8539.9241 -11309.199 0.019344642 0.96807218 0.45 + 955000 297.23872 14.140867 -8682.9686 -11403.912 -0.30285941 1.6619893 0.45 + 960000 296.19195 158.66375 -8772.8876 -11484.249 0.3298895 0.57501712 0.45 + 965000 293.56726 -302.80176 -8807.9639 -11495.298 0.16057514 0.76387726 0.45 + 970000 307.76289 234.82705 -8569.0805 -11386.363 0.40582434 0.50624817 0.45 + 975000 302.4391 -372.66289 -8569.3448 -11337.893 1.1335506 0.14935733 0.45 + 980000 292.59861 191.50447 -8796.4307 -11474.898 0.82080866 0.25237947 0.45 + 985000 301.61407 97.625218 -8720.889 -11481.885 0.12835918 0.80629208 0.45 + 990000 303.38224 -380.86284 -8666.6015 -11443.783 0.29943962 0.60514999 0.45 + 995000 299.25364 -139.10643 -8631.5948 -11370.983 0.033070141 0.94603876 0.45 + 1000000 295.67561 -191.48596 -8566.021 -11272.656 0.34200535 0.56344895 0.45 + 1005000 304.80384 39.665031 -8603.3665 -11393.562 0.75244137 0.28304697 0.45 + 1010000 298.87735 -181.49155 -8699.7359 -11435.679 0.23524427 0.67395098 0.45 + 1015000 289.92007 -182.58369 -8652.9669 -11306.915 -0.61857139 2.8224052 0.45 + 1020000 300.13923 106.07213 -8618.1949 -11365.69 0.15241071 0.77441051 0.45 + 1025000 307.39589 -312.91975 -8613.3088 -11427.232 0.44069144 0.47748897 0.45 + 1030000 298.41225 441.04111 -8696.1929 -11427.879 -0.1456028 1.2766425 0.45 + 1035000 306.71758 -95.739338 -8471.0526 -11278.766 0.69089513 0.31382964 0.45 + 1040000 302.24132 -415.80447 -8608.0891 -11374.827 0.0090309238 0.98496572 0.45 + 1045000 305.58772 -150.58406 -8563.9959 -11361.367 0.062478239 0.90050391 0.45 + 1050000 303.60025 21.785837 -8623.6613 -11402.839 0.18503623 0.73316896 0.45 + 1055000 293.38734 613.83617 -8606.7635 -11292.451 -0.2195833 1.4453164 0.45 + 1060000 305.11418 -29.208186 -8589.4319 -11382.468 -0.095889014 1.1745016 0.45 + 1065000 294.13176 470.07703 -8724.8028 -11417.305 0.28934127 0.61548789 0.45 + 1070000 309.64471 -634.00961 -8534.3395 -11368.848 -0.048186981 1.0841851 0.45 + 1075000 300.56742 -209.29645 -8615.1904 -11366.605 -0.26336339 1.5554498 0.45 + 1080000 297.94855 218.48741 -8697.7569 -11425.198 -0.0401787 1.0697186 0.45 + 1085000 308.40523 -177.4101 -8681.0198 -11504.182 0.32537753 0.57938558 0.45 + 1090000 295.63403 117.27818 -8609.1285 -11315.382 0.27576906 0.62966079 0.45 + 1095000 300.09566 635.58958 -8552.5989 -11299.695 -0.056458656 1.0993329 0.45 + 1100000 300.68272 375.84619 -8709.6822 -11462.152 0.28519281 0.61978578 0.45 + 1105000 303.34279 -980.64631 -8585.6781 -11362.499 0.34352221 0.56201715 0.45 + 1110000 304.45088 84.082657 -8606.3018 -11393.266 0.019454666 0.96789353 0.45 + 1115000 296.03894 543.18998 -8568.9408 -11278.901 0.38977572 0.5200614 0.45 + 1120000 307.38628 -200.46817 -8619.8059 -11433.641 -0.21765351 1.4406454 0.45 + 1125000 303.36463 -96.322086 -8596.6485 -11373.669 -0.050201944 1.0878558 0.45 + 1130000 295.03081 19.554539 -8820.2191 -11520.951 0.24816885 0.65949722 0.45 + 1135000 297.2534 -452.18389 -8614.3296 -11335.407 0.47102824 0.45379893 0.45 + 1140000 298.03519 -102.40026 -8663.5539 -11391.788 0.42591169 0.48947459 0.45 + 1145000 295.38879 -444.99161 -8629.1445 -11333.153 0.39655669 0.51417955 0.45 + 1150000 303.8409 -236.98919 -8595.3972 -11376.777 0.64097267 0.34124136 0.45 + 1155000 306.07517 -215.50846 -8588.4969 -11390.33 0.036055871 0.94131261 0.45 + 1160000 294.9636 -931.69596 -8675.0022 -11375.119 0.19752892 0.71796511 0.45 + 1165000 294.72276 -192.71028 -8637.3451 -11335.257 -0.00048188528 1.0008086 0.45 + 1170000 301.23614 -213.88646 -8482.7135 -11240.25 0.71933969 0.29920755 0.45 + 1175000 300.44993 375.9896 -8633.2248 -11383.564 0.30232015 0.60223308 0.45 + 1180000 300.16377 118.10917 -8654.5233 -11402.243 0.12296714 0.81361774 0.45 + 1185000 293.70358 210.30955 -8646.4181 -11335.001 0.30210616 0.6024493 0.45 + 1190000 304.75915 -651.08053 -8575.2958 -11365.082 -0.02759447 1.0473748 0.45 + 1195000 297.70391 95.378065 -8731.319 -11456.521 0.52250206 0.41626089 0.45 + 1200000 293.90642 -733.78695 -8697.185 -11387.624 0.13079675 0.80300207 0.45 + 1205000 303.05224 -511.38179 -8632.6207 -11406.781 -0.20143249 1.4019752 0.45 + 1210000 293.80664 245.08881 -8756.1441 -11445.67 0.37969913 0.52892642 0.45 + 1215000 296.59811 308.46776 -8624.2865 -11339.366 0.14440905 0.78487467 0.45 + 1220000 303.74266 188.84272 -8605.9211 -11386.402 -0.092746405 1.1683266 0.45 + 1225000 299.9013 -466.73438 -8576.203 -11321.52 0.27417371 0.63134804 0.45 + 1230000 299.66611 -174.43092 -8604.5105 -11347.674 0.47991062 0.44708777 0.45 + 1235000 295.89844 394.40733 -8789.3714 -11498.046 0.088629157 0.86185673 0.45 + 1240000 298.78384 419.34789 -8688.5635 -11423.651 0.22218371 0.68887865 0.45 + 1245000 299.90866 183.59906 -8698.2559 -11443.64 1.1590193 0.143111 0.45 + 1250000 296.01051 196.22426 -8831.5506 -11541.251 -0.04226137 1.0734621 0.45 + 1255000 292.09199 -163.44863 -8711.8649 -11385.695 0.57648767 0.38022263 0.45 + 1260000 298.83471 -194.96215 -8646.8698 -11382.423 0.10966149 0.83198091 0.45 + 1265000 302.24158 163.34413 -8653.0984 -11419.838 0.51878502 0.41886437 0.45 + 1270000 298.29186 -765.77064 -8697.9423 -11428.526 -0.40185995 1.9622238 0.45 + 1275000 300.55952 -162.42423 -8614.8996 -11366.242 -0.43706076 2.0815736 0.45 + 1280000 294.52892 156.17026 -8718.8337 -11414.971 0.010263439 0.98293149 0.45 + 1285000 301.40565 -778.44393 -8670.527 -11429.615 0.025111338 0.95875312 0.45 + 1290000 294.20057 -918.07774 -8683.4672 -11376.599 0.046386022 0.92514227 0.45 + 1295000 301.09196 -665.75324 -8687.0149 -11443.231 0.11169829 0.82914327 0.45 + 1300000 294.16167 -297.06724 -8708.7055 -11401.481 0.11765896 0.82089447 0.45 + 1305000 303.07886 -538.32897 -8514.6586 -11289.063 -0.047420749 1.0827925 0.45 + 1310000 302.36674 -40.952458 -8536.8784 -11304.764 -0.42539639 2.0412418 0.45 + 1315000 302.05477 -60.391628 -8662.9591 -11427.989 0.13452485 0.79799615 0.45 + 1320000 303.48158 71.63406 -8661.3057 -11439.397 -0.039130791 1.0678399 0.45 + 1325000 296.35737 -261.05768 -8561.6568 -11274.532 0.44670407 0.47269742 0.45 + 1330000 296.29207 -147.71061 -8543.8084 -11256.086 0.2909439 0.61383553 0.45 + 1335000 301.48737 453.77169 -8648.236 -11408.072 0.078354877 0.87683873 0.45 + 1340000 300.90975 -596.76946 -8621.8298 -11376.378 0.49429189 0.43643168 0.45 + 1345000 295.08431 -540.90158 -8694.8895 -11396.111 0.17025999 0.75156807 0.45 + 1350000 296.63006 -197.97304 -8632.9441 -11348.316 -0.29504955 1.6403589 0.45 + 1355000 305.25857 -242.97453 -8473.9923 -11268.35 0.069838933 0.88945392 0.45 + 1360000 296.22833 -151.24398 -8660.529 -11372.223 -0.28031505 1.6003133 0.45 + 1365000 301.25457 -383.71973 -8610.3716 -11368.076 -0.18330657 1.3599906 0.45 + 1370000 300.8142 -179.49364 -8641.5538 -11395.227 0.23629239 0.67276715 0.45 + 1375000 307.62118 -82.315057 -8464.9289 -11280.914 0.024560511 0.95963938 0.45 + 1380000 303.12816 -335.58742 -8512.0211 -11286.877 0.30238814 0.60216441 0.45 + 1385000 304.36118 711.2159 -8577.0597 -11363.203 0.34444857 0.56114453 0.45 + 1390000 294.15072 406.74931 -8678.8526 -11371.528 0.29195829 0.61279196 0.45 + 1395000 300.50629 -164.22554 -8592.1543 -11343.009 0.098759052 0.84733591 0.45 + 1400000 297.37345 -98.001104 -8741.5121 -11463.689 0.27444766 0.63105799 0.45 + 1405000 294.17572 -86.526127 -8712.3447 -11405.249 0.4297415 0.48634023 0.45 + 1410000 310.48104 141.84417 -8647.4854 -11489.65 0.86645808 0.23377559 0.45 + 1415000 310.06801 -433.29574 -8486.7744 -11325.158 -0.21510676 1.4345042 0.45 + 1420000 303.98547 -69.701496 -8551.8036 -11334.507 0.16419779 0.75924955 0.45 + 1425000 301.40096 -115.67827 -8639.4818 -11398.527 0.20161321 0.71306316 0.45 + 1430000 299.1258 -79.769416 -8721.6844 -11459.902 0.36298014 0.54396978 0.45 + 1435000 298.45349 180.92871 -8700.7025 -11432.766 0.43843749 0.47929766 0.45 + 1440000 299.14006 146.72026 -8675.5643 -11413.913 0.50244279 0.43050527 0.45 + 1445000 299.98035 -404.81666 -8725.6961 -11471.737 0.49995597 0.43230482 0.45 + 1450000 295.10222 59.166328 -8728.5327 -11429.918 0.04154017 0.93269286 0.45 + 1455000 292.52514 144.30376 -8743.1245 -11420.919 0.04910241 0.92093649 0.45 + 1460000 303.68948 -264.34132 -8631.6334 -11411.627 0.23528019 0.67391039 0.45 + 1465000 302.97467 98.874471 -8689.2883 -11462.739 0.21805801 0.69366252 0.45 + 1470000 294.50716 133.30708 -8625.4721 -11321.411 0.98143982 0.19276882 0.45 + 1475000 302.04729 -120.74445 -8637.7677 -11402.729 0.4707242 0.45403042 0.45 + 1480000 305.16876 -436.598 -8614.8793 -11408.415 0.27111226 0.63459852 0.45 + 1485000 297.20205 -166.62152 -8598.691 -11319.299 -0.24681532 1.5128679 0.45 + 1490000 299.73617 -126.47006 -8649.4834 -11393.289 0.47833671 0.44826968 0.45 + 1495000 295.64416 481.3869 -8697.4378 -11403.784 0.1128182 0.82758717 0.45 + 1500000 301.34876 -64.948239 -8570.0291 -11328.596 0.10524924 0.83816132 0.45 + 1505000 297.45753 538.92423 -8678.9073 -11401.854 0.15764246 0.76764423 0.45 + 1510000 304.47978 -609.79308 -8491.9652 -11279.194 0.40940159 0.50321953 0.45 + 1515000 301.26466 -130.2245 -8572.0691 -11329.866 0.89811777 0.22168463 0.45 + 1520000 306.33064 472.83128 -8553.0557 -11357.227 -0.3949103 1.9394824 0.45 + 1525000 303.77309 446.96086 -8658.8797 -11439.639 0.23907939 0.66962936 0.45 + 1530000 305.94257 -462.96121 -8683.4501 -11484.069 -0.29365623 1.6365296 0.45 + 1535000 296.45268 -725.6647 -8564.4464 -11278.194 0.031785638 0.94807932 0.45 + 1540000 297.90338 -418.20316 -8566.3092 -11293.337 0.50491901 0.42872083 0.45 + 1545000 304.3796 -281.11491 -8571.3965 -11357.708 0.26286914 0.64343405 0.45 + 1550000 296.71481 -62.772449 -8680.9078 -11397.055 0.15669974 0.76885909 0.45 + 1555000 297.50225 148.74592 -8754.0913 -11477.447 0.14286636 0.78690833 0.45 + 1560000 300.52393 373.85791 -8638.4601 -11389.477 0.089292836 0.8608978 0.45 + 1565000 295.18741 -197.82529 -8603.6291 -11305.795 0.36113621 0.54565489 0.45 + 1570000 295.50662 -297.43989 -8727.7936 -11432.881 0.24895806 0.65862474 0.45 + 1575000 306.12787 745.92559 -8609.3706 -11411.686 0.42705392 0.48853767 0.45 + 1580000 300.84367 544.00229 -8635.6029 -11389.546 -0.20268104 1.4049145 0.45 + 1585000 293.01964 208.25986 -8624.1146 -11306.436 -0.013645123 1.0231522 0.45 + 1590000 304.09 110.80761 -8602.177 -11385.837 -0.39136115 1.9279703 0.45 + 1595000 289.74205 -521.57012 -8666.417 -11318.735 0.30601242 0.59851474 0.45 + 1600000 297.3494 368.04946 -8684.986 -11406.943 0.079346518 0.87538143 0.45 + 1605000 301.19957 -293.44562 -8521.9202 -11279.121 0.49408391 0.43658396 0.45 + 1610000 299.66627 -592.72965 -8750.1489 -11493.314 -0.20726596 1.415761 0.45 + 1615000 301.32181 329.96166 -8575.077 -11333.397 0.21514479 0.69706049 0.45 + 1620000 297.46259 -575.7077 -8604.3396 -11327.332 0.051950054 0.91654801 0.45 + 1625000 301.143 -578.27016 -8622.6936 -11379.377 0.33929754 0.566014 0.45 + 1630000 301.9449 119.02272 -8744.8752 -11508.899 0.25690123 0.64990753 0.45 + 1635000 292.31769 -256.96526 -8729.3974 -11405.293 0.2041501 0.71003527 0.45 + 1640000 305.17316 -224.04815 -8619.2426 -11412.818 0.61612842 0.35576261 0.45 + 1645000 299.82547 -453.0871 -8601.8345 -11346.457 0.44515417 0.47392794 0.45 + 1650000 300.70213 -184.15313 -8604.5269 -11357.175 0.40413562 0.50768423 0.45 + 1655000 298.34797 241.12842 -8736.9407 -11468.038 0.2219039 0.68920205 0.45 + 1660000 305.65546 522.2866 -8702.2765 -11500.267 -0.093142651 1.1691034 0.45 + 1665000 296.92311 -22.202256 -8648.9808 -11367.035 0.21695848 0.69494306 0.45 + 1670000 293.71721 -216.98365 -8726.8596 -11415.567 0.062675713 0.90020567 0.45 + 1675000 302.06866 69.039243 -8665.567 -11430.724 0.0012561112 0.99789522 0.45 + 1680000 292.51483 -764.83087 -8759.3069 -11437.007 0.0022259364 0.99627318 0.45 + 1685000 300.70748 -239.98915 -8682.5295 -11435.226 0.21854685 0.69309397 0.45 + 1690000 303.31754 36.443117 -8554.7105 -11331.3 0.18904617 0.72825402 0.45 + 1695000 300.96783 -365.40002 -8606.9996 -11362.08 0.21317894 0.69936284 0.45 + 1700000 301.78038 -460.56572 -8703.0763 -11465.594 -0.074311844 1.1327524 0.45 + 1705000 299.08328 224.74817 -8680.6969 -11418.526 0.14954235 0.77814547 0.45 + 1710000 303.24064 298.73582 -8637.4191 -11413.304 -0.11628651 1.2153822 0.45 + 1715000 299.1988 535.86954 -8722.2318 -11461.118 0.51289768 0.42302132 0.45 + 1720000 300.88716 -11.654893 -8624.0905 -11378.432 0.62281958 0.35179195 0.45 + 1725000 306.59581 -286.69581 -8574.7957 -11381.394 0.3964476 0.51427364 0.45 + 1730000 302.58784 590.55523 -8670.9964 -11440.906 -0.28655798 1.6171597 0.45 + 1735000 295.17235 -60.036989 -8631.671 -11333.699 0.72231294 0.29771902 0.45 + 1740000 290.06228 -254.79282 -8715.6619 -11370.912 0.35583392 0.55052961 0.45 + 1745000 306.47487 418.58552 -8590.4226 -11395.914 -0.04975774 1.0870455 0.45 + 1750000 296.74674 -73.367187 -8727.0183 -11443.458 -0.27066543 1.5746188 0.45 + 1755000 299.03541 551.77198 -8712.6905 -11450.081 -0.35865936 1.8250619 0.45 + 1760000 288.98684 -380.17132 -8775.8546 -11421.26 -0.17754854 1.3469184 0.45 + 1765000 300.76459 -662.80282 -8671.5414 -11424.761 0.078118597 0.87718632 0.45 + 1770000 301.47287 -498.34628 -8675.582 -11435.285 0.57886218 0.37871122 0.45 + 1775000 307.18565 -70.676548 -8554.9531 -11366.951 0.38766498 0.52190597 0.45 + 1780000 302.58164 -329.49774 -8638.9781 -11408.831 0.53149245 0.41003059 0.45 + 1785000 307.4086 294.59322 -8586.4793 -11400.518 0.34963097 0.55628768 0.45 + 1790000 295.81491 -366.57154 -8756.8143 -11464.724 0.61653346 0.35552098 0.45 + 1795000 296.46712 18.92361 -8640.9928 -11354.873 0.21158778 0.70123194 0.45 + 1800000 290.9851 -805.74081 -8636.1049 -11299.802 0.36361854 0.54338759 0.45 + 1805000 291.6313 -58.207903 -8707.0768 -11376.689 0.2659117 0.6401586 0.45 + 1810000 299.14324 327.45026 -8613.3385 -11351.716 0.58264334 0.37631684 0.45 + 1815000 295.3441 37.594139 -8747.5577 -11451.158 0.10312363 0.84115511 0.45 + 1820000 297.19616 596.87014 -8601.4315 -11321.985 0.11690702 0.82193051 0.45 + 1825000 305.23709 -229.45704 -8586.9328 -11381.094 -0.070794327 1.1260885 0.45 + 1830000 308.48265 -50.225625 -8595.8609 -11419.732 0.28577292 0.61918297 0.45 + 1835000 301.67215 30.600339 -8561.9509 -11323.478 0.67464985 0.32249901 0.45 + 1840000 297.44022 -46.915689 -8760.5329 -11483.321 0.20308399 0.71130615 0.45 + 1845000 294.56439 121.7989 -8819.2766 -11515.739 -0.13859762 1.2617292 0.45 + 1850000 303.92475 63.511256 -8655.7131 -11437.861 -0.064617898 1.1144821 0.45 + 1855000 302.36347 -403.0262 -8663.1963 -11431.052 0.63223295 0.34628081 0.45 + 1860000 292.88227 124.53259 -8622.4528 -11303.517 0.21782313 0.69393587 0.45 + 1865000 299.49141 1.3922328 -8592.8243 -11334.389 0.024359522 0.95996296 0.45 + 1870000 295.36403 -1.848842 -8534.7607 -11238.543 0.53331666 0.40877784 0.45 + 1875000 299.5254 -303.35635 -8642.4199 -11384.296 0.12049946 0.8169925 0.45 + 1880000 302.15027 -233.4192 -8607.1984 -11373.102 0.42967343 0.48639576 0.45 + 1885000 293.78387 -312.31798 -8576.6303 -11265.948 0.62050206 0.35316217 0.45 + 1890000 296.33987 227.42925 -8675.0988 -11387.814 -0.2387251 1.4924762 0.45 + 1895000 296.4116 -297.41585 -8695.6693 -11409.041 0.1899345 0.72716967 0.45 + 1900000 305.04631 -744.8928 -8495.6073 -11288.022 -0.092917858 1.1686627 0.45 + 1905000 299.13767 -233.05542 -8771.8955 -11510.222 -0.053515786 1.0939196 0.45 + 1910000 301.18529 391.32364 -8594.238 -11351.309 0.17761387 0.74235415 0.45 + 1915000 304.53139 -205.26743 -8615.1863 -11402.887 -0.65441918 2.9973254 0.45 + 1920000 304.46794 75.506851 -8696.0461 -11483.166 0.28757039 0.6173189 0.45 + 1925000 295.83229 -40.226799 -8677.0683 -11385.137 0.34338584 0.56214572 0.45 + 1930000 298.91694 72.305481 -8662.7622 -11399.068 -0.45255095 2.1363683 0.45 + 1935000 297.28693 -277.78411 -8678.223 -11399.608 0.32165864 0.58301111 0.45 + 1940000 295.22194 -153.48885 -8737.0529 -11439.534 0.47753767 0.4488709 0.45 + 1945000 298.41366 0.98105216 -8615.733 -11347.432 0.061208942 0.90242323 0.45 + 1950000 298.47932 -461.39566 -8587.8993 -11320.199 0.41883297 0.49532116 0.45 + 1955000 293.30456 -530.72887 -8712.242 -11397.172 -0.052983042 1.0929425 0.45 + 1960000 307.27812 -609.68084 -8563.1295 -11375.974 0.10863685 0.83341209 0.45 + 1965000 309.21876 -661.65884 -8619.5376 -11450.147 -0.00074060514 1.0012431 0.45 + 1970000 294.16474 130.9219 -8662.5966 -11355.4 -0.048761848 1.0852311 0.45 + 1975000 293.87023 -652.42226 -8587.2681 -11277.376 -0.42701916 2.0468057 0.45 + 1980000 302.66906 -396.94893 -8576.3291 -11346.982 0.55938449 0.39128874 0.45 + 1985000 304.00863 167.22102 -8525.9503 -11308.866 -0.12417188 1.2315647 0.45 + 1990000 299.53376 -234.11494 -8528.8821 -11270.834 0.58392743 0.37550715 0.45 + 1995000 296.20959 -99.022727 -8599.3854 -11310.908 0.10920765 0.83261451 0.45 + 2000000 307.40367 -179.44965 -8545.6064 -11359.6 0.485016 0.44327537 0.45 +Loop time of 4787.7 on 1 procs for 2000000 steps with 3072 atoms + +Performance: 36.092 ns/day, 0.665 hours/ns, 417.737 timesteps/s +95.4% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1015.1 | 1015.1 | 1015.1 | 0.0 | 21.20 +Bond | 121.19 | 121.19 | 121.19 | 0.0 | 2.53 +Kspace | 3455.1 | 3455.1 | 3455.1 | 0.0 | 72.17 +Neigh | 8.7475 | 8.7475 | 8.7475 | 0.0 | 0.18 +Comm | 58.679 | 58.679 | 58.679 | 0.0 | 1.23 +Output | 0.60209 | 0.60209 | 0.60209 | 0.0 | 0.01 +Modify | 81.328 | 81.328 | 81.328 | 0.0 | 1.70 +Other | | 46.88 | | | 0.98 + +Nlocal: 3072 ave 3072 max 3072 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 8395 ave 8395 max 8395 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = -1 +Ave neighs/atom = -0.00032552083 +Ave special neighs/atom = 2 +Neighbor list builds = 93794 +Dangerous builds = 0 + +Total wall time: 1:31:34 diff --git a/examples/PACKAGES/fep/ta/spce.fep.ta b/examples/PACKAGES/fep/ta/spce.fep.ta new file mode 100644 index 0000000000..7ed4013d65 --- /dev/null +++ b/examples/PACKAGES/fep/ta/spce.fep.ta @@ -0,0 +1,22 @@ +# Time-averaged data for fix FEP +# TimeStep c_TA[1] c_TA[2] c_TA[3] v_gamma_v +100000 0.168677 0.863546 0.45 65.7437 +200000 0.169722 0.861354 0.45 66.6859 +300000 0.165507 0.868407 0.45 63.1899 +400000 0.162311 0.875704 0.45 60.7859 +500000 0.165468 0.872729 0.45 63.2053 +600000 0.165267 0.873825 0.45 63.1828 +700000 0.167824 0.869356 0.45 65.1722 +800000 0.170332 0.866538 0.45 67.0749 +900000 0.164396 0.875043 0.45 62.4639 +1000000 0.164738 0.87663 0.45 62.5659 +1100000 0.168395 0.870496 0.45 65.415 +1200000 0.170147 0.867104 0.45 66.7132 +1300000 0.170509 0.866709 0.45 66.9833 +1400000 0.171152 0.865294 0.45 67.5598 +1500000 0.172363 0.863433 0.45 68.547 +1600000 0.171538 0.864062 0.45 67.8359 +1700000 0.171662 0.864029 0.45 67.9145 +1800000 0.170202 0.866069 0.45 66.7697 +1900000 0.171403 0.864162 0.45 67.6313 +2000000 0.170962 0.864753 0.45 67.2314 From 79fcf1801367a5880f6217a9f4f07c4218ad4257 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 31 Mar 2022 12:25:58 -0600 Subject: [PATCH 19/57] Remove #ifdef --- src/KOKKOS/pair_reaxff_kokkos.cpp | 1127 ----------------------------- src/KOKKOS/pair_reaxff_kokkos.h | 79 -- 2 files changed, 1206 deletions(-) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 23a2be2cb8..14af59e754 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -77,13 +77,11 @@ PairReaxFFKokkos::PairReaxFFKokkos(LAMMPS *lmp) : PairReaxFF(lmp) k_error_flag = DAT::tdual_int_scalar("pair:error_flag"); k_nbuf_local = DAT::tdual_int_scalar("pair:nbuf_local"); -#ifdef OPT_ANGULAR_TORSION d_torsion_pack = t_reax_int4_2d("reaxff:torsion_pack",1,2); d_angular_pack = t_reax_int4_2d("reaxff:angular_pack",1,2); k_count_angular_torsion = DAT::tdual_int_1d("PairReaxFF::count_angular_torsion",2); d_count_angular_torsion = k_count_angular_torsion.template view(); -#endif if (execution_space == Host) list_blocking_flag = 1; } @@ -943,8 +941,6 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) pvector[3] = 0.0; ev_all.evdwl += ev.ereax[0] + ev.ereax[1] + ev.ereax[2]; -#ifdef OPT_ANGULAR_TORSION - int count_angular = 0; int count_torsion = 0; @@ -956,12 +952,6 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) // separate kernels for counting of Angular, Torsion // may make a difference for occupancy/cache thrashing -#ifdef OPT_SPLIT_COUNT_ANGULAR_TORSION - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); -#else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); -#endif k_count_angular_torsion.template modify(); k_count_angular_torsion.template sync(); @@ -981,12 +971,7 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) k_count_angular_torsion.template modify(); k_count_angular_torsion.template sync(); -#ifdef OPT_SPLIT_COUNT_ANGULAR_TORSION - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); -#else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); -#endif // no need to re-sync count_angular, count_torsion @@ -1027,70 +1012,6 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) pvector[9] = ev.ereax[7]; ev_all.evdwl += ev.ereax[6] + ev.ereax[7]; -#else - - - // Angular - if (neighflag == HALF) { - if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this,ev); - else - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - ev_all += ev; - } else { //if (neighflag == HALFTHREAD) { - if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this,ev); - else - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - ev_all += ev; - } - pvector[4] = ev.ereax[3]; - pvector[5] = ev.ereax[4]; - pvector[6] = ev.ereax[5]; - ev_all.evdwl += ev.ereax[3] + ev.ereax[4] + ev.ereax[5]; - - if (inum > counters.extent(0)) { - // HIP backend note: use the "hipHostMallocNonCoherent" flag if/when - // it is exposed in Kokkos for HIP pinned memory allocations - counters = t_hostpinned_int_1d("ReaxFF::counters", inum); - counters_jj_min = t_hostpinned_int_1d("ReaxFF::counters_jj_min", inum); - counters_jj_max = t_hostpinned_int_1d("ReaxFF::counters_jj_max", inum); - counters_kk_min = t_hostpinned_int_1d("ReaxFF::counters_kk_min", inum); - counters_kk_max = t_hostpinned_int_1d("ReaxFF::counters_kk_max", inum); - } - - Kokkos::parallel_for(Kokkos::RangePolicy(0,inum),*this); - Kokkos::fence(); - - // Compress the counters list ; could be accomplished on device with parallel scan - int nnz = 0; - for (int i = 0; i < inum; ++i) { - if (counters[i] > 0) { - counters[nnz] = i; - nnz++; - } - } - - if (neighflag == HALF) { - if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,nnz),*this,ev); - else - Kokkos::parallel_for(Kokkos::RangePolicy>(0,nnz),*this); - ev_all += ev; - } else { - if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,nnz),*this,ev); - else - Kokkos::parallel_for(Kokkos::RangePolicy>(0,nnz),*this); - ev_all += ev; - } - - pvector[8] = ev.ereax[6]; - pvector[9] = ev.ereax[7]; - ev_all.evdwl += ev.ereax[6] + ev.ereax[7]; - -#endif - // Hydrogen Bond if (cut_hbsq > 0.0) { if (neighflag == HALF) { @@ -1611,18 +1532,8 @@ void PairReaxFFKokkos::allocate_array() d_BO_pi = typename AT::t_ffloat_2d_dl("reaxff/kk:BO_pi",nmax,maxbo); d_BO_pi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:BO_pi2",nmax,maxbo); -#ifdef OPT_REDUCE_DXDYDZ d_dln_BOp_pi = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi",nmax,maxbo); d_dln_BOp_pi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2",nmax,maxbo); -#else - d_dln_BOp_pix = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pix",nmax,maxbo); - d_dln_BOp_piy = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_piy",nmax,maxbo); - d_dln_BOp_piz = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_piz",nmax,maxbo); - - d_dln_BOp_pi2x = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2x",nmax,maxbo); - d_dln_BOp_pi2y = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2y",nmax,maxbo); - d_dln_BOp_pi2z = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2z",nmax,maxbo); -#endif d_C1dbo = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C1dbo",nmax,maxbo); d_C2dbo = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C2dbo",nmax,maxbo); @@ -1638,13 +1549,7 @@ void PairReaxFFKokkos::allocate_array() d_C3dbopi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C3dbopi2",nmax,maxbo); d_C4dbopi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C4dbopi2",nmax,maxbo); -#ifdef OPT_REDUCE_DXDYDZ d_dBOp = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOp",nmax,maxbo); -#else - d_dBOpx = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOpx",nmax,maxbo); - d_dBOpy = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOpy",nmax,maxbo); - d_dBOpz = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOpz",nmax,maxbo); -#endif d_dDeltap_self = typename AT::t_ffloat_2d_dl("reaxff/kk:dDeltap_self",nmax,3); d_Deltap_boc = typename AT::t_ffloat_1d("reaxff/kk:Deltap_boc",nmax); @@ -1668,10 +1573,8 @@ void PairReaxFFKokkos::allocate_array() d_neighid = typename AT::t_tagint_2d("reaxff/kk:neighid",nmax,maxbo); d_numneigh_bonds = typename AT::t_int_1d("reaxff/kk:numneigh_bonds",nmax); -#ifdef OPT_ANGULAR_TORSION // ComputeAngular intermediates d_angular_intermediates = typename AT::t_ffloat_2d("reaxff/kk:angular_intermediates",nmax,4); -#endif } /* ---------------------------------------------------------------------- */ @@ -1693,18 +1596,8 @@ void PairReaxFFKokkos::deallocate_array() d_BO_pi = typename AT::t_ffloat_2d_dl(); d_BO_pi2 = typename AT::t_ffloat_2d_dl(); -#ifdef OPT_REDUCE_DXDYDZ d_dln_BOp_pi = typename AT::t_ffloat_2d_dl(); d_dln_BOp_pi2 = typename AT::t_ffloat_2d_dl(); -#else - d_dln_BOp_pix = typename AT::t_ffloat_2d_dl(); - d_dln_BOp_piy = typename AT::t_ffloat_2d_dl(); - d_dln_BOp_piz = typename AT::t_ffloat_2d_dl(); - - d_dln_BOp_pi2x = typename AT::t_ffloat_2d_dl(); - d_dln_BOp_pi2y = typename AT::t_ffloat_2d_dl(); - d_dln_BOp_pi2z = typename AT::t_ffloat_2d_dl(); -#endif d_C1dbo = typename AT::t_ffloat_2d_dl(); d_C2dbo = typename AT::t_ffloat_2d_dl(); @@ -1720,13 +1613,7 @@ void PairReaxFFKokkos::deallocate_array() d_C3dbopi2 = typename AT::t_ffloat_2d_dl(); d_C4dbopi2 = typename AT::t_ffloat_2d_dl(); -#ifdef OPT_REDUCE_DXDYDZ d_dBOp = typename AT::t_ffloat_2d_dl(); -#else - d_dBOpx = typename AT::t_ffloat_2d_dl(); - d_dBOpy = typename AT::t_ffloat_2d_dl(); - d_dBOpz = typename AT::t_ffloat_2d_dl(); -#endif d_dDeltap_self = typename AT::t_ffloat_2d_dl(); d_Deltap_boc = typename AT::t_ffloat_1d(); @@ -1750,10 +1637,8 @@ void PairReaxFFKokkos::deallocate_array() d_neighid = typename AT::t_tagint_2d(); d_numneigh_bonds = typename AT::t_int_1d(); -#ifdef OPT_ANGULAR_TORSION // ComputeAngular intermediates d_angular_intermediates = typename AT::t_ffloat_2d(); -#endif } /* ---------------------------------------------------------------------- */ @@ -1791,9 +1676,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< const int jnum = d_numneigh[i]; F_FLOAT C12, C34, C56, BO_s, BO_pi, BO_pi2, BO, delij[3], dBOp_i[3]; -#ifndef OPT_REDUCE_DXDYDZ F_FLOAT dln_BOp_pi_i[3], dln_BOp_pi2_i[3]; -#endif F_FLOAT dDeltap_self_i[3] = {0.0,0.0,0.0}; F_FLOAT total_bo_i = 0.0; @@ -1878,13 +1761,11 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< // from BondOrder1 -#ifndef OPT_REDUCE_DXDYDZ d_BO(i,jj_index) = BO; d_BO_s(i,jj_index) = BO_s; d_BO(j,ii_index) = BO; d_BO_s(j,ii_index) = BO_s; -#endif d_BO_pi(j,ii_index) = BO_pi; d_BO_pi2(j,ii_index) = BO_pi2; @@ -1903,7 +1784,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< for (int d = 0; d < 3; d++) dDeltap_self_i[d] += dBOp_i[d]; for (int d = 0; d < 3; d++) a_dDeltap_self(j,d) += -dBOp_i[d]; -#ifdef OPT_REDUCE_DXDYDZ d_dln_BOp_pi(i,jj_index) = -(BO_pi*Cln_BOp_pi); d_dln_BOp_pi(j,ii_index) = -(BO_pi*Cln_BOp_pi); @@ -1912,51 +1792,12 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< d_dBOp(i,jj_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); d_dBOp(j,ii_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); -#else - for (int d = 0; d < 3; d++) dln_BOp_pi_i[d] = -(BO_pi*Cln_BOp_pi)*delij[d]; - for (int d = 0; d < 3; d++) dln_BOp_pi2_i[d] = -(BO_pi2*Cln_BOp_pi2)*delij[d]; - - d_dln_BOp_pix(i,jj_index) = dln_BOp_pi_i[0]; - d_dln_BOp_piy(i,jj_index) = dln_BOp_pi_i[1]; - d_dln_BOp_piz(i,jj_index) = dln_BOp_pi_i[2]; - - d_dln_BOp_pix(j,ii_index) = -dln_BOp_pi_i[0]; - d_dln_BOp_piy(j,ii_index) = -dln_BOp_pi_i[1]; - d_dln_BOp_piz(j,ii_index) = -dln_BOp_pi_i[2]; - - d_dln_BOp_pi2x(i,jj_index) = dln_BOp_pi2_i[0]; - d_dln_BOp_pi2y(i,jj_index) = dln_BOp_pi2_i[1]; - d_dln_BOp_pi2z(i,jj_index) = dln_BOp_pi2_i[2]; - - d_dln_BOp_pi2x(j,ii_index) = -dln_BOp_pi2_i[0]; - d_dln_BOp_pi2y(j,ii_index) = -dln_BOp_pi2_i[1]; - d_dln_BOp_pi2z(j,ii_index) = -dln_BOp_pi2_i[2]; - - d_dBOpx(i,jj_index) = dBOp_i[0]; - d_dBOpy(i,jj_index) = dBOp_i[1]; - d_dBOpz(i,jj_index) = dBOp_i[2]; - - d_dBOpx(j,ii_index) = -dBOp_i[0]; - d_dBOpy(j,ii_index) = -dBOp_i[1]; - d_dBOpz(j,ii_index) = -dBOp_i[2]; -#endif - -#ifdef OPT_REDUCE_DXDYDZ d_BO(i,jj_index) = BO - bo_cut; d_BO(j,ii_index) = BO - bo_cut; d_BO_s(i,jj_index) = BO_s - bo_cut; d_BO_s(j,ii_index) = BO_s - bo_cut; total_bo_i += (BO - bo_cut); a_total_bo[j] += (BO - bo_cut); -#else - - d_BO(i,jj_index) -= bo_cut; - d_BO(j,ii_index) -= bo_cut; - d_BO_s(i,jj_index) -= bo_cut; - d_BO_s(j,ii_index) -= bo_cut; - total_bo_i += d_BO(i,jj_index); - a_total_bo[j] += d_BO(j,ii_index); -#endif } } } @@ -2227,9 +2068,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i const int itype = type(i); F_FLOAT C12, C34, C56, BO_s, BO_pi, BO_pi2, BO, delij[3], dBOp_i[3]; -#ifndef OPT_REDUCE_DXDYDZ F_FLOAT dln_BOp_pi_i[3], dln_BOp_pi2_i[3]; -#endif F_FLOAT dDeltap_self_i[3] = {0.0,0.0,0.0}; F_FLOAT total_bo_i = 0.0; @@ -2260,10 +2099,8 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i // from BondOrder1 -#ifndef OPT_REDUCE_DXDYDZ d_BO(i,j_index) = BO; d_BO_s(i,j_index) = BO_s; -#endif d_BO_pi(i,j_index) = BO_pi; d_BO_pi2(i,j_index) = BO_pi2; @@ -2277,40 +2114,14 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i for (int d = 0; d < 3; d++) dBOp_i[d] = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2)*delij[d]; for (int d = 0; d < 3; d++) dDeltap_self_i[d] += dBOp_i[d]; -#ifdef OPT_REDUCE_DXDYDZ d_dln_BOp_pi(i,j_index) = -(BO_pi*Cln_BOp_pi); d_dln_BOp_pi2(i,j_index) = -(BO_pi2*Cln_BOp_pi2); d_dBOp(i,j_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); -#else - - for (int d = 0; d < 3; d++) dln_BOp_pi_i[d] = -(BO_pi*Cln_BOp_pi)*delij[d]; - for (int d = 0; d < 3; d++) dln_BOp_pi2_i[d] = -(BO_pi2*Cln_BOp_pi2)*delij[d]; - - d_dln_BOp_pix(i,j_index) = dln_BOp_pi_i[0]; - d_dln_BOp_piy(i,j_index) = dln_BOp_pi_i[1]; - d_dln_BOp_piz(i,j_index) = dln_BOp_pi_i[2]; - - d_dln_BOp_pi2x(i,j_index) = dln_BOp_pi2_i[0]; - d_dln_BOp_pi2y(i,j_index) = dln_BOp_pi2_i[1]; - d_dln_BOp_pi2z(i,j_index) = dln_BOp_pi2_i[2]; - - d_dBOpx(i,j_index) = dBOp_i[0]; - d_dBOpy(i,j_index) = dBOp_i[1]; - d_dBOpz(i,j_index) = dBOp_i[2]; - -#endif - -#ifdef OPT_REDUCE_DXDYDZ d_BO(i,j_index) = BO - bo_cut; d_BO_s(i,j_index) = BO_s - bo_cut; total_bo_i += (BO - bo_cut); -#else - d_BO(i,j_index) -= bo_cut; - d_BO_s(i,j_index) -= bo_cut; - total_bo_i += d_BO(i,j_index); -#endif } for (int d = 0; d < 3; d++) @@ -2718,78 +2529,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeMulti2 -template -KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(TagPairReaxCountAngular, const int &ii) const { - - // in reaxff_torsion_angles: j = i, k = j, i = k; - - const int i = d_ilist[ii]; - const int itype = type(i); - - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; - - if (POPULATE) { - // Computes and stores SBO2, CSBO2, dSBO1, dSBO2 - compute_angular_sbo(i, itype, j_start, j_end); - } - - // Angular - - // Count buffer size for `i` - int location_angular = 0; // dummy declaration - int count_angular = preprocess_angular(i, itype, j_start, j_end, location_angular); - location_angular = Kokkos::atomic_fetch_add(&d_count_angular_torsion(0), count_angular); - - if (POPULATE) { - // Fill buffer for `i` - preprocess_angular(i, itype, j_start, j_end, location_angular); - } - -} - -/* ---------------------------------------------------------------------- */ - -template -template -KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(TagPairReaxCountTorsion, const int &ii) const { - - // in reaxff_torsion_angles: j = i, k = j, i = k; - - const int i = d_ilist[ii]; - const int itype = type(i); - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; - - const tagint itag = tag(i); - const X_FLOAT xtmp = x(i,0); - const X_FLOAT ytmp = x(i,1); - const X_FLOAT ztmp = x(i,2); - - // Count buffer size for `i` - int location_torsion = 0; // dummy declaration - int count_torsion = preprocess_torsion(i, itype, itag, xtmp, ytmp, ztmp, j_start, j_end, location_torsion); - location_torsion = Kokkos::atomic_fetch_add(&d_count_angular_torsion(1), count_torsion); - - if (POPULATE) { - // Fill buffer for `i` - preprocess_torsion(i, itype, itag, xtmp, ytmp, ztmp, j_start, j_end, location_torsion); - } - -} - -#else - - /* ---------------------------------------------------------------------- */ template @@ -2839,8 +2578,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxCountAngularTorsion @@ -3664,839 +3401,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsionPreproces } -#else - -/* ---------------------------------------------------------------------- */ - -template -template -KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(TagPairReaxComputeAngular, const int &ii, EV_FLOAT_REAX& ev) const { - - const auto v_f = ScatterViewHelper,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); - const auto a_f = v_f.template access>(); - Kokkos::View::value> > a_Cdbo = d_Cdbo; - - const auto v_CdDelta = ScatterViewHelper,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); - const auto a_CdDelta = v_CdDelta.template access>(); - - const int i = d_ilist[ii]; - const int itype = type(i); - const X_FLOAT xtmp = x(i,0); - const X_FLOAT ytmp = x(i,1); - const X_FLOAT ztmp = x(i,2); - - F_FLOAT temp, temp_bo_jt, pBOjt7; - F_FLOAT p_val1, p_val2, p_val3, p_val4, p_val5; - F_FLOAT p_val6, p_val7, p_val8, p_val9, p_val10; - F_FLOAT p_pen1, p_pen2, p_pen3, p_pen4; - F_FLOAT p_coa1, p_coa2, p_coa3, p_coa4; - F_FLOAT trm8, expval6, expval7, expval2theta, expval12theta, exp3ij, exp3jk; - F_FLOAT exp_pen2ij, exp_pen2jk, exp_pen3, exp_pen4, trm_pen34, exp_coa2; - F_FLOAT dSBO1, dSBO2, SBO, SBO2, CSBO2, SBOp, prod_SBO, vlpadj; - F_FLOAT CEval1, CEval2, CEval3, CEval4, CEval5, CEval6, CEval7, CEval8; - F_FLOAT CEpen1, CEpen2, CEpen3; - F_FLOAT e_ang, e_coa, e_pen; - F_FLOAT CEcoa1, CEcoa2, CEcoa3, CEcoa4, CEcoa5; - F_FLOAT Cf7ij, Cf7jk, Cf8j, Cf9j; - F_FLOAT f7_ij, f7_jk, f8_Dj, f9_Dj; - F_FLOAT Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; - F_FLOAT BOA_ij, BOA_ik, rij, bo_ij, bo_ik; - F_FLOAT dcos_theta_di[3], dcos_theta_dj[3], dcos_theta_dk[3]; - F_FLOAT eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; - F_FLOAT delij[3], delik[3], delji[3], delki[3]; - - p_val6 = gp[14]; - p_val8 = gp[33]; - p_val9 = gp[16]; - p_val10 = gp[17]; - - p_pen2 = gp[19]; - p_pen3 = gp[20]; - p_pen4 = gp[21]; - - p_coa2 = gp[2]; - p_coa3 = gp[38]; - p_coa4 = gp[30]; - - p_val3 = paramssing(itype).p_val3; - p_val5 = paramssing(itype).p_val5; - - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; - - const F_FLOAT Delta_val = d_total_bo[i] - paramssing(itype).valency_val; - - SBOp = 0.0, prod_SBO = 1.0; - - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; - j &= NEIGHMASK; - const int j_index = jj - j_start; - bo_ij = d_BO(i,j_index); - - SBOp += (d_BO_pi(i,j_index) + d_BO_pi2(i,j_index)); - temp = SQR(bo_ij); - temp *= temp; - temp *= temp; - prod_SBO *= exp(-temp); - } - - const F_FLOAT Delta_e = d_total_bo[i] - paramssing(itype).valency_e; - const F_FLOAT vlpex = Delta_e - 2.0 * (int)(Delta_e/2.0); - const F_FLOAT explp1 = exp(-gp[15] * SQR(2.0 + vlpex)); - const F_FLOAT nlp = explp1 - (int)(Delta_e / 2.0); - if (vlpex >= 0.0) { - vlpadj = 0.0; - dSBO2 = prod_SBO - 1.0; - } else { - vlpadj = nlp; - dSBO2 = (prod_SBO - 1.0) * (1.0 - p_val8 * d_dDelta_lp[i]); - } - - SBO = SBOp + (1.0 - prod_SBO) * (-d_Delta_boc[i] - p_val8 * vlpadj); - dSBO1 = -8.0 * prod_SBO * (d_Delta_boc[i] + p_val8 * vlpadj); - - if (SBO <= 0.0) { - SBO2 = 0.0; - CSBO2 = 0.0; - } else if (SBO > 0.0 && SBO <= 1.0) { - CSBO2 = pow(SBO, p_val9 - 1.0); - SBO2 = CSBO2*SBO; - CSBO2 = p_val9 * CSBO2; - } else if (SBO > 1.0 && SBO < 2.0) { - CSBO2 = pow(2.0 - SBO, p_val9 - 1.0); - SBO2 = 2.0 - CSBO2*(2.0 - SBO); - CSBO2 = p_val9 * CSBO2; - } else { - SBO2 = 2.0; - CSBO2 = 0.0; - } - expval6 = exp(p_val6 * d_Delta_boc[i]); - - F_FLOAT CdDelta_i = 0.0; - F_FLOAT fitmp[3],fjtmp[3]; - for (int j = 0; j < 3; j++) fitmp[j] = 0.0; - - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; - j &= NEIGHMASK; - const int j_index = jj - j_start; - delij[0] = x(j,0) - xtmp; - delij[1] = x(j,1) - ytmp; - delij[2] = x(j,2) - ztmp; - const F_FLOAT rsqij = delij[0]*delij[0] + delij[1]*delij[1] + delij[2]*delij[2]; - rij = sqrt(rsqij); - bo_ij = d_BO(i,j_index); - const int i_index = maxbo+j_index; - - BOA_ij = bo_ij - thb_cut; - if (BOA_ij <= 0.0) continue; - if (i >= nlocal && j >= nlocal) continue; - - const int jtype = type(j); - - F_FLOAT CdDelta_j = 0.0; - for (int k = 0; k < 3; k++) fjtmp[k] = 0.0; - - for (int kk = jj+1; kk < j_end; kk++) { - //for (int kk = j_start; kk < j_end; kk++) { - int k = d_bo_list[kk]; - k &= NEIGHMASK; - if (k == j) continue; - - const int k_index = kk - j_start; - delik[0] = x(k,0) - xtmp; - delik[1] = x(k,1) - ytmp; - delik[2] = x(k,2) - ztmp; - const F_FLOAT rsqik = delik[0]*delik[0] + delik[1]*delik[1] + delik[2]*delik[2]; - const F_FLOAT rik = sqrt(rsqik); - bo_ik = d_BO(i,k_index); - BOA_ik = bo_ik - thb_cut; - - if (BOA_ik <= 0.0 || bo_ij <= thb_cut || bo_ik <= thb_cut || bo_ij * bo_ik <= thb_cutsq) continue; - - const int ktype = type(k); - - // theta and derivatives - - cos_theta = (delij[0]*delik[0]+delij[1]*delik[1]+delij[2]*delik[2])/(rij*rik); - if (cos_theta > 1.0) cos_theta = 1.0; - if (cos_theta < -1.0) cos_theta = -1.0; - theta = acos(cos_theta); - - const F_FLOAT inv_dists = 1.0 / (rij * rik); - const F_FLOAT Cdot_inv3 = cos_theta * inv_dists * inv_dists; - - for (int t = 0; t < 3; t++) { - dcos_theta_di[t] = -(delik[t] + delij[t]) * inv_dists + Cdot_inv3 * (rsqik * delij[t] + rsqij * delik[t]); - dcos_theta_dj[t] = delik[t] * inv_dists - Cdot_inv3 * rsqik * delij[t]; - dcos_theta_dk[t] = delij[t] * inv_dists - Cdot_inv3 * rsqij * delik[t]; - } - - sin_theta = sin(theta); - if (sin_theta < 1.0e-5) sin_theta = 1.0e-5; - p_val1 = paramsthbp(jtype,itype,ktype).p_val1; - - if (fabs(p_val1) <= 0.001) continue; - - // ANGLE ENERGY - - p_val1 = paramsthbp(jtype,itype,ktype).p_val1; - p_val2 = paramsthbp(jtype,itype,ktype).p_val2; - p_val4 = paramsthbp(jtype,itype,ktype).p_val4; - p_val7 = paramsthbp(jtype,itype,ktype).p_val7; - theta_00 = paramsthbp(jtype,itype,ktype).theta_00; - - F_FLOAT tmp_var; - tmp_var = pow(BOA_ij, p_val4 - 1.0); - exp3ij = exp(-p_val3 * tmp_var * BOA_ij); - f7_ij = 1.0 - exp3ij; - Cf7ij = p_val3 * p_val4 * tmp_var * exp3ij; - - tmp_var = pow(BOA_ik, p_val4 - 1.0); - exp3jk = exp(-p_val3 * tmp_var * BOA_ik); - f7_jk = 1.0 - exp3jk; - Cf7jk = p_val3 * p_val4 * tmp_var * exp3jk; - expval7 = exp(-p_val7 * d_Delta_boc[i]); - trm8 = 1.0 + expval6 + expval7; - f8_Dj = p_val5 - ((p_val5 - 1.0) * (2.0 + expval6) / trm8); - Cf8j = ((1.0 - p_val5) / (trm8*trm8)) * - (p_val6 * expval6 * trm8 - (2.0 + expval6) * (p_val6*expval6 - p_val7*expval7)); - theta_0 = 180.0 - theta_00 * (1.0 - exp(-p_val10 * (2.0 - SBO2))); - theta_0 = theta_0*constPI/180.0; - - expval2theta = exp(-p_val2 * (theta_0-theta)*(theta_0-theta)); - if (p_val1 >= 0) - expval12theta = p_val1 * (1.0 - expval2theta); - else // To avoid linear Me-H-Me angles (6/6/06) - expval12theta = p_val1 * -expval2theta; - - CEval1 = Cf7ij * f7_jk * f8_Dj * expval12theta; - CEval2 = Cf7jk * f7_ij * f8_Dj * expval12theta; - CEval3 = Cf8j * f7_ij * f7_jk * expval12theta; - CEval4 = -2.0 * p_val1 * p_val2 * f7_ij * f7_jk * f8_Dj * expval2theta * (theta_0 - theta); - Ctheta_0 = p_val10 * theta_00*constPI/180.0 * exp(-p_val10 * (2.0 - SBO2)); - CEval5 = -CEval4 * Ctheta_0 * CSBO2; - CEval6 = CEval5 * dSBO1; - CEval7 = CEval5 * dSBO2; - CEval8 = -CEval4 / sin_theta; - - e_ang = f7_ij * f7_jk * f8_Dj * expval12theta; - if (EVFLAG && eflag_global) ev.ereax[3] += e_ang; - - // Penalty energy - - p_pen1 = paramsthbp(jtype,itype,ktype).p_pen1; - - exp_pen2ij = exp(-p_pen2 * (BOA_ij - 2.0)*(BOA_ij - 2.0)); - exp_pen2jk = exp(-p_pen2 * (BOA_ik - 2.0)*(BOA_ik - 2.0)); - exp_pen3 = exp(-p_pen3 * d_Delta[i]); - exp_pen4 = exp(p_pen4 * d_Delta[i]); - trm_pen34 = 1.0 + exp_pen3 + exp_pen4; - f9_Dj = (2.0 + exp_pen3) / trm_pen34; - Cf9j = (-p_pen3 * exp_pen3 * trm_pen34 - (2.0 + exp_pen3) * - (-p_pen3 * exp_pen3 + p_pen4 * exp_pen4))/(trm_pen34*trm_pen34); - - e_pen = p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; - if (EVFLAG && eflag_global) ev.ereax[4] += e_pen; - - CEpen1 = e_pen * Cf9j / f9_Dj; - temp = -2.0 * p_pen2 * e_pen; - CEpen2 = temp * (BOA_ij - 2.0); - CEpen3 = temp * (BOA_ik - 2.0); - - // ConjAngle energy - - p_coa1 = paramsthbp(jtype,itype,ktype).p_coa1; - exp_coa2 = exp(p_coa2 * Delta_val); - e_coa = p_coa1 / (1. + exp_coa2) * - exp(-p_coa3 * SQR(d_total_bo[j]-BOA_ij)) * - exp(-p_coa3 * SQR(d_total_bo[k]-BOA_ik)) * - exp(-p_coa4 * SQR(BOA_ij - 1.5)) * - exp(-p_coa4 * SQR(BOA_ik - 1.5)); - - CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; - CEcoa2 = -2 * p_coa4 * (BOA_ik - 1.5) * e_coa; - CEcoa3 = -p_coa2 * exp_coa2 * e_coa / (1 + exp_coa2); - CEcoa4 = -2 * p_coa3 * (d_total_bo[j]-BOA_ij) * e_coa; - CEcoa5 = -2 * p_coa3 * (d_total_bo[k]-BOA_ik) * e_coa; - - if (EVFLAG && eflag_global) ev.ereax[5] += e_coa; - - // Forces - - a_Cdbo(i,j_index) += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); - a_Cdbo(j,i_index) += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); - a_Cdbo(i,k_index) += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); - a_Cdbo(k,i_index) += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); - - CdDelta_i += ((CEval3 + CEval7) + CEpen1 + CEcoa3); - CdDelta_j += CEcoa4; - a_CdDelta[k] += CEcoa5; - - for (int ll = j_start; ll < j_end; ll++) { - int l = d_bo_list[ll]; - l &= NEIGHMASK; - const int l_index = ll - j_start; - - temp_bo_jt = d_BO(i,l_index); - temp = temp_bo_jt * temp_bo_jt * temp_bo_jt; - pBOjt7 = temp * temp * temp_bo_jt; - - a_Cdbo(i,l_index) += (CEval6 * pBOjt7); - d_Cdbopi(i,l_index) += CEval5; - d_Cdbopi2(i,l_index) += CEval5; - } - - for (int d = 0; d < 3; d++) fi_tmp[d] = CEval8 * dcos_theta_di[d]; - for (int d = 0; d < 3; d++) fj_tmp[d] = CEval8 * dcos_theta_dj[d]; - for (int d = 0; d < 3; d++) fk_tmp[d] = CEval8 * dcos_theta_dk[d]; - for (int d = 0; d < 3; d++) fitmp[d] -= fi_tmp[d]; - for (int d = 0; d < 3; d++) fjtmp[d] -= fj_tmp[d]; - for (int d = 0; d < 3; d++) a_f(k,d) -= fk_tmp[d]; - - // energy/virial tally - if (EVFLAG) { - eng_tmp = e_ang + e_pen + e_coa; - //if (eflag_atom) this->template ev_tally(ev,i,j,eng_tmp,0.0,0.0,0.0,0.0); - for (int d = 0; d < 3; d++) delki[d] = -1.0 * delik[d]; - for (int d = 0; d < 3; d++) delji[d] = -1.0 * delij[d]; - if (eflag_atom) this->template e_tally(ev,i,j,eng_tmp); - if (vflag_either) this->template v_tally3(ev,i,j,k,fj_tmp,fk_tmp,delji,delki); - } - - } - a_CdDelta[j] += CdDelta_j; - for (int d = 0; d < 3; d++) a_f(j,d) += fjtmp[d]; - } - a_CdDelta[i] += CdDelta_i; - for (int d = 0; d < 3; d++) a_f(i,d) += fitmp[d]; -} - -template -template -KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(TagPairReaxComputeAngular, const int &ii) const { - EV_FLOAT_REAX ev; - this->template operator()(TagPairReaxComputeAngular(), ii, ev); -} - -/* ---------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsionPreview, const int &ii) const { - - F_FLOAT bo_ij, bo_ik; - int counter = 0; - - const int i = d_ilist[ii]; - const int itype = type(i); - const tagint itag = tag(i); - const X_FLOAT xtmp = x(i,0); - const X_FLOAT ytmp = x(i,1); - const X_FLOAT ztmp = x(i,2); - - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; - - int jj_min = j_end+1; - int jj_max = j_start-1; - int kk_min = j_end+1; - int kk_max = j_start-1; - - for (int jj = j_start; jj < j_end; jj++) { - - // j_counter1++; - - int j = d_bo_list[jj]; - j &= NEIGHMASK; - const tagint jtag = tag(j); - const int j_index = jj - j_start; - - // skip half of the interactions - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; - } else { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp && x(j,1) < ytmp) continue; - if (x(j,2) == ztmp && x(j,1) == ytmp && x(j,0) < xtmp) continue; - } - - bo_ij = d_BO(i,j_index); - if (bo_ij < thb_cut) continue; - - const int l_start = d_bo_first[j]; - const int l_end = l_start + d_bo_num[j]; - - for (int kk = j_start; kk < j_end; kk++) { - int k = d_bo_list[kk]; - k &= NEIGHMASK; - if (k == j) continue; - const int k_index = kk - j_start; - bo_ik = d_BO(i,k_index); - if (bo_ik < thb_cut) continue; - - counter++; - jj_min = jj < jj_min ? jj : jj_min; - jj_max = jj >= jj_max ? (jj+1) : jj_max; - kk_min = kk < kk_min ? kk : kk_min; - kk_max = kk >= kk_max ? (kk+1) : kk_max; - } - - } - counters[ii] = counter; - if (counter > 0) { - counters_jj_min[ii] = jj_min; - counters_jj_max[ii] = jj_max; - counters_kk_min[ii] = kk_min; - counters_kk_max[ii] = kk_max; - } -} - -/* ---------------------------------------------------------------------- */ - -template -template -KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsion, const int &iii, EV_FLOAT_REAX& ev) const { - - constexpr int blocksize = PairReaxFFKokkos::compute_torsion_blocksize; - - const int ii = counters[iii]; - - const auto v_f = ScatterViewHelper,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); - const auto a_f = v_f.template access>(); - - const auto v_CdDelta = ScatterViewHelper,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); - const auto a_CdDelta = v_CdDelta.template access>(); - Kokkos::View::value>> a_Cdbo = d_Cdbo; - //auto a_Cdbo = dup_Cdbo.template access>(); - - // in reaxff_torsion_angles: j = i, k = j, i = k; - - F_FLOAT Delta_i, Delta_j, bo_ij, bo_ik, bo_jl, BOA_ij, BOA_ik, BOA_jl; - F_FLOAT p_tor1, p_cot1, V1, V2, V3; - F_FLOAT exp_tor2_ij, exp_tor2_ik, exp_tor2_jl, exp_tor1, exp_tor3_DiDj, exp_tor4_DiDj, exp_tor34_inv; - F_FLOAT exp_cot2_ij, exp_cot2_ik, exp_cot2_jl, fn10, f11_DiDj, dfn11, fn12; - F_FLOAT theta_ijk, theta_jil, sin_ijk, sin_jil, cos_ijk, cos_jil, tan_ijk_i, tan_jil_i; - F_FLOAT cos_omega, cos2omega, cos3omega; - F_FLOAT CV, cmn, CEtors1, CEtors2, CEtors3, CEtors4; - F_FLOAT CEtors5, CEtors6, CEtors7, CEtors8, CEtors9; - F_FLOAT Cconj, CEconj1, CEconj2, CEconj3, CEconj4, CEconj5, CEconj6; - F_FLOAT e_tor, e_con, eng_tmp; - - F_FLOAT delij[3], delik[3], deljl[3], dellk[3], delil[3], delkl[3]; - F_FLOAT fi_tmp[3], fj_tmp[3], fk_tmp[3], fl_tmp[3]; - F_FLOAT dcos_omega_di[3], dcos_omega_dj[3], dcos_omega_dk[3], dcos_omega_dl[3]; - F_FLOAT dcos_ijk_di[3], dcos_ijk_dj[3], dcos_ijk_dk[3], dcos_jil_di[3], dcos_jil_dj[3], dcos_jil_dk[3]; - - F_FLOAT p_tor2 = gp[23]; - F_FLOAT p_tor3 = gp[24]; - F_FLOAT p_tor4 = gp[25]; - F_FLOAT p_cot2 = gp[27]; - - const int i = d_ilist[ii]; - const int jj_start = counters_jj_min[ii]; - const int jj_stop = counters_jj_max[ii]; - const int kk_start = counters_kk_min[ii]; - const int kk_stop = counters_kk_max[ii]; - - const int itype = type(i); - const tagint itag = tag(i); - const X_FLOAT xtmp = x(i,0); - const X_FLOAT ytmp = x(i,1); - const X_FLOAT ztmp = x(i,2); - Delta_i = d_Delta_boc[i]; - - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; - - F_FLOAT fitmp[3], fjtmp[3], fktmp[3]; - for(int j = 0; j < 3; j++) fitmp[j] = 0.0; - F_FLOAT CdDelta_i = 0.0; - - int nnz_jj; - blocking_t selected_jj[blocksize]; - int jj_current = jj_start; - - while (jj_current < jj_stop) { - - nnz_jj=0; - while (nnz_jj < blocksize) { - int jj = jj_current; - int j = d_bo_list[jj]; - j &= NEIGHMASK; - const tagint jtag = tag(j); - const int j_index = jj - j_start; - bool continue_flag = false; - - // skip half of the interactions - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue_flag = true; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue_flag = true; - } else { - if (x(j,2) < ztmp) continue_flag = true; - else if (x(j,2) == ztmp && x(j,1) < ytmp) continue_flag = true; - else if (x(j,2) == ztmp && x(j,1) == ytmp && x(j,0) < xtmp) continue_flag = true; - } - - bo_ij = d_BO(i,j_index); - if (bo_ij < thb_cut) continue_flag = true; - - if (!continue_flag) { - selected_jj[nnz_jj] = jj_current-jj_start; - nnz_jj++; - } - jj_current++; - if (jj_current == jj_stop) break; - } - - for (int jj_inner = 0; jj_inner < nnz_jj; jj_inner++) { - const int jj = jj_start + selected_jj[jj_inner]; - int j = d_bo_list[jj]; - j &= NEIGHMASK; - const tagint jtag = tag(j); - const int jtype = type(j); - const int j_index = jj - j_start; - bo_ij = d_BO(i,j_index); - - - delij[0] = x(j,0) - xtmp; - delij[1] = x(j,1) - ytmp; - delij[2] = x(j,2) - ztmp; - const F_FLOAT rsqij = delij[0]*delij[0] + delij[1]*delij[1] + delij[2]*delij[2]; - const F_FLOAT rij = sqrt(rsqij); - - BOA_ij = bo_ij - thb_cut; - Delta_j = d_Delta_boc[j]; - exp_tor2_ij = exp(-p_tor2 * BOA_ij); - exp_cot2_ij = exp(-p_cot2 * SQR(BOA_ij - 1.5)); - exp_tor3_DiDj = exp(-p_tor3 * (Delta_i + Delta_j)); - exp_tor4_DiDj = exp(p_tor4 * (Delta_i + Delta_j)); - exp_tor34_inv = 1.0 / (1.0 + exp_tor3_DiDj + exp_tor4_DiDj); - f11_DiDj = (2.0 + exp_tor3_DiDj) * exp_tor34_inv; - - const int l_start = d_bo_first[j]; - const int l_end = l_start + d_bo_num[j]; - - for(int k = 0; k < 3; k++) fjtmp[k] = 0.0; - F_FLOAT CdDelta_j = 0.0; - - int nnz_kk; - int selected_kk[blocksize]; - int kk_current = kk_start; - - while (kk_current < kk_stop) { - nnz_kk=0; - while (nnz_kk < blocksize) { - int kk = kk_current; - int k = d_bo_list[kk]; - k &= NEIGHMASK; - bool continue_flag = false; - - if (k == j) - continue_flag = true; - else{ - const int k_index = kk - j_start; - bo_ik = d_BO(i,k_index); - if (bo_ik < thb_cut) continue_flag = true; - } - - if (!continue_flag) { - selected_kk[nnz_kk] = kk_current-kk_start; - nnz_kk++; - } - kk_current++; - if (kk_current == kk_stop) break; - } - - for (int kk_inner = 0; kk_inner < nnz_kk; kk_inner++) { - const int kk = kk_start + selected_kk[kk_inner]; - int k = d_bo_list[kk]; - k &= NEIGHMASK; - const int ktype = type(k); - const int k_index = kk - j_start; - bo_ik = d_BO(i,k_index); - - BOA_ik = bo_ik - thb_cut; - for (int d = 0; d < 3; d ++) delik[d] = x(k,d) - x(i,d); - const F_FLOAT rsqik = delik[0]*delik[0] + delik[1]*delik[1] + delik[2]*delik[2]; - const F_FLOAT rik = sqrt(rsqik); - - cos_ijk = (delij[0]*delik[0]+delij[1]*delik[1]+delij[2]*delik[2])/(rij*rik); - if (cos_ijk > 1.0) cos_ijk = 1.0; - else if (cos_ijk < -1.0) cos_ijk = -1.0; - theta_ijk = acos(cos_ijk); - - // dcos_ijk - const F_FLOAT inv_dists = 1.0 / (rij * rik); - const F_FLOAT cos_ijk_tmp = cos_ijk *inv_dists * inv_dists; - - for(int d = 0; d < 3; d++) { - dcos_ijk_di[d] = -(delik[d] + delij[d]) * inv_dists + cos_ijk_tmp * (rsqik * delij[d] + rsqij * delik[d]); - dcos_ijk_dj[d] = delik[d] * inv_dists - cos_ijk_tmp * rsqik * delij[d]; - dcos_ijk_dk[d] = delij[d] * inv_dists - cos_ijk_tmp * rsqij * delik[d]; - } - - sin_ijk = sin(theta_ijk); - if (sin_ijk >= 0 && sin_ijk <= 1e-10) - tan_ijk_i = cos_ijk / 1e-10; - else if (sin_ijk <= 0 && sin_ijk >= -1e-10) - tan_ijk_i = -cos_ijk / 1e-10; - else tan_ijk_i = cos_ijk / sin_ijk; - - exp_tor2_ik = exp(-p_tor2 * BOA_ik); - exp_cot2_ik = exp(-p_cot2 * SQR(BOA_ik -1.5)); - - for(int l = 0; l < 3; l++) fktmp[l] = 0.0; - - for (int ll = l_start; ll < l_end; ll++) { - int l = d_bo_list[ll]; - l &= NEIGHMASK; - if (l == i) continue; - const int ltype = type(l); - const int l_index = ll - l_start; - - bo_jl = d_BO(j,l_index); - if (l == k || bo_jl < thb_cut || bo_ij*bo_ik*bo_jl < thb_cut) continue; - - for (int d = 0; d < 3; d ++) deljl[d] = x(l,d) - x(j,d); - const F_FLOAT rsqjl = deljl[0]*deljl[0] + deljl[1]*deljl[1] + deljl[2]*deljl[2]; - const F_FLOAT rjl = sqrt(rsqjl); - BOA_jl = bo_jl - thb_cut; - - cos_jil = -(delij[0]*deljl[0]+delij[1]*deljl[1]+delij[2]*deljl[2])/(rij*rjl); - if (cos_jil > 1.0) cos_jil = 1.0; - else if (cos_jil < -1.0) cos_jil = -1.0; - theta_jil = acos(cos_jil); - - // dcos_jil - const F_FLOAT inv_distjl = 1.0 / (rij * rjl); - const F_FLOAT cos_jil_tmp = cos_jil / ((rij*rjl)*(rij*rjl)); - - for(int d = 0; d < 3; d++) { - dcos_jil_di[d] = deljl[d] * inv_distjl - cos_jil_tmp * rsqjl * -delij[d]; - dcos_jil_dj[d] = (-deljl[d] + delij[d]) * inv_distjl - cos_jil_tmp * (rsqjl * delij[d] + rsqij * -deljl[d]); - dcos_jil_dk[d] = -delij[d] * inv_distjl - cos_jil_tmp * rsqij * deljl[d]; - } - - sin_jil = sin(theta_jil); - if (sin_jil >= 0 && sin_jil <= 1e-10) - tan_jil_i = cos_jil / 1e-10; - else if (sin_jil <= 0 && sin_jil >= -1e-10) - tan_jil_i = -cos_jil / 1e-10; - else tan_jil_i = cos_jil / sin_jil; - - for (int d = 0; d < 3; d ++) dellk[d] = x(k,d) - x(l,d); - const F_FLOAT rsqlk = dellk[0]*dellk[0] + dellk[1]*dellk[1] + dellk[2]*dellk[2]; - const F_FLOAT rlk = sqrt(rsqlk); - - F_FLOAT unnorm_cos_omega, unnorm_sin_omega, omega; - F_FLOAT htra, htrb, htrc, hthd, hthe, hnra, hnrc, hnhd, hnhe; - F_FLOAT arg, poem, tel; - F_FLOAT cross_ij_jl[3]; - - // omega - - F_FLOAT dot_ij_jk = -(delij[0]*delik[0]+delij[1]*delik[1]+delij[2]*delik[2]); - F_FLOAT dot_ij_lj = delij[0]*deljl[0]+delij[1]*deljl[1]+delij[2]*deljl[2]; - F_FLOAT dot_ik_jl = delik[0]*deljl[0]+delik[1]*deljl[1]+delik[2]*deljl[2]; - unnorm_cos_omega = dot_ij_jk * dot_ij_lj + rsqij * dot_ik_jl; - - cross_ij_jl[0] = delij[1]*deljl[2] - delij[2]*deljl[1]; - cross_ij_jl[1] = delij[2]*deljl[0] - delij[0]*deljl[2]; - cross_ij_jl[2] = delij[0]*deljl[1] - delij[1]*deljl[0]; - - unnorm_sin_omega = -rij*(delik[0]*cross_ij_jl[0]+delik[1]*cross_ij_jl[1]+delik[2]*cross_ij_jl[2]); - omega = atan2(unnorm_sin_omega, unnorm_cos_omega); - - htra = rik + cos_ijk * (rjl * cos_jil - rij); - htrb = rij - rik * cos_ijk - rjl * cos_jil; - htrc = rjl + cos_jil * (rik * cos_ijk - rij); - hthd = rik * sin_ijk * (rij - rjl * cos_jil); - hthe = rjl * sin_jil * (rij - rik * cos_ijk); - hnra = rjl * sin_ijk * sin_jil; - hnrc = rik * sin_ijk * sin_jil; - hnhd = rik * rjl * cos_ijk * sin_jil; - hnhe = rik * rjl * sin_ijk * cos_jil; - - poem = 2.0 * rik * rjl * sin_ijk * sin_jil; - if (poem < 1e-20) poem = 1e-20; - - tel = SQR(rik) + SQR(rij) + SQR(rjl) - SQR(rlk) - - 2.0 * (rik * rij * cos_ijk - rik * rjl * cos_ijk * cos_jil + rij * rjl * cos_jil); - - arg = tel / poem; - if (arg > 1.0) arg = 1.0; - else if (arg < -1.0) arg = -1.0; - - F_FLOAT sin_ijk_rnd = sin_ijk; - F_FLOAT sin_jil_rnd = sin_jil; - - if (sin_ijk >= 0 && sin_ijk <= 1e-10) sin_ijk_rnd = 1e-10; - else if (sin_ijk <= 0 && sin_ijk >= -1e-10) sin_ijk_rnd = -1e-10; - if (sin_jil >= 0 && sin_jil <= 1e-10) sin_jil_rnd = 1e-10; - else if (sin_jil <= 0 && sin_jil >= -1e-10) sin_jil_rnd = -1e-10; - - // dcos_omega_di - for (int d = 0; d < 3; d++) dcos_omega_dk[d] = ((htra-arg*hnra)/rik) * delik[d] - dellk[d]; - for (int d = 0; d < 3; d++) dcos_omega_dk[d] += (hthd-arg*hnhd)/sin_ijk_rnd * -dcos_ijk_dk[d]; - for (int d = 0; d < 3; d++) dcos_omega_dk[d] *= 2.0/poem; - - // dcos_omega_dj - for (int d = 0; d < 3; d++) dcos_omega_di[d] = -((htra-arg*hnra)/rik) * delik[d] - htrb/rij * delij[d]; - for (int d = 0; d < 3; d++) dcos_omega_di[d] += -(hthd-arg*hnhd)/sin_ijk_rnd * dcos_ijk_di[d]; - for (int d = 0; d < 3; d++) dcos_omega_di[d] += -(hthe-arg*hnhe)/sin_jil_rnd * dcos_jil_di[d]; - for (int d = 0; d < 3; d++) dcos_omega_di[d] *= 2.0/poem; - - // dcos_omega_dk - for (int d = 0; d < 3; d++) dcos_omega_dj[d] = -((htrc-arg*hnrc)/rjl) * deljl[d] + htrb/rij * delij[d]; - for (int d = 0; d < 3; d++) dcos_omega_dj[d] += -(hthd-arg*hnhd)/sin_ijk_rnd * dcos_ijk_dj[d]; - for (int d = 0; d < 3; d++) dcos_omega_dj[d] += -(hthe-arg*hnhe)/sin_jil_rnd * dcos_jil_dj[d]; - for (int d = 0; d < 3; d++) dcos_omega_dj[d] *= 2.0/poem; - - // dcos_omega_dl - for (int d = 0; d < 3; d++) dcos_omega_dl[d] = ((htrc-arg*hnrc)/rjl) * deljl[d] + dellk[d]; - for (int d = 0; d < 3; d++) dcos_omega_dl[d] += (hthe-arg*hnhe)/sin_jil_rnd * -dcos_jil_dk[d]; - for (int d = 0; d < 3; d++) dcos_omega_dl[d] *= 2.0/poem; - - cos_omega = cos(omega); - cos2omega = cos(2. * omega); - cos3omega = cos(3. * omega); - - // torsion energy - - p_tor1 = paramsfbp(ktype,itype,jtype,ltype).p_tor1; - p_cot1 = paramsfbp(ktype,itype,jtype,ltype).p_cot1; - V1 = paramsfbp(ktype,itype,jtype,ltype).V1; - V2 = paramsfbp(ktype,itype,jtype,ltype).V2; - V3 = paramsfbp(ktype,itype,jtype,ltype).V3; - - exp_tor1 = exp(p_tor1 * SQR(2.0 - d_BO_pi(i,j_index) - f11_DiDj)); - exp_tor2_jl = exp(-p_tor2 * BOA_jl); - exp_cot2_jl = exp(-p_cot2 * SQR(BOA_jl - 1.5)); - fn10 = (1.0 - exp_tor2_ik) * (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jl); - - CV = 0.5 * (V1 * (1.0 + cos_omega) + V2 * exp_tor1 * (1.0 - cos2omega) + V3 * (1.0 + cos3omega)); - - e_tor = fn10 * sin_ijk * sin_jil * CV; - if (EVFLAG && eflag_global) ev.ereax[6] += e_tor; - - dfn11 = (-p_tor3 * exp_tor3_DiDj + (p_tor3 * exp_tor3_DiDj - p_tor4 * exp_tor4_DiDj) * - (2.0 + exp_tor3_DiDj) * exp_tor34_inv) * exp_tor34_inv; - - CEtors1 = sin_ijk * sin_jil * CV; - - CEtors2 = -fn10 * 2.0 * p_tor1 * V2 * exp_tor1 * (2.0 - d_BO_pi(i,j_index) - f11_DiDj) * - (1.0 - SQR(cos_omega)) * sin_ijk * sin_jil; - CEtors3 = CEtors2 * dfn11; - - CEtors4 = CEtors1 * p_tor2 * exp_tor2_ik * (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jl); - CEtors5 = CEtors1 * p_tor2 * (1.0 - exp_tor2_ik) * exp_tor2_ij * (1.0 - exp_tor2_jl); - CEtors6 = CEtors1 * p_tor2 * (1.0 - exp_tor2_ik) * (1.0 - exp_tor2_ij) * exp_tor2_jl; - - cmn = -fn10 * CV; - CEtors7 = cmn * sin_jil * tan_ijk_i; - CEtors8 = cmn * sin_ijk * tan_jil_i; - - CEtors9 = fn10 * sin_ijk * sin_jil * - (0.5 * V1 - 2.0 * V2 * exp_tor1 * cos_omega + 1.5 * V3 * (cos2omega + 2.0 * SQR(cos_omega))); - - // 4-body conjugation energy - - fn12 = exp_cot2_ik * exp_cot2_ij * exp_cot2_jl; - e_con = p_cot1 * fn12 * (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jil); - if (EVFLAG && eflag_global) ev.ereax[7] += e_con; - - Cconj = -2.0 * fn12 * p_cot1 * p_cot2 * (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jil); - - CEconj1 = Cconj * (BOA_ik - 1.5e0); - CEconj2 = Cconj * (BOA_ij - 1.5e0); - CEconj3 = Cconj * (BOA_jl - 1.5e0); - - CEconj4 = -p_cot1 * fn12 * (SQR(cos_omega) - 1.0) * sin_jil * tan_ijk_i; - CEconj5 = -p_cot1 * fn12 * (SQR(cos_omega) - 1.0) * sin_ijk * tan_jil_i; - CEconj6 = 2.0 * p_cot1 * fn12 * cos_omega * sin_ijk * sin_jil; - - // forces - - // contribution to bond order - - d_Cdbopi(i,j_index) += CEtors2; - CdDelta_i += CEtors3; - CdDelta_j += CEtors3; - - a_Cdbo(i,k_index) += CEtors4 + CEconj1; - a_Cdbo(i,j_index) += CEtors5 + CEconj2; - a_Cdbo(j,l_index) += CEtors6 + CEconj3; // trouble - - // dcos_theta_ijk - const F_FLOAT coeff74 = CEtors7 + CEconj4; - for (int d = 0; d < 3; d++) fi_tmp[d] = (coeff74) * dcos_ijk_di[d]; - for (int d = 0; d < 3; d++) fj_tmp[d] = (coeff74) * dcos_ijk_dj[d]; - for (int d = 0; d < 3; d++) fk_tmp[d] = (coeff74) * dcos_ijk_dk[d]; - - const F_FLOAT coeff85 = CEtors8 + CEconj5; - // dcos_theta_jil - for (int d = 0; d < 3; d++) fi_tmp[d] += (coeff85) * dcos_jil_di[d]; - for (int d = 0; d < 3; d++) fj_tmp[d] += (coeff85) * dcos_jil_dj[d]; - for (int d = 0; d < 3; d++) fl_tmp[d] = (coeff85) * dcos_jil_dk[d]; - - // dcos_omega - const F_FLOAT coeff96 = CEtors9 + CEconj6; - for (int d = 0; d < 3; d++) fi_tmp[d] += (coeff96) * dcos_omega_di[d]; - for (int d = 0; d < 3; d++) fj_tmp[d] += (coeff96) * dcos_omega_dj[d]; - for (int d = 0; d < 3; d++) fk_tmp[d] += (coeff96) * dcos_omega_dk[d]; - for (int d = 0; d < 3; d++) fl_tmp[d] += (coeff96) * dcos_omega_dl[d]; - - // total forces - - for (int d = 0; d < 3; d++) fitmp[d] -= fi_tmp[d]; - for (int d = 0; d < 3; d++) fjtmp[d] -= fj_tmp[d]; - for (int d = 0; d < 3; d++) fktmp[d] -= fk_tmp[d]; - for (int d = 0; d < 3; d++) a_f(l,d) -= fl_tmp[d]; - - // per-atom energy/virial tally - - if (EVFLAG) { - eng_tmp = e_tor + e_con; - //if (eflag_atom) this->template ev_tally(ev,i,j,eng_tmp,0.0,0.0,0.0,0.0); - if (eflag_atom) this->template e_tally(ev,i,j,eng_tmp); - if (vflag_either) { - for (int d = 0; d < 3; d ++) delil[d] = x(l,d) - x(i,d); - for (int d = 0; d < 3; d ++) delkl[d] = x(l,d) - x(k,d); - this->template v_tally4(ev,k,i,j,l,fk_tmp,fi_tmp,fj_tmp,delkl,delil,deljl); - } - } - } - - for (int d = 0; d < 3; d++) a_f(k,d) += fktmp[d]; - } - } - a_CdDelta[j] += CdDelta_j; - for (int d = 0; d < 3; d++) a_f(j,d) += fjtmp[d]; - } - } - a_CdDelta[i] += CdDelta_i; - for (int d = 0; d < 3; d++) a_f(i,d) += fitmp[d]; -} - -template -template -KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsion, const int &ii) const { - - EV_FLOAT_REAX ev; - this->template operator()(TagPairReaxComputeTorsion(), ii, ev); -} - -#endif - /* ---------------------------------------------------------------------- */ template @@ -4898,7 +3802,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2template v_tally(ev,k,temp,tmpvec); } @@ -5005,16 +3886,10 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2template v_tally(ev,k,temp,tmpvec); } diff --git a/src/KOKKOS/pair_reaxff_kokkos.h b/src/KOKKOS/pair_reaxff_kokkos.h index f79bfa7a6a..64fd6c12c7 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.h +++ b/src/KOKKOS/pair_reaxff_kokkos.h @@ -90,36 +90,14 @@ struct TagPairReaxComputeMulti1{}; template struct TagPairReaxComputeMulti2{}; -#ifdef OPT_ANGULAR_TORSION - -#ifdef OPT_SPLIT_COUNT_ANGULAR_TORSION -template -struct TagPairReaxCountAngular{}; - -template -struct TagPairReaxCountTorsion{}; -#else template struct TagPairReaxCountAngularTorsion{}; -#endif template struct TagPairReaxComputeAngularPreprocessed{}; template struct TagPairReaxComputeTorsionPreprocessed{}; -#else - -template -struct TagPairReaxComputeAngular{}; - -struct TagPairReaxComputeTorsionPreview{}; - -template -struct TagPairReaxComputeTorsion{}; - -#endif - template struct TagPairReaxComputeHydrogen{}; @@ -263,21 +241,9 @@ class PairReaxFFKokkos : public PairReaxFF { KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxComputeMulti2, const int&) const; -#ifdef OPT_ANGULAR_TORSION - -#ifdef OPT_SPLIT_COUNT_ANGULAR_TORSION - template - KOKKOS_INLINE_FUNCTION - void operator()(TagPairReaxCountAngular, const int&) const; - - template - KOKKOS_INLINE_FUNCTION - void operator()(TagPairReaxCountTorsion, const int&) const; -#else template KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxCountAngularTorsion, const int&) const; -#endif // Abstraction for computing SBSO2, CSBO2, dSBO1, dsBO2 KOKKOS_INLINE_FUNCTION @@ -309,28 +275,6 @@ class PairReaxFFKokkos : public PairReaxFF { KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxComputeTorsionPreprocessed, const int&) const; -#else - template - KOKKOS_INLINE_FUNCTION - void operator()(TagPairReaxComputeAngular, const int&, EV_FLOAT_REAX&) const; - - template - KOKKOS_INLINE_FUNCTION - void operator()(TagPairReaxComputeAngular, const int&) const; - - KOKKOS_INLINE_FUNCTION - void operator()(TagPairReaxComputeTorsionPreview, const int&) const; - - template - KOKKOS_INLINE_FUNCTION - void operator()(TagPairReaxComputeTorsion, const int&, EV_FLOAT_REAX&) const; - - template - KOKKOS_INLINE_FUNCTION - void operator()(TagPairReaxComputeTorsion, const int&) const; - -#endif - template KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxComputeHydrogen, const int&, EV_FLOAT_REAX&) const; @@ -486,12 +430,7 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_float_1d d_bo_rij, d_hb_rsq, d_Deltap, d_Deltap_boc, d_total_bo, d_s; typename AT::t_float_1d d_Delta, d_Delta_boc, d_Delta_lp, d_dDelta_lp, d_Delta_lp_temp, d_CdDelta; typename AT::t_ffloat_2d_dl d_BO, d_BO_s, d_BO_pi, d_BO_pi2; -#ifdef OPT_REDUCE_DXDYDZ typename AT::t_ffloat_2d_dl d_dln_BOp_pi, d_dln_BOp_pi2; -#else - typename AT::t_ffloat_2d_dl d_dln_BOp_pix, d_dln_BOp_piy, d_dln_BOp_piz; - typename AT::t_ffloat_2d_dl d_dln_BOp_pi2x, d_dln_BOp_pi2y, d_dln_BOp_pi2z; -#endif typename AT::t_ffloat_2d_dl d_C1dbo, d_C2dbo, d_C3dbo; typename AT::t_ffloat_2d_dl d_C1dbopi, d_C2dbopi, d_C3dbopi, d_C4dbopi; typename AT::t_ffloat_2d_dl d_C1dbopi2, d_C2dbopi2, d_C3dbopi2, d_C4dbopi2; @@ -541,11 +480,7 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_int_scalar d_resize_bo, d_resize_hb; typename AT::t_ffloat_2d_dl d_sum_ovun; -#ifdef OPT_REDUCE_DXDYDZ typename AT::t_ffloat_2d_dl d_dBOp; -#else - typename AT::t_ffloat_2d_dl d_dBOpx, d_dBOpy, d_dBOpz; -#endif int neighflag, newton_pair, maxnumneigh, maxhb, maxbo; int nlocal,nn,NN,eflag,vflag,acks2_flag; @@ -578,8 +513,6 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_ffloat_1d d_buf; DAT::tdual_int_scalar k_nbuf_local; -#ifdef OPT_ANGULAR_TORSION - typedef Kokkos::View t_reax_int4_2d; t_reax_int4_2d d_angular_pack, d_torsion_pack; @@ -589,18 +522,6 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::tdual_int_1d k_count_angular_torsion; typename AT::t_int_1d d_count_angular_torsion; -#else - - // for fast ComputeTorsion preprocessor kernel - typedef Kokkos::View t_hostpinned_int_1d; - - int inum_store; - t_hostpinned_int_1d counters; - t_hostpinned_int_1d counters_jj_min; - t_hostpinned_int_1d counters_jj_max; - t_hostpinned_int_1d counters_kk_min; - t_hostpinned_int_1d counters_kk_max; -#endif }; template From 72874376f068850a1faa36473b3323364c27dcfb Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 31 Mar 2022 12:27:43 -0600 Subject: [PATCH 20/57] Remove #ifdef --- src/KOKKOS/kokkos_type.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index 090f22d6e9..2926ba1d36 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -1214,15 +1214,12 @@ struct params_lj_coul { F_FLOAT cut_ljsq,cut_coulsq,lj1,lj2,lj3,lj4,offset; }; -#ifdef OPT_ANGULAR_TORSION // ReaxFF struct alignas(4 * sizeof(int)) reax_int4 { int i0, i1, i2, i3; }; -#endif - // Pair SNAP #define SNAP_KOKKOS_REAL double From ad4701f4f71b99216a65727a9b3fc1b87b7d01b7 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 31 Mar 2022 12:52:36 -0600 Subject: [PATCH 21/57] Small tweaks --- src/KOKKOS/pair_reaxff_kokkos.cpp | 55 +++++++++++++------------------ 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 14af59e754..509739fa35 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -958,12 +958,10 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) count_angular = h_count_angular_torsion(0); count_torsion = h_count_angular_torsion(1); - if (count_angular > d_angular_pack.extent(0)) { + if (count_angular > d_angular_pack.extent(0)) d_angular_pack = t_reax_int4_2d("reaxff:angular_pack",(int)(count_angular * 1.1),2); - } - if (count_torsion > d_torsion_pack.extent(0)) { + if (count_torsion > d_torsion_pack.extent(0)) d_torsion_pack = t_reax_int4_2d("reaxff:torsion_pack",(int)(count_torsion * 1.1),2); - } // need to zero to re-count h_count_angular_torsion(0) = 0; @@ -971,22 +969,22 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) k_count_angular_torsion.template modify(); k_count_angular_torsion.template sync(); - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); // no need to re-sync count_angular, count_torsion // Angular if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,count_angular),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,count_angular),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,count_angular),*this); + Kokkos::parallel_for(Kokkos::RangePolicy>(0,count_angular),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,count_angular),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,count_angular),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,count_angular),*this); + Kokkos::parallel_for(Kokkos::RangePolicy>(0,count_angular),*this); ev_all += ev; } pvector[4] = ev.ereax[3]; @@ -997,15 +995,15 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) // Torsion if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,count_torsion),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,count_torsion),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,count_torsion),*this); + Kokkos::parallel_for(Kokkos::RangePolicy>(0,count_torsion),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,count_torsion),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,count_torsion),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,count_torsion),*this); + Kokkos::parallel_for(Kokkos::RangePolicy>(0,count_torsion),*this); ev_all += ev; } pvector[8] = ev.ereax[6]; @@ -1676,7 +1674,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< const int jnum = d_numneigh[i]; F_FLOAT C12, C34, C56, BO_s, BO_pi, BO_pi2, BO, delij[3], dBOp_i[3]; - F_FLOAT dln_BOp_pi_i[3], dln_BOp_pi2_i[3]; F_FLOAT dDeltap_self_i[3] = {0.0,0.0,0.0}; F_FLOAT total_bo_i = 0.0; @@ -2068,7 +2065,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i const int itype = type(i); F_FLOAT C12, C34, C56, BO_s, BO_pi, BO_pi2, BO, delij[3], dBOp_i[3]; - F_FLOAT dln_BOp_pi_i[3], dln_BOp_pi2_i[3]; F_FLOAT dDeltap_self_i[3] = {0.0,0.0,0.0}; F_FLOAT total_bo_i = 0.0; @@ -2528,7 +2524,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeMulti2template operator()(TagPairReaxComputeMulti2(), ii, ev); } - /* ---------------------------------------------------------------------- */ template @@ -2638,10 +2633,10 @@ void PairReaxFFKokkos::compute_angular_sbo(int i, int itype, int j_s CSBO2 = 0.0; } - d_angular_intermediates(i, 0) = SBO2; - d_angular_intermediates(i, 1) = CSBO2; - d_angular_intermediates(i, 2) = dSBO1; - d_angular_intermediates(i, 3) = dSBO2; + d_angular_intermediates(i,0) = SBO2; + d_angular_intermediates(i,1) = CSBO2; + d_angular_intermediates(i,2) = dSBO1; + d_angular_intermediates(i,3) = dSBO2; } @@ -2705,7 +2700,6 @@ int PairReaxFFKokkos::preprocess_angular(int i, int itype, int j_sta count_angular++; } } - } return count_angular; @@ -2756,7 +2750,6 @@ int PairReaxFFKokkos::preprocess_torsion(int i, int itype, int itag, const F_FLOAT bo_ik = d_BO(i,k_index); if (bo_ik < thb_cut) continue; - for (int ll = l_start; ll < l_end; ll++) { int l = d_bo_list[ll]; l &= NEIGHMASK; @@ -2785,7 +2778,6 @@ int PairReaxFFKokkos::preprocess_torsion(int i, int itype, int itag, } else { count_torsion++; } - } } } @@ -2802,9 +2794,9 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeAngularPreproces auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access::value>(); - Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbo = d_Cdbo; - Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbopi = d_Cdbopi; - Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbopi2 = d_Cdbopi2; + Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbo = d_Cdbo; + Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbopi = d_Cdbopi; + Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbopi2 = d_Cdbopi2; auto v_CdDelta = ScatterViewHelper::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); auto a_CdDelta = v_CdDelta.template access::value>(); @@ -3045,7 +3037,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeAngularPreproces for (int d = 0; d < 3; d++) a_f(i,d) += fitmp[d]; } - template template KOKKOS_INLINE_FUNCTION @@ -3067,8 +3058,8 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsionPreproces auto v_CdDelta = ScatterViewHelper::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); auto a_CdDelta = v_CdDelta.template access::value>(); - Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbo = d_Cdbo; - Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbopi = d_Cdbopi; + Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbo = d_Cdbo; + Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbopi = d_Cdbopi; //auto a_Cdbo = dup_Cdbo.template access::value>(); // in reaxff_torsion_angles: j = i, k = j, i = k; @@ -3558,9 +3549,9 @@ template KOKKOS_INLINE_FUNCTION void PairReaxFFKokkos::operator()(TagPairReaxUpdateBond, const int &ii) const { - Kokkos::View::value> > a_Cdbo = d_Cdbo; - Kokkos::View::value> > a_Cdbopi = d_Cdbopi; - Kokkos::View::value> > a_Cdbopi2 = d_Cdbopi2; + Kokkos::View::value>> a_Cdbo = d_Cdbo; + Kokkos::View::value>> a_Cdbopi = d_Cdbopi; + Kokkos::View::value>> a_Cdbopi2 = d_Cdbopi2; //auto a_Cdbo = dup_Cdbo.template access>(); //auto a_Cdbopi = dup_Cdbopi.template access>(); //auto a_Cdbopi2 = dup_Cdbopi2.template access>(); From 4dc4d740563e964169c7082f10f3db646e71478a Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 31 Mar 2022 13:10:22 -0600 Subject: [PATCH 22/57] Add back in accidentally deleted call --- src/KOKKOS/pair_reaxff_kokkos.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 509739fa35..9b0506f24e 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -950,8 +950,7 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) k_count_angular_torsion.template modify(); k_count_angular_torsion.template sync(); - // separate kernels for counting of Angular, Torsion - // may make a difference for occupancy/cache thrashing + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); k_count_angular_torsion.template modify(); k_count_angular_torsion.template sync(); From e3611c5d73ffe7886f4578d633a5886a7114924f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 31 Mar 2022 17:02:11 -0400 Subject: [PATCH 23/57] add support for custom keywords with thermo output --- doc/src/thermo_modify.rst | 38 +++++++++++++++++----- src/thermo.cpp | 66 +++++++++++++++++++++++++++++++++------ src/thermo.h | 4 ++- 3 files changed, 91 insertions(+), 17 deletions(-) diff --git a/doc/src/thermo_modify.rst b/doc/src/thermo_modify.rst index e209dd937b..2258255d01 100644 --- a/doc/src/thermo_modify.rst +++ b/doc/src/thermo_modify.rst @@ -21,9 +21,14 @@ Syntax *norm* value = *yes* or *no* *flush* value = *yes* or *no* *line* value = *one* or *multi* or *yaml* - *format* values = *line* string, *int* string, *float* string, M string, or *none* + *header* values = ID string, or *default* + string = new header name + ID = integer from 1 to N, or integer from -N to -1, where N = # of quantities being output + *or* a thermo keyword or reference to compute, fix, property or variable. + *format* values = *line* string, *int* string, *float* string, ID string, or *none* string = C-style format string - M = integer from 1 to N, where N = # of quantities being output + ID = integer from 1 to N, or integer from -N to -1, where N = # of quantities being output + *or* a thermo keyword or reference to compute, fix, property or variable. *temp* value = compute ID that calculates a temperature *press* value = compute ID that calculates a pressure @@ -36,7 +41,8 @@ Examples thermo_modify temp myTemp format 3 %15.8g thermo_modify temp myTemp format line "%ld %g %g %15.8g" thermo_modify line multi format float %g - themos_modify line yaml format none + thermo_modify line yaml format none + thermo_modify header 1 Timestep header -2 Pressure header f_1[1] AvgDensity Description """"""""""" @@ -147,6 +153,20 @@ containing the timestep and CPU time ("multi"), or in a YAML format block ("yaml"). This modify option overrides the *one*, *multi*, or *yaml* thermo_style settings. +The *header* keyword can be used to change the default header keyword +for a column or field of thermodynamic output. The setting for +*ID string* replaces the default keyword with the provided string. +*ID* can be a positive integer - then it represents the column number +counting from the left -, a negative integer - then it represents the +column number from the right (i.e. -1 is the last column/keyword), +or a thermo keyword (or compute, fix, property, or variable reference) +- then it replaces the string for that specific keyword -. + +The *header* keyword can be used multiple times. If multiple *header* +settings refer to the same keyword, the last setting has precedence. +the default setting is used. A setting of *default* clears all previous +settings, reverting all values to their default format. + The *format* keyword can be used to change the default numeric format of any of quantities the :doc:`thermo_style ` command outputs. All the specified format strings are C-style formats, e.g. as @@ -155,12 +175,16 @@ argument which is the format string for the entire line of thermo output, with N fields, which you must enclose in quotes if it is more than one field. The *int* and *float* keywords take a single format argument and are applied to all integer or floating-point quantities -output. The setting for *M string* also takes a single format argument -which is used for the Mth value output in each line, e.g. the fifth -column is output in high precision for "format 5 %20.15g". +output. The setting for *ID string* also takes a single format argument +which is used for the indexed value in each line. The interpretation is +the same as for *header*, i.e. a positive integer is the n-th value corresponding +to the n-th thermo keyword, a negative integer is counting backwards and +a string matches the entry with the thermo keyword., e.g. the fifth +column is output in high precision for "format 5 %20.15g" and the +pair energy for "format epair %20.15g". The *format* keyword can be used multiple times. The precedence is -that for each value in a line of output, the *M* format (if specified) +that for each value in a line of output, the *ID* format (if specified) is used, else the *int* or *float* setting (if specified) is used, else the *line* setting (if specified) for that value is used, else the default setting is used. A setting of *none* clears all previous diff --git a/src/thermo.cpp b/src/thermo.cpp index e1534f11bd..b5e6d6ba54 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -252,8 +252,12 @@ void Thermo::init() format[i] += format_this + " "; else if (lineflag == YAMLLINE) format[i] += format_this + ", "; - else - format[i] += fmt::format("{:<8} = {} ", keyword[i], format_this); + else { + if (keyword_user[i].size()) + format[i] += fmt::format("{:<8} = {} ", keyword_user[i], format_this); + else + format[i] += fmt::format("{:<8} = {} ", keyword[i], format_this); + } } // chop off trailing blank or add closing bracket if needed and then add newline @@ -324,11 +328,13 @@ void Thermo::header() std::string hdr; if (lineflag == YAMLLINE) hdr = "---\nkeywords: ["; for (int i = 0; i < nfield; i++) { + auto head = keyword[i]; + if (keyword_user[i].size()) head = keyword_user[i]; if (lineflag == ONELINE) { if (vtype[i] == FLOAT) - hdr += fmt::format("{:^14} ", keyword[i]); + hdr += fmt::format("{:^14} ", head); else if ((vtype[i] == INT) || (vtype[i] == BIGINT)) - hdr += fmt::format("{:^11} ", keyword[i]); + hdr += fmt::format("{:^11} ", head); } else if (lineflag == YAMLLINE) { hdr += keyword[i]; hdr += ", "; @@ -622,6 +628,30 @@ void Thermo::modify_params(int narg, char **arg) error->all(FLERR, "Illegal thermo_modify command"); iarg += 2; + } else if (strcmp(arg[iarg], "header") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal thermo_modify command"); + if (strcmp(arg[iarg + 1], "default") == 0) { + for (int i=0; i < nfield_initial + 1; ++i) + keyword_user[i].clear(); + iarg += 2; + } else { + if (iarg + 3 > narg) error->all(FLERR, "Illegal thermo_modify command"); + int icol = -1; + if (utils::is_integer(arg[iarg + 1])) { + icol = utils::inumeric(FLERR,arg[iarg + 1],false,lmp); + if (icol < 0) icol = nfield_initial + icol + 1; + icol--; + } else { + try { + icol = key2col.at(arg[iarg + 1]); + } catch (std::out_of_range &) { + icol = -1; + } + } + if ((icol < 0) || (icol >= nfield_initial)) error->all(FLERR, "Illegal thermo_modify command"); + keyword_user[icol] = arg[iarg+2]; + iarg += 3; + } } else if (strcmp(arg[iarg], "format") == 0) { if (iarg + 2 > narg) error->all(FLERR, "Illegal thermo_modify command"); @@ -646,14 +676,24 @@ void Thermo::modify_params(int narg, char **arg) found = format_int_user.find('d', found); if (found == std::string::npos) error->all(FLERR, "Thermo_modify int format does not contain a d conversion character"); - format_bigint_user = - format_int_user.replace(found, 1, std::string(BIGINT_FORMAT).substr(1)); + format_bigint_user = format_int_user.replace(found, 1, std::string(BIGINT_FORMAT).substr(1)); } else if (strcmp(arg[iarg + 1], "float") == 0) { format_float_user = arg[iarg + 2]; } else { - int i = utils::inumeric(FLERR, arg[iarg + 1], false, lmp) - 1; - if (i < 0 || i >= nfield_initial + 1) error->all(FLERR, "Illegal thermo_modify command"); - format_column_user[i] = arg[iarg + 2]; + int icol = -1; + if (utils::is_integer(arg[iarg + 1])) { + icol = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + if (icol < 0) icol = nfield_initial + icol + 1; + icol--; + } else { + try { + icol = key2col.at(arg[iarg + 1]); + } catch (std::out_of_range &) { + icol = -1; + } + } + if (icol < 0 || icol >= nfield_initial + 1) error->all(FLERR, "Illegal thermo_modify command"); + format_column_user[icol] = arg[iarg + 2]; } iarg += 3; @@ -675,10 +715,12 @@ void Thermo::allocate() keyword.resize(n); format.resize(n); format_column_user.resize(n); + keyword_user.resize(n); for (int i = 0; i < n; i++) { keyword[i].clear(); format[i].clear(); format_column_user[i].clear(); + keyword_user[i].clear(); } vfunc = new FnPtr[n]; @@ -702,6 +744,12 @@ void Thermo::allocate() nvariable = 0; id_variable = new char *[n]; variables = new int[n]; + + int i = 0; + key2col.clear(); + for (auto item : utils::split_words(line)) { + key2col[item] = i++; + } } /* ---------------------------------------------------------------------- diff --git a/src/thermo.h b/src/thermo.h index b0a2309312..9d0fefbc56 100644 --- a/src/thermo.h +++ b/src/thermo.h @@ -15,6 +15,7 @@ #define LMP_THERMO_H #include "pointers.h" +#include namespace LAMMPS_NS { @@ -47,8 +48,9 @@ class Thermo : protected Pointers { int nfield, nfield_initial; int *vtype; std::string line; - std::vector keyword, format, format_column_user; + std::vector keyword, format, format_column_user, keyword_user; std::string format_line_user, format_float_user, format_int_user, format_bigint_user; + std::map key2col; int normvalue; // use this for normflag unless natoms = 0 int normuserflag; // 0 if user has not set, 1 if has From 335b78b4f2aa1815e013103062dd04b48ad43583 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 31 Mar 2022 15:27:05 -0600 Subject: [PATCH 24/57] Add contributing author to list --- src/KOKKOS/pair_reaxff_kokkos.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 9b0506f24e..714c0c4914 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -13,7 +13,8 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Ray Shan (SNL), Stan Moore (SNL) + Contributing authors: Ray Shan (SNL), Stan Moore (SNL), + Evan Weinberg (NVIDIA) Nicholas Curtis (AMD), Leopold Grinberd (AMD), and Gina Sitaraman (AMD): - Reduced math overhead: enabled specialized calls (e.g., cbrt for a From 4042a52db1cc31a5434e3a89a29a1fad9f766321 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 31 Mar 2022 21:58:35 -0400 Subject: [PATCH 25/57] rename header keyword to colname --- doc/src/thermo_modify.rst | 43 ++++++++++++++++++++------------------- src/thermo.cpp | 2 +- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/doc/src/thermo_modify.rst b/doc/src/thermo_modify.rst index 2258255d01..9a5e739c0e 100644 --- a/doc/src/thermo_modify.rst +++ b/doc/src/thermo_modify.rst @@ -21,13 +21,13 @@ Syntax *norm* value = *yes* or *no* *flush* value = *yes* or *no* *line* value = *one* or *multi* or *yaml* - *header* values = ID string, or *default* - string = new header name - ID = integer from 1 to N, or integer from -N to -1, where N = # of quantities being output + *colname* values = ID string, or *default* + string = new column header name + ID = integer from 1 to N, or integer from -1 to -N, where N = # of quantities being output *or* a thermo keyword or reference to compute, fix, property or variable. *format* values = *line* string, *int* string, *float* string, ID string, or *none* string = C-style format string - ID = integer from 1 to N, or integer from -N to -1, where N = # of quantities being output + ID = integer from 1 to N, or integer from -1 to -N, where N = # of quantities being output *or* a thermo keyword or reference to compute, fix, property or variable. *temp* value = compute ID that calculates a temperature *press* value = compute ID that calculates a pressure @@ -42,7 +42,7 @@ Examples thermo_modify temp myTemp format line "%ld %g %g %15.8g" thermo_modify line multi format float %g thermo_modify line yaml format none - thermo_modify header 1 Timestep header -2 Pressure header f_1[1] AvgDensity + thermo_modify colname 1 Timestep colname -2 Pressure colname f_1[1] AvgDensity Description """"""""""" @@ -153,16 +153,16 @@ containing the timestep and CPU time ("multi"), or in a YAML format block ("yaml"). This modify option overrides the *one*, *multi*, or *yaml* thermo_style settings. -The *header* keyword can be used to change the default header keyword -for a column or field of thermodynamic output. The setting for -*ID string* replaces the default keyword with the provided string. -*ID* can be a positive integer - then it represents the column number -counting from the left -, a negative integer - then it represents the -column number from the right (i.e. -1 is the last column/keyword), -or a thermo keyword (or compute, fix, property, or variable reference) -- then it replaces the string for that specific keyword -. +The *colname* keyword can be used to change the default header keyword +for a column or field of thermodynamic output. The setting for *ID +string* replaces the default text with the provided string. *ID* can be +a positive integer when it represents the column number counting from +the left, a negative integer when then it represents the column number +from the right (i.e. -1 is the last column/keyword), or a thermo keyword +(or compute, fix, property, or variable reference) and then it replaces +the string for that specific thermo keyword. -The *header* keyword can be used multiple times. If multiple *header* +The *colname* keyword can be used multiple times. If multiple *colname* settings refer to the same keyword, the last setting has precedence. the default setting is used. A setting of *default* clears all previous settings, reverting all values to their default format. @@ -177,11 +177,11 @@ than one field. The *int* and *float* keywords take a single format argument and are applied to all integer or floating-point quantities output. The setting for *ID string* also takes a single format argument which is used for the indexed value in each line. The interpretation is -the same as for *header*, i.e. a positive integer is the n-th value corresponding -to the n-th thermo keyword, a negative integer is counting backwards and -a string matches the entry with the thermo keyword., e.g. the fifth -column is output in high precision for "format 5 %20.15g" and the -pair energy for "format epair %20.15g". +the same as for *colname*, i.e. a positive integer is the n-th value +corresponding to the n-th thermo keyword, a negative integer is counting +backwards, and a string matches the entry with the thermo keyword., +e.g. the fifth column is output in high precision for "format 5 %20.15g" +and the pair energy for "format epair %20.15g". The *format* keyword can be used multiple times. The precedence is that for each value in a line of output, the *ID* format (if specified) @@ -197,9 +197,10 @@ settings, reverting all values to their default format. When specifying the *format int* option you can use a "%d"-style format identifier in the format string and LAMMPS will convert this to the corresponding 8-byte form when it is applied to those - keywords. However, when specifying the *line* option or *format M + keywords. However, when specifying the *line* option or *format ID string* option for *step* and *natoms*, you should specify a format - string appropriate for an 8-byte signed integer, e.g. one with "%ld". + string appropriate for an 8-byte signed integer, e.g. one with "%ld" + or "%lld" depending on the platform. The *temp* keyword is used to determine how thermodynamic temperature is calculated, which is used by all thermo quantities that require a diff --git a/src/thermo.cpp b/src/thermo.cpp index b5e6d6ba54..fe6f92d85d 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -628,7 +628,7 @@ void Thermo::modify_params(int narg, char **arg) error->all(FLERR, "Illegal thermo_modify command"); iarg += 2; - } else if (strcmp(arg[iarg], "header") == 0) { + } else if (strcmp(arg[iarg], "colname") == 0) { if (iarg + 2 > narg) error->all(FLERR, "Illegal thermo_modify command"); if (strcmp(arg[iarg + 1], "default") == 0) { for (int i=0; i < nfield_initial + 1; ++i) From ce67cb0ca10e3cb4d1774fab5aca6e0b50f7fa9c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 1 Apr 2022 07:41:13 -0400 Subject: [PATCH 26/57] first stab at implementing dump_modify colname --- src/dump.cpp | 66 ++++++++++++++++++++++++++++++--------------- src/dump.h | 4 +++ src/dump_atom.cpp | 29 ++++++++++++++------ src/dump_atom.h | 2 +- src/dump_cfg.cpp | 28 +++++++++++-------- src/dump_custom.cpp | 36 ++++++++++++++++--------- src/dump_custom.h | 1 + src/thermo.cpp | 5 ++-- 8 files changed, 115 insertions(+), 56 deletions(-) diff --git a/src/dump.cpp b/src/dump.cpp index 2e6df77cd9..480bbe666c 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -150,19 +150,19 @@ Dump::Dump(LAMMPS *lmp, int /*narg*/, char **arg) : Pointers(lmp) Dump::~Dump() { - delete [] id; - delete [] style; - delete [] filename; - delete [] multiname; + delete[] id; + delete[] style; + delete[] filename; + delete[] multiname; - delete [] format; - delete [] format_default; - delete [] format_line_user; - delete [] format_float_user; - delete [] format_int_user; - delete [] format_bigint_user; + delete[] format; + delete[] format_default; + delete[] format_line_user; + delete[] format_float_user; + delete[] format_int_user; + delete[] format_bigint_user; - delete [] refresh; + delete[] refresh; // format_column_user is deallocated by child classes that use it @@ -1019,7 +1019,7 @@ void Dump::balance() memory->destroy(tmp); memory->destroy(proc_offsets); memory->destroy(proc_new_offsets); - delete [] request; + delete[] request; } /* ---------------------------------------------------------------------- @@ -1059,7 +1059,7 @@ void Dump::modify_params(int narg, char **arg) if (strcmp(id,output->dump[idump]->id) == 0) break; int n; if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) { - delete [] output->var_dump[idump]; + delete[] output->var_dump[idump]; output->var_dump[idump] = utils::strdup(&arg[iarg+1][2]); n = 0; } else { @@ -1077,7 +1077,7 @@ void Dump::modify_params(int narg, char **arg) if (strcmp(id,output->dump[idump]->id) == 0) break; double delta; if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) { - delete [] output->var_dump[idump]; + delete[] output->var_dump[idump]; output->var_dump[idump] = utils::strdup(&arg[iarg+1][2]); delta = 0.0; } else { @@ -1107,7 +1107,7 @@ void Dump::modify_params(int narg, char **arg) MPI_Comm_free(&clustercomm); MPI_Comm_split(world,icluster,0,&clustercomm); - delete [] multiname; + delete[] multiname; char *ptr = strchr(filename,'%'); *ptr = '\0'; multiname = utils::strdup(fmt::format("{}{}{}", filename, icluster, ptr+1)); @@ -1124,14 +1124,38 @@ void Dump::modify_params(int narg, char **arg) flush_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; + } else if (strcmp(arg[iarg],"colname") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); + if (strcmp(arg[iarg+1],"default") == 0) { + for (auto item : keyword_user) item.clear(); + iarg += 2; + } else { + if (iarg+3 > narg) error->all(FLERR,"Illegal dump_modify command"); + int icol = -1; + if (utils::is_integer(arg[iarg + 1])) { + icol = utils::inumeric(FLERR,arg[iarg + 1],false,lmp); + if (icol < 0) icol = keyword_user.size() + icol + 1; + icol--; + } else { + try { + icol = key2col.at(arg[iarg + 1]); + } catch (std::out_of_range &) { + icol = -1; + } + } + if ((icol < 0) || (icol >= (int)keyword_user.size())) + error->all(FLERR, "Illegal thermo_modify command"); + keyword_user[icol] = arg[iarg+2]; + iarg += 3; + } } else if (strcmp(arg[iarg],"format") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); if (strcmp(arg[iarg+1],"none") == 0) { - delete [] format_line_user; - delete [] format_int_user; - delete [] format_bigint_user; - delete [] format_float_user; + delete[] format_line_user; + delete[] format_int_user; + delete[] format_bigint_user; + delete[] format_float_user; format_line_user = nullptr; format_int_user = nullptr; format_bigint_user = nullptr; @@ -1146,7 +1170,7 @@ void Dump::modify_params(int narg, char **arg) if (iarg+3 > narg) error->all(FLERR,"Illegal dump_modify command"); if (strcmp(arg[iarg+1],"line") == 0) { - delete [] format_line_user; + delete[] format_line_user; format_line_user = utils::strdup(arg[iarg+2]); iarg += 3; } else { // pass other format options to child classes @@ -1204,7 +1228,7 @@ void Dump::modify_params(int narg, char **arg) MPI_Comm_free(&clustercomm); MPI_Comm_split(world,icluster,0,&clustercomm); - delete [] multiname; + delete[] multiname; char *ptr = strchr(filename,'%'); *ptr = '\0'; multiname = utils::strdup(fmt::format("{}{}{}", filename, icluster, ptr+1)); diff --git a/src/dump.h b/src/dump.h index bce32c9d65..34e0677af8 100644 --- a/src/dump.h +++ b/src/dump.h @@ -16,6 +16,8 @@ #include "pointers.h" // IWYU pragma: export +#include + namespace LAMMPS_NS { class Dump : protected Pointers { @@ -100,6 +102,8 @@ class Dump : protected Pointers { char *format_bigint_user; char **format_column_user; enum { INT, DOUBLE, STRING, BIGINT }; + std::map key2col; + std::vector keyword_user; FILE *fp; // file to write dump to int size_one; // # of quantities for one atom diff --git a/src/dump_atom.cpp b/src/dump_atom.cpp index 0dbd3b3278..faad91f3c5 100644 --- a/src/dump_atom.cpp +++ b/src/dump_atom.cpp @@ -38,6 +38,9 @@ DumpAtom::DumpAtom(LAMMPS *lmp, int narg, char **arg) : Dump(lmp, narg, arg) buffer_allow = 1; buffer_flag = 1; format_default = nullptr; + key2col = { { "id", 0 }, { "type", 1 }, { "x", 2 }, { "y", 3 }, + { "z", 4 }, { "ix", 5 }, { "iy", 6 }, { "iz", 7 } }; + keyword_user = { "", "", "", "", "", "", "", "" }; } /* ---------------------------------------------------------------------- */ @@ -63,15 +66,25 @@ void DumpAtom::init_style() domain->boundary_string(boundstr); // setup column string + std::string default_columns; if (scale_flag == 0 && image_flag == 0) - columns = (char *) "id type x y z"; + default_columns = "id type x y z"; else if (scale_flag == 0 && image_flag == 1) - columns = (char *) "id type x y z ix iy iz"; + default_columns = "id type x y z ix iy iz"; else if (scale_flag == 1 && image_flag == 0) - columns = (char *) "id type xs ys zs"; + default_columns = "id type xs ys zs"; else if (scale_flag == 1 && image_flag == 1) - columns = (char *) "id type xs ys zs ix iy iz"; + default_columns = "id type xs ys zs ix iy iz"; + + int icol = 0; + columns.clear(); + for (auto item : utils::split_words(default_columns)) { + if (columns.size()) columns += " "; + if (keyword_user[icol].size()) columns += keyword_user[icol]; + else columns += item; + ++icol; + } // setup function ptrs @@ -201,9 +214,9 @@ void DumpAtom::header_unit_style_binary() void DumpAtom::header_columns_binary() { - int len = strlen(columns); + int len = columns.size(); fwrite(&len, sizeof(int), 1, fp); - fwrite(columns, sizeof(char), len, fp); + fwrite(columns.c_str(), sizeof(char), len, fp); } /* ---------------------------------------------------------------------- */ @@ -301,7 +314,7 @@ void DumpAtom::header_item(bigint ndump) fprintf(fp,"%-1.16e %-1.16e\n",boxxlo,boxxhi); fprintf(fp,"%-1.16e %-1.16e\n",boxylo,boxyhi); fprintf(fp,"%-1.16e %-1.16e\n",boxzlo,boxzhi); - fprintf(fp,"ITEM: ATOMS %s\n",columns); + fprintf(fp,"ITEM: ATOMS %s\n",columns.c_str()); } /* ---------------------------------------------------------------------- */ @@ -322,7 +335,7 @@ void DumpAtom::header_item_triclinic(bigint ndump) fprintf(fp,"%-1.16e %-1.16e %-1.16e\n",boxxlo,boxxhi,boxxy); fprintf(fp,"%-1.16e %-1.16e %-1.16e\n",boxylo,boxyhi,boxxz); fprintf(fp,"%-1.16e %-1.16e %-1.16e\n",boxzlo,boxzhi,boxyz); - fprintf(fp,"ITEM: ATOMS %s\n",columns); + fprintf(fp,"ITEM: ATOMS %s\n",columns.c_str()); } /* ---------------------------------------------------------------------- */ diff --git a/src/dump_atom.h b/src/dump_atom.h index 1e1a9315d7..3c67e3de54 100644 --- a/src/dump_atom.h +++ b/src/dump_atom.h @@ -36,7 +36,7 @@ class DumpAtom : public Dump { int scale_flag; // 1 if atom coords are scaled, 0 if no int image_flag; // 1 if append box count to atom coords, 0 if no - char *columns; // column labels + std::string columns; // column labels void init_style() override; int modify_param(int, char **) override; diff --git a/src/dump_cfg.cpp b/src/dump_cfg.cpp index d52dac745f..552607b0a5 100644 --- a/src/dump_cfg.cpp +++ b/src/dump_cfg.cpp @@ -53,26 +53,26 @@ DumpCFG::DumpCFG(LAMMPS *lmp, int narg, char **arg) : if (strcmp(earg[2],"xs") == 0) { if (strcmp(earg[3],"ysu") == 0 || strcmp(earg[4],"zsu") == 0) - error->all(FLERR, - "Dump cfg arguments can not mix xs|ys|zs with xsu|ysu|zsu"); + error->all(FLERR,"Dump cfg arguments can not mix xs|ys|zs with xsu|ysu|zsu"); unwrapflag = 0; } else { if (strcmp(earg[3],"ys") == 0 || strcmp(earg[4],"zs") == 0) - error->all(FLERR, - "Dump cfg arguments can not mix xs|ys|zs with xsu|ysu|zsu"); + error->all(FLERR,"Dump cfg arguments can not mix xs|ys|zs with xsu|ysu|zsu"); unwrapflag = 1; } // setup auxiliary property name strings // convert 'X_ID[m]' (X=c,f,v) to 'X_ID_m' - if (nfield > 5) auxname = new char*[nfield]; + if (nfield > 5) auxname = new char*[nfield-5]; else auxname = nullptr; int i = 0; + key2col.clear(); + keyword_user.resize(nfield-5); for (int iarg = 5; iarg < nfield; iarg++, i++) { - ArgInfo argi(earg[iarg],ArgInfo::COMPUTE|ArgInfo::FIX|ArgInfo::VARIABLE - |ArgInfo::DNAME|ArgInfo::INAME); + ArgInfo argi(earg[iarg],ArgInfo::COMPUTE|ArgInfo::FIX|ArgInfo::VARIABLE| + ArgInfo::DNAME|ArgInfo::INAME); if (argi.get_dim() == 1) { std::string newarg = fmt::format("{}_{}_{}", earg[iarg][0], argi.get_name(), argi.get_index1()); @@ -80,6 +80,8 @@ DumpCFG::DumpCFG(LAMMPS *lmp, int narg, char **arg) : } else { auxname[i] = utils::strdup(earg[iarg]); } + key2col[earg[iarg]] = i; + keyword_user[i].clear(); } } @@ -88,8 +90,8 @@ DumpCFG::DumpCFG(LAMMPS *lmp, int narg, char **arg) : DumpCFG::~DumpCFG() { if (auxname) { - for (int i = 0; i < nfield-5; i++) delete [] auxname[i]; - delete [] auxname; + for (int i = 0; i < nfield-5; i++) delete[] auxname[i]; + delete[] auxname; } } @@ -136,8 +138,12 @@ void DumpCFG::write_header(bigint n) fprintf(fp,"H0(3,3) = %g A\n",domain->zprd); fprintf(fp,".NO_VELOCITY.\n"); fprintf(fp,"entry_count = %d\n",nfield-2); - for (int i = 0; i < nfield-5; i++) - fprintf(fp,"auxiliary[%d] = %s\n",i,auxname[i]); + for (int i = 0; i < nfield-5; i++) { + if (keyword_user[i].size()) + fprintf(fp,"auxiliary[%d] = %s\n",i,keyword_user[i].c_str()); + else + fprintf(fp,"auxiliary[%d] = %s\n",i,auxname[i]); + } } /* ---------------------------------------------------------------------- diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 5d371d3145..b22e9d6eec 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -55,14 +55,11 @@ enum{LT,LE,GT,GE,EQ,NEQ,XOR}; DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) : Dump(lmp, narg, arg), idregion(nullptr), thresh_array(nullptr), thresh_op(nullptr), thresh_value(nullptr), - thresh_last(nullptr), thresh_fix(nullptr), - thresh_fixID(nullptr), thresh_first(nullptr), - earg(nullptr), vtype(nullptr), vformat(nullptr), columns(nullptr), choose(nullptr), - dchoose(nullptr), clist(nullptr), field2index(nullptr), - argindex(nullptr), id_compute(nullptr), - compute(nullptr), id_fix(nullptr), fix(nullptr), - id_variable(nullptr), variable(nullptr), - vbuf(nullptr), id_custom(nullptr), custom(nullptr), custom_flag(nullptr), + thresh_last(nullptr), thresh_fix(nullptr), thresh_fixID(nullptr), thresh_first(nullptr), + earg(nullptr), vtype(nullptr), vformat(nullptr), columns(nullptr), columns_default(nullptr), + choose(nullptr), dchoose(nullptr), clist(nullptr), field2index(nullptr), argindex(nullptr), + id_compute(nullptr), compute(nullptr), id_fix(nullptr), fix(nullptr), id_variable(nullptr), + variable(nullptr), vbuf(nullptr), id_custom(nullptr), custom(nullptr), custom_flag(nullptr), typenames(nullptr), pack_choice(nullptr) { if (narg == 5) error->all(FLERR,"No dump custom arguments specified"); @@ -180,13 +177,14 @@ DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) : // setup column string cols.clear(); + keyword_user.resize(nfield); for (int iarg = 0; iarg < nfield; iarg++) { + key2col[earg[iarg]] = iarg; + keyword_user[iarg].clear(); + if (cols.size()) cols += " "; cols += earg[iarg]; - cols += " "; } - // remove trailing blank and copy - cols.resize(cols.size()-1); - columns = utils::strdup(cols); + columns_default = utils::strdup(cols); } /* ---------------------------------------------------------------------- */ @@ -257,6 +255,7 @@ DumpCustom::~DumpCustom() delete[] format_column_user; } + delete[] columns_default; delete[] columns; } @@ -264,6 +263,19 @@ DumpCustom::~DumpCustom() void DumpCustom::init_style() { + // assemble ITEMS: column string from defaults and user values + + delete[] columns; + std::string combined; + int icol = 0; + for (auto item : utils::split_words(columns_default)) { + if (combined.size()) combined += " "; + if (keyword_user[icol].size()) combined += keyword_user[icol]; + else combined += item; + ++icol; + } + columns = utils::strdup(combined); + // format = copy of default or user-specified line format delete[] format; diff --git a/src/dump_custom.h b/src/dump_custom.h index 5a99cca009..0dcfd82bba 100644 --- a/src/dump_custom.h +++ b/src/dump_custom.h @@ -60,6 +60,7 @@ class DumpCustom : public Dump { char **vformat; // format string for each vector element // char *columns; // column labels + char *columns_default; // int nchoose; // # of selected atoms int maxlocal; // size of atom selection and variable arrays diff --git a/src/thermo.cpp b/src/thermo.cpp index fe6f92d85d..a7d76017f8 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -631,8 +631,7 @@ void Thermo::modify_params(int narg, char **arg) } else if (strcmp(arg[iarg], "colname") == 0) { if (iarg + 2 > narg) error->all(FLERR, "Illegal thermo_modify command"); if (strcmp(arg[iarg + 1], "default") == 0) { - for (int i=0; i < nfield_initial + 1; ++i) - keyword_user[i].clear(); + for (auto item : keyword_user) item.clear(); iarg += 2; } else { if (iarg + 3 > narg) error->all(FLERR, "Illegal thermo_modify command"); @@ -660,7 +659,7 @@ void Thermo::modify_params(int narg, char **arg) format_int_user.clear(); format_bigint_user.clear(); format_float_user.clear(); - for (int i = 0; i < nfield_initial + 1; ++i) format_column_user[i].clear(); + for (auto item : format_column_user) item.clear(); iarg += 2; continue; } From 2f895d63a6e8f5b065a4b540e3c07fad868b982f Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 1 Apr 2022 12:32:24 -0600 Subject: [PATCH 27/57] Add missing variable assignment --- src/KOKKOS/pair_snap_kokkos_impl.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index 957ae953a7..6cf40b31a5 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -102,13 +102,15 @@ void PairSNAPKokkos::init_style() if (force->newton_pair == 0) error->all(FLERR,"Pair style SNAP requires newton pair on"); - // adjust neighbor list request for KOKKOS + // neighbor list request for KOKKOS + + neighflag = lmp->kokkos->neighflag; auto request = neighbor->add_request(this, NeighConst::REQ_FULL); request->set_kokkos_host(std::is_same::value && !std::is_same::value); request->set_kokkos_device(std::is_same::value); - if (lmp->kokkos->neighflag == FULL) + if (neighflag == FULL) error->all(FLERR,"Must use half neighbor list style with pair snap/kk"); } From ea9e3c08609c9468f38eac8ded2a1f86c62ed650 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 1 Apr 2022 12:45:38 -0600 Subject: [PATCH 28/57] Update fix ACKS2 docs --- doc/src/fix_acks2_reaxff.rst | 53 +++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/doc/src/fix_acks2_reaxff.rst b/doc/src/fix_acks2_reaxff.rst index b555f77a66..c8804497e7 100644 --- a/doc/src/fix_acks2_reaxff.rst +++ b/doc/src/fix_acks2_reaxff.rst @@ -19,6 +19,12 @@ Syntax * cutlo,cuthi = lo and hi cutoff for Taper radius * tolerance = precision to which charges will be equilibrated * params = reaxff or a filename +* one or more keywords or keyword/value pairs may be appended + + .. parsed-literal:: + + keyword = *maxiter* + *maxiter* N = limit the number of iterations to *N* Examples """""""" @@ -26,7 +32,7 @@ Examples .. code-block:: LAMMPS fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 reaxff - fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 param.acks2 + fix 1 all acks2/reaxff 1 0.0 10.0 1.0e-6 param.acks2 maxiter 500 Description """"""""""" @@ -44,14 +50,14 @@ the charge equilibration performed by fix acks2/reaxff, see the The ACKS2 method minimizes the electrostatic energy of the system by adjusting the partial charge on individual atoms based on interactions -with their neighbors. It requires some parameters for each atom type. +with their neighbors. It requires some parameters for each atom type. If the *params* setting above is the word "reaxff", then these are extracted from the :doc:`pair_style reaxff ` command and the ReaxFF force field file it reads in. If a file name is specified -for *params*\ , then the parameters are taken from the specified file -and the file must contain one line for each atom type. The latter form -must be used when performing QeQ with a non-ReaxFF potential. The lines -should be formatted as follows: +for *params*, then the parameters are taken from the specified file +and the file must contain one line for each atom type. The latter +form must be used when performing QeQ with a non-ReaxFF potential. +The lines should be formatted as follows: .. parsed-literal:: @@ -67,13 +73,25 @@ ReaxFF potential file, except that eta is defined here as twice the eta value in the ReaxFF file. Note that unlike the rest of LAMMPS, the units of this fix are hard-coded to be A, eV, and electronic charge. -**Restart, fix_modify, output, run start/stop, minimize info:** +The optional *maxiter* keyword allows changing the max number +of iterations in the linear solver. The default value is 200. + +.. note:: + + In order to solve the self-consistent equations for electronegativity + equalization, LAMMPS imposes the additional constraint that all the + charges in the fix group must add up to zero. The initial charge + assignments should also satisfy this constraint. LAMMPS will print a + warning if that is not the case. + +Restart, fix_modify, output, run start/stop, minimize info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" No information about this fix is written to :doc:`binary restart files -`. No global scalar or vector or per-atom quantities are -stored by this fix for access by various :doc:`output commands -`. No parameter of this fix can be used with the -*start/stop* keywords of the :doc:`run ` command. +`. This fix computes a global scalar (the number of +iterations) for access by various :doc:`output commands `. +No parameter of this fix can be used with the *start/stop* keywords of +the :doc:`run ` command. This fix is invoked during :doc:`energy minimization `. @@ -86,12 +104,12 @@ This fix is invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the REAXFF package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package -` doc page for more info. +This fix is part of the REAXFF package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. This fix does not correctly handle interactions involving multiple -periodic images of the same atom. Hence, it should not be used for +periodic images of the same atom. Hence, it should not be used for periodic cell dimensions less than 10 angstroms. This fix may be used in combination with :doc:`fix efield ` @@ -105,7 +123,10 @@ Related commands :doc:`pair_style reaxff `, :doc:`fix qeq/reaxff ` -**Default:** none +Default +""""""" + +maxiter 200 ---------- From dab640220cd7cad1b840c1da88ac9ef1e595c862 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 1 Apr 2022 12:48:58 -0600 Subject: [PATCH 29/57] Fix name to match code --- doc/src/package.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/src/package.rst b/doc/src/package.rst index a037c91999..0d13de9711 100644 --- a/doc/src/package.rst +++ b/doc/src/package.rst @@ -71,7 +71,7 @@ Syntax *no_affinity* values = none *kokkos* args = keyword value ... zero or more keyword/value pairs may be appended - keywords = *neigh* or *neigh/qeq* or *neigh/thread* or *newton* or *binsize* or *comm* or *comm/exchange* or *comm/forward* *pair/comm/forward* *fix/comm/forward* or *comm/reverse* or *gpu/aware* or *pair/only* + keywords = *neigh* or *neigh/qeq* or *neigh/thread* or *newton* or *binsize* or *comm* or *comm/exchange* or *comm/forward* *comm/pair/forward* *comm/fix/forward* or *comm/reverse* or *gpu/aware* or *pair/only* *neigh* value = *full* or *half* full = full neighbor list half = half neighbor list built in thread-safe manner @@ -90,11 +90,11 @@ Syntax *binsize* value = size size = bin size for neighbor list construction (distance units) *comm* value = *no* or *host* or *device* - use value for comm/exchange and comm/forward and pair/comm/forward and fix/comm/forward and comm/reverse + use value for comm/exchange and comm/forward and comm/pair/forward and comm/fix/forward and comm/reverse *comm/exchange* value = *no* or *host* or *device* *comm/forward* value = *no* or *host* or *device* - *pair/comm/forward* value = *no* or *device* - *fix/comm/forward* value = *no* or *device* + *comm/pair/forward* value = *no* or *device* + *comm/fix/forward* value = *no* or *device* *comm/reverse* value = *no* or *host* or *device* no = perform communication pack/unpack in non-KOKKOS mode host = perform pack/unpack on host (e.g. with OpenMP threading) @@ -498,8 +498,8 @@ because the GPU is faster at performing pairwise interactions, then this rule of thumb may give too large a binsize and the default should be overridden with a smaller value. -The *comm* and *comm/exchange* and *comm/forward* and *pair/comm/forward* -and *fix/comm/forward* and comm/reverse* +The *comm* and *comm/exchange* and *comm/forward* and *comm/pair/forward* +and *comm/fix/forward* and comm/reverse* keywords determine whether the host or device performs the packing and unpacking of data when communicating per-atom data between processors. "Exchange" communication happens only on timesteps that neighbor lists @@ -520,8 +520,8 @@ packing/unpacking data for the communication. A value of *host* means to use the host, typically a multi-core CPU, and perform the packing/unpacking in parallel with threads. A value of *device* means to use the device, typically a GPU, to perform the packing/unpacking -operation. If a value of *host* is used for the *pair/comm/forward* or -*fix/comm/forward* keyword, it will be automatically be changed to *no* +operation. If a value of *host* is used for the *comm/pair/forward* or +*comm/fix/forward* keyword, it will be automatically be changed to *no* since these keywords don't support *host* mode. The optimal choice for these keywords depends on the input script and From fb9316701ba972ebad2744ffd0bdc6f654cc940f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 1 Apr 2022 14:57:41 -0400 Subject: [PATCH 30/57] port colname changes to MPIIO package --- src/MPIIO/dump_atom_mpiio.cpp | 19 +++++++++++++++---- src/MPIIO/dump_custom_mpiio.cpp | 13 +++++++++++++ src/dump_atom.cpp | 1 + src/dump_custom.cpp | 2 +- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/MPIIO/dump_atom_mpiio.cpp b/src/MPIIO/dump_atom_mpiio.cpp index 9ba779924f..f8e29ba46e 100644 --- a/src/MPIIO/dump_atom_mpiio.cpp +++ b/src/MPIIO/dump_atom_mpiio.cpp @@ -234,14 +234,25 @@ void DumpAtomMPIIO::init_style() // setup column string + std::string default_columns; + if (scale_flag == 0 && image_flag == 0) - columns = (char *) "id type x y z"; + default_columns = "id type x y z"; else if (scale_flag == 0 && image_flag == 1) - columns = (char *) "id type x y z ix iy iz"; + default_columns = "id type x y z ix iy iz"; else if (scale_flag == 1 && image_flag == 0) - columns = (char *) "id type xs ys zs"; + default_columns = "id type xs ys zs"; else if (scale_flag == 1 && image_flag == 1) - columns = (char *) "id type xs ys zs ix iy iz"; + default_columns = "id type xs ys zs ix iy iz"; + + int icol = 0; + columns.clear(); + for (auto item : utils::split_words(default_columns)) { + if (columns.size()) columns += " "; + if (keyword_user[icol].size()) columns += keyword_user[icol]; + else columns += item; + ++icol; + } // setup function ptrs diff --git a/src/MPIIO/dump_custom_mpiio.cpp b/src/MPIIO/dump_custom_mpiio.cpp index 372b8705b9..196a2d0bb9 100644 --- a/src/MPIIO/dump_custom_mpiio.cpp +++ b/src/MPIIO/dump_custom_mpiio.cpp @@ -216,6 +216,19 @@ void DumpCustomMPIIO::write() void DumpCustomMPIIO::init_style() { + // assemble ITEMS: column string from defaults and user values + + delete[] columns; + std::string combined; + int icol = 0; + for (auto item : utils::split_words(columns_default)) { + if (combined.size()) combined += " "; + if (keyword_user[icol].size()) combined += keyword_user[icol]; + else combined += item; + ++icol; + } + columns = utils::strdup(combined); + // format = copy of default or user-specified line format delete[] format; diff --git a/src/dump_atom.cpp b/src/dump_atom.cpp index faad91f3c5..3662c01313 100644 --- a/src/dump_atom.cpp +++ b/src/dump_atom.cpp @@ -66,6 +66,7 @@ void DumpAtom::init_style() domain->boundary_string(boundstr); // setup column string + std::string default_columns; if (scale_flag == 0 && image_flag == 0) diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index b22e9d6eec..8232360d42 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -275,7 +275,7 @@ void DumpCustom::init_style() ++icol; } columns = utils::strdup(combined); - + // format = copy of default or user-specified line format delete[] format; From 49abd0d2691b272b12582881ff7e8acf3e96a6db Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 1 Apr 2022 15:17:10 -0400 Subject: [PATCH 31/57] update docs --- doc/src/dump_modify.rst | 32 ++++++++++++++++++++++++++++++-- doc/src/thermo_modify.rst | 14 +++++++------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 352f9c61bf..e81cc04531 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -26,6 +26,10 @@ Syntax N = index of frame written upon first dump *balance* arg = *yes* or *no* *buffer* arg = *yes* or *no* + *colname* values = ID string, or *default* + string = new column header name + ID = integer from 1 to N, or integer from -1 to -N, where N = # of quantities being output + *or* a thermo keyword or reference to compute, fix, property or variable. *delay* arg = Dstep Dstep = delay output until this timestep *element* args = E1 E2 ... EN, where N = # of atom types @@ -40,9 +44,10 @@ Syntax Np = write one file for every this many processors *first* arg = *yes* or *no* *flush* arg = *yes* or *no* - *format* args = *line* string, *int* string, *float* string, M string, or *none* + *format* args = *line* string, *int* string, *float* string, ID string, or *none* string = C-style format string - M = integer from 1 to N, where N = # of per-atom quantities being output + ID = integer from 1 to N, or integer from -1 to -N, where N = # of quantities being output + *or* a thermo keyword or reference to compute, fix, property or variable. *header* arg = *yes* or *no* *yes* to write the header *no* to not write the header @@ -375,6 +380,29 @@ performed with dump style *xtc*\ . ---------- +The *colname* keyword can be used to change the default header keyword +for dump styles: *atom*, *custom*, and *cfg* and their compressed and +MPIIO variants. The setting for *ID string* replaces the default text +with the provided string. *ID* can be a positive integer when it +represents the column number counting from the left, a negative integer +when it represents the column number from the right (i.e. -1 is the last +column/keyword), or a thermo keyword (or compute, fix, property, or +variable reference) and then it replaces the string for that specific +keyword. For *atom* dump styles only the keywords "id", "type", "x", +"y", "z", "ix", "iy", "iz" can be accessed via string regardless of +whether scaled or unwrapped coodinates were enabled or disabled, and +it always assumes 8 columns for indexing regardless of whether image +flags are enabled or not. For dump style *cfg* only the "auxiliary" +keywords (6th or later keyword) may be changed and the column indexing +considers only them (i.e. the 6th keyword is the the 1st column). + +The *colname* keyword can be used multiple times. If multiple *colname* +settings refer to the same keyword, the last setting has precedence. A +setting of *default* clears all previous settings, reverting all values +to their default names. + +---------- + The *format* keyword can be used to change the default numeric format output by the text-based dump styles: *atom*, *local*, *custom*, *cfg*, and *xyz* styles, and their MPIIO variants. Only the *line* or *none* diff --git a/doc/src/thermo_modify.rst b/doc/src/thermo_modify.rst index 9a5e739c0e..ffdbf020a1 100644 --- a/doc/src/thermo_modify.rst +++ b/doc/src/thermo_modify.rst @@ -157,15 +157,15 @@ The *colname* keyword can be used to change the default header keyword for a column or field of thermodynamic output. The setting for *ID string* replaces the default text with the provided string. *ID* can be a positive integer when it represents the column number counting from -the left, a negative integer when then it represents the column number -from the right (i.e. -1 is the last column/keyword), or a thermo keyword -(or compute, fix, property, or variable reference) and then it replaces -the string for that specific thermo keyword. +the left, a negative integer when it represents the column number from +the right (i.e. -1 is the last column/keyword), or a thermo keyword (or +compute, fix, property, or variable reference) and then it replaces the +string for that specific thermo keyword. The *colname* keyword can be used multiple times. If multiple *colname* -settings refer to the same keyword, the last setting has precedence. -the default setting is used. A setting of *default* clears all previous -settings, reverting all values to their default format. +settings refer to the same keyword, the last setting has precedence. A +setting of *default* clears all previous settings, reverting all values +to their default values. The *format* keyword can be used to change the default numeric format of any of quantities the :doc:`thermo_style ` command From 8e838c1424faaf158a09ad35b0369e68f1efc4a8 Mon Sep 17 00:00:00 2001 From: Sam Cameron Date: Sat, 2 Apr 2022 12:55:51 +0100 Subject: [PATCH 32/57] Bug fix in vtk dump. --- src/VTK/dump_vtk.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/VTK/dump_vtk.cpp b/src/VTK/dump_vtk.cpp index a7aabe3f51..d8ae9aefe2 100644 --- a/src/VTK/dump_vtk.cpp +++ b/src/VTK/dump_vtk.cpp @@ -1903,7 +1903,12 @@ void DumpVTK::identify_vectors() name.count(vector3_starts[v3s]+2) ) { std::string vectorName = name[vector3_starts[v3s]]; - vectorName.erase(vectorName.find_first_of('x')); + std::string::size_type erase_start = vectorName.find_first_of('x'); + if (erase_start == 0) { + vectorName.erase(0,1); + } else { + vectorName.erase(erase_start); + } name[vector3_starts[v3s]] = vectorName; vector_set.insert(vector3_starts[v3s]); } From 93c67a3c074eaaa70b6b92692cf3369f404fca4a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 2 Apr 2022 17:13:30 -0400 Subject: [PATCH 33/57] make compute msd (and msd/nongauss) error out immediately when used with a dynamic group --- doc/src/compute_msd.rst | 12 +++++++----- doc/src/compute_msd_nongauss.rst | 7 +++++-- src/compute_msd.cpp | 3 +++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/doc/src/compute_msd.rst b/doc/src/compute_msd.rst index 02b5550093..6e89cc59c1 100644 --- a/doc/src/compute_msd.rst +++ b/doc/src/compute_msd.rst @@ -75,10 +75,11 @@ solids undergoing thermal motion. .. note:: Initial coordinates are stored in "unwrapped" form, by using the - image flags associated with each atom. See the :doc:`dump custom ` command for a discussion of "unwrapped" coordinates. - See the Atoms section of the :doc:`read_data ` command for a - discussion of image flags and how they are set for each atom. You can - reset the image flags (e.g. to 0) before invoking this compute by + image flags associated with each atom. See the :doc:`dump custom + ` command for a discussion of "unwrapped" coordinates. See the + Atoms section of the :doc:`read_data ` command for a + discussion of image flags and how they are set for each atom. You + can reset the image flags (e.g. to 0) before invoking this compute by using the :doc:`set image ` command. .. note:: @@ -108,7 +109,8 @@ distance\^2 :doc:`units `. Restrictions """""""""""" - none + +Compute *msd* cannot be used with a dynamic group. Related commands """""""""""""""" diff --git a/doc/src/compute_msd_nongauss.rst b/doc/src/compute_msd_nongauss.rst index 70f4505d7f..1658d26f93 100644 --- a/doc/src/compute_msd_nongauss.rst +++ b/doc/src/compute_msd_nongauss.rst @@ -74,8 +74,11 @@ the third is dimensionless. Restrictions """""""""""" -This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +Compute *msd/nongauss* cannot be used with a dynamic group. + +This compute is part of the EXTRA-COMPUTE package. It is only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/src/compute_msd.cpp b/src/compute_msd.cpp index 229b965761..8370e9f833 100644 --- a/src/compute_msd.cpp +++ b/src/compute_msd.cpp @@ -58,6 +58,9 @@ ComputeMSD::ComputeMSD(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal compute msd command"); } + if (group->dynamic[igroup]) + error->all(FLERR, "Compute {} is not compatible with dynamic groups", style); + // create a new fix STORE style for reference positions // id = compute-ID + COMPUTE_STORE, fix group = compute group From 584b16682360d088f50ede69cbe38843d082ebe2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 2 Apr 2022 17:20:34 -0400 Subject: [PATCH 34/57] enable and apply clang-format --- src/EXTRA-COMPUTE/compute_msd_nongauss.cpp | 42 +++++----- src/compute_msd.cpp | 95 +++++++++++----------- 2 files changed, 69 insertions(+), 68 deletions(-) diff --git a/src/EXTRA-COMPUTE/compute_msd_nongauss.cpp b/src/EXTRA-COMPUTE/compute_msd_nongauss.cpp index 99c5cee715..0f68e03ca7 100644 --- a/src/EXTRA-COMPUTE/compute_msd_nongauss.cpp +++ b/src/EXTRA-COMPUTE/compute_msd_nongauss.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -19,17 +18,17 @@ #include "compute_msd_nongauss.h" #include "atom.h" -#include "update.h" -#include "group.h" #include "domain.h" #include "fix_store.h" +#include "group.h" +#include "update.h" using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ ComputeMSDNonGauss::ComputeMSDNonGauss(LAMMPS *lmp, int narg, char **arg) : - ComputeMSD(lmp, narg, arg) + ComputeMSD(lmp, narg, arg) { size_vector = 3; } @@ -43,8 +42,10 @@ void ComputeMSDNonGauss::compute_vector() // cm = current center of mass double cm[3]; - if (comflag) group->xcm(igroup,masstotal,cm); - else cm[0] = cm[1] = cm[2] = 0.0; + if (comflag) + group->xcm(igroup, masstotal, cm); + else + cm[0] = cm[1] = cm[2] = 0.0; // dx,dy,dz = displacement of atom from original position // original unwrapped position is stored by fix @@ -63,8 +64,8 @@ void ComputeMSDNonGauss::compute_vector() double yprd = domain->yprd; double zprd = domain->zprd; - double dx,dy,dz; - int xbox,ybox,zbox; + double dx, dy, dz; + int xbox, ybox, zbox; double msd[2]; msd[0] = msd[1] = 0.0; @@ -75,11 +76,11 @@ void ComputeMSDNonGauss::compute_vector() xbox = (image[i] & IMGMASK) - IMGMAX; ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX; zbox = (image[i] >> IMG2BITS) - IMGMAX; - dx = x[i][0] + xbox*xprd - cm[0] - xoriginal[i][0]; - dy = x[i][1] + ybox*yprd - cm[1] - xoriginal[i][1]; - dz = x[i][2] + zbox*zprd - cm[2] - xoriginal[i][2]; - msd[0] += dx*dx + dy*dy + dz*dz; - msd[1] += (dx*dx + dy*dy + dz*dz)*(dx*dx + dy*dy + dz*dz); + dx = x[i][0] + xbox * xprd - cm[0] - xoriginal[i][0]; + dy = x[i][1] + ybox * yprd - cm[1] - xoriginal[i][1]; + dz = x[i][2] + zbox * zprd - cm[2] - xoriginal[i][2]; + msd[0] += dx * dx + dy * dy + dz * dz; + msd[1] += (dx * dx + dy * dy + dz * dz) * (dx * dx + dy * dy + dz * dz); } } else { @@ -88,19 +89,18 @@ void ComputeMSDNonGauss::compute_vector() xbox = (image[i] & IMGMASK) - IMGMAX; ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX; zbox = (image[i] >> IMG2BITS) - IMGMAX; - dx = x[i][0] + h[0]*xbox + h[5]*ybox + h[4]*zbox - - cm[0] - xoriginal[i][0]; - dy = x[i][1] + h[1]*ybox + h[3]*zbox - cm[1] - xoriginal[i][1]; - dz = x[i][2] + h[2]*zbox - cm[2] - xoriginal[i][2]; - msd[0] += dx*dx + dy*dy + dz*dz; - msd[1] += (dx*dx + dy*dy + dz*dz)*(dx*dx + dy*dy + dz*dz); + dx = x[i][0] + h[0] * xbox + h[5] * ybox + h[4] * zbox - cm[0] - xoriginal[i][0]; + dy = x[i][1] + h[1] * ybox + h[3] * zbox - cm[1] - xoriginal[i][1]; + dz = x[i][2] + h[2] * zbox - cm[2] - xoriginal[i][2]; + msd[0] += dx * dx + dy * dy + dz * dz; + msd[1] += (dx * dx + dy * dy + dz * dz) * (dx * dx + dy * dy + dz * dz); } } - MPI_Allreduce(msd,vector,2,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(msd, vector, 2, MPI_DOUBLE, MPI_SUM, world); if (nmsd) { vector[0] /= nmsd; vector[1] /= nmsd; - vector[2] = (3*vector[1])/(5*vector[0]*vector[0]) - 1; + vector[2] = (3 * vector[1]) / (5 * vector[0] * vector[0]) - 1; } } diff --git a/src/compute_msd.cpp b/src/compute_msd.cpp index 8370e9f833..bff9dffd87 100644 --- a/src/compute_msd.cpp +++ b/src/compute_msd.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -28,11 +27,9 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -ComputeMSD::ComputeMSD(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), - id_fix(nullptr) +ComputeMSD::ComputeMSD(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg), id_fix(nullptr) { - if (narg < 3) error->all(FLERR,"Illegal compute msd command"); + if (narg < 3) error->all(FLERR, "Illegal compute msd command"); vector_flag = 1; size_vector = 4; @@ -47,15 +44,16 @@ ComputeMSD::ComputeMSD(LAMMPS *lmp, int narg, char **arg) : int iarg = 3; while (iarg < narg) { - if (strcmp(arg[iarg],"com") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal compute msd command"); - comflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + if (strcmp(arg[iarg], "com") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal compute msd command"); + comflag = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else if (strcmp(arg[iarg],"average") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal compute msd command"); - avflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + } else if (strcmp(arg[iarg], "average") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal compute msd command"); + avflag = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; - } else error->all(FLERR,"Illegal compute msd command"); + } else + error->all(FLERR, "Illegal compute msd command"); } if (group->dynamic[igroup]) @@ -65,13 +63,14 @@ ComputeMSD::ComputeMSD(LAMMPS *lmp, int narg, char **arg) : // id = compute-ID + COMPUTE_STORE, fix group = compute group id_fix = utils::strdup(id + std::string("_COMPUTE_STORE")); - fix = (FixStore *) modify->add_fix(fmt::format("{} {} STORE peratom 1 3", - id_fix, group->names[igroup])); + fix = (FixStore *) modify->add_fix( + fmt::format("{} {} STORE peratom 1 3", id_fix, group->names[igroup])); // calculate xu,yu,zu for fix store array // skip if reset from restart file - if (fix->restart_reset) fix->restart_reset = 0; + if (fix->restart_reset) + fix->restart_reset = 0; else { double **xoriginal = fix->astore; @@ -81,15 +80,17 @@ ComputeMSD::ComputeMSD(LAMMPS *lmp, int narg, char **arg) : int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) domain->unmap(x[i],image[i],xoriginal[i]); - else xoriginal[i][0] = xoriginal[i][1] = xoriginal[i][2] = 0.0; + if (mask[i] & groupbit) + domain->unmap(x[i], image[i], xoriginal[i]); + else + xoriginal[i][0] = xoriginal[i][1] = xoriginal[i][2] = 0.0; // adjust for COM if requested if (comflag) { double cm[3]; masstotal = group->mass(igroup); - group->xcm(igroup,masstotal,cm); + group->xcm(igroup, masstotal, cm); for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { xoriginal[i][0] -= cm[0]; @@ -127,7 +128,7 @@ void ComputeMSD::init() // set fix which stores reference atom coords fix = (FixStore *) modify->get_fix_by_id(id_fix); - if (!fix) error->all(FLERR,"Could not find compute msd fix with ID {}", id_fix); + if (!fix) error->all(FLERR, "Could not find compute msd fix with ID {}", id_fix); // nmsd = # of atoms in group @@ -144,8 +145,10 @@ void ComputeMSD::compute_vector() // cm = current center of mass double cm[3]; - if (comflag) group->xcm(igroup,masstotal,cm); - else cm[0] = cm[1] = cm[2] = 0.0; + if (comflag) + group->xcm(igroup, masstotal, cm); + else + cm[0] = cm[1] = cm[2] = 0.0; // dx,dy,dz = displacement of atom from reference position // reference unwrapped position is stored by fix @@ -164,8 +167,8 @@ void ComputeMSD::compute_vector() double yprd = domain->yprd; double zprd = domain->zprd; - double dx,dy,dz; - int xbox,ybox,zbox; + double dx, dy, dz; + int xbox, ybox, zbox; double msd[4]; msd[0] = msd[1] = msd[2] = msd[3] = 0.0; @@ -177,36 +180,34 @@ void ComputeMSD::compute_vector() double navfac; if (avflag) { naverage++; - navfac = 1.0/(naverage+1); + navfac = 1.0 / (naverage + 1); } - if (domain->triclinic == 0) { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { xbox = (image[i] & IMGMASK) - IMGMAX; ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX; zbox = (image[i] >> IMG2BITS) - IMGMAX; - xtmp = x[i][0] + xbox*xprd - cm[0]; - ytmp = x[i][1] + ybox*yprd - cm[1]; - ztmp = x[i][2] + zbox*zprd - cm[2]; + xtmp = x[i][0] + xbox * xprd - cm[0]; + ytmp = x[i][1] + ybox * yprd - cm[1]; + ztmp = x[i][2] + zbox * zprd - cm[2]; // use running average position for reference if requested if (avflag) { - xoriginal[i][0] = (xoriginal[i][0]*naverage + xtmp)*navfac; - xoriginal[i][1] = (xoriginal[i][1]*naverage + ytmp)*navfac; - xoriginal[i][2] = (xoriginal[i][2]*naverage + ztmp)*navfac; + xoriginal[i][0] = (xoriginal[i][0] * naverage + xtmp) * navfac; + xoriginal[i][1] = (xoriginal[i][1] * naverage + ytmp) * navfac; + xoriginal[i][2] = (xoriginal[i][2] * naverage + ztmp) * navfac; } dx = xtmp - xoriginal[i][0]; dy = ytmp - xoriginal[i][1]; dz = ztmp - xoriginal[i][2]; - msd[0] += dx*dx; - msd[1] += dy*dy; - msd[2] += dz*dz; - msd[3] += dx*dx + dy*dy + dz*dz; - + msd[0] += dx * dx; + msd[1] += dy * dy; + msd[2] += dz * dz; + msd[3] += dx * dx + dy * dy + dz * dz; } } else { for (int i = 0; i < nlocal; i++) @@ -214,29 +215,29 @@ void ComputeMSD::compute_vector() xbox = (image[i] & IMGMASK) - IMGMAX; ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX; zbox = (image[i] >> IMG2BITS) - IMGMAX; - xtmp = x[i][0] + h[0]*xbox + h[5]*ybox + h[4]*zbox - cm[0]; - ytmp = x[i][1] + h[1]*ybox + h[3]*zbox - cm[1]; - ztmp = x[i][2] + h[2]*zbox - cm[2]; + xtmp = x[i][0] + h[0] * xbox + h[5] * ybox + h[4] * zbox - cm[0]; + ytmp = x[i][1] + h[1] * ybox + h[3] * zbox - cm[1]; + ztmp = x[i][2] + h[2] * zbox - cm[2]; // use running average position for reference if requested if (avflag) { - xoriginal[i][0] = (xoriginal[i][0]*naverage + xtmp)*navfac; - xoriginal[i][1] = (xoriginal[i][0]*naverage + xtmp)*navfac; - xoriginal[i][2] = (xoriginal[i][0]*naverage + xtmp)*navfac; + xoriginal[i][0] = (xoriginal[i][0] * naverage + xtmp) * navfac; + xoriginal[i][1] = (xoriginal[i][0] * naverage + xtmp) * navfac; + xoriginal[i][2] = (xoriginal[i][0] * naverage + xtmp) * navfac; } dx = xtmp - xoriginal[i][0]; dy = ytmp - xoriginal[i][1]; dz = ztmp - xoriginal[i][2]; - msd[0] += dx*dx; - msd[1] += dy*dy; - msd[2] += dz*dz; - msd[3] += dx*dx + dy*dy + dz*dz; + msd[0] += dx * dx; + msd[1] += dy * dy; + msd[2] += dz * dz; + msd[3] += dx * dx + dy * dy + dz * dz; } } - MPI_Allreduce(msd,vector,4,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(msd, vector, 4, MPI_DOUBLE, MPI_SUM, world); if (nmsd) { vector[0] /= nmsd; vector[1] /= nmsd; From c9d0889f25b891f08de43e12bc71897e8beb59fc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 2 Apr 2022 18:34:17 -0400 Subject: [PATCH 35/57] add "transrot" style to fix move that allows to do translation and rotation at the same time --- doc/src/fix_move.rst | 84 +++-- src/fix_move.cpp | 852 +++++++++++++++++++++++++++++-------------- 2 files changed, 632 insertions(+), 304 deletions(-) diff --git a/doc/src/fix_move.rst b/doc/src/fix_move.rst index 5d3a9de47f..ff1f8403df 100644 --- a/doc/src/fix_move.rst +++ b/doc/src/fix_move.rst @@ -12,7 +12,7 @@ Syntax * ID, group-ID are documented in :doc:`fix ` command * move = style name of this fix command -* style = *linear* or *wiggle* or *rotate* or *variable* +* style = *linear* or *wiggle* or *rotate* or *transrot* or *variable* .. parsed-literal:: @@ -25,6 +25,11 @@ Syntax Px,Py,Pz = origin point of axis of rotation (distance units) Rx,Ry,Rz = axis of rotation vector period = period of rotation (time units) + *transrot* args = Vx Vy Vz Px Py Pz Rx Ry Rz period + Vx,Vy,Vz = components of velocity vector (velocity units) + Px,Py,Pz = origin point of axis of rotation (distance units) + Rx,Ry,Rz = axis of rotation vector + period = period of rotation (time units) *variable* args = v_dx v_dy v_dz v_vx v_vy v_vz v_dx,v_dy,v_dz = 3 variable names that calculate x,y,z displacement as function of time, any component can be specified as NULL v_vx,v_vy,v_vz = 3 variable names that calculate x,y,z velocity as function of time, any component can be specified as NULL @@ -44,6 +49,7 @@ Examples fix 1 boundary move wiggle 3.0 0.0 0.0 1.0 units box fix 2 boundary move rotate 0.0 0.0 0.0 0.0 0.0 1.0 5.0 fix 2 boundary move variable v_myx v_myy NULL v_VX v_VY NULL + fix 3 boundary move transrot 0.1 0.1 0.0 0.0 0.0 0.0 0.0 0.0 1.0 5.0 units box Description """"""""""" @@ -55,15 +61,17 @@ whose movement can influence nearby atoms. .. note:: - The atoms affected by this fix should not normally be time - integrated by other fixes (e.g. :doc:`fix nve `, :doc:`fix nvt `), since that will change their positions and - velocities twice. + The atoms affected by this fix should not normally be time integrated + by other fixes (e.g. :doc:`fix nve `, :doc:`fix nvt + `), since that will change their positions and velocities + twice. .. note:: As atoms move due to this fix, they will pass through periodic boundaries and be remapped to the other side of the simulation box, - just as they would during normal time integration (e.g. via the :doc:`fix nve ` command). It is up to you to decide whether + just as they would during normal time integration (e.g. via the + :doc:`fix nve ` command). It is up to you to decide whether periodic boundaries are appropriate with the kind of atom motion you are prescribing with this fix. @@ -73,11 +81,11 @@ whose movement can influence nearby atoms. position at the time the fix is specified. These initial coordinates are stored by the fix in "unwrapped" form, by using the image flags associated with each atom. See the :doc:`dump custom ` command - for a discussion of "unwrapped" coordinates. See the Atoms section of - the :doc:`read_data ` command for a discussion of image flags - and how they are set for each atom. You can reset the image flags - (e.g. to 0) before invoking this fix by using the :doc:`set image ` - command. + for a discussion of "unwrapped" coordinates. See the Atoms section + of the :doc:`read_data ` command for a discussion of image + flags and how they are set for each atom. You can reset the image + flags (e.g. to 0) before invoking this fix by using the :doc:`set + image ` command. ---------- @@ -118,13 +126,13 @@ notation as where *X0* = (x0,y0,z0) is their position at the time the fix is specified, *A* is the specified amplitude vector with components -(Ax,Ay,Az), *omega* is 2 PI / *period*, and *delta* is the time -elapsed since the fix was specified. This style also sets the -velocity of each atom to the time derivative of this expression. If -any of the amplitude components is specified as NULL, then the -position and velocity of that component is time integrated the same as -the :doc:`fix nve ` command would perform, using the -corresponding force component on the atom. +(Ax,Ay,Az), *omega* is 2 PI / *period*, and *delta* is the time elapsed +since the fix was specified. This style also sets the velocity of each +atom to the time derivative of this expression. If any of the amplitude +components is specified as NULL, then the position and velocity of that +component is time integrated the same as the :doc:`fix nve ` +command would perform, using the corresponding force component on the +atom. Note that the *wiggle* style is identical to using the *variable* style with :doc:`equal-style variables ` that use the @@ -139,21 +147,29 @@ swiggle() and cwiggle() functions. E.g. variable v equal v_omega*($A-cwiggle(0.0,$A,$T)) fix 1 boundary move variable v_x NULL NULL v_v NULL NULL -The *rotate* style rotates atoms around a rotation axis *R* = -(Rx,Ry,Rz) that goes through a point *P* = (Px,Py,Pz). The *period* of -the rotation is also specified. The direction of rotation for the -atoms around the rotation axis is consistent with the right-hand rule: -if your right-hand thumb points along *R*, then your fingers wrap -around the axis in the direction of rotation. +The *rotate* style rotates atoms around a rotation axis *R* = (Rx,Ry,Rz) +that goes through a point *P* = (Px,Py,Pz). The *period* of the +rotation is also specified. The direction of rotation for the atoms +around the rotation axis is consistent with the right-hand rule: if your +right-hand thumb points along *R*, then your fingers wrap around the +axis in the direction of rotation. This style also sets the velocity of each atom to (omega cross Rperp) where omega is its angular velocity around the rotation axis and Rperp is a perpendicular vector from the rotation axis to the atom. If the defined :doc:`atom_style ` assigns an angular velocity or -angular momentum or orientation to each atom (:doc:`atom styles ` sphere, ellipsoid, line, tri, body), then +angular momentum or orientation to each atom (:doc:`atom styles +` sphere, ellipsoid, line, tri, body), then those properties are also updated appropriately to correspond to the atom's motion and rotation over time. +The *transrot* style combines the effects of *rotate* and *linear* so +that it is possible to prescribe a rotating group of atoms that also +moves at a constant velocity. The arguments are for the translation +first and then for the rotation. Since the rotation affects all +coordinate components, it is not possible to set any of the +translation vector components to NULL. + The *variable* style allows the position and velocity components of each atom to be set by formulas specified via the :doc:`variable ` command. Each of the 6 variables is @@ -165,10 +181,10 @@ Each variable must be of either the *equal* or *atom* style. a function of the timestep as well as of other simulation values. *Atom*\ -style variables compute a numeric quantity for each atom, that can be a function per-atom quantities, such as the atom's position, as -well as of the timestep and other simulation values. Note that this -fix stores the original coordinates of each atom (see note below) so -that per-atom quantity can be used in an atom-style variable formula. -See the :doc:`variable ` command for details. +well as of the timestep and other simulation values. Note that this fix +stores the original coordinates of each atom (see note below) so that +per-atom quantity can be used in an atom-style variable formula. See +the :doc:`variable ` command for details. The first 3 variables (v_dx,v_dy,v_dz) specified for the *variable* style are used to calculate a displacement from the atom's original @@ -206,8 +222,9 @@ spacings can be different in x,y,z. Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -This fix writes the original coordinates of moving atoms to :doc:`binary restart files `, as well as the initial timestep, so that -the motion can be continuous in a restarted simulation. See the +This fix writes the original coordinates of moving atoms to :doc:`binary +restart files `, as well as the initial timestep, so that the +motion can be continuous in a restarted simulation. See the :doc:`read_restart ` command for info on how to re-specify a fix in an input script that reads a restart file, so that the operation of the fix continues in an uninterrupted fashion. @@ -224,11 +241,12 @@ fix. This fix produces a per-atom array which can be accessed by various :doc:`output commands `. The number of columns for each -atom is 3, and the columns store the original unwrapped x,y,z coords -of each atom. The per-atom values can be accessed on any timestep. +atom is 3, and the columns store the original unwrapped x,y,z coords of +each atom. The per-atom values can be accessed on any timestep. No parameter of this fix can be used with the *start/stop* keywords of -the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +the :doc:`run ` command. This fix is not invoked during +:doc:`energy minimization `. For :doc:`rRESPA time integration `, this fix adjusts the position and velocity of atoms on the outermost rRESPA level. diff --git a/src/fix_move.cpp b/src/fix_move.cpp index f7bc4d3640..756292d06b 100644 --- a/src/fix_move.cpp +++ b/src/fix_move.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -40,21 +39,19 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; -enum{LINEAR,WIGGLE,ROTATE,VARIABLE}; -enum{EQUAL,ATOM}; +enum { LINEAR, WIGGLE, ROTATE, VARIABLE, TRANSROT }; +enum { EQUAL, ATOM }; -#define INERTIA 0.2 // moment of inertia prefactor for ellipsoid +#define INERTIA 0.2 // moment of inertia prefactor for ellipsoid /* ---------------------------------------------------------------------- */ FixMove::FixMove(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - xvarstr(nullptr), yvarstr(nullptr), zvarstr(nullptr), vxvarstr(nullptr), - vyvarstr(nullptr), vzvarstr(nullptr), - xoriginal(nullptr), toriginal(nullptr), qoriginal(nullptr), - displace(nullptr), velocity(nullptr) + Fix(lmp, narg, arg), xvarstr(nullptr), yvarstr(nullptr), zvarstr(nullptr), vxvarstr(nullptr), + vyvarstr(nullptr), vzvarstr(nullptr), xoriginal(nullptr), toriginal(nullptr), + qoriginal(nullptr), displace(nullptr), velocity(nullptr) { - if (narg < 4) error->all(FLERR,"Illegal fix move command"); + if (narg < 4) error->all(FLERR, "Illegal fix move command"); restart_global = 1; restart_peratom = 1; @@ -71,125 +68,162 @@ FixMove::FixMove(LAMMPS *lmp, int narg, char **arg) : int iarg = 0; - if (strcmp(arg[3],"linear") == 0) { - if (narg < 7) error->all(FLERR,"Illegal fix move command"); + if (strcmp(arg[3], "linear") == 0) { + if (narg < 7) error->all(FLERR, "Illegal fix move command"); iarg = 7; mstyle = LINEAR; - if (strcmp(arg[4],"NULL") == 0) vxflag = 0; + if (strcmp(arg[4], "NULL") == 0) + vxflag = 0; else { vxflag = 1; - vx = utils::numeric(FLERR,arg[4],false,lmp); + vx = utils::numeric(FLERR, arg[4], false, lmp); } - if (strcmp(arg[5],"NULL") == 0) vyflag = 0; + if (strcmp(arg[5], "NULL") == 0) + vyflag = 0; else { vyflag = 1; - vy = utils::numeric(FLERR,arg[5],false,lmp); + vy = utils::numeric(FLERR, arg[5], false, lmp); } - if (strcmp(arg[6],"NULL") == 0) vzflag = 0; + if (strcmp(arg[6], "NULL") == 0) + vzflag = 0; else { vzflag = 1; - vz = utils::numeric(FLERR,arg[6],false,lmp); + vz = utils::numeric(FLERR, arg[6], false, lmp); } - } else if (strcmp(arg[3],"wiggle") == 0) { - if (narg < 8) error->all(FLERR,"Illegal fix move command"); + } else if (strcmp(arg[3], "wiggle") == 0) { + if (narg < 8) error->all(FLERR, "Illegal fix move command"); iarg = 8; mstyle = WIGGLE; - if (strcmp(arg[4],"NULL") == 0) axflag = 0; + if (strcmp(arg[4], "NULL") == 0) + axflag = 0; else { axflag = 1; - ax = utils::numeric(FLERR,arg[4],false,lmp); + ax = utils::numeric(FLERR, arg[4], false, lmp); } - if (strcmp(arg[5],"NULL") == 0) ayflag = 0; + if (strcmp(arg[5], "NULL") == 0) + ayflag = 0; else { ayflag = 1; - ay = utils::numeric(FLERR,arg[5],false,lmp); + ay = utils::numeric(FLERR, arg[5], false, lmp); } - if (strcmp(arg[6],"NULL") == 0) azflag = 0; + if (strcmp(arg[6], "NULL") == 0) + azflag = 0; else { azflag = 1; - az = utils::numeric(FLERR,arg[6],false,lmp); + az = utils::numeric(FLERR, arg[6], false, lmp); } - period = utils::numeric(FLERR,arg[7],false,lmp); - if (period <= 0.0) error->all(FLERR,"Illegal fix move command"); + period = utils::numeric(FLERR, arg[7], false, lmp); + if (period <= 0.0) error->all(FLERR, "Illegal fix move command"); - } else if (strcmp(arg[3],"rotate") == 0) { - if (narg < 11) error->all(FLERR,"Illegal fix move command"); + } else if (strcmp(arg[3], "rotate") == 0) { + if (narg < 11) error->all(FLERR, "Illegal fix move command"); iarg = 11; mstyle = ROTATE; - point[0] = utils::numeric(FLERR,arg[4],false,lmp); - point[1] = utils::numeric(FLERR,arg[5],false,lmp); - point[2] = utils::numeric(FLERR,arg[6],false,lmp); - axis[0] = utils::numeric(FLERR,arg[7],false,lmp); - axis[1] = utils::numeric(FLERR,arg[8],false,lmp); - axis[2] = utils::numeric(FLERR,arg[9],false,lmp); - period = utils::numeric(FLERR,arg[10],false,lmp); - if (period <= 0.0) error->all(FLERR,"Illegal fix move command"); + point[0] = utils::numeric(FLERR, arg[4], false, lmp); + point[1] = utils::numeric(FLERR, arg[5], false, lmp); + point[2] = utils::numeric(FLERR, arg[6], false, lmp); + axis[0] = utils::numeric(FLERR, arg[7], false, lmp); + axis[1] = utils::numeric(FLERR, arg[8], false, lmp); + axis[2] = utils::numeric(FLERR, arg[9], false, lmp); + period = utils::numeric(FLERR, arg[10], false, lmp); + if (period <= 0.0) error->all(FLERR, "Illegal fix move command"); - } else if (strcmp(arg[3],"variable") == 0) { - if (narg < 10) error->all(FLERR,"Illegal fix move command"); + } else if (strcmp(arg[3], "transrot") == 0) { + if (narg < 11) error->all(FLERR, "Illegal fix move command"); + iarg = 14; + mstyle = TRANSROT; + vxflag = vyflag = vzflag = 1; + vx = utils::numeric(FLERR, arg[4], false, lmp); + vy = utils::numeric(FLERR, arg[5], false, lmp); + vz = utils::numeric(FLERR, arg[6], false, lmp); + point[0] = utils::numeric(FLERR, arg[7], false, lmp); + point[1] = utils::numeric(FLERR, arg[8], false, lmp); + point[2] = utils::numeric(FLERR, arg[9], false, lmp); + axis[0] = utils::numeric(FLERR, arg[10], false, lmp); + axis[1] = utils::numeric(FLERR, arg[11], false, lmp); + axis[2] = utils::numeric(FLERR, arg[12], false, lmp); + period = utils::numeric(FLERR, arg[13], false, lmp); + if (period <= 0.0) error->all(FLERR, "Illegal fix move command"); + + } else if (strcmp(arg[3], "variable") == 0) { + if (narg < 10) error->all(FLERR, "Illegal fix move command"); iarg = 10; mstyle = VARIABLE; - if (strcmp(arg[4],"NULL") == 0) xvarstr = nullptr; - else if (utils::strmatch(arg[4],"^v_")) { - xvarstr = utils::strdup(arg[4]+2); - } else error->all(FLERR,"Illegal fix move command"); - if (strcmp(arg[5],"NULL") == 0) yvarstr = nullptr; - else if (utils::strmatch(arg[5],"^v_")) { - yvarstr = utils::strdup(arg[5]+2); - } else error->all(FLERR,"Illegal fix move command"); - if (strcmp(arg[6],"NULL") == 0) zvarstr = nullptr; - else if (utils::strmatch(arg[6],"^v_")) { - zvarstr = utils::strdup(arg[6]+2); - } else error->all(FLERR,"Illegal fix move command"); - if (strcmp(arg[7],"NULL") == 0) vxvarstr = nullptr; - else if (utils::strmatch(arg[7],"^v_")) { - vxvarstr = utils::strdup(arg[7]+2); - } else error->all(FLERR,"Illegal fix move command"); - if (strcmp(arg[8],"NULL") == 0) vyvarstr = nullptr; - else if (utils::strmatch(arg[8],"^v_")) { - vyvarstr = utils::strdup(arg[8]+2); - } else error->all(FLERR,"Illegal fix move command"); - if (strcmp(arg[9],"NULL") == 0) vzvarstr = nullptr; - else if (utils::strmatch(arg[9],"^v_")) { - vzvarstr = utils::strdup(arg[9]+2); - } else error->all(FLERR,"Illegal fix move command"); + if (strcmp(arg[4], "NULL") == 0) + xvarstr = nullptr; + else if (utils::strmatch(arg[4], "^v_")) { + xvarstr = utils::strdup(arg[4] + 2); + } else + error->all(FLERR, "Illegal fix move command"); + if (strcmp(arg[5], "NULL") == 0) + yvarstr = nullptr; + else if (utils::strmatch(arg[5], "^v_")) { + yvarstr = utils::strdup(arg[5] + 2); + } else + error->all(FLERR, "Illegal fix move command"); + if (strcmp(arg[6], "NULL") == 0) + zvarstr = nullptr; + else if (utils::strmatch(arg[6], "^v_")) { + zvarstr = utils::strdup(arg[6] + 2); + } else + error->all(FLERR, "Illegal fix move command"); + if (strcmp(arg[7], "NULL") == 0) + vxvarstr = nullptr; + else if (utils::strmatch(arg[7], "^v_")) { + vxvarstr = utils::strdup(arg[7] + 2); + } else + error->all(FLERR, "Illegal fix move command"); + if (strcmp(arg[8], "NULL") == 0) + vyvarstr = nullptr; + else if (utils::strmatch(arg[8], "^v_")) { + vyvarstr = utils::strdup(arg[8] + 2); + } else + error->all(FLERR, "Illegal fix move command"); + if (strcmp(arg[9], "NULL") == 0) + vzvarstr = nullptr; + else if (utils::strmatch(arg[9], "^v_")) { + vzvarstr = utils::strdup(arg[9] + 2); + } else + error->all(FLERR, "Illegal fix move command"); - } else error->all(FLERR,"Illegal fix move command"); + } else + error->all(FLERR, "Illegal fix move command"); // optional args int scaleflag = 1; while (iarg < narg) { - if (strcmp(arg[iarg],"units") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix move command"); - if (strcmp(arg[iarg+1],"box") == 0) scaleflag = 0; - else if (strcmp(arg[iarg+1],"lattice") == 0) scaleflag = 1; - else error->all(FLERR,"Illegal fix move command"); + if (strcmp(arg[iarg], "units") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix move command"); + if (strcmp(arg[iarg + 1], "box") == 0) + scaleflag = 0; + else if (strcmp(arg[iarg + 1], "lattice") == 0) + scaleflag = 1; + else + error->all(FLERR, "Illegal fix move command"); iarg += 2; - } else error->all(FLERR,"Illegal fix move command"); + } else + error->all(FLERR, "Illegal fix move command"); } // error checks and warnings if (domain->dimension == 2) { - if (mstyle == LINEAR && vzflag && vz != 0.0) - error->all(FLERR,"Fix move cannot set linear z motion for 2d problem"); + if (((mstyle == LINEAR) || (mstyle == TRANSROT)) && vzflag && (vz != 0.0)) + error->all(FLERR, "Fix move cannot set linear z motion for 2d problem"); if (mstyle == WIGGLE && azflag && az != 0.0) - error->all(FLERR,"Fix move cannot set wiggle z motion for 2d problem"); - if (mstyle == ROTATE && (axis[0] != 0.0 || axis[1] != 0.0)) - error->all(FLERR, - "Fix move cannot rotate around non z-axis for 2d problem"); + error->all(FLERR, "Fix move cannot set wiggle z motion for 2d problem"); + if (((mstyle == ROTATE) || (mstyle == TRANSROT)) && (axis[0] != 0.0 || axis[1] != 0.0)) + error->all(FLERR, "Fix move cannot rotate around non z-axis for 2d problem"); if (mstyle == VARIABLE && (zvarstr || vzvarstr)) - error->all(FLERR, - "Fix move cannot define z or vz variable for 2d problem"); + error->all(FLERR, "Fix move cannot define z or vz variable for 2d problem"); } // setup scaling and apply scaling factors to velocity & amplitude - if ((mstyle == LINEAR || mstyle == WIGGLE || mstyle == ROTATE) && - scaleflag) { + if ((mstyle != VARIABLE) && scaleflag) { double xscale = domain->lattice->xlattice; double yscale = domain->lattice->ylattice; double zscale = domain->lattice->zlattice; @@ -206,22 +240,29 @@ FixMove::FixMove(LAMMPS *lmp, int narg, char **arg) : point[0] *= xscale; point[1] *= yscale; point[2] *= zscale; + } else if (mstyle == TRANSROT) { + vx *= xscale; + vy *= yscale; + vz *= zscale; + point[0] *= xscale; + point[1] *= yscale; + point[2] *= zscale; } } // set omega_rotate from period - if (mstyle == WIGGLE || mstyle == ROTATE) omega_rotate = MY_2PI / period; + if ((mstyle == WIGGLE) || (mstyle == ROTATE) || (mstyle == TRANSROT)) + omega_rotate = MY_2PI / period; // runit = unit vector along rotation axis - if (mstyle == ROTATE) { - double len = sqrt(axis[0]*axis[0] + axis[1]*axis[1] + axis[2]*axis[2]); - if (len == 0.0) - error->all(FLERR,"Zero length rotation vector with fix move"); - runit[0] = axis[0]/len; - runit[1] = axis[1]/len; - runit[2] = axis[2]/len; + if ((mstyle == ROTATE) || (mstyle == TRANSROT)) { + double len = sqrt(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]); + if (len == 0.0) error->all(FLERR, "Zero length rotation vector with fix move"); + runit[0] = axis[0] / len; + runit[1] = axis[1] / len; + runit[2] = axis[2] / len; } // set flags for extra attributes particles may store @@ -273,15 +314,18 @@ FixMove::FixMove(LAMMPS *lmp, int narg, char **arg) : int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) domain->unmap(x[i],image[i],xoriginal[i]); - else xoriginal[i][0] = xoriginal[i][1] = xoriginal[i][2] = 0.0; + if (mask[i] & groupbit) + domain->unmap(x[i], image[i], xoriginal[i]); + else + xoriginal[i][0] = xoriginal[i][1] = xoriginal[i][2] = 0.0; } if (theta_flag) { for (int i = 0; i < nlocal; i++) { if ((mask[i] & groupbit) && line[i] >= 0) toriginal[i] = avec_line->bonus[line[i]].theta; - else toriginal[i] = 0.0; + else + toriginal[i] = 0.0; } } @@ -302,8 +346,8 @@ FixMove::FixMove(LAMMPS *lmp, int narg, char **arg) : qoriginal[i][1] = quat[1]; qoriginal[i][2] = quat[2]; qoriginal[i][3] = quat[3]; - } else qoriginal[i][0] = qoriginal[i][1] = - qoriginal[i][2] = qoriginal[i][3] = 0.0; + } else + qoriginal[i][0] = qoriginal[i][1] = qoriginal[i][2] = qoriginal[i][3] = 0.0; } } @@ -325,8 +369,8 @@ FixMove::~FixMove() { // unregister callbacks to this fix from Atom class - atom->delete_callback(id,Atom::GROW); - atom->delete_callback(id,Atom::RESTART); + atom->delete_callback(id, Atom::GROW); + atom->delete_callback(id, Atom::RESTART); // delete locally stored arrays @@ -336,12 +380,12 @@ FixMove::~FixMove() memory->destroy(displace); memory->destroy(velocity); - delete [] xvarstr; - delete [] yvarstr; - delete [] zvarstr; - delete [] vxvarstr; - delete [] vyvarstr; - delete [] vzvarstr; + delete[] xvarstr; + delete[] yvarstr; + delete[] zvarstr; + delete[] vxvarstr; + delete[] vyvarstr; + delete[] vzvarstr; } /* ---------------------------------------------------------------------- */ @@ -371,51 +415,63 @@ void FixMove::init() if (mstyle == VARIABLE) { if (xvarstr) { xvar = input->variable->find(xvarstr); - if (xvar < 0) error->all(FLERR, - "Variable name for fix move does not exist"); - if (input->variable->equalstyle(xvar)) xvarstyle = EQUAL; - else if (input->variable->atomstyle(xvar)) xvarstyle = ATOM; - else error->all(FLERR,"Variable for fix move is invalid style"); + if (xvar < 0) error->all(FLERR, "Variable name for fix move does not exist"); + if (input->variable->equalstyle(xvar)) + xvarstyle = EQUAL; + else if (input->variable->atomstyle(xvar)) + xvarstyle = ATOM; + else + error->all(FLERR, "Variable for fix move is invalid style"); } if (yvarstr) { yvar = input->variable->find(yvarstr); - if (yvar < 0) error->all(FLERR, - "Variable name for fix move does not exist"); - if (input->variable->equalstyle(yvar)) yvarstyle = EQUAL; - else if (input->variable->atomstyle(yvar)) yvarstyle = ATOM; - else error->all(FLERR,"Variable for fix move is invalid style"); + if (yvar < 0) error->all(FLERR, "Variable name for fix move does not exist"); + if (input->variable->equalstyle(yvar)) + yvarstyle = EQUAL; + else if (input->variable->atomstyle(yvar)) + yvarstyle = ATOM; + else + error->all(FLERR, "Variable for fix move is invalid style"); } if (zvarstr) { zvar = input->variable->find(zvarstr); - if (zvar < 0) error->all(FLERR, - "Variable name for fix move does not exist"); - if (input->variable->equalstyle(zvar)) zvarstyle = EQUAL; - else if (input->variable->atomstyle(zvar)) zvarstyle = ATOM; - else error->all(FLERR,"Variable for fix move is invalid style"); + if (zvar < 0) error->all(FLERR, "Variable name for fix move does not exist"); + if (input->variable->equalstyle(zvar)) + zvarstyle = EQUAL; + else if (input->variable->atomstyle(zvar)) + zvarstyle = ATOM; + else + error->all(FLERR, "Variable for fix move is invalid style"); } if (vxvarstr) { vxvar = input->variable->find(vxvarstr); - if (vxvar < 0) error->all(FLERR, - "Variable name for fix move does not exist"); - if (input->variable->equalstyle(vxvar)) vxvarstyle = EQUAL; - else if (input->variable->atomstyle(vxvar)) vxvarstyle = ATOM; - else error->all(FLERR,"Variable for fix move is invalid style"); + if (vxvar < 0) error->all(FLERR, "Variable name for fix move does not exist"); + if (input->variable->equalstyle(vxvar)) + vxvarstyle = EQUAL; + else if (input->variable->atomstyle(vxvar)) + vxvarstyle = ATOM; + else + error->all(FLERR, "Variable for fix move is invalid style"); } if (vyvarstr) { vyvar = input->variable->find(vyvarstr); - if (vyvar < 0) error->all(FLERR, - "Variable name for fix move does not exist"); - if (input->variable->equalstyle(vyvar)) vyvarstyle = EQUAL; - else if (input->variable->atomstyle(vyvar)) vyvarstyle = ATOM; - else error->all(FLERR,"Variable for fix move is invalid style"); + if (vyvar < 0) error->all(FLERR, "Variable name for fix move does not exist"); + if (input->variable->equalstyle(vyvar)) + vyvarstyle = EQUAL; + else if (input->variable->atomstyle(vyvar)) + vyvarstyle = ATOM; + else + error->all(FLERR, "Variable for fix move is invalid style"); } if (vzvarstr) { vzvar = input->variable->find(vzvarstr); - if (vzvar < 0) error->all(FLERR, - "Variable name for fix move does not exist"); - if (input->variable->equalstyle(vzvar)) vzvarstyle = EQUAL; - else if (input->variable->atomstyle(vzvar)) vzvarstyle = ATOM; - else error->all(FLERR,"Variable for fix move is invalid style"); + if (vzvar < 0) error->all(FLERR, "Variable name for fix move does not exist"); + if (input->variable->equalstyle(vzvar)) + vzvarstyle = EQUAL; + else if (input->variable->atomstyle(vzvar)) + vzvarstyle = ATOM; + else + error->all(FLERR, "Variable for fix move is invalid style"); } if (xvarstr && xvarstyle == ATOM) displaceflag = 1; @@ -429,12 +485,16 @@ void FixMove::init() maxatom = atom->nmax; memory->destroy(displace); memory->destroy(velocity); - if (displaceflag) memory->create(displace,maxatom,3,"move:displace"); - else displace = nullptr; - if (velocityflag) memory->create(velocity,maxatom,3,"move:velocity"); - else velocity = nullptr; + if (displaceflag) + memory->create(displace, maxatom, 3, "move:displace"); + else + displace = nullptr; + if (velocityflag) + memory->create(velocity, maxatom, 3, "move:velocity"); + else + velocity = nullptr; - if (utils::strmatch(update->integrate_style,"^respa")) + if (utils::strmatch(update->integrate_style, "^respa")) nlevels_respa = ((Respa *) update->integrate)->nlevels; } @@ -445,11 +505,11 @@ void FixMove::init() void FixMove::initial_integrate(int /*vflag*/) { int flag; - double ddotr,dx,dy,dz; - double dtfm,theta_new; - double xold[3],a[3],b[3],c[3],d[3],disp[3],w[3],ex[3],ey[3],ez[3]; - double inertia_ellipsoid[3],qrotate[4]; - double *quat,*inertia,*shape; + double ddotr, dx, dy, dz; + double dtfm, theta_new; + double xold[3], a[3], b[3], c[3], d[3], disp[3], w[3], ex[3], ey[3], ez[3]; + double inertia_ellipsoid[3], qrotate[4]; + double *quat, *inertia, *shape; double delta = (update->ntimestep - time_origin) * dt; @@ -481,7 +541,7 @@ void FixMove::initial_integrate(int /*vflag*/) if (vxflag) { v[i][0] = vx; - x[i][0] = xoriginal[i][0] + vx*delta; + x[i][0] = xoriginal[i][0] + vx * delta; } else if (rmass) { dtfm = dtf / rmass[i]; v[i][0] += dtfm * f[i][0]; @@ -494,7 +554,7 @@ void FixMove::initial_integrate(int /*vflag*/) if (vyflag) { v[i][1] = vy; - x[i][1] = xoriginal[i][1] + vy*delta; + x[i][1] = xoriginal[i][1] + vy * delta; } else if (rmass) { dtfm = dtf / rmass[i]; v[i][1] += dtfm * f[i][1]; @@ -507,7 +567,7 @@ void FixMove::initial_integrate(int /*vflag*/) if (vzflag) { v[i][2] = vz; - x[i][2] = xoriginal[i][2] + vz*delta; + x[i][2] = xoriginal[i][2] + vz * delta; } else if (rmass) { dtfm = dtf / rmass[i]; v[i][2] += dtfm * f[i][2]; @@ -518,7 +578,7 @@ void FixMove::initial_integrate(int /*vflag*/) x[i][2] += dtv * v[i][2]; } - domain->remap_near(x[i],xold); + domain->remap_near(x[i], xold); } } @@ -536,8 +596,8 @@ void FixMove::initial_integrate(int /*vflag*/) xold[2] = x[i][2]; if (axflag) { - v[i][0] = ax*omega_rotate*cosine; - x[i][0] = xoriginal[i][0] + ax*sine; + v[i][0] = ax * omega_rotate * cosine; + x[i][0] = xoriginal[i][0] + ax * sine; } else if (rmass) { dtfm = dtf / rmass[i]; v[i][0] += dtfm * f[i][0]; @@ -549,8 +609,8 @@ void FixMove::initial_integrate(int /*vflag*/) } if (ayflag) { - v[i][1] = ay*omega_rotate*cosine; - x[i][1] = xoriginal[i][1] + ay*sine; + v[i][1] = ay * omega_rotate * cosine; + x[i][1] = xoriginal[i][1] + ay * sine; } else if (rmass) { dtfm = dtf / rmass[i]; v[i][1] += dtfm * f[i][1]; @@ -562,8 +622,8 @@ void FixMove::initial_integrate(int /*vflag*/) } if (azflag) { - v[i][2] = az*omega_rotate*cosine; - x[i][2] = xoriginal[i][2] + az*sine; + v[i][2] = az * omega_rotate * cosine; + x[i][2] = xoriginal[i][2] + az * sine; } else if (rmass) { dtfm = dtf / rmass[i]; v[i][2] += dtfm * f[i][2]; @@ -574,7 +634,7 @@ void FixMove::initial_integrate(int /*vflag*/) x[i][2] += dtv * v[i][2]; } - domain->remap_near(x[i],xold); + domain->remap_near(x[i], xold); } } @@ -597,12 +657,12 @@ void FixMove::initial_integrate(int /*vflag*/) double cosine = cos(arg); double sine = sin(arg); - double qcosine = cos(0.5*arg); - double qsine = sin(0.5*arg); + double qcosine = cos(0.5 * arg); + double qsine = sin(0.5 * arg); qrotate[0] = qcosine; - qrotate[1] = runit[0]*qsine; - qrotate[2] = runit[1]*qsine; - qrotate[3] = runit[2]*qsine; + qrotate[1] = runit[0] * qsine; + qrotate[2] = runit[1] * qsine; + qrotate[3] = runit[2] * qsine; for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { @@ -613,26 +673,26 @@ void FixMove::initial_integrate(int /*vflag*/) d[0] = xoriginal[i][0] - point[0]; d[1] = xoriginal[i][1] - point[1]; d[2] = xoriginal[i][2] - point[2]; - ddotr = d[0]*runit[0] + d[1]*runit[1] + d[2]*runit[2]; - c[0] = ddotr*runit[0]; - c[1] = ddotr*runit[1]; - c[2] = ddotr*runit[2]; + ddotr = d[0] * runit[0] + d[1] * runit[1] + d[2] * runit[2]; + c[0] = ddotr * runit[0]; + c[1] = ddotr * runit[1]; + c[2] = ddotr * runit[2]; a[0] = d[0] - c[0]; a[1] = d[1] - c[1]; a[2] = d[2] - c[2]; - b[0] = runit[1]*a[2] - runit[2]*a[1]; - b[1] = runit[2]*a[0] - runit[0]*a[2]; - b[2] = runit[0]*a[1] - runit[1]*a[0]; - disp[0] = a[0]*cosine + b[0]*sine; - disp[1] = a[1]*cosine + b[1]*sine; - disp[2] = a[2]*cosine + b[2]*sine; + b[0] = runit[1] * a[2] - runit[2] * a[1]; + b[1] = runit[2] * a[0] - runit[0] * a[2]; + b[2] = runit[0] * a[1] - runit[1] * a[0]; + disp[0] = a[0] * cosine + b[0] * sine; + disp[1] = a[1] * cosine + b[1] * sine; + disp[2] = a[2] * cosine + b[2] * sine; x[i][0] = point[0] + c[0] + disp[0]; x[i][1] = point[1] + c[1] + disp[1]; x[i][2] = point[2] + c[2] + disp[2]; - v[i][0] = omega_rotate * (runit[1]*disp[2] - runit[2]*disp[1]); - v[i][1] = omega_rotate * (runit[2]*disp[0] - runit[0]*disp[2]); - v[i][2] = omega_rotate * (runit[0]*disp[1] - runit[1]*disp[0]); + v[i][0] = omega_rotate * (runit[1] * disp[2] - runit[2] * disp[1]); + v[i][1] = omega_rotate * (runit[2] * disp[0] - runit[0] * disp[2]); + v[i][2] = omega_rotate * (runit[0] * disp[1] - runit[1] * disp[0]); // set any extra attributes affected by rotation @@ -646,9 +706,9 @@ void FixMove::initial_integrate(int /*vflag*/) if (line_flag && line[i] >= 0.0) flag = 1; if (tri_flag && tri[i] >= 0.0) flag = 1; if (flag) { - omega[i][0] = omega_rotate*runit[0]; - omega[i][1] = omega_rotate*runit[1]; - omega[i][2] = omega_rotate*runit[2]; + omega[i][0] = omega_rotate * runit[0]; + omega[i][1] = omega_rotate * runit[1]; + omega[i][2] = omega_rotate * runit[2]; } } @@ -660,11 +720,11 @@ void FixMove::initial_integrate(int /*vflag*/) quat = avec_ellipsoid->bonus[ellipsoid[i]].quat; shape = avec_ellipsoid->bonus[ellipsoid[i]].shape; inertia_ellipsoid[0] = - INERTIA*rmass[i] * (shape[1]*shape[1]+shape[2]*shape[2]); + INERTIA * rmass[i] * (shape[1] * shape[1] + shape[2] * shape[2]); inertia_ellipsoid[1] = - INERTIA*rmass[i] * (shape[0]*shape[0]+shape[2]*shape[2]); + INERTIA * rmass[i] * (shape[0] * shape[0] + shape[2] * shape[2]); inertia_ellipsoid[2] = - INERTIA*rmass[i] * (shape[0]*shape[0]+shape[1]*shape[1]); + INERTIA * rmass[i] * (shape[0] * shape[0] + shape[1] * shape[1]); inertia = inertia_ellipsoid; } else if (tri_flag && tri[i] >= 0) { quat = avec_tri->bonus[tri[i]].quat; @@ -674,18 +734,18 @@ void FixMove::initial_integrate(int /*vflag*/) inertia = avec_body->bonus[body[i]].inertia; } if (quat) { - w[0] = omega_rotate*runit[0]; - w[1] = omega_rotate*runit[1]; - w[2] = omega_rotate*runit[2]; - MathExtra::q_to_exyz(quat,ex,ey,ez); - MathExtra::omega_to_angmom(w,ex,ey,ez,inertia,angmom[i]); + w[0] = omega_rotate * runit[0]; + w[1] = omega_rotate * runit[1]; + w[2] = omega_rotate * runit[2]; + MathExtra::q_to_exyz(quat, ex, ey, ez); + MathExtra::omega_to_angmom(w, ex, ey, ez, inertia, angmom[i]); } } // theta for lines if (theta_flag && line[i] >= 0.0) { - theta_new = fmod(toriginal[i]+arg,MY_2PI); + theta_new = fmod(toriginal[i] + arg, MY_2PI); avec_line->bonus[atom->line[i]].theta = theta_new; } @@ -699,11 +759,149 @@ void FixMove::initial_integrate(int /*vflag*/) quat = avec_tri->bonus[tri[i]].quat; else if (body_flag && body[i] >= 0) quat = avec_body->bonus[body[i]].quat; - if (quat) MathExtra::quatquat(qrotate,qoriginal[i],quat); + if (quat) MathExtra::quatquat(qrotate, qoriginal[i], quat); } } - domain->remap_near(x[i],xold); + domain->remap_near(x[i], xold); + } + } + + // for rotate by right-hand rule around omega: + // P = point = vector = point of rotation + // R = vector = axis of rotation + // w = omega of rotation (from period) + // X0 = xoriginal = initial coord of atom + // R0 = runit = unit vector for R + // D = X0 - P = vector from P to X0 + // C = (D dot R0) R0 = projection of atom coord onto R line + // A = D - C = vector from R line to X0 + // B = R0 cross A = vector perp to A in plane of rotation + // A,B define plane of circular rotation around R line + // X = P + C + A cos(w*dt) + B sin(w*dt) + // V = w R0 cross (A cos(w*dt) + B sin(w*dt)) + // + // add translation after rotation + + } else if (mstyle == TRANSROT) { + double arg = omega_rotate * delta; + double cosine = cos(arg); + double sine = sin(arg); + + double qcosine = cos(0.5 * arg); + double qsine = sin(0.5 * arg); + qrotate[0] = qcosine; + qrotate[1] = runit[0] * qsine; + qrotate[2] = runit[1] * qsine; + qrotate[3] = runit[2] * qsine; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + xold[0] = x[i][0]; + xold[1] = x[i][1]; + xold[2] = x[i][2]; + + d[0] = xoriginal[i][0] - point[0]; + d[1] = xoriginal[i][1] - point[1]; + d[2] = xoriginal[i][2] - point[2]; + ddotr = d[0] * runit[0] + d[1] * runit[1] + d[2] * runit[2]; + c[0] = ddotr * runit[0]; + c[1] = ddotr * runit[1]; + c[2] = ddotr * runit[2]; + a[0] = d[0] - c[0]; + a[1] = d[1] - c[1]; + a[2] = d[2] - c[2]; + b[0] = runit[1] * a[2] - runit[2] * a[1]; + b[1] = runit[2] * a[0] - runit[0] * a[2]; + b[2] = runit[0] * a[1] - runit[1] * a[0]; + disp[0] = a[0] * cosine + b[0] * sine; + disp[1] = a[1] * cosine + b[1] * sine; + disp[2] = a[2] * cosine + b[2] * sine; + + x[i][0] = point[0] + c[0] + disp[0]; + x[i][1] = point[1] + c[1] + disp[1]; + x[i][2] = point[2] + c[2] + disp[2]; + v[i][0] = omega_rotate * (runit[1] * disp[2] - runit[2] * disp[1]); + v[i][1] = omega_rotate * (runit[2] * disp[0] - runit[0] * disp[2]); + v[i][2] = omega_rotate * (runit[0] * disp[1] - runit[1] * disp[0]); + + // set any extra attributes affected by rotation + + if (extra_flag) { + + // omega for spheres, lines, tris + + if (omega_flag) { + flag = 0; + if (radius_flag && radius[i] > 0.0) flag = 1; + if (line_flag && line[i] >= 0.0) flag = 1; + if (tri_flag && tri[i] >= 0.0) flag = 1; + if (flag) { + omega[i][0] = omega_rotate * runit[0]; + omega[i][1] = omega_rotate * runit[1]; + omega[i][2] = omega_rotate * runit[2]; + } + } + + // angmom for ellipsoids, tris, and bodies + + if (angmom_flag) { + quat = inertia = nullptr; + if (ellipsoid_flag && ellipsoid[i] >= 0) { + quat = avec_ellipsoid->bonus[ellipsoid[i]].quat; + shape = avec_ellipsoid->bonus[ellipsoid[i]].shape; + inertia_ellipsoid[0] = + INERTIA * rmass[i] * (shape[1] * shape[1] + shape[2] * shape[2]); + inertia_ellipsoid[1] = + INERTIA * rmass[i] * (shape[0] * shape[0] + shape[2] * shape[2]); + inertia_ellipsoid[2] = + INERTIA * rmass[i] * (shape[0] * shape[0] + shape[1] * shape[1]); + inertia = inertia_ellipsoid; + } else if (tri_flag && tri[i] >= 0) { + quat = avec_tri->bonus[tri[i]].quat; + inertia = avec_tri->bonus[tri[i]].inertia; + } else if (body_flag && body[i] >= 0) { + quat = avec_body->bonus[body[i]].quat; + inertia = avec_body->bonus[body[i]].inertia; + } + if (quat) { + w[0] = omega_rotate * runit[0]; + w[1] = omega_rotate * runit[1]; + w[2] = omega_rotate * runit[2]; + MathExtra::q_to_exyz(quat, ex, ey, ez); + MathExtra::omega_to_angmom(w, ex, ey, ez, inertia, angmom[i]); + } + } + + // theta for lines + + if (theta_flag && line[i] >= 0.0) { + theta_new = fmod(toriginal[i] + arg, MY_2PI); + avec_line->bonus[atom->line[i]].theta = theta_new; + } + + // quats for ellipsoids, tris, and bodies + + if (quat_flag) { + quat = nullptr; + if (ellipsoid_flag && ellipsoid[i] >= 0) + quat = avec_ellipsoid->bonus[ellipsoid[i]].quat; + else if (tri_flag && tri[i] >= 0) + quat = avec_tri->bonus[tri[i]].quat; + else if (body_flag && body[i] >= 0) + quat = avec_body->bonus[body[i]].quat; + if (quat) MathExtra::quatquat(qrotate, qoriginal[i], quat); + } + } + + v[i][0] += vx; + x[i][0] += vx * delta; + v[i][1] += vy; + x[i][1] += vy * delta; + v[i][2] += vz; + x[i][2] += vz * delta; + + domain->remap_near(x[i], xold); } } @@ -720,11 +918,11 @@ void FixMove::initial_integrate(int /*vflag*/) maxatom = atom->nmax; if (displaceflag) { memory->destroy(displace); - memory->create(displace,maxatom,3,"move:displace"); + memory->create(displace, maxatom, 3, "move:displace"); } if (velocityflag) { memory->destroy(velocity); - memory->create(velocity,maxatom,3,"move:velocity"); + memory->create(velocity, maxatom, 3, "move:velocity"); } } @@ -733,28 +931,40 @@ void FixMove::initial_integrate(int /*vflag*/) modify->clearstep_compute(); if (xvarstr) { - if (xvarstyle == EQUAL) dx = input->variable->compute_equal(xvar); - else input->variable->compute_atom(xvar,igroup,&displace[0][0],3,0); + if (xvarstyle == EQUAL) + dx = input->variable->compute_equal(xvar); + else + input->variable->compute_atom(xvar, igroup, &displace[0][0], 3, 0); } if (yvarstr) { - if (yvarstyle == EQUAL) dy = input->variable->compute_equal(yvar); - else input->variable->compute_atom(yvar,igroup,&displace[0][1],3,0); + if (yvarstyle == EQUAL) + dy = input->variable->compute_equal(yvar); + else + input->variable->compute_atom(yvar, igroup, &displace[0][1], 3, 0); } if (zvarstr) { - if (zvarstyle == EQUAL) dz = input->variable->compute_equal(zvar); - else input->variable->compute_atom(zvar,igroup,&displace[0][2],3,0); + if (zvarstyle == EQUAL) + dz = input->variable->compute_equal(zvar); + else + input->variable->compute_atom(zvar, igroup, &displace[0][2], 3, 0); } if (vxvarstr) { - if (vxvarstyle == EQUAL) vx = input->variable->compute_equal(vxvar); - else input->variable->compute_atom(vxvar,igroup,&velocity[0][0],3,0); + if (vxvarstyle == EQUAL) + vx = input->variable->compute_equal(vxvar); + else + input->variable->compute_atom(vxvar, igroup, &velocity[0][0], 3, 0); } if (vyvarstr) { - if (vyvarstyle == EQUAL) vy = input->variable->compute_equal(vyvar); - else input->variable->compute_atom(vyvar,igroup,&velocity[0][1],3,0); + if (vyvarstyle == EQUAL) + vy = input->variable->compute_equal(vyvar); + else + input->variable->compute_atom(vyvar, igroup, &velocity[0][1], 3, 0); } if (vzvarstr) { - if (vzvarstyle == EQUAL) vz = input->variable->compute_equal(vzvar); - else input->variable->compute_atom(vzvar,igroup,&velocity[0][2],3,0); + if (vzvarstyle == EQUAL) + vz = input->variable->compute_equal(vzvar); + else + input->variable->compute_atom(vzvar, igroup, &velocity[0][2], 3, 0); } modify->addstep_compute(update->ntimestep + 1); @@ -768,16 +978,24 @@ void FixMove::initial_integrate(int /*vflag*/) xold[2] = x[i][2]; if (xvarstr && vxvarstr) { - if (vxvarstyle == EQUAL) v[i][0] = vx; - else v[i][0] = velocity[i][0]; - if (xvarstyle == EQUAL) x[i][0] = xoriginal[i][0] + dx; - else x[i][0] = xoriginal[i][0] + displace[i][0]; + if (vxvarstyle == EQUAL) + v[i][0] = vx; + else + v[i][0] = velocity[i][0]; + if (xvarstyle == EQUAL) + x[i][0] = xoriginal[i][0] + dx; + else + x[i][0] = xoriginal[i][0] + displace[i][0]; } else if (xvarstr) { - if (xvarstyle == EQUAL) x[i][0] = xoriginal[i][0] + dx; - else x[i][0] = xoriginal[i][0] + displace[i][0]; + if (xvarstyle == EQUAL) + x[i][0] = xoriginal[i][0] + dx; + else + x[i][0] = xoriginal[i][0] + displace[i][0]; } else if (vxvarstr) { - if (vxvarstyle == EQUAL) v[i][0] = vx; - else v[i][0] = velocity[i][0]; + if (vxvarstyle == EQUAL) + v[i][0] = vx; + else + v[i][0] = velocity[i][0]; x[i][0] += dtv * v[i][0]; } else { if (rmass) { @@ -791,16 +1009,24 @@ void FixMove::initial_integrate(int /*vflag*/) } if (yvarstr && vyvarstr) { - if (vyvarstyle == EQUAL) v[i][1] = vy; - else v[i][1] = velocity[i][1]; - if (yvarstyle == EQUAL) x[i][1] = xoriginal[i][1] + dy; - else x[i][1] = xoriginal[i][1] + displace[i][1]; + if (vyvarstyle == EQUAL) + v[i][1] = vy; + else + v[i][1] = velocity[i][1]; + if (yvarstyle == EQUAL) + x[i][1] = xoriginal[i][1] + dy; + else + x[i][1] = xoriginal[i][1] + displace[i][1]; } else if (yvarstr) { - if (yvarstyle == EQUAL) x[i][1] = xoriginal[i][1] + dy; - else x[i][1] = xoriginal[i][1] + displace[i][1]; + if (yvarstyle == EQUAL) + x[i][1] = xoriginal[i][1] + dy; + else + x[i][1] = xoriginal[i][1] + displace[i][1]; } else if (vyvarstr) { - if (vyvarstyle == EQUAL) v[i][1] = vy; - else v[i][1] = velocity[i][1]; + if (vyvarstyle == EQUAL) + v[i][1] = vy; + else + v[i][1] = velocity[i][1]; x[i][1] += dtv * v[i][1]; } else { if (rmass) { @@ -814,16 +1040,24 @@ void FixMove::initial_integrate(int /*vflag*/) } if (zvarstr && vzvarstr) { - if (vzvarstyle == EQUAL) v[i][2] = vz; - else v[i][2] = velocity[i][2]; - if (zvarstyle == EQUAL) x[i][2] = xoriginal[i][2] + dz; - else x[i][2] = xoriginal[i][2] + displace[i][2]; + if (vzvarstyle == EQUAL) + v[i][2] = vz; + else + v[i][2] = velocity[i][2]; + if (zvarstyle == EQUAL) + x[i][2] = xoriginal[i][2] + dz; + else + x[i][2] = xoriginal[i][2] + displace[i][2]; } else if (zvarstr) { - if (zvarstyle == EQUAL) x[i][2] = xoriginal[i][2] + dz; - else x[i][2] = xoriginal[i][2] + displace[i][2]; + if (zvarstyle == EQUAL) + x[i][2] = xoriginal[i][2] + dz; + else + x[i][2] = xoriginal[i][2] + displace[i][2]; } else if (vzvarstr) { - if (vzvarstyle == EQUAL) v[i][2] = vz; - else v[i][2] = velocity[i][2]; + if (vzvarstyle == EQUAL) + v[i][2] = vz; + else + v[i][2] = velocity[i][2]; x[i][2] += dtv * v[i][2]; } else { if (rmass) { @@ -836,7 +1070,7 @@ void FixMove::initial_integrate(int /*vflag*/) x[i][2] += dtv * v[i][2]; } - domain->remap_near(x[i],xold); + domain->remap_near(x[i], xold); } } } @@ -851,22 +1085,40 @@ void FixMove::final_integrate() double dtfm; int xflag = 1; - if (mstyle == LINEAR && vxflag) xflag = 0; - else if (mstyle == WIGGLE && axflag) xflag = 0; - else if (mstyle == ROTATE) xflag = 0; - else if (mstyle == VARIABLE && (xvarstr || vxvarstr)) xflag = 0; + if (mstyle == LINEAR && vxflag) + xflag = 0; + else if (mstyle == WIGGLE && axflag) + xflag = 0; + else if (mstyle == ROTATE) + xflag = 0; + else if (mstyle == TRANSROT) + xflag = 0; + else if (mstyle == VARIABLE && (xvarstr || vxvarstr)) + xflag = 0; int yflag = 1; - if (mstyle == LINEAR && vyflag) yflag = 0; - else if (mstyle == WIGGLE && ayflag) yflag = 0; - else if (mstyle == ROTATE) yflag = 0; - else if (mstyle == VARIABLE && (yvarstr || vyvarstr)) yflag = 0; + if (mstyle == LINEAR && vyflag) + yflag = 0; + else if (mstyle == WIGGLE && ayflag) + yflag = 0; + else if (mstyle == ROTATE) + yflag = 0; + else if (mstyle == TRANSROT) + yflag = 0; + else if (mstyle == VARIABLE && (yvarstr || vyvarstr)) + yflag = 0; int zflag = 1; - if (mstyle == LINEAR && vzflag) zflag = 0; - else if (mstyle == WIGGLE && azflag) zflag = 0; - else if (mstyle == ROTATE) zflag = 0; - else if (mstyle == VARIABLE && (zvarstr || vzvarstr)) zflag = 0; + if (mstyle == LINEAR && vzflag) + zflag = 0; + else if (mstyle == WIGGLE && azflag) + zflag = 0; + else if (mstyle == ROTATE) + zflag = 0; + else if (mstyle == TRANSROT) + zflag = 0; + else if (mstyle == VARIABLE && (zvarstr || vzvarstr)) + zflag = 0; double **v = atom->v; double **f = atom->f; @@ -918,14 +1170,14 @@ void FixMove::initial_integrate_respa(int vflag, int ilevel, int /*iloop*/) // outermost level - update v and x // all other levels - nothing - if (ilevel == nlevels_respa-1) initial_integrate(vflag); + if (ilevel == nlevels_respa - 1) initial_integrate(vflag); } /* ---------------------------------------------------------------------- */ void FixMove::final_integrate_respa(int ilevel, int /*iloop*/) { - if (ilevel == nlevels_respa-1) final_integrate(); + if (ilevel == nlevels_respa - 1) final_integrate(); } /* ---------------------------------------------------------------------- @@ -934,11 +1186,11 @@ void FixMove::final_integrate_respa(int ilevel, int /*iloop*/) double FixMove::memory_usage() { - double bytes = (double)atom->nmax*3 * sizeof(double); - if (theta_flag) bytes += (double)atom->nmax * sizeof(double); - if (quat_flag) bytes += (double)atom->nmax*4 * sizeof(double); - if (displaceflag) bytes += (double)atom->nmax*3 * sizeof(double); - if (velocityflag) bytes += (double)atom->nmax*3 * sizeof(double); + double bytes = (double) atom->nmax * 3 * sizeof(double); + if (theta_flag) bytes += (double) atom->nmax * sizeof(double); + if (quat_flag) bytes += (double) atom->nmax * 4 * sizeof(double); + if (displaceflag) bytes += (double) atom->nmax * 3 * sizeof(double); + if (velocityflag) bytes += (double) atom->nmax * 3 * sizeof(double); return bytes; } @@ -954,8 +1206,8 @@ void FixMove::write_restart(FILE *fp) if (comm->me == 0) { int size = n * sizeof(double); - fwrite(&size,sizeof(int),1,fp); - fwrite(list,sizeof(double),n,fp); + fwrite(&size, sizeof(int), 1, fp); + fwrite(list, sizeof(double), n, fp); } } @@ -968,7 +1220,7 @@ void FixMove::restart(char *buf) int n = 0; double *list = (double *) buf; - time_origin = static_cast (list[n++]); + time_origin = static_cast(list[n++]); } /* ---------------------------------------------------------------------- @@ -977,9 +1229,9 @@ void FixMove::restart(char *buf) void FixMove::grow_arrays(int nmax) { - memory->grow(xoriginal,nmax,3,"move:xoriginal"); - if (theta_flag) memory->grow(toriginal,nmax,"move:toriginal"); - if (quat_flag) memory->grow(qoriginal,nmax,4,"move:qoriginal"); + memory->grow(xoriginal, nmax, 3, "move:xoriginal"); + if (theta_flag) memory->grow(toriginal, nmax, "move:toriginal"); + if (quat_flag) memory->grow(qoriginal, nmax, 4, "move:qoriginal"); array_atom = xoriginal; } @@ -1028,50 +1280,51 @@ void FixMove::set_arrays(int i) // current time still equal fix creation time if (update->ntimestep == time_origin) { - domain->unmap(x[i],image[i],xoriginal[i]); + domain->unmap(x[i], image[i], xoriginal[i]); return; } // backup particle to time_origin - if (mstyle == VARIABLE) - error->all(FLERR,"Cannot add atoms to fix move variable"); + if (mstyle == VARIABLE) error->all(FLERR, "Cannot add atoms to fix move variable"); - domain->unmap(x[i],image[i],xoriginal[i]); + domain->unmap(x[i], image[i], xoriginal[i]); double delta = (update->ntimestep - time_origin) * update->dt; if (mstyle == LINEAR) { if (vxflag) xoriginal[i][0] -= vx * delta; if (vyflag) xoriginal[i][1] -= vy * delta; if (vzflag) xoriginal[i][2] -= vz * delta; + } else if (mstyle == WIGGLE) { double arg = omega_rotate * delta; double sine = sin(arg); - if (axflag) xoriginal[i][0] -= ax*sine; - if (ayflag) xoriginal[i][1] -= ay*sine; - if (azflag) xoriginal[i][2] -= az*sine; + if (axflag) xoriginal[i][0] -= ax * sine; + if (ayflag) xoriginal[i][1] -= ay * sine; + if (azflag) xoriginal[i][2] -= az * sine; + } else if (mstyle == ROTATE) { - double a[3],b[3],c[3],d[3],disp[3],ddotr; - double arg = - omega_rotate * delta; + double a[3], b[3], c[3], d[3], disp[3], ddotr; + double arg = -omega_rotate * delta; double sine = sin(arg); double cosine = cos(arg); d[0] = x[i][0] - point[0]; d[1] = x[i][1] - point[1]; d[2] = x[i][2] - point[2]; - ddotr = d[0]*runit[0] + d[1]*runit[1] + d[2]*runit[2]; - c[0] = ddotr*runit[0]; - c[1] = ddotr*runit[1]; - c[2] = ddotr*runit[2]; + ddotr = d[0] * runit[0] + d[1] * runit[1] + d[2] * runit[2]; + c[0] = ddotr * runit[0]; + c[1] = ddotr * runit[1]; + c[2] = ddotr * runit[2]; a[0] = d[0] - c[0]; a[1] = d[1] - c[1]; a[2] = d[2] - c[2]; - b[0] = runit[1]*a[2] - runit[2]*a[1]; - b[1] = runit[2]*a[0] - runit[0]*a[2]; - b[2] = runit[0]*a[1] - runit[1]*a[0]; - disp[0] = a[0]*cosine + b[0]*sine; - disp[1] = a[1]*cosine + b[1]*sine; - disp[2] = a[2]*cosine + b[2]*sine; + b[0] = runit[1] * a[2] - runit[2] * a[1]; + b[1] = runit[2] * a[0] - runit[0] * a[2]; + b[2] = runit[0] * a[1] - runit[1] * a[0]; + disp[0] = a[0] * cosine + b[0] * sine; + disp[1] = a[1] * cosine + b[1] * sine; + disp[2] = a[2] * cosine + b[2] * sine; xoriginal[i][0] = point[0] + c[0] + disp[0]; xoriginal[i][1] = point[1] + c[1] + disp[1]; @@ -1085,7 +1338,64 @@ void FixMove::set_arrays(int i) if (theta_flag && line[i] >= 0.0) { theta = avec_line->bonus[atom->line[i]].theta; - toriginal[i] = theta - 0.0; // NOTE: edit this line + toriginal[i] = theta - 0.0; // NOTE: edit this line + } + + // quats for ellipsoids, tris, and bodies + + if (quat_flag) { + quat = nullptr; + if (ellipsoid_flag && ellipsoid[i] >= 0) + quat = avec_ellipsoid->bonus[ellipsoid[i]].quat; + else if (tri_flag && tri[i] >= 0) + quat = avec_tri->bonus[tri[i]].quat; + else if (body_flag && body[i] >= 0) + quat = avec_body->bonus[body[i]].quat; + if (quat) { + // qoriginal = f(quat,-delta); // NOTE: edit this line + } + } + } + xoriginal[i][0] -= vx * delta; + xoriginal[i][1] -= vy * delta; + xoriginal[i][2] -= vz * delta; + + } else if (mstyle == TRANSROT) { + double a[3], b[3], c[3], d[3], disp[3], ddotr; + double arg = -omega_rotate * delta; + double sine = sin(arg); + double cosine = cos(arg); + d[0] = x[i][0] - point[0]; + d[1] = x[i][1] - point[1]; + d[2] = x[i][2] - point[2]; + ddotr = d[0] * runit[0] + d[1] * runit[1] + d[2] * runit[2]; + c[0] = ddotr * runit[0]; + c[1] = ddotr * runit[1]; + c[2] = ddotr * runit[2]; + + a[0] = d[0] - c[0]; + a[1] = d[1] - c[1]; + a[2] = d[2] - c[2]; + b[0] = runit[1] * a[2] - runit[2] * a[1]; + b[1] = runit[2] * a[0] - runit[0] * a[2]; + b[2] = runit[0] * a[1] - runit[1] * a[0]; + disp[0] = a[0] * cosine + b[0] * sine; + disp[1] = a[1] * cosine + b[1] * sine; + disp[2] = a[2] * cosine + b[2] * sine; + + xoriginal[i][0] = point[0] + c[0] + disp[0]; + xoriginal[i][1] = point[1] + c[1] + disp[1]; + xoriginal[i][2] = point[2] + c[2] + disp[2]; + + // set theta and quat extra attributes affected by rotation + + if (extra_flag) { + + // theta for lines + + if (theta_flag && line[i] >= 0.0) { + theta = avec_line->bonus[atom->line[i]].theta; + toriginal[i] = theta - 0.0; // NOTE: edit this line } // quats for ellipsoids, tris, and bodies @@ -1180,7 +1490,7 @@ void FixMove::unpack_restart(int nlocal, int nth) // unpack the Nth first values this way because other fixes pack them int m = 0; - for (int i = 0; i < nth; i++) m += static_cast (extra[nlocal][m]); + for (int i = 0; i < nth; i++) m += static_cast(extra[nlocal][m]); m++; xoriginal[nlocal][0] = extra[nlocal][m++]; @@ -1217,5 +1527,5 @@ int FixMove::size_restart(int /*nlocal*/) void FixMove::reset_dt() { - error->all(FLERR,"Resetting timestep size is not allowed with fix move"); + error->all(FLERR, "Resetting timestep size is not allowed with fix move"); } From e5a01026a743a68d9cad24190cf90c00bfe61ff3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 3 Apr 2022 03:18:44 -0400 Subject: [PATCH 36/57] add unit tests for fix move --- .../tests/fix-timestep-move_linear.yaml | 74 +++++++++++++++++ .../tests/fix-timestep-move_rotate.yaml | 74 +++++++++++++++++ .../tests/fix-timestep-move_transrot.yaml | 74 +++++++++++++++++ .../tests/fix-timestep-move_variable.yaml | 80 +++++++++++++++++++ .../tests/fix-timestep-move_wiggle.yaml | 74 +++++++++++++++++ 5 files changed, 376 insertions(+) create mode 100644 unittest/force-styles/tests/fix-timestep-move_linear.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-move_rotate.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-move_transrot.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-move_variable.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-move_wiggle.yaml diff --git a/unittest/force-styles/tests/fix-timestep-move_linear.yaml b/unittest/force-styles/tests/fix-timestep-move_linear.yaml new file mode 100644 index 0000000000..6abef11272 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-move_linear.yaml @@ -0,0 +1,74 @@ +--- +lammps_version: 24 Mar 2022 +date_generated: Sun Apr 3 03:06:24 2022 +epsilon: 2e-14 +skip_tests: +prerequisites: ! | + atom full + fix move +pre_commands: ! "" +post_commands: ! | + fix test solute move linear 1.0 1.0 1.0 +input_file: in.fourmol +natoms: 29 +run_pos: ! |2 + 1 1.7200631633077317e+00 4.4726588069312836e+00 1.8279913975585156e+00 + 2 2.3019708395540222e+00 4.9515239068888608e+00 1.1431026442709245e+00 + 3 1.3056462211944140e+00 3.2440473127136711e+00 1.3776619853110796e+00 + 4 4.2283858353148673e-01 3.4915333140468068e+00 7.5128731549594785e-01 + 5 1.1049823864064074e+00 2.9356812874307137e+00 2.4022773187148436e+00 + 6 2.2941260793770599e+00 2.2271928265665291e+00 7.1569059321421302e-01 + 7 2.3401987106287963e+00 1.9908722649924213e+00 -4.6331132243045614e-01 + 8 3.1641187171852803e+00 1.5162469404461476e+00 1.3234017623263132e+00 + 9 3.3777459838125838e+00 1.7463366133047700e+00 2.2687764473032632e+00 + 10 4.0185283555536984e+00 5.7160331534826425e-01 1.0326647272886698e+00 + 11 3.7929780509347664e+00 1.2895245923125742e-02 1.1593733568143261e-01 + 12 5.0030247876861225e+00 1.5107668003242725e+00 3.8113414684627522e-01 + 13 6.0447273787895934e+00 1.0986800145255375e+00 3.6155527316791636e-01 + 14 4.6033152817257079e+00 1.5921023849403642e+00 -6.5544135388230629e-01 + 15 4.9756315249791303e+00 2.5633426972296931e+00 7.5623492454009922e-01 + 16 4.6517554244980310e+00 -3.9571104249784383e-01 2.0329083359991782e+00 + 17 4.2309964792710639e+00 -1.0229189433193842e-01 3.1491948328949437e+00 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 2 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 3 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 4 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 5 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 6 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 7 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 8 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 9 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 10 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 11 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 12 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 13 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 14 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 15 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 16 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 17 1.0000000000000000e+00 1.0000000000000000e+00 1.0000000000000000e+00 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-move_rotate.yaml b/unittest/force-styles/tests/fix-timestep-move_rotate.yaml new file mode 100644 index 0000000000..b4ac0113eb --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-move_rotate.yaml @@ -0,0 +1,74 @@ +--- +lammps_version: 24 Mar 2022 +date_generated: Sun Apr 3 03:06:24 2022 +epsilon: 2e-14 +skip_tests: +prerequisites: ! | + atom full + fix move +pre_commands: ! "" +post_commands: ! | + fix test solute move rotate -0.18 1.1 -1.8 0.1 0.5 1.0 1.0 +input_file: in.fourmol +natoms: 29 +run_pos: ! |2 + 1 -2.7993683669226810e-01 2.4726588069312840e+00 -1.7200860244148450e-01 + 2 3.0197083955402271e-01 2.9515239068888608e+00 -8.5689735572907566e-01 + 3 -6.9435377880558635e-01 1.2440473127136713e+00 -6.2233801468892025e-01 + 4 -1.5771614164685133e+00 1.4915333140468072e+00 -1.2487126845040524e+00 + 5 -8.9501761359359322e-01 9.3568128743071388e-01 4.0227731871484329e-01 + 6 2.9412607937705959e-01 2.2719282656652884e-01 -1.2843094067857868e+00 + 7 3.4019871062879570e-01 -9.1277350075789077e-03 -2.4633113224304561e+00 + 8 1.1641187171852796e+00 -4.8375305955385284e-01 -6.7659823767368665e-01 + 9 1.3777459838125827e+00 -2.5366338669523070e-01 2.6877644730326344e-01 + 10 2.0185283555536979e+00 -1.4283966846517369e+00 -9.6733527271132957e-01 + 11 1.7929780509347653e+00 -1.9871047540768751e+00 -1.8840626643185665e+00 + 12 3.0030247876861216e+00 -4.8923319967572887e-01 -1.6188658531537241e+00 + 13 4.0447273787895925e+00 -9.0131998547446424e-01 -1.6384447268320823e+00 + 14 2.6033152817257070e+00 -4.0789761505963706e-01 -2.6554413538823054e+00 + 15 2.9756315249791299e+00 5.6334269722969144e-01 -1.2437650754599001e+00 + 16 2.6517554244980293e+00 -2.3957110424978456e+00 3.2908335999179084e-02 + 17 2.2309964792710621e+00 -2.1022918943319393e+00 1.1491948328949442e+00 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 -3.1271203016537847e+00 -1.4706662994868196e+00 1.0480451799087882e+00 + 2 -7.7244053214512371e+00 2.1699325352629488e+00 -3.1252573548635093e-01 + 3 2.4896794778365781e+00 -3.5382955941894649e+00 1.5201798493110743e+00 + 4 -6.4869308833104955e-01 -8.1292033418525875e+00 4.1294709797593985e+00 + 5 7.0834056891986288e+00 -5.2350417705319234e+00 1.9091803163460987e+00 + 6 6.3288343933688544e+00 2.3652656077349734e+00 -1.8155162432043723e+00 + 7 4.3519048787150751e+00 3.2831045265140744e+00 -2.0767427511285446e+00 + 8 1.2009192080844477e+01 6.8948882185832456e+00 -4.6483633173760710e+00 + 9 1.3367134079812072e+01 7.5614941211688285e+00 -5.1174604685656222e+00 + 10 1.6483139579874326e+01 1.1840191844735013e+01 -7.5684098803549391e+00 + 11 1.7044817849532322e+01 1.1090811320459508e+01 -7.2498874451829867e+00 + 12 9.4026927142316001e+00 1.7715611543038719e+01 -9.7980750429425196e+00 + 13 1.1654554684130250e+01 2.3557507710224332e+01 -1.2944209323525191e+01 + 14 6.0462972823495269e+00 1.6058458836709743e+01 -8.6338591465898240e+00 + 15 4.5607069302660133e+00 1.7352314681858498e+01 -9.1322280339558510e+00 + 16 2.4697122832464643e+01 1.4824797394989091e+01 -9.8821109807410092e+00 + 17 2.6178917667758348e+01 1.1844754445814953e+01 -8.5402689896833106e+00 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-move_transrot.yaml b/unittest/force-styles/tests/fix-timestep-move_transrot.yaml new file mode 100644 index 0000000000..8f6629c5be --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-move_transrot.yaml @@ -0,0 +1,74 @@ +--- +lammps_version: 24 Mar 2022 +date_generated: Sun Apr 3 03:07:42 2022 +epsilon: 2e-14 +skip_tests: +prerequisites: ! | + atom full + fix move +pre_commands: ! "" +post_commands: ! | + fix test solute move transrot 0.1 0.2 -0.1 -0.18 1.1 -1.8 0.1 0.5 1.0 1.0 +input_file: in.fourmol +natoms: 29 +run_pos: ! |2 + 1 -7.9936836692268087e-02 2.8726588069312839e+00 -3.7200860244148448e-01 + 2 5.0197083955402277e-01 3.3515239068888607e+00 -1.0568973557290757e+00 + 3 -4.9435377880558634e-01 1.6440473127136714e+00 -8.2233801468892032e-01 + 4 -1.3771614164685133e+00 1.8915333140468071e+00 -1.4487126845040523e+00 + 5 -6.9501761359359326e-01 1.3356812874307140e+00 2.0227731871484328e-01 + 6 4.9412607937705960e-01 6.2719282656652886e-01 -1.4843094067857867e+00 + 7 5.4019871062879576e-01 3.9087226499242111e-01 -2.6633113224304563e+00 + 8 1.3641187171852796e+00 -8.3753059553852816e-02 -8.7659823767368672e-01 + 9 1.5777459838125827e+00 1.4633661330476933e-01 6.8776447303263433e-02 + 10 2.2185283555536981e+00 -1.0283966846517369e+00 -1.1673352727113295e+00 + 11 1.9929780509347652e+00 -1.5871047540768752e+00 -2.0840626643185667e+00 + 12 3.2030247876861218e+00 -8.9233199675728847e-02 -1.8188658531537241e+00 + 13 4.2447273787895927e+00 -5.0131998547446421e-01 -1.8384447268320823e+00 + 14 2.8033152817257072e+00 -7.8976150596370420e-03 -2.8554413538823056e+00 + 15 3.1756315249791300e+00 9.6334269722969146e-01 -1.4437650754599001e+00 + 16 2.8517554244980294e+00 -1.9957110424978457e+00 -1.6709166400082093e-01 + 17 2.4309964792710623e+00 -1.7022918943319394e+00 9.4919483289494422e-01 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 -3.0271203016537847e+00 -1.2706662994868196e+00 9.4804517990878823e-01 + 2 -7.6244053214512375e+00 2.3699325352629490e+00 -4.1252573548635096e-01 + 3 2.5896794778365781e+00 -3.3382955941894648e+00 1.4201798493110742e+00 + 4 -5.4869308833104957e-01 -7.9292033418525874e+00 4.0294709797593988e+00 + 5 7.1834056891986284e+00 -5.0350417705319233e+00 1.8091803163460987e+00 + 6 6.4288343933688541e+00 2.5652656077349736e+00 -1.9155162432043724e+00 + 7 4.4519048787150748e+00 3.4831045265140745e+00 -2.1767427511285447e+00 + 8 1.2109192080844476e+01 7.0948882185832458e+00 -4.7483633173760706e+00 + 9 1.3467134079812071e+01 7.7614941211688286e+00 -5.2174604685656218e+00 + 10 1.6583139579874327e+01 1.2040191844735013e+01 -7.6684098803549388e+00 + 11 1.7144817849532323e+01 1.1290811320459508e+01 -7.3498874451829863e+00 + 12 9.5026927142315998e+00 1.7915611543038718e+01 -9.8980750429425193e+00 + 13 1.1754554684130250e+01 2.3757507710224331e+01 -1.3044209323525191e+01 + 14 6.1462972823495265e+00 1.6258458836709742e+01 -8.7338591465898237e+00 + 15 4.6607069302660129e+00 1.7552314681858498e+01 -9.2322280339558507e+00 + 16 2.4797122832464645e+01 1.5024797394989090e+01 -9.9821109807410089e+00 + 17 2.6278917667758350e+01 1.2044754445814952e+01 -8.6402689896833103e+00 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-move_variable.yaml b/unittest/force-styles/tests/fix-timestep-move_variable.yaml new file mode 100644 index 0000000000..22accc9d3c --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-move_variable.yaml @@ -0,0 +1,80 @@ +--- +lammps_version: 24 Mar 2022 +date_generated: Sun Apr 3 03:16:48 2022 +epsilon: 2e-14 +skip_tests: +prerequisites: ! | + atom full + fix move +pre_commands: ! | + variable vx equal 1.0 + variable x equal vdisplace(0.0,v_vx) + variable vy equal 0.0 + variable y equal 0.0 + variable vz equal 0.0 + variable z equal 0.0 +post_commands: ! | + fix test solute move variable v_x v_y v_z v_vx v_vy v_vz +input_file: in.fourmol +natoms: 29 +run_pos: ! |2 + 1 1.7200631633077317e+00 2.4726588069312840e+00 -1.7200860244148433e-01 + 2 2.3019708395540222e+00 2.9515239068888608e+00 -8.5689735572907566e-01 + 3 1.3056462211944140e+00 1.2440473127136711e+00 -6.2233801468892025e-01 + 4 4.2283858353148673e-01 1.4915333140468066e+00 -1.2487126845040522e+00 + 5 1.1049823864064074e+00 9.3568128743071344e-01 4.0227731871484346e-01 + 6 2.2941260793770599e+00 2.2719282656652909e-01 -1.2843094067857870e+00 + 7 2.3401987106287963e+00 -9.1277350075786561e-03 -2.4633113224304561e+00 + 8 3.1641187171852803e+00 -4.8375305955385234e-01 -6.7659823767368688e-01 + 9 3.3777459838125838e+00 -2.5366338669522998e-01 2.6877644730326306e-01 + 10 4.0185283555536984e+00 -1.4283966846517357e+00 -9.6733527271133024e-01 + 11 3.7929780509347664e+00 -1.9871047540768743e+00 -1.8840626643185674e+00 + 12 5.0030247876861225e+00 -4.8923319967572748e-01 -1.6188658531537248e+00 + 13 6.0447273787895934e+00 -9.0131998547446246e-01 -1.6384447268320836e+00 + 14 4.6033152817257079e+00 -4.0789761505963579e-01 -2.6554413538823063e+00 + 15 4.9756315249791303e+00 5.6334269722969288e-01 -1.2437650754599008e+00 + 16 4.6517554244980310e+00 -2.3957110424978438e+00 3.2908335999178327e-02 + 17 4.2309964792710639e+00 -2.1022918943319384e+00 1.1491948328949437e+00 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 2 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 3 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 4 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 5 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 6 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 7 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 8 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 9 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 10 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 11 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 12 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 13 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 14 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 15 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 17 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-move_wiggle.yaml b/unittest/force-styles/tests/fix-timestep-move_wiggle.yaml new file mode 100644 index 0000000000..c07f0634d6 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-move_wiggle.yaml @@ -0,0 +1,74 @@ +--- +lammps_version: 24 Mar 2022 +date_generated: Sun Apr 3 03:06:24 2022 +epsilon: 2e-14 +skip_tests: +prerequisites: ! | + atom full + fix move +pre_commands: ! "" +post_commands: ! | + fix test solute move wiggle 1.0 0.5 -1.0 1.0 +input_file: in.fourmol +natoms: 29 +run_pos: ! |2 + 1 -2.7993683669226882e-01 2.4726588069312836e+00 -1.7200860244148383e-01 + 2 3.0197083955402154e-01 2.9515239068888603e+00 -8.5689735572907522e-01 + 3 -6.9435377880558646e-01 1.2440473127136709e+00 -6.2233801468891981e-01 + 4 -1.5771614164685137e+00 1.4915333140468063e+00 -1.2487126845040517e+00 + 5 -8.9501761359359300e-01 9.3568128743071322e-01 4.0227731871484396e-01 + 6 2.9412607937705959e-01 2.2719282656652884e-01 -1.2843094067857865e+00 + 7 3.4019871062879559e-01 -9.1277350075789007e-03 -2.4633113224304557e+00 + 8 1.1641187171852800e+00 -4.8375305955385256e-01 -6.7659823767368643e-01 + 9 1.3777459838125834e+00 -2.5366338669523020e-01 2.6877644730326355e-01 + 10 2.0185283555536984e+00 -1.4283966846517360e+00 -9.6733527271132980e-01 + 11 1.7929780509347661e+00 -1.9871047540768745e+00 -1.8840626643185669e+00 + 12 3.0030247876861220e+00 -4.8923319967572770e-01 -1.6188658531537243e+00 + 13 4.0447273787895925e+00 -9.0131998547446268e-01 -1.6384447268320832e+00 + 14 2.6033152817257070e+00 -4.0789761505963601e-01 -2.6554413538823058e+00 + 15 2.9756315249791299e+00 5.6334269722969266e-01 -1.2437650754599003e+00 + 16 2.6517554244980301e+00 -2.3957110424978443e+00 3.2908335999178820e-02 + 17 2.2309964792710635e+00 -2.1022918943319389e+00 1.1491948328949442e+00 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 2 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 3 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 4 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 5 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 6 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 7 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 8 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 9 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 10 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 11 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 12 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 13 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 14 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 15 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 16 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 17 6.2831853071795862e+00 3.1415926535897931e+00 -6.2831853071795862e+00 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... From 3ed011dcfb72003db4c5b29825107c5373ab1cc8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 3 Apr 2022 10:55:56 -0400 Subject: [PATCH 37/57] whitespace --- src/KOKKOS/pair_reaxff_kokkos.cpp | 6 +++--- src/KOKKOS/pair_reaxff_kokkos.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 714c0c4914..841d9044a8 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -2692,7 +2692,7 @@ int PairReaxFFKokkos::preprocess_angular(int i, int itype, int j_sta pack.i0 = i_index; pack.i1 = j_index; pack.i2 = k_index; - pack.i3 = j_end; + pack.i3 = j_end; d_angular_pack(location_angular, 1) = pack; location_angular++; @@ -3380,7 +3380,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsionPreproces } } - + } template @@ -3801,7 +3801,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeBond2 Date: Mon, 4 Apr 2022 08:59:40 -0600 Subject: [PATCH 38/57] doc page edit --- doc/src/fix_deform.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_deform.rst b/doc/src/fix_deform.rst index a21a3a6044..805bd84382 100644 --- a/doc/src/fix_deform.rst +++ b/doc/src/fix_deform.rst @@ -70,7 +70,7 @@ Syntax *remap* value = *x* or *v* or *none* x = remap coords of atoms in group into deforming box - v = remap velocities of all atoms when they cross periodic boundaries + v = remap velocities of atoms in group when they cross periodic boundaries none = no remapping of x or v *flip* value = *yes* or *no* allow or disallow box flips when it becomes highly skewed From 02f972292c5f6031e5ee62c6bfddca2d0039b7dd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 4 Apr 2022 12:16:28 -0400 Subject: [PATCH 39/57] spelling --- doc/src/dump_modify.rst | 2 +- doc/src/package.rst | 2 +- doc/utils/sphinx-config/false_positives.txt | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index e81cc04531..4d1fb77b10 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -390,7 +390,7 @@ column/keyword), or a thermo keyword (or compute, fix, property, or variable reference) and then it replaces the string for that specific keyword. For *atom* dump styles only the keywords "id", "type", "x", "y", "z", "ix", "iy", "iz" can be accessed via string regardless of -whether scaled or unwrapped coodinates were enabled or disabled, and +whether scaled or unwrapped coordinates were enabled or disabled, and it always assumes 8 columns for indexing regardless of whether image flags are enabled or not. For dump style *cfg* only the "auxiliary" keywords (6th or later keyword) may be changed and the column indexing diff --git a/doc/src/package.rst b/doc/src/package.rst index 0d13de9711..98faaf9842 100644 --- a/doc/src/package.rst +++ b/doc/src/package.rst @@ -474,7 +474,7 @@ list on GPUs. This can be faster in some cases (e.g. ReaxFF HNS benchmark) but slower in others (e.g. Lennard Jones benchmark). The copy between different memory layouts is done out of place and therefore doubles the memory overhead of the neigh list, which can be -signicant. +significant. The *newton* keyword sets the Newton flags for pairwise and bonded interactions to *off* or *on*, the same as the :doc:`newton ` diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 85f9d3d58f..1dd2354141 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1787,6 +1787,7 @@ Liu Livermore lj llammps +lld LLVM lm lmp From b4fc86e467d41dbfd2860e29d8473fdf5d6cfd3d Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 4 Apr 2022 10:24:54 -0600 Subject: [PATCH 40/57] Fix issues in ReaxFF QEq and ACKS2 --- src/KOKKOS/fix_acks2_reaxff_kokkos.cpp | 36 +++++++++----------------- src/KOKKOS/fix_acks2_reaxff_kokkos.h | 8 ++---- src/KOKKOS/fix_qeq_reaxff_kokkos.cpp | 5 ++-- src/KOKKOS/pair_reaxff_kokkos.cpp | 2 +- src/OPENMP/fix_qeq_reaxff_omp.cpp | 25 +++++++----------- src/REAXFF/fix_acks2_reaxff.cpp | 32 ++++++++++++----------- src/REAXFF/fix_acks2_reaxff.h | 2 +- src/REAXFF/fix_qeq_reaxff.cpp | 18 ++++--------- src/REAXFF/fix_qeq_reaxff.h | 2 +- 9 files changed, 51 insertions(+), 79 deletions(-) diff --git a/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp index d8fbe32b9a..adb3c98232 100644 --- a/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp +++ b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp @@ -219,7 +219,7 @@ void FixACKS2ReaxFFKokkos::pre_force(int vflag) d_ilist = k_list->d_ilist; nn = list->inum; - NN = list->inum + list->gnum; + NN = atom->nlocal + atom->nghost; copymode = 1; @@ -526,7 +526,7 @@ void FixACKS2ReaxFFKokkos::allocate_array() if (efield) get_chi_field(); // init_storage - Kokkos::parallel_for(Kokkos::RangePolicy(0,NN),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); } @@ -1378,18 +1378,15 @@ template void FixACKS2ReaxFFKokkos::calculate_Q() { - Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); - pack_flag = 2; - //comm->forward_comm( this ); //Dist_vector( s ); - k_s.modify(); - k_s.sync(); + pack_flag = 4; + //comm->forward_comm( this ); //Dist_vector( q ); + atomKK->k_q.modify(); + atomKK->k_q.sync(); comm->forward_comm(this); - k_s.modify(); - k_s.sync(); - - Kokkos::parallel_for(Kokkos::RangePolicy(0,NN),*this); - + atomKK->k_q.modify(); + atomKK->k_q.sync(); } /* ---------------------------------------------------------------------- */ @@ -1822,11 +1819,13 @@ void FixACKS2ReaxFFKokkos::operator() (TagACKS2Norm3, const int &ii, template KOKKOS_INLINE_FUNCTION -void FixACKS2ReaxFFKokkos::operator() (TagACKS2CalculateQ1, const int &ii) const +void FixACKS2ReaxFFKokkos::operator() (TagACKS2CalculateQ, const int &ii) const { const int i = d_ilist[ii]; if (mask[i] & groupbit) { + q(i) = d_s(i); + /* backup s */ for (int k = nprev-1; k > 0; --k) { d_s_hist(i,k) = d_s_hist(i,k-1); @@ -1848,17 +1847,6 @@ void FixACKS2ReaxFFKokkos::operator() (TagACKS2CalculateQ1, const in /* ---------------------------------------------------------------------- */ -template -KOKKOS_INLINE_FUNCTION -void FixACKS2ReaxFFKokkos::operator() (TagACKS2CalculateQ2, const int &ii) const -{ - const int i = d_ilist[ii]; - if (mask[i] & groupbit) - q(i) = d_s(i); -} - -/* ---------------------------------------------------------------------- */ - template void FixACKS2ReaxFFKokkos::cleanup_copy() { diff --git a/src/KOKKOS/fix_acks2_reaxff_kokkos.h b/src/KOKKOS/fix_acks2_reaxff_kokkos.h index 735b478f1b..e81479d3ba 100644 --- a/src/KOKKOS/fix_acks2_reaxff_kokkos.h +++ b/src/KOKKOS/fix_acks2_reaxff_kokkos.h @@ -54,8 +54,7 @@ struct TagACKS2Precon1B{}; struct TagACKS2Precon2{}; struct TagACKS2Add{}; struct TagACKS2ZeroQGhosts{}; -struct TagACKS2CalculateQ1{}; -struct TagACKS2CalculateQ2{}; +struct TagACKS2CalculateQ{}; template class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF { @@ -152,10 +151,7 @@ class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF { void operator()(TagACKS2ZeroQGhosts, const int&) const; KOKKOS_INLINE_FUNCTION - void operator()(TagACKS2CalculateQ1, const int&) const; - - KOKKOS_INLINE_FUNCTION - void operator()(TagACKS2CalculateQ2, const int&) const; + void operator()(TagACKS2CalculateQ, const int&) const; KOKKOS_INLINE_FUNCTION double calculate_H_k(const F_FLOAT &r, const F_FLOAT &shld) const; diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp index 4aa23b77be..76e1f1e94d 100644 --- a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp @@ -208,7 +208,6 @@ void FixQEqReaxFFKokkos::pre_force(int /*vflag*/) d_neighbors = k_list->d_neighbors; d_ilist = k_list->d_ilist; nn = list->inum; - NN = list->inum + list->gnum; copymode = 1; @@ -375,7 +374,7 @@ void FixQEqReaxFFKokkos::allocate_array() if (efield) get_chi_field(); - Kokkos::parallel_for(Kokkos::RangePolicy(0,NN),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); } /* ---------------------------------------------------------------------- */ @@ -872,7 +871,7 @@ void FixQEqReaxFFKokkos::sparse_matvec_kokkos(typename AT::t_ffloat2 } if (neighflag != FULL) { - Kokkos::parallel_for(Kokkos::RangePolicy(nn,NN),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(atom->nlocal,atom->nghost),*this); if (need_dup) dup_o.reset_except(d_o); diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 714c0c4914..2408f6649d 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -715,7 +715,7 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) newton_pair = force->newton_pair; nn = list->inum; - NN = list->inum + list->gnum; + NN = atom->nlocal + atom->nghost; const int inum = list->inum; const int ignum = inum + list->gnum; diff --git a/src/OPENMP/fix_qeq_reaxff_omp.cpp b/src/OPENMP/fix_qeq_reaxff_omp.cpp index 2bcf639eae..e0714fc636 100644 --- a/src/OPENMP/fix_qeq_reaxff_omp.cpp +++ b/src/OPENMP/fix_qeq_reaxff_omp.cpp @@ -237,7 +237,7 @@ void FixQEqReaxFFOMP::init_storage() #if defined(_OPENMP) #pragma omp parallel for schedule(static) #endif - for (int i = 0; i < NN; i++) { + for (int i = 0; i < nn; i++) { Hdia_inv[i] = 1. / eta[atom->type[i]]; b_s[i] = -chi[atom->type[i]]; if (efield) b_s[i] -= chi_field[i]; @@ -258,13 +258,11 @@ void FixQEqReaxFFOMP::pre_force(int /* vflag */) if (reaxff) { nn = reaxff->list->inum; - NN = reaxff->list->inum + reaxff->list->gnum; ilist = reaxff->list->ilist; numneigh = reaxff->list->numneigh; firstneigh = reaxff->list->firstneigh; } else { nn = list->inum; - NN = list->inum + list->gnum; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; @@ -505,15 +503,14 @@ void FixQEqReaxFFOMP::sparse_matvec(sparse_matrix *A, double *x, double *b) #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (ii = nn; ii < NN; ++ii) { - i = ilist[ii]; + for (i = atom->nlocal; i < atom->nghost; ++i) { if (atom->mask[i] & groupbit) b[i] = 0; } #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = 0; i < NN; ++i) + for (i = 0; i < atom->nghost; ++i) for (int t=0; tnghost; ++i) for (int t = 0; t < nthreads; ++t) b[i] += b_temp[t][i]; } //end omp parallel @@ -838,8 +835,7 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x1, double *x #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (ii = nn; ii < NN; ++ii) { - i = ilist[ii]; + for (i = atom->nlocal; i < atom->nghost; ++i) { if (atom->mask[i] & groupbit) { indxI = 2 * i; b[indxI] = 0; @@ -850,7 +846,7 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x1, double *x #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = 0; i < NN; ++i) { + for (i = 0; i < atom->nghost; ++i) { indxI = 2 * i; for (int t=0; tnghost; ++i) { indxI = 2 * i; for (int t = 0; t < nthreads; ++t) { b[indxI] += b_temp[t][indxI]; @@ -929,8 +925,7 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x, double *b) #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (ii = nn; ii < NN; ++ii) { - i = ilist[ii]; + for (i = atom->nlocal; i < atom->nghost; ++i) { if (atom->mask[i] & groupbit) { indxI = 2 * i; b[indxI] = 0; @@ -941,7 +936,7 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x, double *b) #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = 0; i < NN; ++i) { + for (i = 0; i < atom->nghost; ++i) { indxI = 2 * i; for (int t=0; tnghost; ++i) { indxI = 2 * i; for (int t = 0; t < nthreads; ++t) { b[indxI] += b_temp[t][indxI]; diff --git a/src/REAXFF/fix_acks2_reaxff.cpp b/src/REAXFF/fix_acks2_reaxff.cpp index c3457d1712..ad026102e0 100644 --- a/src/REAXFF/fix_acks2_reaxff.cpp +++ b/src/REAXFF/fix_acks2_reaxff.cpp @@ -306,7 +306,7 @@ void FixACKS2ReaxFF::init_storage() { if (efield) get_chi_field(); - for (int ii = 0; ii < NN; ii++) { + for (int ii = 0; ii < nn; ii++) { int i = ilist[ii]; if (atom->mask[i] & groupbit) { b_s[i] = -chi[atom->type[i]]; @@ -329,17 +329,15 @@ void FixACKS2ReaxFF::pre_force(int /*vflag*/) { if (update->ntimestep % nevery) return; - int n = atom->nlocal; + NN = atom->nlocal + atom->nghost; if (reaxff) { nn = reaxff->list->inum; - NN = reaxff->list->inum + reaxff->list->gnum; ilist = reaxff->list->ilist; numneigh = reaxff->list->numneigh; firstneigh = reaxff->list->firstneigh; } else { nn = list->inum; - NN = list->inum + list->gnum; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; @@ -349,7 +347,7 @@ void FixACKS2ReaxFF::pre_force(int /*vflag*/) // need to be atom->nmax in length if (atom->nmax > nmax) reallocate_storage(); - if (n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) + if (atom->nlocal > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) reallocate_matrix(); if (efield) get_chi_field(); @@ -626,8 +624,7 @@ void FixACKS2ReaxFF::sparse_matvec_acks2(sparse_matrix *H, sparse_matrix *X, dou } } - for (ii = nn; ii < NN; ++ii) { - i = ilist[ii]; + for (i = atom->nlocal; i < atom->nghost; ++i) { if (atom->mask[i] & groupbit) { b[i] = 0; b[NN + i] = 0; @@ -680,6 +677,8 @@ void FixACKS2ReaxFF::calculate_Q() i = ilist[ii]; if (atom->mask[i] & groupbit) { + atom->q[i] = s[i]; + /* backup s */ for (k = nprev-1; k > 0; --k) { s_hist[i][k] = s_hist[i][k-1]; @@ -698,14 +697,8 @@ void FixACKS2ReaxFF::calculate_Q() } } - pack_flag = 2; - comm->forward_comm(this); //Dist_vector(s); - - for (int ii = 0; ii < NN; ++ii) { - i = ilist[ii]; - if (atom->mask[i] & groupbit) - atom->q[i] = s[i]; - } + pack_flag = 4; + comm->forward_comm(this); //Dist_vector(q); } /* ---------------------------------------------------------------------- */ @@ -733,6 +726,11 @@ int FixACKS2ReaxFF::pack_forward_comm(int n, int *list, double *buf, buf[m++] = q_hat[j]; buf[m++] = q_hat[NN+j]; } + } else if (pack_flag == 4) { + for(int i = 0; i < n; i++) { + int j = list[i]; + buf[m++] = atom->q[j]; + } } return m; } @@ -761,6 +759,10 @@ void FixACKS2ReaxFF::unpack_forward_comm(int n, int first, double *buf) q_hat[i] = buf[m++]; q_hat[NN+i] = buf[m++]; } + } else if (pack_flag == 4) { + for(i = first; i < last; i++) { + atom->q[i] = buf[m++]; + } } } diff --git a/src/REAXFF/fix_acks2_reaxff.h b/src/REAXFF/fix_acks2_reaxff.h index 2d21f80fe0..27ba196bbd 100644 --- a/src/REAXFF/fix_acks2_reaxff.h +++ b/src/REAXFF/fix_acks2_reaxff.h @@ -37,7 +37,7 @@ class FixACKS2ReaxFF : public FixQEqReaxFF { double *get_s() { return s; } protected: - int last_rows_rank, last_rows_flag; + int NN, last_rows_rank, last_rows_flag; double **s_hist_X, **s_hist_last; double *bcut_acks2, bond_softness, **bcut; // acks2 parameters diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp index c2469ee9eb..12300d7054 100644 --- a/src/REAXFF/fix_qeq_reaxff.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -104,7 +104,7 @@ FixQEqReaxFF::FixQEqReaxFF(LAMMPS *lmp, int narg, char **arg) : shld = nullptr; nn = n_cap = 0; - NN = nmax = 0; + nmax = 0; m_fill = m_cap = 0; pack_flag = 0; s = nullptr; @@ -319,7 +319,7 @@ void FixQEqReaxFF::reallocate_storage() void FixQEqReaxFF::allocate_matrix() { - int i,ii,n,m; + int i,ii,m; int mincap; double safezone; @@ -332,8 +332,7 @@ void FixQEqReaxFF::allocate_matrix() safezone = REAX_SAFE_ZONE; } - n = atom->nlocal; - n_cap = MAX((int)(n * safezone), mincap); + n_cap = MAX((int)(atom->nlocal * safezone), mincap); // determine the total space for the H matrix @@ -493,13 +492,11 @@ void FixQEqReaxFF::setup_pre_force(int vflag) { if (reaxff) { nn = reaxff->list->inum; - NN = reaxff->list->inum + reaxff->list->gnum; ilist = reaxff->list->ilist; numneigh = reaxff->list->numneigh; firstneigh = reaxff->list->firstneigh; } else { nn = list->inum; - NN = list->inum + list->gnum; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; @@ -537,7 +534,7 @@ void FixQEqReaxFF::init_storage() { if (efield) get_chi_field(); - for (int ii = 0; ii < NN; ii++) { + for (int ii = 0; ii < nn; ii++) { int i = ilist[ii]; if (atom->mask[i] & groupbit) { Hdia_inv[i] = 1. / eta[atom->type[i]]; @@ -561,13 +558,11 @@ void FixQEqReaxFF::pre_force(int /*vflag*/) if (reaxff) { nn = reaxff->list->inum; - NN = reaxff->list->inum + reaxff->list->gnum; ilist = reaxff->list->ilist; numneigh = reaxff->list->numneigh; firstneigh = reaxff->list->firstneigh; } else { nn = list->inum; - NN = list->inum + list->gnum; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; @@ -791,11 +786,8 @@ void FixQEqReaxFF::sparse_matvec(sparse_matrix *A, double *x, double *b) b[i] = eta[atom->type[i]] * x[i]; } - for (ii = nn; ii < NN; ++ii) { - i = ilist[ii]; - if (atom->mask[i] & groupbit) + for (i = atom->nlocal; i < atom->nghost; ++i) b[i] = 0; - } for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; diff --git a/src/REAXFF/fix_qeq_reaxff.h b/src/REAXFF/fix_qeq_reaxff.h index 5ebb410a10..f0f46ed4ce 100644 --- a/src/REAXFF/fix_qeq_reaxff.h +++ b/src/REAXFF/fix_qeq_reaxff.h @@ -59,7 +59,7 @@ class FixQEqReaxFF : public Fix { protected: int nevery, reaxflag; int matvecs; - int nn, NN, m_fill; + int nn, m_fill; int n_cap, nmax, m_cap; int pack_flag; int nlevels_respa; From f42635a40d4e423bce9a368adb23f6f4e9669974 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 4 Apr 2022 12:08:38 -0600 Subject: [PATCH 41/57] Should be nall not nghost --- src/KOKKOS/fix_acks2_reaxff_kokkos.cpp | 1 - src/KOKKOS/fix_qeq_reaxff_kokkos.cpp | 3 ++- src/OPENMP/fix_qeq_reaxff_omp.cpp | 25 +++++++++++++------------ src/REAXFF/fix_acks2_reaxff.cpp | 2 +- src/REAXFF/fix_qeq_reaxff.cpp | 3 ++- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp index adb3c98232..b480b644a1 100644 --- a/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp +++ b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp @@ -205,7 +205,6 @@ void FixACKS2ReaxFFKokkos::pre_force(int vflag) type = atomKK->k_type.view(); mask = atomKK->k_mask.view(); nlocal = atomKK->nlocal; - nall = atom->nlocal + atom->nghost; newton_pair = force->newton_pair; k_params.template sync(); diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp index 76e1f1e94d..43fd832700 100644 --- a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp @@ -871,7 +871,8 @@ void FixQEqReaxFFKokkos::sparse_matvec_kokkos(typename AT::t_ffloat2 } if (neighflag != FULL) { - Kokkos::parallel_for(Kokkos::RangePolicy(atom->nlocal,atom->nghost),*this); + int nall = nlocal + atomKK->nghost; + Kokkos::parallel_for(Kokkos::RangePolicy(atom->nlocal,nall),*this); if (need_dup) dup_o.reset_except(d_o); diff --git a/src/OPENMP/fix_qeq_reaxff_omp.cpp b/src/OPENMP/fix_qeq_reaxff_omp.cpp index e0714fc636..ee9748d354 100644 --- a/src/OPENMP/fix_qeq_reaxff_omp.cpp +++ b/src/OPENMP/fix_qeq_reaxff_omp.cpp @@ -254,8 +254,6 @@ void FixQEqReaxFFOMP::pre_force(int /* vflag */) { if (update->ntimestep % nevery) return; - int n = atom->nlocal; - if (reaxff) { nn = reaxff->list->inum; ilist = reaxff->list->ilist; @@ -272,7 +270,7 @@ void FixQEqReaxFFOMP::pre_force(int /* vflag */) // need to be atom->nmax in length if (atom->nmax > nmax) reallocate_storage(); - if (n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) + if (atom->nlocal > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) reallocate_matrix(); if (efield) get_chi_field(); @@ -486,6 +484,9 @@ void FixQEqReaxFFOMP::sparse_matvec(sparse_matrix *A, double *x, double *b) int i, j, itr_j; int ii; int nthreads = comm->nthreads; + int nlocal = atom->nlocal; + int nall = atom->nlocal + atom->nghost; + #if defined(_OPENMP) int tid = omp_get_thread_num(); #else @@ -503,14 +504,14 @@ void FixQEqReaxFFOMP::sparse_matvec(sparse_matrix *A, double *x, double *b) #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = atom->nlocal; i < atom->nghost; ++i) { + for (i = nlocal; i < nall; ++i) { if (atom->mask[i] & groupbit) b[i] = 0; } #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = 0; i < atom->nghost; ++i) + for (i = 0; i < nall; ++i) for (int t=0; tnghost; ++i) + for (i = 0; i < nall; ++i) for (int t = 0; t < nthreads; ++t) b[i] += b_temp[t][i]; } //end omp parallel @@ -835,7 +836,7 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x1, double *x #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = atom->nlocal; i < atom->nghost; ++i) { + for (i = nlocal; i < nall; ++i) { if (atom->mask[i] & groupbit) { indxI = 2 * i; b[indxI] = 0; @@ -846,7 +847,7 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x1, double *x #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = 0; i < atom->nghost; ++i) { + for (i = 0; i < nall; ++i) { indxI = 2 * i; for (int t=0; tnghost; ++i) { + for (i = 0; i < nall; ++i) { indxI = 2 * i; for (int t = 0; t < nthreads; ++t) { b[indxI] += b_temp[t][indxI]; @@ -925,7 +926,7 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x, double *b) #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = atom->nlocal; i < atom->nghost; ++i) { + for (i = nlocal; i < nall; ++i) { if (atom->mask[i] & groupbit) { indxI = 2 * i; b[indxI] = 0; @@ -936,7 +937,7 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x, double *b) #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = 0; i < atom->nghost; ++i) { + for (i = 0; i < nall; ++i) { indxI = 2 * i; for (int t=0; tnghost; ++i) { + for (i = 0; i < nall; ++i) { indxI = 2 * i; for (int t = 0; t < nthreads; ++t) { b[indxI] += b_temp[t][indxI]; diff --git a/src/REAXFF/fix_acks2_reaxff.cpp b/src/REAXFF/fix_acks2_reaxff.cpp index ad026102e0..d9cf4c13b8 100644 --- a/src/REAXFF/fix_acks2_reaxff.cpp +++ b/src/REAXFF/fix_acks2_reaxff.cpp @@ -624,7 +624,7 @@ void FixACKS2ReaxFF::sparse_matvec_acks2(sparse_matrix *H, sparse_matrix *X, dou } } - for (i = atom->nlocal; i < atom->nghost; ++i) { + for (i = atom->nlocal; i < NN; ++i) { if (atom->mask[i] & groupbit) { b[i] = 0; b[NN + i] = 0; diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp index 12300d7054..b6c53aa977 100644 --- a/src/REAXFF/fix_qeq_reaxff.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -786,7 +786,8 @@ void FixQEqReaxFF::sparse_matvec(sparse_matrix *A, double *x, double *b) b[i] = eta[atom->type[i]] * x[i]; } - for (i = atom->nlocal; i < atom->nghost; ++i) + int nall = atom->nlocal + atom->nghost; + for (i = atom->nlocal; i < nall; ++i) b[i] = 0; for (ii = 0; ii < nn; ++ii) { From 776dc344117c776126a5310ececfcea336ddbfeb Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 4 Apr 2022 12:27:42 -0600 Subject: [PATCH 42/57] Add missing vars --- src/OPENMP/fix_qeq_reaxff_omp.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/OPENMP/fix_qeq_reaxff_omp.cpp b/src/OPENMP/fix_qeq_reaxff_omp.cpp index ee9748d354..63dd28aa77 100644 --- a/src/OPENMP/fix_qeq_reaxff_omp.cpp +++ b/src/OPENMP/fix_qeq_reaxff_omp.cpp @@ -483,10 +483,10 @@ void FixQEqReaxFFOMP::sparse_matvec(sparse_matrix *A, double *x, double *b) { int i, j, itr_j; int ii; - int nthreads = comm->nthreads; int nlocal = atom->nlocal; int nall = atom->nlocal + atom->nghost; + int nthreads = comm->nthreads; #if defined(_OPENMP) int tid = omp_get_thread_num(); #else @@ -813,6 +813,8 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x1, double *x int i, j, itr_j; int ii; int indxI, indxJ; + int nlocal = atom->nlocal; + int nall = atom->nlocal + atom->nghost; int nthreads = comm->nthreads; #if defined(_OPENMP) @@ -903,6 +905,8 @@ void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x, double *b) int i, j, itr_j; int ii; int indxI, indxJ; + int nlocal = atom->nlocal; + int nall = atom->nlocal + atom->nghost; int nthreads = comm->nthreads; #if defined(_OPENMP) From 134c77a5c659f21d9cd39553b91ccdd253af9ed4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 4 Apr 2022 14:47:53 -0400 Subject: [PATCH 43/57] reference kokkos-sycl.cmake in the docs --- doc/src/Build_extras.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/src/Build_extras.rst b/doc/src/Build_extras.rst index 9648df402f..f3af36c0bb 100644 --- a/doc/src/Build_extras.rst +++ b/doc/src/Build_extras.rst @@ -638,13 +638,14 @@ This list was last updated for version 3.5.0 of the Kokkos library. -D CMAKE_CXX_COMPILER=${HOME}/lammps/lib/kokkos/bin/nvcc_wrapper - To simplify compilation, three preset files are included in the + To simplify compilation, four preset files are included in the ``cmake/presets`` folder, ``kokkos-serial.cmake``, - ``kokkos-openmp.cmake``, and ``kokkos-cuda.cmake``. They will - enable the KOKKOS package and enable some hardware choice. So to - compile with OpenMP host parallelization, CUDA device - parallelization (for GPUs with CC 5.0 and up) with some common - packages enabled, you can do the following: + ``kokkos-openmp.cmake``, ``kokkos-cuda.cmake``, and + ``kokkos-sycl.cmake``. They will enable the KOKKOS package and + enable some hardware choice. So to compile with OpenMP host + parallelization, CUDA device parallelization (for GPUs with CC 5.0 + and up) with some common packages enabled, you can do the + following: .. code-block:: bash From 3e01bc48d4996b1b0104c3a5b506a7ba3b6ad0d8 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 4 Apr 2022 13:05:10 -0600 Subject: [PATCH 44/57] Need s ghosts --- src/KOKKOS/fix_acks2_reaxff_kokkos.cpp | 36 +++++++++++++------------- src/REAXFF/fix_acks2_reaxff.cpp | 35 ++++++++++--------------- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp index b480b644a1..aab19e0d47 100644 --- a/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp +++ b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp @@ -1376,16 +1376,15 @@ int FixACKS2ReaxFFKokkos::bicgstab_solve() template void FixACKS2ReaxFFKokkos::calculate_Q() { - - Kokkos::parallel_for(Kokkos::RangePolicy(0,nn),*this); - - pack_flag = 4; - //comm->forward_comm( this ); //Dist_vector( q ); - atomKK->k_q.modify(); - atomKK->k_q.sync(); + pack_flag = 2; + //comm->forward_comm( this ); //Dist_vector( s ); + k_s.modify(); + k_s.sync(); comm->forward_comm(this); - atomKK->k_q.modify(); - atomKK->k_q.sync(); + k_s.modify(); + k_s.sync(); + + Kokkos::parallel_for(Kokkos::RangePolicy(0,NN),*this); } /* ---------------------------------------------------------------------- */ @@ -1818,24 +1817,25 @@ void FixACKS2ReaxFFKokkos::operator() (TagACKS2Norm3, const int &ii, template KOKKOS_INLINE_FUNCTION -void FixACKS2ReaxFFKokkos::operator() (TagACKS2CalculateQ, const int &ii) const +void FixACKS2ReaxFFKokkos::operator() (TagACKS2CalculateQ, const int &i) const { - const int i = d_ilist[ii]; if (mask[i] & groupbit) { q(i) = d_s(i); - /* backup s */ - for (int k = nprev-1; k > 0; --k) { - d_s_hist(i,k) = d_s_hist(i,k-1); - d_s_hist_X(i,k) = d_s_hist_X(i,k-1); + if (i < nlocal) { + /* backup s */ + for (int k = nprev-1; k > 0; --k) { + d_s_hist(i,k) = d_s_hist(i,k-1); + d_s_hist_X(i,k) = d_s_hist_X(i,k-1); + } + d_s_hist(i,0) = d_s[i]; + d_s_hist_X(i,0) = d_s[NN+i]; } - d_s_hist(i,0) = d_s[i]; - d_s_hist_X(i,0) = d_s[NN+i]; } // last two rows - if (last_rows_flag && ii == 0) { + if (last_rows_flag && i == 0) { for (int i = 0; i < 2; ++i) { for (int k = nprev-1; k > 0; --k) d_s_hist_last(i,k) = d_s_hist_last(i,k-1); diff --git a/src/REAXFF/fix_acks2_reaxff.cpp b/src/REAXFF/fix_acks2_reaxff.cpp index d9cf4c13b8..5cff3e4933 100644 --- a/src/REAXFF/fix_acks2_reaxff.cpp +++ b/src/REAXFF/fix_acks2_reaxff.cpp @@ -306,7 +306,7 @@ void FixACKS2ReaxFF::init_storage() { if (efield) get_chi_field(); - for (int ii = 0; ii < nn; ii++) { + for (int ii = 0; ii < NN; ii++) { int i = ilist[ii]; if (atom->mask[i] & groupbit) { b_s[i] = -chi[atom->type[i]]; @@ -673,19 +673,24 @@ void FixACKS2ReaxFF::calculate_Q() { int i, k; - for (int ii = 0; ii < nn; ++ii) { - i = ilist[ii]; + pack_flag = 2; + comm->forward_comm(this); //Dist_vector(s); + + for (int i = 0; i < NN; ++i) { if (atom->mask[i] & groupbit) { atom->q[i] = s[i]; - /* backup s */ - for (k = nprev-1; k > 0; --k) { - s_hist[i][k] = s_hist[i][k-1]; - s_hist_X[i][k] = s_hist_X[i][k-1]; + if (i < atom->nlocal) { + + /* backup s */ + for (k = nprev-1; k > 0; --k) { + s_hist[i][k] = s_hist[i][k-1]; + s_hist_X[i][k] = s_hist_X[i][k-1]; + } + s_hist[i][0] = s[i]; + s_hist_X[i][0] = s[NN+i]; } - s_hist[i][0] = s[i]; - s_hist_X[i][0] = s[NN+i]; } } // last two rows @@ -696,9 +701,6 @@ void FixACKS2ReaxFF::calculate_Q() s_hist_last[i][0] = s[2*NN+i]; } } - - pack_flag = 4; - comm->forward_comm(this); //Dist_vector(q); } /* ---------------------------------------------------------------------- */ @@ -726,11 +728,6 @@ int FixACKS2ReaxFF::pack_forward_comm(int n, int *list, double *buf, buf[m++] = q_hat[j]; buf[m++] = q_hat[NN+j]; } - } else if (pack_flag == 4) { - for(int i = 0; i < n; i++) { - int j = list[i]; - buf[m++] = atom->q[j]; - } } return m; } @@ -759,10 +756,6 @@ void FixACKS2ReaxFF::unpack_forward_comm(int n, int first, double *buf) q_hat[i] = buf[m++]; q_hat[NN+i] = buf[m++]; } - } else if (pack_flag == 4) { - for(i = first; i < last; i++) { - atom->q[i] = buf[m++]; - } } } From c2741463581d5ccb80cba010977de5da0bef425a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 4 Apr 2022 15:40:19 -0400 Subject: [PATCH 45/57] whitespace --- src/VTK/dump_vtk.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VTK/dump_vtk.cpp b/src/VTK/dump_vtk.cpp index 97f4517989..fd7f4b2c2b 100644 --- a/src/VTK/dump_vtk.cpp +++ b/src/VTK/dump_vtk.cpp @@ -1918,9 +1918,9 @@ void DumpVTK::identify_vectors() std::string vectorName = name[vector3_starts[v3s]]; std::string::size_type erase_start = vectorName.find_first_of('x'); if (erase_start == 0) { - vectorName.erase(0,1); + vectorName.erase(0,1); } else { - vectorName.erase(erase_start); + vectorName.erase(erase_start); } name[vector3_starts[v3s]] = vectorName; vector_set.insert(vector3_starts[v3s]); From a5139d7100d7319692b0b465892ef8f73447af13 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 4 Apr 2022 21:03:15 -0400 Subject: [PATCH 46/57] make sure "NN" is initialized before it is used --- src/REAXFF/fix_acks2_reaxff.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/REAXFF/fix_acks2_reaxff.cpp b/src/REAXFF/fix_acks2_reaxff.cpp index 5cff3e4933..26b1d00203 100644 --- a/src/REAXFF/fix_acks2_reaxff.cpp +++ b/src/REAXFF/fix_acks2_reaxff.cpp @@ -203,7 +203,8 @@ void FixACKS2ReaxFF::pertype_parameters(char *arg) void FixACKS2ReaxFF::allocate_storage() { nmax = atom->nmax; - int size = nmax*2 + 2; + NN = atom->nlocal + atom->nghost; + const int size = nmax*2 + 2; // 0 to nn-1: owned atoms related to H matrix // nn to NN-1: ghost atoms related to H matrix @@ -671,8 +672,6 @@ void FixACKS2ReaxFF::sparse_matvec_acks2(sparse_matrix *H, sparse_matrix *X, dou void FixACKS2ReaxFF::calculate_Q() { - int i, k; - pack_flag = 2; comm->forward_comm(this); //Dist_vector(s); @@ -684,7 +683,7 @@ void FixACKS2ReaxFF::calculate_Q() if (i < atom->nlocal) { /* backup s */ - for (k = nprev-1; k > 0; --k) { + for (int k = nprev-1; k > 0; --k) { s_hist[i][k] = s_hist[i][k-1]; s_hist_X[i][k] = s_hist_X[i][k-1]; } @@ -696,7 +695,7 @@ void FixACKS2ReaxFF::calculate_Q() // last two rows if (last_rows_flag) { for (int i = 0; i < 2; ++i) { - for (k = nprev-1; k > 0; --k) + for (int k = nprev-1; k > 0; --k) s_hist_last[i][k] = s_hist_last[i][k-1]; s_hist_last[i][0] = s[2*NN+i]; } From 22392d226ac980541d209c08365fd59456f35040 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 4 Apr 2022 21:11:09 -0400 Subject: [PATCH 47/57] silence compiler warnings --- src/KOKKOS/pair_reaxff_kokkos.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index baad904941..7b0818629a 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -958,9 +958,9 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) count_angular = h_count_angular_torsion(0); count_torsion = h_count_angular_torsion(1); - if (count_angular > d_angular_pack.extent(0)) + if (count_angular > (int)d_angular_pack.extent(0)) d_angular_pack = t_reax_int4_2d("reaxff:angular_pack",(int)(count_angular * 1.1),2); - if (count_torsion > d_torsion_pack.extent(0)) + if (count_torsion > (int)d_torsion_pack.extent(0)) d_torsion_pack = t_reax_int4_2d("reaxff:torsion_pack",(int)(count_torsion * 1.1),2); // need to zero to re-count @@ -2584,8 +2584,6 @@ void PairReaxFFKokkos::compute_angular_sbo(int i, int itype, int j_s const F_FLOAT p_val8 = gp[33]; const F_FLOAT p_val9 = gp[16]; - const F_FLOAT Delta_val = d_total_bo[i] - paramssing(itype).valency_val; - F_FLOAT SBOp = 0.0; F_FLOAT prod_SBO = 1.0; @@ -2710,7 +2708,7 @@ int PairReaxFFKokkos::preprocess_angular(int i, int itype, int j_sta template template KOKKOS_INLINE_FUNCTION -int PairReaxFFKokkos::preprocess_torsion(int i, int itype, int itag, +int PairReaxFFKokkos::preprocess_torsion(int i, int /*itype*/, int itag, F_FLOAT xtmp, F_FLOAT ytmp, F_FLOAT ztmp, int j_start, int j_end, int location_torsion) const { // in reaxff_torsion_angles: j = i, k = j, i = k; @@ -2721,7 +2719,6 @@ int PairReaxFFKokkos::preprocess_torsion(int i, int itype, int itag, int j = d_bo_list[jj]; j &= NEIGHMASK; const tagint jtag = tag(j); - const int jtype = type(j); const int j_index = jj - j_start; // skip half of the interactions From cd7f08a8e79c68a2ad8d22d3cff99cf0e36202df Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Apr 2022 09:25:11 -0400 Subject: [PATCH 48/57] support dump_modify for column headers in ADIOS dump styles --- doc/src/dump_modify.rst | 6 +++--- src/ADIOS/dump_atom_adios.cpp | 3 +++ src/ADIOS/dump_custom_adios.cpp | 13 +++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 4d1fb77b10..5dfde62282 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -381,9 +381,9 @@ performed with dump style *xtc*\ . ---------- The *colname* keyword can be used to change the default header keyword -for dump styles: *atom*, *custom*, and *cfg* and their compressed and -MPIIO variants. The setting for *ID string* replaces the default text -with the provided string. *ID* can be a positive integer when it +for dump styles: *atom*, *custom*, and *cfg* and their compressed, ADIOS, +and MPIIO variants. The setting for *ID string* replaces the default +text with the provided string. *ID* can be a positive integer when it represents the column number counting from the left, a negative integer when it represents the column number from the right (i.e. -1 is the last column/keyword), or a thermo keyword (or compute, fix, property, or diff --git a/src/ADIOS/dump_atom_adios.cpp b/src/ADIOS/dump_atom_adios.cpp index 3e637b02d7..7588b6775b 100644 --- a/src/ADIOS/dump_atom_adios.cpp +++ b/src/ADIOS/dump_atom_adios.cpp @@ -238,6 +238,9 @@ void DumpAtomADIOS::init_style() columnNames = {"id", "type", "xs", "ys", "zs", "ix", "iy", "iz"}; } + for (int icol = 0; icol < (int)columnNames.size(); ++icol) + if (keyword_user[icol].size()) columnNames[icol] = keyword_user[icol]; + // setup function ptrs if (scale_flag == 1 && image_flag == 0 && domain->triclinic == 0) diff --git a/src/ADIOS/dump_custom_adios.cpp b/src/ADIOS/dump_custom_adios.cpp index 263f15349c..82cc4a9c0c 100644 --- a/src/ADIOS/dump_custom_adios.cpp +++ b/src/ADIOS/dump_custom_adios.cpp @@ -214,6 +214,19 @@ void DumpCustomADIOS::write() void DumpCustomADIOS::init_style() { + // assemble column string from defaults and user values + + delete[] columns; + std::string combined; + int icol = 0; + for (auto item : utils::split_words(columns_default)) { + if (combined.size()) combined += " "; + if (keyword_user[icol].size()) combined += keyword_user[icol]; + else combined += item; + ++icol; + } + columns = utils::strdup(combined); + // setup boundary string domain->boundary_string(boundstr); From 2b8b916cba466ac10dc2612f230b38cf3336e05b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Apr 2022 10:08:53 -0400 Subject: [PATCH 49/57] delete unused enums --- src/MPIIO/dump_custom_mpiio.cpp | 11 ----------- src/MPIIO/dump_xyz_mpiio.cpp | 11 ----------- 2 files changed, 22 deletions(-) diff --git a/src/MPIIO/dump_custom_mpiio.cpp b/src/MPIIO/dump_custom_mpiio.cpp index 196a2d0bb9..a911ea1149 100644 --- a/src/MPIIO/dump_custom_mpiio.cpp +++ b/src/MPIIO/dump_custom_mpiio.cpp @@ -39,17 +39,6 @@ using namespace LAMMPS_NS; #define DUMP_BUF_CHUNK_SIZE 16384 #define DUMP_BUF_INCREMENT_SIZE 4096 -// clang-format off -enum{ ID, MOL, TYPE, ELEMENT, MASS, - X, Y, Z, XS, YS, ZS, XSTRI, YSTRI, ZSTRI, XU, YU, ZU, XUTRI, YUTRI, ZUTRI, - XSU, YSU, ZSU, XSUTRI, YSUTRI, ZSUTRI, - IX, IY, IZ, VX, VY, VZ, FX, FY, FZ, - Q, MUX, MUY, MUZ, MU, RADIUS, DIAMETER, - OMEGAX, OMEGAY, OMEGAZ, ANGMOMX, ANGMOMY, ANGMOMZ, - TQX, TQY, TQZ, SPIN, ERADIUS, ERVEL, ERFORCE, - COMPUTE, FIX, VARIABLE }; -enum{ LT, LE, GT, GE, EQ, NEQ }; -// clang-format on /* ---------------------------------------------------------------------- */ DumpCustomMPIIO::DumpCustomMPIIO(LAMMPS *lmp, int narg, char **arg) diff --git a/src/MPIIO/dump_xyz_mpiio.cpp b/src/MPIIO/dump_xyz_mpiio.cpp index c976932b52..c03d71dcb2 100644 --- a/src/MPIIO/dump_xyz_mpiio.cpp +++ b/src/MPIIO/dump_xyz_mpiio.cpp @@ -38,17 +38,6 @@ using namespace LAMMPS_NS; #define DUMP_BUF_CHUNK_SIZE 16384 #define DUMP_BUF_INCREMENT_SIZE 4096 -enum{ID,MOL,TYPE,ELEMENT,MASS, - X,Y,Z,XS,YS,ZS,XSTRI,YSTRI,ZSTRI,XU,YU,ZU,XUTRI,YUTRI,ZUTRI, - XSU,YSU,ZSU,XSUTRI,YSUTRI,ZSUTRI, - IX,IY,IZ, - VX,VY,VZ,FX,FY,FZ, - Q,MUX,MUY,MUZ,MU,RADIUS,DIAMETER, - OMEGAX,OMEGAY,OMEGAZ,ANGMOMX,ANGMOMY,ANGMOMZ, - TQX,TQY,TQZ,SPIN,ERADIUS,ERVEL,ERFORCE, - COMPUTE,FIX,VARIABLE}; -enum{LT,LE,GT,GE,EQ,NEQ}; - /* ---------------------------------------------------------------------- */ DumpXYZMPIIO::DumpXYZMPIIO(LAMMPS *lmp, int narg, char **arg) : From b1e92c9ec6ea1487f951e0b8e1225f3d5ceef015 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Apr 2022 17:38:25 -0400 Subject: [PATCH 50/57] update YAML reading python example to read faster using libyaml. --- doc/src/Howto_structured_data.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/src/Howto_structured_data.rst b/doc/src/Howto_structured_data.rst index 56a1778ece..f18fda4a8c 100644 --- a/doc/src/Howto_structured_data.rst +++ b/doc/src/Howto_structured_data.rst @@ -79,6 +79,10 @@ This data can be extracted and parsed from a log file using python with: .. code-block:: python import re, yaml + try: + from yaml import CSafeLoader as Loader, CSafeDumper as Dumper + except ImportError: + from yaml import SafeLoader, SafeDumper docs = "" with open("log.lammps") as f: @@ -86,7 +90,7 @@ This data can be extracted and parsed from a log file using python with: m = re.search(r"^(keywords:.*$|data:$|---$|\.\.\.$| - \[.*\]$)", line) if m: docs += m.group(0) + '\n' - thermo = list(yaml.load_all(docs, Loader=yaml.SafeLoader)) + thermo = list(yaml.load_all(docs, Loader=Loader)) print("Number of runs: ", len(thermo)) print(thermo[1]['keywords'][4], ' = ', thermo[1]['data'][2][4]) From e944ecd1c222a2a1b72969b8dfed9c99871035d4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Apr 2022 19:10:16 -0400 Subject: [PATCH 51/57] correct docs --- doc/src/dump_modify.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 5dfde62282..4bc852ea36 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -29,7 +29,7 @@ Syntax *colname* values = ID string, or *default* string = new column header name ID = integer from 1 to N, or integer from -1 to -N, where N = # of quantities being output - *or* a thermo keyword or reference to compute, fix, property or variable. + *or* a custom dump keyword or reference to compute, fix, property or variable. *delay* arg = Dstep Dstep = delay output until this timestep *element* args = E1 E2 ... EN, where N = # of atom types @@ -47,7 +47,7 @@ Syntax *format* args = *line* string, *int* string, *float* string, ID string, or *none* string = C-style format string ID = integer from 1 to N, or integer from -1 to -N, where N = # of quantities being output - *or* a thermo keyword or reference to compute, fix, property or variable. + *or* a custom dump keyword or reference to compute, fix, property or variable. *header* arg = *yes* or *no* *yes* to write the header *no* to not write the header @@ -386,7 +386,7 @@ and MPIIO variants. The setting for *ID string* replaces the default text with the provided string. *ID* can be a positive integer when it represents the column number counting from the left, a negative integer when it represents the column number from the right (i.e. -1 is the last -column/keyword), or a thermo keyword (or compute, fix, property, or +column/keyword), or a custom dump keyword (or compute, fix, property, or variable reference) and then it replaces the string for that specific keyword. For *atom* dump styles only the keywords "id", "type", "x", "y", "z", "ix", "iy", "iz" can be accessed via string regardless of From 58ecf03e5da37321b41d284d13867cc64de511aa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 7 Apr 2022 00:37:18 -0400 Subject: [PATCH 52/57] correct yaml import --- doc/src/Howto_structured_data.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Howto_structured_data.rst b/doc/src/Howto_structured_data.rst index f18fda4a8c..b320e87279 100644 --- a/doc/src/Howto_structured_data.rst +++ b/doc/src/Howto_structured_data.rst @@ -82,7 +82,7 @@ This data can be extracted and parsed from a log file using python with: try: from yaml import CSafeLoader as Loader, CSafeDumper as Dumper except ImportError: - from yaml import SafeLoader, SafeDumper + from yaml import SafeLoader as Loader, SafeDumper as Dumper docs = "" with open("log.lammps") as f: From 082254455b4ada187abdcae743e9986ab0481fa4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 7 Apr 2022 00:29:54 -0400 Subject: [PATCH 53/57] improve confusing error messages --- src/POEMS/fix_poems.cpp | 4 +++- src/RIGID/fix_rigid.cpp | 3 ++- src/RIGID/fix_rigid_small.cpp | 3 ++- src/modify.cpp | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/POEMS/fix_poems.cpp b/src/POEMS/fix_poems.cpp index d2df9b0159..7ac3570f2f 100644 --- a/src/POEMS/fix_poems.cpp +++ b/src/POEMS/fix_poems.cpp @@ -356,7 +356,9 @@ void FixPOEMS::init() for (auto ifix : modify->get_fix_list()) { if (utils::strmatch(ifix->style, "^poems")) pflag = true; if (pflag && (ifix->setmask() & POST_FORCE) && !ifix->rigid_flag) - if (comm->me == 0) error->warning(FLERR, "Fix {} alters forces after fix poems", ifix->id); + if (comm->me == 0) + error->warning(FLERR,"Fix {} with ID {} alters forces after fix poems", + ifix->style, ifix->id); } } diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index 6b211d05bf..780dbd66f5 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -693,7 +693,8 @@ void FixRigid::init() for (auto ifix : modify->get_fix_list()) { if (ifix->rigid_flag) rflag = true; if ((comm->me == 0) && rflag && (ifix->setmask() & POST_FORCE) && !ifix->rigid_flag) - error->warning(FLERR,"Fix {} alters forces after fix rigid", ifix->id); + error->warning(FLERR,"Fix {} with ID {} alters forces after fix rigid", + ifix->style, ifix->id); } } diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 5c524c832b..45aadd845f 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -538,7 +538,8 @@ void FixRigidSmall::init() for (auto ifix : modify->get_fix_list()) { if (ifix->rigid_flag) rflag = true; if ((comm->me == 0) && rflag && (ifix->setmask() & POST_FORCE) && !ifix->rigid_flag) - error->warning(FLERR,"Fix {} alters forces after fix rigid", ifix->id); + error->warning(FLERR,"Fix {} with ID {} alters forces after fix rigid/small", + ifix->style, ifix->id); } } diff --git a/src/modify.cpp b/src/modify.cpp index 7c6f8e4ae3..7554079e2a 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -249,11 +249,11 @@ void Modify::init() for (i = 0; i < nfix; i++) if (!fix[i]->dynamic_group_allow && group->dynamic[fix[i]->igroup]) - error->all(FLERR, "Fix {} does not allow use with a dynamic group", fix[i]->id); + error->all(FLERR, "Fix {} does not allow use with a dynamic group", fix[i]->style); for (i = 0; i < ncompute; i++) if (!compute[i]->dynamic_group_allow && group->dynamic[compute[i]->igroup]) - error->all(FLERR, "Compute {} does not allow use with a dynamic group", compute[i]->id); + error->all(FLERR, "Compute {} does not allow use with a dynamic group", compute[i]->style); // warn if any particle is time integrated more than once From 59fa0be35f999a169dd824cee2b457c057d40193 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 7 Apr 2022 02:05:05 -0400 Subject: [PATCH 54/57] update for recent changes in thermo output --- python/lammps/formats.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/lammps/formats.py b/python/lammps/formats.py index 641e17be3e..f7a7a4eb83 100644 --- a/python/lammps/formats.py +++ b/python/lammps/formats.py @@ -46,14 +46,15 @@ class LogFile: for line in f: if "ERROR" in line or "exited on signal" in line: self.errors.append(line) - elif line.startswith('Step '): + + elif re.match(r'^ *Step ', line): in_thermo = True in_data_section = True keys = line.split() current_run = {} for k in keys: current_run[k] = [] - elif line.startswith('---------------- Step'): + elif re.match(r'^------* Step ', line): if not in_thermo: current_run = {'Step': [], 'CPU': []} in_thermo = True From 0e8e1171c60412cc3fa9355deb287083a8e3ac75 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 7 Apr 2022 02:05:47 -0400 Subject: [PATCH 55/57] add unit test for yaml style thermo output and updated logfile class --- examples/README | 1 + examples/yaml/in.yaml | 37 +++++++ examples/yaml/log.7Apr22.yaml.g++.1 | 151 ++++++++++++++++++++++++++++ python/lammps/formats.py | 38 +++++-- unittest/python/python-formats.py | 22 ++++ 5 files changed, 243 insertions(+), 6 deletions(-) create mode 100644 examples/yaml/in.yaml create mode 100644 examples/yaml/log.7Apr22.yaml.g++.1 diff --git a/examples/README b/examples/README index 0c09b6d847..d9637af5c2 100644 --- a/examples/README +++ b/examples/README @@ -118,6 +118,7 @@ ttm: two-temeperature model examples vashishta: models using the Vashishta potential voronoi: Voronoi tesselation via compute voronoi/atom command wall: use of reflective walls with different stochastic models +yaml: demonstrates use of yaml thermo and dump styles Here is how you might run and visualize one of the sample problems: diff --git a/examples/yaml/in.yaml b/examples/yaml/in.yaml new file mode 100644 index 0000000000..28660751c8 --- /dev/null +++ b/examples/yaml/in.yaml @@ -0,0 +1,37 @@ +# 3d Lennard-Jones melt + +variable x index 1 +variable y index 1 +variable z index 1 + +variable xx equal 20*$x +variable yy equal 20*$y +variable zz equal 20*$z + +units lj +atom_style atomic + +lattice fcc 0.8442 +region box block 0 ${xx} 0 ${yy} 0 ${zz} +create_box 1 box +create_atoms 1 box +mass 1 1.0 + +velocity all create 1.44 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 2.5 + +neighbor 0.3 bin +neigh_modify delay 0 every 20 check no + +fix 1 all nve +thermo_style yaml +thermo 10 + +dump 1 all yaml 25 dump.yaml id type x y z ix iy iz vx vy vz +dump_modify 1 sort id thermo yes units yes time yes format 1 %5d format float "% 12.8e" format int %2d + +run 100 + +run 100 diff --git a/examples/yaml/log.7Apr22.yaml.g++.1 b/examples/yaml/log.7Apr22.yaml.g++.1 new file mode 100644 index 0000000000..0c39dbe6a3 --- /dev/null +++ b/examples/yaml/log.7Apr22.yaml.g++.1 @@ -0,0 +1,151 @@ +LAMMPS (24 Mar 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +variable x index 1 +variable y index 1 +variable z index 1 + +variable xx equal 20*$x +variable xx equal 20*1 +variable yy equal 20*$y +variable yy equal 20*1 +variable zz equal 20*$z +variable zz equal 20*1 + +units lj +atom_style atomic + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 ${xx} 0 ${yy} 0 ${zz} +region box block 0 20 0 ${yy} 0 ${zz} +region box block 0 20 0 20 0 ${zz} +region box block 0 20 0 20 0 20 +create_box 1 box +Created orthogonal box = (0 0 0) to (33.591924 33.591924 33.591924) + 1 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 32000 atoms + using lattice units in orthogonal box = (0 0 0) to (33.591924 33.591924 33.591924) + create_atoms CPU = 0.003 seconds +mass 1 1.0 + +velocity all create 1.44 87287 loop geom + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 2.5 + +neighbor 0.3 bin +neigh_modify delay 0 every 20 check no + +fix 1 all nve +thermo_style yaml +thermo 10 + +dump 1 all yaml 25 dump.yaml id type x y z ix iy iz vx vy vz +dump_modify 1 sort id thermo yes units yes time yes format 1 %5d format float "% 12.8e" format int %2d + +run 100 + generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 24 24 24 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 20.56 | 20.56 | 20.56 Mbytes +--- +keywords: [Step, Temp, KinEng, PotEng, E_bond, E_angle, E_dihed, E_impro, E_vdwl, E_coul, E_long, Press, ] +data: + - [0, 1.44000000000001, 2.15993250000001, -6.77336805323422, 0, 0, 0, 0, -6.77336805323422, 0, 0, -5.01970725908556, ] + - [10, 1.12539487029313, 1.68803955255514, -6.30005271976029, 0, 0, 0, 0, -6.30005271976029, 0, 0, -2.55968522600129, ] + - [20, 0.625793798302192, 0.938661363368992, -5.55655653922756, 0, 0, 0, 0, -5.55655653922756, 0, 0, 0.973517658007722, ] + - [30, 0.745927295413064, 1.11885597777762, -5.73951278150759, 0, 0, 0, 0, -5.73951278150759, 0, 0, 0.339284096694852, ] + - [40, 0.731026217827733, 1.09650505988764, -5.71764564663628, 0, 0, 0, 0, -5.71764564663628, 0, 0, 0.388973418756238, ] + - [50, 0.740091517740786, 1.11010258482128, -5.73150426762886, 0, 0, 0, 0, -5.73150426762886, 0, 0, 0.335273324523691, ] + - [60, 0.750500641591031, 1.12571578266897, -5.74713299283555, 0, 0, 0, 0, -5.74713299283555, 0, 0, 0.26343139026926, ] + - [70, 0.755436366857812, 1.13311913920702, -5.75480059117447, 0, 0, 0, 0, -5.75480059117447, 0, 0, 0.224276619217515, ] + - [80, 0.759974280364828, 1.13992579675285, -5.76187162670983, 0, 0, 0, 0, -5.76187162670983, 0, 0, 0.191626237124102, ] + - [90, 0.760464250735042, 1.14066072934081, -5.76280209529731, 0, 0, 0, 0, -5.76280209529731, 0, 0, 0.189478083345243, ] + - [100, 0.757453103239936, 1.13614414924569, -5.75850548601596, 0, 0, 0, 0, -5.75850548601596, 0, 0, 0.207261053624723, ] +... +Loop time of 1.89046 on 1 procs for 100 steps with 32000 atoms + +Performance: 22851.622 tau/day, 52.897 timesteps/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.2896 | 1.2896 | 1.2896 | 0.0 | 68.22 +Neigh | 0.17687 | 0.17687 | 0.17687 | 0.0 | 9.36 +Comm | 0.014543 | 0.014543 | 0.014543 | 0.0 | 0.77 +Output | 0.37678 | 0.37678 | 0.37678 | 0.0 | 19.93 +Modify | 0.028638 | 0.028638 | 0.028638 | 0.0 | 1.51 +Other | | 0.003975 | | | 0.21 + +Nlocal: 32000 ave 32000 max 32000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 19657 ave 19657 max 19657 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1.20283e+06 ave 1.20283e+06 max 1.20283e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1202833 +Ave neighs/atom = 37.588531 +Neighbor list builds = 5 +Dangerous builds not checked + +run 100 + generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 20.57 | 20.57 | 20.57 Mbytes +--- +keywords: [Step, Temp, KinEng, PotEng, E_bond, E_angle, E_dihed, E_impro, E_vdwl, E_coul, E_long, Press, ] +data: + - [100, 0.757453103239935, 1.13614414924569, -5.7585054860159, 0, 0, 0, 0, -5.7585054860159, 0, 0, 0.207261053624721, ] + - [110, 0.759322359337036, 1.13894794576996, -5.7614668389562, 0, 0, 0, 0, -5.7614668389562, 0, 0, 0.194314975399602, ] + - [120, 0.759372342462676, 1.13902291811546, -5.76149365656489, 0, 0, 0, 0, -5.76149365656489, 0, 0, 0.191600048851267, ] + - [130, 0.756833027516501, 1.13521406472659, -5.75777334823494, 0, 0, 0, 0, -5.75777334823494, 0, 0, 0.208792327853067, ] + - [140, 0.759725426691298, 1.13955252790757, -5.76208910746081, 0, 0, 0, 0, -5.76208910746081, 0, 0, 0.193895435346637, ] + - [150, 0.760545839455106, 1.14078310859643, -5.7633284876011, 0, 0, 0, 0, -5.7633284876011, 0, 0, 0.187959630462945, ] + - [160, 0.758404626168493, 1.13757138903589, -5.76023198892283, 0, 0, 0, 0, -5.76023198892283, 0, 0, 0.19692107984108, ] + - [170, 0.758880300638885, 1.13828487844424, -5.76103232235402, 0, 0, 0, 0, -5.76103232235402, 0, 0, 0.197653518549842, ] + - [180, 0.753691827878246, 1.13050241251294, -5.75304767384283, 0, 0, 0, 0, -5.75304767384283, 0, 0, 0.237041776410937, ] + - [190, 0.757361226563721, 1.13600633853809, -5.75852399133222, 0, 0, 0, 0, -5.75852399133222, 0, 0, 0.219529562657488, ] + - [200, 0.759531750132731, 1.13926202214831, -5.76188923485725, 0, 0, 0, 0, -5.76188923485725, 0, 0, 0.209105747192796, ] +... +Loop time of 1.93916 on 1 procs for 100 steps with 32000 atoms + +Performance: 22277.687 tau/day, 51.569 timesteps/s +99.4% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.3292 | 1.3292 | 1.3292 | 0.0 | 68.55 +Neigh | 0.18317 | 0.18317 | 0.18317 | 0.0 | 9.45 +Comm | 0.013626 | 0.013626 | 0.013626 | 0.0 | 0.70 +Output | 0.38206 | 0.38206 | 0.38206 | 0.0 | 19.70 +Modify | 0.027034 | 0.027034 | 0.027034 | 0.0 | 1.39 +Other | | 0.004028 | | | 0.21 + +Nlocal: 32000 ave 32000 max 32000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 19570 ave 19570 max 19570 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1.19982e+06 ave 1.19982e+06 max 1.19982e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1199821 +Ave neighs/atom = 37.494406 +Neighbor list builds = 5 +Dangerous builds not checked +Total wall time: 0:00:04 diff --git a/python/lammps/formats.py b/python/lammps/formats.py index f7a7a4eb83..83d05dd9f7 100644 --- a/python/lammps/formats.py +++ b/python/lammps/formats.py @@ -14,14 +14,19 @@ ################################################################################ # LAMMPS output formats # Written by Richard Berger +# and Axel Kohlmeyer ################################################################################ -import re +import re, yaml +try: + from yaml import CSafeLoader as Loader, CSafeDumper as Dumper +except ImportError: + from yaml import SafeLoader as Loader, SafeDumper as Dumper class LogFile: """Reads LAMMPS log files and extracts the thermo information - It supports both the default thermo output style (including custom) and multi. + It supports the line, multi, and yaml thermo output styles. :param filename: path to log file :type filename: str @@ -33,11 +38,13 @@ class LogFile: STYLE_DEFAULT = 0 STYLE_MULTI = 1 + STYLE_YAML = 2 def __init__(self, filename): alpha = re.compile(r'[a-df-zA-DF-Z]') # except e or E for floating-point numbers kvpairs = re.compile(r'([a-zA-Z_0-9]+)\s+=\s*([0-9\.eE\-]+)') style = LogFile.STYLE_DEFAULT + yamllog = "" self.runs = [] self.errors = [] with open(filename, 'rt') as f: @@ -54,6 +61,24 @@ class LogFile: current_run = {} for k in keys: current_run[k] = [] + + elif re.match(r'^(keywords:.*$|data:$|---$| - \[.*\]$)', line): + style = LogFile.STYLE_YAML + yamllog += line; + current_run = {} + + elif re.match(r'^\.\.\.$', line): + thermo = yaml.load(yamllog, Loader=Loader) + for k in thermo['keywords']: + current_run[k] = [] + for step in thermo['data']: + icol = 0 + for k in thermo['keywords']: + current_run[k].append(step[icol]) + icol += 1 + self.runs.append(current_run) + yamllog = "" + elif re.match(r'^------* Step ', line): if not in_thermo: current_run = {'Step': [], 'CPU': []} @@ -65,28 +90,29 @@ class LogFile: cpu = float(str_cpu.split('=')[1].split()[0]) current_run["Step"].append(step) current_run["CPU"].append(cpu) + elif line.startswith('Loop time of'): in_thermo = False - self.runs.append(current_run) + if style != LogFile.STYLE_YAML: + self.runs.append(current_run) + elif in_thermo and in_data_section: if style == LogFile.STYLE_DEFAULT: if alpha.search(line): continue - for k, v in zip(keys, map(float, line.split())): current_run[k].append(v) + elif style == LogFile.STYLE_MULTI: if '=' not in line: in_data_section = False continue - for k,v in kvpairs.findall(line): if k not in current_run: current_run[k] = [float(v)] else: current_run[k].append(float(v)) - class AvgChunkFile: """Reads files generated by fix ave/chunk diff --git a/unittest/python/python-formats.py b/unittest/python/python-formats.py index ca877b8305..9e7863e198 100644 --- a/unittest/python/python-formats.py +++ b/unittest/python/python-formats.py @@ -7,6 +7,7 @@ EXAMPLES_DIR=os.path.abspath(os.path.join(__file__, '..', '..', '..', 'examples' DEFAULT_STYLE_EXAMPLE_LOG="melt/log.8Apr21.melt.g++.1" MULTI_STYLE_EXAMPLE_LOG="peptide/log.27Nov18.peptide.g++.1" AVG_CHUNK_FILE="VISCOSITY/profile.13Oct16.nemd.2d.g++.1" +YAML_STYLE_EXAMPLE_LOG="yaml/log.7Apr22.yaml.g++.1" class Logfiles(unittest.TestCase): def testLogFileNotFound(self): @@ -58,6 +59,27 @@ class Logfiles(unittest.TestCase): self.assertEqual(run0["Step"], list(range(0,350, 50))) + def testYamlLogFile(self): + log = LogFile(os.path.join(EXAMPLES_DIR, YAML_STYLE_EXAMPLE_LOG)) + self.assertEqual(len(log.runs), 2) + run = log.runs[0] + self.assertEqual(len(run.keys()), 12) + self.assertIn("Step", run) + self.assertIn("Temp", run) + self.assertIn("E_vdwl", run) + self.assertIn("E_coul", run) + self.assertIn("E_bond", run) + self.assertIn("E_angle", run) + self.assertIn("Press", run) + self.assertEqual(len(run["Step"]), 11) + self.assertEqual(len(run["Temp"]), 11) + self.assertEqual(len(run["E_vdwl"]), 11) + self.assertEqual(len(run["E_coul"]), 11) + self.assertEqual(len(run["E_bond"]), 11) + self.assertEqual(len(run["E_angle"]), 11) + self.assertEqual(len(run["Press"]), 11) + self.assertEqual(log.runs[0]["Step"], [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]) + class AvgChunkFiles(unittest.TestCase): def testAvgChunkFileNotFound(self): From ab0e5d5568ebcce20ef82a0b33f15314b7c3c8d5 Mon Sep 17 00:00:00 2001 From: Nick Curtis Date: Thu, 7 Apr 2022 17:48:03 -0400 Subject: [PATCH 56/57] Fix for building GPU backend on ROCm 5.0+ Change-Id: I32ad9be86d6a0467ccae555a1d0272813c905e97 --- cmake/Modules/Packages/GPU.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/Modules/Packages/GPU.cmake b/cmake/Modules/Packages/GPU.cmake index aec8887c30..53b5f33b9b 100644 --- a/cmake/Modules/Packages/GPU.cmake +++ b/cmake/Modules/Packages/GPU.cmake @@ -347,6 +347,10 @@ elseif(GPU_API STREQUAL "HIP") target_link_libraries(gpu PRIVATE hip::host) if(HIP_USE_DEVICE_SORT) + if(HIP_PLATFORM STREQUAL "amd") + # newer version of ROCm (5.1+) require c++14 for rocprim + set_property(TARGET gpu PROPERTY CXX_STANDARD 14) + endif() # add hipCUB target_include_directories(gpu PRIVATE ${HIP_ROOT_DIR}/../include) target_compile_definitions(gpu PRIVATE -DUSE_HIP_DEVICE_SORT) From 77565add6e648575f6b1adb5228a4c11048320bf Mon Sep 17 00:00:00 2001 From: Nick Curtis Date: Thu, 7 Apr 2022 17:54:20 -0400 Subject: [PATCH 57/57] Add C++14 to Makefile build system Change-Id: I24f72b4aaca93a49877775c3d181507c83cd7f82 --- lib/gpu/Makefile.hip | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/gpu/Makefile.hip b/lib/gpu/Makefile.hip index d5391f7d6b..9b6087bcc3 100644 --- a/lib/gpu/Makefile.hip +++ b/lib/gpu/Makefile.hip @@ -28,6 +28,11 @@ HIP_HOST_INCLUDE += -I./ # path to hipcub HIP_HOST_INCLUDE += -I$(HIP_PATH)/../include +ifeq (amd,$(HIP_PLATFORM)) + # newer version of ROCm (5.1+) require c++14 for rocprim + HIP_OPTS += -std=c++14 +endif + # use mpi HIP_HOST_OPTS += -DMPI_GERYON -DUCL_NO_EXIT # this settings should match LAMMPS Makefile