From 062c1a04fcc129f2ba61edaac2f7b35e07e11e81 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 14 Aug 2018 14:42:01 -0600 Subject: [PATCH 01/90] Commit JT 081418 - initial commit pppm_spin branch - copied short_range spin files (src/SPIN) - copied/renamed Stan's file (from pppm_dipole branch) --- src/DIPOLE/pair_lj_cut_dipole_long.cpp | 2 +- src/KSPACE/pppm.h | 8 +- src/KSPACE/pppm_spin.cpp | 2559 ++++++++++++++++++++++++ src/KSPACE/pppm_spin.h | 213 ++ src/SPIN/pair_spin_long.cpp | 550 +++++ src/SPIN/pair_spin_long.h | 97 + src/kspace.cpp | 4 +- src/kspace.h | 2 +- 8 files changed, 3427 insertions(+), 8 deletions(-) create mode 100644 src/KSPACE/pppm_spin.cpp create mode 100644 src/KSPACE/pppm_spin.h create mode 100644 src/SPIN/pair_spin_long.cpp create mode 100644 src/SPIN/pair_spin_long.h diff --git a/src/DIPOLE/pair_lj_cut_dipole_long.cpp b/src/DIPOLE/pair_lj_cut_dipole_long.cpp index 817a120e3d..a0e7c1c4ec 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_cut_dipole_long.cpp @@ -44,7 +44,7 @@ using namespace MathConst; PairLJCutDipoleLong::PairLJCutDipoleLong(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; - ewaldflag = dipoleflag = 1; + ewaldflag = pppmflag = dipoleflag = 1; respa_enable = 0; } diff --git a/src/KSPACE/pppm.h b/src/KSPACE/pppm.h index 9cb6bebb25..c6d463b69c 100644 --- a/src/KSPACE/pppm.h +++ b/src/KSPACE/pppm.h @@ -41,7 +41,7 @@ class PPPM : public KSpace { virtual ~PPPM(); virtual void init(); virtual void setup(); - void setup_grid(); + virtual void setup_grid(); virtual void compute(int, int); virtual int timing_1d(int, double &); virtual int timing_3d(int, double &); @@ -105,10 +105,10 @@ class PPPM : public KSpace { double qdist; // distance from O site to negative charge double alpha; // geometric factor - void set_grid_global(); + virtual void set_grid_global(); void set_grid_local(); void adjust_gewald(); - double newton_raphson_f(); + virtual double newton_raphson_f(); double derivf(); double final_accuracy(); @@ -145,7 +145,7 @@ class PPPM : public KSpace { void compute_drho1d(const FFT_SCALAR &, const FFT_SCALAR &, const FFT_SCALAR &); void compute_rho_coeff(); - void slabcorr(); + virtual void slabcorr(); // grid communication diff --git a/src/KSPACE/pppm_spin.cpp b/src/KSPACE/pppm_spin.cpp new file mode 100644 index 0000000000..32e91cc9b2 --- /dev/null +++ b/src/KSPACE/pppm_spin.cpp @@ -0,0 +1,2559 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include "pppm_dipole.h" +#include "atom.h" +#include "comm.h" +#include "gridcomm.h" +#include "neighbor.h" +#include "force.h" +#include "pair.h" +#include "bond.h" +#include "angle.h" +#include "domain.h" +#include "fft3d_wrap.h" +#include "remap_wrap.h" +#include "memory.h" +#include "error.h" +#include "update.h" + +#include "math_const.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; + +#define MAXORDER 7 +#define OFFSET 16384 +#define LARGE 10000.0 +#define SMALL 0.00001 +#define EPS_HOC 1.0e-7 + +enum{REVERSE_MU}; +enum{FORWARD_MU,FORWARD_MU_PERATOM}; + +#ifdef FFT_SINGLE +#define ZEROF 0.0f +#define ONEF 1.0f +#else +#define ZEROF 0.0 +#define ONEF 1.0 +#endif + +/* ---------------------------------------------------------------------- */ + +PPPMDipole::PPPMDipole(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), + densityx_brick_dipole(NULL), densityy_brick_dipole(NULL), + densityz_brick_dipole(NULL), ux_brick_dipole(NULL), + uy_brick_dipole(NULL), uz_brick_dipole(NULL), vdxx_brick_dipole(NULL), + vdxy_brick_dipole(NULL), vdyy_brick_dipole(NULL), + vdxz_brick_dipole(NULL), vdyz_brick_dipole(NULL), + vdzz_brick_dipole(NULL), v0x_brick_dipole(NULL), v1x_brick_dipole(NULL), + v2x_brick_dipole(NULL), v3x_brick_dipole(NULL), v4x_brick_dipole(NULL), + v5x_brick_dipole(NULL), v0y_brick_dipole(NULL), v1y_brick_dipole(NULL), + v2y_brick_dipole(NULL), v3y_brick_dipole(NULL), v4y_brick_dipole(NULL), + v5y_brick_dipole(NULL), v0z_brick_dipole(NULL), v1z_brick_dipole(NULL), + v2z_brick_dipole(NULL), v3z_brick_dipole(NULL), v4z_brick_dipole(NULL), + v5z_brick_dipole(NULL), work3(NULL), work4(NULL), + densityx_fft_dipole(NULL), densityy_fft_dipole(NULL), + densityz_fft_dipole(NULL) +{ + dipoleflag = 1; + group_group_enable = 0; + + cg_dipole = NULL; + cg_peratom_dipole = NULL; +} + +/* ---------------------------------------------------------------------- + free all memory +------------------------------------------------------------------------- */ + +PPPMDipole::~PPPMDipole() +{ + if (copymode) return; + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + fft1 = NULL; + fft2 = NULL; + remap = NULL; + cg_dipole = NULL; +} + +/* ---------------------------------------------------------------------- + called once before run +------------------------------------------------------------------------- */ + +void PPPMDipole::init() +{ + if (me == 0) { + if (screen) fprintf(screen,"PPPMDipole initialization ...\n"); + if (logfile) fprintf(logfile,"PPPMDipole initialization ...\n"); + } + + // error check + + dipoleflag = atom->mu?1:0; + qsum_qsq(0); + if (dipoleflag && q2) + error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMDipole"); + + triclinic_check(); + + if (triclinic != domain->triclinic) + error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); + + if (domain->dimension == 2) error->all(FLERR, + "Cannot use PPPMDipole with 2d simulation"); + if (comm->style != 0) + error->universe_all(FLERR,"PPPMDipole can only currently be used with " + "comm_style brick"); + + if (!atom->mu) error->all(FLERR,"Kspace style requires atom attribute mu"); + + if (atom->mu && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" + " ad with dipoles"); + + if (dipoleflag && strcmp(update->unit_style,"electron") == 0) + error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); + } + + if (order < 2 || order > MAXORDER) { + char str[128]; + sprintf(str,"PPPMDipole order cannot be < 2 or > than %d",MAXORDER); + error->all(FLERR,str); + } + + // extract short-range Coulombic cutoff from pair style + + triclinic = domain->triclinic; + if (triclinic) + error->all(FLERR,"Cannot yet use triclinic cells with PPPMDipole"); + + pair_check(); + + int itmp = 0; + double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + if (p_cutoff == NULL) + error->all(FLERR,"KSpace style is incompatible with Pair style"); + cutoff = *p_cutoff; + + // kspace TIP4P not yet supported + + if (tip4pflag) + error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); + + // compute qsum & qsqsum and warn if not charge-neutral + + scale = 1.0; + qqrd2e = force->qqrd2e; + musum_musq(); + natoms_original = atom->natoms; + + // set accuracy (force units) from accuracy_relative or accuracy_absolute + + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; + else accuracy = accuracy_relative * two_charge_force; + + // free all arrays previously allocated + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + + // setup FFT grid resolution and g_ewald + // normally one iteration thru while loop is all that is required + // if grid stencil does not extend beyond neighbor proc + // or overlap is allowed, then done + // else reduce order and try again + + int (*procneigh)[2] = comm->procneigh; + + GridComm *cgtmp = NULL; + int iteration = 0; + + while (order >= minorder) { + if (iteration && me == 0) + error->warning(FLERR,"Reducing PPPMDipole order b/c stencil extends " + "beyond nearest neighbor processor"); + + compute_gf_denom(); + set_grid_global(); + set_grid_local(); + if (overlap_allowed) break; + + cgtmp = new GridComm(lmp,world,1,1, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, + procneigh[0][0],procneigh[0][1],procneigh[1][0], + procneigh[1][1],procneigh[2][0],procneigh[2][1]); + cgtmp->ghost_notify(); + if (!cgtmp->ghost_overlap()) break; + delete cgtmp; + + order--; + iteration++; + } + + if (order < minorder) error->all(FLERR,"PPPMDipole order < minimum allowed order"); + if (!overlap_allowed && cgtmp->ghost_overlap()) + error->all(FLERR,"PPPMDipole grid stencil extends " + "beyond nearest neighbor processor"); + if (cgtmp) delete cgtmp; + + // adjust g_ewald + + if (!gewaldflag) adjust_gewald(); + + // calculate the final accuracy + + double estimated_accuracy = final_accuracy_dipole(); + + // print stats + + int ngrid_max,nfft_both_max; + MPI_Allreduce(&ngrid,&ngrid_max,1,MPI_INT,MPI_MAX,world); + MPI_Allreduce(&nfft_both,&nfft_both_max,1,MPI_INT,MPI_MAX,world); + + if (me == 0) { + +#ifdef FFT_SINGLE + const char fft_prec[] = "single"; +#else + const char fft_prec[] = "double"; +#endif + + if (screen) { + fprintf(screen," G vector (1/distance) = %g\n",g_ewald); + fprintf(screen," grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm); + fprintf(screen," stencil order = %d\n",order); + fprintf(screen," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(screen," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(screen," using %s precision FFTs\n",fft_prec); + fprintf(screen," 3d grid and FFT values/proc = %d %d\n", + ngrid_max,nfft_both_max); + } + if (logfile) { + fprintf(logfile," G vector (1/distance) = %g\n",g_ewald); + fprintf(logfile," grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm); + fprintf(logfile," stencil order = %d\n",order); + fprintf(logfile," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(logfile," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(logfile," using %s precision FFTs\n",fft_prec); + fprintf(logfile," 3d grid and FFT values/proc = %d %d\n", + ngrid_max,nfft_both_max); + } + } + + // allocate K-space dependent memory + // don't invoke allocate peratom(), will be allocated when needed + + allocate(); + cg_dipole->ghost_notify(); + cg_dipole->setup(); + + // pre-compute Green's function denomiator expansion + // pre-compute 1d charge distribution coefficients + + compute_gf_denom(); + compute_rho_coeff(); +} + +/* ---------------------------------------------------------------------- + adjust PPPMDipole coeffs, called initially and whenever volume has changed +------------------------------------------------------------------------- */ + +void PPPMDipole::setup() +{ + // perform some checks to avoid illegal boundaries with read_data + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); + } + + int i,j,k,n; + double *prd; + + // volume-dependent factors + // adjust z dimension for 2d slab PPPMDipole + // z dimension for 3d PPPMDipole is zprd since slab_volfactor = 1.0 + + prd = domain->prd; + double xprd = prd[0]; + double yprd = prd[1]; + double zprd = prd[2]; + double zprd_slab = zprd*slab_volfactor; + volume = xprd * yprd * zprd_slab; + + delxinv = nx_pppm/xprd; + delyinv = ny_pppm/yprd; + delzinv = nz_pppm/zprd_slab; + + delvolinv = delxinv*delyinv*delzinv; + + double unitkx = (MY_2PI/xprd); + double unitky = (MY_2PI/yprd); + double unitkz = (MY_2PI/zprd_slab); + + // fkx,fky,fkz for my FFT grid pts + + double per; + + for (i = nxlo_fft; i <= nxhi_fft; i++) { + per = i - nx_pppm*(2*i/nx_pppm); + fkx[i] = unitkx*per; + } + + for (i = nylo_fft; i <= nyhi_fft; i++) { + per = i - ny_pppm*(2*i/ny_pppm); + fky[i] = unitky*per; + } + + for (i = nzlo_fft; i <= nzhi_fft; i++) { + per = i - nz_pppm*(2*i/nz_pppm); + fkz[i] = unitkz*per; + } + + // virial coefficients + + double sqk,vterm; + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) { + for (j = nylo_fft; j <= nyhi_fft; j++) { + for (i = nxlo_fft; i <= nxhi_fft; i++) { + sqk = fkx[i]*fkx[i] + fky[j]*fky[j] + fkz[k]*fkz[k]; + if (sqk == 0.0) { + vg[n][0] = 0.0; + vg[n][1] = 0.0; + vg[n][2] = 0.0; + vg[n][3] = 0.0; + vg[n][4] = 0.0; + vg[n][5] = 0.0; + } else { + vterm = -2.0 * (1.0/sqk + 0.25/(g_ewald*g_ewald)); + vg[n][0] = 1.0 + vterm*fkx[i]*fkx[i]; + vg[n][1] = 1.0 + vterm*fky[j]*fky[j]; + vg[n][2] = 1.0 + vterm*fkz[k]*fkz[k]; + vg[n][3] = vterm*fkx[i]*fky[j]; + vg[n][4] = vterm*fkx[i]*fkz[k]; + vg[n][5] = vterm*fky[j]*fkz[k]; + } + n++; + } + } + } + + compute_gf_dipole(); +} + +/* ---------------------------------------------------------------------- + reset local grid arrays and communication stencils + called by fix balance b/c it changed sizes of processor sub-domains +------------------------------------------------------------------------- */ + +void PPPMDipole::setup_grid() +{ + // free all arrays previously allocated + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + + // reset portion of global grid that each proc owns + + set_grid_local(); + + // reallocate K-space dependent memory + // check if grid communication is now overlapping if not allowed + // don't invoke allocate peratom(), will be allocated when needed + + allocate(); + + cg_dipole->ghost_notify(); + if (overlap_allowed == 0 && cg_dipole->ghost_overlap()) + error->all(FLERR,"PPPMDipole grid stencil extends " + "beyond nearest neighbor processor"); + cg_dipole->setup(); + + // pre-compute Green's function denomiator expansion + // pre-compute 1d charge distribution coefficients + + compute_gf_denom(); + compute_rho_coeff(); + + // pre-compute volume-dependent coeffs + + setup(); +} + +/* ---------------------------------------------------------------------- + compute the PPPMDipole long-range force, energy, virial +------------------------------------------------------------------------- */ + +void PPPMDipole::compute(int eflag, int vflag) +{ + int i,j; + + // set energy/virial flags + // invoke allocate_peratom() if needed for first time + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = evflag_atom = eflag_global = vflag_global = + eflag_atom = vflag_atom = 0; + + if (evflag_atom && !peratom_allocate_flag) { + allocate_peratom(); + cg_peratom_dipole->ghost_notify(); + cg_peratom_dipole->setup(); + } + + // if atom count has changed, update qsum and qsqsum + + if (atom->natoms != natoms_original) { + musum_musq(); + natoms_original = atom->natoms; + } + + // return if there are no dipoles + + if (musqsum == 0.0) return; + + // convert atoms from box to lamda coords + + boxlo = domain->boxlo; + + // extend size of per-atom arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(part2grid); + nmax = atom->nmax; + memory->create(part2grid,nmax,3,"pppm_dipole:part2grid"); + } + + // find grid points for all my particles + // map my particle charge onto my local 3d density grid + + particle_map(); + make_rho_dipole(); + + // all procs communicate density values from their ghost cells + // to fully sum contribution in their 3d bricks + // remap from 3d decomposition to FFT decomposition + + cg_dipole->reverse_comm(this,REVERSE_MU); + brick2fft_dipole(); + + // compute potential gradient on my FFT grid and + // portion of e_long on this proc's FFT grid + // return gradients (electric fields) in 3d brick decomposition + // also performs per-atom calculations via poisson_peratom() + + poisson_ik_dipole(); + + // all procs communicate E-field values + // to fill ghost cells surrounding their 3d bricks + + cg_dipole->forward_comm(this,FORWARD_MU); + + // extra per-atom energy/virial communication + + if (evflag_atom) { + cg_peratom_dipole->forward_comm(this,FORWARD_MU_PERATOM); + } + + // calculate the force on my particles + + fieldforce_ik_dipole(); + + // extra per-atom energy/virial communication + + if (evflag_atom) fieldforce_peratom_dipole(); + + // sum global energy across procs and add in volume-dependent term + + const double qscale = qqrd2e * scale; + const double g3 = g_ewald*g_ewald*g_ewald; + + if (eflag_global) { + double energy_all; + MPI_Allreduce(&energy,&energy_all,1,MPI_DOUBLE,MPI_SUM,world); + energy = energy_all; + + energy *= 0.5*volume; + energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy *= qscale; + } + + // sum global virial across procs + + if (vflag_global) { + double virial_all[6]; + MPI_Allreduce(virial,virial_all,6,MPI_DOUBLE,MPI_SUM,world); + for (i = 0; i < 6; i++) virial[i] = 0.5*qscale*volume*virial_all[i]; + } + + // per-atom energy/virial + // energy includes self-energy correction + + if (evflag_atom) { + double *q = atom->q; + double **mu = atom->mu; + int nlocal = atom->nlocal; + int ntotal = nlocal; + + if (eflag_atom) { + for (i = 0; i < nlocal; i++) { + eatom[i] *= 0.5; + eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; + eatom[i] *= qscale; + } + } + + if (vflag_atom) { + for (i = 0; i < ntotal; i++) + for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*qscale; + } + } + + // 2d slab correction + + if (slabflag == 1) slabcorr(); +} + +/* ---------------------------------------------------------------------- + allocate memory that depends on # of K-vectors and order +------------------------------------------------------------------------- */ + +void PPPMDipole::allocate() +{ + memory->create3d_offset(densityx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityx_brick_dipole"); + memory->create3d_offset(densityy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityy_brick_dipole"); + memory->create3d_offset(densityz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityz_brick_dipole"); + + memory->create(densityx_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); + memory->create(densityy_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); + memory->create(densityz_fft_dipole,nfft_both,"pppm_dipole:densityz_fft_dipole"); + + memory->create(greensfn,nfft_both,"pppm_dipole:greensfn"); + memory->create(work1,2*nfft_both,"pppm_dipole:work1"); + memory->create(work2,2*nfft_both,"pppm_dipole:work2"); + memory->create(work3,2*nfft_both,"pppm_dipole:work3"); + memory->create(work4,2*nfft_both,"pppm_dipole:work4"); + memory->create(vg,nfft_both,6,"pppm_dipole:vg"); + + memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_dipole:fkx"); + memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_dipole:fky"); + memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_dipole:fkz"); + + memory->create3d_offset(ux_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:ux_brick_dipole"); + memory->create3d_offset(uy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:uy_brick_dipole"); + memory->create3d_offset(uz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:uz_brick_dipole"); + + memory->create3d_offset(vdxx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxx_brick_dipole"); + memory->create3d_offset(vdxy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxy_brick_dipole"); + memory->create3d_offset(vdyy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdyy_brick_dipole"); + memory->create3d_offset(vdxz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxz_brick_dipole"); + memory->create3d_offset(vdyz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdyz_brick_dipole"); + memory->create3d_offset(vdzz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdzz_brick_dipole"); + + // summation coeffs + + order_allocated = order; + memory->create(gf_b,order,"pppm_dipole:gf_b"); + memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_dipole:rho1d"); + memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_dipole:drho1d"); + memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_dipole:rho_coeff"); + memory->create2d_offset(drho_coeff,order,(1-order)/2,order/2, + "pppm_dipole:drho_coeff"); + + // create 2 FFTs and a Remap + // 1st FFT keeps data in FFT decompostion + // 2nd FFT returns data in 3d brick decomposition + // remap takes data from 3d brick to FFT decomposition + + int tmp; + + fft1 = new FFT3d(lmp,world,nx_pppm,ny_pppm,nz_pppm, + nxlo_fft,nxhi_fft,nylo_fft,nyhi_fft,nzlo_fft,nzhi_fft, + nxlo_fft,nxhi_fft,nylo_fft,nyhi_fft,nzlo_fft,nzhi_fft, + 0,0,&tmp,collective_flag); + + fft2 = new FFT3d(lmp,world,nx_pppm,ny_pppm,nz_pppm, + nxlo_fft,nxhi_fft,nylo_fft,nyhi_fft,nzlo_fft,nzhi_fft, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + 0,0,&tmp,collective_flag); + + remap = new Remap(lmp,world, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_fft,nxhi_fft,nylo_fft,nyhi_fft,nzlo_fft,nzhi_fft, + 1,0,0,FFT_PRECISION,collective_flag); + + // create ghost grid object for rho and electric field communication + + int (*procneigh)[2] = comm->procneigh; + + cg_dipole = new GridComm(lmp,world,9,3, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, + procneigh[0][0],procneigh[0][1],procneigh[1][0], + procneigh[1][1],procneigh[2][0],procneigh[2][1]); +} + +/* ---------------------------------------------------------------------- + deallocate memory that depends on # of K-vectors and order +------------------------------------------------------------------------- */ + +void PPPMDipole::deallocate() +{ + memory->destroy3d_offset(densityx_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy3d_offset(ux_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy3d_offset(vdxx_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdzz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy(densityx_fft_dipole); + memory->destroy(densityy_fft_dipole); + memory->destroy(densityz_fft_dipole); + + memory->destroy(greensfn); + memory->destroy(work1); + memory->destroy(work2); + memory->destroy(work3); + memory->destroy(work4); + memory->destroy(vg); + + memory->destroy1d_offset(fkx,nxlo_fft); + memory->destroy1d_offset(fky,nylo_fft); + memory->destroy1d_offset(fkz,nzlo_fft); + + memory->destroy(gf_b); + memory->destroy2d_offset(rho1d,-order_allocated/2); + memory->destroy2d_offset(drho1d,-order_allocated/2); + memory->destroy2d_offset(rho_coeff,(1-order_allocated)/2); + memory->destroy2d_offset(drho_coeff,(1-order_allocated)/2); + + delete fft1; + delete fft2; + delete remap; + delete cg_dipole; +} + +/* ---------------------------------------------------------------------- + allocate per-atom memory that depends on # of K-vectors and order +------------------------------------------------------------------------- */ + +void PPPMDipole::allocate_peratom() +{ + peratom_allocate_flag = 1; + + memory->create3d_offset(v0x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0x_brick_dipole"); + memory->create3d_offset(v1x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1x_brick_dipole"); + memory->create3d_offset(v2x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2x_brick_dipole"); + memory->create3d_offset(v3x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3x_brick_dipole"); + memory->create3d_offset(v4x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4x_brick_dipole"); + memory->create3d_offset(v5x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5x_brick_dipole"); + + memory->create3d_offset(v0y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0y_brick_dipole"); + memory->create3d_offset(v1y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1y_brick_dipole"); + memory->create3d_offset(v2y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2y_brick_dipole"); + memory->create3d_offset(v3y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3y_brick_dipole"); + memory->create3d_offset(v4y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4y_brick_dipole"); + memory->create3d_offset(v5y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5y_brick_dipole"); + + memory->create3d_offset(v0z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0z_brick_dipole"); + memory->create3d_offset(v1z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1z_brick_dipole"); + memory->create3d_offset(v2z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2z_brick_dipole"); + memory->create3d_offset(v3z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3z_brick_dipole"); + memory->create3d_offset(v4z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4z_brick_dipole"); + memory->create3d_offset(v5z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5z_brick_dipole"); + + // create ghost grid object for rho and electric field communication + + int (*procneigh)[2] = comm->procneigh; + + cg_peratom_dipole = + new GridComm(lmp,world,18,1, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, + procneigh[0][0],procneigh[0][1],procneigh[1][0], + procneigh[1][1],procneigh[2][0],procneigh[2][1]); +} + +/* ---------------------------------------------------------------------- + deallocate per-atom memory that depends on # of K-vectors and order +------------------------------------------------------------------------- */ + +void PPPMDipole::deallocate_peratom() +{ + peratom_allocate_flag = 0; + + memory->destroy3d_offset(v0x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy3d_offset(v0y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy3d_offset(v0z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + delete cg_peratom_dipole; +} + +/* ---------------------------------------------------------------------- + set global size of PPPMDipole grid = nx,ny,nz_pppm + used for charge accumulation, FFTs, and electric field interpolation +------------------------------------------------------------------------- */ + +void PPPMDipole::set_grid_global() +{ + // use xprd,yprd,zprd + // adjust z dimension for 2d slab PPPMDipole + // 3d PPPMDipole just uses zprd since slab_volfactor = 1.0 + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double zprd_slab = zprd*slab_volfactor; + + // make initial g_ewald estimate + // based on desired accuracy and real space cutoff + // fluid-occupied volume used to estimate real-space error + // zprd used rather than zprd_slab + + double h; + bigint natoms = atom->natoms; + + if (!gewaldflag) { + if (accuracy <= 0.0) + error->all(FLERR,"KSpace accuracy must be > 0"); + if (mu2 == 0.0) + error->all(FLERR,"Must use kspace_modify gewald for systems with no dipoles"); + g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; + //Try Newton Solver + double g_ewald_new = + find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + if (g_ewald_new > 0.0) g_ewald = g_ewald_new; + else error->warning(FLERR,"PPPMDipole dipole Newton solver failed, " + "using old method to estimate g_ewald"); + } + + // set optimal nx_pppm,ny_pppm,nz_pppm based on order and accuracy + // nz_pppm uses extended zprd_slab instead of zprd + // reduce it until accuracy target is met + + if (!gridflag) { + + h = h_x = h_y = h_z = 4.0/g_ewald; + int count = 0; + while (1) { + + // set grid dimension + nx_pppm = static_cast (xprd/h_x); + ny_pppm = static_cast (yprd/h_y); + nz_pppm = static_cast (zprd_slab/h_z); + + if (nx_pppm <= 1) nx_pppm = 2; + if (ny_pppm <= 1) ny_pppm = 2; + if (nz_pppm <= 1) nz_pppm = 2; + + //set local grid dimension + int npey_fft,npez_fft; + if (nz_pppm >= nprocs) { + npey_fft = 1; + npez_fft = nprocs; + } else procs2grid2d(nprocs,ny_pppm,nz_pppm,&npey_fft,&npez_fft); + + int me_y = me % npey_fft; + int me_z = me / npey_fft; + + nxlo_fft = 0; + nxhi_fft = nx_pppm - 1; + nylo_fft = me_y*ny_pppm/npey_fft; + nyhi_fft = (me_y+1)*ny_pppm/npey_fft - 1; + nzlo_fft = me_z*nz_pppm/npez_fft; + nzhi_fft = (me_z+1)*nz_pppm/npez_fft - 1; + + double df_kspace = compute_df_kspace_dipole(); + + count++; + + // break loop if the accuracy has been reached or + // too many loops have been performed + + if (df_kspace <= accuracy) break; + if (count > 500) error->all(FLERR, "Could not compute grid size"); + h *= 0.95; + h_x = h_y = h_z = h; + } + } + + // boost grid size until it is factorable + + while (!factorable(nx_pppm)) nx_pppm++; + while (!factorable(ny_pppm)) ny_pppm++; + while (!factorable(nz_pppm)) nz_pppm++; + + h_x = xprd/nx_pppm; + h_y = yprd/ny_pppm; + h_z = zprd_slab/nz_pppm; + + if (nx_pppm >= OFFSET || ny_pppm >= OFFSET || nz_pppm >= OFFSET) + error->all(FLERR,"PPPMDipole grid is too large"); +} + + +/* ---------------------------------------------------------------------- + compute estimated kspace force error for dipoles +------------------------------------------------------------------------- */ + +double PPPMDipole::compute_df_kspace_dipole() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double zprd_slab = zprd*slab_volfactor; + bigint natoms = atom->natoms; + double qopt = compute_qopt_dipole(); + double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); + return df_kspace; +} + +/* ---------------------------------------------------------------------- + compute qopt for dipoles with ik differentiation +------------------------------------------------------------------------- */ + +double PPPMDipole::compute_qopt_dipole() +{ + double qopt = 0.0; + const double * const prd = domain->prd; + + const double xprd = prd[0]; + const double yprd = prd[1]; + const double zprd = prd[2]; + const double zprd_slab = zprd*slab_volfactor; + const double unitkx = (MY_2PI/xprd); + const double unitky = (MY_2PI/yprd); + const double unitkz = (MY_2PI/zprd_slab); + + double snx,sny,snz; + double cnx,cny,cnz; + double argx,argy,argz,wx,wy,wz,sx,sy,sz,qx,qy,qz; + double sum1,sum2,dot1,dot2; + double numerator,denominator; + double u1,u2,u3,sqk; + + int k,l,m,nx,ny,nz,kper,lper,mper; + + const int nbx = 2; + const int nby = 2; + const int nbz = 2; + + const int twoorder = 2*order; + + for (m = nzlo_fft; m <= nzhi_fft; m++) { + mper = m - nz_pppm*(2*m/nz_pppm); + snz = square(sin(0.5*unitkz*mper*zprd_slab/nz_pppm)); + cnz = cos(0.5*unitkz*mper*zprd_slab/nz_pppm); + + for (l = nylo_fft; l <= nyhi_fft; l++) { + lper = l - ny_pppm*(2*l/ny_pppm); + sny = square(sin(0.5*unitky*lper*yprd/ny_pppm)); + cny = cos(0.5*unitky*lper*yprd/ny_pppm); + + for (k = nxlo_fft; k <= nxhi_fft; k++) { + kper = k - nx_pppm*(2*k/nx_pppm); + snx = square(sin(0.5*unitkx*kper*xprd/nx_pppm)); + cnx = cos(0.5*unitkx*kper*xprd/nx_pppm); + + sqk = square(unitkx*kper) + square(unitky*lper) + square(unitkz*mper); + + if (sqk != 0.0) { + numerator = MY_4PI/sqk; + denominator = gf_denom(snx,sny,snz); + sum1 = 0.0; + sum2 = 0.0; + + for (nx = -nbx; nx <= nbx; nx++) { + qx = unitkx*(kper+nx_pppm*nx); + sx = exp(-0.25*square(qx/g_ewald)); + argx = 0.5*qx*xprd/nx_pppm; + wx = powsinxx(argx,twoorder); + + for (ny = -nby; ny <= nby; ny++) { + qy = unitky*(lper+ny_pppm*ny); + sy = exp(-0.25*square(qy/g_ewald)); + argy = 0.5*qy*yprd/ny_pppm; + wy = powsinxx(argy,twoorder); + + for (nz = -nbz; nz <= nbz; nz++) { + qz = unitkz*(mper+nz_pppm*nz); + sz = exp(-0.25*square(qz/g_ewald)); + argz = 0.5*qz*zprd_slab/nz_pppm; + wz = powsinxx(argz,twoorder); + + dot1 = unitkx*kper*qx + unitky*lper*qy + unitkz*mper*qz; + dot2 = qx*qx + qy*qy + qz*qz; + //dot1 = dot1*dot1*dot1; // power of 3 for dipole forces + //dot2 = dot2*dot2*dot2; + u1 = sx*sy*sz; + const double w2 = wx*wy*wz; + const double phi = u1*MY_4PI/dot2; + const double top = dot1*dot1*dot1*w2*phi; + sum1 += phi*phi*dot2*dot2*dot2; + sum2 += top*top/sqk/sqk/sqk; + } + } + } + qopt += sum1 - sum2/denominator; + } + } + } + } + double qopt_all; + MPI_Allreduce(&qopt,&qopt_all,1,MPI_DOUBLE,MPI_SUM,world); + return qopt_all; +} + +/* ---------------------------------------------------------------------- + pre-compute modified (Hockney-Eastwood) Coulomb Green's function +------------------------------------------------------------------------- */ + +void PPPMDipole::compute_gf_dipole() +{ + const double * const prd = domain->prd; + + const double xprd = prd[0]; + const double yprd = prd[1]; + const double zprd = prd[2]; + const double zprd_slab = zprd*slab_volfactor; + const double unitkx = (MY_2PI/xprd); + const double unitky = (MY_2PI/yprd); + const double unitkz = (MY_2PI/zprd_slab); + + double snx,sny,snz; + double cnx,cny,cnz; + double argx,argy,argz,wx,wy,wz,sx,sy,sz,qx,qy,qz; + double sum1,dot1,dot2; + double numerator,denominator; + double sqk; + + int k,l,m,n,nx,ny,nz,kper,lper,mper; + + int nbx = static_cast ((g_ewald*xprd/(MY_PI*nx_pppm)) * + pow(-log(EPS_HOC),0.25)); + int nby = static_cast ((g_ewald*yprd/(MY_PI*ny_pppm)) * + pow(-log(EPS_HOC),0.25)); + int nbz = static_cast ((g_ewald*zprd_slab/(MY_PI*nz_pppm)) * + pow(-log(EPS_HOC),0.25)); + nbx = MAX(nbx,2); + nby = MAX(nby,2); + nbz = MAX(nbz,2); + const int twoorder = 2*order; + + n = 0; + for (m = nzlo_fft; m <= nzhi_fft; m++) { + mper = m - nz_pppm*(2*m/nz_pppm); + snz = square(sin(0.5*unitkz*mper*zprd_slab/nz_pppm)); + cnz = cos(0.5*unitkz*mper*zprd_slab/nz_pppm); + + for (l = nylo_fft; l <= nyhi_fft; l++) { + lper = l - ny_pppm*(2*l/ny_pppm); + sny = square(sin(0.5*unitky*lper*yprd/ny_pppm)); + cny = cos(0.5*unitky*lper*yprd/ny_pppm); + + for (k = nxlo_fft; k <= nxhi_fft; k++) { + kper = k - nx_pppm*(2*k/nx_pppm); + snx = square(sin(0.5*unitkx*kper*xprd/nx_pppm)); + cnx = cos(0.5*unitkx*kper*xprd/nx_pppm); + + sqk = square(unitkx*kper) + square(unitky*lper) + square(unitkz*mper); + + if (sqk != 0.0) { + numerator = MY_4PI/sqk; + denominator = gf_denom(snx,sny,snz); + sum1 = 0.0; + + for (nx = -nbx; nx <= nbx; nx++) { + qx = unitkx*(kper+nx_pppm*nx); + sx = exp(-0.25*square(qx/g_ewald)); + argx = 0.5*qx*xprd/nx_pppm; + wx = powsinxx(argx,twoorder); + + for (ny = -nby; ny <= nby; ny++) { + qy = unitky*(lper+ny_pppm*ny); + sy = exp(-0.25*square(qy/g_ewald)); + argy = 0.5*qy*yprd/ny_pppm; + wy = powsinxx(argy,twoorder); + + for (nz = -nbz; nz <= nbz; nz++) { + qz = unitkz*(mper+nz_pppm*nz); + sz = exp(-0.25*square(qz/g_ewald)); + argz = 0.5*qz*zprd_slab/nz_pppm; + wz = powsinxx(argz,twoorder); + + dot1 = unitkx*kper*qx + unitky*lper*qy + unitkz*mper*qz; + dot2 = qx*qx + qy*qy + qz*qz; + const double u1 = sx*sy*sz; + const double w2 = wx*wy*wz; + const double phi = u1*MY_4PI/dot2; + sum1 += dot1*dot1*dot1*w2*phi/sqk/sqk/sqk; + } + } + } + greensfn[n++] = sum1/denominator; + } else greensfn[n++] = 0.0; + } + } + } +} + +/* ---------------------------------------------------------------------- + calculate f(x) for use in Newton-Raphson solver +------------------------------------------------------------------------- */ + +double PPPMDipole::newton_raphson_f() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + bigint natoms = atom->natoms; + + double df_rspace,df_kspace; + double vol = xprd*yprd*zprd; + double a = cutoff*g_ewald; + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); + df_kspace = compute_df_kspace_dipole(); + + return df_rspace - df_kspace; +} + +/* ---------------------------------------------------------------------- + find g_ewald parameter for dipoles based on desired accuracy + using a Newton-Raphson solver +------------------------------------------------------------------------- */ + +double PPPMDipole::find_gewald_dipole(double x, double Rc, + bigint natoms, double vol, double b2) +{ + double dx,tol; + int maxit; + + maxit = 10000; //Maximum number of iterations + tol = 0.00001; //Convergence tolerance + + //Begin algorithm + + for (int i = 0; i < maxit; i++) { + dx = newton_raphson_f_dipole(x,Rc,natoms,vol,b2) / derivf_dipole(x,Rc,natoms,vol,b2); + x = x - dx; //Update x + if (fabs(dx) < tol) return x; + if (x < 0 || x != x) // solver failed + return -1; + } + return -1; +} + +/* ---------------------------------------------------------------------- + calculate f(x) objective function for dipoles + ------------------------------------------------------------------------- */ + +double PPPMDipole::newton_raphson_f_dipole(double x, double Rc, bigint +natoms, double vol, double b2) +{ + double a = Rc*x; + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + double f = (b2/(sqrt(vol*powint(x,4)*powint(Rc,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + exp(-rg2)) - accuracy; + + return f; +} + +/* ---------------------------------------------------------------------- + calculate numerical derivative f'(x) of objective function for dipoles + ------------------------------------------------------------------------- */ + +double PPPMDipole::derivf_dipole(double x, double Rc, + bigint natoms, double vol, double b2) +{ + double h = 0.000001; //Derivative step-size + return (newton_raphson_f_dipole(x + h,Rc,natoms,vol,b2) - newton_raphson_f_dipole(x,Rc,natoms,vol,b2)) / h; +} + +/* ---------------------------------------------------------------------- + calculate the final estimate of the accuracy +------------------------------------------------------------------------- */ + +double PPPMDipole::final_accuracy_dipole() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double vol = xprd*yprd*zprd; + bigint natoms = atom->natoms; + if (natoms == 0) natoms = 1; // avoid division by zero + + double df_kspace = compute_df_kspace_dipole(); + + double a = cutoff*g_ewald; + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + exp(-rg2)); + + double estimated_accuracy = sqrt(df_kspace*df_kspace + df_rspace*df_rspace); + + return estimated_accuracy; +} + +/* ---------------------------------------------------------------------- + pre-compute Green's function denominator expansion coeffs, Gamma(2n) +------------------------------------------------------------------------- */ + +void PPPMDipole::compute_gf_denom() +{ + if (gf_b) memory->destroy(gf_b); + memory->create(gf_b,order,"pppm_dipole:gf_b"); + + int k,l,m; + + for (l = 1; l < order; l++) gf_b[l] = 0.0; + gf_b[0] = 1.0; + + for (m = 1; m < order; m++) { + for (l = m; l > 0; l--) + gf_b[l] = 4.0 * (gf_b[l]*(l-m)*(l-m-0.5)-gf_b[l-1]*(l-m-1)*(l-m-1)); + gf_b[0] = 4.0 * (gf_b[0]*(l-m)*(l-m-0.5)); + } + + bigint ifact = 1; + for (k = 1; k < 2*order; k++) ifact *= k; + double gaminv = 1.0/ifact; + for (l = 0; l < order; l++) gf_b[l] *= gaminv; +} + +/* ---------------------------------------------------------------------- + create discretized "density" on section of global grid due to my particles + density(x,y,z) = charge "density" at grid points of my 3d brick + (nxlo:nxhi,nylo:nyhi,nzlo:nzhi) is extent of my brick (including ghosts) + in global grid +------------------------------------------------------------------------- */ + +void PPPMDipole::make_rho_dipole() +{ + int l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz; + FFT_SCALAR x0,y0,z0; + FFT_SCALAR x1,y1,z1; + FFT_SCALAR x2,y2,z2; + + // clear 3d density array + + memset(&(densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + memset(&(densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + memset(&(densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + + // loop over my charges, add their contribution to nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **mu = atom->mu; + double **x = atom->x; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + z0 = delvolinv * mu[i][0]; + z1 = delvolinv * mu[i][1]; + z2 = delvolinv * mu[i][2]; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + y0 = z0*rho1d[2][n]; + y1 = z1*rho1d[2][n]; + y2 = z2*rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + x0 = y0*rho1d[1][m]; + x1 = y1*rho1d[1][m]; + x2 = y2*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + densityx_brick_dipole[mz][my][mx] += x0*rho1d[0][l]; + densityy_brick_dipole[mz][my][mx] += x1*rho1d[0][l]; + densityz_brick_dipole[mz][my][mx] += x2*rho1d[0][l]; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + remap density from 3d brick decomposition to FFT decomposition +------------------------------------------------------------------------- */ + +void PPPMDipole::brick2fft_dipole() +{ + int n,ix,iy,iz; + + // copy grabs inner portion of density from 3d brick + // remap could be done as pre-stage of FFT, + // but this works optimally on only double values, not complex values + + n = 0; + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) { + densityx_fft_dipole[n] = densityx_brick_dipole[iz][iy][ix]; + densityy_fft_dipole[n] = densityy_brick_dipole[iz][iy][ix]; + densityz_fft_dipole[n] = densityz_brick_dipole[iz][iy][ix]; + n++; + } + + remap->perform(densityx_fft_dipole,densityx_fft_dipole,work1); + remap->perform(densityy_fft_dipole,densityy_fft_dipole,work1); + remap->perform(densityz_fft_dipole,densityz_fft_dipole,work1); +} + +/* ---------------------------------------------------------------------- + FFT-based Poisson solver for ik +------------------------------------------------------------------------- */ + +void PPPMDipole::poisson_ik_dipole() +{ + int i,j,k,n,ii; + double eng; + double wreal,wimg; + + // transform dipole density (r -> k) + + n = 0; + for (i = 0; i < nfft; i++) { + work1[n] = densityx_fft_dipole[i]; + work1[n+1] = ZEROF; + work2[n] = densityy_fft_dipole[i]; + work2[n+1] = ZEROF; + work3[n] = densityz_fft_dipole[i]; + work3[n+1] = ZEROF; + n += 2; + } + + fft1->compute(work1,work1,1); + fft1->compute(work2,work2,1); + fft1->compute(work3,work3,1); + + // global energy and virial contribution + + double scaleinv = 1.0/(nx_pppm*ny_pppm*nz_pppm); + double s2 = scaleinv*scaleinv; + + if (eflag_global || vflag_global) { + if (vflag_global) { + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + wreal = (work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + wimg = (work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + eng = s2 * greensfn[ii] * (wreal*wreal + wimg*wimg); + for (int jj = 0; jj < 6; jj++) virial[jj] += eng*vg[ii][jj]; + virial[0] += 2.0*s2*greensfn[ii]*fkx[i]*(work1[n]*wreal + work1[n+1]*wimg); + virial[1] += 2.0*s2*greensfn[ii]*fky[j]*(work2[n]*wreal + work2[n+1]*wimg); + virial[2] += 2.0*s2*greensfn[ii]*fkz[k]*(work3[n]*wreal + work3[n+1]*wimg); + virial[3] += 2.0*s2*greensfn[ii]*fky[j]*(work1[n]*wreal + work1[n+1]*wimg); + virial[4] += 2.0*s2*greensfn[ii]*fkz[k]*(work1[n]*wreal + work1[n+1]*wimg); + virial[5] += 2.0*s2*greensfn[ii]*fkz[k]*(work2[n]*wreal + work2[n+1]*wimg); + if (eflag_global) energy += eng; + ii++; + n += 2; + } + } else { + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + wreal = (work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + wimg = (work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + energy += + s2 * greensfn[ii] * (wreal*wreal + wimg*wimg); + ii++; + n += 2; + } + } + } + + // scale by 1/total-grid-pts to get rho(k) + // multiply by Green's function to get V(k) + + n = 0; + for (i = 0; i < nfft; i++) { + work1[n] *= scaleinv * greensfn[i]; + work1[n+1] *= scaleinv * greensfn[i]; + work2[n] *= scaleinv * greensfn[i]; + work2[n+1] *= scaleinv * greensfn[i]; + work3[n] *= scaleinv * greensfn[i]; + work3[n+1] *= scaleinv * greensfn[i]; + n += 2; + } + + // extra FFTs for per-atom energy/virial + + if (vflag_atom) poisson_peratom_dipole(); + + // compute electric potential + // FFT leaves data in 3d brick decomposition + + // Ex + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + work4[n+1] = fkx[i]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + ux_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Ey + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + work4[n+1] = fky[j]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + uy_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Ez + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + work4[n+1] = fkz[k]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + uz_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vxx + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*fkx[i]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fkx[i]*fkx[i]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdxx_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vyy + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*fky[j]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fky[j]*fky[j]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdyy_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vzz + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*fkz[k]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fkz[k]*fkz[k]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdzz_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vxy + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*fky[j]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fkx[i]*fky[j]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdxy_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vxz + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*fkz[k]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fkx[i]*fkz[k]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdxz_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vyz + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*fkz[k]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fky[j]*fkz[k]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdyz_brick_dipole[k][j][i] = work4[n]; + n += 2; + } +} + +/* ---------------------------------------------------------------------- + FFT-based Poisson solver for per-atom energy/virial +------------------------------------------------------------------------- */ + +void PPPMDipole::poisson_peratom_dipole() +{ + int i,ii,j,k,n; + + // 18 components of virial in v0 thru v5 + + if (!vflag_atom) return; + + // V0x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][0]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkx[i]*work1[n]); + work4[n+1] = fkx[i]*(vg[ii][0]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkx[i]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v0x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V0y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][0]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkx[i]*work1[n]); + work4[n+1] = fky[j]*(vg[ii][0]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkx[i]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v0y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V0z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][0]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkx[i]*work1[n]); + work4[n+1] = fkz[k]*(vg[ii][0]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkx[i]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v0z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V1x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][1]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work2[n]); + work4[n+1] = fkx[i]*(vg[ii][1]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v1x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V1y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][1]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work2[n]); + work4[n+1] = fky[j]*(vg[ii][1]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v1y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V1z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][1]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work2[n]); + work4[n+1] = fkz[k]*(vg[ii][1]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v1z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V2x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][2]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work3[n]); + work4[n+1] = fkx[i]*(vg[ii][2]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work3[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v2x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V2y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][2]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work3[n]); + work4[n+1] = fky[j]*(vg[ii][2]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work3[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v2y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V2z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][2]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work3[n]); + work4[n+1] = fkz[k]*(vg[ii][2]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work3[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v2z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V3x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][3]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work1[n]); + work4[n+1] = fkx[i]*(vg[ii][3]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v3x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V3y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][3]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work1[n]); + work4[n+1] = fky[j]*(vg[ii][3]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v3y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V3z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][3]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work1[n]); + work4[n+1] = fkz[k]*(vg[ii][3]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v3z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V4x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][4]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work1[n]); + work4[n+1] = fkx[i]*(vg[ii][4]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v4x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V4y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][4]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work1[n]); + work4[n+1] = fky[j]*(vg[ii][4]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v4y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V4z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][4]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work1[n]); + work4[n+1] = fkz[k]*(vg[ii][4]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v4z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V5x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][5]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work2[n]); + work4[n+1] = fkx[i]*(vg[ii][5]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v5x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V5y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][5]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work2[n]); + work4[n+1] = fky[j]*(vg[ii][5]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v5y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V5z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][5]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work2[n]); + work4[n+1] = fkz[k]*(vg[ii][5]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v5z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } +} + +/* ---------------------------------------------------------------------- + interpolate from grid to get electric field & force on my particles for ik +------------------------------------------------------------------------- */ + +void PPPMDipole::fieldforce_ik_dipole() +{ + int i,l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz; + FFT_SCALAR x0,y0,z0; + FFT_SCALAR ex,ey,ez; + FFT_SCALAR vxx,vyy,vzz,vxy,vxz,vyz; + + // loop over my charges, interpolate electric field from nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + + double **mu = atom->mu; + double **x = atom->x; + double **f = atom->f; + double **t = atom->torque; + + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) { + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + ex = ey = ez = ZEROF; + vxx = vyy = vzz = vxy = vxz = vyz = ZEROF; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + z0 = rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + y0 = z0*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + x0 = y0*rho1d[0][l]; + ex -= x0*ux_brick_dipole[mz][my][mx]; + ey -= x0*uy_brick_dipole[mz][my][mx]; + ez -= x0*uz_brick_dipole[mz][my][mx]; + vxx -= x0*vdxx_brick_dipole[mz][my][mx]; + vyy -= x0*vdyy_brick_dipole[mz][my][mx]; + vzz -= x0*vdzz_brick_dipole[mz][my][mx]; + vxy -= x0*vdxy_brick_dipole[mz][my][mx]; + vxz -= x0*vdxz_brick_dipole[mz][my][mx]; + vyz -= x0*vdyz_brick_dipole[mz][my][mx]; + } + } + } + + // convert E-field to torque + + const double mufactor = qqrd2e * scale; + f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); + f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); + f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); + + t[i][0] += mufactor*(mu[i][1]*ez - mu[i][2]*ey); + t[i][1] += mufactor*(mu[i][2]*ex - mu[i][0]*ez); + t[i][2] += mufactor*(mu[i][0]*ey - mu[i][1]*ex); + } +} + +/* ---------------------------------------------------------------------- + interpolate from grid to get per-atom energy/virial +------------------------------------------------------------------------- */ + +void PPPMDipole::fieldforce_peratom_dipole() +{ + int i,l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz,x0,y0,z0; + FFT_SCALAR ux,uy,uz; + FFT_SCALAR v0x,v1x,v2x,v3x,v4x,v5x; + FFT_SCALAR v0y,v1y,v2y,v3y,v4y,v5y; + FFT_SCALAR v0z,v1z,v2z,v3z,v4z,v5z; + + // loop over my charges, interpolate from nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **mu = atom->mu; + double **x = atom->x; + + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) { + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + ux = uy = uz = ZEROF; + v0x = v1x = v2x = v3x = v4x = v5x = ZEROF; + v0y = v1y = v2y = v3y = v4y = v5y = ZEROF; + v0z = v1z = v2z = v3z = v4z = v5z = ZEROF; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + z0 = rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + y0 = z0*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + x0 = y0*rho1d[0][l]; + if (eflag_atom) { + ux += x0*ux_brick_dipole[mz][my][mx]; + uy += x0*uy_brick_dipole[mz][my][mx]; + uz += x0*uz_brick_dipole[mz][my][mx]; + } + if (vflag_atom) { + v0x += x0*v0x_brick_dipole[mz][my][mx]; + v1x += x0*v1x_brick_dipole[mz][my][mx]; + v2x += x0*v2x_brick_dipole[mz][my][mx]; + v3x += x0*v3x_brick_dipole[mz][my][mx]; + v4x += x0*v4x_brick_dipole[mz][my][mx]; + v5x += x0*v5x_brick_dipole[mz][my][mx]; + v0y += x0*v0y_brick_dipole[mz][my][mx]; + v1y += x0*v1y_brick_dipole[mz][my][mx]; + v2y += x0*v2y_brick_dipole[mz][my][mx]; + v3y += x0*v3y_brick_dipole[mz][my][mx]; + v4y += x0*v4y_brick_dipole[mz][my][mx]; + v5y += x0*v5y_brick_dipole[mz][my][mx]; + v0z += x0*v0z_brick_dipole[mz][my][mx]; + v1z += x0*v1z_brick_dipole[mz][my][mx]; + v2z += x0*v2z_brick_dipole[mz][my][mx]; + v3z += x0*v3z_brick_dipole[mz][my][mx]; + v4z += x0*v4z_brick_dipole[mz][my][mx]; + v5z += x0*v5z_brick_dipole[mz][my][mx]; + } + } + } + } + + if (eflag_atom) eatom[i] += mu[i][0]*ux + mu[i][1]*uy + mu[i][2]*uz; + if (vflag_atom) { + vatom[i][0] += mu[i][0]*v0x + mu[i][1]*v0y + mu[i][2]*v0z; + vatom[i][1] += mu[i][0]*v1x + mu[i][1]*v1y + mu[i][2]*v1z; + vatom[i][2] += mu[i][0]*v2x + mu[i][1]*v2y + mu[i][2]*v2z; + vatom[i][3] += mu[i][0]*v3x + mu[i][1]*v3y + mu[i][2]*v3z; + vatom[i][4] += mu[i][0]*v4x + mu[i][1]*v4y + mu[i][2]*v4z; + vatom[i][5] += mu[i][0]*v5x + mu[i][1]*v5y + mu[i][2]*v5z; + } + } +} + +/* ---------------------------------------------------------------------- + pack own values to buf to send to another proc +------------------------------------------------------------------------- */ + +void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +{ + int n = 0; + + if (flag == FORWARD_MU) { + FFT_SCALAR *src_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + buf[n++] = src_ux[list[i]]; + buf[n++] = src_uy[list[i]]; + buf[n++] = src_uz[list[i]]; + buf[n++] = src_vxx[list[i]]; + buf[n++] = src_vyy[list[i]]; + buf[n++] = src_vzz[list[i]]; + buf[n++] = src_vxy[list[i]]; + buf[n++] = src_vxz[list[i]]; + buf[n++] = src_vyz[list[i]]; + } + } else if (flag == FORWARD_MU_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + buf[n++] = v0xsrc[list[i]]; + buf[n++] = v1xsrc[list[i]]; + buf[n++] = v2xsrc[list[i]]; + buf[n++] = v3xsrc[list[i]]; + buf[n++] = v4xsrc[list[i]]; + buf[n++] = v5xsrc[list[i]]; + buf[n++] = v0ysrc[list[i]]; + buf[n++] = v1ysrc[list[i]]; + buf[n++] = v2ysrc[list[i]]; + buf[n++] = v3ysrc[list[i]]; + buf[n++] = v4ysrc[list[i]]; + buf[n++] = v5ysrc[list[i]]; + buf[n++] = v0zsrc[list[i]]; + buf[n++] = v1zsrc[list[i]]; + buf[n++] = v2zsrc[list[i]]; + buf[n++] = v3zsrc[list[i]]; + buf[n++] = v4zsrc[list[i]]; + buf[n++] = v5zsrc[list[i]]; + } + } +} + +/* ---------------------------------------------------------------------- + unpack another proc's own values from buf and set own ghost values +------------------------------------------------------------------------- */ + +void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +{ + int n = 0; + + if (flag == FORWARD_MU) { + FFT_SCALAR *dest_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + dest_ux[list[i]] = buf[n++]; + dest_uy[list[i]] = buf[n++]; + dest_uz[list[i]] = buf[n++]; + dest_vxx[list[i]] = buf[n++]; + dest_vyy[list[i]] = buf[n++]; + dest_vzz[list[i]] = buf[n++]; + dest_vxy[list[i]] = buf[n++]; + dest_vxz[list[i]] = buf[n++]; + dest_vyz[list[i]] = buf[n++]; + } + } else if (flag == FORWARD_MU_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + v0xsrc[list[i]] = buf[n++]; + v1xsrc[list[i]] = buf[n++]; + v2xsrc[list[i]] = buf[n++]; + v3xsrc[list[i]] = buf[n++]; + v4xsrc[list[i]] = buf[n++]; + v5xsrc[list[i]] = buf[n++]; + v0ysrc[list[i]] = buf[n++]; + v1ysrc[list[i]] = buf[n++]; + v2ysrc[list[i]] = buf[n++]; + v3ysrc[list[i]] = buf[n++]; + v4ysrc[list[i]] = buf[n++]; + v5ysrc[list[i]] = buf[n++]; + v0zsrc[list[i]] = buf[n++]; + v1zsrc[list[i]] = buf[n++]; + v2zsrc[list[i]] = buf[n++]; + v3zsrc[list[i]] = buf[n++]; + v4zsrc[list[i]] = buf[n++]; + v5zsrc[list[i]] = buf[n++]; + } + } +} + +/* ---------------------------------------------------------------------- + pack ghost values into buf to send to another proc +------------------------------------------------------------------------- */ + +void PPPMDipole::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +{ + int n = 0; + if (flag == REVERSE_MU) { + FFT_SCALAR *src_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + buf[n++] = src_dipole0[list[i]]; + buf[n++] = src_dipole1[list[i]]; + buf[n++] = src_dipole2[list[i]]; + } + } +} + +/* ---------------------------------------------------------------------- + unpack another proc's ghost values from buf and add to own values +------------------------------------------------------------------------- */ + +void PPPMDipole::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +{ + int n = 0; + if (flag == REVERSE_MU) { + FFT_SCALAR *dest_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + dest_dipole0[list[i]] += buf[n++]; + dest_dipole1[list[i]] += buf[n++]; + dest_dipole2[list[i]] += buf[n++]; + } + } +} + +/* ---------------------------------------------------------------------- + Slab-geometry correction term to dampen inter-slab interactions between + periodically repeating slabs. Yields good approximation to 2D Ewald if + adequate empty space is left between repeating slabs (J. Chem. Phys. + 111, 3155). Slabs defined here to be parallel to the xy plane. Also + extended to non-neutral systems (J. Chem. Phys. 131, 094107). +------------------------------------------------------------------------- */ + +void PPPMDipole::slabcorr() +{ + // compute local contribution to global dipole moment + + double **x = atom->x; + double zprd = domain->zprd; + int nlocal = atom->nlocal; + + double dipole = 0.0; + double **mu = atom->mu; + for (int i = 0; i < nlocal; i++) dipole += mu[i][2]; + + // sum local contributions to get global dipole moment + + double dipole_all; + MPI_Allreduce(&dipole,&dipole_all,1,MPI_DOUBLE,MPI_SUM,world); + + // need to make non-neutral systems and/or + // per-atom energy translationally invariant + + if (eflag_atom || fabs(qsum) > SMALL) { + + error->all(FLERR,"Cannot (yet) use kspace slab correction with " + "long-range dipoles and non-neutral systems or per-atom energy"); + } + + // compute corrections + + const double e_slabcorr = MY_2PI*(dipole_all*dipole_all/12.0)/volume; + const double qscale = qqrd2e * scale; + + if (eflag_global) energy += qscale * e_slabcorr; + + // per-atom energy + + if (eflag_atom) { + double efact = qscale * MY_2PI/volume/12.0; + for (int i = 0; i < nlocal; i++) + eatom[i] += efact * mu[i][2]*dipole_all; + } + + // add on torque corrections + + if (atom->torque) { + double ffact = qscale * (-4.0*MY_PI/volume); + double **mu = atom->mu; + double **torque = atom->torque; + for (int i = 0; i < nlocal; i++) { + torque[i][0] += ffact * dipole_all * mu[i][1]; + torque[i][1] += -ffact * dipole_all * mu[i][0]; + } + } +} + +/* ---------------------------------------------------------------------- + perform and time the 1d FFTs required for N timesteps +------------------------------------------------------------------------- */ + +int PPPMDipole::timing_1d(int n, double &time1d) +{ + double time1,time2; + + for (int i = 0; i < 2*nfft_both; i++) work1[i] = ZEROF; + + MPI_Barrier(world); + time1 = MPI_Wtime(); + + for (int i = 0; i < n; i++) { + fft1->timing1d(work1,nfft_both,1); + fft1->timing1d(work1,nfft_both,1); + fft1->timing1d(work1,nfft_both,1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + } + + MPI_Barrier(world); + time2 = MPI_Wtime(); + time1d = time2 - time1; + + return 12; +} + +/* ---------------------------------------------------------------------- + perform and time the 3d FFTs required for N timesteps +------------------------------------------------------------------------- */ + +int PPPMDipole::timing_3d(int n, double &time3d) +{ + double time1,time2; + + for (int i = 0; i < 2*nfft_both; i++) work1[i] = ZEROF; + + MPI_Barrier(world); + time1 = MPI_Wtime(); + + for (int i = 0; i < n; i++) { + fft1->compute(work1,work1,1); + fft1->compute(work1,work1,1); + fft1->compute(work1,work1,1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + } + + MPI_Barrier(world); + time2 = MPI_Wtime(); + time3d = time2 - time1; + + return 12; +} + +/* ---------------------------------------------------------------------- + memory usage of local arrays +------------------------------------------------------------------------- */ + +double PPPMDipole::memory_usage() +{ + double bytes = nmax*3 * sizeof(double); + int nbrick = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * + (nzhi_out-nzlo_out+1); + bytes += 6 * nfft_both * sizeof(double); // vg + bytes += nfft_both * sizeof(double); // greensfn + bytes += nfft_both*5 * sizeof(FFT_SCALAR); // work*2*2 + bytes += 9 * nbrick * sizeof(FFT_SCALAR); // ubrick*3 + vdbrick*6 + bytes += nfft_both*7 * sizeof(FFT_SCALAR); //density_ffx*3 + work*2*2 + + if (peratom_allocate_flag) + bytes += 21 * nbrick * sizeof(FFT_SCALAR); + + if (cg_dipole) bytes += cg_dipole->memory_usage(); + if (cg_peratom_dipole) bytes += cg_peratom_dipole->memory_usage(); + + return bytes; +} + +/* ---------------------------------------------------------------------- + compute musum,musqsum,mu2 + called initially, when particle count changes, when dipoles are changed +------------------------------------------------------------------------- */ + +void PPPMDipole::musum_musq() +{ + const int nlocal = atom->nlocal; + + musum = musqsum = mu2 = 0.0; + if (atom->mu_flag) { + double** mu = atom->mu; + double musum_local(0.0), musqsum_local(0.0); + + for (int i = 0; i < nlocal; i++) { + musum_local += mu[i][0] + mu[i][1] + mu[i][2]; + musqsum_local += mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]; + } + + MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + + mu2 = musqsum * force->qqrd2e; + } + + if (mu2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); +} \ No newline at end of file diff --git a/src/KSPACE/pppm_spin.h b/src/KSPACE/pppm_spin.h new file mode 100644 index 0000000000..4d6906f974 --- /dev/null +++ b/src/KSPACE/pppm_spin.h @@ -0,0 +1,213 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef KSPACE_CLASS + +KSpaceStyle(pppm/dipole,PPPMDipole) + +#else + +#ifndef LMP_PPPM_DIPOLE_H +#define LMP_PPPM_DIPOLE_H + +#include "pppm.h" + +namespace LAMMPS_NS { + +class PPPMDipole : public PPPM { + public: + PPPMDipole(class LAMMPS *, int, char **); + virtual ~PPPMDipole(); + void init(); + void setup(); + void setup_grid(); + void compute(int, int); + int timing_1d(int, double &); + int timing_3d(int, double &); + double memory_usage(); + + protected: + void set_grid_global(); + double newton_raphson_f(); + + void allocate(); + void allocate_peratom(); + void deallocate(); + void deallocate_peratom(); + void compute_gf_denom(); + + void slabcorr(); + + // grid communication + + void pack_forward(int, FFT_SCALAR *, int, int *); + void unpack_forward(int, FFT_SCALAR *, int, int *); + void pack_reverse(int, FFT_SCALAR *, int, int *); + void unpack_reverse(int, FFT_SCALAR *, int, int *); + + // dipole + + FFT_SCALAR ***densityx_brick_dipole,***densityy_brick_dipole,***densityz_brick_dipole; + FFT_SCALAR ***vdxx_brick_dipole,***vdyy_brick_dipole,***vdzz_brick_dipole; + FFT_SCALAR ***vdxy_brick_dipole,***vdxz_brick_dipole,***vdyz_brick_dipole; + FFT_SCALAR ***ux_brick_dipole,***uy_brick_dipole,***uz_brick_dipole; + FFT_SCALAR ***v0x_brick_dipole,***v1x_brick_dipole,***v2x_brick_dipole; + FFT_SCALAR ***v3x_brick_dipole,***v4x_brick_dipole,***v5x_brick_dipole; + FFT_SCALAR ***v0y_brick_dipole,***v1y_brick_dipole,***v2y_brick_dipole; + FFT_SCALAR ***v3y_brick_dipole,***v4y_brick_dipole,***v5y_brick_dipole; + FFT_SCALAR ***v0z_brick_dipole,***v1z_brick_dipole,***v2z_brick_dipole; + FFT_SCALAR ***v3z_brick_dipole,***v4z_brick_dipole,***v5z_brick_dipole; + FFT_SCALAR *work3,*work4; + FFT_SCALAR *densityx_fft_dipole,*densityy_fft_dipole,*densityz_fft_dipole; + class GridComm *cg_dipole; + class GridComm *cg_peratom_dipole; + int only_dipole_flag; + double musum,musqsum,mu2; + double find_gewald_dipole(double, double, bigint, double, double); + double newton_raphson_f_dipole(double, double, bigint, double, double); + double derivf_dipole(double, double, bigint, double, double); + double compute_df_kspace_dipole(); + double compute_qopt_dipole(); + void compute_gf_dipole(); + void make_rho_dipole(); + void brick2fft_dipole(); + void poisson_ik_dipole(); + void poisson_peratom_dipole(); + void fieldforce_ik_dipole(); + void fieldforce_peratom_dipole(); + double final_accuracy_dipole(); + void musum_musq(); + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Cannot (yet) use charges with Kspace style PPPMDipole + +Charge-dipole interactions are not yet implemented in PPPMDipole so this +feature is not yet supported. + +E: Must redefine kspace_style after changing to triclinic box + +Self-explanatory. + +E: Kspace style requires atom attribute mu + +The atom style defined does not have this attribute. + +E: Cannot (yet) use kspace_modify diff ad with dipoles + +This feature is not yet supported. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Cannot yet use triclinic cells with PPPMDipole + +This feature is not yet supported. + +E: Cannot yet use TIP4P with PPPMDipole + +This feature is not yet supported. + +E: Cannot use nonperiodic boundaries with PPPM + +For kspace style pppm, all 3 dimensions must have periodic boundaries +unless you use the kspace_modify command to define a 2d slab with a +non-periodic z dimension. + +E: Incorrect boundaries with slab PPPM + +Must have periodic x,y dimensions and non-periodic z dimension to use +2d slab option with PPPM. + +E: PPPM order cannot be < 2 or > than %d + +This is a limitation of the PPPM implementation in LAMMPS. + +E: KSpace style is incompatible with Pair style + +Setting a kspace style requires that a pair style with matching +long-range dipole components be used. + +W: Reducing PPPM order b/c stencil extends beyond nearest neighbor processor + +This may lead to a larger grid than desired. See the kspace_modify overlap +command to prevent changing of the PPPM order. + +E: PPPM order < minimum allowed order + +The default minimum order is 2. This can be reset by the +kspace_modify minorder command. + +E: PPPM grid stencil extends beyond nearest neighbor processor + +This is not allowed if the kspace_modify overlap setting is no. + +E: KSpace accuracy must be > 0 + +The kspace accuracy designated in the input must be greater than zero. + +E: Could not compute grid size + +The code is unable to compute a grid size consistent with the desired +accuracy. This error should not occur for typical problems. Please +send an email to the developers. + +E: PPPM grid is too large + +The global PPPM grid is larger than OFFSET in one or more dimensions. +OFFSET is currently set to 4096. You likely need to decrease the +requested accuracy. + +E: Could not compute g_ewald + +The Newton-Raphson solver failed to converge to a good value for +g_ewald. This error should not occur for typical problems. Please +send an email to the developers. + +E: Non-numeric box dimensions - simulation unstable + +The box size has apparently blown up. + +E: Out of range atoms - cannot compute PPPM + +One or more atoms are attempting to map their charge to a PPPM grid +point that is not owned by a processor. This is likely for one of two +reasons, both of them bad. First, it may mean that an atom near the +boundary of a processor's sub-domain has moved more than 1/2 the +"neighbor skin distance"_neighbor.html without neighbor lists being +rebuilt and atoms being migrated to new processors. This also means +you may be missing pairwise interactions that need to be computed. +The solution is to change the re-neighboring criteria via the +"neigh_modify"_neigh_modify command. The safest settings are "delay 0 +every 1 check yes". Second, it may mean that an atom has moved far +outside a processor's sub-domain or even the entire simulation box. +This indicates bad physics, e.g. due to highly overlapping atoms, too +large a timestep, etc. + +E: Using kspace solver PPPMDipole on system with no dipoles + +Must have non-zero dipoles with PPPMDipole. + +E: Must use kspace_modify gewald for system with no dipoles + +Self-explanatory. + +*/ diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp new file mode 100644 index 0000000000..66b684ae1d --- /dev/null +++ b/src/SPIN/pair_spin_long.cpp @@ -0,0 +1,550 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------------ + Contributing authors: Julien Tranchida (SNL) + Stan Moore (SNL) + + Please cite the related publication: + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. arXiv preprint arXiv:1801.10233. +------------------------------------------------------------------------- */ + + +#include +#include +#include +#include +#include "pair_spin_long.h" +#include "atom.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "fix_nve_spin.h" +#include "force.h" +#include "kspace.h" +#include "math_const.h" +#include "memory.h" +#include "modify.h" +#include "error.h" +#include "update.h" + + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define EWALD_F 1.12837917 +#define EWALD_P 0.3275911 +#define A1 0.254829592 +#define A2 -0.284496736 +#define A3 1.421413741 +#define A4 -1.453152027 +#define A5 1.061405429 + +/* ---------------------------------------------------------------------- */ + +PairSpinLong::PairSpinLong(LAMMPS *lmp) : PairSpin(lmp), +lockfixnvespin(NULL) +{ + single_enable = 0; + ewaldflag = pppmflag = 1; + respa_enable = 0; + no_virial_fdotr_compute = 1; + lattice_flag = 0; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + +} + +/* ---------------------------------------------------------------------- + free all arrays +------------------------------------------------------------------------- */ + +PairSpinLong::~PairSpinLong() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairSpinLong::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double r,rinv,r2inv,rsq; + double grij,expm2,t,erfc; + double bij[4]; + double evdwl,ecoul; + double xi[3],rij[3]; + double spi[4],spj[4],fi[3],fmi[3]; + double pre1,pre2,pre3; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double **fm = atom->fm; + double **sp = atom->sp; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + pre1 = 2.0 * g_ewald / MY_PIS; + pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; + pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; + + // computation of the exchange interaction + // loop over atoms and their neighbors + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + itype = type[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; + + evdwl = 0.0; + + fi[0] = fi[1] = fi[2] = 0.0; + fmi[0] = fmi[1] = fmi[2] = 0.0; + bij[0] = bij[1] = bij[2] = bij[3] = 0.0; + + rij[0] = x[j][0] - xi[0]; + rij[1] = x[j][1] - xi[1]; + rij[2] = x[j][2] - xi[2]; + rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + + if (rsq < cut_spinsq) { + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + compute_long(i,j,rij,bij,fmi,spi,spj); + compute_long_mech(i,j,rij,bij,fmi,spi,spj); + + } + } + + // force accumulation + + f[i][0] += fi[0] * mub2mu0; + f[i][1] += fi[1] * mub2mu0; + f[i][2] += fi[2] * mub2mu0; + fm[i][0] += fmi[0] * mub2mu0hbinv; + fm[i][1] += fmi[1] * mub2mu0hbinv; + fm[i][2] += fmi[2] * mub2mu0hbinv; + + if (newton_pair || j < nlocal) { + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; + f[j][2] -= fi[2]; + } + + if (eflag) { + if (rsq <= cut_spinsq) { + evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + + spi[2]*fmi[2]; + evdwl *= hbar; + } + } else evdwl = 0.0; + + + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, + evdwl,ecoul,fi[0],fi[1],fi[2],rij[0],rij[1],rij[2]); + + } + } +} + +/* ---------------------------------------------------------------------- + update the pair interaction fmi acting on the spin ii +------------------------------------------------------------------------- */ + +void PairSpinLong::compute_single_pair(int ii, double fmi[3]) +{ + int i,j,jj,jnum,itype,jtype; + double r,rinv,r2inv,rsq; + double grij,expm2,t,erfc; + double bij[4],xi[3],rij[3],spi[4],spj[4]; + double pre1,pre2,pre3; + int *ilist,*jlist,*numneigh,**firstneigh; + + double **x = atom->x; + double **sp = atom->sp; + int *type = atom->type; + + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + pre1 = 2.0 * g_ewald / MY_PIS; + pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; + pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; + + // computation of the exchange interaction + // loop over neighbors of atom i + + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + itype = type[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; + + fmi[0] = fmi[1] = fmi[2] = 0.0; + bij[0] = bij[1] = bij[2] = bij[3] = 0.0; + + rij[0] = x[j][0] - xi[0]; + rij[1] = x[j][1] - xi[1]; + rij[2] = x[j][2] - xi[2]; + rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + + if (rsq < cut_spinsq) { + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + compute_long(i,j,rij,bij,fmi,spi,spj); + + } + } + } + + // force accumulation + + fmi[0] *= mub2mu0hbinv; + fmi[1] *= mub2mu0hbinv; + fmi[2] *= mub2mu0hbinv; +} + +/* ---------------------------------------------------------------------- + compute exchange interaction between spins i and j +------------------------------------------------------------------------- */ + +void PairSpinLong::compute_long(int i, int j, double rij[3], + double bij[4], double fmi[3], double spi[4], double spj[4]) +{ + double sjdotr; + double b1,b2,gigj; + + gigj = spi[3] * spj[3]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + b1 = bij[1]; + b2 = bij[2]; + + fmi[0] += gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); + fmi[1] += gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); + fmi[2] += gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); +} + +/* ---------------------------------------------------------------------- + compute the mechanical force due to the exchange interaction between atom i and atom j +------------------------------------------------------------------------- */ + +void PairSpinLong::compute_long_mech(int i, int j, double rij[3], + double bij[4], double fi[3], double spi[3], double spj[3]) +{ + double sdots,sidotr,sjdotr,b2,b3; + double g1,g2,g1b2_g2b3,gigj; + + gigj = spi[3] * spj[3]; + sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + b2 = bij[2]; + b3 = bij[3]; + g1 = sdots; + g2 = -sidotr*sjdotr; + g1b2_g2b3 = g1*b2 + g2*b3; + + fi[0] += gigj * (rij[0] * g1b2_g2b3 + + b2 * (sjdotr*spi[0] + sidotr*spj[0])); + fi[1] += gigj * (rij[1] * g1b2_g2b3 + + b2 * (sjdotr*spi[1] + sidotr*spj[1])); + fi[2] += gigj * (rij[2] * g1b2_g2b3 + + b2 * (sjdotr*spi[2] + sidotr*spj[2])); +} + + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairSpinLong::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSpinLong::settings(int narg, char **arg) +{ + if (narg < 1 || narg > 2) + error->all(FLERR,"Incorrect args in pair_style command"); + + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"Spin simulations require metal unit style"); + + cut_spin = force->numeric(FLERR,arg[0]); + +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSpinLong::coeff(int narg, char **arg) +{ + if (narg < 4 || narg > 5) + error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + // check if args correct + + if (strcmp(arg[2],"long") != 0) + error->all(FLERR,"Incorrect args in pair_style command"); + if (narg != 3) + error->all(FLERR,"Incorrect args in pair_style command"); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSpinLong::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + double cut = cut_spin; + return cut; +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSpinLong::init_style() +{ + if (!atom->sp_flag) + error->all(FLERR,"Pair spin requires atom/spin style"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + // checking if nve/spin is a listed fix + + int ifix = 0; + while (ifix < modify->nfix) { + if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + ifix++; + } + if (ifix == modify->nfix) + error->all(FLERR,"pair/spin style requires nve/spin"); + + // get the lattice_flag from nve/spin + + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { + lockfixnvespin = (FixNVESpin *) modify->fix[i]; + lattice_flag = lockfixnvespin->lattice_flag; + } + } + + // insure use of KSpace long-range solver, set g_ewald + + if (force->kspace == NULL) + error->all(FLERR,"Pair style requires a KSpace style"); + + g_ewald = force->kspace->g_ewald; + + cut_spinsq = cut_spin * cut_spin; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinLong::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinLong::read_restart(FILE *fp) +{ + read_restart_settings(fp); + + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinLong::write_restart_settings(FILE *fp) +{ + fwrite(&cut_spin,sizeof(double),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinLong::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_spin,sizeof(double),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin,1,MPI_DOUBLE,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); +} + +/* ---------------------------------------------------------------------- */ + +void *PairSpinLong::extract(const char *str, int &dim) +{ + if (strcmp(str,"cut") == 0) { + dim = 0; + return (void *) &cut_spin; + } else if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_spin; + } else if (strcmp(str,"ewald_order") == 0) { + ewald_order = 0; + ewald_order |= 1<<1; + ewald_order |= 1<<3; + dim = 0; + return (void *) &ewald_order; + } else if (strcmp(str,"ewald_mix") == 0) { + dim = 0; + return (void *) &mix_flag; + } + return NULL; +} diff --git a/src/SPIN/pair_spin_long.h b/src/SPIN/pair_spin_long.h new file mode 100644 index 0000000000..867b771f74 --- /dev/null +++ b/src/SPIN/pair_spin_long.h @@ -0,0 +1,97 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(spin/long,PairSpinLong) + +#else + +#ifndef LMP_PAIR_SPIN_LONG_H +#define LMP_PAIR_SPIN_LONG_H + +#include "pair_spin.h" + +namespace LAMMPS_NS { + +class PairSpinLong : public PairSpin { + public: + double cut_coul; + double **sigma; + + PairSpinLong(class LAMMPS *); + ~PairSpinLong(); + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + void init_style(); + void *extract(const char *, int &); + + void compute(int, int); + void compute_single_pair(int, double *); + + void compute_long(int, int, double *, double *, double *, + double *, double *); + void compute_long_mech(int, int, double *, double *, double *, + double *, double *); + + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + + protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force + double cut_spin, cut_spinsq; + + double g_ewald; + int ewald_order; + + int lattice_flag; // flag for mech force computation + class FixNVESpin *lockfixnvespin; // ptr for setups + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args in pair_style command + +Self-explanatory. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair dipole/long requires atom attributes q, mu, torque + +The atom style defined does not have these attributes. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Pair style requires a KSpace style + +No kspace style is defined. + +*/ diff --git a/src/kspace.cpp b/src/kspace.cpp index fc8b12288b..da606bbf3d 100644 --- a/src/kspace.cpp +++ b/src/kspace.cpp @@ -268,7 +268,7 @@ void KSpace::ev_setup(int eflag, int vflag, int alloc) called initially, when particle count changes, when charges are changed ------------------------------------------------------------------------- */ -void KSpace::qsum_qsq() +void KSpace::qsum_qsq(int warning_flag) { const double * const q = atom->q; const int nlocal = atom->nlocal; @@ -285,7 +285,7 @@ void KSpace::qsum_qsq() MPI_Allreduce(&qsum_local,&qsum,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&qsqsum_local,&qsqsum,1,MPI_DOUBLE,MPI_SUM,world); - if ((qsqsum == 0.0) && (comm->me == 0) && warn_nocharge) { + if ((qsqsum == 0.0) && (comm->me == 0) && warn_nocharge && warning_flag) { error->warning(FLERR,"Using kspace solver on system with no charge"); warn_nocharge = 0; } diff --git a/src/kspace.h b/src/kspace.h index 28c7bcef2a..55ace5aa71 100644 --- a/src/kspace.h +++ b/src/kspace.h @@ -108,7 +108,7 @@ class KSpace : protected Pointers { // public so can be called by commands that change charge - void qsum_qsq(); + void qsum_qsq(int warning_flag = 1); // general child-class methods From e1ab38439b9eae0ced06b796613f0e2b17f1fe1c Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 14 Aug 2018 17:09:44 -0600 Subject: [PATCH 02/90] Commit2 JT 081418 - converted pppm_dipole toward spin quantities - need to check if can handle ferrimagnets --- src/KSPACE/pppm_spin.cpp | 963 ++++++++++++++++++++------------------- src/KSPACE/pppm_spin.h | 84 ++-- 2 files changed, 547 insertions(+), 500 deletions(-) diff --git a/src/KSPACE/pppm_spin.cpp b/src/KSPACE/pppm_spin.cpp index 32e91cc9b2..c51de8d023 100644 --- a/src/KSPACE/pppm_spin.cpp +++ b/src/KSPACE/pppm_spin.cpp @@ -13,6 +13,7 @@ /* ---------------------------------------------------------------------- Contributing author: Stan Moore (SNL) + Julien Tranchida (SNL) ------------------------------------------------------------------------- */ #include @@ -20,7 +21,7 @@ #include #include #include -#include "pppm_dipole.h" +#include "pppm_spin.h" #include "atom.h" #include "comm.h" #include "gridcomm.h" @@ -49,8 +50,8 @@ using namespace MathSpecial; #define SMALL 0.00001 #define EPS_HOC 1.0e-7 -enum{REVERSE_MU}; -enum{FORWARD_MU,FORWARD_MU_PERATOM}; +enum{REVERSE_SP}; +enum{FORWARD_SP,FORWARD_SP_PERATOM}; #ifdef FFT_SINGLE #define ZEROF 0.0f @@ -62,34 +63,34 @@ enum{FORWARD_MU,FORWARD_MU_PERATOM}; /* ---------------------------------------------------------------------- */ -PPPMDipole::PPPMDipole(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), - densityx_brick_dipole(NULL), densityy_brick_dipole(NULL), - densityz_brick_dipole(NULL), ux_brick_dipole(NULL), - uy_brick_dipole(NULL), uz_brick_dipole(NULL), vdxx_brick_dipole(NULL), - vdxy_brick_dipole(NULL), vdyy_brick_dipole(NULL), - vdxz_brick_dipole(NULL), vdyz_brick_dipole(NULL), - vdzz_brick_dipole(NULL), v0x_brick_dipole(NULL), v1x_brick_dipole(NULL), - v2x_brick_dipole(NULL), v3x_brick_dipole(NULL), v4x_brick_dipole(NULL), - v5x_brick_dipole(NULL), v0y_brick_dipole(NULL), v1y_brick_dipole(NULL), - v2y_brick_dipole(NULL), v3y_brick_dipole(NULL), v4y_brick_dipole(NULL), - v5y_brick_dipole(NULL), v0z_brick_dipole(NULL), v1z_brick_dipole(NULL), - v2z_brick_dipole(NULL), v3z_brick_dipole(NULL), v4z_brick_dipole(NULL), - v5z_brick_dipole(NULL), work3(NULL), work4(NULL), - densityx_fft_dipole(NULL), densityy_fft_dipole(NULL), - densityz_fft_dipole(NULL) +PPPMSpin::PPPMSpin(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), + densityx_brick_spin(NULL), densityy_brick_spin(NULL), + densityz_brick_spin(NULL), ux_brick_spin(NULL), + uy_brick_spin(NULL), uz_brick_spin(NULL), vdxx_brick_spin(NULL), + vdxy_brick_spin(NULL), vdyy_brick_spin(NULL), + vdxz_brick_spin(NULL), vdyz_brick_spin(NULL), + vdzz_brick_spin(NULL), v0x_brick_spin(NULL), v1x_brick_spin(NULL), + v2x_brick_spin(NULL), v3x_brick_spin(NULL), v4x_brick_spin(NULL), + v5x_brick_spin(NULL), v0y_brick_spin(NULL), v1y_brick_spin(NULL), + v2y_brick_spin(NULL), v3y_brick_spin(NULL), v4y_brick_spin(NULL), + v5y_brick_spin(NULL), v0z_brick_spin(NULL), v1z_brick_spin(NULL), + v2z_brick_spin(NULL), v3z_brick_spin(NULL), v4z_brick_spin(NULL), + v5z_brick_spin(NULL), work3(NULL), work4(NULL), + densityx_fft_spin(NULL), densityy_fft_spin(NULL), + densityz_fft_spin(NULL) { - dipoleflag = 1; + spinflag = 1; group_group_enable = 0; - cg_dipole = NULL; - cg_peratom_dipole = NULL; + cg_spin = NULL; + cg_peratom_spin = NULL; } /* ---------------------------------------------------------------------- free all memory ------------------------------------------------------------------------- */ -PPPMDipole::~PPPMDipole() +PPPMSpin::~PPPMSpin() { if (copymode) return; @@ -98,26 +99,29 @@ PPPMDipole::~PPPMDipole() fft1 = NULL; fft2 = NULL; remap = NULL; - cg_dipole = NULL; + cg_spin = NULL; } /* ---------------------------------------------------------------------- called once before run ------------------------------------------------------------------------- */ -void PPPMDipole::init() +void PPPMSpin::init() { if (me == 0) { - if (screen) fprintf(screen,"PPPMDipole initialization ...\n"); - if (logfile) fprintf(logfile,"PPPMDipole initialization ...\n"); + if (screen) fprintf(screen,"PPPMSpin initialization ...\n"); + if (logfile) fprintf(logfile,"PPPMSpin initialization ...\n"); } // error check - dipoleflag = atom->mu?1:0; - qsum_qsq(0); - if (dipoleflag && q2) - error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMDipole"); + //spinflag = atom->mu?1:0; + spinflag = atom->sp?1:0; + // no charges here, charge neutrality + //qsum_qsq(0); + // maybe change this test + if (spinflag && q2) + error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMSpin"); triclinic_check(); @@ -125,30 +129,30 @@ void PPPMDipole::init() error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); if (domain->dimension == 2) error->all(FLERR, - "Cannot use PPPMDipole with 2d simulation"); + "Cannot use PPPMSpin with 2d simulation"); if (comm->style != 0) - error->universe_all(FLERR,"PPPMDipole can only currently be used with " + error->universe_all(FLERR,"PPPMSpin can only currently be used with " "comm_style brick"); - if (!atom->mu) error->all(FLERR,"Kspace style requires atom attribute mu"); + if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); - if (atom->mu && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" - " ad with dipoles"); + if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" + " ad with spins"); - if (dipoleflag && strcmp(update->unit_style,"electron") == 0) - error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); + if (spinflag && strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"'metal' units have to be used with spins"); if (slabflag == 0 && domain->nonperiodic > 0) - error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMSpin"); if (slabflag) { if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) - error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); + error->all(FLERR,"Incorrect boundaries with slab PPPMSpin"); } if (order < 2 || order > MAXORDER) { char str[128]; - sprintf(str,"PPPMDipole order cannot be < 2 or > than %d",MAXORDER); + sprintf(str,"PPPMSpin order cannot be < 2 or > than %d",MAXORDER); error->all(FLERR,str); } @@ -156,7 +160,7 @@ void PPPMDipole::init() triclinic = domain->triclinic; if (triclinic) - error->all(FLERR,"Cannot yet use triclinic cells with PPPMDipole"); + error->all(FLERR,"Cannot yet use triclinic cells with PPPMSpin"); pair_check(); @@ -169,17 +173,26 @@ void PPPMDipole::init() // kspace TIP4P not yet supported if (tip4pflag) - error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); + error->all(FLERR,"Cannot yet use TIP4P with PPPMSpin"); // compute qsum & qsqsum and warn if not charge-neutral scale = 1.0; - qqrd2e = force->qqrd2e; - musum_musq(); + //qqrd2e = force->qqrd2e; + // need to define mag constants instead + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + //musum_musq(); + spsum_spsq(); natoms_original = atom->natoms; // set accuracy (force units) from accuracy_relative or accuracy_absolute + // is two_charge_force still relevant for spin systems? + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; else accuracy = accuracy_relative * two_charge_force; @@ -201,7 +214,7 @@ void PPPMDipole::init() while (order >= minorder) { if (iteration && me == 0) - error->warning(FLERR,"Reducing PPPMDipole order b/c stencil extends " + error->warning(FLERR,"Reducing PPPMSpin order b/c stencil extends " "beyond nearest neighbor processor"); compute_gf_denom(); @@ -222,9 +235,9 @@ void PPPMDipole::init() iteration++; } - if (order < minorder) error->all(FLERR,"PPPMDipole order < minimum allowed order"); + if (order < minorder) error->all(FLERR,"PPPMSpin order < minimum allowed order"); if (!overlap_allowed && cgtmp->ghost_overlap()) - error->all(FLERR,"PPPMDipole grid stencil extends " + error->all(FLERR,"PPPMSpin grid stencil extends " "beyond nearest neighbor processor"); if (cgtmp) delete cgtmp; @@ -234,7 +247,7 @@ void PPPMDipole::init() // calculate the final accuracy - double estimated_accuracy = final_accuracy_dipole(); + double estimated_accuracy = final_accuracy_spin(); // print stats @@ -280,10 +293,10 @@ void PPPMDipole::init() // don't invoke allocate peratom(), will be allocated when needed allocate(); - cg_dipole->ghost_notify(); - cg_dipole->setup(); + cg_spin->ghost_notify(); + cg_spin->setup(); - // pre-compute Green's function denomiator expansion + // pre-compute Green's function denominator expansion // pre-compute 1d charge distribution coefficients compute_gf_denom(); @@ -291,27 +304,27 @@ void PPPMDipole::init() } /* ---------------------------------------------------------------------- - adjust PPPMDipole coeffs, called initially and whenever volume has changed + adjust PPPMSpin coeffs, called initially and whenever volume has changed ------------------------------------------------------------------------- */ -void PPPMDipole::setup() +void PPPMSpin::setup() { // perform some checks to avoid illegal boundaries with read_data if (slabflag == 0 && domain->nonperiodic > 0) - error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMSpin"); if (slabflag) { if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) - error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); + error->all(FLERR,"Incorrect boundaries with slab PPPMSpin"); } int i,j,k,n; double *prd; // volume-dependent factors - // adjust z dimension for 2d slab PPPMDipole - // z dimension for 3d PPPMDipole is zprd since slab_volfactor = 1.0 + // adjust z dimension for 2d slab PPPMSpin + // z dimension for 3d PPPMSpin is zprd since slab_volfactor = 1.0 prd = domain->prd; double xprd = prd[0]; @@ -379,7 +392,7 @@ void PPPMDipole::setup() } } - compute_gf_dipole(); + compute_gf_spin(); } /* ---------------------------------------------------------------------- @@ -387,7 +400,7 @@ void PPPMDipole::setup() called by fix balance b/c it changed sizes of processor sub-domains ------------------------------------------------------------------------- */ -void PPPMDipole::setup_grid() +void PPPMSpin::setup_grid() { // free all arrays previously allocated @@ -404,11 +417,11 @@ void PPPMDipole::setup_grid() allocate(); - cg_dipole->ghost_notify(); - if (overlap_allowed == 0 && cg_dipole->ghost_overlap()) - error->all(FLERR,"PPPMDipole grid stencil extends " + cg_spin->ghost_notify(); + if (overlap_allowed == 0 && cg_spin->ghost_overlap()) + error->all(FLERR,"PPPMSpin grid stencil extends " "beyond nearest neighbor processor"); - cg_dipole->setup(); + cg_spin->setup(); // pre-compute Green's function denomiator expansion // pre-compute 1d charge distribution coefficients @@ -422,10 +435,10 @@ void PPPMDipole::setup_grid() } /* ---------------------------------------------------------------------- - compute the PPPMDipole long-range force, energy, virial + compute the PPPMSpin long-range force, energy, virial ------------------------------------------------------------------------- */ -void PPPMDipole::compute(int eflag, int vflag) +void PPPMSpin::compute(int eflag, int vflag) { int i,j; @@ -438,20 +451,21 @@ void PPPMDipole::compute(int eflag, int vflag) if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); - cg_peratom_dipole->ghost_notify(); - cg_peratom_dipole->setup(); + cg_peratom_spin->ghost_notify(); + cg_peratom_spin->setup(); } // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - musum_musq(); + //musum_musq(); + spsum_spsq(); natoms_original = atom->natoms; } - // return if there are no dipoles + // return if there are no spins - if (musqsum == 0.0) return; + if (spsqsum == 0.0) return; // convert atoms from box to lamda coords @@ -462,51 +476,52 @@ void PPPMDipole::compute(int eflag, int vflag) if (atom->nmax > nmax) { memory->destroy(part2grid); nmax = atom->nmax; - memory->create(part2grid,nmax,3,"pppm_dipole:part2grid"); + memory->create(part2grid,nmax,3,"pppm_spin:part2grid"); } // find grid points for all my particles - // map my particle charge onto my local 3d density grid + // map my particle charge onto my local 3d on-grid density particle_map(); - make_rho_dipole(); + make_rho_spin(); // all procs communicate density values from their ghost cells // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - cg_dipole->reverse_comm(this,REVERSE_MU); - brick2fft_dipole(); + cg_spin->reverse_comm(this,REVERSE_SP); + brick2fft_spin(); // compute potential gradient on my FFT grid and // portion of e_long on this proc's FFT grid // return gradients (electric fields) in 3d brick decomposition // also performs per-atom calculations via poisson_peratom() - poisson_ik_dipole(); + poisson_ik_spin(); // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks - cg_dipole->forward_comm(this,FORWARD_MU); + cg_spin->forward_comm(this,FORWARD_SP); // extra per-atom energy/virial communication if (evflag_atom) { - cg_peratom_dipole->forward_comm(this,FORWARD_MU_PERATOM); + cg_peratom_spin->forward_comm(this,FORWARD_SP_PERATOM); } // calculate the force on my particles - fieldforce_ik_dipole(); + fieldforce_ik_spin(); // extra per-atom energy/virial communication - if (evflag_atom) fieldforce_peratom_dipole(); + if (evflag_atom) fieldforce_peratom_spin(); // sum global energy across procs and add in volume-dependent term - const double qscale = qqrd2e * scale; + //const double qscale = qqrd2e * scale; + const double spscale = mub2mu0 * scale; const double g3 = g_ewald*g_ewald*g_ewald; if (eflag_global) { @@ -515,7 +530,7 @@ void PPPMDipole::compute(int eflag, int vflag) energy = energy_all; energy *= 0.5*volume; - energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy -= spsqsum*2.0*g3/3.0/MY_PIS; energy *= qscale; } @@ -531,16 +546,19 @@ void PPPMDipole::compute(int eflag, int vflag) // energy includes self-energy correction if (evflag_atom) { - double *q = atom->q; - double **mu = atom->mu; + //double *q = atom->q; + //double **mu = atom->mu; + double **sp = atom->sp; int nlocal = atom->nlocal; int ntotal = nlocal; if (eflag_atom) { for (i = 0; i < nlocal; i++) { eatom[i] *= 0.5; - eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; - eatom[i] *= qscale; + //eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; + eatom[i] -= (sp[i][0]*sp[i][0] + sp[i][1]*sp[i][1] + sp[i][2]*sp[i][2])*2.0*g3/3.0/MY_PIS; + //eatom[i] *= qscale; + eatom[i] *= spscale; } } @@ -559,59 +577,59 @@ void PPPMDipole::compute(int eflag, int vflag) allocate memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMDipole::allocate() +void PPPMSpin::allocate() { - memory->create3d_offset(densityx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:densityx_brick_dipole"); - memory->create3d_offset(densityy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:densityy_brick_dipole"); - memory->create3d_offset(densityz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:densityz_brick_dipole"); + memory->create3d_offset(densityx_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:densityx_brick_spin"); + memory->create3d_offset(densityy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:densityy_brick_spin"); + memory->create3d_offset(densityz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:densityz_brick_spin"); - memory->create(densityx_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); - memory->create(densityy_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); - memory->create(densityz_fft_dipole,nfft_both,"pppm_dipole:densityz_fft_dipole"); + memory->create(densityx_fft_spin,nfft_both,"pppm_spin:densityy_fft_spin"); + memory->create(densityy_fft_spin,nfft_both,"pppm_spin:densityy_fft_spin"); + memory->create(densityz_fft_spin,nfft_both,"pppm_spin:densityz_fft_spin"); - memory->create(greensfn,nfft_both,"pppm_dipole:greensfn"); - memory->create(work1,2*nfft_both,"pppm_dipole:work1"); - memory->create(work2,2*nfft_both,"pppm_dipole:work2"); - memory->create(work3,2*nfft_both,"pppm_dipole:work3"); - memory->create(work4,2*nfft_both,"pppm_dipole:work4"); - memory->create(vg,nfft_both,6,"pppm_dipole:vg"); + memory->create(greensfn,nfft_both,"pppm_spin:greensfn"); + memory->create(work1,2*nfft_both,"pppm_spin:work1"); + memory->create(work2,2*nfft_both,"pppm_spin:work2"); + memory->create(work3,2*nfft_both,"pppm_spin:work3"); + memory->create(work4,2*nfft_both,"pppm_spin:work4"); + memory->create(vg,nfft_both,6,"pppm_spin:vg"); - memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_dipole:fkx"); - memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_dipole:fky"); - memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_dipole:fkz"); + memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_spin:fkx"); + memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_spin:fky"); + memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_spin:fkz"); - memory->create3d_offset(ux_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:ux_brick_dipole"); - memory->create3d_offset(uy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:uy_brick_dipole"); - memory->create3d_offset(uz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:uz_brick_dipole"); + memory->create3d_offset(ux_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:ux_brick_spin"); + memory->create3d_offset(uy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:uy_brick_spin"); + memory->create3d_offset(uz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:uz_brick_spin"); - memory->create3d_offset(vdxx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdxx_brick_dipole"); - memory->create3d_offset(vdxy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdxy_brick_dipole"); - memory->create3d_offset(vdyy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdyy_brick_dipole"); - memory->create3d_offset(vdxz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdxz_brick_dipole"); - memory->create3d_offset(vdyz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdyz_brick_dipole"); - memory->create3d_offset(vdzz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdzz_brick_dipole"); + memory->create3d_offset(vdxx_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdxx_brick_spin"); + memory->create3d_offset(vdxy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdxy_brick_spin"); + memory->create3d_offset(vdyy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdyy_brick_spin"); + memory->create3d_offset(vdxz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdxz_brick_spin"); + memory->create3d_offset(vdyz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdyz_brick_spin"); + memory->create3d_offset(vdzz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdzz_brick_spin"); // summation coeffs order_allocated = order; - memory->create(gf_b,order,"pppm_dipole:gf_b"); - memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_dipole:rho1d"); - memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_dipole:drho1d"); - memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_dipole:rho_coeff"); + memory->create(gf_b,order,"pppm_spin:gf_b"); + memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_spin:rho1d"); + memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_spin:drho1d"); + memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_spin:rho_coeff"); memory->create2d_offset(drho_coeff,order,(1-order)/2,order/2, - "pppm_dipole:drho_coeff"); + "pppm_spin:drho_coeff"); // create 2 FFTs and a Remap // 1st FFT keeps data in FFT decompostion @@ -639,7 +657,7 @@ void PPPMDipole::allocate() int (*procneigh)[2] = comm->procneigh; - cg_dipole = new GridComm(lmp,world,9,3, + cg_spin = new GridComm(lmp,world,9,3, nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, procneigh[0][0],procneigh[0][1],procneigh[1][0], @@ -650,26 +668,26 @@ void PPPMDipole::allocate() deallocate memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMDipole::deallocate() +void PPPMSpin::deallocate() { - memory->destroy3d_offset(densityx_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(densityy_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(densityz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityx_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityy_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(ux_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(uy_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(uz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(ux_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uy_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxx_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxy_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdyy_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdyz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdzz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxx_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxy_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyy_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdzz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy(densityx_fft_dipole); - memory->destroy(densityy_fft_dipole); - memory->destroy(densityz_fft_dipole); + memory->destroy(densityx_fft_spin); + memory->destroy(densityy_fft_spin); + memory->destroy(densityz_fft_spin); memory->destroy(greensfn); memory->destroy(work1); @@ -691,61 +709,61 @@ void PPPMDipole::deallocate() delete fft1; delete fft2; delete remap; - delete cg_dipole; + delete cg_spin; } /* ---------------------------------------------------------------------- allocate per-atom memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMDipole::allocate_peratom() +void PPPMSpin::allocate_peratom() { peratom_allocate_flag = 1; - memory->create3d_offset(v0x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v0x_brick_dipole"); - memory->create3d_offset(v1x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v1x_brick_dipole"); - memory->create3d_offset(v2x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v2x_brick_dipole"); - memory->create3d_offset(v3x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v3x_brick_dipole"); - memory->create3d_offset(v4x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v4x_brick_dipole"); - memory->create3d_offset(v5x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v5x_brick_dipole"); + memory->create3d_offset(v0x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v0x_brick_spin"); + memory->create3d_offset(v1x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v1x_brick_spin"); + memory->create3d_offset(v2x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v2x_brick_spin"); + memory->create3d_offset(v3x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v3x_brick_spin"); + memory->create3d_offset(v4x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v4x_brick_spin"); + memory->create3d_offset(v5x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v5x_brick_spin"); - memory->create3d_offset(v0y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v0y_brick_dipole"); - memory->create3d_offset(v1y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v1y_brick_dipole"); - memory->create3d_offset(v2y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v2y_brick_dipole"); - memory->create3d_offset(v3y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v3y_brick_dipole"); - memory->create3d_offset(v4y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v4y_brick_dipole"); - memory->create3d_offset(v5y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v5y_brick_dipole"); + memory->create3d_offset(v0y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v0y_brick_spin"); + memory->create3d_offset(v1y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v1y_brick_spin"); + memory->create3d_offset(v2y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v2y_brick_spin"); + memory->create3d_offset(v3y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v3y_brick_spin"); + memory->create3d_offset(v4y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v4y_brick_spin"); + memory->create3d_offset(v5y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v5y_brick_spin"); - memory->create3d_offset(v0z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v0z_brick_dipole"); - memory->create3d_offset(v1z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v1z_brick_dipole"); - memory->create3d_offset(v2z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v2z_brick_dipole"); - memory->create3d_offset(v3z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v3z_brick_dipole"); - memory->create3d_offset(v4z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v4z_brick_dipole"); - memory->create3d_offset(v5z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v5z_brick_dipole"); + memory->create3d_offset(v0z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v0z_brick_spin"); + memory->create3d_offset(v1z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v1z_brick_spin"); + memory->create3d_offset(v2z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v2z_brick_spin"); + memory->create3d_offset(v3z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v3z_brick_spin"); + memory->create3d_offset(v4z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v4z_brick_spin"); + memory->create3d_offset(v5z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v5z_brick_spin"); // create ghost grid object for rho and electric field communication int (*procneigh)[2] = comm->procneigh; - cg_peratom_dipole = + cg_peratom_spin = new GridComm(lmp,world,18,1, nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, @@ -757,44 +775,44 @@ void PPPMDipole::allocate_peratom() deallocate per-atom memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMDipole::deallocate_peratom() +void PPPMSpin::deallocate_peratom() { peratom_allocate_flag = 0; - memory->destroy3d_offset(v0x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v0y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v0z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5z_brick_spin,nzlo_out,nylo_out,nxlo_out); - delete cg_peratom_dipole; + delete cg_peratom_spin; } /* ---------------------------------------------------------------------- - set global size of PPPMDipole grid = nx,ny,nz_pppm + set global size of PPPMSpin grid = nx,ny,nz_pppm used for charge accumulation, FFTs, and electric field interpolation ------------------------------------------------------------------------- */ -void PPPMDipole::set_grid_global() +void PPPMSpin::set_grid_global() { // use xprd,yprd,zprd - // adjust z dimension for 2d slab PPPMDipole - // 3d PPPMDipole just uses zprd since slab_volfactor = 1.0 + // adjust z dimension for 2d slab PPPMSpin + // 3d PPPMSpin just uses zprd since slab_volfactor = 1.0 double xprd = domain->xprd; double yprd = domain->yprd; @@ -812,14 +830,14 @@ void PPPMDipole::set_grid_global() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); - if (mu2 == 0.0) - error->all(FLERR,"Must use kspace_modify gewald for systems with no dipoles"); + if (sp2 == 0.0) + error->all(FLERR,"Must use kspace_modify gewald for systems with no spins"); g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; //Try Newton Solver double g_ewald_new = - find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + find_gewald_spin(g_ewald,cutoff,natoms,xprd*yprd*zprd,sp2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; - else error->warning(FLERR,"PPPMDipole dipole Newton solver failed, " + else error->warning(FLERR,"PPPMSpin spin Newton solver failed, " "using old method to estimate g_ewald"); } @@ -859,7 +877,7 @@ void PPPMDipole::set_grid_global() nzlo_fft = me_z*nz_pppm/npez_fft; nzhi_fft = (me_z+1)*nz_pppm/npez_fft - 1; - double df_kspace = compute_df_kspace_dipole(); + double df_kspace = compute_df_kspace_spin(); count++; @@ -884,31 +902,32 @@ void PPPMDipole::set_grid_global() h_z = zprd_slab/nz_pppm; if (nx_pppm >= OFFSET || ny_pppm >= OFFSET || nz_pppm >= OFFSET) - error->all(FLERR,"PPPMDipole grid is too large"); + error->all(FLERR,"PPPMSpin grid is too large"); } /* ---------------------------------------------------------------------- - compute estimated kspace force error for dipoles + compute estimated kspace force error for spins ------------------------------------------------------------------------- */ -double PPPMDipole::compute_df_kspace_dipole() +double PPPMSpin::compute_df_kspace_spin() { double xprd = domain->xprd; double yprd = domain->yprd; double zprd = domain->zprd; double zprd_slab = zprd*slab_volfactor; bigint natoms = atom->natoms; - double qopt = compute_qopt_dipole(); - double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); + double qopt = compute_qopt_spin(); + //double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); + double df_kspace = sqrt(qopt/natoms)*sp2/(3.0*xprd*yprd*zprd_slab); return df_kspace; } /* ---------------------------------------------------------------------- - compute qopt for dipoles with ik differentiation + compute qopt for spins with ik differentiation ------------------------------------------------------------------------- */ -double PPPMDipole::compute_qopt_dipole() +double PPPMSpin::compute_qopt_spin() { double qopt = 0.0; const double * const prd = domain->prd; @@ -979,7 +998,7 @@ double PPPMDipole::compute_qopt_dipole() dot1 = unitkx*kper*qx + unitky*lper*qy + unitkz*mper*qz; dot2 = qx*qx + qy*qy + qz*qz; - //dot1 = dot1*dot1*dot1; // power of 3 for dipole forces + //dot1 = dot1*dot1*dot1; // power of 3 for spin forces //dot2 = dot2*dot2*dot2; u1 = sx*sy*sz; const double w2 = wx*wy*wz; @@ -1004,7 +1023,7 @@ double PPPMDipole::compute_qopt_dipole() pre-compute modified (Hockney-Eastwood) Coulomb Green's function ------------------------------------------------------------------------- */ -void PPPMDipole::compute_gf_dipole() +void PPPMSpin::compute_gf_spin() { const double * const prd = domain->prd; @@ -1097,7 +1116,7 @@ void PPPMDipole::compute_gf_dipole() calculate f(x) for use in Newton-Raphson solver ------------------------------------------------------------------------- */ -double PPPMDipole::newton_raphson_f() +double PPPMSpin::newton_raphson_f() { double xprd = domain->xprd; double yprd = domain->yprd; @@ -1112,19 +1131,21 @@ double PPPMDipole::newton_raphson_f() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + //df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); + df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); - df_kspace = compute_df_kspace_dipole(); + df_kspace = compute_df_kspace_spin(); return df_rspace - df_kspace; } /* ---------------------------------------------------------------------- - find g_ewald parameter for dipoles based on desired accuracy + find g_ewald parameter for spins based on desired accuracy using a Newton-Raphson solver ------------------------------------------------------------------------- */ -double PPPMDipole::find_gewald_dipole(double x, double Rc, +double PPPMSpin::find_gewald_spin(double x, double Rc, bigint natoms, double vol, double b2) { double dx,tol; @@ -1136,7 +1157,7 @@ double PPPMDipole::find_gewald_dipole(double x, double Rc, //Begin algorithm for (int i = 0; i < maxit; i++) { - dx = newton_raphson_f_dipole(x,Rc,natoms,vol,b2) / derivf_dipole(x,Rc,natoms,vol,b2); + dx = newton_raphson_f_spin(x,Rc,natoms,vol,b2) / derivf_spin(x,Rc,natoms,vol,b2); x = x - dx; //Update x if (fabs(dx) < tol) return x; if (x < 0 || x != x) // solver failed @@ -1146,10 +1167,10 @@ double PPPMDipole::find_gewald_dipole(double x, double Rc, } /* ---------------------------------------------------------------------- - calculate f(x) objective function for dipoles + calculate f(x) objective function for spins ------------------------------------------------------------------------- */ -double PPPMDipole::newton_raphson_f_dipole(double x, double Rc, bigint +double PPPMSpin::newton_raphson_f_spin(double x, double Rc, bigint natoms, double vol, double b2) { double a = Rc*x; @@ -1166,21 +1187,21 @@ natoms, double vol, double b2) } /* ---------------------------------------------------------------------- - calculate numerical derivative f'(x) of objective function for dipoles + calculate numerical derivative f'(x) of objective function for spins ------------------------------------------------------------------------- */ -double PPPMDipole::derivf_dipole(double x, double Rc, +double PPPMSpin::derivf_spin(double x, double Rc, bigint natoms, double vol, double b2) { double h = 0.000001; //Derivative step-size - return (newton_raphson_f_dipole(x + h,Rc,natoms,vol,b2) - newton_raphson_f_dipole(x,Rc,natoms,vol,b2)) / h; + return (newton_raphson_f_spin(x + h,Rc,natoms,vol,b2) - newton_raphson_f_spin(x,Rc,natoms,vol,b2)) / h; } /* ---------------------------------------------------------------------- calculate the final estimate of the accuracy ------------------------------------------------------------------------- */ -double PPPMDipole::final_accuracy_dipole() +double PPPMSpin::final_accuracy_spin() { double xprd = domain->xprd; double yprd = domain->yprd; @@ -1189,7 +1210,7 @@ double PPPMDipole::final_accuracy_dipole() bigint natoms = atom->natoms; if (natoms == 0) natoms = 1; // avoid division by zero - double df_kspace = compute_df_kspace_dipole(); + double df_kspace = compute_df_kspace_spin(); double a = cutoff*g_ewald; double rg2 = a*a; @@ -1197,7 +1218,10 @@ double PPPMDipole::final_accuracy_dipole() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + //double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + // exp(-rg2)); + double df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); @@ -1210,10 +1234,10 @@ double PPPMDipole::final_accuracy_dipole() pre-compute Green's function denominator expansion coeffs, Gamma(2n) ------------------------------------------------------------------------- */ -void PPPMDipole::compute_gf_denom() +void PPPMSpin::compute_gf_denom() { if (gf_b) memory->destroy(gf_b); - memory->create(gf_b,order,"pppm_dipole:gf_b"); + memory->create(gf_b,order,"pppm_spin:gf_b"); int k,l,m; @@ -1239,7 +1263,7 @@ void PPPMDipole::compute_gf_denom() in global grid ------------------------------------------------------------------------- */ -void PPPMDipole::make_rho_dipole() +void PPPMSpin::make_rho_spin() { int l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz; @@ -1249,11 +1273,11 @@ void PPPMDipole::make_rho_dipole() // clear 3d density array - memset(&(densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); - memset(&(densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); - memset(&(densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); // loop over my charges, add their contribution to nearby grid points @@ -1261,7 +1285,8 @@ void PPPMDipole::make_rho_dipole() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **mu = atom->mu; + //double **mu = atom->mu; + double **sp = atom->sp; double **x = atom->x; int nlocal = atom->nlocal; @@ -1276,9 +1301,9 @@ void PPPMDipole::make_rho_dipole() compute_rho1d(dx,dy,dz); - z0 = delvolinv * mu[i][0]; - z1 = delvolinv * mu[i][1]; - z2 = delvolinv * mu[i][2]; + z0 = delvolinv * sp[i][0]; + z1 = delvolinv * sp[i][1]; + z2 = delvolinv * sp[i][2]; for (n = nlower; n <= nupper; n++) { mz = n+nz; y0 = z0*rho1d[2][n]; @@ -1291,9 +1316,9 @@ void PPPMDipole::make_rho_dipole() x2 = y2*rho1d[1][m]; for (l = nlower; l <= nupper; l++) { mx = l+nx; - densityx_brick_dipole[mz][my][mx] += x0*rho1d[0][l]; - densityy_brick_dipole[mz][my][mx] += x1*rho1d[0][l]; - densityz_brick_dipole[mz][my][mx] += x2*rho1d[0][l]; + densityx_brick_spin[mz][my][mx] += x0*rho1d[0][l]; + densityy_brick_spin[mz][my][mx] += x1*rho1d[0][l]; + densityz_brick_spin[mz][my][mx] += x2*rho1d[0][l]; } } } @@ -1304,7 +1329,7 @@ void PPPMDipole::make_rho_dipole() remap density from 3d brick decomposition to FFT decomposition ------------------------------------------------------------------------- */ -void PPPMDipole::brick2fft_dipole() +void PPPMSpin::brick2fft_spin() { int n,ix,iy,iz; @@ -1316,36 +1341,36 @@ void PPPMDipole::brick2fft_dipole() for (iz = nzlo_in; iz <= nzhi_in; iz++) for (iy = nylo_in; iy <= nyhi_in; iy++) for (ix = nxlo_in; ix <= nxhi_in; ix++) { - densityx_fft_dipole[n] = densityx_brick_dipole[iz][iy][ix]; - densityy_fft_dipole[n] = densityy_brick_dipole[iz][iy][ix]; - densityz_fft_dipole[n] = densityz_brick_dipole[iz][iy][ix]; + densityx_fft_spin[n] = densityx_brick_spin[iz][iy][ix]; + densityy_fft_spin[n] = densityy_brick_spin[iz][iy][ix]; + densityz_fft_spin[n] = densityz_brick_spin[iz][iy][ix]; n++; } - remap->perform(densityx_fft_dipole,densityx_fft_dipole,work1); - remap->perform(densityy_fft_dipole,densityy_fft_dipole,work1); - remap->perform(densityz_fft_dipole,densityz_fft_dipole,work1); + remap->perform(densityx_fft_spin,densityx_fft_spin,work1); + remap->perform(densityy_fft_spin,densityy_fft_spin,work1); + remap->perform(densityz_fft_spin,densityz_fft_spin,work1); } /* ---------------------------------------------------------------------- FFT-based Poisson solver for ik ------------------------------------------------------------------------- */ -void PPPMDipole::poisson_ik_dipole() +void PPPMSpin::poisson_ik_spin() { int i,j,k,n,ii; double eng; double wreal,wimg; - // transform dipole density (r -> k) + // transform spin density (r -> k) n = 0; for (i = 0; i < nfft; i++) { - work1[n] = densityx_fft_dipole[i]; + work1[n] = densityx_fft_spin[i]; work1[n+1] = ZEROF; - work2[n] = densityy_fft_dipole[i]; + work2[n] = densityy_fft_spin[i]; work2[n+1] = ZEROF; - work3[n] = densityz_fft_dipole[i]; + work3[n] = densityz_fft_spin[i]; work3[n+1] = ZEROF; n += 2; } @@ -1412,7 +1437,7 @@ void PPPMDipole::poisson_ik_dipole() // extra FFTs for per-atom energy/virial - if (vflag_atom) poisson_peratom_dipole(); + if (vflag_atom) poisson_peratom_spin(); // compute electric potential // FFT leaves data in 3d brick decomposition @@ -1434,7 +1459,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - ux_brick_dipole[k][j][i] = work4[n]; + ux_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1455,7 +1480,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - uy_brick_dipole[k][j][i] = work4[n]; + uy_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1476,7 +1501,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - uz_brick_dipole[k][j][i] = work4[n]; + uz_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1497,7 +1522,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxx_brick_dipole[k][j][i] = work4[n]; + vdxx_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1518,7 +1543,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdyy_brick_dipole[k][j][i] = work4[n]; + vdyy_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1539,7 +1564,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdzz_brick_dipole[k][j][i] = work4[n]; + vdzz_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1560,7 +1585,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxy_brick_dipole[k][j][i] = work4[n]; + vdxy_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1581,7 +1606,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxz_brick_dipole[k][j][i] = work4[n]; + vdxz_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1602,7 +1627,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdyz_brick_dipole[k][j][i] = work4[n]; + vdyz_brick_spin[k][j][i] = work4[n]; n += 2; } } @@ -1611,7 +1636,7 @@ void PPPMDipole::poisson_ik_dipole() FFT-based Poisson solver for per-atom energy/virial ------------------------------------------------------------------------- */ -void PPPMDipole::poisson_peratom_dipole() +void PPPMSpin::poisson_peratom_spin() { int i,ii,j,k,n; @@ -1638,7 +1663,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0x_brick_dipole[k][j][i] = work4[n]; + v0x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1661,7 +1686,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0y_brick_dipole[k][j][i] = work4[n]; + v0y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1684,7 +1709,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0z_brick_dipole[k][j][i] = work4[n]; + v0z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1707,7 +1732,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1x_brick_dipole[k][j][i] = work4[n]; + v1x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1730,7 +1755,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1y_brick_dipole[k][j][i] = work4[n]; + v1y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1753,7 +1778,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1z_brick_dipole[k][j][i] = work4[n]; + v1z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1776,7 +1801,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2x_brick_dipole[k][j][i] = work4[n]; + v2x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1799,7 +1824,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2y_brick_dipole[k][j][i] = work4[n]; + v2y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1822,7 +1847,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2z_brick_dipole[k][j][i] = work4[n]; + v2z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1845,7 +1870,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3x_brick_dipole[k][j][i] = work4[n]; + v3x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1868,7 +1893,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3y_brick_dipole[k][j][i] = work4[n]; + v3y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1891,7 +1916,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3z_brick_dipole[k][j][i] = work4[n]; + v3z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1914,7 +1939,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4x_brick_dipole[k][j][i] = work4[n]; + v4x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1937,7 +1962,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4y_brick_dipole[k][j][i] = work4[n]; + v4y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1960,7 +1985,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4z_brick_dipole[k][j][i] = work4[n]; + v4z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1983,7 +2008,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5x_brick_dipole[k][j][i] = work4[n]; + v5x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -2006,7 +2031,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5y_brick_dipole[k][j][i] = work4[n]; + v5y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -2029,16 +2054,16 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5z_brick_dipole[k][j][i] = work4[n]; + v5z_brick_spin[k][j][i] = work4[n]; n += 2; } } /* ---------------------------------------------------------------------- - interpolate from grid to get electric field & force on my particles for ik + interpolate from grid to get magnetic field & force on my particles for ik ------------------------------------------------------------------------- */ -void PPPMDipole::fieldforce_ik_dipole() +void PPPMSpin::fieldforce_ik_spin() { int i,l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz; @@ -2052,9 +2077,11 @@ void PPPMDipole::fieldforce_ik_dipole() // (mx,my,mz) = global coords of moving stencil pt - double **mu = atom->mu; + //double **mu = atom->mu; + double **sp = atom->sp; double **x = atom->x; double **f = atom->f; + double **fm = atom->fm; double **t = atom->torque; int nlocal = atom->nlocal; @@ -2080,29 +2107,37 @@ void PPPMDipole::fieldforce_ik_dipole() for (l = nlower; l <= nupper; l++) { mx = l+nx; x0 = y0*rho1d[0][l]; - ex -= x0*ux_brick_dipole[mz][my][mx]; - ey -= x0*uy_brick_dipole[mz][my][mx]; - ez -= x0*uz_brick_dipole[mz][my][mx]; - vxx -= x0*vdxx_brick_dipole[mz][my][mx]; - vyy -= x0*vdyy_brick_dipole[mz][my][mx]; - vzz -= x0*vdzz_brick_dipole[mz][my][mx]; - vxy -= x0*vdxy_brick_dipole[mz][my][mx]; - vxz -= x0*vdxz_brick_dipole[mz][my][mx]; - vyz -= x0*vdyz_brick_dipole[mz][my][mx]; + ex -= x0*ux_brick_spin[mz][my][mx]; + ey -= x0*uy_brick_spin[mz][my][mx]; + ez -= x0*uz_brick_spin[mz][my][mx]; + vxx -= x0*vdxx_brick_spin[mz][my][mx]; + vyy -= x0*vdyy_brick_spin[mz][my][mx]; + vzz -= x0*vdzz_brick_spin[mz][my][mx]; + vxy -= x0*vdxy_brick_spin[mz][my][mx]; + vxz -= x0*vdxz_brick_spin[mz][my][mx]; + vyz -= x0*vdyz_brick_spin[mz][my][mx]; } } } // convert E-field to torque - const double mufactor = qqrd2e * scale; - f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); - f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); - f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); + //const double mufactor = qqrd2e * scale; + const double spfactor = mub2mu0 * scale; + //f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); + //f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); + //f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); + f[i][0] += spfactor*(vxx*sp[i][0] + vxy*sp[i][1] + vxz*sp[i][2]); + f[i][1] += spfactor*(vxy*sp[i][0] + vyy*sp[i][1] + vyz*sp[i][2]); + f[i][2] += spfactor*(vxz*sp[i][0] + vyz*sp[i][1] + vzz*sp[i][2]); + + const double spfactorh = mub2mu0hbinv * scale; + fm[i][0] += spfactorh*ex; + fm[i][1] += spfactorh*ey; + fm[i][2] += spfactorh*ez; + + // create a new vector (in atom_spin style ?) to store long-range fm tables - t[i][0] += mufactor*(mu[i][1]*ez - mu[i][2]*ey); - t[i][1] += mufactor*(mu[i][2]*ex - mu[i][0]*ez); - t[i][2] += mufactor*(mu[i][0]*ey - mu[i][1]*ex); } } @@ -2110,7 +2145,7 @@ void PPPMDipole::fieldforce_ik_dipole() interpolate from grid to get per-atom energy/virial ------------------------------------------------------------------------- */ -void PPPMDipole::fieldforce_peratom_dipole() +void PPPMSpin::fieldforce_peratom_spin() { int i,l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz,x0,y0,z0; @@ -2124,7 +2159,8 @@ void PPPMDipole::fieldforce_peratom_dipole() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **mu = atom->mu; + //double **mu = atom->mu; + double **sp = atom->sp; double **x = atom->x; int nlocal = atom->nlocal; @@ -2153,42 +2189,42 @@ void PPPMDipole::fieldforce_peratom_dipole() mx = l+nx; x0 = y0*rho1d[0][l]; if (eflag_atom) { - ux += x0*ux_brick_dipole[mz][my][mx]; - uy += x0*uy_brick_dipole[mz][my][mx]; - uz += x0*uz_brick_dipole[mz][my][mx]; + ux += x0*ux_brick_spin[mz][my][mx]; + uy += x0*uy_brick_spin[mz][my][mx]; + uz += x0*uz_brick_spin[mz][my][mx]; } if (vflag_atom) { - v0x += x0*v0x_brick_dipole[mz][my][mx]; - v1x += x0*v1x_brick_dipole[mz][my][mx]; - v2x += x0*v2x_brick_dipole[mz][my][mx]; - v3x += x0*v3x_brick_dipole[mz][my][mx]; - v4x += x0*v4x_brick_dipole[mz][my][mx]; - v5x += x0*v5x_brick_dipole[mz][my][mx]; - v0y += x0*v0y_brick_dipole[mz][my][mx]; - v1y += x0*v1y_brick_dipole[mz][my][mx]; - v2y += x0*v2y_brick_dipole[mz][my][mx]; - v3y += x0*v3y_brick_dipole[mz][my][mx]; - v4y += x0*v4y_brick_dipole[mz][my][mx]; - v5y += x0*v5y_brick_dipole[mz][my][mx]; - v0z += x0*v0z_brick_dipole[mz][my][mx]; - v1z += x0*v1z_brick_dipole[mz][my][mx]; - v2z += x0*v2z_brick_dipole[mz][my][mx]; - v3z += x0*v3z_brick_dipole[mz][my][mx]; - v4z += x0*v4z_brick_dipole[mz][my][mx]; - v5z += x0*v5z_brick_dipole[mz][my][mx]; + v0x += x0*v0x_brick_spin[mz][my][mx]; + v1x += x0*v1x_brick_spin[mz][my][mx]; + v2x += x0*v2x_brick_spin[mz][my][mx]; + v3x += x0*v3x_brick_spin[mz][my][mx]; + v4x += x0*v4x_brick_spin[mz][my][mx]; + v5x += x0*v5x_brick_spin[mz][my][mx]; + v0y += x0*v0y_brick_spin[mz][my][mx]; + v1y += x0*v1y_brick_spin[mz][my][mx]; + v2y += x0*v2y_brick_spin[mz][my][mx]; + v3y += x0*v3y_brick_spin[mz][my][mx]; + v4y += x0*v4y_brick_spin[mz][my][mx]; + v5y += x0*v5y_brick_spin[mz][my][mx]; + v0z += x0*v0z_brick_spin[mz][my][mx]; + v1z += x0*v1z_brick_spin[mz][my][mx]; + v2z += x0*v2z_brick_spin[mz][my][mx]; + v3z += x0*v3z_brick_spin[mz][my][mx]; + v4z += x0*v4z_brick_spin[mz][my][mx]; + v5z += x0*v5z_brick_spin[mz][my][mx]; } } } } - if (eflag_atom) eatom[i] += mu[i][0]*ux + mu[i][1]*uy + mu[i][2]*uz; + if (eflag_atom) eatom[i] += sp[i][0]*ux + sp[i][1]*uy + sp[i][2]*uz; if (vflag_atom) { - vatom[i][0] += mu[i][0]*v0x + mu[i][1]*v0y + mu[i][2]*v0z; - vatom[i][1] += mu[i][0]*v1x + mu[i][1]*v1y + mu[i][2]*v1z; - vatom[i][2] += mu[i][0]*v2x + mu[i][1]*v2y + mu[i][2]*v2z; - vatom[i][3] += mu[i][0]*v3x + mu[i][1]*v3y + mu[i][2]*v3z; - vatom[i][4] += mu[i][0]*v4x + mu[i][1]*v4y + mu[i][2]*v4z; - vatom[i][5] += mu[i][0]*v5x + mu[i][1]*v5y + mu[i][2]*v5z; + vatom[i][0] += sp[i][0]*v0x + sp[i][1]*v0y + sp[i][2]*v0z; + vatom[i][1] += sp[i][0]*v1x + sp[i][1]*v1y + sp[i][2]*v1z; + vatom[i][2] += sp[i][0]*v2x + sp[i][1]*v2y + sp[i][2]*v2z; + vatom[i][3] += sp[i][0]*v3x + sp[i][1]*v3y + sp[i][2]*v3z; + vatom[i][4] += sp[i][0]*v4x + sp[i][1]*v4y + sp[i][2]*v4z; + vatom[i][5] += sp[i][0]*v5x + sp[i][1]*v5y + sp[i][2]*v5z; } } } @@ -2197,20 +2233,20 @@ void PPPMDipole::fieldforce_peratom_dipole() pack own values to buf to send to another proc ------------------------------------------------------------------------- */ -void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMSpin::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == FORWARD_MU) { - FFT_SCALAR *src_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + if (flag == FORWARD_SP) { + FFT_SCALAR *src_ux = &ux_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uy = &uy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uz = &uz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxx = &vdxx_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyy = &vdyy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vzz = &vdzz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxy = &vdxy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxz = &vdxz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyz = &vdyz_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { buf[n++] = src_ux[list[i]]; buf[n++] = src_uy[list[i]]; @@ -2222,25 +2258,25 @@ void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) buf[n++] = src_vxz[list[i]]; buf[n++] = src_vyz[list[i]]; } - } else if (flag == FORWARD_MU_PERATOM) { - FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + } else if (flag == FORWARD_SP_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { buf[n++] = v0xsrc[list[i]]; buf[n++] = v1xsrc[list[i]]; @@ -2268,20 +2304,20 @@ void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) unpack another proc's own values from buf and set own ghost values ------------------------------------------------------------------------- */ -void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMSpin::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == FORWARD_MU) { - FFT_SCALAR *dest_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + if (flag == FORWARD_SP) { + FFT_SCALAR *dest_ux = &ux_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uy = &uy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uz = &uz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxx = &vdxx_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyy = &vdyy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vzz = &vdzz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxy = &vdxy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxz = &vdxz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyz = &vdyz_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { dest_ux[list[i]] = buf[n++]; dest_uy[list[i]] = buf[n++]; @@ -2293,25 +2329,25 @@ void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) dest_vxz[list[i]] = buf[n++]; dest_vyz[list[i]] = buf[n++]; } - } else if (flag == FORWARD_MU_PERATOM) { - FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + } else if (flag == FORWARD_SP_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { v0xsrc[list[i]] = buf[n++]; v1xsrc[list[i]] = buf[n++]; @@ -2339,17 +2375,17 @@ void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) pack ghost values into buf to send to another proc ------------------------------------------------------------------------- */ -void PPPMDipole::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMSpin::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == REVERSE_MU) { - FFT_SCALAR *src_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + if (flag == REVERSE_SP) { + FFT_SCALAR *src_spin0 = &densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_spin1 = &densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_spin2 = &densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { - buf[n++] = src_dipole0[list[i]]; - buf[n++] = src_dipole1[list[i]]; - buf[n++] = src_dipole2[list[i]]; + buf[n++] = src_spin0[list[i]]; + buf[n++] = src_spin1[list[i]]; + buf[n++] = src_spin2[list[i]]; } } } @@ -2358,17 +2394,17 @@ void PPPMDipole::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) unpack another proc's ghost values from buf and add to own values ------------------------------------------------------------------------- */ -void PPPMDipole::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMSpin::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == REVERSE_MU) { - FFT_SCALAR *dest_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + if (flag == REVERSE_SP) { + FFT_SCALAR *dest_spin0 = &densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_spin1 = &densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_spin2 = &densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { - dest_dipole0[list[i]] += buf[n++]; - dest_dipole1[list[i]] += buf[n++]; - dest_dipole2[list[i]] += buf[n++]; + dest_spin0[list[i]] += buf[n++]; + dest_spin1[list[i]] += buf[n++]; + dest_spin2[list[i]] += buf[n++]; } } } @@ -2381,22 +2417,23 @@ void PPPMDipole::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) extended to non-neutral systems (J. Chem. Phys. 131, 094107). ------------------------------------------------------------------------- */ -void PPPMDipole::slabcorr() +void PPPMSpin::slabcorr() { - // compute local contribution to global dipole moment + // compute local contribution to global spin moment double **x = atom->x; double zprd = domain->zprd; int nlocal = atom->nlocal; - double dipole = 0.0; - double **mu = atom->mu; - for (int i = 0; i < nlocal; i++) dipole += mu[i][2]; + double spin = 0.0; + //double **mu = atom->mu; + double **sp = atom->sp; + for (int i = 0; i < nlocal; i++) spin += sp[i][2]; - // sum local contributions to get global dipole moment + // sum local contributions to get global spin moment - double dipole_all; - MPI_Allreduce(&dipole,&dipole_all,1,MPI_DOUBLE,MPI_SUM,world); + double spin_all; + MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); // need to make non-neutral systems and/or // per-atom energy translationally invariant @@ -2404,42 +2441,48 @@ void PPPMDipole::slabcorr() if (eflag_atom || fabs(qsum) > SMALL) { error->all(FLERR,"Cannot (yet) use kspace slab correction with " - "long-range dipoles and non-neutral systems or per-atom energy"); + "long-range spins and non-neutral systems or per-atom energy"); } // compute corrections - const double e_slabcorr = MY_2PI*(dipole_all*dipole_all/12.0)/volume; - const double qscale = qqrd2e * scale; + const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; + //const double qscale = qqrd2e * scale; + const double spscale = mub2mu0 * scale; - if (eflag_global) energy += qscale * e_slabcorr; + if (eflag_global) energy += spscale * e_slabcorr; // per-atom energy if (eflag_atom) { - double efact = qscale * MY_2PI/volume/12.0; + //double efact = qscale * MY_2PI/volume/12.0; + double efact = spscale * MY_2PI/volume/12.0; for (int i = 0; i < nlocal; i++) - eatom[i] += efact * mu[i][2]*dipole_all; + //eatom[i] += efact * mu[i][2]*spin_all; + eatom[i] += efact * sp[i][2]*spin_all; } // add on torque corrections - if (atom->torque) { - double ffact = qscale * (-4.0*MY_PI/volume); - double **mu = atom->mu; - double **torque = atom->torque; - for (int i = 0; i < nlocal; i++) { - torque[i][0] += ffact * dipole_all * mu[i][1]; - torque[i][1] += -ffact * dipole_all * mu[i][0]; - } - } + // no torque for the spins + // should it be calculated for the magnetic force fm? + + //if (atom->torque) { + // double ffact = qscale * (-4.0*MY_PI/volume); + // double **mu = atom->mu; + // double **torque = atom->torque; + // for (int i = 0; i < nlocal; i++) { + // torque[i][0] += ffact * spin_all * mu[i][1]; + // torque[i][1] += -ffact * spin_all * mu[i][0]; + // } + //} } /* ---------------------------------------------------------------------- perform and time the 1d FFTs required for N timesteps ------------------------------------------------------------------------- */ -int PPPMDipole::timing_1d(int n, double &time1d) +int PPPMSpin::timing_1d(int n, double &time1d) { double time1,time2; @@ -2474,7 +2517,7 @@ int PPPMDipole::timing_1d(int n, double &time1d) perform and time the 3d FFTs required for N timesteps ------------------------------------------------------------------------- */ -int PPPMDipole::timing_3d(int n, double &time3d) +int PPPMSpin::timing_3d(int n, double &time3d) { double time1,time2; @@ -2509,7 +2552,7 @@ int PPPMDipole::timing_3d(int n, double &time3d) memory usage of local arrays ------------------------------------------------------------------------- */ -double PPPMDipole::memory_usage() +double PPPMSpin::memory_usage() { double bytes = nmax*3 * sizeof(double); int nbrick = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * @@ -2523,37 +2566,41 @@ double PPPMDipole::memory_usage() if (peratom_allocate_flag) bytes += 21 * nbrick * sizeof(FFT_SCALAR); - if (cg_dipole) bytes += cg_dipole->memory_usage(); - if (cg_peratom_dipole) bytes += cg_peratom_dipole->memory_usage(); + if (cg_spin) bytes += cg_spin->memory_usage(); + if (cg_peratom_spin) bytes += cg_peratom_spin->memory_usage(); return bytes; } /* ---------------------------------------------------------------------- - compute musum,musqsum,mu2 - called initially, when particle count changes, when dipoles are changed + compute spsum,spsqsum,sp2 + called initially, when particle count changes, when spins are changed ------------------------------------------------------------------------- */ -void PPPMDipole::musum_musq() +void PPPMSpin::spsum_spsq() { const int nlocal = atom->nlocal; - musum = musqsum = mu2 = 0.0; - if (atom->mu_flag) { - double** mu = atom->mu; - double musum_local(0.0), musqsum_local(0.0); + spsum = spsqsum = sp2 = 0.0; + if (atom->sp_flag) { + double **sp = atom->sp; + double spsum_local(0.0), spsqsum_local(0.0); + + // not exactly the good loop: need to add norm of spins for (int i = 0; i < nlocal; i++) { - musum_local += mu[i][0] + mu[i][1] + mu[i][2]; - musqsum_local += mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]; + spsum_local += sp[i][0] + sp[i][1] + sp[i][2]; + spsqsum_local += sp[i][0]*sp[i][0] + sp[i][1]*sp[i][1] + sp[i][2]*sp[i][2]; } - MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); - mu2 = musqsum * force->qqrd2e; + //mu2 = musqsum * force->qqrd2e; + // find correct units + sp2 = spsqsum * mub2mu0; } - if (mu2 == 0 && comm->me == 0) - error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); -} \ No newline at end of file + if (sp2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMSpin on system with no spins"); +} diff --git a/src/KSPACE/pppm_spin.h b/src/KSPACE/pppm_spin.h index 4d6906f974..aacda1f0af 100644 --- a/src/KSPACE/pppm_spin.h +++ b/src/KSPACE/pppm_spin.h @@ -13,7 +13,7 @@ #ifdef KSPACE_CLASS -KSpaceStyle(pppm/dipole,PPPMDipole) +KSpaceStyle(pppm/spin,PPPMSpin) #else @@ -24,10 +24,10 @@ KSpaceStyle(pppm/dipole,PPPMDipole) namespace LAMMPS_NS { -class PPPMDipole : public PPPM { +class PPPMSpin : public PPPM { public: - PPPMDipole(class LAMMPS *, int, char **); - virtual ~PPPMDipole(); + PPPMSpin(class LAMMPS *, int, char **); + virtual ~PPPMSpin(); void init(); void setup(); void setup_grid(); @@ -55,37 +55,37 @@ class PPPMDipole : public PPPM { void pack_reverse(int, FFT_SCALAR *, int, int *); void unpack_reverse(int, FFT_SCALAR *, int, int *); - // dipole + // spin - FFT_SCALAR ***densityx_brick_dipole,***densityy_brick_dipole,***densityz_brick_dipole; - FFT_SCALAR ***vdxx_brick_dipole,***vdyy_brick_dipole,***vdzz_brick_dipole; - FFT_SCALAR ***vdxy_brick_dipole,***vdxz_brick_dipole,***vdyz_brick_dipole; - FFT_SCALAR ***ux_brick_dipole,***uy_brick_dipole,***uz_brick_dipole; - FFT_SCALAR ***v0x_brick_dipole,***v1x_brick_dipole,***v2x_brick_dipole; - FFT_SCALAR ***v3x_brick_dipole,***v4x_brick_dipole,***v5x_brick_dipole; - FFT_SCALAR ***v0y_brick_dipole,***v1y_brick_dipole,***v2y_brick_dipole; - FFT_SCALAR ***v3y_brick_dipole,***v4y_brick_dipole,***v5y_brick_dipole; - FFT_SCALAR ***v0z_brick_dipole,***v1z_brick_dipole,***v2z_brick_dipole; - FFT_SCALAR ***v3z_brick_dipole,***v4z_brick_dipole,***v5z_brick_dipole; + FFT_SCALAR ***densityx_brick_spin,***densityy_brick_spin,***densityz_brick_spin; + FFT_SCALAR ***vdxx_brick_spin,***vdyy_brick_spin,***vdzz_brick_spin; + FFT_SCALAR ***vdxy_brick_spin,***vdxz_brick_spin,***vdyz_brick_spin; + FFT_SCALAR ***ux_brick_spin,***uy_brick_spin,***uz_brick_spin; + FFT_SCALAR ***v0x_brick_spin,***v1x_brick_spin,***v2x_brick_spin; + FFT_SCALAR ***v3x_brick_spin,***v4x_brick_spin,***v5x_brick_spin; + FFT_SCALAR ***v0y_brick_spin,***v1y_brick_spin,***v2y_brick_spin; + FFT_SCALAR ***v3y_brick_spin,***v4y_brick_spin,***v5y_brick_spin; + FFT_SCALAR ***v0z_brick_spin,***v1z_brick_spin,***v2z_brick_spin; + FFT_SCALAR ***v3z_brick_spin,***v4z_brick_spin,***v5z_brick_spin; FFT_SCALAR *work3,*work4; - FFT_SCALAR *densityx_fft_dipole,*densityy_fft_dipole,*densityz_fft_dipole; - class GridComm *cg_dipole; - class GridComm *cg_peratom_dipole; - int only_dipole_flag; + FFT_SCALAR *densityx_fft_spin,*densityy_fft_spin,*densityz_fft_spin; + class GridComm *cg_spin; + class GridComm *cg_peratom_spin; + int only_spin_flag; double musum,musqsum,mu2; - double find_gewald_dipole(double, double, bigint, double, double); - double newton_raphson_f_dipole(double, double, bigint, double, double); - double derivf_dipole(double, double, bigint, double, double); - double compute_df_kspace_dipole(); - double compute_qopt_dipole(); - void compute_gf_dipole(); - void make_rho_dipole(); - void brick2fft_dipole(); - void poisson_ik_dipole(); - void poisson_peratom_dipole(); - void fieldforce_ik_dipole(); - void fieldforce_peratom_dipole(); - double final_accuracy_dipole(); + double find_gewald_spin(double, double, bigint, double, double); + double newton_raphson_f_spin(double, double, bigint, double, double); + double derivf_spin(double, double, bigint, double, double); + double compute_df_kspace_spin(); + double compute_qopt_spin(); + void compute_gf_spin(); + void make_rho_spin(); + void brick2fft_spin(); + void poisson_ik_spin(); + void poisson_peratom_spin(); + void fieldforce_ik_spin(); + void fieldforce_peratom_spin(); + double final_accuracy_spin(); void musum_musq(); }; @@ -97,9 +97,9 @@ class PPPMDipole : public PPPM { /* ERROR/WARNING messages: -E: Cannot (yet) use charges with Kspace style PPPMDipole +E: Cannot (yet) use charges with Kspace style PPPMSpin -Charge-dipole interactions are not yet implemented in PPPMDipole so this +Charge-spin interactions are not yet implemented in PPPMSpin so this feature is not yet supported. E: Must redefine kspace_style after changing to triclinic box @@ -110,19 +110,19 @@ E: Kspace style requires atom attribute mu The atom style defined does not have this attribute. -E: Cannot (yet) use kspace_modify diff ad with dipoles +E: Cannot (yet) use kspace_modify diff ad with spins This feature is not yet supported. -E: Cannot (yet) use 'electron' units with dipoles +E: Cannot (yet) use 'electron' units with spins This feature is not yet supported. -E: Cannot yet use triclinic cells with PPPMDipole +E: Cannot yet use triclinic cells with PPPMSpin This feature is not yet supported. -E: Cannot yet use TIP4P with PPPMDipole +E: Cannot yet use TIP4P with PPPMSpin This feature is not yet supported. @@ -144,7 +144,7 @@ This is a limitation of the PPPM implementation in LAMMPS. E: KSpace style is incompatible with Pair style Setting a kspace style requires that a pair style with matching -long-range dipole components be used. +long-range spin components be used. W: Reducing PPPM order b/c stencil extends beyond nearest neighbor processor @@ -202,11 +202,11 @@ outside a processor's sub-domain or even the entire simulation box. This indicates bad physics, e.g. due to highly overlapping atoms, too large a timestep, etc. -E: Using kspace solver PPPMDipole on system with no dipoles +E: Using kspace solver PPPMSpin on system with no spins -Must have non-zero dipoles with PPPMDipole. +Must have non-zero spins with PPPMSpin. -E: Must use kspace_modify gewald for system with no dipoles +E: Must use kspace_modify gewald for system with no spins Self-explanatory. From 5e287033f79e8662a18767239b4c8d2b6eac7308 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 16 Aug 2018 10:13:18 -0600 Subject: [PATCH 03/90] Commit1 JT 081618 - converted pppm_spin for long range spin-spin interactions - modified kspace, pair,and pair_hybrid to add spinflag --- src/KSPACE/pppm_spin.cpp | 138 ++++++++++++++---------------------- src/KSPACE/pppm_spin.h | 9 ++- src/SPIN/pair_spin_long.cpp | 2 +- src/kspace.cpp | 4 +- src/kspace.h | 1 + src/pair.cpp | 2 +- src/pair.h | 1 + src/pair_hybrid.cpp | 1 + 8 files changed, 70 insertions(+), 88 deletions(-) diff --git a/src/KSPACE/pppm_spin.cpp b/src/KSPACE/pppm_spin.cpp index c51de8d023..9b59f9cd7b 100644 --- a/src/KSPACE/pppm_spin.cpp +++ b/src/KSPACE/pppm_spin.cpp @@ -115,13 +115,7 @@ void PPPMSpin::init() // error check - //spinflag = atom->mu?1:0; spinflag = atom->sp?1:0; - // no charges here, charge neutrality - //qsum_qsq(0); - // maybe change this test - if (spinflag && q2) - error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMSpin"); triclinic_check(); @@ -175,17 +169,12 @@ void PPPMSpin::init() if (tip4pflag) error->all(FLERR,"Cannot yet use TIP4P with PPPMSpin"); - // compute qsum & qsqsum and warn if not charge-neutral - scale = 1.0; - //qqrd2e = force->qqrd2e; - // need to define mag constants instead hbar = force->hplanck/MY_2PI; // eV/(rad.THz) mub = 5.78901e-5; // in eV/T mu_0 = 1.2566370614e-6; // in T.m/A mub2mu0 = mub * mub * mu_0; // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz - //musum_musq(); spsum_spsq(); natoms_original = atom->natoms; @@ -458,7 +447,6 @@ void PPPMSpin::compute(int eflag, int vflag) // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - //musum_musq(); spsum_spsq(); natoms_original = atom->natoms; } @@ -520,7 +508,6 @@ void PPPMSpin::compute(int eflag, int vflag) // sum global energy across procs and add in volume-dependent term - //const double qscale = qqrd2e * scale; const double spscale = mub2mu0 * scale; const double g3 = g_ewald*g_ewald*g_ewald; @@ -531,7 +518,7 @@ void PPPMSpin::compute(int eflag, int vflag) energy *= 0.5*volume; energy -= spsqsum*2.0*g3/3.0/MY_PIS; - energy *= qscale; + energy *= spscale; } // sum global virial across procs @@ -539,32 +526,32 @@ void PPPMSpin::compute(int eflag, int vflag) if (vflag_global) { double virial_all[6]; MPI_Allreduce(virial,virial_all,6,MPI_DOUBLE,MPI_SUM,world); - for (i = 0; i < 6; i++) virial[i] = 0.5*qscale*volume*virial_all[i]; + for (i = 0; i < 6; i++) virial[i] = 0.5*spscale*volume*virial_all[i]; } // per-atom energy/virial // energy includes self-energy correction if (evflag_atom) { - //double *q = atom->q; - //double **mu = atom->mu; double **sp = atom->sp; + double spx,spy,spz; int nlocal = atom->nlocal; int ntotal = nlocal; if (eflag_atom) { for (i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; eatom[i] *= 0.5; - //eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; - eatom[i] -= (sp[i][0]*sp[i][0] + sp[i][1]*sp[i][1] + sp[i][2]*sp[i][2])*2.0*g3/3.0/MY_PIS; - //eatom[i] *= qscale; + eatom[i] -= (spx*spx + spy*spy + spz*spz)*2.0*g3/3.0/MY_PIS; eatom[i] *= spscale; } } if (vflag_atom) { for (i = 0; i < ntotal; i++) - for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*qscale; + for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*spscale; } } @@ -918,7 +905,6 @@ double PPPMSpin::compute_df_kspace_spin() double zprd_slab = zprd*slab_volfactor; bigint natoms = atom->natoms; double qopt = compute_qopt_spin(); - //double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); double df_kspace = sqrt(qopt/natoms)*sp2/(3.0*xprd*yprd*zprd_slab); return df_kspace; } @@ -1131,8 +1117,6 @@ double PPPMSpin::newton_raphson_f() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - //df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * - // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); df_kspace = compute_df_kspace_spin(); @@ -1218,9 +1202,6 @@ double PPPMSpin::final_accuracy_spin() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - //double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * - // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * - // exp(-rg2)); double df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); @@ -1285,8 +1266,8 @@ void PPPMSpin::make_rho_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - //double **mu = atom->mu; double **sp = atom->sp; + double spx,spy,spz; double **x = atom->x; int nlocal = atom->nlocal; @@ -1301,9 +1282,12 @@ void PPPMSpin::make_rho_spin() compute_rho1d(dx,dy,dz); - z0 = delvolinv * sp[i][0]; - z1 = delvolinv * sp[i][1]; - z2 = delvolinv * sp[i][2]; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + z0 = delvolinv * spx; + z1 = delvolinv * spy; + z2 = delvolinv * spz; for (n = nlower; n <= nupper; n++) { mz = n+nz; y0 = z0*rho1d[2][n]; @@ -2076,13 +2060,11 @@ void PPPMSpin::fieldforce_ik_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - - //double **mu = atom->mu; double **sp = atom->sp; + double spx,spy,spz; double **x = atom->x; double **f = atom->f; double **fm = atom->fm; - double **t = atom->torque; int nlocal = atom->nlocal; @@ -2120,16 +2102,15 @@ void PPPMSpin::fieldforce_ik_spin() } } - // convert E-field to torque + // convert M-field to mech. and mag. forces - //const double mufactor = qqrd2e * scale; const double spfactor = mub2mu0 * scale; - //f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); - //f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); - //f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); - f[i][0] += spfactor*(vxx*sp[i][0] + vxy*sp[i][1] + vxz*sp[i][2]); - f[i][1] += spfactor*(vxy*sp[i][0] + vyy*sp[i][1] + vyz*sp[i][2]); - f[i][2] += spfactor*(vxz*sp[i][0] + vyz*sp[i][1] + vzz*sp[i][2]); + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + f[i][0] += spfactor*(vxx*spx + vxy*spy + vxz*spz); + f[i][1] += spfactor*(vxy*spx + vyy*spy + vyz*spz); + f[i][2] += spfactor*(vxz*spx + vyz*spy + vzz*spz); const double spfactorh = mub2mu0hbinv * scale; fm[i][0] += spfactorh*ex; @@ -2159,8 +2140,8 @@ void PPPMSpin::fieldforce_peratom_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - //double **mu = atom->mu; double **sp = atom->sp; + double spx,spy,spz; double **x = atom->x; int nlocal = atom->nlocal; @@ -2217,14 +2198,17 @@ void PPPMSpin::fieldforce_peratom_spin() } } - if (eflag_atom) eatom[i] += sp[i][0]*ux + sp[i][1]*uy + sp[i][2]*uz; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + if (eflag_atom) eatom[i] += spx*ux + spy*uy + spz*uz; if (vflag_atom) { - vatom[i][0] += sp[i][0]*v0x + sp[i][1]*v0y + sp[i][2]*v0z; - vatom[i][1] += sp[i][0]*v1x + sp[i][1]*v1y + sp[i][2]*v1z; - vatom[i][2] += sp[i][0]*v2x + sp[i][1]*v2y + sp[i][2]*v2z; - vatom[i][3] += sp[i][0]*v3x + sp[i][1]*v3y + sp[i][2]*v3z; - vatom[i][4] += sp[i][0]*v4x + sp[i][1]*v4y + sp[i][2]*v4z; - vatom[i][5] += sp[i][0]*v5x + sp[i][1]*v5y + sp[i][2]*v5z; + vatom[i][0] += spx*v0x + spy*v0y + spz*v0z; + vatom[i][1] += spx*v1x + spy*v1y + spz*v1z; + vatom[i][2] += spx*v2x + spy*v2y + spz*v2z; + vatom[i][3] += spx*v3x + spy*v3y + spz*v3z; + vatom[i][4] += spx*v4x + spy*v4y + spz*v4z; + vatom[i][5] += spx*v5x + spy*v5y + spz*v5z; } } } @@ -2426,28 +2410,21 @@ void PPPMSpin::slabcorr() int nlocal = atom->nlocal; double spin = 0.0; - //double **mu = atom->mu; double **sp = atom->sp; - for (int i = 0; i < nlocal; i++) spin += sp[i][2]; + double spx,spy,spz; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + spin += spz; + } // sum local contributions to get global spin moment double spin_all; MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); - // need to make non-neutral systems and/or - // per-atom energy translationally invariant - - if (eflag_atom || fabs(qsum) > SMALL) { - - error->all(FLERR,"Cannot (yet) use kspace slab correction with " - "long-range spins and non-neutral systems or per-atom energy"); - } - // compute corrections const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; - //const double qscale = qqrd2e * scale; const double spscale = mub2mu0 * scale; if (eflag_global) energy += spscale * e_slabcorr; @@ -2455,27 +2432,20 @@ void PPPMSpin::slabcorr() // per-atom energy if (eflag_atom) { - //double efact = qscale * MY_2PI/volume/12.0; double efact = spscale * MY_2PI/volume/12.0; - for (int i = 0; i < nlocal; i++) - //eatom[i] += efact * mu[i][2]*spin_all; - eatom[i] += efact * sp[i][2]*spin_all; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + eatom[i] += efact * spz * spin_all; + } } - // add on torque corrections + // add on mag. force corrections - // no torque for the spins - // should it be calculated for the magnetic force fm? - - //if (atom->torque) { - // double ffact = qscale * (-4.0*MY_PI/volume); - // double **mu = atom->mu; - // double **torque = atom->torque; - // for (int i = 0; i < nlocal; i++) { - // torque[i][0] += ffact * spin_all * mu[i][1]; - // torque[i][1] += -ffact * spin_all * mu[i][0]; - // } - //} + double ffact = spscale * (-4.0*MY_PI/volume); + double **fm = atom->fm; + for (int i = 0; i < nlocal; i++) { + fm[i][2] += ffact * spin_all; + } } /* ---------------------------------------------------------------------- @@ -2584,20 +2554,22 @@ void PPPMSpin::spsum_spsq() spsum = spsqsum = sp2 = 0.0; if (atom->sp_flag) { double **sp = atom->sp; + double spx, spy, spz; double spsum_local(0.0), spsqsum_local(0.0); // not exactly the good loop: need to add norm of spins for (int i = 0; i < nlocal; i++) { - spsum_local += sp[i][0] + sp[i][1] + sp[i][2]; - spsqsum_local += sp[i][0]*sp[i][0] + sp[i][1]*sp[i][1] + sp[i][2]*sp[i][2]; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + spsum_local += spx + spy + spz; + spsqsum_local += spx*spx + spy*spy + spz*spz; } MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); - //mu2 = musqsum * force->qqrd2e; - // find correct units sp2 = spsqsum * mub2mu0; } diff --git a/src/KSPACE/pppm_spin.h b/src/KSPACE/pppm_spin.h index aacda1f0af..3b4d42d4ea 100644 --- a/src/KSPACE/pppm_spin.h +++ b/src/KSPACE/pppm_spin.h @@ -37,6 +37,11 @@ class PPPMSpin : public PPPM { double memory_usage(); protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force void set_grid_global(); double newton_raphson_f(); @@ -72,7 +77,7 @@ class PPPMSpin : public PPPM { class GridComm *cg_spin; class GridComm *cg_peratom_spin; int only_spin_flag; - double musum,musqsum,mu2; + double spsum,spsqsum,sp2; double find_gewald_spin(double, double, bigint, double, double); double newton_raphson_f_spin(double, double, bigint, double, double); double derivf_spin(double, double, bigint, double, double); @@ -86,7 +91,7 @@ class PPPMSpin : public PPPM { void fieldforce_ik_spin(); void fieldforce_peratom_spin(); double final_accuracy_spin(); - void musum_musq(); + void spsum_spsq(); }; diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp index 66b684ae1d..95c4e6b5a9 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_long.cpp @@ -59,7 +59,7 @@ PairSpinLong::PairSpinLong(LAMMPS *lmp) : PairSpin(lmp), lockfixnvespin(NULL) { single_enable = 0; - ewaldflag = pppmflag = 1; + ewaldflag = pppmflag = spinflag = 1; respa_enable = 0; no_virial_fdotr_compute = 1; lattice_flag = 0; diff --git a/src/kspace.cpp b/src/kspace.cpp index da606bbf3d..75b6abf515 100644 --- a/src/kspace.cpp +++ b/src/kspace.cpp @@ -37,7 +37,7 @@ KSpace::KSpace(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) virial[0] = virial[1] = virial[2] = virial[3] = virial[4] = virial[5] = 0.0; triclinic_support = 1; - ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = 0; + ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = spinflag = 0; compute_flag = 1; group_group_enable = 0; stagger_flag = 0; @@ -192,6 +192,8 @@ void KSpace::pair_check() error->all(FLERR,"KSpace style is incompatible with Pair style"); if (dipoleflag && !force->pair->dipoleflag) error->all(FLERR,"KSpace style is incompatible with Pair style"); + if (spinflag && !force->pair->spinflag) + error->all(FLERR,"KSpace style is incompatible with Pair style"); if (tip4pflag && !force->pair->tip4pflag) error->all(FLERR,"KSpace style is incompatible with Pair style"); diff --git a/src/kspace.h b/src/kspace.h index 55ace5aa71..c049ad11f1 100644 --- a/src/kspace.h +++ b/src/kspace.h @@ -44,6 +44,7 @@ class KSpace : protected Pointers { int dispersionflag; // 1 if a LJ/dispersion solver int tip4pflag; // 1 if a TIP4P solver int dipoleflag; // 1 if a dipole solver + int spinflag; // 1 if a spin solver int differentiation_flag; int neighrequest_flag; // used to avoid obsolete construction // of neighbor lists diff --git a/src/pair.cpp b/src/pair.cpp index 5c308cc7ce..88fed646b4 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -72,7 +72,7 @@ Pair::Pair(LAMMPS *lmp) : Pointers(lmp) single_extra = 0; svector = NULL; - ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = 0; + ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = spinflag = 0; reinitflag = 1; // pair_modify settings diff --git a/src/pair.h b/src/pair.h index 844bc0cdc7..f830b7c035 100644 --- a/src/pair.h +++ b/src/pair.h @@ -61,6 +61,7 @@ class Pair : protected Pointers { int dispersionflag; // 1 if compatible with LJ/dispersion solver int tip4pflag; // 1 if compatible with TIP4P solver int dipoleflag; // 1 if compatible with dipole solver + int spinflag; // 1 if compatible with spin long solver int reinitflag; // 1 if compatible with fix adapt and alike int tail_flag; // pair_modify flag for LJ tail correction diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index dc74dd040d..34359b8009 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -352,6 +352,7 @@ void PairHybrid::flags() if (styles[m]->pppmflag) pppmflag = 1; if (styles[m]->msmflag) msmflag = 1; if (styles[m]->dipoleflag) dipoleflag = 1; + if (styles[m]->spinflag) spinflag = 1; if (styles[m]->dispersionflag) dispersionflag = 1; if (styles[m]->tip4pflag) tip4pflag = 1; if (styles[m]->compute_flag) compute_flag = 1; From 8d79db03d38061cf18c12954472ba64a79aa12ad Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 21 Aug 2018 13:47:38 -0600 Subject: [PATCH 04/90] Commit1 JT 082118 - created pppm_dipole_spin.h/cpp (child-class of pppm_dipole) - improved pair_spin_long.h/cpp - created documentation for pair_spin_long - new 3xN fm_long vector in atom_vec_spin (with associated comm) --- doc/src/Eqs/pair_spin_long_range.jpg | Bin 0 -> 11980 bytes doc/src/Eqs/pair_spin_long_range.tex | 20 + doc/src/Eqs/pair_spin_long_range_force.jpg | Bin 0 -> 16016 bytes doc/src/Eqs/pair_spin_long_range_force.tex | 23 + doc/src/Eqs/pair_spin_long_range_magforce.jpg | Bin 0 -> 9440 bytes doc/src/Eqs/pair_spin_long_range_magforce.tex | 17 + doc/src/pair_spin_long.txt | 84 ++ src/KSPACE/{pppm_spin.cpp => pppm_dipole.cpp} | 1012 ++++++++--------- src/KSPACE/pppm_dipole.h | 213 ++++ src/KSPACE/pppm_dipole_spin.cpp | 750 ++++++++++++ .../{pppm_spin.h => pppm_dipole_spin.h} | 71 +- src/SPIN/atom_vec_spin.cpp | 14 +- src/SPIN/atom_vec_spin.h | 8 +- src/SPIN/pair_spin_exchange.cpp | 3 - src/SPIN/pair_spin_long.cpp | 370 +++--- src/SPIN/pair_spin_long.h | 5 +- 16 files changed, 1839 insertions(+), 751 deletions(-) create mode 100644 doc/src/Eqs/pair_spin_long_range.jpg create mode 100644 doc/src/Eqs/pair_spin_long_range.tex create mode 100644 doc/src/Eqs/pair_spin_long_range_force.jpg create mode 100644 doc/src/Eqs/pair_spin_long_range_force.tex create mode 100644 doc/src/Eqs/pair_spin_long_range_magforce.jpg create mode 100644 doc/src/Eqs/pair_spin_long_range_magforce.tex create mode 100644 doc/src/pair_spin_long.txt rename src/KSPACE/{pppm_spin.cpp => pppm_dipole.cpp} (67%) create mode 100644 src/KSPACE/pppm_dipole.h create mode 100644 src/KSPACE/pppm_dipole_spin.cpp rename src/KSPACE/{pppm_spin.h => pppm_dipole_spin.h} (66%) diff --git a/doc/src/Eqs/pair_spin_long_range.jpg b/doc/src/Eqs/pair_spin_long_range.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bc133d10cf0a0a2a07db95afaf64961911f94084 GIT binary patch literal 11980 zcmb7q1yo$kvhJQ?a35SVxCXc21B1I0Ai*_2fZ#y}2<}dBcXtRH2niZof(J>E5C{@T zkVpP={&UYd@2-2_>*>{dSJhY5)q7U=s_w44#k&oFKv`Z%9sq$rz=!)EaJLM|0w`ec zpL$;)_Z1Zb6%_(O#X?6%!@$A9!NJDD#>T~i65!$y;$dSGkP;9Q5tERR;NX*ylM<6d ziAjk67y+T&>p)O3QBg68aj|iU|G&%KTYwM)cmke70TBXVLJ$fe=xz|820#GHy|?%N z{#{Vf&><*b5XQZf_}|$76yJRUa8N)1m;i+U06@1De{21Da@Z;f{X6}i@92*vfkz+s zn(bjItSs1z|0(`28c*l&Cn{q{F8b0D7Vnu?8WJBWa?0F?{%G4X@r%|WKFapqe}VtJ zfri}k%>H7bnfMVQ`c1jQY%~bA8@BDtz`;7v9b;OtUr|^k)gTjb!M{`~`iqc%f&bM! z2y?UBVT~0X-T1>I@AssO3>l1O9DX7BP`V3=KX65STO$_FFt&&0;7VidI5)E7!>>Ig zO{t~M1-n-$O9yA0NZ-3*$P$-uPXl~Sx~y`#-?&jD01U8rG7Hx0H#g-(BUa0FRTSWtVBH?B%u|4a z4RMh1Lj2|VWb{3rr2JUS<03!l@rtf=Z#y4Ff&ADZR~nB#Hq~#6#&QNRMDn@ZI}y%& z-+%x_x+VZ@u-SxR$aMK8gcWNlCVhhE$p?ediO^qPnnqz#8-57+Iw{RBqq_UBSjhpP zaD{o2X=>rot2V#hETVxCC?p;ld|tA*y! zM-fzpl!NBiCG2bf7%vV}=_55|Q(s5}goBs@%1A(5T?PTz?jmi_a{m~*FA(0aO#9Dv zNC1SUD=jv<2#n$KY>N-Wv_^fV|AF|sMTw{(gZ)ihqkjd!7&$PdB*yDU>cQR*LKUwV zaB=A(PfL6QZMMVCKD_Fc|mK2!sm0MKcCmT#S8X z`F}Y<^z}@!zSl0LHQMseG}$;_is?N=YPM8a_WnYQlvbVkyS^zML6l|42)+%j;7B!n zOt@FS^i9sOP*@CO&(_3u6=zwyWNn_ld5a~!FPI%#iA!A@%0td&;NfLivY;=>kO(fn zg*EO2cIra17Xr2`U9xB&UiU!kxw#jzUVhdO+$~Ed0L?pHaO0l^@$^16@GonfpWtlr zlfDB8E}d(P7}Y8cYg^~m)JI33eQF5y%qhXftIuA2zTZ{#)4I(!+iu(UxJ&94%3QkX ze$(5X6|n~=Qor93U9fZ|;+SYiJ6m?Ur9-IN1D!nJ@t>BY*QGLjTSOyThLP0xAE=0^OqIqZGP7%VAO(&}ml zX7bnPTs7Qa0em)u|6$Mc;UbDDv zd3l-VGZ4W`k|DgaUh-98_i!a8^R`>PF9<*E^0fnz@J~lSb(+*RU*T+UnBe2#L*7@v zlf>U$Cd?kfVh!A}C%%&9Omd6mKZU;?IXDXPSp}bVqJDA59$633yBDx7D$pO*CdXab z1l#}09Y3B3$oLuR-P?(}>uJsuwEB=JMirFvwwLJ9QuVmeS~@Ll>!naG58Y zR{_!E>-;=PPmPfp4pmX3kLKvd zT2U3Sg*nzaAER1U4laH$Zxw56wjkDpfoGI6kbs&NKtzRuX&SklnS@$b+H8OQF_8ev z5ts10LdbS=C(|W^#**NnXv+xnqUfqbVVX6r(I~dqPOz&vEb+yA2&tHJ<%|%*g2vY# zbuPAfNiw|7W87IXG+NChZa>C^%nz60jb|e^j&p+1-~q^Uosqt4HVjt znAu%o)lj$*nZNqwT621~WxOHE#}s-^V7c&ZCi_{0cBi|JM>@&WA{m~`pme8H1W!Ad zon%4&`|=m^kCJ%@Kg!#QM^j&e7niK;tD!~KR$TymGLas&{ezL0s^#8zbvz=LK;Zq; zIoIg%+ss!l+5Ort+eifH)n|;U`3;HAM@d5DuWVoYiA-B0$#CDp#g|0t3STiWmN|LgxRq&fSL+QXq`H{{aF17ef7h z6$RZ#MQG?aXc%ZH_h#-X2qAz9C8FacriW{pyAr_oWP%b4NEmqd1+*=aQX8hG(HI3a z3;U&IbDvCaN0C!k9%L-s^P8TiHdCATLQ`(`+bES1#$c>(6y{FWo9yd1QC z7W(_c@#IcogF#)oEa4ymt?UBZ*M&q{Ps^JwFsR3Pnf~ntuV!;af$i%u^RxH|#G?X{IF`{J^?gff)ahUKkGWaP z`p6z?p>$Q2IdPh%=$iSx|HZ( z(ZB-THsVpcc`*<1ush%z`8azHGA<0Gd@`3Zdtd5ZUgp|(thQ^j6v$;kuZD^m(AxE0~P0m0BdfE3Ob7vtH zuLEQ68spRfTv^0(c2&$>k7&XW9Sxn-p|9@4*g8t?cfjHMksozuje*i0f|a#<)E=y&r%3(^y=-K4kCq9c9X)N$Q$+7hVH!}UcapdJu!O!ON>r^(0axR? zLAl1P1IIVyMgQsUzlJbf>%*j=2$t>141d z@6F8W*0NT^KC9~~A9g!me}3-WDmKJ0_BEkZOV@D<52Z#bV^C1{h%s1iwptvQI*L}9 z)Y=(hA)?#F=|D^>EJ-=GPuWo(yq4=Djom!8I1osMZSmNq#HK1&p+?}_jzjmX*O7_9 zc_iaAsMD9!gnb{X?B8$3>(5?0HieJ%Xh;h`_doP@08Em57Ry4Bi_`R2^BuYaP}TH4GL-5ME*jXB3DiHdAqUa>5C|3xzTb@m-pSd6+s8WyB1|a8Ag61C0`_hFHn}Edc7UI zO0#DgJJ7v>Gq1~q;+nFus5RB*A=!W%%Lgs2cfh3ZtqE^+b#TGMb~#l`*v*R#j-voG zM<-WR*WY5icYvyEE9-{+Tz;L{+(Kv+CHrO3laa_YRp1uKFN^oLXy9;svW=9j#ue`m z$M=VOcL1}bTE+|kLgoFVETZ_f{9e@m3q0u|vjwfJ*Yg);9k+jDUqzbL zY7Z^=Ql$7QJy~Ns6I7{WQz+4ZlV_bhZJ{+ZNe`WMexP#A^8M_xc+2U?!)E!nhTHDk z!PGx};(?cpDN4|O(YWIAr0};A-f9}zeQ;r(3(sK}Hztc@EyFknJbo!pR~D7l$=gAC zM#LVko-;sE7002(c8d~|kAI~rIpzxFk`3uS$tJ0eld<31j&*;?pI6lL^PpFrqJ7bn z!u<1739E}FrQgSHhC7vIqxN$9Mp44{RuU#tF2c)%YO)#za%sh?%p|I7*UQaIhU=a; zmxe-aG>WG7Wf@}J3$ZUBF?~Uufv$WPI@X$WbBM%Mv}{Fm*+0+rBQ|Nxtu=|ZQ2C)P zx6_+5;6g*TH)L&~^rUTcI|0L9y=vxY4fofLVH!<#h%~yLLB{i0*TfO=lCjMPM*9JG z0Gch^kCHJ5%wO}rk?%<1a*VT|RU}l;rqWZmwUL+`yy?`XSikH(C!GtDIBqDWiLY`w z4`w}YJ%rOvD16FtkZXUk@WsPI$z8mYOg|!BhjtU`DEAAGb#_Kq*X{Ky;UGb~UKLMo zzIlS#(KHIGG&dR9Pb*WdeF5ZEm7^Rqd?y&P>BCjp-PhgQ@%nU6vXh*Q)ux=uyohFb z;A?oSp!Fh?fKX4AqoEmV&gE~V#IuVxIT?3Asfb|*iKD^k4ze;{BRD#3W^OdmQ7J%K zv8(O0-5I6uMr5pVkE8X5+qa z!MP6ROgH-;(*ynux@Q&56^0puIZjRk#Amo#k5g_Fo1<$R>$_V_{o9U?S{fD{6@(@f zTcW?FIu3MM3Os;ooZ#s6PQ+?7QRwlN?Q>|dR9N_u1^?1mjd{y%J*Rng)DV5*B-W5N zHJTnpZvT0PLv{1@$0;nY=LhfioQz7R^6xj4Ii8VtWRHx}Gb=3PY&v$8UOsU@b6s_m zRb?-YOEY4Az1gd1P1V`Hbr$oEdA=~rr>M-{H#m&!U@JnK?I09yz@&zU712ieS+vE( z<=Dxgf<9NpSO+IyB4mFvH!V$sCNvU0b*$??-CbJcmI&Lc@3@rcLVh@Om&5YW?${`T z?otFnZCV&|6)@5Z1rKT0kvSEFR+Si@cDsFT@_e0wDRVzUU+55_{!Bnm^*|}}yp^Q9 zBpXS~MbM^-j2OC0lg+)kvg9hKzOu7f=CnQwKl{~??$(|b7o4Q_hPhjV!yR`8J*e@^ zd6;y@|=*%Z#8y@-e7UPBFo& zkU+HDcX=8vFykf)UDsKf5;eV6%VB~_=vposdK6#y2Ip0iXn30ohwjO8o>bts_w8+4!jQQcka!#qp@DR~_XYt}W76+x? zoBjrkyh-w>?(x=~L`enj4b5=liwG&yBu&+8D$+>#x^mLl0opFN0G;oIGEZH1S3ga0 z`v;wGS_S977f2pJ73H4b;xexD`01Uxl#SCeHCtFYAPA3<`#SwR>TtTuf`k36LQ(vc z*7EdAS6P)2?ET=!`$Xf|E(G`*>g*2duM~||{WJ1Q(zmpE>#h}iF7n9uyf1tbsv(HpV};o%Pj7jQe|SL zE}g`Sl?`Jf;t5VmOT&CMs6dyx5*NKkDbL|BZxcxu6cuq@nmm5-8MmYB7usZej??8B zu=cTl*kg5wK7NkZyfSFu=)5d-?8Mr~B$eYjohOSax$3KJ?SB8ZtC5B^ zczf&2qSCe0rz}0|luUl-4p>WaffW`wzODQeg$Z$po;UoQW&2A!JOyDBe}2C9rtL~f z(L%WVmCl%gDD2nSFFzlL{bE8m!R(mp(Y*CzHR{$DCJxo!s{ z%NMnJT)U+Bh`lVzn0PC47XMOToXgjrJc@xqSxY88;NkLTS(y~y+`_z+KF?h1Zy#6h zKSygJbxToounwi1L|+Q{(Lm{nzu}102tBV#+nfRYkd~+Z7xdMxbMM!=%3f~lNmJZ6 zWM8;XPf$&qn%p{>XrOrUipR6F(>h_5{%)vTjuQa~ix$))jfARfdt+Jy<-GIr^UIyW zpe_5-cpDK{=C?oV&p-PtwYCt^zR1fIVLf~>b_uJ{U;0S;O?E=(okr+^P{8d4r?aCX zDcb7dC{sH^1BPZ-)4~uEZNkSn{Ee8>V;;yk=mzcPb``X=39cPUAP)5h3bzu{&Tz zK0%qeqIOCJr{W9$)ml}y=Cu6`=IE-$cf2><(tbd2C!Q98lMyyy?^OJf>y78N>u)Zp z+Vwao>-Xo&CxadWOYW{36rDY#LKl}E=U%VzCc?OXME5ptG!ayaBqQgj=(qDCf4HxE zH7+Kr$eiT^0#rRcS--`3Y>5@E%0oS0$aL9+mwU!B5RMbhQN>E%?j`wf7oek(vDD+} z?s|-tcGj-_d~ZqqL+2`Y=7#x3@{wT`Nt(#j*``;r|9Bvr7O2-RFq}+Ba;NsbFs*Xk z4D&LJcr!{HqpSXm)Xp<(WmSyBncZJ_E0Q^>mIk9UHk&B;RJ~DG*|UbS-6=twY*M0a zkoZKu*bR+oYsNnx#dm#LTsf+~WE=S`)>rV@_$N`IJS<<|D~yrgHRy8G2jS^D>=~lM z9*U!ewcY_P=N5(Lay&_-QdR1mCY|3+pB_4@iTEr!F$%)UlMKE{ylXev(5W>}!}z*n zl{Vqtv$G1+JIN1C zfb&zv8?h4`=Iv|=F(pR$w~wLC_3I0ft13zY-zpzl{m9A>xVYcevlHB({okK`LO_uF z6VE?ee-I%ZzY7(?NW` z--wzWOp(`)tT!v=8*3{`^1iibbwmg)HpB^SIf*VJh$I8D;+>1@Br&fcL+%7DsTxx4 zcYqQsBA!8&dT>oZk#jIo)=uf_Tumi_@a=J{8}=_+eEtuV}tezDDl}qr|QD2W)h1 z)D3($H+022;4Nlgn^GVsI;gxwc5GV%A~59Yx0HY@=-fIszZqKR;*O|Us@La>d4nu+$mExwdb?NFM3cd zyBEp6sBXmv_`FVxGmY4QL3VbL+4@EF`vGSN%LJPD>mb#R5D!RMRs9sg7_3aK-?E-M*OiTNgXoxPAUWQq$X$+7Uu z&Ka>&6!BYg_g=SKeprhyA7akE@143JR`xog5Z#GF`}3_T#0q~W{i+{S>BFxs#n)PP zA&gU6Bioho`044wj#rKMrue#0 zzJ8+Hr@myl10=+qJ};RkpvgG7CO@mHTr^IYDX~S|0s2*m^uLlxGp&Vzym;j!Ip-qD z(DMXlp+Vir4#aCh-M45#2{l#D2=P8ZxN-Y>&}=?l=3R6mPfovx2Iu2X$Es(dh240>(HEj; z=WHi>pQMzT6*0A0`lx;cWV+7()_NJ}v|%uRdk1J_wcLhu3>B1jtE+Dt^23l)5$Cv! zC?BMOcj2tLB122gVI}xRNOoQrQUNE80@`K=}z# zukU~aSWe46w|HD43~y+ksnix%tG~Wkk@QoD90gp?#6aZLh54oAtt4D_r2l7@(bmGL zZL1So3tAFlFt#6IX)ZAzfpeCg_OyYSi^7{aGwlwbE#7x;;==x9emPG0E{F-s?bGGZ z=UN%|8-iM!udj&Z$b&*|XCi!aozVEx1FaYqj|B1Bv7j56#}?w$ny-@~qVzC?wc;dD z7N218u#1>Lf(M&0Q}h6X-bc~NDhRB(cl-@mKtbI9vpgwA&?XUR7=>( z5D?q}mTSs=Q>b%F*Drr`1lQW&K-T{!k<&X#Kz1bEI7y1NJtX^>^R`_Ln%w;oc z*;%jbe@I~})ja(YBDmST;z&AJ*&nKc)X_c>C{`?{qN+1{;`D&azwBVKhHj58>xz^% zWnY3g3N)D9!JLTGFeM|%#Hwzb@Kd6+&lwvVQi^xt6^cc#n5}qICK>g~&%T5zF-R1C z=#M5`Yfi64uM`vKaw+g2fs`Wn(Z$!MS96ji-18cyh7+X4HQ+w7Xk}FQC0qLXBU*_s z#;SvKQskJ&*psA8`S^|kdaxvHCa^S>sX7Jj89s_+@0Rd+exas9xnCIX1k@9RS&=bA z$l6~RW08OI49x*zmv9^UAm5@OpN+_}ZAm>xBo0#%p~`bHVRJHtdU=dpT?&&Jsr;jJ#x|@vgVISj9_-zyFV!(4|_#)nPH8b2+!aUNe8)+ zJn3v7wOA`sqgOKp#MzJpZTyBBE`8iaf#q5u&EjS*IOeh$6^YS_ zpLm(K*T-ef3zfAAiQVVD{Pj2wFOe{Z8Ks$y81p!e&IzY)KUY>#m59+zD?=5Q(LQGd zvU7N6`YPhfW&{&H64Qc(?v{Xi><%zz3>yo%e8rQHMP$|c`a@mml|{*?)T{fcyK}T= zy`mySA5|ThW*W}EW6}*0FJQj|{CwG%eE9Qk`_L)OYngeT?Opcm?S{(S=YSvqsnNju zc<8UZ3E|ZMX#s4>O@Lw+dr%2;}xVrjt zxkd25UT*yZaUUoD36w$iIX|fXNTRvVx}m#|lL=tvJgz~SiT%=M1yjcje_vePTfTvG z*%~K4g{nL;F{AMn{Qfx64taW$y{_3gsr-XgAd6VxQ}p&YjL2F>oQ1;TdAT+-ums(! zM-lFV(l;Cx&FK*RT#?$maG8;cDYx{wPhf)wZ(diB)G5k#jGYDl-f=Rvqb z?@ji7E*r&8k@SwStkn1cqaS}U^!>hgKweXoNj&K=%`{hD%V8MDhb}i0C((c=mTYc_ zmG9Ty?zS~pzlu`BD*j7r17pfiCaBU*Xe_B0nG|J-IHtW(Q;Q(fodhbkglLiMb}~Hp z@AsJ9Uq+yGpuR$t)+CFZ(Z!{wXOWsx3Knc|yY5ZtdnWMVwrfpKR=9xr_p=D{qIwr+ zfm-;BX5y#PBh(|e4=!&`gi~4r0Zu8j?490}z#%BcehErWLf52gLL#1u5k{rE!R7LJ?$k+tP!;01a#n(G5~Ic==xW8Fry} zLih)Am<@$6KfN|o8aoZzrtrf8!HN-(vH>8JnW?BM%D4`X=*s;m$Ma`Ao})AXW-1TS z-l*c@qJ?yB)Nhbjd$NGsJ{YZGaj@Mr)kXgtB)12LW zzIg{Euc4M7%6j+ZP*AkTvUL_G3kY@erbAq}Wm7Kbe&WNYS!~$QADA1+&#K|QGZ1}N zkaC;`!tItRHGgL?WReeL1g_)@^O-n@%mY!8Qd^ z#m0#32-1bw>3PV!%Pfeege90lYXI5`%Ys}U6_ftP3E*KBHo-L5p!TR}lmC32u)%|> zM&qVZ6Poa5u;!}81_y#*@RdMQx(+VDNwr1s_J3Fyt|gyy9gNvloa=goW$2l*G56)H zg*D1gCs&%JCHa+%A7;$sb4%|#ElOXaH1;zVwj?1ZD2W*cd|aAck*R1 zgG-Qp6}$<59t_XF#J3sGA|^CHU~({k;FXppBLprEmzpdN+{-~aX3}=mSSySBwO*VL z7?F7E*6<>F+=7k100ueISxQ}ePL;m42X@2svM?I7g^l5G)Mvxne(P$naJ&tKg878K zi^liV>(A07&FQl*lWkk7E()G2f0? zT5G@3pmX;p^+i`0_@sMOi}a~%-vOtgCKU!**QMBs9Tfi4)i9$>8a4K5O+{Slf}KZi z8XC))p(v{l<>7ORy)FcW+(Fls*)5Is=ch7mFmjZ(O3z-oZq9uSy-7MDI5Hk}! zPg9@1l;+Oh$YvOhw5AF=L_pwZ<1TtkNZ zP0y${KyRg4jSHRh24!#^*5rd4C`SvmA<25_z;r7F`R`#W z-`F5}YA`yl6x=Zc4Jxj%w)ilm2K^Ft9BNuw^p zR~V5Mg3Q)%&Qjp|lr7u#&84?ERT3t8NPBVG>`n>nVBl7wt>_(u8*!7;zm3EXYOyV3 zu}83sh_k*ZSF1$aN5J%g9cMVI3~3ZT z+zP6eg*et2Il18*@5jRwp(hJFPp?SW{G7Alt^=z5P2p9DOQya{WqG`$aw@fShQCwT zjoN}?{IO}FPMtgsT~kjkWr6vl1xBO-H0orN{@PvK;!OcjhhF}btKE8TVwU!ZI<6{O zg9NUyfufPavsuRMV81U(L#Y?%TNhK>$XrbZ1kqVe=O=JJxE@?C_Ktp>P<2%tj3^A$ zjQ0G{0?j4w?coZ8@SBa`k4agssn?`oG1pPJr)!j~v9#qrD^`Z%SibMz7pnZq3qAu0 za%iOB^x^QlX&@+=R{Zk^CiEWxHpmZlym~rehTfEA`2-vb>GqJSk?Re0eYvj>IS+~j z!^sFA^97&%YUx*e5{&QS>c1SPYjT+4wXqeif*dt#cPB zz$-+dWl7c?jGYg|Kw4G9!=D9)x&qQgF>ibt!5uHM7B(&(K0ZDgCLs|49uW>6KHeW8AUGHg z1Rfb49vKfE6&>&2F29EXY$QMvLIelG2Ef=LIBd}GQGg5p0bsa4=Kiz5Bfvor!5}19 zE8f52|3>h86F`H5@nFGW0RZSp;}7-)c3Bn>%R9;Q{hvbq2LKjhi$e)v3fdhsTY;KI zoSX^(s4(H98i%gA$&@T{N@0`&el~fHd;vR=a~(wB z{B(EoYas|pGDd&qat8o#Q^x=xQV;}VJGk){h27z%isWH8FmH+o#UKD+G8VybL#F@$ zT=@XlqtWt=iSw1>!bAYsOZp)41(rnh{=rOEi3^{23kQV8$-5$KMw$^a|lUMponh$k_1TO>>O2G zx^a=;`&5qc7U(A;8&zqjbelXr70Llr9c=F#ZRCQWl=C8`7u zW*{83J>tq&f)T!|?MMM3ErTgMw33u_q+p@#bv_C5uc3;a!$_<0{NM z6bYqV$d2<^ET@>{@rE5@xyk9Ut>`+_TQ^*oBeHE-pJj) ztm(>zJPiOLcmtXIpn1hAE?nSqrNW=K|GI$5A~>l2LBedc2%sRpVx@HQ@0m$4;}@b%GHW+te%`X{zimBW@sW!TM=R6u~*P6vwCF*wB?=GnhW*qDn4x*i=pHkzTh!C3DUs6aS zRqcJI$cy_-%a*Skf!t+EGK?TEB_XFM&4-NCgeDp{t8ngI_sl->Vt)R@(lLWn^V=cR zAv~QEL*~tR^~njXSw)a>j6gNl?nD)22Y*{5;C)-q8a^x42Wd+pCp6r~4k3*?cF`#M zOtK}(4x8JN4{RngB-T;s;V9xd)34K->>;h0zFKvR=r1;qS9^Lz(&}Pev75}gxK!Ro zXoQ!q-n~_n`qt?kiyk7z<8u38q&)ogE3pDWrsf7I^<-ze;JmzT<&{y0W>~p&OQdfO zedS$CBX``sfDVBoJLemm@89o?ZnIZc9ylbJhc!y{rTQlS#S~pKMX2MdNW7x(sD8WN zV*$gIYuma{SjsW#G=#|6urhs`i?WI$0=BV7*&Nb3~}FosYK^O`WdMEtNXnz0xGA~t&#pms(>}pqph(1WVy;0 z+IcavQcG{pCrsYg?aeJRWJxEuhwVv9PreZ{q>b0Xes7{Zakm*J3#nQuWSN(-CO;nI zI!Q>mp7$hiQ-E^l9$2aka`sC-i=9zxD>K6<2(Z78zT+`9BdrstLiAVLU+v`&TD{s# z@xK&@Kaxisg^*~8x?EPUe|vkRZ7xgJIG7yvE{eA*YrP|hS1sY~RiVL_wT}W+&1`CF zM|Lfpe_<}*^2N9k8m(s}K5$+`=93w*NK#;^q1w*`^nL*uHEFIbqFZi+nrJF9-d+v= zdUujr*=c%ld5P&7Y2;Ce^+Io3=S6u(nqxOt5Iza}p@5b=s^o|P&YlnU?Gk3fb-XpN zz#F`ou^*Jax5oZ6C)O z=&&J|8oDo8xoEh9Mru1V->*yi#upO8B_9&Wkvcc6E%7TRr@S(^Um2@8IkbjwKT7a_ z*I%r|=E?_Ye^T9J)%1&T_?z_Zs4k!G^a^*%q`~t2Ie3g|e1}a9QJkd`9Sj`uu437Q zvVewR#m=d9bY>tDnxK}>^oLwJ#?fYKRc3c1g=v5x(3kR;=1-TlcFRbDj#4pn69!z0uJSssa{;10k|k+FnRXtJ?>w! z4Hk0VttQxbZ$ca!9cF*Vt`sF`Rb6WD!?id=f0&qXUWy7znv zorkWps=fL*5SLm#$%xI()}{jThW2YqhE?ljSIbE@^;{&U;c%OGq;eG>m(^6JYuoe~ zUGzhWmX`CVg#!%$L_*q{iPigOiSKbQq4B|$-C5JM`(*4E-D>I$th?X){KN=S?Yu{c@5kM(+O&9cT(#Z8Hn=1$xF6^ z9;Re?P{F?eYWHu+p?1ojw-nibxt*{lZL#q`3rr9EGYiK4m)Y@O<6F^RgBWbuEC%8g z`!6WK|D;gE0>B_J7#;}@6&W4@5heu$hJ#=OIPkdC+!9!LG(75NuEA82#R#-q&-gUl zlGB=7@aZ&7%|lX#mZUsWONJSErQMe=_{Fs>tadN|K8PZSfxk;an~2_*;D;ynHQ&BJ z^5K-G}Pdrp+8qGRxQl2QmsOul#wn+#Y`( zXTpszUO$Ts$^)78k9lTZpU|8fq|wL-Hx9Y$>+$relvIH$N_a-G7PmRTRE#nM6mvP3z42D5iit z`g5aWa_3oAwoaKD$BhUYkMk)P^ zHe^<^ijeMNSe3|(^vr1QJ$VRJS{95@1Aev;jy*SuDCyjCftVK}zC zi?R;Q=HqKJmkB6Wm0x16aFC&NErh%{Z7tBRVdj&0ZOf|JOEp`#JcXZ(GtYi``DOJ__wU0j~uUKTS#8sO||Y`H(p^q-EDX(h+C9Ii>KfuFKrpiR=D?fYXsN4tbWw}nr$$g&r2e|TyLSk2 zsVq`jS5DTGlP<(^wy|CAdW1h^ne5T)p*c+YV)*#!X0KwA z;urk@c+d$B{EP(|8^Mj>yi&A{gP7 zb{Th#boDll+E9-MHvBZpIg+YW-lP|#*|FBy?no05&WW(6}t=@*k1`;3jXzedVBNH`B4yWWtpT!Wswfmxsj4aY*X{! zuTV&(T9}0m^BCsUD{cJ0zKyeX>p^AO-{Y3k)kh8~k^TaA67as@m#(FECLlb&z6hZk& zvUX6t%qWHFLBcg&jViaYYS`H77=Lk#m#RpoIe(R&F8MVPziA`dc#|M%pf^kTQS|A) zpD`n+FkdCsBjRq}mm88gGWXd7?b74{)9O-JRe~v@-)aVHA+6Jf{H~vuBB6c>*Eg>! z#PqVw^~Rbu{48()K06)JJ{L`H-qUYyTU1x)>HWl8ncF~qXOYN9G#msA$Iwnnn$ADo zgH=hIy@w}eL8;3A;mD+_PP@@XkC%!va>bg`a(Gogzv)P^96mojWH`9blTG5Ku{K*ud+cxTISZMc4sD-{ zpgj`mcXcYLtqnNYttc+}S*(Tx#(MDYIvr2o)v7Hwt4NyCF1>aP%y!)vz`wOu<&UjP z$Tv@we776OJwdEq%*FC!XP_Tp_izCJRA?qSGRm`q++Vi<-WlC)Pd~SoB=dz{ z?TU|-%uIRKRBffv($^v~akTAy$L2D|Y?^X>jT3?t+{G}1Px>ESS$iax2=7yo2jm9& z?+5iZ34$fw#omm#{PIg*T#&T=vddasD0;iyBVd~1fJkQRlkzQcabKpPO>_3()VJ5tY9p8d$hKQcwmIi@nB z}JwGt9GEav=sG-_9eEQw1T$wR1L=Ss(q)QVG zGq3iZa7GJe+0+$DwIRr)TDgc$Kdrq`5U#w?tP8cE7MYqo?2j*IRoVH(gz^c#pr7U4 znIkhs=FT1y@AX|#%>^htI_+PviI)&Cl_NZP1L*a)1Ud-Vr`NqD~n`0xkPN^MmZK|#f3Txs?0K5 zO^!O6%xZsHTUrXgPHv1UEum+rIaos^U3KjYz=)5OK&r7)YSDc!V%2&X5N)n%O~6zh zUlRg}uTc)|40t9C5BEkG;hAa;UGq%!cE%H>_5bI4iC$xqQ5;@^OUmp-L|mU6-~27v z|K(in0`;#@y!IrUwUx~m1vH8BmHZ8cw=rj1_AY1RnGF^1CFoW_?07MF;^Mo`KQ^M@ zs2$){x6TngUpNN8%4D-@wpG@zTP zAubCb`?Y9smFbG=jph<3e*1JXDoZs(V94Qrw;R_`oY}O$NAnAm7?t=Pv64?)$})m} zb^@=xCW5bkn@V%|Hvsn=7}OL?w+wxP+w|v8ZgA|Dy%Pb(vyU(fq*PVp`^Ub|g)SC7 zGG3C|u$(PT)0KLi)AIOg?RBJxrV5#eRq!{qp-BnAOHZ|XSMQ0)q9Y_WR3>CKJ6fy| zWICU3{xZ??vC^jt!RHwuNV|>y;T+z*z+1Mev|n2wl~;Aqb-1+lg=Iopa;y}m*n1%g z;$@!G1Jx>*TK=St$89OY=u4Uc9do!_P+M}hk=R)#8(6>^@r_ENUvL>uUXJwidno-4 zq?NKz3cp-fvfC6@>06YeO7jfbZgUz_Nvlm#eJK?6tz?D-Q`=QLFlJe;w)!{lA<>L- z#NtOK9$)gjt^IMK$TO>15u`otlv*gAi_eSTpN8B%#my|2|XZLiNUIAf-2?W`Nk`BKnlthUlMTh9mKqjT(66=|F> z8Rdg_UE}G@h^a~{W0J-9ls`P}XH+C;%#dAXO&RZfH^wFR7vZJmdsAE?v|JgmeDJb= zJtSV2oelspH_Wy|^}O6S4r@@?i93AR&p0Jhcuth3_K?$5aLDb875@tpkeGf1rLnAM+G9YSexP zO>&AR{J5lQ*0Ps^)TzEarB3VmD!GpHC;N;Ry;1qsiX?xWg9NCVQ(cVK!(L8-YGN6? zGSw;5XrPjs?r*?C9lIpy=evH(-+9zN z5{BgLQ8%Gz`s7BNy)T+P_mHP0lD1dw`3c~GfP{EXY@5meGx$qYenhhKVp zk*`Dx42t@Kb6>T5NWU2EE=xg_FpwmtoPE7V7?_q9r|&0LF<_!3B%)zr0RNvrZP{7MtS7FBj`;RY3` z400^!uOadKpbhtm|4MVJ%%gbwTA{(8yhiSgSt&>tW&ABaX9-*3P!BPgNuyM4OmEzWjXx2-|)V_4=W50 zAeHa@$;ZnR{KL&kIPmrP#dzfBCij@gN*NhpJco}HL8CuBWJ;$sq!z#M<}((Ad~g8- za4r;CP|hX6^h}>ln;Yz!6N8EZp#*m_L7@3oLPY%LuxfJ!YL?vv8hq`hbh+(W`HT~7 zyWg)F#je0+ippYfmdI~qJ6hbGtySJSL+AFxBM+p}&c~K|wO5kMPmcm&iyL2rHH9gS zhSQWNJ>&4u;oDj7o)8ba8>OCL8+?DWLZhv}PAX-quE!{g>fJW2fxdodx=P1?@Q@=GoOP=p$=$ z>)wy%)eXxm2ZrBFw!E(A`M-ddXqYgYF#wQm#9Vc1^IBI%@jQU$W@!w z7v9Q$JtLy|u2oG*laF5lmOt&mq*TZ#>1eMlD@U)P2Rk~R`YLz)?|uv0l&yA~ovDcs z{-jI(>&mN;WBzX=-h)sizZe}X(M=KcOpwUf3?-6yzh_L7DtV}9u_?zSu}Ic5|t?;seoBfo)Xr8^n< zkB)R{%P(WlE4DL)MXB*zdx*Df4^p_G39t>}rf)M4eCl z?bN=X-A%c5)%ZuGl$e8e>nyVSg8lj5Fji@Kw{zk^EjO@$kESJ zR~BaEkCJ?%r5XypVXn!3*~0NPaIwN&H@Q%O_GSH&+C`j6A~v>1wBzv|y>v)M4{LBO zG7}qK)1ASQqQvUbpn7vg2d6$cTv1Y_y>OyFw7eOgVTpg@a&O-di8PuWdM)dT!`bvm zHI4ROqxdi+k~<(?~Q$4ca!;3jMF= z9LUxp7T%wShc&?KBYsD!Hi83f`gBQrRspQ+_Fr1sPQ0Q!UOY6#`-V0`LHSaagPALX ze(RVrIVI?MKz=op$>nU(tqJ8df>|PFV|< zsXHDwhNES8sVFCZ+P}fEF-r8&Uf&BQ%f^*3q~(yJ*A%;cVDkiTCPP=j$tt0GjlH4p zBP8>xX)`!#BJyq5;zgy;t(#|33=Z9UPLir zA%pUlR(~(+7SFzLBDoS=tr;XBtJ)y8Oove+k050REF?aE_q?268f8!?D>58>;I#-8 zqKW*Opv_`Nznk7p6r9QMMBzFbyutm(KfE_{vBYxazbP0;moY6+r{ z#fUSWiCikCa`|sY#(HXUQsl#e>~3&LK!6U`2e`|tF@C*K6ZvBn$!}?- zGhLmUX<+Gh&G{+9h$A2K=a5(M?+iWn&N zODvW6%-v5_&;q|@wA@#P&f&Zof;;#^OOGf|ajY^yQDcdPA$@vV_bqF;%KTs#TfJmE zW0AAw-sbYF38T-;jH&JKx#Qd`@fFbrt}A%`lK%I)r(!uzk=HMqe%aqq&IOD-G_D8o z{lNS@VD|Im^coQd2TFcmH$u~I&TIiSRq;Jo@ZpxWPieNVC16#& zUa6VA_V&{pPQdwF7TWpawo{pRj7H{##B`H7%gAvU&s0gpTgk00+p^pHYXG zhh=^6riY`^+E#xm(shE*CYRmy+=maAZwC_s{N>N(!-yH!HyojoDY3cgv_lXqR2E{h zUj5oWfu1a6LrLK}#lXQ0ItvKjOMJ1j#Ktb>nQKB=v|Qk$c2Lj4Sy2O*WFowB8Mm^L zz_64`gO7zMTY-?7viE}>w4TrLbwm*$z4bnRz3Gl)Jml0}x$J)#bL>t64x z&bsbXUuEaYy7MloYjX-#*Jq1f@BhPc=vuY?oGP3pPowE|^n{qLCKo zHYIUTdCHF1<`k#G`4aLfdVQHWL?AoU)3%0WSCCTA%rQMRu{2w9D=3yMGQPkWmKFX zIi$(LF#USu#l7eEF3)0>W#R+8un#XZiksAKnEX>z4zYW$?#e@haIIo&Ay#tAY0?{U zn*Ea%udwzo3IiHf0XRZk8tj674eywVlA$^y^om`8^n;fceIy^wwt>twk}vLG z#jtu*NB1x&u$p=sTlm|nNY*mGF!Vb$7^7(8Eg7i>G+wc0gAp0t&^htCerbKNVlni& zRJrv-|7s~=Cf|QZM4jZf1_x}*OKXV`OA%9(S=NbkrMmJAO*hmF-x|0+i28MJS7gM; zEBEGK$}5i?vJixHzV`l%*09=kDk~|;=cvkSe-E~us$-+yFt)R?ZRYRnM(@9^s zdAip?qPDi{abaP0n+5hF-0v)b4#jOxJr;u^1lowz4AHSF7P^^aO<%_Pgyw-%S{8y2 zKK^C)SW9N&0qc*1Iogr0I)%5d&egDYL&&%e_A0)mXq=$-YZc4U_JjvLkHm8+GH-^W z%gmqK`DX+!?p>7DN$ViK9X6FMzm%={{BhDFecFT>r}bg6nAsJ}l+}{e+1dPM31Ub`;*qo3K3rtT*$TLl!C)d@CEz$>fgKKWBlb7E9h>?AH*+JQYS3h{qa20CnymO zYd4Y+|G7s>rk?RtIf@|p2R2ZzKxsG}evG^w$7^5B)7D>+gyG~bs{jO!25DN+@v=+& zM43>%E>h)Vec4peq;JA~#iki!fB)5$h1Oca&EW~ypTAw6yD4I0<3>aH59d^$kC^Cw z#1zA4LV^lD`X)Ll70e`xDkI8o8~b60QQV=n+2xZNS#Qa!I;Q`MzzZLkTIA542K@jr zI7;G|NDivwJu;DVhFE=r$9!Jo0rg~Kgp%Iq5fna|PDWY9N*s^=QZZ{$bX0s66KX@p z?44ksiy0dxV)WKG2%V2y0?U6K+JA!+=Xs7RJN1!~r4PWua`4ky+`u0fZVJxQF4k+E zr90i-3xbV#h_j|heF!74HSSWfN)yxAoUJl?vXMm(5^?y;ByjUqK0SVxR+uOCw>Ph{ULaGcOtSJLJu15D+{w@Lm6=_&y&16$M z#P$eCdqzhn^JmOu(_PC^om!wlx#-udo?XFnS;_=`1kgTw45}`6JWz~I=HQ*G>fd>D z9Ezi)kt+bDR%a`lG=|jqnP$hH>m%8>96MX~k{hw561w>>OW77RvDg%eQev^#7{0;T zvs8@dvE%Hb@Sz$_#jBXdk=IgW<{^||rNlLIfSRK=NrU)%7whyt<9NATiW4m&!Br7q zOZnjF9ikX2IXoBBR|;n4Pl>oeD+jy@^7gMmV$^zXY!#!%9FDW_qJmcJh{ z2H;@FB(PGTbSV;af9ikZqQdz@{I~kQWBel=l7a-Jh*KrW10gU*dDsPksrw`3F8~Jr zLBeV%T?iBcApgMwe+Z}m@jnDE z_%9YPG9(D55g7nOsc^)pu*B(-B2Ea7_`AUTa zQvn5VkRUKj5{L?R68n$YFc?Y)My3M)!_=U^kT84-GE6m0>|Zp0;J>@{j}`z(Li$VB zKZ*bEz+YT{HNkp~^M9xLf5?G30r~&Y^l!=eKZpzei?cU>PUm3#x2JRdM!|#yTN#7F zFz18e{(9IoZkcW4x?kn?g~LlhEd-i1%QVYDjIBlyRLc0uT#vYRGa{1VV< zYaWP)0=Bn#!doK2WF#jaJ`#Z@fuJq_Lml(Y1cCiQB5uTv+5;IAdP5|p$Ct@<<~f#3 zY!1{B@iT)K%|(T9jXJbMg5CPYaDKl53dsnD0WFzTsdJ*^$Y{^fI#tRrCSotdC;IW$ zMJqSu;uM!k$q)iO8ZjT{^|jirTCO;x?h;R=k9No({1OW*9t7~vdfmF>2 zG_I6b{My`iLN{j88fJR}XEeB9Qiw zlggG-s#FRJ3W4bbGpU3iIOyJla@c}wUwyE*F>&xAhRM9@7|w2IIads)*fVYZ1L>&p`na?2AEVi`cSNDf~%h6;ZGm~&n6DvV(*Gkp18 zajr&ksZ#f9Pb40vS(-QcZ2&FN5lI64p`Y)o2^BgT=Hi$rX@6+RPgmMxi0+iqw;WtA zX~zwe-W^NN6b)a{V2%7Iy9e$zQy~YBvhx>hG~al80AUPThcG4yW<*b#Z2P->KWT5J`eP5$HaaxH($|MrmTNP1I8z32aV2Vfm1Lr#(MQFPQ8YbOOEkXbr z5q=jJdR8R;?w;HBhbUWZLTnSZ3l$X&)uCk_L^}vvgalbSqkjvDXpcbUTIgRL zVEM&?!^F&ALP8h4YU-C!0v5TT^<=*!D!1o0CIjIKZ-eBir9BD~MT93eJflO9WLOay z+J(qs9uF!}4RIB?MBfoPpA3u91Wagt+wE{Blf$U1Q#D=9fU1svK}XTF#|4Av zje;W?>SreLN+v8U6};Hv{+uA*h#1MY98a~G9MFUG&*C#EWgh1=>iZS!#w}RaU(<0F z3DKlJqnQ^X1l#W(ULKQ1%*B8fd8;h3V(O=HLtBfxs_Fw4A67R>z6!FBAU&?Lbx=oK_hs_=31rU5SIyN`vN3q`C19HB2 zKB3jrusAe%w5-EUD@9|Xenfe`wTX3)R|l(w}LC*y7$qMTeg*zL&_k2t{GghCRlS89DF}EurB(gwPHk64I z%&Kgm;|L-Z=Gl%LFG9|8Au$X?8Sf2GQkk5y+^L&VEX6Ad9A~;vezOv^HN6K7OZ*h2 zhXue-D|uE#DTBlW;d!ltDNlr&BkvrF|t(K96_((awn`d*N!O>fU(jvwO*}c>9 zG&cRbaM@|Qk6W3su|cwVffj+4L6@&tsmLNg2Qm?G9g|!VsM2_K6yviqdlqWCL!~6& zD?AkZ#=a`=%~lZ%hg8za8Xi3~LMyOxGzIuuH%%E{nZlf(H+Y&}$Gr;OpR-QkQeS3?c^bO`56PPxYY7&L!G-(Vk-4?CwGZH@*nLC| z930{Ui1~~MH!)LXB?>48YXw0x3MlakgD|&;E)m-u>H|ACIRJ^x73+Qww5USLA}y-O z?_>jyYH@Cny=icJsW~jGYtvW-f@!qpaPLWQfOU(Y`>Ti#nl^P z3J@rqbeRmNc`IZfrMtbS-P!}a>+WX|NlAvLnLPT)KjkhvMc_#&PM@7n`BBC=PEt#w zn^x)0h`Uao#mkEu2+{loY>X}NO{D>h<)4U>&j+tV=A*=!?T6-1(A^r2qZ8q1hvT@N zid5n>2!!=~>`HCHHZ{B?@b0dtrxvC8k-aQ(!QEJoBvqvQ&WpD3Z z6gA$lm9cp>g=&=9rGogiJi=77bj*-gvL$cuv1P)Zn-A@T0hn?jzX5l;+319srW*#E z=X1XSoTKT-pP{FT!36;mNq*F+dv082oigftTw^o!Q36^-JG`nxUR-VRRsxM;4NztR zUE491$e=Pi8+gfZX^i85Ks^aWai6!j)E0B%3QcYHv7veWRnPFE#PRfVfcV0V5O*@L=jMR>?>j#k3cLq1{2D5112vN4EvfsQJ zU(_KMFVaT;yi!yOQLs;4Sy;cq4CC=rkwxP_u3@Mk>h^3#Ls1+?t&Ag-ZffgatyHDO3E8xs-H^g+w*(r*6Xm+T4 zjk@Rjc2RrLAVUs^Zx80?gJM!LF#=;C;&9^RzTehg+}&FLj0y&oE|g4?NIUfIX9_mv zQNIojD%b@CL7nH|@R{1mAO-6+?bSht7d?z$_sdIHQJNeHmWygksOVh_J0dWeMo#TY z`iD371rFJP{c}~^*QcXZd4Y(ajilbF9h@$SReEe3u1T)PR1Dde$}`pFQNBU! zh!}}EkcPk(W;7VojkMk?*GUEuOfHO;`uXeHY|TZ`InhweOIys8#HwG=_q;_1qq}za(tusRdU? zVmQm6nNxp~mP~^O1^9J@(HTlBgLi_nEI-Uf%R>Rq(i&^?dHQ3wfr)fhskLgfO0{t* zUqe!}fd{%?94#TCRJBuQdrY@#OB7!9Xb%i*yqD!j;-H!tg*?C48mRtg0R#CeBNHwu zZE7M_ucORgIpiD3<>mB6c8fFAC|)Zgel<7-v-a$Xdv0fMmjSqfjJym00)c>D^aI>30FnR%4E~eQ z21O?r77PZ3!f-G#F|hD(@bGYPaB=Yoh~fAIL@ETh@L`k(S@p@NJ~o@qXS1~vqdOFmwths}eMrwxsQVjl&c z7;z82H%#n_2HT>tUJPm5NkmDdDjh*5t?$qv=5hK*{qTyrFUIEZ3jpF1QvQHxa%w>KP$aC<1% zPKvru7_U69hs~q`@4i#s2ktk4aIFKLQLr$oorc6^z=p((t`#t%8eI^h%9`&&(2z5x zV@q(&8Wq8%gSwc8v5AY!lDPosSk$KGP=Ixe&7W4_9LVrso75TLCIFL|pIM}d0`@Sf z9!6wefivVtS}8F+7@kV#0-CsvA6`QI(hUIs-s6PqMT((|f@9S~K_>Kg5E}r?v=gi} zh*AGw-E&<9&{TZ&NBVCDldAp81xPEl0GQ@4iDc+Mp?`5Oqf5iX03d*8aQR=*f4a1U z5SD*_{M|thA|xC=!oZ+EqaO_U8w!O%FhF1cPDYPOL`qD;Mb03mN^y@7!H*tXSm+@K zf`P9Rhxyu%UUhn76Hb#PN6GCQ2P^K}0t>(@Idh2vMBejNylv@>p;aCMgNgO#K5x9| zTBMMCQ9^A;&B+?=mCMJq8^ss=94iKOrJor}5$<^6U}JN8+agm=5P_i>iZ6pro)5yXF=rfMu}74%6B zFU6HKyI@1o5sdiAR;6X=D38wY9m)#fST*G2jj!#xocOn!+Kbp_@Sc23F4CHzHnqK> z`My9o%-^$K>yIoX|3s~Ia|^UE#mKuJ)O)2CvKKBF1y%<7WJwqY(INM6@5UM6yx#uJ z&Ok{Cggb4vRfCXU4~_*LmJe7?VJ_}c>Yt8LSepxO2g%NAF%-FPk&4rt*O!=Nsf<3GCAM=oe<&btR~B@Uh5Pu5hM`yG+Wj zaKW!s&JDcZU95(;CQ|!>H_>OoxX_l6xyD7m?Xg*4%W+5uL~?6E1gK+S^*dGnVP z*?J*11dPfC#p0A!Zs?z5Ida5LlsnSa!=bs{(sxmt?3&KtRbp#ym_rO}ZS`F|Awr7a zHG3li*&?^JS|u;HFaG4)vok+ERHWFQlX2I6+)}@#?wt&-S;15N8`C^ z9%&DVya{W?*-m%^(jR==zdT-i_TF9AiQ&}9vuC;%6q;>hp=_(D}0?{@p52o~& z8zy%qo~Iu3w|o3@3!b3V&F7fAwzGC~^CfxqjAffr?fqTJPBu?6WUv4oUbMoDgTpM> z8U{f|Mm+4CjzLN;-%P%>vT{yA|1ebzapjNn_j;Gu#uAb~nnOHw7V~;TOs_)v36IG^ zBF~}u^^?+1xl>2S7tJ{E6{~UX9G-LD3qqp)aC;a(Vf}a8^X?77XR{R@<3dCU1d13k=bJE-+Dl zn*$&qkSK_+<$qy-|H)85&o3Y_7zV?KU}3}lOfcxx3rYkK!$=so#YxqS9epw2^o&eA zd=l!>vE^-C4?iPRO`K3M8DnI;{9=+Cn&T@{rhXOs|CoI+M8TI5@@14W8D##EF{VFD ztCxF}=~;{Elz(%tHhDQx+zZb3yrC-1q~aQb8E*G0(JEy6Ps zQl+mS5jB3|MLnn_3&wEhv)~eBvM}ObSo)Tmp)UI%KjLH1DZ$JQ{1quKs0-Es?5dD)E6`^ z)~y~4DMfQj=wbZXww8G;s25jNE2##`REQ}H zB6nXpR=q7nX5X}kc}iiXeRDbu4bzyGJkv;za$Ehn)7v(as(i)vdu!FIz+73q0Kb{L z|DA^~V@?pS0x7?WvCYY9Mw|dKgJ{&;r8#RXJna>L}r6H z`+~h?XKT^H@$q%;R&_S|o43IA(0fv@Y^mdYUos*7ZX^Db#q}j{5<$A)_s?nmmO%* zQ$)CuR&iw{rt)?dt44oaSq_&c=UD;9JNbi)l=)s zeB14ceEt9#OnLp#*3ga)F8h&ac!Q(rY;(-}_^_wnDzLIWDnOdEX?$!5_`7j9v95Fi^y|U>8U0VW%NgjmH5`m{WY!I%KLb?;WwzBmP@Z_lFiCFHIn#SWgX{l4C!zcdA6zX$27XTrHv zUpG5{eL=;p-k>QTJy+oL#ZaEzZu&=u)9awzffmh`;uZOfe8ZfG5AzM5MVxOGKBW<} zM9EU&6%^JH;&?D6=BG)q-BbQC5l({tU|qjD<^>aT;YZsev6GtJt$pFd;uTuAtYaHk zbL#ed6J6DLA@$=7BM0wk8X=C5?Y`^{zLU~4EAR#+QPbH(C?U3w1Mi16+`%@t`)*}2 zA?~@pe!^~LNOaH^tIJ2h?1)wVq}W7KXWLhVjbvK*yi-%$&yB`Y5A{1NmeXe!GU2N1 z!X3m|NLc;n}BO!pb8p@-^mqYV9L_z#h}EjG z{hwX-En(52^$y4VwU9DtfB~2dZ(+GEC2B|U4i{5!v z)K8j>P|r>S`=vD2Z5x%y^%yAxu1dsR%errl#2Oz4GV?jjVl2bgA1`{Tg>z(X_HG9C zSg9KDyEX-Vr^9>AEHs&!|7p)!<(mq6GhXCj!lq!yL@Y^JHv8?U@|_4f#ZK*E8@uil z{!SOkTU+jXa)B|H{h;;H^ART7`fZB2iKXuq|5J-}*_FsP&;lKF^LN_eLUhNvG%oyB&Ab8?QU7Y1K)7CW-kK_#IP2 zgC1+iRCRkcn}}Vc%ApsIe#rcE2`ZL9FBZGHw){K)+)DfL)R%Z>+kVqwx?5o2Uz8jl zm*Y)6SWg#k%CZaLmX&C9<(^G*TYY#1~&dM_dy(E+pf= z?v8;+UG=5oSA4bLHItl(kA}KYKEFGP6E4d$`O0~DLR_?E$?1J~K4&X9a5tI(R#8sO6|$Lej=BBg7aTdqQlPAD=txChG%9NXRhMR9IAR`sdw#YUve z_`4PFI2?^O8XV>RPG8w~*74!fX%S)4)LgT}o9hv6wlAYAN_LP#+8-@v9EE%e;{)qV z+(U}ZgSB*2DXeMFTI6bd5tBZAv<4Pw)C-7Dn-5+PEnM$wYwJoXJ1WBVYQq9^lap&N zr$j`gh5Mk@^1v&*jmIm~u$tdm>gt^qg;GK(jU7aB*YN@&p{mln3XE#Z?b`y;6XD!h z-jmZj4BzFh#1BQ&p6gK}EFV7PU*^t;BPX61mzc60sCpKldkf(8bOfkqsHu!u)MW3z zIa+12cA4s+>@PfDF9iDC;2z6G@GLgBdA{1sQuH~34UUd0{4ECYSF{Tq21B0@)Ewc) zzVy*;`&{L!pT))wR{n}Xh%#ISh!L0IT+=J~jJoU+G{-jc{65=}#1{|aLhw~*;=Ct3 z^9WHn*wKp38Z{TX1s+i6es&A3O0dY$uv?e14;A9_AHyoG6XgZML4c-xn*TiKxN%aV za&0tG1F~2mi*l0a&5%6ByEq5WSDMI-7G_&KipE=jZE#Oge3qC=tG~r}$JSVSj0I?j zVs*k21}Fu+Iqce`Xb62}+V$v++Ti{ZbKDl@eE zY#VgL#I;Zb*8cEe;8C=oIP5W2|Kum|;!k=lD!f5pET~O(4xeQ2m1pL^vE-w>d=2VM zQ_W_U1wiQ^#&!c%XZ08lAo|j6yi@c!%~|(L1clyA8+`cQA)6b$s^&L7=_Ik@dlOix zY8S+6Ml7$IC?qS#N3KeYIn051(Nyl|2L7G>oioO~DIsXpkF@Z+*L2&r6xZV%F??Ib zocw&E56__~Z5y=`{ZHGxwjPgVjfO3G=n4}`_F>7gBzWC#S%qqYx5qxfqxr7N9t)73 z+NIb%HS4Pfah-9i_IdRv=69AEJo)TBaf0$75t1g0?j^g+@-RtW*N#i}Lci&a#UL&} zk40x~PO@OxHx{i6?XEq5d)BfjLM-oGJY`yM97l+p`y!)I?@RqJoumPd#KvE+8h&Xu zzEJX%MyDQks~!V&O3~fVrOwivZ)M{(1e@ehkC{f~>|g8+oK5StcFuoFzsu}EPb!d8 z@Z=>>QqpI89zF7(oJ+QO{JD)XWk#%S(wk@wPsiI8Cw|2eHPh@ia);_uuhHcCC(k*GO=h&ERaLoD!2G7TKLdjP#Uc_|F7>ban{G=j5Tro7ReB zvL6yk6_-+Kv?7{XDH7jaUz1`vFiN+>Y46aXWV|VuH}3an@}6>6Hkd2)!Qw*I_ho zKT!6Zc<8c}cV8CD6mKrPaXqP=71Cz0NE>gZp8T^NbCSt2-PTe^1;|8q^Qld%8QK@r(f>OI}@<>ETf*#E&H16eEY1zhXgw_lh~QcglWo2Zwb;(6v{9T12O8ec`ZsF zr@YMAd$My~dXEiiQuatMk+;C-t`%uSBB64}@=UnA0?IC>!T}XFDz{WpttPb2 zSY)?eXGJX*y`$|dn79Qf=KXu5fR}?d^aDEaG(szW9Lcqjjk+ zv&rRH2|uD7Hp>VkKY#0}3Lp`o)q*nSH=Q=u%1y;4v~1QShfIL zuX>bjb7N%DJBsslwrosj?nd$L%0mGV>GQ6#j%_;wKnosVG(|SdL&}dLr%4=CPp!`~ zVLH6=PIU8BfGU)XJyrF(Zcux@%HYR@$0cPK$Q^>v}E6# z483Ij?M?{z6W)iT1-`G$;ae!DJ z@WTesf_~WODxf~te{_iDplBrOAC3GYLJa&Vhz9>7{UQG!Ae!TY7W|)Zbo2gQLG*u# zV*ZJ9!vC*v&c8F5;pnRo^i2x-66Mc>w!iOS;A-^7T#mkCs?lTn2mjo?z^{T5BU||k z_KkZ$N)~RR#k;GPUKH|M%o(p0DA*ELJvP=Kah-ByfR)aOkE|>f0jIU=FRufZ!-Li7 z8Mlw#^TZS;6p6Fgx-zac>K?#T1kMNQfFR%%rXJnrIwlj%AgqQj%Y#|lo9u7}YFfDl zgcsu(1rc63=c9^Zt#{1iPU2s6D)0J024jpYSrxR? zNBSagtcf5l8M2{=d|?_&{;=>5Tx0bfcy7ETTdw;a5;+5$!>UPnvgZlr0Y3>k+xw?f z-_dcfO$1$oSBjRvKxHgLwHP~>I3ZXt-u7|6%an2M1Ab5A<8&jN^wgf-^DBqS6n(8+ zq6=7uUNaQ*l10+mN830^=3d{PeVUHf6n1GIv1N6KxC1N7b5YMpa9J7SV04r@Aad{S z;{ASm+`zAQnWnlJi8H~5IIn4huYG0fjw3o{n7O6L4Esj>ovsoNG;o@F;Bs+Td>*!*Ze(3e znU}$ot<1OVQ;#fy>@lD8n=;%2ZTnPSnB$TK046@smdFjgk~tQrzYcRS6;e(&(x2TF zV-=h1V9nNGstDaD9L>NP8ncfWA~C*?o-8fVf_dsmp9Bp!N zsAk5jn};MN%SRBINc3M)sQPPyocfkRUak6B7UXZOWd=tg40(Z@1gwbG;hT$v3Y z+mq^6F(y&9gV&?^*H<)OQv#3Gyc3{)q_XnMBzM3;hXP|CzG{5>l0=w^HTp))d7(K$ zXu!UwQ}g0Zo8u?&@J8cZaa~jrJsz3Rn*Suq1=}P80kDW5}u>#}k=e%+KyvKa- z^s&8FG;at-N;#)r(LN$0>Nl=VZA2C@M@a5Z-1PLu+t0=6_50jxN*m4?ets@V^1w1p z1a=t2PC)Nd>nBsHIQ=cFM=H5Gn6zeh_I}h^0)7>sd?)fO_(h<=vyVr@t0>CR8Puq&zS{3R+Gx5dvRgzp~I=ZR%lOu;E zGR^rM>;}3zC5MD~<4CvZ9z34M-^3l0cDOsuh#>^96}Fl;&n%u-N?>d;g_HRuFtVEA z`1lR@OyB>Uv;6~CS=qz>$;>VAMv}%6Ap;PV%Dum%x%z3wEJav07qU|!5lW>IAJwR9 zpe>^Px*%$6UY~Us3>-4`ZDfj}(%}%FC-y(X3aUgCLH@j$^bw|M26FT1=Ky~=(>)b>$xw`3-xU^ z*NswszwapT-X*n_-ty8{t8xgZ$9$eW8V~zfHvFq(mk-$}X!ubf^9~n(o_h$BfK$3X zFC<)$2q#jFE&WMI#W0t3F`!8#v!WPOlqmlCt^RTrXV?2XN#heGK56`Nel?8LK4Y?S zoeNQ|Yn*L%5*T$pCp@te{m{qwPb2=-2>bGT4oDem>e3* zvCqKj`O@{c5BYp?7EO}^(t`z>3s94hjgNAZ86^cQ`Tt(?>W4kU-sj4F zb=H(zSCwg9f>#o$7?aEP@Z|1EVo?yC9%d#BLOl}t#e+?t%#>XN(zI1G6#nWNM$keg zXx|BkBU+4lqAw#SHcuq%N!$}Sab})M*R$Vu#2>h)U-)NZfqYsSh*%PSSe(e=g!z$; zl8}6TA>Rvf2eg2h?&o2>8>(7BdcDOA=)r7;%}GjT=O)v9f6FT$%!uNm3Fm1C{xlgT z@UJ_wSDjT;D8>Q=yu>FVZTmt+47U!Phf)6A>$1M7LbiIEc`YQC`mn6%^&7ZJ?4lnj zgtOw!a!?ts?J=pjkG~ZZdFKND%6U`GM^aH-K#567Gsee+VNz-$^dSb17*0wZAKMiv z8CEBtr46br_3;Js3Lle`(wE^560#xoKdQ@C6ZfPb)3G!_FbRMyoq*&OrHn6_&BlhT zHD+aQE*aTjG`BCs4=x(r!Usv?wQQtLP2$XDM_g;vp~D5bA*>REkL1)SuiRzG_JTAm z+3=99A6=s$7*p1SEYgRNn8?gqVBWi4Z@U#+bG literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/pair_spin_long_range_magforce.tex b/doc/src/Eqs/pair_spin_long_range_magforce.tex new file mode 100644 index 0000000000..ad40cf9d8b --- /dev/null +++ b/doc/src/Eqs/pair_spin_long_range_magforce.tex @@ -0,0 +1,17 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath,amssymb,graphics,bm,setspace} + +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + \bm{\omega}_i = + \frac{\mu_0 (\mu_B)^2}{4\pi\hbar}\sum_{j} + \frac{g_i g_j}{r_{ij}^3} + \, \Big( + 3\,(\bm{e}_{ij}\cdot\bm{s}_{j})\bm{e}_{ij} + -\bm{s}_{j} \Big) \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/pair_spin_long.txt b/doc/src/pair_spin_long.txt new file mode 100644 index 0000000000..c5b4a7b33e --- /dev/null +++ b/doc/src/pair_spin_long.txt @@ -0,0 +1,84 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Commands_all.html) + +:line + +pair_style spin/long command :h3 + +[Syntax:] + +pair_style spin/long cutoff (cutoff) + +cutoff = global cutoff pair (distance in metal units) :ulb,l +:ule + +[Examples:] + +pair_style spin/long 10.0 +pair_coeff * * long 10.0 +pair_coeff 2 3 long 8.0 :pre + +[Description:] + +Style {pair/spin/long} computes interactions between pairs of particles +that each have a magnetic spin. + +:c,image(Eqs/pair_spin_long_range.jpg) + +where si and sj are two magnetic spins of two particles with Lande factors +gi and gj respectively, eij = (ri - rj)/|ri-rj| is the unit vector between +sites i and j, mu0 the vacuum permeability, muB the Bohr magneton (muB = +5.788 eV/T in metal units). + +Style {pair/spin/long} computes magnetic precession vectors: + +:c,image(Eqs/pair_spin_long_range_magforce.jpg) + +with h the Planck constant (in metal units), and a mechanical force: + +:c,image(Eqs/pair_spin_long_range_force.jpg) + + +The following coefficient must be defined for each pair of atoms +types via the "pair_coeff"_pair_coeff.html command as in the examples +above, or in the data file or restart files read by the +"read_data"_read_data.html or "read_restart"_read_restart.html +commands, or by mixing as described below: + +rc (distance units) :ul + +with rc is the radius cutoff of the short-range component of the +long-range interaction (see "(Cerda)"_#Cerda1 for more +explanation). + +:line + +[Restrictions:] + +The {pair/spin/long} style is part of the SPIN package. It is only +enabled if LAMMPS was built with that package. See the +"Making LAMMPS"_Section_start.html#start_3 section for more info. + +The {pair/spin/long} style computes the short-range component of +the dipole-dipole interaction. The functions evaluating the +long-range component are part of the KSPACE package. +They can be enabled only if LAMMPS was built with that package. + +[Related commands:] + +"atom_style spin"_atom_style.html, "pair_coeff"_pair_coeff.html, + +[Default:] none + +:line + +:link(Tranchida6) +[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, +Journal of Computational Physics, (2018). + +:link(Cerda1) +[(Cerda)] Cerda, Ballenegger, Lenz, and Holm, J Chem Phys, 129(23), +234104 (2008). diff --git a/src/KSPACE/pppm_spin.cpp b/src/KSPACE/pppm_dipole.cpp similarity index 67% rename from src/KSPACE/pppm_spin.cpp rename to src/KSPACE/pppm_dipole.cpp index 9b59f9cd7b..a03f5b9980 100644 --- a/src/KSPACE/pppm_spin.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -21,7 +21,7 @@ #include #include #include -#include "pppm_spin.h" +#include "pppm_dipole.h" #include "atom.h" #include "comm.h" #include "gridcomm.h" @@ -50,8 +50,8 @@ using namespace MathSpecial; #define SMALL 0.00001 #define EPS_HOC 1.0e-7 -enum{REVERSE_SP}; -enum{FORWARD_SP,FORWARD_SP_PERATOM}; +enum{REVERSE_MU}; +enum{FORWARD_MU,FORWARD_MU_PERATOM}; #ifdef FFT_SINGLE #define ZEROF 0.0f @@ -63,34 +63,34 @@ enum{FORWARD_SP,FORWARD_SP_PERATOM}; /* ---------------------------------------------------------------------- */ -PPPMSpin::PPPMSpin(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), - densityx_brick_spin(NULL), densityy_brick_spin(NULL), - densityz_brick_spin(NULL), ux_brick_spin(NULL), - uy_brick_spin(NULL), uz_brick_spin(NULL), vdxx_brick_spin(NULL), - vdxy_brick_spin(NULL), vdyy_brick_spin(NULL), - vdxz_brick_spin(NULL), vdyz_brick_spin(NULL), - vdzz_brick_spin(NULL), v0x_brick_spin(NULL), v1x_brick_spin(NULL), - v2x_brick_spin(NULL), v3x_brick_spin(NULL), v4x_brick_spin(NULL), - v5x_brick_spin(NULL), v0y_brick_spin(NULL), v1y_brick_spin(NULL), - v2y_brick_spin(NULL), v3y_brick_spin(NULL), v4y_brick_spin(NULL), - v5y_brick_spin(NULL), v0z_brick_spin(NULL), v1z_brick_spin(NULL), - v2z_brick_spin(NULL), v3z_brick_spin(NULL), v4z_brick_spin(NULL), - v5z_brick_spin(NULL), work3(NULL), work4(NULL), - densityx_fft_spin(NULL), densityy_fft_spin(NULL), - densityz_fft_spin(NULL) +PPPMDipole::PPPMDipole(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), + densityx_brick_dipole(NULL), densityy_brick_dipole(NULL), + densityz_brick_dipole(NULL), ux_brick_dipole(NULL), + uy_brick_dipole(NULL), uz_brick_dipole(NULL), vdxx_brick_dipole(NULL), + vdxy_brick_dipole(NULL), vdyy_brick_dipole(NULL), + vdxz_brick_dipole(NULL), vdyz_brick_dipole(NULL), + vdzz_brick_dipole(NULL), v0x_brick_dipole(NULL), v1x_brick_dipole(NULL), + v2x_brick_dipole(NULL), v3x_brick_dipole(NULL), v4x_brick_dipole(NULL), + v5x_brick_dipole(NULL), v0y_brick_dipole(NULL), v1y_brick_dipole(NULL), + v2y_brick_dipole(NULL), v3y_brick_dipole(NULL), v4y_brick_dipole(NULL), + v5y_brick_dipole(NULL), v0z_brick_dipole(NULL), v1z_brick_dipole(NULL), + v2z_brick_dipole(NULL), v3z_brick_dipole(NULL), v4z_brick_dipole(NULL), + v5z_brick_dipole(NULL), work3(NULL), work4(NULL), + densityx_fft_dipole(NULL), densityy_fft_dipole(NULL), + densityz_fft_dipole(NULL) { - spinflag = 1; + dipoleflag = 1; group_group_enable = 0; - cg_spin = NULL; - cg_peratom_spin = NULL; + cg_dipole = NULL; + cg_peratom_dipole = NULL; } /* ---------------------------------------------------------------------- free all memory ------------------------------------------------------------------------- */ -PPPMSpin::~PPPMSpin() +PPPMDipole::~PPPMDipole() { if (copymode) return; @@ -99,23 +99,26 @@ PPPMSpin::~PPPMSpin() fft1 = NULL; fft2 = NULL; remap = NULL; - cg_spin = NULL; + cg_dipole = NULL; } /* ---------------------------------------------------------------------- called once before run ------------------------------------------------------------------------- */ -void PPPMSpin::init() +void PPPMDipole::init() { if (me == 0) { - if (screen) fprintf(screen,"PPPMSpin initialization ...\n"); - if (logfile) fprintf(logfile,"PPPMSpin initialization ...\n"); + if (screen) fprintf(screen,"PPPMDipole initialization ...\n"); + if (logfile) fprintf(logfile,"PPPMDipole initialization ...\n"); } // error check - spinflag = atom->sp?1:0; + dipoleflag = atom->mu?1:0; + qsum_qsq(0); + if (dipoleflag && q2) + error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMDipole"); triclinic_check(); @@ -123,30 +126,30 @@ void PPPMSpin::init() error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); if (domain->dimension == 2) error->all(FLERR, - "Cannot use PPPMSpin with 2d simulation"); + "Cannot use PPPMDipole with 2d simulation"); if (comm->style != 0) - error->universe_all(FLERR,"PPPMSpin can only currently be used with " + error->universe_all(FLERR,"PPPMDipole can only currently be used with " "comm_style brick"); - if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); + if (!atom->mu) error->all(FLERR,"Kspace style requires atom attribute mu"); - if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" - " ad with spins"); + if (atom->mu && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" + " ad with dipoles"); - if (spinflag && strcmp(update->unit_style,"metal") != 0) - error->all(FLERR,"'metal' units have to be used with spins"); + if (dipoleflag && strcmp(update->unit_style,"electron") == 0) + error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); if (slabflag == 0 && domain->nonperiodic > 0) - error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMSpin"); + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); if (slabflag) { if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) - error->all(FLERR,"Incorrect boundaries with slab PPPMSpin"); + error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); } if (order < 2 || order > MAXORDER) { char str[128]; - sprintf(str,"PPPMSpin order cannot be < 2 or > than %d",MAXORDER); + sprintf(str,"PPPMDipole order cannot be < 2 or > than %d",MAXORDER); error->all(FLERR,str); } @@ -154,7 +157,7 @@ void PPPMSpin::init() triclinic = domain->triclinic; if (triclinic) - error->all(FLERR,"Cannot yet use triclinic cells with PPPMSpin"); + error->all(FLERR,"Cannot yet use triclinic cells with PPPMDipole"); pair_check(); @@ -167,21 +170,17 @@ void PPPMSpin::init() // kspace TIP4P not yet supported if (tip4pflag) - error->all(FLERR,"Cannot yet use TIP4P with PPPMSpin"); + error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); + + // compute qsum & qsqsum and warn if not charge-neutral scale = 1.0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz - spsum_spsq(); + qqrd2e = force->qqrd2e; + musum_musq(); natoms_original = atom->natoms; // set accuracy (force units) from accuracy_relative or accuracy_absolute - // is two_charge_force still relevant for spin systems? - if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; else accuracy = accuracy_relative * two_charge_force; @@ -203,11 +202,11 @@ void PPPMSpin::init() while (order >= minorder) { if (iteration && me == 0) - error->warning(FLERR,"Reducing PPPMSpin order b/c stencil extends " + error->warning(FLERR,"Reducing PPPMDipole order b/c stencil extends " "beyond nearest neighbor processor"); compute_gf_denom(); - set_grid_global(); + set_grid_global(mu2); set_grid_local(); if (overlap_allowed) break; @@ -224,9 +223,9 @@ void PPPMSpin::init() iteration++; } - if (order < minorder) error->all(FLERR,"PPPMSpin order < minimum allowed order"); + if (order < minorder) error->all(FLERR,"PPPMDipole order < minimum allowed order"); if (!overlap_allowed && cgtmp->ghost_overlap()) - error->all(FLERR,"PPPMSpin grid stencil extends " + error->all(FLERR,"PPPMDipole grid stencil extends " "beyond nearest neighbor processor"); if (cgtmp) delete cgtmp; @@ -236,7 +235,7 @@ void PPPMSpin::init() // calculate the final accuracy - double estimated_accuracy = final_accuracy_spin(); + double estimated_accuracy = final_accuracy_dipole(mu2); // print stats @@ -282,10 +281,10 @@ void PPPMSpin::init() // don't invoke allocate peratom(), will be allocated when needed allocate(); - cg_spin->ghost_notify(); - cg_spin->setup(); + cg_dipole->ghost_notify(); + cg_dipole->setup(); - // pre-compute Green's function denominator expansion + // pre-compute Green's function denomiator expansion // pre-compute 1d charge distribution coefficients compute_gf_denom(); @@ -293,27 +292,27 @@ void PPPMSpin::init() } /* ---------------------------------------------------------------------- - adjust PPPMSpin coeffs, called initially and whenever volume has changed + adjust PPPMDipole coeffs, called initially and whenever volume has changed ------------------------------------------------------------------------- */ -void PPPMSpin::setup() +void PPPMDipole::setup() { // perform some checks to avoid illegal boundaries with read_data if (slabflag == 0 && domain->nonperiodic > 0) - error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMSpin"); + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); if (slabflag) { if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) - error->all(FLERR,"Incorrect boundaries with slab PPPMSpin"); + error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); } int i,j,k,n; double *prd; // volume-dependent factors - // adjust z dimension for 2d slab PPPMSpin - // z dimension for 3d PPPMSpin is zprd since slab_volfactor = 1.0 + // adjust z dimension for 2d slab PPPMDipole + // z dimension for 3d PPPMDipole is zprd since slab_volfactor = 1.0 prd = domain->prd; double xprd = prd[0]; @@ -381,7 +380,7 @@ void PPPMSpin::setup() } } - compute_gf_spin(); + compute_gf_dipole(); } /* ---------------------------------------------------------------------- @@ -389,7 +388,7 @@ void PPPMSpin::setup() called by fix balance b/c it changed sizes of processor sub-domains ------------------------------------------------------------------------- */ -void PPPMSpin::setup_grid() +void PPPMDipole::setup_grid() { // free all arrays previously allocated @@ -406,11 +405,11 @@ void PPPMSpin::setup_grid() allocate(); - cg_spin->ghost_notify(); - if (overlap_allowed == 0 && cg_spin->ghost_overlap()) - error->all(FLERR,"PPPMSpin grid stencil extends " + cg_dipole->ghost_notify(); + if (overlap_allowed == 0 && cg_dipole->ghost_overlap()) + error->all(FLERR,"PPPMDipole grid stencil extends " "beyond nearest neighbor processor"); - cg_spin->setup(); + cg_dipole->setup(); // pre-compute Green's function denomiator expansion // pre-compute 1d charge distribution coefficients @@ -424,10 +423,10 @@ void PPPMSpin::setup_grid() } /* ---------------------------------------------------------------------- - compute the PPPMSpin long-range force, energy, virial + compute the PPPMDipole long-range force, energy, virial ------------------------------------------------------------------------- */ -void PPPMSpin::compute(int eflag, int vflag) +void PPPMDipole::compute(int eflag, int vflag) { int i,j; @@ -440,20 +439,20 @@ void PPPMSpin::compute(int eflag, int vflag) if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); - cg_peratom_spin->ghost_notify(); - cg_peratom_spin->setup(); + cg_peratom_dipole->ghost_notify(); + cg_peratom_dipole->setup(); } // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - spsum_spsq(); + musum_musq(); natoms_original = atom->natoms; } - // return if there are no spins + // return if there are no dipoles - if (spsqsum == 0.0) return; + if (musqsum == 0.0) return; // convert atoms from box to lamda coords @@ -464,51 +463,51 @@ void PPPMSpin::compute(int eflag, int vflag) if (atom->nmax > nmax) { memory->destroy(part2grid); nmax = atom->nmax; - memory->create(part2grid,nmax,3,"pppm_spin:part2grid"); + memory->create(part2grid,nmax,3,"pppm_dipole:part2grid"); } // find grid points for all my particles - // map my particle charge onto my local 3d on-grid density + // map my particle charge onto my local 3d density grid particle_map(); - make_rho_spin(); + make_rho_dipole(); // all procs communicate density values from their ghost cells // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - cg_spin->reverse_comm(this,REVERSE_SP); - brick2fft_spin(); + cg_dipole->reverse_comm(this,REVERSE_MU); + brick2fft_dipole(); // compute potential gradient on my FFT grid and // portion of e_long on this proc's FFT grid // return gradients (electric fields) in 3d brick decomposition // also performs per-atom calculations via poisson_peratom() - poisson_ik_spin(); + poisson_ik_dipole(); // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks - cg_spin->forward_comm(this,FORWARD_SP); + cg_dipole->forward_comm(this,FORWARD_MU); // extra per-atom energy/virial communication if (evflag_atom) { - cg_peratom_spin->forward_comm(this,FORWARD_SP_PERATOM); + cg_peratom_dipole->forward_comm(this,FORWARD_MU_PERATOM); } // calculate the force on my particles - fieldforce_ik_spin(); + fieldforce_ik_dipole(); // extra per-atom energy/virial communication - if (evflag_atom) fieldforce_peratom_spin(); + if (evflag_atom) fieldforce_peratom_dipole(); // sum global energy across procs and add in volume-dependent term - const double spscale = mub2mu0 * scale; + const double qscale = qqrd2e * scale; const double g3 = g_ewald*g_ewald*g_ewald; if (eflag_global) { @@ -517,8 +516,8 @@ void PPPMSpin::compute(int eflag, int vflag) energy = energy_all; energy *= 0.5*volume; - energy -= spsqsum*2.0*g3/3.0/MY_PIS; - energy *= spscale; + energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy *= qscale; } // sum global virial across procs @@ -526,32 +525,29 @@ void PPPMSpin::compute(int eflag, int vflag) if (vflag_global) { double virial_all[6]; MPI_Allreduce(virial,virial_all,6,MPI_DOUBLE,MPI_SUM,world); - for (i = 0; i < 6; i++) virial[i] = 0.5*spscale*volume*virial_all[i]; + for (i = 0; i < 6; i++) virial[i] = 0.5*qscale*volume*virial_all[i]; } // per-atom energy/virial // energy includes self-energy correction if (evflag_atom) { - double **sp = atom->sp; - double spx,spy,spz; + double *q = atom->q; + double **mu = atom->mu; int nlocal = atom->nlocal; int ntotal = nlocal; if (eflag_atom) { for (i = 0; i < nlocal; i++) { - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; eatom[i] *= 0.5; - eatom[i] -= (spx*spx + spy*spy + spz*spz)*2.0*g3/3.0/MY_PIS; - eatom[i] *= spscale; + eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; + eatom[i] *= qscale; } } if (vflag_atom) { for (i = 0; i < ntotal; i++) - for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*spscale; + for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*qscale; } } @@ -564,59 +560,59 @@ void PPPMSpin::compute(int eflag, int vflag) allocate memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMSpin::allocate() +void PPPMDipole::allocate() { - memory->create3d_offset(densityx_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:densityx_brick_spin"); - memory->create3d_offset(densityy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:densityy_brick_spin"); - memory->create3d_offset(densityz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:densityz_brick_spin"); + memory->create3d_offset(densityx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityx_brick_dipole"); + memory->create3d_offset(densityy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityy_brick_dipole"); + memory->create3d_offset(densityz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityz_brick_dipole"); - memory->create(densityx_fft_spin,nfft_both,"pppm_spin:densityy_fft_spin"); - memory->create(densityy_fft_spin,nfft_both,"pppm_spin:densityy_fft_spin"); - memory->create(densityz_fft_spin,nfft_both,"pppm_spin:densityz_fft_spin"); + memory->create(densityx_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); + memory->create(densityy_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); + memory->create(densityz_fft_dipole,nfft_both,"pppm_dipole:densityz_fft_dipole"); - memory->create(greensfn,nfft_both,"pppm_spin:greensfn"); - memory->create(work1,2*nfft_both,"pppm_spin:work1"); - memory->create(work2,2*nfft_both,"pppm_spin:work2"); - memory->create(work3,2*nfft_both,"pppm_spin:work3"); - memory->create(work4,2*nfft_both,"pppm_spin:work4"); - memory->create(vg,nfft_both,6,"pppm_spin:vg"); + memory->create(greensfn,nfft_both,"pppm_dipole:greensfn"); + memory->create(work1,2*nfft_both,"pppm_dipole:work1"); + memory->create(work2,2*nfft_both,"pppm_dipole:work2"); + memory->create(work3,2*nfft_both,"pppm_dipole:work3"); + memory->create(work4,2*nfft_both,"pppm_dipole:work4"); + memory->create(vg,nfft_both,6,"pppm_dipole:vg"); - memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_spin:fkx"); - memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_spin:fky"); - memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_spin:fkz"); + memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_dipole:fkx"); + memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_dipole:fky"); + memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_dipole:fkz"); - memory->create3d_offset(ux_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:ux_brick_spin"); - memory->create3d_offset(uy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:uy_brick_spin"); - memory->create3d_offset(uz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:uz_brick_spin"); + memory->create3d_offset(ux_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:ux_brick_dipole"); + memory->create3d_offset(uy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:uy_brick_dipole"); + memory->create3d_offset(uz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:uz_brick_dipole"); - memory->create3d_offset(vdxx_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdxx_brick_spin"); - memory->create3d_offset(vdxy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdxy_brick_spin"); - memory->create3d_offset(vdyy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdyy_brick_spin"); - memory->create3d_offset(vdxz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdxz_brick_spin"); - memory->create3d_offset(vdyz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdyz_brick_spin"); - memory->create3d_offset(vdzz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdzz_brick_spin"); + memory->create3d_offset(vdxx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxx_brick_dipole"); + memory->create3d_offset(vdxy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxy_brick_dipole"); + memory->create3d_offset(vdyy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdyy_brick_dipole"); + memory->create3d_offset(vdxz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxz_brick_dipole"); + memory->create3d_offset(vdyz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdyz_brick_dipole"); + memory->create3d_offset(vdzz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdzz_brick_dipole"); // summation coeffs order_allocated = order; - memory->create(gf_b,order,"pppm_spin:gf_b"); - memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_spin:rho1d"); - memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_spin:drho1d"); - memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_spin:rho_coeff"); + memory->create(gf_b,order,"pppm_dipole:gf_b"); + memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_dipole:rho1d"); + memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_dipole:drho1d"); + memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_dipole:rho_coeff"); memory->create2d_offset(drho_coeff,order,(1-order)/2,order/2, - "pppm_spin:drho_coeff"); + "pppm_dipole:drho_coeff"); // create 2 FFTs and a Remap // 1st FFT keeps data in FFT decompostion @@ -644,7 +640,7 @@ void PPPMSpin::allocate() int (*procneigh)[2] = comm->procneigh; - cg_spin = new GridComm(lmp,world,9,3, + cg_dipole = new GridComm(lmp,world,9,3, nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, procneigh[0][0],procneigh[0][1],procneigh[1][0], @@ -655,26 +651,26 @@ void PPPMSpin::allocate() deallocate memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMSpin::deallocate() +void PPPMDipole::deallocate() { - memory->destroy3d_offset(densityx_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(densityy_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(densityz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityx_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(ux_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(uy_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(uz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(ux_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxx_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxy_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdyy_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdyz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdzz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxx_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdzz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy(densityx_fft_spin); - memory->destroy(densityy_fft_spin); - memory->destroy(densityz_fft_spin); + memory->destroy(densityx_fft_dipole); + memory->destroy(densityy_fft_dipole); + memory->destroy(densityz_fft_dipole); memory->destroy(greensfn); memory->destroy(work1); @@ -696,61 +692,61 @@ void PPPMSpin::deallocate() delete fft1; delete fft2; delete remap; - delete cg_spin; + delete cg_dipole; } /* ---------------------------------------------------------------------- allocate per-atom memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMSpin::allocate_peratom() +void PPPMDipole::allocate_peratom() { peratom_allocate_flag = 1; - memory->create3d_offset(v0x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v0x_brick_spin"); - memory->create3d_offset(v1x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v1x_brick_spin"); - memory->create3d_offset(v2x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v2x_brick_spin"); - memory->create3d_offset(v3x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v3x_brick_spin"); - memory->create3d_offset(v4x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v4x_brick_spin"); - memory->create3d_offset(v5x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v5x_brick_spin"); + memory->create3d_offset(v0x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0x_brick_dipole"); + memory->create3d_offset(v1x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1x_brick_dipole"); + memory->create3d_offset(v2x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2x_brick_dipole"); + memory->create3d_offset(v3x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3x_brick_dipole"); + memory->create3d_offset(v4x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4x_brick_dipole"); + memory->create3d_offset(v5x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5x_brick_dipole"); - memory->create3d_offset(v0y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v0y_brick_spin"); - memory->create3d_offset(v1y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v1y_brick_spin"); - memory->create3d_offset(v2y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v2y_brick_spin"); - memory->create3d_offset(v3y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v3y_brick_spin"); - memory->create3d_offset(v4y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v4y_brick_spin"); - memory->create3d_offset(v5y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v5y_brick_spin"); + memory->create3d_offset(v0y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0y_brick_dipole"); + memory->create3d_offset(v1y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1y_brick_dipole"); + memory->create3d_offset(v2y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2y_brick_dipole"); + memory->create3d_offset(v3y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3y_brick_dipole"); + memory->create3d_offset(v4y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4y_brick_dipole"); + memory->create3d_offset(v5y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5y_brick_dipole"); - memory->create3d_offset(v0z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v0z_brick_spin"); - memory->create3d_offset(v1z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v1z_brick_spin"); - memory->create3d_offset(v2z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v2z_brick_spin"); - memory->create3d_offset(v3z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v3z_brick_spin"); - memory->create3d_offset(v4z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v4z_brick_spin"); - memory->create3d_offset(v5z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v5z_brick_spin"); + memory->create3d_offset(v0z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0z_brick_dipole"); + memory->create3d_offset(v1z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1z_brick_dipole"); + memory->create3d_offset(v2z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2z_brick_dipole"); + memory->create3d_offset(v3z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3z_brick_dipole"); + memory->create3d_offset(v4z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4z_brick_dipole"); + memory->create3d_offset(v5z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5z_brick_dipole"); // create ghost grid object for rho and electric field communication int (*procneigh)[2] = comm->procneigh; - cg_peratom_spin = + cg_peratom_dipole = new GridComm(lmp,world,18,1, nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, @@ -762,44 +758,44 @@ void PPPMSpin::allocate_peratom() deallocate per-atom memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMSpin::deallocate_peratom() +void PPPMDipole::deallocate_peratom() { peratom_allocate_flag = 0; - memory->destroy3d_offset(v0x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v0y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v0z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - delete cg_peratom_spin; + delete cg_peratom_dipole; } /* ---------------------------------------------------------------------- - set global size of PPPMSpin grid = nx,ny,nz_pppm + set global size of PPPMDipole grid = nx,ny,nz_pppm used for charge accumulation, FFTs, and electric field interpolation ------------------------------------------------------------------------- */ -void PPPMSpin::set_grid_global() +void PPPMDipole::set_grid_global(double dipole2) { // use xprd,yprd,zprd - // adjust z dimension for 2d slab PPPMSpin - // 3d PPPMSpin just uses zprd since slab_volfactor = 1.0 + // adjust z dimension for 2d slab PPPMDipole + // 3d PPPMDipole just uses zprd since slab_volfactor = 1.0 double xprd = domain->xprd; double yprd = domain->yprd; @@ -817,14 +813,16 @@ void PPPMSpin::set_grid_global() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); - if (sp2 == 0.0) - error->all(FLERR,"Must use kspace_modify gewald for systems with no spins"); + //if (mu2 == 0.0) + if (dipole2 == 0.0) + error->all(FLERR,"Must use kspace_modify gewald for systems with no dipoles"); g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; //Try Newton Solver double g_ewald_new = - find_gewald_spin(g_ewald,cutoff,natoms,xprd*yprd*zprd,sp2); + find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,dipole2); + //find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; - else error->warning(FLERR,"PPPMSpin spin Newton solver failed, " + else error->warning(FLERR,"PPPMDipole dipole Newton solver failed, " "using old method to estimate g_ewald"); } @@ -864,7 +862,7 @@ void PPPMSpin::set_grid_global() nzlo_fft = me_z*nz_pppm/npez_fft; nzhi_fft = (me_z+1)*nz_pppm/npez_fft - 1; - double df_kspace = compute_df_kspace_spin(); + double df_kspace = compute_df_kspace_dipole(dipole2); count++; @@ -889,31 +887,32 @@ void PPPMSpin::set_grid_global() h_z = zprd_slab/nz_pppm; if (nx_pppm >= OFFSET || ny_pppm >= OFFSET || nz_pppm >= OFFSET) - error->all(FLERR,"PPPMSpin grid is too large"); + error->all(FLERR,"PPPMDipole grid is too large"); } /* ---------------------------------------------------------------------- - compute estimated kspace force error for spins + compute estimated kspace force error for dipoles ------------------------------------------------------------------------- */ -double PPPMSpin::compute_df_kspace_spin() +double PPPMDipole::compute_df_kspace_dipole(double dipole2) { double xprd = domain->xprd; double yprd = domain->yprd; double zprd = domain->zprd; double zprd_slab = zprd*slab_volfactor; bigint natoms = atom->natoms; - double qopt = compute_qopt_spin(); - double df_kspace = sqrt(qopt/natoms)*sp2/(3.0*xprd*yprd*zprd_slab); + double qopt = compute_qopt_dipole(); + //double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); + double df_kspace = sqrt(qopt/natoms)*dipole2/(3.0*xprd*yprd*zprd_slab); return df_kspace; } /* ---------------------------------------------------------------------- - compute qopt for spins with ik differentiation + compute qopt for dipoles with ik differentiation ------------------------------------------------------------------------- */ -double PPPMSpin::compute_qopt_spin() +double PPPMDipole::compute_qopt_dipole() { double qopt = 0.0; const double * const prd = domain->prd; @@ -984,7 +983,7 @@ double PPPMSpin::compute_qopt_spin() dot1 = unitkx*kper*qx + unitky*lper*qy + unitkz*mper*qz; dot2 = qx*qx + qy*qy + qz*qz; - //dot1 = dot1*dot1*dot1; // power of 3 for spin forces + //dot1 = dot1*dot1*dot1; // power of 3 for dipole forces //dot2 = dot2*dot2*dot2; u1 = sx*sy*sz; const double w2 = wx*wy*wz; @@ -1009,7 +1008,7 @@ double PPPMSpin::compute_qopt_spin() pre-compute modified (Hockney-Eastwood) Coulomb Green's function ------------------------------------------------------------------------- */ -void PPPMSpin::compute_gf_spin() +void PPPMDipole::compute_gf_dipole() { const double * const prd = domain->prd; @@ -1102,34 +1101,34 @@ void PPPMSpin::compute_gf_spin() calculate f(x) for use in Newton-Raphson solver ------------------------------------------------------------------------- */ -double PPPMSpin::newton_raphson_f() -{ - double xprd = domain->xprd; - double yprd = domain->yprd; - double zprd = domain->zprd; - bigint natoms = atom->natoms; - - double df_rspace,df_kspace; - double vol = xprd*yprd*zprd; - double a = cutoff*g_ewald; - double rg2 = a*a; - double rg4 = rg2*rg2; - double rg6 = rg4*rg2; - double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; - double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * - sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); - df_kspace = compute_df_kspace_spin(); - - return df_rspace - df_kspace; -} +//double PPPMDipole::newton_raphson_f() +//{ +// double xprd = domain->xprd; +// double yprd = domain->yprd; +// double zprd = domain->zprd; +// bigint natoms = atom->natoms; +// +// double df_rspace,df_kspace; +// double vol = xprd*yprd*zprd; +// double a = cutoff*g_ewald; +// double rg2 = a*a; +// double rg4 = rg2*rg2; +// double rg6 = rg4*rg2; +// double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; +// double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; +// df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * +// sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); +// df_kspace = compute_df_kspace_dipole(); +// +// return df_rspace - df_kspace; +//} /* ---------------------------------------------------------------------- - find g_ewald parameter for spins based on desired accuracy + find g_ewald parameter for dipoles based on desired accuracy using a Newton-Raphson solver ------------------------------------------------------------------------- */ -double PPPMSpin::find_gewald_spin(double x, double Rc, +double PPPMDipole::find_gewald_dipole(double x, double Rc, bigint natoms, double vol, double b2) { double dx,tol; @@ -1141,7 +1140,7 @@ double PPPMSpin::find_gewald_spin(double x, double Rc, //Begin algorithm for (int i = 0; i < maxit; i++) { - dx = newton_raphson_f_spin(x,Rc,natoms,vol,b2) / derivf_spin(x,Rc,natoms,vol,b2); + dx = newton_raphson_f_dipole(x,Rc,natoms,vol,b2) / derivf_dipole(x,Rc,natoms,vol,b2); x = x - dx; //Update x if (fabs(dx) < tol) return x; if (x < 0 || x != x) // solver failed @@ -1151,10 +1150,10 @@ double PPPMSpin::find_gewald_spin(double x, double Rc, } /* ---------------------------------------------------------------------- - calculate f(x) objective function for spins + calculate f(x) objective function for dipoles ------------------------------------------------------------------------- */ -double PPPMSpin::newton_raphson_f_spin(double x, double Rc, bigint +double PPPMDipole::newton_raphson_f_dipole(double x, double Rc, bigint natoms, double vol, double b2) { double a = Rc*x; @@ -1171,21 +1170,21 @@ natoms, double vol, double b2) } /* ---------------------------------------------------------------------- - calculate numerical derivative f'(x) of objective function for spins + calculate numerical derivative f'(x) of objective function for dipoles ------------------------------------------------------------------------- */ -double PPPMSpin::derivf_spin(double x, double Rc, +double PPPMDipole::derivf_dipole(double x, double Rc, bigint natoms, double vol, double b2) { double h = 0.000001; //Derivative step-size - return (newton_raphson_f_spin(x + h,Rc,natoms,vol,b2) - newton_raphson_f_spin(x,Rc,natoms,vol,b2)) / h; + return (newton_raphson_f_dipole(x + h,Rc,natoms,vol,b2) - newton_raphson_f_dipole(x,Rc,natoms,vol,b2)) / h; } /* ---------------------------------------------------------------------- calculate the final estimate of the accuracy ------------------------------------------------------------------------- */ -double PPPMSpin::final_accuracy_spin() +double PPPMDipole::final_accuracy_dipole(double dipole2) { double xprd = domain->xprd; double yprd = domain->yprd; @@ -1194,7 +1193,7 @@ double PPPMSpin::final_accuracy_spin() bigint natoms = atom->natoms; if (natoms == 0) natoms = 1; // avoid division by zero - double df_kspace = compute_df_kspace_spin(); + double df_kspace = compute_df_kspace_dipole(mu2); double a = cutoff*g_ewald; double rg2 = a*a; @@ -1202,7 +1201,10 @@ double PPPMSpin::final_accuracy_spin() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - double df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + //double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + // exp(-rg2)); + double df_rspace = (dipole2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); @@ -1215,10 +1217,10 @@ double PPPMSpin::final_accuracy_spin() pre-compute Green's function denominator expansion coeffs, Gamma(2n) ------------------------------------------------------------------------- */ -void PPPMSpin::compute_gf_denom() +void PPPMDipole::compute_gf_denom() { if (gf_b) memory->destroy(gf_b); - memory->create(gf_b,order,"pppm_spin:gf_b"); + memory->create(gf_b,order,"pppm_dipole:gf_b"); int k,l,m; @@ -1244,7 +1246,7 @@ void PPPMSpin::compute_gf_denom() in global grid ------------------------------------------------------------------------- */ -void PPPMSpin::make_rho_spin() +void PPPMDipole::make_rho_dipole() { int l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz; @@ -1254,11 +1256,11 @@ void PPPMSpin::make_rho_spin() // clear 3d density array - memset(&(densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); - memset(&(densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); - memset(&(densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); // loop over my charges, add their contribution to nearby grid points @@ -1266,8 +1268,7 @@ void PPPMSpin::make_rho_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **sp = atom->sp; - double spx,spy,spz; + double **mu = atom->mu; double **x = atom->x; int nlocal = atom->nlocal; @@ -1282,12 +1283,9 @@ void PPPMSpin::make_rho_spin() compute_rho1d(dx,dy,dz); - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - z0 = delvolinv * spx; - z1 = delvolinv * spy; - z2 = delvolinv * spz; + z0 = delvolinv * mu[i][0]; + z1 = delvolinv * mu[i][1]; + z2 = delvolinv * mu[i][2]; for (n = nlower; n <= nupper; n++) { mz = n+nz; y0 = z0*rho1d[2][n]; @@ -1300,9 +1298,9 @@ void PPPMSpin::make_rho_spin() x2 = y2*rho1d[1][m]; for (l = nlower; l <= nupper; l++) { mx = l+nx; - densityx_brick_spin[mz][my][mx] += x0*rho1d[0][l]; - densityy_brick_spin[mz][my][mx] += x1*rho1d[0][l]; - densityz_brick_spin[mz][my][mx] += x2*rho1d[0][l]; + densityx_brick_dipole[mz][my][mx] += x0*rho1d[0][l]; + densityy_brick_dipole[mz][my][mx] += x1*rho1d[0][l]; + densityz_brick_dipole[mz][my][mx] += x2*rho1d[0][l]; } } } @@ -1313,7 +1311,7 @@ void PPPMSpin::make_rho_spin() remap density from 3d brick decomposition to FFT decomposition ------------------------------------------------------------------------- */ -void PPPMSpin::brick2fft_spin() +void PPPMDipole::brick2fft_dipole() { int n,ix,iy,iz; @@ -1325,36 +1323,36 @@ void PPPMSpin::brick2fft_spin() for (iz = nzlo_in; iz <= nzhi_in; iz++) for (iy = nylo_in; iy <= nyhi_in; iy++) for (ix = nxlo_in; ix <= nxhi_in; ix++) { - densityx_fft_spin[n] = densityx_brick_spin[iz][iy][ix]; - densityy_fft_spin[n] = densityy_brick_spin[iz][iy][ix]; - densityz_fft_spin[n] = densityz_brick_spin[iz][iy][ix]; + densityx_fft_dipole[n] = densityx_brick_dipole[iz][iy][ix]; + densityy_fft_dipole[n] = densityy_brick_dipole[iz][iy][ix]; + densityz_fft_dipole[n] = densityz_brick_dipole[iz][iy][ix]; n++; } - remap->perform(densityx_fft_spin,densityx_fft_spin,work1); - remap->perform(densityy_fft_spin,densityy_fft_spin,work1); - remap->perform(densityz_fft_spin,densityz_fft_spin,work1); + remap->perform(densityx_fft_dipole,densityx_fft_dipole,work1); + remap->perform(densityy_fft_dipole,densityy_fft_dipole,work1); + remap->perform(densityz_fft_dipole,densityz_fft_dipole,work1); } /* ---------------------------------------------------------------------- FFT-based Poisson solver for ik ------------------------------------------------------------------------- */ -void PPPMSpin::poisson_ik_spin() +void PPPMDipole::poisson_ik_dipole() { int i,j,k,n,ii; double eng; double wreal,wimg; - // transform spin density (r -> k) + // transform dipole density (r -> k) n = 0; for (i = 0; i < nfft; i++) { - work1[n] = densityx_fft_spin[i]; + work1[n] = densityx_fft_dipole[i]; work1[n+1] = ZEROF; - work2[n] = densityy_fft_spin[i]; + work2[n] = densityy_fft_dipole[i]; work2[n+1] = ZEROF; - work3[n] = densityz_fft_spin[i]; + work3[n] = densityz_fft_dipole[i]; work3[n+1] = ZEROF; n += 2; } @@ -1421,7 +1419,7 @@ void PPPMSpin::poisson_ik_spin() // extra FFTs for per-atom energy/virial - if (vflag_atom) poisson_peratom_spin(); + if (vflag_atom) poisson_peratom_dipole(); // compute electric potential // FFT leaves data in 3d brick decomposition @@ -1443,7 +1441,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - ux_brick_spin[k][j][i] = work4[n]; + ux_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1464,7 +1462,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - uy_brick_spin[k][j][i] = work4[n]; + uy_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1485,7 +1483,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - uz_brick_spin[k][j][i] = work4[n]; + uz_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1506,7 +1504,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxx_brick_spin[k][j][i] = work4[n]; + vdxx_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1527,7 +1525,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdyy_brick_spin[k][j][i] = work4[n]; + vdyy_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1548,7 +1546,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdzz_brick_spin[k][j][i] = work4[n]; + vdzz_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1569,7 +1567,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxy_brick_spin[k][j][i] = work4[n]; + vdxy_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1590,7 +1588,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxz_brick_spin[k][j][i] = work4[n]; + vdxz_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1611,7 +1609,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdyz_brick_spin[k][j][i] = work4[n]; + vdyz_brick_dipole[k][j][i] = work4[n]; n += 2; } } @@ -1620,7 +1618,7 @@ void PPPMSpin::poisson_ik_spin() FFT-based Poisson solver for per-atom energy/virial ------------------------------------------------------------------------- */ -void PPPMSpin::poisson_peratom_spin() +void PPPMDipole::poisson_peratom_dipole() { int i,ii,j,k,n; @@ -1647,7 +1645,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0x_brick_spin[k][j][i] = work4[n]; + v0x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1670,7 +1668,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0y_brick_spin[k][j][i] = work4[n]; + v0y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1693,7 +1691,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0z_brick_spin[k][j][i] = work4[n]; + v0z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1716,7 +1714,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1x_brick_spin[k][j][i] = work4[n]; + v1x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1739,7 +1737,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1y_brick_spin[k][j][i] = work4[n]; + v1y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1762,7 +1760,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1z_brick_spin[k][j][i] = work4[n]; + v1z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1785,7 +1783,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2x_brick_spin[k][j][i] = work4[n]; + v2x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1808,7 +1806,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2y_brick_spin[k][j][i] = work4[n]; + v2y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1831,7 +1829,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2z_brick_spin[k][j][i] = work4[n]; + v2z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1854,7 +1852,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3x_brick_spin[k][j][i] = work4[n]; + v3x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1877,7 +1875,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3y_brick_spin[k][j][i] = work4[n]; + v3y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1900,7 +1898,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3z_brick_spin[k][j][i] = work4[n]; + v3z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1923,7 +1921,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4x_brick_spin[k][j][i] = work4[n]; + v4x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1946,7 +1944,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4y_brick_spin[k][j][i] = work4[n]; + v4y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1969,7 +1967,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4z_brick_spin[k][j][i] = work4[n]; + v4z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1992,7 +1990,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5x_brick_spin[k][j][i] = work4[n]; + v5x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -2015,7 +2013,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5y_brick_spin[k][j][i] = work4[n]; + v5y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -2038,16 +2036,16 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5z_brick_spin[k][j][i] = work4[n]; + v5z_brick_dipole[k][j][i] = work4[n]; n += 2; } } /* ---------------------------------------------------------------------- - interpolate from grid to get magnetic field & force on my particles for ik + interpolate from grid to get electric field & force on my particles for ik ------------------------------------------------------------------------- */ -void PPPMSpin::fieldforce_ik_spin() +void PPPMDipole::fieldforce_ik_dipole() { int i,l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz; @@ -2060,11 +2058,11 @@ void PPPMSpin::fieldforce_ik_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **sp = atom->sp; - double spx,spy,spz; + + double **mu = atom->mu; double **x = atom->x; double **f = atom->f; - double **fm = atom->fm; + double **t = atom->torque; int nlocal = atom->nlocal; @@ -2089,36 +2087,29 @@ void PPPMSpin::fieldforce_ik_spin() for (l = nlower; l <= nupper; l++) { mx = l+nx; x0 = y0*rho1d[0][l]; - ex -= x0*ux_brick_spin[mz][my][mx]; - ey -= x0*uy_brick_spin[mz][my][mx]; - ez -= x0*uz_brick_spin[mz][my][mx]; - vxx -= x0*vdxx_brick_spin[mz][my][mx]; - vyy -= x0*vdyy_brick_spin[mz][my][mx]; - vzz -= x0*vdzz_brick_spin[mz][my][mx]; - vxy -= x0*vdxy_brick_spin[mz][my][mx]; - vxz -= x0*vdxz_brick_spin[mz][my][mx]; - vyz -= x0*vdyz_brick_spin[mz][my][mx]; + ex -= x0*ux_brick_dipole[mz][my][mx]; + ey -= x0*uy_brick_dipole[mz][my][mx]; + ez -= x0*uz_brick_dipole[mz][my][mx]; + vxx -= x0*vdxx_brick_dipole[mz][my][mx]; + vyy -= x0*vdyy_brick_dipole[mz][my][mx]; + vzz -= x0*vdzz_brick_dipole[mz][my][mx]; + vxy -= x0*vdxy_brick_dipole[mz][my][mx]; + vxz -= x0*vdxz_brick_dipole[mz][my][mx]; + vyz -= x0*vdyz_brick_dipole[mz][my][mx]; } } } - // convert M-field to mech. and mag. forces + // convert E-field to torque - const double spfactor = mub2mu0 * scale; - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - f[i][0] += spfactor*(vxx*spx + vxy*spy + vxz*spz); - f[i][1] += spfactor*(vxy*spx + vyy*spy + vyz*spz); - f[i][2] += spfactor*(vxz*spx + vyz*spy + vzz*spz); - - const double spfactorh = mub2mu0hbinv * scale; - fm[i][0] += spfactorh*ex; - fm[i][1] += spfactorh*ey; - fm[i][2] += spfactorh*ez; - - // create a new vector (in atom_spin style ?) to store long-range fm tables + const double mufactor = qqrd2e * scale; + f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); + f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); + f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); + t[i][0] += mufactor*(mu[i][1]*ez - mu[i][2]*ey); + t[i][1] += mufactor*(mu[i][2]*ex - mu[i][0]*ez); + t[i][2] += mufactor*(mu[i][0]*ey - mu[i][1]*ex); } } @@ -2126,7 +2117,7 @@ void PPPMSpin::fieldforce_ik_spin() interpolate from grid to get per-atom energy/virial ------------------------------------------------------------------------- */ -void PPPMSpin::fieldforce_peratom_spin() +void PPPMDipole::fieldforce_peratom_dipole() { int i,l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz,x0,y0,z0; @@ -2140,8 +2131,7 @@ void PPPMSpin::fieldforce_peratom_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **sp = atom->sp; - double spx,spy,spz; + double **mu = atom->mu; double **x = atom->x; int nlocal = atom->nlocal; @@ -2170,45 +2160,42 @@ void PPPMSpin::fieldforce_peratom_spin() mx = l+nx; x0 = y0*rho1d[0][l]; if (eflag_atom) { - ux += x0*ux_brick_spin[mz][my][mx]; - uy += x0*uy_brick_spin[mz][my][mx]; - uz += x0*uz_brick_spin[mz][my][mx]; + ux += x0*ux_brick_dipole[mz][my][mx]; + uy += x0*uy_brick_dipole[mz][my][mx]; + uz += x0*uz_brick_dipole[mz][my][mx]; } if (vflag_atom) { - v0x += x0*v0x_brick_spin[mz][my][mx]; - v1x += x0*v1x_brick_spin[mz][my][mx]; - v2x += x0*v2x_brick_spin[mz][my][mx]; - v3x += x0*v3x_brick_spin[mz][my][mx]; - v4x += x0*v4x_brick_spin[mz][my][mx]; - v5x += x0*v5x_brick_spin[mz][my][mx]; - v0y += x0*v0y_brick_spin[mz][my][mx]; - v1y += x0*v1y_brick_spin[mz][my][mx]; - v2y += x0*v2y_brick_spin[mz][my][mx]; - v3y += x0*v3y_brick_spin[mz][my][mx]; - v4y += x0*v4y_brick_spin[mz][my][mx]; - v5y += x0*v5y_brick_spin[mz][my][mx]; - v0z += x0*v0z_brick_spin[mz][my][mx]; - v1z += x0*v1z_brick_spin[mz][my][mx]; - v2z += x0*v2z_brick_spin[mz][my][mx]; - v3z += x0*v3z_brick_spin[mz][my][mx]; - v4z += x0*v4z_brick_spin[mz][my][mx]; - v5z += x0*v5z_brick_spin[mz][my][mx]; + v0x += x0*v0x_brick_dipole[mz][my][mx]; + v1x += x0*v1x_brick_dipole[mz][my][mx]; + v2x += x0*v2x_brick_dipole[mz][my][mx]; + v3x += x0*v3x_brick_dipole[mz][my][mx]; + v4x += x0*v4x_brick_dipole[mz][my][mx]; + v5x += x0*v5x_brick_dipole[mz][my][mx]; + v0y += x0*v0y_brick_dipole[mz][my][mx]; + v1y += x0*v1y_brick_dipole[mz][my][mx]; + v2y += x0*v2y_brick_dipole[mz][my][mx]; + v3y += x0*v3y_brick_dipole[mz][my][mx]; + v4y += x0*v4y_brick_dipole[mz][my][mx]; + v5y += x0*v5y_brick_dipole[mz][my][mx]; + v0z += x0*v0z_brick_dipole[mz][my][mx]; + v1z += x0*v1z_brick_dipole[mz][my][mx]; + v2z += x0*v2z_brick_dipole[mz][my][mx]; + v3z += x0*v3z_brick_dipole[mz][my][mx]; + v4z += x0*v4z_brick_dipole[mz][my][mx]; + v5z += x0*v5z_brick_dipole[mz][my][mx]; } } } } - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - if (eflag_atom) eatom[i] += spx*ux + spy*uy + spz*uz; + if (eflag_atom) eatom[i] += mu[i][0]*ux + mu[i][1]*uy + mu[i][2]*uz; if (vflag_atom) { - vatom[i][0] += spx*v0x + spy*v0y + spz*v0z; - vatom[i][1] += spx*v1x + spy*v1y + spz*v1z; - vatom[i][2] += spx*v2x + spy*v2y + spz*v2z; - vatom[i][3] += spx*v3x + spy*v3y + spz*v3z; - vatom[i][4] += spx*v4x + spy*v4y + spz*v4z; - vatom[i][5] += spx*v5x + spy*v5y + spz*v5z; + vatom[i][0] += mu[i][0]*v0x + mu[i][1]*v0y + mu[i][2]*v0z; + vatom[i][1] += mu[i][0]*v1x + mu[i][1]*v1y + mu[i][2]*v1z; + vatom[i][2] += mu[i][0]*v2x + mu[i][1]*v2y + mu[i][2]*v2z; + vatom[i][3] += mu[i][0]*v3x + mu[i][1]*v3y + mu[i][2]*v3z; + vatom[i][4] += mu[i][0]*v4x + mu[i][1]*v4y + mu[i][2]*v4z; + vatom[i][5] += mu[i][0]*v5x + mu[i][1]*v5y + mu[i][2]*v5z; } } } @@ -2217,20 +2204,20 @@ void PPPMSpin::fieldforce_peratom_spin() pack own values to buf to send to another proc ------------------------------------------------------------------------- */ -void PPPMSpin::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == FORWARD_SP) { - FFT_SCALAR *src_ux = &ux_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_uy = &uy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_uz = &uz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxx = &vdxx_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vyy = &vdyy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vzz = &vdzz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxy = &vdxy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxz = &vdxz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vyz = &vdyz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + if (flag == FORWARD_MU) { + FFT_SCALAR *src_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { buf[n++] = src_ux[list[i]]; buf[n++] = src_uy[list[i]]; @@ -2242,25 +2229,25 @@ void PPPMSpin::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) buf[n++] = src_vxz[list[i]]; buf[n++] = src_vyz[list[i]]; } - } else if (flag == FORWARD_SP_PERATOM) { - FFT_SCALAR *v0xsrc = &v0x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1xsrc = &v1x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2xsrc = &v2x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3xsrc = &v3x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4xsrc = &v4x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5xsrc = &v5x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0ysrc = &v0y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1ysrc = &v1y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2ysrc = &v2y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3ysrc = &v3y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4ysrc = &v4y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5ysrc = &v5y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0zsrc = &v0z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1zsrc = &v1z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2zsrc = &v2z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3zsrc = &v3z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4zsrc = &v4z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5zsrc = &v5z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + } else if (flag == FORWARD_MU_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { buf[n++] = v0xsrc[list[i]]; buf[n++] = v1xsrc[list[i]]; @@ -2288,20 +2275,20 @@ void PPPMSpin::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) unpack another proc's own values from buf and set own ghost values ------------------------------------------------------------------------- */ -void PPPMSpin::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == FORWARD_SP) { - FFT_SCALAR *dest_ux = &ux_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_uy = &uy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_uz = &uz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxx = &vdxx_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vyy = &vdyy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vzz = &vdzz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxy = &vdxy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxz = &vdxz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vyz = &vdyz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + if (flag == FORWARD_MU) { + FFT_SCALAR *dest_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { dest_ux[list[i]] = buf[n++]; dest_uy[list[i]] = buf[n++]; @@ -2313,25 +2300,25 @@ void PPPMSpin::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) dest_vxz[list[i]] = buf[n++]; dest_vyz[list[i]] = buf[n++]; } - } else if (flag == FORWARD_SP_PERATOM) { - FFT_SCALAR *v0xsrc = &v0x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1xsrc = &v1x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2xsrc = &v2x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3xsrc = &v3x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4xsrc = &v4x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5xsrc = &v5x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0ysrc = &v0y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1ysrc = &v1y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2ysrc = &v2y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3ysrc = &v3y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4ysrc = &v4y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5ysrc = &v5y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0zsrc = &v0z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1zsrc = &v1z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2zsrc = &v2z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3zsrc = &v3z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4zsrc = &v4z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5zsrc = &v5z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + } else if (flag == FORWARD_MU_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { v0xsrc[list[i]] = buf[n++]; v1xsrc[list[i]] = buf[n++]; @@ -2359,17 +2346,17 @@ void PPPMSpin::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) pack ghost values into buf to send to another proc ------------------------------------------------------------------------- */ -void PPPMSpin::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMDipole::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == REVERSE_SP) { - FFT_SCALAR *src_spin0 = &densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_spin1 = &densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_spin2 = &densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + if (flag == REVERSE_MU) { + FFT_SCALAR *src_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { - buf[n++] = src_spin0[list[i]]; - buf[n++] = src_spin1[list[i]]; - buf[n++] = src_spin2[list[i]]; + buf[n++] = src_dipole0[list[i]]; + buf[n++] = src_dipole1[list[i]]; + buf[n++] = src_dipole2[list[i]]; } } } @@ -2378,17 +2365,17 @@ void PPPMSpin::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) unpack another proc's ghost values from buf and add to own values ------------------------------------------------------------------------- */ -void PPPMSpin::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMDipole::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == REVERSE_SP) { - FFT_SCALAR *dest_spin0 = &densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_spin1 = &densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_spin2 = &densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + if (flag == REVERSE_MU) { + FFT_SCALAR *dest_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { - dest_spin0[list[i]] += buf[n++]; - dest_spin1[list[i]] += buf[n++]; - dest_spin2[list[i]] += buf[n++]; + dest_dipole0[list[i]] += buf[n++]; + dest_dipole1[list[i]] += buf[n++]; + dest_dipole2[list[i]] += buf[n++]; } } } @@ -2401,50 +2388,57 @@ void PPPMSpin::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) extended to non-neutral systems (J. Chem. Phys. 131, 094107). ------------------------------------------------------------------------- */ -void PPPMSpin::slabcorr() +void PPPMDipole::slabcorr() { - // compute local contribution to global spin moment + // compute local contribution to global dipole moment double **x = atom->x; double zprd = domain->zprd; int nlocal = atom->nlocal; - double spin = 0.0; - double **sp = atom->sp; - double spx,spy,spz; - for (int i = 0; i < nlocal; i++) { - spz = sp[i][2]*sp[i][3]; - spin += spz; + double dipole = 0.0; + double **mu = atom->mu; + for (int i = 0; i < nlocal; i++) dipole += mu[i][2]; + + // sum local contributions to get global dipole moment + + double dipole_all; + MPI_Allreduce(&dipole,&dipole_all,1,MPI_DOUBLE,MPI_SUM,world); + + // need to make non-neutral systems and/or + // per-atom energy translationally invariant + + if (eflag_atom || fabs(qsum) > SMALL) { + + error->all(FLERR,"Cannot (yet) use kspace slab correction with " + "long-range dipoles and non-neutral systems or per-atom energy"); } - // sum local contributions to get global spin moment - - double spin_all; - MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); - // compute corrections - const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; - const double spscale = mub2mu0 * scale; + const double e_slabcorr = MY_2PI*(dipole_all*dipole_all/12.0)/volume; + const double qscale = qqrd2e * scale; - if (eflag_global) energy += spscale * e_slabcorr; + if (eflag_global) energy += qscale * e_slabcorr; // per-atom energy if (eflag_atom) { - double efact = spscale * MY_2PI/volume/12.0; - for (int i = 0; i < nlocal; i++) { - spz = sp[i][2]*sp[i][3]; - eatom[i] += efact * spz * spin_all; - } + double efact = qscale * MY_2PI/volume/12.0; + for (int i = 0; i < nlocal; i++) + eatom[i] += efact * mu[i][2]*dipole_all; } - // add on mag. force corrections + // add on torque corrections - double ffact = spscale * (-4.0*MY_PI/volume); - double **fm = atom->fm; - for (int i = 0; i < nlocal; i++) { - fm[i][2] += ffact * spin_all; + if (atom->torque) { + double ffact = qscale * (-4.0*MY_PI/volume); + double **mu = atom->mu; + double **torque = atom->torque; + for (int i = 0; i < nlocal; i++) { + torque[i][0] += ffact * dipole_all * mu[i][1]; + torque[i][1] += -ffact * dipole_all * mu[i][0]; + } } } @@ -2452,7 +2446,7 @@ void PPPMSpin::slabcorr() perform and time the 1d FFTs required for N timesteps ------------------------------------------------------------------------- */ -int PPPMSpin::timing_1d(int n, double &time1d) +int PPPMDipole::timing_1d(int n, double &time1d) { double time1,time2; @@ -2487,7 +2481,7 @@ int PPPMSpin::timing_1d(int n, double &time1d) perform and time the 3d FFTs required for N timesteps ------------------------------------------------------------------------- */ -int PPPMSpin::timing_3d(int n, double &time3d) +int PPPMDipole::timing_3d(int n, double &time3d) { double time1,time2; @@ -2522,7 +2516,7 @@ int PPPMSpin::timing_3d(int n, double &time3d) memory usage of local arrays ------------------------------------------------------------------------- */ -double PPPMSpin::memory_usage() +double PPPMDipole::memory_usage() { double bytes = nmax*3 * sizeof(double); int nbrick = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * @@ -2536,43 +2530,37 @@ double PPPMSpin::memory_usage() if (peratom_allocate_flag) bytes += 21 * nbrick * sizeof(FFT_SCALAR); - if (cg_spin) bytes += cg_spin->memory_usage(); - if (cg_peratom_spin) bytes += cg_peratom_spin->memory_usage(); + if (cg_dipole) bytes += cg_dipole->memory_usage(); + if (cg_peratom_dipole) bytes += cg_peratom_dipole->memory_usage(); return bytes; } /* ---------------------------------------------------------------------- - compute spsum,spsqsum,sp2 - called initially, when particle count changes, when spins are changed + compute musum,musqsum,mu2 + called initially, when particle count changes, when dipoles are changed ------------------------------------------------------------------------- */ -void PPPMSpin::spsum_spsq() +void PPPMDipole::musum_musq() { const int nlocal = atom->nlocal; - spsum = spsqsum = sp2 = 0.0; - if (atom->sp_flag) { - double **sp = atom->sp; - double spx, spy, spz; - double spsum_local(0.0), spsqsum_local(0.0); - - // not exactly the good loop: need to add norm of spins + musum = musqsum = mu2 = 0.0; + if (atom->mu_flag) { + double** mu = atom->mu; + double musum_local(0.0), musqsum_local(0.0); for (int i = 0; i < nlocal; i++) { - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - spsum_local += spx + spy + spz; - spsqsum_local += spx*spx + spy*spy + spz*spz; + musum_local += mu[i][0] + mu[i][1] + mu[i][2]; + musqsum_local += mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]; } - MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); - sp2 = spsqsum * mub2mu0; + mu2 = musqsum * force->qqrd2e; } - if (sp2 == 0 && comm->me == 0) - error->all(FLERR,"Using kspace solver PPPMSpin on system with no spins"); + if (mu2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); } diff --git a/src/KSPACE/pppm_dipole.h b/src/KSPACE/pppm_dipole.h new file mode 100644 index 0000000000..8db28b540a --- /dev/null +++ b/src/KSPACE/pppm_dipole.h @@ -0,0 +1,213 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef KSPACE_CLASS + +KSpaceStyle(pppm/dipole,PPPMDipole) + +#else + +#ifndef LMP_PPPM_DIPOLE_H +#define LMP_PPPM_DIPOLE_H + +#include "pppm.h" + +namespace LAMMPS_NS { + +class PPPMDipole : public PPPM { + public: + PPPMDipole(class LAMMPS *, int, char **); + virtual ~PPPMDipole(); + void init(); + void setup(); + void setup_grid(); + void compute(int, int); + int timing_1d(int, double &); + int timing_3d(int, double &); + double memory_usage(); + + protected: + void set_grid_global(double); + //double newton_raphson_f(); + + void allocate(); + void allocate_peratom(); + void deallocate(); + void deallocate_peratom(); + void compute_gf_denom(); + + void slabcorr(); + + // grid communication + + void pack_forward(int, FFT_SCALAR *, int, int *); + void unpack_forward(int, FFT_SCALAR *, int, int *); + void pack_reverse(int, FFT_SCALAR *, int, int *); + void unpack_reverse(int, FFT_SCALAR *, int, int *); + + // dipole + + FFT_SCALAR ***densityx_brick_dipole,***densityy_brick_dipole,***densityz_brick_dipole; + FFT_SCALAR ***vdxx_brick_dipole,***vdyy_brick_dipole,***vdzz_brick_dipole; + FFT_SCALAR ***vdxy_brick_dipole,***vdxz_brick_dipole,***vdyz_brick_dipole; + FFT_SCALAR ***ux_brick_dipole,***uy_brick_dipole,***uz_brick_dipole; + FFT_SCALAR ***v0x_brick_dipole,***v1x_brick_dipole,***v2x_brick_dipole; + FFT_SCALAR ***v3x_brick_dipole,***v4x_brick_dipole,***v5x_brick_dipole; + FFT_SCALAR ***v0y_brick_dipole,***v1y_brick_dipole,***v2y_brick_dipole; + FFT_SCALAR ***v3y_brick_dipole,***v4y_brick_dipole,***v5y_brick_dipole; + FFT_SCALAR ***v0z_brick_dipole,***v1z_brick_dipole,***v2z_brick_dipole; + FFT_SCALAR ***v3z_brick_dipole,***v4z_brick_dipole,***v5z_brick_dipole; + FFT_SCALAR *work3,*work4; + FFT_SCALAR *densityx_fft_dipole,*densityy_fft_dipole,*densityz_fft_dipole; + class GridComm *cg_dipole; + class GridComm *cg_peratom_dipole; + int only_dipole_flag; + double musum,musqsum,mu2; + double find_gewald_dipole(double, double, bigint, double, double); + double newton_raphson_f_dipole(double, double, bigint, double, double); + double derivf_dipole(double, double, bigint, double, double); + double compute_df_kspace_dipole(double); + double compute_qopt_dipole(); + void compute_gf_dipole(); + void make_rho_dipole(); + void brick2fft_dipole(); + void poisson_ik_dipole(); + void poisson_peratom_dipole(); + void fieldforce_ik_dipole(); + void fieldforce_peratom_dipole(); + double final_accuracy_dipole(double dipole2); + void musum_musq(); + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Cannot (yet) use charges with Kspace style PPPMDipole + +Charge-dipole interactions are not yet implemented in PPPMDipole so this +feature is not yet supported. + +E: Must redefine kspace_style after changing to triclinic box + +Self-explanatory. + +E: Kspace style requires atom attribute mu + +The atom style defined does not have this attribute. + +E: Cannot (yet) use kspace_modify diff ad with dipoles + +This feature is not yet supported. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Cannot yet use triclinic cells with PPPMDipole + +This feature is not yet supported. + +E: Cannot yet use TIP4P with PPPMDipole + +This feature is not yet supported. + +E: Cannot use nonperiodic boundaries with PPPM + +For kspace style pppm, all 3 dimensions must have periodic boundaries +unless you use the kspace_modify command to define a 2d slab with a +non-periodic z dimension. + +E: Incorrect boundaries with slab PPPM + +Must have periodic x,y dimensions and non-periodic z dimension to use +2d slab option with PPPM. + +E: PPPM order cannot be < 2 or > than %d + +This is a limitation of the PPPM implementation in LAMMPS. + +E: KSpace style is incompatible with Pair style + +Setting a kspace style requires that a pair style with matching +long-range dipole components be used. + +W: Reducing PPPM order b/c stencil extends beyond nearest neighbor processor + +This may lead to a larger grid than desired. See the kspace_modify overlap +command to prevent changing of the PPPM order. + +E: PPPM order < minimum allowed order + +The default minimum order is 2. This can be reset by the +kspace_modify minorder command. + +E: PPPM grid stencil extends beyond nearest neighbor processor + +This is not allowed if the kspace_modify overlap setting is no. + +E: KSpace accuracy must be > 0 + +The kspace accuracy designated in the input must be greater than zero. + +E: Could not compute grid size + +The code is unable to compute a grid size consistent with the desired +accuracy. This error should not occur for typical problems. Please +send an email to the developers. + +E: PPPM grid is too large + +The global PPPM grid is larger than OFFSET in one or more dimensions. +OFFSET is currently set to 4096. You likely need to decrease the +requested accuracy. + +E: Could not compute g_ewald + +The Newton-Raphson solver failed to converge to a good value for +g_ewald. This error should not occur for typical problems. Please +send an email to the developers. + +E: Non-numeric box dimensions - simulation unstable + +The box size has apparently blown up. + +E: Out of range atoms - cannot compute PPPM + +One or more atoms are attempting to map their charge to a PPPM grid +point that is not owned by a processor. This is likely for one of two +reasons, both of them bad. First, it may mean that an atom near the +boundary of a processor's sub-domain has moved more than 1/2 the +"neighbor skin distance"_neighbor.html without neighbor lists being +rebuilt and atoms being migrated to new processors. This also means +you may be missing pairwise interactions that need to be computed. +The solution is to change the re-neighboring criteria via the +"neigh_modify"_neigh_modify command. The safest settings are "delay 0 +every 1 check yes". Second, it may mean that an atom has moved far +outside a processor's sub-domain or even the entire simulation box. +This indicates bad physics, e.g. due to highly overlapping atoms, too +large a timestep, etc. + +E: Using kspace solver PPPMDipole on system with no dipoles + +Must have non-zero dipoles with PPPMDipole. + +E: Must use kspace_modify gewald for system with no dipoles + +Self-explanatory. + +*/ diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp new file mode 100644 index 0000000000..4fde7ba101 --- /dev/null +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -0,0 +1,750 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Stan Moore (SNL) + Julien Tranchida (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include "pppm_dipole_spin.h" +#include "atom.h" +#include "comm.h" +#include "gridcomm.h" +#include "neighbor.h" +#include "force.h" +#include "pair.h" +#include "bond.h" +#include "angle.h" +#include "domain.h" +#include "fft3d_wrap.h" +#include "remap_wrap.h" +#include "memory.h" +#include "error.h" +#include "update.h" + +#include "math_const.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; + +#define MAXORDER 7 +#define OFFSET 16384 +#define LARGE 10000.0 +#define SMALL 0.00001 +#define EPS_HOC 1.0e-7 + +enum{REVERSE_SP}; +enum{FORWARD_SP,FORWARD_SP_PERATOM}; + +#ifdef FFT_SINGLE +#define ZEROF 0.0f +#define ONEF 1.0f +#else +#define ZEROF 0.0 +#define ONEF 1.0 +#endif + +/* ---------------------------------------------------------------------- */ + +PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp, int narg, char **arg) : + PPPMDipole(lmp, narg, arg) +{ + dipoleflag = 0; + spinflag = 1; + group_group_enable = 0; + + cg_dipole = NULL; + cg_peratom_dipole = NULL; +} + +/* ---------------------------------------------------------------------- + free all memory +------------------------------------------------------------------------- */ + +PPPMDipoleSpin::~PPPMDipoleSpin() +{ + if (copymode) return; + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + fft1 = NULL; + fft2 = NULL; + remap = NULL; + cg_dipole = NULL; +} + +/* ---------------------------------------------------------------------- + called once before run +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::init() +{ + if (me == 0) { + if (screen) fprintf(screen,"PPPMDipoleSpin initialization ...\n"); + if (logfile) fprintf(logfile,"PPPMDipoleSpin initialization ...\n"); + } + + // error check + + spinflag = atom->sp?1:0; + + triclinic_check(); + + if (triclinic != domain->triclinic) + error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); + + if (domain->dimension == 2) error->all(FLERR, + "Cannot use PPPMDipoleSpin with 2d simulation"); + if (comm->style != 0) + error->universe_all(FLERR,"PPPMDipoleSpin can only currently be used with " + "comm_style brick"); + + if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); + + if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" + " ad with spins"); + + if (spinflag && strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"'metal' units have to be used with spins"); + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipoleSpin"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab PPPMDipoleSpin"); + } + + if (order < 2 || order > MAXORDER) { + char str[128]; + sprintf(str,"PPPMDipoleSpin order cannot be < 2 or > than %d",MAXORDER); + error->all(FLERR,str); + } + + // extract short-range Coulombic cutoff from pair style + + triclinic = domain->triclinic; + if (triclinic) + error->all(FLERR,"Cannot yet use triclinic cells with PPPMDipoleSpin"); + + pair_check(); + + int itmp = 0; + double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + if (p_cutoff == NULL) + error->all(FLERR,"KSpace style is incompatible with Pair style"); + cutoff = *p_cutoff; + + // kspace TIP4P not yet supported + + if (tip4pflag) + error->all(FLERR,"Cannot yet use TIP4P with PPPMDipoleSpin"); + + scale = 1.0; + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + spsum_spsq(); + natoms_original = atom->natoms; + + // set accuracy (force units) from accuracy_relative or accuracy_absolute + + // is two_charge_force still relevant for spin systems? + + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; + else accuracy = accuracy_relative * two_charge_force; + + // free all arrays previously allocated + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + + // setup FFT grid resolution and g_ewald + // normally one iteration thru while loop is all that is required + // if grid stencil does not extend beyond neighbor proc + // or overlap is allowed, then done + // else reduce order and try again + + int (*procneigh)[2] = comm->procneigh; + + GridComm *cgtmp = NULL; + int iteration = 0; + + while (order >= minorder) { + if (iteration && me == 0) + error->warning(FLERR,"Reducing PPPMDipoleSpin order b/c stencil extends " + "beyond nearest neighbor processor"); + + compute_gf_denom(); + set_grid_global(sp2); + set_grid_local(); + if (overlap_allowed) break; + + cgtmp = new GridComm(lmp,world,1,1, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, + procneigh[0][0],procneigh[0][1],procneigh[1][0], + procneigh[1][1],procneigh[2][0],procneigh[2][1]); + cgtmp->ghost_notify(); + if (!cgtmp->ghost_overlap()) break; + delete cgtmp; + + order--; + iteration++; + } + + if (order < minorder) error->all(FLERR,"PPPMDipoleSpin order < minimum allowed order"); + if (!overlap_allowed && cgtmp->ghost_overlap()) + error->all(FLERR,"PPPMDipoleSpin grid stencil extends " + "beyond nearest neighbor processor"); + if (cgtmp) delete cgtmp; + + // adjust g_ewald + + if (!gewaldflag) adjust_gewald(); + + // calculate the final accuracy + + double estimated_accuracy = final_accuracy_dipole(sp2); + + // print stats + + int ngrid_max,nfft_both_max; + MPI_Allreduce(&ngrid,&ngrid_max,1,MPI_INT,MPI_MAX,world); + MPI_Allreduce(&nfft_both,&nfft_both_max,1,MPI_INT,MPI_MAX,world); + + if (me == 0) { + +#ifdef FFT_SINGLE + const char fft_prec[] = "single"; +#else + const char fft_prec[] = "double"; +#endif + + if (screen) { + fprintf(screen," G vector (1/distance) = %g\n",g_ewald); + fprintf(screen," grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm); + fprintf(screen," stencil order = %d\n",order); + fprintf(screen," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(screen," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(screen," using %s precision FFTs\n",fft_prec); + fprintf(screen," 3d grid and FFT values/proc = %d %d\n", + ngrid_max,nfft_both_max); + } + if (logfile) { + fprintf(logfile," G vector (1/distance) = %g\n",g_ewald); + fprintf(logfile," grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm); + fprintf(logfile," stencil order = %d\n",order); + fprintf(logfile," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(logfile," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(logfile," using %s precision FFTs\n",fft_prec); + fprintf(logfile," 3d grid and FFT values/proc = %d %d\n", + ngrid_max,nfft_both_max); + } + } + + // allocate K-space dependent memory + // don't invoke allocate peratom(), will be allocated when needed + + allocate(); + cg_dipole->ghost_notify(); + cg_dipole->setup(); + + // pre-compute Green's function denominator expansion + // pre-compute 1d charge distribution coefficients + + compute_gf_denom(); + compute_rho_coeff(); +} + +/* ---------------------------------------------------------------------- + compute the PPPMDipoleSpin long-range force, energy, virial +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::compute(int eflag, int vflag) +{ + int i,j; + + // set energy/virial flags + // invoke allocate_peratom() if needed for first time + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = evflag_atom = eflag_global = vflag_global = + eflag_atom = vflag_atom = 0; + + if (evflag_atom && !peratom_allocate_flag) { + allocate_peratom(); + cg_peratom_dipole->ghost_notify(); + cg_peratom_dipole->setup(); + } + + // if atom count has changed, update qsum and qsqsum + + if (atom->natoms != natoms_original) { + spsum_spsq(); + natoms_original = atom->natoms; + } + + // return if there are no spins + + if (spsqsum == 0.0) return; + + // convert atoms from box to lamda coords + + boxlo = domain->boxlo; + + // extend size of per-atom arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(part2grid); + nmax = atom->nmax; + memory->create(part2grid,nmax,3,"pppm_spin:part2grid"); + } + + // find grid points for all my particles + // map my particle charge onto my local 3d on-grid density + + particle_map(); + make_rho_spin(); + + // all procs communicate density values from their ghost cells + // to fully sum contribution in their 3d bricks + // remap from 3d decomposition to FFT decomposition + + cg_dipole->reverse_comm(this,REVERSE_SP); + brick2fft_dipole(); + + // compute potential gradient on my FFT grid and + // portion of e_long on this proc's FFT grid + // return gradients (electric fields) in 3d brick decomposition + // also performs per-atom calculations via poisson_peratom() + + poisson_ik_dipole(); + + // all procs communicate E-field values + // to fill ghost cells surrounding their 3d bricks + + cg_dipole->forward_comm(this,FORWARD_SP); + + // extra per-atom energy/virial communication + + if (evflag_atom) { + cg_peratom_dipole->forward_comm(this,FORWARD_SP_PERATOM); + } + + // calculate the force on my particles + + fieldforce_ik_spin(); + + // extra per-atom energy/virial communication + + if (evflag_atom) fieldforce_peratom_spin(); + + // sum global energy across procs and add in volume-dependent term + + const double spscale = mub2mu0 * scale; + const double g3 = g_ewald*g_ewald*g_ewald; + + if (eflag_global) { + double energy_all; + MPI_Allreduce(&energy,&energy_all,1,MPI_DOUBLE,MPI_SUM,world); + energy = energy_all; + + energy *= 0.5*volume; + energy -= spsqsum*2.0*g3/3.0/MY_PIS; + energy *= spscale; + } + + // sum global virial across procs + + if (vflag_global) { + double virial_all[6]; + MPI_Allreduce(virial,virial_all,6,MPI_DOUBLE,MPI_SUM,world); + for (i = 0; i < 6; i++) virial[i] = 0.5*spscale*volume*virial_all[i]; + } + + // per-atom energy/virial + // energy includes self-energy correction + + if (evflag_atom) { + double **sp = atom->sp; + double spx,spy,spz; + int nlocal = atom->nlocal; + int ntotal = nlocal; + + if (eflag_atom) { + for (i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + eatom[i] *= 0.5; + eatom[i] -= (spx*spx + spy*spy + spz*spz)*2.0*g3/3.0/MY_PIS; + eatom[i] *= spscale; + } + } + + if (vflag_atom) { + for (i = 0; i < ntotal; i++) + for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*spscale; + } + } + + // 2d slab correction + + if (slabflag == 1) slabcorr(); +} + +/* ---------------------------------------------------------------------- + create discretized "density" on section of global grid due to my particles + density(x,y,z) = charge "density" at grid points of my 3d brick + (nxlo:nxhi,nylo:nyhi,nzlo:nzhi) is extent of my brick (including ghosts) + in global grid +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::make_rho_spin() +{ + int l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz; + FFT_SCALAR x0,y0,z0; + FFT_SCALAR x1,y1,z1; + FFT_SCALAR x2,y2,z2; + + // clear 3d density array + + memset(&(densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + memset(&(densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + memset(&(densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + + // loop over my charges, add their contribution to nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **sp = atom->sp; + double spx,spy,spz; + double **x = atom->x; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + z0 = delvolinv * spx; + z1 = delvolinv * spy; + z2 = delvolinv * spz; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + y0 = z0*rho1d[2][n]; + y1 = z1*rho1d[2][n]; + y2 = z2*rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + x0 = y0*rho1d[1][m]; + x1 = y1*rho1d[1][m]; + x2 = y2*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + densityx_brick_dipole[mz][my][mx] += x0*rho1d[0][l]; + densityy_brick_dipole[mz][my][mx] += x1*rho1d[0][l]; + densityz_brick_dipole[mz][my][mx] += x2*rho1d[0][l]; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + interpolate from grid to get magnetic field & force on my particles for ik +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::fieldforce_ik_spin() +{ + int i,l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz; + FFT_SCALAR x0,y0,z0; + FFT_SCALAR ex,ey,ez; + FFT_SCALAR vxx,vyy,vzz,vxy,vxz,vyz; + + // loop over my charges, interpolate electric field from nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **sp = atom->sp; + double spx,spy,spz; + double **x = atom->x; + double **f = atom->f; + double **fm = atom->fm; + + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) { + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + ex = ey = ez = ZEROF; + vxx = vyy = vzz = vxy = vxz = vyz = ZEROF; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + z0 = rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + y0 = z0*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + x0 = y0*rho1d[0][l]; + ex -= x0*ux_brick_dipole[mz][my][mx]; + ey -= x0*uy_brick_dipole[mz][my][mx]; + ez -= x0*uz_brick_dipole[mz][my][mx]; + vxx -= x0*vdxx_brick_dipole[mz][my][mx]; + vyy -= x0*vdyy_brick_dipole[mz][my][mx]; + vzz -= x0*vdzz_brick_dipole[mz][my][mx]; + vxy -= x0*vdxy_brick_dipole[mz][my][mx]; + vxz -= x0*vdxz_brick_dipole[mz][my][mx]; + vyz -= x0*vdyz_brick_dipole[mz][my][mx]; + } + } + } + + // convert M-field to mech. and mag. forces + + const double spfactor = mub2mu0 * scale; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + f[i][0] += spfactor*(vxx*spx + vxy*spy + vxz*spz); + f[i][1] += spfactor*(vxy*spx + vyy*spy + vyz*spz); + f[i][2] += spfactor*(vxz*spx + vyz*spy + vzz*spz); + + const double spfactorh = mub2mu0hbinv * scale; + fm[i][0] += spfactorh*ex; + fm[i][1] += spfactorh*ey; + fm[i][2] += spfactorh*ez; + + // create a new vector (in atom_spin style ?) to store long-range fm tables + + } +} + +/* ---------------------------------------------------------------------- + interpolate from grid to get per-atom energy/virial +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::fieldforce_peratom_spin() +{ + int i,l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz,x0,y0,z0; + FFT_SCALAR ux,uy,uz; + FFT_SCALAR v0x,v1x,v2x,v3x,v4x,v5x; + FFT_SCALAR v0y,v1y,v2y,v3y,v4y,v5y; + FFT_SCALAR v0z,v1z,v2z,v3z,v4z,v5z; + + // loop over my charges, interpolate from nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **sp = atom->sp; + double spx,spy,spz; + double **x = atom->x; + + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) { + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + ux = uy = uz = ZEROF; + v0x = v1x = v2x = v3x = v4x = v5x = ZEROF; + v0y = v1y = v2y = v3y = v4y = v5y = ZEROF; + v0z = v1z = v2z = v3z = v4z = v5z = ZEROF; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + z0 = rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + y0 = z0*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + x0 = y0*rho1d[0][l]; + if (eflag_atom) { + ux += x0*ux_brick_dipole[mz][my][mx]; + uy += x0*uy_brick_dipole[mz][my][mx]; + uz += x0*uz_brick_dipole[mz][my][mx]; + } + if (vflag_atom) { + v0x += x0*v0x_brick_dipole[mz][my][mx]; + v1x += x0*v1x_brick_dipole[mz][my][mx]; + v2x += x0*v2x_brick_dipole[mz][my][mx]; + v3x += x0*v3x_brick_dipole[mz][my][mx]; + v4x += x0*v4x_brick_dipole[mz][my][mx]; + v5x += x0*v5x_brick_dipole[mz][my][mx]; + v0y += x0*v0y_brick_dipole[mz][my][mx]; + v1y += x0*v1y_brick_dipole[mz][my][mx]; + v2y += x0*v2y_brick_dipole[mz][my][mx]; + v3y += x0*v3y_brick_dipole[mz][my][mx]; + v4y += x0*v4y_brick_dipole[mz][my][mx]; + v5y += x0*v5y_brick_dipole[mz][my][mx]; + v0z += x0*v0z_brick_dipole[mz][my][mx]; + v1z += x0*v1z_brick_dipole[mz][my][mx]; + v2z += x0*v2z_brick_dipole[mz][my][mx]; + v3z += x0*v3z_brick_dipole[mz][my][mx]; + v4z += x0*v4z_brick_dipole[mz][my][mx]; + v5z += x0*v5z_brick_dipole[mz][my][mx]; + } + } + } + } + + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + if (eflag_atom) eatom[i] += spx*ux + spy*uy + spz*uz; + if (vflag_atom) { + vatom[i][0] += spx*v0x + spy*v0y + spz*v0z; + vatom[i][1] += spx*v1x + spy*v1y + spz*v1z; + vatom[i][2] += spx*v2x + spy*v2y + spz*v2z; + vatom[i][3] += spx*v3x + spy*v3y + spz*v3z; + vatom[i][4] += spx*v4x + spy*v4y + spz*v4z; + vatom[i][5] += spx*v5x + spy*v5y + spz*v5z; + } + } +} + +/* ---------------------------------------------------------------------- + Slab-geometry correction term to dampen inter-slab interactions between + periodically repeating slabs. Yields good approximation to 2D Ewald if + adequate empty space is left between repeating slabs (J. Chem. Phys. + 111, 3155). Slabs defined here to be parallel to the xy plane. Also + extended to non-neutral systems (J. Chem. Phys. 131, 094107). +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::slabcorr() +{ + // compute local contribution to global spin moment + + double **x = atom->x; + double zprd = domain->zprd; + int nlocal = atom->nlocal; + + double spin = 0.0; + double **sp = atom->sp; + double spx,spy,spz; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + spin += spz; + } + + // sum local contributions to get global spin moment + + double spin_all; + MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); + + // compute corrections + + const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; + const double spscale = mub2mu0 * scale; + + if (eflag_global) energy += spscale * e_slabcorr; + + // per-atom energy + + if (eflag_atom) { + double efact = spscale * MY_2PI/volume/12.0; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + eatom[i] += efact * spz * spin_all; + } + } + + // add on mag. force corrections + + double ffact = spscale * (-4.0*MY_PI/volume); + double **fm = atom->fm; + for (int i = 0; i < nlocal; i++) { + fm[i][2] += ffact * spin_all; + } +} + +/* ---------------------------------------------------------------------- + compute spsum,spsqsum,sp2 + called initially, when particle count changes, when spins are changed +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::spsum_spsq() +{ + const int nlocal = atom->nlocal; + + spsum = spsqsum = sp2 = 0.0; + if (atom->sp_flag) { + double **sp = atom->sp; + double spx, spy, spz; + double spsum_local(0.0), spsqsum_local(0.0); + + // not exactly the good loop: need to add norm of spins + + for (int i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + spsum_local += spx + spy + spz; + spsqsum_local += spx*spx + spy*spy + spz*spz; + } + + MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); + + sp2 = spsqsum * mub2mu0; + } + + if (sp2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMDipoleSpin on system with no spins"); +} diff --git a/src/KSPACE/pppm_spin.h b/src/KSPACE/pppm_dipole_spin.h similarity index 66% rename from src/KSPACE/pppm_spin.h rename to src/KSPACE/pppm_dipole_spin.h index 3b4d42d4ea..347006e586 100644 --- a/src/KSPACE/pppm_spin.h +++ b/src/KSPACE/pppm_dipole_spin.h @@ -13,28 +13,23 @@ #ifdef KSPACE_CLASS -KSpaceStyle(pppm/spin,PPPMSpin) +KSpaceStyle(pppm/dipole/spin,PPPMDipoleSpin) #else -#ifndef LMP_PPPM_DIPOLE_H -#define LMP_PPPM_DIPOLE_H +#ifndef LMP_PPPM_DIPOLE_SPIN_H +#define LMP_PPPM_DIPOLE_SPIN_H -#include "pppm.h" +#include "pppm_dipole.h" namespace LAMMPS_NS { -class PPPMSpin : public PPPM { +class PPPMDipoleSpin : public PPPMDipole { public: - PPPMSpin(class LAMMPS *, int, char **); - virtual ~PPPMSpin(); + PPPMDipoleSpin(class LAMMPS *, int, char **); + virtual ~PPPMDipoleSpin(); void init(); - void setup(); - void setup_grid(); void compute(int, int); - int timing_1d(int, double &); - int timing_3d(int, double &); - double memory_usage(); protected: double hbar; // reduced Planck's constant @@ -42,55 +37,15 @@ class PPPMSpin : public PPPM { double mu_0; // vacuum permeability double mub2mu0; // prefactor for mech force double mub2mu0hbinv; // prefactor for mag force - void set_grid_global(); - double newton_raphson_f(); - - void allocate(); - void allocate_peratom(); - void deallocate(); - void deallocate_peratom(); - void compute_gf_denom(); void slabcorr(); - // grid communication - - void pack_forward(int, FFT_SCALAR *, int, int *); - void unpack_forward(int, FFT_SCALAR *, int, int *); - void pack_reverse(int, FFT_SCALAR *, int, int *); - void unpack_reverse(int, FFT_SCALAR *, int, int *); - // spin - FFT_SCALAR ***densityx_brick_spin,***densityy_brick_spin,***densityz_brick_spin; - FFT_SCALAR ***vdxx_brick_spin,***vdyy_brick_spin,***vdzz_brick_spin; - FFT_SCALAR ***vdxy_brick_spin,***vdxz_brick_spin,***vdyz_brick_spin; - FFT_SCALAR ***ux_brick_spin,***uy_brick_spin,***uz_brick_spin; - FFT_SCALAR ***v0x_brick_spin,***v1x_brick_spin,***v2x_brick_spin; - FFT_SCALAR ***v3x_brick_spin,***v4x_brick_spin,***v5x_brick_spin; - FFT_SCALAR ***v0y_brick_spin,***v1y_brick_spin,***v2y_brick_spin; - FFT_SCALAR ***v3y_brick_spin,***v4y_brick_spin,***v5y_brick_spin; - FFT_SCALAR ***v0z_brick_spin,***v1z_brick_spin,***v2z_brick_spin; - FFT_SCALAR ***v3z_brick_spin,***v4z_brick_spin,***v5z_brick_spin; - FFT_SCALAR *work3,*work4; - FFT_SCALAR *densityx_fft_spin,*densityy_fft_spin,*densityz_fft_spin; - class GridComm *cg_spin; - class GridComm *cg_peratom_spin; - int only_spin_flag; double spsum,spsqsum,sp2; - double find_gewald_spin(double, double, bigint, double, double); - double newton_raphson_f_spin(double, double, bigint, double, double); - double derivf_spin(double, double, bigint, double, double); - double compute_df_kspace_spin(); - double compute_qopt_spin(); - void compute_gf_spin(); void make_rho_spin(); - void brick2fft_spin(); - void poisson_ik_spin(); - void poisson_peratom_spin(); void fieldforce_ik_spin(); void fieldforce_peratom_spin(); - double final_accuracy_spin(); void spsum_spsq(); }; @@ -102,9 +57,9 @@ class PPPMSpin : public PPPM { /* ERROR/WARNING messages: -E: Cannot (yet) use charges with Kspace style PPPMSpin +E: Cannot (yet) use charges with Kspace style PPPMDipoleSpin -Charge-spin interactions are not yet implemented in PPPMSpin so this +Charge-spin interactions are not yet implemented in PPPMDipoleSpin so this feature is not yet supported. E: Must redefine kspace_style after changing to triclinic box @@ -123,11 +78,11 @@ E: Cannot (yet) use 'electron' units with spins This feature is not yet supported. -E: Cannot yet use triclinic cells with PPPMSpin +E: Cannot yet use triclinic cells with PPPMDipoleSpin This feature is not yet supported. -E: Cannot yet use TIP4P with PPPMSpin +E: Cannot yet use TIP4P with PPPMDipoleSpin This feature is not yet supported. @@ -207,9 +162,9 @@ outside a processor's sub-domain or even the entire simulation box. This indicates bad physics, e.g. due to highly overlapping atoms, too large a timestep, etc. -E: Using kspace solver PPPMSpin on system with no spins +E: Using kspace solver PPPMDipoleSpin on system with no spins -Must have non-zero spins with PPPMSpin. +Must have non-zero spins with PPPMDipoleSpin. E: Must use kspace_modify gewald for system with no spins diff --git a/src/SPIN/atom_vec_spin.cpp b/src/SPIN/atom_vec_spin.cpp index 6460a6185f..fb2b6dd797 100644 --- a/src/SPIN/atom_vec_spin.cpp +++ b/src/SPIN/atom_vec_spin.cpp @@ -48,7 +48,7 @@ AtomVecSpin::AtomVecSpin(LAMMPS *lmp) : AtomVec(lmp) comm_x_only = 0; comm_f_only = 0; size_forward = 7; - size_reverse = 6; + size_reverse = 9; size_border = 10; size_velocity = 3; size_data_atom = 9; @@ -58,7 +58,6 @@ AtomVecSpin::AtomVecSpin(LAMMPS *lmp) : AtomVec(lmp) atom->sp_flag = 1; } - /* ---------------------------------------------------------------------- grow atom arrays n = 0 grows arrays by a chunk @@ -88,6 +87,7 @@ void AtomVecSpin::grow(int n) sp = memory->grow(atom->sp,nmax,4,"atom:sp"); fm = memory->grow(atom->fm,nmax*comm->nthreads,3,"atom:fm"); + fm_long = memory->grow(atom->fm_long,nmax*comm->nthreads,3,"atom:fm_long"); if (atom->nextra_grow) for (int iextra = 0; iextra < atom->nextra_grow; iextra++) @@ -103,7 +103,7 @@ void AtomVecSpin::grow_reset() tag = atom->tag; type = atom->type; mask = atom->mask; image = atom->image; x = atom->x; v = atom->v; f = atom->f; - sp = atom->sp; fm = atom->fm; + sp = atom->sp; fm = atom->fm; fm_long = atom->fm_long; } @@ -342,6 +342,9 @@ int AtomVecSpin::pack_reverse(int n, int first, double *buf) buf[m++] = fm[i][0]; buf[m++] = fm[i][1]; buf[m++] = fm[i][2]; + buf[m++] = fm_long[i][0]; + buf[m++] = fm_long[i][1]; + buf[m++] = fm_long[i][2]; } return m; @@ -361,6 +364,9 @@ void AtomVecSpin::unpack_reverse(int n, int *list, double *buf) fm[j][0] += buf[m++]; fm[j][1] += buf[m++]; fm[j][2] += buf[m++]; + fm_long[j][0] += buf[m++]; + fm_long[j][1] += buf[m++]; + fm_long[j][2] += buf[m++]; } } @@ -939,6 +945,7 @@ bigint AtomVecSpin::memory_usage() if (atom->memcheck("sp")) bytes += memory->usage(sp,nmax,4); if (atom->memcheck("fm")) bytes += memory->usage(fm,nmax*comm->nthreads,3); + if (atom->memcheck("fm_long")) bytes += memory->usage(fm_long,nmax*comm->nthreads,3); return bytes; } @@ -947,6 +954,7 @@ void AtomVecSpin::force_clear(int n, size_t nbytes) { memset(&atom->f[0][0],0,3*nbytes); memset(&atom->fm[0][0],0,3*nbytes); + memset(&atom->fm_long[0][0],0,3*nbytes); } diff --git a/src/SPIN/atom_vec_spin.h b/src/SPIN/atom_vec_spin.h index 34bc55b99f..1f1c34df52 100644 --- a/src/SPIN/atom_vec_spin.h +++ b/src/SPIN/atom_vec_spin.h @@ -68,10 +68,12 @@ class AtomVecSpin : public AtomVec { int *type,*mask; imageint *image; double **x,**v,**f; // lattice quantities - double **sp,**fm; // spin quantities - // sp[i][0-2] direction of the spin i + + // spin quantities + double **sp; // sp[i][0-2] direction of the spin i // sp[i][3] atomic magnetic moment of the spin i - + double **fm; // fm[i][0-2] direction of magnetic precession + double **fm_long; // storage of long-range spin prec. components }; } diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index cc074bb97d..74570afbce 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -441,8 +441,6 @@ void PairSpinExchange::allocate() memory->create(cutsq,n+1,n+1,"pair:cutsq"); } - - /* ---------------------------------------------------------------------- proc 0 writes to restart file ------------------------------------------------------------------------- */ @@ -527,4 +525,3 @@ void PairSpinExchange::read_restart_settings(FILE *fp) MPI_Bcast(&offset_flag,1,MPI_INT,0,world); MPI_Bcast(&mix_flag,1,MPI_INT,0,world); } - diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp index 95c4e6b5a9..ca4f3d5e24 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_long.cpp @@ -13,19 +13,19 @@ /* ------------------------------------------------------------------------ Contributing authors: Julien Tranchida (SNL) - Stan Moore (SNL) - - Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. -------------------------------------------------------------------------- */ + Aidan Thompson (SNL) + Please cite the related publication: + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. +------------------------------------------------------------------------- */ #include #include #include #include + #include "pair_spin_long.h" #include "atom.h" #include "comm.h" @@ -80,10 +80,154 @@ PairSpinLong::~PairSpinLong() { if (allocated) { memory->destroy(setflag); - memory->destroy(cutsq); + memory->destroy(cut_spin_long); } } +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSpinLong::settings(int narg, char **arg) +{ + if (narg < 1 || narg > 2) + error->all(FLERR,"Incorrect args in pair_style command"); + + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"Spin simulations require metal unit style"); + + cut_spin_long_global = force->numeric(FLERR,arg[0]); + //cut_spin = force->numeric(FLERR,arg[0]); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i+1; j <= atom->ntypes; j++) { + if (setflag[i][j]) { + cut_spin_long[i][j] = cut_spin_long_global; + } + } + } + } + +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSpinLong::coeff(int narg, char **arg) +{ + if (!allocated) allocate(); + + // check if args correct + + if (strcmp(arg[2],"long") != 0) + error->all(FLERR,"Incorrect args in pair_style command"); + if (narg != 3) + error->all(FLERR,"Incorrect args in pair_style command"); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double spin_long_cut_one = force->numeric(FLERR,arg[3]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + setflag[i][j] = 1; + cut_spin_long[i][j] = spin_long_cut_one; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSpinLong::init_style() +{ + if (!atom->sp_flag) + error->all(FLERR,"Pair spin requires atom/spin style"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + // checking if nve/spin is a listed fix + + int ifix = 0; + while (ifix < modify->nfix) { + if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + ifix++; + } + if (ifix == modify->nfix) + error->all(FLERR,"pair/spin style requires nve/spin"); + + // get the lattice_flag from nve/spin + + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { + lockfixnvespin = (FixNVESpin *) modify->fix[i]; + lattice_flag = lockfixnvespin->lattice_flag; + } + } + + // insure use of KSpace long-range solver, set g_ewald + + if (force->kspace == NULL) + error->all(FLERR,"Pair style requires a KSpace style"); + + g_ewald = force->kspace->g_ewald; + +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSpinLong::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + cut_spin_long[j][i] = cut_spin_long[i][j]; + + return cut_spin_long_global; +} + +/* ---------------------------------------------------------------------- + extract the larger cutoff if "cut" or "cut_coul" +------------------------------------------------------------------------- */ + +void *PairSpinLong::extract(const char *str, int &dim) +{ + if (strcmp(str,"cut") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"ewald_order") == 0) { + ewald_order = 0; + ewald_order |= 1<<1; + ewald_order |= 1<<3; + dim = 0; + return (void *) &ewald_order; + } else if (strcmp(str,"ewald_mix") == 0) { + dim = 0; + return (void *) &mix_flag; + } + return NULL; +} + /* ---------------------------------------------------------------------- */ void PairSpinLong::compute(int eflag, int vflag) @@ -95,6 +239,7 @@ void PairSpinLong::compute(int eflag, int vflag) double evdwl,ecoul; double xi[3],rij[3]; double spi[4],spj[4],fi[3],fmi[3]; + double local_cut2; double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; @@ -156,26 +301,25 @@ void PairSpinLong::compute(int eflag, int vflag) rij[2] = x[j][2] - xi[2]; rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - if (rsq < cutsq[itype][jtype]) { + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { r2inv = 1.0/rsq; rinv = sqrt(r2inv); - if (rsq < cut_spinsq) { - r = sqrt(rsq); - grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - bij[0] = erfc * rinv; - bij[1] = (bij[0] + pre1*expm2) * r2inv; - bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; - bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - compute_long(i,j,rij,bij,fmi,spi,spj); - compute_long_mech(i,j,rij,bij,fmi,spi,spj); - - } + compute_long(i,j,rij,bij,fmi,spi,spj); + compute_long_mech(i,j,rij,bij,fmi,spi,spj); } // force accumulation @@ -194,7 +338,7 @@ void PairSpinLong::compute(int eflag, int vflag) } if (eflag) { - if (rsq <= cut_spinsq) { + if (rsq <= local_cut2) { evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]; evdwl *= hbar; @@ -219,6 +363,7 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) double r,rinv,r2inv,rsq; double grij,expm2,t,erfc; double bij[4],xi[3],rij[3],spi[4],spj[4]; + double local_cut2; double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; @@ -267,25 +412,24 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) rij[2] = x[j][2] - xi[2]; rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - if (rsq < cutsq[itype][jtype]) { + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { r2inv = 1.0/rsq; rinv = sqrt(r2inv); - if (rsq < cut_spinsq) { - r = sqrt(rsq); - grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - bij[0] = erfc * rinv; - bij[1] = (bij[0] + pre1*expm2) * r2inv; - bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; - bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - compute_long(i,j,rij,bij,fmi,spi,spj); - - } + compute_long(i,j,rij,bij,fmi,spi,spj); } } @@ -361,111 +505,7 @@ void PairSpinLong::allocate() for (int j = i; j <= n; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairSpinLong::settings(int narg, char **arg) -{ - if (narg < 1 || narg > 2) - error->all(FLERR,"Incorrect args in pair_style command"); - - if (strcmp(update->unit_style,"metal") != 0) - error->all(FLERR,"Spin simulations require metal unit style"); - - cut_spin = force->numeric(FLERR,arg[0]); - -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairSpinLong::coeff(int narg, char **arg) -{ - if (narg < 4 || narg > 5) - error->all(FLERR,"Incorrect args for pair coefficients"); - if (!allocated) allocate(); - - // check if args correct - - if (strcmp(arg[2],"long") != 0) - error->all(FLERR,"Incorrect args in pair_style command"); - if (narg != 3) - error->all(FLERR,"Incorrect args in pair_style command"); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - setflag[i][j] = 1; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairSpinLong::init_one(int i, int j) -{ - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - - double cut = cut_spin; - return cut; -} - -/* ---------------------------------------------------------------------- - init specific to this pair style -------------------------------------------------------------------------- */ - -void PairSpinLong::init_style() -{ - if (!atom->sp_flag) - error->all(FLERR,"Pair spin requires atom/spin style"); - - // need a full neighbor list - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - - // checking if nve/spin is a listed fix - - int ifix = 0; - while (ifix < modify->nfix) { - if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; - ifix++; - } - if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); - - // get the lattice_flag from nve/spin - - for (int i = 0; i < modify->nfix; i++) { - if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { - lockfixnvespin = (FixNVESpin *) modify->fix[i]; - lattice_flag = lockfixnvespin->lattice_flag; - } - } - - // insure use of KSpace long-range solver, set g_ewald - - if (force->kspace == NULL) - error->all(FLERR,"Pair style requires a KSpace style"); - - g_ewald = force->kspace->g_ewald; - - cut_spinsq = cut_spin * cut_spin; + memory->create(cut_spin_long,n+1,n+1,"pair:cut_spin_long"); } /* ---------------------------------------------------------------------- @@ -477,10 +517,14 @@ void PairSpinLong::write_restart(FILE *fp) write_restart_settings(fp); int i,j; - for (i = 1; i <= atom->ntypes; i++) + for (i = 1; i <= atom->ntypes; i++) { for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&cut_spin_long[i][j],sizeof(int),1,fp); + } } + } } /* ---------------------------------------------------------------------- @@ -495,11 +539,18 @@ void PairSpinLong::read_restart(FILE *fp) int i,j; int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) + for (i = 1; i <= atom->ntypes; i++) { for (j = i; j <= atom->ntypes; j++) { if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&cut_spin_long[i][j],sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); + } } + } } /* ---------------------------------------------------------------------- @@ -508,7 +559,7 @@ void PairSpinLong::read_restart(FILE *fp) void PairSpinLong::write_restart_settings(FILE *fp) { - fwrite(&cut_spin,sizeof(double),1,fp); + fwrite(&cut_spin_long_global,sizeof(double),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); } @@ -519,32 +570,9 @@ void PairSpinLong::write_restart_settings(FILE *fp) void PairSpinLong::read_restart_settings(FILE *fp) { if (comm->me == 0) { - fread(&cut_spin,sizeof(double),1,fp); + fread(&cut_spin_long_global,sizeof(double),1,fp); fread(&mix_flag,sizeof(int),1,fp); } - MPI_Bcast(&cut_spin,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_spin_long_global,1,MPI_DOUBLE,0,world); MPI_Bcast(&mix_flag,1,MPI_INT,0,world); } - -/* ---------------------------------------------------------------------- */ - -void *PairSpinLong::extract(const char *str, int &dim) -{ - if (strcmp(str,"cut") == 0) { - dim = 0; - return (void *) &cut_spin; - } else if (strcmp(str,"cut_coul") == 0) { - dim = 0; - return (void *) &cut_spin; - } else if (strcmp(str,"ewald_order") == 0) { - ewald_order = 0; - ewald_order |= 1<<1; - ewald_order |= 1<<3; - dim = 0; - return (void *) &ewald_order; - } else if (strcmp(str,"ewald_mix") == 0) { - dim = 0; - return (void *) &mix_flag; - } - return NULL; -} diff --git a/src/SPIN/pair_spin_long.h b/src/SPIN/pair_spin_long.h index 867b771f74..0cdf6d2b80 100644 --- a/src/SPIN/pair_spin_long.h +++ b/src/SPIN/pair_spin_long.h @@ -49,6 +49,8 @@ class PairSpinLong : public PairSpin { void read_restart(FILE *); void write_restart_settings(FILE *); void read_restart_settings(FILE *); + + double cut_spin_long_global; // global long cutoff distance protected: double hbar; // reduced Planck's constant @@ -56,7 +58,8 @@ class PairSpinLong : public PairSpin { double mu_0; // vacuum permeability double mub2mu0; // prefactor for mech force double mub2mu0hbinv; // prefactor for mag force - double cut_spin, cut_spinsq; + + double **cut_spin_long; // cutoff distance long double g_ewald; int ewald_order; From cf1d421e10cf384098210c32cf3ea2374baf55e9 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 23 Aug 2018 15:18:30 -0600 Subject: [PATCH 05/90] Commit JT 082318 - corrected memory errors in pppm_dipole and pppm_dipole_spin - created fm_long in atom_vec_spin - fm_long added to fm in initial_integrate (in ComputeInteractionsSpin) --- .../SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy | 1 + .../exchange_fit_hcp_co/exchange_fit.py | 32 +++++++ .../exchange_fit_hcp_co/exchange_hcp_co.dat | 9 ++ examples/SPIN/pppm_spin/in.dipole.pppm_dipole | 55 +++++++++++ examples/SPIN/pppm_spin/in.spin.pppm_spin | 61 ++++++++++++ src/KSPACE/pppm.cpp | 6 +- src/KSPACE/pppm_dipole.cpp | 93 +++++++++---------- src/KSPACE/pppm_dipole.h | 8 +- src/KSPACE/pppm_dipole_spin.cpp | 84 +++++++++-------- src/KSPACE/pppm_dipole_spin.h | 1 - src/SPIN/atom_vec_spin.cpp | 1 - src/SPIN/fix_nve_spin.cpp | 18 ++++ src/SPIN/fix_nve_spin.h | 3 +- src/SPIN/pair_spin_long.cpp | 11 ++- src/atom.cpp | 3 +- src/atom.h | 1 + src/pair.h | 2 +- 17 files changed, 288 insertions(+), 101 deletions(-) create mode 120000 examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy create mode 100644 examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py create mode 100644 examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat create mode 100644 examples/SPIN/pppm_spin/in.dipole.pppm_dipole create mode 100644 examples/SPIN/pppm_spin/in.spin.pppm_spin diff --git a/examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy b/examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy new file mode 120000 index 0000000000..6a47c9eebe --- /dev/null +++ b/examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy @@ -0,0 +1 @@ +../cobalt_fcc/Co_PurjaPun_2012.eam.alloy \ No newline at end of file diff --git a/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py new file mode 100644 index 0000000000..fa7dba417e --- /dev/null +++ b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py @@ -0,0 +1,32 @@ +#Program fitting the exchange interaction +#Model curve: Bethe-Slater function +import numpy as np, pylab, tkinter +import matplotlib.pyplot as plt +from scipy.optimize import curve_fit +from decimal import * + +print("Loop begin") + +#Definition of the Bethe-Slater function +def func(x,a,b,c): + return 4*a*((x/c)**2)*(1-b*(x/c)**2)*np.exp(-(x/c)**2) + +#Exchange coeff table (data to fit) +rdata, Jdata = np.loadtxt('exchange_hcp_co.dat', usecols=(0,1), unpack=True) +plt.plot(rdata, Jdata, 'b-', label='data') + +#Perform the fit +popt, pcov = curve_fit(func, rdata, Jdata, bounds=(0, [500.,5.,5.])) +plt.plot(rdata, func(rdata, *popt), 'r--', label='fit') + +#Print the fitted params +print("Parameters: a={:.10} (in meV), b={:.10} (adim), c={:.10} (in Ang)".format(*popt)) + +#Ploting the result +plt.xlabel('r_ij') +pylab.xlim([0,6.5]) +plt.ylabel('J_ij') +plt.legend() +plt.show() + +print("Loop end") diff --git a/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat new file mode 100644 index 0000000000..0968fa3edb --- /dev/null +++ b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat @@ -0,0 +1,9 @@ +2.25569176882662 73.37931034482759 +2.3817863397548162 47.99999999999999 +2.4518388791593697 34.39080459770115 +2.507880910683012 31.816091954022987 +2.5359019264448337 28.137931034482747 +2.5779334500875657 25.011494252873554 +2.6339754816112086 19.126436781609186 +2.760070052539404 13.241379310344826 +3.5446584938704033 6.068965517241367 diff --git a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole new file mode 100644 index 0000000000..804ddad1e2 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole @@ -0,0 +1,55 @@ +# 3d Lennard-Jones melt + +units lj +#atom_style charge +atom_style hybrid sphere dipole +processors * 1 1 + +lattice fcc 0.8442 +#region box block 0 10 0 10 0 10 +region box block 0 5 0 5 0 5 +create_box 3 box +create_atoms 1 box +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +set group all dipole/random 98934 0.75 +#set type 1:2 charge 0.0 + +velocity all create 1.0 87287 + +#pair_style lj/long/coul/long long off 2.5 +#pair_coeff * * 1.0 1.0 2.5 +#pair_coeff * 2 1.0 1.0 5.0 +pair_style lj/cut/dipole/long 3.0 +pair_coeff * * 1.0 1.0 + +#kspace_style pppm/disp 1.0e-4 +kspace_style pppm/dipole 1.0e-4 +kspace_modify gewald/disp 0.1 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +group fast type 1 +group slow type 2 +fix 0 all balance 20 1.0 shift x 5 1.0 & + weight group 2 fast 1.0 slow 2.0 weight time 0.66 + +fix 1 all nve + +#dump id all atom 50 dump.melt + +#dump 2 all image 25 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +#thermo 50 +thermo 1 +#run 500 +run 5 diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin new file mode 100644 index 0000000000..87d18f4d16 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -0,0 +1,61 @@ +# hcp cobalt in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice hcp 2.5071 +region box block 0.0 20.0 0.0 20.0 0.0 8.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for hcp cobalt + +mass 1 58.93 + +#set group all spin/random 31 1.72 +set group all spin 1.72 0.0 0.0 1.0 +velocity all create 100 4928459 rot yes dist gaussian + +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 +pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * spin/long long 8.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +kspace_style pppm/dipole/spin 1.0e-4 + +#fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 +fix 3 all nve/spin lattice yes + +timestep 0.0001 + + +compute out_mag all compute/spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo_style custom step time v_magnorm v_emag temp etotal +thermo 10 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +run 20000 diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 132389b7d6..8eec8e2542 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -100,6 +100,9 @@ PPPM::PPPM(LAMMPS *lmp, int narg, char **arg) : KSpace(lmp, narg, arg), nyhi_in = nylo_in = nyhi_out = nylo_out = 0; nzhi_in = nzlo_in = nzhi_out = nzlo_out = 0; + // test + nlower = nupper = 0; + density_brick = vdx_brick = vdy_brick = vdz_brick = NULL; density_fft = NULL; u_brick = NULL; @@ -1428,12 +1431,13 @@ void PPPM::set_grid_local() double zprd = prd[2]; double zprd_slab = zprd*slab_volfactor; - double dist[3]; + double dist[3] = {0.0,0.0,0.0}; double cuthalf = 0.5*neighbor->skin + qdist; if (triclinic == 0) dist[0] = dist[1] = dist[2] = cuthalf; else kspacebbox(cuthalf,&dist[0]); int nlo,nhi; + nlo = nhi = 0; nlo = static_cast ((sublo[0]-dist[0]-boxlo[0]) * nx_pppm/xprd + shift) - OFFSET; diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index a03f5b9980..4d2b594af8 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -116,9 +116,10 @@ void PPPMDipole::init() // error check dipoleflag = atom->mu?1:0; - qsum_qsq(0); + qsum_qsq(0); // q[i] might not be declared ? + if (dipoleflag && q2) - error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMDipole"); + error->all(FLERR,"Cannot (yet) use charges with Kspace style PPPMDipole"); triclinic_check(); @@ -168,7 +169,9 @@ void PPPMDipole::init() cutoff = *p_cutoff; // kspace TIP4P not yet supported + // qdist = offset only for TIP4P fictitious charge + qdist = 0.0; if (tip4pflag) error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); @@ -206,7 +209,7 @@ void PPPMDipole::init() "beyond nearest neighbor processor"); compute_gf_denom(); - set_grid_global(mu2); + set_grid_global(); set_grid_local(); if (overlap_allowed) break; @@ -235,7 +238,7 @@ void PPPMDipole::init() // calculate the final accuracy - double estimated_accuracy = final_accuracy_dipole(mu2); + double estimated_accuracy = final_accuracy_dipole(); // print stats @@ -607,7 +610,7 @@ void PPPMDipole::allocate() // summation coeffs order_allocated = order; - memory->create(gf_b,order,"pppm_dipole:gf_b"); + if (!gf_b) memory->create(gf_b,order,"pppm_dipole:gf_b"); memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_dipole:rho1d"); memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_dipole:drho1d"); memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_dipole:rho_coeff"); @@ -791,7 +794,8 @@ void PPPMDipole::deallocate_peratom() used for charge accumulation, FFTs, and electric field interpolation ------------------------------------------------------------------------- */ -void PPPMDipole::set_grid_global(double dipole2) +//void PPPMDipole::set_grid_global(double dipole2) +void PPPMDipole::set_grid_global() { // use xprd,yprd,zprd // adjust z dimension for 2d slab PPPMDipole @@ -813,14 +817,11 @@ void PPPMDipole::set_grid_global(double dipole2) if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); - //if (mu2 == 0.0) - if (dipole2 == 0.0) + if (mu2 == 0.0) error->all(FLERR,"Must use kspace_modify gewald for systems with no dipoles"); g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; - //Try Newton Solver double g_ewald_new = - find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,dipole2); - //find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; else error->warning(FLERR,"PPPMDipole dipole Newton solver failed, " "using old method to estimate g_ewald"); @@ -837,6 +838,7 @@ void PPPMDipole::set_grid_global(double dipole2) while (1) { // set grid dimension + nx_pppm = static_cast (xprd/h_x); ny_pppm = static_cast (yprd/h_y); nz_pppm = static_cast (zprd_slab/h_z); @@ -845,7 +847,8 @@ void PPPMDipole::set_grid_global(double dipole2) if (ny_pppm <= 1) ny_pppm = 2; if (nz_pppm <= 1) nz_pppm = 2; - //set local grid dimension + // set local grid dimension + int npey_fft,npez_fft; if (nz_pppm >= nprocs) { npey_fft = 1; @@ -862,7 +865,7 @@ void PPPMDipole::set_grid_global(double dipole2) nzlo_fft = me_z*nz_pppm/npez_fft; nzhi_fft = (me_z+1)*nz_pppm/npez_fft - 1; - double df_kspace = compute_df_kspace_dipole(dipole2); + double df_kspace = compute_df_kspace_dipole(); count++; @@ -895,7 +898,7 @@ void PPPMDipole::set_grid_global(double dipole2) compute estimated kspace force error for dipoles ------------------------------------------------------------------------- */ -double PPPMDipole::compute_df_kspace_dipole(double dipole2) +double PPPMDipole::compute_df_kspace_dipole() { double xprd = domain->xprd; double yprd = domain->yprd; @@ -903,8 +906,7 @@ double PPPMDipole::compute_df_kspace_dipole(double dipole2) double zprd_slab = zprd*slab_volfactor; bigint natoms = atom->natoms; double qopt = compute_qopt_dipole(); - //double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); - double df_kspace = sqrt(qopt/natoms)*dipole2/(3.0*xprd*yprd*zprd_slab); + double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); return df_kspace; } @@ -1101,27 +1103,27 @@ void PPPMDipole::compute_gf_dipole() calculate f(x) for use in Newton-Raphson solver ------------------------------------------------------------------------- */ -//double PPPMDipole::newton_raphson_f() -//{ -// double xprd = domain->xprd; -// double yprd = domain->yprd; -// double zprd = domain->zprd; -// bigint natoms = atom->natoms; -// -// double df_rspace,df_kspace; -// double vol = xprd*yprd*zprd; -// double a = cutoff*g_ewald; -// double rg2 = a*a; -// double rg4 = rg2*rg2; -// double rg6 = rg4*rg2; -// double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; -// double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; -// df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * -// sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); -// df_kspace = compute_df_kspace_dipole(); -// -// return df_rspace - df_kspace; -//} +double PPPMDipole::newton_raphson_f() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + bigint natoms = atom->natoms; + + double df_rspace,df_kspace; + double vol = xprd*yprd*zprd; + double a = cutoff*g_ewald; + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); + df_kspace = compute_df_kspace_dipole(); + + return df_rspace - df_kspace; +} /* ---------------------------------------------------------------------- find g_ewald parameter for dipoles based on desired accuracy @@ -1184,7 +1186,7 @@ double PPPMDipole::derivf_dipole(double x, double Rc, calculate the final estimate of the accuracy ------------------------------------------------------------------------- */ -double PPPMDipole::final_accuracy_dipole(double dipole2) +double PPPMDipole::final_accuracy_dipole() { double xprd = domain->xprd; double yprd = domain->yprd; @@ -1193,7 +1195,7 @@ double PPPMDipole::final_accuracy_dipole(double dipole2) bigint natoms = atom->natoms; if (natoms == 0) natoms = 1; // avoid division by zero - double df_kspace = compute_df_kspace_dipole(mu2); + double df_kspace = compute_df_kspace_dipole(); double a = cutoff*g_ewald; double rg2 = a*a; @@ -1201,10 +1203,7 @@ double PPPMDipole::final_accuracy_dipole(double dipole2) double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - //double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * - // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * - // exp(-rg2)); - double df_rspace = (dipole2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); @@ -2521,11 +2520,11 @@ double PPPMDipole::memory_usage() double bytes = nmax*3 * sizeof(double); int nbrick = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * (nzhi_out-nzlo_out+1); - bytes += 6 * nfft_both * sizeof(double); // vg - bytes += nfft_both * sizeof(double); // greensfn + bytes += 6 * nfft_both * sizeof(double); // vg + bytes += nfft_both * sizeof(double); // greensfn bytes += nfft_both*5 * sizeof(FFT_SCALAR); // work*2*2 - bytes += 9 * nbrick * sizeof(FFT_SCALAR); // ubrick*3 + vdbrick*6 - bytes += nfft_both*7 * sizeof(FFT_SCALAR); //density_ffx*3 + work*2*2 + bytes += 9 * nbrick * sizeof(FFT_SCALAR); // ubrick*3 + vdbrick*6 + bytes += nfft_both*7 * sizeof(FFT_SCALAR); // density_ffx*3 + work*2*2 if (peratom_allocate_flag) bytes += 21 * nbrick * sizeof(FFT_SCALAR); diff --git a/src/KSPACE/pppm_dipole.h b/src/KSPACE/pppm_dipole.h index 8db28b540a..52bd2e5a9d 100644 --- a/src/KSPACE/pppm_dipole.h +++ b/src/KSPACE/pppm_dipole.h @@ -37,8 +37,8 @@ class PPPMDipole : public PPPM { double memory_usage(); protected: - void set_grid_global(double); - //double newton_raphson_f(); + void set_grid_global(); + double newton_raphson_f(); void allocate(); void allocate_peratom(); @@ -76,7 +76,7 @@ class PPPMDipole : public PPPM { double find_gewald_dipole(double, double, bigint, double, double); double newton_raphson_f_dipole(double, double, bigint, double, double); double derivf_dipole(double, double, bigint, double, double); - double compute_df_kspace_dipole(double); + double compute_df_kspace_dipole(); double compute_qopt_dipole(); void compute_gf_dipole(); void make_rho_dipole(); @@ -85,7 +85,7 @@ class PPPMDipole : public PPPM { void poisson_peratom_dipole(); void fieldforce_ik_dipole(); void fieldforce_peratom_dipole(); - double final_accuracy_dipole(double dipole2); + double final_accuracy_dipole(); void musum_musq(); }; diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index 4fde7ba101..a5aee7150c 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -50,8 +50,8 @@ using namespace MathSpecial; #define SMALL 0.00001 #define EPS_HOC 1.0e-7 -enum{REVERSE_SP}; -enum{FORWARD_SP,FORWARD_SP_PERATOM}; +enum{REVERSE_MU}; +enum{FORWARD_MU,FORWARD_MU_PERATOM}; #ifdef FFT_SINGLE #define ZEROF 0.0f @@ -68,10 +68,12 @@ PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp, int narg, char **arg) : { dipoleflag = 0; spinflag = 1; - group_group_enable = 0; - - cg_dipole = NULL; - cg_peratom_dipole = NULL; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } /* ---------------------------------------------------------------------- @@ -104,7 +106,10 @@ void PPPMDipoleSpin::init() // error check spinflag = atom->sp?1:0; - + //qsum_qsq(0); // q[i] is probably not declared ? + //if (spinflag && q2) + // error->all(FLERR,"Cannot use charges with Kspace style PPPMDipoleSpin"); + triclinic_check(); if (triclinic != domain->triclinic) @@ -118,8 +123,8 @@ void PPPMDipoleSpin::init() if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); - if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" - " ad with spins"); + if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use" + " kspace_modify diff ad with spins"); if (spinflag && strcmp(update->unit_style,"metal") != 0) error->all(FLERR,"'metal' units have to be used with spins"); @@ -148,21 +153,19 @@ void PPPMDipoleSpin::init() int itmp = 0; double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + // probably not the correct extract here if (p_cutoff == NULL) error->all(FLERR,"KSpace style is incompatible with Pair style"); cutoff = *p_cutoff; // kspace TIP4P not yet supported - + // qdist = offset only for TIP4P fictitious charge + + qdist = 0.0; if (tip4pflag) error->all(FLERR,"Cannot yet use TIP4P with PPPMDipoleSpin"); scale = 1.0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz spsum_spsq(); natoms_original = atom->natoms; @@ -188,14 +191,14 @@ void PPPMDipoleSpin::init() GridComm *cgtmp = NULL; int iteration = 0; - + while (order >= minorder) { if (iteration && me == 0) error->warning(FLERR,"Reducing PPPMDipoleSpin order b/c stencil extends " "beyond nearest neighbor processor"); compute_gf_denom(); - set_grid_global(sp2); + set_grid_global(); set_grid_local(); if (overlap_allowed) break; @@ -224,7 +227,7 @@ void PPPMDipoleSpin::init() // calculate the final accuracy - double estimated_accuracy = final_accuracy_dipole(sp2); + double estimated_accuracy = final_accuracy_dipole(); // print stats @@ -310,7 +313,7 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // return if there are no spins - if (spsqsum == 0.0) return; + if (musqsum == 0.0) return; // convert atoms from box to lamda coords @@ -334,7 +337,7 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - cg_dipole->reverse_comm(this,REVERSE_SP); + cg_dipole->reverse_comm(this,REVERSE_MU); brick2fft_dipole(); // compute potential gradient on my FFT grid and @@ -347,12 +350,12 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks - cg_dipole->forward_comm(this,FORWARD_SP); + cg_dipole->forward_comm(this,FORWARD_MU); // extra per-atom energy/virial communication if (evflag_atom) { - cg_peratom_dipole->forward_comm(this,FORWARD_SP_PERATOM); + cg_peratom_dipole->forward_comm(this,FORWARD_MU_PERATOM); } // calculate the force on my particles @@ -374,7 +377,7 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) energy = energy_all; energy *= 0.5*volume; - energy -= spsqsum*2.0*g3/3.0/MY_PIS; + energy -= musqsum*2.0*g3/3.0/MY_PIS; energy *= spscale; } @@ -510,7 +513,7 @@ void PPPMDipoleSpin::fieldforce_ik_spin() double spx,spy,spz; double **x = atom->x; double **f = atom->f; - double **fm = atom->fm; + double **fm_long = atom->fm_long; int nlocal = atom->nlocal; @@ -548,7 +551,7 @@ void PPPMDipoleSpin::fieldforce_ik_spin() } } - // convert M-field to mech. and mag. forces + // convert M-field and store mech. forces const double spfactor = mub2mu0 * scale; spx = sp[i][0]*sp[i][3]; @@ -558,13 +561,12 @@ void PPPMDipoleSpin::fieldforce_ik_spin() f[i][1] += spfactor*(vxy*spx + vyy*spy + vyz*spz); f[i][2] += spfactor*(vxz*spx + vyz*spy + vzz*spz); + // store long-range mag. precessions + const double spfactorh = mub2mu0hbinv * scale; - fm[i][0] += spfactorh*ex; - fm[i][1] += spfactorh*ey; - fm[i][2] += spfactorh*ez; - - // create a new vector (in atom_spin style ?) to store long-range fm tables - + fm_long[i][0] += spfactorh*ex; + fm_long[i][1] += spfactorh*ey; + fm_long[i][2] += spfactorh*ez; } } @@ -708,9 +710,11 @@ void PPPMDipoleSpin::slabcorr() // add on mag. force corrections double ffact = spscale * (-4.0*MY_PI/volume); - double **fm = atom->fm; + //double **fm = atom->fm; + double **fm_long = atom->fm_long; for (int i = 0; i < nlocal; i++) { - fm[i][2] += ffact * spin_all; + //fm[i][2] += ffact * spin_all; + fm_long[i][2] += ffact * spin_all; } } @@ -723,13 +727,13 @@ void PPPMDipoleSpin::spsum_spsq() { const int nlocal = atom->nlocal; - spsum = spsqsum = sp2 = 0.0; + musum = musqsum = mu2 = 0.0; if (atom->sp_flag) { double **sp = atom->sp; double spx, spy, spz; double spsum_local(0.0), spsqsum_local(0.0); - // not exactly the good loop: need to add norm of spins + // sum (direction x norm) of all spins for (int i = 0; i < nlocal; i++) { spx = sp[i][0]*sp[i][3]; @@ -739,12 +743,14 @@ void PPPMDipoleSpin::spsum_spsq() spsqsum_local += spx*spx + spy*spy + spz*spz; } - MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); + // store results into pppm_dipole quantities - sp2 = spsqsum * mub2mu0; + MPI_Allreduce(&spsum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&spsqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + + mu2 = musqsum * mub2mu0; } - if (sp2 == 0 && comm->me == 0) + if (mu2 == 0 && comm->me == 0) error->all(FLERR,"Using kspace solver PPPMDipoleSpin on system with no spins"); } diff --git a/src/KSPACE/pppm_dipole_spin.h b/src/KSPACE/pppm_dipole_spin.h index 347006e586..8d6c5d4eb2 100644 --- a/src/KSPACE/pppm_dipole_spin.h +++ b/src/KSPACE/pppm_dipole_spin.h @@ -42,7 +42,6 @@ class PPPMDipoleSpin : public PPPMDipole { // spin - double spsum,spsqsum,sp2; void make_rho_spin(); void fieldforce_ik_spin(); void fieldforce_peratom_spin(); diff --git a/src/SPIN/atom_vec_spin.cpp b/src/SPIN/atom_vec_spin.cpp index fb2b6dd797..477da613d2 100644 --- a/src/SPIN/atom_vec_spin.cpp +++ b/src/SPIN/atom_vec_spin.cpp @@ -106,7 +106,6 @@ void AtomVecSpin::grow_reset() sp = atom->sp; fm = atom->fm; fm_long = atom->fm_long; } - /* ---------------------------------------------------------------------- copy atom I info to atom J ------------------------------------------------------------------------- */ diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index b75f03212a..996bd3c2da 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -126,6 +126,7 @@ FixNVESpin::FixNVESpin(LAMMPS *lmp, int narg, char **arg) : // initialize the magnetic interaction flags pair_spin_flag = 0; + long_spin_flag = 0; precession_spin_flag = 0; maglangevin_flag = 0; tdamp_flag = temp_flag = 0; @@ -209,8 +210,16 @@ void FixNVESpin::init() if (count != npairspin) error->all(FLERR,"Incorrect number of spin pairs"); + // set pair/spin and long/spin flags + if (npairspin >= 1) pair_spin_flag = 1; + for (int i = 0; ipair_match("spin/long",0,i)) { + long_spin_flag = 1; + } + } + // ptrs FixPrecessionSpin classes int iforce; @@ -425,6 +434,7 @@ void FixNVESpin::ComputeInteractionsSpin(int i) double **sp = atom->sp; double **fm = atom->fm; + double **fm_long = atom->fm_long; // force computation for spin i @@ -442,6 +452,14 @@ void FixNVESpin::ComputeInteractionsSpin(int i) } } + // update magnetic long-range components + + if (long_spin_flag) { + fmi[0] += fm_long[i][0]; + fmi[1] += fm_long[i][1]; + fmi[2] += fm_long[i][2]; + } + // update magnetic precession interactions if (precession_spin_flag) { diff --git a/src/SPIN/fix_nve_spin.h b/src/SPIN/fix_nve_spin.h index afc1db14d6..565de13e92 100644 --- a/src/SPIN/fix_nve_spin.h +++ b/src/SPIN/fix_nve_spin.h @@ -58,7 +58,8 @@ friend class PairSpin; int nlocal_max; // max value of nlocal (for lists size) int pair_spin_flag; // magnetic pair flags - int precession_spin_flag; // magnetic precession flags + int long_spin_flag; // magnetic long-range flag + int precession_spin_flag; // magnetic precession flags int maglangevin_flag; // magnetic langevin flags int tdamp_flag, temp_flag; diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp index ca4f3d5e24..efedea3247 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_long.cpp @@ -81,6 +81,7 @@ PairSpinLong::~PairSpinLong() if (allocated) { memory->destroy(setflag); memory->destroy(cut_spin_long); + memory->destroy(cutsq); } } @@ -97,7 +98,6 @@ void PairSpinLong::settings(int narg, char **arg) error->all(FLERR,"Spin simulations require metal unit style"); cut_spin_long_global = force->numeric(FLERR,arg[0]); - //cut_spin = force->numeric(FLERR,arg[0]); // reset cutoffs that have been explicitly set @@ -126,7 +126,7 @@ void PairSpinLong::coeff(int narg, char **arg) if (strcmp(arg[2],"long") != 0) error->all(FLERR,"Incorrect args in pair_style command"); - if (narg != 3) + if (narg < 1 || narg > 4) error->all(FLERR,"Incorrect args in pair_style command"); int ilo,ihi,jlo,jhi; @@ -197,9 +197,9 @@ void PairSpinLong::init_style() double PairSpinLong::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - + cut_spin_long[j][i] = cut_spin_long[i][j]; - + return cut_spin_long_global; } @@ -505,7 +505,8 @@ void PairSpinLong::allocate() for (int j = i; j <= n; j++) setflag[i][j] = 0; - memory->create(cut_spin_long,n+1,n+1,"pair:cut_spin_long"); + memory->create(cut_spin_long,n+1,n+1,"pair/spin/long:cut_spin_long"); + memory->create(cutsq,n+1,n+1,"pair/spin/long:cutsq"); } /* ---------------------------------------------------------------------- diff --git a/src/atom.cpp b/src/atom.cpp index cf4d20a71e..58b00712f7 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -98,7 +98,7 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp) // SPIN package - sp = fm = NULL; + sp = fm = fm_long = NULL; // USER-DPD @@ -277,6 +277,7 @@ Atom::~Atom() memory->destroy(sp); memory->destroy(fm); + memory->destroy(fm_long); memory->destroy(vfrac); memory->destroy(s0); diff --git a/src/atom.h b/src/atom.h index 7e003dff5e..95c4a9c30f 100644 --- a/src/atom.h +++ b/src/atom.h @@ -65,6 +65,7 @@ class Atom : protected Pointers { double **sp; double **fm; + double **fm_long; // PERI package diff --git a/src/pair.h b/src/pair.h index f830b7c035..0b46d58782 100644 --- a/src/pair.h +++ b/src/pair.h @@ -61,7 +61,7 @@ class Pair : protected Pointers { int dispersionflag; // 1 if compatible with LJ/dispersion solver int tip4pflag; // 1 if compatible with TIP4P solver int dipoleflag; // 1 if compatible with dipole solver - int spinflag; // 1 if compatible with spin long solver + int spinflag; // 1 if compatible with spin solver int reinitflag; // 1 if compatible with fix adapt and alike int tail_flag; // pair_modify flag for LJ tail correction From 16911adcea92142dc01a550a733499fc1efea7b2 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 30 Aug 2018 07:33:25 -0600 Subject: [PATCH 06/90] Commit1 JT 083018 - started to work on ewald_dipole (not yet triclinic) - compiles and runs (no memory issue) - check the energy accuracy --- examples/SPIN/pppm_spin/in.dipole.pppm_dipole | 7 +- examples/SPIN/pppm_spin/in.spin.pppm_spin | 7 +- src/KSPACE/ewald_dipole.cpp | 847 ++++++++++++++++++ src/KSPACE/ewald_dipole.h | 104 +++ src/KSPACE/pppm.cpp | 3 - src/KSPACE/pppm_dipole.cpp | 8 +- src/KSPACE/pppm_dipole_spin.cpp | 2 - 7 files changed, 963 insertions(+), 15 deletions(-) create mode 100644 src/KSPACE/ewald_dipole.cpp create mode 100644 src/KSPACE/ewald_dipole.h diff --git a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole index 804ddad1e2..c2c49e3caf 100644 --- a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole +++ b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole @@ -23,11 +23,12 @@ velocity all create 1.0 87287 #pair_coeff * * 1.0 1.0 2.5 #pair_coeff * 2 1.0 1.0 5.0 pair_style lj/cut/dipole/long 3.0 -pair_coeff * * 1.0 1.0 +pair_coeff * * 0.0 0.0 #kspace_style pppm/disp 1.0e-4 -kspace_style pppm/dipole 1.0e-4 -kspace_modify gewald/disp 0.1 +#kspace_style pppm/dipole 1.0e-4 +kspace_style ewald/dipole 1.0e-4 +kspace_modify gewald 0.1 neighbor 0.3 bin neigh_modify every 2 delay 4 check yes diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin index 87d18f4d16..f7e462c343 100644 --- a/examples/SPIN/pppm_spin/in.spin.pppm_spin +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -11,7 +11,7 @@ boundary p p p atom_modify map array lattice hcp 2.5071 -region box block 0.0 20.0 0.0 20.0 0.0 8.0 +region box block 0.0 8.0 0.0 8.0 0.0 8.0 create_box 1 box create_atoms 1 box @@ -33,7 +33,7 @@ neighbor 0.1 bin neigh_modify every 10 check yes delay 20 kspace_style pppm/dipole/spin 1.0e-4 - +kspace_modify mesh 32 32 32 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 @@ -58,4 +58,5 @@ thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -run 20000 +#run 20000 +run 1 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp new file mode 100644 index 0000000000..d03d93a7c5 --- /dev/null +++ b/src/KSPACE/ewald_dipole.cpp @@ -0,0 +1,847 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Julien Tranchida (SNL) + Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include "ewald_dipole.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "pair.h" +#include "domain.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" +#include "update.h" + +#include "math_const.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define SMALL 0.00001 + +/* ---------------------------------------------------------------------- */ + +EwaldDipole::EwaldDipole(LAMMPS *lmp, int narg, char **arg) : Ewald(lmp, narg, arg) +{ + ewaldflag = dipoleflag = 1; + group_group_enable = 0; + muk = NULL; +} + +/* ---------------------------------------------------------------------- + free all memory +------------------------------------------------------------------------- */ + +EwaldDipole::~EwaldDipole() +{ + memory->destroy(muk); +} + +/* ---------------------------------------------------------------------- + called once before run +------------------------------------------------------------------------- */ + +void EwaldDipole::init() +{ + if (comm->me == 0) { + if (screen) fprintf(screen,"EwaldDipole initialization ...\n"); + if (logfile) fprintf(logfile,"EwaldDipole initialization ...\n"); + } + + // error check + + dipoleflag = atom->mu?1:0; + qsum_qsq(0); // q[i] might not be declared ? + + if (dipoleflag && q2) + error->all(FLERR,"Cannot (yet) use charges with Kspace style EwaldDipole"); + + triclinic_check(); + + // set triclinic to 0 for now (no triclinic calc.) + triclinic = 0; + + if (triclinic) + error->all(FLERR,"Cannot (yet) use EwaldDipole with triclinic box"); + + if (domain->dimension == 2) + error->all(FLERR,"Cannot use EwaldDipole with 2d simulation"); + + if (!atom->mu) error->all(FLERR,"Kspace style requires atom attribute mu"); +//if (!atom->q_flag) error->all(FLERR,"Kspace style requires atom attribute q"); + + if (dipoleflag && strcmp(update->unit_style,"electron") == 0) + error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with EwaldDipole"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab EwaldDipole"); + //if (domain->triclinic) + // error->all(FLERR,"Cannot (yet) use EwaldDipole with triclinic box " + // "and slab correction"); + } + + // extract short-range Coulombic cutoff from pair style + + triclinic = domain->triclinic; + if (triclinic) + error->all(FLERR,"Cannot yet use triclinic cells with EwaldDipole"); + + pair_check(); + + int itmp; + double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + if (p_cutoff == NULL) + error->all(FLERR,"KSpace style is incompatible with Pair style"); + double cutoff = *p_cutoff; + + // kspace TIP4P not yet supported + // qdist = offset only for TIP4P fictitious charge + + //qdist = 0.0; + if (tip4pflag) + error->all(FLERR,"Cannot yet use TIP4P with EwaldDipole"); + + // compute musum & musqsum and warn if no dipole + + scale = 1.0; + qqrd2e = force->qqrd2e; + musum_musq(); + natoms_original = atom->natoms; + + // set accuracy (force units) from accuracy_relative or accuracy_absolute + + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; + else accuracy = accuracy_relative * two_charge_force; + + // setup K-space resolution + + bigint natoms = atom->natoms; + + // use xprd,yprd,zprd even if triclinic so grid size is the same + // adjust z dimension for 2d slab EwaldDipole + // 3d EwaldDipole just uses zprd since slab_volfactor = 1.0 + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double zprd_slab = zprd*slab_volfactor; + + // make initial g_ewald estimate + // based on desired accuracy and real space cutoff + // fluid-occupied volume used to estimate real-space error + // zprd used rather than zprd_slab + + if (!gewaldflag) { + if (accuracy <= 0.0) + error->all(FLERR,"KSpace accuracy must be > 0"); + if (q2 == 0.0) + error->all(FLERR,"Must use 'kspace_modify gewald' for uncharged system"); + g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*q2); + if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; + else g_ewald = sqrt(-log(g_ewald)) / cutoff; + } + + // setup EwaldDipole coefficients so can print stats + + setup(); + + // final RMS accuracy + + double lprx = rms(kxmax_orig,xprd,natoms,q2); + double lpry = rms(kymax_orig,yprd,natoms,q2); + double lprz = rms(kzmax_orig,zprd_slab,natoms,q2); + double lpr = sqrt(lprx*lprx + lpry*lpry + lprz*lprz) / sqrt(3.0); + double q2_over_sqrt = q2 / sqrt(natoms*cutoff*xprd*yprd*zprd_slab); + double spr = 2.0 *q2_over_sqrt * exp(-g_ewald*g_ewald*cutoff*cutoff); + double tpr = estimate_table_accuracy(q2_over_sqrt,spr); + double estimated_accuracy = sqrt(lpr*lpr + spr*spr + tpr*tpr); + + // stats + + if (comm->me == 0) { + if (screen) { + fprintf(screen," G vector (1/distance) = %g\n",g_ewald); + fprintf(screen," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(screen," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(screen," KSpace vectors: actual max1d max3d = %d %d %d\n", + kcount,kmax,kmax3d); + fprintf(screen," kxmax kymax kzmax = %d %d %d\n", + kxmax,kymax,kzmax); + } + if (logfile) { + fprintf(logfile," G vector (1/distance) = %g\n",g_ewald); + fprintf(logfile," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(logfile," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(logfile," KSpace vectors: actual max1d max3d = %d %d %d\n", + kcount,kmax,kmax3d); + fprintf(logfile," kxmax kymax kzmax = %d %d %d\n", + kxmax,kymax,kzmax); + } + } +} + +/* ---------------------------------------------------------------------- + adjust EwaldDipole coeffs, called initially and whenever volume has changed +------------------------------------------------------------------------- */ + +void EwaldDipole::setup() +{ + // volume-dependent factors + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + + // adjustment of z dimension for 2d slab EwaldDipole + // 3d EwaldDipole just uses zprd since slab_volfactor = 1.0 + + double zprd_slab = zprd*slab_volfactor; + volume = xprd * yprd * zprd_slab; + + unitk[0] = 2.0*MY_PI/xprd; + unitk[1] = 2.0*MY_PI/yprd; + unitk[2] = 2.0*MY_PI/zprd_slab; + + int kmax_old = kmax; + + if (kewaldflag == 0) { + + // determine kmax + // function of current box size, accuracy, G_ewald (short-range cutoff) + + bigint natoms = atom->natoms; + double err; + kxmax = 1; + kymax = 1; + kzmax = 1; + + // set kmax in 3 directions to respect accuracy + + err = rms_dipole(kxmax,xprd,natoms); + while (err > accuracy) { + kxmax++; + err = rms_dipole(kxmax,xprd,natoms); + } + + err = rms_dipole(kxmax,xprd,natoms); + while (err > accuracy) { + kymax++; + err = rms_dipole(kxmax,xprd,natoms); + } + + err = rms_dipole(kxmax,xprd,natoms); + while (err > accuracy) { + kzmax++; + err = rms_dipole(kxmax,xprd,natoms); + } + + kmax = MAX(kxmax,kymax); + kmax = MAX(kmax,kzmax); + kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + + double gsqxmx = unitk[0]*unitk[0]*kxmax*kxmax; + double gsqymx = unitk[1]*unitk[1]*kymax*kymax; + double gsqzmx = unitk[2]*unitk[2]*kzmax*kzmax; + gsqmx = MAX(gsqxmx,gsqymx); + gsqmx = MAX(gsqmx,gsqzmx); + + kxmax_orig = kxmax; + kymax_orig = kymax; + kzmax_orig = kzmax; + + // scale lattice vectors for triclinic skew + + //if (triclinic) { + // double tmp[3]; + // tmp[0] = kxmax/xprd; + // tmp[1] = kymax/yprd; + // tmp[2] = kzmax/zprd; + // lamda2xT(&tmp[0],&tmp[0]); + // kxmax = MAX(1,static_cast(tmp[0])); + // kymax = MAX(1,static_cast(tmp[1])); + // kzmax = MAX(1,static_cast(tmp[2])); + + // kmax = MAX(kxmax,kymax); + // kmax = MAX(kmax,kzmax); + // kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + //} + + } else { + + kxmax = kx_ewald; + kymax = ky_ewald; + kzmax = kz_ewald; + + kxmax_orig = kxmax; + kymax_orig = kymax; + kzmax_orig = kzmax; + + kmax = MAX(kxmax,kymax); + kmax = MAX(kmax,kzmax); + kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + + double gsqxmx = unitk[0]*unitk[0]*kxmax*kxmax; + double gsqymx = unitk[1]*unitk[1]*kymax*kymax; + double gsqzmx = unitk[2]*unitk[2]*kzmax*kzmax; + gsqmx = MAX(gsqxmx,gsqymx); + gsqmx = MAX(gsqmx,gsqzmx); + } + + gsqmx *= 1.00001; + + // if size has grown, reallocate k-dependent and nlocal-dependent arrays + + if (kmax > kmax_old) { + deallocate(); + allocate(); + group_allocate_flag = 0; + + memory->destroy(ek); + memory->destroy3d_offset(cs,-kmax_created); + memory->destroy3d_offset(sn,-kmax_created); + memory->destroy(muk); + nmax = atom->nmax; + memory->create(ek,nmax,3,"ewald:ek"); + memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald:cs"); + memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald:sn"); + memory->create(muk,kmax3d,nmax,"ewald:muk"); + kmax_created = kmax; + } + + // pre-compute EwaldDipole coefficients + + coeffs(); + //if (triclinic == 0) + // coeffs(); + //else + // coeffs_triclinic(); +} + +/* ---------------------------------------------------------------------- + compute dipole RMS accuracy for a dimension +------------------------------------------------------------------------- */ + +double EwaldDipole::rms_dipole(int km, double prd, bigint natoms) +{ + if (natoms == 0) natoms = 1; // avoid division by zero + + // error from eq.(46), Wang et al., JCP 115, 6351 (2001) + + double value = 8*MY_PI*mu2*g_ewald/volume * + sqrt(2*MY_PI*km*km*km/(15.0*natoms)) * + exp(-MY_PI*MY_PI*km*km/(g_ewald*g_ewald*prd*prd)); + + return value; +} + +/* ---------------------------------------------------------------------- + compute the EwaldDipole long-range force, energy, virial +------------------------------------------------------------------------- */ + +void EwaldDipole::compute(int eflag, int vflag) +{ + int i,j,k; + + // set energy/virial flags + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = evflag_atom = eflag_global = vflag_global = + eflag_atom = vflag_atom = 0; + + // if atom count has changed, update qsum and qsqsum + + if (atom->natoms != natoms_original) { + //qsum_qsq(); + musum_musq(); + natoms_original = atom->natoms; + } + + // return if there are no charges + + if (qsqsum == 0.0) return; + + // extend size of per-atom arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(ek); + memory->destroy3d_offset(cs,-kmax_created); + memory->destroy3d_offset(sn,-kmax_created); + memory->destroy(muk); + nmax = atom->nmax; + memory->create(ek,nmax,3,"ewald:ek"); + memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald:cs"); + memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald:sn"); + memory->create(muk,kmax3d,nmax,"ewald:muk"); + kmax_created = kmax; + } + + // partial structure factors on each processor + // total structure factor by summing over procs + + //if (triclinic == 0) + // eik_dot_r(); + //else + // eik_dot_r_triclinic(); + eik_dot_r(); + + MPI_Allreduce(sfacrl,sfacrl_all,kcount,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(sfacim,sfacim_all,kcount,MPI_DOUBLE,MPI_SUM,world); + + // K-space portion of electric field + // double loop over K-vectors and local atoms + // perform per-atom calculations if needed + + double **f = atom->f; + double *q = atom->q; + int nlocal = atom->nlocal; + + int kx,ky,kz; + double cypz,sypz,exprl,expim,partial,partial_peratom; + + for (i = 0; i < nlocal; i++) { + ek[i][0] = 0.0; + ek[i][1] = 0.0; + ek[i][2] = 0.0; + } + + for (k = 0; k < kcount; k++) { + kx = kxvecs[k]; + ky = kyvecs[k]; + kz = kzvecs[k]; + + for (i = 0; i < nlocal; i++) { + cypz = cs[ky][1][i]*cs[kz][2][i] - sn[ky][1][i]*sn[kz][2][i]; + sypz = sn[ky][1][i]*cs[kz][2][i] + cs[ky][1][i]*sn[kz][2][i]; + exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; + expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; + partial = expim*sfacrl_all[k] - exprl*sfacim_all[k]; + ek[i][0] += partial*eg[k][0]; + ek[i][1] += partial*eg[k][1]; + ek[i][2] += partial*eg[k][2]; + + if (evflag_atom) { + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + //if (eflag_atom) eatom[i] += q[i]*ug[k]*partial_peratom; + if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; + if (vflag_atom) + for (j = 0; j < 6; j++) + vatom[i][j] += ug[k]*vg[k][j]*partial_peratom; + } + } + } + + // convert E-field to force + + const double qscale = qqrd2e * scale; + const double muscale = qqrd2e * scale; + + for (i = 0; i < nlocal; i++) { + for (k = 0; k < kcount; k++) { + //f[i][0] += qscale * q[i]*ek[i][0]; + //f[i][1] += qscale * q[i]*ek[i][1]; + //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; + f[i][0] += muscale * muk[k][i] * ek[i][0]; + f[i][1] += muscale * muk[k][i] * ek[i][1]; + if (slabflag != 2) f[i][2] += muscale * muk[k][i] * ek[i][2]; + } + } + + // sum global energy across Kspace vevs and add in volume-dependent term + + if (eflag_global) { + for (k = 0; k < kcount; k++) + energy += ug[k] * (sfacrl_all[k]*sfacrl_all[k] + + sfacim_all[k]*sfacim_all[k]); + + energy -= g_ewald*qsqsum/MY_PIS + + MY_PI2*qsum*qsum / (g_ewald*g_ewald*volume); + energy *= qscale; + } + + // global virial + + if (vflag_global) { + double uk; + for (k = 0; k < kcount; k++) { + uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); + for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j]; + } + for (j = 0; j < 6; j++) virial[j] *= qscale; + } + + // per-atom energy/virial + // energy includes self-energy correction + + if (evflag_atom) { + if (eflag_atom) { + for (i = 0; i < nlocal; i++) { + eatom[i] -= g_ewald*q[i]*q[i]/MY_PIS + MY_PI2*q[i]*qsum / + (g_ewald*g_ewald*volume); + eatom[i] *= qscale; + } + } + + if (vflag_atom) + for (i = 0; i < nlocal; i++) + for (j = 0; j < 6; j++) vatom[i][j] *= q[i]*qscale; + } + + // 2d slab correction + + if (slabflag == 1) slabcorr(); +} + +/* ---------------------------------------------------------------------- */ + +void EwaldDipole::eik_dot_r() +{ + int i,k,l,m,n,ic; + double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; + double sqk,clpm,slpm; + double mux, muy, muz; + + double **x = atom->x; + //double *q = atom->q; + double **mu = atom->mu; + int nlocal = atom->nlocal; + + n = 0; + mux = muy = muz = 0.0; + + // loop on different k-directions + // loop on n kpoints and nlocal atoms + // store (n x nlocal) tab. of values of (mu_i dot k) + // store n values of sum_j[ (mu_j dot k) exp(-k dot r_j) ] + + // (k,0,0), (0,l,0), (0,0,m) + + // loop 1: k=1, l=1, m=1 + // define first val. of cos and sin + + for (ic = 0; ic < 3; ic++) { + sqk = (unitk[ic] * unitk[ic]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + for (i = 0; i < nlocal; i++) { + cs[0][ic][i] = 1.0; + sn[0][ic][i] = 0.0; + cs[1][ic][i] = cos(unitk[ic]*x[i][ic]); + sn[1][ic][i] = sin(unitk[ic]*x[i][ic]); + cs[-1][ic][i] = cs[1][0][i]; + sn[-1][ic][i] = -sn[1][0][i]; + muk[n][i] = (mu[i][ic]*unitk[ic]); + cstr1 += muk[n][i]*cs[1][ic][i]; + sstr1 += muk[n][i]*sn[1][ic][i]; + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + } + } + + // loop 2: k>1, l>1, m>1 + + for (m = 2; m <= kmax; m++) { + for (ic = 0; ic < 3; ic++) { + sqk = m*unitk[ic] * m*unitk[ic]; + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + for (i = 0; i < nlocal; i++) { + cs[m][ic][i] = cs[m-1][ic][i]*cs[1][ic][i] - + sn[m-1][ic][i]*sn[1][ic][i]; + sn[m][ic][i] = sn[m-1][ic][i]*cs[1][ic][i] + + cs[m-1][ic][i]*sn[1][ic][i]; + cs[-m][ic][i] = cs[m][ic][i]; + sn[-m][ic][i] = -sn[m][ic][i]; + muk[n][i] = (mu[i][ic]*m*unitk[ic]); + cstr1 += muk[n][i]*cs[1][ic][i]; + sstr1 += muk[n][i]*sn[1][ic][i]; + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + } + } + } + + // 1 = (k,l,0), 2 = (k,-l,0) + + for (k = 1; k <= kxmax; k++) { + for (l = 1; l <= kymax; l++) { + sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + mux = mu[i][0]; + muy = mu[i][1]; + + // dir 1: (k,l,0) + muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1]); + cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); + sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); + + // dir 2: (k,-l,0) + muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1]); + cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); + sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (0,l,m), 2 = (0,l,-m) + + for (l = 1; l <= kymax; l++) { + for (m = 1; m <= kzmax; m++) { + sqk = (l*unitk[1] * l*unitk[1]) + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + muy = mu[i][1]; + muz = mu[i][2]; + + // dir 1: (0,l,m) + muk[n][i] = (muy*l*unitk[1] + muz*m*unitk[2]); + cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); + sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); + + // dir 2: (0,l,-m) + muk[n+1][i] = (muy*l*unitk[1] - muz*m*unitk[2]); + cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); + sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (k,0,m), 2 = (k,0,-m) + + for (k = 1; k <= kxmax; k++) { + for (m = 1; m <= kzmax; m++) { + sqk = (k*unitk[0] * k*unitk[0]) + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + mux = mu[i][0]; + muz = mu[i][2]; + + // dir 1: (k,0,m) + muk[n][i] = (mux*k*unitk[0] + muz*m*unitk[2]); + cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); + sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); + + // dir 2: (k,0,-m) + muk[n+1][i] = (mux*k*unitk[0] - muz*m*unitk[2]); + cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); + sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (k,l,m), 2 = (k,-l,m), 3 = (k,l,-m), 4 = (k,-l,-m) + + for (k = 1; k <= kxmax; k++) { + for (l = 1; l <= kymax; l++) { + for (m = 1; m <= kzmax; m++) { + sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]) + + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + cstr3 = 0.0; + sstr3 = 0.0; + cstr4 = 0.0; + sstr4 = 0.0; + for (i = 0; i < nlocal; i++) { + mux = mu[i][0]; + muy = mu[i][1]; + muz = mu[i][2]; + + // dir 1: (k,l,m) + muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; + slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; + cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 2: (k,-l,m) + muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; + slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; + cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 3: (k,l,-m) + muk[n+2][i] = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; + slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; + cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 4: (k,-l,-m) + muk[n+3][i] = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; + slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; + cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr4 += muk[n+3][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + sfacrl[n] = cstr3; + sfacim[n++] = sstr3; + sfacrl[n] = cstr4; + sfacim[n++] = sstr4; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + Slab-geometry correction term to dampen inter-slab interactions between + periodically repeating slabs. Yields good approximation to 2D EwaldDipole if + adequate empty space is left between repeating slabs (J. Chem. Phys. + 111, 3155). Slabs defined here to be parallel to the xy plane. Also + extended to non-neutral systems (J. Chem. Phys. 131, 094107). +------------------------------------------------------------------------- */ + +void EwaldDipole::slabcorr() +{ + // compute local contribution to global dipole moment + + double *q = atom->q; + double **x = atom->x; + double zprd = domain->zprd; + int nlocal = atom->nlocal; + + double dipole = 0.0; + for (int i = 0; i < nlocal; i++) dipole += q[i]*x[i][2]; + + // sum local contributions to get global dipole moment + + double dipole_all; + MPI_Allreduce(&dipole,&dipole_all,1,MPI_DOUBLE,MPI_SUM,world); + + // need to make non-neutral systems and/or + // per-atom energy translationally invariant + + double dipole_r2 = 0.0; + if (eflag_atom || fabs(qsum) > SMALL) { + for (int i = 0; i < nlocal; i++) + dipole_r2 += q[i]*x[i][2]*x[i][2]; + + // sum local contributions + + double tmp; + MPI_Allreduce(&dipole_r2,&tmp,1,MPI_DOUBLE,MPI_SUM,world); + dipole_r2 = tmp; + } + + // compute corrections + + const double e_slabcorr = MY_2PI*(dipole_all*dipole_all - + qsum*dipole_r2 - qsum*qsum*zprd*zprd/12.0)/volume; + const double qscale = qqrd2e * scale; + + if (eflag_global) energy += qscale * e_slabcorr; + + // per-atom energy + + if (eflag_atom) { + double efact = qscale * MY_2PI/volume; + for (int i = 0; i < nlocal; i++) + eatom[i] += efact * q[i]*(x[i][2]*dipole_all - 0.5*(dipole_r2 + + qsum*x[i][2]*x[i][2]) - qsum*zprd*zprd/12.0); + } + + // add on force corrections + + double ffact = qscale * (-4.0*MY_PI/volume); + double **f = atom->f; + + for (int i = 0; i < nlocal; i++) f[i][2] += ffact * q[i]*(dipole_all - qsum*x[i][2]); +} + +/* ---------------------------------------------------------------------- + compute musum,musqsum,mu2 + called initially, when particle count changes, when dipoles are changed +------------------------------------------------------------------------- */ + +void EwaldDipole::musum_musq() +{ + const int nlocal = atom->nlocal; + + musum = musqsum = mu2 = 0.0; + if (atom->mu_flag) { + double** mu = atom->mu; + double musum_local(0.0), musqsum_local(0.0); + + for (int i = 0; i < nlocal; i++) { + musum_local += mu[i][0] + mu[i][1] + mu[i][2]; + musqsum_local += mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]; + } + + MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + + mu2 = musqsum * force->qqrd2e; + } + + if (mu2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); +} diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h new file mode 100644 index 0000000000..5cd969bbee --- /dev/null +++ b/src/KSPACE/ewald_dipole.h @@ -0,0 +1,104 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef KSPACE_CLASS + +KSpaceStyle(ewald/dipole,EwaldDipole) + +#else + +#ifndef LMP_EWALD_DIPOLE_H +#define LMP_EWALD_DIPOLE_H + +#include "ewald.h" + +namespace LAMMPS_NS { + +class EwaldDipole : public Ewald { + public: + EwaldDipole(class LAMMPS *, int, char **); + virtual ~EwaldDipole(); + void init(); + void setup(); + virtual void compute(int, int); + + protected: + double musum,musqsum,mu2; + double **muk; // mu_i dot k + + void musum_musq(); + double rms_dipole(int, double, bigint); + virtual void eik_dot_r(); + void slabcorr(); + + // triclinic + + //void eik_dot_r_triclinic(); + +}; + +} + +#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: Cannot use EwaldDipole with 2d simulation + +The kspace style ewald cannot be used in 2d simulations. You can use +2d EwaldDipole in a 3d simulation; see the kspace_modify command. + +E: Kspace style requires atom attribute q + +The atom style defined does not have these attributes. + +E: Cannot use nonperiodic boundaries with EwaldDipole + +For kspace style ewald, all 3 dimensions must have periodic boundaries +unless you use the kspace_modify command to define a 2d slab with a +non-periodic z dimension. + +E: Incorrect boundaries with slab EwaldDipole + +Must have periodic x,y dimensions and non-periodic z dimension to use +2d slab option with EwaldDipole. + +E: Cannot (yet) use EwaldDipole with triclinic box and slab correction + +This feature is not yet supported. + +E: KSpace style is incompatible with Pair style + +Setting a kspace style requires that a pair style with matching +long-range Coulombic or dispersion components be used. + +E: KSpace accuracy must be > 0 + +The kspace accuracy designated in the input must be greater than zero. + +E: Must use 'kspace_modify gewald' for uncharged system + +UNDOCUMENTED + +E: Cannot (yet) use K-space slab correction with compute group/group for triclinic systems + +This option is not yet supported. + +*/ diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 8eec8e2542..694860521e 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -100,9 +100,6 @@ PPPM::PPPM(LAMMPS *lmp, int narg, char **arg) : KSpace(lmp, narg, arg), nyhi_in = nylo_in = nyhi_out = nylo_out = 0; nzhi_in = nzlo_in = nzhi_out = nzlo_out = 0; - // test - nlower = nupper = 0; - density_brick = vdx_brick = vdy_brick = vdz_brick = NULL; density_fft = NULL; u_brick = NULL; diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index 4d2b594af8..fd986f5eb1 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -126,8 +126,9 @@ void PPPMDipole::init() if (triclinic != domain->triclinic) error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); - if (domain->dimension == 2) error->all(FLERR, - "Cannot use PPPMDipole with 2d simulation"); + if (domain->dimension == 2) + error->all(FLERR,"Cannot use PPPMDipole with 2d simulation"); + if (comm->style != 0) error->universe_all(FLERR,"PPPMDipole can only currently be used with " "comm_style brick"); @@ -175,7 +176,7 @@ void PPPMDipole::init() if (tip4pflag) error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); - // compute qsum & qsqsum and warn if not charge-neutral + // compute musum & musqsum and warn if no dipoles scale = 1.0; qqrd2e = force->qqrd2e; @@ -794,7 +795,6 @@ void PPPMDipole::deallocate_peratom() used for charge accumulation, FFTs, and electric field interpolation ------------------------------------------------------------------------- */ -//void PPPMDipole::set_grid_global(double dipole2) void PPPMDipole::set_grid_global() { // use xprd,yprd,zprd diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index a5aee7150c..aa85c5d289 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -710,10 +710,8 @@ void PPPMDipoleSpin::slabcorr() // add on mag. force corrections double ffact = spscale * (-4.0*MY_PI/volume); - //double **fm = atom->fm; double **fm_long = atom->fm_long; for (int i = 0; i < nlocal; i++) { - //fm[i][2] += ffact * spin_all; fm_long[i][2] += ffact * spin_all; } } From e6b5112ddc80ed86a97ed05176aae2b01ccb9e8b Mon Sep 17 00:00:00 2001 From: "Stan Gerald Moore (stamoor)" Date: Thu, 13 Sep 2018 14:36:54 -0600 Subject: [PATCH 07/90] Fix issues in ewald_dipole --- src/KSPACE/ewald_dipole.cpp | 86 +++++++++++++++++++++++++++++++------ src/KSPACE/ewald_dipole.h | 3 ++ 2 files changed, 75 insertions(+), 14 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index d03d93a7c5..43c4717096 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -28,6 +28,7 @@ #include "pair.h" #include "domain.h" #include "math_const.h" +#include "math_special.h" #include "memory.h" #include "error.h" #include "update.h" @@ -37,6 +38,7 @@ using namespace LAMMPS_NS; using namespace MathConst; +using namespace MathSpecial; #define SMALL 0.00001 @@ -157,13 +159,11 @@ void EwaldDipole::init() // zprd used rather than zprd_slab if (!gewaldflag) { - if (accuracy <= 0.0) - error->all(FLERR,"KSpace accuracy must be > 0"); - if (q2 == 0.0) - error->all(FLERR,"Must use 'kspace_modify gewald' for uncharged system"); - g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*q2); - if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; - else g_ewald = sqrt(-log(g_ewald)) / cutoff; + double g_ewald_new = + NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + if (g_ewald_new > 0.0) g_ewald = g_ewald_new; + else error->warning(FLERR,"Ewald/disp Newton solver failed, " + "using old method to estimate g_ewald"); } // setup EwaldDipole coefficients so can print stats @@ -252,16 +252,16 @@ void EwaldDipole::setup() err = rms_dipole(kxmax,xprd,natoms); } - err = rms_dipole(kxmax,xprd,natoms); + err = rms_dipole(kymax,yprd,natoms); while (err > accuracy) { kymax++; - err = rms_dipole(kxmax,xprd,natoms); + err = rms_dipole(kymax,yprd,natoms); } - err = rms_dipole(kxmax,xprd,natoms); + err = rms_dipole(kzmax,zprd,natoms); while (err > accuracy) { kzmax++; - err = rms_dipole(kxmax,xprd,natoms); + err = rms_dipole(kzmax,zprd,natoms); } kmax = MAX(kxmax,kymax); @@ -387,7 +387,7 @@ void EwaldDipole::compute(int eflag, int vflag) // return if there are no charges - if (qsqsum == 0.0) return; + if (musqsum == 0.0) return; // extend size of per-atom arrays if necessary @@ -482,8 +482,8 @@ void EwaldDipole::compute(int eflag, int vflag) energy += ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); - energy -= g_ewald*qsqsum/MY_PIS + - MY_PI2*qsum*qsum / (g_ewald*g_ewald*volume); + const double g3 = g_ewald*g_ewald*g_ewald; + energy -= musqsum*2.0*g3/3.0/MY_PIS; energy *= qscale; } @@ -845,3 +845,61 @@ void EwaldDipole::musum_musq() if (mu2 == 0 && comm->me == 0) error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); } + +/* ---------------------------------------------------------------------- + Newton solver used to find g_ewald for LJ systems +------------------------------------------------------------------------- */ + +double EwaldDipole::NewtonSolve(double x, double Rc, + bigint natoms, double vol, double b2) +{ + double dx,tol; + int maxit; + + maxit = 10000; //Maximum number of iterations + tol = 0.00001; //Convergence tolerance + + //Begin algorithm + + for (int i = 0; i < maxit; i++) { + dx = f(x,Rc,natoms,vol,b2) / derivf(x,Rc,natoms,vol,b2); + x = x - dx; //Update x + if (fabs(dx) < tol) return x; + if (x < 0 || x != x) // solver failed + return -1; + } + return -1; +} + +/* ---------------------------------------------------------------------- + Calculate f(x) + ------------------------------------------------------------------------- */ + +double EwaldDipole::f(double x, double Rc, bigint natoms, double vol, double b2) +{ + double a = Rc*x; + double f = 0.0; + + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + f = (b2/(sqrt(vol*powint(x,4)*powint(Rc,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + exp(-rg2)) - accuracy; + + return f; +} + +/* ---------------------------------------------------------------------- + Calculate numerical derivative f'(x) + ------------------------------------------------------------------------- */ + +double EwaldDipole::derivf(double x, double Rc, + bigint natoms, double vol, double b2) +{ + double h = 0.000001; //Derivative step-size + return (f(x + h,Rc,natoms,vol,b2) - f(x,Rc,natoms,vol,b2)) / h; +} + diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index 5cd969bbee..77f6a2817c 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -40,6 +40,9 @@ class EwaldDipole : public Ewald { double rms_dipole(int, double, bigint); virtual void eik_dot_r(); void slabcorr(); + double NewtonSolve(double, double, bigint, double, double); + double f(double, double, bigint, double, double); + double derivf(double, double, bigint, double, double); // triclinic From a76457ef22d0864b78dc4b48f1c249a3fd153a47 Mon Sep 17 00:00:00 2001 From: "Stan Gerald Moore (stamoor)" Date: Fri, 14 Sep 2018 13:05:48 -0600 Subject: [PATCH 08/90] Fix bug in ewald_dipole structure factor --- src/KSPACE/ewald_dipole.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 43c4717096..d7c3aad206 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -584,8 +584,8 @@ void EwaldDipole::eik_dot_r() cs[-m][ic][i] = cs[m][ic][i]; sn[-m][ic][i] = -sn[m][ic][i]; muk[n][i] = (mu[i][ic]*m*unitk[ic]); - cstr1 += muk[n][i]*cs[1][ic][i]; - sstr1 += muk[n][i]*sn[1][ic][i]; + cstr1 += muk[n][i]*cs[m][ic][i]; + sstr1 += muk[n][i]*sn[m][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; From 82a5346ab1f1ddfa8ad114a7dceff47d0cdbe0ee Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 14 Sep 2018 15:09:59 -0600 Subject: [PATCH 09/90] Commit JT 091418 - created pair_spin_long_qsymp - modified ewald_dipole --- examples/SPIN/pppm_spin/in.spin.pppm_spin | 7 +- src/KSPACE/ewald_dipole.cpp | 100 ++-- src/KSPACE/ewald_dipole.h | 6 +- src/SPIN/fix_nve_spin.cpp | 17 +- src/SPIN/fix_nve_spin.h | 1 - src/SPIN/pair_spin_long.cpp | 24 +- src/SPIN/pair_spin_long_qsymp.cpp | 655 ++++++++++++++++++++++ src/SPIN/pair_spin_long_qsymp.h | 100 ++++ 8 files changed, 828 insertions(+), 82 deletions(-) create mode 100644 src/SPIN/pair_spin_long_qsymp.cpp create mode 100644 src/SPIN/pair_spin_long_qsymp.h diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin index f7e462c343..9e57797f55 100644 --- a/examples/SPIN/pppm_spin/in.spin.pppm_spin +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -23,17 +23,20 @@ mass 1 58.93 set group all spin 1.72 0.0 0.0 1.0 velocity all create 100 4928459 rot yes dist gaussian -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long/qsymp 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * spin/long long 8.0 +pair_coeff * * spin/long/qsymp long 8.0 +#pair_coeff * * spin/long long 8.0 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 kspace_style pppm/dipole/spin 1.0e-4 kspace_modify mesh 32 32 32 + #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index d03d93a7c5..3b3e3b93db 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -79,9 +79,9 @@ void EwaldDipole::init() triclinic_check(); - // set triclinic to 0 for now (no triclinic calc.) - triclinic = 0; - + // no triclinic ewald dipole (yet) + + triclinic = domain->triclinic; if (triclinic) error->all(FLERR,"Cannot (yet) use EwaldDipole with triclinic box"); @@ -100,9 +100,6 @@ void EwaldDipole::init() if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) error->all(FLERR,"Incorrect boundaries with slab EwaldDipole"); - //if (domain->triclinic) - // error->all(FLERR,"Cannot (yet) use EwaldDipole with triclinic box " - // "and slab correction"); } // extract short-range Coulombic cutoff from pair style @@ -278,23 +275,6 @@ void EwaldDipole::setup() kymax_orig = kymax; kzmax_orig = kzmax; - // scale lattice vectors for triclinic skew - - //if (triclinic) { - // double tmp[3]; - // tmp[0] = kxmax/xprd; - // tmp[1] = kymax/yprd; - // tmp[2] = kzmax/zprd; - // lamda2xT(&tmp[0],&tmp[0]); - // kxmax = MAX(1,static_cast(tmp[0])); - // kymax = MAX(1,static_cast(tmp[1])); - // kzmax = MAX(1,static_cast(tmp[2])); - - // kmax = MAX(kxmax,kymax); - // kmax = MAX(kmax,kzmax); - // kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; - //} - } else { kxmax = kx_ewald; @@ -340,10 +320,6 @@ void EwaldDipole::setup() // pre-compute EwaldDipole coefficients coeffs(); - //if (triclinic == 0) - // coeffs(); - //else - // coeffs_triclinic(); } /* ---------------------------------------------------------------------- @@ -380,7 +356,6 @@ void EwaldDipole::compute(int eflag, int vflag) // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - //qsum_qsq(); musum_musq(); natoms_original = atom->natoms; } @@ -407,10 +382,6 @@ void EwaldDipole::compute(int eflag, int vflag) // partial structure factors on each processor // total structure factor by summing over procs - //if (triclinic == 0) - // eik_dot_r(); - //else - // eik_dot_r_triclinic(); eik_dot_r(); MPI_Allreduce(sfacrl,sfacrl_all,kcount,MPI_DOUBLE,MPI_SUM,world); @@ -421,7 +392,8 @@ void EwaldDipole::compute(int eflag, int vflag) // perform per-atom calculations if needed double **f = atom->f; - double *q = atom->q; + //double *q = atom->q; + double **mu = atom->mu; int nlocal = atom->nlocal; int kx,ky,kz; @@ -439,21 +411,34 @@ void EwaldDipole::compute(int eflag, int vflag) kz = kzvecs[k]; for (i = 0; i < nlocal; i++) { + + // calculating exp(i*k*ri) + cypz = cs[ky][1][i]*cs[kz][2][i] - sn[ky][1][i]*sn[kz][2][i]; sypz = sn[ky][1][i]*cs[kz][2][i] + cs[ky][1][i]*sn[kz][2][i]; exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; + + // taking im-part of struct_fact x exp(i*k*ri) (for force calc.) + partial = expim*sfacrl_all[k] - exprl*sfacim_all[k]; - ek[i][0] += partial*eg[k][0]; - ek[i][1] += partial*eg[k][1]; - ek[i][2] += partial*eg[k][2]; + //ek[i][0] += partial*eg[k][0]; + //ek[i][1] += partial*eg[k][1]; + //ek[i][2] += partial*eg[k][2]; + ek[i][0] += kx*partial*eg[k][0]; + ek[i][1] += ky*partial*eg[k][1]; + ek[i][2] += kz*partial*eg[k][2]; if (evflag_atom) { + + // taking re-part of struct_fact x exp(i*k*ri) (for energy calc.) + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; //if (eflag_atom) eatom[i] += q[i]*ug[k]*partial_peratom; if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) + // to be done vatom[i][j] += ug[k]*vg[k][j]*partial_peratom; } } @@ -461,30 +446,33 @@ void EwaldDipole::compute(int eflag, int vflag) // convert E-field to force - const double qscale = qqrd2e * scale; + //const double qscale = qqrd2e * scale; const double muscale = qqrd2e * scale; for (i = 0; i < nlocal; i++) { - for (k = 0; k < kcount; k++) { - //f[i][0] += qscale * q[i]*ek[i][0]; - //f[i][1] += qscale * q[i]*ek[i][1]; - //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; - f[i][0] += muscale * muk[k][i] * ek[i][0]; - f[i][1] += muscale * muk[k][i] * ek[i][1]; - if (slabflag != 2) f[i][2] += muscale * muk[k][i] * ek[i][2]; - } + //f[i][0] += qscale * q[i]*ek[i][0]; + //f[i][1] += qscale * q[i]*ek[i][1]; + //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; + f[i][0] += muscale * mu[i][0] * ek[i][0]; + f[i][1] += muscale * mu[i][1] * ek[i][1]; + if (slabflag != 2) f[i][2] += muscale * mu[i][2] * ek[i][2]; } // sum global energy across Kspace vevs and add in volume-dependent term if (eflag_global) { - for (k = 0; k < kcount; k++) + for (k = 0; k < kcount; k++) { + + // taking the re-part of struct_fact_i x struct_fact_j + energy += ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); + } - energy -= g_ewald*qsqsum/MY_PIS + - MY_PI2*qsum*qsum / (g_ewald*g_ewald*volume); - energy *= qscale; + // substracting self energy and scaling + + energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy *= muscale; } // global virial @@ -495,7 +483,8 @@ void EwaldDipole::compute(int eflag, int vflag) uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j]; } - for (j = 0; j < 6; j++) virial[j] *= qscale; + //for (j = 0; j < 6; j++) virial[j] *= qscale; + for (j = 0; j < 6; j++) virial[j] *= muscale; } // per-atom energy/virial @@ -504,9 +493,9 @@ void EwaldDipole::compute(int eflag, int vflag) if (evflag_atom) { if (eflag_atom) { for (i = 0; i < nlocal; i++) { - eatom[i] -= g_ewald*q[i]*q[i]/MY_PIS + MY_PI2*q[i]*qsum / - (g_ewald*g_ewald*volume); - eatom[i] *= qscale; + eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]) + *2.0*g3/3.0/MY_PIS; + eatom[i] *= muscale; } } @@ -520,7 +509,9 @@ void EwaldDipole::compute(int eflag, int vflag) if (slabflag == 1) slabcorr(); } -/* ---------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + compute the +------------------------------------------------------------------------- */ void EwaldDipole::eik_dot_r() { @@ -530,7 +521,6 @@ void EwaldDipole::eik_dot_r() double mux, muy, muz; double **x = atom->x; - //double *q = atom->q; double **mu = atom->mu; int nlocal = atom->nlocal; diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index 5cd969bbee..401742ed3a 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -34,17 +34,13 @@ class EwaldDipole : public Ewald { protected: double musum,musqsum,mu2; - double **muk; // mu_i dot k + double **muk; // store mu_i dot k void musum_musq(); double rms_dipole(int, double, bigint); virtual void eik_dot_r(); void slabcorr(); - // triclinic - - //void eik_dot_r_triclinic(); - }; } diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 996bd3c2da..5e972cd14d 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -295,6 +295,13 @@ void FixNVESpin::initial_integrate(int vflag) } } + // update fm_kspace if long-range + // remove short-range comp. of fm_kspace + + if (long_spin_flag) { + + } + // update half s for all atoms if (sector_flag) { // sectoring seq. update @@ -434,7 +441,7 @@ void FixNVESpin::ComputeInteractionsSpin(int i) double **sp = atom->sp; double **fm = atom->fm; - double **fm_long = atom->fm_long; + //double **fm_long = atom->fm_long; // force computation for spin i @@ -452,14 +459,6 @@ void FixNVESpin::ComputeInteractionsSpin(int i) } } - // update magnetic long-range components - - if (long_spin_flag) { - fmi[0] += fm_long[i][0]; - fmi[1] += fm_long[i][1]; - fmi[2] += fm_long[i][2]; - } - // update magnetic precession interactions if (precession_spin_flag) { diff --git a/src/SPIN/fix_nve_spin.h b/src/SPIN/fix_nve_spin.h index 565de13e92..9fcbfb3803 100644 --- a/src/SPIN/fix_nve_spin.h +++ b/src/SPIN/fix_nve_spin.h @@ -48,7 +48,6 @@ friend class PairSpin; int lattice_flag; // lattice_flag = 0 if spins only // lattice_flag = 1 if spin-lattice calc. - protected: int sector_flag; // sector_flag = 0 if serial algorithm // sector_flag = 1 if parallel algorithm diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp index efedea3247..d7ecdf5edd 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_long.cpp @@ -362,13 +362,15 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) int i,j,jj,jnum,itype,jtype; double r,rinv,r2inv,rsq; double grij,expm2,t,erfc; - double bij[4],xi[3],rij[3],spi[4],spj[4]; + double bij[4],xi[3],rij[3]; + double spi[4],spj[4]; double local_cut2; double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; double **x = atom->x; double **sp = atom->sp; + double **fm_long = atom->fm_long; int *type = atom->type; ilist = list->ilist; @@ -433,15 +435,16 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) } } - // force accumulation + // adding the kspace components to fm + + fmi[0] += fm_long[i][0]; + fmi[1] += fm_long[i][1]; + fmi[2] += fm_long[i][2]; - fmi[0] *= mub2mu0hbinv; - fmi[1] *= mub2mu0hbinv; - fmi[2] *= mub2mu0hbinv; } /* ---------------------------------------------------------------------- - compute exchange interaction between spins i and j + compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ void PairSpinLong::compute_long(int i, int j, double rij[3], @@ -456,13 +459,14 @@ void PairSpinLong::compute_long(int i, int j, double rij[3], b1 = bij[1]; b2 = bij[2]; - fmi[0] += gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); - fmi[1] += gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); - fmi[2] += gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); + fmi[0] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); + fmi[1] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); + fmi[2] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); } /* ---------------------------------------------------------------------- - compute the mechanical force due to the exchange interaction between atom i and atom j + compute the mechanical force due to the dipolar interaction between + atom i and atom j ------------------------------------------------------------------------- */ void PairSpinLong::compute_long_mech(int i, int j, double rij[3], diff --git a/src/SPIN/pair_spin_long_qsymp.cpp b/src/SPIN/pair_spin_long_qsymp.cpp new file mode 100644 index 0000000000..3b499d0ef7 --- /dev/null +++ b/src/SPIN/pair_spin_long_qsymp.cpp @@ -0,0 +1,655 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------------ + Contributing authors: Julien Tranchida (SNL) + Aidan Thompson (SNL) + + Please cite the related publication: + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include + +#include "pair_spin_long_qsymp.h" +#include "atom.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "fix_nve_spin.h" +#include "force.h" +#include "kspace.h" +#include "math_const.h" +#include "memory.h" +#include "modify.h" +#include "error.h" +#include "update.h" + + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define EWALD_F 1.12837917 +#define EWALD_P 0.3275911 +#define A1 0.254829592 +#define A2 -0.284496736 +#define A3 1.421413741 +#define A4 -1.453152027 +#define A5 1.061405429 + +/* ---------------------------------------------------------------------- */ + +PairSpinLongQsymp::PairSpinLongQsymp(LAMMPS *lmp) : PairSpin(lmp), +lockfixnvespin(NULL) +{ + single_enable = 0; + ewaldflag = pppmflag = spinflag = 1; + respa_enable = 0; + no_virial_fdotr_compute = 1; + lattice_flag = 0; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + +} + +/* ---------------------------------------------------------------------- + free all arrays +------------------------------------------------------------------------- */ + +PairSpinLongQsymp::~PairSpinLongQsymp() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cut_spin_long); + memory->destroy(cutsq); + } +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::settings(int narg, char **arg) +{ + if (narg < 1 || narg > 2) + error->all(FLERR,"Incorrect args in pair_style command"); + + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"Spin simulations require metal unit style"); + + cut_spin_long_global = force->numeric(FLERR,arg[0]); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i+1; j <= atom->ntypes; j++) { + if (setflag[i][j]) { + cut_spin_long[i][j] = cut_spin_long_global; + } + } + } + } + +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::coeff(int narg, char **arg) +{ + if (!allocated) allocate(); + + // check if args correct + + if (strcmp(arg[2],"long") != 0) + error->all(FLERR,"Incorrect args in pair_style command"); + if (narg < 1 || narg > 4) + error->all(FLERR,"Incorrect args in pair_style command"); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double spin_long_cut_one = force->numeric(FLERR,arg[3]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + setflag[i][j] = 1; + cut_spin_long[i][j] = spin_long_cut_one; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::init_style() +{ + if (!atom->sp_flag) + error->all(FLERR,"Pair spin requires atom/spin style"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + // checking if nve/spin is a listed fix + + int ifix = 0; + while (ifix < modify->nfix) { + if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + ifix++; + } + if (ifix == modify->nfix) + error->all(FLERR,"pair/spin style requires nve/spin"); + + // get the lattice_flag from nve/spin + + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { + lockfixnvespin = (FixNVESpin *) modify->fix[i]; + lattice_flag = lockfixnvespin->lattice_flag; + } + } + + // insure use of KSpace long-range solver, set g_ewald + + if (force->kspace == NULL) + error->all(FLERR,"Pair style requires a KSpace style"); + + g_ewald = force->kspace->g_ewald; + +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSpinLongQsymp::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + cut_spin_long[j][i] = cut_spin_long[i][j]; + + return cut_spin_long_global; +} + +/* ---------------------------------------------------------------------- + extract the larger cutoff if "cut" or "cut_coul" +------------------------------------------------------------------------- */ + +void *PairSpinLongQsymp::extract(const char *str, int &dim) +{ + if (strcmp(str,"cut") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"ewald_order") == 0) { + ewald_order = 0; + ewald_order |= 1<<1; + ewald_order |= 1<<3; + dim = 0; + return (void *) &ewald_order; + } else if (strcmp(str,"ewald_mix") == 0) { + dim = 0; + return (void *) &mix_flag; + } + return NULL; +} + +/* ---------------------------------------------------------------------- */ + +void PairSpinLongQsymp::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double r,rinv,r2inv,rsq; + double grij,expm2,t,erfc,erf; + double sjdotr,gigj; + double bij[4]; + double cij[4]; + double evdwl,ecoul; + double xi[3],rij[3]; + double spi[4],spj[4],fi[3],fmi[3]; + double fmx_erf_s,fmy_erf_s,fmz_erf_s; + double local_cut2; + double pre1,pre2,pre3; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double **fm = atom->fm; + double **fm_long = atom->fm_long; + double **sp = atom->sp; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + pre1 = 2.0 * g_ewald / MY_PIS; + pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; + pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; + + // computation of the exchange interaction + // loop over atoms and their neighbors + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + itype = type[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; + + evdwl = 0.0; + + fi[0] = fi[1] = fi[2] = 0.0; + fmi[0] = fmi[1] = fmi[2] = 0.0; + fmx_erf_s = fmy_erf_s = fmz_erf_s = 0.0; + bij[0] = bij[1] = bij[2] = bij[3] = 0.0; + cij[0] = cij[1] = cij[2] = cij[3] = 0.0; + + rij[0] = x[j][0] - xi[0]; + rij[1] = x[j][1] - xi[1]; + rij[2] = x[j][2] - xi[2]; + rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + erf = 1.0 - t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + + // evaluating erfc for mech. force and energy calc. + + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + compute_long(i,j,rij,bij,fmi,spi,spj); + compute_long_mech(i,j,rij,bij,fmi,spi,spj); + + // evaluating erf comp. for fm_kspace correction + + cij[0] = erf * rinv; + cij[1] = (bij[0] + pre1*expm2) * r2inv; + cij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + //cij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + gigj = spi[3] * spj[3]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + // evaluating short-range correction to the kspace part on [0,rc] + + fmx_erf_s += gigj * (cij[2] * sjdotr * rij[0] - cij[1] * spj[0]); + fmy_erf_s += gigj * (cij[2] * sjdotr * rij[1] - cij[1] * spj[1]); + fmz_erf_s += gigj * (cij[2] * sjdotr * rij[2] - cij[1] * spj[2]); + + } + + // force accumulation + + f[i][0] += fi[0] * mub2mu0; + f[i][1] += fi[1] * mub2mu0; + f[i][2] += fi[2] * mub2mu0; + fm[i][0] += fmi[0] * mub2mu0hbinv; + fm[i][1] += fmi[1] * mub2mu0hbinv; + fm[i][2] += fmi[2] * mub2mu0hbinv; + + // correction of the fm_kspace + + fm_long[i][0] -= mub2mu0hbinv * fmx_erf_s; + fm_long[i][1] -= mub2mu0hbinv * fmy_erf_s; + fm_long[i][2] -= mub2mu0hbinv * fmz_erf_s; + + if (newton_pair || j < nlocal) { + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; + f[j][2] -= fi[2]; + } + + if (eflag) { + if (rsq <= local_cut2) { + evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + + spi[2]*fmi[2]; + evdwl *= hbar; + } + } else evdwl = 0.0; + + + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, + evdwl,ecoul,fi[0],fi[1],fi[2],rij[0],rij[1],rij[2]); + + } + } +} + +/* ---------------------------------------------------------------------- + update the pair interaction fmi acting on the spin ii + adding 1/r (for r in [0,rc]) contribution to the pair + removing erf(r)/r (for r in [0,rc]) from the kspace force +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) +{ + int i,j,jj,jnum,itype,jtype; + double r,rinv,r2inv,r3inv,rsq; + double grij,expm2,t,erf; + double sjdotr,sjdotrr3inv; + double b1,b2,gigj; + double bij[4],xi[3],rij[3]; + double spi[4],spj[4]; + double local_cut2; + double pre1,pre2,pre3; + int *ilist,*jlist,*numneigh,**firstneigh; + //double fmx_erf_s,fmy_erf_s,fmz_erf_s; + double fmx_s,fmy_s,fmz_s; + //double fmx_long,fmy_long,fmz_long; + + double **x = atom->x; + double **sp = atom->sp; + double **fm_long = atom->fm_long; + int *type = atom->type; + + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + pre1 = 2.0 * g_ewald / MY_PIS; + pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; + pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; + + // computation of the exchange interaction + // loop over neighbors of atom i + + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + itype = type[i]; + + //fmx_long = fmy_long = fmz_long = 0.0; + //fmx_erf_s = fmy_erf_s = fmz_erf_s = 0.0; + fmx_s = fmy_s = fmz_s = 0.0; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; + + bij[0] = bij[1] = bij[2] = bij[3] = 0.0; + + rij[0] = x[j][0] - xi[0]; + rij[1] = x[j][1] - xi[1]; + rij[2] = x[j][2] - xi[2]; + rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + + r = sqrt(rsq); + //grij = g_ewald * r; + //expm2 = exp(-grij*grij); + //t = 1.0 / (1.0 + EWALD_P*grij); + + // evaluating erf instead of erfc + + //erf = 1.0 - t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + + //bij[0] = erf * rinv; + //bij[1] = (bij[0] + pre1*expm2) * r2inv; + //bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + //bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + //gigj = spi[3] * spj[3]; + //sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + //b1 = bij[1]; + //b2 = bij[2]; + + // evaluating short-range correction to the kspace part on [0,rc] + + //fmx_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[0] - b1 * spj[0]); + //fmy_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[1] - b1 * spj[1]); + //fmz_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[2] - b1 * spj[2]); + + // evaluating real dipolar interaction on [0,rc] + + sjdotrr3inv = 3.0 * sjdotr * r3inv; + fmx_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[0] - sp[i][0]/r3inv); + fmy_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[1] - sp[i][1]/r3inv); + fmz_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[2] - sp[i][2]/r3inv); + + } + } + + // removing short-range erf function from kspace force + + //fmx_long = fm_long[i][0] - fmx_erf_s; + //fmy_long = fm_long[i][1] - fmy_erf_s; + //fmz_long = fm_long[i][2] - fmz_erf_s; + + // adding truncated kspace force and short-range full force + + //fmi[0] += fmx_s + fmx_long; + //fmi[1] += fmy_s + fmy_long; + //fmi[2] += fmz_s + fmz_long; + fmi[0] += (fmx_s + fm_long[i][0]); + fmi[1] += (fmy_s + fm_long[i][1]); + fmi[2] += (fmz_s + fm_long[i][2]); +} + +/* ---------------------------------------------------------------------- + compute dipolar interaction between spins i and j +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::compute_long(int i, int j, double rij[3], + double bij[4], double fmi[3], double spi[4], double spj[4]) +{ + double sjdotr; + double b1,b2,gigj; + + gigj = spi[3] * spj[3]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + b1 = bij[1]; + b2 = bij[2]; + + fmi[0] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); + fmi[1] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); + fmi[2] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); +} + +/* ---------------------------------------------------------------------- + compute the mechanical force due to the dipolar interaction between + atom i and atom j +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::compute_long_mech(int i, int j, double rij[3], + double bij[4], double fi[3], double spi[3], double spj[3]) +{ + double sdots,sidotr,sjdotr,b2,b3; + double g1,g2,g1b2_g2b3,gigj; + + gigj = spi[3] * spj[3]; + sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + b2 = bij[2]; + b3 = bij[3]; + g1 = sdots; + g2 = -sidotr*sjdotr; + g1b2_g2b3 = g1*b2 + g2*b3; + + fi[0] += gigj * (rij[0] * g1b2_g2b3 + + b2 * (sjdotr*spi[0] + sidotr*spj[0])); + fi[1] += gigj * (rij[1] * g1b2_g2b3 + + b2 * (sjdotr*spi[1] + sidotr*spj[1])); + fi[2] += gigj * (rij[2] * g1b2_g2b3 + + b2 * (sjdotr*spi[2] + sidotr*spj[2])); +} + + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cut_spin_long,n+1,n+1,"pair/spin/long:cut_spin_long"); + memory->create(cutsq,n+1,n+1,"pair/spin/long:cutsq"); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&cut_spin_long[i][j],sizeof(int),1,fp); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::read_restart(FILE *fp) +{ + read_restart_settings(fp); + + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&cut_spin_long[i][j],sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::write_restart_settings(FILE *fp) +{ + fwrite(&cut_spin_long_global,sizeof(double),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_spin_long_global,sizeof(double),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); +} diff --git a/src/SPIN/pair_spin_long_qsymp.h b/src/SPIN/pair_spin_long_qsymp.h new file mode 100644 index 0000000000..ae8c5a3864 --- /dev/null +++ b/src/SPIN/pair_spin_long_qsymp.h @@ -0,0 +1,100 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(spin/long/qsymp,PairSpinLongQsymp) + +#else + +#ifndef LMP_PAIR_SPIN_LONG_QSYMP_H +#define LMP_PAIR_SPIN_LONG_QSYMP_H + +#include "pair_spin.h" + +namespace LAMMPS_NS { + +class PairSpinLongQsymp : public PairSpin { + public: + double cut_coul; + double **sigma; + + PairSpinLongQsymp(class LAMMPS *); + ~PairSpinLongQsymp(); + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + void init_style(); + void *extract(const char *, int &); + + void compute(int, int); + void compute_single_pair(int, double *); + + void compute_long(int, int, double *, double *, double *, + double *, double *); + void compute_long_mech(int, int, double *, double *, double *, + double *, double *); + + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + + double cut_spin_long_global; // global long cutoff distance + + protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force + + double **cut_spin_long; // cutoff distance long + + double g_ewald; + int ewald_order; + + int lattice_flag; // flag for mech force computation + class FixNVESpin *lockfixnvespin; // ptr for setups + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args in pair_style command + +Self-explanatory. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair dipole/long requires atom attributes q, mu, torque + +The atom style defined does not have these attributes. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Pair style requires a KSpace style + +No kspace style is defined. + +*/ From b9e33e631f81fac627b09fefcb0e285b1148668c Mon Sep 17 00:00:00 2001 From: "Stan Gerald Moore (stamoor)" Date: Sat, 15 Sep 2018 13:34:24 -0600 Subject: [PATCH 10/90] Fix bug in ewald_dipole forces --- src/KSPACE/ewald_dipole.cpp | 84 ++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index d7c3aad206..f5746ec31c 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -443,7 +443,7 @@ void EwaldDipole::compute(int eflag, int vflag) sypz = sn[ky][1][i]*cs[kz][2][i] + cs[ky][1][i]*sn[kz][2][i]; exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; - partial = expim*sfacrl_all[k] - exprl*sfacim_all[k]; + partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial*eg[k][0]; ek[i][1] += partial*eg[k][1]; ek[i][2] += partial*eg[k][2]; @@ -465,14 +465,12 @@ void EwaldDipole::compute(int eflag, int vflag) const double muscale = qqrd2e * scale; for (i = 0; i < nlocal; i++) { - for (k = 0; k < kcount; k++) { - //f[i][0] += qscale * q[i]*ek[i][0]; - //f[i][1] += qscale * q[i]*ek[i][1]; - //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; - f[i][0] += muscale * muk[k][i] * ek[i][0]; - f[i][1] += muscale * muk[k][i] * ek[i][1]; - if (slabflag != 2) f[i][2] += muscale * muk[k][i] * ek[i][2]; - } + //f[i][0] += qscale * q[i]*ek[i][0]; + //f[i][1] += qscale * q[i]*ek[i][1]; + //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; + f[i][0] += muscale * ek[i][0]; + f[i][1] += muscale * ek[i][1]; + if (slabflag != 2) f[i][2] += muscale * ek[i][2]; } // sum global energy across Kspace vevs and add in volume-dependent term @@ -548,7 +546,7 @@ void EwaldDipole::eik_dot_r() // define first val. of cos and sin for (ic = 0; ic < 3; ic++) { - sqk = (unitk[ic] * unitk[ic]); + sqk = unitk[ic]*unitk[ic]; if (sqk <= gsqmx) { cstr1 = 0.0; sstr1 = 0.0; @@ -557,8 +555,8 @@ void EwaldDipole::eik_dot_r() sn[0][ic][i] = 0.0; cs[1][ic][i] = cos(unitk[ic]*x[i][ic]); sn[1][ic][i] = sin(unitk[ic]*x[i][ic]); - cs[-1][ic][i] = cs[1][0][i]; - sn[-1][ic][i] = -sn[1][0][i]; + cs[-1][ic][i] = cs[1][ic][i]; + sn[-1][ic][i] = -sn[1][ic][i]; muk[n][i] = (mu[i][ic]*unitk[ic]); cstr1 += muk[n][i]*cs[1][ic][i]; sstr1 += muk[n][i]*sn[1][ic][i]; @@ -583,7 +581,7 @@ void EwaldDipole::eik_dot_r() cs[m-1][ic][i]*sn[1][ic][i]; cs[-m][ic][i] = cs[m][ic][i]; sn[-m][ic][i] = -sn[m][ic][i]; - muk[n][i] = (mu[i][ic]*m*unitk[ic]); + muk[n][i] = (mu[i][ic]*m*unitk[ic]); cstr1 += muk[n][i]*cs[m][ic][i]; sstr1 += muk[n][i]*sn[m][ic][i]; } @@ -604,16 +602,16 @@ void EwaldDipole::eik_dot_r() cstr2 = 0.0; sstr2 = 0.0; for (i = 0; i < nlocal; i++) { - mux = mu[i][0]; - muy = mu[i][1]; + mux = mu[i][0]; + muy = mu[i][1]; - // dir 1: (k,l,0) - muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1]); + // dir 1: (k,l,0) + muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1]); cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); - // dir 2: (k,-l,0) - muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1]); + // dir 2: (k,-l,0) + muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1]); cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); } @@ -636,16 +634,16 @@ void EwaldDipole::eik_dot_r() cstr2 = 0.0; sstr2 = 0.0; for (i = 0; i < nlocal; i++) { - muy = mu[i][1]; - muz = mu[i][2]; + muy = mu[i][1]; + muz = mu[i][2]; - // dir 1: (0,l,m) - muk[n][i] = (muy*l*unitk[1] + muz*m*unitk[2]); + // dir 1: (0,l,m) + muk[n][i] = (muy*l*unitk[1] + muz*m*unitk[2]); cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); - // dir 2: (0,l,-m) - muk[n+1][i] = (muy*l*unitk[1] - muz*m*unitk[2]); + // dir 2: (0,l,-m) + muk[n+1][i] = (muy*l*unitk[1] - muz*m*unitk[2]); cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); } @@ -656,7 +654,7 @@ void EwaldDipole::eik_dot_r() } } } - + // 1 = (k,0,m), 2 = (k,0,-m) for (k = 1; k <= kxmax; k++) { @@ -668,16 +666,16 @@ void EwaldDipole::eik_dot_r() cstr2 = 0.0; sstr2 = 0.0; for (i = 0; i < nlocal; i++) { - mux = mu[i][0]; - muz = mu[i][2]; + mux = mu[i][0]; + muz = mu[i][2]; - // dir 1: (k,0,m) - muk[n][i] = (mux*k*unitk[0] + muz*m*unitk[2]); + // dir 1: (k,0,m) + muk[n][i] = (mux*k*unitk[0] + muz*m*unitk[2]); cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); - // dir 2: (k,0,-m) - muk[n+1][i] = (mux*k*unitk[0] - muz*m*unitk[2]); + // dir 2: (k,0,-m) + muk[n+1][i] = (mux*k*unitk[0] - muz*m*unitk[2]); cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); } @@ -706,33 +704,33 @@ void EwaldDipole::eik_dot_r() cstr4 = 0.0; sstr4 = 0.0; for (i = 0; i < nlocal; i++) { - mux = mu[i][0]; - muy = mu[i][1]; - muz = mu[i][2]; + mux = mu[i][0]; + muy = mu[i][1]; + muz = mu[i][2]; - // dir 1: (k,l,m) - muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); + // dir 1: (k,l,m) + muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); - // dir 2: (k,-l,m) - muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); + // dir 2: (k,-l,m) + muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); - // dir 3: (k,l,-m) - muk[n+2][i] = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); + // dir 3: (k,l,-m) + muk[n+2][i] = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); - // dir 4: (k,-l,-m) - muk[n+3][i] = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); + // dir 4: (k,-l,-m) + muk[n+3][i] = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); From cce9fe4a34b39e81ec17e863bd9b42e3248edbb5 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 21 Sep 2018 09:55:41 -0600 Subject: [PATCH 11/90] Commit2 JT 092118 - created pair_spin_dipolar_cut - real-space short-range calc of the spin dipolar interaction - run and check valgrind ok --- .../SPIN/pppm_spin/in.spin.spin_dipolar_cut | 62 ++ src/SPIN/pair_spin_dipolar_cut.cpp | 528 ++++++++++++++++++ src/SPIN/pair_spin_dipolar_cut.h | 100 ++++ 3 files changed, 690 insertions(+) create mode 100644 examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut create mode 100644 src/SPIN/pair_spin_dipolar_cut.cpp create mode 100644 src/SPIN/pair_spin_dipolar_cut.h diff --git a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut new file mode 100644 index 0000000000..838181e6d8 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut @@ -0,0 +1,62 @@ +# hcp cobalt in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice hcp 2.5071 +region box block 0.0 8.0 0.0 8.0 0.0 8.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for hcp cobalt + +mass 1 58.93 + +#set group all spin/random 31 1.72 +set group all spin 1.72 0.0 0.0 1.0 +velocity all create 100 4928459 rot yes dist gaussian + +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 +pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * spin/dipolar/cut long 8.0 +#pair_coeff * * spin/long long 8.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +#fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 +fix 3 all nve/spin lattice yes + +timestep 0.0001 + + +compute out_mag all compute/spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo_style custom step time v_magnorm v_emag temp etotal +thermo 10 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +#run 20000 +run 10 diff --git a/src/SPIN/pair_spin_dipolar_cut.cpp b/src/SPIN/pair_spin_dipolar_cut.cpp new file mode 100644 index 0000000000..f686d12926 --- /dev/null +++ b/src/SPIN/pair_spin_dipolar_cut.cpp @@ -0,0 +1,528 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------------ + Contributing authors: Julien Tranchida (SNL) + Aidan Thompson (SNL) + + Please cite the related publication: + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include + +#include "pair_spin_dipolar_cut.h" +#include "atom.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "fix_nve_spin.h" +#include "force.h" +#include "kspace.h" +#include "math_const.h" +#include "memory.h" +#include "modify.h" +#include "error.h" +#include "update.h" + + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define EWALD_F 1.12837917 +#define EWALD_P 0.3275911 +#define A1 0.254829592 +#define A2 -0.284496736 +#define A3 1.421413741 +#define A4 -1.453152027 +#define A5 1.061405429 + +/* ---------------------------------------------------------------------- */ + +PairSpinDipolarCut::PairSpinDipolarCut(LAMMPS *lmp) : PairSpin(lmp), +lockfixnvespin(NULL) +{ + single_enable = 0; + spinflag = 1; + respa_enable = 0; + no_virial_fdotr_compute = 1; + lattice_flag = 0; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + +} + +/* ---------------------------------------------------------------------- + free all arrays +------------------------------------------------------------------------- */ + +PairSpinDipolarCut::~PairSpinDipolarCut() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cut_spin_long); + memory->destroy(cutsq); + } +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::settings(int narg, char **arg) +{ + if (narg < 1 || narg > 2) + error->all(FLERR,"Incorrect args in pair_style command"); + + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"Spin simulations require metal unit style"); + + cut_spin_long_global = force->numeric(FLERR,arg[0]); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i+1; j <= atom->ntypes; j++) { + if (setflag[i][j]) { + cut_spin_long[i][j] = cut_spin_long_global; + } + } + } + } + +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::coeff(int narg, char **arg) +{ + if (!allocated) allocate(); + + // check if args correct + + if (strcmp(arg[2],"long") != 0) + error->all(FLERR,"Incorrect args in pair_style command"); + if (narg < 1 || narg > 4) + error->all(FLERR,"Incorrect args in pair_style command"); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double spin_long_cut_one = force->numeric(FLERR,arg[3]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + setflag[i][j] = 1; + cut_spin_long[i][j] = spin_long_cut_one; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::init_style() +{ + if (!atom->sp_flag) + error->all(FLERR,"Pair spin requires atom/spin style"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + // checking if nve/spin is a listed fix + + int ifix = 0; + while (ifix < modify->nfix) { + if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + ifix++; + } + if (ifix == modify->nfix) + error->all(FLERR,"pair/spin style requires nve/spin"); + + // get the lattice_flag from nve/spin + + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { + lockfixnvespin = (FixNVESpin *) modify->fix[i]; + lattice_flag = lockfixnvespin->lattice_flag; + } + } + +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSpinDipolarCut::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + cut_spin_long[j][i] = cut_spin_long[i][j]; + + return cut_spin_long_global; +} + +/* ---------------------------------------------------------------------- + extract the larger cutoff if "cut" or "cut_coul" +------------------------------------------------------------------------- */ + +void *PairSpinDipolarCut::extract(const char *str, int &dim) +{ + if (strcmp(str,"cut") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"ewald_order") == 0) { + ewald_order = 0; + ewald_order |= 1<<1; + ewald_order |= 1<<3; + dim = 0; + return (void *) &ewald_order; + } else if (strcmp(str,"ewald_mix") == 0) { + dim = 0; + return (void *) &mix_flag; + } + return NULL; +} + +/* ---------------------------------------------------------------------- */ + +void PairSpinDipolarCut::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double rinv,r2inv,r3inv,rsq; + double evdwl,ecoul; + double xi[3],rij[3]; + double spi[4],spj[4],fi[3],fmi[3]; + double local_cut2; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double **fm = atom->fm; + double **sp = atom->sp; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // computation of the exchange interaction + // loop over atoms and their neighbors + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + itype = type[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; + + fi[0] = fi[1] = fi[2] = 0.0; + fmi[0] = fmi[1] = fmi[2] = 0.0; + + rij[0] = x[j][0] - xi[0]; + rij[1] = x[j][1] - xi[1]; + rij[2] = x[j][2] - xi[2]; + rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + + compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); + if (lattice_flag) compute_dipolar_mech(i,j,rij,fmi,spi,spj,r2inv); + } + + // force accumulation + + f[i][0] += fi[0]; + f[i][1] += fi[1]; + f[i][2] += fi[2]; + fm[i][0] += fmi[0]; + fm[i][1] += fmi[1]; + fm[i][2] += fmi[2]; + + if (newton_pair || j < nlocal) { + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; + f[j][2] -= fi[2]; + } + + if (eflag) { + if (rsq <= local_cut2) { + evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + + spi[2]*fmi[2]; + evdwl *= hbar; + } + } else evdwl = 0.0; + + + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, + evdwl,ecoul,fi[0],fi[1],fi[2],rij[0],rij[1],rij[2]); + + } + } +} + +/* ---------------------------------------------------------------------- + update the pair interaction fmi acting on the spin ii + adding 1/r (for r in [0,rc]) contribution to the pair + removing erf(r)/r (for r in [0,rc]) from the kspace force +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) +{ + int i,j,jj,jnum,itype,jtype; + double rsq,rinv,r2inv,r3inv; + double xi[3],rij[3]; + double spi[4],spj[4]; + double local_cut2; + int *ilist,*jlist,*numneigh,**firstneigh; + + double **x = atom->x; + double **sp = atom->sp; + int *type = atom->type; + + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // computation of the exchange interaction + // loop over neighbors of atom i + + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + itype = type[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; + + rij[0] = x[j][0] - xi[0]; + rij[1] = x[j][1] - xi[1]; + rij[2] = x[j][2] - xi[2]; + rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + + // compute dipolar interaction + + compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); + } + } + + //fmi[0] *= mub2mu0hbinv; + //fmi[1] *= mub2mu0hbinv; + //fmi[2] *= mub2mu0hbinv; +} + +/* ---------------------------------------------------------------------- + compute dipolar interaction between spins i and j +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::compute_dipolar(int i, int j, double rij[3], + double fmi[3], double spi[4], double spj[4], double r3inv) +{ + double sjdotr; + double gigjri2,pre; + + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + gigjri2 = (spi[3] * spj[3])*r3inv; + pre = mub2mu0hbinv * gigjri2 / 4.0 / MY_PI; + + fmi[0] += pre * gigjri2 * (3.0 * sjdotr *rij[0] - spj[0]); + fmi[1] += pre * gigjri2 * (3.0 * sjdotr *rij[1] - spj[1]); + fmi[2] += pre * gigjri2 * (3.0 * sjdotr *rij[2] - spj[2]); +} + +/* ---------------------------------------------------------------------- + compute the mechanical force due to the dipolar interaction between + atom i and atom j +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::compute_dipolar_mech(int i, int j, double rij[3], + double fi[3], double spi[3], double spj[3], double r2inv) +{ + double sdots,sidotr,sjdotr,b2,b3; + double gigjri4,bij,pre; + + gigjri4 = (spi[3] * spj[3])/r2inv/r2inv; + sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + bij = sdots - 5.0 * sidotr*sjdotr; + pre = mub2mu0 * bij / 4.0 / MY_PI; + fi[0] += pre * (rij[0] * bij + (sjdotr*spi[0] + sidotr*spj[0])); + fi[1] += pre * (rij[1] * bij + (sjdotr*spi[1] + sidotr*spj[1])); + fi[2] += pre * (rij[2] * bij + (sjdotr*spi[2] + sidotr*spj[2])); +} + + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cut_spin_long,n+1,n+1,"pair/spin/long:cut_spin_long"); + memory->create(cutsq,n+1,n+1,"pair/spin/long:cutsq"); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&cut_spin_long[i][j],sizeof(int),1,fp); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::read_restart(FILE *fp) +{ + read_restart_settings(fp); + + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&cut_spin_long[i][j],sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::write_restart_settings(FILE *fp) +{ + fwrite(&cut_spin_long_global,sizeof(double),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_spin_long_global,sizeof(double),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); +} diff --git a/src/SPIN/pair_spin_dipolar_cut.h b/src/SPIN/pair_spin_dipolar_cut.h new file mode 100644 index 0000000000..ac17ac2120 --- /dev/null +++ b/src/SPIN/pair_spin_dipolar_cut.h @@ -0,0 +1,100 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(spin/dipolar/cut,PairSpinDipolarCut) + +#else + +#ifndef LMP_PAIR_SPIN_DIPOLAR_CUT_H +#define LMP_PAIR_SPIN_DIPOLAR_CUT_H + +#include "pair_spin.h" + +namespace LAMMPS_NS { + +class PairSpinDipolarCut : public PairSpin { + public: + double cut_coul; + double **sigma; + + PairSpinDipolarCut(class LAMMPS *); + ~PairSpinDipolarCut(); + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + void init_style(); + void *extract(const char *, int &); + + void compute(int, int); + void compute_single_pair(int, double *); + + void compute_dipolar(int, int, double *, double *, double *, + double *, double); + void compute_dipolar_mech(int, int, double *, double *, double *, + double *, double); + + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + + double cut_spin_long_global; // global long cutoff distance + + protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force + + double **cut_spin_long; // cutoff distance long + + double g_ewald; + int ewald_order; + + int lattice_flag; // flag for mech force computation + class FixNVESpin *lockfixnvespin; // ptr for setups + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args in pair_style command + +Self-explanatory. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair dipole/long requires atom attributes q, mu, torque + +The atom style defined does not have these attributes. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Pair style requires a KSpace style + +No kspace style is defined. + +*/ From 53a779067ee59366eb96fddfd2c37e0471c0c4bf Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 24 Sep 2018 10:59:17 -0600 Subject: [PATCH 12/90] Commit JT 092418 - ewald_dipole_spin added - accuracy problem (with eval of gewald and Newton solver) --- examples/SPIN/pppm_spin/in.spin.ewald_spin | 67 ++ src/KSPACE/ewald_dipole.cpp | 6 +- src/KSPACE/ewald_dipole.h | 3 - src/KSPACE/ewald_dipole_spin.cpp | 895 +++++++++++++++++++++ src/KSPACE/ewald_dipole_spin.h | 102 +++ 5 files changed, 1067 insertions(+), 6 deletions(-) create mode 100644 examples/SPIN/pppm_spin/in.spin.ewald_spin create mode 100644 src/KSPACE/ewald_dipole_spin.cpp create mode 100644 src/KSPACE/ewald_dipole_spin.h diff --git a/examples/SPIN/pppm_spin/in.spin.ewald_spin b/examples/SPIN/pppm_spin/in.spin.ewald_spin new file mode 100644 index 0000000000..d9ca46b27a --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.ewald_spin @@ -0,0 +1,67 @@ +# hcp cobalt in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice hcp 2.5071 +region box block 0.0 8.0 0.0 8.0 0.0 8.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for hcp cobalt + +mass 1 58.93 + +#set group all spin/random 31 1.72 +set group all spin 1.72 0.0 0.0 1.0 +velocity all create 100 4928459 rot yes dist gaussian + +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long/qsymp 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 +pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +#pair_coeff * * spin/long/qsymp long 8.0 +pair_coeff * * spin/long long 8.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +#kspace_style pppm/dipole/spin 1.0e-4 +#kspace_style ewald/dipole/spin 1.0e-4 +kspace_style ewald/dipole/spin 1.0e-2 +kspace_modify mesh 32 32 32 + +#fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 +fix 3 all nve/spin lattice yes + +timestep 0.0001 + + +compute out_mag all compute/spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo_style custom step time v_magnorm v_emag temp etotal +thermo 10 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +#run 20000 +run 1 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 372825d587..42d850dcc2 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -161,6 +161,8 @@ void EwaldDipole::init() // zprd used rather than zprd_slab if (!gewaldflag) { + if (accuracy <= 0.0) + error->all(FLERR,"KSpace accuracy must be > 0"); double g_ewald_new = NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; @@ -778,14 +780,12 @@ void EwaldDipole::slabcorr() { // compute local contribution to global dipole moment - //double *q = atom->q; double **x = atom->x; double zprd = domain->zprd; int nlocal = atom->nlocal; double dipole = 0.0; double **mu = atom->mu; - //for (int i = 0; i < nlocal; i++) dipole += q[i]*x[i][2]; for (int i = 0; i < nlocal; i++) dipole += mu[i][2]; // sum local contributions to get global dipole moment @@ -856,7 +856,7 @@ void EwaldDipole::musum_musq() } if (mu2 == 0 && comm->me == 0) - error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); + error->all(FLERR,"Using kspace solver EwaldDipole on system with no dipoles"); } /* ---------------------------------------------------------------------- diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index f937b2a2c2..0a57f86d00 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -38,9 +38,6 @@ class EwaldDipole : public Ewald { double **tk; // field for torque double **vc; // virial per k - //virtual void allocate(); - //void deallocate(); - void musum_musq(); double rms_dipole(int, double, bigint); virtual void eik_dot_r(); diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp new file mode 100644 index 0000000000..5522b18e03 --- /dev/null +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -0,0 +1,895 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Julien Tranchida (SNL) + Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include "ewald_dipole_spin.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "pair.h" +#include "domain.h" +#include "math_const.h" +#include "math_special.h" +#include "memory.h" +#include "error.h" +#include "update.h" + +#include "math_const.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; + +#define SMALL 0.00001 + +/* ---------------------------------------------------------------------- */ + +EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp, int narg, char **arg) : + EwaldDipole(lmp, narg, arg) +{ + dipoleflag = 0; + spinflag = 1; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz +} + +/* ---------------------------------------------------------------------- + free all memory +------------------------------------------------------------------------- */ + +EwaldDipoleSpin::~EwaldDipoleSpin() +{ + //memory->destroy(muk); + //memory->destroy(tk); + //memory->destroy(vc); +} + +/* ---------------------------------------------------------------------- + called once before run +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::init() +{ + if (comm->me == 0) { + if (screen) fprintf(screen,"EwaldDipoleSpin initialization ...\n"); + if (logfile) fprintf(logfile,"EwaldDipoleSpin initialization ...\n"); + } + + // error check + + //dipoleflag = atom->mu?1:0; + spinflag = atom->sp?1:0; + //qsum_qsq(0); // q[i] might not be declared ? + + //if (dipoleflag && q2) + // error->all(FLERR,"Cannot (yet) use charges with Kspace style EwaldDipoleSpin"); + + triclinic_check(); + + // no triclinic ewald spin (yet) + + triclinic = domain->triclinic; + if (triclinic) + error->all(FLERR,"Cannot (yet) use EwaldDipoleSpin with triclinic box"); + + if (domain->dimension == 2) + error->all(FLERR,"Cannot use EwaldDipoleSpin with 2d simulation"); + + if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); +//if (!atom->q_flag) error->all(FLERR,"Kspace style requires atom attribute q"); + + if ((spinflag && strcmp(update->unit_style,"metal")) != 0) + error->all(FLERR,"'metal' units have to be used with spins"); + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with EwaldDipoleSpin"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab EwaldDipoleSpin"); + } + + // extract short-range Coulombic cutoff from pair style + + pair_check(); + + int itmp; + double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + if (p_cutoff == NULL) + error->all(FLERR,"KSpace style is incompatible with Pair style"); + double cutoff = *p_cutoff; + + // kspace TIP4P not yet supported + // qdist = offset only for TIP4P fictitious charge + + //qdist = 0.0; + if (tip4pflag) + error->all(FLERR,"Cannot yet use TIP4P with EwaldDipoleSpin"); + + // compute musum & musqsum and warn if no spin + + scale = 1.0; + qqrd2e = force->qqrd2e; + //musum_musq(); + spsum_musq(); + natoms_original = atom->natoms; + + // set accuracy (force units) from accuracy_relative or accuracy_absolute + + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; + else accuracy = accuracy_relative * two_charge_force; + + // setup K-space resolution + + bigint natoms = atom->natoms; + + // use xprd,yprd,zprd even if triclinic so grid size is the same + // adjust z dimension for 2d slab EwaldDipoleSpin + // 3d EwaldDipoleSpin just uses zprd since slab_volfactor = 1.0 + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double zprd_slab = zprd*slab_volfactor; + + // make initial g_ewald estimate + // based on desired accuracy and real space cutoff + // fluid-occupied volume used to estimate real-space error + // zprd used rather than zprd_slab + + if (!gewaldflag) { + if (accuracy <= 0.0) + error->all(FLERR,"KSpace accuracy must be > 0"); + double g_ewald_new = + NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + if (g_ewald_new > 0.0) g_ewald = g_ewald_new; + else error->warning(FLERR,"Ewald/disp Newton solver failed, " + "using old method to estimate g_ewald"); + } + + // setup EwaldDipoleSpin coefficients so can print stats + + setup(); + + // final RMS accuracy + + double lprx = rms(kxmax_orig,xprd,natoms,q2); + double lpry = rms(kymax_orig,yprd,natoms,q2); + double lprz = rms(kzmax_orig,zprd_slab,natoms,q2); + double lpr = sqrt(lprx*lprx + lpry*lpry + lprz*lprz) / sqrt(3.0); + double q2_over_sqrt = q2 / sqrt(natoms*cutoff*xprd*yprd*zprd_slab); + double spr = 2.0 *q2_over_sqrt * exp(-g_ewald*g_ewald*cutoff*cutoff); + double tpr = estimate_table_accuracy(q2_over_sqrt,spr); + double estimated_accuracy = sqrt(lpr*lpr + spr*spr + tpr*tpr); + + // stats + + if (comm->me == 0) { + if (screen) { + fprintf(screen," G vector (1/distance) = %g\n",g_ewald); + fprintf(screen," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(screen," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(screen," KSpace vectors: actual max1d max3d = %d %d %d\n", + kcount,kmax,kmax3d); + fprintf(screen," kxmax kymax kzmax = %d %d %d\n", + kxmax,kymax,kzmax); + } + if (logfile) { + fprintf(logfile," G vector (1/distance) = %g\n",g_ewald); + fprintf(logfile," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(logfile," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(logfile," KSpace vectors: actual max1d max3d = %d %d %d\n", + kcount,kmax,kmax3d); + fprintf(logfile," kxmax kymax kzmax = %d %d %d\n", + kxmax,kymax,kzmax); + } + } +} + +/* ---------------------------------------------------------------------- + adjust EwaldDipoleSpin coeffs, called initially and whenever volume has changed +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::setup() +{ + // volume-dependent factors + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + + // adjustment of z dimension for 2d slab EwaldDipoleSpin + // 3d EwaldDipoleSpin just uses zprd since slab_volfactor = 1.0 + + double zprd_slab = zprd*slab_volfactor; + volume = xprd * yprd * zprd_slab; + + unitk[0] = 2.0*MY_PI/xprd; + unitk[1] = 2.0*MY_PI/yprd; + unitk[2] = 2.0*MY_PI/zprd_slab; + + int kmax_old = kmax; + + if (kewaldflag == 0) { + + // determine kmax + // function of current box size, accuracy, G_ewald (short-range cutoff) + + bigint natoms = atom->natoms; + double err; + kxmax = 1; + kymax = 1; + kzmax = 1; + + // set kmax in 3 directions to respect accuracy + + err = rms_dipole(kxmax,xprd,natoms); + while (err > accuracy) { + kxmax++; + err = rms_dipole(kxmax,xprd,natoms); + } + + err = rms_dipole(kymax,yprd,natoms); + while (err > accuracy) { + kymax++; + err = rms_dipole(kymax,yprd,natoms); + } + + err = rms_dipole(kzmax,zprd,natoms); + while (err > accuracy) { + kzmax++; + err = rms_dipole(kzmax,zprd,natoms); + } + + kmax = MAX(kxmax,kymax); + kmax = MAX(kmax,kzmax); + kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + + double gsqxmx = unitk[0]*unitk[0]*kxmax*kxmax; + double gsqymx = unitk[1]*unitk[1]*kymax*kymax; + double gsqzmx = unitk[2]*unitk[2]*kzmax*kzmax; + gsqmx = MAX(gsqxmx,gsqymx); + gsqmx = MAX(gsqmx,gsqzmx); + + kxmax_orig = kxmax; + kymax_orig = kymax; + kzmax_orig = kzmax; + + } else { + + kxmax = kx_ewald; + kymax = ky_ewald; + kzmax = kz_ewald; + + kxmax_orig = kxmax; + kymax_orig = kymax; + kzmax_orig = kzmax; + + kmax = MAX(kxmax,kymax); + kmax = MAX(kmax,kzmax); + kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + + double gsqxmx = unitk[0]*unitk[0]*kxmax*kxmax; + double gsqymx = unitk[1]*unitk[1]*kymax*kymax; + double gsqzmx = unitk[2]*unitk[2]*kzmax*kzmax; + gsqmx = MAX(gsqxmx,gsqymx); + gsqmx = MAX(gsqmx,gsqzmx); + } + + gsqmx *= 1.00001; + + // if size has grown, reallocate k-dependent and nlocal-dependent arrays + + if (kmax > kmax_old) { + deallocate(); + allocate(); + group_allocate_flag = 0; + + memory->destroy(ek); + memory->destroy(tk); + memory->destroy(vc); + memory->destroy3d_offset(cs,-kmax_created); + memory->destroy3d_offset(sn,-kmax_created); + memory->destroy(muk); + nmax = atom->nmax; + memory->create(ek,nmax,3,"ewald_dipole_spin:ek"); + memory->create(tk,nmax,3,"ewald_dipole_spin:tk"); + memory->create(vc,kmax3d,6,"ewald_dipole_spin:tk"); + memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole_spin:cs"); + memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole_spin:sn"); + memory->create(muk,kmax3d,nmax,"ewald_dipole_spin:muk"); + kmax_created = kmax; + } + + // pre-compute EwaldDipoleSpin coefficients + + coeffs(); +} + +/* ---------------------------------------------------------------------- + compute dipole RMS accuracy for a dimension +------------------------------------------------------------------------- */ + +//double EwaldDipoleSpin::rms_dipole(int km, double prd, bigint natoms) +//{ +// if (natoms == 0) natoms = 1; // avoid division by zero +// +// // error from eq.(46), Wang et al., JCP 115, 6351 (2001) +// +// double value = 8*MY_PI*mu2*g_ewald/volume * +// sqrt(2*MY_PI*km*km*km/(15.0*natoms)) * +// exp(-MY_PI*MY_PI*km*km/(g_ewald*g_ewald*prd*prd)); +// +// return value; +//} + +/* ---------------------------------------------------------------------- + compute the EwaldDipoleSpin long-range force, energy, virial +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::compute(int eflag, int vflag) +{ + int i,j,k; + const double g3 = g_ewald*g_ewald*g_ewald; + double spx, spy, spz; + + // set energy/virial flags + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = evflag_atom = eflag_global = vflag_global = + eflag_atom = vflag_atom = 0; + + // if atom count has changed, update qsum and qsqsum + + if (atom->natoms != natoms_original) { + //musum_musq(); + spsum_musq(); + natoms_original = atom->natoms; + } + + // return if there are no charges + + if (musqsum == 0.0) return; + + // extend size of per-atom arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(ek); + memory->destroy(tk); + memory->destroy(vc); + memory->destroy3d_offset(cs,-kmax_created); + memory->destroy3d_offset(sn,-kmax_created); + memory->destroy(muk); + nmax = atom->nmax; + memory->create(ek,nmax,3,"ewald_dipole_spin:ek"); + memory->create(tk,nmax,3,"ewald_dipole_spin:tk"); + memory->create(vc,kmax3d,6,"ewald_dipole_spin:tk"); + memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole_spin:cs"); + memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole_spin:sn"); + memory->create(muk,kmax3d,nmax,"ewald_dipole_spin:muk"); + kmax_created = kmax; + } + + // partial structure factors on each processor + // total structure factor by summing over procs + + eik_dot_r(); + + MPI_Allreduce(sfacrl,sfacrl_all,kcount,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(sfacim,sfacim_all,kcount,MPI_DOUBLE,MPI_SUM,world); + + // K-space portion of electric field + // double loop over K-vectors and local atoms + // perform per-atom calculations if needed + + double **f = atom->f; + double **fm_long = atom->fm_long; + double **t = atom->torque; + //double **mu = atom->mu; + double **sp = atom->sp; + int nlocal = atom->nlocal; + + int kx,ky,kz; + double cypz,sypz,exprl,expim; + double partial,partial2,partial_peratom; + double vcik[6]; + + for (i = 0; i < nlocal; i++) { + ek[i][0] = ek[i][1] = ek[i][2] = 0.0; + tk[i][0] = tk[i][1] = tk[i][2] = 0.0; + } + + for (k = 0; k < kcount; k++) { + kx = kxvecs[k]; + ky = kyvecs[k]; + kz = kzvecs[k]; + for (j = 0; j<6; j++) vc[k][j] = 0.0; + + for (i = 0; i < nlocal; i++) { + + vcik[0] = vcik[1] = vcik[2] = 0.0; + vcik[3] = vcik[4] = vcik[5] = 0.0; + + // calculating re and im of exp(i*k*ri) + + cypz = cs[ky][1][i]*cs[kz][2][i] - sn[ky][1][i]*sn[kz][2][i]; + sypz = sn[ky][1][i]*cs[kz][2][i] + cs[ky][1][i]*sn[kz][2][i]; + exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; + expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; + + // taking im of struct_fact x exp(i*k*ri) (for force calc.) + + partial = (muk[k][i])*(expim*sfacrl_all[k] + exprl*sfacim_all[k]); + ek[i][0] += partial*eg[k][0]; + ek[i][1] += partial*eg[k][1]; + ek[i][2] += partial*eg[k][2]; + + // compute field for torque calculation + + partial2 = exprl*sfacrl_all[k] - expim*sfacim_all[k]; + tk[i][0] += partial2*eg[k][0]; + tk[i][1] += partial2*eg[k][1]; + tk[i][2] += partial2*eg[k][2]; + + // total and per-atom virial correction + + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + + vc[k][0] += vcik[0] = partial2 * spx * kx; + vc[k][1] += vcik[1] = partial2 * spy * ky; + vc[k][2] += vcik[2] = partial2 * spz * kz; + vc[k][3] += vcik[3] = partial2 * spx * ky; + vc[k][4] += vcik[4] = partial2 * spx * kz; + vc[k][5] += vcik[5] = partial2 * spy * kz; + + // taking re-part of struct_fact x exp(i*k*ri) + // (for per-atom energy and virial calc.) + + if (evflag_atom) { + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; + if (vflag_atom) + for (j = 0; j < 6; j++) + vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); + } + } + } + + // force and mag. precession vectors calculation + + const double spscale = mub2mu0 * scale; + const double spscale2 = mub2mu0hbinv * scale; + //const double muscale = qqrd2e * scale; + + for (i = 0; i < nlocal; i++) { + f[i][0] += spscale * ek[i][0]; + f[i][1] += spscale * ek[i][1]; + if (slabflag != 2) f[i][2] += spscale * ek[i][2]; + fm_long[i][0] += spscale2 * tk[i][0]; + fm_long[i][1] += spscale2 * tk[i][1]; + if (slabflag != 2) fm_long[i][2] += spscale2 * tk[i][3]; + } + + // sum global energy across Kspace vevs and add in volume-dependent term + // taking the re-part of struct_fact_i x struct_fact_j + // substracting self energy and scaling + + if (eflag_global) { + for (k = 0; k < kcount; k++) { + energy += ug[k] * (sfacrl_all[k]*sfacrl_all[k] + + sfacim_all[k]*sfacim_all[k]); + } + energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy *= spscale; + } + + // global virial + + if (vflag_global) { + double uk, vk; + for (k = 0; k < kcount; k++) { + uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); + for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] + ug[k]*vc[k][j]; + } + for (j = 0; j < 6; j++) virial[j] *= spscale; + } + + // per-atom energy/virial + // energy includes self-energy correction + + if (evflag_atom) { + if (eflag_atom) { + for (i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + eatom[i] -= (spx*spx + spy*spy + spz*spz) + *2.0*g3/3.0/MY_PIS; + eatom[i] *= spscale; + } + } + + if (vflag_atom) + for (i = 0; i < nlocal; i++) + for (j = 0; j < 6; j++) vatom[i][j] *= spscale; + } + + // 2d slab correction + + if (slabflag == 1) slabcorr(); +} + +/* ---------------------------------------------------------------------- + compute the +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::eik_dot_r() +{ + int i,k,l,m,n,ic; + double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; + double sqk,clpm,slpm; + //double mux, muy, muz; + double spx, spy, spz, spi; + + double **x = atom->x; + //double **mu = atom->mu; + double **sp = atom->sp; + int nlocal = atom->nlocal; + + n = 0; + spi = spx = spy = spz = 0.0; + + // loop on different k-directions + // loop on n kpoints and nlocal atoms + // store (n x nlocal) tab. of values of (mu_i dot k) + // store n values of sum_j[ (mu_j dot k) exp(-k dot r_j) ] + + // (k,0,0), (0,l,0), (0,0,m) + + // loop 1: k=1, l=1, m=1 + // define first val. of cos and sin + + for (ic = 0; ic < 3; ic++) { + sqk = unitk[ic]*unitk[ic]; + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + for (i = 0; i < nlocal; i++) { + cs[0][ic][i] = 1.0; + sn[0][ic][i] = 0.0; + cs[1][ic][i] = cos(unitk[ic]*x[i][ic]); + sn[1][ic][i] = sin(unitk[ic]*x[i][ic]); + cs[-1][ic][i] = cs[1][ic][i]; + sn[-1][ic][i] = -sn[1][ic][i]; + spi = sp[i][ic]*sp[i][3]; + //muk[n][i] = (mu[i][ic]*unitk[ic]); + muk[n][i] = (spi*unitk[ic]); + cstr1 += muk[n][i]*cs[1][ic][i]; + sstr1 += muk[n][i]*sn[1][ic][i]; + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + } + } + + // loop 2: k>1, l>1, m>1 + + for (m = 2; m <= kmax; m++) { + for (ic = 0; ic < 3; ic++) { + sqk = m*unitk[ic] * m*unitk[ic]; + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + for (i = 0; i < nlocal; i++) { + cs[m][ic][i] = cs[m-1][ic][i]*cs[1][ic][i] - + sn[m-1][ic][i]*sn[1][ic][i]; + sn[m][ic][i] = sn[m-1][ic][i]*cs[1][ic][i] + + cs[m-1][ic][i]*sn[1][ic][i]; + cs[-m][ic][i] = cs[m][ic][i]; + sn[-m][ic][i] = -sn[m][ic][i]; + spi = sp[i][ic]*sp[i][3]; + muk[n][i] = (spi*m*unitk[ic]); + //muk[n][i] = (mu[i][ic]*m*unitk[ic]); + cstr1 += muk[n][i]*cs[m][ic][i]; + sstr1 += muk[n][i]*sn[m][ic][i]; + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + } + } + } + + // 1 = (k,l,0), 2 = (k,-l,0) + + for (k = 1; k <= kxmax; k++) { + for (l = 1; l <= kymax; l++) { + sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + //mux = mu[i][0]; + //muy = mu[i][1]; + + // dir 1: (k,l,0) + muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1]); + cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); + sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); + + // dir 2: (k,-l,0) + muk[n+1][i] = (spx*k*unitk[0] - spy*l*unitk[1]); + cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); + sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (0,l,m), 2 = (0,l,-m) + + for (l = 1; l <= kymax; l++) { + for (m = 1; m <= kzmax; m++) { + sqk = (l*unitk[1] * l*unitk[1]) + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + //muy = mu[i][1]; + //muz = mu[i][2]; + + // dir 1: (0,l,m) + muk[n][i] = (spy*l*unitk[1] + spz*m*unitk[2]); + cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); + sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); + + // dir 2: (0,l,-m) + muk[n+1][i] = (spy*l*unitk[1] - spz*m*unitk[2]); + cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); + sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (k,0,m), 2 = (k,0,-m) + + for (k = 1; k <= kxmax; k++) { + for (m = 1; m <= kzmax; m++) { + sqk = (k*unitk[0] * k*unitk[0]) + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + //mux = mu[i][0]; + //muz = mu[i][2]; + spx = sp[i][0]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + + // dir 1: (k,0,m) + muk[n][i] = (spx*k*unitk[0] + spz*m*unitk[2]); + cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); + sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); + + // dir 2: (k,0,-m) + muk[n+1][i] = (spx*k*unitk[0] - spz*m*unitk[2]); + cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); + sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (k,l,m), 2 = (k,-l,m), 3 = (k,l,-m), 4 = (k,-l,-m) + + for (k = 1; k <= kxmax; k++) { + for (l = 1; l <= kymax; l++) { + for (m = 1; m <= kzmax; m++) { + sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]) + + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + cstr3 = 0.0; + sstr3 = 0.0; + cstr4 = 0.0; + sstr4 = 0.0; + for (i = 0; i < nlocal; i++) { + //mux = mu[i][0]; + //muy = mu[i][1]; + //muz = mu[i][2]; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + + // dir 1: (k,l,m) + muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1] + spz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; + slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; + cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 2: (k,-l,m) + muk[n+1][i] = (spx*k*unitk[0] - spy*l*unitk[1] + spz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; + slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; + cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 3: (k,l,-m) + muk[n+2][i] = (spx*k*unitk[0] + spy*l*unitk[1] - spz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; + slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; + cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 4: (k,-l,-m) + muk[n+3][i] = (spx*k*unitk[0] - spy*l*unitk[1] - spz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; + slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; + cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr4 += muk[n+3][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + sfacrl[n] = cstr3; + sfacim[n++] = sstr3; + sfacrl[n] = cstr4; + sfacim[n++] = sstr4; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + Slab-geometry correction term to dampen inter-slab interactions between + periodically repeating slabs. Yields good approximation to 2D EwaldDipoleSpin if + adequate empty space is left between repeating slabs (J. Chem. Phys. + 111, 3155). Slabs defined here to be parallel to the xy plane. Also + extended to non-neutral systems (J. Chem. Phys. 131, 094107). +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::slabcorr() +{ + // compute local contribution to global dipole/spin moment + + double **x = atom->x; + double zprd = domain->zprd; + int nlocal = atom->nlocal; + + double spin = 0.0; + double **sp = atom->sp; + double spx,spy,spz; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + spin += spz; + } + + // sum local contributions to get global spin moment + + double spin_all; + MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); + + // need to make non-neutral systems and/or + // per-atom energy translationally invariant + + if (eflag_atom || fabs(qsum) > SMALL) { + + error->all(FLERR,"Cannot (yet) use kspace slab correction with " + "long-range spins and non-neutral systems or per-atom energy"); + } + + // compute corrections + + const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; + const double spscale = mub2mu0 * scale; + + if (eflag_global) energy += spscale * e_slabcorr; + + // per-atom energy + + if (eflag_atom) { + double efact = spscale * MY_2PI/volume/12.0; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + eatom[i] += efact * spz * spin_all; + } + } + + // add on mag. force corrections + + double ffact = spscale * (-4.0*MY_PI/volume); + double **fm_long = atom->fm_long; + for (int i = 0; i < nlocal; i++) { + fm_long[i][2] += ffact * spin_all; + } +} + +/* ---------------------------------------------------------------------- + compute musum,musqsum,mu2 for magnetic spins + called initially, when particle count changes, when spins are changed +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::spsum_musq() +{ + const int nlocal = atom->nlocal; + + musum = musqsum = mu2 = 0.0; + if (atom->sp_flag) { + double** sp = atom->sp; + double spx,spy,spz; + double musum_local(0.0), musqsum_local(0.0); + + for (int i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + musum_local += spx + spy + spz; + musqsum_local += spx*spx + spy*spy + spz*spz; + } + + MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + + mu2 = musqsum * mub2mu0; + } + + if (mu2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver EwaldDipoleSpin on system with no spins"); +} diff --git a/src/KSPACE/ewald_dipole_spin.h b/src/KSPACE/ewald_dipole_spin.h new file mode 100644 index 0000000000..92122525a8 --- /dev/null +++ b/src/KSPACE/ewald_dipole_spin.h @@ -0,0 +1,102 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef KSPACE_CLASS + +KSpaceStyle(ewald/dipole/spin,EwaldDipoleSpin) + +#else + +#ifndef LMP_EWALD_DIPOLE_SPIN_H +#define LMP_EWALD_DIPOLE_SPIN_H + +#include "ewald_dipole.h" + +namespace LAMMPS_NS { + +class EwaldDipoleSpin : public EwaldDipole { + public: + EwaldDipoleSpin(class LAMMPS *, int, char **); + virtual ~EwaldDipoleSpin(); + void init(); + void setup(); + void compute(int, int); + + protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force + + void spsum_musq(); + virtual void eik_dot_r(); + void slabcorr(); + +}; + +} + +#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: Cannot use EwaldDipoleSpin with 2d simulation + +The kspace style ewald cannot be used in 2d simulations. You can use +2d EwaldDipoleSpin in a 3d simulation; see the kspace_modify command. + +E: Kspace style requires atom attribute q + +The atom style defined does not have these attributes. + +E: Cannot use nonperiodic boundaries with EwaldDipoleSpin + +For kspace style ewald, all 3 dimensions must have periodic boundaries +unless you use the kspace_modify command to define a 2d slab with a +non-periodic z dimension. + +E: Incorrect boundaries with slab EwaldDipoleSpin + +Must have periodic x,y dimensions and non-periodic z dimension to use +2d slab option with EwaldDipoleSpin. + +E: Cannot (yet) use EwaldDipoleSpin with triclinic box and slab correction + +This feature is not yet supported. + +E: KSpace style is incompatible with Pair style + +Setting a kspace style requires that a pair style with matching +long-range Coulombic or dispersion components be used. + +E: KSpace accuracy must be > 0 + +The kspace accuracy designated in the input must be greater than zero. + +E: Must use 'kspace_modify gewald' for uncharged system + +UNDOCUMENTED + +E: Cannot (yet) use K-space slab correction with compute group/group for triclinic systems + +This option is not yet supported. + +*/ From 6b4303c405b9fa0f39eb69fcd8a1b53e66936618 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 24 Sep 2018 16:40:59 -0600 Subject: [PATCH 13/90] Commit2 JT 092418 - initialized g_ewald before Newton solver - mu2 is now adim in ewald_dipole_spin --- examples/SPIN/pppm_spin/in.dipole.pppm_dipole | 2 +- examples/SPIN/pppm_spin/in.spin.ewald_spin | 4 ++-- src/KSPACE/ewald_dipole.cpp | 9 +++++++++ src/KSPACE/ewald_dipole_spin.cpp | 12 +++++++++++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole index c2c49e3caf..86ac5198b0 100644 --- a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole +++ b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole @@ -28,7 +28,7 @@ pair_coeff * * 0.0 0.0 #kspace_style pppm/disp 1.0e-4 #kspace_style pppm/dipole 1.0e-4 kspace_style ewald/dipole 1.0e-4 -kspace_modify gewald 0.1 +#kspace_modify gewald 0.1 neighbor 0.3 bin neigh_modify every 2 delay 4 check yes diff --git a/examples/SPIN/pppm_spin/in.spin.ewald_spin b/examples/SPIN/pppm_spin/in.spin.ewald_spin index d9ca46b27a..f2192676c7 100644 --- a/examples/SPIN/pppm_spin/in.spin.ewald_spin +++ b/examples/SPIN/pppm_spin/in.spin.ewald_spin @@ -36,8 +36,8 @@ neigh_modify every 10 check yes delay 20 #kspace_style pppm/dipole/spin 1.0e-4 #kspace_style ewald/dipole/spin 1.0e-4 -kspace_style ewald/dipole/spin 1.0e-2 -kspace_modify mesh 32 32 32 +kspace_style ewald/dipole/spin 1.0e-4 +#kspace_modify mesh 32 32 32 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 42d850dcc2..c3a3818013 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -163,6 +163,15 @@ void EwaldDipole::init() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); + + // initial guess with old method + + g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*mu2); + if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; + else g_ewald = sqrt(-log(g_ewald)) / cutoff; + + // try Newton solver + double g_ewald_new = NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 5522b18e03..43b9b32c76 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -164,6 +164,15 @@ void EwaldDipoleSpin::init() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); + + // initial guess with old method + + g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*mu2); + if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; + else g_ewald = sqrt(-log(g_ewald)) / cutoff; + + // try Newton solver + double g_ewald_new = NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; @@ -887,7 +896,8 @@ void EwaldDipoleSpin::spsum_musq() MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); - mu2 = musqsum * mub2mu0; + //mu2 = musqsum * mub2mu0; + mu2 = musqsum; } if (mu2 == 0 && comm->me == 0) From 19aaf294e560e1a0b70699428736e0ef3f003fab Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 27 Sep 2018 10:46:52 -0600 Subject: [PATCH 14/90] Commit JT 092718 - renamed pair/spin/long functions - started to work on debugging ewald_dipole (force errors) --- examples/SPIN/pppm_spin/in.spin.ewald_spin | 27 ++-- examples/SPIN/pppm_spin/in.spin.pppm_spin | 17 ++- .../SPIN/pppm_spin/in.spin.spin_dipolar_cut | 18 +-- src/KSPACE/ewald_dipole.cpp | 18 ++- src/KSPACE/ewald_dipole_spin.cpp | 16 ++- src/KSPACE/pppm_dipole_spin.cpp | 13 +- src/SPIN/pair_spin_dipolar_cut.cpp | 30 +++-- ...in_long.cpp => pair_spin_dipolar_long.cpp} | 57 ++++----- ...r_spin_long.h => pair_spin_dipolar_long.h} | 12 +- ...p.cpp => pair_spin_dipolar_long_qsymp.cpp} | 119 +++++------------- ...qsymp.h => pair_spin_dipolar_long_qsymp.h} | 12 +- 11 files changed, 153 insertions(+), 186 deletions(-) rename src/SPIN/{pair_spin_long.cpp => pair_spin_dipolar_long.cpp} (91%) rename src/SPIN/{pair_spin_long.h => pair_spin_dipolar_long.h} (90%) rename src/SPIN/{pair_spin_long_qsymp.cpp => pair_spin_dipolar_long_qsymp.cpp} (82%) rename src/SPIN/{pair_spin_long_qsymp.h => pair_spin_dipolar_long_qsymp.h} (89%) diff --git a/examples/SPIN/pppm_spin/in.spin.ewald_spin b/examples/SPIN/pppm_spin/in.spin.ewald_spin index f2192676c7..c0ce74dd77 100644 --- a/examples/SPIN/pppm_spin/in.spin.ewald_spin +++ b/examples/SPIN/pppm_spin/in.spin.ewald_spin @@ -19,30 +19,30 @@ create_atoms 1 box mass 1 58.93 -#set group all spin/random 31 1.72 -set group all spin 1.72 0.0 0.0 1.0 -velocity all create 100 4928459 rot yes dist gaussian +set group all spin/random 31 1.72 +#set group all spin 1.72 0.0 0.0 1.0 +#velocity all create 100 4928459 rot yes dist gaussian -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long/qsymp 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 -pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 #pair_coeff * * spin/long/qsymp long 8.0 -pair_coeff * * spin/long long 8.0 +pair_style spin/dipolar/long 8.0 +pair_coeff * * long 8.0 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 -#kspace_style pppm/dipole/spin 1.0e-4 -#kspace_style ewald/dipole/spin 1.0e-4 -kspace_style ewald/dipole/spin 1.0e-4 -#kspace_modify mesh 32 32 32 +kspace_style ewald/dipole/spin 1.0e-4 +#kspace_modify mesh 32 32 32 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 -fix 3 all nve/spin lattice yes +#fix 3 all nve/spin lattice yes +fix 3 all nve/spin lattice no timestep 0.0001 @@ -57,7 +57,8 @@ variable magnorm equal c_out_mag[4] variable emag equal c_out_mag[5] variable tmag equal c_out_mag[6] -thermo_style custom step time v_magnorm v_emag temp etotal +thermo_style custom step time v_magnorm v_tmag temp v_emag ke pe etotal +#thermo_style custom step time v_magnorm v_emag temp etotal thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin index 9e57797f55..6762fe6fab 100644 --- a/examples/SPIN/pppm_spin/in.spin.pppm_spin +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -23,19 +23,18 @@ mass 1 58.93 set group all spin 1.72 0.0 0.0 1.0 velocity all create 100 4928459 rot yes dist gaussian -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long/qsymp 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long/qsymp 8.0 pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * spin/long/qsymp long 8.0 -#pair_coeff * * spin/long long 8.0 +#pair_coeff * * spin/dipolar/long/qsymp long 8.0 +pair_coeff * * spin/dipolar/long long 8.0 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 -kspace_style pppm/dipole/spin 1.0e-4 -kspace_modify mesh 32 32 32 +kspace_style pppm/dipole/spin 1.0e-4 +#kspace_modify mesh 32 32 32 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 @@ -61,5 +60,5 @@ thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -#run 20000 -run 1 +run 20000 +#run 1 diff --git a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut index 838181e6d8..b265c4413e 100644 --- a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut +++ b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut @@ -19,16 +19,17 @@ create_atoms 1 box mass 1 58.93 -#set group all spin/random 31 1.72 -set group all spin 1.72 0.0 0.0 1.0 -velocity all create 100 4928459 rot yes dist gaussian +set group all spin/random 31 1.72 +#set group all spin 1.72 0.0 0.0 1.0 +#velocity all create 100 4928459 rot yes dist gaussian #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 +pair_style spin/dipolar/cut 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 -pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * spin/dipolar/cut long 8.0 +#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * long 8.0 #pair_coeff * * spin/long long 8.0 neighbor 0.1 bin @@ -37,7 +38,8 @@ neigh_modify every 10 check yes delay 20 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 -fix 3 all nve/spin lattice yes +#fix 3 all nve/spin lattice yes +fix 3 all nve/spin lattice no timestep 0.0001 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index c3a3818013..ea05889f52 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -449,12 +449,19 @@ void EwaldDipole::compute(int eflag, int vflag) exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; + // mu dot k product + + //muik = mu[i][0]*kx + mu[i][1]*ky + mu[i][2]*kz; + + // taking im of struct_fact x exp(i*k*ri) (for force calc.) partial = (muk[k][i])*(expim*sfacrl_all[k] + exprl*sfacim_all[k]); - ek[i][0] += partial*eg[k][0]; - ek[i][1] += partial*eg[k][1]; - ek[i][2] += partial*eg[k][2]; + //partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); + //partial = muik * (expim*sfacrl_all[k] + exprl*sfacim_all[k]); + ek[i][0] += partial * eg[k][0]; + ek[i][1] += partial * eg[k][1]; + ek[i][2] += partial * eg[k][2]; // compute field for torque calculation @@ -493,6 +500,9 @@ void EwaldDipole::compute(int eflag, int vflag) f[i][0] += muscale * ek[i][0]; f[i][1] += muscale * ek[i][1]; if (slabflag != 2) f[i][2] += muscale * ek[i][2]; + //f[i][0] -= muscale * ek[i][0]; + //f[i][1] -= muscale * ek[i][1]; + //if (slabflag != 2) f[i][2] -= muscale * ek[i][2]; t[i][0] += -mu[i][1]*tk[i][2] + mu[i][2]*tk[i][1]; t[i][1] += -mu[i][2]*tk[i][0] + mu[i][0]*tk[i][2]; if (slabflag != 2) t[i][2] += -mu[i][0]*tk[i][1] + mu[i][1]*tk[i][0]; @@ -545,7 +555,7 @@ void EwaldDipole::compute(int eflag, int vflag) } /* ---------------------------------------------------------------------- - compute the + compute the struc. factors and mu dot k products ------------------------------------------------------------------------- */ void EwaldDipole::eik_dot_r() diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 43b9b32c76..9a61d9cbe1 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -50,11 +50,11 @@ EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp, int narg, char **arg) : dipoleflag = 0; spinflag = 1; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } /* ---------------------------------------------------------------------- @@ -500,6 +500,9 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) const double spscale2 = mub2mu0hbinv * scale; //const double muscale = qqrd2e * scale; + printf("test ek: %g %g %g \n",ek[0][0],ek[0][1],ek[0][2]); + printf("test tk: %g %g %g \n",tk[0][0],tk[0][1],tk[0][2]); + for (i = 0; i < nlocal; i++) { f[i][0] += spscale * ek[i][0]; f[i][1] += spscale * ek[i][1]; @@ -509,6 +512,9 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) if (slabflag != 2) fm_long[i][2] += spscale2 * tk[i][3]; } + printf("test f_l: %g %g %g \n",f[0][0],f[0][1],f[0][2]); + printf("test fm_l: %g %g %g \n",fm_long[0][0],fm_long[0][1],fm_long[0][2]); + // sum global energy across Kspace vevs and add in volume-dependent term // taking the re-part of struct_fact_i x struct_fact_j // substracting self energy and scaling diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index aa85c5d289..e66ab4903e 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -69,11 +69,11 @@ PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp, int narg, char **arg) : dipoleflag = 0; spinflag = 1; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } /* ---------------------------------------------------------------------- @@ -746,7 +746,8 @@ void PPPMDipoleSpin::spsum_spsq() MPI_Allreduce(&spsum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&spsqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); - mu2 = musqsum * mub2mu0; + //mu2 = musqsum * mub2mu0; + mu2 = musqsum; } if (mu2 == 0 && comm->me == 0) diff --git a/src/SPIN/pair_spin_dipolar_cut.cpp b/src/SPIN/pair_spin_dipolar_cut.cpp index f686d12926..b2c0a1ab11 100644 --- a/src/SPIN/pair_spin_dipolar_cut.cpp +++ b/src/SPIN/pair_spin_dipolar_cut.cpp @@ -13,7 +13,7 @@ /* ------------------------------------------------------------------------ Contributing authors: Julien Tranchida (SNL) - Aidan Thompson (SNL) + Stan Moore (SNL) Please cite the related publication: Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). @@ -64,11 +64,13 @@ lockfixnvespin(NULL) no_virial_fdotr_compute = 1; lattice_flag = 0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + + //printf("hbar: %g, mub2mu0hbinv: %g \n",hbar,mub2mu0hbinv); } @@ -391,7 +393,9 @@ void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); } } - + + //printf("test fm: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); + //fmi[0] *= mub2mu0hbinv; //fmi[1] *= mub2mu0hbinv; //fmi[2] *= mub2mu0hbinv; @@ -405,15 +409,15 @@ void PairSpinDipolarCut::compute_dipolar(int i, int j, double rij[3], double fmi[3], double spi[4], double spj[4], double r3inv) { double sjdotr; - double gigjri2,pre; + double gigjri3,pre; sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - gigjri2 = (spi[3] * spj[3])*r3inv; - pre = mub2mu0hbinv * gigjri2 / 4.0 / MY_PI; + gigjri3 = (spi[3] * spj[3])*r3inv; + pre = mub2mu0hbinv * gigjri3 / 4.0 / MY_PI; - fmi[0] += pre * gigjri2 * (3.0 * sjdotr *rij[0] - spj[0]); - fmi[1] += pre * gigjri2 * (3.0 * sjdotr *rij[1] - spj[1]); - fmi[2] += pre * gigjri2 * (3.0 * sjdotr *rij[2] - spj[2]); + fmi[0] += pre * gigjri3 * (3.0 * sjdotr *rij[0] - spj[0]); + fmi[1] += pre * gigjri3 * (3.0 * sjdotr *rij[1] - spj[1]); + fmi[2] += pre * gigjri3 * (3.0 * sjdotr *rij[2] - spj[2]); } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_dipolar_long.cpp similarity index 91% rename from src/SPIN/pair_spin_long.cpp rename to src/SPIN/pair_spin_dipolar_long.cpp index d7ecdf5edd..c1030c92d7 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_dipolar_long.cpp @@ -13,12 +13,7 @@ /* ------------------------------------------------------------------------ Contributing authors: Julien Tranchida (SNL) - Aidan Thompson (SNL) - - Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. Journal of Computational Physics. + Stan Moore (SNL) ------------------------------------------------------------------------- */ #include @@ -26,7 +21,7 @@ #include #include -#include "pair_spin_long.h" +#include "pair_spin_dipolar_long.h" #include "atom.h" #include "comm.h" #include "neighbor.h" @@ -55,7 +50,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -PairSpinLong::PairSpinLong(LAMMPS *lmp) : PairSpin(lmp), +PairSpinDipolarLong::PairSpinDipolarLong(LAMMPS *lmp) : PairSpin(lmp), lockfixnvespin(NULL) { single_enable = 0; @@ -64,11 +59,11 @@ lockfixnvespin(NULL) no_virial_fdotr_compute = 1; lattice_flag = 0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } @@ -76,7 +71,7 @@ lockfixnvespin(NULL) free all arrays ------------------------------------------------------------------------- */ -PairSpinLong::~PairSpinLong() +PairSpinDipolarLong::~PairSpinDipolarLong() { if (allocated) { memory->destroy(setflag); @@ -89,7 +84,7 @@ PairSpinLong::~PairSpinLong() global settings ------------------------------------------------------------------------- */ -void PairSpinLong::settings(int narg, char **arg) +void PairSpinDipolarLong::settings(int narg, char **arg) { if (narg < 1 || narg > 2) error->all(FLERR,"Incorrect args in pair_style command"); @@ -118,7 +113,7 @@ void PairSpinLong::settings(int narg, char **arg) set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairSpinLong::coeff(int narg, char **arg) +void PairSpinDipolarLong::coeff(int narg, char **arg) { if (!allocated) allocate(); @@ -151,7 +146,7 @@ void PairSpinLong::coeff(int narg, char **arg) init specific to this pair style ------------------------------------------------------------------------- */ -void PairSpinLong::init_style() +void PairSpinDipolarLong::init_style() { if (!atom->sp_flag) error->all(FLERR,"Pair spin requires atom/spin style"); @@ -194,7 +189,7 @@ void PairSpinLong::init_style() init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairSpinLong::init_one(int i, int j) +double PairSpinDipolarLong::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); @@ -207,7 +202,7 @@ double PairSpinLong::init_one(int i, int j) extract the larger cutoff if "cut" or "cut_coul" ------------------------------------------------------------------------- */ -void *PairSpinLong::extract(const char *str, int &dim) +void *PairSpinDipolarLong::extract(const char *str, int &dim) { if (strcmp(str,"cut") == 0) { dim = 0; @@ -230,7 +225,7 @@ void *PairSpinLong::extract(const char *str, int &dim) /* ---------------------------------------------------------------------- */ -void PairSpinLong::compute(int eflag, int vflag) +void PairSpinDipolarLong::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double r,rinv,r2inv,rsq; @@ -357,7 +352,7 @@ void PairSpinLong::compute(int eflag, int vflag) update the pair interaction fmi acting on the spin ii ------------------------------------------------------------------------- */ -void PairSpinLong::compute_single_pair(int ii, double fmi[3]) +void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) { int i,j,jj,jnum,itype,jtype; double r,rinv,r2inv,rsq; @@ -436,18 +431,20 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) } // adding the kspace components to fm - + + //printf("test fm before: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); + //printf("test fm_long: %g, %g, %g \n",fm_long[i][0],fm_long[i][1],fm_long[i][2]); fmi[0] += fm_long[i][0]; fmi[1] += fm_long[i][1]; fmi[2] += fm_long[i][2]; - + //printf("test fm after: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); } /* ---------------------------------------------------------------------- compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinLong::compute_long(int i, int j, double rij[3], +void PairSpinDipolarLong::compute_long(int i, int j, double rij[3], double bij[4], double fmi[3], double spi[4], double spj[4]) { double sjdotr; @@ -469,7 +466,7 @@ void PairSpinLong::compute_long(int i, int j, double rij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinLong::compute_long_mech(int i, int j, double rij[3], +void PairSpinDipolarLong::compute_long_mech(int i, int j, double rij[3], double bij[4], double fi[3], double spi[3], double spj[3]) { double sdots,sidotr,sjdotr,b2,b3; @@ -499,7 +496,7 @@ void PairSpinLong::compute_long_mech(int i, int j, double rij[3], allocate all arrays ------------------------------------------------------------------------- */ -void PairSpinLong::allocate() +void PairSpinDipolarLong::allocate() { allocated = 1; int n = atom->ntypes; @@ -517,7 +514,7 @@ void PairSpinLong::allocate() proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinLong::write_restart(FILE *fp) +void PairSpinDipolarLong::write_restart(FILE *fp) { write_restart_settings(fp); @@ -536,7 +533,7 @@ void PairSpinLong::write_restart(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinLong::read_restart(FILE *fp) +void PairSpinDipolarLong::read_restart(FILE *fp) { read_restart_settings(fp); @@ -562,7 +559,7 @@ void PairSpinLong::read_restart(FILE *fp) proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinLong::write_restart_settings(FILE *fp) +void PairSpinDipolarLong::write_restart_settings(FILE *fp) { fwrite(&cut_spin_long_global,sizeof(double),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); @@ -572,7 +569,7 @@ void PairSpinLong::write_restart_settings(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinLong::read_restart_settings(FILE *fp) +void PairSpinDipolarLong::read_restart_settings(FILE *fp) { if (comm->me == 0) { fread(&cut_spin_long_global,sizeof(double),1,fp); diff --git a/src/SPIN/pair_spin_long.h b/src/SPIN/pair_spin_dipolar_long.h similarity index 90% rename from src/SPIN/pair_spin_long.h rename to src/SPIN/pair_spin_dipolar_long.h index 0cdf6d2b80..191e983328 100644 --- a/src/SPIN/pair_spin_long.h +++ b/src/SPIN/pair_spin_dipolar_long.h @@ -13,24 +13,24 @@ #ifdef PAIR_CLASS -PairStyle(spin/long,PairSpinLong) +PairStyle(spin/dipolar/long,PairSpinDipolarLong) #else -#ifndef LMP_PAIR_SPIN_LONG_H -#define LMP_PAIR_SPIN_LONG_H +#ifndef LMP_PAIR_SPIN_DIPOLAR_LONG_H +#define LMP_PAIR_SPIN_DIPOLAR_LONG_H #include "pair_spin.h" namespace LAMMPS_NS { -class PairSpinLong : public PairSpin { +class PairSpinDipolarLong : public PairSpin { public: double cut_coul; double **sigma; - PairSpinLong(class LAMMPS *); - ~PairSpinLong(); + PairSpinDipolarLong(class LAMMPS *); + ~PairSpinDipolarLong(); void settings(int, char **); void coeff(int, char **); double init_one(int, int); diff --git a/src/SPIN/pair_spin_long_qsymp.cpp b/src/SPIN/pair_spin_dipolar_long_qsymp.cpp similarity index 82% rename from src/SPIN/pair_spin_long_qsymp.cpp rename to src/SPIN/pair_spin_dipolar_long_qsymp.cpp index 3b499d0ef7..63876ba97a 100644 --- a/src/SPIN/pair_spin_long_qsymp.cpp +++ b/src/SPIN/pair_spin_dipolar_long_qsymp.cpp @@ -13,12 +13,7 @@ /* ------------------------------------------------------------------------ Contributing authors: Julien Tranchida (SNL) - Aidan Thompson (SNL) - - Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. Journal of Computational Physics. + Stan Moore (SNL) ------------------------------------------------------------------------- */ #include @@ -26,7 +21,7 @@ #include #include -#include "pair_spin_long_qsymp.h" +#include "pair_spin_dipolar_long_qsymp.h" #include "atom.h" #include "comm.h" #include "neighbor.h" @@ -55,7 +50,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -PairSpinLongQsymp::PairSpinLongQsymp(LAMMPS *lmp) : PairSpin(lmp), +PairSpinDipolarLongQsymp::PairSpinDipolarLongQsymp(LAMMPS *lmp) : PairSpin(lmp), lockfixnvespin(NULL) { single_enable = 0; @@ -64,11 +59,11 @@ lockfixnvespin(NULL) no_virial_fdotr_compute = 1; lattice_flag = 0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } @@ -76,7 +71,7 @@ lockfixnvespin(NULL) free all arrays ------------------------------------------------------------------------- */ -PairSpinLongQsymp::~PairSpinLongQsymp() +PairSpinDipolarLongQsymp::~PairSpinDipolarLongQsymp() { if (allocated) { memory->destroy(setflag); @@ -89,7 +84,7 @@ PairSpinLongQsymp::~PairSpinLongQsymp() global settings ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::settings(int narg, char **arg) +void PairSpinDipolarLongQsymp::settings(int narg, char **arg) { if (narg < 1 || narg > 2) error->all(FLERR,"Incorrect args in pair_style command"); @@ -118,7 +113,7 @@ void PairSpinLongQsymp::settings(int narg, char **arg) set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::coeff(int narg, char **arg) +void PairSpinDipolarLongQsymp::coeff(int narg, char **arg) { if (!allocated) allocate(); @@ -151,7 +146,7 @@ void PairSpinLongQsymp::coeff(int narg, char **arg) init specific to this pair style ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::init_style() +void PairSpinDipolarLongQsymp::init_style() { if (!atom->sp_flag) error->all(FLERR,"Pair spin requires atom/spin style"); @@ -194,7 +189,7 @@ void PairSpinLongQsymp::init_style() init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairSpinLongQsymp::init_one(int i, int j) +double PairSpinDipolarLongQsymp::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); @@ -207,7 +202,7 @@ double PairSpinLongQsymp::init_one(int i, int j) extract the larger cutoff if "cut" or "cut_coul" ------------------------------------------------------------------------- */ -void *PairSpinLongQsymp::extract(const char *str, int &dim) +void *PairSpinDipolarLongQsymp::extract(const char *str, int &dim) { if (strcmp(str,"cut") == 0) { dim = 0; @@ -230,7 +225,7 @@ void *PairSpinLongQsymp::extract(const char *str, int &dim) /* ---------------------------------------------------------------------- */ -void PairSpinLongQsymp::compute(int eflag, int vflag) +void PairSpinDipolarLongQsymp::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double r,rinv,r2inv,rsq; @@ -359,9 +354,9 @@ void PairSpinLongQsymp::compute(int eflag, int vflag) // correction of the fm_kspace - fm_long[i][0] -= mub2mu0hbinv * fmx_erf_s; - fm_long[i][1] -= mub2mu0hbinv * fmy_erf_s; - fm_long[i][2] -= mub2mu0hbinv * fmz_erf_s; + fm_long[i][0] -= (mub2mu0hbinv * fmx_erf_s); + fm_long[i][1] -= (mub2mu0hbinv * fmy_erf_s); + fm_long[i][2] -= (mub2mu0hbinv * fmz_erf_s); if (newton_pair || j < nlocal) { f[j][0] -= fi[0]; @@ -391,21 +386,17 @@ void PairSpinLongQsymp::compute(int eflag, int vflag) removing erf(r)/r (for r in [0,rc]) from the kspace force ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) +void PairSpinDipolarLongQsymp::compute_single_pair(int ii, double fmi[3]) { int i,j,jj,jnum,itype,jtype; - double r,rinv,r2inv,r3inv,rsq; - double grij,expm2,t,erf; + double rinv,r2inv,r3inv,rsq; double sjdotr,sjdotrr3inv; double b1,b2,gigj; double bij[4],xi[3],rij[3]; double spi[4],spj[4]; double local_cut2; - double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; - //double fmx_erf_s,fmy_erf_s,fmz_erf_s; double fmx_s,fmy_s,fmz_s; - //double fmx_long,fmy_long,fmz_long; double **x = atom->x; double **sp = atom->sp; @@ -416,10 +407,6 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) numneigh = list->numneigh; firstneigh = list->firstneigh; - pre1 = 2.0 * g_ewald / MY_PIS; - pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; - pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; - // computation of the exchange interaction // loop over neighbors of atom i @@ -427,16 +414,11 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) xi[0] = x[i][0]; xi[1] = x[i][1]; xi[2] = x[i][2]; - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; spi[3] = sp[i][3]; jlist = firstneigh[i]; jnum = numneigh[i]; itype = type[i]; - //fmx_long = fmy_long = fmz_long = 0.0; - //fmx_erf_s = fmy_erf_s = fmz_erf_s = 0.0; fmx_s = fmy_s = fmz_s = 0.0; for (jj = 0; jj < jnum; jj++) { @@ -449,8 +431,6 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) spj[2] = sp[j][2]; spj[3] = sp[j][3]; - bij[0] = bij[1] = bij[2] = bij[3] = 0.0; - rij[0] = x[j][0] - xi[0]; rij[1] = x[j][1] - xi[1]; rij[2] = x[j][2] - xi[2]; @@ -458,58 +438,25 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + // evaluating full dipolar interaction on [0,rc] + if (rsq < local_cut2) { r2inv = 1.0/rsq; rinv = sqrt(r2inv); r3inv = r2inv*rinv; - - r = sqrt(rsq); - //grij = g_ewald * r; - //expm2 = exp(-grij*grij); - //t = 1.0 / (1.0 + EWALD_P*grij); - - // evaluating erf instead of erfc - - //erf = 1.0 - t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - - //bij[0] = erf * rinv; - //bij[1] = (bij[0] + pre1*expm2) * r2inv; - //bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; - //bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - - //gigj = spi[3] * spj[3]; - //sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - - //b1 = bij[1]; - //b2 = bij[2]; - - // evaluating short-range correction to the kspace part on [0,rc] - - //fmx_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[0] - b1 * spj[0]); - //fmy_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[1] - b1 * spj[1]); - //fmz_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[2] - b1 * spj[2]); - - // evaluating real dipolar interaction on [0,rc] - + + gigj = spi[3] * spj[3]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; sjdotrr3inv = 3.0 * sjdotr * r3inv; + fmx_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[0] - sp[i][0]/r3inv); fmy_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[1] - sp[i][1]/r3inv); fmz_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[2] - sp[i][2]/r3inv); - } } - // removing short-range erf function from kspace force - - //fmx_long = fm_long[i][0] - fmx_erf_s; - //fmy_long = fm_long[i][1] - fmy_erf_s; - //fmz_long = fm_long[i][2] - fmz_erf_s; - // adding truncated kspace force and short-range full force - //fmi[0] += fmx_s + fmx_long; - //fmi[1] += fmy_s + fmy_long; - //fmi[2] += fmz_s + fmz_long; fmi[0] += (fmx_s + fm_long[i][0]); fmi[1] += (fmy_s + fm_long[i][1]); fmi[2] += (fmz_s + fm_long[i][2]); @@ -519,7 +466,7 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::compute_long(int i, int j, double rij[3], +void PairSpinDipolarLongQsymp::compute_long(int i, int j, double rij[3], double bij[4], double fmi[3], double spi[4], double spj[4]) { double sjdotr; @@ -541,7 +488,7 @@ void PairSpinLongQsymp::compute_long(int i, int j, double rij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::compute_long_mech(int i, int j, double rij[3], +void PairSpinDipolarLongQsymp::compute_long_mech(int i, int j, double rij[3], double bij[4], double fi[3], double spi[3], double spj[3]) { double sdots,sidotr,sjdotr,b2,b3; @@ -571,7 +518,7 @@ void PairSpinLongQsymp::compute_long_mech(int i, int j, double rij[3], allocate all arrays ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::allocate() +void PairSpinDipolarLongQsymp::allocate() { allocated = 1; int n = atom->ntypes; @@ -589,7 +536,7 @@ void PairSpinLongQsymp::allocate() proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::write_restart(FILE *fp) +void PairSpinDipolarLongQsymp::write_restart(FILE *fp) { write_restart_settings(fp); @@ -608,7 +555,7 @@ void PairSpinLongQsymp::write_restart(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::read_restart(FILE *fp) +void PairSpinDipolarLongQsymp::read_restart(FILE *fp) { read_restart_settings(fp); @@ -634,7 +581,7 @@ void PairSpinLongQsymp::read_restart(FILE *fp) proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::write_restart_settings(FILE *fp) +void PairSpinDipolarLongQsymp::write_restart_settings(FILE *fp) { fwrite(&cut_spin_long_global,sizeof(double),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); @@ -644,7 +591,7 @@ void PairSpinLongQsymp::write_restart_settings(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::read_restart_settings(FILE *fp) +void PairSpinDipolarLongQsymp::read_restart_settings(FILE *fp) { if (comm->me == 0) { fread(&cut_spin_long_global,sizeof(double),1,fp); diff --git a/src/SPIN/pair_spin_long_qsymp.h b/src/SPIN/pair_spin_dipolar_long_qsymp.h similarity index 89% rename from src/SPIN/pair_spin_long_qsymp.h rename to src/SPIN/pair_spin_dipolar_long_qsymp.h index ae8c5a3864..28867b5229 100644 --- a/src/SPIN/pair_spin_long_qsymp.h +++ b/src/SPIN/pair_spin_dipolar_long_qsymp.h @@ -13,24 +13,24 @@ #ifdef PAIR_CLASS -PairStyle(spin/long/qsymp,PairSpinLongQsymp) +PairStyle(spin/dipolar/long/qsymp,PairSpinDipolarLongQsymp) #else -#ifndef LMP_PAIR_SPIN_LONG_QSYMP_H -#define LMP_PAIR_SPIN_LONG_QSYMP_H +#ifndef LMP_PAIR_SPIN_DIPOLAR_LONG_QSYMP_H +#define LMP_PAIR_SPIN_DIPOLAR_LONG_QSYMP_H #include "pair_spin.h" namespace LAMMPS_NS { -class PairSpinLongQsymp : public PairSpin { +class PairSpinDipolarLongQsymp : public PairSpin { public: double cut_coul; double **sigma; - PairSpinLongQsymp(class LAMMPS *); - ~PairSpinLongQsymp(); + PairSpinDipolarLongQsymp(class LAMMPS *); + ~PairSpinDipolarLongQsymp(); void settings(int, char **); void coeff(int, char **); double init_one(int, int); From a745a0aed0846b8deccad6bdeadb263594f06555 Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 3 Oct 2018 10:23:58 -0600 Subject: [PATCH 15/90] Commit JT 100318 - correction forces ewald_dipole - correction mag. dipolar energy --- examples/SPIN/pppm_spin/in.spin.ewald_spin | 4 +- src/KSPACE/ewald_dipole.cpp | 12 +--- src/KSPACE/ewald_dipole_spin.cpp | 66 ++++------------------ src/KSPACE/pppm_dipole_spin.cpp | 8 ++- src/SPIN/pair_spin_dipolar_cut.cpp | 8 ++- src/SPIN/pair_spin_dipolar_long.cpp | 9 ++- src/SPIN/pair_spin_dipolar_long_qsymp.cpp | 8 ++- 7 files changed, 37 insertions(+), 78 deletions(-) diff --git a/examples/SPIN/pppm_spin/in.spin.ewald_spin b/examples/SPIN/pppm_spin/in.spin.ewald_spin index c0ce74dd77..889ed086f8 100644 --- a/examples/SPIN/pppm_spin/in.spin.ewald_spin +++ b/examples/SPIN/pppm_spin/in.spin.ewald_spin @@ -44,7 +44,7 @@ fix 2 all langevin/spin 0.0 0.0 21 #fix 3 all nve/spin lattice yes fix 3 all nve/spin lattice no -timestep 0.0001 +timestep 0.001 compute out_mag all compute/spin @@ -65,4 +65,4 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] #run 20000 -run 1 +run 1000 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index ea05889f52..5579ba3840 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -449,16 +449,9 @@ void EwaldDipole::compute(int eflag, int vflag) exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; - // mu dot k product - - //muik = mu[i][0]*kx + mu[i][1]*ky + mu[i][2]*kz; - - // taking im of struct_fact x exp(i*k*ri) (for force calc.) - partial = (muk[k][i])*(expim*sfacrl_all[k] + exprl*sfacim_all[k]); - //partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); - //partial = muik * (expim*sfacrl_all[k] + exprl*sfacim_all[k]); + partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial * eg[k][0]; ek[i][1] += partial * eg[k][1]; ek[i][2] += partial * eg[k][2]; @@ -500,9 +493,6 @@ void EwaldDipole::compute(int eflag, int vflag) f[i][0] += muscale * ek[i][0]; f[i][1] += muscale * ek[i][1]; if (slabflag != 2) f[i][2] += muscale * ek[i][2]; - //f[i][0] -= muscale * ek[i][0]; - //f[i][1] -= muscale * ek[i][1]; - //if (slabflag != 2) f[i][2] -= muscale * ek[i][2]; t[i][0] += -mu[i][1]*tk[i][2] + mu[i][2]*tk[i][1]; t[i][1] += -mu[i][2]*tk[i][0] + mu[i][0]*tk[i][2]; if (slabflag != 2) t[i][2] += -mu[i][0]*tk[i][1] + mu[i][1]*tk[i][0]; diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 9a61d9cbe1..df1acb337d 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -51,9 +51,12 @@ EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp, int narg, char **arg) : spinflag = 1; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } @@ -61,12 +64,7 @@ EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp, int narg, char **arg) : free all memory ------------------------------------------------------------------------- */ -EwaldDipoleSpin::~EwaldDipoleSpin() -{ - //memory->destroy(muk); - //memory->destroy(tk); - //memory->destroy(vc); -} +EwaldDipoleSpin::~EwaldDipoleSpin() {} /* ---------------------------------------------------------------------- called once before run @@ -81,12 +79,7 @@ void EwaldDipoleSpin::init() // error check - //dipoleflag = atom->mu?1:0; spinflag = atom->sp?1:0; - //qsum_qsq(0); // q[i] might not be declared ? - - //if (dipoleflag && q2) - // error->all(FLERR,"Cannot (yet) use charges with Kspace style EwaldDipoleSpin"); triclinic_check(); @@ -100,7 +93,6 @@ void EwaldDipoleSpin::init() error->all(FLERR,"Cannot use EwaldDipoleSpin with 2d simulation"); if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); -//if (!atom->q_flag) error->all(FLERR,"Kspace style requires atom attribute q"); if ((spinflag && strcmp(update->unit_style,"metal")) != 0) error->all(FLERR,"'metal' units have to be used with spins"); @@ -134,7 +126,6 @@ void EwaldDipoleSpin::init() scale = 1.0; qqrd2e = force->qqrd2e; - //musum_musq(); spsum_musq(); natoms_original = atom->natoms; @@ -343,23 +334,6 @@ void EwaldDipoleSpin::setup() coeffs(); } -/* ---------------------------------------------------------------------- - compute dipole RMS accuracy for a dimension -------------------------------------------------------------------------- */ - -//double EwaldDipoleSpin::rms_dipole(int km, double prd, bigint natoms) -//{ -// if (natoms == 0) natoms = 1; // avoid division by zero -// -// // error from eq.(46), Wang et al., JCP 115, 6351 (2001) -// -// double value = 8*MY_PI*mu2*g_ewald/volume * -// sqrt(2*MY_PI*km*km*km/(15.0*natoms)) * -// exp(-MY_PI*MY_PI*km*km/(g_ewald*g_ewald*prd*prd)); -// -// return value; -//} - /* ---------------------------------------------------------------------- compute the EwaldDipoleSpin long-range force, energy, virial ------------------------------------------------------------------------- */ @@ -379,7 +353,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - //musum_musq(); spsum_musq(); natoms_original = atom->natoms; } @@ -421,8 +394,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) double **f = atom->f; double **fm_long = atom->fm_long; - double **t = atom->torque; - //double **mu = atom->mu; double **sp = atom->sp; int nlocal = atom->nlocal; @@ -456,7 +427,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // taking im of struct_fact x exp(i*k*ri) (for force calc.) - partial = (muk[k][i])*(expim*sfacrl_all[k] + exprl*sfacim_all[k]); + partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial*eg[k][0]; ek[i][1] += partial*eg[k][1]; ek[i][2] += partial*eg[k][2]; @@ -498,10 +469,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) const double spscale = mub2mu0 * scale; const double spscale2 = mub2mu0hbinv * scale; - //const double muscale = qqrd2e * scale; - - printf("test ek: %g %g %g \n",ek[0][0],ek[0][1],ek[0][2]); - printf("test tk: %g %g %g \n",tk[0][0],tk[0][1],tk[0][2]); for (i = 0; i < nlocal; i++) { f[i][0] += spscale * ek[i][0]; @@ -512,8 +479,8 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) if (slabflag != 2) fm_long[i][2] += spscale2 * tk[i][3]; } - printf("test f_l: %g %g %g \n",f[0][0],f[0][1],f[0][2]); - printf("test fm_l: %g %g %g \n",fm_long[0][0],fm_long[0][1],fm_long[0][2]); + //printf("test f_l: %g %g %g \n",f[0][0],f[0][1],f[0][2]); + //printf("test fm_l: %g %g %g \n",fm_long[0][0],fm_long[0][1],fm_long[0][2]); // sum global energy across Kspace vevs and add in volume-dependent term // taking the re-part of struct_fact_i x struct_fact_j @@ -573,11 +540,9 @@ void EwaldDipoleSpin::eik_dot_r() int i,k,l,m,n,ic; double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; double sqk,clpm,slpm; - //double mux, muy, muz; double spx, spy, spz, spi; double **x = atom->x; - //double **mu = atom->mu; double **sp = atom->sp; int nlocal = atom->nlocal; @@ -607,7 +572,6 @@ void EwaldDipoleSpin::eik_dot_r() cs[-1][ic][i] = cs[1][ic][i]; sn[-1][ic][i] = -sn[1][ic][i]; spi = sp[i][ic]*sp[i][3]; - //muk[n][i] = (mu[i][ic]*unitk[ic]); muk[n][i] = (spi*unitk[ic]); cstr1 += muk[n][i]*cs[1][ic][i]; sstr1 += muk[n][i]*sn[1][ic][i]; @@ -634,7 +598,6 @@ void EwaldDipoleSpin::eik_dot_r() sn[-m][ic][i] = -sn[m][ic][i]; spi = sp[i][ic]*sp[i][3]; muk[n][i] = (spi*m*unitk[ic]); - //muk[n][i] = (mu[i][ic]*m*unitk[ic]); cstr1 += muk[n][i]*cs[m][ic][i]; sstr1 += muk[n][i]*sn[m][ic][i]; } @@ -657,8 +620,6 @@ void EwaldDipoleSpin::eik_dot_r() for (i = 0; i < nlocal; i++) { spx = sp[i][0]*sp[i][3]; spy = sp[i][1]*sp[i][3]; - //mux = mu[i][0]; - //muy = mu[i][1]; // dir 1: (k,l,0) muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1]); @@ -691,8 +652,6 @@ void EwaldDipoleSpin::eik_dot_r() for (i = 0; i < nlocal; i++) { spy = sp[i][1]*sp[i][3]; spz = sp[i][2]*sp[i][3]; - //muy = mu[i][1]; - //muz = mu[i][2]; // dir 1: (0,l,m) muk[n][i] = (spy*l*unitk[1] + spz*m*unitk[2]); @@ -723,8 +682,6 @@ void EwaldDipoleSpin::eik_dot_r() cstr2 = 0.0; sstr2 = 0.0; for (i = 0; i < nlocal; i++) { - //mux = mu[i][0]; - //muz = mu[i][2]; spx = sp[i][0]*sp[i][3]; spz = sp[i][2]*sp[i][3]; @@ -763,9 +720,6 @@ void EwaldDipoleSpin::eik_dot_r() cstr4 = 0.0; sstr4 = 0.0; for (i = 0; i < nlocal; i++) { - //mux = mu[i][0]; - //muy = mu[i][1]; - //muz = mu[i][2]; spx = sp[i][0]*sp[i][3]; spy = sp[i][1]*sp[i][3]; spz = sp[i][2]*sp[i][3]; diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index e66ab4903e..be38a460b2 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -70,8 +70,12 @@ PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp, int narg, char **arg) : spinflag = 1; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } diff --git a/src/SPIN/pair_spin_dipolar_cut.cpp b/src/SPIN/pair_spin_dipolar_cut.cpp index b2c0a1ab11..2c44b25fbf 100644 --- a/src/SPIN/pair_spin_dipolar_cut.cpp +++ b/src/SPIN/pair_spin_dipolar_cut.cpp @@ -65,8 +65,12 @@ lockfixnvespin(NULL) lattice_flag = 0; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz diff --git a/src/SPIN/pair_spin_dipolar_long.cpp b/src/SPIN/pair_spin_dipolar_long.cpp index c1030c92d7..140b92700c 100644 --- a/src/SPIN/pair_spin_dipolar_long.cpp +++ b/src/SPIN/pair_spin_dipolar_long.cpp @@ -60,9 +60,12 @@ lockfixnvespin(NULL) lattice_flag = 0; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } diff --git a/src/SPIN/pair_spin_dipolar_long_qsymp.cpp b/src/SPIN/pair_spin_dipolar_long_qsymp.cpp index 63876ba97a..4b07b540bc 100644 --- a/src/SPIN/pair_spin_dipolar_long_qsymp.cpp +++ b/src/SPIN/pair_spin_dipolar_long_qsymp.cpp @@ -60,8 +60,12 @@ lockfixnvespin(NULL) lattice_flag = 0; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz From d5fe8857cc75dd1c140883f7005c9f669c084a82 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 5 Oct 2018 14:01:29 -0600 Subject: [PATCH 16/90] Commit JT 100518 - correction torque ewald_dipole - idem ewald_dipole_spin to check --- src/KSPACE/ewald_dipole.cpp | 8 ++++---- src/KSPACE/ewald_dipole_spin.cpp | 5 +---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 5579ba3840..f2124deb4f 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -458,7 +458,7 @@ void EwaldDipole::compute(int eflag, int vflag) // compute field for torque calculation - partial2 = exprl*sfacrl_all[k] - expim*sfacim_all[k]; + partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; tk[i][0] += partial2*eg[k][0]; tk[i][1] += partial2*eg[k][1]; tk[i][2] += partial2*eg[k][2]; @@ -493,9 +493,9 @@ void EwaldDipole::compute(int eflag, int vflag) f[i][0] += muscale * ek[i][0]; f[i][1] += muscale * ek[i][1]; if (slabflag != 2) f[i][2] += muscale * ek[i][2]; - t[i][0] += -mu[i][1]*tk[i][2] + mu[i][2]*tk[i][1]; - t[i][1] += -mu[i][2]*tk[i][0] + mu[i][0]*tk[i][2]; - if (slabflag != 2) t[i][2] += -mu[i][0]*tk[i][1] + mu[i][1]*tk[i][0]; + t[i][0] -= muscale * (mu[i][1]*tk[i][2] - mu[i][2]*tk[i][1]); + t[i][1] -= muscale * (mu[i][2]*tk[i][0] - mu[i][0]*tk[i][2]); + if (slabflag != 2) t[i][2] -= muscale * (mu[i][0]*tk[i][1] - mu[i][1]*tk[i][0]); } // sum global energy across Kspace vevs and add in volume-dependent term diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index df1acb337d..3554f66f36 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -434,7 +434,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // compute field for torque calculation - partial2 = exprl*sfacrl_all[k] - expim*sfacim_all[k]; + partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; tk[i][0] += partial2*eg[k][0]; tk[i][1] += partial2*eg[k][1]; tk[i][2] += partial2*eg[k][2]; @@ -478,9 +478,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) fm_long[i][1] += spscale2 * tk[i][1]; if (slabflag != 2) fm_long[i][2] += spscale2 * tk[i][3]; } - - //printf("test f_l: %g %g %g \n",f[0][0],f[0][1],f[0][2]); - //printf("test fm_l: %g %g %g \n",fm_long[0][0],fm_long[0][1],fm_long[0][2]); // sum global energy across Kspace vevs and add in volume-dependent term // taking the re-part of struct_fact_i x struct_fact_j From 9727fdc47305b9ce29ec099a6a1d138892e38898 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 8 Nov 2018 16:17:43 -0700 Subject: [PATCH 17/90] Commit JT 110818 - correct bug (match ewald/disp results for vir) - started correct mag. part --- examples/SPIN/pppm_spin/data.2 | 13 ++++ examples/SPIN/pppm_spin/in.spin.2 | 75 +++++++++++++++++++++ examples/SPIN/pppm_spin/in.spin.cut_comp | 72 +++++++++++++++++++++ examples/SPIN/pppm_spin/in.spin.pppm_spin | 10 +-- src/KSPACE/ewald_dipole.cpp | 28 ++++---- src/KSPACE/ewald_dipole_spin.cpp | 30 +++++---- src/SPIN/pair_spin_dipolar_cut.cpp | 79 +++++++++++------------ 7 files changed, 233 insertions(+), 74 deletions(-) create mode 100644 examples/SPIN/pppm_spin/data.2 create mode 100644 examples/SPIN/pppm_spin/in.spin.2 create mode 100644 examples/SPIN/pppm_spin/in.spin.cut_comp diff --git a/examples/SPIN/pppm_spin/data.2 b/examples/SPIN/pppm_spin/data.2 new file mode 100644 index 0000000000..426e3a9cb4 --- /dev/null +++ b/examples/SPIN/pppm_spin/data.2 @@ -0,0 +1,13 @@ +RANDOM INITIALIZATION FOR STOCKMAYER FLUID +2 atoms +1 atom types + + -3.0 3.0 xlo xhi + -3.0 3.0 ylo yhi + -3.0 3.0 zlo zhi + #30.0 30.0 0.0 xy xz yz + +Atoms + +1 1 1.73 0.0 0.0 0.0 0.0 0.0 1.0 +2 1 1.73 0.0 2.5 0.0 0.0 0.0 1.0 diff --git a/examples/SPIN/pppm_spin/in.spin.2 b/examples/SPIN/pppm_spin/in.spin.2 new file mode 100644 index 0000000000..29f3203694 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.2 @@ -0,0 +1,75 @@ +# two magnetic atoms in a 3d box + +clear +units metal +atom_style spin + +dimension 3 +#boundary p p p +atom_modify map array + +read_data ../examples/SPIN/pppm_spin/data.2 + + +mass 1 58.93 +#set group all spin/random 31 1.72 + +#velocity all create 100 4928459 rot yes dist gaussian + +pair_style spin/dipolar/cut 4.0 +pair_coeff * * long 2.6 +#pair_style hybrid/overlay spin/exchange 4.0 spin/dipolar/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long/qsymp 8.0 +#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +#pair_coeff * * spin/exchange exchange 4.0 0.1 1.135028015e-05 1.064568567 +#pair_coeff * * spin/dipolar/long long 8.0 + +#neighbor 0.1 bin +#neigh_modify every 10 check yes delay 20 +neighbor 0.3 bin +neigh_modify delay 0 +#neigh_modify every 1 delay 10 check yes page 100000000 one 10000000 + +#kspace_style pppm/dipole/spin 1.0e-4 +#kspace_style ewald/dipole/spin 1.0e-4 +#kspace_modify compute yes +#kspace_modify compute yes gewald 0.1 + +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 +#fix 3 all nve/spin lattice yes +fix 3 all nve/spin lattice no + +timestep 0.0001 + +thermo_style custom step temp pe ke etotal press +thermo_modify format float %20.16g +thermo 1 + +#compute peratom all pe/atom +#compute pe all reduce sum c_peratom +#thermo_style custom step temp pe c_pe + +#compute peratom2 all stress/atom +#compute peratom2 all stress/atom NULL +#compute p all reduce sum c_peratom2[1] c_peratom2[2] c_peratom2[3] c_peratom2[4] c_peratom2[5] c_peratom2[6] +#variable press equal -(c_p[1]+c_p[2]+c_p[3])/(3*vol) +#variable pxx equal -c_p[1]/vol +#variable pyy equal -c_p[2]/vol +#variable pzz equal -c_p[3]/vol +#variable pxy equal -c_p[4]/vol +#variable pxz equal -c_p[5]/vol +#variable pyz equal -c_p[6]/vol +#thermo_style custom step temp etotal pe c_pe press v_press pxx v_pxx pyy v_pyy pzz v_pzz pxy v_pxy pxz v_pxz pyz v_pyz +#thermo_style custom step etotal pe press v_press v_pxx v_pyy v_pzz v_pxy v_pxz v_pyz +#thermo_style custom step temp etotal press v_press + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 1 all custom 1 dump.equil id type x y z c_outsp[1] c_outsp[2] c_outsp[3] +#c_outsp[5] c_outsp[6] c_outsp[7] +#dump_modify 1 format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g" scale yes + +#pair_modify compute no + +run 1 diff --git a/examples/SPIN/pppm_spin/in.spin.cut_comp b/examples/SPIN/pppm_spin/in.spin.cut_comp new file mode 100644 index 0000000000..3d01c56878 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.cut_comp @@ -0,0 +1,72 @@ +# bcc iron in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p +atom_modify map array + +lattice bcc 2.8665 +region box block 0.0 5.0 0.0 5.0 0.0 5.0 +create_box 1 box +create_atoms 1 box + +mass 1 58.93 +#set group all spin 2.2 0.0 0.0 1.0 +set group all spin/random 31 2.2 + +#pair_style spin/dipolar/cut 5.0 +#pair_coeff * * long 5.0 +pair_style spin/dipolar/long 4.0 +pair_coeff * * long 4.0 + +#neighbor 0.1 bin +#neigh_modify every 10 check yes delay 20 +neighbor 0.3 bin +neigh_modify delay 0 +#neigh_modify every 1 delay 10 check yes page 100000000 one 10000000 + +#kspace_style pppm/dipole/spin 1.0e-4 +kspace_style ewald/dipole/spin 1.0e-4 +kspace_modify compute yes +#kspace_modify compute yes gewald 0.1 + +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.1 21 +#fix 3 all nve/spin lattice yes +fix 3 all nve/spin lattice no + +timestep 0.0001 + +thermo_style custom step temp pe ke etotal press +thermo_modify format float %20.16g +thermo 50 + +#compute peratom all pe/atom +#compute pe all reduce sum c_peratom +#thermo_style custom step temp pe c_pe + +#compute peratom2 all stress/atom +#compute peratom2 all stress/atom NULL +#compute p all reduce sum c_peratom2[1] c_peratom2[2] c_peratom2[3] c_peratom2[4] c_peratom2[5] c_peratom2[6] +#variable press equal -(c_p[1]+c_p[2]+c_p[3])/(3*vol) +#variable pxx equal -c_p[1]/vol +#variable pyy equal -c_p[2]/vol +#variable pzz equal -c_p[3]/vol +#variable pxy equal -c_p[4]/vol +#variable pxz equal -c_p[5]/vol +#variable pyz equal -c_p[6]/vol +#thermo_style custom step temp etotal pe c_pe press v_press pxx v_pxx pyy v_pyy pzz v_pzz pxy v_pxy pxz v_pxz pyz v_pyz +#thermo_style custom step etotal pe press v_press v_pxx v_pyy v_pzz v_pxy v_pxz v_pyz +#thermo_style custom step temp etotal press v_press + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 50 all custom 1 dump.equil id type x y z c_outsp[1] c_outsp[2] c_outsp[3] +#c_outsp[5] c_outsp[6] c_outsp[7] +#dump_modify 1 format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g" scale yes + +#pair_modify compute no + +run 10000 diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin index 6762fe6fab..78dfbb56a0 100644 --- a/examples/SPIN/pppm_spin/in.spin.pppm_spin +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -19,14 +19,15 @@ create_atoms 1 box mass 1 58.93 -#set group all spin/random 31 1.72 -set group all spin 1.72 0.0 0.0 1.0 +set group all spin/random 31 1.72 +#set group all spin 1.72 0.0 0.0 1.0 velocity all create 100 4928459 rot yes dist gaussian pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long/qsymp 8.0 pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * spin/exchange exchange 4.0 0.0 1.135028015e-05 1.064568567 #pair_coeff * * spin/dipolar/long/qsymp long 8.0 pair_coeff * * spin/dipolar/long long 8.0 @@ -34,7 +35,7 @@ neighbor 0.1 bin neigh_modify every 10 check yes delay 20 kspace_style pppm/dipole/spin 1.0e-4 -#kspace_modify mesh 32 32 32 +kspace_modify compute yes #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 @@ -55,6 +56,7 @@ variable emag equal c_out_mag[5] variable tmag equal c_out_mag[6] thermo_style custom step time v_magnorm v_emag temp etotal +thermo_modify format float %20.16g thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index f2124deb4f..92470eb4a8 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -439,8 +439,7 @@ void EwaldDipole::compute(int eflag, int vflag) for (i = 0; i < nlocal; i++) { - vcik[0] = vcik[1] = vcik[2] = 0.0; - vcik[3] = vcik[4] = vcik[5] = 0.0; + for (j = 0; j<6; j++) vcik[j] = 0.0; // calculating re and im of exp(i*k*ri) @@ -458,29 +457,28 @@ void EwaldDipole::compute(int eflag, int vflag) // compute field for torque calculation - partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; - tk[i][0] += partial2*eg[k][0]; - tk[i][1] += partial2*eg[k][1]; - tk[i][2] += partial2*eg[k][2]; + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + tk[i][0] += partial_peratom * eg[k][0]; + tk[i][1] += partial_peratom * eg[k][1]; + tk[i][2] += partial_peratom * eg[k][2]; // total and per-atom virial correction (dipole only) - vc[k][0] += vcik[0] = partial2 * mu[i][0] * kx; - vc[k][1] += vcik[1] = partial2 * mu[i][1] * ky; - vc[k][2] += vcik[2] = partial2 * mu[i][2] * kz; - vc[k][3] += vcik[3] = partial2 * mu[i][0] * ky; - vc[k][4] += vcik[4] = partial2 * mu[i][0] * kz; - vc[k][5] += vcik[5] = partial2 * mu[i][1] * kz; + vc[k][0] += vcik[0] = -(partial_peratom * mu[i][0] * eg[k][0]); + vc[k][1] += vcik[1] = -(partial_peratom * mu[i][1] * eg[k][1]); + vc[k][2] += vcik[2] = -(partial_peratom * mu[i][2] * eg[k][2]); + vc[k][3] += vcik[3] = -(partial_peratom * mu[i][0] * eg[k][1]); + vc[k][4] += vcik[4] = -(partial_peratom * mu[i][0] * eg[k][2]); + vc[k][5] += vcik[5] = -(partial_peratom * mu[i][1] * eg[k][2]); // taking re-part of struct_fact x exp(i*k*ri) // (for per-atom energy and virial calc.) if (evflag_atom) { - partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) - vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); + vatom[i][j] += (ug[k]*muk[k][i]*vg[k][j]*partial_peratom - vcik[j]); } } } @@ -517,7 +515,7 @@ void EwaldDipole::compute(int eflag, int vflag) double uk, vk; for (k = 0; k < kcount; k++) { uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); - for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] + ug[k]*vc[k][j]; + for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] - vc[k][j]; } for (j = 0; j < 6; j++) virial[j] *= muscale; } diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 3554f66f36..4313f7b57b 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -428,13 +428,14 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // taking im of struct_fact x exp(i*k*ri) (for force calc.) partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); - ek[i][0] += partial*eg[k][0]; - ek[i][1] += partial*eg[k][1]; - ek[i][2] += partial*eg[k][2]; + ek[i][0] += partial * eg[k][0]; + ek[i][1] += partial * eg[k][1]; + ek[i][2] += partial * eg[k][2]; // compute field for torque calculation - partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + //partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; tk[i][0] += partial2*eg[k][0]; tk[i][1] += partial2*eg[k][1]; tk[i][2] += partial2*eg[k][2]; @@ -445,22 +446,23 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) spy = sp[i][1]*sp[i][3]; spz = sp[i][2]*sp[i][3]; - vc[k][0] += vcik[0] = partial2 * spx * kx; - vc[k][1] += vcik[1] = partial2 * spy * ky; - vc[k][2] += vcik[2] = partial2 * spz * kz; - vc[k][3] += vcik[3] = partial2 * spx * ky; - vc[k][4] += vcik[4] = partial2 * spx * kz; - vc[k][5] += vcik[5] = partial2 * spy * kz; + vc[k][0] += vcik[0] = -(partial_peratom * spx * eg[k][0]); + vc[k][1] += vcik[1] = -(partial_peratom * spy * eg[k][1]); + vc[k][2] += vcik[2] = -(partial_peratom * spz * eg[k][2]); + vc[k][3] += vcik[3] = -(partial_peratom * spx * eg[k][1]); + vc[k][4] += vcik[4] = -(partial_peratom * spx * eg[k][2]); + vc[k][5] += vcik[5] = -(partial_peratom * spy * eg[k][2]); // taking re-part of struct_fact x exp(i*k*ri) // (for per-atom energy and virial calc.) if (evflag_atom) { - partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + //partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) - vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); + vatom[i][j] += (ug[k]*muk[k][i]*vg[k][j]*partial_peratom - vcik[j]); + //vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); } } } @@ -498,7 +500,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) double uk, vk; for (k = 0; k < kcount; k++) { uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); - for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] + ug[k]*vc[k][j]; + for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] - vc[k][j]; } for (j = 0; j < 6; j++) virial[j] *= spscale; } @@ -529,7 +531,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) } /* ---------------------------------------------------------------------- - compute the + compute the struc. factors and mu dot k products ------------------------------------------------------------------------- */ void EwaldDipoleSpin::eik_dot_r() diff --git a/src/SPIN/pair_spin_dipolar_cut.cpp b/src/SPIN/pair_spin_dipolar_cut.cpp index 2c44b25fbf..b8927d62e9 100644 --- a/src/SPIN/pair_spin_dipolar_cut.cpp +++ b/src/SPIN/pair_spin_dipolar_cut.cpp @@ -65,17 +65,12 @@ lockfixnvespin(NULL) lattice_flag = 0; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - //mub = 5.78901e-5; // in eV/T - //mu_0 = 1.2566370614e-6; // in T.m/A mub = 9.274e-4; // in A.Ang^2 mu_0 = 785.15; // in eV/Ang/A^2 mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 - //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz - //printf("hbar: %g, mub2mu0hbinv: %g \n",hbar,mub2mu0hbinv); - } /* ---------------------------------------------------------------------- @@ -103,6 +98,9 @@ void PairSpinDipolarCut::settings(int narg, char **arg) if (strcmp(update->unit_style,"metal") != 0) error->all(FLERR,"Spin simulations require metal unit style"); + if (!atom->sp) + error->all(FLERR,"Pair/spin style requires atom attribute sp"); + cut_spin_long_global = force->numeric(FLERR,arg[0]); // reset cutoffs that have been explicitly set @@ -234,7 +232,7 @@ void PairSpinDipolarCut::compute(int eflag, int vflag) int i,j,ii,jj,inum,jnum,itype,jtype; double rinv,r2inv,r3inv,rsq; double evdwl,ecoul; - double xi[3],rij[3]; + double xi[3],rij[3],eij[3]; double spi[4],spj[4],fi[3],fmi[3]; double local_cut2; int *ilist,*jlist,*numneigh,**firstneigh; @@ -282,6 +280,7 @@ void PairSpinDipolarCut::compute(int eflag, int vflag) spj[2] = sp[j][2]; spj[3] = sp[j][3]; + evdwl = 0.0; fi[0] = fi[1] = fi[2] = 0.0; fmi[0] = fmi[1] = fmi[2] = 0.0; @@ -289,16 +288,19 @@ void PairSpinDipolarCut::compute(int eflag, int vflag) rij[1] = x[j][1] - xi[1]; rij[2] = x[j][2] - xi[2]; rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; if (rsq < local_cut2) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); r3inv = r2inv*rinv; - compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); - if (lattice_flag) compute_dipolar_mech(i,j,rij,fmi,spi,spj,r2inv); + compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); + if (lattice_flag) compute_dipolar_mech(i,j,eij,fi,spi,spj,r2inv); } // force accumulation @@ -318,13 +320,11 @@ void PairSpinDipolarCut::compute(int eflag, int vflag) if (eflag) { if (rsq <= local_cut2) { - evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + - spi[2]*fmi[2]; + evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); evdwl *= hbar; } } else evdwl = 0.0; - if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, evdwl,ecoul,fi[0],fi[1],fi[2],rij[0],rij[1],rij[2]); @@ -342,7 +342,7 @@ void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) { int i,j,jj,jnum,itype,jtype; double rsq,rinv,r2inv,r3inv; - double xi[3],rij[3]; + double xi[3],rij[3],eij[3]; double spi[4],spj[4]; double local_cut2; int *ilist,*jlist,*numneigh,**firstneigh; @@ -384,44 +384,41 @@ void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) rij[1] = x[j][1] - xi[1]; rij[2] = x[j][2] - xi[2]; rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; if (rsq < local_cut2) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); r3inv = r2inv*rinv; // compute dipolar interaction - compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); + compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); } } - - //printf("test fm: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); - - //fmi[0] *= mub2mu0hbinv; - //fmi[1] *= mub2mu0hbinv; - //fmi[2] *= mub2mu0hbinv; } /* ---------------------------------------------------------------------- compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::compute_dipolar(int i, int j, double rij[3], +void PairSpinDipolarCut::compute_dipolar(int i, int j, double eij[3], double fmi[3], double spi[4], double spj[4], double r3inv) { double sjdotr; - double gigjri3,pre; + double gigjiri3,pre; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - gigjri3 = (spi[3] * spj[3])*r3inv; - pre = mub2mu0hbinv * gigjri3 / 4.0 / MY_PI; + sjdotr = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; + gigjiri3 = (spi[3] * spj[3])*r3inv; + pre = mub2mu0hbinv * gigjiri3; - fmi[0] += pre * gigjri3 * (3.0 * sjdotr *rij[0] - spj[0]); - fmi[1] += pre * gigjri3 * (3.0 * sjdotr *rij[1] - spj[1]); - fmi[2] += pre * gigjri3 * (3.0 * sjdotr *rij[2] - spj[2]); + fmi[0] += pre * (3.0 * sjdotr *eij[0] - spj[0]); + fmi[1] += pre * (3.0 * sjdotr *eij[1] - spj[1]); + fmi[2] += pre * (3.0 * sjdotr *eij[2] - spj[2]); } /* ---------------------------------------------------------------------- @@ -429,25 +426,25 @@ void PairSpinDipolarCut::compute_dipolar(int i, int j, double rij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::compute_dipolar_mech(int i, int j, double rij[3], +void PairSpinDipolarCut::compute_dipolar_mech(int i, int j, double eij[3], double fi[3], double spi[3], double spj[3], double r2inv) { - double sdots,sidotr,sjdotr,b2,b3; + double sisj,sieij,sjeij; double gigjri4,bij,pre; - gigjri4 = (spi[3] * spj[3])/r2inv/r2inv; - sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; - sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + gigjri4 = (spi[3] * spj[3])*r2inv*r2inv; + sisj = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sieij = spi[0]*eij[0] + spi[1]*eij[1] + spi[2]*eij[2]; + sjeij = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; + + bij = sisj - 5.0*sieij*sjeij; + pre = mub2mu0*gigjri4; - bij = sdots - 5.0 * sidotr*sjdotr; - pre = mub2mu0 * bij / 4.0 / MY_PI; - fi[0] += pre * (rij[0] * bij + (sjdotr*spi[0] + sidotr*spj[0])); - fi[1] += pre * (rij[1] * bij + (sjdotr*spi[1] + sidotr*spj[1])); - fi[2] += pre * (rij[2] * bij + (sjdotr*spi[2] + sidotr*spj[2])); + fi[0] += pre * (eij[0] * bij + (sjeij*spi[0] + sieij*spj[0])); + fi[1] += pre * (eij[1] * bij + (sjeij*spi[1] + sieij*spj[1])); + fi[2] += pre * (eij[2] * bij + (sjeij*spi[2] + sieij*spj[2])); } - /* ---------------------------------------------------------------------- allocate all arrays ------------------------------------------------------------------------- */ From d66a1ac054222c06cb95285f364127e6bb9ee815 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 13 Nov 2018 17:03:32 -0700 Subject: [PATCH 18/90] Commit JT 111318 - corrections pair/spin/dipolar/long --- examples/SPIN/pppm_spin/in.dipole.pppm_dipole | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole index 86ac5198b0..d029d0a97c 100644 --- a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole +++ b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole @@ -28,7 +28,7 @@ pair_coeff * * 0.0 0.0 #kspace_style pppm/disp 1.0e-4 #kspace_style pppm/dipole 1.0e-4 kspace_style ewald/dipole 1.0e-4 -#kspace_modify gewald 0.1 +#kspace_modify compute yes gewald 0.1 neighbor 0.3 bin neigh_modify every 2 delay 4 check yes From ddd5e61254d0f2b263ae0fe2bd30ab77470d66e8 Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 14 Nov 2018 09:46:16 -0700 Subject: [PATCH 19/90] Commit JT 111418 - removed muk table (size kmax3d, mem fault) --- src/KSPACE/ewald_dipole.cpp | 91 +++++++++++++++-------------- src/KSPACE/ewald_dipole.h | 2 +- src/KSPACE/ewald_dipole_spin.cpp | 98 ++++++++++++++++---------------- 3 files changed, 95 insertions(+), 96 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 92470eb4a8..0cd5c95a9b 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -45,11 +45,10 @@ using namespace MathSpecial; /* ---------------------------------------------------------------------- */ EwaldDipole::EwaldDipole(LAMMPS *lmp, int narg, char **arg) : Ewald(lmp, narg, arg), - muk(NULL), tk(NULL), vc(NULL) + tk(NULL), vc(NULL) { ewaldflag = dipoleflag = 1; group_group_enable = 0; - muk = NULL; tk = NULL; vc = NULL; } @@ -60,7 +59,6 @@ EwaldDipole::EwaldDipole(LAMMPS *lmp, int narg, char **arg) : Ewald(lmp, narg, a EwaldDipole::~EwaldDipole() { - memory->destroy(muk); memory->destroy(tk); memory->destroy(vc); } @@ -326,14 +324,12 @@ void EwaldDipole::setup() memory->destroy(vc); memory->destroy3d_offset(cs,-kmax_created); memory->destroy3d_offset(sn,-kmax_created); - memory->destroy(muk); nmax = atom->nmax; memory->create(ek,nmax,3,"ewald_dipole:ek"); memory->create(tk,nmax,3,"ewald_dipole:tk"); memory->create(vc,kmax3d,6,"ewald_dipole:tk"); memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole:cs"); memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole:sn"); - memory->create(muk,kmax3d,nmax,"ewald_dipole:muk"); kmax_created = kmax; } @@ -393,14 +389,12 @@ void EwaldDipole::compute(int eflag, int vflag) memory->destroy(vc); memory->destroy3d_offset(cs,-kmax_created); memory->destroy3d_offset(sn,-kmax_created); - memory->destroy(muk); nmax = atom->nmax; memory->create(ek,nmax,3,"ewald_dipole:ek"); memory->create(tk,nmax,3,"ewald_dipole:tk"); memory->create(vc,kmax3d,6,"ewald_dipole:tk"); memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole:cs"); memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole:sn"); - memory->create(muk,kmax3d,nmax,"ewald_dipole:muk"); kmax_created = kmax; } @@ -425,6 +419,7 @@ void EwaldDipole::compute(int eflag, int vflag) double cypz,sypz,exprl,expim; double partial,partial2,partial_peratom; double vcik[6]; + double mudotk; for (i = 0; i < nlocal; i++) { ek[i][0] = ek[i][1] = ek[i][2] = 0.0; @@ -440,6 +435,9 @@ void EwaldDipole::compute(int eflag, int vflag) for (i = 0; i < nlocal; i++) { for (j = 0; j<6; j++) vcik[j] = 0.0; + + // re-evaluating mu dot k + mudotk = mu[i][0]*kx*unitk[0] + mu[i][1]*ky*unitk[1] + mu[i][2]*kz*unitk[2]; // calculating re and im of exp(i*k*ri) @@ -450,7 +448,7 @@ void EwaldDipole::compute(int eflag, int vflag) // taking im of struct_fact x exp(i*k*ri) (for force calc.) - partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); + partial = (mudotk)*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial * eg[k][0]; ek[i][1] += partial * eg[k][1]; ek[i][2] += partial * eg[k][2]; @@ -475,10 +473,10 @@ void EwaldDipole::compute(int eflag, int vflag) // (for per-atom energy and virial calc.) if (evflag_atom) { - if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; + if (eflag_atom) eatom[i] += mudotk*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) - vatom[i][j] += (ug[k]*muk[k][i]*vg[k][j]*partial_peratom - vcik[j]); + vatom[i][j] += (ug[k]*mudotk*vg[k][j]*partial_peratom - vcik[j]); } } } @@ -552,6 +550,7 @@ void EwaldDipole::eik_dot_r() double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; double sqk,clpm,slpm; double mux, muy, muz; + double mudotk; double **x = atom->x; double **mu = atom->mu; @@ -582,9 +581,9 @@ void EwaldDipole::eik_dot_r() sn[1][ic][i] = sin(unitk[ic]*x[i][ic]); cs[-1][ic][i] = cs[1][ic][i]; sn[-1][ic][i] = -sn[1][ic][i]; - muk[n][i] = (mu[i][ic]*unitk[ic]); - cstr1 += muk[n][i]*cs[1][ic][i]; - sstr1 += muk[n][i]*sn[1][ic][i]; + mudotk = (mu[i][ic]*unitk[ic]); + cstr1 += mudotk*cs[1][ic][i]; + sstr1 += mudotk*sn[1][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -606,9 +605,9 @@ void EwaldDipole::eik_dot_r() cs[m-1][ic][i]*sn[1][ic][i]; cs[-m][ic][i] = cs[m][ic][i]; sn[-m][ic][i] = -sn[m][ic][i]; - muk[n][i] = (mu[i][ic]*m*unitk[ic]); - cstr1 += muk[n][i]*cs[m][ic][i]; - sstr1 += muk[n][i]*sn[m][ic][i]; + mudotk = (mu[i][ic]*m*unitk[ic]); + cstr1 += mudotk*cs[m][ic][i]; + sstr1 += mudotk*sn[m][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -631,14 +630,14 @@ void EwaldDipole::eik_dot_r() muy = mu[i][1]; // dir 1: (k,l,0) - muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1]); - cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); - sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); + mudotk = (mux*k*unitk[0] + muy*l*unitk[1]); + cstr1 += mudotk*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); + sstr1 += mudotk*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); // dir 2: (k,-l,0) - muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1]); - cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); - sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); + mudotk = (mux*k*unitk[0] - muy*l*unitk[1]); + cstr2 += mudotk*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); + sstr2 += mudotk*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -663,14 +662,14 @@ void EwaldDipole::eik_dot_r() muz = mu[i][2]; // dir 1: (0,l,m) - muk[n][i] = (muy*l*unitk[1] + muz*m*unitk[2]); - cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); - sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); + mudotk = (muy*l*unitk[1] + muz*m*unitk[2]); + cstr1 += mudotk*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); + sstr1 += mudotk*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); // dir 2: (0,l,-m) - muk[n+1][i] = (muy*l*unitk[1] - muz*m*unitk[2]); - cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); - sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); + mudotk = (muy*l*unitk[1] - muz*m*unitk[2]); + cstr2 += mudotk*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); + sstr2 += mudotk*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -695,14 +694,14 @@ void EwaldDipole::eik_dot_r() muz = mu[i][2]; // dir 1: (k,0,m) - muk[n][i] = (mux*k*unitk[0] + muz*m*unitk[2]); - cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); - sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); + mudotk = (mux*k*unitk[0] + muz*m*unitk[2]); + cstr1 += mudotk*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); + sstr1 += mudotk*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); // dir 2: (k,0,-m) - muk[n+1][i] = (mux*k*unitk[0] - muz*m*unitk[2]); - cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); - sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); + mudotk = (mux*k*unitk[0] - muz*m*unitk[2]); + cstr2 += mudotk*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); + sstr2 += mudotk*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -734,32 +733,32 @@ void EwaldDipole::eik_dot_r() muz = mu[i][2]; // dir 1: (k,l,m) - muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; - cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr1 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr1 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 2: (k,-l,m) - muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; - cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr2 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr2 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 3: (k,l,-m) - muk[n+2][i] = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; - cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr3 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr3 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 4: (k,-l,-m) - muk[n+3][i] = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; - cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr4 += muk[n+3][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr4 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr4 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index 0a57f86d00..77c0af11c2 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -34,7 +34,7 @@ class EwaldDipole : public Ewald { protected: double musum,musqsum,mu2; - double **muk; // mu_i dot k + //double **muk; // mu_i dot k double **tk; // field for torque double **vc; // virial per k diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 4313f7b57b..e6cfbfbaa6 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -318,14 +318,12 @@ void EwaldDipoleSpin::setup() memory->destroy(vc); memory->destroy3d_offset(cs,-kmax_created); memory->destroy3d_offset(sn,-kmax_created); - memory->destroy(muk); nmax = atom->nmax; memory->create(ek,nmax,3,"ewald_dipole_spin:ek"); memory->create(tk,nmax,3,"ewald_dipole_spin:tk"); memory->create(vc,kmax3d,6,"ewald_dipole_spin:tk"); memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole_spin:cs"); memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole_spin:sn"); - memory->create(muk,kmax3d,nmax,"ewald_dipole_spin:muk"); kmax_created = kmax; } @@ -369,14 +367,12 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) memory->destroy(vc); memory->destroy3d_offset(cs,-kmax_created); memory->destroy3d_offset(sn,-kmax_created); - memory->destroy(muk); nmax = atom->nmax; memory->create(ek,nmax,3,"ewald_dipole_spin:ek"); memory->create(tk,nmax,3,"ewald_dipole_spin:tk"); memory->create(vc,kmax3d,6,"ewald_dipole_spin:tk"); memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole_spin:cs"); memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole_spin:sn"); - memory->create(muk,kmax3d,nmax,"ewald_dipole_spin:muk"); kmax_created = kmax; } @@ -401,6 +397,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) double cypz,sypz,exprl,expim; double partial,partial2,partial_peratom; double vcik[6]; + double mudotk; for (i = 0; i < nlocal; i++) { ek[i][0] = ek[i][1] = ek[i][2] = 0.0; @@ -415,8 +412,14 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) for (i = 0; i < nlocal; i++) { - vcik[0] = vcik[1] = vcik[2] = 0.0; - vcik[3] = vcik[4] = vcik[5] = 0.0; + for (j = 0; j<6; j++) vcik[j] = 0.0; + + // re-evaluating sp dot k + + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + mudotk = spx*kx*unitk[0] + spy*ky*unitk[1] + spz*kz*unitk[2]; // calculating re and im of exp(i*k*ri) @@ -427,7 +430,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // taking im of struct_fact x exp(i*k*ri) (for force calc.) - partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); + partial = mudotk*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial * eg[k][0]; ek[i][1] += partial * eg[k][1]; ek[i][2] += partial * eg[k][2]; @@ -442,10 +445,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // total and per-atom virial correction - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - vc[k][0] += vcik[0] = -(partial_peratom * spx * eg[k][0]); vc[k][1] += vcik[1] = -(partial_peratom * spy * eg[k][1]); vc[k][2] += vcik[2] = -(partial_peratom * spz * eg[k][2]); @@ -458,10 +457,10 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) if (evflag_atom) { //partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; - if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; + if (eflag_atom) eatom[i] += mudotk*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) - vatom[i][j] += (ug[k]*muk[k][i]*vg[k][j]*partial_peratom - vcik[j]); + vatom[i][j] += (ug[k]*mudotk*vg[k][j]*partial_peratom - vcik[j]); //vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); } } @@ -540,6 +539,7 @@ void EwaldDipoleSpin::eik_dot_r() double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; double sqk,clpm,slpm; double spx, spy, spz, spi; + double mudotk; double **x = atom->x; double **sp = atom->sp; @@ -571,9 +571,9 @@ void EwaldDipoleSpin::eik_dot_r() cs[-1][ic][i] = cs[1][ic][i]; sn[-1][ic][i] = -sn[1][ic][i]; spi = sp[i][ic]*sp[i][3]; - muk[n][i] = (spi*unitk[ic]); - cstr1 += muk[n][i]*cs[1][ic][i]; - sstr1 += muk[n][i]*sn[1][ic][i]; + mudotk = (spi*unitk[ic]); + cstr1 += mudotk*cs[1][ic][i]; + sstr1 += mudotk*sn[1][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -596,9 +596,9 @@ void EwaldDipoleSpin::eik_dot_r() cs[-m][ic][i] = cs[m][ic][i]; sn[-m][ic][i] = -sn[m][ic][i]; spi = sp[i][ic]*sp[i][3]; - muk[n][i] = (spi*m*unitk[ic]); - cstr1 += muk[n][i]*cs[m][ic][i]; - sstr1 += muk[n][i]*sn[m][ic][i]; + mudotk = (spi*m*unitk[ic]); + cstr1 += mudotk*cs[m][ic][i]; + sstr1 += mudotk*sn[m][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -621,14 +621,14 @@ void EwaldDipoleSpin::eik_dot_r() spy = sp[i][1]*sp[i][3]; // dir 1: (k,l,0) - muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1]); - cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); - sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); + mudotk = (spx*k*unitk[0] + spy*l*unitk[1]); + cstr1 += mudotk*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); + sstr1 += mudotk*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); // dir 2: (k,-l,0) - muk[n+1][i] = (spx*k*unitk[0] - spy*l*unitk[1]); - cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); - sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); + mudotk = (spx*k*unitk[0] - spy*l*unitk[1]); + cstr2 += mudotk*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); + sstr2 += mudotk*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -653,14 +653,14 @@ void EwaldDipoleSpin::eik_dot_r() spz = sp[i][2]*sp[i][3]; // dir 1: (0,l,m) - muk[n][i] = (spy*l*unitk[1] + spz*m*unitk[2]); - cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); - sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); + mudotk = (spy*l*unitk[1] + spz*m*unitk[2]); + cstr1 += mudotk*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); + sstr1 += mudotk*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); // dir 2: (0,l,-m) - muk[n+1][i] = (spy*l*unitk[1] - spz*m*unitk[2]); - cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); - sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); + mudotk = (spy*l*unitk[1] - spz*m*unitk[2]); + cstr2 += mudotk*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); + sstr2 += mudotk*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -685,14 +685,14 @@ void EwaldDipoleSpin::eik_dot_r() spz = sp[i][2]*sp[i][3]; // dir 1: (k,0,m) - muk[n][i] = (spx*k*unitk[0] + spz*m*unitk[2]); - cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); - sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); + mudotk = (spx*k*unitk[0] + spz*m*unitk[2]); + cstr1 += mudotk*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); + sstr1 += mudotk*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); // dir 2: (k,0,-m) - muk[n+1][i] = (spx*k*unitk[0] - spz*m*unitk[2]); - cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); - sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); + mudotk = (spx*k*unitk[0] - spz*m*unitk[2]); + cstr2 += mudotk*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); + sstr2 += mudotk*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -724,32 +724,32 @@ void EwaldDipoleSpin::eik_dot_r() spz = sp[i][2]*sp[i][3]; // dir 1: (k,l,m) - muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1] + spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] + spy*l*unitk[1] + spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; - cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr1 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr1 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 2: (k,-l,m) - muk[n+1][i] = (spx*k*unitk[0] - spy*l*unitk[1] + spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] - spy*l*unitk[1] + spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; - cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr2 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr2 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 3: (k,l,-m) - muk[n+2][i] = (spx*k*unitk[0] + spy*l*unitk[1] - spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] + spy*l*unitk[1] - spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; - cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr3 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr3 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 4: (k,-l,-m) - muk[n+3][i] = (spx*k*unitk[0] - spy*l*unitk[1] - spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] - spy*l*unitk[1] - spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; - cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr4 += muk[n+3][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr4 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr4 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; From 7a2d326103b111c6282e128d2c617a4af461237b Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 8 Jan 2019 09:19:49 -0700 Subject: [PATCH 20/90] Commit JT 010819 - commit before co --- examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp | 10 +- examples/SPIN/iron/in.spin.iron | 8 +- examples/SPIN/pppm_spin/in.spin.cut_comp | 26 +----- .../SPIN/pppm_spin/in.spin.spin_dipolar_cut | 26 +++--- src/KSPACE/ewald_dipole.cpp | 2 - src/KSPACE/ewald_dipole.h | 1 - src/SPIN/pair_spin_dipolar_long.cpp | 91 +++++++++++-------- 7 files changed, 80 insertions(+), 84 deletions(-) diff --git a/examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp b/examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp index 35aa1df86c..0efa52435d 100644 --- a/examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp +++ b/examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp @@ -25,16 +25,18 @@ velocity all create 100 4928459 rot yes dist gaussian #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/neel 4.0 pair_style hybrid/overlay eam/alloy spin/exchange 4.0 -pair_coeff * * eam/alloy Co_PurjaPun_2012.eam.alloy Co -pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * eam/alloy ../examples/SPIN/cobalt_hcp/Co_PurjaPun_2012.eam.alloy Co +#pair_coeff * * eam/alloy Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 -0.3593 1.135028015e-05 1.064568567 #pair_coeff * * spin/neel neel 4.0 0.0048 0.234 1.168 2.6905 0.705 0.652 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 -fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.0 21 +fix 1 all precession/spin anisotropy 0.01 0.0 0.0 1.0 +#fix 2 all langevin/spin 0.0 0.0 21 +fix 2 all langevin/spin 0.0 0.1 21 fix 3 all nve/spin lattice yes timestep 0.0001 diff --git a/examples/SPIN/iron/in.spin.iron b/examples/SPIN/iron/in.spin.iron index c2d5082cb6..dab1616e70 100644 --- a/examples/SPIN/iron/in.spin.iron +++ b/examples/SPIN/iron/in.spin.iron @@ -19,11 +19,13 @@ create_atoms 1 box mass 1 55.845 -set group all spin/random 31 2.2 +#set group all spin/random 31 2.2 +set group all spin 2.2 0.0 0.0 1.0 velocity all create 100 4928459 rot yes dist gaussian pair_style hybrid/overlay eam/alloy spin/exchange 3.5 -pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe +#pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe +pair_coeff * * eam/alloy ../examples/SPIN/iron/Fe_Mishin2006.eam.alloy Fe pair_coeff * * spin/exchange exchange 3.4 0.02726 0.2171 1.841 neighbor 0.1 bin @@ -53,4 +55,4 @@ thermo 50 compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -run 50000 +run 50 diff --git a/examples/SPIN/pppm_spin/in.spin.cut_comp b/examples/SPIN/pppm_spin/in.spin.cut_comp index 3d01c56878..373c485c94 100644 --- a/examples/SPIN/pppm_spin/in.spin.cut_comp +++ b/examples/SPIN/pppm_spin/in.spin.cut_comp @@ -29,12 +29,12 @@ neigh_modify delay 0 #neigh_modify every 1 delay 10 check yes page 100000000 one 10000000 #kspace_style pppm/dipole/spin 1.0e-4 -kspace_style ewald/dipole/spin 1.0e-4 -kspace_modify compute yes +#kspace_style ewald/dipole/spin 1.0e-4 +#kspace_modify compute yes #kspace_modify compute yes gewald 0.1 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.1 21 +fix 2 all langevin/spin 0.0 0.0 21 #fix 3 all nve/spin lattice yes fix 3 all nve/spin lattice no @@ -44,29 +44,9 @@ thermo_style custom step temp pe ke etotal press thermo_modify format float %20.16g thermo 50 -#compute peratom all pe/atom -#compute pe all reduce sum c_peratom -#thermo_style custom step temp pe c_pe - -#compute peratom2 all stress/atom -#compute peratom2 all stress/atom NULL -#compute p all reduce sum c_peratom2[1] c_peratom2[2] c_peratom2[3] c_peratom2[4] c_peratom2[5] c_peratom2[6] -#variable press equal -(c_p[1]+c_p[2]+c_p[3])/(3*vol) -#variable pxx equal -c_p[1]/vol -#variable pyy equal -c_p[2]/vol -#variable pzz equal -c_p[3]/vol -#variable pxy equal -c_p[4]/vol -#variable pxz equal -c_p[5]/vol -#variable pyz equal -c_p[6]/vol -#thermo_style custom step temp etotal pe c_pe press v_press pxx v_pxx pyy v_pyy pzz v_pzz pxy v_pxy pxz v_pxz pyz v_pyz -#thermo_style custom step etotal pe press v_press v_pxx v_pyy v_pzz v_pxy v_pxz v_pyz -#thermo_style custom step temp etotal press v_press - compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 50 all custom 1 dump.equil id type x y z c_outsp[1] c_outsp[2] c_outsp[3] #c_outsp[5] c_outsp[6] c_outsp[7] #dump_modify 1 format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g" scale yes -#pair_modify compute no - run 10000 diff --git a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut index b265c4413e..a3ca4288fc 100644 --- a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut +++ b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut @@ -21,16 +21,15 @@ mass 1 58.93 set group all spin/random 31 1.72 #set group all spin 1.72 0.0 0.0 1.0 -#velocity all create 100 4928459 rot yes dist gaussian +velocity all create 100 4928459 rot yes dist gaussian -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 -pair_style spin/dipolar/cut 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 -#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * long 8.0 -#pair_coeff * * spin/long long 8.0 +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 +#pair_style hybrid/overlay eam/alloy spin/dipolar/cut 8.0 +pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * spin/dipolar/cut long 8.0 +#pair_style spin/dipolar/cut 8.0 +#pair_coeff * * long 8.0 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 @@ -38,8 +37,8 @@ neigh_modify every 10 check yes delay 20 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 -#fix 3 all nve/spin lattice yes -fix 3 all nve/spin lattice no +fix 3 all nve/spin lattice yes +#fix 3 all nve/spin lattice no timestep 0.0001 @@ -55,10 +54,11 @@ variable emag equal c_out_mag[5] variable tmag equal c_out_mag[6] thermo_style custom step time v_magnorm v_emag temp etotal +thermo_modify format float %20.16g thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -#run 20000 -run 10 +run 20000 +#run 10 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 0cd5c95a9b..ebe17c82dd 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -561,8 +561,6 @@ void EwaldDipole::eik_dot_r() // loop on different k-directions // loop on n kpoints and nlocal atoms - // store (n x nlocal) tab. of values of (mu_i dot k) - // store n values of sum_j[ (mu_j dot k) exp(-k dot r_j) ] // (k,0,0), (0,l,0), (0,0,m) diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index 77c0af11c2..09a2896b56 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -34,7 +34,6 @@ class EwaldDipole : public Ewald { protected: double musum,musqsum,mu2; - //double **muk; // mu_i dot k double **tk; // field for torque double **vc; // virial per k diff --git a/src/SPIN/pair_spin_dipolar_long.cpp b/src/SPIN/pair_spin_dipolar_long.cpp index 140b92700c..ef79717f63 100644 --- a/src/SPIN/pair_spin_dipolar_long.cpp +++ b/src/SPIN/pair_spin_dipolar_long.cpp @@ -181,10 +181,14 @@ void PairSpinDipolarLong::init_style() // insure use of KSpace long-range solver, set g_ewald - if (force->kspace == NULL) - error->all(FLERR,"Pair style requires a KSpace style"); + //if (force->kspace == NULL) + // error->all(FLERR,"Pair style requires a KSpace style"); + + //g_ewald = force->kspace->g_ewald; + + // test case + g_ewald = 0.1; - g_ewald = force->kspace->g_ewald; } @@ -233,10 +237,11 @@ void PairSpinDipolarLong::compute(int eflag, int vflag) int i,j,ii,jj,inum,jnum,itype,jtype; double r,rinv,r2inv,rsq; double grij,expm2,t,erfc; - double bij[4]; double evdwl,ecoul; - double xi[3],rij[3]; - double spi[4],spj[4],fi[3],fmi[3]; + double bij[4]; + double xi[3],rij[3],eij[3]; + double spi[4],spj[4]; + double fi[3],fmi[3]; double local_cut2; double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; @@ -298,12 +303,16 @@ void PairSpinDipolarLong::compute(int eflag, int vflag) rij[1] = x[j][1] - xi[1]; rij[2] = x[j][2] - xi[2]; rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; if (rsq < local_cut2) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); + //rinv = sqrt(r2inv); r = sqrt(rsq); grij = g_ewald * r; @@ -316,18 +325,20 @@ void PairSpinDipolarLong::compute(int eflag, int vflag) bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - compute_long(i,j,rij,bij,fmi,spi,spj); - compute_long_mech(i,j,rij,bij,fmi,spi,spj); + compute_long(i,j,eij,bij,fmi,spi,spj); + compute_long_mech(i,j,eij,bij,fmi,spi,spj); + //compute_long(i,j,rij,bij,fmi,spi,spj); + //compute_long_mech(i,j,rij,bij,fmi,spi,spj); } // force accumulation - f[i][0] += fi[0] * mub2mu0; - f[i][1] += fi[1] * mub2mu0; - f[i][2] += fi[2] * mub2mu0; - fm[i][0] += fmi[0] * mub2mu0hbinv; - fm[i][1] += fmi[1] * mub2mu0hbinv; - fm[i][2] += fmi[2] * mub2mu0hbinv; + f[i][0] += fi[0]; + f[i][1] += fi[1]; + f[i][2] += fi[2]; + fm[i][0] += fmi[0]; + fm[i][1] += fmi[1]; + fm[i][2] += fmi[2]; if (newton_pair || j < nlocal) { f[j][0] -= fi[0]; @@ -360,7 +371,8 @@ void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) int i,j,jj,jnum,itype,jtype; double r,rinv,r2inv,rsq; double grij,expm2,t,erfc; - double bij[4],xi[3],rij[3]; + double bij[4]; + double xi[3],rij[3],eij[3]; double spi[4],spj[4]; double local_cut2; double pre1,pre2,pre3; @@ -411,12 +423,16 @@ void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) rij[1] = x[j][1] - xi[1]; rij[2] = x[j][2] - xi[2]; rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; if (rsq < local_cut2) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); + //rinv = sqrt(r2inv); r = sqrt(rsq); grij = g_ewald * r; @@ -429,7 +445,7 @@ void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - compute_long(i,j,rij,bij,fmi,spi,spj); + compute_long(i,j,eij,bij,fmi,spi,spj); } } @@ -447,21 +463,22 @@ void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::compute_long(int i, int j, double rij[3], +void PairSpinDipolarLong::compute_long(int i, int j, double eij[3], double bij[4], double fmi[3], double spi[4], double spj[4]) { - double sjdotr; + double sjeij,pre; double b1,b2,gigj; gigj = spi[3] * spj[3]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + pre = gigj*mub2mu0hbinv; + sjeij = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; b1 = bij[1]; b2 = bij[2]; - fmi[0] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); - fmi[1] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); - fmi[2] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); + fmi[0] += pre * (b2 * sjeij * eij[0] - b1 * spj[0]); + fmi[1] += pre * (b2 * sjeij * eij[1] - b1 * spj[1]); + fmi[2] += pre * (b2 * sjeij * eij[2] - b1 * spj[2]); } /* ---------------------------------------------------------------------- @@ -469,29 +486,27 @@ void PairSpinDipolarLong::compute_long(int i, int j, double rij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::compute_long_mech(int i, int j, double rij[3], +void PairSpinDipolarLong::compute_long_mech(int i, int j, double eij[3], double bij[4], double fi[3], double spi[3], double spj[3]) { - double sdots,sidotr,sjdotr,b2,b3; - double g1,g2,g1b2_g2b3,gigj; + double sisj,sieij,sjeij,b2,b3; + double g1,g2,g1b2_g2b3,gigj,pre; gigj = spi[3] * spj[3]; - sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; - sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + pre = gigj*mub2mu0; + sisj = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sieij = spi[0]*eij[0] + spi[1]*eij[1] + spi[2]*eij[2]; + sjeij = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; b2 = bij[2]; b3 = bij[3]; - g1 = sdots; - g2 = -sidotr*sjdotr; + g1 = sisj; + g2 = -sieij*sjeij; g1b2_g2b3 = g1*b2 + g2*b3; - fi[0] += gigj * (rij[0] * g1b2_g2b3 + - b2 * (sjdotr*spi[0] + sidotr*spj[0])); - fi[1] += gigj * (rij[1] * g1b2_g2b3 + - b2 * (sjdotr*spi[1] + sidotr*spj[1])); - fi[2] += gigj * (rij[2] * g1b2_g2b3 + - b2 * (sjdotr*spi[2] + sidotr*spj[2])); + fi[0] += pre * (eij[0] * g1b2_g2b3 + b2 * (sjeij*spi[0] + sieij*spj[0])); + fi[1] += pre * (eij[1] * g1b2_g2b3 + b2 * (sjeij*spi[1] + sieij*spj[1])); + fi[2] += pre * (eij[2] * g1b2_g2b3 + b2 * (sjeij*spi[2] + sieij*spj[2])); } From c55009a0ac6314d65fa172de64108aa129788929 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 16 Apr 2019 23:30:25 -0500 Subject: [PATCH 21/90] Enabled neighbor list build on the device with pair_style hybrid and hybrid/overlay --- lib/gpu/lal_base_atomic.cpp | 6 ++++++ lib/gpu/lal_base_charge.cpp | 6 ++++++ lib/gpu/lal_base_dipole.cpp | 6 ++++++ lib/gpu/lal_base_dpd.cpp | 6 ++++++ lib/gpu/lal_base_three.cpp | 6 ++++++ lib/gpu/lal_device.cpp | 43 ++++++++++++++++++++++++++++--------- lib/gpu/lal_device.h | 7 ++++++ src/GPU/fix_gpu.cpp | 27 +++++++++-------------- 8 files changed, 80 insertions(+), 27 deletions(-) diff --git a/lib/gpu/lal_base_atomic.cpp b/lib/gpu/lal_base_atomic.cpp index e59dae1a6f..3d47df8a92 100644 --- a/lib/gpu/lal_base_atomic.cpp +++ b/lib/gpu/lal_base_atomic.cpp @@ -70,6 +70,12 @@ int BaseAtomicT::init_atomic(const int nlocal, const int nall, if (success!=0) return success; + success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, + max_nbors,cell_size,false,_threads_per_atom); + + if (success!=0) + return success; + ucl_device=device->gpu; atom=&device->atom; diff --git a/lib/gpu/lal_base_charge.cpp b/lib/gpu/lal_base_charge.cpp index c6341f7d57..94e7502c55 100644 --- a/lib/gpu/lal_base_charge.cpp +++ b/lib/gpu/lal_base_charge.cpp @@ -71,6 +71,12 @@ int BaseChargeT::init_atomic(const int nlocal, const int nall, if (success!=0) return success; + success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, + max_nbors,cell_size,false,_threads_per_atom); + + if (success!=0) + return success; + ucl_device=device->gpu; atom=&device->atom; diff --git a/lib/gpu/lal_base_dipole.cpp b/lib/gpu/lal_base_dipole.cpp index 478f0092c7..b2a41f10cf 100644 --- a/lib/gpu/lal_base_dipole.cpp +++ b/lib/gpu/lal_base_dipole.cpp @@ -72,6 +72,12 @@ int BaseDipoleT::init_atomic(const int nlocal, const int nall, if (success!=0) return success; + success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, + max_nbors,cell_size,false,_threads_per_atom); + + if (success!=0) + return success; + ucl_device=device->gpu; atom=&device->atom; diff --git a/lib/gpu/lal_base_dpd.cpp b/lib/gpu/lal_base_dpd.cpp index 941f463b14..3f71c820c7 100644 --- a/lib/gpu/lal_base_dpd.cpp +++ b/lib/gpu/lal_base_dpd.cpp @@ -71,6 +71,12 @@ int BaseDPDT::init_atomic(const int nlocal, const int nall, if (success!=0) return success; + success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, + max_nbors,cell_size,false,_threads_per_atom); + + if (success!=0) + return success; + ucl_device=device->gpu; atom=&device->atom; diff --git a/lib/gpu/lal_base_three.cpp b/lib/gpu/lal_base_three.cpp index aa77a48c66..ba28d697cc 100644 --- a/lib/gpu/lal_base_three.cpp +++ b/lib/gpu/lal_base_three.cpp @@ -84,6 +84,12 @@ int BaseThreeT::init_three(const int nlocal, const int nall, if (success!=0) return success; + success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, + max_nbors,cell_size,false,_threads_per_atom); + + if (success!=0) + return success; + ucl_device=device->gpu; atom=&device->atom; diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp index 9397f3c6c5..411e19a78a 100644 --- a/lib/gpu/lal_device.cpp +++ b/lib/gpu/lal_device.cpp @@ -301,16 +301,6 @@ int DeviceT::init(Answer &ans, const bool charge, if (!ans.init(ef_nlocal,charge,rot,*gpu)) return -3; - if (!nbor->init(&_neighbor_shared,ef_nlocal,host_nlocal,max_nbors,maxspecial, - *gpu,gpu_nbor,gpu_host,pre_cut, _block_cell_2d, - _block_cell_id, _block_nbor_build, threads_per_atom, - _warp_size, _time_device, compile_string())) - return -3; - if (_cell_size<0.0) - nbor->cell_size(cell_size,cell_size); - else - nbor->cell_size(_cell_size,cell_size); - _init_count++; return 0; } @@ -338,6 +328,39 @@ int DeviceT::init(Answer &ans, const int nlocal, return 0; } +template +int DeviceT::init_nbor(Neighbor *nbor, const int nlocal, + const int host_nlocal, const int nall, + const int maxspecial, const int gpu_host, + const int max_nbors, const double cell_size, + const bool pre_cut, const int threads_per_atom) { + int ef_nlocal=nlocal; + if (_particle_split<1.0 && _particle_split>0.0) + ef_nlocal=static_cast(_particle_split*nlocal); + + int gpu_nbor=0; + if (_gpu_mode==Device::GPU_NEIGH) + gpu_nbor=1; + else if (_gpu_mode==Device::GPU_HYB_NEIGH) + gpu_nbor=2; + #ifndef USE_CUDPP + if (gpu_nbor==1) + gpu_nbor=2; + #endif + + if (!nbor->init(&_neighbor_shared,ef_nlocal,host_nlocal,max_nbors,maxspecial, + *gpu,gpu_nbor,gpu_host,pre_cut,_block_cell_2d, + _block_cell_id, _block_nbor_build, threads_per_atom, + _warp_size, _time_device, compile_string())) + return -3; + if (_cell_size<0.0) + nbor->cell_size(cell_size,cell_size); + else + nbor->cell_size(_cell_size,cell_size); + + return 0; +} + template void DeviceT::set_single_precompute (PPPM *pppm) { diff --git a/lib/gpu/lal_device.h b/lib/gpu/lal_device.h index 695b0a62f9..68d88a3182 100644 --- a/lib/gpu/lal_device.h +++ b/lib/gpu/lal_device.h @@ -91,6 +91,13 @@ class Device { * - -5 Double precision is not supported on card **/ int init(Answer &ans, const int nlocal, const int nall); + /// Initialize neighbor list build -- callback function from pair + int init_nbor(Neighbor *nbor, const int nlocal, + const int host_nlocal, const int nall, + const int maxspecial, const int gpu_host, + const int max_nbors, const double cell_size, + const bool pre_cut, const int threads_per_atom); + /// Output a message for pair_style acceleration with device stats void init_message(FILE *screen, const char *name, const int first_gpu, const int last_gpu); diff --git a/src/GPU/fix_gpu.cpp b/src/GPU/fix_gpu.cpp index 0d5b4334c9..7be87939fe 100644 --- a/src/GPU/fix_gpu.cpp +++ b/src/GPU/fix_gpu.cpp @@ -30,7 +30,6 @@ #include "neighbor.h" #include "citeme.h" #include "error.h" -#include "utils.h" using namespace LAMMPS_NS; using namespace FixConst; @@ -219,17 +218,6 @@ void FixGPU::init() error->all(FLERR,"GPU package does not (yet) work with " "atom_style template"); - // hybrid cannot be used with force/neigh option - - if (_gpu_mode == GPU_NEIGH || _gpu_mode == GPU_HYB_NEIGH) - if (force->pair_match("^hybrid",0) != NULL) - error->all(FLERR,"Cannot use pair hybrid with GPU neighbor list builds"); - - if (_particle_split < 0) - if (force->pair_match("^hybrid",0) != NULL) - error->all(FLERR,"GPU split param must be positive " - "for hybrid pair styles"); - // neighbor list builds on the GPU with triclinic box is not yet supported if ((_gpu_mode == GPU_NEIGH || _gpu_mode == GPU_HYB_NEIGH) && @@ -243,16 +231,21 @@ void FixGPU::init() // make sure fdotr virial is not accumulated multiple times - if (force->pair_match("^hybrid",0) != NULL) { + if (force->pair_match("hybrid",1) != NULL) { PairHybrid *hybrid = (PairHybrid *) force->pair; for (int i = 0; i < hybrid->nstyles; i++) - if (!utils::strmatch(hybrid->keywords[i],"/gpu$")) + if (strstr(hybrid->keywords[i],"/gpu")==NULL) + force->pair->no_virial_fdotr_compute = 1; + } else if (force->pair_match("hybrid/overlay",1) != NULL) { + PairHybridOverlay *hybrid = (PairHybridOverlay *) force->pair; + for (int i = 0; i < hybrid->nstyles; i++) + if (strstr(hybrid->keywords[i],"/gpu")==NULL) force->pair->no_virial_fdotr_compute = 1; } // rRESPA support - if (utils::strmatch(update->integrate_style,"^respa")) + if (strstr(update->integrate_style,"respa")) _nlevels_respa = ((Respa *) update->integrate)->nlevels; } @@ -283,7 +276,7 @@ void FixGPU::min_setup(int vflag) /* ---------------------------------------------------------------------- */ -void FixGPU::post_force(int /* vflag */) +void FixGPU::post_force(int vflag) { if (!force->pair) return; @@ -315,7 +308,7 @@ void FixGPU::min_post_force(int vflag) /* ---------------------------------------------------------------------- */ -void FixGPU::post_force_respa(int vflag, int /* ilevel */, int /* iloop */) +void FixGPU::post_force_respa(int vflag, int ilevel, int iloop) { post_force(vflag); } From 1f43efc111e9f096d61253d2c5eadac216053344 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Wed, 17 Apr 2019 00:09:49 -0500 Subject: [PATCH 22/90] Cleaned up the changes in Device and the base class of the pair styles --- lib/gpu/lal_base_atomic.cpp | 5 +--- lib/gpu/lal_base_charge.cpp | 5 +--- lib/gpu/lal_base_dipole.cpp | 5 +--- lib/gpu/lal_base_dpd.cpp | 4 +-- lib/gpu/lal_base_ellipsoid.cpp | 9 ++++-- lib/gpu/lal_base_three.cpp | 5 +--- lib/gpu/lal_device.cpp | 7 ++--- lib/gpu/lal_device.h | 53 ++++++++++++++++++++-------------- 8 files changed, 45 insertions(+), 48 deletions(-) diff --git a/lib/gpu/lal_base_atomic.cpp b/lib/gpu/lal_base_atomic.cpp index 3d47df8a92..da54f1dca3 100644 --- a/lib/gpu/lal_base_atomic.cpp +++ b/lib/gpu/lal_base_atomic.cpp @@ -64,15 +64,12 @@ int BaseAtomicT::init_atomic(const int nlocal, const int nall, } else _nbor_data=&(nbor->dev_nbor); - int success=device->init(*ans,false,false,nlocal,host_nlocal,nall,nbor, - maxspecial,_gpu_host,max_nbors,cell_size,false, - _threads_per_atom); + int success=device->init(*ans,false,false,nlocal,nall,maxspecial); if (success!=0) return success; success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, max_nbors,cell_size,false,_threads_per_atom); - if (success!=0) return success; diff --git a/lib/gpu/lal_base_charge.cpp b/lib/gpu/lal_base_charge.cpp index 94e7502c55..a3ec710baa 100644 --- a/lib/gpu/lal_base_charge.cpp +++ b/lib/gpu/lal_base_charge.cpp @@ -65,15 +65,12 @@ int BaseChargeT::init_atomic(const int nlocal, const int nall, } else _nbor_data=&(nbor->dev_nbor); - int success=device->init(*ans,true,false,nlocal,host_nlocal,nall,nbor, - maxspecial,_gpu_host,max_nbors,cell_size,false, - _threads_per_atom); + int success=device->init(*ans,true,false,nlocal,nall,maxspecial); if (success!=0) return success; success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, max_nbors,cell_size,false,_threads_per_atom); - if (success!=0) return success; diff --git a/lib/gpu/lal_base_dipole.cpp b/lib/gpu/lal_base_dipole.cpp index b2a41f10cf..9fc7e1b235 100644 --- a/lib/gpu/lal_base_dipole.cpp +++ b/lib/gpu/lal_base_dipole.cpp @@ -66,15 +66,12 @@ int BaseDipoleT::init_atomic(const int nlocal, const int nall, } else _nbor_data=&(nbor->dev_nbor); - int success=device->init(*ans,true,true,nlocal,host_nlocal,nall,nbor, - maxspecial,_gpu_host,max_nbors,cell_size,false, - _threads_per_atom); + int success=device->init(*ans,true,true,nlocal,nall,maxspecial); if (success!=0) return success; success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, max_nbors,cell_size,false,_threads_per_atom); - if (success!=0) return success; diff --git a/lib/gpu/lal_base_dpd.cpp b/lib/gpu/lal_base_dpd.cpp index 3f71c820c7..eb5c2088a6 100644 --- a/lib/gpu/lal_base_dpd.cpp +++ b/lib/gpu/lal_base_dpd.cpp @@ -65,9 +65,7 @@ int BaseDPDT::init_atomic(const int nlocal, const int nall, } else _nbor_data=&(nbor->dev_nbor); - int success=device->init(*ans,false,false,nlocal,host_nlocal,nall,nbor, - maxspecial,_gpu_host,max_nbors,cell_size,false, - _threads_per_atom,true); + int success=device->init(*ans,false,false,nlocal,nall,maxspecial,true); if (success!=0) return success; diff --git a/lib/gpu/lal_base_ellipsoid.cpp b/lib/gpu/lal_base_ellipsoid.cpp index 8918a3140c..eea5344e33 100644 --- a/lib/gpu/lal_base_ellipsoid.cpp +++ b/lib/gpu/lal_base_ellipsoid.cpp @@ -71,12 +71,15 @@ int BaseEllipsoidT::init_base(const int nlocal, const int nall, _threads_per_atom=device->threads_per_atom(); - int success=device->init(*ans,false,true,nlocal,host_nlocal,nall,nbor, - maxspecial,_gpu_host,max_nbors,cell_size,true, - 1); + int success=device->init(*ans,false,true,nlocal,nall,maxspecial); if (success!=0) return success; + success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, + max_nbors,cell_size,true,1); + if (success!=0) + return success; + ucl_device=device->gpu; atom=&device->atom; diff --git a/lib/gpu/lal_base_three.cpp b/lib/gpu/lal_base_three.cpp index ba28d697cc..0510b84d92 100644 --- a/lib/gpu/lal_base_three.cpp +++ b/lib/gpu/lal_base_three.cpp @@ -78,15 +78,12 @@ int BaseThreeT::init_three(const int nlocal, const int nall, if (_threads_per_atom*_threads_per_atom>device->warp_size()) return -10; - int success=device->init(*ans,false,false,nlocal,host_nlocal,nall,nbor, - maxspecial,_gpu_host,max_nbors,cell_size,false, - _threads_per_atom); + int success=device->init(*ans,false,false,nlocal,nall,maxspecial); if (success!=0) return success; success = device->init_nbor(nbor,nlocal,host_nlocal,nall,maxspecial,_gpu_host, max_nbors,cell_size,false,_threads_per_atom); - if (success!=0) return success; diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp index 411e19a78a..3b7f393056 100644 --- a/lib/gpu/lal_device.cpp +++ b/lib/gpu/lal_device.cpp @@ -246,11 +246,8 @@ int DeviceT::set_ocl_params(char *ocl_vendor) { template int DeviceT::init(Answer &ans, const bool charge, const bool rot, const int nlocal, - const int host_nlocal, const int nall, - Neighbor *nbor, const int maxspecial, - const int gpu_host, const int max_nbors, - const double cell_size, const bool pre_cut, - const int threads_per_atom, const bool vel) { + const int nall, const int maxspecial, + const bool vel) { if (!_device_init) return -1; if (sizeof(acctyp)==sizeof(double) && gpu->double_precision()==false) diff --git a/lib/gpu/lal_device.h b/lib/gpu/lal_device.h index 68d88a3182..4287967210 100644 --- a/lib/gpu/lal_device.h +++ b/lib/gpu/lal_device.h @@ -53,8 +53,38 @@ class Device { const int t_per_atom, const double cell_size, char *vendor_string, const int block_pair); - /// Initialize the device for Atom and Neighbor storage - /** \param rot True if quaternions need to be stored + /// Initialize the device for Atom storage + /** \param charge True if charges need to be stored + * \param rot True if quaternions need to be stored + * \param nlocal Total number of local particles to allocate memory for + * \param host_nlocal Initial number of host particles to allocate memory for + * \param nall Total number of local+ghost particles + * + * Returns: + * - 0 if successfull + * - -1 if fix gpu not found + * - -3 if there is an out of memory error + * - -4 if the GPU library was not compiled for GPU + * - -5 Double precision is not supported on card **/ + int init(Answer &a, const bool charge, const bool rot, + const int nlocal, const int nall, const int maxspecial, + const bool vel=false); + + /// Initialize the device for Atom storage only + /** \param nlocal Total number of local particles to allocate memory for + * \param nall Total number of local+ghost particles + * + * Returns: + * - 0 if successfull + * - -1 if fix gpu not found + * - -3 if there is an out of memory error + * - -4 if the GPU library was not compiled for GPU + * - -5 Double precision is not supported on card **/ + int init(Answer &ans, const int nlocal, const int nall); + + /// Initialize neighbor list storage and build + /** \param charge True if charges need to be stored + * \param rot True if quaternions need to be stored * \param nlocal Total number of local particles to allocate memory for * \param host_nlocal Initial number of host particles to allocate memory for * \param nall Total number of local+ghost particles @@ -73,25 +103,6 @@ class Device { * - -3 if there is an out of memory error * - -4 if the GPU library was not compiled for GPU * - -5 Double precision is not supported on card **/ - int init(Answer &a, const bool charge, const bool rot, - const int nlocal, const int host_nlocal, const int nall, - Neighbor *nbor, const int maxspecial, const int gpu_host, - const int max_nbors, const double cell_size, const bool pre_cut, - const int threads_per_atom, const bool vel=false); - - /// Initialize the device for Atom storage only - /** \param nlocal Total number of local particles to allocate memory for - * \param nall Total number of local+ghost particles - * - * Returns: - * - 0 if successfull - * - -1 if fix gpu not found - * - -3 if there is an out of memory error - * - -4 if the GPU library was not compiled for GPU - * - -5 Double precision is not supported on card **/ - int init(Answer &ans, const int nlocal, const int nall); - - /// Initialize neighbor list build -- callback function from pair int init_nbor(Neighbor *nbor, const int nlocal, const int host_nlocal, const int nall, const int maxspecial, const int gpu_host, From 4a4297591e9f48cc7f4910c69891bad0d2546718 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Wed, 17 Apr 2019 12:04:31 -0500 Subject: [PATCH 23/90] Did some more cleanups --- lib/gpu/lal_device.cpp | 2 +- lib/gpu/lal_device.h | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp index 3b7f393056..5534d32e5f 100644 --- a/lib/gpu/lal_device.cpp +++ b/lib/gpu/lal_device.cpp @@ -634,7 +634,7 @@ void DeviceT::output_kspace_times(UCL_Timer &time_in, if (screen && times[6]>0.0) { fprintf(screen,"\n\n-------------------------------------"); fprintf(screen,"--------------------------------\n"); - fprintf(screen," Device Time Info (average): "); + fprintf(screen," Device Time Info (average) for kspace: "); fprintf(screen,"\n-------------------------------------"); fprintf(screen,"--------------------------------\n"); diff --git a/lib/gpu/lal_device.h b/lib/gpu/lal_device.h index 4287967210..0c4d5f8c43 100644 --- a/lib/gpu/lal_device.h +++ b/lib/gpu/lal_device.h @@ -57,8 +57,9 @@ class Device { /** \param charge True if charges need to be stored * \param rot True if quaternions need to be stored * \param nlocal Total number of local particles to allocate memory for - * \param host_nlocal Initial number of host particles to allocate memory for * \param nall Total number of local+ghost particles + * \param maxspecial Maximum mumber of special bonded atoms per atom + * \param vel True if velocities need to be stored * * Returns: * - 0 if successfull @@ -66,7 +67,7 @@ class Device { * - -3 if there is an out of memory error * - -4 if the GPU library was not compiled for GPU * - -5 Double precision is not supported on card **/ - int init(Answer &a, const bool charge, const bool rot, + int init(Answer &ans, const bool charge, const bool rot, const int nlocal, const int nall, const int maxspecial, const bool vel=false); @@ -82,12 +83,13 @@ class Device { * - -5 Double precision is not supported on card **/ int init(Answer &ans, const int nlocal, const int nall); - /// Initialize neighbor list storage and build + /// Initialize the neighbor list storage /** \param charge True if charges need to be stored * \param rot True if quaternions need to be stored * \param nlocal Total number of local particles to allocate memory for * \param host_nlocal Initial number of host particles to allocate memory for * \param nall Total number of local+ghost particles + * \param maxspecial Maximum mumber of special bonded atoms per atom * \param gpu_host 0 if host will not perform force calculations, * 1 if gpu_nbor is true, and host needs a half nbor list, * 2 if gpu_nbor is true, and host needs a full nbor list @@ -104,10 +106,10 @@ class Device { * - -4 if the GPU library was not compiled for GPU * - -5 Double precision is not supported on card **/ int init_nbor(Neighbor *nbor, const int nlocal, - const int host_nlocal, const int nall, - const int maxspecial, const int gpu_host, - const int max_nbors, const double cell_size, - const bool pre_cut, const int threads_per_atom); + const int host_nlocal, const int nall, + const int maxspecial, const int gpu_host, + const int max_nbors, const double cell_size, + const bool pre_cut, const int threads_per_atom); /// Output a message for pair_style acceleration with device stats void init_message(FILE *screen, const char *name, @@ -191,7 +193,7 @@ class Device { /// Return host memory usage in bytes double host_memory_usage() const; - /// Return the number of procs sharing a device (size of device commincator) + /// Return the number of procs sharing a device (size of device communicator) inline int procs_per_gpu() const { return _procs_per_gpu; } /// Return the number of threads per proc inline int num_threads() const { return _nthreads; } @@ -278,12 +280,12 @@ class Device { /// Atom Data Atom atom; - // --------------------------- NBOR DATA ---------------------------- + // --------------------------- NBOR SHARED KERNELS ---------------- - /// Neighbor Data + /// Shared kernels for neighbor lists NeighborShared _neighbor_shared; - // ------------------------ LONG RANGE DATA ------------------------- + // ------------------------ LONG RANGE DATA ----------------------- // Long Range Data int _long_range_precompute; From a243be2dc9c25e7fc175d899b2f2d796e9cb7bd6 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Sun, 21 Apr 2019 22:10:03 -0600 Subject: [PATCH 24/90] Added bare-bones yarray algorithm, 2x speedup --- src/SNAP/pair_snap.cpp | 84 ++++++++++++++++------------ src/SNAP/sna.cpp | 124 +++++++++++++++++++++++++++++++++++++++++ src/SNAP/sna.h | 3 + 3 files changed, 174 insertions(+), 37 deletions(-) diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 8b547e6e73..73faaa71f7 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -158,9 +158,12 @@ PairSNAP::~PairSNAP() void PairSNAP::compute(int eflag, int vflag) { - if (use_optimized) - compute_optimized(eflag, vflag); - else +// if (use_optimized) +// compute_optimized(eflag, vflag); +// else + +// hard-code compute_regular() + compute_regular(eflag, vflag); } @@ -248,51 +251,58 @@ void PairSNAP::compute_regular(int eflag, int vflag) double* coeffi = coeffelem[ielem]; + // omit beta0 from beta vector + + double* beta = coeffi+1; + snaptr->compute_yi(beta); + for (int jj = 0; jj < ninside; jj++) { int j = snaptr->inside[jj]; snaptr->compute_duidrj(snaptr->rij[jj], snaptr->wj[jj],snaptr->rcutij[jj]); - snaptr->compute_dbidrj(); - snaptr->copy_dbi2dbvec(); +// snaptr->compute_dbidrj(); +// snaptr->copy_dbi2dbvec(); - fij[0] = 0.0; - fij[1] = 0.0; - fij[2] = 0.0; +// fij[0] = 0.0; +// fij[1] = 0.0; +// fij[2] = 0.0; - // linear contributions +// // linear contributions - for (int k = 1; k <= ncoeff; k++) { - double bgb = coeffi[k]; - fij[0] += bgb*snaptr->dbvec[k-1][0]; - fij[1] += bgb*snaptr->dbvec[k-1][1]; - fij[2] += bgb*snaptr->dbvec[k-1][2]; - } +// for (int k = 1; k <= ncoeff; k++) { +// double bgb = coeffi[k]; +// fij[0] += bgb*snaptr->dbvec[k-1][0]; +// fij[1] += bgb*snaptr->dbvec[k-1][1]; +// fij[2] += bgb*snaptr->dbvec[k-1][2]; +// } - // quadratic contributions +// // quadratic contributions - if (quadraticflag) { - int k = ncoeff+1; - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bveci = snaptr->bvec[icoeff]; - double fack = coeffi[k]*bveci; - double* dbveci = snaptr->dbvec[icoeff]; - fij[0] += fack*dbveci[0]; - fij[1] += fack*dbveci[1]; - fij[2] += fack*dbveci[2]; - k++; - for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - double facki = coeffi[k]*bveci; - double fackj = coeffi[k]*snaptr->bvec[jcoeff]; - double* dbvecj = snaptr->dbvec[jcoeff]; +// if (quadraticflag) { +// int k = ncoeff+1; +// for (int icoeff = 0; icoeff < ncoeff; icoeff++) { +// double bveci = snaptr->bvec[icoeff]; +// double fack = coeffi[k]*bveci; +// double* dbveci = snaptr->dbvec[icoeff]; +// fij[0] += fack*dbveci[0]; +// fij[1] += fack*dbveci[1]; +// fij[2] += fack*dbveci[2]; +// k++; +// for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { +// double facki = coeffi[k]*bveci; +// double fackj = coeffi[k]*snaptr->bvec[jcoeff]; +// double* dbvecj = snaptr->dbvec[jcoeff]; - fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; - fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; - fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; - k++; - } - } - } +// fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; +// fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; +// fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; +// k++; +// } +// } +// } + + snaptr->compute_deidrj(fij); f[i][0] += fij[0]; f[i][1] += fij[1]; diff --git a/src/SNAP/sna.cpp b/src/SNAP/sna.cpp index 7ed1bc1e23..d30d94dc9d 100644 --- a/src/SNAP/sna.cpp +++ b/src/SNAP/sna.cpp @@ -522,6 +522,124 @@ void SNA::compute_zi_omp(int sub_threads) } } +/* ---------------------------------------------------------------------- + compute Yi by summing over products of beta and Zi +------------------------------------------------------------------------- */ + +void SNA::compute_yi(double* beta) +{ + int j; + int idxz_count; + double **jjjzarray_r, **jjjzarray_i; + + for(int j = 0; j <= twojmax; j++) { + for(int mb = 0; 2*mb <= j; mb++) + for(int ma = 0; ma <= j; ma++) { + yarray_r[j][ma][mb] = 0.0; + yarray_i[j][ma][mb] = 0.0; + } // end loop over ma, mb + } // end loop over j + + for(int JJ = 0; JJ < idxj_max; JJ++) { + const int j1 = idxj[JJ].j1; + const int j2 = idxj[JJ].j2; + const int j3 = idxj[JJ].j; + + j = j3; + jjjzarray_r = zarray_r[j1][j2][j3]; + jjjzarray_i = zarray_i[j1][j2][j3]; + for(int mb = 0; 2*mb <= j; mb++) + for(int ma = 0; ma <= j; ma++) { + yarray_r[j][ma][mb] += beta[JJ]*jjjzarray_r[ma][mb]; + yarray_i[j][ma][mb] += beta[JJ]*jjjzarray_i[ma][mb]; + } // end loop over ma, mb + + j = j1; + jjjzarray_r = zarray_r[j3][j2][j1]; + jjjzarray_i = zarray_i[j3][j2][j1]; + double j1fac = (j3+1)/(j+1.0); + for(int mb = 0; 2*mb <= j; mb++) + for(int ma = 0; ma <= j; ma++) { + yarray_r[j][ma][mb] += beta[JJ]*jjjzarray_r[ma][mb]*j1fac; + yarray_i[j][ma][mb] += beta[JJ]*jjjzarray_i[ma][mb]*j1fac; + } // end loop over ma, mb + + j = j2; + jjjzarray_r = zarray_r[j3][j1][j2]; + jjjzarray_i = zarray_i[j3][j1][j2]; + double j2fac = (j3+1)/(j+1.0); + for(int mb = 0; 2*mb <= j; mb++) + for(int ma = 0; ma <= j; ma++) { + yarray_r[j][ma][mb] += beta[JJ]*jjjzarray_r[ma][mb]*j2fac; + yarray_i[j][ma][mb] += beta[JJ]*jjjzarray_i[ma][mb]*j2fac; + } // end loop over ma, mb + + } // end loop over jjb + +} + +/* ---------------------------------------------------------------------- + compute dEidRj +------------------------------------------------------------------------- */ + +void SNA::compute_deidrj(double* dedr) +{ + + for(int k = 0; k < 3; k++) + dedr[k] = 0.0; + + for(int j = 0; j <= twojmax; j++) { + + for(int mb = 0; 2*mb < j; mb++) + for(int ma = 0; ma <= j; ma++) { + + double* dudr_r = duarray_r[j][ma][mb]; + double* dudr_i = duarray_i[j][ma][mb]; + double jjjmambyarray_r = yarray_r[j][ma][mb]; + double jjjmambyarray_i = yarray_i[j][ma][mb]; + for(int k = 0; k < 3; k++) + dedr[k] += + dudr_r[k] * jjjmambyarray_r + + dudr_i[k] * jjjmambyarray_i; + + } //end loop over ma mb + + // For j even, handle middle column + + if (j%2 == 0) { + + int mb = j/2; + for(int ma = 0; ma < mb; ma++) { + double* dudr_r = duarray_r[j][ma][mb]; + double* dudr_i = duarray_i[j][ma][mb]; + double jjjmambyarray_r = yarray_r[j][ma][mb]; + double jjjmambyarray_i = yarray_i[j][ma][mb]; + for(int k = 0; k < 3; k++) + dedr[k] += + dudr_r[k] * jjjmambyarray_r + + dudr_i[k] * jjjmambyarray_i; + + } + + int ma = mb; + double* dudr_r = duarray_r[j][ma][mb]; + double* dudr_i = duarray_i[j][ma][mb]; + double jjjmambyarray_r = yarray_r[j][ma][mb]; + double jjjmambyarray_i = yarray_i[j][ma][mb]; + for(int k = 0; k < 3; k++) + dedr[k] += + (dudr_r[k] * jjjmambyarray_r + + dudr_i[k] * jjjmambyarray_i)*0.5; + + } // end if jeven + + } // End loop over j + + for(int k = 0; k < 3; k++) + dedr[k] *= 2.0; + +} + /* ---------------------------------------------------------------------- compute Bi by summing conj(Ui)*Zi ------------------------------------------------------------------------- */ @@ -1535,6 +1653,10 @@ void SNA::create_twojmax_arrays() "sna:uarraytot"); memory->create(zarray_i, jdim, jdim, jdim, jdim, jdim, "sna:zarray"); + memory->create(yarray_r, jdim, jdim, jdim, + "sna:yarray"); + memory->create(yarray_i, jdim, jdim, jdim, + "sna:yarray"); } } @@ -1563,6 +1685,8 @@ void SNA::destroy_twojmax_arrays() memory->destroy(zarray_r); memory->destroy(uarraytot_i); memory->destroy(zarray_i); + memory->destroy(yarray_r); + memory->destroy(yarray_i); } } diff --git a/src/SNAP/sna.h b/src/SNAP/sna.h index d05ad0fb84..2c90da1d30 100644 --- a/src/SNAP/sna.h +++ b/src/SNAP/sna.h @@ -47,6 +47,7 @@ public: void compute_ui_omp(int, int); void compute_zi(); void compute_zi_omp(int); + void compute_yi(double*); void compute_bi(); void copy_bi2bvec(); @@ -54,6 +55,7 @@ public: void compute_duidrj(double*, double, double); void compute_dbidrj(); + void compute_deidrj(double*); void compute_dbidrj_nonsymm(); void copy_dbi2dbvec(); double compute_sfac(double, double); @@ -80,6 +82,7 @@ public: int twojmax, diagonalstyle; double*** uarraytot_r, *** uarraytot_i; double***** zarray_r, ***** zarray_i; + double*** yarray_r, *** yarray_i; double*** uarraytot_r_b, *** uarraytot_i_b; double***** zarray_r_b, ***** zarray_i_b; double*** uarray_r, *** uarray_i; From cb6b4981277f4199e2d63402305329cef0425516 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 22 Apr 2019 14:43:01 -0600 Subject: [PATCH 25/90] Commit JT 042219 - change ntot -> nlocal --- src/KSPACE/pppm_dipole.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index ddc59f57ab..951f83e9a7 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -551,7 +551,7 @@ void PPPMDipole::compute(int eflag, int vflag) } if (vflag_atom) { - for (i = 0; i < ntotal; i++) + for (i = 0; i < nlocal; i++) for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*qscale; } } From 6d84bd6138fedd3738979e791244ccc4f38b6606 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Fri, 10 May 2019 10:34:01 -0600 Subject: [PATCH 26/90] Added compute_beta() --- src/SNAP/pair_snap.cpp | 43 +++++++++++++++++++++--------------------- src/SNAP/pair_snap.h | 3 +++ src/SNAP/sna.cpp | 8 ++++---- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 73faaa71f7..268e5663da 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -116,6 +116,7 @@ PairSNAP::~PairSNAP() memory->destroy(radelem); memory->destroy(wjelem); memory->destroy(coeffelem); + memory->destroy(beta); } // Need to set this because restart not handled by PairHybrid @@ -246,14 +247,15 @@ void PairSNAP::compute_regular(int eflag, int vflag) } // for neighbors of I within cutoff: - // compute dUi/drj and dBi/drj - // Fij = dEi/dRj = -dEi/dRi => add to Fi, subtract from Fj + // compute Fij = dEi/dRj = -dEi/dRi + // add to Fi, subtract from Fj - double* coeffi = coeffelem[ielem]; + // compute dE_i/dB_i = beta_i - // omit beta0 from beta vector + compute_betai(ielem); + + // compute beta_i*Z_i = Y_i - double* beta = coeffi+1; snaptr->compute_yi(beta); for (int jj = 0; jj < ninside; jj++) { @@ -261,22 +263,6 @@ void PairSNAP::compute_regular(int eflag, int vflag) snaptr->compute_duidrj(snaptr->rij[jj], snaptr->wj[jj],snaptr->rcutij[jj]); -// snaptr->compute_dbidrj(); -// snaptr->copy_dbi2dbvec(); - -// fij[0] = 0.0; -// fij[1] = 0.0; -// fij[2] = 0.0; - -// // linear contributions - -// for (int k = 1; k <= ncoeff; k++) { -// double bgb = coeffi[k]; -// fij[0] += bgb*snaptr->dbvec[k-1][0]; -// fij[1] += bgb*snaptr->dbvec[k-1][1]; -// fij[2] += bgb*snaptr->dbvec[k-1][2]; -// } - // // quadratic contributions // if (quadraticflag) { @@ -326,6 +312,7 @@ void PairSNAP::compute_regular(int eflag, int vflag) // evdwl = energy of atom I, sum over coeffs_k * Bi_k + double* coeffi = coeffelem[ielem]; evdwl = coeffi[0]; if (!quadraticflag) { snaptr->compute_bi(); @@ -1306,6 +1293,18 @@ void PairSNAP::build_per_atom_arrays() #endif } +/* ---------------------------------------------------------------------- + compute beta_i +------------------------------------------------------------------------- */ + +void PairSNAP::compute_betai(int ielem) +{ + double* coeffi = coeffelem[ielem]; + + for (int k = 1; k <= ncoeff; k++) + beta[k-1] = coeffi[k]; +} + /* ---------------------------------------------------------------------- allocate all arrays ------------------------------------------------------------------------- */ @@ -1434,6 +1433,7 @@ void PairSNAP::coeff(int narg, char **arg) memory->destroy(radelem); memory->destroy(wjelem); memory->destroy(coeffelem); + memory->destroy(beta); } char* type1 = arg[0]; @@ -1631,6 +1631,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) memory->create(radelem,nelements,"pair:radelem"); memory->create(wjelem,nelements,"pair:wjelem"); memory->create(coeffelem,nelements,ncoeffall,"pair:coeffelem"); + memory->create(beta,ncoeffall,"pair:beta"); // Loop over nelements blocks in the SNAP coefficient file diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h index 1fa065755c..33d1fb8bc9 100644 --- a/src/SNAP/pair_snap.h +++ b/src/SNAP/pair_snap.h @@ -55,6 +55,8 @@ protected: void set_sna_to_shared(int snaid,int i); void build_per_atom_arrays(); + void compute_betai(int); + int schedule_user; double schedule_time_guided; double schedule_time_dynamic; @@ -99,6 +101,7 @@ protected: double *radelem; // element radii double *wjelem; // elements weights double **coeffelem; // element bispectrum coefficients + double* beta; // beta for current atom int *map; // mapping from atom types to elements int twojmax, diagonalstyle, switchflag, bzeroflag; double rfac0, rmin0, wj1, wj2; diff --git a/src/SNAP/sna.cpp b/src/SNAP/sna.cpp index d30d94dc9d..b729e4d0d6 100644 --- a/src/SNAP/sna.cpp +++ b/src/SNAP/sna.cpp @@ -1653,10 +1653,10 @@ void SNA::create_twojmax_arrays() "sna:uarraytot"); memory->create(zarray_i, jdim, jdim, jdim, jdim, jdim, "sna:zarray"); - memory->create(yarray_r, jdim, jdim, jdim, - "sna:yarray"); - memory->create(yarray_i, jdim, jdim, jdim, - "sna:yarray"); + memory->create(yarray_r, jdim, jdim, jdim, + "sna:yarray"); + memory->create(yarray_i, jdim, jdim, jdim, + "sna:yarray"); } } From a1f421cd5400de9cb0c486cd7b32e936f09c9eb0 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Sat, 11 May 2019 12:41:54 -0600 Subject: [PATCH 27/90] Moved compute_beta outside of main force loop --- src/SNAP/pair_snap.cpp | 37 +++++++++++++++++++++++++------------ src/SNAP/pair_snap.h | 5 +++-- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 268e5663da..0bf367b5dc 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -86,7 +86,7 @@ PairSNAP::PairSNAP(LAMMPS *lmp) : Pair(lmp) i_uarraytot_r = NULL; i_uarraytot_i = NULL; i_zarray_r = NULL; - i_zarray_i =NULL; + i_zarray_i = NULL; use_shared_arrays = 0; @@ -101,6 +101,7 @@ PairSNAP::PairSNAP(LAMMPS *lmp) : Pair(lmp) sna = NULL; + beta_max = 0; } /* ---------------------------------------------------------------------- */ @@ -189,6 +190,15 @@ void PairSNAP::compute_regular(int eflag, int vflag) int newton_pair = force->newton_pair; class SNA* snaptr = sna[0]; + if (beta_max < list->inum) { + memory->grow(beta,list->inum,ncoeff,"PairSNAP:beta"); + beta_max = list->inum; + } + + // compute dE_i/dB_i = beta_i for all i in list + + compute_beta(); + numneigh = list->numneigh; firstneigh = list->firstneigh; @@ -250,13 +260,9 @@ void PairSNAP::compute_regular(int eflag, int vflag) // compute Fij = dEi/dRj = -dEi/dRi // add to Fi, subtract from Fj - // compute dE_i/dB_i = beta_i - - compute_betai(ielem); - // compute beta_i*Z_i = Y_i - snaptr->compute_yi(beta); + snaptr->compute_yi(beta[ii]); for (int jj = 0; jj < ninside; jj++) { int j = snaptr->inside[jj]; @@ -1294,15 +1300,23 @@ void PairSNAP::build_per_atom_arrays() } /* ---------------------------------------------------------------------- - compute beta_i + compute beta ------------------------------------------------------------------------- */ -void PairSNAP::compute_betai(int ielem) +void PairSNAP::compute_beta() { - double* coeffi = coeffelem[ielem]; + int i; + int *type = atom->type; - for (int k = 1; k <= ncoeff; k++) - beta[k-1] = coeffi[k]; + for (int ii = 0; ii < list->inum; ii++) { + i = list->ilist[ii]; + const int itype = type[i]; + const int ielem = map[itype]; + double* coeffi = coeffelem[ielem]; + + for (int k = 1; k <= ncoeff; k++) + beta[ii][k-1] = coeffi[k]; + } } /* ---------------------------------------------------------------------- @@ -1631,7 +1645,6 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) memory->create(radelem,nelements,"pair:radelem"); memory->create(wjelem,nelements,"pair:wjelem"); memory->create(coeffelem,nelements,ncoeffall,"pair:coeffelem"); - memory->create(beta,ncoeffall,"pair:beta"); // Loop over nelements blocks in the SNAP coefficient file diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h index 33d1fb8bc9..94d21162e2 100644 --- a/src/SNAP/pair_snap.h +++ b/src/SNAP/pair_snap.h @@ -55,7 +55,7 @@ protected: void set_sna_to_shared(int snaid,int i); void build_per_atom_arrays(); - void compute_betai(int); + void compute_beta(); int schedule_user; double schedule_time_guided; @@ -101,11 +101,12 @@ protected: double *radelem; // element radii double *wjelem; // elements weights double **coeffelem; // element bispectrum coefficients - double* beta; // beta for current atom + double** beta; // betas for all atoms in list int *map; // mapping from atom types to elements int twojmax, diagonalstyle, switchflag, bzeroflag; double rfac0, rmin0, wj1, wj2; int rcutfacflag, twojmaxflag; // flags for required parameters + int beta_max; // length of beta }; } From e13c661f774ea40f39b042f46d540c703fb88c5d Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Sat, 11 May 2019 12:54:18 -0600 Subject: [PATCH 28/90] Added placeholder for neural network SNAP potential --- src/SNAP/pair_nn_snap.cpp | 1824 +++++++++++++++++++++++++++++++++++++ src/SNAP/pair_nn_snap.h | 184 ++++ 2 files changed, 2008 insertions(+) create mode 100644 src/SNAP/pair_nn_snap.cpp create mode 100644 src/SNAP/pair_nn_snap.h diff --git a/src/SNAP/pair_nn_snap.cpp b/src/SNAP/pair_nn_snap.cpp new file mode 100644 index 0000000000..e90f6d6b1b --- /dev/null +++ b/src/SNAP/pair_nn_snap.cpp @@ -0,0 +1,1824 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "pair_nn_snap.h" +#include "atom.h" +#include "atom_vec.h" +#include "force.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "sna.h" +#include "openmp_snap.h" +#include "domain.h" +#include "memory.h" +#include "error.h" + +#include + +using namespace LAMMPS_NS; + +#define MAXLINE 1024 +#define MAXWORD 3 + +// Outstanding issues with quadratic term +// 1. there seems to a problem with compute_optimized energy calc +// it does not match compute_regular, even when quadratic coeffs = 0 + +/* ---------------------------------------------------------------------- */ + +PairNNSNAP::PairNNSNAP(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; + + nelements = 0; + elements = NULL; + radelem = NULL; + wjelem = NULL; + coeffelem = NULL; + + nmax = 0; + nthreads = 1; + + schedule_user = 0; + schedule_time_guided = -1; + schedule_time_dynamic = -1; + ncalls_neigh =-1; + + ilistmask_max = 0; + ilistmask = NULL; + ghostinum = 0; + ghostilist_max = 0; + ghostilist = NULL; + ghostnumneigh_max = 0; + ghostnumneigh = NULL; + ghostneighs = NULL; + ghostfirstneigh = NULL; + ghostneighs_total = 0; + ghostneighs_max = 0; + + i_max = 0; + i_neighmax = 0; + i_numpairs = 0; + i_rij = NULL; + i_inside = NULL; + i_wj = NULL; + i_rcutij = NULL; + i_ninside = NULL; + i_pairs = NULL; + i_uarraytot_r = NULL; + i_uarraytot_i = NULL; + i_zarray_r = NULL; + i_zarray_i = NULL; + + use_shared_arrays = 0; + +#ifdef TIMING_INFO + timers[0] = 0; + timers[1] = 0; + timers[2] = 0; + timers[3] = 0; +#endif + + // Need to set this because restart not handled by PairHybrid + + sna = NULL; + + beta_max = 0; +} + +/* ---------------------------------------------------------------------- */ + +PairNNSNAP::~PairNNSNAP() +{ + if (copymode) return; + + if (nelements) { + for (int i = 0; i < nelements; i++) + delete[] elements[i]; + delete[] elements; + memory->destroy(radelem); + memory->destroy(wjelem); + memory->destroy(coeffelem); + memory->destroy(beta); + } + + // Need to set this because restart not handled by PairHybrid + + if (sna) { + +#ifdef TIMING_INFO + double time[5]; + double timeave[5]; + double timeave_mpi[5]; + double timemax_mpi[5]; + + for (int i = 0; i < 5; i++) { + time[i] = 0; + timeave[i] = 0; + for (int tid = 0; tidtimers[i]>time[i]) + time[i] = sna[tid]->timers[i]; + timeave[i] += sna[tid]->timers[i]; + } + timeave[i] /= nthreads; + } + MPI_Reduce(timeave, timeave_mpi, 5, MPI_DOUBLE, MPI_SUM, 0, world); + MPI_Reduce(time, timemax_mpi, 5, MPI_DOUBLE, MPI_MAX, 0, world); +#endif + + for (int tid = 0; tiddestroy(setflag); + memory->destroy(cutsq); + memory->destroy(map); + } + +} + +void PairNNSNAP::compute(int eflag, int vflag) +{ +// if (use_optimized) +// compute_optimized(eflag, vflag); +// else + +// hard-code compute_regular() + + compute_regular(eflag, vflag); +} + +/* ---------------------------------------------------------------------- + This version is a straightforward implementation + ---------------------------------------------------------------------- */ + +void PairNNSNAP::compute_regular(int eflag, int vflag) +{ + int i,j,jnum,ninside; + double delx,dely,delz,evdwl,rsq; + double fij[3]; + int *jlist,*numneigh,**firstneigh; + evdwl = 0.0; + + ev_init(eflag,vflag); + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + class SNA* snaptr = sna[0]; + + if (beta_max < list->inum) { + memory->grow(beta,list->inum,ncoeff,"PairNNSNAP:beta"); + beta_max = list->inum; + } + + // compute dE_i/dB_i = beta_i for all i in list + + compute_beta(); + + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + for (int ii = 0; ii < list->inum; ii++) { + i = list->ilist[ii]; + + const double xtmp = x[i][0]; + const double ytmp = x[i][1]; + const double ztmp = x[i][2]; + const int itype = type[i]; + const int ielem = map[itype]; + const double radi = radelem[ielem]; + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + // insure rij, inside, wj, and rcutij are of size jnum + + snaptr->grow_rij(jnum); + + // rij[][3] = displacements between atom I and those neighbors + // inside = indices of neighbors of I within cutoff + // wj = weights for neighbors of I within cutoff + // rcutij = cutoffs for neighbors of I within cutoff + // note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi + + ninside = 0; + for (int jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + delx = x[j][0] - xtmp; + dely = x[j][1] - ytmp; + delz = x[j][2] - ztmp; + rsq = delx*delx + dely*dely + delz*delz; + int jtype = type[j]; + int jelem = map[jtype]; + + if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { + snaptr->rij[ninside][0] = delx; + snaptr->rij[ninside][1] = dely; + snaptr->rij[ninside][2] = delz; + snaptr->inside[ninside] = j; + snaptr->wj[ninside] = wjelem[jelem]; + snaptr->rcutij[ninside] = (radi + radelem[jelem])*rcutfac; + ninside++; + } + } + + // compute Ui, Zi, and Bi for atom I + + snaptr->compute_ui(ninside); + snaptr->compute_zi(); + if (quadraticflag) { + snaptr->compute_bi(); + snaptr->copy_bi2bvec(); + } + + // for neighbors of I within cutoff: + // compute Fij = dEi/dRj = -dEi/dRi + // add to Fi, subtract from Fj + + // compute beta_i*Z_i = Y_i + + snaptr->compute_yi(beta[ii]); + + for (int jj = 0; jj < ninside; jj++) { + int j = snaptr->inside[jj]; + snaptr->compute_duidrj(snaptr->rij[jj], + snaptr->wj[jj],snaptr->rcutij[jj]); + +// // quadratic contributions + +// if (quadraticflag) { +// int k = ncoeff+1; +// for (int icoeff = 0; icoeff < ncoeff; icoeff++) { +// double bveci = snaptr->bvec[icoeff]; +// double fack = coeffi[k]*bveci; +// double* dbveci = snaptr->dbvec[icoeff]; +// fij[0] += fack*dbveci[0]; +// fij[1] += fack*dbveci[1]; +// fij[2] += fack*dbveci[2]; +// k++; +// for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { +// double facki = coeffi[k]*bveci; +// double fackj = coeffi[k]*snaptr->bvec[jcoeff]; +// double* dbvecj = snaptr->dbvec[jcoeff]; + +// fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; +// fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; +// fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; +// k++; +// } +// } +// } + + snaptr->compute_deidrj(fij); + + f[i][0] += fij[0]; + f[i][1] += fij[1]; + f[i][2] += fij[2]; + f[j][0] -= fij[0]; + f[j][1] -= fij[1]; + f[j][2] -= fij[2]; + + // tally per-atom virial contribution + + if (vflag) + ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0, + fij[0],fij[1],fij[2], + -snaptr->rij[jj][0],-snaptr->rij[jj][1], + -snaptr->rij[jj][2]); + } + + // tally energy contribution + + if (eflag) { + + // evdwl = energy of atom I, sum over coeffs_k * Bi_k + + double* coeffi = coeffelem[ielem]; + evdwl = coeffi[0]; + if (!quadraticflag) { + snaptr->compute_bi(); + snaptr->copy_bi2bvec(); + } + + // E = beta.B + 0.5*B^t.alpha.B + // coeff[k] = beta[k-1] or + // coeff[k] = alpha_ii or + // coeff[k] = alpha_ij = alpha_ji, j != i + + // linear contributions + + for (int k = 1; k <= ncoeff; k++) + evdwl += coeffi[k]*snaptr->bvec[k-1]; + + // quadratic contributions + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = snaptr->bvec[icoeff]; + evdwl += 0.5*coeffi[k++]*bveci*bveci; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + evdwl += coeffi[k++]*bveci*snaptr->bvec[jcoeff]; + } + } + } + ev_tally_full(i,2.0*evdwl,0.0,0.0,0.0,0.0,0.0); + } + + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + + +/* ---------------------------------------------------------------------- + This version is optimized for threading, micro-load balancing + ---------------------------------------------------------------------- */ + +void PairNNSNAP::compute_optimized(int eflag, int vflag) +{ + // if reneighboring took place do load_balance if requested + if (do_load_balance > 0 && + (neighbor->ncalls != ncalls_neigh)) { + ghostinum = 0; + // reset local ghost neighbor lists + ncalls_neigh = neighbor->ncalls; + if (ilistmask_max < list->inum) { + memory->grow(ilistmask,list->inum,"PairSnap::ilistmask"); + ilistmask_max = list->inum; + } + for (int i = 0; i < list->inum; i++) + ilistmask[i] = 1; + + //multiple passes for loadbalancing + for (int i = 0; i < do_load_balance; i++) + load_balance(); + } + + int numpairs = 0; + for (int ii = 0; ii < list->inum; ii++) { + if ((do_load_balance <= 0) || ilistmask[ii]) { + int i = list->ilist[ii]; + int jnum = list->numneigh[i]; + numpairs += jnum; + } + } + + if (do_load_balance) + for (int ii = 0; ii < ghostinum; ii++) { + int i = ghostilist[ii]; + int jnum = ghostnumneigh[i]; + numpairs += jnum; + } + + // optimized schedule setting + + int time_dynamic = 0; + int time_guided = 0; + + if (schedule_user == 0) schedule_user = 4; + + switch (schedule_user) { + case 1: + omp_set_schedule(omp_sched_static,1); + break; + case 2: + omp_set_schedule(omp_sched_dynamic,1); + break; + case 3: + omp_set_schedule(omp_sched_guided,2); + break; + case 4: + omp_set_schedule(omp_sched_auto,0); + break; + case 5: + if (numpairs < 8*nthreads) omp_set_schedule(omp_sched_dynamic,1); + else if (schedule_time_guided < 0.0) { + omp_set_schedule(omp_sched_guided,2); + if (!eflag && !vflag) time_guided = 1; + } else if (schedule_time_dynamic<0.0) { + omp_set_schedule(omp_sched_dynamic,1); + if (!eflag && !vflag) time_dynamic = 1; + } else if (schedule_time_guidedcreate(pairs_tid_unique,numpairs,4,"numpairs"); + pairs = pairs_tid_unique; + } + + if (!use_shared_arrays) { + numpairs = 0; + for (int ii = 0; ii < list->inum; ii++) { + if ((do_load_balance <= 0) || ilistmask[ii]) { + int i = list->ilist[ii]; + int jnum = list->numneigh[i]; + for (int jj = 0; jjx; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + numneigh = list->numneigh; + firstneigh = list->firstneigh; + +#ifdef TIMING_INFO + // only update micro timers after setup + static int count=0; + if (count<2) { + sna[tid]->timers[0] = 0; + sna[tid]->timers[1] = 0; + sna[tid]->timers[2] = 0; + sna[tid]->timers[3] = 0; + sna[tid]->timers[4] = 0; + } + count++; +#endif + + // did thread start working on interactions of new atom + int iold = -1; + + double starttime, endtime; + if (time_dynamic || time_guided) + starttime = MPI_Wtime(); + +#if defined(_OPENMP) +#pragma omp for schedule(runtime) +#endif + for (int iijj = 0; iijj < numpairs; iijj++) { + int i = 0; + if (use_shared_arrays) { + i = i_pairs[iijj][0]; + if (iold != i) { + set_sna_to_shared(tid,i_pairs[iijj][3]); + ielem = map[type[i]]; + } + iold = i; + } else { + i = pairs[iijj][0]; + if (iold != i) { + iold = i; + const double xtmp = x[i][0]; + const double ytmp = x[i][1]; + const double ztmp = x[i][2]; + const int itype = type[i]; + ielem = map[itype]; + const double radi = radelem[ielem]; + + if (i < nlocal) { + jlist = firstneigh[i]; + jnum = numneigh[i]; + } else { + jlist = ghostneighs+ghostfirstneigh[i]; + jnum = ghostnumneigh[i]; + } + + // insure rij, inside, wj, and rcutij are of size jnum + + sna[tid]->grow_rij(jnum); + + // rij[][3] = displacements between atom I and those neighbors + // inside = indices of neighbors of I within cutoff + // wj = weights of neighbors of I within cutoff + // rcutij = cutoffs of neighbors of I within cutoff + // note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi + + ninside = 0; + for (jj = 0; jj < jnum; jj++) { + int j = jlist[jj]; + j &= NEIGHMASK; + delx = x[j][0] - xtmp; //unitialised + dely = x[j][1] - ytmp; + delz = x[j][2] - ztmp; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + int jelem = map[jtype]; + + if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { //unitialised + sna[tid]->rij[ninside][0] = delx; + sna[tid]->rij[ninside][1] = dely; + sna[tid]->rij[ninside][2] = delz; + sna[tid]->inside[ninside] = j; + sna[tid]->wj[ninside] = wjelem[jelem]; + sna[tid]->rcutij[ninside] = (radi + radelem[jelem])*rcutfac; + ninside++; + + // update index list with inside index + pairs[iijj + (jj - pairs[iijj][1])][2] = + ninside-1; //unitialised + } + } + + // compute Ui and Zi for atom I + + sna[tid]->compute_ui(ninside); //unitialised + sna[tid]->compute_zi(); + } + } + if (quadraticflag) { + sna[tid]->compute_bi(); + sna[tid]->copy_bi2bvec(); + } + + // for neighbors of I within cutoff: + // compute dUi/drj and dBi/drj + // Fij = dEi/dRj = -dEi/dRi => add to Fi, subtract from Fj + + // entry into loop if inside index is set + + double* coeffi = coeffelem[ielem]; + + if (pairs[iijj][2] >= 0) { + jj = pairs[iijj][2]; + int j = sna[tid]->inside[jj]; + sna[tid]->compute_duidrj(sna[tid]->rij[jj], + sna[tid]->wj[jj],sna[tid]->rcutij[jj]); + + sna[tid]->compute_dbidrj(); + sna[tid]->copy_dbi2dbvec(); + + fij[0] = 0.0; + fij[1] = 0.0; + fij[2] = 0.0; + + // linear contributions + + for (k = 1; k <= ncoeff; k++) { + double bgb = coeffi[k]; + fij[0] += bgb*sna[tid]->dbvec[k-1][0]; + fij[1] += bgb*sna[tid]->dbvec[k-1][1]; + fij[2] += bgb*sna[tid]->dbvec[k-1][2]; + } + + // quadratic contributions + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = sna[tid]->bvec[icoeff]; + double fack = coeffi[k]*bveci; + double* dbveci = sna[tid]->dbvec[icoeff]; + fij[0] += fack*sna[tid]->dbvec[icoeff][0]; + fij[1] += fack*sna[tid]->dbvec[icoeff][1]; + fij[2] += fack*sna[tid]->dbvec[icoeff][2]; + k++; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + double facki = coeffi[k]*bveci; + double fackj = coeffi[k]*sna[tid]->bvec[jcoeff]; + double* dbvecj = sna[tid]->dbvec[jcoeff]; + fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; + fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; + fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; + k++; + } + } + } + +#if defined(_OPENMP) +#pragma omp critical +#endif + { + f[i][0] += fij[0]; + f[i][1] += fij[1]; + f[i][2] += fij[2]; + f[j][0] -= fij[0]; + f[j][1] -= fij[1]; + f[j][2] -= fij[2]; + + // tally per-atom virial contribution + + if (vflag) + ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0, + fij[0],fij[1],fij[2], + -sna[tid]->rij[jj][0],-sna[tid]->rij[jj][1], + -sna[tid]->rij[jj][2]); + } + } + + // evdwl = energy of atom I, sum over coeffs_k * Bi_k + // only call this for first pair of each atom i + // if atom has no pairs, eatom=0, which is wrong + + if (eflag&&pairs[iijj][1] == 0) { + evdwl = coeffi[0]; + + if (!quadraticflag) { + sna[tid]->compute_bi(); + sna[tid]->copy_bi2bvec(); + } + + // E = beta.B + 0.5*B^t.alpha.B + // coeff[k] = beta[k-1] or + // coeff[k] = alpha_ii or + // coeff[k] = alpha_ij = alpha_ji, j != i + + // linear contributions + + for (int k = 1; k <= ncoeff; k++) + evdwl += coeffi[k]*sna[tid]->bvec[k-1]; + + // quadratic contributions + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = sna[tid]->bvec[icoeff]; + evdwl += 0.5*coeffi[k++]*bveci*bveci; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + evdwl += coeffi[k++]*bveci*sna[tid]->bvec[jcoeff]; + } + } + } + +#if defined(_OPENMP) +#pragma omp critical +#endif + ev_tally_full(i,2.0*evdwl,0.0,0.0,0.0,0.0,0.0); + } + + } + if (time_dynamic || time_guided) + endtime = MPI_Wtime(); + if (time_dynamic) schedule_time_dynamic = endtime - starttime; + if (time_guided) schedule_time_guided = endtime - starttime; + if (!use_shared_arrays) memory->destroy(pairs); + + }// end of pragma omp parallel + + if (vflag_fdotr) virial_fdotr_compute(); + +} + +inline int PairNNSNAP::equal(double* x,double* y) +{ + double dist2 = + (x[0]-y[0])*(x[0]-y[0]) + + (x[1]-y[1])*(x[1]-y[1]) + + (x[2]-y[2])*(x[2]-y[2]); + if (dist2 < 1e-20) return 1; + return 0; +} + +inline double PairNNSNAP::dist2(double* x,double* y) +{ + return + (x[0]-y[0])*(x[0]-y[0]) + + (x[1]-y[1])*(x[1]-y[1]) + + (x[2]-y[2])*(x[2]-y[2]); +} + +// return extra communication cutoff +// extra_cutoff = max(subdomain_length) + +double PairNNSNAP::extra_cutoff() +{ + double sublo[3],subhi[3]; + + if (domain->triclinic == 0) { + for (int dim = 0 ; dim < 3 ; dim++) { + sublo[dim] = domain->sublo[dim]; + subhi[dim] = domain->subhi[dim]; + } + } else { + domain->lamda2x(domain->sublo_lamda,sublo); + domain->lamda2x(domain->subhi_lamda,subhi); + } + + double sub_size[3]; + for (int dim = 0; dim < 3; dim++) + sub_size[dim] = subhi[dim] - sublo[dim]; + + double max_sub_size = 0; + for (int dim = 0; dim < 3; dim++) + max_sub_size = MAX(max_sub_size,sub_size[dim]); + + // note: for triclinic, probably need something different + // see Comm::setup() + + return max_sub_size; +} + +// micro load_balancer: each MPI process will +// check with each of its 26 neighbors, +// whether an imbalance exists in the number +// of atoms to calculate forces for. +// If it does it will set ilistmask of one of +// its local atoms to zero, and send its Tag +// to the neighbor process. The neighboring process +// will check its ghost list for the +// ghost atom with the same Tag which is closest +// to its domain center, and build a +// neighborlist for this ghost atom. For this to work, +// the communication cutoff has to be +// as large as the neighbor cutoff + +// maximum subdomain length. + +// Note that at most one atom is exchanged per processor pair. + +// Also note that the local atom assignment +// doesn't change. This load balancer will cause +// some ghost atoms to have full neighborlists +// which are unique to PairNNSNAP. +// They are not part of the generally accessible neighborlist. +// At the same time corresponding local atoms on +// other MPI processes will not be +// included in the force computation since +// their ilistmask is 0. This does not effect +// any other classes which might +// access the same general neighborlist. +// Reverse communication (newton on) of forces is required. + +// Currently the load balancer does two passes, +// since its exchanging atoms upstream and downstream. + +void PairNNSNAP::load_balance() +{ + double sublo[3],subhi[3]; + if (domain->triclinic == 0) { + double* sublotmp = domain->sublo; + double* subhitmp = domain->subhi; + for (int dim = 0 ; dim<3 ; dim++) { + sublo[dim]=sublotmp[dim]; + subhi[dim]=subhitmp[dim]; + } + } else { + double* sublotmp = domain->sublo_lamda; + double* subhitmp = domain->subhi_lamda; + domain->lamda2x(sublotmp,sublo); + domain->lamda2x(subhitmp,subhi); + } + + //if (list->inum==0) list->grow(atom->nmax); + + int nlocal = ghostinum; + for (int i=0; i < list->inum; i++) + if (ilistmask[i]) nlocal++; + int ***grid2proc = comm->grid2proc; + int* procgrid = comm->procgrid; + + int nlocal_up,nlocal_down; + MPI_Request request; + + double sub_mid[3]; + for (int dim=0; dim<3; dim++) + sub_mid[dim] = (subhi[dim] + sublo[dim])/2; + + if (comm->cutghostuser < + neighbor->cutneighmax+extra_cutoff()) + error->all(FLERR,"Communication cutoff too small for SNAP micro load balancing"); + + int nrecv = ghostinum; + int totalsend = 0; + int nsend = 0; + int depth = 1; + + for (int dx = -depth; dx < depth+1; dx++) + for (int dy = -depth; dy < depth+1; dy++) + for (int dz = -depth; dz < depth+1; dz++) { + + if (dx == dy && dy == dz && dz == 0) continue; + + int sendloc[3] = {comm->myloc[0], + comm->myloc[1], comm->myloc[2] + }; + sendloc[0] += dx; + sendloc[1] += dy; + sendloc[2] += dz; + for (int dim = 0; dim < 3; dim++) + if (sendloc[dim] >= procgrid[dim]) + sendloc[dim] = sendloc[dim] - procgrid[dim]; + for (int dim = 0; dim < 3; dim++) + if (sendloc[dim] < 0) + sendloc[dim] = procgrid[dim] + sendloc[dim]; + int recvloc[3] = {comm->myloc[0], + comm->myloc[1], comm->myloc[2] + }; + recvloc[0] -= dx; + recvloc[1] -= dy; + recvloc[2] -= dz; + for (int dim = 0; dim < 3; dim++) + if (recvloc[dim] < 0) + recvloc[dim] = procgrid[dim] + recvloc[dim]; + for (int dim = 0; dim < 3; dim++) + if (recvloc[dim] >= procgrid[dim]) + recvloc[dim] = recvloc[dim] - procgrid[dim]; + + int sendproc = grid2proc[sendloc[0]][sendloc[1]][sendloc[2]]; + int recvproc = grid2proc[recvloc[0]][recvloc[1]][recvloc[2]]; + + // two stage process, first upstream movement, then downstream + + MPI_Sendrecv(&nlocal,1,MPI_INT,sendproc,0, + &nlocal_up,1,MPI_INT,recvproc,0,world,MPI_STATUS_IGNORE); + MPI_Sendrecv(&nlocal,1,MPI_INT,recvproc,0, + &nlocal_down,1,MPI_INT,sendproc,0,world,MPI_STATUS_IGNORE); + nsend = 0; + + // send upstream + + if (nlocal > nlocal_up+1) { + + int i = totalsend++; + while(i < list->inum && ilistmask[i] == 0) + i = totalsend++; + + if (i < list->inum) + MPI_Isend(&atom->tag[i],1,MPI_INT,recvproc,0,world,&request); + else { + int j = -1; + MPI_Isend(&j,1,MPI_INT,recvproc,0,world,&request); + } + + if (i < list->inum) { + for (int j = 0; j < list->inum; j++) + if (list->ilist[j] == i) + ilistmask[j] = 0; + nsend = 1; + } + } + + // recv downstream + + if (nlocal < nlocal_down-1) { + nlocal++; + int get_tag = -1; + MPI_Recv(&get_tag,1,MPI_INT,sendproc,0,world,MPI_STATUS_IGNORE); + + // if get_tag -1 the other process didnt have local atoms to send + + if (get_tag >= 0) { + if (ghostinum >= ghostilist_max) { + memory->grow(ghostilist,ghostinum+10, + "PairSnap::ghostilist"); + ghostilist_max = ghostinum+10; + } + if (atom->nlocal + atom->nghost >= ghostnumneigh_max) { + ghostnumneigh_max = atom->nlocal+atom->nghost+100; + memory->grow(ghostnumneigh,ghostnumneigh_max, + "PairSnap::ghostnumneigh"); + memory->grow(ghostfirstneigh,ghostnumneigh_max, + "PairSnap::ghostfirstneigh"); + } + + // find closest ghost image of the transfered particle + + double mindist = 1e200; + int closestghost = -1; + for (int j = 0; j < atom->nlocal + atom->nghost; j++) + if (atom->tag[j] == get_tag) + if (dist2(sub_mid, atom->x[j]) < mindist) { + closestghost = j; + mindist = dist2(sub_mid, atom->x[j]); + } + + // build neighborlist for this particular + // ghost atom, and add it to list->ilist + + if (ghostneighs_max - ghostneighs_total < + neighbor->oneatom) { + memory->grow(ghostneighs, + ghostneighs_total + neighbor->oneatom, + "PairSnap::ghostneighs"); + ghostneighs_max = ghostneighs_total + neighbor->oneatom; + } + + int j = closestghost; + + ghostilist[ghostinum] = j; + ghostnumneigh[j] = 0; + ghostfirstneigh[j] = ghostneighs_total; + + ghostinum++; + int* jlist = ghostneighs + ghostfirstneigh[j]; + + // find all neighbors by looping + // over all local and ghost atoms + + for (int k = 0; k < atom->nlocal + atom->nghost; k++) + if (dist2(atom->x[j],atom->x[k]) < + neighbor->cutneighmax*neighbor->cutneighmax) { + jlist[ghostnumneigh[j]] = k; + ghostnumneigh[j]++; + ghostneighs_total++; + } + } + + if (get_tag >= 0) nrecv++; + } + + // decrease nlocal later, so that it is the + // initial number both for receiving and sending + + if (nsend) nlocal--; + + // second pass through the grid + + MPI_Sendrecv(&nlocal,1,MPI_INT,sendproc,0, + &nlocal_up,1,MPI_INT,recvproc,0,world,MPI_STATUS_IGNORE); + MPI_Sendrecv(&nlocal,1,MPI_INT,recvproc,0, + &nlocal_down,1,MPI_INT,sendproc,0,world,MPI_STATUS_IGNORE); + + // send downstream + + nsend=0; + if (nlocal > nlocal_down+1) { + int i = totalsend++; + while(i < list->inum && ilistmask[i]==0) i = totalsend++; + + if (i < list->inum) + MPI_Isend(&atom->tag[i],1,MPI_INT,sendproc,0,world,&request); + else { + int j =- 1; + MPI_Isend(&j,1,MPI_INT,sendproc,0,world,&request); + } + + if (i < list->inum) { + for (int j=0; jinum; j++) + if (list->ilist[j] == i) ilistmask[j] = 0; + nsend = 1; + } + } + + // receive upstream + + if (nlocal < nlocal_up-1) { + nlocal++; + int get_tag = -1; + + MPI_Recv(&get_tag,1,MPI_INT,recvproc,0,world,MPI_STATUS_IGNORE); + + if (get_tag >= 0) { + if (ghostinum >= ghostilist_max) { + memory->grow(ghostilist,ghostinum+10, + "PairSnap::ghostilist"); + ghostilist_max = ghostinum+10; + } + if (atom->nlocal + atom->nghost >= ghostnumneigh_max) { + ghostnumneigh_max = atom->nlocal + atom->nghost + 100; + memory->grow(ghostnumneigh,ghostnumneigh_max, + "PairSnap::ghostnumneigh"); + memory->grow(ghostfirstneigh,ghostnumneigh_max, + "PairSnap::ghostfirstneigh"); + } + + // find closest ghost image of the transfered particle + + double mindist = 1e200; + int closestghost = -1; + for (int j = 0; j < atom->nlocal + atom->nghost; j++) + if (atom->tag[j] == get_tag) + if (dist2(sub_mid,atom->x[j])x[j]); + } + + // build neighborlist for this particular ghost atom + + if (ghostneighs_max-ghostneighs_total < neighbor->oneatom) { + memory->grow(ghostneighs,ghostneighs_total + neighbor->oneatom, + "PairSnap::ghostneighs"); + ghostneighs_max = ghostneighs_total + neighbor->oneatom; + } + + int j = closestghost; + + ghostilist[ghostinum] = j; + ghostnumneigh[j] = 0; + ghostfirstneigh[j] = ghostneighs_total; + + ghostinum++; + int* jlist = ghostneighs + ghostfirstneigh[j]; + + for (int k = 0; k < atom->nlocal + atom->nghost; k++) + if (dist2(atom->x[j],atom->x[k]) < + neighbor->cutneighmax*neighbor->cutneighmax) { + jlist[ghostnumneigh[j]] = k; + ghostnumneigh[j]++; + ghostneighs_total++; + } + } + + if (get_tag >= 0) nrecv++; + } + if (nsend) nlocal--; + } +} + +void PairNNSNAP::set_sna_to_shared(int snaid,int i) +{ + sna[snaid]->rij = i_rij[i]; + sna[snaid]->inside = i_inside[i]; + sna[snaid]->wj = i_wj[i]; + sna[snaid]->rcutij = i_rcutij[i]; + sna[snaid]->zarray_r = i_zarray_r[i]; + sna[snaid]->zarray_i = i_zarray_i[i]; + sna[snaid]->uarraytot_r = i_uarraytot_r[i]; + sna[snaid]->uarraytot_i = i_uarraytot_i[i]; +} + +void PairNNSNAP::build_per_atom_arrays() +{ + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME,&starttime); +#endif + + int count = 0; + int neighmax = 0; + for (int ii = 0; ii < list->inum; ii++) + if ((do_load_balance <= 0) || ilistmask[ii]) { + neighmax=MAX(neighmax,list->numneigh[list->ilist[ii]]); + ++count; + } + for (int ii = 0; ii < ghostinum; ii++) { + neighmax=MAX(neighmax,ghostnumneigh[ghostilist[ii]]); + ++count; + } + + if (i_max < count || i_neighmax < neighmax) { + int i_maxt = MAX(count,i_max); + i_neighmax = MAX(neighmax,i_neighmax); + memory->destroy(i_rij); + memory->destroy(i_inside); + memory->destroy(i_wj); + memory->destroy(i_rcutij); + memory->destroy(i_ninside); + memory->destroy(i_pairs); + memory->create(i_rij,i_maxt,i_neighmax,3,"PairNNSNAP::i_rij"); + memory->create(i_inside,i_maxt,i_neighmax,"PairNNSNAP::i_inside"); + memory->create(i_wj,i_maxt,i_neighmax,"PairNNSNAP::i_wj"); + memory->create(i_rcutij,i_maxt,i_neighmax,"PairNNSNAP::i_rcutij"); + memory->create(i_ninside,i_maxt,"PairNNSNAP::i_ninside"); + memory->create(i_pairs,i_maxt*i_neighmax,4,"PairNNSNAP::i_pairs"); + } + + if (i_max < count) { + int jdim = sna[0]->twojmax+1; + memory->destroy(i_uarraytot_r); + memory->destroy(i_uarraytot_i); + memory->create(i_uarraytot_r,count,jdim,jdim,jdim, + "PairNNSNAP::i_uarraytot_r"); + memory->create(i_uarraytot_i,count,jdim,jdim,jdim, + "PairNNSNAP::i_uarraytot_i"); + if (i_zarray_r != NULL) + for (int i = 0; i < i_max; i++) { + memory->destroy(i_zarray_r[i]); + memory->destroy(i_zarray_i[i]); + } + + delete [] i_zarray_r; + delete [] i_zarray_i; + i_zarray_r = new double*****[count]; + i_zarray_i = new double*****[count]; + for (int i = 0; i < count; i++) { + memory->create(i_zarray_r[i],jdim,jdim,jdim,jdim,jdim, + "PairNNSNAP::i_zarray_r"); + memory->create(i_zarray_i[i],jdim,jdim,jdim,jdim,jdim, + "PairNNSNAP::i_zarray_i"); + } + } + + if (i_max < count) + i_max = count; + + count = 0; + i_numpairs = 0; + for (int ii = 0; ii < list->inum; ii++) { + if ((do_load_balance <= 0) || ilistmask[ii]) { + int i = list->ilist[ii]; + int jnum = list->numneigh[i]; + int* jlist = list->firstneigh[i]; + const double xtmp = atom->x[i][0]; + const double ytmp = atom->x[i][1]; + const double ztmp = atom->x[i][2]; + const int itype = atom->type[i]; + const int ielem = map[itype]; + const double radi = radelem[ielem]; + int ninside = 0; + for (int jj = 0; jj < jnum; jj++) { + int j = jlist[jj]; + j &= NEIGHMASK; + const double delx = atom->x[j][0] - xtmp; + const double dely = atom->x[j][1] - ytmp; + const double delz = atom->x[j][2] - ztmp; + const double rsq = delx*delx + dely*dely + delz*delz; + int jtype = atom->type[j]; + int jelem = map[jtype]; + + i_pairs[i_numpairs][0] = i; + i_pairs[i_numpairs][1] = jj; + i_pairs[i_numpairs][2] = -1; + i_pairs[i_numpairs][3] = count; + if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { + i_rij[count][ninside][0] = delx; + i_rij[count][ninside][1] = dely; + i_rij[count][ninside][2] = delz; + i_inside[count][ninside] = j; + i_wj[count][ninside] = wjelem[jelem]; + i_rcutij[count][ninside] = (radi + radelem[jelem])*rcutfac; + + // update index list with inside index + i_pairs[i_numpairs][2] = ninside++; + } + i_numpairs++; + } + i_ninside[count] = ninside; + count++; + } + } + + for (int ii = 0; ii < ghostinum; ii++) { + int i = ghostilist[ii]; + int jnum = ghostnumneigh[i]; + int* jlist = ghostneighs+ghostfirstneigh[i]; + const double xtmp = atom->x[i][0]; + const double ytmp = atom->x[i][1]; + const double ztmp = atom->x[i][2]; + const int itype = atom->type[i]; + const int ielem = map[itype]; + const double radi = radelem[ielem]; + int ninside = 0; + + for (int jj = 0; jj < jnum; jj++) { + int j = jlist[jj]; + j &= NEIGHMASK; + const double delx = atom->x[j][0] - xtmp; + const double dely = atom->x[j][1] - ytmp; + const double delz = atom->x[j][2] - ztmp; + const double rsq = delx*delx + dely*dely + delz*delz; + int jtype = atom->type[j]; + int jelem = map[jtype]; + + i_pairs[i_numpairs][0] = i; + i_pairs[i_numpairs][1] = jj; + i_pairs[i_numpairs][2] = -1; + i_pairs[i_numpairs][3] = count; + if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { + i_rij[count][ninside][0] = delx; + i_rij[count][ninside][1] = dely; + i_rij[count][ninside][2] = delz; + i_inside[count][ninside] = j; + i_wj[count][ninside] = wjelem[jelem]; + i_rcutij[count][ninside] = (radi + radelem[jelem])*rcutfac; + // update index list with inside index + i_pairs[i_numpairs][2] = ninside++; + } + i_numpairs++; + } + i_ninside[count] = ninside; + count++; + } +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME,&endtime); + timers[0]+=(endtime.tv_sec-starttime.tv_sec+1.0* + (endtime.tv_nsec-starttime.tv_nsec)/1000000000); +#endif +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME,&starttime); +#endif + +#if defined(_OPENMP) +#pragma omp parallel for shared(count) default(none) +#endif + for (int ii=0; ii < count; ii++) { + int tid = omp_get_thread_num(); + set_sna_to_shared(tid,ii); + //sna[tid]->compute_ui(i_ninside[ii]); +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME,&starttime); +#endif + sna[tid]->compute_ui_omp(i_ninside[ii],MAX(int(nthreads/count),1)); +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME,&endtime); + sna[tid]->timers[0]+=(endtime.tv_sec-starttime.tv_sec+1.0* + (endtime.tv_nsec-starttime.tv_nsec)/1000000000); +#endif + } + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME,&starttime); +#endif + for (int ii=0; ii < count; ii++) { + int tid = 0;//omp_get_thread_num(); + set_sna_to_shared(tid,ii); + sna[tid]->compute_zi_omp(MAX(int(nthreads/count),1)); + } +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME,&endtime); + sna[0]->timers[1]+=(endtime.tv_sec-starttime.tv_sec+1.0* + (endtime.tv_nsec-starttime.tv_nsec)/1000000000); +#endif + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME,&endtime); + timers[1]+=(endtime.tv_sec-starttime.tv_sec+1.0* + (endtime.tv_nsec-starttime.tv_nsec)/1000000000); +#endif +} + +/* ---------------------------------------------------------------------- + compute beta +------------------------------------------------------------------------- */ + +void PairNNSNAP::compute_beta() +{ + int i; + int *type = atom->type; + + for (int ii = 0; ii < list->inum; ii++) { + i = list->ilist[ii]; + const int itype = type[i]; + const int ielem = map[itype]; + double* coeffi = coeffelem[ielem]; + + for (int k = 1; k <= ncoeff; k++) + beta[ii][k-1] = coeffi[k]; + } +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairNNSNAP::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(map,n+1,"pair:map"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairNNSNAP::settings(int narg, char **arg) +{ + + // set default values for optional arguments + + nthreads = -1; + use_shared_arrays=-1; + do_load_balance = 0; + use_optimized = 1; + + // optional arguments + + for (int i=0; i < narg; i++) { + if (i+2>narg) error->all(FLERR,"Illegal pair_style command"); + if (strcmp(arg[i],"nthreads")==0) { + nthreads=force->inumeric(FLERR,arg[++i]); +#if defined(LMP_USER_OMP) + error->all(FLERR,"Must set number of threads via package omp command"); +#else + omp_set_num_threads(nthreads); + comm->nthreads=nthreads; +#endif + continue; + } + if (strcmp(arg[i],"optimized")==0) { + use_optimized=force->inumeric(FLERR,arg[++i]); + continue; + } + if (strcmp(arg[i],"shared")==0) { + use_shared_arrays=force->inumeric(FLERR,arg[++i]); + continue; + } + if (strcmp(arg[i],"loadbalance")==0) { + do_load_balance = force->inumeric(FLERR,arg[++i]); + if (do_load_balance) { + double mincutoff = extra_cutoff() + + rcutmax + neighbor->skin; + if (comm->cutghostuser < mincutoff) { + char buffer[255]; + + //apparently mincutoff is 0 after sprintf command ????? + + double tmp = mincutoff + 0.1; + sprintf(buffer, "Communication cutoff is too small " + "for SNAP micro load balancing, increased to %lf", + mincutoff+0.1); + if (comm->me==0) + error->warning(FLERR,buffer); + + comm->cutghostuser = tmp; + + } + } + continue; + } + if (strcmp(arg[i],"schedule")==0) { + i++; + if (strcmp(arg[i],"static")==0) + schedule_user = 1; + if (strcmp(arg[i],"dynamic")==0) + schedule_user = 2; + if (strcmp(arg[i],"guided")==0) + schedule_user = 3; + if (strcmp(arg[i],"auto")==0) + schedule_user = 4; + if (strcmp(arg[i],"determine")==0) + schedule_user = 5; + if (schedule_user == 0) + error->all(FLERR,"Illegal pair_style command"); + continue; + } + error->all(FLERR,"Illegal pair_style command"); + } + + if (nthreads < 0) + nthreads = comm->nthreads; + + if (use_shared_arrays < 0) { + if (nthreads > 1 && atom->nlocal <= 2*nthreads) + use_shared_arrays = 1; + else use_shared_arrays = 0; + } + + // check if running non-optimized code with + // optimization flags set + + if (!use_optimized) + if (nthreads > 1 || + use_shared_arrays || + do_load_balance || + schedule_user) + error->all(FLERR,"Illegal pair_style command"); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairNNSNAP::coeff(int narg, char **arg) +{ + if (narg < 5) error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + if (nelements) { + for (int i = 0; i < nelements; i++) + delete[] elements[i]; + delete[] elements; + memory->destroy(radelem); + memory->destroy(wjelem); + memory->destroy(coeffelem); + memory->destroy(beta); + } + + char* type1 = arg[0]; + char* type2 = arg[1]; + char* coefffilename = arg[2]; + char* paramfilename = arg[3]; + char** elemtypes = &arg[4]; + + // insure I,J args are * * + + if (strcmp(type1,"*") != 0 || strcmp(type2,"*") != 0) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // read snapcoeff and snapparam files + + read_files(coefffilename,paramfilename); + + if (!quadraticflag) + ncoeff = ncoeffall - 1; + else { + + // ncoeffall should be (ncoeff+2)*(ncoeff+1)/2 + // so, ncoeff = floor(sqrt(2*ncoeffall))-1 + + ncoeff = sqrt(2*ncoeffall)-1; + ncoeffq = (ncoeff*(ncoeff+1))/2; + int ntmp = 1+ncoeff+ncoeffq; + if (ntmp != ncoeffall) { + printf("ncoeffall = %d ntmp = %d ncoeff = %d \n",ncoeffall,ntmp,ncoeff); + error->all(FLERR,"Incorrect SNAP coeff file"); + } + } + + // read args that map atom types to SNAP elements + // map[i] = which element the Ith atom type is, -1 if not mapped + // map[0] is not used + + for (int i = 1; i <= atom->ntypes; i++) { + char* elemname = elemtypes[i-1]; + int jelem; + for (jelem = 0; jelem < nelements; jelem++) + if (strcmp(elemname,elements[jelem]) == 0) + break; + + if (jelem < nelements) + map[i] = jelem; + else if (strcmp(elemname,"NULL") == 0) map[i] = -1; + else error->all(FLERR,"Incorrect args for pair coefficients"); + } + + // clear setflag since coeff() called once with I,J = * * + + int n = atom->ntypes; + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + // set setflag i,j for type pairs where both are mapped to elements + + int count = 0; + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + if (map[i] >= 0 && map[j] >= 0) { + setflag[i][j] = 1; + count++; + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); + + sna = new SNA*[nthreads]; + + // allocate memory for per OpenMP thread data which + // is wrapped into the sna class + +#if defined(_OPENMP) +#pragma omp parallel default(none) +#endif + { + int tid = omp_get_thread_num(); + sna[tid] = new SNA(lmp,rfac0,twojmax, + diagonalstyle,use_shared_arrays, + rmin0,switchflag,bzeroflag); + if (!use_shared_arrays) + sna[tid]->grow_rij(nmax); + } + + if (ncoeff != sna[0]->ncoeff) { + if (comm->me == 0) + printf("ncoeff = %d snancoeff = %d \n",ncoeff,sna[0]->ncoeff); + error->all(FLERR,"Incorrect SNAP parameter file"); + } + + // Calculate maximum cutoff for all elements + + rcutmax = 0.0; + for (int ielem = 0; ielem < nelements; ielem++) + rcutmax = MAX(2.0*radelem[ielem]*rcutfac,rcutmax); + +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairNNSNAP::init_style() +{ + if (force->newton_pair == 0) + error->all(FLERR,"Pair style SNAP requires newton pair on"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + +#if defined(_OPENMP) +#pragma omp parallel default(none) +#endif + { + int tid = omp_get_thread_num(); + sna[tid]->init(); + } + +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairNNSNAP::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + return (radelem[map[i]] + + radelem[map[j]])*rcutfac; +} + +/* ---------------------------------------------------------------------- */ + +void PairNNSNAP::read_files(char *coefffilename, char *paramfilename) +{ + + // open SNAP coefficient file on proc 0 + + FILE *fpcoeff; + if (comm->me == 0) { + fpcoeff = force->open_potential(coefffilename); + if (fpcoeff == NULL) { + char str[128]; + snprintf(str,128,"Cannot open SNAP coefficient file %s",coefffilename); + error->one(FLERR,str); + } + } + + char line[MAXLINE],*ptr; + int eof = 0; + + int n; + int nwords = 0; + while (nwords == 0) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == NULL) { + eof = 1; + fclose(fpcoeff); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + } + if (nwords != 2) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + + // words = ptrs to all words in line + // strip single and double quotes from words + + char* words[MAXWORD]; + int iword = 0; + words[iword] = strtok(line,"' \t\n\r\f"); + iword = 1; + words[iword] = strtok(NULL,"' \t\n\r\f"); + + nelements = atoi(words[0]); + ncoeffall = atoi(words[1]); + + // set up element lists + + elements = new char*[nelements]; + memory->create(radelem,nelements,"pair:radelem"); + memory->create(wjelem,nelements,"pair:wjelem"); + memory->create(coeffelem,nelements,ncoeffall,"pair:coeffelem"); + + // Loop over nelements blocks in the SNAP coefficient file + + for (int ielem = 0; ielem < nelements; ielem++) { + + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == NULL) { + eof = 1; + fclose(fpcoeff); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + nwords = atom->count_words(line); + if (nwords != 3) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + + iword = 0; + words[iword] = strtok(line,"' \t\n\r\f"); + iword = 1; + words[iword] = strtok(NULL,"' \t\n\r\f"); + iword = 2; + words[iword] = strtok(NULL,"' \t\n\r\f"); + + char* elemtmp = words[0]; + int n = strlen(elemtmp) + 1; + elements[ielem] = new char[n]; + strcpy(elements[ielem],elemtmp); + + radelem[ielem] = atof(words[1]); + wjelem[ielem] = atof(words[2]); + + + if (comm->me == 0) { + if (screen) fprintf(screen,"SNAP Element = %s, Radius %g, Weight %g \n", + elements[ielem], radelem[ielem], wjelem[ielem]); + if (logfile) fprintf(logfile,"SNAP Element = %s, Radius %g, Weight %g \n", + elements[ielem], radelem[ielem], wjelem[ielem]); + } + + for (int icoeff = 0; icoeff < ncoeffall; icoeff++) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpcoeff); + if (ptr == NULL) { + eof = 1; + fclose(fpcoeff); + } else n = strlen(line) + 1; + } + + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + nwords = atom->count_words(line); + if (nwords != 1) + error->all(FLERR,"Incorrect format in SNAP coefficient file"); + + iword = 0; + words[iword] = strtok(line,"' \t\n\r\f"); + + coeffelem[ielem][icoeff] = atof(words[0]); + + } + } + + // set flags for required keywords + + rcutfacflag = 0; + twojmaxflag = 0; + + // Set defaults for optional keywords + + rfac0 = 0.99363; + rmin0 = 0.0; + diagonalstyle = 3; + switchflag = 1; + bzeroflag = 1; + quadraticflag = 0; + + // open SNAP parameter file on proc 0 + + FILE *fpparam; + if (comm->me == 0) { + fpparam = force->open_potential(paramfilename); + if (fpparam == NULL) { + char str[128]; + snprintf(str,128,"Cannot open SNAP parameter file %s",paramfilename); + error->one(FLERR,str); + } + } + + eof = 0; + while (1) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fpparam); + if (ptr == NULL) { + eof = 1; + fclose(fpparam); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + if (nwords == 0) continue; + + if (nwords != 2) + error->all(FLERR,"Incorrect format in SNAP parameter file"); + + // words = ptrs to all words in line + // strip single and double quotes from words + + char* keywd = strtok(line,"' \t\n\r\f"); + char* keyval = strtok(NULL,"' \t\n\r\f"); + + if (comm->me == 0) { + if (screen) fprintf(screen,"SNAP keyword %s %s \n",keywd,keyval); + if (logfile) fprintf(logfile,"SNAP keyword %s %s \n",keywd,keyval); + } + + if (strcmp(keywd,"rcutfac") == 0) { + rcutfac = atof(keyval); + rcutfacflag = 1; + } else if (strcmp(keywd,"twojmax") == 0) { + twojmax = atoi(keyval); + twojmaxflag = 1; + } else if (strcmp(keywd,"rfac0") == 0) + rfac0 = atof(keyval); + else if (strcmp(keywd,"rmin0") == 0) + rmin0 = atof(keyval); + else if (strcmp(keywd,"diagonalstyle") == 0) + diagonalstyle = atoi(keyval); + else if (strcmp(keywd,"switchflag") == 0) + switchflag = atoi(keyval); + else if (strcmp(keywd,"bzeroflag") == 0) + bzeroflag = atoi(keyval); + else if (strcmp(keywd,"quadraticflag") == 0) + quadraticflag = atoi(keyval); + else + error->all(FLERR,"Incorrect SNAP parameter file"); + } + + if (rcutfacflag == 0 || twojmaxflag == 0) + error->all(FLERR,"Incorrect SNAP parameter file"); + +} + +/* ---------------------------------------------------------------------- + memory usage +------------------------------------------------------------------------- */ + +double PairNNSNAP::memory_usage() +{ + double bytes = Pair::memory_usage(); + int n = atom->ntypes+1; + bytes += n*n*sizeof(int); + bytes += n*n*sizeof(double); + bytes += 3*nmax*sizeof(double); + bytes += nmax*sizeof(int); + bytes += (2*ncoeffall)*sizeof(double); + bytes += (ncoeff*3)*sizeof(double); + bytes += sna[0]->memory_usage()*nthreads; + return bytes; +} + diff --git a/src/SNAP/pair_nn_snap.h b/src/SNAP/pair_nn_snap.h new file mode 100644 index 0000000000..f77ddee207 --- /dev/null +++ b/src/SNAP/pair_nn_snap.h @@ -0,0 +1,184 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(nn/snap,PairNNSNAP) + +#else + +#ifndef LMP_PAIR_NN_SNAP_H +#define LMP_PAIR_NN_SNAP_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairNNSNAP : public Pair { +public: + PairNNSNAP(class LAMMPS *); + ~PairNNSNAP(); + virtual void compute(int, int); + void compute_regular(int, int); + void compute_optimized(int, int); + void settings(int, char **); + virtual void coeff(int, char **); + virtual void init_style(); + virtual double init_one(int, int); + virtual double memory_usage(); + + double rcutfac, quadraticflag; // declared public to workaround gcc 4.9 + int ncoeff; // compiler bug, manifest in KOKKOS package + +protected: + int ncoeffq, ncoeffall; + double **bvec, ***dbvec; + class SNA** sna; + int nmax; + int nthreads; + virtual void allocate(); + void read_files(char *, char *); + inline int equal(double* x,double* y); + inline double dist2(double* x,double* y); + double extra_cutoff(); + void load_balance(); + void set_sna_to_shared(int snaid,int i); + void build_per_atom_arrays(); + + void compute_beta(); + + int schedule_user; + double schedule_time_guided; + double schedule_time_dynamic; + + int ncalls_neigh; + int do_load_balance; + int ilistmask_max; + int* ilistmask; + int ghostinum; + int ghostilist_max; + int* ghostilist; + int ghostnumneigh_max; + int* ghostnumneigh; + int* ghostneighs; + int* ghostfirstneigh; + int ghostneighs_total; + int ghostneighs_max; + + int use_optimized; + int use_shared_arrays; + + int i_max; + int i_neighmax; + int i_numpairs; + int **i_pairs; + double ***i_rij; + int **i_inside; + double **i_wj; + double **i_rcutij; + int *i_ninside; + double ****i_uarraytot_r, ****i_uarraytot_i; + double ******i_zarray_r, ******i_zarray_i; + +#ifdef TIMING_INFO + // timespec starttime, endtime; + double timers[4]; +#endif + + double rcutmax; // max cutoff for all elements + int nelements; // # of unique elements + char **elements; // names of unique elements + double *radelem; // element radii + double *wjelem; // elements weights + double **coeffelem; // element bispectrum coefficients + double** beta; // betas for all atoms in list + int *map; // mapping from atom types to elements + int twojmax, diagonalstyle, switchflag, bzeroflag; + double rfac0, rmin0, wj1, wj2; + int rcutfacflag, twojmaxflag; // flags for required parameters + int beta_max; // length of beta +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Communication cutoff too small for SNAP micro load balancing + +This can happen if you change the neighbor skin after your pair_style +command or if your box dimensions grow during a run. You can set the +cutoff explicitly via the comm_modify cutoff command. + +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: Must set number of threads via package omp command + +Because you are using the USER-OMP package, set the number of threads +via its settings, not by the pair_style snap nthreads setting. + +W: Communication cutoff is too small for SNAP micro load balancing, increased to %lf + +Self-explanatory. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Incorrect SNAP coeff file + +UNDOCUMENTED + +E: Incorrect SNAP parameter file + +The file cannot be parsed correctly, check its internal syntax. + +E: Pair style SNAP requires newton pair on + +See the newton command. This is a restriction to use the SNAP +potential. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +E: Cannot open SNAP coefficient file %s + +The specified SNAP coefficient file cannot be opened. Check that the +path and name are correct. + +E: Incorrect format in SNAP coefficient file + +Incorrect number of words per line in the coefficient file. + +E: Cannot open SNAP parameter file %s + +The specified SNAP parameter file cannot be opened. Check that the +path and name are correct. + +E: Incorrect format in SNAP parameter file + +Incorrect number of words per line in the parameter file. + +E: Did not find all elements in SNAP coefficient file. + +One or more elements listed in the pair_coeff command were not found in the coefficient file. + +*/ From f2d881470d0edfbe68adc12204ddd1f44621d069 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Sat, 11 May 2019 12:55:11 -0600 Subject: [PATCH 29/90] Added placeholder for neural network SNAP potential --- examples/snap/W.nnsnap | 16 +++++++++++++++ examples/snap/in.nnsnap | 45 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 examples/snap/W.nnsnap create mode 100644 examples/snap/in.nnsnap diff --git a/examples/snap/W.nnsnap b/examples/snap/W.nnsnap new file mode 100644 index 0000000000..93c2bf866a --- /dev/null +++ b/examples/snap/W.nnsnap @@ -0,0 +1,16 @@ +# DATE: 2017-02-20 CONTRIBUTOR: Mitchell Wood mitwood@sandia.gov CITATION: Wood, M. A. and Thompson, A. P. "Quantum-Accurate Molecular Dynamics Potential for Tungsten" arXiv:1702.07042 [physics.comp-ph] +# +# Definition of SNAP+ZBL potential. +variable zblcutinner equal 4 +variable zblcutouter equal 4.8 +variable zblz equal 74 + +# Specify hybrid with SNAP and ZBL + +pair_style hybrid/overlay & +zbl ${zblcutinner} ${zblcutouter} & +snap +pair_coeff 1 1 zbl ${zblz} ${zblz} +pair_coeff * * snap W_2940_2017_2.snapcoeff W_2940_2017_2.snapparam W + +#Nomenclature on the snap files are Element_DakotaID_Year_Month diff --git a/examples/snap/in.nnsnap b/examples/snap/in.nnsnap new file mode 100644 index 0000000000..d575757d56 --- /dev/null +++ b/examples/snap/in.nnsnap @@ -0,0 +1,45 @@ +# Demonstrate SNAP Ta potential + +# Initialize simulation + +variable nsteps index 100 +variable nrep equal 4 +variable a equal 3.1803 +units metal + +# generate the box and atom positions using a BCC lattice + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice bcc $a +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box + +mass 1 183.84 + +# choose potential + +include W.nnsnap + +# Setup output + +thermo 10 +thermo_modify norm yes + +# Set up NVE run + +timestep 0.5e-3 +neighbor 1.0 bin +neigh_modify once no every 1 delay 0 check yes + +# Run MD + +velocity all create 300.0 4928459 +fix 1 all nve +run ${nsteps} + From a0cc6b5b59a41b24f646d218551cac1ff47b7566 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Sat, 11 May 2019 14:04:21 -0600 Subject: [PATCH 30/90] Forgot to change pair style to nn/snap --- examples/snap/W.nnsnap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/snap/W.nnsnap b/examples/snap/W.nnsnap index 93c2bf866a..6ca97a701a 100644 --- a/examples/snap/W.nnsnap +++ b/examples/snap/W.nnsnap @@ -9,8 +9,8 @@ variable zblz equal 74 pair_style hybrid/overlay & zbl ${zblcutinner} ${zblcutouter} & -snap +nn/snap pair_coeff 1 1 zbl ${zblz} ${zblz} -pair_coeff * * snap W_2940_2017_2.snapcoeff W_2940_2017_2.snapparam W +pair_coeff * * nn/snap W_2940_2017_2.snapcoeff W_2940_2017_2.snapparam W #Nomenclature on the snap files are Element_DakotaID_Year_Month From 31789ad03bd7e31a009bbd1a9df26a98068574b3 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 14 May 2019 17:44:35 -0600 Subject: [PATCH 31/90] Commit JT 051419 - added beginning doc - removed a remaining dipolar --- src/SPIN/pair_spin_dipolar_cut.cpp | 533 ----------------------------- 1 file changed, 533 deletions(-) delete mode 100644 src/SPIN/pair_spin_dipolar_cut.cpp diff --git a/src/SPIN/pair_spin_dipolar_cut.cpp b/src/SPIN/pair_spin_dipolar_cut.cpp deleted file mode 100644 index b8927d62e9..0000000000 --- a/src/SPIN/pair_spin_dipolar_cut.cpp +++ /dev/null @@ -1,533 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------ - Contributing authors: Julien Tranchida (SNL) - Stan Moore (SNL) - - Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. Journal of Computational Physics. -------------------------------------------------------------------------- */ - -#include -#include -#include -#include - -#include "pair_spin_dipolar_cut.h" -#include "atom.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "fix_nve_spin.h" -#include "force.h" -#include "kspace.h" -#include "math_const.h" -#include "memory.h" -#include "modify.h" -#include "error.h" -#include "update.h" - - -using namespace LAMMPS_NS; -using namespace MathConst; - -#define EWALD_F 1.12837917 -#define EWALD_P 0.3275911 -#define A1 0.254829592 -#define A2 -0.284496736 -#define A3 1.421413741 -#define A4 -1.453152027 -#define A5 1.061405429 - -/* ---------------------------------------------------------------------- */ - -PairSpinDipolarCut::PairSpinDipolarCut(LAMMPS *lmp) : PairSpin(lmp), -lockfixnvespin(NULL) -{ - single_enable = 0; - spinflag = 1; - respa_enable = 0; - no_virial_fdotr_compute = 1; - lattice_flag = 0; - - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 9.274e-4; // in A.Ang^2 - mu_0 = 785.15; // in eV/Ang/A^2 - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz - -} - -/* ---------------------------------------------------------------------- - free all arrays -------------------------------------------------------------------------- */ - -PairSpinDipolarCut::~PairSpinDipolarCut() -{ - if (allocated) { - memory->destroy(setflag); - memory->destroy(cut_spin_long); - memory->destroy(cutsq); - } -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::settings(int narg, char **arg) -{ - if (narg < 1 || narg > 2) - error->all(FLERR,"Incorrect args in pair_style command"); - - if (strcmp(update->unit_style,"metal") != 0) - error->all(FLERR,"Spin simulations require metal unit style"); - - if (!atom->sp) - error->all(FLERR,"Pair/spin style requires atom attribute sp"); - - cut_spin_long_global = force->numeric(FLERR,arg[0]); - - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i+1; j <= atom->ntypes; j++) { - if (setflag[i][j]) { - cut_spin_long[i][j] = cut_spin_long_global; - } - } - } - } - -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::coeff(int narg, char **arg) -{ - if (!allocated) allocate(); - - // check if args correct - - if (strcmp(arg[2],"long") != 0) - error->all(FLERR,"Incorrect args in pair_style command"); - if (narg < 1 || narg > 4) - error->all(FLERR,"Incorrect args in pair_style command"); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - double spin_long_cut_one = force->numeric(FLERR,arg[3]); - - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - setflag[i][j] = 1; - cut_spin_long[i][j] = spin_long_cut_one; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init specific to this pair style -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::init_style() -{ - if (!atom->sp_flag) - error->all(FLERR,"Pair spin requires atom/spin style"); - - // need a full neighbor list - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - - // checking if nve/spin is a listed fix - - int ifix = 0; - while (ifix < modify->nfix) { - if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; - ifix++; - } - if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); - - // get the lattice_flag from nve/spin - - for (int i = 0; i < modify->nfix; i++) { - if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { - lockfixnvespin = (FixNVESpin *) modify->fix[i]; - lattice_flag = lockfixnvespin->lattice_flag; - } - } - -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairSpinDipolarCut::init_one(int i, int j) -{ - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - - cut_spin_long[j][i] = cut_spin_long[i][j]; - - return cut_spin_long_global; -} - -/* ---------------------------------------------------------------------- - extract the larger cutoff if "cut" or "cut_coul" -------------------------------------------------------------------------- */ - -void *PairSpinDipolarCut::extract(const char *str, int &dim) -{ - if (strcmp(str,"cut") == 0) { - dim = 0; - return (void *) &cut_spin_long_global; - } else if (strcmp(str,"cut_coul") == 0) { - dim = 0; - return (void *) &cut_spin_long_global; - } else if (strcmp(str,"ewald_order") == 0) { - ewald_order = 0; - ewald_order |= 1<<1; - ewald_order |= 1<<3; - dim = 0; - return (void *) &ewald_order; - } else if (strcmp(str,"ewald_mix") == 0) { - dim = 0; - return (void *) &mix_flag; - } - return NULL; -} - -/* ---------------------------------------------------------------------- */ - -void PairSpinDipolarCut::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double rinv,r2inv,r3inv,rsq; - double evdwl,ecoul; - double xi[3],rij[3],eij[3]; - double spi[4],spj[4],fi[3],fmi[3]; - double local_cut2; - int *ilist,*jlist,*numneigh,**firstneigh; - - evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - double **x = atom->x; - double **f = atom->f; - double **fm = atom->fm; - double **sp = atom->sp; - int *type = atom->type; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - // computation of the exchange interaction - // loop over atoms and their neighbors - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; - spi[3] = sp[i][3]; - itype = type[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; - - evdwl = 0.0; - fi[0] = fi[1] = fi[2] = 0.0; - fmi[0] = fmi[1] = fmi[2] = 0.0; - - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - rinv = 1.0/sqrt(rsq); - eij[0] = rij[0]*rinv; - eij[1] = rij[1]*rinv; - eij[2] = rij[2]*rinv; - - local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; - - if (rsq < local_cut2) { - r2inv = 1.0/rsq; - r3inv = r2inv*rinv; - - compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); - if (lattice_flag) compute_dipolar_mech(i,j,eij,fi,spi,spj,r2inv); - } - - // force accumulation - - f[i][0] += fi[0]; - f[i][1] += fi[1]; - f[i][2] += fi[2]; - fm[i][0] += fmi[0]; - fm[i][1] += fmi[1]; - fm[i][2] += fmi[2]; - - if (newton_pair || j < nlocal) { - f[j][0] -= fi[0]; - f[j][1] -= fi[1]; - f[j][2] -= fi[2]; - } - - if (eflag) { - if (rsq <= local_cut2) { - evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); - evdwl *= hbar; - } - } else evdwl = 0.0; - - if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, - evdwl,ecoul,fi[0],fi[1],fi[2],rij[0],rij[1],rij[2]); - - } - } -} - -/* ---------------------------------------------------------------------- - update the pair interaction fmi acting on the spin ii - adding 1/r (for r in [0,rc]) contribution to the pair - removing erf(r)/r (for r in [0,rc]) from the kspace force -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) -{ - int i,j,jj,jnum,itype,jtype; - double rsq,rinv,r2inv,r3inv; - double xi[3],rij[3],eij[3]; - double spi[4],spj[4]; - double local_cut2; - int *ilist,*jlist,*numneigh,**firstneigh; - - double **x = atom->x; - double **sp = atom->sp; - int *type = atom->type; - - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - // computation of the exchange interaction - // loop over neighbors of atom i - - i = ilist[ii]; - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; - spi[3] = sp[i][3]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - itype = type[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; - - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - rinv = 1.0/sqrt(rsq); - eij[0] = rij[0]*rinv; - eij[1] = rij[1]*rinv; - eij[2] = rij[2]*rinv; - - local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; - - if (rsq < local_cut2) { - r2inv = 1.0/rsq; - r3inv = r2inv*rinv; - - // compute dipolar interaction - - compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); - } - } -} - -/* ---------------------------------------------------------------------- - compute dipolar interaction between spins i and j -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::compute_dipolar(int i, int j, double eij[3], - double fmi[3], double spi[4], double spj[4], double r3inv) -{ - double sjdotr; - double gigjiri3,pre; - - sjdotr = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; - gigjiri3 = (spi[3] * spj[3])*r3inv; - pre = mub2mu0hbinv * gigjiri3; - - fmi[0] += pre * (3.0 * sjdotr *eij[0] - spj[0]); - fmi[1] += pre * (3.0 * sjdotr *eij[1] - spj[1]); - fmi[2] += pre * (3.0 * sjdotr *eij[2] - spj[2]); -} - -/* ---------------------------------------------------------------------- - compute the mechanical force due to the dipolar interaction between - atom i and atom j -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::compute_dipolar_mech(int i, int j, double eij[3], - double fi[3], double spi[3], double spj[3], double r2inv) -{ - double sisj,sieij,sjeij; - double gigjri4,bij,pre; - - gigjri4 = (spi[3] * spj[3])*r2inv*r2inv; - sisj = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; - sieij = spi[0]*eij[0] + spi[1]*eij[1] + spi[2]*eij[2]; - sjeij = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; - - bij = sisj - 5.0*sieij*sjeij; - pre = mub2mu0*gigjri4; - - fi[0] += pre * (eij[0] * bij + (sjeij*spi[0] + sieij*spj[0])); - fi[1] += pre * (eij[1] * bij + (sjeij*spi[1] + sieij*spj[1])); - fi[2] += pre * (eij[2] * bij + (sjeij*spi[2] + sieij*spj[2])); -} - -/* ---------------------------------------------------------------------- - allocate all arrays -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - memory->create(cut_spin_long,n+1,n+1,"pair/spin/long:cut_spin_long"); - memory->create(cutsq,n+1,n+1,"pair/spin/long:cutsq"); -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::write_restart(FILE *fp) -{ - write_restart_settings(fp); - - int i,j; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) { - fwrite(&cut_spin_long[i][j],sizeof(int),1,fp); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::read_restart(FILE *fp) -{ - read_restart_settings(fp); - - allocate(); - - int i,j; - int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); - if (setflag[i][j]) { - if (me == 0) { - fread(&cut_spin_long[i][j],sizeof(int),1,fp); - } - MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::write_restart_settings(FILE *fp) -{ - fwrite(&cut_spin_long_global,sizeof(double),1,fp); - fwrite(&mix_flag,sizeof(int),1,fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairSpinDipolarCut::read_restart_settings(FILE *fp) -{ - if (comm->me == 0) { - fread(&cut_spin_long_global,sizeof(double),1,fp); - fread(&mix_flag,sizeof(int),1,fp); - } - MPI_Bcast(&cut_spin_long_global,1,MPI_DOUBLE,0,world); - MPI_Bcast(&mix_flag,1,MPI_INT,0,world); -} From 084bb3c35b357f4eb3ef6fb24b22274666c21d6c Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 15 May 2019 08:34:12 -0600 Subject: [PATCH 32/90] Commit JT 051519 - start doc pair_spin_dipole --- doc/src/pair_dipole_spin.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/pair_dipole_spin.txt b/doc/src/pair_dipole_spin.txt index c54d72cd7c..b1934033c0 100644 --- a/doc/src/pair_dipole_spin.txt +++ b/doc/src/pair_dipole_spin.txt @@ -12,6 +12,7 @@ pair_style spin/dipole/long/qsymp command :h3 [Syntax:] +pair_style spin/dipole/cut cutoff pair_style lj/cut/dipole/cut cutoff (cutoff2) pair_style lj/sf/dipole/sf cutoff (cutoff2) pair_style lj/cut/dipole/long cutoff (cutoff2) From 98d9c45ad97be8e2f26a7310d2f0627429dc4a43 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Wed, 15 May 2019 17:18:24 -0600 Subject: [PATCH 33/90] compute_bispectrum --- src/SNAP/pair_snap.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 0bf367b5dc..4913044369 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -1319,6 +1319,28 @@ void PairSNAP::compute_beta() } } +/* ---------------------------------------------------------------------- + compute bispectrum +------------------------------------------------------------------------- */ + +void PairSNAP::compute_bispectrum() +{ + int i; + int *type = atom->type; + + for (int ii = 0; ii < list->inum; ii++) { + i = list->ilist[ii]; + const int itype = type[i]; + const int ielem = map[itype]; + double* coeffi = coeffelem[ielem]; + snaptr->compute_bi(); + snaptr->copy_bi2bvec(); + + for (int k = 0; k < ncoeff; k++) + bispectrum[ii][k] = snaptr->bvec[k]; + } +} + /* ---------------------------------------------------------------------- allocate all arrays ------------------------------------------------------------------------- */ From 0c0b106924b56f2293c00fb2f6513648e62b5311 Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 15 May 2019 20:49:05 -0600 Subject: [PATCH 34/90] Commit2 JT 051519 - started doc pair_spin_dipole.txt - renamed all pair/spin/dipole - created and tested example pair/spin/dipole/cut --- ...r_dipole_spin.txt => pair_spin_dipole.txt} | 42 +- .../SPIN/dipole_spin/Fe_Mishin2006.eam.alloy | 15009 ++++++++++++++++ .../exchange_bcc_iron.dat | 5 + .../exchange_fit_bcc_iron/exchange_fit.py | 32 + examples/SPIN/dipole_spin/fe_dd.dat | 19 + .../SPIN/dipole_spin/in.spin.iron_dipole_cut | 59 + examples/SPIN/dipole_spin/in.spin.iron_ewald | 60 + examples/SPIN/dipole_spin/in.spin.iron_pppm | 60 + src/SPIN/pair_spin_dipole_cut.cpp | 52 +- src/SPIN/pair_spin_dipole_cut.h | 12 +- src/SPIN/pair_spin_dipole_long.cpp | 34 +- src/SPIN/pair_spin_dipole_long.h | 12 +- src/SPIN/pair_spin_dipole_long_qsymp.cpp | 34 +- src/SPIN/pair_spin_dipole_long_qsymp.h | 12 +- 14 files changed, 15330 insertions(+), 112 deletions(-) rename doc/src/{pair_dipole_spin.txt => pair_spin_dipole.txt} (88%) create mode 100644 examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy create mode 100644 examples/SPIN/dipole_spin/exchange_fit_bcc_iron/exchange_bcc_iron.dat create mode 100644 examples/SPIN/dipole_spin/exchange_fit_bcc_iron/exchange_fit.py create mode 100644 examples/SPIN/dipole_spin/fe_dd.dat create mode 100644 examples/SPIN/dipole_spin/in.spin.iron_dipole_cut create mode 100644 examples/SPIN/dipole_spin/in.spin.iron_ewald create mode 100644 examples/SPIN/dipole_spin/in.spin.iron_pppm diff --git a/doc/src/pair_dipole_spin.txt b/doc/src/pair_spin_dipole.txt similarity index 88% rename from doc/src/pair_dipole_spin.txt rename to doc/src/pair_spin_dipole.txt index c54d72cd7c..1c1b5b5f19 100644 --- a/doc/src/pair_dipole_spin.txt +++ b/doc/src/pair_spin_dipole.txt @@ -12,48 +12,36 @@ pair_style spin/dipole/long/qsymp command :h3 [Syntax:] -pair_style lj/cut/dipole/cut cutoff (cutoff2) -pair_style lj/sf/dipole/sf cutoff (cutoff2) -pair_style lj/cut/dipole/long cutoff (cutoff2) -pair_style lj/long/dipole/long flag_lj flag_coul cutoff (cutoff2) :pre +pair_style spin/dipole/cut cutoff +pair_style spin/dipole/long cutoff +pair_style spin/dipole/long/qsymp cutoff :pre -cutoff = global cutoff LJ (and Coulombic if only 1 arg) (distance units) :ulb,l -cutoff2 = global cutoff for Coulombic and dipole (optional) (distance units) :l -flag_lj = {long} or {cut} or {off} :l - {long} = use long-range damping on dispersion 1/r^6 term - {cut} = use a cutoff on dispersion 1/r^6 term - {off} = omit disperion 1/r^6 term entirely :pre -flag_coul = {long} or {off} :l - {long} = use long-range damping on Coulombic 1/r and point-dipole terms - {off} = omit Coulombic and point-dipole terms entirely :pre +cutoff = global cutoff for Magnetic dipole energy and forces +(optional) (distance units) :ulb,l :ule [Examples:] -pair_style lj/cut/dipole/cut 10.0 -pair_coeff * * 1.0 1.0 -pair_coeff 2 3 1.0 1.0 2.5 4.0 :pre +pair_style spin/dipole/cut 10.0 +pair_coeff * * 10.0 +pair_coeff 2 3 8.0 :pre -pair_style lj/sf/dipole/sf 9.0 +pair_style spin/dipole/long 9.0 pair_coeff * * 1.0 1.0 pair_coeff 2 3 1.0 1.0 2.5 4.0 scale 0.5 pair_coeff 2 3 1.0 1.0 2.5 4.0 :pre -pair_style lj/cut/dipole/long 10.0 -pair_coeff * * 1.0 1.0 -pair_coeff 2 3 1.0 1.0 2.5 4.0 :pre - -pair_style lj/long/dipole/long long long 3.5 10.0 +pair_style spin/dipole/long/qsymp 10.0 pair_coeff * * 1.0 1.0 pair_coeff 2 3 1.0 1.0 2.5 4.0 :pre [Description:] -Style {lj/cut/dipole/cut} computes interactions between pairs of particles -that each have a charge and/or a point dipole moment. In addition to -the usual Lennard-Jones interaction between the particles (Elj) the -charge-charge (Eqq), charge-dipole (Eqp), and dipole-dipole (Epp) -interactions are computed by these formulas for the energy (E), force +Style {spin/dipole/cut} computes a short-range dipole-dipole +interactions between pairs of magnetic particles that each +have a magnetic spin. +The magnetic dipole-dipole interactions are computed by the +following formulas for the energy (E), force (F), and torque (T) between particles I and J. :c,image(Eqs/pair_dipole.jpg) diff --git a/examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy b/examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy new file mode 100644 index 0000000000..69231bb7ee --- /dev/null +++ b/examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy @@ -0,0 +1,15009 @@ +comment 1 +comment 2 +Converted by Ganga P Purja Pun using C++ code on Mon Nov 3 10:48:17 2014 +1 Fe +5001 2.400000000000000e-03 5001 1.134673400048920e-03 5.673367000244601e+00 +26 5.584700000000000e+01 2.855300000000000e+00 BCC + 0.000000000000000e+00 + -2.338738741480766e-02 + -4.628214468925276e-02 + -6.912258036387915e-02 + -9.175603963501618e-02 + -1.141497214000000e-01 + -1.363388222824136e-01 + -1.583226111166723e-01 + -1.800965752913192e-01 + -2.016645989796093e-01 + -2.230289901000000e-01 + -2.441907391820846e-01 + -2.651515164004249e-01 + -2.859130554412839e-01 + -3.064769176965011e-01 + -3.268446844000000e-01 + -3.470179531091855e-01 + -3.669982968636285e-01 + -3.867872784635140e-01 + -4.063864535839295e-01 + -4.257973671999999e-01 + -4.450215551034667e-01 + -4.640605423684923e-01 + -4.829158454463851e-01 + -5.015889707095635e-01 + -5.200814146000000e-01 + -5.383946650297390e-01 + -5.565301991603658e-01 + -5.744894857268537e-01 + -5.922739837155686e-01 + -6.098851423000000e-01 + -6.273244022645037e-01 + -6.445931939756846e-01 + -6.616929394780281e-01 + -6.786250511352716e-01 + -6.953909318999999e-01 + -7.119919765952718e-01 + -7.284295696432279e-01 + -7.447050873484842e-01 + -7.608198966551055e-01 + -7.767753551999997e-01 + -7.925728126189590e-01 + -8.082136084644670e-01 + -8.236990743647939e-01 + -8.390305327768360e-01 + -8.542092970000001e-01 + -8.692366724924486e-01 + -8.841139549244775e-01 + -8.988424321942350e-01 + -9.134233831702263e-01 + -9.278580778000000e-01 + -9.421477783833053e-01 + -9.562937376266863e-01 + -9.702972006149804e-01 + -9.841594035897939e-01 + -9.978815741999999e-01 + -1.011464932626877e+00 + -1.024910689374227e+00 + -1.038220047492379e+00 + -1.051394201530088e+00 + -1.064434338000000e+00 + -1.077341636148692e+00 + -1.090117264995124e+00 + -1.102762386491716e+00 + -1.115278154872840e+00 + -1.127665716000000e+00 + -1.139926208397942e+00 + -1.152060761127338e+00 + -1.164070496370367e+00 + -1.175956528594255e+00 + -1.187719964000000e+00 + -1.199361901614307e+00 + -1.210883431375302e+00 + -1.222285636497208e+00 + -1.233569592577916e+00 + -1.244736367000000e+00 + -1.255787020138112e+00 + -1.266722603828963e+00 + -1.277544163022812e+00 + -1.288252734706093e+00 + -1.298849349000000e+00 + -1.309335029515858e+00 + -1.319710789766606e+00 + -1.329977637188551e+00 + -1.340136572985217e+00 + -1.350188590000000e+00 + -1.360134674013246e+00 + -1.369975802739515e+00 + -1.379712947700534e+00 + -1.389347073262624e+00 + -1.398879136000000e+00 + -1.408310086019347e+00 + -1.417640866058629e+00 + -1.426872412303706e+00 + -1.436005653062347e+00 + -1.445041510000000e+00 + -1.453980898788701e+00 + -1.462824726507764e+00 + -1.471573894410746e+00 + -1.480229297407323e+00 + -1.488791823000000e+00 + -1.497262352264216e+00 + -1.505641758273629e+00 + -1.513930908641532e+00 + -1.522130664940848e+00 + -1.530241881000000e+00 + -1.538265404312065e+00 + -1.546202075663511e+00 + -1.554052729949587e+00 + -1.561818194964572e+00 + -1.569499292000000e+00 + -1.577096836740392e+00 + -1.584611637631811e+00 + -1.592044497451960e+00 + -1.599396212413425e+00 + -1.606667572000000e+00 + -1.613859360067553e+00 + -1.620972353850301e+00 + -1.628007324820493e+00 + -1.634965037585305e+00 + -1.641846251000000e+00 + -1.648651718746855e+00 + -1.655382187120556e+00 + -1.662038397074428e+00 + -1.668621083574689e+00 + -1.675130975000000e+00 + -1.681568794320005e+00 + -1.687935258528783e+00 + -1.694231079461267e+00 + -1.700456962682860e+00 + -1.706613607000000e+00 + -1.712701705964896e+00 + -1.718721948142722e+00 + -1.724675016499694e+00 + -1.730561586828580e+00 + -1.736382330000000e+00 + -1.742137912457411e+00 + -1.747828994017656e+00 + -1.753456229026646e+00 + -1.759020265526974e+00 + -1.764521747000000e+00 + -1.769961312537754e+00 + -1.775339594027171e+00 + -1.780657218386706e+00 + -1.785914807192779e+00 + -1.791112977000000e+00 + -1.796252339747382e+00 + -1.801333500673453e+00 + -1.806357060360666e+00 + -1.811323614328498e+00 + -1.816233753000000e+00 + -1.821088062150410e+00 + -1.825887120985276e+00 + -1.830631504346673e+00 + -1.835321782397329e+00 + -1.839958520000000e+00 + -1.844542277375300e+00 + -1.849073608812209e+00 + -1.853553064572349e+00 + -1.857981190434394e+00 + -1.862358526000000e+00 + -1.866685606181999e+00 + -1.870962962067843e+00 + -1.875191119963197e+00 + -1.879370599902195e+00 + -1.883501918000000e+00 + -1.887585586736770e+00 + -1.891622112755978e+00 + -1.895611998485404e+00 + -1.899555741651499e+00 + -1.903453835000000e+00 + -1.907306767129976e+00 + -1.911115021853308e+00 + -1.914879078883785e+00 + -1.918599413067872e+00 + -1.922276495000000e+00 + -1.925910791456493e+00 + -1.929502763824010e+00 + -1.933052869645757e+00 + -1.936561562187136e+00 + -1.940029290000000e+00 + -1.943456497684402e+00 + -1.946843625242175e+00 + -1.950191109032846e+00 + -1.953499381145042e+00 + -1.956768869000000e+00 + -1.959999996258605e+00 + -1.963193182622893e+00 + -1.966348843806269e+00 + -1.969467390558660e+00 + -1.972549230000000e+00 + -1.975594766012145e+00 + -1.978604397775412e+00 + -1.981578520793180e+00 + -1.984517526364655e+00 + -1.987421802000000e+00 + -1.990291731861874e+00 + -1.993127695559656e+00 + -1.995930069364364e+00 + -1.998699225767272e+00 + -2.001435533000000e+00 + -2.004139355858378e+00 + -2.006811055538481e+00 + -2.009450989763890e+00 + -2.012059511961222e+00 + -2.014636972000000e+00 + -2.017183716742461e+00 + -2.019700089231340e+00 + -2.022186429001382e+00 + -2.024643071393187e+00 + -2.027070349000000e+00 + -2.029468591629637e+00 + -2.031838124095820e+00 + -2.034179268100215e+00 + -2.036492342201070e+00 + -2.038777662000000e+00 + -2.041035540156417e+00 + -2.043266284490031e+00 + -2.045470200083453e+00 + -2.047647589335177e+00 + -2.049798751000000e+00 + -2.051923980684690e+00 + -2.054023570214561e+00 + -2.056097808968247e+00 + -2.058146983649728e+00 + -2.060171377000000e+00 + -2.062171268551674e+00 + -2.064146934640815e+00 + -2.066098649159696e+00 + -2.068026683134947e+00 + -2.069931304000000e+00 + -2.071812776276246e+00 + -2.073671361471072e+00 + -2.075507318519566e+00 + -2.077320903301032e+00 + -2.079112369000000e+00 + -2.080881966139512e+00 + -2.082629940879466e+00 + -2.084356537486872e+00 + -2.086061998635378e+00 + -2.087746563000000e+00 + -2.089410466229110e+00 + -2.091053941828707e+00 + -2.092677220771137e+00 + -2.094280530723314e+00 + -2.095864097000000e+00 + -2.097428142794787e+00 + -2.098972888139794e+00 + -2.100498550462023e+00 + -2.102005344216306e+00 + -2.103493482000000e+00 + -2.104963174393948e+00 + -2.106414628045970e+00 + -2.107848047779690e+00 + -2.109263636820768e+00 + -2.110661595000000e+00 + -2.112042119471926e+00 + -2.113405405101743e+00 + -2.114751645122076e+00 + -2.116081030815763e+00 + -2.117393750000000e+00 + -2.118689987937912e+00 + -2.119969928191390e+00 + -2.121233752504371e+00 + -2.122481640223532e+00 + -2.123713768000000e+00 + -2.124930310308645e+00 + -2.126131439345980e+00 + -2.127317325650607e+00 + -2.128488137848567e+00 + -2.129644042000000e+00 + -2.130785202020548e+00 + -2.131911779449632e+00 + -2.133023934312029e+00 + -2.134121824962966e+00 + -2.135205607000000e+00 + -2.136275433910872e+00 + -2.137331457489147e+00 + -2.138373827747866e+00 + -2.139402692469194e+00 + -2.140418197999999e+00 + -2.141420489142081e+00 + -2.142409707722756e+00 + -2.143385994030927e+00 + -2.144349486926974e+00 + -2.145300323000000e+00 + -2.146238637076898e+00 + -2.147164562479522e+00 + -2.148078231051947e+00 + -2.148979772720135e+00 + -2.149869315000000e+00 + -2.150746983835218e+00 + -2.151612904662093e+00 + -2.152467200947815e+00 + -2.153309993218032e+00 + -2.154141401000000e+00 + -2.154961542883784e+00 + -2.155770535619624e+00 + -2.156568494253713e+00 + -2.157355531798206e+00 + -2.158131760000000e+00 + -2.158897289576013e+00 + -2.159652229917454e+00 + -2.160396688379106e+00 + -2.161130769707277e+00 + -2.161854579000000e+00 + -2.162568220747540e+00 + -2.163271795520776e+00 + -2.163965403104795e+00 + -2.164649143391419e+00 + -2.165323114000000e+00 + -2.165987410839904e+00 + -2.166642128874188e+00 + -2.167287362019562e+00 + -2.167923202786971e+00 + -2.168549742000000e+00 + -2.169167069289456e+00 + -2.169775273557456e+00 + -2.170374442741976e+00 + -2.170964663390078e+00 + -2.171546020000000e+00 + -2.172118595836383e+00 + -2.172682474202094e+00 + -2.173237737093693e+00 + -2.173784464448991e+00 + -2.174322736000000e+00 + -2.174852630794634e+00 + -2.175374225221640e+00 + -2.175887595177988e+00 + -2.176392816678372e+00 + -2.176889964000000e+00 + -2.177379110090651e+00 + -2.177860327096639e+00 + -2.178333686466943e+00 + -2.178799258747679e+00 + -2.179257113000000e+00 + -2.179707317299531e+00 + -2.180149939409128e+00 + -2.180585046165010e+00 + -2.181012703042297e+00 + -2.181432975000000e+00 + -2.181845926509731e+00 + -2.182251621108717e+00 + -2.182650121032542e+00 + -2.183041486916871e+00 + -2.183425780000000e+00 + -2.183803061402426e+00 + -2.184173389857596e+00 + -2.184536823542827e+00 + -2.184893420600431e+00 + -2.185243238000000e+00 + -2.185586332004080e+00 + -2.185922759056265e+00 + -2.186252574500474e+00 + -2.186575831916728e+00 + -2.186892585000000e+00 + -2.187202887393400e+00 + -2.187506791832633e+00 + -2.187804350256584e+00 + -2.188095613705712e+00 + -2.188380633000000e+00 + -2.188659458643119e+00 + -2.188932140238827e+00 + -2.189198726845117e+00 + -2.189459267002233e+00 + -2.189713809000000e+00 + -2.189962400732430e+00 + -2.190205089044370e+00 + -2.190441920581333e+00 + -2.190672942002169e+00 + -2.190898199000000e+00 + -2.191117736662499e+00 + -2.191331600149922e+00 + -2.191539834109547e+00 + -2.191742482380937e+00 + -2.191939589000000e+00 + -2.192131197889608e+00 + -2.192317351831708e+00 + -2.192498093290244e+00 + -2.192673464653123e+00 + -2.192843508000000e+00 + -2.193008265149897e+00 + -2.193167777657277e+00 + -2.193322086821774e+00 + -2.193471233640668e+00 + -2.193615259000000e+00 + -2.193754203483761e+00 + -2.193888106693908e+00 + -2.194017008313546e+00 + -2.194140948496115e+00 + -2.194259967000000e+00 + -2.194374103230534e+00 + -2.194483396307522e+00 + -2.194587885225862e+00 + -2.194687608881331e+00 + -2.194782606000000e+00 + -2.194872915200472e+00 + -2.194958575082935e+00 + -2.195039623893670e+00 + -2.195116099394696e+00 + -2.195188040000000e+00 + -2.195255484352944e+00 + -2.195318470219860e+00 + -2.195377035223315e+00 + -2.195431217130485e+00 + -2.195481054000000e+00 + -2.195526583926446e+00 + -2.195567844428364e+00 + -2.195604873029958e+00 + -2.195637707516086e+00 + -2.195666386000000e+00 + -2.195690946583878e+00 + -2.195711426545218e+00 + -2.195727863658885e+00 + -2.195740296673043e+00 + -2.195748763000000e+00 + -2.195753299607926e+00 + -2.195753945356280e+00 + -2.195750739132009e+00 + -2.195743719093693e+00 + -2.195732923000000e+00 + -2.195718388771941e+00 + -2.195700155840199e+00 + -2.195678263244660e+00 + -2.195652748934943e+00 + -2.195623652000000e+00 + -2.195591012099144e+00 + -2.195554867993407e+00 + -2.195515258985693e+00 + -2.195472225489285e+00 + -2.195425807000000e+00 + -2.195376042760528e+00 + -2.195322973614639e+00 + -2.195266640267298e+00 + -2.195207082686241e+00 + -2.195144342000000e+00 + -2.195078459809379e+00 + -2.195009476453377e+00 + -2.194937433066797e+00 + -2.194862372466152e+00 + -2.194784337000000e+00 + -2.194703368615792e+00 + -2.194619509257747e+00 + -2.194532801771278e+00 + -2.194443290305841e+00 + -2.194351018000000e+00 + -2.194256027737437e+00 + -2.194158364279782e+00 + -2.194058072250755e+00 + -2.193955195446114e+00 + -2.193849779000000e+00 + -2.193741868885436e+00 + -2.193631510785602e+00 + -2.193518750557477e+00 + -2.193403634464252e+00 + -2.193286209000000e+00 + -2.193166521091908e+00 + -2.193044618884907e+00 + -2.192920550384463e+00 + -2.192794362988794e+00 + -2.192666105000000e+00 + -2.192535825071375e+00 + -2.192403570783236e+00 + -2.192269389306454e+00 + -2.192133327558461e+00 + -2.191995432000000e+00 + -2.191855748732582e+00 + -2.191714323538803e+00 + -2.191571201647935e+00 + -2.191426427571225e+00 + -2.191280046000000e+00 + -2.191132101498374e+00 + -2.190982637495000e+00 + -2.190831697104933e+00 + -2.190679323369808e+00 + -2.190525559000000e+00 + -2.190370446239990e+00 + -2.190214026313205e+00 + -2.190056340263544e+00 + -2.189897429222788e+00 + -2.189737334000000e+00 + -2.189576094894156e+00 + -2.189413751026334e+00 + -2.189250341662785e+00 + -2.189085906605225e+00 + -2.188920484000000e+00 + -2.188754111167896e+00 + -2.188586826517446e+00 + -2.188418667831656e+00 + -2.188249671505532e+00 + -2.188079874000000e+00 + -2.187909311655257e+00 + -2.187738019850499e+00 + -2.187566033827133e+00 + -2.187393388939138e+00 + -2.187220120000000e+00 + -2.187046261198758e+00 + -2.186871845656608e+00 + -2.186696906557450e+00 + -2.186521477499284e+00 + -2.186345591000000e+00 + -2.186169278929348e+00 + -2.185992573469870e+00 + -2.185815507881449e+00 + -2.185638116930091e+00 + -2.185460435000000e+00 + -2.185282496723147e+00 + -2.185104339046128e+00 + -2.184925999471230e+00 + -2.184747515559985e+00 + -2.184568926000000e+00 + -2.184390270419004e+00 + -2.184211589307456e+00 + -2.184032923638580e+00 + -2.183854314918697e+00 + -2.183675806000000e+00 + -2.183497440664645e+00 + -2.183319263062145e+00 + -2.183141318226586e+00 + -2.182963652427783e+00 + -2.182786312000000e+00 + -2.182609343803448e+00 + -2.182432796909005e+00 + -2.182256720850984e+00 + -2.182081165100584e+00 + -2.181906180000000e+00 + -2.181731816772078e+00 + -2.181558127901617e+00 + -2.181385166690271e+00 + -2.181212987245827e+00 + -2.181041644000000e+00 + -2.180871191888493e+00 + -2.180701687214938e+00 + -2.180533187286951e+00 + -2.180365750436408e+00 + -2.180199435000000e+00 + -2.180034299706266e+00 + -2.179870405073628e+00 + -2.179707812476292e+00 + -2.179546583956951e+00 + -2.179386782000000e+00 + -2.179228469569652e+00 + -2.179071710572415e+00 + -2.178916570209873e+00 + -2.178763115274171e+00 + -2.178611412000000e+00 + -2.178461526719817e+00 + -2.178313527960817e+00 + -2.178167485170301e+00 + -2.178023468394170e+00 + -2.177881548000000e+00 + -2.177741794911888e+00 + -2.177604281585152e+00 + -2.177469081134519e+00 + -2.177336267165003e+00 + -2.177205914000000e+00 + -2.177078096781969e+00 + -2.176952892179310e+00 + -2.176830377266735e+00 + -2.176710629289710e+00 + -2.176593727000000e+00 + -2.176479750089725e+00 + -2.176368778170715e+00 + -2.176260892035270e+00 + -2.176156174290115e+00 + -2.176054707000000e+00 + -2.175956572480315e+00 + -2.175861855847520e+00 + -2.175770642395214e+00 + -2.175683016800304e+00 + -2.175599066000000e+00 + -2.175518878125867e+00 + -2.175442540126260e+00 + -2.175370140365612e+00 + -2.175301769822078e+00 + -2.175237519000000e+00 + -2.175177478422601e+00 + -2.175121740498959e+00 + -2.175070398200953e+00 + -2.175023544771637e+00 + -2.174981275000000e+00 + -2.174943684570890e+00 + -2.174910868831887e+00 + -2.174882924320826e+00 + -2.174859949548785e+00 + -2.174842043000000e+00 + -2.174829303331104e+00 + -2.174821830410927e+00 + -2.174819725228089e+00 + -2.174823090027552e+00 + -2.174832027000000e+00 + -2.174846638699704e+00 + -2.174867029559900e+00 + -2.174893304738549e+00 + -2.174925569834485e+00 + -2.174963931000000e+00 + -2.175008495084293e+00 + -2.175059370394289e+00 + -2.175116665887380e+00 + -2.175180491027200e+00 + -2.175250956000000e+00 + -2.175328171805043e+00 + -2.175412250937077e+00 + -2.175503306357684e+00 + -2.175601451271103e+00 + -2.175706800000000e+00 + -2.175819467765500e+00 + -2.175939570549688e+00 + -2.176067225041086e+00 + -2.176202548787411e+00 + -2.176345660000000e+00 + -2.176496677644949e+00 + -2.176655722183164e+00 + -2.176822914601843e+00 + -2.176998376191533e+00 + -2.177182229000000e+00 + -2.177374595921169e+00 + -2.177575601341799e+00 + -2.177785370087074e+00 + -2.178004027196875e+00 + -2.178231699000000e+00 + -2.178468512862275e+00 + -2.178714597011325e+00 + -2.178970080062299e+00 + -2.179235091002944e+00 + -2.179509760000000e+00 + -2.179794218272507e+00 + -2.180088598277346e+00 + -2.180393032665419e+00 + -2.180707654074028e+00 + -2.181032597000000e+00 + -2.181367997183408e+00 + -2.181713990526695e+00 + -2.182070713375897e+00 + -2.182438302803596e+00 + -2.182816897000000e+00 + -2.183206635150288e+00 + -2.183607657686531e+00 + -2.184020105275964e+00 + -2.184444118610974e+00 + -2.184879840000000e+00 + -2.185327412889597e+00 + -2.185786981109685e+00 + -2.186258689137973e+00 + -2.186742682377725e+00 + -2.187239107000000e+00 + -2.187748109862624e+00 + -2.188269838801850e+00 + -2.188804442677439e+00 + -2.189352071523296e+00 + -2.189912875000000e+00 + -2.190487003093955e+00 + -2.191074608322116e+00 + -2.191675843787203e+00 + -2.192290862610885e+00 + -2.192919819000000e+00 + -2.193562867915730e+00 + -2.194220164552147e+00 + -2.194891865404003e+00 + -2.195578128862665e+00 + -2.196279113000000e+00 + -2.196994976008069e+00 + -2.197725877814248e+00 + -2.198471979076637e+00 + -2.199233441010543e+00 + -2.200010426000000e+00 + -2.200803097224683e+00 + -2.201611618154960e+00 + -2.202436152922896e+00 + -2.203276866629103e+00 + -2.204133924999999e+00 + -2.205007494076377e+00 + -2.205897739759803e+00 + -2.206804828380775e+00 + -2.207728927012060e+00 + -2.208670203000000e+00 + -2.209628824019662e+00 + -2.210604958519273e+00 + -2.211598775212799e+00 + -2.212610442959744e+00 + -2.213640131000000e+00 + -2.214688008997179e+00 + -2.215754247358006e+00 + -2.216839016713686e+00 + -2.217942487809252e+00 + -2.219064832000000e+00 + -2.220206221175054e+00 + -2.221366827800435e+00 + -2.222546824259503e+00 + -2.223746382727115e+00 + -2.224965677000000e+00 + -2.226204881636015e+00 + -2.227464170011377e+00 + -2.228743716360184e+00 + -2.230043696636770e+00 + -2.231364286000000e+00 + -2.232705659360148e+00 + -2.234067993079961e+00 + -2.235451464138931e+00 + -2.236856249856844e+00 + -2.238282527000000e+00 + -2.239730472524265e+00 + -2.241200265638654e+00 + -2.242692085287406e+00 + -2.244206109271373e+00 + -2.245742517000000e+00 + -2.247301488882056e+00 + -2.248883204910052e+00 + -2.250487845315945e+00 + -2.252115590911750e+00 + -2.253766623000000e+00 + -2.255441123360801e+00 + -2.257139274542631e+00 + -2.258861259219423e+00 + -2.260607260005651e+00 + -2.262377460000000e+00 + -2.264172042724291e+00 + -2.265991192137124e+00 + -2.267835092970031e+00 + -2.269703930922391e+00 + -2.271597891000000e+00 + -2.273517158096056e+00 + -2.275461918662951e+00 + -2.277432359442962e+00 + -2.279428667085979e+00 + -2.281451029000000e+00 + -2.283499633104788e+00 + -2.285574667389452e+00 + -2.287676320195930e+00 + -2.289804780398682e+00 + -2.291960237000000e+00 + -2.294142879454985e+00 + -2.296352898805551e+00 + -2.298590485768695e+00 + -2.300855830078550e+00 + -2.303149122999999e+00 + -2.305470556795997e+00 + -2.307820323545887e+00 + -2.310198615647936e+00 + -2.312605626084681e+00 + -2.315041548000000e+00 + -2.317506574745174e+00 + -2.320000900224320e+00 + -2.322524719122656e+00 + -2.325078227061991e+00 + -2.327661619000000e+00 + -2.330275089774933e+00 + -2.332918835677479e+00 + -2.335593053485966e+00 + -2.338297940187764e+00 + -2.341033693000000e+00 + -2.343800509406319e+00 + -2.346598587410773e+00 + -2.349428125303093e+00 + -2.352289321686241e+00 + -2.355182376000000e+00 + -2.358107488272472e+00 + -2.361064858786305e+00 + -2.364054687769198e+00 + -2.367077175375671e+00 + -2.370132523000000e+00 + -2.373220932737141e+00 + -2.376342606269360e+00 + -2.379497745810629e+00 + -2.382686554578887e+00 + -2.385909236000000e+00 + -2.389165993580208e+00 + -2.392457030846979e+00 + -2.395782552198058e+00 + -2.399142763298191e+00 + -2.402537869000000e+00 + -2.405968074028050e+00 + -2.409433584975734e+00 + -2.412934608682329e+00 + -2.416471351683178e+00 + -2.420044020999999e+00 + -2.423652824137149e+00 + -2.427297969206864e+00 + -2.430979664728804e+00 + -2.434698119632543e+00 + -2.438453543000000e+00 + -2.442246144168148e+00 + -2.446076133195298e+00 + -2.449943720571852e+00 + -2.453849117184546e+00 + -2.457792534000000e+00 + -2.461774182279110e+00 + -2.465794274341647e+00 + -2.469853022790889e+00 + -2.473950640299041e+00 + -2.478087340000000e+00 + -2.482263335430129e+00 + -2.486478840559030e+00 + -2.490734069661931e+00 + -2.495029237377275e+00 + -2.499364559000000e+00 + -2.503740250274207e+00 + -2.508156527124766e+00 + -2.512613605692700e+00 + -2.517111702474631e+00 + -2.521651035000000e+00 + -2.526231821279088e+00 + -2.530854278665131e+00 + -2.535518625205626e+00 + -2.540225080261870e+00 + -2.544973863000000e+00 + -2.549765192573217e+00 + -2.554599288888442e+00 + -2.559476372494764e+00 + -2.564396664604125e+00 + -2.569360386000000e+00 + -2.574367757513646e+00 + -2.579419001423863e+00 + -2.584514340338642e+00 + -2.589653996851589e+00 + -2.594838193999999e+00 + -2.600067155253186e+00 + -2.605341104662645e+00 + -2.610660266783872e+00 + -2.616024866689215e+00 + -2.621435129000000e+00 + -2.626891278432673e+00 + -2.632393541366548e+00 + -2.637942144571998e+00 + -2.643537314797249e+00 + -2.649179279000000e+00 + -2.654868264471787e+00 + -2.660604499292826e+00 + -2.666388211776204e+00 + -2.672219630341834e+00 + -2.678098984000000e+00 + -2.684026502306392e+00 + -2.690002415494505e+00 + -2.696026954017429e+00 + -2.702100348331385e+00 + -2.708222828000000e+00 + -2.714394620651795e+00 + -2.720615948464916e+00 + -2.726887030965477e+00 + -2.733208085290139e+00 + -2.739579324000000e+00 + -2.746000955816228e+00 + -2.752473185385865e+00 + -2.758996214641690e+00 + -2.765570242469367e+00 + -2.772195463000000e+00 + -2.778872066776275e+00 + -2.785600241574056e+00 + -2.792380171842594e+00 + -2.799212037606767e+00 + -2.806096015000000e+00 + -2.813032277129447e+00 + -2.820020994035244e+00 + -2.827062331911353e+00 + -2.834156451970738e+00 + -2.841303512999999e+00 + -2.848503671252426e+00 + -2.855757077985244e+00 + -2.863063881095023e+00 + -2.870424224890850e+00 + -2.877838249999999e+00 + -2.885306093928394e+00 + -2.892827890388094e+00 + -2.900403769651381e+00 + -2.908033857857018e+00 + -2.915718277999999e+00 + -2.923457150039019e+00 + -2.931250588977881e+00 + -2.939098706889091e+00 + -2.947001612872150e+00 + -2.954959411999998e+00 + -2.962972205810575e+00 + -2.971040091434060e+00 + -2.979163163083816e+00 + -2.987341511831155e+00 + -2.995575224999998e+00 + -3.003864386499012e+00 + -3.012209075546996e+00 + -3.020609368336417e+00 + -3.029065337835770e+00 + -3.037577052999999e+00 + -3.046144579520789e+00 + -3.054767979666142e+00 + -3.063447312238444e+00 + -3.072182631692820e+00 + -3.080973988999999e+00 + -3.089821432099915e+00 + -3.098725004829577e+00 + -3.107684748048404e+00 + -3.116700699185534e+00 + -3.125772890999999e+00 + -3.134901352715559e+00 + -3.144086110699870e+00 + -3.153327188100508e+00 + -3.162624603843408e+00 + -3.171978372999998e+00 + -3.181388507546933e+00 + -3.190855016073102e+00 + -3.200377903469057e+00 + -3.209957169965227e+00 + -3.219592812999998e+00 + -3.229284827363896e+00 + -3.239033203402719e+00 + -3.248837927724427e+00 + -3.258698982652799e+00 + -3.268616347999998e+00 + -3.278590000914418e+00 + -3.288619913401403e+00 + -3.298706054004673e+00 + -3.308848387625167e+00 + -3.319046875999998e+00 + -3.329301477934322e+00 + -3.339612147844228e+00 + -3.349978836592516e+00 + -3.360401490990458e+00 + -3.370880054999998e+00 + -3.381414469596773e+00 + -3.392004670266620e+00 + -3.402650589976440e+00 + -3.413352159446950e+00 + -3.424109303999998e+00 + -3.434921945057392e+00 + -3.445790001867386e+00 + -3.456713390096515e+00 + -3.467692020464062e+00 + -3.478725800999998e+00 + -3.489814636890736e+00 + -3.500958427789171e+00 + -3.512157070764700e+00 + -3.523410460589800e+00 + -3.534718486999998e+00 + -3.546081035880271e+00 + -3.557497990199610e+00 + -3.568969229634993e+00 + -3.580494629586285e+00 + -3.592074061999998e+00 + -3.603707395759104e+00 + -3.615394495446970e+00 + -3.627135222559569e+00 + -3.638929435115233e+00 + -3.650776987000000e+00 + -3.662677728742245e+00 + -3.674631507325805e+00 + -3.686638166579447e+00 + -3.698697546469576e+00 + -3.710809483000000e+00 + -3.722973808828209e+00 + -3.735190352595157e+00 + -3.747458940125227e+00 + -3.759779394010754e+00 + -3.772151532000000e+00 + -3.784575168342916e+00 + -3.797050115062026e+00 + -3.809576180292756e+00 + -3.822153166803174e+00 + -3.834780875000000e+00 + -3.847459102820189e+00 + -3.860187643203489e+00 + -3.872966285667494e+00 + -3.885794816080159e+00 + -3.898673017000000e+00 + -3.911600667911320e+00 + -3.924577543724543e+00 + -3.937603416269590e+00 + -3.950678053996523e+00 + -3.963801221000000e+00 + -3.976972678103186e+00 + -3.990192183512261e+00 + -4.003459491521890e+00 + -4.016774351164608e+00 + -4.030136509000000e+00 + -4.043545709147031e+00 + -4.057001691149858e+00 + -4.070504190840202e+00 + -4.084052939835804e+00 + -4.097647667000000e+00 + -4.111288098419088e+00 + -4.124973955231095e+00 + -4.138704955371648e+00 + -4.152480813397504e+00 + -4.166301240000000e+00 + -4.180165942572286e+00 + -4.194074624537170e+00 + -4.208026986370140e+00 + -4.222022725101974e+00 + -4.236061533000000e+00 + -4.250143098846027e+00 + -4.264267108996074e+00 + -4.278433246261039e+00 + -4.292641188627767e+00 + -4.306890611000000e+00 + -4.321181185386233e+00 + -4.335512579090955e+00 + -4.349884456391911e+00 + -4.364296478350024e+00 + -4.378748302000000e+00 + -4.393239580901771e+00 + -4.407769964394226e+00 + -4.422339098999587e+00 + -4.436946628138934e+00 + -4.451592191000000e+00 + -4.466275423153566e+00 + -4.480995955945297e+00 + -4.495753418053649e+00 + -4.510547435209278e+00 + -4.525377628000000e+00 + -4.540243613376725e+00 + -4.555145006346341e+00 + -4.570081418154680e+00 + -4.585052454714511e+00 + -4.600057719000000e+00 + -4.615096811360685e+00 + -4.630169328028963e+00 + -4.645274861878902e+00 + -4.660413001844071e+00 + -4.675583333000000e+00 + -4.690785437259527e+00 + -4.706018892955582e+00 + -4.721283275134317e+00 + -4.736578154793736e+00 + -4.751903099000000e+00 + -4.767257671719769e+00 + -4.782641433752779e+00 + -4.798053942304498e+00 + -4.813494749953581e+00 + -4.828963406000000e+00 + -4.844459456896403e+00 + -4.859982445123970e+00 + -4.875531909767719e+00 + -4.891107385884028e+00 + -4.906708405000000e+00 + -4.922334495555203e+00 + -4.937985181840751e+00 + -4.953659984814029e+00 + -4.969358421588884e+00 + -4.985080006000000e+00 + -5.000824248840914e+00 + -5.016590656340991e+00 + -5.032378731598668e+00 + -5.048187974277996e+00 + -5.064017880000000e+00 + -5.079867940973151e+00 + -5.095737645459726e+00 + -5.111626480823102e+00 + -5.127533934923204e+00 + -5.143459499999997e+00 + -5.159402672483111e+00 + -5.175362954369220e+00 + -5.191339851303958e+00 + -5.207332872891304e+00 + -5.223341533999998e+00 + -5.239365353688981e+00 + -5.255403855076862e+00 + -5.271456565155025e+00 + -5.287523015792912e+00 + -5.303602743999997e+00 + -5.319695290809813e+00 + -5.335800201177900e+00 + -5.351917023850607e+00 + -5.368045312413205e+00 + -5.384184625999997e+00 + -5.400334527792659e+00 + -5.416494583936292e+00 + -5.432664365069262e+00 + -5.448843447960337e+00 + -5.465031412999998e+00 + -5.481227843963791e+00 + -5.497432330198948e+00 + -5.513644465003656e+00 + -5.529863846001168e+00 + -5.546090074999998e+00 + -5.562322757794160e+00 + -5.578561506278419e+00 + -5.594805935740466e+00 + -5.611055664858841e+00 + -5.627310317999997e+00 + -5.643569523867812e+00 + -5.659832914603254e+00 + -5.676100126691991e+00 + -5.692370802379017e+00 + -5.708644587999997e+00 + -5.724921133351554e+00 + -5.741200092816319e+00 + -5.757481124931912e+00 + -5.773763893288205e+00 + -5.790048065999996e+00 + -5.806333315035348e+00 + -5.822619317227983e+00 + -5.838905753168464e+00 + -5.855192307810226e+00 + -5.871478670999998e+00 + -5.887764536642293e+00 + -5.904049603224381e+00 + -5.920333573291820e+00 + -5.936616154283948e+00 + -5.952897057999997e+00 + -5.969175999997380e+00 + -5.985452700712029e+00 + -6.001726884408804e+00 + -6.017998279848357e+00 + -6.034266620999998e+00 + -6.050531645917840e+00 + -6.066793096565948e+00 + -6.083050719154321e+00 + -6.099304265265417e+00 + -6.115553489999997e+00 + -6.131798152082848e+00 + -6.148038016850530e+00 + -6.164272852974367e+00 + -6.180502432221914e+00 + -6.196726531999996e+00 + -6.212944934149927e+00 + -6.229157424398349e+00 + -6.245363792906498e+00 + -6.261563835474968e+00 + -6.277757350999996e+00 + -6.293944141712862e+00 + -6.310124016459128e+00 + -6.326296787703612e+00 + -6.342462271423720e+00 + -6.358620288999997e+00 + -6.374770666045148e+00 + -6.390913231950829e+00 + -6.407047820441565e+00 + -6.423174270811367e+00 + -6.439292425999997e+00 + -6.455402132459349e+00 + -6.471503242529590e+00 + -6.487595612302881e+00 + -6.503679101824962e+00 + -6.519753575999998e+00 + -6.535818903908587e+00 + -6.551874959678351e+00 + -6.567921621040533e+00 + -6.583958769810407e+00 + -6.599986292999997e+00 + -6.616004081814032e+00 + -6.632012031732002e+00 + -6.648010042213294e+00 + -6.663998017633650e+00 + -6.679975866999997e+00 + -6.695943503153600e+00 + -6.711900843425355e+00 + -6.727847809100131e+00 + -6.743784326279565e+00 + -6.759710325999998e+00 + -6.775625743222601e+00 + -6.791530516957345e+00 + -6.807424590371784e+00 + -6.823307911868753e+00 + -6.839180434000000e+00 + -6.855042113095231e+00 + -6.870892911056689e+00 + -6.886732793343159e+00 + -6.902561729209182e+00 + -6.918379693000000e+00 + -6.934186663377454e+00 + -6.949982623974822e+00 + -6.965767562024019e+00 + -6.981541468861679e+00 + -6.997304341000000e+00 + -7.013056179149240e+00 + -7.028796988372566e+00 + -7.044526777567921e+00 + -7.060245560311449e+00 + -7.075953355000000e+00 + -7.091650184045992e+00 + -7.107336074531737e+00 + -7.123011057484204e+00 + -7.138675168614964e+00 + -7.154328448000000e+00 + -7.169970939523060e+00 + -7.185602692089082e+00 + -7.201223758621499e+00 + -7.216834196750369e+00 + -7.232434069000000e+00 + -7.248023441650831e+00 + -7.263602384451917e+00 + -7.279170972021925e+00 + -7.294729285389790e+00 + -7.310277408000000e+00 + -7.325815426345584e+00 + -7.341343434315181e+00 + -7.356861529294433e+00 + -7.372369811668458e+00 + -7.387868387000000e+00 + -7.403357365322682e+00 + -7.418836861854650e+00 + -7.434306995371617e+00 + -7.449767888578398e+00 + -7.465219669000000e+00 + -7.480662468362842e+00 + -7.496096423635060e+00 + -7.511521675509539e+00 + -7.526938368822738e+00 + -7.542346653000000e+00 + -7.557746681513402e+00 + -7.573138613106206e+00 + -7.588522610348394e+00 + -7.603898840111169e+00 + -7.619267474000000e+00 + -7.634628687556104e+00 + -7.649982660818226e+00 + -7.665329578157865e+00 + -7.680669629212444e+00 + -7.696003007000000e+00 + -7.711329908041110e+00 + -7.726650535322031e+00 + -7.741965095546557e+00 + -7.757273799081691e+00 + -7.772576861000000e+00 + -7.787874500482072e+00 + -7.803166941820082e+00 + -7.818454413357075e+00 + -7.833737148083599e+00 + -7.849015383000000e+00 + -7.864289358883056e+00 + -7.879559322305754e+00 + -7.894825523493435e+00 + -7.910088216491122e+00 + -7.925347660000000e+00 + -7.940604117030949e+00 + -7.955857856656654e+00 + -7.971109151088187e+00 + -7.986358275553978e+00 + -8.001605510999999e+00 + -8.016851143003514e+00 + -8.032095461580266e+00 + -8.047338760488806e+00 + -8.062581337981985e+00 + -8.077823497000001e+00 + -8.093065544394179e+00 + -8.108307791577566e+00 + -8.123550554205780e+00 + -8.138794153086785e+00 + -8.154038912999997e+00 + -8.169285162395173e+00 + -8.184533235306290e+00 + -8.199783469410583e+00 + -8.215036206329255e+00 + -8.230291792999997e+00 + -8.245550580528674e+00 + -8.260812923863309e+00 + -8.276079182235739e+00 + -8.291349720375887e+00 + -8.306624906999998e+00 + -8.321905114401627e+00 + -8.337190720129563e+00 + -8.352482105562956e+00 + -8.367779656388556e+00 + -8.383083762999997e+00 + -8.398394819954635e+00 + -8.413713227271362e+00 + -8.429039388338369e+00 + -8.444373710123081e+00 + -8.459716604999997e+00 + -8.475068489773328e+00 + -8.490429785807564e+00 + -8.505800918193746e+00 + -8.521182316459129e+00 + -8.536574414999997e+00 + -8.551977652264261e+00 + -8.567392471335332e+00 + -8.582819319266729e+00 + -8.598258647834163e+00 + -8.613710912999998e+00 + -8.629176574613023e+00 + -8.644656098315155e+00 + -8.660149953296175e+00 + -8.675658612460374e+00 + -8.691182553999997e+00 + -8.706722260346437e+00 + -8.722278218076596e+00 + -8.737850917931995e+00 + -8.753440855866357e+00 + -8.769048531999996e+00 + -8.784674450012169e+00 + -8.800319118245726e+00 + -8.815983049456063e+00 + -8.831666761752983e+00 + -8.847370776999997e+00 + -8.863095620572640e+00 + -8.878841823409489e+00 + -8.894609920288579e+00 + -8.910400450202564e+00 + -8.926213956999996e+00 + -8.942050988642462e+00 + -8.957912097948702e+00 + -8.973797841249739e+00 + -8.989708778929735e+00 + -9.005645476999996e+00 + -9.021608505891232e+00 + -9.037598440089864e+00 + -9.053615857732957e+00 + -9.069661341483132e+00 + -9.085735478999997e+00 + -9.101838862125330e+00 + -9.117972087538210e+00 + -9.134135755396374e+00 + -9.150330469883286e+00 + -9.166556840999997e+00 + -9.182815483079517e+00 + -9.199107013675079e+00 + -9.215432054583626e+00 + -9.231791233265957e+00 + -9.248185180999997e+00 + -9.264614532683632e+00 + -9.281079929109534e+00 + -9.297582014702897e+00 + -9.314121437654787e+00 + -9.330698850999996e+00 + -9.347314912003528e+00 + -9.363970283188971e+00 + -9.380665630745685e+00 + -9.397401624940878e+00 + -9.414178940999998e+00 + -9.430998258244742e+00 + -9.447860260503859e+00 + -9.464765635761319e+00 + -9.481715077019253e+00 + -9.498709280999996e+00 + -9.515748948037771e+00 + -9.532834784442173e+00 + -9.549967500513571e+00 + -9.567147810785697e+00 + -9.584376433999996e+00 + -9.601654092679016e+00 + -9.618981514566920e+00 + -9.636359431588877e+00 + -9.653788580476306e+00 + -9.671269701999998e+00 + -9.688803540653204e+00 + -9.706390846469759e+00 + -9.724032373152683e+00 + -9.741728878390186e+00 + -9.759481124999997e+00 + -9.777289880050315e+00 + -9.795155915261526e+00 + -9.813080006095444e+00 + -9.831062932433847e+00 + -9.849105478999997e+00 + -9.867208434586416e+00 + -9.885372592754736e+00 + -9.903598750780114e+00 + -9.921887710289466e+00 + -9.940240277999996e+00 + -9.958657264807959e+00 + -9.977139486156000e+00 + -9.995687760994512e+00 + -1.001430291248964e+01 + -1.003298577000000e+01 + -1.005173716741557e+01 + -1.007055794170109e+01 + -1.008944893313717e+01 + -1.010841098632109e+01 + -1.012744495000000e+01 + -1.014655167843811e+01 + -1.016573203809090e+01 + -1.018498689280856e+01 + -1.020431709913334e+01 + -1.022372353000000e+01 + -1.024320706932260e+01 + -1.026276860085199e+01 + -1.028240900753776e+01 + -1.030212917226508e+01 + -1.032192999000000e+01 + -1.034181236270672e+01 + -1.036177718920571e+01 + -1.038182537682789e+01 + -1.040195784652257e+01 + -1.042217551000000e+01 + -1.044247927800797e+01 + -1.046287008429113e+01 + -1.048334886197221e+01 + -1.050391653528098e+01 + -1.052457404000000e+01 + -1.054532232135862e+01 + -1.056616233045517e+01 + -1.058709501821704e+01 + -1.060812133414642e+01 + -1.062924224000000e+01 + -1.065045870478386e+01 + -1.067177169452023e+01 + -1.069318217826154e+01 + -1.071469113174534e+01 + -1.073629954000000e+01 + -1.075800839260036e+01 + -1.077981867489276e+01 + -1.080173138018267e+01 + -1.082374751517595e+01 + -1.084586808000000e+01 + -1.086809407471729e+01 + -1.089042651905600e+01 + -1.091286643223940e+01 + -1.093541482646511e+01 + -1.095807273000000e+01 + -1.098084118002027e+01 + -1.100372120627546e+01 + -1.102671384288809e+01 + -1.104982013415814e+01 + -1.107304113000000e+01 + -1.109637788366843e+01 + -1.111983144958023e+01 + -1.114340288661973e+01 + -1.116709326043168e+01 + -1.119090364000000e+01 + -1.121483509746141e+01 + -1.123888871051257e+01 + -1.126306556352589e+01 + -1.128736674843474e+01 + -1.131179335000000e+01 + -1.133634645465832e+01 + -1.136102717560643e+01 + -1.138583662099362e+01 + -1.141077588304154e+01 + -1.143584608000000e+01 + -1.146104834278586e+01 + -1.148638378227322e+01 + -1.151185351768562e+01 + -1.153745868860526e+01 + -1.156320043000000e+01 + -1.158907987623694e+01 + -1.161509817570602e+01 + -1.164125647703402e+01 + -1.166755592508495e+01 + -1.169399768000000e+01 + -1.172058291041322e+01 + -1.174731277861368e+01 + -1.177418844974534e+01 + -1.180121109657743e+01 + -1.182838189999999e+01 + -1.185570204579555e+01 + -1.188317272006268e+01 + -1.191079511332836e+01 + -1.193857042312863e+01 + -1.196649984999999e+01 + -1.199458459773775e+01 + -1.202282587700695e+01 + -1.205122490269986e+01 + -1.207978289369385e+01 + -1.210850107000000e+01 + -1.213738065440104e+01 + -1.216642287877588e+01 + -1.219562898067898e+01 + -1.222500020303083e+01 + -1.225453779000000e+01 + -1.228424298812801e+01 + -1.231411705144751e+01 + -1.234416123799292e+01 + -1.237437680934280e+01 + -1.240476502999999e+01 + -1.243532716862228e+01 + -1.246606450371358e+01 + -1.249697831672881e+01 + -1.252806989018327e+01 + -1.255934050999999e+01 + -1.259079146663310e+01 + -1.262242406008652e+01 + -1.265423959346900e+01 + -1.268623937120698e+01 + -1.271842469999999e+01 + -1.275079689157634e+01 + -1.278335727210730e+01 + -1.281610716656313e+01 + -1.284904789393346e+01 + -1.288218078999999e+01 + -1.291550719883721e+01 + -1.294902845305343e+01 + -1.298274589252790e+01 + -1.301666087289315e+01 + -1.305077474999999e+01 + -1.308508888000826e+01 + -1.311960462335401e+01 + -1.315432334734565e+01 + -1.318924642810263e+01 + -1.322437523999999e+01 + -1.325971115825294e+01 + -1.329525556797775e+01 + -1.333100986045822e+01 + -1.336697543256989e+01 + -1.340315367999999e+01 + -1.343954599979837e+01 + -1.347615379884262e+01 + -1.351297848978655e+01 + -1.355002149050285e+01 + -1.358728421999999e+01 + -1.362476809975143e+01 + -1.366247455932581e+01 + -1.370040503112116e+01 + -1.373856094968169e+01 + -1.377694375999999e+01 + -1.381555491216690e+01 + -1.385439585021465e+01 + -1.389346802391279e+01 + -1.393277289476898e+01 + -1.397231192999999e+01 + -1.401208659972945e+01 + -1.405209837359219e+01 + -1.409234872413346e+01 + -1.413283912961124e+01 + -1.417357107999999e+01 + -1.421454607102127e+01 + -1.425576559243092e+01 + -1.429723113890712e+01 + -1.433894421536596e+01 + -1.438090632999999e+01 + -1.442311899332400e+01 + -1.446558371903957e+01 + -1.450830202765583e+01 + -1.455127544879836e+01 + -1.459450550999999e+01 + -1.463799373973040e+01 + -1.468174167767078e+01 + -1.472575086722947e+01 + -1.477002285383887e+01 + -1.481455918999999e+01 + -1.485936143285468e+01 + -1.490443114031971e+01 + -1.494976987417127e+01 + -1.499537920245961e+01 + -1.504126069999999e+01 + -1.508741594534576e+01 + -1.513384651602358e+01 + -1.518055399754435e+01 + -1.522753998778076e+01 + -1.527480607999999e+01 + -1.532235386668537e+01 + -1.537018495189360e+01 + -1.541830094448208e+01 + -1.546670345694024e+01 + -1.551539410999999e+01 + -1.556437452805486e+01 + -1.561364632974880e+01 + -1.566321114034704e+01 + -1.571307059764629e+01 + -1.576322633999999e+01 + -1.581368000886133e+01 + -1.586443325932826e+01 + -1.591548774371123e+01 + -1.596684510633198e+01 + -1.601850700999999e+01 + -1.607047512763592e+01 + -1.612275112310131e+01 + -1.617533666634843e+01 + -1.622823344044972e+01 + -1.628144312999999e+01 + -1.633496741991010e+01 + -1.638880799548294e+01 + -1.644296655089035e+01 + -1.649744479372194e+01 + -1.655224442999999e+01 + -1.660736716535794e+01 + -1.666281471098534e+01 + -1.671858878335293e+01 + -1.677469110504862e+01 + -1.683112339999999e+01 + -1.688788739643611e+01 + -1.694498483759857e+01 + -1.700241746523662e+01 + -1.706018701398879e+01 + -1.711829522999999e+01 + -1.717674386844329e+01 + -1.723553468924849e+01 + -1.729466945458232e+01 + -1.735414992865347e+01 + -1.741397788000000e+01 + -1.747415508099178e+01 + -1.753468330867943e+01 + -1.759556434768274e+01 + -1.765679999203036e+01 + -1.771839203000000e+01 + -1.778034225038387e+01 + -1.784265246094084e+01 + -1.790532446959567e+01 + -1.796836007816754e+01 + -1.803176110000000e+01 + -1.809552935720682e+01 + -1.815966667575656e+01 + -1.822417488078262e+01 + -1.828905579597735e+01 + -1.835431126000000e+01 + -1.841994311958100e+01 + -1.848595321475806e+01 + -1.855234338946741e+01 + -1.861911549709020e+01 + -1.868627140000000e+01 + -1.875381296458075e+01 + -1.882174205218422e+01 + -1.889006052915166e+01 + -1.895877027181235e+01 + -1.902787316000000e+01 + -1.909737107797965e+01 + -1.916726592078253e+01 + -1.923755957952593e+01 + -1.930825393714747e+01 + -1.937935090000000e+01 + -1.945085238647674e+01 + -1.952276030080435e+01 + -1.959507655061933e+01 + -1.966780305499929e+01 + -1.974094174000000e+01 + -1.981449453618971e+01 + -1.988846337667131e+01 + -1.996285019538828e+01 + -2.003765692760933e+01 + -2.011288552000000e+01 + -2.018853792621815e+01 + -2.026461609876727e+01 + -2.034112199510926e+01 + -2.041805758075517e+01 + -2.049542482000000e+01 + -2.057322568006621e+01 + -2.065146214471047e+01 + -2.073013619484967e+01 + -2.080924980240138e+01 + -2.088880495999999e+01 + -2.096880367169853e+01 + -2.104924793164823e+01 + -2.113013973534757e+01 + -2.121148108557274e+01 + -2.129327399999999e+01 + -2.137552050224973e+01 + -2.145822260294134e+01 + -2.154138232011573e+01 + -2.162500168821614e+01 + -2.170908273999999e+01 + -2.179362750931509e+01 + -2.187863804236205e+01 + -2.196411638687395e+01 + -2.205006458870765e+01 + -2.213648469999998e+01 + -2.222337877888525e+01 + -2.231074889087196e+01 + -2.239859710699802e+01 + -2.248692550346576e+01 + -2.257573614999999e+01 + -2.266503111825121e+01 + -2.275481250533621e+01 + -2.284508240538831e+01 + -2.293584289979252e+01 + -2.302709608999998e+01 + -2.311884408797131e+01 + -2.321108899308483e+01 + -2.330383291176923e+01 + -2.339707796636268e+01 + -2.349082627999998e+01 + -2.358507997580010e+01 + -2.367984117841246e+01 + -2.377511201965127e+01 + -2.387089464198777e+01 + -2.396719118999998e+01 + -2.406400380890314e+01 + -2.416133464354705e+01 + -2.425918584868402e+01 + -2.435755959379285e+01 + -2.445645803999998e+01 + -2.455588334675619e+01 + -2.465583769169985e+01 + -2.475632325621871e+01 + -2.485734222078360e+01 + -2.495889676999998e+01 + -2.506098909313465e+01 + -2.516362138717989e+01 + -2.526679585042222e+01 + -2.537051468121954e+01 + -2.547478008999998e+01 + -2.557959429416147e+01 + -2.568495950782481e+01 + -2.579087794894506e+01 + -2.589735184307986e+01 + -2.600438342000000e+01 + -2.611197491414786e+01 + -2.622012856937007e+01 + -2.632884662779481e+01 + -2.643813132670684e+01 + -2.654798492000000e+01 + -2.665840967182968e+01 + -2.676940784333127e+01 + -2.688098169572292e+01 + -2.699313349264397e+01 + -2.710586551000000e+01 + -2.721918002998715e+01 + -2.733307932892397e+01 + -2.744756569229334e+01 + -2.756264142140602e+01 + -2.767830881000000e+01 + -2.779457014947893e+01 + -2.791142774510221e+01 + -2.802888390934165e+01 + -2.814694096000261e+01 + -2.826560121000000e+01 + -2.838486697334714e+01 + -2.850474058224100e+01 + -2.862522436986088e+01 + -2.874632066501767e+01 + -2.886803181000000e+01 + -2.899036015446983e+01 + -2.911330804180568e+01 + -2.923687781925054e+01 + -2.936107184331833e+01 + -2.948589248000000e+01 + -2.961134209910011e+01 + -2.973742306338333e+01 + -2.986413774439124e+01 + -2.999148852946843e+01 + -3.011947780000000e+01 + -3.024810793640462e+01 + -3.037738133418102e+01 + -3.050730039248281e+01 + -3.063786751048302e+01 + -3.076908508999995e+01 + -3.090095553801825e+01 + -3.103348127528379e+01 + -3.116666472242296e+01 + -3.130050829541340e+01 + -3.143501442000000e+01 + -3.157018552904646e+01 + -3.170602405762165e+01 + -3.184253244456109e+01 + -3.197971313442012e+01 + -3.211756857999995e+01 + -3.225610123724459e+01 + -3.239531355479052e+01 + -3.253520799120049e+01 + -3.267578702273956e+01 + -3.281705312000000e+01 + -3.295900875199519e+01 + -3.310165640007095e+01 + -3.324499854981137e+01 + -3.338903768896250e+01 + -3.353377630999994e+01 + -3.367921690900354e+01 + -3.382536198480008e+01 + -3.397221404252836e+01 + -3.411977559608952e+01 + -3.426804916000000e+01 + -3.441703725062087e+01 + -3.456674239208418e+01 + -3.471716711255165e+01 + -3.486831394366235e+01 + -3.502018541999994e+01 + -3.517278408030963e+01 + -3.532611247314257e+01 + -3.548017315006599e+01 + -3.563496866378715e+01 + -3.579050157000000e+01 + -3.594677442911821e+01 + -3.610378981290209e+01 + -3.626155029281482e+01 + -3.642005843692588e+01 + -3.657931682999995e+01 + -3.673932806450152e+01 + -3.690009471994529e+01 + -3.706161938636306e+01 + -3.722390467398576e+01 + -3.738695318000000e+01 + -3.755076749872251e+01 + -3.771535025114206e+01 + -3.788070405790332e+01 + -3.804683152981476e+01 + -3.821373528999994e+01 + -3.838141797088579e+01 + -3.854988220802454e+01 + -3.871913063690455e+01 + -3.888916589260551e+01 + -3.905999062000000e+01 + -3.923160747217621e+01 + -3.940401910958111e+01 + -3.957722819105772e+01 + -3.975123737141870e+01 + -3.992604931999993e+01 + -4.010166671506960e+01 + -4.027809223215413e+01 + -4.045532854769397e+01 + -4.063337834194039e+01 + -4.081224431000000e+01 + -4.099192915380458e+01 + -4.117243556512365e+01 + -4.135376624213356e+01 + -4.153592389680070e+01 + -4.171891123999993e+01 + -4.190273098404973e+01 + -4.208738585293229e+01 + -4.227287857304115e+01 + -4.245921187066173e+01 + -4.264638848000000e+01 + -4.283441114000928e+01 + -4.302328258823673e+01 + -4.321300556988346e+01 + -4.340358284230594e+01 + -4.359501715999993e+01 + -4.378731127802528e+01 + -4.398046796379431e+01 + -4.417448998677844e+01 + -4.436938011574802e+01 + -4.456514113000000e+01 + -4.476177581459606e+01 + -4.495928695037842e+01 + -4.515767732491430e+01 + -4.535694973791337e+01 + -4.555710698999992e+01 + -4.575815188265746e+01 + -4.596008722124420e+01 + -4.616291581815827e+01 + -4.636664049491562e+01 + -4.657126407000000e+01 + -4.677678936329625e+01 + -4.698321921012249e+01 + -4.719055644645270e+01 + -4.739880390447049e+01 + -4.760796442999992e+01 + -4.781804087601476e+01 + -4.802903608806237e+01 + -4.824095291782189e+01 + -4.845379422957746e+01 + -4.866756289000000e+01 + -4.888226176793614e+01 + -4.909789373759357e+01 + -4.931446167624577e+01 + -4.953196846445736e+01 + -4.975041698999991e+01 + -4.996981014490353e+01 + -5.019015082042799e+01 + -5.041144191483806e+01 + -5.063368633767777e+01 + -5.085688700000000e+01 + -5.108104681363623e+01 + -5.130616869222998e+01 + -5.153225555529192e+01 + -5.175931033093434e+01 + -5.198733594999992e+01 + -5.221633534632925e+01 + -5.244631146064819e+01 + -5.267726723814258e+01 + -5.290920562821528e+01 + -5.314212958000000e+01 + -5.337604204603855e+01 + -5.361094599406351e+01 + -5.384684439089011e+01 + -5.408374019738633e+01 + -5.432163638999991e+01 + -5.456053595406303e+01 + -5.480044186892415e+01 + -5.504135712069162e+01 + -5.528328470761400e+01 + -5.552622762000000e+01 + -5.577018884907901e+01 + -5.601517141284037e+01 + -5.626117832498171e+01 + -5.650821258404100e+01 + -5.675627720999991e+01 + -5.700537523542541e+01 + -5.725550968441112e+01 + -5.750668358361924e+01 + -5.775889996777224e+01 + -5.801216188000000e+01 + -5.826647236807500e+01 + -5.852183447842080e+01 + -5.877825126017432e+01 + -5.903572576827786e+01 + -5.929426106999990e+01 + -5.955386023803142e+01 + -5.981452633626228e+01 + -6.007626243395679e+01 + -6.033907161265666e+01 + -6.060295696000000e+01 + -6.086792156620618e+01 + -6.113396851889991e+01 + -6.140110091270849e+01 + -6.166932185413050e+01 + -6.193863444999990e+01 + -6.220904180836374e+01 + -6.248054704389698e+01 + -6.275315327303672e+01 + -6.302686361375484e+01 + -6.330168120000000e+01 + -6.357760917255472e+01 + -6.385465065869710e+01 + -6.413280879313753e+01 + -6.441208672717147e+01 + -6.469248761000000e+01 + -6.497401459207148e+01 + -6.525667083785252e+01 + -6.554045951020694e+01 + -6.582538376572784e+01 + -6.611144677999999e+01 + -6.639865173804421e+01 + -6.668700181225154e+01 + -6.697650018322166e+01 + -6.726715004865791e+01 + -6.755895460000001e+01 + -6.785191702754956e+01 + -6.814604053706709e+01 + -6.844132833746227e+01 + -6.873778363702108e+01 + -6.903540965000001e+01 + -6.933420959649558e+01 + -6.963418670433917e+01 + -6.993534420146086e+01 + -7.023768531400407e+01 + -7.054121327999999e+01 + -7.084593134500037e+01 + -7.115184275353549e+01 + -7.145895075432828e+01 + -7.176725860332733e+01 + -7.207676955999989e+01 + -7.238748688676215e+01 + -7.269941385037480e+01 + -7.301255372170849e+01 + -7.332690977697268e+01 + -7.364248530000000e+01 + -7.395928357816831e+01 + -7.427730789465394e+01 + -7.459656154154558e+01 + -7.491704782593285e+01 + -7.523877004999987e+01 + -7.556173151464178e+01 + -7.588593553169946e+01 + -7.621138541944168e+01 + -7.653808450163682e+01 + -7.686603610000000e+01 + -7.719524353805981e+01 + -7.752571015313293e+01 + -7.785743928572181e+01 + -7.819043427631229e+01 + -7.852469846999988e+01 + -7.886023521608357e+01 + -7.919704786882774e+01 + -7.953513978918475e+01 + -7.987451434652237e+01 + -8.021517491000000e+01 + -8.055712484895521e+01 + -8.090036753598372e+01 + -8.124490635250547e+01 + -8.159074469172391e+01 + -8.193788593999987e+01 + -8.228633348416081e+01 + -8.263609073313938e+01 + -8.298716109541151e+01 + -8.333954797103145e+01 + -8.369325477000000e+01 + -8.404828491028280e+01 + -8.440464181412719e+01 + -8.476232890793086e+01 + -8.512134962287996e+01 + -8.548170738999985e+01 + -8.584340564352934e+01 + -8.620644783199920e+01 + -8.657083740482393e+01 + -8.693657780824788e+01 + -8.730367250000000e+01 + -8.767212494371194e+01 + -8.804193859639375e+01 + -8.841311692593891e+01 + -8.878566341870939e+01 + -8.915958154999986e+01 + -8.953487479168578e+01 + -8.991154663471849e+01 + -9.028960057395298e+01 + -9.066904010318096e+01 + -9.104986872000001e+01 + -9.143208992686800e+01 + -9.181570723560402e+01 + -9.220072416114067e+01 + -9.258714421980083e+01 + -9.297497092999986e+01 + -9.336420781525349e+01 + -9.375485841426487e+01 + -9.414692626313253e+01 + -9.454041488965315e+01 + -9.493532784000000e+01 + -9.533166867059026e+01 + -9.572944092950100e+01 + -9.612864816948191e+01 + -9.652929395407540e+01 + -9.693138184999984e+01 + -9.733491542620831e+01 + -9.773989825487583e+01 + -9.814633391500892e+01 + -9.855422599474231e+01 + -9.896357808000000e+01 + -9.937439375553778e+01 + -9.978667660951464e+01 + -1.002004302498873e+02 + -1.006156583113964e+02 + -1.010323643999998e+02 + -1.014505521033422e+02 + -1.018702250167552e+02 + -1.022913867648504e+02 + -1.027140410123223e+02 + -1.031381914000000e+02 + -1.035638415489902e+02 + -1.039909950728156e+02 + -1.044196556182856e+02 + -1.048498268814360e+02 + -1.052815124999998e+02 + -1.057147160851634e+02 + -1.061494413040264e+02 + -1.065856918490972e+02 + -1.070234714266025e+02 + -1.074627837000000e+02 + -1.079036323073108e+02 + -1.083460208994117e+02 + -1.087899531790557e+02 + -1.092354329168266e+02 + -1.096824637999998e+02 + -1.101310494754678e+02 + -1.105811936593542e+02 + -1.110329000832090e+02 + -1.114861724712110e+02 + -1.119410145000000e+02 + -1.123974298499644e+02 + -1.128554223365672e+02 + -1.133149957276709e+02 + -1.137761536721920e+02 + -1.142388998999998e+02 + -1.147032381951767e+02 + -1.151691723223398e+02 + -1.156367060267053e+02 + -1.161058430340008e+02 + -1.165765871000000e+02 + -1.170489420136372e+02 + -1.175229116129598e+02 + -1.179984996644491e+02 + -1.184757098197581e+02 + -1.189545458999998e+02 + -1.194350118004852e+02 + -1.199171112501401e+02 + -1.204008480035419e+02 + -1.208862259161727e+02 + -1.213732488000000e+02 + -1.218619204419225e+02 + -1.223522446637547e+02 + -1.228442252993658e+02 + -1.233378661832514e+02 + -1.238331710999998e+02 + -1.243301438371392e+02 + -1.248287883218059e+02 + -1.253291084262349e+02 + -1.258311078947497e+02 + -1.263347906000000e+02 + -1.268401604692280e+02 + -1.273472212887372e+02 + -1.278559768940106e+02 + -1.283664312433523e+02 + -1.288785881999998e+02 + -1.293924515790011e+02 + -1.299080252758494e+02 + -1.304253131892150e+02 + -1.309443191941241e+02 + -1.314650472000000e+02 + -1.319875011267033e+02 + -1.325116848422910e+02 + -1.330376022476014e+02 + -1.335652573069860e+02 + -1.340946538999998e+02 + -1.346257958892211e+02 + -1.351586873010075e+02 + -1.356933320835031e+02 + -1.362297340185993e+02 + -1.367678971000000e+02 + -1.373078254089903e+02 + -1.378495227933144e+02 + -1.383929931342302e+02 + -1.389382404506380e+02 + -1.394852686999998e+02 + -1.400340818144768e+02 + -1.405846838138316e+02 + -1.411370786853171e+02 + -1.416912703410207e+02 + -1.422472628000000e+02 + -1.428050601118040e+02 + -1.433646661562381e+02 + -1.439260848884736e+02 + -1.444893204354731e+02 + -1.450543767999998e+02 + -1.456212579173106e+02 + -1.461899678121767e+02 + -1.467605105156440e+02 + -1.473328900351724e+02 + -1.479071104000000e+02 + -1.484831756560318e+02 + -1.490610898537698e+02 + -1.496408570188282e+02 + -1.502224811435522e+02 + -1.508059663000000e+02 + -1.513913165938295e+02 + -1.519785360517816e+02 + -1.525676287092765e+02 + -1.531585986433134e+02 + -1.537514498999998e+02 + -1.543461865304275e+02 + -1.549428126935839e+02 + -1.555413324987964e+02 + -1.561417499433451e+02 + -1.567440691000000e+02 + -1.573482940967384e+02 + -1.579544290618548e+02 + -1.585624781173004e+02 + -1.591724453723425e+02 + -1.597843348999998e+02 + -1.603981507727703e+02 + -1.610138971515657e+02 + -1.616315781879854e+02 + -1.622511979884414e+02 + -1.628727607000000e+02 + -1.634962704824068e+02 + -1.641217314319286e+02 + -1.647491476962519e+02 + -1.653785235159056e+02 + -1.660098629999998e+02 + -1.666431702132707e+02 + -1.672784494025457e+02 + -1.679157047805161e+02 + -1.685549404452619e+02 + -1.691961606000000e+02 + -1.698393694891200e+02 + -1.704845712252935e+02 + -1.711317699673001e+02 + -1.717809699904770e+02 + -1.724321754999998e+02 + -1.730853906636835e+02 + -1.737406197069920e+02 + -1.743978668390772e+02 + -1.750571362267288e+02 + -1.757184321000000e+02 + -1.763817587329360e+02 + -1.770471204015179e+02 + -1.777145213342737e+02 + -1.783839656916257e+02 + -1.790554576999997e+02 + -1.797290016348361e+02 + -1.804046017812607e+02 + -1.810822624074922e+02 + -1.817619877551305e+02 + -1.824437821000000e+02 + -1.831276497291853e+02 + -1.838135948809234e+02 + -1.845016218201234e+02 + -1.851917348679873e+02 + -1.858839382999998e+02 + -1.865782363787204e+02 + -1.872746334451072e+02 + -1.879731338116912e+02 + -1.886737417231232e+02 + -1.893764615000000e+02 + -1.900812975069574e+02 + -1.907882540726982e+02 + -1.914973354967214e+02 + -1.922085460544087e+02 + -1.929218900999998e+02 + -1.936373720194894e+02 + -1.943549961169706e+02 + -1.950747667123967e+02 + -1.957966881820183e+02 + -1.965207649000000e+02 + -1.972470012275908e+02 + -1.979754014928308e+02 + -1.987059700466389e+02 + -1.994387112870401e+02 + -2.001736295999997e+02 + -2.009107293657797e+02 + -2.016500149830146e+02 + -2.023914908231823e+02 + -2.031351612174878e+02 + -2.038810306000000e+02 + -2.046291034502658e+02 + -2.053793841544099e+02 + -2.061318770718700e+02 + -2.068865865659776e+02 + -2.076435170999997e+02 + -2.084026731731890e+02 + -2.091640591716557e+02 + -2.099276794995817e+02 + -2.106935386300690e+02 + -2.114616410000000e+02 + -2.122319910255027e+02 + -2.130045931490896e+02 + -2.137794518362718e+02 + -2.145565715736208e+02 + -2.153359567999997e+02 + -2.161176119510612e+02 + -2.169015415764713e+02 + -2.176877501734888e+02 + -2.184762421224458e+02 + -2.192670219000000e+02 + -2.200600940505141e+02 + -2.208554631128035e+02 + -2.216531335679009e+02 + -2.224531098207831e+02 + -2.232553963999997e+02 + -2.240599978997985e+02 + -2.248669188401317e+02 + -2.256761637092654e+02 + -2.264877369816284e+02 + -2.273016432000000e+02 + -2.281178869415660e+02 + -2.289364727411434e+02 + -2.297574051254879e+02 + -2.305806886273285e+02 + -2.314063277999997e+02 + -2.322343272067604e+02 + -2.330646913987978e+02 + -2.338974249389632e+02 + -2.347325324124834e+02 + -2.355700184000000e+02 + -2.364098874788788e+02 + -2.372521442301691e+02 + -2.380967932316097e+02 + -2.389438390563173e+02 + -2.397932862999997e+02 + -2.406451395699314e+02 + -2.414994034603918e+02 + -2.423560825773335e+02 + -2.432151815494090e+02 + -2.440767050000000e+02 + -2.449406575494712e+02 + -2.458070438246558e+02 + -2.466758684438366e+02 + -2.475471360143982e+02 + -2.484208511999996e+02 + -2.492970186823550e+02 + -2.501756430678903e+02 + -2.510567289807632e+02 + -2.519402811010791e+02 + -2.528263041000000e+02 + -2.537148026392507e+02 + -2.546057813786489e+02 + -2.554992449908618e+02 + -2.563951981686694e+02 + -2.572936455999996e+02 + -2.581945919701986e+02 + -2.590980419711499e+02 + -2.600040002856254e+02 + -2.609124715849065e+02 + -2.618234606000000e+02 + -2.627369720784054e+02 + -2.636530106775519e+02 + -2.645715811006028e+02 + -2.654926881465747e+02 + -2.664163364999997e+02 + -2.673425308135112e+02 + -2.682712759281322e+02 + -2.692025766270102e+02 + -2.701364375396030e+02 + -2.710728634000000e+02 + -2.720118590149941e+02 + -2.729534291763713e+02 + -2.738975786300543e+02 + -2.748443120676544e+02 + -2.757936342999997e+02 + -2.767455501787848e+02 + -2.777000643997414e+02 + -2.786571816989448e+02 + -2.796169069311608e+02 + -2.805792449000000e+02 + -2.815442003833780e+02 + -2.825117782146733e+02 + -2.834819832031981e+02 + -2.844548201023671e+02 + -2.854302936999997e+02 + -2.864084088239409e+02 + -2.873891703596309e+02 + -2.883725831483384e+02 + -2.893586519481404e+02 + -2.903473816000000e+02 + -2.913387769892773e+02 + -2.923328429461174e+02 + -2.933295843055886e+02 + -2.943290059327143e+02 + -2.953311126999996e+02 + -2.963359094688269e+02 + -2.973434010446480e+02 + -2.983535922946355e+02 + -2.993664881931061e+02 + -3.003820936000000e+02 + -3.014004133189056e+02 + -3.024214522481863e+02 + -3.034452153213495e+02 + -3.044717074825456e+02 + -3.055009335999997e+02 + -3.065328985120693e+02 + -3.075676071368449e+02 + -3.086050644279766e+02 + -3.096452753553112e+02 + -3.106882447999996e+02 + -3.117339776182681e+02 + -3.127824787990806e+02 + -3.138337533166528e+02 + -3.148878060732492e+02 + -3.159446419999996e+02 + -3.170042660531784e+02 + -3.180666831989414e+02 + -3.191318984100575e+02 + -3.201999166629245e+02 + -3.212707428999996e+02 + -3.223443820580361e+02 + -3.234208391391681e+02 + -3.245001191331626e+02 + -3.255822269890704e+02 + -3.266671677000000e+02 + -3.277549462905472e+02 + -3.288455677875165e+02 + -3.299390371822755e+02 + -3.310353594166140e+02 + -3.321345394999996e+02 + -3.332365824854958e+02 + -3.343414934139734e+02 + -3.354492773045120e+02 + -3.365599391517927e+02 + -3.376734840000000e+02 + -3.387899169180687e+02 + -3.399092429402671e+02 + -3.410314670886827e+02 + -3.421565943845668e+02 + -3.432846298999996e+02 + -3.444155787253185e+02 + -3.455494458929433e+02 + -3.466862364711880e+02 + -3.478259555971263e+02 + -3.489686083000000e+02 + -3.501141995805723e+02 + -3.512627346186799e+02 + -3.524142185495274e+02 + -3.535686563776662e+02 + -3.547260531999996e+02 + -3.558864141649047e+02 + -3.570497443588797e+02 + -3.582160488781844e+02 + -3.593853328562213e+02 + -3.605576014000000e+02 + -3.617328596203877e+02 + -3.629111127187760e+02 + -3.640923658296630e+02 + -3.652766239636252e+02 + -3.664638922999996e+02 + -3.676541760949210e+02 + -3.688474804479435e+02 + -3.700438104641370e+02 + -3.712431713192604e+02 + -3.724455682000000e+02 + -3.736510062917217e+02 + -3.748594907617601e+02 + -3.760710267615897e+02 + -3.772856194324323e+02 + -3.785032739999995e+02 + -3.797239957155368e+02 + -3.809477897125092e+02 + -3.821746611611994e+02 + -3.834046153278488e+02 + -3.846376574000000e+02 + -3.858737925371631e+02 + -3.871130260109560e+02 + -3.883553630688227e+02 + -3.896008088834330e+02 + -3.908493686999996e+02 + -3.921010477895665e+02 + -3.933558513233559e+02 + -3.946137845264227e+02 + -3.958748527376295e+02 + -3.971390612000000e+02 + -3.984064151109821e+02 + -3.996769197585321e+02 + -4.009505804131749e+02 + -4.022274022910074e+02 + -4.035073906999995e+02 + -4.047905509809469e+02 + -4.060768883569506e+02 + -4.073664080804837e+02 + -4.086591154923789e+02 + -4.099550159000000e+02 + -4.112541145837781e+02 + -4.125564168232350e+02 + -4.138619279264533e+02 + -4.151706532436620e+02 + -4.164825980999995e+02 + -4.177977678009782e+02 + -4.191161676484082e+02 + -4.204378029703449e+02 + -4.217626791355866e+02 + -4.230908015000000e+02 + -4.244221753941545e+02 + -4.257568060915354e+02 + -4.270946989435893e+02 + -4.284358594322071e+02 + -4.297802928999995e+02 + -4.311280046181774e+02 + -4.324789999621266e+02 + -4.338332843406102e+02 + -4.351908631680312e+02 + -4.365517418000000e+02 + -4.379159255766193e+02 + -4.392834199290754e+02 + -4.406542302894571e+02 + -4.420283620541414e+02 + -4.434058205999995e+02 + -4.447866113008026e+02 + -4.461707395611302e+02 + -4.475582108324218e+02 + -4.489490306166049e+02 + -4.503432043000000e+02 + -4.517407372272212e+02 + -4.531416348857516e+02 + -4.545459027469901e+02 + -4.559535462055746e+02 + -4.573645706999994e+02 + -4.587789817092769e+02 + -4.601967847429616e+02 + -4.616179852648949e+02 + -4.630425886631084e+02 + -4.644706004000000e+02 + -4.659020259847504e+02 + -4.673368709042424e+02 + -4.687751406384571e+02 + -4.702168406679589e+02 + -4.716619764999995e+02 + -4.731105536500806e+02 + -4.745625775980045e+02 + -4.760180538297375e+02 + -4.774769878558138e+02 + -4.789393852000000e+02 + -4.804052513950263e+02 + -4.818745919803221e+02 + -4.833474124743740e+02 + -4.848237183656923e+02 + -4.863035151999994e+02 + -4.877868085453354e+02 + -4.892736039052198e+02 + -4.907639068268139e+02 + -4.922577229425711e+02 + -4.937550578000000e+02 + -4.952559169027076e+02 + -4.967603058178435e+02 + -4.982682301416788e+02 + -4.997796954853789e+02 + -5.012947073999994e+02 + -5.028132714194502e+02 + -5.043353931676896e+02 + -5.058610782730644e+02 + -5.073903323321115e+02 + -5.089231609000000e+02 + -5.104595695386481e+02 + -5.119995639358939e+02 + -5.135431497453484e+02 + -5.150903325247945e+02 + -5.166411178999995e+02 + -5.181955115300345e+02 + -5.197535190105982e+02 + -5.213151459679927e+02 + -5.228803980937674e+02 + -5.244492810000000e+02 + -5.260218002787250e+02 + -5.275979616609960e+02 + -5.291777708470047e+02 + -5.307612334400695e+02 + -5.323483550999995e+02 + -5.339391415258532e+02 + -5.355335984055753e+02 + -5.371317314077364e+02 + -5.387335461786030e+02 + -5.403390484000000e+02 + -5.419482437848817e+02 + -5.435611380730882e+02 + -5.451777369746786e+02 + -5.467980461477442e+02 + -5.484220712999994e+02 + -5.500498181706811e+02 + -5.516812924850077e+02 + -5.533164999617454e+02 + -5.549554463178829e+02 + -5.565981372999994e+02 + -5.582445786620732e+02 + -5.598947761113077e+02 + -5.615487353817318e+02 + -5.632064622631164e+02 + -5.648679624999994e+02 + -5.665332418238921e+02 + -5.682023060429622e+02 + -5.698751609401672e+02 + -5.715518122344557e+02 + -5.732322656999993e+02 + -5.749165271427032e+02 + -5.766046023386582e+02 + -5.782964970855437e+02 + -5.799922172195480e+02 + -5.816917684999994e+02 + -5.833951566715182e+02 + -5.851023876259811e+02 + -5.868134672043320e+02 + -5.885284011210334e+02 + -5.902471951999993e+02 + -5.919698553287222e+02 + -5.936963873375214e+02 + -5.954267970459595e+02 + -5.971610902818754e+02 + -5.988992728999993e+02 + -6.006413507613062e+02 + -6.023873296844711e+02 + -6.041372155081436e+02 + -6.058910141182311e+02 + -6.076487313999993e+02 + -6.094103732273231e+02 + -6.111759454411804e+02 + -6.129454539033432e+02 + -6.147189045204622e+02 + -6.164963032000001e+02 + -6.182776558378988e+02 + -6.200629682925465e+02 + -6.218522464515877e+02 + -6.236454962577363e+02 + -6.254427235999993e+02 + -6.272439343587159e+02 + -6.290491345295636e+02 + -6.308583300588987e+02 + -6.326715267788347e+02 + -6.344887306000001e+02 + -6.363099474872770e+02 + -6.381351833941451e+02 + -6.399644442896572e+02 + -6.417977361628546e+02 + -6.436350648999993e+02 + -6.454764363684590e+02 + -6.473218566292518e+02 + -6.491713317125350e+02 + -6.510248675271151e+02 + -6.528824700000000e+02 + -6.547441451008573e+02 + -6.566098988943567e+02 + -6.584797373808955e+02 + -6.603536664383599e+02 + -6.622316920999993e+02 + -6.641138204605409e+02 + -6.660000574329696e+02 + -6.678904089961051e+02 + -6.697848812885560e+02 + -6.716834803000000e+02 + -6.735862119462199e+02 + -6.754930822688247e+02 + -6.774040973560088e+02 + -6.793192633079277e+02 + -6.812385860999992e+02 + -6.831620716800010e+02 + -6.850897262089175e+02 + -6.870215557906422e+02 + -6.889575663679858e+02 + -6.908977640000001e+02 + -6.928421548145254e+02 + -6.947907448778678e+02 + -6.967435402481692e+02 + -6.987005469959722e+02 + -7.006617711999993e+02 + -7.026272189534540e+02 + -7.045968963883171e+02 + -7.065708096021641e+02 + -7.085489646318440e+02 + -7.105313676000000e+02 + -7.125180246666655e+02 + -7.145089419064375e+02 + -7.165041254104643e+02 + -7.185035813280965e+02 + -7.205073157999993e+02 + -7.225153349567163e+02 + -7.245276449240899e+02 + -7.265442518464891e+02 + -7.285651618951177e+02 + -7.305903812000000e+02 + -7.326199158832851e+02 + -7.346537721472801e+02 + -7.366919561576724e+02 + -7.387344740033407e+02 + -7.407813318999993e+02 + -7.428325361060332e+02 + -7.448880927069067e+02 + -7.469480078569493e+02 + -7.490122878703525e+02 + -7.510809389000000e+02 + -7.531539670309830e+02 + -7.552313785295614e+02 + -7.573131796529314e+02 + -7.593993765758833e+02 + -7.614899754999992e+02 + -7.635849826556215e+02 + -7.656844042998581e+02 + -7.677882466626152e+02 + -7.698965159244972e+02 + -7.720092183000000e+02 + -7.741263600422619e+02 + -7.762479474594095e+02 + -7.783739868214470e+02 + -7.805044843222228e+02 + -7.826394461999992e+02 + -7.847788787331309e+02 + -7.869227882276110e+02 + -7.890711809493379e+02 + -7.912240631015031e+02 + -7.933814410000000e+02 + -7.955433210068886e+02 + -7.977097093640062e+02 + -7.998806123337483e+02 + -8.020560362523712e+02 + -8.042359873999992e+02 + -8.064204720446323e+02 + -8.086094965664213e+02 + -8.108030673053524e+02 + -8.130011905039750e+02 + -8.152038725000000e+02 + -8.174111196729889e+02 + -8.196229383028856e+02 + -8.218393347070877e+02 + -8.240603152936806e+02 + -8.262858863999992e+02 + -8.285160543327190e+02 + -8.307508254786889e+02 + -8.329902062108882e+02 + -8.352342028550189e+02 + -8.374828218000000e+02 + -8.397360694583805e+02 + -8.419939521636865e+02 + -8.442564762682848e+02 + -8.465236481828920e+02 + -8.487954742999991e+02 + -8.510719610066617e+02 + -8.533531147279726e+02 + -8.556389418758610e+02 + -8.579294488297842e+02 + -8.602246420000000e+02 + -8.625245278111681e+02 + -8.648291126593311e+02 + -8.671384029773127e+02 + -8.694524052578884e+02 + -8.717711258999991e+02 + -8.740945712693658e+02 + -8.764227478547659e+02 + -8.787556621558366e+02 + -8.810933206360036e+02 + -8.834357297000000e+02 + -8.857828957473700e+02 + -8.881348253000285e+02 + -8.904915248639498e+02 + -8.928530008754832e+02 + -8.952192597999992e+02 + -8.975903081273602e+02 + -8.999661523549036e+02 + -9.023467989915350e+02 + -9.047322545556517e+02 + -9.071225255000001e+02 + -9.095176182642568e+02 + -9.119175394073789e+02 + -9.143222954857910e+02 + -9.167318930073794e+02 + -9.191463384999990e+02 + -9.215656384936522e+02 + -9.239897994653498e+02 + -9.264188279352956e+02 + -9.288527305046009e+02 + -9.312915136999991e+02 + -9.337351840217814e+02 + -9.361837480744202e+02 + -9.386372124507991e+02 + -9.410955836845210e+02 + -9.435588682999991e+02 + -9.460270728408829e+02 + -9.485002039375468e+02 + -9.509782681943145e+02 + -9.534612721474879e+02 + -9.559492223999991e+02 + -9.584421255818636e+02 + -9.609399882443452e+02 + -9.634428169536077e+02 + -9.659506183300578e+02 + -9.684633989999990e+02 + -9.709811655949806e+02 + -9.735039247636544e+02 + -9.760316831188370e+02 + -9.785644472182881e+02 + -9.811022236999991e+02 + -9.836450192407020e+02 + -9.861928404528198e+02 + -9.887456939756197e+02 + -9.913035865101050e+02 + -9.938665246999991e+02 + -9.964345151588749e+02 + -9.990075645416573e+02 + -1.001585679508894e+03 + -1.004168866725833e+03 + -1.006757132999999e+03 + -1.009350485088950e+03 + -1.011948929193798e+03 + -1.014552472017065e+03 + -1.017161121149714e+03 + -1.019774882999999e+03 + -1.022393763477281e+03 + -1.025017769745607e+03 + -1.027646908706880e+03 + -1.030281186449000e+03 + -1.032920609999999e+03 + -1.035565186772393e+03 + -1.038214923106640e+03 + -1.040869825393126e+03 + -1.043529900494233e+03 + -1.046195154999999e+03 + -1.048865595518282e+03 + -1.051541229525064e+03 + -1.054222063914517e+03 + -1.056908104442841e+03 + -1.059599357999999e+03 + -1.062295832060889e+03 + -1.064997533253958e+03 + -1.067704468147946e+03 + -1.070416643533965e+03 + -1.073134066000000e+03 + -1.075856742179453e+03 + -1.078584679453085e+03 + -1.081317884808236e+03 + -1.084056364390976e+03 + -1.086800124999999e+03 + -1.089549173751501e+03 + -1.092303517161580e+03 + -1.095063162007773e+03 + -1.097828115663242e+03 + -1.100598385000000e+03 + -1.103373976558467e+03 + -1.106154896984741e+03 + -1.108941153067517e+03 + -1.111732751768433e+03 + -1.114529699999999e+03 + -1.117332004656191e+03 + -1.120139672719820e+03 + -1.122952711033347e+03 + -1.125771126202256e+03 + -1.128594925000000e+03 + -1.131424114391635e+03 + -1.134258701616623e+03 + -1.137098693726371e+03 + -1.139944097362279e+03 + -1.142794918999999e+03 + -1.145651165298781e+03 + -1.148512843975744e+03 + -1.151379962155369e+03 + -1.154252525751212e+03 + -1.157130542000000e+03 + -1.160014018647746e+03 + -1.162902961796701e+03 + -1.165797378002409e+03 + -1.168697275086654e+03 + -1.171602659999999e+03 + -1.174513539162380e+03 + -1.177429919411751e+03 + -1.180351807863387e+03 + -1.183279211838743e+03 + -1.186212138000000e+03 + -1.189150592852472e+03 + -1.192094584016226e+03 + -1.195044118757429e+03 + -1.197999203418656e+03 + -1.200959844999999e+03 + -1.203926050837031e+03 + -1.206897827704460e+03 + -1.209875182550288e+03 + -1.212858122751144e+03 + -1.215846655000000e+03 + -1.218840785789916e+03 + -1.221840522671824e+03 + -1.224845872987532e+03 + -1.227856843385819e+03 + -1.230873440999999e+03 + -1.233895673111333e+03 + -1.236923546192640e+03 + -1.239957067026041e+03 + -1.242996243170224e+03 + -1.246041082000000e+03 + -1.249091590572761e+03 + -1.252147775334870e+03 + -1.255209643154299e+03 + -1.258277201722480e+03 + -1.261350457999999e+03 + -1.264429418673061e+03 + -1.267514091394071e+03 + -1.270604483350415e+03 + -1.273700600740823e+03 + -1.276802451000000e+03 + -1.279910042060014e+03 + -1.283023380429426e+03 + -1.286142472688095e+03 + -1.289267326090673e+03 + -1.292397947999999e+03 + -1.295534345774196e+03 + -1.298676526619691e+03 + -1.301824497524618e+03 + -1.304978265240164e+03 + -1.308137837000000e+03 + -1.311303220289759e+03 + -1.314474422298625e+03 + -1.317651449999705e+03 + -1.320834310180745e+03 + -1.324023009999999e+03 + -1.327217556910311e+03 + -1.330417958531748e+03 + -1.333624221890711e+03 + -1.336836353161044e+03 + -1.340054360000000e+03 + -1.343278250622039e+03 + -1.346508031450468e+03 + -1.349743709083262e+03 + -1.352985291084887e+03 + -1.356232784999999e+03 + -1.359486198143600e+03 + -1.362745537187869e+03 + -1.366010809195683e+03 + -1.369282022032803e+03 + -1.372559183000000e+03 + -1.375842299046690e+03 + -1.379131377356324e+03 + -1.382426425045151e+03 + -1.385727449081319e+03 + -1.389034456999999e+03 + -1.392347456524483e+03 + -1.395666454635196e+03 + -1.398991458464414e+03 + -1.402322475610563e+03 + -1.405659513000000e+03 + -1.409002577344138e+03 + -1.412351676333446e+03 + -1.415706817605260e+03 + -1.419068008353351e+03 + -1.422435255999999e+03 + -1.425808567964313e+03 + -1.429187950969556e+03 + -1.432573411998037e+03 + -1.435964958719179e+03 + -1.439362599000000e+03 + -1.442766340439504e+03 + -1.446176189225631e+03 + -1.449592152360744e+03 + -1.453014238529275e+03 + -1.456442454999999e+03 + -1.459876808245435e+03 + -1.463317305593544e+03 + -1.466763954627232e+03 + -1.470216762966463e+03 + -1.473675738000000e+03 + -1.477140887005819e+03 + -1.480612217422037e+03 + -1.484089736511155e+03 + -1.487573451238554e+03 + -1.491063368999999e+03 + -1.494559497483912e+03 + -1.498061844364458e+03 + -1.501570417048641e+03 + -1.505085222548716e+03 + -1.508606267999999e+03 + -1.512133560790714e+03 + -1.515667108906144e+03 + -1.519206919999463e+03 + -1.522753000996140e+03 + -1.526305358999999e+03 + -1.529864001422905e+03 + -1.533428936276007e+03 + -1.537000171179230e+03 + -1.540577712963951e+03 + -1.544161568999999e+03 + -1.547751747018138e+03 + -1.551348254621497e+03 + -1.554951099280540e+03 + -1.558560288310355e+03 + -1.562175828999999e+03 + -1.565797728689906e+03 + -1.569425994958102e+03 + -1.573060635400619e+03 + -1.576701657553543e+03 + -1.580349068999999e+03 + -1.584002877314684e+03 + -1.587663089901193e+03 + -1.591329713983250e+03 + -1.595002756657312e+03 + -1.598682225999999e+03 + -1.602368130282464e+03 + -1.606060476003810e+03 + -1.609759270166310e+03 + -1.613464521194204e+03 + -1.617176236999999e+03 + -1.620894424965112e+03 + -1.624619091996676e+03 + -1.628350245392540e+03 + -1.632087893195996e+03 + -1.635832042999999e+03 + -1.639582702219653e+03 + -1.643339878880967e+03 + -1.647103580589531e+03 + -1.650873814125992e+03 + -1.654650586999999e+03 + -1.658433907212865e+03 + -1.662223782656940e+03 + -1.666020220927786e+03 + -1.669823229228366e+03 + -1.673632814999999e+03 + -1.677448985879331e+03 + -1.681271749582079e+03 + -1.685101113981527e+03 + -1.688937087086922e+03 + -1.692779675999999e+03 + -1.696628887589857e+03 + -1.700484730162859e+03 + -1.704347211664743e+03 + -1.708216339003609e+03 + -1.712092119999999e+03 + -1.715974562928047e+03 + -1.719863675285195e+03 + -1.723759464515762e+03 + -1.727661938269359e+03 + -1.731571103999999e+03 + -1.735486969207614e+03 + -1.739409542118944e+03 + -1.743338830603560e+03 + -1.747274841733617e+03 + -1.751217582999999e+03 + -1.755167062315964e+03 + -1.759123288009624e+03 + -1.763086267739076e+03 + -1.767056008086542e+03 + -1.771032516999999e+03 + -1.775015803098183e+03 + -1.779005873908525e+03 + -1.783002736756524e+03 + -1.787006399126180e+03 + -1.791016869000000e+03 + -1.795034154506543e+03 + -1.799058263107071e+03 + -1.803089202321619e+03 + -1.807126980015989e+03 + -1.811171603999998e+03 + -1.815223082025504e+03 + -1.819281421835726e+03 + -1.823346631247284e+03 + -1.827418718154363e+03 + -1.831497690000000e+03 + -1.835583554215247e+03 + -1.839676319355180e+03 + -1.843775993459518e+03 + -1.847882583413063e+03 + -1.851996096999998e+03 + -1.856116542493618e+03 + -1.860243927542824e+03 + -1.864378259929794e+03 + -1.868519547846306e+03 + -1.872667799000000e+03 + -1.876823020804590e+03 + -1.880985220849939e+03 + -1.885154407199114e+03 + -1.889330588466962e+03 + -1.893513771999998e+03 + -1.897703964771626e+03 + -1.901901175652285e+03 + -1.906105412964281e+03 + -1.910316683519642e+03 + -1.914534995000000e+03 + -1.918760355678869e+03 + -1.922992773607248e+03 + -1.927232256642219e+03 + -1.931478812455566e+03 + -1.935732448999998e+03 + -1.939993174351127e+03 + -1.944260996306766e+03 + -1.948535922544343e+03 + -1.952817960710870e+03 + -1.957107119000000e+03 + -1.961403405774432e+03 + -1.965706828656891e+03 + -1.970017395435863e+03 + -1.974335114379128e+03 + -1.978659992999998e+03 + -1.982992038634364e+03 + -1.987331259958815e+03 + -1.991677665406797e+03 + -1.996031262526477e+03 + -2.000392059000000e+03 + -2.004760062662544e+03 + -2.009135281420714e+03 + -2.013517723394651e+03 + -2.017907396963966e+03 + -2.022304309999998e+03 + -2.026708470129302e+03 + -2.031119885371980e+03 + -2.035538563783372e+03 + -2.039964513323241e+03 + -2.044397742000000e+03 + -2.048838257821666e+03 + -2.053286068652342e+03 + -2.057741182613919e+03 + -2.062203608203423e+03 + -2.066673352999998e+03 + -2.071150424296029e+03 + -2.075634830690161e+03 + -2.080126580708826e+03 + -2.084625682242698e+03 + -2.089132143000000e+03 + -2.093645970720743e+03 + -2.098167173603271e+03 + -2.102695759983049e+03 + -2.107231738184183e+03 + -2.111775115999998e+03 + -2.116325901057278e+03 + -2.120884101683680e+03 + -2.125449726108530e+03 + -2.130022782163747e+03 + -2.134603278000000e+03 + -2.139191221924691e+03 + -2.143786621957349e+03 + -2.148389485981318e+03 + -2.152999821836896e+03 + -2.157617637999998e+03 + -2.162242943074696e+03 + -2.166875744534069e+03 + -2.171516050262848e+03 + -2.176163869133622e+03 + -2.180819209000000e+03 + -2.185482077327040e+03 + -2.190152482871076e+03 + -2.194830433950524e+03 + -2.199515937814626e+03 + -2.204209002999998e+03 + -2.208909638535144e+03 + -2.213617851857877e+03 + -2.218333650781778e+03 + -2.223057044225780e+03 + -2.227788040000000e+03 + -2.232526645541351e+03 + -2.237272869895315e+03 + -2.242026721580949e+03 + -2.246788207788726e+03 + -2.251557336999999e+03 + -2.256334118250544e+03 + -2.261118559161676e+03 + -2.265910667352767e+03 + -2.270710451040453e+03 + -2.275517918999998e+03 + -2.280333080014267e+03 + -2.285155941593499e+03 + -2.289986511539142e+03 + -2.294824798563590e+03 + -2.299670810999998e+03 + -2.304524556927484e+03 + -2.309386044592275e+03 + -2.314255282195762e+03 + -2.319132277836808e+03 + -2.324017039999998e+03 + -2.328909577220459e+03 + -2.333809897224200e+03 + -2.338718008145149e+03 + -2.343633918994289e+03 + -2.348557637999998e+03 + -2.353489172912608e+03 + -2.358428531797252e+03 + -2.363375723128402e+03 + -2.368330755820120e+03 + -2.373293637999998e+03 + -2.378264377427878e+03 + -2.383242982526706e+03 + -2.388229461889857e+03 + -2.393223824063392e+03 + -2.398226076999998e+03 + -2.403236228525699e+03 + -2.408254287477974e+03 + -2.413280262494937e+03 + -2.418314161547432e+03 + -2.423355992999998e+03 + -2.428405765403690e+03 + -2.433463486890615e+03 + -2.438529165661329e+03 + -2.443602810190047e+03 + -2.448684428999998e+03 + -2.453774030522361e+03 + -2.458871622761939e+03 + -2.463977214083831e+03 + -2.469090813490053e+03 + -2.474212428999998e+03 + -2.479342068313477e+03 + -2.484479740528551e+03 + -2.489625454539379e+03 + -2.494779218375099e+03 + -2.499941039999998e+03 + -2.505110927624773e+03 + -2.510288890409285e+03 + -2.515474937052364e+03 + -2.520669075212765e+03 + -2.525871312999998e+03 + -2.531081658990217e+03 + -2.536300122220549e+03 + -2.541526711425658e+03 + -2.546761434689014e+03 + -2.552004299999998e+03 + -2.557255315555890e+03 + -2.562514490474060e+03 + -2.567781833501355e+03 + -2.573057352510476e+03 + -2.578341055999998e+03 + -2.583632952807378e+03 + -2.588933051312229e+03 + -2.594241359879810e+03 + -2.599557887014108e+03 + -2.604882640999998e+03 + -2.610215630196411e+03 + -2.615556863841929e+03 + -2.620906350516468e+03 + -2.626264097579904e+03 + -2.631630113999998e+03 + -2.637004409331177e+03 + -2.642386991059378e+03 + -2.647777867311749e+03 + -2.653177047878767e+03 + -2.658584540999998e+03 + -2.664000354190328e+03 + -2.669424496446296e+03 + -2.674856976816473e+03 + -2.680297803844182e+03 + -2.685746985999998e+03 + -2.691204531699670e+03 + -2.696670449221115e+03 + -2.702144747143579e+03 + -2.707627434527642e+03 + -2.713118519999998e+03 + -2.718618011850782e+03 + -2.724125918263655e+03 + -2.729642247949266e+03 + -2.735167010382318e+03 + -2.740700213999998e+03 + -2.746241866699575e+03 + -2.751791977076697e+03 + -2.757350554006517e+03 + -2.762917606479738e+03 + -2.768493143000000e+03 + -2.774077171851313e+03 + -2.779669701724049e+03 + -2.785270741295763e+03 + -2.790880299095185e+03 + -2.796498383999998e+03 + -2.802125004968091e+03 + -2.807760170344632e+03 + -2.813403888501788e+03 + -2.819056168106567e+03 + -2.824717018000000e+03 + -2.830386447079949e+03 + -2.836064464083062e+03 + -2.841751077483182e+03 + -2.847446295475182e+03 + -2.853150126999998e+03 + -2.858862581346520e+03 + -2.864583667200011e+03 + -2.870313392988722e+03 + -2.876051767015894e+03 + -2.881798798000000e+03 + -2.887554494917011e+03 + -2.893318866668325e+03 + -2.899091922031221e+03 + -2.904873669618204e+03 + -2.910664117999998e+03 + -2.916463275808826e+03 + -2.922271151990944e+03 + -2.928087755363771e+03 + -2.933913094445438e+03 + -2.939747178000000e+03 + -2.945590014959967e+03 + -2.951441614226611e+03 + -2.957301984588625e+03 + -2.963171134666888e+03 + -2.969049072999998e+03 + -2.974935808208847e+03 + -2.980831349417174e+03 + -2.986735705755709e+03 + -2.992648886132359e+03 + -2.998570899000000e+03 + -3.004501752659864e+03 + -3.010441455936329e+03 + -3.016390017858416e+03 + -3.022347447554316e+03 + -3.028313753999998e+03 + -3.034288946006182e+03 + -3.040273032141582e+03 + -3.046266021078663e+03 + -3.052267921739149e+03 + -3.058278743000000e+03 + -3.064298493698561e+03 + -3.070327182685398e+03 + -3.076364818827055e+03 + -3.082411411001809e+03 + -3.088466967999998e+03 + -3.094531498652569e+03 + -3.100605012177602e+03 + -3.106687517554494e+03 + -3.112779023262762e+03 + -3.118879538000000e+03 + -3.124989070695736e+03 + -3.131107630527278e+03 + -3.137235226491168e+03 + -3.143371867254447e+03 + -3.149517561999998e+03 + -3.155672319953097e+03 + -3.161836149115856e+03 + -3.168009058152651e+03 + -3.174191057129923e+03 + -3.180382155000000e+03 + -3.186582360055111e+03 + -3.192791681144167e+03 + -3.199010127274887e+03 + -3.205237707493432e+03 + -3.211474430999998e+03 + -3.217720306909038e+03 + -3.223975343611381e+03 + -3.230239549889151e+03 + -3.236512935355519e+03 + -3.242795509000000e+03 + -3.249087279482800e+03 + -3.255388255944051e+03 + -3.261698447489179e+03 + -3.268017862963467e+03 + -3.274346510999998e+03 + -3.280684400401313e+03 + -3.287031541121871e+03 + -3.293387942369432e+03 + -3.299753611888159e+03 + -3.306128559000000e+03 + -3.312512793688797e+03 + -3.318906324190636e+03 + -3.325309159228279e+03 + -3.331721308860119e+03 + -3.338142781999998e+03 + -3.344573586933190e+03 + -3.351013732692941e+03 + -3.357463228591956e+03 + -3.363922084041577e+03 + -3.370390307999997e+03 + -3.376867909193196e+03 + -3.383354896616435e+03 + -3.389851279509897e+03 + -3.396357067337695e+03 + -3.402872268999997e+03 + -3.409396893188545e+03 + -3.415930949268335e+03 + -3.422474446597307e+03 + -3.429027394238212e+03 + -3.435589800999997e+03 + -3.442161675674332e+03 + -3.448743027574159e+03 + -3.455333866086035e+03 + -3.461934200499129e+03 + -3.468544039999997e+03 + -3.475163393634110e+03 + -3.481792270131310e+03 + -3.488430678432703e+03 + -3.495078627927044e+03 + -3.501736127999997e+03 + -3.508403187927853e+03 + -3.515079816661691e+03 + -3.521766023349286e+03 + -3.528461817510494e+03 + -3.535167207999998e+03 + -3.541882203477436e+03 + -3.548606813620608e+03 + -3.555341047964333e+03 + -3.562084915431213e+03 + -3.568838424999997e+03 + -3.575601585773337e+03 + -3.582374407066678e+03 + -3.589156898185297e+03 + -3.595949068354316e+03 + -3.602750926999998e+03 + -3.609562483468940e+03 + -3.616383746264014e+03 + -3.623214724488114e+03 + -3.630055428392298e+03 + -3.636905866999997e+03 + -3.643766048793625e+03 + -3.650635983516456e+03 + -3.657515680680700e+03 + -3.664405149014039e+03 + -3.671304397999997e+03 + -3.678213437374473e+03 + -3.685132275760156e+03 + -3.692060922035369e+03 + -3.698999385901594e+03 + -3.705947676999997e+03 + -3.712905804797643e+03 + -3.719873778403308e+03 + -3.726851606752037e+03 + -3.733839298718909e+03 + -3.740836863999997e+03 + -3.747844312547997e+03 + -3.754861653211674e+03 + -3.761888895074585e+03 + -3.768926047955085e+03 + -3.775973120999997e+03 + -3.783030123074376e+03 + -3.790097063813473e+03 + -3.797173952745452e+03 + -3.804260798968512e+03 + -3.811357611999997e+03 + -3.818464401472386e+03 + -3.825581176303607e+03 + -3.832707945585785e+03 + -3.839844718954238e+03 + -3.846991505999998e+03 + -3.854148316201428e+03 + -3.861315158822798e+03 + -3.868492043129635e+03 + -3.875678978458987e+03 + -3.882875973999997e+03 + -3.890083038997269e+03 + -3.897300183310783e+03 + -3.904527416633095e+03 + -3.911764748154242e+03 + -3.919012186999997e+03 + -3.926269742452437e+03 + -3.933537424464352e+03 + -3.940815242621297e+03 + -3.948103205720294e+03 + -3.955401322999997e+03 + -3.962709604107895e+03 + -3.970028058998795e+03 + -3.977356697163350e+03 + -3.984695527326294e+03 + -3.992044558999997e+03 + -3.999403802144854e+03 + -4.006773266302151e+03 + -4.014152960820400e+03 + -4.021542894928240e+03 + -4.028943077999997e+03 + -4.036353519583599e+03 + -4.043774229513202e+03 + -4.051205217431756e+03 + -4.058646492564995e+03 + -4.066098063999997e+03 + -4.073559940995820e+03 + -4.081032133755226e+03 + -4.088514652104142e+03 + -4.096007504979870e+03 + -4.103510702000000e+03 + -4.111024253097677e+03 + -4.118548167510886e+03 + -4.126082454416708e+03 + -4.133627123225803e+03 + -4.141182184000000e+03 + -4.148747646853033e+03 + -4.156323520486682e+03 + -4.163909814098826e+03 + -4.171506538118098e+03 + -4.179113701999993e+03 + -4.186731314728609e+03 + -4.194359386189681e+03 + -4.201997926116393e+03 + -4.209646943720986e+03 + -4.217306449000000e+03 + -4.224976452122954e+03 + -4.232656961817923e+03 + -4.240347987240753e+03 + -4.248049538718602e+03 + -4.255761626000000e+03 + -4.263484258397591e+03 + -4.271217445246016e+03 + -4.278961196276451e+03 + -4.286715521743729e+03 + -4.294480431000000e+03 + -4.302255933066315e+03 + -4.310042038085233e+03 + -4.317838756007569e+03 + -4.325646096087124e+03 + -4.333464067999995e+03 + -4.341292681602012e+03 + -4.349131946225953e+03 + -4.356981871466000e+03 + -4.364842467485710e+03 + -4.372713744000000e+03 + -4.380595710372718e+03 + -4.388488375861229e+03 + -4.396391750264422e+03 + -4.404305844160006e+03 + -4.412230667000000e+03 + -4.420166227736474e+03 + -4.428112536405837e+03 + -4.436069603088062e+03 + -4.444037437481978e+03 + -4.452016049000000e+03 + -4.460005447074678e+03 + -4.468005641867199e+03 + -4.476016643204103e+03 + -4.484038460200805e+03 + -4.492071102999995e+03 + -4.500114582060231e+03 + -4.508168906299815e+03 + -4.516234085098625e+03 + -4.524310129075975e+03 + -4.532397048000000e+03 + -4.540494851104932e+03 + -4.548603547974418e+03 + -4.556723148595408e+03 + -4.564853663376500e+03 + -4.572995102000000e+03 + -4.581147473755137e+03 + -4.589310788334117e+03 + -4.597485055595826e+03 + -4.605670285497996e+03 + -4.613866488000000e+03 + -4.622073673035890e+03 + -4.630291850451470e+03 + -4.638521029781397e+03 + -4.646761220207367e+03 + -4.655012431999994e+03 + -4.663274675842531e+03 + -4.671547961173437e+03 + -4.679832297267551e+03 + -4.688127693710799e+03 + -4.696434161000000e+03 + -4.704751709752170e+03 + -4.713080348793824e+03 + -4.721420087561993e+03 + -4.729770937031085e+03 + -4.738132907000000e+03 + -4.746506006604411e+03 + -4.754890245715343e+03 + -4.763285634540516e+03 + -4.771692183448750e+03 + -4.780109901999994e+03 + -4.788538799466528e+03 + -4.796978886096308e+03 + -4.805430172162917e+03 + -4.813892667577567e+03 + -4.822366381999994e+03 + -4.830851325088147e+03 + -4.839347507060687e+03 + -4.847854938123849e+03 + -4.856373628221604e+03 + -4.864903587000000e+03 + -4.873444824101478e+03 + -4.881997349859994e+03 + -4.890561174364984e+03 + -4.899136307099045e+03 + -4.907722758000000e+03 + -4.916320537362784e+03 + -4.924929655587317e+03 + -4.933550122528648e+03 + -4.942181947260091e+03 + -4.950825139999994e+03 + -4.959479711457802e+03 + -4.968145671175524e+03 + -4.976823028809056e+03 + -4.985511794647833e+03 + -4.994211978999993e+03 + -5.002923592007461e+03 + -5.011646643245516e+03 + -5.020381142480443e+03 + -5.029127099988444e+03 + -5.037884526000000e+03 + -5.046653430641881e+03 + -5.055433823857634e+03 + -5.064225715527905e+03 + -5.073029115529123e+03 + -5.081844034000000e+03 + -5.090670481166524e+03 + -5.099508466925161e+03 + -5.108358001180135e+03 + -5.117219094017154e+03 + -5.126091755999993e+03 + -5.134975997626908e+03 + -5.143871827953957e+03 + -5.152779256704796e+03 + -5.161698295082459e+03 + -5.170628952999993e+03 + -5.179571239778229e+03 + -5.188525166029071e+03 + -5.197490742130520e+03 + -5.206467977662855e+03 + -5.215456883000000e+03 + -5.224457468752808e+03 + -5.233469744262066e+03 + -5.242493719420175e+03 + -5.251529405361101e+03 + -5.260576812000000e+03 + -5.269635948683524e+03 + -5.278706825911151e+03 + -5.287789454172008e+03 + -5.296883843495917e+03 + -5.305990003999993e+03 + -5.315107945871962e+03 + -5.324237679253967e+03 + -5.333379214299059e+03 + -5.342532561186867e+03 + -5.351697729999993e+03 + -5.360874730862462e+03 + -5.370063574314554e+03 + -5.379264270604972e+03 + -5.388476829418795e+03 + -5.397701261000000e+03 + -5.406937575887649e+03 + -5.416185784228891e+03 + -5.425445896082409e+03 + -5.434717921547790e+03 + -5.444001871000000e+03 + -5.453297754883592e+03 + -5.462605583222671e+03 + -5.471925366229407e+03 + -5.481257114511772e+03 + -5.490600837999993e+03 + -5.499956546429602e+03 + -5.509324250592133e+03 + -5.518703961068116e+03 + -5.528095687743725e+03 + -5.537499440999993e+03 + -5.546915231361128e+03 + -5.556343068498348e+03 + -5.565782962476614e+03 + -5.575234924238452e+03 + -5.584698964000000e+03 + -5.594175091687396e+03 + -5.603663318133420e+03 + -5.613163653827974e+03 + -5.622676108416792e+03 + -5.632200692000000e+03 + -5.641737415094019e+03 + -5.651286288507457e+03 + -5.660847322604374e+03 + -5.670420527008017e+03 + -5.680005911999993e+03 + -5.689603488367688e+03 + -5.699213267038800e+03 + -5.708835258184300e+03 + -5.718469470901945e+03 + -5.728115915999992e+03 + -5.737774605002216e+03 + -5.747445547634946e+03 + -5.757128753652110e+03 + -5.766824233562706e+03 + -5.776531998000000e+03 + -5.786252057564687e+03 + -5.795984422575620e+03 + -5.805729103393980e+03 + -5.815486110517342e+03 + -5.825255454000000e+03 + -5.835037143865786e+03 + -5.844831191184440e+03 + -5.854637606668529e+03 + -5.864456400127173e+03 + -5.874287581999993e+03 + -5.884131163070459e+03 + -5.893987153665426e+03 + -5.903855564090225e+03 + -5.913736404781277e+03 + -5.923629686000000e+03 + -5.933535418061928e+03 + -5.943453611973397e+03 + -5.953384278439786e+03 + -5.963327427438455e+03 + -5.973283069000000e+03 + -5.983251213525049e+03 + -5.993231872573540e+03 + -6.003225056744913e+03 + -6.013230774891098e+03 + -6.023249038000000e+03 + -6.033279857947543e+03 + -6.043323244258373e+03 + -6.053379206808452e+03 + -6.063447756872029e+03 + -6.073528904999992e+03 + -6.083622661322729e+03 + -6.093729036471069e+03 + -6.103848041095609e+03 + -6.113979685699232e+03 + -6.124123981000000e+03 + -6.134280937646101e+03 + -6.144450565430006e+03 + -6.154632874755873e+03 + -6.164827877191976e+03 + -6.175035583000000e+03 + -6.185256001935748e+03 + -6.195489145360168e+03 + -6.205735024246584e+03 + -6.215993648382001e+03 + -6.226265028000000e+03 + -6.236549173839082e+03 + -6.246846097225249e+03 + -6.257155808917487e+03 + -6.267478318647532e+03 + -6.277813636999993e+03 + -6.288161775039973e+03 + -6.298522743318929e+03 + -6.308896552332133e+03 + -6.319283212690151e+03 + -6.329682735000000e+03 + -6.340095129841887e+03 + -6.350520407726451e+03 + -6.360958579315570e+03 + -6.371409655512612e+03 + -6.381873647000000e+03 + -6.392350564293673e+03 + -6.402840417873253e+03 + -6.413343218449801e+03 + -6.423858977046060e+03 + -6.434387704000000e+03 + -6.444929409479182e+03 + -6.455484104800415e+03 + -6.466051800878468e+03 + -6.476632507643834e+03 + -6.487226235999992e+03 + -6.497832997260840e+03 + -6.508452801649206e+03 + -6.519085659445890e+03 + -6.529731581482401e+03 + -6.540390579000000e+03 + -6.551062663116751e+03 + -6.561747843536938e+03 + -6.572446130639311e+03 + -6.583157536279329e+03 + -6.593882071000000e+03 + -6.604619744763902e+03 + -6.615370568925604e+03 + -6.626134554413510e+03 + -6.636911711064461e+03 + -6.647702049999992e+03 + -6.658505582840396e+03 + -6.669322319643610e+03 + -6.680152270785791e+03 + -6.690995447680221e+03 + -6.701851860999993e+03 + -6.712721521095499e+03 + -6.723604439166686e+03 + -6.734500626205399e+03 + -6.745410092579864e+03 + -6.756332849000000e+03 + -6.767268906377159e+03 + -6.778218275408767e+03 + -6.789180966973428e+03 + -6.800156992270870e+03 + -6.811146362000000e+03 + -6.822149086596000e+03 + -6.833165176809022e+03 + -6.844194643583943e+03 + -6.855237498022965e+03 + -6.866293750999992e+03 + -6.877363413246921e+03 + -6.888446495554016e+03 + -6.899543008749155e+03 + -6.910652963678518e+03 + -6.921776370999992e+03 + -6.932913241460104e+03 + -6.944063586638155e+03 + -6.955227417524035e+03 + -6.966404743973952e+03 + -6.977595577000000e+03 + -6.988799928187199e+03 + -7.000017808173458e+03 + -7.011249227729020e+03 + -7.022494198140058e+03 + -7.033752730000000e+03 + -7.045024833685246e+03 + -7.056310520605544e+03 + -7.067609802022496e+03 + -7.078922688575014e+03 + -7.090249190999992e+03 + -7.101589320140114e+03 + -7.112943086874141e+03 + -7.124310502404821e+03 + -7.135691578318693e+03 + -7.147086324999992e+03 + -7.158494752468790e+03 + -7.169916872475182e+03 + -7.181352696510882e+03 + -7.192802235036809e+03 + -7.204265499000000e+03 + -7.215742499578333e+03 + -7.227233247391960e+03 + -7.238737753333357e+03 + -7.250256028887258e+03 + -7.261788085000000e+03 + -7.273333932305611e+03 + -7.284893581718426e+03 + -7.296467044458082e+03 + -7.308054332025791e+03 + -7.319655454999992e+03 + -7.331270423697963e+03 + -7.342899249833889e+03 + -7.354541944862027e+03 + -7.366198519315069e+03 + -7.377868983999992e+03 + -7.389553350032372e+03 + -7.401251628839381e+03 + -7.412963831476617e+03 + -7.424689968390403e+03 + -7.436430051000000e+03 + -7.448184091042194e+03 + -7.459952098877861e+03 + -7.471734085033887e+03 + -7.483530060856024e+03 + -7.495340038000000e+03 + -7.507164027981260e+03 + -7.519002041143363e+03 + -7.530854088088799e+03 + -7.542720180263871e+03 + -7.554600328999991e+03 + -7.566494545476364e+03 + -7.578402840747203e+03 + -7.590325225748156e+03 + -7.602261711334166e+03 + -7.614212308999990e+03 + -7.626177030375796e+03 + -7.638155885970103e+03 + -7.650148886679111e+03 + -7.662156044359298e+03 + -7.674177370000000e+03 + -7.686212874133715e+03 + -7.698262567927072e+03 + -7.710326462858042e+03 + -7.722404570574414e+03 + -7.734496902000000e+03 + -7.746603467726753e+03 + -7.758724278933637e+03 + -7.770859347070250e+03 + -7.783008683730720e+03 + -7.795172299999991e+03 + -7.807350206747154e+03 + -7.819542415323729e+03 + -7.831748936928582e+03 + -7.843969782379609e+03 + -7.856204962999991e+03 + -7.868454490389281e+03 + -7.880718375856472e+03 + -7.892996630459527e+03 + -7.905289265033489e+03 + -7.917596291000000e+03 + -7.929917719977670e+03 + -7.942253562811284e+03 + -7.954603830544003e+03 + -7.966968534806996e+03 + -7.979347687000000e+03 + -7.991741298275563e+03 + -8.004149379532312e+03 + -8.016571941875890e+03 + -8.029008996834256e+03 + -8.041460555999991e+03 + -8.053926630829063e+03 + -8.066407232164392e+03 + -8.078902371093302e+03 + -8.091412059283156e+03 + -8.103936307999991e+03 + -8.116475128348727e+03 + -8.129028531951320e+03 + -8.141596530160446e+03 + -8.154179133753471e+03 + -8.166776354000000e+03 + -8.179388202500601e+03 + -8.192014690774517e+03 + -8.204655830155478e+03 + -8.217311631752342e+03 + -8.229982107000000e+03 + -8.242667267443709e+03 + -8.255367124181290e+03 + -8.268081688506129e+03 + -8.280810972124258e+03 + -8.293554985999990e+03 + -8.306313740930424e+03 + -8.319087249046417e+03 + -8.331875522237864e+03 + -8.344678571514016e+03 + -8.357496408000001e+03 + -8.370329042981793e+03 + -8.383176487893126e+03 + -8.396038754236946e+03 + -8.408915853538949e+03 + -8.421807796999999e+03 + -8.434714595760075e+03 + -8.447636261558551e+03 + -8.460572806112319e+03 + -8.473524240852536e+03 + -8.486490577000000e+03 + -8.499471825734363e+03 + -8.512467998550057e+03 + -8.525479106914012e+03 + -8.538505162160651e+03 + -8.551546175999989e+03 + -8.564602160205039e+03 + -8.577673125806519e+03 + -8.590759084111069e+03 + -8.603860047081474e+03 + -8.616976026000000e+03 + -8.630107031891077e+03 + -8.643253076647045e+03 + -8.656414171854482e+03 + -8.669590328370747e+03 + -8.682781558000001e+03 + -8.695987872906602e+03 + -8.709209284090668e+03 + -8.722445802791402e+03 + -8.735697441007769e+03 + -8.748964210000000e+03 + -8.762246120773598e+03 + -8.775543185390141e+03 + -8.788855415760128e+03 + -8.802182823160678e+03 + -8.815525418999991e+03 + -8.828883214778334e+03 + -8.842256221886048e+03 + -8.855644451817980e+03 + -8.869047916276779e+03 + -8.882466627000000e+03 + -8.895900595656447e+03 + -8.909349833599377e+03 + -8.922814352320849e+03 + -8.936294163622882e+03 + -8.949789279000001e+03 + -8.963299709806102e+03 + -8.976825467697834e+03 + -8.990366564425331e+03 + -9.003923011733321e+03 + -9.017494820999989e+03 + -9.031082003570244e+03 + -9.044684571593196e+03 + -9.058302536801553e+03 + -9.071935910043938e+03 + -9.085584702999991e+03 + -9.099248927805194e+03 + -9.112928596071970e+03 + -9.126623719398038e+03 + -9.140334309541779e+03 + -9.154060378000000e+03 + -9.167801936143134e+03 + -9.181558995552323e+03 + -9.195331568052554e+03 + -9.209119665711642e+03 + -9.222923300000000e+03 + -9.236742482191501e+03 + -9.250577224366738e+03 + -9.264427538348678e+03 + -9.278293435300837e+03 + -9.292174926999989e+03 + -9.306072025514850e+03 + -9.319984742353185e+03 + -9.333913089239737e+03 + -9.347857078372264e+03 + -9.361816720999988e+03 + -9.375792028076301e+03 + -9.389783011923670e+03 + -9.403789684689073e+03 + -9.417812057757259e+03 + -9.431850143000000e+03 + -9.445903952452922e+03 + -9.459973497383473e+03 + -9.474058789280491e+03 + -9.488159840242311e+03 + -9.502276662000000e+03 + -9.516409266099370e+03 + -9.530557664431180e+03 + -9.544721868948835e+03 + -9.558901891554557e+03 + -9.573097743999990e+03 + -9.587309437907974e+03 + -9.601536984771086e+03 + -9.615780396443668e+03 + -9.630039685320193e+03 + -9.644314862999989e+03 + -9.658605940694017e+03 + -9.672912930240365e+03 + -9.687235843732506e+03 + -9.701574693379191e+03 + -9.715929491000001e+03 + -9.730300248146514e+03 + -9.744686976337332e+03 + -9.759089687418043e+03 + -9.773508393705906e+03 + -9.787943106999999e+03 + -9.802393838806964e+03 + -9.816860600913731e+03 + -9.831343405392694e+03 + -9.845842264577648e+03 + -9.860357189999990e+03 + -9.874888192875391e+03 + -9.889435285292540e+03 + -9.903998479577405e+03 + -9.918577788007758e+03 + -9.933173221999989e+03 + -9.947784792760667e+03 + -9.962412512866247e+03 + -9.977056394630243e+03 + -9.991716449514770e+03 + -1.000639269000000e+04 + -1.002108512827329e+04 + -1.003579377260607e+04 + -1.005051863510592e+04 + -1.006525973450424e+04 + -1.008001708000000e+04 + -1.009479067738785e+04 + -1.010958054488143e+04 + -1.012438669671707e+04 + -1.013920913701616e+04 + -1.015404787999999e+04 + -1.016890294387830e+04 + -1.018377433451942e+04 + -1.019866206104612e+04 + -1.021356614193473e+04 + -1.022848658999999e+04 + -1.024342341422066e+04 + -1.025837662498870e+04 + -1.027334623400460e+04 + -1.028833225445739e+04 + -1.030333470000000e+04 + -1.031835358368700e+04 + -1.033338891534757e+04 + -1.034844070623467e+04 + -1.036350897076085e+04 + -1.037859372000000e+04 + -1.039369496373519e+04 + -1.040881271589677e+04 + -1.042394698923176e+04 + -1.043909779325773e+04 + -1.045426513999999e+04 + -1.046944904320307e+04 + -1.048464951626011e+04 + -1.049986657147346e+04 + -1.051510021951631e+04 + -1.053035046999999e+04 + -1.054561733346490e+04 + -1.056090082649770e+04 + -1.057620096382862e+04 + -1.059151775501402e+04 + -1.060685121000000e+04 + -1.062220133982168e+04 + -1.063756815769902e+04 + -1.065295167679853e+04 + -1.066835190951487e+04 + -1.068376887000000e+04 + -1.069920257172756e+04 + -1.071465302083269e+04 + -1.073012022736731e+04 + -1.074560420973240e+04 + -1.076110497999999e+04 + -1.077662254698522e+04 + -1.079215692468130e+04 + -1.080770812602064e+04 + -1.082327616047952e+04 + -1.083886103999999e+04 + -1.085446277832030e+04 + -1.087008138917964e+04 + -1.088571688451933e+04 + -1.090136927381244e+04 + -1.091703857000000e+04 + -1.093272478707855e+04 + -1.094842793381667e+04 + -1.096414802233435e+04 + -1.097988507119364e+04 + -1.099563909000000e+04 + -1.101141008471468e+04 + -1.102719807131307e+04 + -1.104300306633410e+04 + -1.105882508291791e+04 + -1.107466412999999e+04 + -1.109052021511841e+04 + -1.110639335038349e+04 + -1.112228355101184e+04 + -1.113819083451417e+04 + -1.115411520999999e+04 + -1.117005668368749e+04 + -1.118601527242516e+04 + -1.120199099177015e+04 + -1.121798385114509e+04 + -1.123399386000000e+04 + -1.125002102929127e+04 + -1.126606537454743e+04 + -1.128212691149971e+04 + -1.129820565394142e+04 + -1.131430161000000e+04 + -1.133041478676655e+04 + -1.134654520134832e+04 + -1.136269286880464e+04 + -1.137885779750048e+04 + -1.139503999999999e+04 + -1.141123949060806e+04 + -1.142745627830015e+04 + -1.144369037489935e+04 + -1.145994179819328e+04 + -1.147621056000000e+04 + -1.149249666929363e+04 + -1.150880014040390e+04 + -1.152512098586926e+04 + -1.154145921396878e+04 + -1.155781484000000e+04 + -1.157418788116290e+04 + -1.159057834325663e+04 + -1.160698623573862e+04 + -1.162341157750990e+04 + -1.163985437999999e+04 + -1.165631465167572e+04 + -1.167279241049137e+04 + -1.168928767028212e+04 + -1.170580043559586e+04 + -1.172233071999999e+04 + -1.173887854137991e+04 + -1.175544390951204e+04 + -1.177202683447122e+04 + -1.178862732998528e+04 + -1.180524541000000e+04 + -1.182188108744826e+04 + -1.183853437152247e+04 + -1.185520527417456e+04 + -1.187189381268968e+04 + -1.188860000000000e+04 + -1.190532384555031e+04 + -1.192206535739879e+04 + -1.193882454957090e+04 + -1.195560144455150e+04 + -1.197239604999999e+04 + -1.198920836801576e+04 + -1.200603841862060e+04 + -1.202288622005816e+04 + -1.203975178087160e+04 + -1.205663510999999e+04 + -1.207353621858988e+04 + -1.209045512337030e+04 + -1.210739183876488e+04 + -1.212434637372514e+04 + -1.214131874000000e+04 + -1.215830895146994e+04 + -1.217531702204386e+04 + -1.219234296344827e+04 + -1.220938678454126e+04 + -1.222644850000000e+04 + -1.224352812665298e+04 + -1.226062567426862e+04 + -1.227774115320455e+04 + -1.229487457740941e+04 + -1.231202595999999e+04 + -1.232919531361497e+04 + -1.234638265190763e+04 + -1.236358798719477e+04 + -1.238081132944854e+04 + -1.239805268999999e+04 + -1.241531208224867e+04 + -1.243258952373459e+04 + -1.244988502746729e+04 + -1.246719859854622e+04 + -1.248453025000000e+04 + -1.250187999937352e+04 + -1.251924785997314e+04 + -1.253663384322633e+04 + -1.255403795942784e+04 + -1.257146022000000e+04 + -1.258890063824787e+04 + -1.260635923174130e+04 + -1.262383601348307e+04 + -1.264133098848631e+04 + -1.265884416999999e+04 + -1.267637557565735e+04 + -1.269392521755929e+04 + -1.271149310837373e+04 + -1.272907926320349e+04 + -1.274668368999999e+04 + -1.276430639533002e+04 + -1.278194739917555e+04 + -1.279960671868295e+04 + -1.281728436173200e+04 + -1.283498034000000e+04 + -1.285269466774105e+04 + -1.287042735763161e+04 + -1.288817842259290e+04 + -1.290594787633268e+04 + -1.292373573000000e+04 + -1.294154199365508e+04 + -1.295936667981993e+04 + -1.297720980264566e+04 + -1.299507137776778e+04 + -1.301295141999999e+04 + -1.303084994203483e+04 + -1.304876695061188e+04 + -1.306670245535235e+04 + -1.308465647270176e+04 + -1.310262901999999e+04 + -1.312062011245361e+04 + -1.313862975604251e+04 + -1.315665796055223e+04 + -1.317470474462057e+04 + -1.319277012000000e+04 + -1.321085409533674e+04 + -1.322895668661698e+04 + -1.324707790969205e+04 + -1.326521777718879e+04 + -1.328337630000000e+04 + -1.330155348851537e+04 + -1.331974935491385e+04 + -1.333796391362056e+04 + -1.335619718140170e+04 + -1.337444916999999e+04 + -1.339271988874384e+04 + -1.341100935082290e+04 + -1.342931756987852e+04 + -1.344764455872234e+04 + -1.346599032999999e+04 + -1.348435489664480e+04 + -1.350273827293541e+04 + -1.352114047045672e+04 + -1.353956149695641e+04 + -1.355800137000000e+04 + -1.357646010972569e+04 + -1.359493772045508e+04 + -1.361343421245217e+04 + -1.363194960986463e+04 + -1.365048392000000e+04 + -1.366903714425879e+04 + -1.368760930691950e+04 + -1.370620042690972e+04 + -1.372481050688227e+04 + -1.374343955999999e+04 + -1.376208760473736e+04 + -1.378075465005087e+04 + -1.379944070672178e+04 + -1.381814579185646e+04 + -1.383686991999999e+04 + -1.385561310323773e+04 + -1.387437535187516e+04 + -1.389315667691767e+04 + -1.391195709130158e+04 + -1.393077661000000e+04 + -1.394961524865979e+04 + -1.396847302075987e+04 + -1.398734993803961e+04 + -1.400624601054151e+04 + -1.402516125000000e+04 + -1.404409566989268e+04 + -1.406304928589068e+04 + -1.408202211294199e+04 + -1.410101416389908e+04 + -1.412002544999999e+04 + -1.413905598164077e+04 + -1.415810576964489e+04 + -1.417717482985645e+04 + -1.419626318438561e+04 + -1.421537083999999e+04 + -1.423449779870650e+04 + -1.425364408441530e+04 + -1.427280971628262e+04 + -1.429199469812906e+04 + -1.431119904000000e+04 + -1.433042275698022e+04 + -1.434966586475864e+04 + -1.436892837784737e+04 + -1.438821030874347e+04 + -1.440751167000000e+04 + -1.442683247464153e+04 + -1.444617273693482e+04 + -1.446553246845352e+04 + -1.448491167696990e+04 + -1.450431037999999e+04 + -1.452372859766022e+04 + -1.454316633455064e+04 + -1.456262360064903e+04 + -1.458210041914065e+04 + -1.460159679999998e+04 + -1.462111274782618e+04 + -1.464064828275210e+04 + -1.466020342227678e+04 + -1.467977817411577e+04 + -1.469937255000000e+04 + -1.471898656425745e+04 + -1.473862022905967e+04 + -1.475827355783788e+04 + -1.477794656667906e+04 + -1.479763927000000e+04 + -1.481735168022591e+04 + -1.483708380678435e+04 + -1.485683566151257e+04 + -1.487660726097236e+04 + -1.489639861999999e+04 + -1.491620975095499e+04 + -1.493604066191429e+04 + -1.495589136614776e+04 + -1.497576188555746e+04 + -1.499565223000000e+04 + -1.501556240451360e+04 + -1.503549242791256e+04 + -1.505544231896391e+04 + -1.507541209051985e+04 + -1.509540175000000e+04 + -1.511541130465759e+04 + -1.513544077375174e+04 + -1.515549017500820e+04 + -1.517555951933053e+04 + -1.519564881999999e+04 + -1.521575809081157e+04 + -1.523588734003694e+04 + -1.525603658036919e+04 + -1.527620583277191e+04 + -1.529639510999998e+04 + -1.531660442034102e+04 + -1.533683377728779e+04 + -1.535708319443415e+04 + -1.537735268372974e+04 + -1.539764226000000e+04 + -1.541795193921473e+04 + -1.543828173411788e+04 + -1.545863165713528e+04 + -1.547900172144165e+04 + -1.549939194000000e+04 + -1.551980232569260e+04 + -1.554023289178161e+04 + -1.556068365093051e+04 + -1.558115461506463e+04 + -1.560164579999999e+04 + -1.562215722197032e+04 + -1.564268888875843e+04 + -1.566324081295743e+04 + -1.568381301679686e+04 + -1.570440550999999e+04 + -1.572501829745089e+04 + -1.574565139909988e+04 + -1.576630483256334e+04 + -1.578697860613842e+04 + -1.580767273000000e+04 + -1.582838721786272e+04 + -1.584912209052793e+04 + -1.586987736246908e+04 + -1.589065303680525e+04 + -1.591144913000000e+04 + -1.593226566336701e+04 + -1.595310264072689e+04 + -1.597396007256353e+04 + -1.599483798518879e+04 + -1.601573638999999e+04 + -1.603665529105288e+04 + -1.605759470511345e+04 + -1.607855464838671e+04 + -1.609953513161670e+04 + -1.612053616999998e+04 + -1.614155778004294e+04 + -1.616259997081388e+04 + -1.618366275348782e+04 + -1.620474614514243e+04 + -1.622585016000000e+04 + -1.624697481007329e+04 + -1.626812010728422e+04 + -1.628928606592670e+04 + -1.631047270337715e+04 + -1.633168003000000e+04 + -1.635290805454565e+04 + -1.637415679800609e+04 + -1.639542627592296e+04 + -1.641671649164588e+04 + -1.643802745999998e+04 + -1.645935920179283e+04 + -1.648071172935930e+04 + -1.650208505431875e+04 + -1.652347919039644e+04 + -1.654489414999998e+04 + -1.656632994566724e+04 + -1.658778659427021e+04 + -1.660926410974226e+04 + -1.663076250029903e+04 + -1.665228178000000e+04 + -1.667382196574960e+04 + -1.669538306946903e+04 + -1.671696510420377e+04 + -1.673856808645374e+04 + -1.676019203000000e+04 + -1.678183694695306e+04 + -1.680350285053965e+04 + -1.682518975366077e+04 + -1.684689766850574e+04 + -1.686862660999998e+04 + -1.689037659405139e+04 + -1.691214763326874e+04 + -1.693393974023558e+04 + -1.695575292860696e+04 + -1.697758720999999e+04 + -1.699944259677470e+04 + -1.702131910964586e+04 + -1.704321676352935e+04 + -1.706513556209216e+04 + -1.708707552000000e+04 + -1.710903665790321e+04 + -1.713101898938551e+04 + -1.715302252479822e+04 + -1.717504727292061e+04 + -1.719709325000000e+04 + -1.721916047545785e+04 + -1.724124896174670e+04 + -1.726335872072246e+04 + -1.728548976595536e+04 + -1.730764210999998e+04 + -1.732981576548871e+04 + -1.735201074834581e+04 + -1.737422707347338e+04 + -1.739646475299950e+04 + -1.741872379999999e+04 + -1.744100422776899e+04 + -1.746330604747148e+04 + -1.748562927386205e+04 + -1.750797392735042e+04 + -1.753034002000000e+04 + -1.755272756012299e+04 + -1.757513656385630e+04 + -1.759756704698003e+04 + -1.762001902165879e+04 + -1.764249250000000e+04 + -1.766498749503509e+04 + -1.768750402279969e+04 + -1.771004209797560e+04 + -1.773260173223158e+04 + -1.775518293999998e+04 + -1.777778573725219e+04 + -1.780041013823985e+04 + -1.782305615380817e+04 + -1.784572379125812e+04 + -1.786841306999998e+04 + -1.789112401297027e+04 + -1.791385662520795e+04 + -1.793661091551944e+04 + -1.795938690506571e+04 + -1.798218461000000e+04 + -1.800500404157250e+04 + -1.802784520726593e+04 + -1.805070812126097e+04 + -1.807359280836476e+04 + -1.809649928000000e+04 + -1.811942754077938e+04 + -1.814237760512274e+04 + -1.816534949154946e+04 + -1.818834322012563e+04 + -1.821135879999998e+04 + -1.823439623670011e+04 + -1.825745554979138e+04 + -1.828053675712656e+04 + -1.830363986886144e+04 + -1.832676489999998e+04 + -1.834991186721417e+04 + -1.837308077964562e+04 + -1.839627164834952e+04 + -1.841948449011883e+04 + -1.844271932000000e+04 + -1.846597615248214e+04 + -1.848925500551537e+04 + -1.851255589141731e+04 + -1.853587881367952e+04 + -1.855922379000000e+04 + -1.858259084403384e+04 + -1.860597998459446e+04 + -1.862939122130964e+04 + -1.865282457086503e+04 + -1.867628004999998e+04 + -1.869975767367864e+04 + -1.872325745125265e+04 + -1.874677939400045e+04 + -1.877032351829797e+04 + -1.879388983999998e+04 + -1.881747837395618e+04 + -1.884108913346766e+04 + -1.886472213066709e+04 + -1.888837737699991e+04 + -1.891205489000000e+04 + -1.893575468867888e+04 + -1.895947678210836e+04 + -1.898322118083019e+04 + -1.900698790146692e+04 + -1.903077696000000e+04 + -1.905458837122149e+04 + -1.907842214817702e+04 + -1.910227830328199e+04 + -1.912615684887913e+04 + -1.915005779999998e+04 + -1.917398117252360e+04 + -1.919792697876641e+04 + -1.922189523162585e+04 + -1.924588594641727e+04 + -1.926989913999998e+04 + -1.929393482787026e+04 + -1.931799301676958e+04 + -1.934207372057390e+04 + -1.936617696590223e+04 + -1.939030276000000e+04 + -1.941445110358184e+04 + -1.943862202401437e+04 + -1.946281554213054e+04 + -1.948703165938676e+04 + -1.951127038999998e+04 + -1.953553175531375e+04 + -1.955981576784185e+04 + -1.958412243887696e+04 + -1.960845178142548e+04 + -1.963280380999998e+04 + -1.965717854010317e+04 + -1.968157598764983e+04 + -1.970599616682758e+04 + -1.973043908928781e+04 + -1.975490477000000e+04 + -1.977939322508017e+04 + -1.980390446612710e+04 + -1.982843850672890e+04 + -1.985299536464853e+04 + -1.987757505000000e+04 + -1.990217757132781e+04 + -1.992680295149982e+04 + -1.995145120910892e+04 + -1.997612235106852e+04 + -2.000081638999998e+04 + -2.002553334291399e+04 + -2.005027322692212e+04 + -2.007503605456619e+04 + -2.009982183242756e+04 + -2.012463057999998e+04 + -2.014946232050470e+04 + -2.017431705750974e+04 + -2.019919480128925e+04 + -2.022409557869796e+04 + -2.024901940000000e+04 + -2.027396626876084e+04 + -2.029893620825063e+04 + -2.032392923791251e+04 + -2.034894536415857e+04 + -2.037398460000000e+04 + -2.039904696273123e+04 + -2.042413246681671e+04 + -2.044924112749899e+04 + -2.047437296177629e+04 + -2.049952797999998e+04 + -2.052470619105544e+04 + -2.054990761544010e+04 + -2.057513226917888e+04 + -2.060038015795331e+04 + -2.062565129999998e+04 + -2.065094571854568e+04 + -2.067626342205840e+04 + -2.070160442063917e+04 + -2.072696873225083e+04 + -2.075235637000000e+04 + -2.077776734528838e+04 + -2.080320167696219e+04 + -2.082865938214449e+04 + -2.085414047244347e+04 + -2.087964496000000e+04 + -2.090517285805777e+04 + -2.093072418166662e+04 + -2.095629894648643e+04 + -2.098189716820891e+04 + -2.100751885999998e+04 + -2.103316403410750e+04 + -2.105883270565323e+04 + -2.108452489048020e+04 + -2.111024060421226e+04 + -2.113597985999998e+04 + -2.116174267011207e+04 + -2.118752904964539e+04 + -2.121333901446366e+04 + -2.123917258027344e+04 + -2.126502976000000e+04 + -2.129091056582378e+04 + -2.131681501406569e+04 + -2.134274311932949e+04 + -2.136869489244911e+04 + -2.139467035000000e+04 + -2.142066951097057e+04 + -2.144669238829770e+04 + -2.147273899344209e+04 + -2.149880933837191e+04 + -2.152490343999998e+04 + -2.155102131698669e+04 + -2.157716298229367e+04 + -2.160332844744082e+04 + -2.162951772437019e+04 + -2.165573082999998e+04 + -2.168196778300156e+04 + -2.170822859627157e+04 + -2.173451328139519e+04 + -2.176082185053812e+04 + -2.178715432000000e+04 + -2.181351070821111e+04 + -2.183989103150391e+04 + -2.186629530288904e+04 + -2.189272353140778e+04 + -2.191917573000000e+04 + -2.194565191497987e+04 + -2.197215210512397e+04 + -2.199867631637375e+04 + -2.202522455969623e+04 + -2.205179684999998e+04 + -2.207839320363563e+04 + -2.210501363148952e+04 + -2.213165814783550e+04 + -2.215832677350680e+04 + -2.218501951999998e+04 + -2.221173639532642e+04 + -2.223847741910094e+04 + -2.226524260850044e+04 + -2.229203197306979e+04 + -2.231884553000000e+04 + -2.234568329890952e+04 + -2.237254528774074e+04 + -2.239943150806158e+04 + -2.242634198094407e+04 + -2.245327672000000e+04 + -2.248023573585785e+04 + -2.250721904853940e+04 + -2.253422667413636e+04 + -2.256125861967753e+04 + -2.258831489999998e+04 + -2.261539553480252e+04 + -2.264250054093014e+04 + -2.266962993052693e+04 + -2.269678371062339e+04 + -2.272396189999998e+04 + -2.275116452153000e+04 + -2.277839158301363e+04 + -2.280564309534358e+04 + -2.283291907950545e+04 + -2.286021955000000e+04 + -2.288754451771620e+04 + -2.291489399812011e+04 + -2.294226800704672e+04 + -2.296966655917324e+04 + -2.299708967000000e+04 + -2.302453735490683e+04 + -2.305200962641978e+04 + -2.307950649734620e+04 + -2.310702798236498e+04 + -2.313457409999998e+04 + -2.316214486856879e+04 + -2.318974029613145e+04 + -2.321736039447026e+04 + -2.324500518448656e+04 + -2.327267467999998e+04 + -2.330036889175501e+04 + -2.332808783850466e+04 + -2.335583153764027e+04 + -2.338360000121357e+04 + -2.341139324000000e+04 + -2.343921126672951e+04 + -2.346705410394532e+04 + -2.349492176951476e+04 + -2.352281427072812e+04 + -2.355073162000000e+04 + -2.357867383414989e+04 + -2.360664093193761e+04 + -2.363463292919098e+04 + -2.366264983684289e+04 + -2.369069166999998e+04 + -2.371875844507638e+04 + -2.374685017193912e+04 + -2.377496686591387e+04 + -2.380310855200050e+04 + -2.383127523999998e+04 + -2.385946693403709e+04 + -2.388768365690810e+04 + -2.391592542840760e+04 + -2.394419225713039e+04 + -2.397248416000000e+04 + -2.400080115691363e+04 + -2.402914325571854e+04 + -2.405751046800998e+04 + -2.408590281513924e+04 + -2.411432031000000e+04 + -2.414276296293371e+04 + -2.417123079796694e+04 + -2.419972383203242e+04 + -2.422824206706797e+04 + -2.425678551999998e+04 + -2.428535421485334e+04 + -2.431394816200073e+04 + -2.434256737430352e+04 + -2.437121187300517e+04 + -2.439988166999998e+04 + -2.442857677325164e+04 + -2.445729720103540e+04 + -2.448604297194451e+04 + -2.451481410082247e+04 + -2.454361060000000e+04 + -2.457243248182022e+04 + -2.460127976431730e+04 + -2.463015246522100e+04 + -2.465905059942621e+04 + -2.468797417999998e+04 + -2.471692321945616e+04 + -2.474589773222362e+04 + -2.477489773480251e+04 + -2.480392324581322e+04 + -2.483297427999998e+04 + -2.486205084917968e+04 + -2.489115296405446e+04 + -2.492028064024748e+04 + -2.494943390068509e+04 + -2.497861275999998e+04 + -2.500781722863925e+04 + -2.503704732334474e+04 + -2.506630305872901e+04 + -2.509558444448151e+04 + -2.512489150000000e+04 + -2.515422424757818e+04 + -2.518358269497819e+04 + -2.521296685328307e+04 + -2.524237674371633e+04 + -2.527181237999998e+04 + -2.530127377273551e+04 + -2.533076094162915e+04 + -2.536027390311031e+04 + -2.538981266594794e+04 + -2.541937724999998e+04 + -2.544896767801531e+04 + -2.547858395406606e+04 + -2.550822608802068e+04 + -2.553789410507042e+04 + -2.556758802000000e+04 + -2.559730784246711e+04 + -2.562705359189478e+04 + -2.565682528525429e+04 + -2.568662293247029e+04 + -2.571644655000000e+04 + -2.574629615713407e+04 + -2.577617176604459e+04 + -2.580607338891535e+04 + -2.583600104095400e+04 + -2.586595473999998e+04 + -2.589593450400127e+04 + -2.592594034522632e+04 + -2.595597227610649e+04 + -2.598603031176017e+04 + -2.601611446999998e+04 + -2.604622476879967e+04 + -2.607636122042706e+04 + -2.610652383730750e+04 + -2.613671263455693e+04 + -2.616692763000000e+04 + -2.619716884161440e+04 + -2.622743628160562e+04 + -2.625772996246335e+04 + -2.628804989951923e+04 + -2.631839611000000e+04 + -2.634876861165059e+04 + -2.637916741999917e+04 + -2.640959254907723e+04 + -2.644004401148305e+04 + -2.647052181999998e+04 + -2.650102598983489e+04 + -2.653155654491748e+04 + -2.656211350103963e+04 + -2.659269685960091e+04 + -2.662330663999998e+04 + -2.665394286925502e+04 + -2.668460555517195e+04 + -2.671529470758218e+04 + -2.674601034670874e+04 + -2.677675249000000e+04 + -2.680752115154265e+04 + -2.683831634157976e+04 + -2.686913807564717e+04 + -2.689998637786448e+04 + -2.693086126000000e+04 + -2.696176272916689e+04 + -2.699269080763921e+04 + -2.702364551500381e+04 + -2.705462686113689e+04 + -2.708563485999998e+04 + -2.711666952809900e+04 + -2.714773087942122e+04 + -2.717881892991400e+04 + -2.720993369901594e+04 + -2.724107519999998e+04 + -2.727224344400496e+04 + -2.730343845029767e+04 + -2.733466023562860e+04 + -2.736590881019403e+04 + -2.739718419000000e+04 + -2.742848639412166e+04 + -2.745981543741902e+04 + -2.749117133427855e+04 + -2.752255410001475e+04 + -2.755396375000000e+04 + -2.758540029934807e+04 + -2.761686376223195e+04 + -2.764835415476579e+04 + -2.767987149599797e+04 + -2.771141579999997e+04 + -2.774298707825893e+04 + -2.777458534547961e+04 + -2.780621061813955e+04 + -2.783786291408934e+04 + -2.786954224999998e+04 + -2.790124864062599e+04 + -2.793298209650868e+04 + -2.796474263269793e+04 + -2.799653027215609e+04 + -2.802834503000000e+04 + -2.806018691678819e+04 + -2.809205594694776e+04 + -2.812395213748840e+04 + -2.815587550739401e+04 + -2.818782607000000e+04 + -2.821980383662756e+04 + -2.825180882556652e+04 + -2.828384105454396e+04 + -2.831590053775406e+04 + -2.834798728999998e+04 + -2.838010132665882e+04 + -2.841224266303304e+04 + -2.844441131398464e+04 + -2.847660729395342e+04 + -2.850883061999998e+04 + -2.854108131015271e+04 + -2.857335937943549e+04 + -2.860566484233479e+04 + -2.863799771378746e+04 + -2.867035801000000e+04 + -2.870274574643904e+04 + -2.873516093256026e+04 + -2.876760358436649e+04 + -2.880007372909855e+04 + -2.883257138000000e+04 + -2.886509654365616e+04 + -2.889764923870952e+04 + -2.893022948372628e+04 + -2.896283729252707e+04 + -2.899547267999998e+04 + -2.902813566168059e+04 + -2.906082625190441e+04 + -2.909354446650575e+04 + -2.912629032389195e+04 + -2.915906383999998e+04 + -2.919186502919167e+04 + -2.922469390650106e+04 + -2.925755048733507e+04 + -2.929043478725063e+04 + -2.932334682000000e+04 + -2.935628660019129e+04 + -2.938925415043921e+04 + -2.942224948806936e+04 + -2.945527261979538e+04 + -2.948832356000000e+04 + -2.952140232838030e+04 + -2.955450894361826e+04 + -2.958764342089699e+04 + -2.962080577090842e+04 + -2.965399600999997e+04 + -2.968721415715336e+04 + -2.972046022629084e+04 + -2.975373423280592e+04 + -2.978703619592538e+04 + -2.982036612999997e+04 + -2.985372404652352e+04 + -2.988710995909819e+04 + -2.992052388535540e+04 + -2.995396584761164e+04 + -2.998743586000000e+04 + -3.002093393306212e+04 + -3.005446008516229e+04 + -3.008801433415196e+04 + -3.012159669410924e+04 + -3.015520717999998e+04 + -3.018884580728562e+04 + -3.022251259030155e+04 + -3.025620754490144e+04 + -3.028993068950620e+04 + -3.032368203999997e+04 + -3.035746161072607e+04 + -3.039126941699663e+04 + -3.042510547393189e+04 + -3.045896979612689e+04 + -3.049286239999998e+04 + -3.052678330335746e+04 + -3.056073252467363e+04 + -3.059471007984014e+04 + -3.062871598061521e+04 + -3.066275024000000e+04 + -3.069681287356475e+04 + -3.073090390293319e+04 + -3.076502334621974e+04 + -3.079917121404217e+04 + -3.083334751999997e+04 + -3.086755228023463e+04 + -3.090178551167921e+04 + -3.093604723225209e+04 + -3.097033746063074e+04 + -3.100465620999998e+04 + -3.103900349175437e+04 + -3.107337932446759e+04 + -3.110778372555016e+04 + -3.114221670819769e+04 + -3.117667828999997e+04 + -3.121116848957679e+04 + -3.124568731744623e+04 + -3.128023478769976e+04 + -3.131481092268889e+04 + -3.134941574000000e+04 + -3.138404925321087e+04 + -3.141871147408727e+04 + -3.145340241670125e+04 + -3.148812209933996e+04 + -3.152287053999997e+04 + -3.155764775577736e+04 + -3.159245376185456e+04 + -3.162728857279384e+04 + -3.166215220315186e+04 + -3.169704466999997e+04 + -3.173196599132658e+04 + -3.176691618227545e+04 + -3.180189525721778e+04 + -3.183690323068162e+04 + -3.187194012000000e+04 + -3.190700594323912e+04 + -3.194210071422084e+04 + -3.197722444868163e+04 + -3.201237716636405e+04 + -3.204755888000000e+04 + -3.208276960047787e+04 + -3.211800935023939e+04 + -3.215327814773632e+04 + -3.218857600158763e+04 + -3.222390292999997e+04 + -3.225925895535199e+04 + -3.229464408973093e+04 + -3.233005834462857e+04 + -3.236550173499735e+04 + -3.240097427999997e+04 + -3.243647600017841e+04 + -3.247200691143220e+04 + -3.250756702669824e+04 + -3.254315635678932e+04 + -3.257877492000000e+04 + -3.261442273792899e+04 + -3.265009982555360e+04 + -3.268580619650297e+04 + -3.272154186523808e+04 + -3.275730685000000e+04 + -3.279310116911321e+04 + -3.282892483177912e+04 + -3.286477785354587e+04 + -3.290066026202923e+04 + -3.293657206999998e+04 + -3.297251328378459e+04 + -3.300848392497173e+04 + -3.304448401407080e+04 + -3.308051356412061e+04 + -3.311657258999998e+04 + -3.315266110752813e+04 + -3.318877912993135e+04 + -3.322492667413289e+04 + -3.326110376297835e+04 + -3.329731041000000e+04 + -3.333354662539115e+04 + -3.336981243131684e+04 + -3.340610784669931e+04 + -3.344243288124504e+04 + -3.347878755000000e+04 + -3.351517187197135e+04 + -3.355158586607149e+04 + -3.358802954742114e+04 + -3.362450292603845e+04 + -3.366100601999997e+04 + -3.369753885113907e+04 + -3.373410143432544e+04 + -3.377069378324004e+04 + -3.380731591267414e+04 + -3.384396783999997e+04 + -3.388064958319757e+04 + -3.391736115628571e+04 + -3.395410257481684e+04 + -3.399087385786547e+04 + -3.402767502000000e+04 + -3.406450607498593e+04 + -3.410136704569621e+04 + -3.413825794940452e+04 + -3.417517879208190e+04 + -3.421212959000000e+04 + -3.424911036577375e+04 + -3.428612113814977e+04 + -3.432316192150666e+04 + -3.436023272579379e+04 + -3.439733356999998e+04 + -3.443446447621852e+04 + -3.447162545467578e+04 + -3.450881651888796e+04 + -3.454603769159935e+04 + -3.458328898999997e+04 + -3.462057042742187e+04 + -3.465788201822977e+04 + -3.469522377879945e+04 + -3.473259572783916e+04 + -3.476999788000000e+04 + -3.480743024920274e+04 + -3.484489285737491e+04 + -3.488238572274076e+04 + -3.491990885516477e+04 + -3.495746227000000e+04 + -3.499504598627476e+04 + -3.503266002163332e+04 + -3.507030439252002e+04 + -3.510797911399110e+04 + -3.514568419999997e+04 + -3.518341966538968e+04 + -3.522118553105182e+04 + -3.525898181605689e+04 + -3.529680853433678e+04 + -3.533466569999997e+04 + -3.537255332834070e+04 + -3.541047143775194e+04 + -3.544842004484196e+04 + -3.548639916273562e+04 + -3.552440881000000e+04 + -3.556244900769237e+04 + -3.560051977192599e+04 + -3.563862111528000e+04 + -3.567675304773126e+04 + -3.571491559000000e+04 + -3.575310876677514e+04 + -3.579133259025522e+04 + -3.582958707123636e+04 + -3.586787222387752e+04 + -3.590618806999997e+04 + -3.594453463328037e+04 + -3.598291192576281e+04 + -3.602131995866808e+04 + -3.605975874687618e+04 + -3.609822830999997e+04 + -3.613672866872384e+04 + -3.617525983663845e+04 + -3.621382182906358e+04 + -3.625241466608051e+04 + -3.629103836000000e+04 + -3.632969292147818e+04 + -3.636837837559645e+04 + -3.640709474306420e+04 + -3.644584203277781e+04 + -3.648462026000000e+04 + -3.652342944409004e+04 + -3.656226960170399e+04 + -3.660114075023598e+04 + -3.664004290875195e+04 + -3.667897608999997e+04 + -3.671794030512006e+04 + -3.675693557547587e+04 + -3.679596192058374e+04 + -3.683501935339895e+04 + -3.687410788999997e+04 + -3.691322754870546e+04 + -3.695237834723054e+04 + -3.699156030212950e+04 + -3.703077342834224e+04 + -3.707001774000000e+04 + -3.710929325203417e+04 + -3.714859998429457e+04 + -3.718793795692067e+04 + -3.722730718808447e+04 + -3.726670768999997e+04 + -3.730613947399677e+04 + -3.734560256273038e+04 + -3.738509697431393e+04 + -3.742462271654350e+04 + -3.746417980999997e+04 + -3.750376828013417e+04 + -3.754338813660564e+04 + -3.758303939267375e+04 + -3.762272207245150e+04 + -3.766243618999997e+04 + -3.770218175518502e+04 + -3.774195878945678e+04 + -3.778176731257176e+04 + -3.782160733741773e+04 + -3.786147888000000e+04 + -3.790138195864309e+04 + -3.794131659132003e+04 + -3.798128279431332e+04 + -3.802128058166662e+04 + -3.806130996999997e+04 + -3.810137097737330e+04 + -3.814146362046005e+04 + -3.818158791697343e+04 + -3.822174388615621e+04 + -3.826193153999997e+04 + -3.830215088938532e+04 + -3.834240195971708e+04 + -3.838268477130731e+04 + -3.842299933188884e+04 + -3.846334565999997e+04 + -3.850372377842891e+04 + -3.854413369633216e+04 + -3.858457542816681e+04 + -3.862504900090371e+04 + -3.866555443000000e+04 + -3.870609172486966e+04 + -3.874666090332934e+04 + -3.878726198409722e+04 + -3.882789498399841e+04 + -3.886855991999997e+04 + -3.890925680946781e+04 + -3.894998567054054e+04 + -3.899074651957592e+04 + -3.903153937021765e+04 + -3.907236423999997e+04 + -3.911322114736439e+04 + -3.915411010384250e+04 + -3.919503112747372e+04 + -3.923598424716172e+04 + -3.927696946999997e+04 + -3.931798680038228e+04 + -3.935903628964794e+04 + -3.940011793259103e+04 + -3.944123164809230e+04 + -3.948237770000000e+04 + -3.952355620675491e+04 + -3.956476584662273e+04 + -3.960600801403134e+04 + -3.964728735507886e+04 + -3.968859104999997e+04 + 1.819886919039960e+01 + 1.816405130921966e+01 + 1.812918280091599e+01 + 1.809426424653407e+01 + 1.805929622711938e+01 + 1.802427932371738e+01 + 1.798921411737356e+01 + 1.795410118913339e+01 + 1.791894112004234e+01 + 1.788373449114589e+01 + 1.784848188348950e+01 + 1.781318387811866e+01 + 1.777784105607885e+01 + 1.774245399841551e+01 + 1.770702328617416e+01 + 1.767154950040025e+01 + 1.763603322213927e+01 + 1.760047503243666e+01 + 1.756487551233793e+01 + 1.752923524288855e+01 + 1.749355480513398e+01 + 1.745783478011969e+01 + 1.742207574889119e+01 + 1.738627829249391e+01 + 1.735044299197335e+01 + 1.731457042837498e+01 + 1.727866118274428e+01 + 1.724271583612671e+01 + 1.720673496956776e+01 + 1.717071916411290e+01 + 1.713466900080759e+01 + 1.709858506069732e+01 + 1.706246792482757e+01 + 1.702631817424381e+01 + 1.699013638999150e+01 + 1.695392315311613e+01 + 1.691767904466317e+01 + 1.688140464567809e+01 + 1.684510053720637e+01 + 1.680876730029348e+01 + 1.677240551598491e+01 + 1.673601576532611e+01 + 1.669959862936258e+01 + 1.666315468913977e+01 + 1.662668452570318e+01 + 1.659018872009826e+01 + 1.655366785337049e+01 + 1.651712250656536e+01 + 1.648055326072833e+01 + 1.644396069690488e+01 + 1.640734539614049e+01 + 1.637070793948063e+01 + 1.633404890797076e+01 + 1.629736888265638e+01 + 1.626066844458294e+01 + 1.622394817479593e+01 + 1.618720865434082e+01 + 1.615045046426309e+01 + 1.611367418560821e+01 + 1.607688039942165e+01 + 1.604006968674890e+01 + 1.600324262863542e+01 + 1.596639980612668e+01 + 1.592954180026817e+01 + 1.589266919210536e+01 + 1.585578256268371e+01 + 1.581888249304872e+01 + 1.578196956424585e+01 + 1.574504435732057e+01 + 1.570810745331836e+01 + 1.567115943328470e+01 + 1.563420087826506e+01 + 1.559723236930490e+01 + 1.556025448744972e+01 + 1.552326781374499e+01 + 1.548627292923617e+01 + 1.544927041496875e+01 + 1.541226085198818e+01 + 1.537524482133997e+01 + 1.533822290406956e+01 + 1.530119568122245e+01 + 1.526416373384410e+01 + 1.522712764298000e+01 + 1.519008798967561e+01 + 1.515304535497640e+01 + 1.511600031992786e+01 + 1.507895346557546e+01 + 1.504190537296467e+01 + 1.500485662314096e+01 + 1.496780779714983e+01 + 1.493075947603672e+01 + 1.489371224084713e+01 + 1.485666667262652e+01 + 1.481962335242037e+01 + 1.478258286127416e+01 + 1.474554578023335e+01 + 1.470851269034343e+01 + 1.467148417264987e+01 + 1.463446080819813e+01 + 1.459744317803371e+01 + 1.456043186320207e+01 + 1.452342744474869e+01 + 1.448643050371903e+01 + 1.444944162115858e+01 + 1.441246137811282e+01 + 1.437549035562720e+01 + 1.433852913474722e+01 + 1.430157829651834e+01 + 1.426463842198604e+01 + 1.422771009219579e+01 + 1.419079388819307e+01 + 1.415389039102334e+01 + 1.411700018173210e+01 + 1.408012384136481e+01 + 1.404326195096694e+01 + 1.400641509158398e+01 + 1.396958384426139e+01 + 1.393276879004464e+01 + 1.389597050997923e+01 + 1.385918958511061e+01 + 1.382242659648426e+01 + 1.378568212514566e+01 + 1.374895675214029e+01 + 1.371225105851361e+01 + 1.367556562531110e+01 + 1.363890103357824e+01 + 1.360225786436050e+01 + 1.356563669870335e+01 + 1.352903811765228e+01 + 1.349246270225274e+01 + 1.345591103355023e+01 + 1.341938369259021e+01 + 1.338288126041816e+01 + 1.334640431807955e+01 + 1.330995344661985e+01 + 1.327352922708455e+01 + 1.323713224051912e+01 + 1.320076306796902e+01 + 1.316442229047974e+01 + 1.312811048909675e+01 + 1.309182824486553e+01 + 1.305557613883154e+01 + 1.301935475204027e+01 + 1.298316466553718e+01 + 1.294700646036776e+01 + 1.291088071757748e+01 + 1.287478801821181e+01 + 1.283872894331622e+01 + 1.280270407393619e+01 + 1.276671399111720e+01 + 1.273075927590472e+01 + 1.269484050934423e+01 + 1.265895827248119e+01 + 1.262311314636109e+01 + 1.258730571202939e+01 + 1.255153655053158e+01 + 1.251580624291313e+01 + 1.248011537021950e+01 + 1.244446451349619e+01 + 1.240885425378865e+01 + 1.237328517214237e+01 + 1.233775784960283e+01 + 1.230227286721548e+01 + 1.226683080602582e+01 + 1.223143224707931e+01 + 1.219607777142142e+01 + 1.216076796009764e+01 + 1.212550339415344e+01 + 1.209028465463429e+01 + 1.205511232258567e+01 + 1.201998697905305e+01 + 1.198490920508190e+01 + 1.194987958171770e+01 + 1.191489869000593e+01 + 1.187996711099206e+01 + 1.184508542572157e+01 + 1.181025421523992e+01 + 1.177547406059259e+01 + 1.174074554282507e+01 + 1.170606924298281e+01 + 1.167144574211130e+01 + 1.163687562125602e+01 + 1.160235946146243e+01 + 1.156789784377601e+01 + 1.153349134924223e+01 + 1.149914055890657e+01 + 1.146484605381452e+01 + 1.143060841501152e+01 + 1.139642822354308e+01 + 1.136230606045464e+01 + 1.132824250679170e+01 + 1.129423814359974e+01 + 1.126029355192421e+01 + 1.122640931281059e+01 + 1.119258600730437e+01 + 1.115882421645102e+01 + 1.112512452129600e+01 + 1.109148750288479e+01 + 1.105791374226288e+01 + 1.102440382047573e+01 + 1.099095831856882e+01 + 1.095757781758762e+01 + 1.092426289857761e+01 + 1.089101414258426e+01 + 1.085783213065305e+01 + 1.082471744382945e+01 + 1.079167066315892e+01 + 1.075869236968697e+01 + 1.072578314445905e+01 + 1.069294356852064e+01 + 1.066017422291721e+01 + 1.062747568869424e+01 + 1.059484854689720e+01 + 1.056229337857157e+01 + 1.052981076476282e+01 + 1.049740128651643e+01 + 1.046506552487787e+01 + 1.043280406089261e+01 + 1.040061747560614e+01 + 1.036850635006392e+01 + 1.033647126531143e+01 + 1.030451280239414e+01 + 1.027263154235754e+01 + 1.024082806624708e+01 + 1.020910295510825e+01 + 1.017745678998653e+01 + 1.014589015192738e+01 + 1.011440362197629e+01 + 1.008299778117872e+01 + 1.005167321058014e+01 + 1.002043049122605e+01 + 9.989270204161905e+00 + 9.958192930433185e+00 + 9.927199251085362e+00 + 9.896289747163912e+00 + 9.865464999714312e+00 + 9.834725589782032e+00 + 9.804072098412551e+00 + 9.773505106651340e+00 + 9.743025195543877e+00 + 9.712632946135633e+00 + 9.682328939472086e+00 + 9.652113756598707e+00 + 9.621987978560973e+00 + 9.591952186404358e+00 + 9.562006961174337e+00 + 9.532152883916382e+00 + 9.502390535675973e+00 + 9.472720497498580e+00 + 9.443143350429677e+00 + 9.413659675514742e+00 + 9.384270053799249e+00 + 9.354975066328668e+00 + 9.325775294148480e+00 + 9.296671318304156e+00 + 9.267663719841170e+00 + 9.238753079804999e+00 + 9.209939979241115e+00 + 9.181224999194994e+00 + 9.152608720712111e+00 + 9.124091724837941e+00 + 9.095674592617954e+00 + 9.067357905097630e+00 + 9.039142243322441e+00 + 9.011028188337864e+00 + 8.983016292445305e+00 + 8.955106689123129e+00 + 8.927299195109086e+00 + 8.899593619314148e+00 + 8.871989770649284e+00 + 8.844487458025464e+00 + 8.817086490353660e+00 + 8.789786676544839e+00 + 8.762587825509975e+00 + 8.735489746160036e+00 + 8.708492247405990e+00 + 8.681595138158814e+00 + 8.654798227329470e+00 + 8.628101323828931e+00 + 8.601504236568170e+00 + 8.575006774458155e+00 + 8.548608746409855e+00 + 8.522309961334242e+00 + 8.496110228142285e+00 + 8.470009355744955e+00 + 8.444007153053219e+00 + 8.418103428978053e+00 + 8.392297992430423e+00 + 8.366590652321301e+00 + 8.340981217561657e+00 + 8.315469497062459e+00 + 8.290055299734679e+00 + 8.264738434489287e+00 + 8.239518710237252e+00 + 8.214395935889545e+00 + 8.189369920357137e+00 + 8.164440472550996e+00 + 8.139607401382095e+00 + 8.114870515761401e+00 + 8.090229624599887e+00 + 8.065684536808520e+00 + 8.041235061298275e+00 + 8.016881006980118e+00 + 7.992622182765018e+00 + 7.968458397563950e+00 + 7.944389460287880e+00 + 7.920415179847782e+00 + 7.896535365154623e+00 + 7.872749825119373e+00 + 7.849058368653004e+00 + 7.825460804666484e+00 + 7.801956942070785e+00 + 7.778546589776878e+00 + 7.755229556695729e+00 + 7.732005651738313e+00 + 7.708874683815599e+00 + 7.685836461838553e+00 + 7.662890794718152e+00 + 7.640037491365358e+00 + 7.617276360691148e+00 + 7.594607211606489e+00 + 7.572029853022352e+00 + 7.549544093849708e+00 + 7.527149742999527e+00 + 7.504846609382777e+00 + 7.482634501910429e+00 + 7.460513229493455e+00 + 7.438482601042820e+00 + 7.416542425469502e+00 + 7.394692511684465e+00 + 7.372932668598682e+00 + 7.351262705123121e+00 + 7.329682430168755e+00 + 7.308191652646553e+00 + 7.286790181467484e+00 + 7.265477825542517e+00 + 7.244254393782626e+00 + 7.223119695098779e+00 + 7.202073538401945e+00 + 7.181115732603097e+00 + 7.160246086613204e+00 + 7.139464409343233e+00 + 7.118770509704159e+00 + 7.098164196606950e+00 + 7.077645278962576e+00 + 7.057213565682006e+00 + 7.036868865676214e+00 + 7.016610987856166e+00 + 6.996439741132834e+00 + 6.976354934417186e+00 + 6.956356376620197e+00 + 6.936443876652832e+00 + 6.916617243426063e+00 + 6.896876285850862e+00 + 6.877220812838198e+00 + 6.857650633299039e+00 + 6.838165556144358e+00 + 6.818765390285123e+00 + 6.799449944632306e+00 + 6.780219028096876e+00 + 6.761072449589803e+00 + 6.742010018022058e+00 + 6.723031542304612e+00 + 6.704136831348434e+00 + 6.685325694064492e+00 + 6.666597939363759e+00 + 6.647953376157203e+00 + 6.629391813355797e+00 + 6.610913059870509e+00 + 6.592516924612310e+00 + 6.574203216492170e+00 + 6.555971744421058e+00 + 6.537822317309946e+00 + 6.519754744069803e+00 + 6.501768833611600e+00 + 6.483864394846306e+00 + 6.466041236684891e+00 + 6.448299168038327e+00 + 6.430637997817582e+00 + 6.413057534933630e+00 + 6.395557588297437e+00 + 6.378137966819973e+00 + 6.360798479412210e+00 + 6.343538934985117e+00 + 6.326359142449666e+00 + 6.309258910716826e+00 + 6.292238048697567e+00 + 6.275296365302859e+00 + 6.258433669443673e+00 + 6.241649770030978e+00 + 6.224944475975745e+00 + 6.208317596188945e+00 + 6.191768939581546e+00 + 6.175298315064517e+00 + 6.158905531548833e+00 + 6.142590397945462e+00 + 6.126352723165372e+00 + 6.110192316119535e+00 + 6.094108985718921e+00 + 6.078102540874499e+00 + 6.062172790497243e+00 + 6.046319543498117e+00 + 6.030542608788095e+00 + 6.014841795278149e+00 + 5.999216911879244e+00 + 5.983667767502356e+00 + 5.968194171058448e+00 + 5.952795931458497e+00 + 5.937472857613470e+00 + 5.922224758434336e+00 + 5.907051442832068e+00 + 5.891952719717633e+00 + 5.876928398002004e+00 + 5.861978286596150e+00 + 5.847102194411042e+00 + 5.832299930357648e+00 + 5.817571303346941e+00 + 5.802916122289888e+00 + 5.788334196097460e+00 + 5.773825333680629e+00 + 5.759389343950365e+00 + 5.745026035817635e+00 + 5.730735218193414e+00 + 5.716516699988668e+00 + 5.702370290114368e+00 + 5.688295797481486e+00 + 5.674293031000990e+00 + 5.660361799583851e+00 + 5.646501912141039e+00 + 5.632713177583526e+00 + 5.618995404822279e+00 + 5.605348402768269e+00 + 5.591771980332467e+00 + 5.578265946425844e+00 + 5.564830109959368e+00 + 5.551464279844009e+00 + 5.538168264990741e+00 + 5.524941874310529e+00 + 5.511784916714348e+00 + 5.498697201113163e+00 + 5.485678536417949e+00 + 5.472728731539672e+00 + 5.459847595389306e+00 + 5.447031950668924e+00 + 5.434258417587328e+00 + 5.421509378931341e+00 + 5.408790202589383e+00 + 5.396101725502927e+00 + 5.383442552149385e+00 + 5.370812984345576e+00 + 5.358213038980171e+00 + 5.345642546622406e+00 + 5.333101463094469e+00 + 5.320589727671893e+00 + 5.308107264570896e+00 + 5.295654006874094e+00 + 5.283229887334054e+00 + 5.270834837715376e+00 + 5.258468789944041e+00 + 5.246131676000384e+00 + 5.233823428164784e+00 + 5.221543979540164e+00 + 5.209293263422158e+00 + 5.197071212820756e+00 + 5.184877759775030e+00 + 5.172712837552656e+00 + 5.160576380473933e+00 + 5.148468322098453e+00 + 5.136388595958436e+00 + 5.124337135726472e+00 + 5.112313875048248e+00 + 5.100318748362747e+00 + 5.088351690727316e+00 + 5.076412636057685e+00 + 5.064501518839616e+00 + 5.052618274474592e+00 + 5.040762837425790e+00 + 5.028935142799786e+00 + 5.017135126690616e+00 + 5.005362723409764e+00 + 4.993617868159293e+00 + 4.981900498164465e+00 + 4.970210548621045e+00 + 4.958547954855285e+00 + 4.946912653797631e+00 + 4.935304581602165e+00 + 4.923723674430540e+00 + 4.912169869219803e+00 + 4.900643102722201e+00 + 4.889143311682699e+00 + 4.877670433140317e+00 + 4.866224404407401e+00 + 4.854805162838305e+00 + 4.843412645620055e+00 + 4.832046790470948e+00 + 4.820707535433044e+00 + 4.809394818449872e+00 + 4.798108577205163e+00 + 4.786848749644187e+00 + 4.775615274885523e+00 + 4.764408091170769e+00 + 4.753227136475494e+00 + 4.742072350593207e+00 + 4.730943672320340e+00 + 4.719841039761676e+00 + 4.708764392793848e+00 + 4.697713670947889e+00 + 4.686688813308958e+00 + 4.675689760077749e+00 + 4.664716450776882e+00 + 4.653768824355144e+00 + 4.642846821849820e+00 + 4.631950383864691e+00 + 4.621079449911801e+00 + 4.610233960271208e+00 + 4.599413855814052e+00 + 4.588619077726644e+00 + 4.577849566594633e+00 + 4.567105263324451e+00 + 4.556386109499332e+00 + 4.545692045920192e+00 + 4.535023013830533e+00 + 4.524378955558838e+00 + 4.513759812087895e+00 + 4.503165524982657e+00 + 4.492596037765430e+00 + 4.482051291649467e+00 + 4.471531227881555e+00 + 4.461035790191556e+00 + 4.450564920902143e+00 + 4.440118561957067e+00 + 4.429696656605228e+00 + 4.419299148008472e+00 + 4.408925979093191e+00 + 4.398577092681390e+00 + 4.388252432408600e+00 + 4.377951941955149e+00 + 4.367675563647617e+00 + 4.357423241911437e+00 + 4.347194921954801e+00 + 4.336990545878941e+00 + 4.326810057907454e+00 + 4.316653403787664e+00 + 4.306520526395858e+00 + 4.296411370095723e+00 + 4.286325880845187e+00 + 4.276264002847886e+00 + 4.266225680614548e+00 + 4.256210859410026e+00 + 4.246219484255977e+00 + 4.236251500111860e+00 + 4.226306852214246e+00 + 4.216385487075638e+00 + 4.206487350454588e+00 + 4.196612386873075e+00 + 4.186760542346591e+00 + 4.176931763412669e+00 + 4.167125996517556e+00 + 4.157343187931778e+00 + 4.147583283659849e+00 + 4.137846229598449e+00 + 4.128131973158434e+00 + 4.118440461620333e+00 + 4.108771640965568e+00 + 4.099125458381889e+00 + 4.089501861348100e+00 + 4.079900796648449e+00 + 4.070322211621146e+00 + 4.060766054068578e+00 + 4.051232271987449e+00 + 4.041720812903752e+00 + 4.032231624389123e+00 + 4.022764654839604e+00 + 4.013319852102482e+00 + 4.003897163974346e+00 + 3.994496539375360e+00 + 3.985117927005318e+00 + 3.975761275162846e+00 + 3.966426531955261e+00 + 3.957113646635731e+00 + 3.947822569087183e+00 + 3.938553247905866e+00 + 3.929305631685672e+00 + 3.920079669524097e+00 + 3.910875311427285e+00 + 3.901692507178291e+00 + 3.892531206204140e+00 + 3.883391358396833e+00 + 3.874272913657344e+00 + 3.865175821793835e+00 + 3.856100032879644e+00 + 3.847045497225832e+00 + 3.838012165320722e+00 + 3.828999987558789e+00 + 3.820008914413926e+00 + 3.811038896595444e+00 + 3.802089885254187e+00 + 3.793161831237620e+00 + 3.784254684890362e+00 + 3.775368398252875e+00 + 3.766502923100440e+00 + 3.757658209579520e+00 + 3.748834209295840e+00 + 3.740030874433959e+00 + 3.731248156753105e+00 + 3.722486008117639e+00 + 3.713744380387517e+00 + 3.705023225280349e+00 + 3.696322495070079e+00 + 3.687642142318910e+00 + 3.678982119432947e+00 + 3.670342378801804e+00 + 3.661722872867589e+00 + 3.653123554235752e+00 + 3.644544376023881e+00 + 3.635985291634798e+00 + 3.627446254192749e+00 + 3.618927216218316e+00 + 3.610428130335504e+00 + 3.601948951051534e+00 + 3.593489632231203e+00 + 3.585050126838500e+00 + 3.576630388153148e+00 + 3.568230370457688e+00 + 3.559850028500160e+00 + 3.551489315016799e+00 + 3.543148183918080e+00 + 3.534826590807976e+00 + 3.526524489935861e+00 + 3.518241835011243e+00 + 3.509978579991082e+00 + 3.501734680809670e+00 + 3.493510092697708e+00 + 3.485304769188242e+00 + 3.477118665289576e+00 + 3.468951736765370e+00 + 3.460803939385451e+00 + 3.452675227557384e+00 + 3.444565556219660e+00 + 3.436474882078371e+00 + 3.428403160505571e+00 + 3.420350346590145e+00 + 3.412316396304707e+00 + 3.404301265792477e+00 + 3.396304911176187e+00 + 3.388327288491305e+00 + 3.380368354160161e+00 + 3.372428064623584e+00 + 3.364506375833607e+00 + 3.356603244211646e+00 + 3.348718626640740e+00 + 3.340852480236101e+00 + 3.333004761693424e+00 + 3.325175427644580e+00 + 3.317364435527293e+00 + 3.309571742493616e+00 + 3.301797305408617e+00 + 3.294041081414062e+00 + 3.286303028194412e+00 + 3.278583103726798e+00 + 3.270881265443555e+00 + 3.263197471011956e+00 + 3.255531678390248e+00 + 3.247883845209004e+00 + 3.240253929642225e+00 + 3.232641890347850e+00 + 3.225047684908113e+00 + 3.217471271425511e+00 + 3.209912608923088e+00 + 3.202371655667555e+00 + 3.194848370181972e+00 + 3.187342711658790e+00 + 3.179854638881827e+00 + 3.172384110380890e+00 + 3.164931084707051e+00 + 3.157495521384956e+00 + 3.150077380058776e+00 + 3.142676619877814e+00 + 3.135293200073600e+00 + 3.127927079946843e+00 + 3.120578218905895e+00 + 3.113246577218404e+00 + 3.105932114937815e+00 + 3.098634790846833e+00 + 3.091354565058342e+00 + 3.084091398271724e+00 + 3.076845250485478e+00 + 3.069616081755534e+00 + 3.062403852244847e+00 + 3.055208522175611e+00 + 3.048030052549899e+00 + 3.040868404439169e+00 + 3.033723537524932e+00 + 3.026595412527113e+00 + 3.019483991059011e+00 + 3.012389234177664e+00 + 3.005311102428361e+00 + 2.998249556405217e+00 + 2.991204558170310e+00 + 2.984176069441633e+00 + 2.977164051262350e+00 + 2.970168464749357e+00 + 2.963189271462946e+00 + 2.956226433370632e+00 + 2.949279912203107e+00 + 2.942349669912605e+00 + 2.935435668735732e+00 + 2.928537870478263e+00 + 2.921656236941307e+00 + 2.914790730227295e+00 + 2.907941313056430e+00 + 2.901107948114753e+00 + 2.894290597705669e+00 + 2.887489224186201e+00 + 2.880703790004707e+00 + 2.873934257778331e+00 + 2.867180590721052e+00 + 2.860442752157053e+00 + 2.853720705060128e+00 + 2.847014412004529e+00 + 2.840323835735203e+00 + 2.833648939802342e+00 + 2.826989688360529e+00 + 2.820346045051714e+00 + 2.813717971838249e+00 + 2.807105432809830e+00 + 2.800508392739872e+00 + 2.793926814285955e+00 + 2.787360661385112e+00 + 2.780809898806732e+00 + 2.774274490318202e+00 + 2.767754399418414e+00 + 2.761249589980850e+00 + 2.754760027276096e+00 + 2.748285675987487e+00 + 2.741826499952791e+00 + 2.735382462817888e+00 + 2.728953529693038e+00 + 2.722539666591989e+00 + 2.716140837199994e+00 + 2.709757005928732e+00 + 2.703388138477217e+00 + 2.697034199719776e+00 + 2.690695154612969e+00 + 2.684370968516638e+00 + 2.678061606722120e+00 + 2.671767034388748e+00 + 2.665487216663756e+00 + 2.659222119420964e+00 + 2.652971708466898e+00 + 2.646735949170681e+00 + 2.640514807328682e+00 + 2.634308248813400e+00 + 2.628116239351709e+00 + 2.621938745026414e+00 + 2.615775731978081e+00 + 2.609627166192403e+00 + 2.603493014125890e+00 + 2.597373242133807e+00 + 2.591267815972944e+00 + 2.585176702619338e+00 + 2.579099869106871e+00 + 2.573037281022092e+00 + 2.566988905295047e+00 + 2.560954709471109e+00 + 2.554934660124372e+00 + 2.548928723658388e+00 + 2.542936866838776e+00 + 2.536959057454498e+00 + 2.530995262744329e+00 + 2.525045449466102e+00 + 2.519109584724339e+00 + 2.513187636248425e+00 + 2.507279571988880e+00 + 2.501385358975255e+00 + 2.495504964649074e+00 + 2.489638357011514e+00 + 2.483785503877440e+00 + 2.477946372993181e+00 + 2.472120932153270e+00 + 2.466309149445497e+00 + 2.460510993028623e+00 + 2.454726431004756e+00 + 2.448955431279121e+00 + 2.443197962222979e+00 + 2.437453992749473e+00 + 2.431723490873920e+00 + 2.426006424702946e+00 + 2.420302763016215e+00 + 2.414612474849150e+00 + 2.408935529060812e+00 + 2.403271894158963e+00 + 2.397621539164549e+00 + 2.391984432987164e+00 + 2.386360544006294e+00 + 2.380749841635097e+00 + 2.375152295549876e+00 + 2.369567874852914e+00 + 2.363996548806182e+00 + 2.358438286639424e+00 + 2.352893057314327e+00 + 2.347360830870365e+00 + 2.341841577523073e+00 + 2.336335266205249e+00 + 2.330841866367291e+00 + 2.325361348038680e+00 + 2.319893681430557e+00 + 2.314438836350213e+00 + 2.308996782525400e+00 + 2.303567490482044e+00 + 2.298150930506590e+00 + 2.292747072570897e+00 + 2.287355886755380e+00 + 2.281977343203661e+00 + 2.276611412298537e+00 + 2.271258065216148e+00 + 2.265917272602903e+00 + 2.260589004572198e+00 + 2.255273232290290e+00 + 2.249969926489583e+00 + 2.244679057245269e+00 + 2.239400595715412e+00 + 2.234134513404378e+00 + 2.228880781619142e+00 + 2.223639370658599e+00 + 2.218410251587366e+00 + 2.213193396784469e+00 + 2.207988776668006e+00 + 2.202796362022329e+00 + 2.197616125439223e+00 + 2.192448038696543e+00 + 2.187292072961057e+00 + 2.182148199232985e+00 + 2.177016389630072e+00 + 2.171896616273634e+00 + 2.166788850281173e+00 + 2.161693063906081e+00 + 2.156609229682959e+00 + 2.151537319229026e+00 + 2.146477304323076e+00 + 2.141429157241363e+00 + 2.136392850965788e+00 + 2.131368357474257e+00 + 2.126355648357996e+00 + 2.121354696293322e+00 + 2.116365474412895e+00 + 2.111387955644702e+00 + 2.106422111701483e+00 + 2.101467915161587e+00 + 2.096525339256323e+00 + 2.091594356269759e+00 + 2.086674939419586e+00 + 2.081767062556874e+00 + 2.076870697792070e+00 + 2.071985817585338e+00 + 2.067112395385072e+00 + 2.062250405333861e+00 + 2.057399820685575e+00 + 2.052560613690088e+00 + 2.047732757766644e+00 + 2.042916226752948e+00 + 2.038110994473384e+00 + 2.033317034456518e+00 + 2.028534320143143e+00 + 2.023762825026766e+00 + 2.019002522786289e+00 + 2.014253387371010e+00 + 2.009515392980107e+00 + 2.004788513366984e+00 + 2.000072722331970e+00 + 1.995367994084281e+00 + 1.990674302528751e+00 + 1.985991621875054e+00 + 1.981319927135009e+00 + 1.976659192144684e+00 + 1.972009390577169e+00 + 1.967370497271926e+00 + 1.962742487042732e+00 + 1.958125334423246e+00 + 1.953519013586483e+00 + 1.948923499307053e+00 + 1.944338766657414e+00 + 1.939764790288013e+00 + 1.935201544608222e+00 + 1.930649004305472e+00 + 1.926107145248571e+00 + 1.921575942429786e+00 + 1.917055370205972e+00 + 1.912545403920843e+00 + 1.908046018818900e+00 + 1.903557190023903e+00 + 1.899078893306255e+00 + 1.894611103753838e+00 + 1.890153795996532e+00 + 1.885706946418488e+00 + 1.881270530851602e+00 + 1.876844524133795e+00 + 1.872428902057808e+00 + 1.868023640555410e+00 + 1.863628715350075e+00 + 1.859244102235784e+00 + 1.854869776995271e+00 + 1.850505715382929e+00 + 1.846151893336109e+00 + 1.841808287113597e+00 + 1.837474873250078e+00 + 1.833151627500553e+00 + 1.828838525627810e+00 + 1.824535544058799e+00 + 1.820242659570220e+00 + 1.815959848693184e+00 + 1.811687087278560e+00 + 1.807424351697017e+00 + 1.803171618832717e+00 + 1.798928865872756e+00 + 1.794696068965575e+00 + 1.790473204047284e+00 + 1.786260248130819e+00 + 1.782057178544553e+00 + 1.777863972462110e+00 + 1.773680606381003e+00 + 1.769507057021776e+00 + 1.765343301422396e+00 + 1.761189316819223e+00 + 1.757045080431908e+00 + 1.752910569457795e+00 + 1.748785761158555e+00 + 1.744670632638435e+00 + 1.740565161064786e+00 + 1.736469324420783e+00 + 1.732383100261040e+00 + 1.728306465595185e+00 + 1.724239397824929e+00 + 1.720181874717039e+00 + 1.716133874165168e+00 + 1.712095373335323e+00 + 1.708066350172305e+00 + 1.704046783495335e+00 + 1.700036650108550e+00 + 1.696035927584721e+00 + 1.692044595228792e+00 + 1.688062630443701e+00 + 1.684090010658294e+00 + 1.680126714513943e+00 + 1.676172720475745e+00 + 1.672228006742128e+00 + 1.668292551293985e+00 + 1.664366332353613e+00 + 1.660449328407859e+00 + 1.656541518177628e+00 + 1.652642880144113e+00 + 1.648753392536404e+00 + 1.644873033459887e+00 + 1.641001782122826e+00 + 1.637139617814172e+00 + 1.633286518510287e+00 + 1.629442462986198e+00 + 1.625607430332010e+00 + 1.621781398816242e+00 + 1.617964347766720e+00 + 1.614156256896447e+00 + 1.610357104501046e+00 + 1.606566869528149e+00 + 1.602785531410984e+00 + 1.599013068753329e+00 + 1.595249460964023e+00 + 1.591494688099418e+00 + 1.587748729316499e+00 + 1.584011563661260e+00 + 1.580283170366302e+00 + 1.576563528988570e+00 + 1.572852618951484e+00 + 1.569150419635379e+00 + 1.565456911345500e+00 + 1.561772073862832e+00 + 1.558095886092752e+00 + 1.554428327545355e+00 + 1.550769378486889e+00 + 1.547119019605569e+00 + 1.543477229774924e+00 + 1.539843988467248e+00 + 1.536219276909035e+00 + 1.532603074921508e+00 + 1.528995362108325e+00 + 1.525396118748853e+00 + 1.521805324624735e+00 + 1.518222960029189e+00 + 1.514649006474386e+00 + 1.511083443428444e+00 + 1.507526250258141e+00 + 1.503977408416516e+00 + 1.500436898413773e+00 + 1.496904700394939e+00 + 1.493380795245864e+00 + 1.489865163193006e+00 + 1.486357784560608e+00 + 1.482858641108495e+00 + 1.479367713055452e+00 + 1.475884980161266e+00 + 1.472410424507970e+00 + 1.468944026943859e+00 + 1.465485767394345e+00 + 1.462035627142284e+00 + 1.458593587684006e+00 + 1.455159630175685e+00 + 1.451733734815932e+00 + 1.448315882934573e+00 + 1.444906056735074e+00 + 1.441504236540235e+00 + 1.438110403156542e+00 + 1.434724538391589e+00 + 1.431346623689521e+00 + 1.427976640530080e+00 + 1.424614570482120e+00 + 1.421260394583763e+00 + 1.417914094214416e+00 + 1.414575651360096e+00 + 1.411245047472556e+00 + 1.407922264020345e+00 + 1.404607282835409e+00 + 1.401300085863839e+00 + 1.398000654669480e+00 + 1.394708970355802e+00 + 1.391425015768138e+00 + 1.388148773421020e+00 + 1.384880223867722e+00 + 1.381619349200565e+00 + 1.378366132070768e+00 + 1.375120554406545e+00 + 1.371882598139520e+00 + 1.368652245409923e+00 + 1.365429478679455e+00 + 1.362214280063096e+00 + 1.359006631544336e+00 + 1.355806515436745e+00 + 1.352613914349998e+00 + 1.349428810943258e+00 + 1.346251187518860e+00 + 1.343081026346772e+00 + 1.339918309785753e+00 + 1.336763020411036e+00 + 1.333615141050152e+00 + 1.330474654669161e+00 + 1.327341544046787e+00 + 1.324215791384803e+00 + 1.321097378844990e+00 + 1.317986290481943e+00 + 1.314882509034005e+00 + 1.311786015892630e+00 + 1.308696795174431e+00 + 1.305614830505543e+00 + 1.302540104058677e+00 + 1.299472598550161e+00 + 1.296412297281467e+00 + 1.293359183920592e+00 + 1.290313241355424e+00 + 1.287274452437336e+00 + 1.284242800425524e+00 + 1.281218268758570e+00 + 1.278200840971845e+00 + 1.275190500607243e+00 + 1.272187230813499e+00 + 1.269191014801793e+00 + 1.266201836184906e+00 + 1.263219678244913e+00 + 1.260244524601725e+00 + 1.257276359774731e+00 + 1.254315166659556e+00 + 1.251360928048363e+00 + 1.248413628680403e+00 + 1.245473252809453e+00 + 1.242539783866816e+00 + 1.239613204552696e+00 + 1.236693499248504e+00 + 1.233780652886690e+00 + 1.230874648458874e+00 + 1.227975469917747e+00 + 1.225083101914005e+00 + 1.222197528080320e+00 + 1.219318732110022e+00 + 1.216446698153004e+00 + 1.213581411119631e+00 + 1.210722855169846e+00 + 1.207871013783067e+00 + 1.205025871252235e+00 + 1.202187412198626e+00 + 1.199355621285526e+00 + 1.196530482820713e+00 + 1.193711981112556e+00 + 1.190900100540550e+00 + 1.188094825240966e+00 + 1.185296139829988e+00 + 1.182504029475636e+00 + 1.179718478336080e+00 + 1.176939470878376e+00 + 1.174166992368249e+00 + 1.171401026812090e+00 + 1.168641558834780e+00 + 1.165888574598542e+00 + 1.163142057955574e+00 + 1.160401992993886e+00 + 1.157668365957760e+00 + 1.154941161055026e+00 + 1.152220362585152e+00 + 1.149505957086653e+00 + 1.146797929075238e+00 + 1.144096262593592e+00 + 1.141400943461258e+00 + 1.138711957183691e+00 + 1.136029288721929e+00 + 1.133352922646698e+00 + 1.130682844729473e+00 + 1.128019040871752e+00 + 1.125361495026299e+00 + 1.122710192813904e+00 + 1.120065120718956e+00 + 1.117426263156838e+00 + 1.114793605478939e+00 + 1.112167133798269e+00 + 1.109546832911627e+00 + 1.106932688501257e+00 + 1.104324686965964e+00 + 1.101722813149718e+00 + 1.099127052563592e+00 + 1.096537391606932e+00 + 1.093953815681381e+00 + 1.091376310184498e+00 + 1.088804860939953e+00 + 1.086239454210304e+00 + 1.083680075729654e+00 + 1.081126710640132e+00 + 1.078579345517792e+00 + 1.076037966489376e+00 + 1.073502558540405e+00 + 1.070973108232868e+00 + 1.068449602380304e+00 + 1.065932027008114e+00 + 1.063420367175204e+00 + 1.060914608734753e+00 + 1.058414739347230e+00 + 1.055920744292059e+00 + 1.053432609053344e+00 + 1.050950321750202e+00 + 1.048473868029229e+00 + 1.046003233045439e+00 + 1.043538404185668e+00 + 1.041079368203120e+00 + 1.038626111099421e+00 + 1.036178618557632e+00 + 1.033736877638818e+00 + 1.031300875738098e+00 + 1.028870598541307e+00 + 1.026446032279889e+00 + 1.024027163804816e+00 + 1.021613979927458e+00 + 1.019206467749757e+00 + 1.016804614201984e+00 + 1.014408404816817e+00 + 1.012017826403038e+00 + 1.009632866898133e+00 + 1.007253512894913e+00 + 1.004879750675442e+00 + 1.002511566831996e+00 + 1.000148949144661e+00 + 9.977918847145494e-01 + 9.954403597206510e-01 + 9.930943614528360e-01 + 9.907538771638876e-01 + 9.884188936740620e-01 + 9.860893982148410e-01 + 9.837653780132122e-01 + 9.814468200970017e-01 + 9.791337116433633e-01 + 9.768260399168340e-01 + 9.745237922184445e-01 + 9.722269558574113e-01 + 9.699355181124353e-01 + 9.676494662336389e-01 + 9.653687876978898e-01 + 9.630934699744002e-01 + 9.608235003289306e-01 + 9.585588662885656e-01 + 9.562995554410040e-01 + 9.540455551859868e-01 + 9.517968530931009e-01 + 9.495534368089285e-01 + 9.473152938858177e-01 + 9.450824119343849e-01 + 9.428547786515334e-01 + 9.406323818265262e-01 + 9.384152091378831e-01 + 9.362032482272097e-01 + 9.339964869112888e-01 + 9.317949130473703e-01 + 9.295985145023118e-01 + 9.274072791539573e-01 + 9.252211948367504e-01 + 9.230402494034374e-01 + 9.208644309329761e-01 + 9.186937274260252e-01 + 9.165281267878318e-01 + 9.143676170947915e-01 + 9.122121864230248e-01 + 9.100618228160294e-01 + 9.079165144228375e-01 + 9.057762494101416e-01 + 9.036410159434681e-01 + 9.015108022852656e-01 + 8.993855966397851e-01 + 8.972653871281971e-01 + 8.951501621417270e-01 + 8.930399100640233e-01 + 8.909346191274636e-01 + 8.888342777366450e-01 + 8.867388743114113e-01 + 8.846483971822027e-01 + 8.825628348501290e-01 + 8.804821758633001e-01 + 8.784064086961259e-01 + 8.763355218399448e-01 + 8.742695038377348e-01 + 8.722083433110044e-01 + 8.701520288632569e-01 + 8.681005490981059e-01 + 8.660538926659707e-01 + 8.640120483003465e-01 + 8.619750047630993e-01 + 8.599427507590320e-01 + 8.579152750196485e-01 + 8.558925663402844e-01 + 8.538746136199826e-01 + 8.518614056598554e-01 + 8.498529312415619e-01 + 8.478491793952468e-01 + 8.458501390477595e-01 + 8.438557990450950e-01 + 8.418661484572341e-01 + 8.398811762963594e-01 + 8.379008715007146e-01 + 8.359252231704962e-01 + 8.339542204095658e-01 + 8.319878522912720e-01 + 8.300261079597043e-01 + 8.280689765769632e-01 + 8.261164473121154e-01 + 8.241685093974929e-01 + 8.222251520716921e-01 + 8.202863645582569e-01 + 8.183521361157176e-01 + 8.164224560764958e-01 + 8.144973138478017e-01 + 8.125766987264839e-01 + 8.106606000443977e-01 + 8.087490072689457e-01 + 8.068419098143643e-01 + 8.049392971238847e-01 + 8.030411587461223e-01 + 8.011474841608780e-01 + 7.992582628576694e-01 + 7.973734844327619e-01 + 7.954931384582111e-01 + 7.936172145055983e-01 + 7.917457022017643e-01 + 7.898785912282000e-01 + 7.880158712799969e-01 + 7.861575320154112e-01 + 7.843035631939634e-01 + 7.824539546080472e-01 + 7.806086959262468e-01 + 7.787677769423338e-01 + 7.769311875560446e-01 + 7.750989176225404e-01 + 7.732709569908990e-01 + 7.714472955211897e-01 + 7.696279231052234e-01 + 7.678128297211314e-01 + 7.660020053954494e-01 + 7.641954400346342e-01 + 7.623931236302374e-01 + 7.605950462809293e-01 + 7.588011979868697e-01 + 7.570115688113509e-01 + 7.552261489288551e-01 + 7.534449284973839e-01 + 7.516678976340316e-01 + 7.498950464317325e-01 + 7.481263651057625e-01 + 7.463618439154999e-01 + 7.446014731170009e-01 + 7.428452429690515e-01 + 7.410931437272748e-01 + 7.393451656574506e-01 + 7.376012991597445e-01 + 7.358615346418724e-01 + 7.341258624174279e-01 + 7.323942728636854e-01 + 7.306667564033948e-01 + 7.289433034811010e-01 + 7.272239046205010e-01 + 7.255085503342084e-01 + 7.237972310231134e-01 + 7.220899372662432e-01 + 7.203866596915919e-01 + 7.186873887451811e-01 + 7.169921150530395e-01 + 7.153008293485266e-01 + 7.136135222426403e-01 + 7.119301843519804e-01 + 7.102508063464710e-01 + 7.085753789925818e-01 + 7.069038930034782e-01 + 7.052363390742027e-01 + 7.035727080638011e-01 + 7.019129907750439e-01 + 7.002571779481277e-01 + 6.986052604437083e-01 + 6.969572291357313e-01 + 6.953130748988353e-01 + 6.936727887020229e-01 + 6.920363614522840e-01 + 6.904037839913317e-01 + 6.887750473773369e-01 + 6.871501426160253e-01 + 6.855290605871678e-01 + 6.839117924040222e-01 + 6.822983292013320e-01 + 6.806886620123715e-01 + 6.790827818618205e-01 + 6.774806798407976e-01 + 6.758823471448717e-01 + 6.742877749381793e-01 + 6.726969543916550e-01 + 6.711098767181217e-01 + 6.695265330883416e-01 + 6.679469147191758e-01 + 6.663710129607012e-01 + 6.647988190816884e-01 + 6.632303243195694e-01 + 6.616655199754741e-01 + 6.601043974442724e-01 + 6.585469481315596e-01 + 6.569931633409668e-01 + 6.554430344698831e-01 + 6.538965529680326e-01 + 6.523537102216029e-01 + 6.508144977390269e-01 + 6.492789070902356e-01 + 6.477469297088367e-01 + 6.462185570471877e-01 + 6.446937806333431e-01 + 6.431725921186934e-01 + 6.416549831028872e-01 + 6.401409451291091e-01 + 6.386304698205402e-01 + 6.371235488250266e-01 + 6.356201737964903e-01 + 6.341203364004929e-01 + 6.326240283504814e-01 + 6.311312414023209e-01 + 6.296419672600960e-01 + 6.281561976359686e-01 + 6.266739242956670e-01 + 6.251951391194286e-01 + 6.237198339322255e-01 + 6.222480004492102e-01 + 6.207796305731890e-01 + 6.193147162378443e-01 + 6.178532493027741e-01 + 6.163952216645050e-01 + 6.149406252489860e-01 + 6.134894519984210e-01 + 6.120416938491114e-01 + 6.105973427932988e-01 + 6.091563909278429e-01 + 6.077188302116784e-01 + 6.062846526061169e-01 + 6.048538502614210e-01 + 6.034264152733694e-01 + 6.020023397068369e-01 + 6.005816156757759e-01 + 5.991642353027361e-01 + 5.977501907311656e-01 + 5.963394741611191e-01 + 5.949320777981851e-01 + 5.935279938331314e-01 + 5.921272144271874e-01 + 5.907297318514260e-01 + 5.893355384452119e-01 + 5.879446264415406e-01 + 5.865569881004723e-01 + 5.851726157460215e-01 + 5.837915017610071e-01 + 5.824136384878618e-01 + 5.810390182425506e-01 + 5.796676334763571e-01 + 5.782994765837256e-01 + 5.769345398883866e-01 + 5.755728159164172e-01 + 5.742142971757567e-01 + 5.728589760824728e-01 + 5.715068451452269e-01 + 5.701578968814059e-01 + 5.688121237820786e-01 + 5.674695184134964e-01 + 5.661300733449661e-01 + 5.647937811172017e-01 + 5.634606343850478e-01 + 5.621306258016221e-01 + 5.608037479323033e-01 + 5.594799934047830e-01 + 5.581593548937616e-01 + 5.568418251014721e-01 + 5.555273967809645e-01 + 5.542160626584934e-01 + 5.529078153599613e-01 + 5.516026476869607e-01 + 5.503005524879265e-01 + 5.490015224489507e-01 + 5.477055503706971e-01 + 5.464126291394721e-01 + 5.451227516109934e-01 + 5.438359105997491e-01 + 5.425520989229732e-01 + 5.412713094911021e-01 + 5.399935352390902e-01 + 5.387187691034094e-01 + 5.374470040087604e-01 + 5.361782329113639e-01 + 5.349124487848638e-01 + 5.336496445514358e-01 + 5.323898132502169e-01 + 5.311329480044003e-01 + 5.298790417206248e-01 + 5.286280874266170e-01 + 5.273800783238198e-01 + 5.261350074387794e-01 + 5.248928678300107e-01 + 5.236536526638225e-01 + 5.224173550711992e-01 + 5.211839681868924e-01 + 5.199534851768893e-01 + 5.187258992380968e-01 + 5.175012035574781e-01 + 5.162793913049719e-01 + 5.150604557657682e-01 + 5.138443902158373e-01 + 5.126311878387027e-01 + 5.114208419243966e-01 + 5.102133457996210e-01 + 5.090086927559088e-01 + 5.078068761246483e-01 + 5.066078892445277e-01 + 5.054117254264059e-01 + 5.042183780707232e-01 + 5.030278406156905e-01 + 5.018401064512819e-01 + 5.006551689399448e-01 + 4.994730214827681e-01 + 4.982936576173500e-01 + 4.971170708196209e-01 + 4.959432545161117e-01 + 4.947722021784954e-01 + 4.936039073158257e-01 + 4.924383634713059e-01 + 4.912755642215030e-01 + 4.901155031029966e-01 + 4.889581736357913e-01 + 4.878035694426762e-01 + 4.866516841617155e-01 + 4.855025114095978e-01 + 4.843560447562852e-01 + 4.832122778219742e-01 + 4.820712043014287e-01 + 4.809328179063641e-01 + 4.797971123302187e-01 + 4.786640812406847e-01 + 4.775337183184862e-01 + 4.764060173050261e-01 + 4.752809720122764e-01 + 4.741585762111217e-01 + 4.730388236459319e-01 + 4.719217080626099e-01 + 4.708072233097221e-01 + 4.696953632391141e-01 + 4.685861216425942e-01 + 4.674794923970907e-01 + 4.663754693817960e-01 + 4.652740464091041e-01 + 4.641752174102053e-01 + 4.630789763262008e-01 + 4.619853169869301e-01 + 4.608942333544824e-01 + 4.598057194461572e-01 + 4.587197692038988e-01 + 4.576363766028796e-01 + 4.565555356433393e-01 + 4.554772403132010e-01 + 4.544014845983438e-01 + 4.533282625263808e-01 + 4.522575682421708e-01 + 4.511893957834002e-01 + 4.501237391381080e-01 + 4.490605924783677e-01 + 4.479999499003729e-01 + 4.469418054464263e-01 + 4.458861533467765e-01 + 4.448329877503518e-01 + 4.437823027182840e-01 + 4.427340924804984e-01 + 4.416883512661691e-01 + 4.406450732493647e-01 + 4.396042525949710e-01 + 4.385658835318161e-01 + 4.375299603591805e-01 + 4.364964773180230e-01 + 4.354654286529535e-01 + 4.344368086449737e-01 + 4.334106115882546e-01 + 4.323868317973252e-01 + 4.313654636098987e-01 + 4.303465013528135e-01 + 4.293299393608014e-01 + 4.283157719943348e-01 + 4.273039936389254e-01 + 4.262945986862648e-01 + 4.252875815207442e-01 + 4.242829365388910e-01 + 4.232806581737543e-01 + 4.222807409163533e-01 + 4.212831792180283e-01 + 4.202879675160039e-01 + 4.192951002821390e-01 + 4.183045720190468e-01 + 4.173163772308877e-01 + 4.163305103895081e-01 + 4.153469660738844e-01 + 4.143657388899517e-01 + 4.133868232899575e-01 + 4.124102138463511e-01 + 4.114359052122226e-01 + 4.104638919136763e-01 + 4.094941685453110e-01 + 4.085267297797091e-01 + 4.075615702608746e-01 + 4.065986846247451e-01 + 4.056380675149961e-01 + 4.046797136100241e-01 + 4.037236175791848e-01 + 4.027697740867438e-01 + 4.018181778668817e-01 + 4.008688236537185e-01 + 3.999217061664900e-01 + 3.989768201804763e-01 + 3.980341604347806e-01 + 3.970937216243767e-01 + 3.961554986257766e-01 + 3.952194862561716e-01 + 3.942856791749246e-01 + 3.933540722797152e-01 + 3.924246604937682e-01 + 3.914974386057962e-01 + 3.905724013991230e-01 + 3.896495437210211e-01 + 3.887288605266558e-01 + 3.878103467384126e-01 + 3.868939972364765e-01 + 3.859798068708922e-01 + 3.850677705778728e-01 + 3.841578833358520e-01 + 3.832501400994028e-01 + 3.823445358203205e-01 + 3.814410654593080e-01 + 3.805397240004402e-01 + 3.796405064500310e-01 + 3.787434078281850e-01 + 3.778484231550217e-01 + 3.769555474293507e-01 + 3.760647756653435e-01 + 3.751761029803938e-01 + 3.742895244689736e-01 + 3.734050351897463e-01 + 3.725226302131253e-01 + 3.716423046174657e-01 + 3.707640535037849e-01 + 3.698878720450124e-01 + 3.690137553825144e-01 + 3.681416986254492e-01 + 3.672716969834960e-01 + 3.664037456169829e-01 + 3.655378396196581e-01 + 3.646739742353085e-01 + 3.638121447254376e-01 + 3.629523462980791e-01 + 3.620945741078652e-01 + 3.612388233782960e-01 + 3.603850894480597e-01 + 3.595333675652969e-01 + 3.586836529581271e-01 + 3.578359408972814e-01 + 3.569902267099870e-01 + 3.561465057284826e-01 + 3.553047732480240e-01 + 3.544650245489661e-01 + 3.536272549462773e-01 + 3.527914598373741e-01 + 3.519576346281267e-01 + 3.511257746893044e-01 + 3.502958753213151e-01 + 3.494679319027064e-01 + 3.486419398734283e-01 + 3.478178946841421e-01 + 3.469957917542031e-01 + 3.461756264906874e-01 + 3.453573943334770e-01 + 3.445410907466465e-01 + 3.437267112053919e-01 + 3.429142511753236e-01 + 3.421037061357636e-01 + 3.412950715914754e-01 + 3.404883430871680e-01 + 3.396835161220511e-01 + 3.388805861778083e-01 + 3.380795488742585e-01 + 3.372803997559251e-01 + 3.364831342820857e-01 + 3.356877480644493e-01 + 3.348942367473924e-01 + 3.341025959445759e-01 + 3.333128211902062e-01 + 3.325249080644813e-01 + 3.317388522349806e-01 + 3.309546493345364e-01 + 3.301722950123494e-01 + 3.293917849546400e-01 + 3.286131147929292e-01 + 3.278362801760134e-01 + 3.270612768173198e-01 + 3.262881004205997e-01 + 3.255167466776044e-01 + 3.247472112772871e-01 + 3.239794899591130e-01 + 3.232135784952971e-01 + 3.224494726613195e-01 + 3.216871681318617e-01 + 3.209266606147330e-01 + 3.201679460077643e-01 + 3.194110200806869e-01 + 3.186558785671545e-01 + 3.179025173467112e-01 + 3.171509322207308e-01 + 3.164011189537259e-01 + 3.156530734030461e-01 + 3.149067914068442e-01 + 3.141622688005587e-01 + 3.134195014964591e-01 + 3.126784853846941e-01 + 3.119392163234083e-01 + 3.112016901727622e-01 + 3.104659028247113e-01 + 3.097318502149898e-01 + 3.089995283319454e-01 + 3.082689330721005e-01 + 3.075400602663161e-01 + 3.068129059444455e-01 + 3.060874661234649e-01 + 3.053637367362504e-01 + 3.046417137079979e-01 + 3.039213930418579e-01 + 3.032027708160949e-01 + 3.024858429572295e-01 + 3.017706054435225e-01 + 3.010570543910775e-01 + 3.003451858060657e-01 + 2.996349956970866e-01 + 2.989264801519126e-01 + 2.982196352437723e-01 + 2.975144570351090e-01 + 2.968109415899733e-01 + 2.961090850010212e-01 + 2.954088833712375e-01 + 2.947103327960572e-01 + 2.940134293733013e-01 + 2.933181692489545e-01 + 2.926245486550200e-01 + 2.919325636534309e-01 + 2.912422103009782e-01 + 2.905534849067459e-01 + 2.898663836341845e-01 + 2.891809025716850e-01 + 2.884970379499296e-01 + 2.878147859946116e-01 + 2.871341429080666e-01 + 2.864551048929091e-01 + 2.857776681836698e-01 + 2.851018290276999e-01 + 2.844275836247271e-01 + 2.837549281975342e-01 + 2.830838590248334e-01 + 2.824143724756855e-01 + 2.817464648036653e-01 + 2.810801321714598e-01 + 2.804153709678348e-01 + 2.797521775256636e-01 + 2.790905480675208e-01 + 2.784304789557904e-01 + 2.777719665515425e-01 + 2.771150071618110e-01 + 2.764595971293084e-01 + 2.758057328280932e-01 + 2.751534106502780e-01 + 2.745026269461392e-01 + 2.738533780697315e-01 + 2.732056604090851e-01 + 2.725594703611444e-01 + 2.719148043516682e-01 + 2.712716588414341e-01 + 2.706300302048149e-01 + 2.699899148252890e-01 + 2.693513091897057e-01 + 2.687142097803046e-01 + 2.680786130525787e-01 + 2.674445154290628e-01 + 2.668119133864937e-01 + 2.661808034370396e-01 + 2.655511820876730e-01 + 2.649230457933240e-01 + 2.642963910212357e-01 + 2.636712143601993e-01 + 2.630475123173707e-01 + 2.624252813696634e-01 + 2.618045181320832e-01 + 2.611852191534089e-01 + 2.605673809346502e-01 + 2.599510000768786e-01 + 2.593360731482656e-01 + 2.587225966857610e-01 + 2.581105673020023e-01 + 2.574999816218594e-01 + 2.568908362541323e-01 + 2.562831277681717e-01 + 2.556768527608984e-01 + 2.550720078808991e-01 + 2.544685898158210e-01 + 2.538665952029344e-01 + 2.532660206235198e-01 + 2.526668627769018e-01 + 2.520691183671673e-01 + 2.514727840477828e-01 + 2.508778564832650e-01 + 2.502843323450471e-01 + 2.496922083184503e-01 + 2.491014811741685e-01 + 2.485121476502302e-01 + 2.479242043768022e-01 + 2.473376480750936e-01 + 2.467524755330193e-01 + 2.461686835577825e-01 + 2.455862688342147e-01 + 2.450052280577099e-01 + 2.444255580815592e-01 + 2.438472556710649e-01 + 2.432703175621061e-01 + 2.426947405763887e-01 + 2.421205215374063e-01 + 2.415476572469543e-01 + 2.409761444715131e-01 + 2.404059800179439e-01 + 2.398371607406130e-01 + 2.392696835287547e-01 + 2.387035451998669e-01 + 2.381387425460481e-01 + 2.375752724876774e-01 + 2.370131319015487e-01 + 2.364523176042576e-01 + 2.358928264341899e-01 + 2.353346553264918e-01 + 2.347778012643444e-01 + 2.342222610470114e-01 + 2.336680315481888e-01 + 2.331151097630285e-01 + 2.325634926002070e-01 + 2.320131769932555e-01 + 2.314641599195968e-01 + 2.309164382391606e-01 + 2.303700088852327e-01 + 2.298248689205450e-01 + 2.292810152383314e-01 + 2.287384447851956e-01 + 2.281971546639490e-01 + 2.276571417710518e-01 + 2.271184030444375e-01 + 2.265809356255705e-01 + 2.260447364485637e-01 + 2.255098024678978e-01 + 2.249761308577043e-01 + 2.244437185775247e-01 + 2.239125625576918e-01 + 2.233826599324974e-01 + 2.228540078061592e-01 + 2.223266032159731e-01 + 2.218004431318401e-01 + 2.212755246546400e-01 + 2.207518449320089e-01 + 2.202294009962271e-01 + 2.197081899542086e-01 + 2.191882089472320e-01 + 2.186694550184439e-01 + 2.181519252528444e-01 + 2.176356167922184e-01 + 2.171205268020538e-01 + 2.166066524055817e-01 + 2.160939907132310e-01 + 2.155825389406823e-01 + 2.150722942170351e-01 + 2.145632535999474e-01 + 2.140554143128364e-01 + 2.135487735713488e-01 + 2.130433285376680e-01 + 2.125390763961598e-01 + 2.120360143225986e-01 + 2.115341394866721e-01 + 2.110334491301104e-01 + 2.105339404911263e-01 + 2.100356107692428e-01 + 2.095384571593845e-01 + 2.090424768875718e-01 + 2.085476672286868e-01 + 2.080540254649787e-01 + 2.075615488420417e-01 + 2.070702345483775e-01 + 2.065800798220710e-01 + 2.060910819584345e-01 + 2.056032383022174e-01 + 2.051165461242101e-01 + 2.046310026800104e-01 + 2.041466052775261e-01 + 2.036633511978056e-01 + 2.031812377402102e-01 + 2.027002622847228e-01 + 2.022204221329609e-01 + 2.017417145657832e-01 + 2.012641369577989e-01 + 2.007876866366623e-01 + 2.003123609141739e-01 + 1.998381571847571e-01 + 1.993650728223044e-01 + 1.988931051658790e-01 + 1.984222515391579e-01 + 1.979525093566432e-01 + 1.974838760798574e-01 + 1.970163490394448e-01 + 1.965499255924087e-01 + 1.960846031634822e-01 + 1.956203792216227e-01 + 1.951572511456189e-01 + 1.946952162469976e-01 + 1.942342720345011e-01 + 1.937744160087473e-01 + 1.933156455855021e-01 + 1.928579581617409e-01 + 1.924013511601302e-01 + 1.919458220512063e-01 + 1.914913683490730e-01 + 1.910379875218400e-01 + 1.905856769690048e-01 + 1.901344342343178e-01 + 1.896842568245793e-01 + 1.892351421122624e-01 + 1.887870876905098e-01 + 1.883400911382459e-01 + 1.878941498265747e-01 + 1.874492612709913e-01 + 1.870054230608876e-01 + 1.865626327533365e-01 + 1.861208878413260e-01 + 1.856801858136446e-01 + 1.852405242290795e-01 + 1.848019006561455e-01 + 1.843643126785636e-01 + 1.839277579090688e-01 + 1.834922338318696e-01 + 1.830577379260484e-01 + 1.826242679175190e-01 + 1.821918214082343e-01 + 1.817603959062191e-01 + 1.813299890419420e-01 + 1.809005984096844e-01 + 1.804722215715290e-01 + 1.800448561676805e-01 + 1.796184998471616e-01 + 1.791931502428031e-01 + 1.787688049585256e-01 + 1.783454616010165e-01 + 1.779231178061076e-01 + 1.775017712916434e-01 + 1.770814197185338e-01 + 1.766620606643876e-01 + 1.762436917707559e-01 + 1.758263107475443e-01 + 1.754099153420786e-01 + 1.749945031691721e-01 + 1.745800718793870e-01 + 1.741666192327871e-01 + 1.737541428912765e-01 + 1.733426405128906e-01 + 1.729321098263452e-01 + 1.725225486037993e-01 + 1.721139545737653e-01 + 1.717063253659770e-01 + 1.712996586978482e-01 + 1.708939523524782e-01 + 1.704892041326627e-01 + 1.700854117308264e-01 + 1.696825728315613e-01 + 1.692806852413719e-01 + 1.688797467224855e-01 + 1.684797550119726e-01 + 1.680807078836749e-01 + 1.676826031516292e-01 + 1.672854386236076e-01 + 1.668892120257625e-01 + 1.664939211364053e-01 + 1.660995637803862e-01 + 1.657061377653481e-01 + 1.653136408872399e-01 + 1.649220709518862e-01 + 1.645314258210089e-01 + 1.641417032838678e-01 + 1.637529010922642e-01 + 1.633650171697226e-01 + 1.629780493848234e-01 + 1.625919955117979e-01 + 1.622068533722165e-01 + 1.618226208359533e-01 + 1.614392958070308e-01 + 1.610568761629498e-01 + 1.606753597398519e-01 + 1.602947443525945e-01 + 1.599150279328092e-01 + 1.595362083976419e-01 + 1.591582835876941e-01 + 1.587812513806259e-01 + 1.584051096895935e-01 + 1.580298564486488e-01 + 1.576554895336735e-01 + 1.572820068494865e-01 + 1.569094063844064e-01 + 1.565376859935812e-01 + 1.561668435389086e-01 + 1.557968770322644e-01 + 1.554277844430587e-01 + 1.550595637013555e-01 + 1.546922127252644e-01 + 1.543257294352004e-01 + 1.539601117962810e-01 + 1.535953578647676e-01 + 1.532314655336160e-01 + 1.528684326732572e-01 + 1.525062574192351e-01 + 1.521449377506904e-01 + 1.517844715391133e-01 + 1.514248568043021e-01 + 1.510660915767141e-01 + 1.507081738546517e-01 + 1.503511015850067e-01 + 1.499948728018673e-01 + 1.496394855976185e-01 + 1.492849379312514e-01 + 1.489312277844460e-01 + 1.485783532079666e-01 + 1.482263122946834e-01 + 1.478751030581660e-01 + 1.475247234388987e-01 + 1.471751715323068e-01 + 1.468264454469171e-01 + 1.464785432366154e-01 + 1.461314629165984e-01 + 1.457852025452889e-01 + 1.454397602433564e-01 + 1.450951340257908e-01 + 1.447513219420110e-01 + 1.444083221508569e-01 + 1.440661327109938e-01 + 1.437247516822454e-01 + 1.433841772072484e-01 + 1.430444073901374e-01 + 1.427054403077353e-01 + 1.423672740371242e-01 + 1.420299067307786e-01 + 1.416933365389871e-01 + 1.413575615237460e-01 + 1.410225798197031e-01 + 1.406883895901710e-01 + 1.403549889435149e-01 + 1.400223760032770e-01 + 1.396905489310608e-01 + 1.393595059398338e-01 + 1.390292451224472e-01 + 1.386997645496112e-01 + 1.383710625136722e-01 + 1.380431371824567e-01 + 1.377159866326167e-01 + 1.373896091055998e-01 + 1.370640027752214e-01 + 1.367391657592925e-01 + 1.364150963290927e-01 + 1.360917926783734e-01 + 1.357692529162330e-01 + 1.354474752994454e-01 + 1.351264580487222e-01 + 1.348061993122180e-01 + 1.344866973181728e-01 + 1.341679503229942e-01 + 1.338499565682958e-01 + 1.335327142013654e-01 + 1.332162214320106e-01 + 1.329004765902875e-01 + 1.325854779258548e-01 + 1.322712236439755e-01 + 1.319577119415115e-01 + 1.316449410589970e-01 + 1.313329092858229e-01 + 1.310216149439378e-01 + 1.307110562100912e-01 + 1.304012313067827e-01 + 1.300921386594473e-01 + 1.297837764741680e-01 + 1.294761429396481e-01 + 1.291692364743583e-01 + 1.288630553353233e-01 + 1.285575977268189e-01 + 1.282528620001082e-01 + 1.279488464604472e-01 + 1.276455493846629e-01 + 1.273429690961771e-01 + 1.270411039265308e-01 + 1.267399521912149e-01 + 1.264395121606617e-01 + 1.261397821624623e-01 + 1.258407605612416e-01 + 1.255424456647032e-01 + 1.252448358003494e-01 + 1.249479293256652e-01 + 1.246517245985584e-01 + 1.243562199440227e-01 + 1.240614136699035e-01 + 1.237673041530004e-01 + 1.234738897833225e-01 + 1.231811689369122e-01 + 1.228891399541342e-01 + 1.225978011897444e-01 + 1.223071510285007e-01 + 1.220171878485729e-01 + 1.217279100221359e-01 + 1.214393159216827e-01 + 1.211514039479249e-01 + 1.208641725134118e-01 + 1.205776200272462e-01 + 1.202917448643591e-01 + 1.200065453999493e-01 + 1.197220200388544e-01 + 1.194381672203820e-01 + 1.191549853738593e-01 + 1.188724728867774e-01 + 1.185906281982059e-01 + 1.183094497403516e-01 + 1.180289358802264e-01 + 1.177490851172322e-01 + 1.174698959467804e-01 + 1.171913666738082e-01 + 1.169134957966049e-01 + 1.166362818664215e-01 + 1.163597231976005e-01 + 1.160838182295854e-01 + 1.158085654926154e-01 + 1.155339634301463e-01 + 1.152600105152270e-01 + 1.149867052503320e-01 + 1.147140461081585e-01 + 1.144420315115333e-01 + 1.141706598827868e-01 + 1.138999297876022e-01 + 1.136298397724347e-01 + 1.133603883121320e-01 + 1.130915738073908e-01 + 1.128233947404400e-01 + 1.125558496925181e-01 + 1.122889371862514e-01 + 1.120226557224089e-01 + 1.117570037925019e-01 + 1.114919798574519e-01 + 1.112275824488763e-01 + 1.109638101830490e-01 + 1.107006615250319e-01 + 1.104381349837027e-01 + 1.101762291935612e-01 + 1.099149425817940e-01 + 1.096542736337556e-01 + 1.093942210611990e-01 + 1.091347833750166e-01 + 1.088759590309823e-01 + 1.086177465849946e-01 + 1.083601446468375e-01 + 1.081031518187680e-01 + 1.078467666394599e-01 + 1.075909876365943e-01 + 1.073358133695979e-01 + 1.070812424691808e-01 + 1.068272734935852e-01 + 1.065739049762412e-01 + 1.063211355273724e-01 + 1.060689637753818e-01 + 1.058173883167701e-01 + 1.055664076522099e-01 + 1.053160204177178e-01 + 1.050662253083730e-01 + 1.048170208178578e-01 + 1.045684055544151e-01 + 1.043203782231123e-01 + 1.040729373745031e-01 + 1.038260815947437e-01 + 1.035798095388146e-01 + 1.033341198496129e-01 + 1.030890111353506e-01 + 1.028444819874746e-01 + 1.026005310752415e-01 + 1.023571570589419e-01 + 1.021143585605686e-01 + 1.018721342063349e-01 + 1.016304826397723e-01 + 1.013894025261397e-01 + 1.011488925387934e-01 + 1.009089513225976e-01 + 1.006695774897203e-01 + 1.004307697412456e-01 + 1.001925267601519e-01 + 9.995484714928184e-02 + 9.971772961029543e-02 + 9.948117285600222e-02 + 9.924517553207431e-02 + 9.900973631553432e-02 + 9.877485389836264e-02 + 9.854052696321766e-02 + 9.830675420513860e-02 + 9.807353432053509e-02 + 9.784086599274402e-02 + 9.760874792461041e-02 + 9.737717882679013e-02 + 9.714615739564664e-02 + 9.691568233864475e-02 + 9.668575237168565e-02 + 9.645636620785530e-02 + 9.622752256709627e-02 + 9.599922017186617e-02 + 9.577145773476621e-02 + 9.554423398421420e-02 + 9.531754766036228e-02 + 9.509139748951084e-02 + 9.486578220406576e-02 + 9.464070054491446e-02 + 9.441615125061270e-02 + 9.419213306609350e-02 + 9.396864474309072e-02 + 9.374568502973517e-02 + 9.352325267700241e-02 + 9.330134644110695e-02 + 9.307996508088016e-02 + 9.285910736057421e-02 + 9.263877204899980e-02 + 9.241895790580944e-02 + 9.219966369924239e-02 + 9.198088821288498e-02 + 9.176263021506216e-02 + 9.154488848131032e-02 + 9.132766180778470e-02 + 9.111094897456264e-02 + 9.089474876186458e-02 + 9.067905996494766e-02 + 9.046388137755315e-02 + 9.024921179550818e-02 + 9.003505002157913e-02 + 8.982139485394958e-02 + 8.960824509461397e-02 + 8.939559956013639e-02 + 8.918345705664489e-02 + 8.897181638949078e-02 + 8.876067638185769e-02 + 8.855003585659860e-02 + 8.833989363307079e-02 + 8.813024852794749e-02 + 8.792109937217552e-02 + 8.771244500411417e-02 + 8.750428424959714e-02 + 8.729661594151820e-02 + 8.708943892038122e-02 + 8.688275202450782e-02 + 8.667655409894154e-02 + 8.647084399500883e-02 + 8.626562056133152e-02 + 8.606088264727801e-02 + 8.585662910508592e-02 + 8.565285879275303e-02 + 8.544957056834111e-02 + 8.524676329099723e-02 + 8.504443583456130e-02 + 8.484258706983651e-02 + 8.464121585953427e-02 + 8.444032107793580e-02 + 8.423990160173883e-02 + 8.403995630660985e-02 + 8.384048408000297e-02 + 8.364148380739438e-02 + 8.344295436518863e-02 + 8.324489464319758e-02 + 8.304730353631981e-02 + 8.285017993778075e-02 + 8.265352274723796e-02 + 8.245733086610936e-02 + 8.226160319325253e-02 + 8.206633863307464e-02 + 8.187153609323948e-02 + 8.167719448173898e-02 + 8.148331271120264e-02 + 8.128988969775824e-02 + 8.109692435907066e-02 + 8.090441561287741e-02 + 8.071236238052074e-02 + 8.052076359329230e-02 + 8.032961817777003e-02 + 8.013892505875637e-02 + 7.994868317110082e-02 + 7.975889145271257e-02 + 7.956954884117817e-02 + 7.938065427030368e-02 + 7.919220668490153e-02 + 7.900420503735811e-02 + 7.881664826626886e-02 + 7.862953532075569e-02 + 7.844286516277023e-02 + 7.825663674598571e-02 + 7.807084902471831e-02 + 7.788550095723919e-02 + 7.770059150356423e-02 + 7.751611963202924e-02 + 7.733208431808952e-02 + 7.714848452080215e-02 + 7.696531920714285e-02 + 7.678258736267791e-02 + 7.660028796508990e-02 + 7.641841999039113e-02 + 7.623698241865759e-02 + 7.605597423593993e-02 + 7.587539442823407e-02 + 7.569524197859213e-02 + 7.551551588287067e-02 + 7.533621514035872e-02 + 7.515733874432233e-02 + 7.497888568830134e-02 + 7.480085497230264e-02 + 7.462324560850588e-02 + 7.444605660139321e-02 + 7.426928695221670e-02 + 7.409293566891996e-02 + 7.391700176673981e-02 + 7.374148426439617e-02 + 7.356638217848553e-02 + 7.339169452681224e-02 + 7.321742033027905e-02 + 7.304355861552074e-02 + 7.287010840815517e-02 + 7.269706873346385e-02 + 7.252443862192341e-02 + 7.235221710900047e-02 + 7.218040323296335e-02 + 7.200899602923243e-02 + 7.183799453782064e-02 + 7.166739780328910e-02 + 7.149720486628935e-02 + 7.132741477295296e-02 + 7.115802657678706e-02 + 7.098903933028558e-02 + 7.082045208266741e-02 + 7.065226388294948e-02 + 7.048447379884398e-02 + 7.031708089501212e-02 + 7.015008422428966e-02 + 6.998348285005500e-02 + 6.981727584178653e-02 + 6.965146227138255e-02 + 6.948604121024822e-02 + 6.932101172952453e-02 + 6.915637290177927e-02 + 6.899212381049466e-02 + 6.882826353831664e-02 + 6.866479115768206e-02 + 6.850170575553913e-02 + 6.833900642241270e-02 + 6.817669223943085e-02 + 6.801476230171261e-02 + 6.785321570853013e-02 + 6.769205154760372e-02 + 6.753126891476798e-02 + 6.737086691265436e-02 + 6.721084464422118e-02 + 6.705120121123045e-02 + 6.689193571639933e-02 + 6.673304726820108e-02 + 6.657453497707803e-02 + 6.641639795452120e-02 + 6.625863531334618e-02 + 6.610124617104705e-02 + 6.594422964866814e-02 + 6.578758486543299e-02 + 6.563131094165708e-02 + 6.547540700031643e-02 + 6.531987216906585e-02 + 6.516470557837332e-02 + 6.500990635997374e-02 + 6.485547364331327e-02 + 6.470140656204018e-02 + 6.454770425495959e-02 + 6.439436585565442e-02 + 6.424139050518185e-02 + 6.408877735587415e-02 + 6.393652554954243e-02 + 6.378463422860429e-02 + 6.363310254304622e-02 + 6.348192964216136e-02 + 6.333111467891862e-02 + 6.318065681259971e-02 + 6.303055519506789e-02 + 6.288080898167979e-02 + 6.273141734118348e-02 + 6.258237943694549e-02 + 6.243369443027962e-02 + 6.228536148636779e-02 + 6.213737977420020e-02 + 6.198974846629291e-02 + 6.184246673830131e-02 + 6.169553375986874e-02 + 6.154894870195880e-02 + 6.140271075002260e-02 + 6.125681908485271e-02 + 6.111127288458502e-02 + 6.096607133498923e-02 + 6.082121362330186e-02 + 6.067669893778977e-02 + 6.053252647002724e-02 + 6.038869541057570e-02 + 6.024520494995262e-02 + 6.010205428441878e-02 + 5.995924261312039e-02 + 5.981676913606451e-02 + 5.967463305068377e-02 + 5.953283356000520e-02 + 5.939136987405440e-02 + 5.925024120274393e-02 + 5.910944675075109e-02 + 5.896898572024133e-02 + 5.882885733338872e-02 + 5.868906080796419e-02 + 5.854959534943303e-02 + 5.841046018167366e-02 + 5.827165452667381e-02 + 5.813317759547484e-02 + 5.799502862000658e-02 + 5.785720683145133e-02 + 5.771971144629215e-02 + 5.758254169802959e-02 + 5.744569682168989e-02 + 5.730917604038396e-02 + 5.717297859181381e-02 + 5.703710371771920e-02 + 5.690155065150715e-02 + 5.676631863514842e-02 + 5.663140691176988e-02 + 5.649681471550019e-02 + 5.636254129818796e-02 + 5.622858591623749e-02 + 5.609494780637568e-02 + 5.596162621719655e-02 + 5.582862040612746e-02 + 5.569592962469259e-02 + 5.556355312969728e-02 + 5.543149018219354e-02 + 5.529974004038473e-02 + 5.516830196534387e-02 + 5.503717522021812e-02 + 5.490635906464716e-02 + 5.477585276550550e-02 + 5.464565559606692e-02 + 5.451576682310098e-02 + 5.438618571514530e-02 + 5.425691154653305e-02 + 5.412794360021059e-02 + 5.399928115030668e-02 + 5.387092346220070e-02 + 5.374286982722595e-02 + 5.361511953114147e-02 + 5.348767184376742e-02 + 5.336052605560348e-02 + 5.323368145967647e-02 + 5.310713734132736e-02 + 5.298089299097181e-02 + 5.285494769998652e-02 + 5.272930075794034e-02 + 5.260395145882699e-02 + 5.247889910164562e-02 + 5.235414299012888e-02 + 5.222968242359068e-02 + 5.210551670083303e-02 + 5.198164512479836e-02 + 5.185806699751586e-02 + 5.173478162567831e-02 + 5.161178832737659e-02 + 5.148908640731603e-02 + 5.136667516904735e-02 + 5.124455393713079e-02 + 5.112272202541198e-02 + 5.100117874145336e-02 + 5.087992340415878e-02 + 5.075895533879782e-02 + 5.063827387090040e-02 + 5.051787831631814e-02 + 5.039776799903027e-02 + 5.027794224956293e-02 + 5.015840039018700e-02 + 5.003914174911826e-02 + 4.992016566217095e-02 + 4.980147146451835e-02 + 4.968305848565534e-02 + 4.956492605368701e-02 + 4.944707351707827e-02 + 4.932950021762891e-02 + 4.921220548403189e-02 + 4.909518865563611e-02 + 4.897844908008390e-02 + 4.886198610990230e-02 + 4.874579909103274e-02 + 4.862988736593407e-02 + 4.851425027765261e-02 + 4.839888718215429e-02 + 4.828379743688660e-02 + 4.816898039344981e-02 + 4.805443540666063e-02 + 4.794016183433197e-02 + 4.782615903628512e-02 + 4.771242637003347e-02 + 4.759896319572905e-02 + 4.748576888074151e-02 + 4.737284278529100e-02 + 4.726018427180961e-02 + 4.714779271742187e-02 + 4.703566749191604e-02 + 4.692380796083007e-02 + 4.681221349433169e-02 + 4.670088346648602e-02 + 4.658981725459431e-02 + 4.647901423861556e-02 + 4.636847379587147e-02 + 4.625819530165282e-02 + 4.614817813294777e-02 + 4.603842167462240e-02 + 4.592892531626435e-02 + 4.581968844113481e-02 + 4.571071043517037e-02 + 4.560199068716930e-02 + 4.549352858172214e-02 + 4.538532351139604e-02 + 4.527737487551017e-02 + 4.516968206047602e-02 + 4.506224446147816e-02 + 4.495506148526871e-02 + 4.484813252205796e-02 + 4.474145696749865e-02 + 4.463503423038843e-02 + 4.452886371233129e-02 + 4.442294481444441e-02 + 4.431727694184067e-02 + 4.421185950249874e-02 + 4.410669190344264e-02 + 4.400177354999718e-02 + 4.389710385863231e-02 + 4.379268224561385e-02 + 4.368850811842072e-02 + 4.358458089102907e-02 + 4.348089998166713e-02 + 4.337746480946211e-02 + 4.327427479290449e-02 + 4.317132935104961e-02 + 4.306862790538591e-02 + 4.296616988021409e-02 + 4.286395470044128e-02 + 4.276198178905291e-02 + 4.266025057462805e-02 + 4.255876048879523e-02 + 4.245751096050290e-02 + 4.235650142249979e-02 + 4.225573130868781e-02 + 4.215520004666404e-02 + 4.205490707118502e-02 + 4.195485182346907e-02 + 4.185503374212908e-02 + 4.175545226547943e-02 + 4.165610683241490e-02 + 4.155699688308426e-02 + 4.145812186261490e-02 + 4.135948121993713e-02 + 4.126107439911159e-02 + 4.116290084444992e-02 + 4.106496000347922e-02 + 4.096725133001662e-02 + 4.086977427671171e-02 + 4.077252829257245e-02 + 4.067551282880393e-02 + 4.057872734137224e-02 + 4.048217129089726e-02 + 4.038584413229004e-02 + 4.028974532214836e-02 + 4.019387432351806e-02 + 4.009823059884492e-02 + 4.000281360871143e-02 + 3.990762281263916e-02 + 3.981265768084040e-02 + 3.971791768404272e-02 + 3.962340228400397e-02 + 3.952911094818634e-02 + 3.943504314911767e-02 + 3.934119836154264e-02 + 3.924757605343093e-02 + 3.915417569553582e-02 + 3.906099677494528e-02 + 3.896803876462888e-02 + 3.887530113159737e-02 + 3.878278335807980e-02 + 3.869048493136602e-02 + 3.859840533540703e-02 + 3.850654403935494e-02 + 3.841490053099362e-02 + 3.832347430867683e-02 + 3.823226484521238e-02 + 3.814127162485314e-02 + 3.805049414568009e-02 + 3.795993189727254e-02 + 3.786958436838804e-02 + 3.777945104950908e-02 + 3.768953143238456e-02 + 3.759982501241896e-02 + 3.751033128919119e-02 + 3.742104976390229e-02 + 3.733197993101921e-02 + 3.724312127956968e-02 + 3.715447331892652e-02 + 3.706603555538170e-02 + 3.697780748276271e-02 + 3.688978860838169e-02 + 3.680197844047203e-02 + 3.671437648083043e-02 + 3.662698223859462e-02 + 3.653979522528233e-02 + 3.645281495050149e-02 + 3.636604092401768e-02 + 3.627947265609178e-02 + 3.619310965841749e-02 + 3.610695145022991e-02 + 3.602099755007137e-02 + 3.593524746722872e-02 + 3.584970072102484e-02 + 3.576435683502647e-02 + 3.567921532660211e-02 + 3.559427571435374e-02 + 3.550953752116312e-02 + 3.542500027693078e-02 + 3.534066350384148e-02 + 3.525652672170999e-02 + 3.517258946309138e-02 + 3.508885125628003e-02 + 3.500531162678291e-02 + 3.492197010940873e-02 + 3.483882623525817e-02 + 3.475587953263527e-02 + 3.467312953919303e-02 + 3.459057578876406e-02 + 3.450821781198862e-02 + 3.442605515251815e-02 + 3.434408734999198e-02 + 3.426231393723483e-02 + 3.418073445581654e-02 + 3.409934844816886e-02 + 3.401815545480084e-02 + 3.393715501912345e-02 + 3.385634668688416e-02 + 3.377573000557660e-02 + 3.369530452244349e-02 + 3.361506978424043e-02 + 3.353502533757853e-02 + 3.345517073173793e-02 + 3.337550551749302e-02 + 3.329602924688495e-02 + 3.321674147756795e-02 + 3.313764176353938e-02 + 3.305872964905672e-02 + 3.298000469915312e-02 + 3.290146647870388e-02 + 3.282311452928582e-02 + 3.274494841443989e-02 + 3.266696770524984e-02 + 3.258917195579586e-02 + 3.251156072835543e-02 + 3.243413358906379e-02 + 3.235689009597382e-02 + 3.227982981604406e-02 + 3.220295232152501e-02 + 3.212625717796667e-02 + 3.204974395335523e-02 + 3.197341221860803e-02 + 3.189726154412311e-02 + 3.182129149811844e-02 + 3.174550164996338e-02 + 3.166989158019418e-02 + 3.159446086552403e-02 + 3.151920907660396e-02 + 3.144413578635114e-02 + 3.136924057603768e-02 + 3.129452303273958e-02 + 3.121998273049806e-02 + 3.114561924523454e-02 + 3.107143216011856e-02 + 3.099742105799270e-02 + 3.092358552474080e-02 + 3.084992514925186e-02 + 3.077643951122557e-02 + 3.070312819305190e-02 + 3.062999078663620e-02 + 3.055702688363699e-02 + 3.048423607160382e-02 + 3.041161793396379e-02 + 3.033917207015753e-02 + 3.026689807846873e-02 + 3.019479554128978e-02 + 3.012286404982057e-02 + 3.005110320361238e-02 + 2.997951260681279e-02 + 2.990809185255966e-02 + 2.983684053226568e-02 + 2.976575824919644e-02 + 2.969484460522792e-02 + 2.962409920087884e-02 + 2.955352163824170e-02 + 2.948311151647172e-02 + 2.941286843696999e-02 + 2.934279201383451e-02 + 2.927288185012002e-02 + 2.920313754405053e-02 + 2.913355871301240e-02 + 2.906414496442064e-02 + 2.899489589842786e-02 + 2.892581113440367e-02 + 2.885689028447655e-02 + 2.878813295173805e-02 + 2.871953875071393e-02 + 2.865110730129668e-02 + 2.858283822298987e-02 + 2.851473112218837e-02 + 2.844678561226344e-02 + 2.837900131834860e-02 + 2.831137785774055e-02 + 2.824391484910513e-02 + 2.817661191561155e-02 + 2.810946867322990e-02 + 2.804248474261467e-02 + 2.797565975421473e-02 + 2.790899332866750e-02 + 2.784248508684310e-02 + 2.777613465729838e-02 + 2.770994166752542e-02 + 2.764390574354870e-02 + 2.757802651096095e-02 + 2.751230360164656e-02 + 2.744673664902718e-02 + 2.738132528259552e-02 + 2.731606912935157e-02 + 2.725096782054994e-02 + 2.718602099881922e-02 + 2.712122829441404e-02 + 2.705658933533107e-02 + 2.699210376654040e-02 + 2.692777122629619e-02 + 2.686359134766074e-02 + 2.679956376855050e-02 + 2.673568813034148e-02 + 2.667196407449100e-02 + 2.660839123653040e-02 + 2.654496925932325e-02 + 2.648169779209303e-02 + 2.641857647953893e-02 + 2.635560496230991e-02 + 2.629278288047702e-02 + 2.623010988365326e-02 + 2.616758562366618e-02 + 2.610520975031933e-02 + 2.604298190560967e-02 + 2.598090173551063e-02 + 2.591896889422694e-02 + 2.585718303968204e-02 + 2.579554382343284e-02 + 2.573405088890056e-02 + 2.567270388987125e-02 + 2.561150248485746e-02 + 2.555044633271165e-02 + 2.548953508798725e-02 + 2.542876840653832e-02 + 2.536814594843316e-02 + 2.530766736730480e-02 + 2.524733231969847e-02 + 2.518714047250964e-02 + 2.512709148651639e-02 + 2.506718502244662e-02 + 2.500742074738894e-02 + 2.494779831751132e-02 + 2.488831739145854e-02 + 2.482897764751662e-02 + 2.476977875068464e-02 + 2.471072035836960e-02 + 2.465180213557270e-02 + 2.459302375909131e-02 + 2.453438490494015e-02 + 2.447588522684439e-02 + 2.441752439632618e-02 + 2.435930209686822e-02 + 2.430121799563831e-02 + 2.424327176191257e-02 + 2.418546306971884e-02 + 2.412779159320392e-02 + 2.407025701015483e-02 + 2.401285899981317e-02 + 2.395559723318545e-02 + 2.389847138352894e-02 + 2.384148113010493e-02 + 2.378462615809818e-02 + 2.372790614977233e-02 + 2.367132078182184e-02 + 2.361486973012364e-02 + 2.355855267628842e-02 + 2.350236930912776e-02 + 2.344631931433045e-02 + 2.339040237260871e-02 + 2.333461816188979e-02 + 2.327896637661412e-02 + 2.322344670789084e-02 + 2.316805883183489e-02 + 2.311280243515378e-02 + 2.305767721100430e-02 + 2.300268285332459e-02 + 2.294781904779433e-02 + 2.289308548135576e-02 + 2.283848185163481e-02 + 2.278400785322520e-02 + 2.272966317657758e-02 + 2.267544750906289e-02 + 2.262136054576819e-02 + 2.256740198705395e-02 + 2.251357153295969e-02 + 2.245986887460843e-02 + 2.240629370372433e-02 + 2.235284572997816e-02 + 2.229952464835474e-02 + 2.224633014749699e-02 + 2.219326193897085e-02 + 2.214031972536749e-02 + 2.208750320104361e-02 + 2.203481207216736e-02 + 2.198224604054712e-02 + 2.192980480490446e-02 + 2.187748807809197e-02 + 2.182529556587840e-02 + 2.177322696546572e-02 + 2.172128198614426e-02 + 2.166946034002218e-02 + 2.161776173674180e-02 + 2.156618587797776e-02 + 2.151473246970182e-02 + 2.146340122648612e-02 + 2.141219186176581e-02 + 2.136110408595206e-02 + 2.131013760699968e-02 + 2.125929213929720e-02 + 2.120856739943827e-02 + 2.115796310282077e-02 + 2.110747896148574e-02 + 2.105711468773744e-02 + 2.100686999708853e-02 + 2.095674460640470e-02 + 2.090673823470377e-02 + 2.085685060390323e-02 + 2.080708143284909e-02 + 2.075743043865024e-02 + 2.070789733896461e-02 + 2.065848185338519e-02 + 2.060918370358626e-02 + 2.056000261352416e-02 + 2.051093830731156e-02 + 2.046199050841276e-02 + 2.041315893918832e-02 + 2.036444332670061e-02 + 2.031584339811113e-02 + 2.026735887003067e-02 + 2.021898947028043e-02 + 2.017073493461869e-02 + 2.012259498752183e-02 + 2.007456935661649e-02 + 2.002665777297167e-02 + 1.997885996051357e-02 + 1.993117564943755e-02 + 1.988360457741823e-02 + 1.983614647798445e-02 + 1.978880107994216e-02 + 1.974156811085027e-02 + 1.969444731166336e-02 + 1.964743841723802e-02 + 1.960054115227784e-02 + 1.955375525837354e-02 + 1.950708047707909e-02 + 1.946051654129042e-02 + 1.941406318497287e-02 + 1.936772014474174e-02 + 1.932148716119990e-02 + 1.927536398140690e-02 + 1.922935034564512e-02 + 1.918344598004621e-02 + 1.913765063001423e-02 + 1.909196404425976e-02 + 1.904638595925336e-02 + 1.900091612254435e-02 + 1.895555428061772e-02 + 1.891030016469744e-02 + 1.886515352637163e-02 + 1.882011411999479e-02 + 1.877518167521970e-02 + 1.873035594232305e-02 + 1.868563668110157e-02 + 1.864102363246424e-02 + 1.859651653826993e-02 + 1.855211514697215e-02 + 1.850781921692858e-02 + 1.846362849811174e-02 + 1.841954273425713e-02 + 1.837556167722399e-02 + 1.833168508274460e-02 + 1.828791270638760e-02 + 1.824424429587613e-02 + 1.820067960186819e-02 + 1.815721838079814e-02 + 1.811386039242822e-02 + 1.807060539155448e-02 + 1.802745312809132e-02 + 1.798440336027523e-02 + 1.794145584667328e-02 + 1.789861034396235e-02 + 1.785586661445831e-02 + 1.781322441713358e-02 + 1.777068350457842e-02 + 1.772824363606736e-02 + 1.768590457480606e-02 + 1.764366608520215e-02 + 1.760152792777148e-02 + 1.755948986314423e-02 + 1.751755165530868e-02 + 1.747571306959304e-02 + 1.743397386795286e-02 + 1.739233380686453e-02 + 1.735079266012027e-02 + 1.730935019969591e-02 + 1.726800617515195e-02 + 1.722676035861175e-02 + 1.718561252878033e-02 + 1.714456244423200e-02 + 1.710360987245781e-02 + 1.706275458478830e-02 + 1.702199634263978e-02 + 1.698133492251816e-02 + 1.694077010510486e-02 + 1.690030164730331e-02 + 1.685992932068962e-02 + 1.681965290804600e-02 + 1.677947217681714e-02 + 1.673938689521877e-02 + 1.669939683666028e-02 + 1.665950177991986e-02 + 1.661970150205939e-02 + 1.657999577711447e-02 + 1.654038437906895e-02 + 1.650086708478969e-02 + 1.646144367321789e-02 + 1.642211391798679e-02 + 1.638287759543946e-02 + 1.634373448754158e-02 + 1.630468437732129e-02 + 1.626572704186934e-02 + 1.622686225251448e-02 + 1.618808979718675e-02 + 1.614940946170872e-02 + 1.611082101996680e-02 + 1.607232425440962e-02 + 1.603391895041710e-02 + 1.599560489122978e-02 + 1.595738185903658e-02 + 1.591924963852954e-02 + 1.588120801872957e-02 + 1.584325677844977e-02 + 1.580539569909259e-02 + 1.576762457813194e-02 + 1.572994319938502e-02 + 1.569235134492561e-02 + 1.565484881311209e-02 + 1.561743538476679e-02 + 1.558011083839993e-02 + 1.554287497958433e-02 + 1.550572759639263e-02 + 1.546866846769255e-02 + 1.543169739218311e-02 + 1.539481416304957e-02 + 1.535801856691179e-02 + 1.532131039389481e-02 + 1.528468944222785e-02 + 1.524815551153465e-02 + 1.521170838270258e-02 + 1.517534784896265e-02 + 1.513907371629201e-02 + 1.510288577422132e-02 + 1.506678381600347e-02 + 1.503076764230081e-02 + 1.499483704594779e-02 + 1.495899182406707e-02 + 1.492323178010325e-02 + 1.488755670734373e-02 + 1.485196640180961e-02 + 1.481646066682016e-02 + 1.478103929846549e-02 + 1.474570209596410e-02 + 1.471044886603309e-02 + 1.467527940456368e-02 + 1.464019351058384e-02 + 1.460519099481427e-02 + 1.457027165550810e-02 + 1.453543528903122e-02 + 1.450068170024789e-02 + 1.446601069487559e-02 + 1.443142207965322e-02 + 1.439691566271563e-02 + 1.436249124410753e-02 + 1.432814862414793e-02 + 1.429388761459182e-02 + 1.425970802314729e-02 + 1.422560965483165e-02 + 1.419159231701311e-02 + 1.415765581387266e-02 + 1.412379995194592e-02 + 1.409002455116132e-02 + 1.405632941792580e-02 + 1.402271435207008e-02 + 1.398917917303820e-02 + 1.395572369124169e-02 + 1.392234770932106e-02 + 1.388905104392205e-02 + 1.385583350997071e-02 + 1.382269491788422e-02 + 1.378963507987753e-02 + 1.375665380791922e-02 + 1.372375091366015e-02 + 1.369092621121959e-02 + 1.365817951715469e-02 + 1.362551064978645e-02 + 1.359291942581090e-02 + 1.356040565686591e-02 + 1.352796915179558e-02 + 1.349560973812908e-02 + 1.346332723540702e-02 + 1.343112144483463e-02 + 1.339899219360082e-02 + 1.336693930891053e-02 + 1.333496260043193e-02 + 1.330306188734133e-02 + 1.327123699224855e-02 + 1.323948773476910e-02 + 1.320781393642416e-02 + 1.317621541705235e-02 + 1.314469199166208e-02 + 1.311324348463446e-02 + 1.308186972415766e-02 + 1.305057053367403e-02 + 1.301934573289238e-02 + 1.298819514247371e-02 + 1.295711859027024e-02 + 1.292611590142988e-02 + 1.289518689817567e-02 + 1.286433140253433e-02 + 1.283354924175516e-02 + 1.280284024626999e-02 + 1.277220424320462e-02 + 1.274164105512193e-02 + 1.271115050454398e-02 + 1.268073242580564e-02 + 1.265038664885281e-02 + 1.262011299771964e-02 + 1.258991130045622e-02 + 1.255978138928737e-02 + 1.252972309744999e-02 + 1.249973624798444e-02 + 1.246982067106488e-02 + 1.243997620568067e-02 + 1.241020267461013e-02 + 1.238049990730756e-02 + 1.235086774662455e-02 + 1.232130602051964e-02 + 1.229181455798258e-02 + 1.226239319685087e-02 + 1.223304176770951e-02 + 1.220376010347082e-02 + 1.217454804486660e-02 + 1.214540542341299e-02 + 1.211633207079968e-02 + 1.208732782681391e-02 + 1.205839252771904e-02 + 1.202952600673308e-02 + 1.200072809652295e-02 + 1.197199864009422e-02 + 1.194333748171596e-02 + 1.191474445503102e-02 + 1.188621939116683e-02 + 1.185776212675846e-02 + 1.182937251288597e-02 + 1.180105038815069e-02 + 1.177279558400601e-02 + 1.174460794107161e-02 + 1.171648730396891e-02 + 1.168843351609301e-02 + 1.166044641171630e-02 + 1.163252583370262e-02 + 1.160467163102319e-02 + 1.157688364263099e-02 + 1.154916170933044e-02 + 1.152150567570712e-02 + 1.149391538555893e-02 + 1.146639068095789e-02 + 1.143893140447911e-02 + 1.141153740781534e-02 + 1.138420853673168e-02 + 1.135694462854312e-02 + 1.132974552839056e-02 + 1.130261108533809e-02 + 1.127554114921167e-02 + 1.124853556496432e-02 + 1.122159417997002e-02 + 1.119471684585664e-02 + 1.116790340283271e-02 + 1.114115369710312e-02 + 1.111446758944324e-02 + 1.108784492177717e-02 + 1.106128553754357e-02 + 1.103478929728668e-02 + 1.100835604711145e-02 + 1.098198563223047e-02 + 1.095567791133747e-02 + 1.092943273475230e-02 + 1.090324994987072e-02 + 1.087712940981543e-02 + 1.085107096608238e-02 + 1.082507447053145e-02 + 1.079913977931768e-02 + 1.077326674497864e-02 + 1.074745521859533e-02 + 1.072170505538783e-02 + 1.069601611066200e-02 + 1.067038823886727e-02 + 1.064482129354728e-02 + 1.061931513219808e-02 + 1.059386961330933e-02 + 1.056848458681972e-02 + 1.054315990640127e-02 + 1.051789543133304e-02 + 1.049269102209236e-02 + 1.046754653920045e-02 + 1.044246184044743e-02 + 1.041743677288729e-02 + 1.039247119540387e-02 + 1.036756497988909e-02 + 1.034271797805630e-02 + 1.031793004647734e-02 + 1.029320105343422e-02 + 1.026853085073464e-02 + 1.024391929539164e-02 + 1.021936625852857e-02 + 1.019487159885800e-02 + 1.017043517132599e-02 + 1.014605683522427e-02 + 1.012173646293816e-02 + 1.009747392058842e-02 + 1.007326905588179e-02 + 1.004912173629082e-02 + 1.002503183346208e-02 + 1.000099920653610e-02 + 9.977023717087764e-03 + 9.953105229386335e-03 + 9.929243608872406e-03 + 9.905438720973011e-03 + 9.881690430827046e-03 + 9.857998603258316e-03 + 9.834363104786413e-03 + 9.810783802355094e-03 + 9.787260560990621e-03 + 9.763793247942843e-03 + 9.740381731591760e-03 + 9.717025877967826e-03 + 9.693725554510663e-03 + 9.670480630152000e-03 + 9.647290973567844e-03 + 9.624156453317901e-03 + 9.601076938062841e-03 + 9.578052297039983e-03 + 9.555082399653962e-03 + 9.532167115690399e-03 + 9.509306316445141e-03 + 9.486499872512266e-03 + 9.463747653553711e-03 + 9.441049530896879e-03 + 9.418405376662433e-03 + 9.395815063104617e-03 + 9.373278461427175e-03 + 9.350795443499088e-03 + 9.328365882617906e-03 + 9.305989651970981e-03 + 9.283666624824176e-03 + 9.261396674723778e-03 + 9.239179675408710e-03 + 9.217015500757821e-03 + 9.194904024947497e-03 + 9.172845123632957e-03 + 9.150838672277813e-03 + 9.128884544858834e-03 + 9.106982617538152e-03 + 9.085132766987650e-03 + 9.063334868396023e-03 + 9.041588798714301e-03 + 9.019894435479832e-03 + 8.998251654894885e-03 + 8.976660334271958e-03 + 8.955120351755344e-03 + 8.933631585369030e-03 + 8.912193913264732e-03 + 8.890807213885918e-03 + 8.869471366214972e-03 + 8.848186249259440e-03 + 8.826951742251321e-03 + 8.805767725383001e-03 + 8.784634078744540e-03 + 8.763550682317645e-03 + 8.742517416743529e-03 + 8.721534162832835e-03 + 8.700600801502468e-03 + 8.679717214101214e-03 + 8.658883282492529e-03 + 8.638098888885700e-03 + 8.617363915025602e-03 + 8.596678243443276e-03 + 8.576041757693640e-03 + 8.555454340593486e-03 + 8.534915875110577e-03 + 8.514426244844865e-03 + 8.493985333674233e-03 + 8.473593025909724e-03 + 8.453249206335058e-03 + 8.432953759374154e-03 + 8.412706569850796e-03 + 8.392507523503252e-03 + 8.372356505624580e-03 + 8.352253401838657e-03 + 8.332198098800467e-03 + 8.312190482450988e-03 + 8.292230438871008e-03 + 8.272317855399050e-03 + 8.252452619663047e-03 + 8.232634619050869e-03 + 8.212863740331295e-03 + 8.193139871755427e-03 + 8.173462902270600e-03 + 8.153832719956143e-03 + 8.134249213438031e-03 + 8.114712271802299e-03 + 8.095221784035302e-03 + 8.075777639824947e-03 + 8.056379729417138e-03 + 8.037027942938956e-03 + 8.017722170154111e-03 + 7.998462301028743e-03 + 7.979248227381455e-03 + 7.960079840401237e-03 + 7.940957030626293e-03 + 7.921879690329333e-03 + 7.902847711453821e-03 + 7.883860985421759e-03 + 7.864919405368889e-03 + 7.846022864037674e-03 + 7.827171253341911e-03 + 7.808364466777525e-03 + 7.789602397948123e-03 + 7.770884940051978e-03 + 7.752211987488857e-03 + 7.733583434567862e-03 + 7.714999174963997e-03 + 7.696459103766686e-03 + 7.677963116338556e-03 + 7.659511107448910e-03 + 7.641102971817726e-03 + 7.622738605046243e-03 + 7.604417904226960e-03 + 7.586140765207791e-03 + 7.567907083543369e-03 + 7.549716755813157e-03 + 7.531569679511053e-03 + 7.513465752109027e-03 + 7.495404870064185e-03 + 7.477386931039745e-03 + 7.459411833357052e-03 + 7.441479474804043e-03 + 7.423589753808636e-03 + 7.405742569108545e-03 + 7.387937818890154e-03 + 7.370175402616828e-03 + 7.352455220325825e-03 + 7.334777170378787e-03 + 7.317141152312192e-03 + 7.299547066866589e-03 + 7.281994814230038e-03 + 7.264484294760120e-03 + 7.247015409129196e-03 + 7.229588058070396e-03 + 7.212202142721502e-03 + 7.194857564639825e-03 + 7.177554225359851e-03 + 7.160292026920549e-03 + 7.143070871828701e-03 + 7.125890661781023e-03 + 7.108751299151369e-03 + 7.091652687463649e-03 + 7.074594729473165e-03 + 7.057577328092346e-03 + 7.040600386920140e-03 + 7.023663809440293e-03 + 7.006767499621119e-03 + 6.989911362283671e-03 + 6.973095301761098e-03 + 6.956319222246642e-03 + 6.939583028242014e-03 + 6.922886624933184e-03 + 6.906229917977133e-03 + 6.889612813237578e-03 + 6.873035215956658e-03 + 6.856497031627250e-03 + 6.839998167124653e-03 + 6.823538528849983e-03 + 6.807118022950776e-03 + 6.790736556102037e-03 + 6.774394036012678e-03 + 6.758090370503938e-03 + 6.741825465874382e-03 + 6.725599229831710e-03 + 6.709411571076730e-03 + 6.693262397262002e-03 + 6.677151616823099e-03 + 6.661079138883049e-03 + 6.645044871881905e-03 + 6.629048724424302e-03 + 6.613090605727208e-03 + 6.597170426169362e-03 + 6.581288095176429e-03 + 6.565443521393368e-03 + 6.549636616015259e-03 + 6.533867289690503e-03 + 6.518135451870410e-03 + 6.502441013826720e-03 + 6.486783886693610e-03 + 6.471163980906190e-03 + 6.455581208648475e-03 + 6.440035481784445e-03 + 6.424526710952946e-03 + 6.409054808194274e-03 + 6.393619686148648e-03 + 6.378221257389647e-03 + 6.362859434216829e-03 + 6.347534129405275e-03 + 6.332245256702231e-03 + 6.316992728926398e-03 + 6.301776458848883e-03 + 6.286596360249587e-03 + 6.271452347303485e-03 + 6.256344334335297e-03 + 6.241272235637497e-03 + 6.226235965289892e-03 + 6.211235437617355e-03 + 6.196270567881593e-03 + 6.181341271239764e-03 + 6.166447462747857e-03 + 6.151589057705613e-03 + 6.136765971896623e-03 + 6.121978121401951e-03 + 6.107225422158738e-03 + 6.092507790132517e-03 + 6.077825141615326e-03 + 6.063177393866219e-03 + 6.048564463915550e-03 + 6.033986268442907e-03 + 6.019442724444331e-03 + 6.004933749322879e-03 + 5.990459260846786e-03 + 5.976019176895193e-03 + 5.961613415583682e-03 + 5.947241895231883e-03 + 5.932904533953020e-03 + 5.918601250164555e-03 + 5.904331962789744e-03 + 5.890096590861083e-03 + 5.875895053571317e-03 + 5.861727270328322e-03 + 5.847593160694864e-03 + 5.833492644473149e-03 + 5.819425641715960e-03 + 5.805392072163253e-03 + 5.791391855962741e-03 + 5.777424914193254e-03 + 5.763491167389796e-03 + 5.749590536018355e-03 + 5.735722941127108e-03 + 5.721888304505554e-03 + 5.708086547766434e-03 + 5.694317591457392e-03 + 5.680581357894303e-03 + 5.666877769868901e-03 + 5.653206748498332e-03 + 5.639568216215936e-03 + 5.625962096156960e-03 + 5.612388310444156e-03 + 5.598846782244085e-03 + 5.585337435180374e-03 + 5.571860191464977e-03 + 5.558414974887664e-03 + 5.545001710146245e-03 + 5.531620319651646e-03 + 5.518270727342278e-03 + 5.504952858629092e-03 + 5.491666637149790e-03 + 5.478411987013346e-03 + 5.465188833301630e-03 + 5.451997101098349e-03 + 5.438836715460566e-03 + 5.425707601454353e-03 + 5.412609684284744e-03 + 5.399542889597323e-03 + 5.386507143481766e-03 + 5.373502371672819e-03 + 5.360528500347250e-03 + 5.347585456320476e-03 + 5.334673165238440e-03 + 5.321791553290573e-03 + 5.308940548233661e-03 + 5.296120077396591e-03 + 5.283330067535706e-03 + 5.270570445063373e-03 + 5.257841138170363e-03 + 5.245142075198895e-03 + 5.232473183108559e-03 + 5.219834389656078e-03 + 5.207225623450342e-03 + 5.194646813662877e-03 + 5.182097888019903e-03 + 5.169578774433769e-03 + 5.157089403379224e-03 + 5.144629703265777e-03 + 5.132199601938705e-03 + 5.119799030212023e-03 + 5.107427917986021e-03 + 5.095086194230444e-03 + 5.082773788422456e-03 + 5.070490630851877e-03 + 5.058236652191947e-03 + 5.046011782411770e-03 + 5.033815952050060e-03 + 5.021649092096963e-03 + 5.009511132708167e-03 + 4.997402004872952e-03 + 4.985321640554899e-03 + 4.973269971256597e-03 + 4.961246927915243e-03 + 4.949252441362114e-03 + 4.937286444284467e-03 + 4.925348869112448e-03 + 4.913439647407981e-03 + 4.901558711796497e-03 + 4.889705994683389e-03 + 4.877881427891544e-03 + 4.866084944974813e-03 + 4.854316479151838e-03 + 4.842575962313763e-03 + 4.830863328342665e-03 + 4.819178511323663e-03 + 4.807521444209243e-03 + 4.795892060902922e-03 + 4.784290295384500e-03 + 4.772716080911616e-03 + 4.761169351999607e-03 + 4.749650043687660e-03 + 4.738158090505544e-03 + 4.726693426328077e-03 + 4.715255985490762e-03 + 4.703845704177584e-03 + 4.692462517255530e-03 + 4.681106359266913e-03 + 4.669777166671382e-03 + 4.658474874679097e-03 + 4.647199418051047e-03 + 4.635950733693824e-03 + 4.624728757814554e-03 + 4.613533426035275e-03 + 4.602364675085555e-03 + 4.591222441193854e-03 + 4.580106660340010e-03 + 4.569017270133631e-03 + 4.557954207729684e-03 + 4.546917409606468e-03 + 4.535906813063030e-03 + 4.524922355662980e-03 + 4.513963975024341e-03 + 4.503031608847450e-03 + 4.492125194604706e-03 + 4.481244669721014e-03 + 4.470389973075004e-03 + 4.459561043403103e-03 + 4.448757818627942e-03 + 4.437980237157132e-03 + 4.427228237584914e-03 + 4.416501758569245e-03 + 4.405800739475310e-03 + 4.395125119625431e-03 + 4.384474837838549e-03 + 4.373849833628650e-03 + 4.363250046735974e-03 + 4.352675416676511e-03 + 4.342125883231542e-03 + 4.331601386396421e-03 + 4.321101866314548e-03 + 4.310627263408189e-03 + 4.300177518182486e-03 + 4.289752570999768e-03 + 4.279352362569397e-03 + 4.268976833692708e-03 + 4.258625924837488e-03 + 4.248299577436886e-03 + 4.237997733292803e-03 + 4.227720333115902e-03 + 4.217467318344088e-03 + 4.207238631130676e-03 + 4.197034213451204e-03 + 4.186854006892898e-03 + 4.176697952964437e-03 + 4.166565994071401e-03 + 4.156458073034852e-03 + 4.146374132669977e-03 + 4.136314114934178e-03 + 4.126277962231265e-03 + 4.116265617785051e-03 + 4.106277025130100e-03 + 4.096312127225507e-03 + 4.086370866498099e-03 + 4.076453186851077e-03 + 4.066559032318193e-03 + 4.056688346384167e-03 + 4.046841072375552e-03 + 4.037017154234894e-03 + 4.027216536753351e-03 + 4.017439163691562e-03 + 4.007684978984143e-03 + 3.997953927616382e-03 + 3.988245954341580e-03 + 3.978561003853811e-03 + 3.968899020987378e-03 + 3.959259950174110e-03 + 3.949643736363211e-03 + 3.940050325917084e-03 + 3.930479663940112e-03 + 3.920931695287086e-03 + 3.911406366153988e-03 + 3.901903622192779e-03 + 3.892423408886956e-03 + 3.882965672529350e-03 + 3.873530359308857e-03 + 3.864117415340676e-03 + 3.854726787040829e-03 + 3.845358421069152e-03 + 3.836012264203419e-03 + 3.826688263119290e-03 + 3.817386364639579e-03 + 3.808106515834866e-03 + 3.798848664119608e-03 + 3.789612756624806e-03 + 3.780398740246358e-03 + 3.771206562411011e-03 + 3.762036171140922e-03 + 3.752887514765301e-03 + 3.743760540740341e-03 + 3.734655196719529e-03 + 3.725571430980986e-03 + 3.716509192135922e-03 + 3.707468428387338e-03 + 3.698449087559120e-03 + 3.689451119263604e-03 + 3.680474472533827e-03 + 3.671519094850921e-03 + 3.662584935894309e-03 + 3.653671945297336e-03 + 3.644780071212910e-03 + 3.635909263417586e-03 + 3.627059471971036e-03 + 3.618230645951014e-03 + 3.609422734605362e-03 + 3.600635687799489e-03 + 3.591869456282116e-03 + 3.583123989955615e-03 + 3.574399238584414e-03 + 3.565695152845392e-03 + 3.557011682930304e-03 + 3.548348778903569e-03 + 3.539706391532652e-03 + 3.531084471778191e-03 + 3.522482970666699e-03 + 3.513901839239252e-03 + 3.505341028388093e-03 + 3.496800489111114e-03 + 3.488280173119797e-03 + 3.479780031892506e-03 + 3.471300016604386e-03 + 3.462840078578430e-03 + 3.454400170006921e-03 + 3.445980243580072e-03 + 3.437580250715228e-03 + 3.429200142992534e-03 + 3.420839872683964e-03 + 3.412499392748279e-03 + 3.404178655562702e-03 + 3.395877612913789e-03 + 3.387596218304602e-03 + 3.379334424898988e-03 + 3.371092184764359e-03 + 3.362869450661228e-03 + 3.354666175991870e-03 + 3.346482314543412e-03 + 3.338317819175880e-03 + 3.330172642972068e-03 + 3.322046740007612e-03 + 3.313940064235304e-03 + 3.305852569386344e-03 + 3.297784208976364e-03 + 3.289734936574093e-03 + 3.281704706272533e-03 + 3.273693473070924e-03 + 3.265701191257636e-03 + 3.257727814803984e-03 + 3.249773298074863e-03 + 3.241837595979994e-03 + 3.233920663596386e-03 + 3.226022455622204e-03 + 3.218142926555998e-03 + 3.210282031163023e-03 + 3.202439725215123e-03 + 3.194615964134223e-03 + 3.186810703067027e-03 + 3.179023897602838e-03 + 3.171255503398923e-03 + 3.163505475998486e-03 + 3.155773770652277e-03 + 3.148060343553685e-03 + 3.140365151430291e-03 + 3.132688149313277e-03 + 3.125029293443853e-03 + 3.117388541383308e-03 + 3.109765848736372e-03 + 3.102161171408776e-03 + 3.094574466373093e-03 + 3.087005690728782e-03 + 3.079454801280003e-03 + 3.071921754555924e-03 + 3.064406507880629e-03 + 3.056909018530570e-03 + 3.049429243338136e-03 + 3.041967139485151e-03 + 3.034522664377966e-03 + 3.027095775562892e-03 + 3.019686430816400e-03 + 3.012294588055786e-03 + 3.004920205212209e-03 + 2.997563239705405e-03 + 2.990223649173174e-03 + 2.982901392198357e-03 + 2.975596427311395e-03 + 2.968308712822513e-03 + 2.961038206776656e-03 + 2.953784867392937e-03 + 2.946548653201694e-03 + 2.939329523194637e-03 + 2.932127436582907e-03 + 2.924942352269057e-03 + 2.917774228121468e-03 + 2.910623023643702e-03 + 2.903488699056754e-03 + 2.896371212514376e-03 + 2.889270523304112e-03 + 2.882186591679052e-03 + 2.875119376658924e-03 + 2.868068837676741e-03 + 2.861034934776638e-03 + 2.854017627809473e-03 + 2.847016876513213e-03 + 2.840032640686938e-03 + 2.833064880681456e-03 + 2.826113557103426e-03 + 2.819178630449384e-03 + 2.812260060105674e-03 + 2.805357806481411e-03 + 2.798471831428214e-03 + 2.791602094948384e-03 + 2.784748557109701e-03 + 2.777911179108391e-03 + 2.771089922400815e-03 + 2.764284748007964e-03 + 2.757495616304825e-03 + 2.750722488782177e-03 + 2.743965327115693e-03 + 2.737224092409578e-03 + 2.730498746008289e-03 + 2.723789249648372e-03 + 2.717095565426717e-03 + 2.710417654358784e-03 + 2.703755477800617e-03 + 2.697108999073383e-03 + 2.690478179939920e-03 + 2.683862981660020e-03 + 2.677263366970269e-03 + 2.670679298051182e-03 + 2.664110736894467e-03 + 2.657557646411518e-03 + 2.651019989061974e-03 + 2.644497727126834e-03 + 2.637990823748049e-03 + 2.631499241776077e-03 + 2.625022943767310e-03 + 2.618561892619121e-03 + 2.612116051581085e-03 + 2.605685383984310e-03 + 2.599269852507916e-03 + 2.592869420565223e-03 + 2.586484052278204e-03 + 2.580113710814501e-03 + 2.573758359383719e-03 + 2.567417961609419e-03 + 2.561092481362380e-03 + 2.554781882413309e-03 + 2.548486128464411e-03 + 2.542205184036424e-03 + 2.535939013422343e-03 + 2.529687580238901e-03 + 2.523450848436006e-03 + 2.517228782352248e-03 + 2.511021346720505e-03 + 2.504828506444104e-03 + 2.498650225958320e-03 + 2.492486468967693e-03 + 2.486337200680032e-03 + 2.480202386472821e-03 + 2.474081990653096e-03 + 2.467975978460781e-03 + 2.461884315215007e-03 + 2.455806965243642e-03 + 2.449743893777428e-03 + 2.443695066608286e-03 + 2.437660449328877e-03 + 2.431640007119714e-03 + 2.425633705211946e-03 + 2.419641509634817e-03 + 2.413663385966202e-03 + 2.407699299632079e-03 + 2.401749216909934e-03 + 2.395813103777745e-03 + 2.389890925926915e-03 + 2.383982649399740e-03 + 2.378088240561300e-03 + 2.372207665865560e-03 + 2.366340891258303e-03 + 2.360487883037754e-03 + 2.354648608018378e-03 + 2.348823033118129e-03 + 2.343011124539103e-03 + 2.337212848054228e-03 + 2.331428171390765e-03 + 2.325657062040943e-03 + 2.319899486412222e-03 + 2.314155410784699e-03 + 2.308424802407836e-03 + 2.302707629600105e-03 + 2.297003858807791e-03 + 2.291313456815245e-03 + 2.285636391934661e-03 + 2.279972631361444e-03 + 2.274322142294874e-03 + 2.268684892803898e-03 + 2.263060850445441e-03 + 2.257449982675230e-03 + 2.251852257331842e-03 + 2.246267642469826e-03 + 2.240696106224612e-03 + 2.235137616698782e-03 + 2.229592141925271e-03 + 2.224059650030012e-03 + 2.218540109447705e-03 + 2.213033488566449e-03 + 2.207539755750870e-03 + 2.202058879448589e-03 + 2.196590827868759e-03 + 2.191135569406817e-03 + 2.185693073538250e-03 + 2.180263309295804e-03 + 2.174846245146934e-03 + 2.169441849486111e-03 + 2.164050091629877e-03 + 2.158670941358884e-03 + 2.153304367034930e-03 + 2.147950337590323e-03 + 2.142608822828710e-03 + 2.137279792340324e-03 + 2.131963215445541e-03 + 2.126659061301170e-03 + 2.121367299363035e-03 + 2.116087899310018e-03 + 2.110820830985273e-03 + 2.105566064252215e-03 + 2.100323568822542e-03 + 2.095093314356113e-03 + 2.089875271479949e-03 + 2.084669410319118e-03 + 2.079475699908646e-03 + 2.074294110902819e-03 + 2.069124614088778e-03 + 2.063967179294363e-03 + 2.058821776747180e-03 + 2.053688376991423e-03 + 2.048566950718572e-03 + 2.043457468582260e-03 + 2.038359901240009e-03 + 2.033274219398007e-03 + 2.028200393563254e-03 + 2.023138394473247e-03 + 2.018088193625467e-03 + 2.013049761808302e-03 + 2.008023069533293e-03 + 2.003008088023720e-03 + 1.998004788922133e-03 + 1.993013143739461e-03 + 1.988033123025423e-03 + 1.983064698401174e-03 + 1.978107841939004e-03 + 1.973162523959716e-03 + 1.968228716337500e-03 + 1.963306391971906e-03 + 1.958395521239848e-03 + 1.953496075620802e-03 + 1.948608028019931e-03 + 1.943731350228688e-03 + 1.938866013789267e-03 + 1.934011990485791e-03 + 1.929169252901841e-03 + 1.924337773155020e-03 + 1.919517522737516e-03 + 1.914708474346116e-03 + 1.909910600724645e-03 + 1.905123874118434e-03 + 1.900348266781407e-03 + 1.895583751238830e-03 + 1.890830300301618e-03 + 1.886087886140893e-03 + 1.881356481302734e-03 + 1.876636059328014e-03 + 1.871926593048255e-03 + 1.867228054886164e-03 + 1.862540417322874e-03 + 1.857863653843670e-03 + 1.853197738035545e-03 + 1.848542642643349e-03 + 1.843898340659710e-03 + 1.839264805482605e-03 + 1.834642010884087e-03 + 1.830029929675155e-03 + 1.825428534756660e-03 + 1.820837800826725e-03 + 1.816257700994342e-03 + 1.811688207883416e-03 + 1.807129296515363e-03 + 1.802580940478343e-03 + 1.798043112569654e-03 + 1.793515787775185e-03 + 1.788998939681262e-03 + 1.784492541016137e-03 + 1.779996567290557e-03 + 1.775510992946437e-03 + 1.771035790955467e-03 + 1.766570935188881e-03 + 1.762116400368900e-03 + 1.757672161650980e-03 + 1.753238193179788e-03 + 1.748814468721301e-03 + 1.744400962234815e-03 + 1.739997649147064e-03 + 1.735604504535336e-03 + 1.731221502449809e-03 + 1.726848617398671e-03 + 1.722485824273258e-03 + 1.718133098140551e-03 + 1.713790413411143e-03 + 1.709457744960287e-03 + 1.705135068710917e-03 + 1.700822359316501e-03 + 1.696519591326764e-03 + 1.692226740206531e-03 + 1.687943780998710e-03 + 1.683670689031842e-03 + 1.679407440586236e-03 + 1.675154010255336e-03 + 1.670910372590760e-03 + 1.666676504276520e-03 + 1.662452380680008e-03 + 1.658237976786625e-03 + 1.654033269138933e-03 + 1.649838233189823e-03 + 1.645652843894769e-03 + 1.641477077483747e-03 + 1.637310910181093e-03 + 1.633154317979306e-03 + 1.629007276710043e-03 + 1.624869761977525e-03 + 1.620741749539434e-03 + 1.616623216289868e-03 + 1.612514138626602e-03 + 1.608414492386588e-03 + 1.604324254066237e-03 + 1.600243399893093e-03 + 1.596171905775712e-03 + 1.592109748332882e-03 + 1.588056904380057e-03 + 1.584013350591343e-03 + 1.579979063015354e-03 + 1.575954018417919e-03 + 1.571938194458784e-03 + 1.567931567017785e-03 + 1.563934112240304e-03 + 1.559945807641685e-03 + 1.555966630779868e-03 + 1.551996558434039e-03 + 1.548035566441649e-03 + 1.544083632647983e-03 + 1.540140734902817e-03 + 1.536206849423688e-03 + 1.532281953055403e-03 + 1.528366023373284e-03 + 1.524459038476067e-03 + 1.520560975283225e-03 + 1.516671810636623e-03 + 1.512791522697568e-03 + 1.508920088807869e-03 + 1.505057486015793e-03 + 1.501203692209861e-03 + 1.497358685322736e-03 + 1.493522443062933e-03 + 1.489694942724099e-03 + 1.485876162194853e-03 + 1.482066079697174e-03 + 1.478264672890618e-03 + 1.474471919644568e-03 + 1.470687798121700e-03 + 1.466912286519041e-03 + 1.463145362594138e-03 + 1.459387003990816e-03 + 1.455637189563730e-03 + 1.451895897787254e-03 + 1.448163106500405e-03 + 1.444438793947980e-03 + 1.440722938760434e-03 + 1.437015519703072e-03 + 1.433316514691718e-03 + 1.429625901910583e-03 + 1.425943660193772e-03 + 1.422269768088744e-03 + 1.418604204318803e-03 + 1.414946947952337e-03 + 1.411297977567125e-03 + 1.407657271824714e-03 + 1.404024809794961e-03 + 1.400400570139807e-03 + 1.396784531434119e-03 + 1.393176672533590e-03 + 1.389576972970703e-03 + 1.385985412235932e-03 + 1.382401969107074e-03 + 1.378826622443783e-03 + 1.375259351219489e-03 + 1.371700134514839e-03 + 1.368148952079336e-03 + 1.364605783757036e-03 + 1.361070608632290e-03 + 1.357543405835987e-03 + 1.354024154621594e-03 + 1.350512834317403e-03 + 1.347009424934256e-03 + 1.343513906652181e-03 + 1.340026258589547e-03 + 1.336546459739890e-03 + 1.333074489680093e-03 + 1.329610329681042e-03 + 1.326153959375566e-03 + 1.322705357081586e-03 + 1.319264503327096e-03 + 1.315831378649060e-03 + 1.312405962942001e-03 + 1.308988235813027e-03 + 1.305578177302038e-03 + 1.302175767936687e-03 + 1.298780987783750e-03 + 1.295393816813521e-03 + 1.292014235092867e-03 + 1.288642222828844e-03 + 1.285277760581296e-03 + 1.281920829182064e-03 + 1.278571408463430e-03 + 1.275229478684235e-03 + 1.271895021211065e-03 + 1.268568016022571e-03 + 1.265248443161927e-03 + 1.261936283866222e-03 + 1.258631518851812e-03 + 1.255334128626978e-03 + 1.252044093890807e-03 + 1.248761395151665e-03 + 1.245486013113075e-03 + 1.242217929129610e-03 + 1.238957124307338e-03 + 1.235703579418827e-03 + 1.232457274959363e-03 + 1.229218191838193e-03 + 1.225986311430220e-03 + 1.222761615473843e-03 + 1.219544084856006e-03 + 1.216333699988417e-03 + 1.213130441964228e-03 + 1.209934292565758e-03 + 1.206745233676102e-03 + 1.203563245963205e-03 + 1.200388310525061e-03 + 1.197220409053557e-03 + 1.194059523052293e-03 + 1.190905633902454e-03 + 1.187758723052301e-03 + 1.184618772531461e-03 + 1.181485763720917e-03 + 1.178359677471923e-03 + 1.175240496495629e-03 + 1.172128202790389e-03 + 1.169022777016151e-03 + 1.165924201427151e-03 + 1.162832457974330e-03 + 1.159747527667428e-03 + 1.156669393342115e-03 + 1.153598037513975e-03 + 1.150533441195656e-03 + 1.147475586343000e-03 + 1.144424455192698e-03 + 1.141380029693999e-03 + 1.138342292070108e-03 + 1.135311224784675e-03 + 1.132286810371483e-03 + 1.129269030382949e-03 + 1.126257866687504e-03 + 1.123253302806332e-03 + 1.120255320585528e-03 + 1.117263901594027e-03 + 1.114279029333705e-03 + 1.111300685926414e-03 + 1.108328853214485e-03 + 1.105363515126287e-03 + 1.102404653695880e-03 + 1.099452250276090e-03 + 1.096506289065756e-03 + 1.093566752790314e-03 + 1.090633622975802e-03 + 1.087706882683815e-03 + 1.084786514992603e-03 + 1.081872502714538e-03 + 1.078964828755093e-03 + 1.076063476054719e-03 + 1.073168427526746e-03 + 1.070279665938792e-03 + 1.067397174442816e-03 + 1.064520936417689e-03 + 1.061650934087830e-03 + 1.058787150577005e-03 + 1.055929570192933e-03 + 1.053078175257412e-03 + 1.050232948596978e-03 + 1.047393874491941e-03 + 1.044560935952646e-03 + 1.041734115621369e-03 + 1.038913396581877e-03 + 1.036098763274602e-03 + 1.033290199394467e-03 + 1.030487686748966e-03 + 1.027691209748195e-03 + 1.024900752824401e-03 + 1.022116298137994e-03 + 1.019337829638554e-03 + 1.016565331581354e-03 + 1.013798786681050e-03 + 1.011038178744547e-03 + 1.008283492069452e-03 + 1.005534710312413e-03 + 1.002791817167788e-03 + 1.000054796401326e-03 + 9.973236317525795e-04 + 9.945983071579347e-04 + 9.918788066535795e-04 + 9.891651141399331e-04 + 9.864572135795289e-04 + 9.837550890187182e-04 + 9.810587245440681e-04 + 9.783681042165289e-04 + 9.756832121036981e-04 + 9.730040324093254e-04 + 9.703305493295432e-04 + 9.676627470403841e-04 + 9.650006098016114e-04 + 9.623441219373007e-04 + 9.596932677964791e-04 + 9.570480316324495e-04 + 9.544083978205768e-04 + 9.517743508934125e-04 + 9.491458752396962e-04 + 9.465229553012878e-04 + 9.439055756501852e-04 + 9.412937207895038e-04 + 9.386873752809525e-04 + 9.360865238076440e-04 + 9.334911509791107e-04 + 9.309012414140627e-04 + 9.283167798171848e-04 + 9.257377509839119e-04 + 9.231641396993918e-04 + 9.205959306774516e-04 + 9.180331088080401e-04 + 9.154756590138127e-04 + 9.129235660962607e-04 + 9.103768149701878e-04 + 9.078353906321772e-04 + 9.052992780955343e-04 + 9.027684623946166e-04 + 9.002429285800444e-04 + 8.977226617159664e-04 + 8.952076469091944e-04 + 8.926978693026045e-04 + 8.901933140640126e-04 + 8.876939664445818e-04 + 8.851998117353022e-04 + 8.827108351548252e-04 + 8.802270219825557e-04 + 8.777483575705740e-04 + 8.752748272927118e-04 + 8.728064165680979e-04 + 8.703431108522175e-04 + 8.678848955854838e-04 + 8.654317562117358e-04 + 8.629836782258149e-04 + 8.605406473168484e-04 + 8.581026490766350e-04 + 8.556696689660546e-04 + 8.532416927295966e-04 + 8.508187061075220e-04 + 8.484006947265324e-04 + 8.459876443379812e-04 + 8.435795407180884e-04 + 8.411763696276702e-04 + 8.387781169670006e-04 + 8.363847686436173e-04 + 8.339963104952486e-04 + 8.316127284703911e-04 + 8.292340085393665e-04 + 8.268601366269382e-04 + 8.244910987818749e-04 + 8.221268810991789e-04 + 8.197674696351961e-04 + 8.174128504795555e-04 + 8.150630097863373e-04 + 8.127179337987174e-04 + 8.103776086785577e-04 + 8.080420206116735e-04 + 8.057111559859151e-04 + 8.033850010442538e-04 + 8.010635420033148e-04 + 7.987467653572807e-04 + 7.964346575211490e-04 + 7.941272048473775e-04 + 7.918243938145987e-04 + 7.895262109139402e-04 + 7.872326426395918e-04 + 7.849436755404454e-04 + 7.826592961986925e-04 + 7.803794912312032e-04 + 7.781042473133076e-04 + 7.758335511109105e-04 + 7.735673892815593e-04 + 7.713057485643111e-04 + 7.690486157536814e-04 + 7.667959776727836e-04 + 7.645478211004869e-04 + 7.623041328912646e-04 + 7.600649000053854e-04 + 7.578301093264215e-04 + 7.555997477583347e-04 + 7.533738022910566e-04 + 7.511522599897612e-04 + 7.489351079282785e-04 + 7.467223331578882e-04 + 7.445139227962291e-04 + 7.423098639775247e-04 + 7.401101438263767e-04 + 7.379147496119391e-04 + 7.357236686066337e-04 + 7.335368879604144e-04 + 7.313543950177981e-04 + 7.291761771981462e-04 + 7.270022218267318e-04 + 7.248325162821272e-04 + 7.226670479949025e-04 + 7.205058044241288e-04 + 7.183487730730944e-04 + 7.161959414766152e-04 + 7.140472971809699e-04 + 7.119028277561113e-04 + 7.097625208231147e-04 + 7.076263641063239e-04 + 7.054943452576004e-04 + 7.033664519218169e-04 + 7.012426719956601e-04 + 6.991229932510109e-04 + 6.970074033540157e-04 + 6.948958902400331e-04 + 6.927884418689321e-04 + 6.906850461485944e-04 + 6.885856909689247e-04 + 6.864903643067344e-04 + 6.843990542306164e-04 + 6.823117487354689e-04 + 6.802284359113009e-04 + 6.781491039842488e-04 + 6.760737410664455e-04 + 6.740023352773578e-04 + 6.719348748282754e-04 + 6.698713480434448e-04 + 6.678117432465053e-04 + 6.657560487034911e-04 + 6.637042527655789e-04 + 6.616563438432147e-04 + 6.596123103782944e-04 + 6.575721408025738e-04 + 6.555358236048545e-04 + 6.535033473936704e-04 + 6.514747007198682e-04 + 6.494498721244171e-04 + 6.474288502266283e-04 + 6.454116237722280e-04 + 6.433981815196293e-04 + 6.413885120963034e-04 + 6.393826043225120e-04 + 6.373804471016686e-04 + 6.353820291728463e-04 + 6.333873394523912e-04 + 6.313963669651093e-04 + 6.294091005879305e-04 + 6.274255292885601e-04 + 6.254456421348147e-04 + 6.234694281911996e-04 + 6.214968766042923e-04 + 6.195279765738893e-04 + 6.175627172048796e-04 + 6.156010877068991e-04 + 6.136430774102346e-04 + 6.116886755862946e-04 + 6.097378715435904e-04 + 6.077906546697107e-04 + 6.058470144286753e-04 + 6.039069402835228e-04 + 6.019704216802507e-04 + 6.000374481409778e-04 + 5.981080092530985e-04 + 5.961820946588096e-04 + 5.942596940083503e-04 + 5.923407969721301e-04 + 5.904253932616448e-04 + 5.885134726736782e-04 + 5.866050250202793e-04 + 5.847000400980857e-04 + 5.827985078791194e-04 + 5.809004183470366e-04 + 5.790057613579966e-04 + 5.771145269606196e-04 + 5.752267052829598e-04 + 5.733422863841403e-04 + 5.714612604000550e-04 + 5.695836175305099e-04 + 5.677093480037018e-04 + 5.658384420678564e-04 + 5.639708900266142e-04 + 5.621066823022896e-04 + 5.602458092869138e-04 + 5.583882613744714e-04 + 5.565340290827777e-04 + 5.546831029664671e-04 + 5.528354736013446e-04 + 5.509911316015094e-04 + 5.491500676402182e-04 + 5.473122724461832e-04 + 5.454777367810608e-04 + 5.436464514412940e-04 + 5.418184072613321e-04 + 5.399935951226492e-04 + 5.381720060069473e-04 + 5.363536309736959e-04 + 5.345384609776805e-04 + 5.327264870731968e-04 + 5.309177004752346e-04 + 5.291120923593077e-04 + 5.273096539494221e-04 + 5.255103765544823e-04 + 5.237142514407170e-04 + 5.219212699733492e-04 + 5.201314236865307e-04 + 5.183447040146093e-04 + 5.165611024246747e-04 + 5.147806105331874e-04 + 5.130032200114061e-04 + 5.112289225530487e-04 + 5.094577098620987e-04 + 5.076895736854020e-04 + 5.059245058583464e-04 + 5.041624983517820e-04 + 5.024035430839573e-04 + 5.006476319990773e-04 + 4.988947572035529e-04 + 4.971449107942239e-04 + 4.953980848818115e-04 + 4.936542716805855e-04 + 4.919134634956966e-04 + 4.901756526846954e-04 + 4.884408316006080e-04 + 4.867089926403434e-04 + 4.849801282731475e-04 + 4.832542310892493e-04 + 4.815312937309208e-04 + 4.798113088560132e-04 + 4.780942690954599e-04 + 4.763801672259719e-04 + 4.746689961731605e-04 + 4.729607488395965e-04 + 4.712554181333483e-04 + 4.695529970142063e-04 + 4.678534786182833e-04 + 4.661568561056742e-04 + 4.644631226216267e-04 + 4.627722714285577e-04 + 4.610842958399921e-04 + 4.593991892076899e-04 + 4.577169450300335e-04 + 4.560375568336446e-04 + 4.543610181249096e-04 + 4.526873225594637e-04 + 4.510164638467393e-04 + 4.493484356950898e-04 + 4.476832319569833e-04 + 4.460208465382815e-04 + 4.443612733350173e-04 + 4.427045064285867e-04 + 4.410505399510805e-04 + 4.393993679504339e-04 + 4.377509846774214e-04 + 4.361053844834223e-04 + 4.344625616662297e-04 + 4.328225106365193e-04 + 4.311852259097922e-04 + 4.295507020701359e-04 + 4.279189337521271e-04 + 4.262899156467061e-04 + 4.246636425301464e-04 + 4.230401092565931e-04 + 4.214193107478168e-04 + 4.198012419839599e-04 + 4.181858979868060e-04 + 4.165732738692198e-04 + 4.149633649793705e-04 + 4.133561665739344e-04 + 4.117516738453971e-04 + 4.101498823326724e-04 + 4.085507876181731e-04 + 4.069543852399522e-04 + 4.053606707914893e-04 + 4.037696400086752e-04 + 4.021812887746215e-04 + 4.005956129436248e-04 + 3.990126084760660e-04 + 3.974322714846641e-04 + 3.958545980293214e-04 + 3.942795842513983e-04 + 3.927072264688036e-04 + 3.911375211195356e-04 + 3.895704646516968e-04 + 3.880060534869329e-04 + 3.864442842922655e-04 + 3.848851538066537e-04 + 3.833286587063809e-04 + 3.817747958651508e-04 + 3.802235622593628e-04 + 3.786749548688228e-04 + 3.771289708205180e-04 + 3.755856073392733e-04 + 3.740448616816441e-04 + 3.725067311649692e-04 + 3.709712132043737e-04 + 3.694383053790672e-04 + 3.679080053579325e-04 + 3.663803108503057e-04 + 3.648552195606523e-04 + 3.633327293646475e-04 + 3.618128382932607e-04 + 3.602955444344858e-04 + 3.587808459078391e-04 + 3.572687408998931e-04 + 3.557592277792442e-04 + 3.542523049927096e-04 + 3.527479710408145e-04 + 3.512462245019904e-04 + 3.497470640500036e-04 + 3.482504884770882e-04 + 3.467564967437580e-04 + 3.452650877985240e-04 + 3.437762605764859e-04 + 3.422900143250168e-04 + 3.408063483640538e-04 + 3.393252619896345e-04 + 3.378467546103840e-04 + 3.363708257653936e-04 + 3.348974751341996e-04 + 3.334267024660963e-04 + 3.319585075646510e-04 + 3.304928903038992e-04 + 3.290298507212495e-04 + 3.275693889604049e-04 + 3.261115052402690e-04 + 3.246561999078441e-04 + 3.232034733603981e-04 + 3.217533259984899e-04 + 3.203057585048498e-04 + 3.188607716794152e-04 + 3.174183662346357e-04 + 3.159785430822741e-04 + 3.145413032833238e-04 + 3.131066479369465e-04 + 3.116745782136557e-04 + 3.102450954058189e-04 + 3.088182010197684e-04 + 3.073938965650610e-04 + 3.059721835802734e-04 + 3.045530637916020e-04 + 3.031365390386899e-04 + 3.017226112552691e-04 + 3.003112824793533e-04 + 2.989025548234045e-04 + 2.974964304955006e-04 + 2.960929118913988e-04 + 2.946920014422941e-04 + 2.932937016150965e-04 + 2.918980151023185e-04 + 2.905049446767149e-04 + 2.891144931550728e-04 + 2.877266634923031e-04 + 2.863414587568181e-04 + 2.849588821248430e-04 + 2.835789368717610e-04 + 2.822016263526234e-04 + 2.808269540128114e-04 + 2.794549234525530e-04 + 2.780855383858511e-04 + 2.767188026160350e-04 + 2.753547199733251e-04 + 2.739932944362576e-04 + 2.726345302253411e-04 + 2.712784314751994e-04 + 2.699250024118205e-04 + 2.685742475595017e-04 + 2.672261714415124e-04 + 2.658807786371782e-04 + 2.645380739000219e-04 + 2.631980619957597e-04 + 2.618607478073471e-04 + 2.605261365239288e-04 + 2.591942332540738e-04 + 2.578650431168888e-04 + 2.565385715181067e-04 + 2.552148239188000e-04 + 2.538938058269625e-04 + 2.525755228940477e-04 + 2.512599808919393e-04 + 2.499471856899045e-04 + 2.486371432244064e-04 + 2.473298595107682e-04 + 2.460253406646765e-04 + 2.447235929605613e-04 + 2.434246227773826e-04 + 2.421284365723855e-04 + 2.408350408491505e-04 + 2.395444422583646e-04 + 2.382566475978551e-04 + 2.369716636126905e-04 + 2.356894972066169e-04 + 2.344101555067014e-04 + 2.331336455922197e-04 + 2.318599746393059e-04 + 2.305891500038487e-04 + 2.293211790903458e-04 + 2.280560693749351e-04 + 2.267938284406659e-04 + 2.255344639796373e-04 + 2.242779837481179e-04 + 2.230243955584571e-04 + 2.217737074088738e-04 + 2.205259273750273e-04 + 2.192810635194828e-04 + 2.180391240377155e-04 + 2.168001172473318e-04 + 2.155640515683406e-04 + 2.143309354202995e-04 + 2.131007772856537e-04 + 2.118735858306198e-04 + 2.106493698084787e-04 + 2.094281380089542e-04 + 2.082098992208740e-04 + 2.069946624015073e-04 + 2.057824366286796e-04 + 2.045732309577213e-04 + 2.033670545521807e-04 + 2.021639166762670e-04 + 2.009638266139778e-04 + 1.997667937615743e-04 + 1.985728276099416e-04 + 1.973819376249420e-04 + 1.961941334186818e-04 + 1.950094247288422e-04 + 1.938278211445808e-04 + 1.926493324216112e-04 + 1.914739685443153e-04 + 1.903017394244089e-04 + 1.891326549660665e-04 + 1.879667251315557e-04 + 1.868039600691931e-04 + 1.856443699312781e-04 + 1.844879648170397e-04 + 1.833347550402995e-04 + 1.821847509305592e-04 + 1.810379627269367e-04 + 1.798944008330572e-04 + 1.787540757117569e-04 + 1.776169978023503e-04 + 1.764831776083264e-04 + 1.753526257075039e-04 + 1.742253527510645e-04 + 1.731013693254543e-04 + 1.719806860311682e-04 + 1.708633135911149e-04 + 1.697492627671219e-04 + 1.686385443331759e-04 + 1.675311690584120e-04 + 1.664271477052953e-04 + 1.653264910845736e-04 + 1.642292101438652e-04 + 1.631353157524277e-04 + 1.620448187436031e-04 + 1.609577300754615e-04 + 1.598740606888992e-04 + 1.587938214812250e-04 + 1.577170233258566e-04 + 1.566436772168694e-04 + 1.555737942159133e-04 + 1.545073851968179e-04 + 1.534444610998845e-04 + 1.523850329588589e-04 + 1.513291117056277e-04 + 1.502767082718022e-04 + 1.492278336091406e-04 + 1.481824986061289e-04 + 1.471407142013266e-04 + 1.461024913960903e-04 + 1.450678410475480e-04 + 1.440367739871709e-04 + 1.430093010797408e-04 + 1.419854331666308e-04 + 1.409651810501559e-04 + 1.399485554884026e-04 + 1.389355672434459e-04 + 1.379262270311977e-04 + 1.369205454852166e-04 + 1.359185332657421e-04 + 1.349202010239166e-04 + 1.339255593445051e-04 + 1.329346186642912e-04 + 1.319473893926901e-04 + 1.309638820305585e-04 + 1.299841069283569e-04 + 1.290080743627276e-04 + 1.280357946577360e-04 + 1.270672779908064e-04 + 1.261025344295187e-04 + 1.251415740258344e-04 + 1.241844068414831e-04 + 1.232310428585276e-04 + 1.222814917974582e-04 + 1.213357634573326e-04 + 1.203938676644921e-04 + 1.194558139769228e-04 + 1.185216119071049e-04 + 1.175912709437735e-04 + 1.166648004395201e-04 + 1.157422096820540e-04 + 1.148235078941047e-04 + 1.139087041565015e-04 + 1.129978074560730e-04 + 1.120908266963163e-04 + 1.111877706801771e-04 + 1.102886481165339e-04 + 1.093934676008822e-04 + 1.085022375478793e-04 + 1.076149663238430e-04 + 1.067316622735248e-04 + 1.058523335072715e-04 + 1.049769880021785e-04 + 1.041056336506420e-04 + 1.032382782134568e-04 + 1.023749293560659e-04 + 1.015155946454073e-04 + 1.006602814254268e-04 + 9.980899691604087e-05 + 9.896174827822380e-05 + 9.811854249648769e-05 + 9.727938640362722e-05 + 9.644428669167931e-05 + 9.561324990949941e-05 + 9.478628247235907e-05 + 9.396339064407664e-05 + 9.314458052650697e-05 + 9.232985807344924e-05 + 9.151922908266137e-05 + 9.071269919463392e-05 + 8.991027389908417e-05 + 8.911195851702552e-05 + 8.831775819982511e-05 + 8.752767793866873e-05 + 8.674172256023528e-05 + 8.595989672073575e-05 + 8.518220490590348e-05 + 8.440865141920385e-05 + 8.363924039733809e-05 + 8.287397580722622e-05 + 8.211286142104977e-05 + 8.135590084051729e-05 + 8.060309749193613e-05 + 7.985445459658365e-05 + 7.910997520302950e-05 + 7.836966218298747e-05 + 7.763351820320998e-05 + 7.690154574559998e-05 + 7.617374709914362e-05 + 7.545012436145964e-05 + 7.473067944430294e-05 + 7.401541405207780e-05 + 7.330432968888297e-05 + 7.259742767376570e-05 + 7.189470911942744e-05 + 7.119617492698978e-05 + 7.050182580949816e-05 + 6.981166227552030e-05 + 6.912568461899398e-05 + 6.844389294104750e-05 + 6.776628713300132e-05 + 6.709286687130013e-05 + 6.642363163388969e-05 + 6.575858067871575e-05 + 6.509771305493562e-05 + 6.444102761503343e-05 + 6.378852298738557e-05 + 6.314019758583242e-05 + 6.249604962295056e-05 + 6.185607708979005e-05 + 6.122027775903875e-05 + 6.058864919749181e-05 + 5.996118875684596e-05 + 5.933789356597989e-05 + 5.871876053888907e-05 + 5.810378637807827e-05 + 5.749296757228591e-05 + 5.688630039241354e-05 + 5.628378087841946e-05 + 5.568540486517338e-05 + 5.509116797959273e-05 + 5.450106561933422e-05 + 5.391509296529475e-05 + 5.333324497665832e-05 + 5.275551640753726e-05 + 5.218190179953343e-05 + 5.161239545977182e-05 + 5.104699148146081e-05 + 5.048568375913861e-05 + 4.992846596763329e-05 + 4.937533154817934e-05 + 4.882627374147808e-05 + 4.828128557792042e-05 + 4.774035986717692e-05 + 4.720348921279551e-05 + 4.667066599018748e-05 + 4.614188237688400e-05 + 4.561713035194944e-05 + 4.509640165438987e-05 + 4.457968783032909e-05 + 4.406698023190481e-05 + 4.355826996891768e-05 + 4.305354796420506e-05 + 4.255280495560636e-05 + 4.205603144616347e-05 + 4.156321774032957e-05 + 4.107435395613752e-05 + 4.058942999665175e-05 + 4.010843556869507e-05 + 3.963136019085871e-05 + 3.915819316952545e-05 + 3.868892361719641e-05 + 3.822354046226270e-05 + 3.776203244031561e-05 + 3.730438809005640e-05 + 3.685059575689182e-05 + 3.640064360230198e-05 + 3.595451960373741e-05 + 3.551221155134442e-05 + 3.507370705450421e-05 + 3.463899354241650e-05 + 3.420805825588243e-05 + 3.378088825986720e-05 + 3.335747045272196e-05 + 3.293779155463552e-05 + 3.252183811026268e-05 + 3.210959649877579e-05 + 3.170105292073684e-05 + 3.129619341367949e-05 + 3.089500386055728e-05 + 3.049746997239612e-05 + 3.010357730585059e-05 + 2.971331126487755e-05 + 2.932665707619367e-05 + 2.894359982344077e-05 + 2.856412445132613e-05 + 2.818821573877814e-05 + 2.781585831987375e-05 + 2.744703669454755e-05 + 2.708173520948728e-05 + 2.671993807124836e-05 + 2.636162935767626e-05 + 2.600679300301263e-05 + 2.565541280257304e-05 + 2.530747242805460e-05 + 2.496295542635910e-05 + 2.462184521206604e-05 + 2.428412507785163e-05 + 2.394977819771233e-05 + 2.361878762181457e-05 + 2.329113628448998e-05 + 2.296680701293541e-05 + 2.264578251757474e-05 + 2.232804539557172e-05 + 2.201357814530585e-05 + 2.170236315904943e-05 + 2.139438272306276e-05 + 2.108961903561866e-05 + 2.078805419745760e-05 + 2.048967020582218e-05 + 2.019444897050880e-05 + 1.990237231614296e-05 + 1.961342197777572e-05 + 1.932757961462368e-05 + 1.904482680353188e-05 + 1.876514502948172e-05 + 1.848851571515060e-05 + 1.821492021640795e-05 + 1.794433980831370e-05 + 1.767675569461099e-05 + 1.741214902258527e-05 + 1.715050088166273e-05 + 1.689179228451716e-05 + 1.663600419203502e-05 + 1.638311752659296e-05 + 1.613311314360082e-05 + 1.588597184706167e-05 + 1.564167440067926e-05 + 1.540020151829502e-05 + 1.516153387453479e-05 + 1.492565211244357e-05 + 1.469253682958783e-05 + 1.446216858599219e-05 + 1.423452791421707e-05 + 1.400959531801727e-05 + 1.378735127470914e-05 + 1.356777623611474e-05 + 1.335085063337062e-05 + 1.313655487876277e-05 + 1.292486936494610e-05 + 1.271577446639333e-05 + 1.250925054517824e-05 + 1.230527796605363e-05 + 1.210383708165599e-05 + 1.190490823144681e-05 + 1.170847175649016e-05 + 1.151450799717159e-05 + 1.132299729345123e-05 + 1.113391999104486e-05 + 1.094725644586371e-05 + 1.076298702423590e-05 + 1.058109209097755e-05 + 1.040155202830912e-05 + 1.022434724511555e-05 + 1.004945815519835e-05 + 9.876865191434875e-06 + 9.706548817576976e-06 + 9.538489515829050e-06 + 9.372667791395497e-06 + 9.209064181113714e-06 + 9.047659251528417e-06 + 8.888433598428113e-06 + 8.731367852817854e-06 + 8.576442682615395e-06 + 8.423638791088146e-06 + 8.272936922653283e-06 + 8.124317863654203e-06 + 7.977762440936675e-06 + 7.833251528895281e-06 + 7.690766049713759e-06 + 7.550286971453687e-06 + 7.411795314787993e-06 + 7.275272152381047e-06 + 7.140698608042407e-06 + 7.008055865069554e-06 + 6.877325162999093e-06 + 6.748487797069182e-06 + 6.621525126924672e-06 + 6.496418573295794e-06 + 6.373149617974847e-06 + 6.251699810845691e-06 + 6.132050767139283e-06 + 6.014184168887862e-06 + 5.898081770597224e-06 + 5.783725394973654e-06 + 5.671096936050662e-06 + 5.560178365641361e-06 + 5.450951726966341e-06 + 5.343399138917566e-06 + 5.237502802602254e-06 + 5.133244993336976e-06 + 5.030608065950253e-06 + 4.929574461382145e-06 + 4.830126698086031e-06 + 4.732247378331277e-06 + 4.635919192753656e-06 + 4.541124912789582e-06 + 4.447847398958468e-06 + 4.356069602328335e-06 + 4.265774557056776e-06 + 4.176945389932598e-06 + 4.089565320281935e-06 + 4.003617653697645e-06 + 3.919085793399028e-06 + 3.835953236362346e-06 + 3.754203567594348e-06 + 3.673820472678765e-06 + 3.594787733829004e-06 + 3.517089224074456e-06 + 3.440708918621393e-06 + 3.365630891050476e-06 + 3.291839308866544e-06 + 3.219318444550688e-06 + 3.148052669614368e-06 + 3.078026451876596e-06 + 3.009224366838337e-06 + 2.941631088840265e-06 + 2.875231390541817e-06 + 2.810010156134118e-06 + 2.745952369256776e-06 + 2.683043113446972e-06 + 2.621267584374269e-06 + 2.560611078236376e-06 + 2.501058994098514e-06 + 2.442596843868032e-06 + 2.385210240033010e-06 + 2.328884899906223e-06 + 2.273606655048426e-06 + 2.219361438179688e-06 + 2.166135288678882e-06 + 2.113914360085187e-06 + 2.062684907096663e-06 + 2.012433292648363e-06 + 1.963145994708785e-06 + 1.914809593193956e-06 + 1.867410777738679e-06 + 1.820936351687259e-06 + 1.775373220609589e-06 + 1.730708401732302e-06 + 1.686929024947410e-06 + 1.644022323067757e-06 + 1.601975642837270e-06 + 1.560776441656341e-06 + 1.520412279298016e-06 + 1.480870830315665e-06 + 1.442139880698395e-06 + 1.404207319625165e-06 + 1.367061149777226e-06 + 1.330689483155573e-06 + 1.295080535963615e-06 + 1.260222640873472e-06 + 1.226104237141460e-06 + 1.192713867093549e-06 + 1.160040189500492e-06 + 1.128071969424555e-06 + 1.096798076008267e-06 + 1.066207493417804e-06 + 1.036289310659725e-06 + 1.007032721493895e-06 + 9.784270338592895e-07 + 9.504616588874799e-07 + 9.231261128777845e-07 + 8.964100256766087e-07 + 8.703031286825232e-07 + 8.447952585150839e-07 + 8.198763641874936e-07 + 7.955364948286083e-07 + 7.717658049346632e-07 + 7.485545598914059e-07 + 7.258931238786546e-07 + 7.037719665410901e-07 + 6.821816664988581e-07 + 6.611128998791421e-07 + 6.405564483055948e-07 + 6.205032003278225e-07 + 6.009441408121614e-07 + 5.818703600152187e-07 + 5.632730528626383e-07 + 5.451435094097432e-07 + 5.274731247677268e-07 + 5.102533965000488e-07 + 4.934759162480692e-07 + 4.771323800991179e-07 + 4.612145841662162e-07 + 4.457144176881476e-07 + 4.306238737382497e-07 + 4.159350428538716e-07 + 4.016401077051372e-07 + 3.877313539402903e-07 + 3.742011622647174e-07 + 3.610420046499709e-07 + 3.482464547968944e-07 + 3.358071790150475e-07 + 3.237169340794661e-07 + 3.119685770955318e-07 + 3.005550554375413e-07 + 2.894694062090586e-07 + 2.787047650882795e-07 + 2.682543557659438e-07 + 2.581114909968296e-07 + 2.482695801165890e-07 + 2.387221182727572e-07 + 2.294626890008751e-07 + 2.204849703818711e-07 + 2.117827241548630e-07 + 2.033497996067267e-07 + 1.951801384624956e-07 + 1.872677641420447e-07 + 1.796067867093452e-07 + 1.721914062527642e-07 + 1.650159027896018e-07 + 1.580746421942365e-07 + 1.513620776690125e-07 + 1.448727406655565e-07 + 1.386012477684331e-07 + 1.325423000867771e-07 + 1.266906752868051e-07 + 1.210412352836648e-07 + 1.155889239131470e-07 + 1.103287600176973e-07 + 1.052558455547364e-07 + 1.003653617115032e-07 + 9.565256321109978e-08 + 9.111278671292873e-08 + 8.674144556415159e-08 + 8.253402527034383e-08 + 7.848609177536523e-08 + 7.459328520671134e-08 + 7.085131661573615e-08 + 6.725597593242166e-08 + 6.380312478868793e-08 + 6.048869454868003e-08 + 5.730869376312298e-08 + 5.425920030057914e-08 + 5.133636064443935e-08 + 4.853639660958214e-08 + 4.585559704969457e-08 + 4.329031836991616e-08 + 4.083699031045398e-08 + 3.849210751108346e-08 + 3.625223113812888e-08 + 3.411399355038575e-08 + 3.207408998824199e-08 + 3.012928121511996e-08 + 2.827639696078167e-08 + 2.651232793166280e-08 + 2.483402934338396e-08 + 2.323852311474514e-08 + 2.172289034680298e-08 + 2.028427559044146e-08 + 1.891988778877689e-08 + 1.762699339728036e-08 + 1.640292125402531e-08 + 1.524506224991720e-08 + 1.415086320949184e-08 + 1.311783222446413e-08 + 1.214353712508316e-08 + 1.122560019257377e-08 + 1.036170378687137e-08 + 9.549587722603005e-09 + 8.787044877843281e-09 + 8.071926961605364e-09 + 7.402140903161946e-09 + 6.775645388472587e-09 + 6.190456604129221e-09 + 5.644643792323680e-09 + 5.136326726146161e-09 + 4.663681262833891e-09 + 4.224934232596794e-09 + 3.818361845837701e-09 + 3.442294891302550e-09 + 3.095113141246544e-09 + 2.775244665814773e-09 + 2.481170514027403e-09 + 2.211418834557044e-09 + 1.964565051498559e-09 + 1.739235878927056e-09 + 1.534103359980556e-09 + 1.347885831336700e-09 + 1.179351163642234e-09 + 1.027310894648576e-09 + 8.906218977827446e-10 + 7.681887799049897e-10 + 6.589582548472836e-10 + 5.619214238374888e-10 + 4.761152985830568e-10 + 4.006175343477256e-10 + 3.345492227248809e-10 + 2.770755362128679e-10 + 2.274009179016229e-10 + 1.847722840116674e-10 + 1.484788129161787e-10 + 1.178476648704315e-10 + 9.224748788184573e-11 + 7.108739902161543e-11 + 5.381328706422649e-11 + 3.991151299277479e-11 + 2.890715266694438e-11 + 2.036091648096713e-11 + 1.387293445657948e-11 + 9.080348320515963e-12 + 5.654863833225597e-12 + 3.306507674167889e-12 + 1.780689492983021e-12 + 8.563646514161430e-13 + 3.496037276049943e-13 + 1.104943293034196e-13 + 2.161027650041889e-14 + 5.028049336448720e-16 + 0.000000000000000e+00 + 0.000000000000000e+00 + 7.485272593961791e+04 + 1.493519318697679e+05 + 2.234970831294996e+05 + 2.972876533345640e+05 + 3.707231243774131e+05 + 4.438029864272003e+05 + 5.165267379297798e+05 + 5.888938856077072e+05 + 6.609039444602393e+05 + 7.325564377633340e+05 + 8.038508970696502e+05 + 8.747868622085482e+05 + 9.453638812860892e+05 + 1.015581510685036e+06 + 1.085439315064852e+06 + 1.154936867361703e+06 + 1.224073748788454e+06 + 1.292849548834672e+06 + 1.361263865266626e+06 + 1.429316304127287e+06 + 1.497006479736322e+06 + 1.564334014690106e+06 + 1.631298539861710e+06 + 1.697899694400910e+06 + 1.764137125734180e+06 + 1.830010489564698e+06 + 1.895519449872339e+06 + 1.960663678913685e+06 + 2.025442857222013e+06 + 2.089856673607306e+06 + 2.153904825156247e+06 + 2.217587017232217e+06 + 2.280902963475303e+06 + 2.343852385802290e+06 + 2.406435014406665e+06 + 2.468650587758616e+06 + 2.530498852605031e+06 + 2.591979563969503e+06 + 2.653092485152322e+06 + 2.713837387730482e+06 + 2.774214051557675e+06 + 2.834222264764299e+06 + 2.893861823757447e+06 + 2.953132533220919e+06 + 3.012034206115212e+06 + 3.070566663677527e+06 + 3.128729735421764e+06 + 3.186523259138526e+06 + 3.243947080895115e+06 + 3.301001055035538e+06 + 3.357685044180497e+06 + 3.413998919227402e+06 + 3.469942559350358e+06 + 3.525515852000176e+06 + 3.580718692904367e+06 + 3.635550986067140e+06 + 3.690012643769410e+06 + 3.744103586568788e+06 + 3.797823743299592e+06 + 3.851173051072835e+06 + 3.904151455276238e+06 + 3.956758909574216e+06 + 4.008995375907890e+06 + 4.060860824495079e+06 + 4.112355233830309e+06 + 4.163478590684799e+06 + 4.214230890106475e+06 + 4.264612135419963e+06 + 4.314622338226588e+06 + 4.364261518404378e+06 + 4.413529704108060e+06 + 4.462426931769069e+06 + 4.510953246095533e+06 + 4.559108700072286e+06 + 4.606893354960858e+06 + 4.654307280299488e+06 + 4.701350553903108e+06 + 4.748023261863358e+06 + 4.794325498548575e+06 + 4.840257366603798e+06 + 4.885818976950768e+06 + 4.931010448787929e+06 + 4.975831909590418e+06 + 5.020283495110085e+06 + 5.064365349375471e+06 + 5.108077624691823e+06 + 5.151420481641092e+06 + 5.194394089081923e+06 + 5.236998624149668e+06 + 5.279234272256376e+06 + 5.321101227090800e+06 + 5.362599690618395e+06 + 5.403729873081312e+06 + 5.444491992998408e+06 + 5.484886277165242e+06 + 5.524912960654069e+06 + 5.564572286813851e+06 + 5.603864507270245e+06 + 5.642789881925615e+06 + 5.681348678959022e+06 + 5.719541174826232e+06 + 5.757367654259708e+06 + 5.794828410268617e+06 + 5.831923744138825e+06 + 5.868653965432902e+06 + 5.905019391990117e+06 + 5.941020349926441e+06 + 5.976657173634544e+06 + 6.011930205783804e+06 + 6.046839797320290e+06 + 6.081386307466779e+06 + 6.115570103722748e+06 + 6.149391561864376e+06 + 6.182851065944540e+06 + 6.215949008292822e+06 + 6.248685789515501e+06 + 6.281061818495561e+06 + 6.313077512392686e+06 + 6.344733296643257e+06 + 6.376029604960365e+06 + 6.406966879333793e+06 + 6.437545570030033e+06 + 6.467766135592271e+06 + 6.497629042840399e+06 + 6.527134766871008e+06 + 6.556283791057392e+06 + 6.585076607049545e+06 + 6.613513714774162e+06 + 6.641595622434638e+06 + 6.669322846511072e+06 + 6.696695911760264e+06 + 6.723715351215711e+06 + 6.750381706187615e+06 + 6.776695526262878e+06 + 6.802657369305105e+06 + 6.828267801454599e+06 + 6.853527397128366e+06 + 6.878436739020114e+06 + 6.902996418100249e+06 + 6.927207033615881e+06 + 6.951069193090819e+06 + 6.974583512325577e+06 + 6.997750615397365e+06 + 7.020571134660101e+06 + 7.043045710744397e+06 + 7.065174992557568e+06 + 7.086959637283633e+06 + 7.108400310383311e+06 + 7.129497685594021e+06 + 7.150252444929884e+06 + 7.170665278681723e+06 + 7.190736885417059e+06 + 7.210467971980117e+06 + 7.229859253491821e+06 + 7.248911453349800e+06 + 7.267625303228384e+06 + 7.286001543078595e+06 + 7.304040921128170e+06 + 7.321744193881537e+06 + 7.339112126119829e+06 + 7.356145490900878e+06 + 7.372845069559221e+06 + 7.389211651706094e+06 + 7.405246035229432e+06 + 7.420949026293878e+06 + 7.436321439340766e+06 + 7.451364097088138e+06 + 7.466077830530737e+06 + 7.480463478940005e+06 + 7.494521889864086e+06 + 7.508253919127826e+06 + 7.521660430832772e+06 + 7.534742297357169e+06 + 7.547500399355968e+06 + 7.559935625760819e+06 + 7.572048873780073e+06 + 7.583841048898782e+06 + 7.595313064878696e+06 + 7.606465843758276e+06 + 7.617300315852673e+06 + 7.627817419753745e+06 + 7.638018102330050e+06 + 7.647903318726848e+06 + 7.657474032366097e+06 + 7.666731214946462e+06 + 7.675675846443305e+06 + 7.684308915108687e+06 + 7.692631417471377e+06 + 7.700644358336839e+06 + 7.708348750787240e+06 + 7.715745616181449e+06 + 7.722835984155037e+06 + 7.729620892620270e+06 + 7.736101387766127e+06 + 7.742278524058277e+06 + 7.748153364239094e+06 + 7.753726979327655e+06 + 7.759000448619737e+06 + 7.763974859687817e+06 + 7.768651308381077e+06 + 7.773030898825390e+06 + 7.777114743423343e+06 + 7.780903962854218e+06 + 7.784399686073998e+06 + 7.787603050315368e+06 + 7.790515201087713e+06 + 7.793137292177119e+06 + 7.795470485646380e+06 + 7.797515951834979e+06 + 7.799274869359110e+06 + 7.800748425111664e+06 + 7.801937814262233e+06 + 7.802844240257111e+06 + 7.803468914819297e+06 + 7.803813057948484e+06 + 7.803877897921070e+06 + 7.803664671290156e+06 + 7.803174622885538e+06 + 7.802409005813722e+06 + 7.801369081457905e+06 + 7.800056119477995e+06 + 7.798471397810592e+06 + 7.796616202669007e+06 + 7.794491828543244e+06 + 7.792099578200010e+06 + 7.789440762682715e+06 + 7.786516701311473e+06 + 7.783328721683091e+06 + 7.779878159671083e+06 + 7.776166359425665e+06 + 7.772194673373749e+06 + 7.767964462218953e+06 + 7.763477094941595e+06 + 7.758733948798692e+06 + 7.753736409323964e+06 + 7.748485870327833e+06 + 7.742983733897421e+06 + 7.737231410396548e+06 + 7.731230318465743e+06 + 7.724981885022229e+06 + 7.718487545259933e+06 + 7.711748742649483e+06 + 7.704766928938209e+06 + 7.697543564150140e+06 + 7.690080116586007e+06 + 7.682378062823243e+06 + 7.674438887715982e+06 + 7.666264084395060e+06 + 7.657855154268012e+06 + 7.649213607019073e+06 + 7.640340960609185e+06 + 7.631238741275986e+06 + 7.621908483533815e+06 + 7.612351730173716e+06 + 7.602570032263434e+06 + 7.592564949147409e+06 + 7.582338048446788e+06 + 7.571890906059416e+06 + 7.561225106159844e+06 + 7.550342241199316e+06 + 7.539243911905785e+06 + 7.527931727283904e+06 + 7.516407304615024e+06 + 7.504672269457198e+06 + 7.492728241314434e+06 + 7.480576638153253e+06 + 7.468218723741564e+06 + 7.455655760425863e+06 + 7.442889013018662e+06 + 7.429919748798485e+06 + 7.416749237509867e+06 + 7.403378751363355e+06 + 7.389809565035504e+06 + 7.376042955668893e+06 + 7.362080202872100e+06 + 7.347922588719724e+06 + 7.333571397752370e+06 + 7.319027916976659e+06 + 7.304293435865226e+06 + 7.289369246356713e+06 + 7.274256642855777e+06 + 7.258956922233087e+06 + 7.243471383825325e+06 + 7.227801329435183e+06 + 7.211948063331366e+06 + 7.195912892248592e+06 + 7.179697125387593e+06 + 7.163302074415106e+06 + 7.146729053463890e+06 + 7.129979379132709e+06 + 7.113054370486340e+06 + 7.095955349055575e+06 + 7.078683638837219e+06 + 7.061240566294081e+06 + 7.043627460354994e+06 + 7.025845652414794e+06 + 7.007896476334333e+06 + 6.989781268440476e+06 + 6.971501367526096e+06 + 6.953058114850082e+06 + 6.934452854137335e+06 + 6.915686931578767e+06 + 6.896761695831302e+06 + 6.877678498017876e+06 + 6.858438691727439e+06 + 6.839043633014950e+06 + 6.819494680401385e+06 + 6.799793194873727e+06 + 6.779940539884974e+06 + 6.759938081354136e+06 + 6.739787187666233e+06 + 6.719489229672301e+06 + 6.699045580689385e+06 + 6.678457616500544e+06 + 6.657726715354848e+06 + 6.636854257967380e+06 + 6.615841627519235e+06 + 6.594690209657516e+06 + 6.573401392495350e+06 + 6.551976566611862e+06 + 6.530417125052197e+06 + 6.508724463327511e+06 + 6.486899979414972e+06 + 6.464945073757762e+06 + 6.442861149265066e+06 + 6.420649611312096e+06 + 6.398311867740063e+06 + 6.375849328856199e+06 + 6.353263407433745e+06 + 6.330555518711952e+06 + 6.307727080396090e+06 + 6.284779512657427e+06 + 6.261714238133261e+06 + 6.238532681926889e+06 + 6.215236271607627e+06 + 6.191826437210800e+06 + 6.168304611237747e+06 + 6.144672228655818e+06 + 6.120930726898375e+06 + 6.097081545864792e+06 + 6.073126127920459e+06 + 6.049065917896771e+06 + 6.024902363091142e+06 + 6.000636913266994e+06 + 5.976271020653763e+06 + 5.951806139946896e+06 + 5.927243728307854e+06 + 5.902585245364108e+06 + 5.877832153209144e+06 + 5.852985916402456e+06 + 5.828048001969552e+06 + 5.803019879401957e+06 + 5.777903020657199e+06 + 5.752698900158828e+06 + 5.727408994796395e+06 + 5.702034783925475e+06 + 5.676577749367647e+06 + 5.651039375410506e+06 + 5.625421148807654e+06 + 5.599724558778713e+06 + 5.573951097009313e+06 + 5.548102257651095e+06 + 5.522179537321717e+06 + 5.496184435104840e+06 + 5.470118452550147e+06 + 5.443983093673326e+06 + 5.417779864956085e+06 + 5.391510275346133e+06 + 5.365175836257203e+06 + 5.338778061569033e+06 + 5.312318467627374e+06 + 5.285798573243992e+06 + 5.259219899696662e+06 + 5.232583970729172e+06 + 5.205892312551324e+06 + 5.179146453838928e+06 + 5.152347925733812e+06 + 5.125498261843814e+06 + 5.098598998242779e+06 + 5.071651673470572e+06 + 5.044657828533064e+06 + 5.017619006902143e+06 + 4.990536754515706e+06 + 4.963412619777663e+06 + 4.936248153557934e+06 + 4.909044909192459e+06 + 4.881804442483181e+06 + 4.854528311698059e+06 + 4.827218077571064e+06 + 4.799875303302180e+06 + 4.772501554557402e+06 + 4.745098399468737e+06 + 4.717667408634203e+06 + 4.690210155117837e+06 + 4.662728214449679e+06 + 4.635223164625784e+06 + 4.607696586108224e+06 + 4.580150061825077e+06 + 4.552585177170437e+06 + 4.525003520004408e+06 + 4.497406680653105e+06 + 4.469796251908661e+06 + 4.442173829029216e+06 + 4.414541009738924e+06 + 4.386899394227949e+06 + 4.359250585152469e+06 + 4.331596187634676e+06 + 4.303937809262771e+06 + 4.276277060090966e+06 + 4.248615552639492e+06 + 4.220954901894585e+06 + 4.193296725308497e+06 + 4.165642642799490e+06 + 4.137994276751838e+06 + 4.110353252015833e+06 + 4.082721195907769e+06 + 4.055099738209962e+06 + 4.027490511170732e+06 + 3.999895149504419e+06 + 3.972315290391369e+06 + 3.944752573477943e+06 + 3.917208640876513e+06 + 3.889685137165464e+06 + 3.862183709389194e+06 + 3.834706007058111e+06 + 3.807253682148634e+06 + 3.779828389103201e+06 + 3.752431784830255e+06 + 3.725065528704253e+06 + 3.697731282565667e+06 + 3.670430710720977e+06 + 3.643165479942679e+06 + 3.615937259469279e+06 + 3.588747721005293e+06 + 3.561598538721256e+06 + 3.534491389253709e+06 + 3.507427951705208e+06 + 3.480409907644318e+06 + 3.453438941105620e+06 + 3.426516738589706e+06 + 3.399644989063177e+06 + 3.372825383958653e+06 + 3.346070405300663e+06 + 3.319465764034668e+06 + 3.293075510459727e+06 + 3.266878224028187e+06 + 3.240869303162930e+06 + 3.215052515525467e+06 + 3.189425288821125e+06 + 3.163986116962672e+06 + 3.138734196986282e+06 + 3.113668261011591e+06 + 3.088787111422079e+06 + 3.064089610843659e+06 + 3.039574592322599e+06 + 3.015240898358055e+06 + 2.991087379108502e+06 + 2.967112887579310e+06 + 2.943316282301805e+06 + 2.919696425519270e+06 + 2.896252185185970e+06 + 2.872982434032476e+06 + 2.849886048305633e+06 + 2.826961910405915e+06 + 2.804208907130155e+06 + 2.781625929123051e+06 + 2.759211873644148e+06 + 2.736965641930875e+06 + 2.714886139213983e+06 + 2.692972277509980e+06 + 2.671222972611625e+06 + 2.649637144535781e+06 + 2.628213719738566e+06 + 2.606951628696007e+06 + 2.585849806893141e+06 + 2.564907195391811e+06 + 2.544122739173453e+06 + 2.523495389008342e+06 + 2.503024101022326e+06 + 2.482707834844927e+06 + 2.462545556054412e+06 + 2.442536236120740e+06 + 2.422678849863131e+06 + 2.402972377820649e+06 + 2.383415806334849e+06 + 2.364008125120872e+06 + 2.344748329835404e+06 + 2.325635421794777e+06 + 2.306668405813749e+06 + 2.287846292982958e+06 + 2.269168099757709e+06 + 2.250632846050586e+06 + 2.232239558087812e+06 + 2.213987266957964e+06 + 2.195875007435864e+06 + 2.177901821473463e+06 + 2.160066755143500e+06 + 2.142368857948063e+06 + 2.124807187017495e+06 + 2.107380803567688e+06 + 2.090088772295509e+06 + 2.072930165358991e+06 + 2.055904058912681e+06 + 2.039009532618940e+06 + 2.022245673041180e+06 + 2.005611571515091e+06 + 1.989106323649552e+06 + 1.972729030298793e+06 + 1.956478797095825e+06 + 1.940354734917566e+06 + 1.924355960016194e+06 + 1.908481592593613e+06 + 1.892730757829583e+06 + 1.877102587255698e+06 + 1.861596215902473e+06 + 1.846210783186639e+06 + 1.830945435012332e+06 + 1.815799321323061e+06 + 1.800771597138300e+06 + 1.785861422681660e+06 + 1.771067961851037e+06 + 1.756390384114008e+06 + 1.741827864373811e+06 + 1.727379581118251e+06 + 1.713044718232857e+06 + 1.698822464839031e+06 + 1.684712013805151e+06 + 1.670712563808684e+06 + 1.656823318006428e+06 + 1.643043483055245e+06 + 1.629372271790869e+06 + 1.615808901794204e+06 + 1.602352594044968e+06 + 1.589002574975609e+06 + 1.575758076322615e+06 + 1.562618333634041e+06 + 1.549582587186907e+06 + 1.536650081999105e+06 + 1.523820067124634e+06 + 1.511091797064626e+06 + 1.498464530780005e+06 + 1.485937531189585e+06 + 1.473510066471004e+06 + 1.461181408848471e+06 + 1.448950834625962e+06 + 1.436817625926470e+06 + 1.424781068397768e+06 + 1.412840451407005e+06 + 1.400995070309470e+06 + 1.389244224245752e+06 + 1.377587216393601e+06 + 1.366023355231714e+06 + 1.354551952598923e+06 + 1.343172324427429e+06 + 1.331883792566280e+06 + 1.320685682335073e+06 + 1.309577322956444e+06 + 1.298558048406515e+06 + 1.287627196362487e+06 + 1.276784109496439e+06 + 1.266028134784103e+06 + 1.255358622320226e+06 + 1.244774926866806e+06 + 1.234276408467881e+06 + 1.223862430240984e+06 + 1.213532358913532e+06 + 1.203285566621101e+06 + 1.193121428991948e+06 + 1.183039325468658e+06 + 1.173038640304339e+06 + 1.163118761212139e+06 + 1.153279079987504e+06 + 1.143518992564451e+06 + 1.133837898317260e+06 + 1.124235201394960e+06 + 1.114710310121780e+06 + 1.105262636013577e+06 + 1.095891594215875e+06 + 1.086596604396163e+06 + 1.077377090233802e+06 + 1.068232479242110e+06 + 1.059162202266971e+06 + 1.050165693700918e+06 + 1.041242393088349e+06 + 1.032391743039430e+06 + 1.023613189178869e+06 + 1.014906181731556e+06 + 1.006270174355871e+06 + 9.977046244036794e+05 + 9.892089935677024e+05 + 9.807827465832273e+05 + 9.724253516436865e+05 + 9.641362810046984e+05 + 9.559150102252770e+05 + 9.477610188719215e+05 + 9.396737899139688e+05 + 9.316528091743080e+05 + 9.236975665277143e+05 + 9.158075561735997e+05 + 9.079822751134991e+05 + 9.002212236533747e+05 + 8.925239057014534e+05 + 8.848898281604102e+05 + 8.773185021612709e+05 + 8.698094424648809e+05 + 8.623621663528095e+05 + 8.549761944053203e+05 + 8.476510510446843e+05 + 8.403862637513808e+05 + 8.331813638606276e+05 + 8.260358860837971e+05 + 8.189493675787508e+05 + 8.119213484350282e+05 + 8.049513730504208e+05 + 7.980389891667470e+05 + 7.911837471192866e+05 + 7.843852003599521e+05 + 7.776429053419405e+05 + 7.709564221446526e+05 + 7.643253140173181e+05 + 7.577491471803443e+05 + 7.512274911598503e+05 + 7.447599180231568e+05 + 7.383460026539576e+05 + 7.319853241781880e+05 + 7.256774641850799e+05 + 7.194220067146936e+05 + 7.132185395309449e+05 + 7.070666529520636e+05 + 7.009659400728574e+05 + 6.949159975085063e+05 + 6.889164244086053e+05 + 6.829668228095188e+05 + 6.770667979456050e+05 + 6.712159574726904e+05 + 6.654139120281750e+05 + 6.596602754201142e+05 + 6.539546638052445e+05 + 6.482966962660485e+05 + 6.426859949531512e+05 + 6.371221843431445e+05 + 6.316048918617199e+05 + 6.261337478197705e+05 + 6.207083848228143e+05 + 6.153284385055641e+05 + 6.099935472682050e+05 + 6.047033517354903e+05 + 5.994574954765684e+05 + 5.942556247644721e+05 + 5.890973881315375e+05 + 5.839824370501742e+05 + 5.789104255366600e+05 + 5.738810098259439e+05 + 5.688938490610282e+05 + 5.639486048510919e+05 + 5.590449410545636e+05 + 5.541825244030216e+05 + 5.493610239467514e+05 + 5.445801109611018e+05 + 5.398394595653637e+05 + 5.351387461239359e+05 + 5.304776492529869e+05 + 5.258558503354813e+05 + 5.212730328842620e+05 + 5.167288826663374e+05 + 5.122230881980868e+05 + 5.077553400369428e+05 + 5.033253309731948e+05 + 4.989327564601310e+05 + 4.945773139811803e+05 + 4.902587033143605e+05 + 4.859766266490913e+05 + 4.817307881770549e+05 + 4.775208945372272e+05 + 4.733466546121029e+05 + 4.692077791818720e+05 + 4.651039814988278e+05 + 4.610349770333872e+05 + 4.570004830895544e+05 + 4.530002193970305e+05 + 4.490339078641191e+05 + 4.451012721716975e+05 + 4.412020383482487e+05 + 4.373359346346440e+05 + 4.335026910461138e+05 + 4.297020398291695e+05 + 4.259337153289251e+05 + 4.221974536699117e+05 + 4.184929932504728e+05 + 4.148200744355357e+05 + 4.111784393468680e+05 + 4.075678324287459e+05 + 4.039879999559653e+05 + 4.004386899065928e+05 + 3.969196525836200e+05 + 3.934306400492930e+05 + 3.899714060581240e+05 + 3.865417066557175e+05 + 3.831412995849459e+05 + 3.797699442729113e+05 + 3.764274023566474e+05 + 3.731134371233769e+05 + 3.698278135622827e+05 + 3.665702987827645e+05 + 3.633406615280775e+05 + 3.601386722825769e+05 + 3.569641034535824e+05 + 3.538167290782596e+05 + 3.506963250581825e+05 + 3.476026690576235e+05 + 3.445355402744773e+05 + 3.414947198014101e+05 + 3.384799905288533e+05 + 3.354911367821696e+05 + 3.325279446663284e+05 + 3.295902021531574e+05 + 3.266776986085196e+05 + 3.237902250531212e+05 + 3.209275743946921e+05 + 3.180895409646722e+05 + 3.152759207164211e+05 + 3.124865112943467e+05 + 3.097211117598721e+05 + 3.069795229448014e+05 + 3.042615472339510e+05 + 3.015669883675390e+05 + 2.988956518738279e+05 + 2.962473447339852e+05 + 2.936218752484120e+05 + 2.910190535228683e+05 + 2.884386911235514e+05 + 2.858806009067059e+05 + 2.833445973150213e+05 + 2.808304963224871e+05 + 2.783381153152796e+05 + 2.758672731341289e+05 + 2.734177900017136e+05 + 2.709894875428715e+05 + 2.685821889451269e+05 + 2.661957187314447e+05 + 2.638299027837526e+05 + 2.614845683836235e+05 + 2.591595441417535e+05 + 2.568546601323142e+05 + 2.545697477628685e+05 + 2.523046396706559e+05 + 2.500591699434964e+05 + 2.478331740644226e+05 + 2.456264886409644e+05 + 2.434389516128850e+05 + 2.412704023657298e+05 + 2.391206814330098e+05 + 2.369896306904384e+05 + 2.348770933197599e+05 + 2.327829136173563e+05 + 2.307069372775990e+05 + 2.286490111745211e+05 + 2.266089832623643e+05 + 2.245867029748616e+05 + 2.225820209237310e+05 + 2.205947887183862e+05 + 2.186248592921233e+05 + 2.166720868039439e+05 + 2.147363264605261e+05 + 2.128174347706827e+05 + 2.109152693889452e+05 + 2.090296889843596e+05 + 2.071605535077064e+05 + 2.053077240108720e+05 + 2.034710625599661e+05 + 2.016504325007521e+05 + 1.998456982030229e+05 + 1.980567250370223e+05 + 1.962833797138016e+05 + 1.945255298870997e+05 + 1.927830441323482e+05 + 1.910557922964590e+05 + 1.893436452442803e+05 + 1.876464748512476e+05 + 1.859641540986015e+05 + 1.842965568967865e+05 + 1.826435581738182e+05 + 1.810050340354470e+05 + 1.793808614993985e+05 + 1.777709185575675e+05 + 1.761750842223128e+05 + 1.745932384546507e+05 + 1.730252623268235e+05 + 1.714710377603550e+05 + 1.699304475698536e+05 + 1.684033757560533e+05 + 1.668897071565261e+05 + 1.653893274220018e+05 + 1.639021233234161e+05 + 1.624279825159149e+05 + 1.609667934564489e+05 + 1.595184456811041e+05 + 1.580828296015031e+05 + 1.566598363968120e+05 + 1.552493582649543e+05 + 1.538512882702573e+05 + 1.524655202573447e+05 + 1.510919491064028e+05 + 1.497304705096718e+05 + 1.483809809029638e+05 + 1.470433777326744e+05 + 1.457175592117312e+05 + 1.444034242942686e+05 + 1.431008729933990e+05 + 1.418098060421684e+05 + 1.405301248671864e+05 + 1.392617319094920e+05 + 1.380045303259556e+05 + 1.367584239714278e+05 + 1.355233176631985e+05 + 1.342991169575939e+05 + 1.330857281367400e+05 + 1.318830583220329e+05 + 1.306910153813551e+05 + 1.295095079605118e+05 + 1.283384454277201e+05 + 1.271777378619642e+05 + 1.260272961737778e+05 + 1.248870320778846e+05 + 1.237568578844075e+05 + 1.226366865814357e+05 + 1.215264320654815e+05 + 1.204260088572700e+05 + 1.193353321256488e+05 + 1.182543179024696e+05 + 1.171828828329888e+05 + 1.161209441971572e+05 + 1.150684200368906e+05 + 1.140252290172446e+05 + 1.129912905290012e+05 + 1.119665246989244e+05 + 1.109508522377596e+05 + 1.099441945145749e+05 + 1.089464735474612e+05 + 1.079576119759672e+05 + 1.069775332658437e+05 + 1.060061613940063e+05 + 1.050434208615313e+05 + 1.040892370245828e+05 + 1.031435357647047e+05 + 1.022062434696232e+05 + 1.012772873208916e+05 + 1.003565950684523e+05 + 9.944409498683986e+04 + 9.853971604124359e+04 + 9.764338777276211e+04 + 9.675504027159151e+04 + 9.587460425195689e+04 + 9.500201099602232e+04 + 9.413719236230559e+04 + 9.328008081668093e+04 + 9.243060935253548e+04 + 9.158871152497102e+04 + 9.075432150057999e+04 + 8.992737394814150e+04 + 8.910780408381460e+04 + 8.829554772812854e+04 + 8.749054118346877e+04 + 8.669272128864085e+04 + 8.590202548133289e+04 + 8.511839166524833e+04 + 8.434175826486869e+04 + 8.357206428147563e+04 + 8.280924917713979e+04 + 8.205325293940101e+04 + 8.130401609766987e+04 + 8.056147962909786e+04 + 7.982558503959214e+04 + 7.909627435336930e+04 + 7.837349003289423e+04 + 7.765717506702039e+04 + 7.694727293156023e+04 + 7.624372753229675e+04 + 7.554648331079309e+04 + 7.485548516457589e+04 + 7.417067840840557e+04 + 7.349200889763620e+04 + 7.281942291879337e+04 + 7.215286716185752e+04 + 7.149228885123666e+04 + 7.083763563584826e+04 + 7.018885556144921e+04 + 6.954589717270633e+04 + 6.890870943981725e+04 + 6.827724174191867e+04 + 6.765144392787226e+04 + 6.703126624692857e+04 + 6.641665935636370e+04 + 6.580757439267423e+04 + 6.520396286738058e+04 + 6.460577668030654e+04 + 6.401296820028803e+04 + 6.342549017134596e+04 + 6.284329573351656e+04 + 6.226633845994343e+04 + 6.169457228450359e+04 + 6.112795154311772e+04 + 6.056643099463883e+04 + 6.000996574136701e+04 + 5.945851127624574e+04 + 5.891202351267684e+04 + 5.837045869755570e+04 + 5.783377345558033e+04 + 5.730192482224794e+04 + 5.677487016169035e+04 + 5.625256720967715e+04 + 5.573497408983271e+04 + 5.522204924870504e+04 + 5.471375150828325e+04 + 5.421004006036229e+04 + 5.371087441354901e+04 + 5.321621444975662e+04 + 5.272602039469258e+04 + 5.224025278120609e+04 + 5.175887251825204e+04 + 5.128184085536604e+04 + 5.080911934597862e+04 + 5.034066989608183e+04 + 4.987645473684455e+04 + 4.941643640415772e+04 + 4.896057778639881e+04 + 4.850884207769758e+04 + 4.806119277190277e+04 + 4.761759372195903e+04 + 4.717800906318111e+04 + 4.674240321587012e+04 + 4.631074096205200e+04 + 4.588298735942246e+04 + 4.545910774537743e+04 + 4.503906779825089e+04 + 4.462283347373459e+04 + 4.421037101686000e+04 + 4.380164697651120e+04 + 4.339662816996042e+04 + 4.299528171729217e+04 + 4.259757504220949e+04 + 4.220347581706527e+04 + 4.181295199605238e+04 + 4.142597183433527e+04 + 4.104250383855765e+04 + 4.066251680332360e+04 + 4.028597979815155e+04 + 3.991286213370509e+04 + 3.954313341370015e+04 + 3.917676350485435e+04 + 3.881372250661203e+04 + 3.845398080843414e+04 + 3.809750905736740e+04 + 3.774427812448402e+04 + 3.739425915595785e+04 + 3.704742356207799e+04 + 3.670374297805164e+04 + 3.636318929176292e+04 + 3.602573463927982e+04 + 3.569135138416072e+04 + 3.536001215672983e+04 + 3.503168981923036e+04 + 3.470635744840465e+04 + 3.438398837321134e+04 + 3.406455615393208e+04 + 3.374803457309094e+04 + 3.343439765983423e+04 + 3.312361965186892e+04 + 3.281567499925836e+04 + 3.251053841177231e+04 + 3.220818480242078e+04 + 3.190858928930939e+04 + 3.161172723179306e+04 + 3.131757418548949e+04 + 3.102610591483113e+04 + 3.073729842710719e+04 + 3.045112791454117e+04 + 3.016757076691534e+04 + 2.988660361584138e+04 + 2.960820327321778e+04 + 2.933234674204399e+04 + 2.905901125674980e+04 + 2.878817423326317e+04 + 2.851981328372868e+04 + 2.825390622682930e+04 + 2.799043106146120e+04 + 2.772936599846356e+04 + 2.747068942978120e+04 + 2.721437991599866e+04 + 2.696041623625263e+04 + 2.670877735469368e+04 + 2.645944239579323e+04 + 2.621239068106394e+04 + 2.596760172331024e+04 + 2.572505519859007e+04 + 2.548473096648493e+04 + 2.524660907253227e+04 + 2.501066972455740e+04 + 2.477689330466365e+04 + 2.454526037995217e+04 + 2.431575168300119e+04 + 2.408834810912627e+04 + 2.386303072521571e+04 + 2.363978076395976e+04 + 2.341857962988761e+04 + 2.319940888531031e+04 + 2.298225025100848e+04 + 2.276708562349589e+04 + 2.255389704384009e+04 + 2.234266670372097e+04 + 2.213337697918792e+04 + 2.192601038403303e+04 + 2.172054957464747e+04 + 2.151697738916041e+04 + 2.131527680276242e+04 + 2.111543093252480e+04 + 2.091742306098243e+04 + 2.072123660422193e+04 + 2.052685512482519e+04 + 2.033426234716574e+04 + 2.014344212098682e+04 + 1.995437843426629e+04 + 1.976705544479930e+04 + 1.958145743480243e+04 + 1.939756881213320e+04 + 1.921537413684756e+04 + 1.903485810052154e+04 + 1.885600554387774e+04 + 1.867880143037429e+04 + 1.850323084111479e+04 + 1.832927901452323e+04 + 1.815693131178678e+04 + 1.798617320994377e+04 + 1.781699034075772e+04 + 1.764936845332217e+04 + 1.748329340510924e+04 + 1.731875119617678e+04 + 1.715572795110660e+04 + 1.699420990919751e+04 + 1.683418344358223e+04 + 1.667563503873475e+04 + 1.651855128954979e+04 + 1.636291893365341e+04 + 1.620872481606836e+04 + 1.605595588699932e+04 + 1.590459923143625e+04 + 1.575464203906202e+04 + 1.560607160533683e+04 + 1.545887535681969e+04 + 1.531304082443131e+04 + 1.516855564487381e+04 + 1.502540756956110e+04 + 1.488358445432479e+04 + 1.474307426938193e+04 + 1.460386509288249e+04 + 1.446594509814283e+04 + 1.432930256776952e+04 + 1.419392589719183e+04 + 1.405980357729324e+04 + 1.392692420658459e+04 + 1.379527648729671e+04 + 1.366484921045415e+04 + 1.353563127160237e+04 + 1.340761167272577e+04 + 1.328077950662285e+04 + 1.315512397004589e+04 + 1.303063434970357e+04 + 1.290730001970431e+04 + 1.278511047006237e+04 + 1.266405528001385e+04 + 1.254412410683634e+04 + 1.242530670538782e+04 + 1.230759293022181e+04 + 1.219097272173875e+04 + 1.207543611008671e+04 + 1.196097321598039e+04 + 1.184757424417080e+04 + 1.173522949287449e+04 + 1.162392934478714e+04 + 1.151366426384512e+04 + 1.140442480834694e+04 + 1.129620161634352e+04 + 1.118898540470730e+04 + 1.108276698378667e+04 + 1.097753724013271e+04 + 1.087328713748510e+04 + 1.077000773143687e+04 + 1.066769015148828e+04 + 1.056632560317495e+04 + 1.046590537899618e+04 + 1.036642084361778e+04 + 1.026786343864257e+04 + 1.017022468912003e+04 + 1.007349618928313e+04 + 9.977669609110566e+03 + 9.882736699245763e+03 + 9.788689277747368e+03 + 9.695519238085319e+03 + 9.603218551128393e+03 + 9.511779252802526e+03 + 9.421193453258842e+03 + 9.331453338088948e+03 + 9.242551155902798e+03 + 9.154479227014926e+03 + 9.067229945268125e+03 + 8.980795767109534e+03 + 8.895169220035050e+03 + 8.810342900070031e+03 + 8.726309463870590e+03 + 8.643061639313548e+03 + 8.560592220958239e+03 + 8.478894062727115e+03 + 8.397960086705119e+03 + 8.317783279679375e+03 + 8.238356687487571e+03 + 8.159673421912185e+03 + 8.081726656780256e+03 + 8.004509624589081e+03 + 7.928015622553179e+03 + 7.852238006535134e+03 + 7.777170190090504e+03 + 7.702805651284038e+03 + 7.629137923269694e+03 + 7.556160595291118e+03 + 7.483867321684783e+03 + 7.412251809739373e+03 + 7.341307820993124e+03 + 7.271029178292266e+03 + 7.201409756944273e+03 + 7.132443488123264e+03 + 7.064124361053455e+03 + 6.996446414793790e+03 + 6.929403743407001e+03 + 6.862990497342477e+03 + 6.797200875139910e+03 + 6.732029129721631e+03 + 6.667469570161823e+03 + 6.603516551523545e+03 + 6.540164480186692e+03 + 6.477407817185619e+03 + 6.415241069687017e+03 + 6.353658796883785e+03 + 6.292655608307650e+03 + 6.232226157518487e+03 + 6.172365149982773e+03 + 6.113067340658933e+03 + 6.054327527853383e+03 + 5.996140560115221e+03 + 5.938501333076975e+03 + 5.881404784939355e+03 + 5.824845903828315e+03 + 5.768819722461626e+03 + 5.713321315085574e+03 + 5.658345805472132e+03 + 5.603888359764917e+03 + 5.549944184846402e+03 + 5.496508537213697e+03 + 5.443576713947663e+03 + 5.391144051368102e+03 + 5.339205932358427e+03 + 5.287757780134069e+03 + 5.236795058291703e+03 + 5.186313275265001e+03 + 5.136307977685731e+03 + 5.086774751617681e+03 + 5.037709226449485e+03 + 4.989107068721900e+03 + 4.940963984504954e+03 + 4.893275721702213e+03 + 4.846038063285039e+03 + 4.799246830729600e+03 + 4.752897888312231e+03 + 4.706987133608333e+03 + 4.661510499922751e+03 + 4.616463963202395e+03 + 4.571843532909213e+03 + 4.527645253893021e+03 + 4.483865209302220e+03 + 4.440499515324517e+03 + 4.397544325863069e+03 + 4.354995830474305e+03 + 4.312850249817291e+03 + 4.271103841242844e+03 + 4.229752898292512e+03 + 4.188793745275323e+03 + 4.148222740634546e+03 + 4.108036277499050e+03 + 4.068230779797937e+03 + 4.028802705831530e+03 + 3.989748546349355e+03 + 3.951064821861195e+03 + 3.912748086813885e+03 + 3.874794926585441e+03 + 3.837201956255947e+03 + 3.799965825835211e+03 + 3.763083213042953e+03 + 3.726550823283946e+03 + 3.690365398229224e+03 + 3.654523706502605e+03 + 3.619022543185401e+03 + 3.583858737044133e+03 + 3.549029144619817e+03 + 3.514530650270483e+03 + 3.480360168271582e+03 + 3.446514639490202e+03 + 3.412991033253400e+03 + 3.379786348393921e+03 + 3.346897609451590e+03 + 3.314321868815865e+03 + 3.282056205761040e+03 + 3.250097724763853e+03 + 3.218443559530467e+03 + 3.187090870156345e+03 + 3.156036839918450e+03 + 3.125278679259401e+03 + 3.094813626126841e+03 + 3.064638941053712e+03 + 3.034751909739014e+03 + 3.005149845581890e+03 + 2.975830084543172e+03 + 2.946789986568892e+03 + 2.918026936797055e+03 + 2.889538343339952e+03 + 2.861321641252218e+03 + 2.833374286700636e+03 + 2.805693756659566e+03 + 2.778277556469224e+03 + 2.751123212016022e+03 + 2.724228269242043e+03 + 2.697590301914011e+03 + 2.671206904109025e+03 + 2.645075688971241e+03 + 2.619194294405700e+03 + 2.593560380141823e+03 + 2.568171626715687e+03 + 2.543025737542386e+03 + 2.518120435211838e+03 + 2.493453462030127e+03 + 2.469022585172818e+03 + 2.444825590018873e+03 + 2.420860280374604e+03 + 2.397124484732366e+03 + 2.373616049394018e+03 + 2.350332838436762e+03 + 2.327272738609171e+03 + 2.304433655218562e+03 + 2.281813512846715e+03 + 2.259410255601743e+03 + 2.237221844685107e+03 + 2.215246260811306e+03 + 2.193481506123082e+03 + 2.171925598942706e+03 + 2.150576574458654e+03 + 2.129432488764117e+03 + 2.108491414442484e+03 + 2.087751441300839e+03 + 2.067210678851041e+03 + 2.046867252353801e+03 + 2.026719303565292e+03 + 2.006764993817073e+03 + 1.987002500493615e+03 + 1.967430017215378e+03 + 1.948045754608514e+03 + 1.928847939062915e+03 + 1.909834815497017e+03 + 1.891004644375446e+03 + 1.872355700452609e+03 + 1.853886275802303e+03 + 1.835594678424827e+03 + 1.817479231062563e+03 + 1.799538272810955e+03 + 1.781770158220284e+03 + 1.764173256646331e+03 + 1.746745953278825e+03 + 1.729486647489427e+03 + 1.712393752933919e+03 + 1.695465699568615e+03 + 1.678700930817119e+03 + 1.662097903850073e+03 + 1.645655091966725e+03 + 1.629370981458450e+03 + 1.613244072202941e+03 + 1.597272880432907e+03 + 1.581455933682248e+03 + 1.565791771294578e+03 + 1.550278951289465e+03 + 1.534916043199639e+03 + 1.519701626827566e+03 + 1.504634298568118e+03 + 1.489712666891078e+03 + 1.474935351996483e+03 + 1.460300988758884e+03 + 1.445808223853118e+03 + 1.431455716350942e+03 + 1.417242138357507e+03 + 1.403166173386480e+03 + 1.389226518010158e+03 + 1.375421881007569e+03 + 1.361750982089843e+03 + 1.348212553926219e+03 + 1.334805341072190e+03 + 1.321528098720046e+03 + 1.308379594477261e+03 + 1.295358607457036e+03 + 1.282463927300085e+03 + 1.269694355823267e+03 + 1.257048705895313e+03 + 1.244525800699936e+03 + 1.232124475203576e+03 + 1.219843575042076e+03 + 1.207681956049559e+03 + 1.195638485404256e+03 + 1.183712040621380e+03 + 1.171901509388141e+03 + 1.160205790292893e+03 + 1.148623791762007e+03 + 1.137154432301071e+03 + 1.125796641257775e+03 + 1.114549357263016e+03 + 1.103411528660030e+03 + 1.092382114454342e+03 + 1.081460082700689e+03 + 1.070644411095300e+03 + 1.059934087579793e+03 + 1.049328108720195e+03 + 1.038825480494848e+03 + 1.028425218971371e+03 + 1.018126348582361e+03 + 1.007927902927668e+03 + 9.978289254104482e+02 + 9.878284675679866e+02 + 9.779255898738762e+02 + 9.681193621623704e+02 + 9.584088623012988e+02 + 9.487931771658360e+02 + 9.392714022763922e+02 + 9.298426409505287e+02 + 9.205060057185552e+02 + 9.112606172437117e+02 + 9.021056036681564e+02 + 8.930401022331439e+02 + 8.840632580637879e+02 + 8.751742235821227e+02 + 8.663721600224155e+02 + 8.576562363107178e+02 + 8.490256285516970e+02 + 8.404795212594149e+02 + 8.320171064683727e+02 + 8.236375833541338e+02 + 8.153401590664150e+02 + 8.071240480244585e+02 + 7.989884718119321e+02 + 7.909326598382663e+02 + 7.829558483527250e+02 + 7.750572805483002e+02 + 7.672362073200991e+02 + 7.594918862313154e+02 + 7.518235817392584e+02 + 7.442305655888715e+02 + 7.367121158939042e+02 + 7.292675176279554e+02 + 7.218960630476328e+02 + 7.145970504767349e+02 + 7.073697847820883e+02 + 7.002135778527235e+02 + 6.931277475695276e+02 + 6.861116184218383e+02 + 6.791645215373005e+02 + 6.722857937677298e+02 + 6.654747784472139e+02 + 6.587308253877042e+02 + 6.520532900189463e+02 + 6.454415341582659e+02 + 6.388949257382737e+02 + 6.324128381494658e+02 + 6.259946511571761e+02 + 6.196397502963263e+02 + 6.133475264197438e+02 + 6.071173768094372e+02 + 6.009487042352257e+02 + 5.948409165626937e+02 + 5.887934278801442e+02 + 5.828056577149104e+02 + 5.768770306335107e+02 + 5.710069770500405e+02 + 5.651949326339243e+02 + 5.594403381224611e+02 + 5.537426401234757e+02 + 5.481012901152631e+02 + 5.425157443662293e+02 + 5.369854648776029e+02 + 5.315099185870243e+02 + 5.260885773011631e+02 + 5.207209179649268e+02 + 5.154064223119497e+02 + 5.101445770921985e+02 + 5.049348740937783e+02 + 4.997768095346806e+02 + 4.946698844046663e+02 + 4.896136047862775e+02 + 4.846074811232588e+02 + 4.796510285618583e+02 + 4.747437670096575e+02 + 4.698852205388910e+02 + 4.650749179071526e+02 + 4.603123926691712e+02 + 4.555971823563725e+02 + 4.509288288727789e+02 + 4.463068788207030e+02 + 4.417308827523721e+02 + 4.372003955530256e+02 + 4.327149765501697e+02 + 4.282741889383891e+02 + 4.238776002586995e+02 + 4.195247821802792e+02 + 4.152153101301976e+02 + 4.109487639564401e+02 + 4.067247273397822e+02 + 4.025427875685178e+02 + 3.984025363858318e+02 + 3.943035692477232e+02 + 3.902454851077117e+02 + 3.862278871965347e+02 + 3.822503823673904e+02 + 3.783125809462488e+02 + 3.744140974100913e+02 + 3.705545496319825e+02 + 3.667335588488600e+02 + 3.629507504654170e+02 + 3.592057531920941e+02 + 3.554981990087823e+02 + 3.518277237997781e+02 + 3.481939667588409e+02 + 3.445965704231110e+02 + 3.410351808614133e+02 + 3.375094474036331e+02 + 3.340190228447264e+02 + 3.305635632260179e+02 + 3.271427276872922e+02 + 3.237561788604219e+02 + 3.204035826343936e+02 + 3.170846077594078e+02 + 3.137989262426811e+02 + 3.105462135925898e+02 + 3.073261480789523e+02 + 3.041384108878384e+02 + 3.009826866110996e+02 + 2.978586626197819e+02 + 2.947660292278245e+02 + 2.917044799774912e+02 + 2.886737110898206e+02 + 2.856734216347172e+02 + 2.827033138205502e+02 + 2.797630925185924e+02 + 2.768524653868921e+02 + 2.739711430162750e+02 + 2.711188386172004e+02 + 2.682952682417776e+02 + 2.655001507075566e+02 + 2.627332073441469e+02 + 2.599941621974095e+02 + 2.572827420191948e+02 + 2.545986760992428e+02 + 2.519416963867954e+02 + 2.493115374004747e+02 + 2.467079361520411e+02 + 2.441306322519956e+02 + 2.415793676749632e+02 + 2.390538868162835e+02 + 2.365539368283623e+02 + 2.340792670618049e+02 + 2.316296291092408e+02 + 2.292047772816256e+02 + 2.268044680583002e+02 + 2.244284601550858e+02 + 2.220765149177526e+02 + 2.197483957886078e+02 + 2.174438683808943e+02 + 2.151627007150871e+02 + 2.129046628991759e+02 + 2.106695273325222e+02 + 2.084570687245048e+02 + 2.062670637405841e+02 + 2.040992912166423e+02 + 2.019535322675416e+02 + 1.998295699356443e+02 + 1.977271893831886e+02 + 1.956461779038128e+02 + 1.935863247355415e+02 + 1.915474213798307e+02 + 1.895292611678483e+02 + 1.875316391958052e+02 + 1.855543528482985e+02 + 1.835972014670904e+02 + 1.816599861324650e+02 + 1.797425099308505e+02 + 1.778445779263947e+02 + 1.759659969484732e+02 + 1.741065756739388e+02 + 1.722661246609050e+02 + 1.704444562587039e+02 + 1.686413847511611e+02 + 1.668567261386198e+02 + 1.650902980928235e+02 + 1.633419201885993e+02 + 1.616114136777071e+02 + 1.598986014805750e+02 + 1.582033083619683e+02 + 1.565253606828442e+02 + 1.548645864376032e+02 + 1.532208154238845e+02 + 1.515938789750561e+02 + 1.499836100268175e+02 + 1.483898432531407e+02 + 1.468124148175615e+02 + 1.452511624739094e+02 + 1.437059256375598e+02 + 1.421765451600804e+02 + 1.406628634671130e+02 + 1.391647245894945e+02 + 1.376819739463268e+02 + 1.362144585029153e+02 + 1.347620267668397e+02 + 1.333245285902542e+02 + 1.319018153476916e+02 + 1.304937399101563e+02 + 1.291001564496927e+02 + 1.277209206089626e+02 + 1.263558894821456e+02 + 1.250049214462411e+02 + 1.236678763269726e+02 + 1.223446153162142e+02 + 1.210350008534558e+02 + 1.197388968258891e+02 + 1.184561684202564e+02 + 1.171866820332312e+02 + 1.159303054814129e+02 + 1.146869078350233e+02 + 1.134563593521917e+02 + 1.122385316718855e+02 + 1.110332976232454e+02 + 1.098405311979204e+02 + 1.086601077608261e+02 + 1.074919038117468e+02 + 1.063357969778381e+02 + 1.051916662270612e+02 + 1.040593916259906e+02 + 1.029388543466298e+02 + 1.018299368341955e+02 + 1.007325226151947e+02 + 9.964649633160360e+01 + 9.857174381861689e+01 + 9.750815195741964e+01 + 9.645560874783912e+01 + 9.541400332430685e+01 + 9.438322582683587e+01 + 9.336316750654088e+01 + 9.235372071959520e+01 + 9.135477878367931e+01 + 9.036623609174318e+01 + 8.938798812110527e+01 + 8.841993128541375e+01 + 8.746196304638978e+01 + 8.651398190997742e+01 + 8.557588728936869e+01 + 8.464757961904559e+01 + 8.372896034435935e+01 + 8.281993180539014e+01 + 8.192039735296085e+01 + 8.103026128111058e+01 + 8.014942874495698e+01 + 7.927780590401203e+01 + 7.841529983858037e+01 + 7.756181847617736e+01 + 7.671727071446733e+01 + 7.588156631674119e+01 + 7.505461587372024e+01 + 7.423633095310755e+01 + 7.342662394299153e+01 + 7.262540803009301e+01 + 7.183259736215271e+01 + 7.104810687905130e+01 + 7.027185230277652e+01 + 6.950375028269488e+01 + 6.874371822566854e+01 + 6.799167430460268e+01 + 6.724753760248480e+01 + 6.651122793902957e+01 + 6.578266588744034e+01 + 6.506177289160765e+01 + 6.434847109859102e+01 + 6.364268339115934e+01 + 6.294433351272004e+01 + 6.225334589309644e+01 + 6.156964567793161e+01 + 6.089315882540817e+01 + 6.022381196253272e+01 + 5.956153243192431e+01 + 5.890624835784802e+01 + 5.825788851805937e+01 + 5.761638239540161e+01 + 5.698166019812880e+01 + 5.635365277455941e+01 + 5.573229169643452e+01 + 5.511750921575248e+01 + 5.450923819422894e+01 + 5.390741220139490e+01 + 5.331196548214332e+01 + 5.272283288224639e+01 + 5.213994992103501e+01 + 5.156325275682114e+01 + 5.099267813956413e+01 + 5.042816349744366e+01 + 4.986964685712531e+01 + 4.931706681520628e+01 + 4.877036264381848e+01 + 4.822947419115650e+01 + 4.769434186145065e+01 + 4.716490671386568e+01 + 4.664111036072763e+01 + 4.612289496053356e+01 + 4.561020331071316e+01 + 4.510297873475514e+01 + 4.460116508782800e+01 + 4.410470685618211e+01 + 4.361354903662819e+01 + 4.312763714409483e+01 + 4.264691728541290e+01 + 4.217133607138089e+01 + 4.170084064118655e+01 + 4.123537869187841e+01 + 4.077489840121474e+01 + 4.031934846724150e+01 + 3.986867813088396e+01 + 3.942283710103097e+01 + 3.898177559914080e+01 + 3.854544435810492e+01 + 3.811379455962712e+01 + 3.768677789368684e+01 + 3.726434656726136e+01 + 3.684645322013298e+01 + 3.643305096011807e+01 + 3.602409338288954e+01 + 3.561953452360934e+01 + 3.521932891649128e+01 + 3.482343153306697e+01 + 3.443179775085747e+01 + 3.404438343901749e+01 + 3.366114490993698e+01 + 3.328203887889210e+01 + 3.290702252020257e+01 + 3.253605343510379e+01 + 3.216908962260722e+01 + 3.180608952699355e+01 + 3.144701200592500e+01 + 3.109181631097627e+01 + 3.074046212448961e+01 + 3.039290952642646e+01 + 3.004911898312090e+01 + 2.970905136572861e+01 + 2.937266792505025e+01 + 2.903993030352619e+01 + 2.871080057194543e+01 + 2.838524113862799e+01 + 2.806321475945346e+01 + 2.774468462701056e+01 + 2.742961427426368e+01 + 2.711796757973106e+01 + 2.680970882898042e+01 + 2.650480264209962e+01 + 2.620321398820359e+01 + 2.590490820737408e+01 + 2.560985096325826e+01 + 2.531800827674159e+01 + 2.502934653543958e+01 + 2.474383242809609e+01 + 2.446143296972707e+01 + 2.418211555345684e+01 + 2.390584787621480e+01 + 2.363259794654911e+01 + 2.336233413255323e+01 + 2.309502509558490e+01 + 2.283063979379989e+01 + 2.256914753657127e+01 + 2.231051792982671e+01 + 2.205472087402378e+01 + 2.180172658443576e+01 + 2.155150556919213e+01 + 2.130402866286656e+01 + 2.105926696778129e+01 + 2.081719185319289e+01 + 2.057777503962135e+01 + 2.034098850331043e+01 + 2.010680447006149e+01 + 1.987519550063876e+01 + 1.964613442528577e+01 + 1.941959432580914e+01 + 1.919554855827313e+01 + 1.897397075515799e+01 + 1.875483482712853e+01 + 1.853811494931854e+01 + 1.832378554313712e+01 + 1.811182128985819e+01 + 1.790219714756028e+01 + 1.769488831219516e+01 + 1.748987022919803e+01 + 1.728711861052799e+01 + 1.708660939866258e+01 + 1.688831878332332e+01 + 1.669222321036695e+01 + 1.649829934690638e+01 + 1.630652410217020e+01 + 1.611687463464447e+01 + 1.592932831698975e+01 + 1.574386275792588e+01 + 1.556045580679505e+01 + 1.537908552081595e+01 + 1.519973018767385e+01 + 1.502236832516821e+01 + 1.484697865494502e+01 + 1.467354012841447e+01 + 1.450203191274907e+01 + 1.433243337158686e+01 + 1.416472409674524e+01 + 1.399888388846149e+01 + 1.383489273805109e+01 + 1.367273085728561e+01 + 1.351237865788487e+01 + 1.335381673920349e+01 + 1.319702591751814e+01 + 1.304198719993403e+01 + 1.288868177614133e+01 + 1.273709104714046e+01 + 1.258719659672914e+01 + 1.243898018736778e+01 + 1.229242378719869e+01 + 1.214750954184370e+01 + 1.200421977308728e+01 + 1.186253699764556e+01 + 1.172244390266849e+01 + 1.158392335040491e+01 + 1.144695839482221e+01 + 1.131153225250660e+01 + 1.117762830926809e+01 + 1.104523013501555e+01 + 1.091432145806843e+01 + 1.078488617566414e+01 + 1.065690836231677e+01 + 1.053037224372639e+01 + 1.040526220941685e+01 + 1.028156282144551e+01 + 1.015925878941852e+01 + 1.003833498402321e+01 + 9.918776439618298e+00 + 9.800568334039683e+00 + 9.683696005431957e+00 + 9.568144946174611e+00 + 9.453900787919052e+00 + 9.340949322860192e+00 + 9.229276489267212e+00 + 9.118868359446189e+00 + 9.009711163642070e+00 + 8.901791273796370e+00 + 8.795095191785947e+00 + 8.689609570648638e+00 + 8.585321201853549e+00 + 8.482217005296002e+00 + 8.380284046581689e+00 + 8.279509523576925e+00 + 8.179880760330461e+00 + 8.081385224417300e+00 + 7.984010508389771e+00 + 7.887744326863491e+00 + 7.792574535206823e+00 + 7.698489109519010e+00 + 7.605476146133772e+00 + 7.513523878187234e+00 + 7.422620653280592e+00 + 7.332754935473541e+00 + 7.243915322674125e+00 + 7.156090524556396e+00 + 7.069269365741123e+00 + 6.983440797017198e+00 + 6.898593877074525e+00 + 6.814717779007339e+00 + 6.731801797516630e+00 + 6.649835331100769e+00 + 6.568807890289103e+00 + 6.488709103685009e+00 + 6.409528699865692e+00 + 6.331256515961359e+00 + 6.253882503643640e+00 + 6.177396712290002e+00 + 6.101789297547966e+00 + 6.027050522250886e+00 + 5.953170745278158e+00 + 5.880140434362498e+00 + 5.807950156612827e+00 + 5.736590570385212e+00 + 5.666052441485230e+00 + 5.596326632559173e+00 + 5.527404095182261e+00 + 5.459275884510260e+00 + 5.391933149962507e+00 + 5.325367127621260e+00 + 5.259569151260657e+00 + 5.194530647433734e+00 + 5.130243129823101e+00 + 5.066698206416531e+00 + 5.003887570881058e+00 + 4.941803001453549e+00 + 4.880436373900456e+00 + 4.819779643419130e+00 + 4.759824844738533e+00 + 4.700564110200850e+00 + 4.641989649988083e+00 + 4.584093751736625e+00 + 4.526868793565781e+00 + 4.470307230074105e+00 + 4.414401594729965e+00 + 4.359144507919768e+00 + 4.304528662004969e+00 + 4.250546825086277e+00 + 4.197191851627622e+00 + 4.144456666159979e+00 + 4.092334266478478e+00 + 4.040817732600400e+00 + 3.989900213340690e+00 + 3.939574930757155e+00 + 3.889835183170760e+00 + 3.840674335613269e+00 + 3.792085827136757e+00 + 3.744063169627271e+00 + 3.696599938809659e+00 + 3.649689781941428e+00 + 3.603326418080199e+00 + 3.557503628382808e+00 + 3.512215261374414e+00 + 3.467455236465362e+00 + 3.423217534816642e+00 + 3.379496201686086e+00 + 3.336285348654454e+00 + 3.293579148649655e+00 + 3.251371841226642e+00 + 3.209657725464606e+00 + 3.168431157939940e+00 + 3.127686563504146e+00 + 3.087418425005168e+00 + 3.047621281181530e+00 + 3.008289735457784e+00 + 2.969418446796439e+00 + 2.931002129285814e+00 + 2.893035560502260e+00 + 2.855513571053400e+00 + 2.818431044951714e+00 + 2.781782927380857e+00 + 2.745564215550934e+00 + 2.709769959926351e+00 + 2.674395268211684e+00 + 2.639435297946605e+00 + 2.604885259637663e+00 + 2.570740420206636e+00 + 2.536996093812299e+00 + 2.503647644969884e+00 + 2.470690493614489e+00 + 2.438120105903952e+00 + 2.405931997235836e+00 + 2.374121735683807e+00 + 2.342684934097179e+00 + 2.311617253784086e+00 + 2.280914406216957e+00 + 2.250572146781167e+00 + 2.220586279273893e+00 + 2.190952653478714e+00 + 2.161667162009881e+00 + 2.132725747880213e+00 + 2.104124396422602e+00 + 2.075859132902099e+00 + 2.047926031580743e+00 + 2.020321209266692e+00 + 1.993040822266800e+00 + 1.966081073072867e+00 + 1.939438205166541e+00 + 1.913108500802827e+00 + 1.887088286918805e+00 + 1.861373929947225e+00 + 1.835961834345823e+00 + 1.810848447621857e+00 + 1.786030255213551e+00 + 1.761503779943143e+00 + 1.737265586321442e+00 + 1.713312275115213e+00 + 1.689640483715834e+00 + 1.666246890168493e+00 + 1.643128207113473e+00 + 1.620281182788458e+00 + 1.597702604935450e+00 + 1.575389294699183e+00 + 1.553338108095691e+00 + 1.531545938928566e+00 + 1.510009713407906e+00 + 1.488726392261371e+00 + 1.467692971937850e+00 + 1.446906480207705e+00 + 1.426363979153670e+00 + 1.406062564959602e+00 + 1.385999363940103e+00 + 1.366171536058216e+00 + 1.346576274130787e+00 + 1.327210800124654e+00 + 1.308072368828510e+00 + 1.289158266486426e+00 + 1.270465807665891e+00 + 1.251992339187792e+00 + 1.233735237889272e+00 + 1.215691907984316e+00 + 1.197859785096899e+00 + 1.180236333919823e+00 + 1.162819045897185e+00 + 1.145605442741095e+00 + 1.128593073973588e+00 + 1.111779515284567e+00 + 1.095162371880828e+00 + 1.078739275475473e+00 + 1.062507883334588e+00 + 1.046465881646835e+00 + 1.030610981874106e+00 + 1.014940920295882e+00 + 9.994534611152829e-01 + 9.841463930086627e-01 + 9.690175291593270e-01 + 9.540647093618980e-01 + 9.392857969051628e-01 + 9.246786792729085e-01 + 9.102412696338000e-01 + 8.959715035501604e-01 + 8.818673402027871e-01 + 8.679267639726700e-01 + 8.541477806828601e-01 + 8.405284189410931e-01 + 8.270667316623297e-01 + 8.137607925445277e-01 + 8.006086976874616e-01 + 7.876085666023992e-01 + 7.747585387876328e-01 + 7.620567754307064e-01 + 7.495014602973783e-01 + 7.370907966216457e-01 + 7.248230088485250e-01 + 7.126963429559050e-01 + 7.007090638413013e-01 + 6.888594572109231e-01 + 6.771458292779966e-01 + 6.655665045807759e-01 + 6.541198279036498e-01 + 6.428041637825399e-01 + 6.316178947210964e-01 + 6.205594229105623e-01 + 6.096271692194244e-01 + 5.988195719936049e-01 + 5.881350889221284e-01 + 5.775721954595900e-01 + 5.671293841176136e-01 + 5.568051664208875e-01 + 5.465980707194322e-01 + 5.365066418737608e-01 + 5.265294432641988e-01 + 5.166650544231339e-01 + 5.069120710261563e-01 + 4.972691065208522e-01 + 4.877347899800689e-01 + 4.783077664492044e-01 + 4.689866979017357e-01 + 4.597702612073233e-01 + 4.506571489021905e-01 + 4.416460700276524e-01 + 4.327357479310139e-01 + 4.239249212044141e-01 + 4.152123442913231e-01 + 4.065967853823845e-01 + 3.980770275573000e-01 + 3.896518691214699e-01 + 3.813201217302061e-01 + 3.730806117264635e-01 + 3.649321798861945e-01 + 3.568736798624809e-01 + 3.489039797704173e-01 + 3.410219613244947e-01 + 3.332265187013593e-01 + 3.255165605086018e-01 + 3.178910083898543e-01 + 3.103487958586359e-01 + 3.028888701360887e-01 + 2.955101913786422e-01 + 2.882117315106021e-01 + 2.809924755137371e-01 + 2.738514204626846e-01 + 2.667875748867065e-01 + 2.597999604522775e-01 + 2.528876103054370e-01 + 2.460495685714950e-01 + 2.392848919788540e-01 + 2.325926484518769e-01 + 2.259719167857841e-01 + 2.194217877354759e-01 + 2.129413627175208e-01 + 2.065297538274627e-01 + 2.001860848470379e-01 + 1.939094897086202e-01 + 1.876991127051828e-01 + 1.815541094417414e-01 + 1.754736452756007e-01 + 1.694568956974621e-01 + 1.635030470498157e-01 + 1.576112950508609e-01 + 1.517808453564031e-01 + 1.460109140364644e-01 + 1.403007261766342e-01 + 1.346495165784953e-01 + 1.290565300180611e-01 + 1.235210199704221e-01 + 1.180422494287421e-01 + 1.126194909047226e-01 + 1.072520253105725e-01 + 1.019391428882170e-01 + 9.668014295417104e-02 + 9.147433293860986e-02 + 8.632102939670111e-02 + 8.121955756354367e-02 + 7.616925052308399e-02 + 7.116945022739722e-02 + 6.621950693894064e-02 + 6.131877854698166e-02 + 5.646663155698649e-02 + 5.166244039926220e-02 + 4.690558691983024e-02 + 4.219546135291571e-02 + 3.753146148005052e-02 + 3.291299228995687e-02 + 2.833946692296159e-02 + 2.381030573044091e-02 + 1.932493608562982e-02 + 1.488279323951757e-02 + 1.048331933378767e-02 + 6.125963364112487e-03 + 1.810181928441051e-03 + -2.464561780353438e-03 + -6.698797872311066e-03 + -1.089304914227914e-02 + -1.504783206514415e-02 + -1.916365656771068e-02 + -2.324102555134537e-02 + -2.728043585421590e-02 + -3.128237791440187e-02 + -3.524733543518016e-02 + -3.917578628623598e-02 + -4.306820207473552e-02 + -4.692504798332473e-02 + -5.074678357205704e-02 + -5.453386225593208e-02 + -5.828673132987599e-02 + -6.200583267980977e-02 + -6.569160218738558e-02 + -6.934446987831328e-02 + -7.296486055963237e-02 + -7.655319319650564e-02 + -8.010988114185758e-02 + -8.363533270338043e-02 + -8.712995053780122e-02 + -9.059413193193132e-02 + -9.402826926020177e-02 + -9.743274938790861e-02 + -1.008079541064505e-01 + -1.041542604608216e-01 + -1.074720401131623e-01 + -1.107616598682374e-01 + -1.140234819193764e-01 + -1.172578632830942e-01 + -1.204651563472630e-01 + -1.236457089966172e-01 + -1.267998640735528e-01 + -1.299279600346222e-01 + -1.330303309819349e-01 + -1.361073061299021e-01 + -1.391592104828469e-01 + -1.421863647988072e-01 + -1.451890851855495e-01 + -1.481676836992942e-01 + -1.511224682100277e-01 + -1.540537421399553e-01 + -1.569618050599837e-01 + -1.598469524764272e-01 + -1.627094755828420e-01 + -1.655496618778017e-01 + -1.683677949236447e-01 + -1.711641541517163e-01 + -1.739390154343296e-01 + -1.766926508045859e-01 + -1.794253283544359e-01 + -1.821373127460387e-01 + -1.848288648981078e-01 + -1.875002419786971e-01 + -1.901516978443653e-01 + -1.927834826976386e-01 + -1.953958431846420e-01 + -1.979890227559544e-01 + -2.005632612952037e-01 + -2.031187952951354e-01 + -2.056558581586019e-01 + -2.081746798356756e-01 + -2.106754870586183e-01 + -2.131585035595214e-01 + -2.156239496932611e-01 + -2.180720427808593e-01 + -2.205029972492180e-01 + -2.229170242226580e-01 + -2.253143319488933e-01 + -2.276951258807381e-01 + -2.300596082676421e-01 + -2.324079786235529e-01 + -2.347404337552020e-01 + -2.370571673694448e-01 + -2.393583705568364e-01 + -2.416442317867498e-01 + -2.439149365965413e-01 + -2.461706679522762e-01 + -2.484116061949506e-01 + -2.506379289887288e-01 + -2.528498115997045e-01 + -2.550474267213886e-01 + -2.572309443123204e-01 + -2.594005320626763e-01 + -2.615563552809436e-01 + -2.636985766193694e-01 + -2.658273564814242e-01 + -2.679428529152917e-01 + -2.700452216727706e-01 + -2.721346163277996e-01 + -2.742111879420810e-01 + -2.762750854486131e-01 + -2.783264557785196e-01 + -2.803654434689624e-01 + -2.823921908087395e-01 + -2.844068381756654e-01 + -2.864095239109061e-01 + -2.884003839950212e-01 + -2.903795524955394e-01 + -2.923471617904532e-01 + -2.943033420191942e-01 + -2.962482212763220e-01 + -2.981819256807660e-01 + -3.001045795717013e-01 + -3.020163055275332e-01 + -3.039172239885258e-01 + -3.058074538261057e-01 + -3.076871122705734e-01 + -3.095563141516905e-01 + -3.114151727559051e-01 + -3.132637999546681e-01 + -3.151023057635463e-01 + -3.169307984585886e-01 + -3.187493845723606e-01 + -3.205581689117248e-01 + -3.223572548745565e-01 + -3.241467443749414e-01 + -3.259267374142799e-01 + -3.276973325691862e-01 + -3.294586270053045e-01 + -3.312107160890871e-01 + -3.329536937962613e-01 + -3.346876527428858e-01 + -3.364126840777460e-01 + -3.381288775295205e-01 + -3.398363212268976e-01 + -3.415351019703767e-01 + -3.432253052941175e-01 + -3.449070152459444e-01 + -3.465803145779997e-01 + -3.482452848007116e-01 + -3.499020059501182e-01 + -3.515505568826250e-01 + -3.531910152859590e-01 + -3.548234573752725e-01 + -3.564479582224311e-01 + -3.580645917875246e-01 + -3.596734306319520e-01 + -3.612745463110025e-01 + -3.628680093075062e-01 + -3.644538885605036e-01 + -3.660322520458910e-01 + -3.676031668332329e-01 + -3.691666987516095e-01 + -3.707229124779602e-01 + -3.722718716670178e-01 + -3.738136390608672e-01 + -3.753482761467254e-01 + -3.768758432749062e-01 + -3.783964002465877e-01 + -3.799100056353694e-01 + -3.814167166997948e-01 + -3.829165900177774e-01 + -3.844096813827866e-01 + -3.858960456354959e-01 + -3.873757364088854e-01 + -3.888488064600710e-01 + -3.903153077375676e-01 + -3.917752913452379e-01 + -3.932288075353338e-01 + -3.946759055987133e-01 + -3.961166339473677e-01 + -3.975510402779339e-01 + -3.989791715122148e-01 + -4.004010735521537e-01 + -4.018167915706618e-01 + -4.032263700983349e-01 + -4.046298528561717e-01 + -4.060272827301947e-01 + -4.074187016384220e-01 + -4.088041511045764e-01 + -4.101836719923956e-01 + -4.115573039941210e-01 + -4.129250863351419e-01 + -4.142870577221169e-01 + -4.156432559911067e-01 + -4.169937183587125e-01 + -4.183384813924751e-01 + -4.196775807600287e-01 + -4.210110517890521e-01 + -4.223389293056927e-01 + -4.236612469859990e-01 + -4.249780381358575e-01 + -4.262893357128523e-01 + -4.275951718561576e-01 + -4.288955781548201e-01 + -4.301905856512787e-01 + -4.314802245948859e-01 + -4.327645248125306e-01 + -4.340435157401011e-01 + -4.353172261319986e-01 + -4.365856843065750e-01 + -4.378489181140523e-01 + -4.391069545111200e-01 + -4.403598201489721e-01 + -4.416075414900063e-01 + -4.428501441617211e-01 + -4.440876533447125e-01 + -4.453200938994337e-01 + -4.465474900663732e-01 + -4.477698656375739e-01 + -4.489872440132049e-01 + -4.501996482091757e-01 + -4.514071007293397e-01 + -4.526096234423685e-01 + -4.538072381973440e-01 + -4.549999664346564e-01 + -4.561878287239103e-01 + -4.573708454564815e-01 + -4.585490367840940e-01 + -4.597224223838171e-01 + -4.608910215483196e-01 + -4.620548532229073e-01 + -4.632139359470852e-01 + -4.643682878385313e-01 + -4.655179266829866e-01 + -4.666628700026897e-01 + -4.678031349656974e-01 + -4.689387384105899e-01 + -4.700696968538801e-01 + -4.711960263436956e-01 + -4.723177425902391e-01 + -4.734348612979066e-01 + -4.745473978039702e-01 + -4.756553669920032e-01 + -4.767587833133353e-01 + -4.778576611599107e-01 + -4.789520147944609e-01 + -4.800418577229591e-01 + -4.811272034289876e-01 + -4.822080654661853e-01 + -4.832844566828151e-01 + -4.843563896207272e-01 + -4.854238767122197e-01 + -4.864869303811440e-01 + -4.875455627166793e-01 + -4.885997853037442e-01 + -4.896496095260600e-01 + -4.906950466868944e-01 + -4.917361080077966e-01 + -4.927728043326091e-01 + -4.938051461993963e-01 + -4.948331438840640e-01 + -4.958568075736277e-01 + -4.968761473512240e-01 + -4.978911731225704e-01 + -4.989018945002663e-01 + -4.999083208482176e-01 + -5.009104613021941e-01 + -5.019083248972503e-01 + -5.029019205602130e-01 + -5.038912570358333e-01 + -5.048763428126108e-01 + -5.058571862004539e-01 + -5.068337954285524e-01 + -5.078061785541023e-01 + -5.087743434557772e-01 + -5.097382978215317e-01 + -5.106980492175714e-01 + -5.116536051046018e-01 + -5.126049728172039e-01 + -5.135521595357905e-01 + -5.144951722594635e-01 + -5.154340177423219e-01 + -5.163687027408718e-01 + -5.172992340140365e-01 + -5.182256180631845e-01 + -5.191478612397169e-01 + -5.200659697981208e-01 + -5.209799499565910e-01 + -5.218898077706294e-01 + -5.227955490891694e-01 + -5.236971796844924e-01 + -5.245947053253370e-01 + -5.254881317688337e-01 + -5.263774645512288e-01 + -5.272627090126604e-01 + -5.281438703531137e-01 + -5.290209539977515e-01 + -5.298939652703512e-01 + -5.307629091340913e-01 + -5.316277904778723e-01 + -5.324886142110474e-01 + -5.333453852986519e-01 + -5.341981085648844e-01 + -5.350467886587517e-01 + -5.358914300418783e-01 + -5.367320373706596e-01 + -5.375686152841432e-01 + -5.384011680734792e-01 + -5.392297001047128e-01 + -5.400542157871245e-01 + -5.408747194069761e-01 + -5.416912150785628e-01 + -5.425037068232484e-01 + -5.433121987186342e-01 + -5.441166948984431e-01 + -5.449171994793097e-01 + -5.457137163885653e-01 + -5.465062494211190e-01 + -5.472948023341125e-01 + -5.480793790518950e-01 + -5.488599834110802e-01 + -5.496366191273470e-01 + -5.504092899443518e-01 + -5.511779994928784e-01 + -5.519427513029639e-01 + -5.527035490710489e-01 + -5.534603964642170e-01 + -5.542132970155166e-01 + -5.549622540841348e-01 + -5.557072711574547e-01 + -5.564483519201564e-01 + -5.571854997347668e-01 + -5.579187179919134e-01 + -5.586480102698358e-01 + -5.593733798207278e-01 + -5.600948299343745e-01 + -5.608123641702291e-01 + -5.615259858006734e-01 + -5.622356980349319e-01 + -5.629415042452564e-01 + -5.636434078437447e-01 + -5.643414121719204e-01 + -5.650355204128609e-01 + -5.657257359067179e-01 + -5.664120620074502e-01 + -5.670945018655422e-01 + -5.677730587569899e-01 + -5.684477360210265e-01 + -5.691185368946378e-01 + -5.697854646230838e-01 + -5.704485224954847e-01 + -5.711077138615709e-01 + -5.717630418949810e-01 + -5.724145097236072e-01 + -5.730621208149326e-01 + -5.737058785857441e-01 + -5.743457862811681e-01 + -5.749818469287452e-01 + -5.756140639044424e-01 + -5.762424408221788e-01 + -5.768669806578469e-01 + -5.774876866716016e-01 + -5.781045625480883e-01 + -5.787176116189466e-01 + -5.793268371095267e-01 + -5.799322422747063e-01 + -5.805338304985933e-01 + -5.811316053198213e-01 + -5.817255703521417e-01 + -5.823157287697720e-01 + -5.829020838792335e-01 + -5.834846393919914e-01 + -5.840633987477251e-01 + -5.846383653791880e-01 + -5.852095428966003e-01 + -5.857769347455314e-01 + -5.863405444497650e-01 + -5.869003757905312e-01 + -5.874564321893059e-01 + -5.880087171065591e-01 + -5.885572344676900e-01 + -5.891019879107314e-01 + -5.896429809482692e-01 + -5.901802172691951e-01 + -5.907137006344829e-01 + -5.912434348345698e-01 + -5.917694236578408e-01 + -5.922916709366750e-01 + -5.928101804947136e-01 + -5.933249560457028e-01 + -5.938360014505492e-01 + -5.943433207019595e-01 + -5.948469177828256e-01 + -5.953467966083078e-01 + -5.958429610716830e-01 + -5.963354151930935e-01 + -5.968241629967538e-01 + -5.973092085065336e-01 + -5.977905558475627e-01 + -5.982682091919279e-01 + -5.987421727060626e-01 + -5.992124504335189e-01 + -5.996790465513929e-01 + -6.001419654039183e-01 + -6.006012111567195e-01 + -6.010567880969444e-01 + -6.015087007096906e-01 + -6.019569532209035e-01 + -6.024015499278780e-01 + -6.028424953542454e-01 + -6.032797938560218e-01 + -6.037134498528102e-01 + -6.041434679778884e-01 + -6.045698527611498e-01 + -6.049926086966888e-01 + -6.054117403213235e-01 + -6.058272522301629e-01 + -6.062391491063152e-01 + -6.066474357377917e-01 + -6.070521167750024e-01 + -6.074531969194140e-01 + -6.078506811508277e-01 + -6.082445741313003e-01 + -6.086348804777613e-01 + -6.090216052590219e-01 + -6.094047534940796e-01 + -6.097843300758768e-01 + -6.101603397998798e-01 + -6.105327877567767e-01 + -6.109016791586246e-01 + -6.112670188349342e-01 + -6.116288118244032e-01 + -6.119870634033990e-01 + -6.123417788015699e-01 + -6.126929631816058e-01 + -6.130406216857481e-01 + -6.133847595846266e-01 + -6.137253821544012e-01 + -6.140624946688724e-01 + -6.143961025253998e-01 + -6.147262111225434e-01 + -6.150528258526081e-01 + -6.153759522847098e-01 + -6.156955958775930e-01 + -6.160117619293205e-01 + -6.163244560848270e-01 + -6.166336840291214e-01 + -6.169394513190288e-01 + -6.172417635406579e-01 + -6.175406263458638e-01 + -6.178360454670117e-01 + -6.181280266570051e-01 + -6.184165756494230e-01 + -6.187016981615432e-01 + -6.189834001775048e-01 + -6.192616876391890e-01 + -6.195365661632112e-01 + -6.198080416901866e-01 + -6.200761202902517e-01 + -6.203408078682074e-01 + -6.206021103982113e-01 + -6.208600339819080e-01 + -6.211145848662764e-01 + -6.213657689929696e-01 + -6.216135922609831e-01 + -6.218580610691606e-01 + -6.220991816188346e-01 + -6.223369599996067e-01 + -6.225714026287344e-01 + -6.228025157602012e-01 + -6.230303055354752e-01 + -6.232547783843585e-01 + -6.234759406837302e-01 + -6.236937987287140e-01 + -6.239083589372102e-01 + -6.241196278170006e-01 + -6.243276119301496e-01 + -6.245323178052680e-01 + -6.247337518435782e-01 + -6.249319204108740e-01 + -6.251268303788342e-01 + -6.253184884524475e-01 + -6.255069009766967e-01 + -6.256920746682559e-01 + -6.258740163701917e-01 + -6.260527328726909e-01 + -6.262282307801417e-01 + -6.264005167589047e-01 + -6.265695976839164e-01 + -6.267354804070123e-01 + -6.268981717782514e-01 + -6.270576786775590e-01 + -6.272140080071444e-01 + -6.273671666729116e-01 + -6.275171615794166e-01 + -6.276639997579259e-01 + -6.278076882572314e-01 + -6.279482340166599e-01 + -6.280856440870369e-01 + -6.282199255881125e-01 + -6.283510856176625e-01 + -6.284791313265480e-01 + -6.286040698559974e-01 + -6.287259082244099e-01 + -6.288446536460758e-01 + -6.289603134448759e-01 + -6.290728947784819e-01 + -6.291824049507972e-01 + -6.292888513285516e-01 + -6.293922409846477e-01 + -6.294925812787570e-01 + -6.295898797737625e-01 + -6.296841435561055e-01 + -6.297753800606519e-01 + -6.298635970427606e-01 + -6.299488015475858e-01 + -6.300310009429952e-01 + -6.301102030719377e-01 + -6.301864151575183e-01 + -6.302596446383568e-01 + -6.303298993873763e-01 + -6.303971867419816e-01 + -6.304615141097702e-01 + -6.305228892569528e-01 + -6.305813198299395e-01 + -6.306368133767261e-01 + -6.306893774095105e-01 + -6.307390196514921e-01 + -6.307857478830511e-01 + -6.308295697989852e-01 + -6.308704929504492e-01 + -6.309085250312678e-01 + -6.309436740902202e-01 + -6.309759477467396e-01 + -6.310053535533821e-01 + -6.310318994644450e-01 + -6.310555933584764e-01 + -6.310764430051494e-01 + -6.310944561130111e-01 + -6.311096405770181e-01 + -6.311220043955681e-01 + -6.311315554778594e-01 + -6.311383016234806e-01 + -6.311422506666780e-01 + -6.311434107412031e-01 + -6.311417897164122e-01 + -6.311373953205278e-01 + -6.311302357049288e-01 + -6.311203189243589e-01 + -6.311076528624781e-01 + -6.310922454230109e-01 + -6.310741047155799e-01 + -6.310532389686786e-01 + -6.310296560496979e-01 + -6.310033639455465e-01 + -6.309743708604478e-01 + -6.309426848479184e-01 + -6.309083139781310e-01 + -6.308712663782245e-01 + -6.308315500367087e-01 + -6.307891730465176e-01 + -6.307441436976022e-01 + -6.306964701860184e-01 + -6.306461606431758e-01 + -6.305932231701467e-01 + -6.305376659121696e-01 + -6.304794970062023e-01 + -6.304187245700347e-01 + -6.303553569805046e-01 + -6.302894025962669e-01 + -6.302208694979176e-01 + -6.301497657748981e-01 + -6.300760996409697e-01 + -6.299998795100692e-01 + -6.299211136514613e-01 + -6.298398102240708e-01 + -6.297559773915322e-01 + -6.296696236381925e-01 + -6.295807574013027e-01 + -6.294893864698483e-01 + -6.293955192818200e-01 + -6.292991645521353e-01 + -6.292003301703828e-01 + -6.290990243894826e-01 + -6.289952557946986e-01 + -6.288890326523825e-01 + -6.287803632353285e-01 + -6.286692558944412e-01 + -6.285557190083507e-01 + -6.284397608763040e-01 + -6.283213897612988e-01 + -6.282006141317734e-01 + -6.280774423035318e-01 + -6.279518824496017e-01 + -6.278239431715447e-01 + -6.276936329659792e-01 + -6.275609600561086e-01 + -6.274259327786519e-01 + -6.272885594754783e-01 + -6.271488484695774e-01 + -6.270068083043618e-01 + -6.268624473656752e-01 + -6.267157737459064e-01 + -6.265667960682418e-01 + -6.264155229504741e-01 + -6.262619625962428e-01 + -6.261061232036680e-01 + -6.259480131935671e-01 + -6.257876413121770e-01 + -6.256250157840939e-01 + -6.254601447340036e-01 + -6.252930366972961e-01 + -6.251237002207461e-01 + -6.249521437614608e-01 + -6.247783756272571e-01 + -6.246024042025771e-01 + -6.244242378628240e-01 + -6.242438848129136e-01 + -6.240613535991787e-01 + -6.238766528797192e-01 + -6.236897908519111e-01 + -6.235007757894835e-01 + -6.233096161276966e-01 + -6.231163203935827e-01 + -6.229208970207127e-01 + -6.227233543185018e-01 + -6.225237005131427e-01 + -6.223219439896936e-01 + -6.221180932821515e-01 + -6.219121568092019e-01 + -6.217041429518334e-01 + -6.214940600654550e-01 + -6.212819164164759e-01 + -6.210677203231969e-01 + -6.208514802076882e-01 + -6.206332045396580e-01 + -6.204129016762088e-01 + -6.201905798335827e-01 + -6.199662474146647e-01 + -6.197399127976954e-01 + -6.195115842446862e-01 + -6.192812702436963e-01 + -6.190489791767655e-01 + -6.188147191241502e-01 + -6.185784984898128e-01 + -6.183403256742428e-01 + -6.181002088023494e-01 + -6.178581563548247e-01 + -6.176141767575239e-01 + -6.173682779492388e-01 + -6.171204683326561e-01 + -6.168707564823446e-01 + -6.166191506410910e-01 + -6.163656588303806e-01 + -6.161102891648960e-01 + -6.158530502595377e-01 + -6.155939503803246e-01 + -6.153329975648972e-01 + -6.150702000825419e-01 + -6.148055662334609e-01 + -6.145391042808102e-01 + -6.142708224010276e-01 + -6.140007288452335e-01 + -6.137288318637003e-01 + -6.134551394181680e-01 + -6.131796597624336e-01 + -6.129024013716257e-01 + -6.126233721919256e-01 + -6.123425803085120e-01 + -6.120600340492245e-01 + -6.117757414641359e-01 + -6.114897106263320e-01 + -6.112019497520672e-01 + -6.109124671249474e-01 + -6.106212708396386e-01 + -6.103283687668304e-01 + -6.100337690977098e-01 + -6.097374799911853e-01 + -6.094395093910078e-01 + -6.091398653642833e-01 + -6.088385561024087e-01 + -6.085355898356886e-01 + -6.082309742898534e-01 + -6.079247173286892e-01 + -6.076168274335947e-01 + -6.073073125569597e-01 + -6.069961804304546e-01 + -6.066834389911383e-01 + -6.063690964791788e-01 + -6.060531610171422e-01 + -6.057356401425160e-01 + -6.054165419100932e-01 + -6.050958745176729e-01 + -6.047736455801236e-01 + -6.044498630713394e-01 + -6.041245351487873e-01 + -6.037976695799242e-01 + -6.034692741523835e-01 + -6.031393567367498e-01 + -6.028079252312161e-01 + -6.024749874110954e-01 + -6.021405510415967e-01 + -6.018046242357692e-01 + -6.014672148046522e-01 + -6.011283302871711e-01 + -6.007879786053585e-01 + -6.004461675660895e-01 + -6.001029047914931e-01 + -5.997581981158361e-01 + -5.994120553308485e-01 + -5.990644841299763e-01 + -5.987154923482985e-01 + -5.983650876334137e-01 + -5.980132773866208e-01 + -5.976600693793478e-01 + -5.973054714798371e-01 + -5.969494914365839e-01 + -5.965921366499265e-01 + -5.962334146660923e-01 + -5.958733334161985e-01 + -5.955119002909084e-01 + -5.951491227180785e-01 + -5.947850085981863e-01 + -5.944195652847630e-01 + -5.940528001366523e-01 + -5.936847210858313e-01 + -5.933153356463837e-01 + -5.929446511281147e-01 + -5.925726749957585e-01 + -5.921994146776245e-01 + -5.918248776317639e-01 + -5.914490714685531e-01 + -5.910720036664838e-01 + -5.906936815737919e-01 + -5.903141124838686e-01 + -5.899333037986367e-01 + -5.895512629817115e-01 + -5.891679973989596e-01 + -5.887835143677140e-01 + -5.883978211708401e-01 + -5.880109250637769e-01 + -5.876228334774148e-01 + -5.872335538851382e-01 + -5.868430932520374e-01 + -5.864514587624869e-01 + -5.860586578978172e-01 + -5.856646978273519e-01 + -5.852695857497323e-01 + -5.848733289413443e-01 + -5.844759343592291e-01 + -5.840774091773326e-01 + -5.836777608879199e-01 + -5.832769964405170e-01 + -5.828751228494087e-01 + -5.824721474461222e-01 + -5.820680771414760e-01 + -5.816629188869962e-01 + -5.812566799399100e-01 + -5.808493672421570e-01 + -5.804409877894702e-01 + -5.800315488931496e-01 + -5.796210574409676e-01 + -5.792095201878247e-01 + -5.787969440874288e-01 + -5.783833362006023e-01 + -5.779687035684036e-01 + -5.775530530727403e-01 + -5.771363914738108e-01 + -5.767187255974381e-01 + -5.763000625573806e-01 + -5.758804091701334e-01 + -5.754597721176316e-01 + -5.750381583420940e-01 + -5.746155745735496e-01 + -5.741920274506414e-01 + -5.737675239291555e-01 + -5.733420708457294e-01 + -5.729156748671344e-01 + -5.724883426083383e-01 + -5.720600807791615e-01 + -5.716308961653045e-01 + -5.712007954599810e-01 + -5.707697852850102e-01 + -5.703378722272431e-01 + -5.699050629355835e-01 + -5.694713639828742e-01 + -5.690367818720566e-01 + -5.686013232951076e-01 + -5.681649948578290e-01 + -5.677278029894381e-01 + -5.672897541841998e-01 + -5.668508549514105e-01 + -5.664111117923113e-01 + -5.659705312703284e-01 + -5.655291198708162e-01 + -5.650868839171556e-01 + -5.646438297396282e-01 + -5.641999637601537e-01 + -5.637552925169101e-01 + -5.633098223391846e-01 + -5.628635595080524e-01 + -5.624165104013904e-01 + -5.619686812129524e-01 + -5.615200782186582e-01 + -5.610707080464411e-01 + -5.606205767194389e-01 + -5.601696901727680e-01 + -5.597180550627928e-01 + -5.592656777039943e-01 + -5.588125640834879e-01 + -5.583587201544192e-01 + -5.579041522213387e-01 + -5.574488666805684e-01 + -5.569928694014434e-01 + -5.565361664370690e-01 + -5.560787640439252e-01 + -5.556206683493946e-01 + -5.551618853326125e-01 + -5.547024208857518e-01 + -5.542422809960397e-01 + -5.537814718214656e-01 + -5.533199995563840e-01 + -5.528578699065892e-01 + -5.523950887012330e-01 + -5.519316620139326e-01 + -5.514675956847120e-01 + -5.510028956792654e-01 + -5.505375681122012e-01 + -5.500716185256428e-01 + -5.496050526609592e-01 + -5.491378767346244e-01 + -5.486700964364043e-01 + -5.482017173715276e-01 + -5.477327453596050e-01 + -5.472631862648399e-01 + -5.467930458019109e-01 + -5.463223294669347e-01 + -5.458510432287255e-01 + -5.453791929736209e-01 + -5.449067840000759e-01 + -5.444338218966174e-01 + -5.439603123952597e-01 + -5.434862611282417e-01 + -5.430116738240560e-01 + -5.425365561436022e-01 + -5.420609134355956e-01 + -5.415847511352451e-01 + -5.411080748136494e-01 + -5.406308901525899e-01 + -5.401532026526268e-01 + -5.396750177177082e-01 + -5.391963408895222e-01 + -5.387171774649071e-01 + -5.382375326730170e-01 + -5.377574122460893e-01 + -5.372768215524759e-01 + -5.367957656717409e-01 + -5.363142502106338e-01 + -5.358322806031541e-01 + -5.353498619928253e-01 + -5.348669995911720e-01 + -5.343836987381033e-01 + -5.338999648334884e-01 + -5.334158029976483e-01 + -5.329312184607295e-01 + -5.324462166033185e-01 + -5.319608023124877e-01 + -5.314749807283198e-01 + -5.309887574568507e-01 + -5.305021373834015e-01 + -5.300151254489873e-01 + -5.295277270550899e-01 + -5.290399471460621e-01 + -5.285517906644440e-01 + -5.280632628772480e-01 + -5.275743687930865e-01 + -5.270851133485194e-01 + -5.265955015863814e-01 + -5.261055383771222e-01 + -5.256152286457003e-01 + -5.251245776074701e-01 + -5.246335901741112e-01 + -5.241422711040373e-01 + -5.236506252667474e-01 + -5.231586574906982e-01 + -5.226663726352896e-01 + -5.221737757253558e-01 + -5.216808715970676e-01 + -5.211876649797802e-01 + -5.206941607382560e-01 + -5.202003635069621e-01 + -5.197062778404161e-01 + -5.192119087096243e-01 + -5.187172609937223e-01 + -5.182223393579939e-01 + -5.177271482807863e-01 + -5.172316923981860e-01 + -5.167359765148800e-01 + -5.162400053033168e-01 + -5.157437833544083e-01 + -5.152473152222008e-01 + -5.147506055161414e-01 + -5.142536587718484e-01 + -5.137564794429633e-01 + -5.132590721404230e-01 + -5.127614414610688e-01 + -5.122635918987255e-01 + -5.117655278912282e-01 + -5.112672538418732e-01 + -5.107687741570007e-01 + -5.102700934318621e-01 + -5.097712161511054e-01 + -5.092721464952894e-01 + -5.087728887586368e-01 + -5.082734473837237e-01 + -5.077738269224511e-01 + -5.072740315773641e-01 + -5.067740655070005e-01 + -5.062739331645890e-01 + -5.057736389339202e-01 + -5.052731870571522e-01 + -5.047725816027976e-01 + -5.042718267556677e-01 + -5.037709267723895e-01 + -5.032698858620083e-01 + -5.027687082997551e-01 + -5.022673983228978e-01 + -5.017659599138892e-01 + -5.012643972224838e-01 + -5.007627144504877e-01 + -5.002609154317549e-01 + -4.997590043686060e-01 + -4.992569856498065e-01 + -4.987548629163329e-01 + -4.982526401066572e-01 + -4.977503215591422e-01 + -4.972479113357710e-01 + -4.967454132608579e-01 + -4.962428310876830e-01 + -4.957401690448965e-01 + -4.952374311333114e-01 + -4.947346209581790e-01 + -4.942317423902789e-01 + -4.937287995168010e-01 + -4.932257964768885e-01 + -4.927227367709692e-01 + -4.922196239985463e-01 + -4.917164622446805e-01 + -4.912132554897460e-01 + -4.907100074652099e-01 + -4.902067216434476e-01 + -4.897034018910860e-01 + -4.892000521396699e-01 + -4.886966760659724e-01 + -4.881932772071136e-01 + -4.876898592264887e-01 + -4.871864261030248e-01 + -4.866829812293292e-01 + -4.861795280147214e-01 + -4.856760706607693e-01 + -4.851726126266216e-01 + -4.846691571189501e-01 + -4.841657080652781e-01 + -4.836622690168214e-01 + -4.831588433295234e-01 + -4.826554347812969e-01 + -4.821520468729375e-01 + -4.816486828820545e-01 + -4.811453462713459e-01 + -4.806420406166251e-01 + -4.801387695127853e-01 + -4.796355363816449e-01 + -4.791323444815042e-01 + -4.786291970695780e-01 + -4.781260978727254e-01 + -4.776230503252043e-01 + -4.771200574973888e-01 + -4.766171228253449e-01 + -4.761142497486388e-01 + -4.756114415594656e-01 + -4.751087014547341e-01 + -4.746060327035595e-01 + -4.741034386828772e-01 + -4.736009226286348e-01 + -4.730984877717556e-01 + -4.725961373913972e-01 + -4.720938746127822e-01 + -4.715917026117559e-01 + -4.710896247171748e-01 + -4.705876440070008e-01 + -4.700857635192827e-01 + -4.695839864443119e-01 + -4.690823160197067e-01 + -4.685807553687465e-01 + -4.680793073815264e-01 + -4.675779752270572e-01 + -4.670767621237579e-01 + -4.665756710130068e-01 + -4.660747048828000e-01 + -4.655738667469987e-01 + -4.650731595624170e-01 + -4.645725864569897e-01 + -4.640721505529091e-01 + -4.635718546060059e-01 + -4.630717014390969e-01 + -4.625716940204364e-01 + -4.620718354412200e-01 + -4.615721285948061e-01 + -4.610725762550177e-01 + -4.605731814392849e-01 + -4.600739469669758e-01 + -4.595748755034438e-01 + -4.590759700613133e-01 + -4.585772335293120e-01 + -4.580786685902926e-01 + -4.575802780165928e-01 + -4.570820645542124e-01 + -4.565840309327809e-01 + -4.560861801183225e-01 + -4.555885148408127e-01 + -4.550910375242214e-01 + -4.545937511574892e-01 + -4.540966585092119e-01 + -4.535997618400510e-01 + -4.531030641427475e-01 + -4.526065682230286e-01 + -4.521102761991050e-01 + -4.516141909960451e-01 + -4.511183155232459e-01 + -4.506226519976986e-01 + -4.501272029129367e-01 + -4.496319709853875e-01 + -4.491369589904647e-01 + -4.486421693813144e-01 + -4.481476045149588e-01 + -4.476532669406306e-01 + -4.471591591812127e-01 + -4.466652837454304e-01 + -4.461716431800687e-01 + -4.456782399407630e-01 + -4.451850764283579e-01 + -4.446921550770006e-01 + -4.441994783152980e-01 + -4.437070485743053e-01 + -4.432148683148817e-01 + -4.427229399164072e-01 + -4.422312656936392e-01 + -4.417398479943503e-01 + -4.412486891611525e-01 + -4.407577915365379e-01 + -4.402671575060104e-01 + -4.397767893532367e-01 + -4.392866892910770e-01 + -4.387968597340107e-01 + -4.383073029681190e-01 + -4.378180210879689e-01 + -4.373290163087382e-01 + -4.368402909924953e-01 + -4.363518475687816e-01 + -4.358636880897754e-01 + -4.353758146064535e-01 + -4.348882293452391e-01 + -4.344009344375495e-01 + -4.339139321041776e-01 + -4.334272247184532e-01 + -4.329408142509990e-01 + -4.324547026649819e-01 + -4.319688922210647e-01 + -4.314833850702666e-01 + -4.309981832317592e-01 + -4.305132886299618e-01 + -4.300287034407881e-01 + -4.295444298858639e-01 + -4.290604699557538e-01 + -4.285768254794737e-01 + -4.280934983815344e-01 + -4.276104909880938e-01 + -4.271278053251724e-01 + -4.266454431999359e-01 + -4.261634065006114e-01 + -4.256816972235624e-01 + -4.252003173934318e-01 + -4.247192689049444e-01 + -4.242385536499166e-01 + -4.237581735472888e-01 + -4.232781305399061e-01 + -4.227984264773803e-01 + -4.223190631457318e-01 + -4.218400424415704e-01 + -4.213613663598799e-01 + -4.208830368540804e-01 + -4.204050553934426e-01 + -4.199274237890383e-01 + -4.194501442515862e-01 + -4.189732183034799e-01 + -4.184966476302857e-01 + -4.180204343198091e-01 + -4.175445800025869e-01 + -4.170690862458790e-01 + -4.165939547960728e-01 + -4.161191875920802e-01 + -4.156447863485650e-01 + -4.151707524172177e-01 + -4.146970878143395e-01 + -4.142237944432959e-01 + -4.137508735370036e-01 + -4.132783267358912e-01 + -4.128061559031381e-01 + -4.123343628419361e-01 + -4.118629489726368e-01 + -4.113919157251955e-01 + -4.109212649651476e-01 + -4.104509983224866e-01 + -4.099811172669397e-01 + -4.095116233202941e-01 + -4.090425181490535e-01 + -4.085738034100841e-01 + -4.081054804950061e-01 + -4.076375508831032e-01 + -4.071700161671795e-01 + -4.067028779692610e-01 + -4.062361376606066e-01 + -4.057697965353959e-01 + -4.053038563335837e-01 + -4.048383186645677e-01 + -4.043731849141807e-01 + -4.039084564103662e-01 + -4.034441345521896e-01 + -4.029802208230617e-01 + -4.025167167043049e-01 + -4.020536236099443e-01 + -4.015909428779320e-01 + -4.011286758375757e-01 + -4.006668238996902e-01 + -4.002053885607212e-01 + -3.997443712200008e-01 + -3.992837731698375e-01 + -3.988235956310492e-01 + -3.983638399923307e-01 + -3.979045076012857e-01 + -3.974455996644362e-01 + -3.969871175556028e-01 + -3.965290626455606e-01 + -3.960714361699136e-01 + -3.956142393772600e-01 + -3.951574735515524e-01 + -3.947011399985758e-01 + -3.942452398354794e-01 + -3.937897742524872e-01 + -3.933347447660869e-01 + -3.928801524442024e-01 + -3.924259983101159e-01 + -3.919722839283850e-01 + -3.915190103656777e-01 + -3.910661784756895e-01 + -3.906137895655892e-01 + -3.901618450499643e-01 + -3.897103461604648e-01 + -3.892592935529919e-01 + -3.888086884121152e-01 + -3.883585322771145e-01 + -3.879088261485191e-01 + -3.874595710701922e-01 + -3.870107681556456e-01 + -3.865624182556531e-01 + -3.861145225228043e-01 + -3.856670823544472e-01 + -3.852200986473037e-01 + -3.847735723987576e-01 + -3.843275047747315e-01 + -3.838818965026468e-01 + -3.834367486164244e-01 + -3.829920625791138e-01 + -3.825478392535004e-01 + -3.821040794322394e-01 + -3.816607841213338e-01 + -3.812179544462010e-01 + -3.807755914230820e-01 + -3.803336958584798e-01 + -3.798922686597118e-01 + -3.794513108818827e-01 + -3.790108236907996e-01 + -3.785708078449803e-01 + -3.781312640889848e-01 + -3.776921934895628e-01 + -3.772535969260590e-01 + -3.768154752452403e-01 + -3.763778294637203e-01 + -3.759406605249527e-01 + -3.755039692439986e-01 + -3.750677562951532e-01 + -3.746320226741715e-01 + -3.741967693787305e-01 + -3.737619968727901e-01 + -3.733277061470673e-01 + -3.728938983949728e-01 + -3.724605741247380e-01 + -3.720277341192338e-01 + -3.715953793429491e-01 + -3.711635103186269e-01 + -3.707321278978636e-01 + -3.703012331728173e-01 + -3.698708267439747e-01 + -3.694409092657609e-01 + -3.690114815572269e-01 + -3.685825444178367e-01 + -3.681540985405766e-01 + -3.677261445488677e-01 + -3.672986832474148e-01 + -3.668717154245260e-01 + -3.664452417818624e-01 + -3.660192630178876e-01 + -3.655937798167319e-01 + -3.651687928442244e-01 + -3.647443027770453e-01 + -3.643203103057334e-01 + -3.638968161236534e-01 + -3.634738208501973e-01 + -3.630513251204181e-01 + -3.626293296340570e-01 + -3.622078349959966e-01 + -3.617868418102546e-01 + -3.613663507559756e-01 + -3.609463624258993e-01 + -3.605268773947004e-01 + -3.601078962972172e-01 + -3.596894197319259e-01 + -3.592714482724653e-01 + -3.588539824938156e-01 + -3.584370229705016e-01 + -3.580205702765974e-01 + -3.576046249835235e-01 + -3.571891876270012e-01 + -3.567742587321382e-01 + -3.563598388637925e-01 + -3.559459285557617e-01 + -3.555325283179373e-01 + -3.551196386794110e-01 + -3.547072601423791e-01 + -3.542953931967586e-01 + -3.538840383835105e-01 + -3.534731961849680e-01 + -3.530628670336623e-01 + -3.526530514374770e-01 + -3.522437498876279e-01 + -3.518349628366106e-01 + -3.514266907403692e-01 + -3.510189340474827e-01 + -3.506116931966672e-01 + -3.502049686305037e-01 + -3.497987607886671e-01 + -3.493930701015490e-01 + -3.489878969787067e-01 + -3.485832418243141e-01 + -3.481791050461803e-01 + -3.477754870557839e-01 + -3.473723882547367e-01 + -3.469698090253131e-01 + -3.465677497415546e-01 + -3.461662107762984e-01 + -3.457651925045610e-01 + -3.453646952920019e-01 + -3.449647194961470e-01 + -3.445652654674211e-01 + -3.441663335489293e-01 + -3.437679240760669e-01 + -3.433700373751777e-01 + -3.429726737709668e-01 + -3.425758335909973e-01 + -3.421795171685511e-01 + -3.417837248082679e-01 + -3.413884567949557e-01 + -3.409937134173290e-01 + -3.405994949798623e-01 + -3.402058017865278e-01 + -3.398126341027504e-01 + -3.394199921921239e-01 + -3.390278763247643e-01 + -3.386362867748747e-01 + -3.382452237948665e-01 + -3.378546876227794e-01 + -3.374646785249709e-01 + -3.370751967392704e-01 + -3.366862424749215e-01 + -3.362978159833941e-01 + -3.359099174981644e-01 + -3.355225472182573e-01 + -3.351357053498810e-01 + -3.347493921057998e-01 + -3.343636076973308e-01 + -3.339783523006465e-01 + -3.335936261089775e-01 + -3.332094293460974e-01 + -3.328257621547543e-01 + -3.324426246881435e-01 + -3.320600171619409e-01 + -3.316779397280902e-01 + -3.312963925265998e-01 + -3.309153757279716e-01 + -3.305348894653861e-01 + -3.301549338737799e-01 + -3.297755091265357e-01 + -3.293966153413448e-01 + -3.290182526215280e-01 + -3.286404211114115e-01 + -3.282631209285871e-01 + -3.278863521751846e-01 + -3.275101149642331e-01 + -3.271344093953196e-01 + -3.267592355617253e-01 + -3.263845935667566e-01 + -3.260104834866909e-01 + -3.256369053882101e-01 + -3.252638593756906e-01 + -3.248913455268053e-01 + -3.245193638907094e-01 + -3.241479145199382e-01 + -3.237769974872735e-01 + -3.234066128661293e-01 + -3.230367606622389e-01 + -3.226674409186036e-01 + -3.222986537192250e-01 + -3.219303990783447e-01 + -3.215626770146125e-01 + -3.211954875680534e-01 + -3.208288307426270e-01 + -3.204627065455645e-01 + -3.200971150001409e-01 + -3.197320561103191e-01 + -3.193675298795836e-01 + -3.190035363166080e-01 + -3.186400754009213e-01 + -3.182771471114187e-01 + -3.179147514432106e-01 + -3.175528883799994e-01 + -3.171915578921511e-01 + -3.168307599394173e-01 + -3.164704945026028e-01 + -3.161107615528752e-01 + -3.157515610223091e-01 + -3.153928928534279e-01 + -3.150347570035595e-01 + -3.146771534412893e-01 + -3.143200821026652e-01 + -3.139635429048980e-01 + -3.136075357713601e-01 + -3.132520606345795e-01 + -3.128971174301287e-01 + -3.125427060850263e-01 + -3.121888265003789e-01 + -3.118354785699559e-01 + -3.114826622209773e-01 + -3.111303773636806e-01 + -3.107786238863177e-01 + -3.104274016699458e-01 + -3.100767106006651e-01 + -3.097265505731036e-01 + -3.093769214901858e-01 + -3.090278232197667e-01 + -3.086792556057311e-01 + -3.083312185528201e-01 + -3.079837119302323e-01 + -3.076367355606988e-01 + -3.072902893338402e-01 + -3.069443731087555e-01 + -3.065989866918071e-01 + -3.062541299629242e-01 + -3.059098027895394e-01 + -3.055660049841727e-01 + -3.052227363624680e-01 + -3.048799967605036e-01 + -3.045377860349815e-01 + -3.041961039937703e-01 + -3.038549504461246e-01 + -3.035143252370935e-01 + -3.031742281687436e-01 + -3.028346590287212e-01 + -3.024956176228422e-01 + -3.021571037727226e-01 + -3.018191172891879e-01 + -3.014816579447884e-01 + -3.011447255196590e-01 + -3.008083198102758e-01 + -3.004724406299011e-01 + -3.001370877400161e-01 + -2.998022608844934e-01 + -2.994679598576119e-01 + -2.991341844426006e-01 + -2.988009344054493e-01 + -2.984682095047237e-01 + -2.981360094999961e-01 + -2.978043341494513e-01 + -2.974731831997393e-01 + -2.971425563888731e-01 + -2.968124534589884e-01 + -2.964828741880918e-01 + -2.961538183196636e-01 + -2.958252855581221e-01 + -2.954972756291568e-01 + -2.951697882690829e-01 + -2.948428232168150e-01 + -2.945163801997789e-01 + -2.941904589349781e-01 + -2.938650591314966e-01 + -2.935401805013078e-01 + -2.932158227514122e-01 + -2.928919855851135e-01 + -2.925686687341852e-01 + -2.922458719001491e-01 + -2.919235947316832e-01 + -2.916018369508684e-01 + -2.912805982685433e-01 + -2.909598783275820e-01 + -2.906396768390501e-01 + -2.903199935181080e-01 + -2.900008280188033e-01 + -2.896821799916231e-01 + -2.893640491090957e-01 + -2.890464350819901e-01 + -2.887293375718574e-01 + -2.884127562142981e-01 + -2.880966906629407e-01 + -2.877811406014185e-01 + -2.874661057081589e-01 + -2.871515856017081e-01 + -2.868375799224188e-01 + -2.865240883310016e-01 + -2.862111104788733e-01 + -2.858986460098822e-01 + -2.855866945593247e-01 + -2.852752557499685e-01 + -2.849643292069009e-01 + -2.846539145659956e-01 + -2.843440114851778e-01 + -2.840346195818731e-01 + -2.837257384382189e-01 + -2.834173676812886e-01 + -2.831095069534547e-01 + -2.828021558855677e-01 + -2.824953140398479e-01 + -2.821889810170294e-01 + -2.818831564761255e-01 + -2.815778399984394e-01 + -2.812730311718642e-01 + -2.809687296216254e-01 + -2.806649349155874e-01 + -2.803616466281044e-01 + -2.800588643758425e-01 + -2.797565877594176e-01 + -2.794548163592918e-01 + -2.791535497376408e-01 + -2.788527874670974e-01 + -2.785525291296920e-01 + -2.782527743138438e-01 + -2.779535226034689e-01 + -2.776547735631448e-01 + -2.773565267276963e-01 + -2.770587816777879e-01 + -2.767615379983304e-01 + -2.764647952191276e-01 + -2.761685529026718e-01 + -2.758728106207560e-01 + -2.755775679024411e-01 + -2.752828243050798e-01 + -2.749885793975552e-01 + -2.746948327088052e-01 + -2.744015837838452e-01 + -2.741088321749212e-01 + -2.738165773969221e-01 + -2.735248189792139e-01 + -2.732335564721672e-01 + -2.729427894286903e-01 + -2.726525173657923e-01 + -2.723627397775934e-01 + -2.720734562117226e-01 + -2.717846661993187e-01 + -2.714963692431568e-01 + -2.712085648712142e-01 + -2.709212526021956e-01 + -2.706344319386959e-01 + -2.703481024077038e-01 + -2.700622635195931e-01 + -2.697769147573882e-01 + -2.694920556414950e-01 + -2.692076856844960e-01 + -2.689238043678598e-01 + -2.686404111894522e-01 + -2.683575056539274e-01 + -2.680750872618156e-01 + -2.677931554956217e-01 + -2.675117098420171e-01 + -2.672307498062658e-01 + -2.669502748541435e-01 + -2.666702844564393e-01 + -2.663907781339158e-01 + -2.661117553567487e-01 + -2.658332155842312e-01 + -2.655551583220328e-01 + -2.652775830228958e-01 + -2.650004891310402e-01 + -2.647238761635896e-01 + -2.644477435849875e-01 + -2.641720908275026e-01 + -2.638969173638899e-01 + -2.636222226679477e-01 + -2.633480062028563e-01 + -2.630742674151484e-01 + -2.628010057675256e-01 + -2.625282207270022e-01 + -2.622559117157733e-01 + -2.619840781930577e-01 + -2.617127196438671e-01 + -2.614418354712815e-01 + -2.611714251171109e-01 + -2.609014880694051e-01 + -2.606320237300626e-01 + -2.603630315312080e-01 + -2.600945109576975e-01 + -2.598264614192900e-01 + -2.595588823272051e-01 + -2.592917731268140e-01 + -2.590251332515323e-01 + -2.587589621335352e-01 + -2.584932592080277e-01 + -2.582280238899204e-01 + -2.579632555996659e-01 + -2.576989537753064e-01 + -2.574351178135512e-01 + -2.571717471205571e-01 + -2.569088411498421e-01 + -2.566463993032694e-01 + -2.563844209736399e-01 + -2.561229055922761e-01 + -2.558618525664796e-01 + -2.556012613001373e-01 + -2.553411312228936e-01 + -2.550814617199114e-01 + -2.548222521633088e-01 + -2.545635019702024e-01 + -2.543052105636615e-01 + -2.540473773489130e-01 + -2.537900016856341e-01 + -2.535330829668063e-01 + -2.532766206092137e-01 + -2.530206140025920e-01 + -2.527650625373169e-01 + -2.525099656058339e-01 + -2.522553225882911e-01 + -2.520011328519368e-01 + -2.517473957689335e-01 + -2.514941107682424e-01 + -2.512412772287477e-01 + -2.509888944763962e-01 + -2.507369619085763e-01 + -2.504854789235316e-01 + -2.502344448942996e-01 + -2.499838591881081e-01 + -2.497337211675947e-01 + -2.494840301941274e-01 + -2.492347856449565e-01 + -2.489859868896926e-01 + -2.487376332816026e-01 + -2.484897241934407e-01 + -2.482422589923619e-01 + -2.479952370263670e-01 + -2.477486576676466e-01 + -2.475025202765806e-01 + -2.472568241776227e-01 + -2.470115687463755e-01 + -2.467667533575219e-01 + -2.465223773319763e-01 + -2.462784400223504e-01 + -2.460349407926405e-01 + -2.457918789841980e-01 + -2.455492539346369e-01 + -2.453070649885519e-01 + -2.450653115068263e-01 + -2.448239928212929e-01 + -2.445831082525867e-01 + -2.443426571517872e-01 + -2.441026388729581e-01 + -2.438630527595843e-01 + -2.436238981283992e-01 + -2.433851743000419e-01 + -2.431468806082007e-01 + -2.429090164035606e-01 + -2.426715810065056e-01 + -2.424345737214870e-01 + -2.421979939156839e-01 + -2.419618409122474e-01 + -2.417261139893861e-01 + -2.414908125047008e-01 + -2.412559357926221e-01 + -2.410214831428485e-01 + -2.407874538901436e-01 + -2.405538473594189e-01 + -2.403206628448788e-01 + -2.400878996494245e-01 + -2.398555571012901e-01 + -2.396236345489386e-01 + -2.393921312730178e-01 + -2.391610465589564e-01 + -2.389303797400675e-01 + -2.387001301206918e-01 + -2.384702970040557e-01 + -2.382408797142012e-01 + -2.380118775445049e-01 + -2.377832897784107e-01 + -2.375551157141706e-01 + -2.373273546676602e-01 + -2.371000059435911e-01 + -2.368730688080822e-01 + -2.366465425799626e-01 + -2.364204265795865e-01 + -2.361947200488833e-01 + -2.359694222928865e-01 + -2.357445326362645e-01 + -2.355200503199650e-01 + -2.352959746331166e-01 + -2.350723049000333e-01 + -2.348490404054174e-01 + -2.346261804119323e-01 + -2.344037241869703e-01 + -2.341816710532240e-01 + -2.339600202844186e-01 + -2.337387711161095e-01 + -2.335179228570654e-01 + -2.332974748051559e-01 + -2.330774262250223e-01 + -2.328577763695832e-01 + -2.326385245095027e-01 + -2.324196699339893e-01 + -2.322012119071908e-01 + -2.319831496985562e-01 + -2.317654825913850e-01 + -2.315482098501277e-01 + -2.313313307350805e-01 + -2.311148445095759e-01 + -2.308987504304352e-01 + -2.306830477605995e-01 + -2.304677357746768e-01 + -2.302528137313455e-01 + -2.300382808821649e-01 + -2.298241364802842e-01 + -2.296103797849810e-01 + -2.293970100645507e-01 + -2.291840265929282e-01 + -2.289714285853380e-01 + -2.287592152687787e-01 + -2.285473859575702e-01 + -2.283359398767679e-01 + -2.281248762354934e-01 + -2.279141943457151e-01 + -2.277038934347241e-01 + -2.274939727028900e-01 + -2.272844314557521e-01 + -2.270752689260884e-01 + -2.268664843063303e-01 + -2.266580768713468e-01 + -2.264500458690802e-01 + -2.262423905203003e-01 + -2.260351100742427e-01 + -2.258282037663114e-01 + -2.256216708189812e-01 + -2.254155104759721e-01 + -2.252097219699820e-01 + -2.250043045201664e-01 + -2.247992573593203e-01 + -2.245945797283117e-01 + -2.243902708632074e-01 + -2.241863299547213e-01 + -2.239827562297785e-01 + -2.237795489631809e-01 + -2.235767073479459e-01 + -2.233742305913306e-01 + -2.231721179508258e-01 + -2.229703686190215e-01 + -2.227689817967141e-01 + -2.225679567331226e-01 + -2.223672926389324e-01 + -2.221669887137792e-01 + -2.219670441735496e-01 + -2.217674582593449e-01 + -2.215682301863681e-01 + -2.213693591068690e-01 + -2.211708442449674e-01 + -2.209726848493868e-01 + -2.207748801280919e-01 + -2.205774292618204e-01 + -2.203803314334422e-01 + -2.201835858632719e-01 + -2.199871917828554e-01 + -2.197911484006530e-01 + -2.195954548584606e-01 + -2.194001103587555e-01 + -2.192051141421317e-01 + -2.190104654040938e-01 + -2.188161633272981e-01 + -2.186222070944807e-01 + -2.184285959003400e-01 + -2.182353289399314e-01 + -2.180424054040691e-01 + -2.178498244760091e-01 + -2.176575853577229e-01 + -2.174656872563868e-01 + -2.172741293153170e-01 + -2.170829107184905e-01 + -2.168920306960583e-01 + -2.167014883907840e-01 + -2.165112829716549e-01 + -2.163214136638050e-01 + -2.161318796380734e-01 + -2.159426800456078e-01 + -2.157538140457635e-01 + -2.155652808465100e-01 + -2.153770796378261e-01 + -2.151892095617934e-01 + -2.150016698096599e-01 + -2.148144595574814e-01 + -2.146275779264766e-01 + -2.144410241083473e-01 + -2.142547972973645e-01 + -2.140688966286696e-01 + -2.138833212713278e-01 + -2.136980704068839e-01 + -2.135131431962469e-01 + -2.133285387811797e-01 + -2.131442563097479e-01 + -2.129602949644751e-01 + -2.127766538888946e-01 + -2.125933322205115e-01 + -2.124103291538361e-01 + -2.122276438425608e-01 + -2.120452754131807e-01 + -2.118632230196053e-01 + -2.116814858091140e-01 + -2.115000629262062e-01 + -2.113189535366684e-01 + -2.111381567835468e-01 + -2.109576717897184e-01 + -2.107774976942802e-01 + -2.105976336477213e-01 + -2.104180788038142e-01 + -2.102388322993181e-01 + -2.100598932684242e-01 + -2.098812608470688e-01 + -2.097029341689293e-01 + -2.095249123662445e-01 + -2.093471945702010e-01 + -2.091697799107427e-01 + -2.089926675162990e-01 + -2.088158565139439e-01 + -2.086393460309292e-01 + -2.084631351904399e-01 + -2.082872231124364e-01 + -2.081116089361562e-01 + -2.079362917906518e-01 + -2.077612707758083e-01 + -2.075865450013143e-01 + -2.074121135936494e-01 + -2.072379756933602e-01 + -2.070641303864229e-01 + -2.068905767613353e-01 + -2.067173139701657e-01 + -2.065443411403108e-01 + -2.063716573678470e-01 + -2.061992617242399e-01 + -2.060271533191409e-01 + -2.058553312792487e-01 + -2.056837947057731e-01 + -2.055125426973447e-01 + -2.053415743575506e-01 + -2.051708887985432e-01 + -2.050004850901530e-01 + -2.048303622987561e-01 + -2.046605195888223e-01 + -2.044909560501713e-01 + -2.043216707137636e-01 + -2.041526627003059e-01 + -2.039839311053935e-01 + -2.038154749924674e-01 + -2.036472934779214e-01 + -2.034793856435669e-01 + -2.033117505334730e-01 + -2.031443872603400e-01 + -2.029772949053144e-01 + -2.028104725040109e-01 + -2.026439191805672e-01 + -2.024776340229360e-01 + -2.023116160442759e-01 + -2.021458643362796e-01 + -2.019803779931268e-01 + -2.018151560674621e-01 + -2.016501976152565e-01 + -2.014855017030598e-01 + -2.013210674074579e-01 + -2.011568937830132e-01 + -2.009929798869589e-01 + -2.008293247967324e-01 + -2.006659275530022e-01 + -2.005027871933542e-01 + -2.003399027889975e-01 + -2.001772733993469e-01 + -2.000148980648089e-01 + -1.998527758076494e-01 + -1.996909056937942e-01 + -1.995292867991256e-01 + -1.993679181495860e-01 + -1.992067987609143e-01 + -1.990459276660739e-01 + -1.988853039482369e-01 + -1.987249266385540e-01 + -1.985647947339026e-01 + -1.984049072747179e-01 + -1.982452632992336e-01 + -1.980858618372365e-01 + -1.979267019229292e-01 + -1.977677825816225e-01 + -1.976091028269504e-01 + -1.974506616652059e-01 + -1.972924581269546e-01 + -1.971344912595772e-01 + -1.969767600601777e-01 + -1.968192635197257e-01 + -1.966620006473419e-01 + -1.965049704914111e-01 + -1.963481720619957e-01 + -1.961916043159508e-01 + -1.960352662866058e-01 + -1.958791570023236e-01 + -1.957232754408347e-01 + -1.955676205736371e-01 + -1.954121914050787e-01 + -1.952569869811404e-01 + -1.951020062511957e-01 + -1.949472481743376e-01 + -1.947927118000400e-01 + -1.946383960967118e-01 + -1.944843000224015e-01 + -1.943304226010136e-01 + -1.941767627996486e-01 + -1.940233195719773e-01 + -1.938700919198527e-01 + -1.937170788011597e-01 + -1.935642791691659e-01 + -1.934116920404960e-01 + -1.932593163702813e-01 + -1.931071510855982e-01 + -1.929551951739442e-01 + -1.928034476111422e-01 + -1.926519073523142e-01 + -1.925005733427448e-01 + -1.923494445333268e-01 + -1.921985198850023e-01 + -1.920477983694047e-01 + -1.918972789099489e-01 + -1.917469604078139e-01 + -1.915968418647559e-01 + -1.914469222323946e-01 + -1.912972003977130e-01 + -1.911476753153419e-01 + -1.909983459354311e-01 + -1.908492111828614e-01 + -1.907002699990133e-01 + -1.905515213021572e-01 + -1.904029639829450e-01 + -1.902545969863778e-01 + -1.901064192518998e-01 + -1.899584296832387e-01 + -1.898106271909556e-01 + -1.896630106872466e-01 + -1.895155790805884e-01 + -1.893683312769490e-01 + -1.892212661839438e-01 + -1.890743827110565e-01 + -1.889276797429612e-01 + -1.887811561730439e-01 + -1.886348109311961e-01 + -1.884886428944042e-01 + -1.883426509295119e-01 + -1.881968339481026e-01 + -1.880511908244114e-01 + -1.879057204210790e-01 + -1.877604216379617e-01 + -1.876152933660684e-01 + -1.874703344759240e-01 + -1.873255438107255e-01 + -1.871809202288037e-01 + -1.870364626111082e-01 + -1.868921698587295e-01 + -1.867480408184902e-01 + -1.866040743068453e-01 + -1.864602692045282e-01 + -1.863166243684211e-01 + -1.861731386269271e-01 + -1.860298108368848e-01 + -1.858866398430710e-01 + -1.857436244746902e-01 + -1.856007635808946e-01 + -1.854580560069532e-01 + -1.853155005825300e-01 + -1.851730961153894e-01 + -1.850308414342497e-01 + -1.848887353926573e-01 + -1.847467767859671e-01 + -1.846049644137440e-01 + -1.844632971091011e-01 + -1.843217736893654e-01 + -1.841803929497542e-01 + -1.840391536710132e-01 + -1.838980546953601e-01 + -1.837570948428414e-01 + -1.836162728527662e-01 + -1.834755875142904e-01 + -1.833350376404768e-01 + -1.831946220322505e-01 + -1.830543394615971e-01 + -1.829141886951903e-01 + -1.827741685199023e-01 + -1.826342777082210e-01 + -1.824945150204152e-01 + -1.823548792146146e-01 + -1.822153690716325e-01 + -1.820759833652730e-01 + -1.819367208114371e-01 + -1.817975801678411e-01 + -1.816585602158104e-01 + -1.815196596908165e-01 + -1.813808773333636e-01 + -1.812422118861797e-01 + -1.811036620617022e-01 + -1.809652266051679e-01 + -1.808269042761388e-01 + -1.806886937510042e-01 + -1.805505937426575e-01 + -1.804126030135119e-01 + -1.802747202867512e-01 + -1.801369442562599e-01 + -1.799992736029428e-01 + -1.798617070428147e-01 + -1.797242432859927e-01 + -1.795868810229852e-01 + -1.794496189531687e-01 + -1.793124557648680e-01 + -1.791753901302353e-01 + -1.790384207459855e-01 + -1.789015462957270e-01 + -1.787647654308534e-01 + -1.786280768266134e-01 + -1.784914791546937e-01 + -1.783549710639760e-01 + -1.782185512276328e-01 + -1.780822183108111e-01 + -1.779459709418989e-01 + -1.778098077766785e-01 + -1.776737274641330e-01 + -1.775377286080068e-01 + -1.774018098685905e-01 + -1.772659699092733e-01 + -1.771302073149079e-01 + -1.769945207098710e-01 + -1.768589087303928e-01 + -1.767233699571559e-01 + -1.765879030229077e-01 + -1.764525065751527e-01 + -1.763171791703831e-01 + -1.761819193770276e-01 + -1.760467257991546e-01 + -1.759115970764966e-01 + -1.757765317826701e-01 + -1.756415284467932e-01 + -1.755065856823099e-01 + -1.753717020824757e-01 + -1.752368761936218e-01 + -1.751021065398607e-01 + -1.749673916979465e-01 + -1.748327302843573e-01 + -1.746981207950505e-01 + -1.745635617515470e-01 + -1.744290517410085e-01 + -1.742945892830799e-01 + -1.741601728915786e-01 + -1.740258011048612e-01 + -1.738914724532109e-01 + -1.737571854631234e-01 + -1.736229386541751e-01 + -1.734887304969607e-01 + -1.733545594900176e-01 + -1.732204242005106e-01 + -1.730863230847530e-01 + -1.729522545880760e-01 + -1.728182172369972e-01 + -1.726842095169024e-01 + -1.725502298924380e-01 + -1.724162768405715e-01 + -1.722823488297978e-01 + -1.721484443102564e-01 + -1.720145617082366e-01 + -1.718806995062888e-01 + -1.717468561876117e-01 + -1.716130301380271e-01 + -1.714792197950507e-01 + -1.713454236195253e-01 + -1.712116399980747e-01 + -1.710778673588311e-01 + -1.709441041583024e-01 + -1.708103487974718e-01 + -1.706765996579921e-01 + -1.705428551238503e-01 + -1.704091136122197e-01 + -1.702753735243250e-01 + -1.701416332337174e-01 + -1.700078910979654e-01 + -1.698741454939726e-01 + -1.697403948188084e-01 + -1.696066374424440e-01 + -1.694728717024124e-01 + -1.693390959182572e-01 + -1.692053084687103e-01 + -1.690715077127793e-01 + -1.689376919605925e-01 + -1.688038595533757e-01 + -1.686700088249354e-01 + -1.685361380772680e-01 + -1.684022456043037e-01 + -1.682683297240474e-01 + -1.681343887869522e-01 + -1.680004210524648e-01 + -1.678664247764668e-01 + -1.677323982879569e-01 + -1.675983398888628e-01 + -1.674642478421112e-01 + -1.673301203727337e-01 + -1.671959557470875e-01 + -1.670617522514179e-01 + -1.669275081523977e-01 + -1.667932216748827e-01 + -1.666588910302535e-01 + -1.665245144618999e-01 + -1.663900902261115e-01 + -1.662556165573334e-01 + -1.661210916150787e-01 + -1.659865136192500e-01 + -1.658518808205523e-01 + -1.657171913793817e-01 + -1.655824434869752e-01 + -1.654476353589082e-01 + -1.653127651402884e-01 + -1.651778310039089e-01 + -1.650428311475997e-01 + -1.649077636947325e-01 + -1.647726268054878e-01 + -1.646374186795111e-01 + -1.645021374143022e-01 + -1.643667811219276e-01 + -1.642313479645375e-01 + -1.640958360797542e-01 + -1.639602435821208e-01 + -1.638245685678920e-01 + -1.636888091342957e-01 + -1.635529633807896e-01 + -1.634170294056715e-01 + -1.632810052843662e-01 + -1.631448890987297e-01 + -1.630086789505001e-01 + -1.628723728914803e-01 + -1.627359689604526e-01 + -1.625994652175857e-01 + -1.624628597296842e-01 + -1.623261505411777e-01 + -1.621893356498993e-01 + -1.620524130844338e-01 + -1.619153808874262e-01 + -1.617782370829140e-01 + -1.616409796594323e-01 + -1.615036066042981e-01 + -1.613661159511956e-01 + -1.612285056749289e-01 + -1.610907737177844e-01 + -1.609529180644884e-01 + -1.608149367058714e-01 + -1.606768276166446e-01 + -1.605385887249777e-01 + -1.604002179666082e-01 + -1.602617132920370e-01 + -1.601230726507729e-01 + -1.599842939686116e-01 + -1.598453751511857e-01 + -1.597063141136520e-01 + -1.595671087574746e-01 + -1.594277569704320e-01 + -1.592882566576958e-01 + -1.591486057239582e-01 + -1.590088020577491e-01 + -1.588688434990599e-01 + -1.587287278927537e-01 + -1.585884531125515e-01 + -1.584480170419727e-01 + -1.583074175205078e-01 + -1.581666523320080e-01 + -1.580257193426469e-01 + -1.578846164090064e-01 + -1.577433413163997e-01 + -1.576018918624315e-01 + -1.574602658488709e-01 + -1.573184610699215e-01 + -1.571764753211041e-01 + -1.570343063929105e-01 + -1.568919520623428e-01 + -1.567494100904384e-01 + -1.566066782348808e-01 + -1.564637542612438e-01 + -1.563206358983480e-01 + -1.561773208679784e-01 + -1.560338069324230e-01 + -1.558900918260982e-01 + -1.557461732592160e-01 + -1.556020489404925e-01 + -1.554577165574562e-01 + -1.553131737930803e-01 + -1.551684183667380e-01 + -1.550234479797016e-01 + -1.548782603038531e-01 + -1.547328529851514e-01 + -1.545872236759721e-01 + -1.544413700402710e-01 + -1.542952897416497e-01 + -1.541489804232354e-01 + -1.540024397056934e-01 + -1.538556652055174e-01 + -1.537086545589509e-01 + -1.535614054107616e-01 + -1.534139153265976e-01 + -1.532661818894184e-01 + -1.531182027303390e-01 + -1.529699754364569e-01 + -1.528214975805129e-01 + -1.526727667337492e-01 + -1.525237804315604e-01 + -1.523745362382714e-01 + -1.522250317710374e-01 + -1.520752645246755e-01 + -1.519252320010430e-01 + -1.517749318043420e-01 + -1.516243614355856e-01 + -1.514735183783821e-01 + -1.513224001894709e-01 + -1.511710043669709e-01 + -1.510193283881065e-01 + -1.508673697644896e-01 + -1.507151259726486e-01 + -1.505625944726656e-01 + -1.504097727456887e-01 + -1.502566582737337e-01 + -1.501032485283334e-01 + -1.499495409558064e-01 + -1.497955329817901e-01 + -1.496412220312461e-01 + -1.494866055649385e-01 + -1.493316810218445e-01 + -1.491764458131949e-01 + -1.490208973395277e-01 + -1.488650330073115e-01 + -1.487088502321930e-01 + -1.485523464347014e-01 + -1.483955190026080e-01 + -1.482383652905619e-01 + -1.480808826638546e-01 + -1.479230685198502e-01 + -1.477649202713839e-01 + -1.476064352431592e-01 + -1.474476107543291e-01 + -1.472884441602761e-01 + -1.471289328556787e-01 + -1.469690741904771e-01 + -1.468088654425319e-01 + -1.466483039513407e-01 + -1.464873870643751e-01 + -1.463261120992439e-01 + -1.461644763685366e-01 + -1.460024771711030e-01 + -1.458401117873900e-01 + -1.456773775256328e-01 + -1.455142717039091e-01 + -1.453507916253095e-01 + -1.451869345373153e-01 + -1.450226976893540e-01 + -1.448580783981553e-01 + -1.446930739597145e-01 + -1.445276816274984e-01 + -1.443618986028185e-01 + -1.441957221635531e-01 + -1.440291496154044e-01 + -1.438621781832398e-01 + -1.436948050802729e-01 + -1.435270275400491e-01 + -1.433588428498931e-01 + -1.431902482406432e-01 + -1.430212409022274e-01 + -1.428518180756519e-01 + -1.426819769869911e-01 + -1.425117148424586e-01 + -1.423410288662751e-01 + -1.421699162875700e-01 + -1.419983743276740e-01 + -1.418264001727286e-01 + -1.416539910114460e-01 + -1.414811440470098e-01 + -1.413078564852965e-01 + -1.411341255423312e-01 + -1.409599484327010e-01 + -1.407853222965617e-01 + -1.406102443173973e-01 + -1.404347117561954e-01 + -1.402587217519092e-01 + -1.400822714659246e-01 + -1.399053581557436e-01 + -1.397279789611117e-01 + -1.395501310267636e-01 + -1.393718115937786e-01 + -1.391930178402762e-01 + -1.390137469173205e-01 + -1.388339959972602e-01 + -1.386537622953096e-01 + -1.384730430031857e-01 + -1.382918352262208e-01 + -1.381101361784074e-01 + -1.379279430940128e-01 + -1.377452530885734e-01 + -1.375620633453186e-01 + -1.373783710804598e-01 + -1.371941734475252e-01 + -1.370094676273606e-01 + -1.368242508215203e-01 + -1.366385202106050e-01 + -1.364522729969404e-01 + -1.362655063841710e-01 + -1.360782175127518e-01 + -1.358904035964053e-01 + -1.357020618930480e-01 + -1.355131895302153e-01 + -1.353237837054462e-01 + -1.351338416922692e-01 + -1.349433606493001e-01 + -1.347523377766847e-01 + -1.345607703467432e-01 + -1.343686555800670e-01 + -1.341759906744941e-01 + -1.339827728348106e-01 + -1.337889993407819e-01 + -1.335946674413715e-01 + -1.333997743261954e-01 + -1.332043172962129e-01 + -1.330082936252972e-01 + -1.328117004983506e-01 + -1.326145352418741e-01 + -1.324167951779929e-01 + -1.322184775207451e-01 + -1.320195795498869e-01 + -1.318200985870884e-01 + -1.316200319613715e-01 + -1.314193769770063e-01 + -1.312181309395709e-01 + -1.310162911860090e-01 + -1.308138550466099e-01 + -1.306108198680959e-01 + -1.304071830473609e-01 + -1.302029419358534e-01 + -1.299980938748928e-01 + -1.297926362720222e-01 + -1.295865665431496e-01 + -1.293798820977739e-01 + -1.291725803345192e-01 + -1.289646586840201e-01 + -1.287561146028010e-01 + -1.285469455426532e-01 + -1.283371489741077e-01 + -1.281267223855238e-01 + -1.279156632656401e-01 + -1.277039691180485e-01 + -1.274916374652222e-01 + -1.272786658468367e-01 + -1.270650518164191e-01 + -1.268507929437779e-01 + -1.266358868257778e-01 + -1.264203310530910e-01 + -1.262041232080785e-01 + -1.259872609212462e-01 + -1.257697418614985e-01 + -1.255515637216261e-01 + -1.253327241582721e-01 + -1.251132208452764e-01 + -1.248930515084944e-01 + -1.246722139029198e-01 + -1.244507057917270e-01 + -1.242285249387353e-01 + -1.240056691417677e-01 + -1.237821362222557e-01 + -1.235579240163024e-01 + -1.233330303641722e-01 + -1.231074531412701e-01 + -1.228811902909497e-01 + -1.226542397328350e-01 + -1.224265993926709e-01 + -1.221982672554952e-01 + -1.219692413178169e-01 + -1.217395195880366e-01 + -1.215091001037845e-01 + -1.212779809466277e-01 + -1.210461602256936e-01 + -1.208136360512357e-01 + -1.205804065871132e-01 + -1.203464700244819e-01 + -1.201118245085727e-01 + -1.198764682774020e-01 + -1.196403996473917e-01 + -1.194036168896808e-01 + -1.191661183059585e-01 + -1.189279022478277e-01 + -1.186889671039581e-01 + -1.184493112863093e-01 + -1.182089332317922e-01 + -1.179678314226111e-01 + -1.177260043675167e-01 + -1.174834505981953e-01 + -1.172401686820595e-01 + -1.169961572351099e-01 + -1.167514149230550e-01 + -1.165059404117411e-01 + -1.162597324012717e-01 + -1.160127896494247e-01 + -1.157651109471359e-01 + -1.155166951180050e-01 + -1.152675410245315e-01 + -1.150176475647009e-01 + -1.147670136740031e-01 + -1.145156383362403e-01 + -1.142635205942373e-01 + -1.140106595167702e-01 + -1.137570541746248e-01 + -1.135027037005393e-01 + -1.132476072885310e-01 + -1.129917641930528e-01 + -1.127351736954119e-01 + -1.124778350964029e-01 + -1.122197477241451e-01 + -1.119609110122396e-01 + -1.117013244465126e-01 + -1.114409874638995e-01 + -1.111798996306716e-01 + -1.109180606010562e-01 + -1.106554699641756e-01 + -1.103921273860412e-01 + -1.101280326261970e-01 + -1.098631854961093e-01 + -1.095975858385727e-01 + -1.093312335328026e-01 + -1.090641285282797e-01 + -1.087962708201439e-01 + -1.085276604456853e-01 + -1.082582975002112e-01 + -1.079881821487157e-01 + -1.077173146235393e-01 + -1.074456951780328e-01 + -1.071733241222459e-01 + -1.069002018428373e-01 + -1.066263287812705e-01 + -1.063517054311524e-01 + -1.060763323447030e-01 + -1.058002101349244e-01 + -1.055233394662503e-01 + -1.052457210591484e-01 + -1.049673557111256e-01 + -1.046882442747131e-01 + -1.044083876525769e-01 + -1.041277868396362e-01 + -1.038464428925467e-01 + -1.035643569070283e-01 + -1.032815300276830e-01 + -1.029979634724506e-01 + -1.027136585692167e-01 + -1.024286166734134e-01 + -1.021428391952729e-01 + -1.018563276648054e-01 + -1.015690836461885e-01 + -1.012811087487812e-01 + -1.009924046817547e-01 + -1.007029732152899e-01 + -1.004128161832720e-01 + -1.001219355157012e-01 + -9.983033318947014e-02 + -9.953801123789381e-02 + -9.924497181065381e-02 + -9.895121710675164e-02 + -9.865674937610269e-02 + -9.836157098451072e-02 + -9.806568435550449e-02 + -9.776909196067303e-02 + -9.747179635418697e-02 + -9.717380018935569e-02 + -9.687510621844479e-02 + -9.657571724434684e-02 + -9.627563612429342e-02 + -9.597486578738405e-02 + -9.567340928055243e-02 + -9.537126972794066e-02 + -9.506845031433311e-02 + -9.476495428226560e-02 + -9.446078497156121e-02 + -9.415594584893169e-02 + -9.385044042616277e-02 + -9.354427227181475e-02 + -9.323744504129654e-02 + -9.292996250412121e-02 + -9.262182850819620e-02 + -9.231304696021701e-02 + -9.200362185853247e-02 + -9.169355729461479e-02 + -9.138285746240042e-02 + -9.107152658866502e-02 + -9.075956898041553e-02 + -9.044698911371001e-02 + -9.013379148226228e-02 + -8.981998063663986e-02 + -8.950556130228651e-02 + -8.919053824746566e-02 + -8.887491629233073e-02 + -8.855870039130662e-02 + -8.824189556852820e-02 + -8.792450692262105e-02 + -8.760653968435946e-02 + -8.728799913331863e-02 + -8.696889060279582e-02 + -8.664921956673162e-02 + -8.632899159487925e-02 + -8.600821233560418e-02 + -8.568688750540578e-02 + -8.536502290181033e-02 + -8.504262441718942e-02 + -8.471969805751253e-02 + -8.439624991228166e-02 + -8.407228614692197e-02 + -8.374781300392073e-02 + -8.342283682562317e-02 + -8.309736406563741e-02 + -8.277140122021633e-02 + -8.244495489588025e-02 + -8.211803185128563e-02 + -8.179063884910803e-02 + -8.146278271646745e-02 + -8.113447041766966e-02 + -8.080570906396743e-02 + -8.047650581443898e-02 + -8.014686781276095e-02 + -7.981680240792462e-02 + -7.948631704884632e-02 + -7.915541916537581e-02 + -7.882411634928695e-02 + -7.849241630024972e-02 + -7.816032674199919e-02 + -7.782785552351333e-02 + -7.749501058768483e-02 + -7.716179991262426e-02 + -7.682823159405887e-02 + -7.649431382724470e-02 + -7.616005485767063e-02 + -7.582546305035900e-02 + -7.549054686796573e-02 + -7.515531479419155e-02 + -7.481977542018518e-02 + -7.448393744841550e-02 + -7.414780964186224e-02 + -7.381140084542565e-02 + -7.347471999131863e-02 + -7.313777608894645e-02 + -7.280057821330421e-02 + -7.246313551410177e-02 + -7.212545725749871e-02 + -7.178755277686714e-02 + -7.144943146088469e-02 + -7.111110278446059e-02 + -7.077257629326426e-02 + -7.043386160590276e-02 + -7.009496843792977e-02 + -6.975590657859251e-02 + -6.941668588038064e-02 + -6.907731623736572e-02 + -6.873780762436528e-02 + -6.839817013263073e-02 + -6.805841390025939e-02 + -6.771854911509186e-02 + -6.737858603607710e-02 + -6.703853501790490e-02 + -6.669840646610939e-02 + -6.635821080020089e-02 + -6.601795854049251e-02 + -6.567766029345612e-02 + -6.533732672933422e-02 + -6.499696856244534e-02 + -6.465659655384894e-02 + -6.431622152906083e-02 + -6.397585437117004e-02 + -6.363550601749234e-02 + -6.329518746487584e-02 + -6.295490977261127e-02 + -6.261468405232740e-02 + -6.227452144919842e-02 + -6.193443314782195e-02 + -6.159443038613483e-02 + -6.125452449175782e-02 + -6.091472682299209e-02 + -6.057504875634485e-02 + -6.023550170757411e-02 + -5.989609715178513e-02 + -5.955684662483948e-02 + -5.921776169220818e-02 + -5.887885392543541e-02 + -5.854013491232313e-02 + -5.820161634720029e-02 + -5.786330995026137e-02 + -5.752522743033200e-02 + -5.718738052319666e-02 + -5.684978102238282e-02 + -5.651244078415603e-02 + -5.617537160914179e-02 + -5.583858533460867e-02 + -5.550209389764803e-02 + -5.516590918758542e-02 + -5.483004310132478e-02 + -5.449450760284144e-02 + -5.415931467224975e-02 + -5.382447627285256e-02 + -5.349000433169809e-02 + -5.315591089010736e-02 + -5.282220800586091e-02 + -5.248890761304951e-02 + -5.215602173570349e-02 + -5.182356244333215e-02 + -5.149154173522678e-02 + -5.115997163165661e-02 + -5.082886416999516e-02 + -5.049823136495267e-02 + -5.016808523392447e-02 + -4.983843779429676e-02 + -4.950930104255546e-02 + -4.918068697018742e-02 + -4.885260756307724e-02 + -4.852507478656667e-02 + -4.819810059193260e-02 + -4.787169691654435e-02 + -4.754587567726797e-02 + -4.722064876717863e-02 + -4.689602805511645e-02 + -4.657202539266345e-02 + -4.624865260469157e-02 + -4.592592148337583e-02 + -4.560384379218360e-02 + -4.528243126408893e-02 + -4.496169559628109e-02 + -4.464164845065374e-02 + -4.432230145577399e-02 + -4.400366620090135e-02 + -4.368575422918912e-02 + -4.336857704568598e-02 + -4.305214611378011e-02 + -4.273647284209545e-02 + -4.242156859535529e-02 + -4.210744469338823e-02 + -4.179411239819886e-02 + -4.148158291999365e-02 + -4.116986741259326e-02 + -4.085897697584740e-02 + -4.054892265423421e-02 + -4.023971542131075e-02 + -3.993136619382251e-02 + -3.962388583123071e-02 + -3.931728511726146e-02 + -3.901157477126550e-02 + -3.870676544906659e-02 + -3.840286772630143e-02 + -3.809989211312446e-02 + -3.779784905219891e-02 + -3.749674889469364e-02 + -3.719660192057603e-02 + -3.689741833904486e-02 + -3.659920826728452e-02 + -3.630198174507707e-02 + -3.600574873447752e-02 + -3.571051910326670e-02 + -3.541630263528623e-02 + -3.512310902944081e-02 + -3.483094789226868e-02 + -3.453982873906083e-02 + -3.424976098893085e-02 + -3.396075396966352e-02 + -3.367281691959212e-02 + -3.338595897696143e-02 + -3.310018917253339e-02 + -3.281551644593574e-02 + -3.253194963945627e-02 + -3.224949747985180e-02 + -3.196816859917648e-02 + -3.168797153104005e-02 + -3.140891468854379e-02 + -3.113100638362195e-02 + -3.085425482400445e-02 + -3.057866810270934e-02 + -3.030425420554928e-02 + -3.003102099769914e-02 + -2.975897623664901e-02 + -2.948812757423692e-02 + -2.921848253324668e-02 + -2.895004852283206e-02 + -2.868283284398848e-02 + -2.841684266935389e-02 + -2.815208505554401e-02 + -2.788856694668657e-02 + -2.762629515277662e-02 + -2.736527636581735e-02 + -2.710551716378724e-02 + -2.684702399109470e-02 + -2.658980317107453e-02 + -2.633386090723251e-02 + -2.607920326420626e-02 + -2.582583618939347e-02 + -2.557376551170278e-02 + -2.532299691452088e-02 + -2.507353595904179e-02 + -2.482538808499682e-02 + -2.457855859507147e-02 + -2.433305266394129e-02 + -2.408887533435539e-02 + -2.384603151841623e-02 + -2.360452600145211e-02 + -2.336436343201402e-02 + -2.312554832609387e-02 + -2.288808507226996e-02 + -2.265197791904223e-02 + -2.241723098404469e-02 + -2.218384825955722e-02 + -2.195183359578144e-02 + -2.172119070564114e-02 + -2.149192317903017e-02 + -2.126403446983029e-02 + -2.103752788800763e-02 + -2.081240661670658e-02 + -2.058867370373213e-02 + -2.036633206151460e-02 + -2.014538447470562e-02 + -1.992583358220780e-02 + -1.970768189350454e-02 + -1.949093179354288e-02 + -1.927558551890179e-02 + -1.906164517346932e-02 + -1.884911273803516e-02 + -1.863799005561765e-02 + -1.842827883084014e-02 + -1.821998063919436e-02 + -1.801309692347624e-02 + -1.780762899421212e-02 + -1.760357803216378e-02 + -1.740094507853177e-02 + -1.719973104881908e-02 + -1.699993673354589e-02 + -1.680156278321953e-02 + -1.660460972117107e-02 + -1.640907794332531e-02 + -1.621496771146485e-02 + -1.602227916433384e-02 + -1.583101231371427e-02 + -1.564116703862817e-02 + -1.545274309883748e-02 + -1.526574012772238e-02 + -1.508015761914186e-02 + -1.489599495303444e-02 + -1.471325139301425e-02 + -1.453192606709004e-02 + -1.435201798658663e-02 + -1.417352604127694e-02 + -1.399644899327932e-02 + -1.382078549302728e-02 + -1.364653407164367e-02 + -1.347369313289915e-02 + -1.330226097046918e-02 + -1.313223576283522e-02 + -1.296361556501821e-02 + -1.279639832327015e-02 + -1.263058187022890e-02 + -1.246616392163480e-02 + -1.230314208589229e-02 + -1.214151385550256e-02 + -1.198127661271531e-02 + -1.182242763705999e-02 + -1.166496409538715e-02 + -1.150888304589847e-02 + -1.135418144553720e-02 + -1.120085614521435e-02 + -1.104890388968280e-02 + -1.089832132231912e-02 + -1.074910498405016e-02 + -1.060125131793449e-02 + -1.045475666967276e-02 + -1.030961728045836e-02 + -1.016582929759894e-02 + -1.002338877483435e-02 + -9.882291666582974e-03 + -9.742533838318660e-03 + -9.604111064390042e-03 + -9.467019020603698e-03 + -9.331253297647066e-03 + -9.196809399717920e-03 + -9.063682741005771e-03 + -8.931868652392608e-03 + -8.801362376326071e-03 + -8.672159070075210e-03 + -8.544253813557785e-03 + -8.417641603575709e-03 + -8.292317355716863e-03 + -8.168275911736944e-03 + -8.045512032694060e-03 + -7.924020397696789e-03 + -7.803795618017998e-03 + -7.684832236645861e-03 + -7.567124714929550e-03 + -7.450667444285828e-03 + -7.335454748033539e-03 + -7.221480883382279e-03 + -7.108740043647531e-03 + -6.997226348639058e-03 + -6.886933855315346e-03 + -6.777856561420043e-03 + -6.669988397445708e-03 + -6.563323236817328e-03 + -6.457854897474280e-03 + -6.353577131920331e-03 + -6.250483639666226e-03 + -6.148568068731946e-03 + -6.047824005897748e-03 + -5.948244987599076e-03 + -5.849824501347084e-03 + -5.752555978513681e-03 + -5.656432807264865e-03 + -5.561448332218353e-03 + -5.467595840626229e-03 + -5.374868578311233e-03 + -5.283259752176146e-03 + -5.192762521793490e-03 + -5.103370006626977e-03 + -5.015075286629148e-03 + -4.927871401782054e-03 + -4.841751355904269e-03 + -4.756708115524279e-03 + -4.672734611342882e-03 + -4.589823741835811e-03 + -4.507968371897898e-03 + -4.427161334111035e-03 + -4.347395432360992e-03 + -4.268663440821394e-03 + -4.190958105123732e-03 + -4.114272145237943e-03 + -4.038598254543495e-03 + -3.963929102325757e-03 + -3.890257335680627e-03 + -3.817575578228647e-03 + -3.745876433060482e-03 + -3.675152484340320e-03 + -3.605396296371936e-03 + -3.536600416225055e-03 + -3.468757375181376e-03 + -3.401859688514519e-03 + -3.335899857279008e-03 + -3.270870369624132e-03 + -3.206763701552144e-03 + -3.143572317880366e-03 + -3.081288673370167e-03 + -3.019905214426235e-03 + -2.959414379161780e-03 + -2.899808598243805e-03 + -2.841080297295089e-03 + -2.783221897187762e-03 + -2.726225814481816e-03 + -2.670084462721576e-03 + -2.614790253659214e-03 + -2.560335598217736e-03 + -2.506712907773368e-03 + -2.453914594305456e-03 + -2.401933071402304e-03 + -2.350760756079694e-03 + -2.300390068609935e-03 + -2.250813433830373e-03 + -2.202023282926124e-03 + -2.154012052729510e-03 + -2.106772187286276e-03 + -2.060296139752280e-03 + -2.014576371403607e-03 + -1.969605353508076e-03 + -1.925375568654703e-03 + -1.881879509874747e-03 + -1.839109683164610e-03 + -1.797058608044933e-03 + -1.755718816706420e-03 + -1.715082857166331e-03 + -1.675143293280333e-03 + -1.635892703443056e-03 + -1.597323683697497e-03 + -1.559428848712492e-03 + -1.522200830321536e-03 + -1.485632280183934e-03 + -1.449715870092584e-03 + -1.414444291041649e-03 + -1.379810256474448e-03 + -1.345806501791486e-03 + -1.312425783716085e-03 + -1.279660883530597e-03 + -1.247504606026809e-03 + -1.215949779407020e-03 + -1.184989258561609e-03 + -1.154615923413642e-03 + -1.124822679454977e-03 + -1.095602461024569e-03 + -1.066948228352973e-03 + -1.038852968864840e-03 + -1.011309701783447e-03 + -9.843114734261671e-04 + -9.578513585924095e-04 + -9.319224654553773e-04 + -9.065179311555053e-04 + -8.816309237062864e-04 + -8.572546450286300e-04 + -8.333823272254078e-04 + -8.100072355517002e-04 + -7.871226705798197e-04 + -7.647219641139264e-04 + -7.427984826268421e-04 + -7.213456295816899e-04 + -7.003568409622573e-04 + -6.798255887472549e-04 + -6.597453829223955e-04 + -6.401097674232178e-04 + -6.209123240167792e-04 + -6.021466729184949e-04 + -5.838064694784330e-04 + -5.658854088227745e-04 + -5.483772251938055e-04 + -5.312756891491387e-04 + -5.145746125261390e-04 + -4.982678466736966e-04 + -4.823492804447342e-04 + -4.668128456938979e-04 + -4.516525141842837e-04 + -4.368622962674093e-04 + -4.224362466667431e-04 + -4.083684605074392e-04 + -3.946530726767535e-04 + -3.812842634726816e-04 + -3.682562540846601e-04 + -3.555633067280622e-04 + -3.431997298953713e-04 + -3.311598733734528e-04 + -3.194381292167991e-04 + -3.080289365424697e-04 + -2.969267761950205e-04 + -2.861261725181284e-04 + -2.756216974519896e-04 + -2.654079650780054e-04 + -2.554796342192304e-04 + -2.458314117831762e-04 + -2.364580472261255e-04 + -2.273543358783364e-04 + -2.185151214599497e-04 + -2.099352907310207e-04 + -2.016097775283348e-04 + -1.935335642058985e-04 + -1.857016766078902e-04 + -1.781091887621722e-04 + -1.707512232636694e-04 + -1.636229467286454e-04 + -1.567195750846747e-04 + -1.500363727286114e-04 + -1.435686485603325e-04 + -1.373117617901810e-04 + -1.312611200233150e-04 + -1.254121759173047e-04 + -1.197604333131590e-04 + -1.143014443478538e-04 + -1.090308067994204e-04 + -1.039441703359566e-04 + -9.903723276260782e-05 + -9.430573818110019e-05 + -8.974548326970851e-05 + -8.535231263786576e-05 + -8.112211782233505e-05 + -7.705084341917009e-05 + -7.313448187442813e-05 + -6.936907333027644e-05 + -6.575071119249467e-05 + -6.227553658275769e-05 + -5.893973914900695e-05 + -5.573956203853484e-05 + -5.267129595161032e-05 + -4.973128084575291e-05 + -4.691591029739419e-05 + -4.422162539456759e-05 + -4.164491727590835e-05 + -3.918233061143914e-05 + -3.683045757249665e-05 + -3.458594118927672e-05 + -3.244547785270521e-05 + -3.040581149216269e-05 + -2.846373767254703e-05 + -2.661610506551807e-05 + -2.485980997915884e-05 + -2.319180110803831e-05 + -2.160907991664170e-05 + -2.010869565536285e-05 + -1.868775067119526e-05 + -1.734339969669114e-05 + -1.607284546059277e-05 + -1.487334444060605e-05 + -1.374220506933501e-05 + -1.267678404087566e-05 + -1.167449238525668e-05 + -1.073279264625808e-05 + -9.849195952118955e-06 + -9.021268250139948e-06 + -8.246626567968640e-06 + -7.522936912951058e-06 + -6.847920492700095e-06 + -6.219349168072015e-06 + -5.635044236568559e-06 + -5.092882470932048e-06 + -4.590790895044201e-06 + -4.126746487291455e-06 + -3.698781859286729e-06 + -3.304979520120749e-06 + -2.943472506918129e-06 + -2.612449510984778e-06 + -2.310148834845521e-06 + -2.034859929271865e-06 + -1.784927798002038e-06 + -1.558746837246077e-06 + -1.354763241038800e-06 + -1.171478551126456e-06 + -1.007443551831214e-06 + -8.612614901318561e-07 + -7.315906671893518e-07 + -6.171385461507109e-07 + -5.166657190198488e-07 + -4.289874671965282e-07 + -3.529682224298676e-07 + -2.875261969469119e-07 + -2.316338735426513e-07 + -1.843129441850586e-07 + -1.446395043479685e-07 + -1.117434618507405e-07 + -8.480406305106530e-08 + -6.305553831873507e-08 + -4.578544870958251e-08 + -3.233089380928512e-08 + -2.208448022054805e-08 + -1.449165750478591e-08 + -9.047683233008124e-09 + -5.303766739728543e-09 + -2.863504097386866e-09 + -1.380623394721897e-09 + -5.650641971230870e-10 + -1.790372475752245e-10 + -3.511990521548007e-11 + -8.192061809269277e-13 + 0.000000000000000e+00 diff --git a/examples/SPIN/dipole_spin/exchange_fit_bcc_iron/exchange_bcc_iron.dat b/examples/SPIN/dipole_spin/exchange_fit_bcc_iron/exchange_bcc_iron.dat new file mode 100644 index 0000000000..58134f2444 --- /dev/null +++ b/examples/SPIN/dipole_spin/exchange_fit_bcc_iron/exchange_bcc_iron.dat @@ -0,0 +1,5 @@ +2.4824 0.01948336 +2.8665 0.01109 +4.0538 -0.0002176 +4.753 -0.001714 +4.965 -0.001986 diff --git a/examples/SPIN/dipole_spin/exchange_fit_bcc_iron/exchange_fit.py b/examples/SPIN/dipole_spin/exchange_fit_bcc_iron/exchange_fit.py new file mode 100644 index 0000000000..ccf84fc233 --- /dev/null +++ b/examples/SPIN/dipole_spin/exchange_fit_bcc_iron/exchange_fit.py @@ -0,0 +1,32 @@ +#Program fitting the exchange interaction +#Model curve: Bethe-Slater function +import numpy as np, pylab, tkinter +import matplotlib.pyplot as plt +from scipy.optimize import curve_fit +from decimal import * + +print("Loop begin") + +#Definition of the Bethe-Slater function +def func(x,a,b,c): + return 4*a*((x/c)**2)*(1-b*(x/c)**2)*np.exp(-(x/c)**2) + +#Exchange coeff table (data to fit) +rdata, Jdata = np.loadtxt('exchange_bcc_iron.dat', usecols=(0,1), unpack=True) +plt.plot(rdata, Jdata, 'b-', label='data') + +#Perform the fit +popt, pcov = curve_fit(func, rdata, Jdata, bounds=(0, [500.,5.,5.])) +plt.plot(rdata, func(rdata, *popt), 'r--', label='fit') + +#Print the fitted params +print("Parameters: a={:.10} (in meV), b={:.10} (adim), c={:.10} (in Ang)".format(*popt)) + +#Ploting the result +plt.xlabel('r_ij') +pylab.xlim([0,6.5]) +plt.ylabel('J_ij') +plt.legend() +plt.show() + +print("Loop end") diff --git a/examples/SPIN/dipole_spin/fe_dd.dat b/examples/SPIN/dipole_spin/fe_dd.dat new file mode 100644 index 0000000000..a4b4c9a0d7 --- /dev/null +++ b/examples/SPIN/dipole_spin/fe_dd.dat @@ -0,0 +1,19 @@ + 6 8 + Optimal parameter set + 1 4.100199340884814 F + 2 1.565647547483517 F + 1 0.9332056681088162 T 3.000000000000000 + 2 -1.162558782567700 T 2.866666666666670 + 3 -0.3502026949249225 T 2.733333333333330 + 4 0.4287820835430028 T 2.600000000000000 + 5 4.907925057809273 T 2.400000000000000 + 6 -5.307049068415304 T 2.300000000000000 + 1 -0.1960674387419232 F 4.100000000000000 + 2 0.3687525935422963 F 3.800000000000000 + 3 -1.505333614924853 F 3.500000000000000 + 4 4.948907078156191 T 3.200000000000000 + 5 -4.894613262753399 T 2.900000000000000 + 6 3.468897724782442 T 2.600000000000000 + 7 -1.792218099820337 T 2.400000000000000 + 8 80.22069592246987 T 2.300000000000000 + diff --git a/examples/SPIN/dipole_spin/in.spin.iron_dipole_cut b/examples/SPIN/dipole_spin/in.spin.iron_dipole_cut new file mode 100644 index 0000000000..55bda10b3e --- /dev/null +++ b/examples/SPIN/dipole_spin/in.spin.iron_dipole_cut @@ -0,0 +1,59 @@ +# bcc iron in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice bcc 2.8665 +region box block 0.0 5.0 0.0 5.0 0.0 5.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 55.845 +set group all spin 2.2 -1.0 0.0 0.0 +velocity all create 100 4928459 rot yes dist gaussian + +pair_style hybrid/overlay eam/alloy spin/exchange 3.5 spin/dipole/cut 8.0 +pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe +pair_coeff * * spin/exchange exchange 3.4 0.02726 0.2171 1.841 +pair_coeff * * spin/dipole/cut 8.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +fix 1 all precession/spin cubic 0.001 0.0005 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 +fix_modify 1 energy yes +fix 2 all langevin/spin 0.0 0.0 21 + +fix 3 all nve/spin lattice yes +timestep 0.0001 + +# compute and output options + +compute out_mag all spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magx equal c_out_mag[1] +variable magy equal c_out_mag[2] +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo_style custom step time v_magx v_magy v_magz v_magnorm v_tmag v_emag pe etotal +thermo 50 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +run 2000 diff --git a/examples/SPIN/dipole_spin/in.spin.iron_ewald b/examples/SPIN/dipole_spin/in.spin.iron_ewald new file mode 100644 index 0000000000..d4703a2959 --- /dev/null +++ b/examples/SPIN/dipole_spin/in.spin.iron_ewald @@ -0,0 +1,60 @@ +# bcc iron in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice bcc 2.8665 +region box block 0.0 5.0 0.0 5.0 0.0 5.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 55.845 +set group all spin 2.2 -1.0 0.0 0.0 +velocity all create 100 4928459 rot yes dist gaussian + +pair_style hybrid/overlay eam/alloy spin/exchange 3.5 +pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe +pair_coeff * * spin/exchange exchange 3.4 0.02726 0.2171 1.841 +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +fix 1 all precession/spin cubic 0.001 0.0005 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 +fix_modify 1 energy yes +fix 2 all langevin/spin 0.0 0.0 21 + +fix 3 all nve/spin lattice yes +timestep 0.0001 + +# compute and output options + +compute out_mag all spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magx equal c_out_mag[1] +variable magy equal c_out_mag[2] +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo_style custom step time v_magx v_magy v_magz v_magnorm v_tmag v_emag pe etotal +thermo 50 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +run 2000 +# min_style spin +# min_modify alpha_damp 1.0 discrete_factor 10 +# minimize 1.0e-16 1.0e-16 10000 10000 diff --git a/examples/SPIN/dipole_spin/in.spin.iron_pppm b/examples/SPIN/dipole_spin/in.spin.iron_pppm new file mode 100644 index 0000000000..d4703a2959 --- /dev/null +++ b/examples/SPIN/dipole_spin/in.spin.iron_pppm @@ -0,0 +1,60 @@ +# bcc iron in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice bcc 2.8665 +region box block 0.0 5.0 0.0 5.0 0.0 5.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 55.845 +set group all spin 2.2 -1.0 0.0 0.0 +velocity all create 100 4928459 rot yes dist gaussian + +pair_style hybrid/overlay eam/alloy spin/exchange 3.5 +pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe +pair_coeff * * spin/exchange exchange 3.4 0.02726 0.2171 1.841 +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +fix 1 all precession/spin cubic 0.001 0.0005 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 +fix_modify 1 energy yes +fix 2 all langevin/spin 0.0 0.0 21 + +fix 3 all nve/spin lattice yes +timestep 0.0001 + +# compute and output options + +compute out_mag all spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magx equal c_out_mag[1] +variable magy equal c_out_mag[2] +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo_style custom step time v_magx v_magy v_magz v_magnorm v_tmag v_emag pe etotal +thermo 50 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +run 2000 +# min_style spin +# min_modify alpha_damp 1.0 discrete_factor 10 +# minimize 1.0e-16 1.0e-16 10000 10000 diff --git a/src/SPIN/pair_spin_dipole_cut.cpp b/src/SPIN/pair_spin_dipole_cut.cpp index b8927d62e9..360e3c47de 100644 --- a/src/SPIN/pair_spin_dipole_cut.cpp +++ b/src/SPIN/pair_spin_dipole_cut.cpp @@ -25,8 +25,7 @@ #include #include #include - -#include "pair_spin_dipolar_cut.h" +#include "pair_spin_dipole_cut.h" #include "atom.h" #include "comm.h" #include "neighbor.h" @@ -34,7 +33,6 @@ #include "neigh_request.h" #include "fix_nve_spin.h" #include "force.h" -#include "kspace.h" #include "math_const.h" #include "memory.h" #include "modify.h" @@ -45,17 +43,9 @@ using namespace LAMMPS_NS; using namespace MathConst; -#define EWALD_F 1.12837917 -#define EWALD_P 0.3275911 -#define A1 0.254829592 -#define A2 -0.284496736 -#define A3 1.421413741 -#define A4 -1.453152027 -#define A5 1.061405429 - /* ---------------------------------------------------------------------- */ -PairSpinDipolarCut::PairSpinDipolarCut(LAMMPS *lmp) : PairSpin(lmp), +PairSpinDipoleCut::PairSpinDipoleCut(LAMMPS *lmp) : PairSpin(lmp), lockfixnvespin(NULL) { single_enable = 0; @@ -77,7 +67,7 @@ lockfixnvespin(NULL) free all arrays ------------------------------------------------------------------------- */ -PairSpinDipolarCut::~PairSpinDipolarCut() +PairSpinDipoleCut::~PairSpinDipoleCut() { if (allocated) { memory->destroy(setflag); @@ -90,7 +80,7 @@ PairSpinDipolarCut::~PairSpinDipolarCut() global settings ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::settings(int narg, char **arg) +void PairSpinDipoleCut::settings(int narg, char **arg) { if (narg < 1 || narg > 2) error->all(FLERR,"Incorrect args in pair_style command"); @@ -122,22 +112,18 @@ void PairSpinDipolarCut::settings(int narg, char **arg) set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::coeff(int narg, char **arg) +void PairSpinDipoleCut::coeff(int narg, char **arg) { if (!allocated) allocate(); - // check if args correct - - if (strcmp(arg[2],"long") != 0) - error->all(FLERR,"Incorrect args in pair_style command"); - if (narg < 1 || narg > 4) + if (narg < 1 || narg > 3) error->all(FLERR,"Incorrect args in pair_style command"); int ilo,ihi,jlo,jhi; force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - double spin_long_cut_one = force->numeric(FLERR,arg[3]); + double spin_long_cut_one = force->numeric(FLERR,arg[2]); int count = 0; for (int i = ilo; i <= ihi; i++) { @@ -155,7 +141,7 @@ void PairSpinDipolarCut::coeff(int narg, char **arg) init specific to this pair style ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::init_style() +void PairSpinDipoleCut::init_style() { if (!atom->sp_flag) error->all(FLERR,"Pair spin requires atom/spin style"); @@ -191,7 +177,7 @@ void PairSpinDipolarCut::init_style() init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairSpinDipolarCut::init_one(int i, int j) +double PairSpinDipoleCut::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); @@ -204,7 +190,7 @@ double PairSpinDipolarCut::init_one(int i, int j) extract the larger cutoff if "cut" or "cut_coul" ------------------------------------------------------------------------- */ -void *PairSpinDipolarCut::extract(const char *str, int &dim) +void *PairSpinDipoleCut::extract(const char *str, int &dim) { if (strcmp(str,"cut") == 0) { dim = 0; @@ -227,7 +213,7 @@ void *PairSpinDipolarCut::extract(const char *str, int &dim) /* ---------------------------------------------------------------------- */ -void PairSpinDipolarCut::compute(int eflag, int vflag) +void PairSpinDipoleCut::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double rinv,r2inv,r3inv,rsq; @@ -338,7 +324,7 @@ void PairSpinDipolarCut::compute(int eflag, int vflag) removing erf(r)/r (for r in [0,rc]) from the kspace force ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) +void PairSpinDipoleCut::compute_single_pair(int ii, double fmi[3]) { int i,j,jj,jnum,itype,jtype; double rsq,rinv,r2inv,r3inv; @@ -406,7 +392,7 @@ void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::compute_dipolar(int i, int j, double eij[3], +void PairSpinDipoleCut::compute_dipolar(int i, int j, double eij[3], double fmi[3], double spi[4], double spj[4], double r3inv) { double sjdotr; @@ -426,7 +412,7 @@ void PairSpinDipolarCut::compute_dipolar(int i, int j, double eij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::compute_dipolar_mech(int i, int j, double eij[3], +void PairSpinDipoleCut::compute_dipolar_mech(int i, int j, double eij[3], double fi[3], double spi[3], double spj[3], double r2inv) { double sisj,sieij,sjeij; @@ -449,7 +435,7 @@ void PairSpinDipolarCut::compute_dipolar_mech(int i, int j, double eij[3], allocate all arrays ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::allocate() +void PairSpinDipoleCut::allocate() { allocated = 1; int n = atom->ntypes; @@ -467,7 +453,7 @@ void PairSpinDipolarCut::allocate() proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::write_restart(FILE *fp) +void PairSpinDipoleCut::write_restart(FILE *fp) { write_restart_settings(fp); @@ -486,7 +472,7 @@ void PairSpinDipolarCut::write_restart(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::read_restart(FILE *fp) +void PairSpinDipoleCut::read_restart(FILE *fp) { read_restart_settings(fp); @@ -512,7 +498,7 @@ void PairSpinDipolarCut::read_restart(FILE *fp) proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::write_restart_settings(FILE *fp) +void PairSpinDipoleCut::write_restart_settings(FILE *fp) { fwrite(&cut_spin_long_global,sizeof(double),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); @@ -522,7 +508,7 @@ void PairSpinDipolarCut::write_restart_settings(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::read_restart_settings(FILE *fp) +void PairSpinDipoleCut::read_restart_settings(FILE *fp) { if (comm->me == 0) { fread(&cut_spin_long_global,sizeof(double),1,fp); diff --git a/src/SPIN/pair_spin_dipole_cut.h b/src/SPIN/pair_spin_dipole_cut.h index ac17ac2120..77e452b179 100644 --- a/src/SPIN/pair_spin_dipole_cut.h +++ b/src/SPIN/pair_spin_dipole_cut.h @@ -13,24 +13,24 @@ #ifdef PAIR_CLASS -PairStyle(spin/dipolar/cut,PairSpinDipolarCut) +PairStyle(spin/dipole/cut,PairSpinDipoleCut) #else -#ifndef LMP_PAIR_SPIN_DIPOLAR_CUT_H -#define LMP_PAIR_SPIN_DIPOLAR_CUT_H +#ifndef LMP_PAIR_SPIN_DIPOLE_CUT_H +#define LMP_PAIR_SPIN_DIPOLE_CUT_H #include "pair_spin.h" namespace LAMMPS_NS { -class PairSpinDipolarCut : public PairSpin { +class PairSpinDipoleCut : public PairSpin { public: double cut_coul; double **sigma; - PairSpinDipolarCut(class LAMMPS *); - ~PairSpinDipolarCut(); + PairSpinDipoleCut(class LAMMPS *); + ~PairSpinDipoleCut(); void settings(int, char **); void coeff(int, char **); double init_one(int, int); diff --git a/src/SPIN/pair_spin_dipole_long.cpp b/src/SPIN/pair_spin_dipole_long.cpp index ef79717f63..45f08955de 100644 --- a/src/SPIN/pair_spin_dipole_long.cpp +++ b/src/SPIN/pair_spin_dipole_long.cpp @@ -21,7 +21,7 @@ #include #include -#include "pair_spin_dipolar_long.h" +#include "pair_spin_dipole_long.h" #include "atom.h" #include "comm.h" #include "neighbor.h" @@ -50,7 +50,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -PairSpinDipolarLong::PairSpinDipolarLong(LAMMPS *lmp) : PairSpin(lmp), +PairSpinDipoleLong::PairSpinDipoleLong(LAMMPS *lmp) : PairSpin(lmp), lockfixnvespin(NULL) { single_enable = 0; @@ -74,7 +74,7 @@ lockfixnvespin(NULL) free all arrays ------------------------------------------------------------------------- */ -PairSpinDipolarLong::~PairSpinDipolarLong() +PairSpinDipoleLong::~PairSpinDipoleLong() { if (allocated) { memory->destroy(setflag); @@ -87,7 +87,7 @@ PairSpinDipolarLong::~PairSpinDipolarLong() global settings ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::settings(int narg, char **arg) +void PairSpinDipoleLong::settings(int narg, char **arg) { if (narg < 1 || narg > 2) error->all(FLERR,"Incorrect args in pair_style command"); @@ -116,7 +116,7 @@ void PairSpinDipolarLong::settings(int narg, char **arg) set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::coeff(int narg, char **arg) +void PairSpinDipoleLong::coeff(int narg, char **arg) { if (!allocated) allocate(); @@ -149,7 +149,7 @@ void PairSpinDipolarLong::coeff(int narg, char **arg) init specific to this pair style ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::init_style() +void PairSpinDipoleLong::init_style() { if (!atom->sp_flag) error->all(FLERR,"Pair spin requires atom/spin style"); @@ -196,7 +196,7 @@ void PairSpinDipolarLong::init_style() init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairSpinDipolarLong::init_one(int i, int j) +double PairSpinDipoleLong::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); @@ -209,7 +209,7 @@ double PairSpinDipolarLong::init_one(int i, int j) extract the larger cutoff if "cut" or "cut_coul" ------------------------------------------------------------------------- */ -void *PairSpinDipolarLong::extract(const char *str, int &dim) +void *PairSpinDipoleLong::extract(const char *str, int &dim) { if (strcmp(str,"cut") == 0) { dim = 0; @@ -232,7 +232,7 @@ void *PairSpinDipolarLong::extract(const char *str, int &dim) /* ---------------------------------------------------------------------- */ -void PairSpinDipolarLong::compute(int eflag, int vflag) +void PairSpinDipoleLong::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double r,rinv,r2inv,rsq; @@ -366,7 +366,7 @@ void PairSpinDipolarLong::compute(int eflag, int vflag) update the pair interaction fmi acting on the spin ii ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) +void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) { int i,j,jj,jnum,itype,jtype; double r,rinv,r2inv,rsq; @@ -463,7 +463,7 @@ void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::compute_long(int i, int j, double eij[3], +void PairSpinDipoleLong::compute_long(int i, int j, double eij[3], double bij[4], double fmi[3], double spi[4], double spj[4]) { double sjeij,pre; @@ -486,7 +486,7 @@ void PairSpinDipolarLong::compute_long(int i, int j, double eij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::compute_long_mech(int i, int j, double eij[3], +void PairSpinDipoleLong::compute_long_mech(int i, int j, double eij[3], double bij[4], double fi[3], double spi[3], double spj[3]) { double sisj,sieij,sjeij,b2,b3; @@ -514,7 +514,7 @@ void PairSpinDipolarLong::compute_long_mech(int i, int j, double eij[3], allocate all arrays ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::allocate() +void PairSpinDipoleLong::allocate() { allocated = 1; int n = atom->ntypes; @@ -532,7 +532,7 @@ void PairSpinDipolarLong::allocate() proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::write_restart(FILE *fp) +void PairSpinDipoleLong::write_restart(FILE *fp) { write_restart_settings(fp); @@ -551,7 +551,7 @@ void PairSpinDipolarLong::write_restart(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::read_restart(FILE *fp) +void PairSpinDipoleLong::read_restart(FILE *fp) { read_restart_settings(fp); @@ -577,7 +577,7 @@ void PairSpinDipolarLong::read_restart(FILE *fp) proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::write_restart_settings(FILE *fp) +void PairSpinDipoleLong::write_restart_settings(FILE *fp) { fwrite(&cut_spin_long_global,sizeof(double),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); @@ -587,7 +587,7 @@ void PairSpinDipolarLong::write_restart_settings(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::read_restart_settings(FILE *fp) +void PairSpinDipoleLong::read_restart_settings(FILE *fp) { if (comm->me == 0) { fread(&cut_spin_long_global,sizeof(double),1,fp); diff --git a/src/SPIN/pair_spin_dipole_long.h b/src/SPIN/pair_spin_dipole_long.h index 191e983328..d3f9857716 100644 --- a/src/SPIN/pair_spin_dipole_long.h +++ b/src/SPIN/pair_spin_dipole_long.h @@ -13,24 +13,24 @@ #ifdef PAIR_CLASS -PairStyle(spin/dipolar/long,PairSpinDipolarLong) +PairStyle(spin/dipole/long,PairSpinDipoleLong) #else -#ifndef LMP_PAIR_SPIN_DIPOLAR_LONG_H -#define LMP_PAIR_SPIN_DIPOLAR_LONG_H +#ifndef LMP_PAIR_SPIN_DIPOLE_LONG_H +#define LMP_PAIR_SPIN_DIPOLE_LONG_H #include "pair_spin.h" namespace LAMMPS_NS { -class PairSpinDipolarLong : public PairSpin { +class PairSpinDipoleLong : public PairSpin { public: double cut_coul; double **sigma; - PairSpinDipolarLong(class LAMMPS *); - ~PairSpinDipolarLong(); + PairSpinDipoleLong(class LAMMPS *); + ~PairSpinDipoleLong(); void settings(int, char **); void coeff(int, char **); double init_one(int, int); diff --git a/src/SPIN/pair_spin_dipole_long_qsymp.cpp b/src/SPIN/pair_spin_dipole_long_qsymp.cpp index 4b07b540bc..b77c3cb80a 100644 --- a/src/SPIN/pair_spin_dipole_long_qsymp.cpp +++ b/src/SPIN/pair_spin_dipole_long_qsymp.cpp @@ -21,7 +21,7 @@ #include #include -#include "pair_spin_dipolar_long_qsymp.h" +#include "pair_spin_dipole_long_qsymp.h" #include "atom.h" #include "comm.h" #include "neighbor.h" @@ -50,7 +50,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -PairSpinDipolarLongQsymp::PairSpinDipolarLongQsymp(LAMMPS *lmp) : PairSpin(lmp), +PairSpinDipoleLongQsymp::PairSpinDipoleLongQsymp(LAMMPS *lmp) : PairSpin(lmp), lockfixnvespin(NULL) { single_enable = 0; @@ -75,7 +75,7 @@ lockfixnvespin(NULL) free all arrays ------------------------------------------------------------------------- */ -PairSpinDipolarLongQsymp::~PairSpinDipolarLongQsymp() +PairSpinDipoleLongQsymp::~PairSpinDipoleLongQsymp() { if (allocated) { memory->destroy(setflag); @@ -88,7 +88,7 @@ PairSpinDipolarLongQsymp::~PairSpinDipolarLongQsymp() global settings ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::settings(int narg, char **arg) +void PairSpinDipoleLongQsymp::settings(int narg, char **arg) { if (narg < 1 || narg > 2) error->all(FLERR,"Incorrect args in pair_style command"); @@ -117,7 +117,7 @@ void PairSpinDipolarLongQsymp::settings(int narg, char **arg) set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::coeff(int narg, char **arg) +void PairSpinDipoleLongQsymp::coeff(int narg, char **arg) { if (!allocated) allocate(); @@ -150,7 +150,7 @@ void PairSpinDipolarLongQsymp::coeff(int narg, char **arg) init specific to this pair style ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::init_style() +void PairSpinDipoleLongQsymp::init_style() { if (!atom->sp_flag) error->all(FLERR,"Pair spin requires atom/spin style"); @@ -193,7 +193,7 @@ void PairSpinDipolarLongQsymp::init_style() init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairSpinDipolarLongQsymp::init_one(int i, int j) +double PairSpinDipoleLongQsymp::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); @@ -206,7 +206,7 @@ double PairSpinDipolarLongQsymp::init_one(int i, int j) extract the larger cutoff if "cut" or "cut_coul" ------------------------------------------------------------------------- */ -void *PairSpinDipolarLongQsymp::extract(const char *str, int &dim) +void *PairSpinDipoleLongQsymp::extract(const char *str, int &dim) { if (strcmp(str,"cut") == 0) { dim = 0; @@ -229,7 +229,7 @@ void *PairSpinDipolarLongQsymp::extract(const char *str, int &dim) /* ---------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::compute(int eflag, int vflag) +void PairSpinDipoleLongQsymp::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double r,rinv,r2inv,rsq; @@ -390,7 +390,7 @@ void PairSpinDipolarLongQsymp::compute(int eflag, int vflag) removing erf(r)/r (for r in [0,rc]) from the kspace force ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::compute_single_pair(int ii, double fmi[3]) +void PairSpinDipoleLongQsymp::compute_single_pair(int ii, double fmi[3]) { int i,j,jj,jnum,itype,jtype; double rinv,r2inv,r3inv,rsq; @@ -470,7 +470,7 @@ void PairSpinDipolarLongQsymp::compute_single_pair(int ii, double fmi[3]) compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::compute_long(int i, int j, double rij[3], +void PairSpinDipoleLongQsymp::compute_long(int i, int j, double rij[3], double bij[4], double fmi[3], double spi[4], double spj[4]) { double sjdotr; @@ -492,7 +492,7 @@ void PairSpinDipolarLongQsymp::compute_long(int i, int j, double rij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::compute_long_mech(int i, int j, double rij[3], +void PairSpinDipoleLongQsymp::compute_long_mech(int i, int j, double rij[3], double bij[4], double fi[3], double spi[3], double spj[3]) { double sdots,sidotr,sjdotr,b2,b3; @@ -522,7 +522,7 @@ void PairSpinDipolarLongQsymp::compute_long_mech(int i, int j, double rij[3], allocate all arrays ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::allocate() +void PairSpinDipoleLongQsymp::allocate() { allocated = 1; int n = atom->ntypes; @@ -540,7 +540,7 @@ void PairSpinDipolarLongQsymp::allocate() proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::write_restart(FILE *fp) +void PairSpinDipoleLongQsymp::write_restart(FILE *fp) { write_restart_settings(fp); @@ -559,7 +559,7 @@ void PairSpinDipolarLongQsymp::write_restart(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::read_restart(FILE *fp) +void PairSpinDipoleLongQsymp::read_restart(FILE *fp) { read_restart_settings(fp); @@ -585,7 +585,7 @@ void PairSpinDipolarLongQsymp::read_restart(FILE *fp) proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::write_restart_settings(FILE *fp) +void PairSpinDipoleLongQsymp::write_restart_settings(FILE *fp) { fwrite(&cut_spin_long_global,sizeof(double),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); @@ -595,7 +595,7 @@ void PairSpinDipolarLongQsymp::write_restart_settings(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinDipolarLongQsymp::read_restart_settings(FILE *fp) +void PairSpinDipoleLongQsymp::read_restart_settings(FILE *fp) { if (comm->me == 0) { fread(&cut_spin_long_global,sizeof(double),1,fp); diff --git a/src/SPIN/pair_spin_dipole_long_qsymp.h b/src/SPIN/pair_spin_dipole_long_qsymp.h index 28867b5229..fb5915daa2 100644 --- a/src/SPIN/pair_spin_dipole_long_qsymp.h +++ b/src/SPIN/pair_spin_dipole_long_qsymp.h @@ -13,24 +13,24 @@ #ifdef PAIR_CLASS -PairStyle(spin/dipolar/long/qsymp,PairSpinDipolarLongQsymp) +PairStyle(spin/dipole/long/qsymp,PairSpinDipoleLongQsymp) #else -#ifndef LMP_PAIR_SPIN_DIPOLAR_LONG_QSYMP_H -#define LMP_PAIR_SPIN_DIPOLAR_LONG_QSYMP_H +#ifndef LMP_PAIR_SPIN_DIPOLE_LONG_QSYMP_H +#define LMP_PAIR_SPIN_DIPOLE_LONG_QSYMP_H #include "pair_spin.h" namespace LAMMPS_NS { -class PairSpinDipolarLongQsymp : public PairSpin { +class PairSpinDipoleLongQsymp : public PairSpin { public: double cut_coul; double **sigma; - PairSpinDipolarLongQsymp(class LAMMPS *); - ~PairSpinDipolarLongQsymp(); + PairSpinDipoleLongQsymp(class LAMMPS *); + virtual ~PairSpinDipoleLongQsymp(); void settings(int, char **); void coeff(int, char **); double init_one(int, int); From 5b71b3fc57f8cc9bd935202f35db0538006e37e9 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Thu, 16 May 2019 21:51:24 -0600 Subject: [PATCH 35/90] Added bispectrum compute --- src/SNAP/pair_snap.cpp | 480 +++++------------------------------------ src/SNAP/pair_snap.h | 2 + 2 files changed, 56 insertions(+), 426 deletions(-) diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 4913044369..f3b678971d 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -192,11 +192,13 @@ void PairSNAP::compute_regular(int eflag, int vflag) if (beta_max < list->inum) { memory->grow(beta,list->inum,ncoeff,"PairSNAP:beta"); + memory->grow(bispectrum,list->inum,ncoeff,"PairSNAP:bispectrum"); beta_max = list->inum; } // compute dE_i/dB_i = beta_i for all i in list + compute_bispectrum(); compute_beta(); numneigh = list->numneigh; @@ -251,10 +253,6 @@ void PairSNAP::compute_regular(int eflag, int vflag) snaptr->compute_ui(ninside); snaptr->compute_zi(); - if (quadraticflag) { - snaptr->compute_bi(); - snaptr->copy_bi2bvec(); - } // for neighbors of I within cutoff: // compute Fij = dEi/dRj = -dEi/dRi @@ -269,31 +267,6 @@ void PairSNAP::compute_regular(int eflag, int vflag) snaptr->compute_duidrj(snaptr->rij[jj], snaptr->wj[jj],snaptr->rcutij[jj]); -// // quadratic contributions - -// if (quadraticflag) { -// int k = ncoeff+1; -// for (int icoeff = 0; icoeff < ncoeff; icoeff++) { -// double bveci = snaptr->bvec[icoeff]; -// double fack = coeffi[k]*bveci; -// double* dbveci = snaptr->dbvec[icoeff]; -// fij[0] += fack*dbveci[0]; -// fij[1] += fack*dbveci[1]; -// fij[2] += fack*dbveci[2]; -// k++; -// for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { -// double facki = coeffi[k]*bveci; -// double fackj = coeffi[k]*snaptr->bvec[jcoeff]; -// double* dbvecj = snaptr->dbvec[jcoeff]; - -// fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; -// fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; -// fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; -// k++; -// } -// } -// } - snaptr->compute_deidrj(fij); f[i][0] += fij[0]; @@ -320,10 +293,6 @@ void PairSNAP::compute_regular(int eflag, int vflag) double* coeffi = coeffelem[ielem]; evdwl = coeffi[0]; - if (!quadraticflag) { - snaptr->compute_bi(); - snaptr->copy_bi2bvec(); - } // E = beta.B + 0.5*B^t.alpha.B // coeff[k] = beta[k-1] or @@ -332,21 +301,9 @@ void PairSNAP::compute_regular(int eflag, int vflag) // linear contributions - for (int k = 1; k <= ncoeff; k++) - evdwl += coeffi[k]*snaptr->bvec[k-1]; + for (int k = 0; k < ncoeff; k++) + evdwl += beta[ii][k]*bispectrum[ii][k]; - // quadratic contributions - - if (quadraticflag) { - int k = ncoeff+1; - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bveci = snaptr->bvec[icoeff]; - evdwl += 0.5*coeffi[k++]*bveci*bveci; - for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - evdwl += coeffi[k++]*bveci*snaptr->bvec[jcoeff]; - } - } - } ev_tally_full(i,2.0*evdwl,0.0,0.0,0.0,0.0,0.0); } @@ -355,383 +312,6 @@ void PairSNAP::compute_regular(int eflag, int vflag) if (vflag_fdotr) virial_fdotr_compute(); } - -/* ---------------------------------------------------------------------- - This version is optimized for threading, micro-load balancing - ---------------------------------------------------------------------- */ - -void PairSNAP::compute_optimized(int eflag, int vflag) -{ - // if reneighboring took place do load_balance if requested - if (do_load_balance > 0 && - (neighbor->ncalls != ncalls_neigh)) { - ghostinum = 0; - // reset local ghost neighbor lists - ncalls_neigh = neighbor->ncalls; - if (ilistmask_max < list->inum) { - memory->grow(ilistmask,list->inum,"PairSnap::ilistmask"); - ilistmask_max = list->inum; - } - for (int i = 0; i < list->inum; i++) - ilistmask[i] = 1; - - //multiple passes for loadbalancing - for (int i = 0; i < do_load_balance; i++) - load_balance(); - } - - int numpairs = 0; - for (int ii = 0; ii < list->inum; ii++) { - if ((do_load_balance <= 0) || ilistmask[ii]) { - int i = list->ilist[ii]; - int jnum = list->numneigh[i]; - numpairs += jnum; - } - } - - if (do_load_balance) - for (int ii = 0; ii < ghostinum; ii++) { - int i = ghostilist[ii]; - int jnum = ghostnumneigh[i]; - numpairs += jnum; - } - - // optimized schedule setting - - int time_dynamic = 0; - int time_guided = 0; - - if (schedule_user == 0) schedule_user = 4; - - switch (schedule_user) { - case 1: - omp_set_schedule(omp_sched_static,1); - break; - case 2: - omp_set_schedule(omp_sched_dynamic,1); - break; - case 3: - omp_set_schedule(omp_sched_guided,2); - break; - case 4: - omp_set_schedule(omp_sched_auto,0); - break; - case 5: - if (numpairs < 8*nthreads) omp_set_schedule(omp_sched_dynamic,1); - else if (schedule_time_guided < 0.0) { - omp_set_schedule(omp_sched_guided,2); - if (!eflag && !vflag) time_guided = 1; - } else if (schedule_time_dynamic<0.0) { - omp_set_schedule(omp_sched_dynamic,1); - if (!eflag && !vflag) time_dynamic = 1; - } else if (schedule_time_guidedcreate(pairs_tid_unique,numpairs,4,"numpairs"); - pairs = pairs_tid_unique; - } - - if (!use_shared_arrays) { - numpairs = 0; - for (int ii = 0; ii < list->inum; ii++) { - if ((do_load_balance <= 0) || ilistmask[ii]) { - int i = list->ilist[ii]; - int jnum = list->numneigh[i]; - for (int jj = 0; jjx; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - - numneigh = list->numneigh; - firstneigh = list->firstneigh; - -#ifdef TIMING_INFO - // only update micro timers after setup - static int count=0; - if (count<2) { - sna[tid]->timers[0] = 0; - sna[tid]->timers[1] = 0; - sna[tid]->timers[2] = 0; - sna[tid]->timers[3] = 0; - sna[tid]->timers[4] = 0; - } - count++; -#endif - - // did thread start working on interactions of new atom - int iold = -1; - - double starttime, endtime; - if (time_dynamic || time_guided) - starttime = MPI_Wtime(); - -#if defined(_OPENMP) -#pragma omp for schedule(runtime) -#endif - for (int iijj = 0; iijj < numpairs; iijj++) { - int i = 0; - if (use_shared_arrays) { - i = i_pairs[iijj][0]; - if (iold != i) { - set_sna_to_shared(tid,i_pairs[iijj][3]); - ielem = map[type[i]]; - } - iold = i; - } else { - i = pairs[iijj][0]; - if (iold != i) { - iold = i; - const double xtmp = x[i][0]; - const double ytmp = x[i][1]; - const double ztmp = x[i][2]; - const int itype = type[i]; - ielem = map[itype]; - const double radi = radelem[ielem]; - - if (i < nlocal) { - jlist = firstneigh[i]; - jnum = numneigh[i]; - } else { - jlist = ghostneighs+ghostfirstneigh[i]; - jnum = ghostnumneigh[i]; - } - - // insure rij, inside, wj, and rcutij are of size jnum - - sna[tid]->grow_rij(jnum); - - // rij[][3] = displacements between atom I and those neighbors - // inside = indices of neighbors of I within cutoff - // wj = weights of neighbors of I within cutoff - // rcutij = cutoffs of neighbors of I within cutoff - // note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi - - ninside = 0; - for (jj = 0; jj < jnum; jj++) { - int j = jlist[jj]; - j &= NEIGHMASK; - delx = x[j][0] - xtmp; //unitialised - dely = x[j][1] - ytmp; - delz = x[j][2] - ztmp; - rsq = delx*delx + dely*dely + delz*delz; - jtype = type[j]; - int jelem = map[jtype]; - - if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { //unitialised - sna[tid]->rij[ninside][0] = delx; - sna[tid]->rij[ninside][1] = dely; - sna[tid]->rij[ninside][2] = delz; - sna[tid]->inside[ninside] = j; - sna[tid]->wj[ninside] = wjelem[jelem]; - sna[tid]->rcutij[ninside] = (radi + radelem[jelem])*rcutfac; - ninside++; - - // update index list with inside index - pairs[iijj + (jj - pairs[iijj][1])][2] = - ninside-1; //unitialised - } - } - - // compute Ui and Zi for atom I - - sna[tid]->compute_ui(ninside); //unitialised - sna[tid]->compute_zi(); - } - } - if (quadraticflag) { - sna[tid]->compute_bi(); - sna[tid]->copy_bi2bvec(); - } - - // for neighbors of I within cutoff: - // compute dUi/drj and dBi/drj - // Fij = dEi/dRj = -dEi/dRi => add to Fi, subtract from Fj - - // entry into loop if inside index is set - - double* coeffi = coeffelem[ielem]; - - if (pairs[iijj][2] >= 0) { - jj = pairs[iijj][2]; - int j = sna[tid]->inside[jj]; - sna[tid]->compute_duidrj(sna[tid]->rij[jj], - sna[tid]->wj[jj],sna[tid]->rcutij[jj]); - - sna[tid]->compute_dbidrj(); - sna[tid]->copy_dbi2dbvec(); - - fij[0] = 0.0; - fij[1] = 0.0; - fij[2] = 0.0; - - // linear contributions - - for (k = 1; k <= ncoeff; k++) { - double bgb = coeffi[k]; - fij[0] += bgb*sna[tid]->dbvec[k-1][0]; - fij[1] += bgb*sna[tid]->dbvec[k-1][1]; - fij[2] += bgb*sna[tid]->dbvec[k-1][2]; - } - - // quadratic contributions - - if (quadraticflag) { - int k = ncoeff+1; - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bveci = sna[tid]->bvec[icoeff]; - double fack = coeffi[k]*bveci; - double* dbveci = sna[tid]->dbvec[icoeff]; - fij[0] += fack*sna[tid]->dbvec[icoeff][0]; - fij[1] += fack*sna[tid]->dbvec[icoeff][1]; - fij[2] += fack*sna[tid]->dbvec[icoeff][2]; - k++; - for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - double facki = coeffi[k]*bveci; - double fackj = coeffi[k]*sna[tid]->bvec[jcoeff]; - double* dbvecj = sna[tid]->dbvec[jcoeff]; - fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; - fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; - fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; - k++; - } - } - } - -#if defined(_OPENMP) -#pragma omp critical -#endif - { - f[i][0] += fij[0]; - f[i][1] += fij[1]; - f[i][2] += fij[2]; - f[j][0] -= fij[0]; - f[j][1] -= fij[1]; - f[j][2] -= fij[2]; - - // tally per-atom virial contribution - - if (vflag) - ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0, - fij[0],fij[1],fij[2], - -sna[tid]->rij[jj][0],-sna[tid]->rij[jj][1], - -sna[tid]->rij[jj][2]); - } - } - - // evdwl = energy of atom I, sum over coeffs_k * Bi_k - // only call this for first pair of each atom i - // if atom has no pairs, eatom=0, which is wrong - - if (eflag&&pairs[iijj][1] == 0) { - evdwl = coeffi[0]; - - if (!quadraticflag) { - sna[tid]->compute_bi(); - sna[tid]->copy_bi2bvec(); - } - - // E = beta.B + 0.5*B^t.alpha.B - // coeff[k] = beta[k-1] or - // coeff[k] = alpha_ii or - // coeff[k] = alpha_ij = alpha_ji, j != i - - // linear contributions - - for (int k = 1; k <= ncoeff; k++) - evdwl += coeffi[k]*sna[tid]->bvec[k-1]; - - // quadratic contributions - - if (quadraticflag) { - int k = ncoeff+1; - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bveci = sna[tid]->bvec[icoeff]; - evdwl += 0.5*coeffi[k++]*bveci*bveci; - for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - evdwl += coeffi[k++]*bveci*sna[tid]->bvec[jcoeff]; - } - } - } - -#if defined(_OPENMP) -#pragma omp critical -#endif - ev_tally_full(i,2.0*evdwl,0.0,0.0,0.0,0.0,0.0); - } - - } - if (time_dynamic || time_guided) - endtime = MPI_Wtime(); - if (time_dynamic) schedule_time_dynamic = endtime - starttime; - if (time_guided) schedule_time_guided = endtime - starttime; - if (!use_shared_arrays) memory->destroy(pairs); - - }// end of pragma omp parallel - - if (vflag_fdotr) virial_fdotr_compute(); - -} - inline int PairSNAP::equal(double* x,double* y) { double dist2 = @@ -1325,14 +905,61 @@ void PairSNAP::compute_beta() void PairSNAP::compute_bispectrum() { - int i; + int i,j,jnum,ninside; + double delx,dely,delz,rsq; + int *jlist,*numneigh,**firstneigh; + + double **x = atom->x; int *type = atom->type; + class SNA* snaptr = sna[0]; for (int ii = 0; ii < list->inum; ii++) { i = list->ilist[ii]; + + const double xtmp = x[i][0]; + const double ytmp = x[i][1]; + const double ztmp = x[i][2]; const int itype = type[i]; const int ielem = map[itype]; - double* coeffi = coeffelem[ielem]; + const double radi = radelem[ielem]; + + jlist = list->firstneigh[i]; + jnum = list->numneigh[i]; + + // insure rij, inside, wj, and rcutij are of size jnum + + snaptr->grow_rij(jnum); + + // rij[][3] = displacements between atom I and those neighbors + // inside = indices of neighbors of I within cutoff + // wj = weights for neighbors of I within cutoff + // rcutij = cutoffs for neighbors of I within cutoff + // note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi + + ninside = 0; + for (int jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + delx = x[j][0] - xtmp; + dely = x[j][1] - ytmp; + delz = x[j][2] - ztmp; + rsq = delx*delx + dely*dely + delz*delz; + int jtype = type[j]; + int jelem = map[jtype]; + + if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { + snaptr->rij[ninside][0] = delx; + snaptr->rij[ninside][1] = dely; + snaptr->rij[ninside][2] = delz; + snaptr->inside[ninside] = j; + snaptr->wj[ninside] = wjelem[jelem]; + snaptr->rcutij[ninside] = (radi + radelem[jelem])*rcutfac; + ninside++; + } + } + + snaptr->compute_ui(ninside); + snaptr->compute_zi(); snaptr->compute_bi(); snaptr->copy_bi2bvec(); @@ -1470,6 +1097,7 @@ void PairSNAP::coeff(int narg, char **arg) memory->destroy(wjelem); memory->destroy(coeffelem); memory->destroy(beta); + memory->destroy(bispectrum); } char* type1 = arg[0]; diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h index 94d21162e2..1453076b23 100644 --- a/src/SNAP/pair_snap.h +++ b/src/SNAP/pair_snap.h @@ -56,6 +56,7 @@ protected: void build_per_atom_arrays(); void compute_beta(); + void compute_bispectrum(); int schedule_user; double schedule_time_guided; @@ -102,6 +103,7 @@ protected: double *wjelem; // elements weights double **coeffelem; // element bispectrum coefficients double** beta; // betas for all atoms in list + double** bispectrum; // bispectrum components for all atoms in list int *map; // mapping from atom types to elements int twojmax, diagonalstyle, switchflag, bzeroflag; double rfac0, rmin0, wj1, wj2; From 51a6bfd579722cce8bc8f00de63ba08ff37ca9e4 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Thu, 16 May 2019 22:01:45 -0600 Subject: [PATCH 36/90] Added bispectrum compute --- src/SNAP/pair_snap.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index f3b678971d..7c81eb0e8a 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -102,6 +102,8 @@ PairSNAP::PairSNAP(LAMMPS *lmp) : Pair(lmp) sna = NULL; beta_max = 0; + beta = NULL; + bispectrum = NULL; } /* ---------------------------------------------------------------------- */ From 803e0631c5e51ed5bdacebb6dbec9e5118d36954 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Thu, 16 May 2019 22:11:06 -0600 Subject: [PATCH 37/90] Added bispectrum compute --- src/SNAP/pair_snap.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 7c81eb0e8a..86e709ba03 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -119,8 +119,9 @@ PairSNAP::~PairSNAP() memory->destroy(radelem); memory->destroy(wjelem); memory->destroy(coeffelem); - memory->destroy(beta); } + memory->destroy(beta); + memory->destroy(bispectrum); // Need to set this because restart not handled by PairHybrid @@ -1098,9 +1099,9 @@ void PairSNAP::coeff(int narg, char **arg) memory->destroy(radelem); memory->destroy(wjelem); memory->destroy(coeffelem); - memory->destroy(beta); - memory->destroy(bispectrum); } + memory->destroy(beta); + memory->destroy(bispectrum); char* type1 = arg[0]; char* type2 = arg[1]; From fbb78e7b78a38a1734bc0abd37e0e3000fe07588 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 17 May 2019 15:04:14 -0600 Subject: [PATCH 38/90] Commit JT 051719 - removed qsymp pair style - cleaned doc (pair/spin/diole and kspace_style) - cleaned kspace .cpp/h files --- doc/src/Eqs/pair_spin_dipole.jpg | Bin 0 -> 38411 bytes doc/src/Eqs/pair_spin_dipole.tex | 42 ++ doc/src/kspace_style.txt | 24 +- doc/src/pair_spin_dipole.txt | 214 +------ examples/SPIN/dipole_spin/in.spin.iron_ewald | 9 +- examples/SPIN/dipole_spin/in.spin.iron_pppm | 7 +- src/.gitignore | 12 + src/KSPACE/ewald_dipole.cpp | 1 - src/KSPACE/ewald_dipole_spin.cpp | 5 - src/KSPACE/pppm_dipole_spin.cpp | 4 +- src/SPIN/pair_spin_dipole_cut.cpp | 141 +++-- src/SPIN/pair_spin_dipole_long.cpp | 198 +++--- src/SPIN/pair_spin_dipole_long.h | 2 +- src/SPIN/pair_spin_dipole_long_qsymp.cpp | 606 ------------------- src/SPIN/pair_spin_dipole_long_qsymp.h | 100 --- src/SPIN/pair_spin_exchange.cpp | 2 +- 16 files changed, 294 insertions(+), 1073 deletions(-) create mode 100644 doc/src/Eqs/pair_spin_dipole.jpg create mode 100644 doc/src/Eqs/pair_spin_dipole.tex delete mode 100644 src/SPIN/pair_spin_dipole_long_qsymp.cpp delete mode 100644 src/SPIN/pair_spin_dipole_long_qsymp.h diff --git a/doc/src/Eqs/pair_spin_dipole.jpg b/doc/src/Eqs/pair_spin_dipole.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e648547ec3de18eaf870e976ee386c9b4b9885f1 GIT binary patch literal 38411 zcmc$_WmsH6wkX=Ty96g_aQ7e~xVyW%OK=SiO>lR28h3XK?he7-HC!@tX3orfGw0s( z=e_Fs_O4o5dw2D!RclqhExv66P$fkrL;+x6V1S|b58!PDAOwH_2me#w3*>u+f`x*D zgoJ{Jfq{laghxa~fJZ<;LPkeLLPkSIKtRPtMZ>_v!oosC`GA9siGz-bh51Ja7{ogd zBorJJ6dWcJ0utu`y1exO&|tyHA!#AN&;a0QU=V0vZ+!p)02lxq;?HpZUZ9{MAYs74 zVBfKr{|Nsp!P_zb5#pT(6#^9i0DD#ZJKH}rf>`jOFaDwbe{EW&0U*GLiINDy9sr~GSUlC$eyAb;(` zu(3y=ojl24l68NyB4pbS5dvKJ*zg=~mL;L@BHMn=z|13x0P!k^eKr0U{{5hbk$(Y! z=}`s!XioV9g(0IiR!DEfa*WprFKN<}2`~oOU#TB|nd0=9rGYGI5y1};}HT~56PfA0TS+ywa1#gyni0xYm*rff*WbM+&c0Z2wu z=@9BmP{~VxmwcZzaz7~f1r|J*I5;ovl(}${CQ&@7FQ?yAiVaw>c0!5sqjLScI44wH z6^$>fQTL`E)n6U0FavY2Si3E_w}d};H>r(+J^GzdgsyUP&;O(HKW%pSVJSLF#e8ka z%bDl`wn|pFxj=Bo6v5vM zE7XyEbcRBmra+L8Va$fez#S74f|U3f(T%8!tn4EHF6N&K^A!MtP1O-`D|CGVUWpR#Kk& z1^^%w2LQ*M<{Uyl`6u!J-62Mngzas7|K57jiM}unY{D?{xD&vk3ZoU||2NTJTG=1| z;|%wLnFK)Ma(%@hr>;{A3oyR%;!iJL=28C_3IAgk*<5?X-;O#s%#dsX2q23>|JRxP zKXL=+Kf+xb1IZtcv;1A zP;>|RCH)b@9~F@U)MaW@GMIWy*(2CjG{lce_K!}Q(!d(H!nO`u+Ue9 zGEpEk96v^Zdxg_|A=u2x%I^9ITO+@~KBSZ%n2>?917k)b(pLJx9zYgqIBS^@sJ}t! z2Ox&$c86i)G5GOs6}$r>valeiCnF>jX!?eIKEnQ)fk;08Dd!`M22rPk|8HivS#? zuaHgu8?8`odm+~Ba;8q&W!O$j>1e;4D+!eW07wlgtK_Ijqa>g@E{)z>0jw%GNEq7Xo7j86SnHu}Syl`J>4UlZ#_Yoz*O);Pmpl z{g7ULe-xUKn)jFbzJS3C;yF78Sf)aPCdZ5|hJoRhsX;FQrIE*v#>{xXW~-8fy2WTj zvO6%9hBbJ=AU%1&B8MEot%oEq3UI<0z6+il0E)3MoP?~aF=L%$$VR&(%hE3zl5)dU zMq@%d0f=Yhz|40qHt+ z!N6c3Ai!b%;_^d6y?g)A08AKE3@q%AOlau(A2{Smm`TaVDJZ}AvAuiyuUHpR1Th*yTHW4b46uO#ad#DBaj0t;!#yDr{U@d-75`*ziF$4iG%b@2XxTNH}kP%{{ap;yElxZH8u^1hP!p@-k zaIQc!jld2geKJ@M2;!}V;tfS1>x?Y=o37N)d>u;jZ-9tQr%+0g6~dwczWF;NpQy&V zAv6<0{0V(AUtOXZfYhwRCZc_BPy-@HyF4S`-zx75a&E?Vw9?xzZGWwC7iPYtQ2V7& zoA-UCpYNUfEbzf+42OL|WdH+fjxR^irBJ_sSZhu&1|U@Eh=n0VLmfEQZCC&Cax$Fa z*_7Z7y)u5v*JYwP)AA(1#B5EAe&yh8SN^TMv0b7coQ}Px0}Mh%p$9}^62|6Qx}o}{ zNs6V6)3&XrPxs+>IM%qCyyEH@q;HCRMqC4k zoqR?(7@`rz*=F0|%JbBBR42VxyYM+^MLl_B7@A)+zpI!(TD)+No$c~xulH?~f zN^jQT&>LV}=7EsK9Hi`&KG>|w<1-~iLN#rlY3wGTB8a{aq1T^QRpH5^}d(;MW+W$6aMt z@ynNLsJ*G59vj{O1cnB346{8e7NKBVzT_BVMU@XhWH>q4UTL46L-Ce=>lMgZIq6}> zJE%ObH4`4wXqDilSi^4x>tttZ=w>dzM*6%)7+sNU?v}7R*hI2l7&!}`c@xtvKTkk6 zKrDobcHkA8vU+^R4ph;$s9Fjl-Ms$LckCuVhsRYf>HpyPgwyrA&2ol5+(mc5kmycL zRH+!XRGYCCUZneX?=X`md%u%>MK9GSl|tIoD7(j(H-Oo#dbIY`(v)b9J4aNx=XG=? z>(WFs-S2cOuUD@5$0vu13#LO|MxS$FBk!ek%7T`e!s?OZ>Ll;+U|v7_?IbMy&(u~ zT4@PaI0>n0FD|eqg!nAg1lK!zvZbUJ&_2M|N zr7Z$hlUfCj6OX0f3p|sp=o_HUM0J%#bjeI^tGxijM6+Rqu4aCmbmcBmR^b%kaK@ol~fwJ(~agHc!6T9MDOkR(I>M3u6T)!BOuAY4v*iu!(3(MDfj zmvs0=^nKxc8MS2^`4FYM*)ilPr_TctTY_p^$7DB+D#f=5M_LkuovRqMigtAh-PVdd zP+D7-WhIns-X3`aK&+33rq1uQg~GQt{rapUt&R}jb`?XHBwiLS1`cCC8AWTshV=JJ8W=R>oZQn%YtaQsXK^j``#X=7CcCFF^e3fx zl=i~Tsy9H0(J4<2o;4!Iq6i8uBGU=3VoSneFu;wZuxjvb_37I$k_byqG3fzJ^PN** zBlqklld?t33iBSa?Enh~&?2&@E-C^o~7%I;S`ThjjQk_tJyq8WOtMgn|0RR?yzj+ENb=3+gI!0pN>P&g=cmcI>k_pHHN z;g6Z9v%970Y}|%P)7;{CoYHI{TVBpl+D#rsomXJg+095V9=}pqmw9E{#s)F z!}8O8G{gi9G9Qm`HW$*d8TRpRw!&bw=CBfS@;5yn4Lxgb^EqV3f(Fle3?~r z3;ApReL{pIM|B>RJi9T6to2WX5H&o~#ukOX?GjtesW*W6i0PLu2+1h{0y1pL47ajS zgHyx&Ts@mY<$h_S(4FhQ*|e%Pb)mU$zxDn&K8bodEXF+vUlyMX2p?Nth!gO?0V8## zOD#J&7x0_@#p`Lh$nIma&K-x0f;-j=NX&^@bH_qZfdDO#k6BEtJAd;%QnKeBq8fa!DZKvu0*y;%YvR*Sh%%+Y$n|J{7Yg}M!Tvp zf>A$l(<69kb@X;9O%BPWhOuR3M6QTHcVB6t7{&8SB#W@{%>9Sw5b~u5l-Kga$yufP zEUx{#y}x-rGy5|OR&eA*1*H=%CDUD??_cJjwKYC`SsMUfww-XVuSC(%F`Ogpi&6*- zvw4lTsZO^EK|(GB-w7Fm2D0aPtQElCDc?iW(&EvS1XfXgmsoboyT`u+iKf6m(rd8N zu`l#W#Gwt=8d^BIgz47VcqZzq<$$^pRCy%EA}ktBc+c#)QHApE_IXtJ@~O7QpM(dO%~?Gj)xX?o z{`Lq{Q;;1hwrp4J%q-LUsZ#Z;6}{~GuQ)_$#Jn`yTG838ntf5Am?w0pN4kv^C|adz zKa-+=zfIHY1Gjv+M|uBT@$29+v`^_{k=a0*r?+cM0zzcHd#q2;#V5gPfuyrK&121& z88Hcd_EuXjga@nJr^Zetb>uc1h=CTPsN@}^7LyhpCi4(V@ zWfD_ZPaot4L7ET0*|0*$Kn47v?W=8(@=P^TyQ5NVTa!4MJ!<3az>n0AF+JC#15GAt z^Q^6GjpzS8@v_CV|7hg(A!mqVnCmR%uRN8Rx>sF z?|lC5_m{d}wv!yIuXiB+0)5gIJ~7=ghdvtA%*y1r`w#uHf!~l(TDOY*he8?f&hnkP zFB;4|gGf(Pz4y^8g}HD^{E~_1ZgHbtHoZG~3?CwO?;|lWMZmsg!hX>l)dyA^Pi)lkT$V$g)ujJ$<0Dkhz+$yCZk z+c_Wjz1`Odr-AZ=#`h;sHxzIs<+~FDA}vkTjLTSd5%~w*nTD7dD=U$M4^|gP91Sg( zLbjLOF-h|V{N>9-bj+>5*YQ)3JLWFUB zZJ#kGlDZIL?vklSO|Dk2p+eNNUYEr?4cYph&yAz487gPaF0*xBbpf41Dx3o#NO$H68O(qJ)A#aKtl`}Qj5!(MIs7+A>< z!|j9U-lWL^nA;uI6lpqZJ;r)@PXg|;EcU7@Euwm$k? z=8Eo}h|ypDVxLvV|3ayzd`2qA1xiX81f!yJUi^=z~;Ju|1H%2*`X z@WH7l_?y5_*Q~lxzQJe z2a5MV!GBSxy~ho}-V>P6u+T_w(9jU?0W)w2NHhQxItB?dDyg7?fdl48GM2CYF*(re zit(UsEOI7RHX(gO$Jm;wX?dl9gxuPht&1 z*+<(SgP^q(je=-gI8~2?m)LT1%>uy2= zwdk14#|;=g`~&57A3eghV?|S?zE!k-Zqq|%Pe62zMWm9qOj27T`P$rx{*)k zWhRFZqUhdh&gpW++6pQ1fo`Bn-`dhJ_Bl8S`ZxLPWk<6?!z9?=M((S3*055(+_#`Q z@qG1?-#Qm;JSJ7CJi@=@?C$k2-KDiRkW0ej!6uWM?-5PnF)K^wVtG!XU*Q8YY}X+$ zOq9gU-few92>{=cMzFDLC2~iO7&7TjmYVIc6|=Dxi@u*_nH{($N78u`X__G0^`4wl zHkU(^bs;V`qAVyZi%peGjo?r7J^|MYJsZ$L*3qJHo|c8YIWGw4J>>rAWHT%>=T5&? zXXO?mQ?KQ6@knnz>iCrHT;ir3Z0o;&b7OSTR<>8;8x}REA#q+9_aglvAdRXLVk%S| ze^CoXUz-Z#MD)Cc;ZUhScYOB z4R!fAmjRp=uSP%IxRA6Iw=+}ZuA^pFxt>6TJm|YlnWESEPW{mqza^vjiXht=ISM{p zR_pm5J@zhqkHKN#nl0xMyE5Tpr^B}l8{TKSa-iBC^QlZ1N|e)0h@V!(3swNg;GeeQ zm3&P-3RBF?(E0^>19V`rTIq8(>a96?wVGej)7j~s5~JE;@jVolrk0wP6?!X3w2Zd& zS=57msEPt_ZYafft7p4)=*t@2KAiV0rP8{wIU6SE1l5DQMc2|fx7Eo%07a;JtGB3% zUMNFOEk4`qHC9+VB%4X7(ZMj6IGMnUj?2V_?hK-jV#XfE>a>auYz|vlb`q_>z?D+d zqyl5(^G%9(X^c(xwbEvxsY;72GK0f2hHNeihcXG%goDiRSN z*J8#?v(kM9OMMli6^Dx(Dge>7XScr`h(NU?W?#eG&G|%%DAr17$R&Llu_TDF(Q=KkSqUaj>ee$sH00uRvLl(JOS%OM zPnpk^lq|0u8dU_yL)g)}Vw2%EnD0x!Em|2C z1KYsX6P+WTaVk34EgdfjEnEyCO)UiHT@SE3@2Au!W44)pLJ{0_kVu?q271)Eh_@Mq zdF^bpfo%kdV5?w5oQbxi?pZ3-EkzF$<#$XFHif&TDJvGc@ab<;9iDEvD8iC-3i4{r zg7KG=OO8Exf8wNH_Sv24xHT{eZ-Eb9P!ip8$r>P8kGlO9cyB@aLx)_k{4-PhG)IYf zL2OL)LB{&AFC`(Fl9v7PfL*GfpahwSB?7xd&EfhNo^R&^S`x`h-LTm~$83Vs_7Zy) z_lWWeY=|Pd*|p$wu!{5dZhcCUKV&Aa#L7Jxm@f;6$FyFw5%!#oeY+YT+QK`KRQN0I z1L$1``gHJ8Kn}eH6(YMZTfbOVH|Gjr(%kB-#a(k7glb=%S$2(J&uF;3N`;R>DCkw72 zNWrmyI{e3P03qT)Q-QgeHvqH%^q6m1(QicZQbLuWQ&LPjgN<#Gi#QrBrPfEc5P%%2 zC;s8BVP=Iwp2iO@HEhz~3q90O9 z&PAYl-|%juh$h6A(=0`rbQbnq^aI-n>#-$BR$L9i~k^kBxrc;Ika}#hjy~-UDA-R z6}0B_O^wW?14$mfx8Wj+NGclP_R6&SQ@kCP{lz;By&!UW)B%OOv|AMWeL^_+dB9@D=P_z@fO@3{I1BMozRv#}uzTFSsmb#ZP?NLyW;Kx(gLhajN>Zkb#rU)n{K} z&u35r#>t_IbSw|yNyCAFF3V%-ii$7@hWzfF=-Ba>OI@vPp5wTr33GX7HOf>tK`(Q7 zYPy0>E)biAmHAP|pvgslCN+x$lVYDJYOMnOev#Og#xm=>xaOL7a&|$|c?r(KlbHK` zx^YVMc5Xt+?g=^q#8bC-Q>y>&5_T>XBK|mTu&EEXPkJ?Yw7UOb1 z!qKmzMbGBLJWo&>6H8O6qu62x6ijq!JT97fWyE2DP zZTMEsNWZW`<7(bah6%_ludlA3icV(Kz;1cN?Yuw&u# zSd$Q^=MALZj729Y`q&pEJ{3e3k}8JCU{ENBpu7~aB9Jy`wSwiOs;Hu@EJ1C+N2oe1 z`SiKI@`8>}+krqOHpLXGvDT8u);YjK9Q(s_r4h<=JumXKkJDk3o*J>4EsHA}pKyh2 z1OfBo#Qav6-Gw)Ad3Wdjl*ohgfP6vc zP0}%!cy2`=kPS~o)ubAy)l}Kfb)vHqDvKr9>56({GRySSc)nMgTt^v$^UzN2)SI6qTqzfk-r>s!5Cz9oscjm}NttBe6i*!Xy(YyN0Toh<4ukrF9Y14Em^!|IHAB z76VhJ%4BkUQtli159t8$d^`;~S#-|$F*VnQZO=zCjRn>5zEHuBWymnDcySDQGKsy? zN;dR44|aq)T=}^|CHj#RPtRV;`Kc)uhuG!fS2hqfq(Uy($K;4Sc_*t;Kdn~aAl0VZ z$yY&#pXwgYHEOTU4F~r6{Pk_twtF{ceXwxnsz#t_uiUl_Q@$rKoU%={A%L3uRjf0u z(UQ)OaPorfdT?w^UO6}g+orK}>ysB{ z%SHCzHo;Z@aIxICjNCMnzVT&uIttETZ3N-*%NkK7S2!0Q5odz-b)75nv*S-Of%RY5 zP1{A;z!P=~w|Z~>eJdvuLUcyochMALa`}-pKpDrlhet8UGXgo=^P$g#J7=gf6^1ji z(~MYi#SSyafGb|p3TjFRGQYR z?O2?)Wl0Sha@$0Ayq-5e=|&P8U0vlxUxm^*etwp-mD7|-b03>2Tw5tN#^KdBqNt}! z5#h35tnf{-vbA_lKbyTDf+M>*6TbF%^ULl`b?UO>;w9|t!<$#ql|WjJgAQjUy7EF8 zM^!!A1<6%;Vm$Q5-T=apUpkE(7Y(Cbi_;S!YE!~#DDD!UAwPI$E+^XLLqu8BlnsOhj^i{bwh2 z2OO3ei8>X-sHT8&t^ni1DS@BJ)1(dP{oJ7F<~Tn~HnSiZB{e?{wx8 zSEEU04$saCV+>BcVCA#k2PIlIoY0N z+*tkWprFEXk{zu?McPLief0@V3SG%fM71>6gubnLu5+1*mO3(WF1GEOx5G)olM`uv zEi&PQZ=eXD(496UvBa;;Scg*FA9=`Q{A!ugLMlQ6>!lR35IG%r(cu;XPnVt4g}3z8 z>#$WxQFRh*jChR-q>B;sz(n(7O{_c7IP|y_d61RE)?TVAA>3CpNvPP>y>e>S6t&RIX!7(x5v~{B* zVx_r*+U~VN!fLKX|L8sjG?9iDC1jU5blN-a&VT#=}MtyY!F9N3*9kB8fL`Mw76g*+^*1dfZAG;L(G z>}z??SL26Z5|i?X49JkGvZk#Xf{{Z#DVJzHY=wjSXw-fYRrCE>#YsHCa3C#GXI-H*)*jzam@cz>ASKyNu=*2g7M%F?pYT`kMbBUR- zZHwpo>`$`Ln(jP&ae!CR|;W${^tV=!(TiJ2} z6Z)LYgmZgth6}}#)UXb>ydR1*<4UtdbHDOvu3XBatk*2YQ@sJ^;@tTQ8jlJ1M5N0g zsoOKg{rVi2bEu8=OO$U;Kxr2ncD|8wSc;x{#*Lt~E4Du=Gz`CF`p&cK`K4sYxr2u%h7mIoK$?eyCZK)55+znhaFxfsguiJn1{PG4+ z+l}aPR7$-Bp$<|;&vU(RwNJ0P1bk4tFYJF^*dN}=U zL&X2tH%%-WxUo02v(xxk=l1^uRDO(8q3F0XPA9hLv3UAy&yL?H z@oNT3qQLWU3*sM@1fgV(mNbzn(lXzI1>8J7iWI?v7%x&9w+yNLO8r4{6KZ}G%-2CKP7DtbcL{okRX}o(3 z=q1+;mz-tB4TIe$WvbyCyUnu<1(jUDj15_^30AI-!5-l#Oa)jY4o}h1&lMG*h^x@v=KNX1lR5g&61~qy`lIGo@WcmxKtG>yexNN6= z3megdk>37*nP=8W5z|3*Qkig#rss|sZ*>9IPKEDz^r~o{)ToHh&r7VPPxS`* z^-EvM(D{vZ&l}x0=vpW&wZfLL9g}v~sW*{_%G5u%zW}F9tq{!u+?cF9&ZB`J_5$y> zRNWh{fGkimzN$nthsI&FjM9Y^vkL~19nnm&NxZ{I!uIr^>C^4j?4Hw^<8*h;>I`?O zwjJbZQ;x_c;YUeYxsJKU?OqmNbHYt{g)R9ue#9!xic$s$7Q{3W$bp-bIyuEMGRqvC!p6nVe^&s@rIE?ii9d<}l<@^E(nb0y9)@0pos!*m4g}gYlWihTDfM z*b?L|{*g-lNs+XT5TFPOegsP+I1@>+M|ilr;Dx&>1*gkR=8hkrnh*j(uP3#Jy(s-9 z31+ylt*RD*&=_1kssd@qgik+e2aY^~T`8x2s)tZvoZI380^M73sZVNPsw1nExWw}OXyKTYoNCA{D_LhI>&9Ik-XA4PA#7c0 z+@Tqr9_*#X+HI5+`zcV9hr*DN_Xz6a8hV9iM*3Xs-q=>j_sPhWecb-IbTyV zj8v7+Rmob8NKX!L*zgE{IxZV@xG@uIVM&JOmyJdOl`(PusV&{iWmS^^@wK|0$ zr^O6niWaZu_oOL3&Tni>FoYz1O`O7M<<##NHPN^*>?ka0{;{Z`AH5s3>Mqds{ ziXLvW=3{P1Pa!a@9-|h*wUYPr1+1T4>^pN+c)C)(g1mHK<3gt^jj^hQC5@g1+q8qx zb4Zv_X7-+vE?%oI)0)5(2mdOxBChO(7_}-`{MpBwhu{M0uJ~37&p1SMb$`kOl?;%$QaO(FC&vTgh{eB0$ zX$~C`)JS-lAsKDwbNH=4cY!HrIv&Y-n4rmNlS?tEuX2@QG`j0i0p4zzi3!vPWfVHt zVif56?l9s9oni#WEDAN`8lG4tw#g$FeRXVSpp+DdT4EvjxwAgD>O-{r%g=o)fw^f3 zeNmrvCGZvGZOf(%PA=Dx(gP)fm$CNnZy*-7WvUxi1gFY^D1c!5yB>+|=0 zVI-`Ct9How4+2{*NTeJE|>q-w(oJ@El~jhG#X!93on$#YHqwuguXxNkTiW zi$5-$^Ru&CJBpG8Lr1YYL?uU56Y@@36SO3%BwCL63k#b*eS4HM+yH>-3osg7SPH;L z9xeO=Pk7|D2TAuxCb_1X=|U~8KAf@$;z_R>D}zP9AC`*5Cp5Au(gmiuJQNcKB=M-e zek#LInI&WvW^fRLvSA9M#TRB3p{$>?I<)Coe*=t$`zM-T93y4c8VvfjJdBuTn?qX;RF5V7k++lHNhZ>e_{*7UQIYsU$PRHb0zKLF3UJ+KhE}d;Q~1Z`$)MxPqko(nnsBq+;UeNH+}~NkNQq?0D+x*{x>_hnBWHNy z-x5iuQAQ?2GpC=9+zbSqbhLTljm~|LX1EpY9aARQ@NQ40#WJiJB<4?lj}-0e&5F{H zBwa`sVj9Z^(w@&9eHif62GsL9Oa&8uny@R@r^59|8S! z`nr9^U0|+g&~Y80v=-hF%-aFG`O(tZ$L0KSEqRpcXgfPL5tQN@ztu}0-zaf%*?>_o zzvX|ZN`OovJyLOWnCo5G`{m1io}ON79MeQ>r8=^a;@${mRBGBMv_T+6A~nSfd8=zw zRCnzBoDX07!-Qe6gja>poUkIxiikZ@P>Y@SV$o>nLi$w098Z0$`0si2aNiztpZU0k zbt{kgLEK>H1jjBXyd)0!eCydIE+DT19Y}&9g<_@7+7>afq3rVXyel;~wxsxwT2fRK z__a{f)}^`qi(zHA*|RQ6G>X!0 zR*wW^+O=y0S>Q-woNGA6dzGX$t~4i*mKN6Axzt1vBN=d*bFnoLDhiKahQHF53 zs+s)UxG?t3^$E5fb=BolqQ>Fr^5#P>;f9OGh#X}Q!aja!%3p-I{0 zX&06m?vv}dIeX7&v+z00n+|-AIuSqidYuYCied86lEDlL;nwGX6|flB1oWn0oS*so zA?If}!m&!cffGM&vYK(JQC85d=TP7T*zULCi)FSGTo5k1bNz2bB(Wt!2+1EyZnM<% zRyRxOJtz$@N4yczXrI3k{T`D*EG44GETcZeDapyWoi(|}a~zCd#57vZce_-o)zlDT zVN}QNoaQ!XvFpcTcOm;lnnv@qa?p3{xSB8JiA?7KIPYS&E6sU4gGtRw{S333VUT3N znEPVw>k3)G;aGyhU z^&TKgS{;Wxt@xxw&zkv@n@CP=IO_;YHY?*i>;xgi7V?7W4z=aGUfX9LOrM95+}3U(Bo+uHWUsL;W_1^t6*fwyRH9Xj2x;*skM>vpl&4UR1v zV8wuPgevE&&V$Mi_s5pJUk8mrsF+3!sI2PEmu07loCq16SuhWo|X+Mgop?u zfmbTu)_z3($j2aFo3;0ICu)>d^55!~B3GU<4~c&DC<{3+@CaW+&DALNSA^?y{unBU=&B(OUvZKRS-oqjngjTjdC zLw~pOkY1J}Hl@aAar;$H>*^LtydH=O?5BBX3R*f(`1XZpx1otba7Xgl(o~vG(?{z-5CoiY@ruRi^a!& zBFcP>^bkf^!F&T4T{qZ$M`u}2&7JDuJO@~8oOX~W50bY)-F$6HzDJgxPIr%gj64V| z#wdF?KlL!4GRfneAlaBRZ3ZzZEo2QmyOPQz+0%vT#x>vDsnERaisCWHwKzB7+K6nM zWoP!Fp9KGunKja#kZ|vI?rZ!!-c0TIXfmUwjMJAY`|PkWEF!3)!l9Ei43}_ZAXUqL z^1;9H6_hNs6{eMN3?3_EkQMS-_3Vr*$kkDz-iGr%(Yq=qKVX4&Q<8so*bgOyUsre8 zd|N!=6Zrjy(vatgDAkn*cTQnRF(|gu)54$U{$__Uns%JV$+L6CdXtUxGvSk8HD|rw zKjlzW$&-Xeb6m{BT$s;rp!@W)x1f}_NnaS46UAv3zKU>B4i7X|pavknM^ z6$UV`+B(F{JhALC9}yY|aZbO7mYmW=;6K=@QdW$y#v}?Am$PA(w@SHW^aI%!tmf*x z<0M;*&Ckc_c#uGKOT*Y#Y$GkQJJ!7T+|UU~b+lug2QXE!u6aq8)guNz7T5;Es(KuW zA)jY^;3?}AD1VzbYZ2>`uqRsPpe~;@VK+P*ay#>C&T@o7rFahTqs>IKYO}7?=Yd|+ zl}(nSydG5um~+B%^g5Z>C9DY7h*o*)YX=o8Xx(^Ynmqfb9C_Tfxi}mNEw#))BsU!M zcZiCW%a2%#0BIrSO4n;#@uR`_@ii?VLF)@R#gX_n>s)*?q=9E0pGwox5MgyHW|`S- z4bmfP2t^FC3rv=^%FpN=DqD3c@=j7!X2`^REDR=X!h$En@9c8V8s=IS`6(LTf&`=B~3huuK!)3-OsH2U4za=u_-l2~*!pNPNw zpJyRcR1-UI#A{q+!Af-C$2$Z=fk#hYx3)mWoRJOVI4f4RDZfpm`F+>zOkf_P2eWh- zUYHKPN(hk!msw$ae#LIC@^z{ziPBuh?{fNG^y<}#c5;XAuuSppn;gfeQ=Au0=EvQv zPQZh$!S&$l8^D1PGC&zo@pv97dNnURQvi0%Qa0SuH{Rpt9x(m0#Ha6S%7g_n5<6r* zTa&zArHPq6i5lzFnd|Oopz5>6r;Y8u`dx19H0*fXxuuPU?|*7?xxm2>?AqbUwfRYC zH3qXMF#&UUXGjypGH<*B9wmkxb^h2LI=J+GG>IzAfSC@VNIBA*5~0b6Ny5_g$5(XZ zfz19aIs1=VwK2(5h^unCG_m1=SX!dOva1lz22@s8VpU^zB1ks6Lx44pKieGXC{8&W5Zx7bEM-aj7cJlzGsMAwh-k;Rpa&&aI{jA@FYS)pX^Bmx(*_0p*u_z@ zMF}}U39iyaiQw21E-IWMTDkT5VaffQg|u@mk4rvGS#+zA$VP-n#p&0;;)~E+_218^ z(e{lQWg%sF>&BY%SC(}Pc!fshU7cS#E7!~abBcNh3zG)uAMOictz)Q#PBXKy&iMKa z5+9CzjbxsvmC~Rb*Y-b%f?R)X$_Y>PPOrzvcPPC-iiuXAr%x;obri_xM(S|mm@r;?2uOJlCD*J<(m+iLo2KdYEB-}x9?0A zdZpbG5G#SQmR{fGlhQpnUF)Pa^u3!#@_^Z=G?o>$MCL*AiMJQKh|1UmC~A}@L=J)s z?ufOPMe^0jQ#`zT*lz$j)mqW`y-Fvl!l=sXs;}F@Nj(Th0UAdb|A)D^j*8>i7KH~G zVDP~m1{mB4u7kTnAXv~K!Gr5CxVyW%LxLr^LvRfcJdi+;kN`z8TPt)+aVD-36j?HsFQo}rL%1Xj zrUDIlcD{{@3}HKk;>FvwWsz9Y`V!Wd!99pZv-3oSEL5E~RA1@UrT6z^6fEC^N_jd^DX*asJj z87hr0?CDYst0U?xG_0X?^yMHAC10U+u@f zy_1Qqsj;=tzc67lZb*yoZQft1xGh5a*-}7C=Gb+EXOF@-)vlJZ#t!xRQQ#e)+8Y99 zd6J_)_NhTr7i{n<_@_U|M{Pk@0~+%l5^Ie){uzh&f;D6itx8L+n6*!zMDK>Oe*?PR zy^ojGe*-R_zK;=bPTdTM%bNen!PUxIq5P!t9#;6&uEW^E?u+g_I5Ik}YgEaIA}gtP z@Y~cPL|k@@fKDoB;y|07mMdv=Z~E9S=_<9qz-=5Y`>%JxkyN$PgH*M)qSWNpFHvq7 z$D<+&so$kr2X1}#Io6G#1I~w-5vjkfMgqRy+ZD0hOfr!p6*%(lL%7L@@G;78&fneo zn@Kkc_0Bf!RIK7|*{R+qJ3{xdn5}kie%{1*OxJdN8YDJ#3oNor@<+z2~4 z82f-jG6Svkb*%ELLF(Ykx%+;O~V*cgn~+)t=4Cpb#ca+t8B z@29&7_|(9Tv#5AwZfIy_XezyuL49Hhs1F&Cw69jeNTD8j%_gnwYjp1^smIf`{l@@e z(s?T0B|0@#S-7j4+`39)oEaG!8XG>I>$Jo8PBy^tzJ-9y*rC>NczC8@0wY#J*+}b5 zPnTi2MTzJkxT~nmhd`H=-(^U29GzbEH-N{eVdLJn)#imYtVQ_q2uVYvgOy#;GnoXd z*E#{WMZ025$gjayxADIQbsD*tKhj$OGA#p?{r&qizutVak*JFgu$!my zoA~9q`Tkef$1#J2`yw3LegnU&hmagZPa z9apg=UI%sKq1L?Is6T#n%$-sEbYW6NoUDort7N+~!06VRZP&qX$MD75g>{MZ=|b$u zmlE<=7FHtH!8u0y-c}y>;$LPq8D)K(u^geBV;NkP9jW~euS3tMIdYh4;*(-^_-=P6 zRpm9+4vjnbIntzzQ>`PJo>25gJ{2v3?lB;QqM&33vX;^Zf-f|=m{bV3XsmIa@h;IP zU#VV6vf36AmfLr}lF+7pNAxlds_ZyN_hM&1e7Y?kYM_WUTreRl;hF;~onQgG z@=rI!AVjPDh^y+cA+fAYNK7)526gOfK^4i7Sa~+p+tq0`{=i}*Cd+M+i6tgn?%Z(_ zchBZ9G6rihEMSl-m>1TL=}y@*R;Mvm1fdI&724`ke*P)QOG_sLjbr6I4+e?m>!;&G zM77X7GBS(P2%pfnZt}?ts8==(i_F`J>ENyY1$BK-YsNbnZi#Qt)Yn@*eB?|`+83z{ zaB&#H+#9^#Ag}M5e_kpfp1!N-msJm|>6yO}a?0qnXtEdxT(wO70*MAb@|nNMeb5Ra zyqp+W8uJ#M)UUs@iCjIOQ;_4OO$0h>?_~uG3MzH-rh3i~&zYa#T~Az~2A0TR^2*Fb zZcpdIDH|}DTNi>X9c}_+E&P%W)7)eN^Zk2S9q@H`6p zp&B}huP3aT-B)owg-CY?sT3d3&@kkoe!);%?Xf@OG?*}ASq+QDO@*7b@)}azfU(ZQ zzgjAnf_1yH3e#>7VE3so_*-3DUWba5_D}H0>!c5P6qsqo{S)}?7E~8Re4x;6t}EwV zo55Rc5~juyVTKa)^=OJ38?m2b3cci+n5)fiOd(4q!^A^uVa5%06(TR zOYDU{dm2hhl!)UOTr@U?fVbXZy$_PsY6hs;709>7?(TZeVuW&`cge?I9$&Mv(fB@k zhTF2tmc=5tY3(l1r?K$O79daPAo{9zeA6KRL~|x}NU_EQ_8r#m|3Fpoxbe}x+nX5O z^u@0|?Gy?gPTjGN{A^m2R94_!Kryzd##deZ(P5Y4N;YJzF+N1Vh_Z}-IMy+UtJm@!oVo8ChK|OZG zn8CW|bC+gZW@Rq!7}S-NH(#`aN%ZF%l@Ms^7q=hZX&$NbpiAMN)aP7lc=bOCF-?Ez zp)%6pqgO`Mu~8gTDi`UAZzI``zc#XOVZw`v`U}v$%cfJkuphKgF%}RRDC`kvn^ zVa>7YJtD+hSw5wkfl9b7mH_C#125?J!ElWfgvvmfJ=>wTfDQK2-2+TWY}T_`Vv zr|JvPZ@_aY;`C@W#kXb=JsmoHJE#<|%p%BNH=CinRMCRP=cSiNylNr(4QRf~GO&YC zQWGuD$Lovv`X?Kr%sUutZFG>Wm*CB%?F<^QzUD7nA=_)6Fna~Dr36B|L?t@himOt- z)bev%qh_{o%c*XgMoq-bqB(1NbCb?5FY*x5)O62}%caRwDp!X9)jFb?B?i*87h#6* zsd){Sn<3AmX$Mgm#Te)rnHUb4Jy~rbWRmY{jm+XI^OvKV>K23{xo4vdziwzEXO6hX zjL29aR<~T)x@c*)jP2e4X7vF+d3`>rG#_a3{(;z0dED z)x57S@ZT;tv{9iCGEobCPPFq!w`}t+pQVQrg)5LzO2}qT-3*X;#_*|V?UdzebBnBA zaP}lsP5HF*pdazwHJF{}RARevcswqspXmGvetGbu9%zc?s#cBY1$jSZbq zSK1N*jZm3bT>lj16ZRM1rklQ6zBFO4#v+BY^tSBIyAmzlQbu>wACkwaa%*P0g=MV* z6wd9GX~fDgoYmduN1&ZDkDjZfg2;4k8RNyNjvj4&ZJ zsG)o@$|<6IESsxeKdsOVOsL_S-Kcii*L^kqF$6AZ?LLDti+hy*FWYhzv|3xulT>PI}(*g)4uf z;KQ=@RRJSBzC?z?IpcodTAYoEKiN-DEmJ^TYSytj;xbw|PEQdkXl*1q7G`wuM>zj- zx_q$9Ci@(ipf^WSkVph2N4V%ps8|twSpezi6VNhYIIMAB2i(7y*7axBh|AxT?ve?L zCs%7iA+jepZjd&&w>F6#)c`QB08VJX~GH4y74;W}6m!}gSq7gBPKHFJoa*DKgfpTB=qbgq2SJYB>d zTE_`zm=dh_q;t%P7cvo3eS_tM-=>0b2vLoBqQTkY^&tR&<_( zC>jtVvJD9Z#}%X*D6NQg?b0wavPHPdJeEEO^RS$?&7WjwZp&9Zq6$M5&+hrT1p(G0 z3Yn*)6b5=2>^k}k-aVSkmQ)uAEcqHOn%0qNaEQug41uI%Ge)X6sYyN3<-Jp7p$MR> zh_Oq+ae#X+Nq_~cY|@0=W@PEFHxkQf9G{4ZZsZB_T@^+%$hm(Dwa3}xu~!j+lrKZV ztROW!*yKtpc{!p)v~A{T6+kq;lH%rB^|0&tg=5T>{|x%&AaN$<3mTc)mRQqslmUA~ zP!1a_(SWsL345$r61{gwcHI(6j;&&zw>#P+;cY6xyRPahwiEKN)(w#_p7*-!aZppI zvVpdf5A_YjOYvet1yAfLE4X@U^5+7W+sZ}=JfoK4w{~-udU`iLH$fsvKul<+zLjel zk!1Mf(y+r}W^oU+_u4PBp>v;J$$C9`b?21{CRLy3uK(`Xv*=CaWU9?R_encmwz61) zDS5rb*-;Nr-7Zv&6|Gf^{#3W=ox?kQDFzpV0x`ugSEuYr>l}OI40@1vFf<0j?tsUd;wJwB^O9Dux-`&2#4U(wDINSYhp(_I`g`DCtA`UGrJ-XsGQk&L6B-Pd8-Zeog)~ z`ac)z-!GsQ*=j!~7kwV=CFYJRsE!H(k&l~_KaxmdoccG|<~NR_3T4L7?Cx1bZ-6Hj zWbZYSAP2v5R?x;$_?vJ$bJltboZxvcs~LCH+qN_z%UA(sO(C&cqpXl0Kb1eikE$G) z7@np1uB09~E$)DfHFZ7C`OvsM!~OT76voQl@Bfe^Q8xpAvf*K#E^Y%ritH8aMV zayPs~FD28m`IF4Glg-TsRHcr_M^@+}y8g%Xt&n2jla1rc&?cTwro!q{Qb&xVb8yQd4w7|q=6sK@9Hw-&CrvF58dTmh8Xb>?q zQ_IuN@4+1>JO+ngYl9Hig~k506t<|BErnyfPcubz3H~psaGqKbm@mlO5$WjpNz}((&LoM!F#8-aN$RH+`Jz>Nj#X!W$TsRAuTgsQS5J z!qpqG}2{0;%CQGa=!CE%#BRO@k;jnOgsVY!1Dext1RQlt=Hx`(PVUa zrF>61fasXSezU_NbpX`CAF|^kD#R_sjs{XoX;f&fn<(qAk4xF*jYkY93mP$OQvh9r z64mR~sOTOU%=?Um`y)FoF$K%b&L))(Y>YPJGe0Gsq77rLR@R3=%yT!^n;)jO@^^lz zF^VO>0g({89$?sQ&wiJ6dw{u84Ee_y)g3z>#e_2we8maJ6g6h9GQ$1bShQ{mGX`*> zT-wio)M}-hqoONpp;}rc!SjbStV7QYZKtA$v5Bu8EYx>YHONjBI{i-hgSjtLB+DG- zQK6ljPGOrfdK7&JUIWZJ6)&8M&02dfLs%Ce4 zL2kM4Zu<24;6qK(v&T6(-aFANgVR$@E171^=j#D_qCZ4v^q9|F6Ms4l`W+ncpxVT> zl13c7)~XO}XiJclW~0UiEd2QPpI?Q>-&(xzqnTm;4fulIOvG299{(F48RVU8(ki{` z^pW(;2WRsmd8fNlgkuV1M85w5@fAW9W#aBz@vB*2!ezw#MS3Yv!Jo=0+lGRdD#)2B*QE>;b1gX7mA|AAKBJN$5K$cbtZ&U9dr?kYF3brVy+RoC z+CTuWJvSf1nZklA{T!XO%#7JsWVY{S>|$=q33vj_z!g5LHuLg!9%SKQ86aZwrwQ3c zvBs=TdlRS6GVV;o(^Om`Zc6Amia7mVh7vX8j&b&gMkh}Gg-VVC^FxpN4M`VOd?WrB zT`gX5(5QyuGozM4OP9oGM@0XZK`N|J*R%(89*nY2@_j3HdglS%fhZSG5Xv(M8u08p z`FVh3ihJ&3&&pSib`Mof^cymi#M0?(@{&O@^WUN$Bu-+>>!X4*8F{)YOu1sg;USR+ znT*h3@J~Fd%K{yUgb+<%DT%^)&T8(4vUQ2Odr(UfFX?*J@~?&OH8&B8IcTx8%(FeA zzQd(GAog7zR*#&d(9yIUcq=5^sH3mAD!1YgjpIr^jxRqn^np81NVT zvSBojp9=qE^qxD#@j{_4ql%Ft{SMogI&*a1g%4x7RD(T+Zd>8ow&AO;A=5Mfr%Vj5 zS7RT?&@$!pI_% z@ad{c#2&d}OPYU-&ibU_>ANRU#Q`H_Nc+^2z3ux{d1NfQQ}r~BDOdYy!LX6puSlFi zHc0Rm5_p=arYb5*e~Dg<+wJ)!$%d;P|Mrj1g%uMG>2ul3<}o@oJFTLA-(>c(_Qkh( ztg}uBX`R;j%D(Nc(Q{ z*>Aw8=94m&Dc-}R|F)x^v9ee0xRXB#zap8vM95;I{ly}KCL1)drFTd0{ zi$*4J{A}e{3pw3b2Cnk67Kwx|wYQGA?SKb#y5ZvNV?O5mj_jznpPy3#Q%BA4yP_&O zI{ek*dQWkY5t>b5C-qQpYysG6PIEVnR5OgIRAeY0&(t>zg*S5aE2+mVH!-g@YevbK z3N1qUj3aoYTjw{RM|-#}wES1SB#RTfU1EI5*8H}}2wOo*Kz-O6csVO8nH|>m2{7aQ zoIc}BasfQbHe-)2{+Qvs(8nR94xZDSUbe&4ujlc(d3H&GSdmeBW+30Uku`Sw4FP~` z^hD*Q?9Bd^}=)Y#+u0zS zH|>G8s>l|>FIME@gb3`r+NsU^yS|=ZiqY)s{Z}US4;7%H4_royqzm?j-+4=tT^m6V zC%I;PhD{P-tJkr8x@H=D`;sJy!+PAf@d{6@;uCAVb_WSZ-zKx#;11KDqz4_Rxd$jb zFj9;p^O7MWn!U!#l@|`k!aqo4#7a}9WNddx({Eo^XXA^yE$|uu5*Z>Yzr0|Oz7DQ= zgvy!c#=;}O!ziXy9K+ASu2^C?9Y-1?PuH#OL_NJIs!K?a>B#+#^UX(vt*9lk{l{JL zBa0G@BqcLl`4RiRBvby5Z(jMEFYB9qn$UZ23#E9ym%!>rVHF8Y_qJRZA(=bRMDPoK z101l+M9b~pKU)tPC*74Bm$7jS32IC_BDMJ zw{eI@`Iw0CvyA?HcO-5iFUu!Z7A6wMf3josGxaZ`t?(jL16U}SE6OVn zZKhlHY)LeF|Hmmufd#59P!0orpr;@cFuh|x*WdMra0ak`Y!i)tVRg>0A#zTg#lYgr zp)~ZES}}(a4brCv>k$*Bj z<0b5p_rdHHx;saARD}s8Sxnn7IkjGZ5fT4wL?jx{u7D^%!do+5FTi{7KDUoc>r0PZ zR7q^F*Ye@^`)Fde6VH<1cS@f_#q2BNtoj|cTCpB=KMt(bb;2vn8dA08O?|By>+iyY z^zlUE$rAgV)=u_zxU(~kG?|d)YEVR=52YjX#w>NeNyHtOf3{IFK-ys&yUu9w?C;*h zxaWob*iRcjhx0LZS6y2lFzz#DIo^d6m1UTqo3)aZ;dKC+3N)LHA~3vh{hg&3qwg*i zkg08dYO}qFCPByDE)n&(2`Oj;q+I9yz;feoZCuttx0kZ<*tegJADhbEdt&vR&fBd( z@%}|{G;-uACvh$z_Y?kXbbE1}&L|Z6@niAvWKJL`=J{(F20px=28dT)J+oq>9WmFb8=rzUuQv%7pO zv>;y~TEh11To_9Oe8$p;8*8TY3Ek$3ufLtQKmPAtL%E{v5aF}=R=@Isa!VW(v-0RN ztIuk_G)WP;i#`WRG-P=ygT0Ze_8B5Ncf0Kon?=*=A0yOjnB(JBON>!(zD!ci&=K2n zozx5FY)Fb1G-Ir@9q)UR=N?Ie#Q*Ln998NLWu$B&qf~cmAm$GVm=R+{XBI!6H>uQT zIs&qNZyIVDzijD^?HE_71?RF*@|blAewK)`HN3}dcm0|rRd@G;7}I9I^ev4J$s?cg z+U!e^Fs{}Y6)l1%7KWRz%$wzY=7IyzM=Rbs=vX=8Yeh<})nI^5^A0VcnSsMMHtEWN zxFZbGbyk9E=m;|av{W{-LQI_G_G#>ThLjTCfv_QXXNundgny)}BHF18^yNIcz^Fk59?})CRiqpCYq9oGhExjS zM`@q$CXu4~OyPTKnVh+230#L)Yk;pC>KR?^M{k_t$_G_Btrd?DO`=xw`>~>Um?^;F7V&-e;UW1x z=*PwS{m?K=zWTG7w7?Q8BYRv`KIV5`a~H>vhp!Ja23;f6f3zc~Y5&?g3xG_Z2LPw3 zLjV636<`_+_`fHDzyhXWLH`t0DAE6lJ0uMY@&_0Tn42m;6YXLwa89Do$* z-x^bp6)b290PqJM1cjqO5r4J(6AL8Szlf*FBDq80st|w*6fO%*lZ7Hwp#arCq)`7l z{s%1N=^tt^=%0=tEB_75e`rrZVgVqip#LrW-_TQ3plK-ocPRgX@Bb60SWxi)?k@eC zv@jqX3rM62K~;qi{R0uHnt#;)s|r%fL|70oQt!yC{|Yz-1_T2je;|>zhl1qw7m6(K zztcF9HCPt;YywbKfpEYd3k1U;09D8z8~d+>`O^pjB9BB^e-j%*gnUe3$cN=G@%}p$ zWV;Ho?+}12kVxeZ@E5AQvSgxMHPTlE?o7GZGcsv2-qJAL@Ixb zD&>zIBFz{|^p`>Yu>mAO*+2BbDiEYO0g&vFCIo{ZbpZxI!6-naWu^fB7(j{&AO$&a zp+MnS08|j<&*=9zVNj4Xp$OQYkpamIpaMz3LJmiN*dd26IC4yb0T3zxFbMjmUG)zZ za&SXdkO0U!l6x8mXtgE08z!rs+CLao5R8me)hmxO^~&oc(??o7c3hH~(`VQM8&wg}K-^hLy}ei>ZF z-GIy>UVlC5WESIMf}uq@;SEJV%x1VHBqkOO_gC1zf9f%?ruLFubtpUdOZhln8&#W9XGuI*YBpqey8I~AJt(Gx?^0Zc| z5UfCEW`z-Gw4BN#)n_-&SwD;$ML0*7Pw`LMir}Pi7&Q)nx~r5xVYn@xx7VSC$eB>A zs+FA@Eh>QN0qV&s)`shVVW<~s-oDo?h1L`L7WB0ppnvi{Im?x6Qeee4MvhbQFuN1w z-A+Wg8Ho3n<*ze92*XY2OBGb1R?naP83XEq6A#jE9Hoh{vpE7}B=a1*FvT9Mt0s|P z47`JK6DXU85x;{DX4`pDt<0{x_C}}R#?NK#?YZ=H@H$0WO1hwXGx@Jd;V;|EjGyD zXu8&YngGq<1{FO3v+Z+B{GNA>Z-#1goo|HxC>ktOjXsbWmj2Qlba_?JD7Z))6MOr> z$L`OFwg{qvfcVT-JV(Kkep4@KVyiK)rON5pXhkb2zk71vKu0bRm!PDQpA9cDv*VDjs%t2qa|{Io_xFZmm(Z4Cs-iyQt_ImCK{&KUm89k zq`;_xLYg7&$t(@H=ye?%p#@((NqO|J3y_^ht2Pp4CB)FY z?eiFDFCk%pb&0Ur;3`m*CgUp_rCIg?FbGKcDd|a2E&Arml^bsw`24;Ej6AMje;9H= zkA^Y~$>=oX$5=%Hi9W(sawBekgO9lmUqZ%+O@UyXMzXI$D}>tFIjh;kNITQvLqS+? z2B&ZfKK#H6+p-dmR$MWiW*Rld=vVt8mq%EljY1d`n>NLAWe`mQuR%fkD*L>C_-P7z z{H;awlR^d7@ta941`ol~$jF4N@I~-vTvpF?TC}%#9oQ3E9P?i9=1FK%f?Yp%ux1r| z=?~OF**J8bnbJuKC-IS@_?Q%j#A=$83cR4F{0*r34e)l~QE`N9qWP~{ zxA+qQ6nuh)dUrF1+;5g(dXh{L=*pf<1T$~>Q^*!mQNJ?iW$jrPU^+ZyDa3lmkgaxl z|Ah4uqH9fV@n!&ZbsoVEJlxb8yJtXq#>J-RbRMb||KsUTMBxJE2o9L5KGP{4& zEJ|*RTyF38Y->W<=Ukyd8CAEZPj8LHN$@I-*Ua{nV0ji)j-BwLkvqQBAK*qyiC>}; zo6+RlM|#zGC4ganfv0;-e!55DA?i_0?3qM9${tUS6N!;V-bt8mr@v*wJ1IJ(=SgHFxHjKi*Y`>`ABIkFz; z*o4-t`XnO11VQvAP3~zigIbX(1BBa}3W*Cd-oa0`ly}R23jAytxC;67)9v5vV4l&Rc^FuIb0LsbM8fCrTT|z$qx41n=yt#@N2p z%B?SgvECEg!saEFj0q!`lwWV1c)l)2NwinnIkzo=BN}LCX7VD;66v}Waes*ct4!eAFe8$V0tPp_UV1xLGa1ie|nWX^- zGO+4`nqE`Rdb%E)YJ*osI7&RTRvbJo_vI(jkyJ#=R%2F53CDRDL1t`IZ)qKZLN|A( zO|%41x!wFRgexzUu{kgC8MO>`G}IDQicHV7h2KQA-gHt*y#x>YzOWL{Q*|+ZLL^Qu zQ^QG+YmN&Ey61z!0TdI|O`$y0G3h^vQtnwZroJmXl%8ZbfZN_QIs!$XRSW9KdaG=x zos-J55%KKEYZd>Z1z|qkQJQkL0I-QW2UOCNefqvqxmsNOH~4N;XW+a~ITipmC`rSSD@YI{KeC9UVE7CIc+4n*f!v6K)|8D*(?a01slaU! zUw5K_rk1nQLJG5JgM4mtlnwK)Nr|_R3__pvd0l-il(W& z?mrjs-^?2bzZ37NGFGS)dX8pvu0caVt-13h_Xxc7nh7JanzcRKw3GNPrVkb&rmzc3 ze=B~gBD2+xqe_LKI2ktV-BMw%z(Lw8W0Dw*oW(L}MfwbMcb$B`F?v-?0LaA9lrQ1r z79p|U!VbohIpeEz+7oyneRh*0l(wP-G^uLY{{fCl#d@0R_;c_58>=HnomIXm3hqn| ze`3f05d~u4aVm0IJAUY!jveRjb$WGjTdE-#YA?C{C%WO#G@5k8h+Pi6LvRcsL4?wl z+j4v!A7tJ>rrNjhqD4B3XF@0fj_$)Vw`yP=y3ACS`naIGjd&1H9Spb7V45&n)?w6V z7HX&U*?WHNqJ1!P&>@Xd;st0kQKNbHwm?i0|7vylw)6`xV6$0?-6!o6l=rzD-Z2A3 z$w`SGwU_8rZCs>^*zQ45yJ8nAnxLQ#0}TyclOo4w$omArp;}cKusY=iprJc>KcDjG zxjFQ30Nn5#lzeXzAm65lPRkOhp+cLmg9fB+ULRbiZ+~VfySAD7RJ8M!uu`i8@Em3d zp{@tA0ZXC~$mqyxCAyz*f@r|*2M5WZ(;YI6f$-)|#y1|%KQpNn!T_uA;i^y9OJ)hE zvh&J-_sQ)iKb^!yhmMx#sY@`A;~I;_KYfWKACLX2GhJ9IsZh?Lrn8YqQi4z!A*%3(9iV4hQ)FSnNiCJ9`%E%M z$W;`o7x~JcY^WQLq0CUdPuvoUBiHx3-q5gaPll5u+T_5B5%!gny}{wTEqTOtnV)(l zno;iLl-rAshffM<<&|s*7;^-JKRSd}c8~za)=&PEnN zb2kniX%uzD?uMHsGmqco)Yuex8hc*-7G62+j!qFKJH=8@Cwu3m~eg_eZk zB-O9J3f`1II{20lDeomq)uH+pfKCfZM}?Fu_+BXBdI2`;2g5SdObsLobT6td0Se02 zzNd^)*;Bm6GA*-k?JqyTTR9&)hXYqG%nb0nwNjV~JECe1b|QCFXeJO$3B2 zG2a<)yuzK*N3QA20_Y=b-*7U-v{1LM+9$J9t|AY&Kumd87T=Y>KUefu7RR zIQ3V@ck;?K&~gb_Ne;NfyQ2zc#Xfr(^1~Rkv0eMd`_r@OF|w1Dc6_jNs%!(=9x6q~ zpqks_#F*vVOe}68+5jO#rM}7H-Ju+`Y!YmmxTd(TMO@n@VwDieE>WIwkE^f}D|}qc z%+yWRUG?iLI6YT)TR;wF2{vQ5$Su23Unj>^>@e2eq0Sk80@J?vqPUtlic+ru3Z$4( zi(d|=Xf=m{5#LR8*%$fK*HdX8ka=Ecy*CxvXB{s>yl$yeHmlA^R+zYeyRSEO0h)so z&Zj{L_ft8}13lT4;)3C&Kg^tFPbN!sGg~{sXk`i;Jf*F4*zTXJNi0FS<_yTW-J~A; z$AwO?RLlkEE0;sYhtg9CO&%=AMTmSMGBvH$KIy$|GsHz!H{Bns6hl0a`Gk8aph^<8 z;JSne>l%7M0tG&%xwL|_8BHnQYN#zgpThd}8_-Jc#gSayx<|waij7X58w8;cuH)!q z&I3oB*R#GwHx&7%cv1({ojLqU@kv}>_p!PAsJy_~aEQnx^U^gdjVS%#g>gzztF z1C<_{3MF{Ejq$HRb2g-fzam4DF;_q-ih?m^qA&PT2NuC`3rn~WxBwU$TzrQ`fNU{d|XtEO14!ZvN~mOy9*6*G!!Rfz(DG*@FGSsQjwyC^!zOW#{&F2;Ol3| zX{!R81~??R|)eJ zjEOe_22*Erv)p|e;EDTyndvYP46rF`?nthTY*wO#L1^hafM7#MZ3r$0ni}bB-C7)Q zGqYM#po7Ze;b8m@8s!8SLpmoswuOcE%eUcWl zqcLi!n2TXYhm#*$G99Ycs=5Hm;I6Anne?B=tq}{+Q`(u*Oquz&?7a0w`DlxS)`aov z^CYo)HgWYdsEe^mT(lIV#GWe#Lj{pKMDunt->q5r2soM>i?wbrP|E?=-f&}vEVigr zD%Kha%BEDMREi`Z!*~N_yP=ZYjjhvcV9o@h;vL>{Nm&&8PuZF{BLjVN>G3x3M^qG5 zTC)amH8#C-bnHq)!`s1pAp=`pC8dV7YI71cFEgxWRN;Pyz9WjmMFjsq7mJj!H+@(R zp*Vpxgl;$J)jsopA_@`TcEv=HM6y$646P7*HbiUss00s7Wv~(;#NdRE`(y!ji{fl9 zp=dFJ$8oVGsadCgpZJzu(1nTDbvQP4V^h9q-Q(0v#cQZt$c2YmcV8d znL@Pq&S-^ZL|{bclvsCsXQ398W2Z2ugZP($lrgA+N(iiw5Hrk%s#aUKk1kjDYg>n{ zM>D8YR~Dw@ia~jdLzS;^2*4=XnN=VR>H}gqkPKQ=Fw&eq`9h9dje$7;LfH>_5Y7t~ zCgN0VEd@_~N)nNh)jK3Hpbur3fpM9FxP5*DR)PP{<+jnSb!LV(3ZiMv7OUB-gt39p zQO~gtYA^Up$t$>2X@1@HzDnQud6tpdUVuY!zQm8*TZ{b!D(gs8uZoLHw2LaEthfm* z1@#pbKk9iMIv|P%8RyGfxA_?v5yQ=B=*SR;obFUUIq8LEFp#IO-aA0GAwZWB=h+ED zmq=Ja56S_Xz~M_`x$#uY6F?l?#iF$&Bgj}`^JBrhb5YttZyKxtT}N6Utk5#gB?7zC z@%jGJlHCm;UYfO+K$waGA$=Xg8v4puvgpNe(Va5wgBk-7oUB=Td{6k?Lx>WQD$#cPm9Mt>X@mm^JglZ~PMdS-UE{-rL zQDrL)i+s_sf>ZLLy!^uCJNr8lf&+@6Ww0n&T}&S)<67u0Xif{4p`ykGZyF=x~R*{p9{@sy%Rg2a5- zQGWx}1UQ}yQAEPRyf;ejC z11_Cx9Rm>z)KI#V%6^F%{LV)hauOXk6IOfyK*fjCig$sNnMyto6I)Wdx9v^@W1AawQiHV)P`9NSoD6WguftQoS0vPJ&TE!<>!LwzD zIc8m2`k?t%p~(^UwEp7@fjVne396u}woDP|@h#S{DKD;(2F)3@gh?sMqdNKV<;!>Z z$4!pJc5EVg-tMQH7^FCl@-+t)MS^r5z_p{UXp@A_7|ojm!OLd?@|qI-3G>1Hnen8c zz7`W!hlP}luA8E^WrTz$Q$3eA+KZbe=Cwq{dU(l24kn&d^}fiCfw=DKzaz=m$g4Z= zk4Y=fq$i4H)k~<+Hfi{680Fo=f$Q$pD#(k(g6z?Po4tY8H?yKi1)B)luQ9B4uH*E* zqBab7fW}sz@EZ#troPF|q@cm5teu%xz=UiL>Devb5_PN+x1!(_`$?mFO=~FN=@>2p zXAIlDmU7Gu`3<6)w2J_$*h1BB`8rm{k#kx*;%jm|TPaAIklvUI=dGocwBav})T?6Z z))wdsUncU3A*m^oc^5<9Vp>DFcaK^d87%=ih)NKHrTDiOC#MXkuj01oEMlpsL^(C2 zVF9ctq_j-0SkYb+p`l#Tjhrskl!oJxd1CvxA0LG6#G=6O2&}zMXI5f>5Jy;9o{92` zxGy^U2So{6aRTXl6G5H1w>{s|*BQQ~K8hs|;VR*io}ddJemgEQO%VblKpCLXR=CE) zem;2=wB`M_1%Syx3N1HQ%M^}mIyaIn0ib4gO6(@6WB~Ut7kb4u>2#ALwFggx(MGA?fT*`C)cSr+$$$)1W9O0g7Ln<9vQ2$L zWr%F*+2Tg5n2JQ9MJp;Ji`A3UZ4``So*2Immp@HUZeVQsGu9GO95%XOT;T-sSJ5uKO~8I6Y`ok@?-Jp@0P0#W*ehip zVl&w8BjPvwD0~c-9YgW-$*{3m7x?_-PAB%RfxS{C zwjP1|7x_QL)ov%3?GiXe>Q;kYR4WfOQdbaWa1qXGl(cWQQ4Ds znVYE!#@?1C?x`dPJ35==OrZI(I_ah6yFq-qbu6cOjK#IC{ZkCXoc9a%s3v7oHE&lA zXaVSOACwY{U@(qRs^+C(hzG3&IjMy@>lpaavnq&B1^%)?&tzjlfHwv;7?*50!O|U` zjEd+YVQaL|ckGiaBL}?XDJ*NY#>n(NeeFH~Ld3w!{Xfvsc^FnZQU;*d>jP=*lbzGx zn=F{(|8T+bdpW-%j6Uoa>!o^u;5b1iEU`Ag8C95r7{dV=WFPy&Xz!0A>Gc=lgmgWz zwNeMH+>?lUOUD5&eBc($u%8Dbv>wjd=^-!FUat@zW`u1<89fndP1Y(Iwnjm0rY7Kn z33qjjK>uF=B?sF0k~Ospb^KI7ad5X)9{u& zu+Pe_8Yv!#onkeSZU<-sB3+(^bi>rDJSQ{sWD}n>A8LuMevmn8L<-Z1)c}@^BWZww z0P1RJxT?P9ARrbWO>*3w%RPZAD=Eq1<+)yD2&9V z)D^^)9NBIAQbztZmnP7ix76rMe4lDbW1CQvofK@iGhVK(9;{hvHdzo_ zk3N1AzE6`BuSAqXf`U>pMl&VA{Ih{egk*P86jZ^qt_m4rY&->;-U-XYBv6eg z-8C|ZGL5YH&~Jm2L&FL;$LGtD$-ettY2qTuqlI7DstJOr34nu8^};A;@yH_=Yapts z01+{`m$0B8Nx2YeQ5=PZoX<@M2NTMA0TK~Xt3#n73IbFGCV-|`>=QW62g19g##_W) z435!e2t;+Zz+e}Myh3lr177M;@L>X*nQo7YW|+UxpnmTPdf^l^_~a3bwU9<*!DIuH zYenQAS#LG|?@%R+kWbDeZx7xoB7@&=#ovbTVZjc?J%HK@PRoQ_Lh>+2Y7lH3Xc(aS zD3DEnfjoaP=lEPysIaUIGt3q>Hi^gp4KT#03EoM{_VVS39>!Z@)JKhKfg`Ct3Il0*s+E$};+AWXZ94AsG;0FHJI}4PAo60~iqC zk()!R*&?>RK$SfK42DY&{zD&mA@@QdtU0SglHnH6yo?drgc}DC`9w&tk(v+`91luG zZUYmcDqX6;hXjn;9ahN|wdfd?0XxY#Ufx`>1K7)J#(`m8YBds^{!~FICvX@eny`Rq zBcKqdP##gEs^{C$`2L@Yw)RE8_^};A;@yH_= zYa+~5pX`YL0GwI?VT3^5-?wjnrqUSDRtV&L!VnfRuwG&X zcmU<`hOOnD`Vkm)a$=IyY>XzMG*{nfpg`h+^51|J1cL5m#i{qlu`E45!L_Sz#H9QN zM+iHi06`c9jYx%*0IIX?=g_K0uD#lN%x9MkS+=P`1Odo45isE18c_cLm55bhEDE5l zQ#?C9pJQ=I#n!`kQa^aebPyDAfktg(qXSn+Y~LFf0p!7Ylq%oN`V>?PJ+GJAhqEUQkleD!5$LYiNiKH!gXkSs-+b zj;{AKSLF>31mr#t1V_q&14Qc3Z{R&(m$@=oNj3w{12%_L9*Txgf%Pmmxc<(42q8SuW`hshkkI122=y);(1rcWF{#-kWke9^9ps#~Qaj84YI}|MW3_Vow zn`DSub(*AMq(U*-r04eOQemGqg1q!Nev;|nx|A-z;3hwSM+llaW-%JOVkRb%ETQ8N zlQKvUY^t5T;JzS)@DK;r=*}f9uJDZb0UZe<0Ujw5uGhENs4@`?C`Qt3l(^!kLed_> z(KvUJPM}$YF~rIjPD1IXgg0Wr;Di7V->ZX>NNTf_boibRd(kF~kT}6E;zU8sn@O+i YL#$CrSbqIuA_|jiH&TL%AG<&Q*=+*PE&u=k literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/pair_spin_dipole.tex b/doc/src/Eqs/pair_spin_dipole.tex new file mode 100644 index 0000000000..27f0bc4d2d --- /dev/null +++ b/doc/src/Eqs/pair_spin_dipole.tex @@ -0,0 +1,42 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath,amssymb,graphics,bm,setspace} + +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + \mathcal{H}_{\rm long}= + -\frac{\mu_{0} \left( \mu_B\right)^2}{4\pi} + \sum_{i,j,i\neq j}^{N} + \frac{g_i g_j}{r_{ij}^3} + \Big(3 + \left(\bm{e}_{ij}\cdot \bm{s}_{i}\right) + \left(\bm{e}_{ij}\cdot \bm{s}_{j}\right) + -\bm{s}_i\cdot\bm{s}_j \Big) + \nonumber + \end{equation} + \begin{equation} + \bm{\omega}_i = + \frac{\mu_0 (\mu_B)^2}{4\pi\hbar}\sum_{j} + \frac{g_i g_j}{r_{ij}^3} + \, \Big( + 3\,(\bm{e}_{ij}\cdot\bm{s}_{j})\bm{e}_{ij} + -\bm{s}_{j} \Big) \nonumber + \end{equation} + \begin{equation} + \bm{F}_i = + \frac{3\, \mu_0 (\mu_B)^2}{4\pi} \sum_j + \frac{g_i g_j}{r_{ij}^4} + \Big[\big( (\bm{s}_i\cdot\bm{s}_j) + -5(\bm{e}_{ij}\cdot\bm{s}_i) + (\bm{e}_{ij}\cdot\bm{s}_j)\big) \bm{e}_{ij}+ + \big( + (\bm{e}_{ij}\cdot\bm{s}_i)\bm{s}_j+ + (\bm{e}_{ij}\cdot\bm{s}_j)\bm{s}_i + \big) + \Big] + \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/kspace_style.txt b/doc/src/kspace_style.txt index e1f799a6c9..93709600df 100644 --- a/doc/src/kspace_style.txt +++ b/doc/src/kspace_style.txt @@ -20,6 +20,10 @@ style = {none} or {ewald} or {ewald/disp} or {ewald/omp} or {pppm} or {pppm/cg} accuracy = desired relative error in forces {ewald/omp} value = accuracy accuracy = desired relative error in forces + {ewald/dipole} value = accuracy + accuracy = desired relative error in forces + {ewald/dipole/spin} value = accuracy + accuracy = desired relative error in forces {pppm} value = accuracy accuracy = desired relative error in forces {pppm/cg} values = accuracy (smallq) @@ -47,6 +51,10 @@ style = {none} or {ewald} or {ewald/disp} or {ewald/omp} or {pppm} or {pppm/cg} accuracy = desired relative error in forces {pppm/stagger} value = accuracy accuracy = desired relative error in forces + {pppm/dipole} value = accuracy + accuracy = desired relative error in forces + {pppm/dipole/spin} value = accuracy + accuracy = desired relative error in forces {msm} value = accuracy accuracy = desired relative error in forces {msm/cg} value = accuracy (smallq) @@ -105,9 +113,13 @@ The {ewald/disp} style adds a long-range dispersion sum option for but in a more efficient manner than the {ewald} style. The 1/r^6 capability means that Lennard-Jones or Buckingham potentials can be used without a cutoff, i.e. they become full long-range potentials. -The {ewald/disp} style can also be used with point-dipoles -"(Toukmaji)"_#Toukmaji and is currently the only kspace solver in -LAMMPS with this capability. + +The {ewald/dipole} style adds long-range standard Ewald summations +for dipole-dipole interactions. + +The {ewald/dipole/spin} style adds long-range standard Ewald +summations for magnetic dipole-dipole interactions between +magnetic spins. :line @@ -128,6 +140,12 @@ The optional {smallq} argument defines the cutoff for the absolute charge value which determines whether a particle is considered charged or not. Its default value is 1.0e-5. +The {pppm/dipole} style invokes a particle-particle particle-mesh solver +for dipole-dipole interactions. + +The {pppm/dipole/spin} style invokes a particle-particle particle-mesh solver +for magnetic dipole-dipole interactions between magnetic spins. + The {pppm/tip4p} style is identical to the {pppm} style except that it adds a charge at the massless 4th site in each TIP4P water molecule. It should be used with "pair styles"_pair_style.html with a diff --git a/doc/src/pair_spin_dipole.txt b/doc/src/pair_spin_dipole.txt index 1c1b5b5f19..2f27f91d08 100644 --- a/doc/src/pair_spin_dipole.txt +++ b/doc/src/pair_spin_dipole.txt @@ -8,15 +8,13 @@ pair_style spin/dipole/cut command :h3 pair_style spin/dipole/long command :h3 -pair_style spin/dipole/long/qsymp command :h3 [Syntax:] pair_style spin/dipole/cut cutoff -pair_style spin/dipole/long cutoff -pair_style spin/dipole/long/qsymp cutoff :pre +pair_style spin/dipole/long cutoff :pre -cutoff = global cutoff for Magnetic dipole energy and forces +cutoff = global cutoff for magnetic dipole energy and forces (optional) (distance units) :ulb,l :ule @@ -31,179 +29,31 @@ pair_coeff * * 1.0 1.0 pair_coeff 2 3 1.0 1.0 2.5 4.0 scale 0.5 pair_coeff 2 3 1.0 1.0 2.5 4.0 :pre -pair_style spin/dipole/long/qsymp 10.0 -pair_coeff * * 1.0 1.0 -pair_coeff 2 3 1.0 1.0 2.5 4.0 :pre - [Description:] Style {spin/dipole/cut} computes a short-range dipole-dipole -interactions between pairs of magnetic particles that each +interaction between pairs of magnetic particles that each have a magnetic spin. The magnetic dipole-dipole interactions are computed by the -following formulas for the energy (E), force -(F), and torque (T) between particles I and J. +following formulas for the magnetic energy, magnetic precession +vector omega and mechanical force between particles I and J. -:c,image(Eqs/pair_dipole.jpg) +:c,image(Eqs/pair_spin_dipole.jpg) -where qi and qj are the charges on the two particles, pi and pj are -the dipole moment vectors of the two particles, r is their separation -distance, and the vector r = Ri - Rj is the separation vector between -the two particles. Note that Eqq and Fqq are simply Coulombic energy -and force, Fij = -Fji as symmetric forces, and Tij != -Tji since the -torques do not act symmetrically. These formulas are discussed in -"(Allen)"_#Allen2 and in "(Toukmaji)"_#Toukmaji2. +where si and sj are the spin on two magnetic particles, +r is their separation distance, and the vector e = (Ri - Rj)/|Ri - Rj| +is the direction vector between the two particles. -Also note, that in the code, all of these terms (except Elj) have a -C/epsilon prefactor, the same as the Coulombic term in the LJ + -Coulombic pair styles discussed "here"_pair_lj.html. C is an -energy-conversion constant and epsilon is the dielectric constant -which can be set by the "dielectric"_dielectric.html command. The -same is true of the equations that follow for other dipole pair -styles. - -Style {lj/sf/dipole/sf} computes "shifted-force" interactions between -pairs of particles that each have a charge and/or a point dipole -moment. In general, a shifted-force potential is a (slightly) modified -potential containing extra terms that make both the energy and its -derivative go to zero at the cutoff distance; this removes -(cutoff-related) problems in energy conservation and any numerical -instability in the equations of motion "(Allen)"_#Allen2. Shifted-force -interactions for the Lennard-Jones (E_LJ), charge-charge (Eqq), -charge-dipole (Eqp), dipole-charge (Epq) and dipole-dipole (Epp) -potentials are computed by these formulas for the energy (E), force -(F), and torque (T) between particles I and J: - -:c,image(Eqs/pair_dipole_sf.jpg) -:c,image(Eqs/pair_dipole_sf2.jpg) - -where epsilon and sigma are the standard LJ parameters, r_c is the -cutoff, qi and qj are the charges on the two particles, pi and pj are -the dipole moment vectors of the two particles, r is their separation -distance, and the vector r = Ri - Rj is the separation vector between -the two particles. Note that Eqq and Fqq are simply Coulombic energy -and force, Fij = -Fji as symmetric forces, and Tij != -Tji since the -torques do not act symmetrically. The shifted-force formula for the -Lennard-Jones potential is reported in "(Stoddard)"_#Stoddard. The -original (non-shifted) formulas for the electrostatic potentials, -forces and torques can be found in "(Price)"_#Price2. The shifted-force -electrostatic potentials have been obtained by applying equation 5.13 -of "(Allen)"_#Allen2. The formulas for the corresponding forces and -torques have been obtained by applying the 'chain rule' as in appendix -C.3 of "(Allen)"_#Allen2. - -If one cutoff is specified in the pair_style command, it is used for -both the LJ and Coulombic (q,p) terms. If two cutoffs are specified, -they are used as cutoffs for the LJ and Coulombic (q,p) terms -respectively. This pair style also supports an optional {scale} keyword -as part of a pair_coeff statement, where the interactions can be -scaled according to this factor. This scale factor is also made available -for use with fix adapt. - -Style {lj/cut/dipole/long} computes long-range point-dipole -interactions as discussed in "(Toukmaji)"_#Toukmaji2. Dipole-dipole, -dipole-charge, and charge-charge interactions are all supported, along -with the standard 12/6 Lennard-Jones interactions, which are computed -with a cutoff. A "kspace_style"_kspace_style.html must be defined to -use this pair style. Currently, only "kspace_style -ewald/disp"_kspace_style.html support long-range point-dipole -interactions. - -Style {lj/long/dipole/long} also computes point-dipole interactions as -discussed in "(Toukmaji)"_#Toukmaji2. Long-range dipole-dipole, -dipole-charge, and charge-charge interactions are all supported, along -with the standard 12/6 Lennard-Jones interactions. LJ interactions -can be cutoff or long-ranged. - -For style {lj/long/dipole/long}, if {flag_lj} is set to {long}, no -cutoff is used on the LJ 1/r^6 dispersion term. The long-range -portion is calculated by using the "kspace_style -ewald_disp"_kspace_style.html command. The specified LJ cutoff then -determines which portion of the LJ interactions are computed directly -by the pair potential versus which part is computed in reciprocal -space via the Kspace style. If {flag_lj} is set to {cut}, the LJ -interactions are simply cutoff, as with "pair_style -lj/cut"_pair_lj.html. If {flag_lj} is set to {off}, LJ interactions -are not computed at all. - -If {flag_coul} is set to {long}, no cutoff is used on the Coulombic or -dipole interactions. The long-range portion is calculated by using -{ewald_disp} of the "kspace_style"_kspace_style.html command. If -{flag_coul} is set to {off}, Coulombic and dipole interactions are not -computed at all. - -Atoms with dipole moments should be integrated using the "fix -nve/sphere update dipole"_fix_nve_sphere.html or the "fix -nvt/sphere update dipole"_fix_nvt_sphere.html command to rotate the -dipole moments. The {omega} option on the "fix -langevin"_fix_langevin.html command can be used to thermostat the -rotational motion. The "compute temp/sphere"_compute_temp_sphere.html -command can be used to monitor the temperature, since it includes -rotational degrees of freedom. The "atom_style -hybrid dipole sphere"_atom_style.html command should be used since -it defines the point dipoles and their rotational state. -The magnitude and orientation of the dipole moment for each particle -can be defined by the "set"_set.html command or in the "Atoms" section -of the data file read in by the "read_data"_read_data.html command. - -The following coefficients must be defined for each pair of atoms -types via the "pair_coeff"_pair_coeff.html command as in the examples -above, or in the data file or restart files read by the -"read_data"_read_data.html or "read_restart"_read_restart.html -commands, or by mixing as described below: - -epsilon (energy units) -sigma (distance units) -cutoff1 (distance units) -cutoff2 (distance units) :ul - -The latter 2 coefficients are optional. If not specified, the global -LJ and Coulombic cutoffs specified in the pair_style command are used. -If only one cutoff is specified, it is used as the cutoff for both LJ -and Coulombic interactions for this type pair. If both coefficients -are specified, they are used as the LJ and Coulombic cutoffs for this -type pair. +Style {spin/dipole/long} computes long-range magnetic dipole-dipole +interaction. +A "kspace_style"_kspace_style.html must be defined to +use this pair style. Currently, "kspace_style +ewald/dipole/spin"_kspace_style.html and "kspace_style +pppm/dipole/spin"_kspace_style.html support long-range magnetic +dipole-dipole interactions. :line -Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are -functionally the same as the corresponding style without the suffix. -They have been optimized to run faster, depending on your available -hardware, as discussed on the "Speed packages"_Speed_packages.html doc -page. The accelerated styles take the same arguments and should -produce the same results, except for round-off and precision issues. - -These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, -USER-OMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the "Build -package"_Build_package.html doc page for more info. - -You can specify the accelerated styles explicitly in your input script -by including their suffix, or you can use the "-suffix command-line -switch"_Run_options.html when you invoke LAMMPS, or you can use the -"suffix"_suffix.html command in your input script. - -See the "Speed packages"_Speed_packages.html doc page for more -instructions on how to use the accelerated styles effectively. - -:line - -[Mixing, shift, table, tail correction, restart, rRESPA info]: - -For atom type pairs I,J and I != J, the epsilon and sigma coefficients -and cutoff distances for this pair style can be mixed. The default -mix value is {geometric}. See the "pair_modify" command for details. - -For atom type pairs I,J and I != J, the A, sigma, d1, and d2 -coefficients and cutoff distance for this pair style can be mixed. A -is an energy value mixed like a LJ epsilon. D1 and d2 are distance -values and are mixed like sigma. The default mix value is -{geometric}. See the "pair_modify" command for details. - -This pair style does not support the "pair_modify"_pair_modify.html -shift option for the energy of the Lennard-Jones portion of the pair -interaction; such energy goes to zero at the cutoff by construction. - The "pair_modify"_pair_modify.html table option is not relevant for this pair style. @@ -215,28 +65,20 @@ This pair style writes its information to "binary restart files"_restart.html, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -This pair style can only be used via the {pair} keyword of the -"run_style respa"_run_style.html command. It does not support the -{inner}, {middle}, {outer} keywords. - [Restrictions:] -The {lj/cut/dipole/cut}, {lj/cut/dipole/long}, and -{lj/long/dipole/long} styles are part of the DIPOLE package. They are -only enabled if LAMMPS was built with that package. See the "Build -package"_Build_package.html doc page for more info. +The {spin/dipole/cut} and {spin/dipole/long} styles are part of +the SPIN package. They are only enabled if LAMMPS was built with that +package. See the "Build package"_Build_package.html doc page for more +info. -The {lj/sf/dipole/sf} style is part of the USER-MISC package. It is -only enabled if LAMMPS was built with that package. See the "Build -package"_Build_package.html doc page for more info. - -Using dipole pair styles with {electron} "units"_units.html is not +Using dipole/spin pair styles with {electron} "units"_units.html is not currently supported. [Related commands:] -"pair_coeff"_pair_coeff.html, "set"_set.html, "read_data"_read_data.html, -"fix nve/sphere"_fix_nve_sphere.html, "fix nvt/sphere"_fix_nvt_sphere.html +"pair_coeff"_pair_coeff.html, "kspace_style"_kspace_style.html +"fix nve/spin"_fix_nve_spin.html [Default:] none @@ -245,13 +87,3 @@ currently supported. :link(Allen2) [(Allen)] Allen and Tildesley, Computer Simulation of Liquids, Clarendon Press, Oxford, 1987. - -:link(Toukmaji2) -[(Toukmaji)] Toukmaji, Sagui, Board, and Darden, J Chem Phys, 113, -10913 (2000). - -:link(Stoddard) -[(Stoddard)] Stoddard and Ford, Phys Rev A, 8, 1504 (1973). - -:link(Price2) -[(Price)] Price, Stone and Alderton, Mol Phys, 52, 987 (1984). diff --git a/examples/SPIN/dipole_spin/in.spin.iron_ewald b/examples/SPIN/dipole_spin/in.spin.iron_ewald index d4703a2959..75e202d61c 100644 --- a/examples/SPIN/dipole_spin/in.spin.iron_ewald +++ b/examples/SPIN/dipole_spin/in.spin.iron_ewald @@ -21,12 +21,16 @@ mass 1 55.845 set group all spin 2.2 -1.0 0.0 0.0 velocity all create 100 4928459 rot yes dist gaussian -pair_style hybrid/overlay eam/alloy spin/exchange 3.5 +pair_style hybrid/overlay eam/alloy spin/exchange 3.5 spin/dipole/long 8.0 pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe pair_coeff * * spin/exchange exchange 3.4 0.02726 0.2171 1.841 +pair_coeff * * spin/dipole/long 8.0 + neighbor 0.1 bin neigh_modify every 10 check yes delay 20 +kspace_style ewald/dipole/spin 1.0e-4 + fix 1 all precession/spin cubic 0.001 0.0005 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 fix_modify 1 energy yes fix 2 all langevin/spin 0.0 0.0 21 @@ -55,6 +59,3 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] run 2000 -# min_style spin -# min_modify alpha_damp 1.0 discrete_factor 10 -# minimize 1.0e-16 1.0e-16 10000 10000 diff --git a/examples/SPIN/dipole_spin/in.spin.iron_pppm b/examples/SPIN/dipole_spin/in.spin.iron_pppm index d4703a2959..ea88b518f3 100644 --- a/examples/SPIN/dipole_spin/in.spin.iron_pppm +++ b/examples/SPIN/dipole_spin/in.spin.iron_pppm @@ -21,12 +21,17 @@ mass 1 55.845 set group all spin 2.2 -1.0 0.0 0.0 velocity all create 100 4928459 rot yes dist gaussian -pair_style hybrid/overlay eam/alloy spin/exchange 3.5 +pair_style hybrid/overlay eam/alloy spin/exchange 3.5 spin/dipole/long 8.0 pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe pair_coeff * * spin/exchange exchange 3.4 0.02726 0.2171 1.841 +pair_coeff * * spin/dipole/long 8.0 + neighbor 0.1 bin neigh_modify every 10 check yes delay 20 +kspace_style pppm/dipole/spin 1.0e-4 +kspace_modify compute yes + fix 1 all precession/spin cubic 0.001 0.0005 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 fix_modify 1 energy yes fix 2 all langevin/spin 0.0 0.0 21 diff --git a/src/.gitignore b/src/.gitignore index 1e073bb657..ad38fc3d46 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -166,6 +166,10 @@ /pair_spin.h /pair_spin_dmi.cpp /pair_spin_dmi.h +/pair_spin_dipole_cut.cpp +/pair_spin_dipole_cut.h +/pair_spin_dipole_long.cpp +/pair_spin_dipole_long.h /pair_spin_exchange.cpp /pair_spin_exchange.h /pair_spin_magelec.cpp @@ -427,6 +431,10 @@ /ewald.h /ewald_cg.cpp /ewald_cg.h +/ewald_dipole.cpp +/ewald_dipole.h +/ewald_dipole_spin.cpp +/ewald_dipole_spin.h /ewald_disp.cpp /ewald_disp.h /ewald_n.cpp @@ -1026,6 +1034,10 @@ /pppm.h /pppm_cg.cpp /pppm_cg.h +/pppm_dipole.cpp +/pppm_dipole.h +/pppm_dipole_spin.cpp +/pppm_dipole_spin.h /pppm_disp.cpp /pppm_disp.h /pppm_disp_tip4p.cpp diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 514ba8925c..25661555fa 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -94,7 +94,6 @@ void EwaldDipole::init() error->all(FLERR,"Cannot use EwaldDipole with 2d simulation"); if (!atom->mu) error->all(FLERR,"Kspace style requires atom attribute mu"); -//if (!atom->q_flag) error->all(FLERR,"Kspace style requires atom attribute q"); if (dipoleflag && strcmp(update->unit_style,"electron") == 0) error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 1aace3eb1b..35f5daafba 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -51,8 +51,6 @@ EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp) : spinflag = 1; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - //mub = 5.78901e-5; // in eV/T - //mu_0 = 1.2566370614e-6; // in T.m/A mub = 9.274e-4; // in A.Ang^2 mu_0 = 785.15; // in eV/Ang/A^2 mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 @@ -437,7 +435,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // compute field for torque calculation - //partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; tk[i][0] += partial2*eg[k][0]; tk[i][1] += partial2*eg[k][1]; @@ -456,12 +453,10 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // (for per-atom energy and virial calc.) if (evflag_atom) { - //partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; if (eflag_atom) eatom[i] += mudotk*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) vatom[i][j] += (ug[k]*mudotk*vg[k][j]*partial_peratom - vcik[j]); - //vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); } } } diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index b864401ae1..23d7beaece 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -70,8 +70,6 @@ PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp) : spinflag = 1; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - //mub = 5.78901e-5; // in eV/T - //mu_0 = 1.2566370614e-6; // in T.m/A mub = 9.274e-4; // in A.Ang^2 mu_0 = 785.15; // in eV/Ang/A^2 mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 @@ -157,7 +155,7 @@ void PPPMDipoleSpin::init() int itmp = 0; double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); - // probably not the correct extract here + // check the correct extract here if (p_cutoff == NULL) error->all(FLERR,"KSpace style is incompatible with Pair style"); cutoff = *p_cutoff; diff --git a/src/SPIN/pair_spin_dipole_cut.cpp b/src/SPIN/pair_spin_dipole_cut.cpp index 360e3c47de..405657ccbf 100644 --- a/src/SPIN/pair_spin_dipole_cut.cpp +++ b/src/SPIN/pair_spin_dipole_cut.cpp @@ -58,7 +58,7 @@ lockfixnvespin(NULL) mub = 9.274e-4; // in A.Ang^2 mu_0 = 785.15; // in eV/Ang/A^2 mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } @@ -115,8 +115,8 @@ void PairSpinDipoleCut::settings(int narg, char **arg) void PairSpinDipoleCut::coeff(int narg, char **arg) { if (!allocated) allocate(); - - if (narg < 1 || narg > 3) + + if (narg != 3) error->all(FLERR,"Incorrect args in pair_style command"); int ilo,ihi,jlo,jhi; @@ -216,24 +216,21 @@ void *PairSpinDipoleCut::extract(const char *str, int &dim) void PairSpinDipoleCut::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; - double rinv,r2inv,r3inv,rsq; - double evdwl,ecoul; - double xi[3],rij[3],eij[3]; - double spi[4],spj[4],fi[3],fmi[3]; - double local_cut2; int *ilist,*jlist,*numneigh,**firstneigh; + double rinv,r2inv,r3inv,rsq,local_cut2,evdwl,ecoul; + double xi[3],rij[3],eij[3],spi[4],spj[4],fi[3],fmi[3]; evdwl = ecoul = 0.0; if (eflag || vflag) ev_setup(eflag,vflag); else evflag = vflag_fdotr = 0; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; double **x = atom->x; double **f = atom->f; double **fm = atom->fm; double **sp = atom->sp; - int *type = atom->type; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; inum = list->inum; ilist = list->ilist; @@ -320,70 +317,90 @@ void PairSpinDipoleCut::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- update the pair interaction fmi acting on the spin ii - adding 1/r (for r in [0,rc]) contribution to the pair - removing erf(r)/r (for r in [0,rc]) from the kspace force ------------------------------------------------------------------------- */ void PairSpinDipoleCut::compute_single_pair(int ii, double fmi[3]) { - int i,j,jj,jnum,itype,jtype; - double rsq,rinv,r2inv,r3inv; - double xi[3],rij[3],eij[3]; - double spi[4],spj[4]; - double local_cut2; + int j,jnum,itype,jtype,ntypes; int *ilist,*jlist,*numneigh,**firstneigh; + double rsq,rinv,r2inv,r3inv,local_cut2; + double xi[3],rij[3],eij[3],spi[4],spj[4]; + int k,locflag; + int *type = atom->type; double **x = atom->x; double **sp = atom->sp; - int *type = atom->type; - ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - // computation of the exchange interaction - // loop over neighbors of atom i - - i = ilist[ii]; - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; - spi[3] = sp[i][3]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - itype = type[i]; + // check if interaction applies to type of ii - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; + itype = type[ii]; + ntypes = atom->ntypes; + locflag = 0; + k = 1; + while (k <= ntypes) { + if (k <= itype) { + if (setflag[k][itype] == 1) { + locflag =1; + break; + } + k++; + } else if (k > itype) { + if (setflag[itype][k] == 1) { + locflag =1; + break; + } + k++; + } else error->all(FLERR,"Wrong type number"); + } - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - rinv = 1.0/sqrt(rsq); - eij[0] = rij[0]*rinv; - eij[1] = rij[1]*rinv; - eij[2] = rij[2]*rinv; + // if interaction applies to type ii, + // locflag = 1 and compute pair interaction + + if (locflag == 1) { - local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + xi[0] = x[ii][0]; + xi[1] = x[ii][1]; + xi[2] = x[ii][2]; + spi[0] = sp[ii][0]; + spi[1] = sp[ii][1]; + spi[2] = sp[ii][2]; + spi[3] = sp[ii][3]; + jlist = firstneigh[ii]; + jnum = numneigh[ii]; + + for (int jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; - if (rsq < local_cut2) { - r2inv = 1.0/rsq; - r3inv = r2inv*rinv; - - // compute dipolar interaction - - compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; + + rij[0] = x[j][0] - xi[0]; + rij[1] = x[j][1] - xi[1]; + rij[2] = x[j][2] - xi[2]; + rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + r3inv = r2inv*rinv; + + // compute dipolar interaction + + compute_dipolar(ii,j,eij,fmi,spi,spj,r3inv); + } } } } @@ -424,11 +441,11 @@ void PairSpinDipoleCut::compute_dipolar_mech(int i, int j, double eij[3], sjeij = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; bij = sisj - 5.0*sieij*sjeij; - pre = mub2mu0*gigjri4; + pre = 3.0*mub2mu0*gigjri4; - fi[0] += pre * (eij[0] * bij + (sjeij*spi[0] + sieij*spj[0])); - fi[1] += pre * (eij[1] * bij + (sjeij*spi[1] + sieij*spj[1])); - fi[2] += pre * (eij[2] * bij + (sjeij*spi[2] + sieij*spj[2])); + fi[0] -= pre * (eij[0] * bij + (sjeij*spi[0] + sieij*spj[0])); + fi[1] -= pre * (eij[1] * bij + (sjeij*spi[1] + sieij*spj[1])); + fi[2] -= pre * (eij[2] * bij + (sjeij*spi[2] + sieij*spj[2])); } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/pair_spin_dipole_long.cpp b/src/SPIN/pair_spin_dipole_long.cpp index 45f08955de..bf9bdeb91b 100644 --- a/src/SPIN/pair_spin_dipole_long.cpp +++ b/src/SPIN/pair_spin_dipole_long.cpp @@ -60,8 +60,6 @@ lockfixnvespin(NULL) lattice_flag = 0; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - //mub = 5.78901e-5; // in eV/T - //mu_0 = 1.2566370614e-6; // in T.m/A mub = 9.274e-4; // in A.Ang^2 mu_0 = 785.15; // in eV/Ang/A^2 mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 @@ -120,18 +118,14 @@ void PairSpinDipoleLong::coeff(int narg, char **arg) { if (!allocated) allocate(); - // check if args correct - - if (strcmp(arg[2],"long") != 0) - error->all(FLERR,"Incorrect args in pair_style command"); - if (narg < 1 || narg > 4) + if (narg != 3) error->all(FLERR,"Incorrect args in pair_style command"); int ilo,ihi,jlo,jhi; force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - double spin_long_cut_one = force->numeric(FLERR,arg[3]); + double spin_long_cut_one = force->numeric(FLERR,arg[2]); int count = 0; for (int i = ilo; i <= ihi; i++) { @@ -181,15 +175,10 @@ void PairSpinDipoleLong::init_style() // insure use of KSpace long-range solver, set g_ewald - //if (force->kspace == NULL) - // error->all(FLERR,"Pair style requires a KSpace style"); - - //g_ewald = force->kspace->g_ewald; - - // test case - g_ewald = 0.1; - + if (force->kspace == NULL) + error->all(FLERR,"Pair style requires a KSpace style"); + g_ewald = force->kspace->g_ewald; } /* ---------------------------------------------------------------------- @@ -312,7 +301,6 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) if (rsq < local_cut2) { r2inv = 1.0/rsq; - //rinv = sqrt(r2inv); r = sqrt(rsq); grij = g_ewald * r; @@ -327,8 +315,6 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) compute_long(i,j,eij,bij,fmi,spi,spj); compute_long_mech(i,j,eij,bij,fmi,spi,spj); - //compute_long(i,j,rij,bij,fmi,spi,spj); - //compute_long_mech(i,j,rij,bij,fmi,spi,spj); } // force accumulation @@ -368,95 +354,117 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) { - int i,j,jj,jnum,itype,jtype; - double r,rinv,r2inv,rsq; - double grij,expm2,t,erfc; - double bij[4]; - double xi[3],rij[3],eij[3]; - double spi[4],spj[4]; - double local_cut2; - double pre1,pre2,pre3; + //int i,j,jj,jnum,itype,jtype; + int j,jj,jnum,itype,jtype,ntypes; + int k,locflag; int *ilist,*jlist,*numneigh,**firstneigh; + double r,rinv,r2inv,rsq,grij,expm2,t,erfc; + double local_cut2,pre1,pre2,pre3; + double bij[4],xi[3],rij[3],eij[3],spi[4],spj[4]; + int *type = atom->type; double **x = atom->x; double **sp = atom->sp; double **fm_long = atom->fm_long; - int *type = atom->type; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; + + // check if interaction applies to type of ii - pre1 = 2.0 * g_ewald / MY_PIS; - pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; - pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; - - // computation of the exchange interaction - // loop over neighbors of atom i - - i = ilist[ii]; - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; - spi[3] = sp[i][3]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - itype = type[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; - - fmi[0] = fmi[1] = fmi[2] = 0.0; - bij[0] = bij[1] = bij[2] = bij[3] = 0.0; - - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - rinv = 1.0/sqrt(rsq); - eij[0] = rij[0]*rinv; - eij[1] = rij[1]*rinv; - eij[2] = rij[2]*rinv; - - local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; - - if (rsq < local_cut2) { - r2inv = 1.0/rsq; - //rinv = sqrt(r2inv); - - r = sqrt(rsq); - grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - - bij[0] = erfc * rinv; - bij[1] = (bij[0] + pre1*expm2) * r2inv; - bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; - bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - - compute_long(i,j,eij,bij,fmi,spi,spj); - } + itype = type[ii]; + ntypes = atom->ntypes; + locflag = 0; + k = 1; + while (k <= ntypes) { + if (k <= itype) { + if (setflag[k][itype] == 1) { + locflag =1; + break; + } + k++; + } else if (k > itype) { + if (setflag[itype][k] == 1) { + locflag =1; + break; + } + k++; + } else error->all(FLERR,"Wrong type number"); } - // adding the kspace components to fm + // if interaction applies to type ii, + // locflag = 1 and compute pair interaction - //printf("test fm before: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); - //printf("test fm_long: %g, %g, %g \n",fm_long[i][0],fm_long[i][1],fm_long[i][2]); - fmi[0] += fm_long[i][0]; - fmi[1] += fm_long[i][1]; - fmi[2] += fm_long[i][2]; - //printf("test fm after: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); + if (locflag == 1) { + + pre1 = 2.0 * g_ewald / MY_PIS; + pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; + pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; + + // computation of the exchange interaction + // loop over neighbors of atom i + + //i = ilist[ii]; + xi[0] = x[ii][0]; + xi[1] = x[ii][1]; + xi[2] = x[ii][2]; + spi[0] = sp[ii][0]; + spi[1] = sp[ii][1]; + spi[2] = sp[ii][2]; + spi[3] = sp[ii][3]; + jlist = firstneigh[ii]; + jnum = numneigh[ii]; + //itype = type[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; + + fmi[0] = fmi[1] = fmi[2] = 0.0; + bij[0] = bij[1] = bij[2] = bij[3] = 0.0; + + rij[0] = x[j][0] - xi[0]; + rij[1] = x[j][1] - xi[1]; + rij[2] = x[j][2] - xi[2]; + rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + compute_long(ii,j,eij,bij,fmi,spi,spj); + } + } + + // adding the kspace components to fm + + fmi[0] += fm_long[ii][0]; + fmi[1] += fm_long[ii][1]; + fmi[2] += fm_long[ii][2]; + } } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/pair_spin_dipole_long.h b/src/SPIN/pair_spin_dipole_long.h index d3f9857716..6a05f56032 100644 --- a/src/SPIN/pair_spin_dipole_long.h +++ b/src/SPIN/pair_spin_dipole_long.h @@ -89,7 +89,7 @@ E: Pair dipole/long requires atom attributes q, mu, torque The atom style defined does not have these attributes. -E: Cannot (yet) use 'electron' units with dipoles +E: Can only use 'metal' units with spins This feature is not yet supported. diff --git a/src/SPIN/pair_spin_dipole_long_qsymp.cpp b/src/SPIN/pair_spin_dipole_long_qsymp.cpp deleted file mode 100644 index b77c3cb80a..0000000000 --- a/src/SPIN/pair_spin_dipole_long_qsymp.cpp +++ /dev/null @@ -1,606 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------ - Contributing authors: Julien Tranchida (SNL) - Stan Moore (SNL) -------------------------------------------------------------------------- */ - -#include -#include -#include -#include - -#include "pair_spin_dipole_long_qsymp.h" -#include "atom.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "fix_nve_spin.h" -#include "force.h" -#include "kspace.h" -#include "math_const.h" -#include "memory.h" -#include "modify.h" -#include "error.h" -#include "update.h" - - -using namespace LAMMPS_NS; -using namespace MathConst; - -#define EWALD_F 1.12837917 -#define EWALD_P 0.3275911 -#define A1 0.254829592 -#define A2 -0.284496736 -#define A3 1.421413741 -#define A4 -1.453152027 -#define A5 1.061405429 - -/* ---------------------------------------------------------------------- */ - -PairSpinDipoleLongQsymp::PairSpinDipoleLongQsymp(LAMMPS *lmp) : PairSpin(lmp), -lockfixnvespin(NULL) -{ - single_enable = 0; - ewaldflag = pppmflag = spinflag = 1; - respa_enable = 0; - no_virial_fdotr_compute = 1; - lattice_flag = 0; - - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - //mub = 5.78901e-5; // in eV/T - //mu_0 = 1.2566370614e-6; // in T.m/A - mub = 9.274e-4; // in A.Ang^2 - mu_0 = 785.15; // in eV/Ang/A^2 - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 - //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz - -} - -/* ---------------------------------------------------------------------- - free all arrays -------------------------------------------------------------------------- */ - -PairSpinDipoleLongQsymp::~PairSpinDipoleLongQsymp() -{ - if (allocated) { - memory->destroy(setflag); - memory->destroy(cut_spin_long); - memory->destroy(cutsq); - } -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::settings(int narg, char **arg) -{ - if (narg < 1 || narg > 2) - error->all(FLERR,"Incorrect args in pair_style command"); - - if (strcmp(update->unit_style,"metal") != 0) - error->all(FLERR,"Spin simulations require metal unit style"); - - cut_spin_long_global = force->numeric(FLERR,arg[0]); - - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i+1; j <= atom->ntypes; j++) { - if (setflag[i][j]) { - cut_spin_long[i][j] = cut_spin_long_global; - } - } - } - } - -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::coeff(int narg, char **arg) -{ - if (!allocated) allocate(); - - // check if args correct - - if (strcmp(arg[2],"long") != 0) - error->all(FLERR,"Incorrect args in pair_style command"); - if (narg < 1 || narg > 4) - error->all(FLERR,"Incorrect args in pair_style command"); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - double spin_long_cut_one = force->numeric(FLERR,arg[3]); - - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - setflag[i][j] = 1; - cut_spin_long[i][j] = spin_long_cut_one; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init specific to this pair style -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::init_style() -{ - if (!atom->sp_flag) - error->all(FLERR,"Pair spin requires atom/spin style"); - - // need a full neighbor list - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - - // checking if nve/spin is a listed fix - - int ifix = 0; - while (ifix < modify->nfix) { - if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; - ifix++; - } - if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); - - // get the lattice_flag from nve/spin - - for (int i = 0; i < modify->nfix; i++) { - if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { - lockfixnvespin = (FixNVESpin *) modify->fix[i]; - lattice_flag = lockfixnvespin->lattice_flag; - } - } - - // insure use of KSpace long-range solver, set g_ewald - - if (force->kspace == NULL) - error->all(FLERR,"Pair style requires a KSpace style"); - - g_ewald = force->kspace->g_ewald; - -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairSpinDipoleLongQsymp::init_one(int i, int j) -{ - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - - cut_spin_long[j][i] = cut_spin_long[i][j]; - - return cut_spin_long_global; -} - -/* ---------------------------------------------------------------------- - extract the larger cutoff if "cut" or "cut_coul" -------------------------------------------------------------------------- */ - -void *PairSpinDipoleLongQsymp::extract(const char *str, int &dim) -{ - if (strcmp(str,"cut") == 0) { - dim = 0; - return (void *) &cut_spin_long_global; - } else if (strcmp(str,"cut_coul") == 0) { - dim = 0; - return (void *) &cut_spin_long_global; - } else if (strcmp(str,"ewald_order") == 0) { - ewald_order = 0; - ewald_order |= 1<<1; - ewald_order |= 1<<3; - dim = 0; - return (void *) &ewald_order; - } else if (strcmp(str,"ewald_mix") == 0) { - dim = 0; - return (void *) &mix_flag; - } - return NULL; -} - -/* ---------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double r,rinv,r2inv,rsq; - double grij,expm2,t,erfc,erf; - double sjdotr,gigj; - double bij[4]; - double cij[4]; - double evdwl,ecoul; - double xi[3],rij[3]; - double spi[4],spj[4],fi[3],fmi[3]; - double fmx_erf_s,fmy_erf_s,fmz_erf_s; - double local_cut2; - double pre1,pre2,pre3; - int *ilist,*jlist,*numneigh,**firstneigh; - - evdwl = ecoul = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - double **x = atom->x; - double **f = atom->f; - double **fm = atom->fm; - double **fm_long = atom->fm_long; - double **sp = atom->sp; - int *type = atom->type; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - pre1 = 2.0 * g_ewald / MY_PIS; - pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; - pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; - - // computation of the exchange interaction - // loop over atoms and their neighbors - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; - spi[3] = sp[i][3]; - itype = type[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; - - evdwl = 0.0; - - fi[0] = fi[1] = fi[2] = 0.0; - fmi[0] = fmi[1] = fmi[2] = 0.0; - fmx_erf_s = fmy_erf_s = fmz_erf_s = 0.0; - bij[0] = bij[1] = bij[2] = bij[3] = 0.0; - cij[0] = cij[1] = cij[2] = cij[3] = 0.0; - - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - - local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; - - if (rsq < local_cut2) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - - r = sqrt(rsq); - grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - erf = 1.0 - t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - - // evaluating erfc for mech. force and energy calc. - - bij[0] = erfc * rinv; - bij[1] = (bij[0] + pre1*expm2) * r2inv; - bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; - bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - - compute_long(i,j,rij,bij,fmi,spi,spj); - compute_long_mech(i,j,rij,bij,fmi,spi,spj); - - // evaluating erf comp. for fm_kspace correction - - cij[0] = erf * rinv; - cij[1] = (bij[0] + pre1*expm2) * r2inv; - cij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; - //cij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - - gigj = spi[3] * spj[3]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - - // evaluating short-range correction to the kspace part on [0,rc] - - fmx_erf_s += gigj * (cij[2] * sjdotr * rij[0] - cij[1] * spj[0]); - fmy_erf_s += gigj * (cij[2] * sjdotr * rij[1] - cij[1] * spj[1]); - fmz_erf_s += gigj * (cij[2] * sjdotr * rij[2] - cij[1] * spj[2]); - - } - - // force accumulation - - f[i][0] += fi[0] * mub2mu0; - f[i][1] += fi[1] * mub2mu0; - f[i][2] += fi[2] * mub2mu0; - fm[i][0] += fmi[0] * mub2mu0hbinv; - fm[i][1] += fmi[1] * mub2mu0hbinv; - fm[i][2] += fmi[2] * mub2mu0hbinv; - - // correction of the fm_kspace - - fm_long[i][0] -= (mub2mu0hbinv * fmx_erf_s); - fm_long[i][1] -= (mub2mu0hbinv * fmy_erf_s); - fm_long[i][2] -= (mub2mu0hbinv * fmz_erf_s); - - if (newton_pair || j < nlocal) { - f[j][0] -= fi[0]; - f[j][1] -= fi[1]; - f[j][2] -= fi[2]; - } - - if (eflag) { - if (rsq <= local_cut2) { - evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + - spi[2]*fmi[2]; - evdwl *= hbar; - } - } else evdwl = 0.0; - - - if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, - evdwl,ecoul,fi[0],fi[1],fi[2],rij[0],rij[1],rij[2]); - - } - } -} - -/* ---------------------------------------------------------------------- - update the pair interaction fmi acting on the spin ii - adding 1/r (for r in [0,rc]) contribution to the pair - removing erf(r)/r (for r in [0,rc]) from the kspace force -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::compute_single_pair(int ii, double fmi[3]) -{ - int i,j,jj,jnum,itype,jtype; - double rinv,r2inv,r3inv,rsq; - double sjdotr,sjdotrr3inv; - double b1,b2,gigj; - double bij[4],xi[3],rij[3]; - double spi[4],spj[4]; - double local_cut2; - int *ilist,*jlist,*numneigh,**firstneigh; - double fmx_s,fmy_s,fmz_s; - - double **x = atom->x; - double **sp = atom->sp; - double **fm_long = atom->fm_long; - int *type = atom->type; - - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - // computation of the exchange interaction - // loop over neighbors of atom i - - i = ilist[ii]; - xi[0] = x[i][0]; - xi[1] = x[i][1]; - xi[2] = x[i][2]; - spi[3] = sp[i][3]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - itype = type[i]; - - fmx_s = fmy_s = fmz_s = 0.0; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; - - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - - local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; - - // evaluating full dipolar interaction on [0,rc] - - if (rsq < local_cut2) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - - gigj = spi[3] * spj[3]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - sjdotrr3inv = 3.0 * sjdotr * r3inv; - - fmx_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[0] - sp[i][0]/r3inv); - fmy_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[1] - sp[i][1]/r3inv); - fmz_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[2] - sp[i][2]/r3inv); - } - } - - // adding truncated kspace force and short-range full force - - fmi[0] += (fmx_s + fm_long[i][0]); - fmi[1] += (fmy_s + fm_long[i][1]); - fmi[2] += (fmz_s + fm_long[i][2]); -} - -/* ---------------------------------------------------------------------- - compute dipolar interaction between spins i and j -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::compute_long(int i, int j, double rij[3], - double bij[4], double fmi[3], double spi[4], double spj[4]) -{ - double sjdotr; - double b1,b2,gigj; - - gigj = spi[3] * spj[3]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - - b1 = bij[1]; - b2 = bij[2]; - - fmi[0] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); - fmi[1] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); - fmi[2] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); -} - -/* ---------------------------------------------------------------------- - compute the mechanical force due to the dipolar interaction between - atom i and atom j -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::compute_long_mech(int i, int j, double rij[3], - double bij[4], double fi[3], double spi[3], double spj[3]) -{ - double sdots,sidotr,sjdotr,b2,b3; - double g1,g2,g1b2_g2b3,gigj; - - gigj = spi[3] * spj[3]; - sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; - sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - - b2 = bij[2]; - b3 = bij[3]; - g1 = sdots; - g2 = -sidotr*sjdotr; - g1b2_g2b3 = g1*b2 + g2*b3; - - fi[0] += gigj * (rij[0] * g1b2_g2b3 + - b2 * (sjdotr*spi[0] + sidotr*spj[0])); - fi[1] += gigj * (rij[1] * g1b2_g2b3 + - b2 * (sjdotr*spi[1] + sidotr*spj[1])); - fi[2] += gigj * (rij[2] * g1b2_g2b3 + - b2 * (sjdotr*spi[2] + sidotr*spj[2])); -} - - -/* ---------------------------------------------------------------------- - allocate all arrays -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - memory->create(cut_spin_long,n+1,n+1,"pair/spin/long:cut_spin_long"); - memory->create(cutsq,n+1,n+1,"pair/spin/long:cutsq"); -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::write_restart(FILE *fp) -{ - write_restart_settings(fp); - - int i,j; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) { - fwrite(&cut_spin_long[i][j],sizeof(int),1,fp); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::read_restart(FILE *fp) -{ - read_restart_settings(fp); - - allocate(); - - int i,j; - int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) { - for (j = i; j <= atom->ntypes; j++) { - if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); - if (setflag[i][j]) { - if (me == 0) { - fread(&cut_spin_long[i][j],sizeof(int),1,fp); - } - MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); - } - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::write_restart_settings(FILE *fp) -{ - fwrite(&cut_spin_long_global,sizeof(double),1,fp); - fwrite(&mix_flag,sizeof(int),1,fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairSpinDipoleLongQsymp::read_restart_settings(FILE *fp) -{ - if (comm->me == 0) { - fread(&cut_spin_long_global,sizeof(double),1,fp); - fread(&mix_flag,sizeof(int),1,fp); - } - MPI_Bcast(&cut_spin_long_global,1,MPI_DOUBLE,0,world); - MPI_Bcast(&mix_flag,1,MPI_INT,0,world); -} diff --git a/src/SPIN/pair_spin_dipole_long_qsymp.h b/src/SPIN/pair_spin_dipole_long_qsymp.h deleted file mode 100644 index fb5915daa2..0000000000 --- a/src/SPIN/pair_spin_dipole_long_qsymp.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(spin/dipole/long/qsymp,PairSpinDipoleLongQsymp) - -#else - -#ifndef LMP_PAIR_SPIN_DIPOLE_LONG_QSYMP_H -#define LMP_PAIR_SPIN_DIPOLE_LONG_QSYMP_H - -#include "pair_spin.h" - -namespace LAMMPS_NS { - -class PairSpinDipoleLongQsymp : public PairSpin { - public: - double cut_coul; - double **sigma; - - PairSpinDipoleLongQsymp(class LAMMPS *); - virtual ~PairSpinDipoleLongQsymp(); - void settings(int, char **); - void coeff(int, char **); - double init_one(int, int); - void init_style(); - void *extract(const char *, int &); - - void compute(int, int); - void compute_single_pair(int, double *); - - void compute_long(int, int, double *, double *, double *, - double *, double *); - void compute_long_mech(int, int, double *, double *, double *, - double *, double *); - - void write_restart(FILE *); - void read_restart(FILE *); - void write_restart_settings(FILE *); - void read_restart_settings(FILE *); - - double cut_spin_long_global; // global long cutoff distance - - protected: - double hbar; // reduced Planck's constant - double mub; // Bohr's magneton - double mu_0; // vacuum permeability - double mub2mu0; // prefactor for mech force - double mub2mu0hbinv; // prefactor for mag force - - double **cut_spin_long; // cutoff distance long - - double g_ewald; - int ewald_order; - - int lattice_flag; // flag for mech force computation - class FixNVESpin *lockfixnvespin; // ptr for setups - - void allocate(); -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: - -E: Incorrect args in pair_style command - -Self-explanatory. - -E: Incorrect args for pair coefficients - -Self-explanatory. Check the input script or data file. - -E: Pair dipole/long requires atom attributes q, mu, torque - -The atom style defined does not have these attributes. - -E: Cannot (yet) use 'electron' units with dipoles - -This feature is not yet supported. - -E: Pair style requires a KSpace style - -No kspace style is defined. - -*/ diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index aa9e94be16..93b6d9501e 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -75,7 +75,7 @@ PairSpinExchange::~PairSpinExchange() void PairSpinExchange::settings(int narg, char **arg) { - if (narg < 1 || narg > 2) + if (narg < 1 || narg > 7) error->all(FLERR,"Incorrect number of args in pair_style pair/spin command"); if (strcmp(update->unit_style,"metal") != 0) From 601746b565a447508c91d24eb4ef2ad9488b9f32 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 18 May 2019 13:09:25 -0400 Subject: [PATCH 39/90] restore lost changes to fix gpu from upstream --- src/GPU/fix_gpu.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/GPU/fix_gpu.cpp b/src/GPU/fix_gpu.cpp index 7be87939fe..f0558e6a02 100644 --- a/src/GPU/fix_gpu.cpp +++ b/src/GPU/fix_gpu.cpp @@ -30,6 +30,7 @@ #include "neighbor.h" #include "citeme.h" #include "error.h" +#include "utils.h" using namespace LAMMPS_NS; using namespace FixConst; @@ -231,21 +232,16 @@ void FixGPU::init() // make sure fdotr virial is not accumulated multiple times - if (force->pair_match("hybrid",1) != NULL) { + if (force->pair_match("^hybrid",0) != NULL) { PairHybrid *hybrid = (PairHybrid *) force->pair; for (int i = 0; i < hybrid->nstyles; i++) - if (strstr(hybrid->keywords[i],"/gpu")==NULL) - force->pair->no_virial_fdotr_compute = 1; - } else if (force->pair_match("hybrid/overlay",1) != NULL) { - PairHybridOverlay *hybrid = (PairHybridOverlay *) force->pair; - for (int i = 0; i < hybrid->nstyles; i++) - if (strstr(hybrid->keywords[i],"/gpu")==NULL) + if (!utils::strmatch(hybrid->keywords[i],"/gpu$")) force->pair->no_virial_fdotr_compute = 1; } // rRESPA support - if (strstr(update->integrate_style,"respa")) + if (utils::strmatch(update->integrate_style,"^respa")) _nlevels_respa = ((Respa *) update->integrate)->nlevels; } @@ -276,7 +272,7 @@ void FixGPU::min_setup(int vflag) /* ---------------------------------------------------------------------- */ -void FixGPU::post_force(int vflag) +void FixGPU::post_force(int /* vflag */) { if (!force->pair) return; @@ -308,7 +304,7 @@ void FixGPU::min_post_force(int vflag) /* ---------------------------------------------------------------------- */ -void FixGPU::post_force_respa(int vflag, int ilevel, int iloop) +void FixGPU::post_force_respa(int vflag, int /* ilevel */, int /* iloop */) { post_force(vflag); } From dc8b43a95fe04a5077bb513399422000b9255b9e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 18 May 2019 15:16:10 -0400 Subject: [PATCH 40/90] update docs and sources and for changes in this branch --- doc/src/Errors_messages.txt | 8 -------- doc/src/Speed_compare.txt | 2 +- doc/src/package.txt | 10 ++++------ src/GPU/README | 5 ++--- src/GPU/fix_gpu.h | 8 -------- 5 files changed, 7 insertions(+), 26 deletions(-) diff --git a/doc/src/Errors_messages.txt b/doc/src/Errors_messages.txt index fb5003e602..59371fcb05 100644 --- a/doc/src/Errors_messages.txt +++ b/doc/src/Errors_messages.txt @@ -2146,10 +2146,6 @@ Self-explanatory. :dd This is a current restriction in LAMMPS. :dd -{Cannot use pair hybrid with GPU neighbor list builds} :dt - -Neighbor list builds must be done on the CPU for this pair style. :dd - {Cannot use pair tail corrections with 2d simulations} :dt The correction factors are only currently defined for 3d systems. :dd @@ -5467,10 +5463,6 @@ Self-explanatory. :dd For this pair style, you cannot run part of the force calculation on the host. See the package command. :dd -{GPU split param must be positive for hybrid pair styles} :dt - -See the package gpu command. :dd - {GPUs are requested but Kokkos has not been compiled for CUDA} :dt Re-compile Kokkos with CUDA support to use GPUs. :dd diff --git a/doc/src/Speed_compare.txt b/doc/src/Speed_compare.txt index c93407515e..c95af3cb22 100644 --- a/doc/src/Speed_compare.txt +++ b/doc/src/Speed_compare.txt @@ -104,7 +104,7 @@ code (with a performance penalty due to having data transfers between host and GPU). :ulb,l The GPU package requires neighbor lists to be built on the CPU when using -exclusion lists, hybrid pair styles, or a triclinic simulation box. :l +exclusion lists, or a triclinic simulation box. :l The GPU package can be compiled for CUDA or OpenCL and thus supports both, Nvidia and AMD GPUs well. On Nvidia hardware, using CUDA is typically diff --git a/doc/src/package.txt b/doc/src/package.txt index c226d7942f..c3475266df 100644 --- a/doc/src/package.txt +++ b/doc/src/package.txt @@ -173,12 +173,10 @@ computation will be built. If {neigh} is {yes}, which is the default, neighbor list building is performed on the GPU. If {neigh} is {no}, neighbor list building is performed on the CPU. GPU neighbor list building currently cannot be used with a triclinic box. GPU neighbor -list calculation currently cannot be used with -"hybrid"_pair_hybrid.html pair styles. GPU neighbor lists are not -compatible with commands that are not GPU-enabled. When a non-GPU -enabled command requires a neighbor list, it will also be built on the -CPU. In these cases, it will typically be more efficient to only use -CPU neighbor list builds. +lists are not compatible with commands that are not GPU-enabled. When +a non-GPU enabled command requires a neighbor list, it will also be +built on the CPU. In these cases, it will typically be more efficient +to only use CPU neighbor list builds. The {newton} keyword sets the Newton flags for pairwise (not bonded) interactions to {off} or {on}, the same as the "newton"_newton.html diff --git a/src/GPU/README b/src/GPU/README index 792fc1a8b9..bba532beaf 100644 --- a/src/GPU/README +++ b/src/GPU/README @@ -1,9 +1,8 @@ This package implements GPU optimizations of various LAMMPS styles. -Section 5.3.1 on the manual gives details of what hardware and Cuda +Section 3.7 of the manual gives details of what hardware and Cuda software is required on your system, and full details on how to build -and use this package. See the KOKKOS package, which also has -GPU-enabled styles. +and use this package. The KOKKOS package also has GPU-enabled styles. This package uses an external library provided in lib/gpu which must be compiled before making LAMMPS. See the lib/gpu/README file and the diff --git a/src/GPU/fix_gpu.h b/src/GPU/fix_gpu.h index c190a91061..ba0b4c83cb 100644 --- a/src/GPU/fix_gpu.h +++ b/src/GPU/fix_gpu.h @@ -65,14 +65,6 @@ E: GPU package does not (yet) work with atom_style template Self-explanatory. -E: Cannot use pair hybrid with GPU neighbor list builds - -Neighbor list builds must be done on the CPU for this pair style. - -E: GPU split param must be positive for hybrid pair styles - -See the package gpu command. - E: Cannot use package gpu neigh yes with triclinic box This is a current restriction in LAMMPS. From e90eed91209d4daf8e929b03d36aa6b3670810d8 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 20 May 2019 21:48:05 -0600 Subject: [PATCH 41/90] Commit JT 052019 - deleted old doc - renamed new doc files --- .../SPIN/dipole_spin/Fe_Mishin2006.eam.alloy | 15010 +--------------- ...n.iron_ewald => in.spin.iron_dipole_ewald} | 0 ...pin.iron_pppm => in.spin.iron_dipole_pppm} | 0 .../SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy | 1 - examples/SPIN/pppm_spin/data.2 | 13 - .../exchange_fit_hcp_co/exchange_fit.py | 32 - .../exchange_fit_hcp_co/exchange_hcp_co.dat | 9 - examples/SPIN/pppm_spin/in.dipole.pppm_dipole | 56 - examples/SPIN/pppm_spin/in.spin.2 | 75 - examples/SPIN/pppm_spin/in.spin.cut_comp | 52 - examples/SPIN/pppm_spin/in.spin.ewald_spin | 68 - examples/SPIN/pppm_spin/in.spin.pppm_spin | 66 - .../SPIN/pppm_spin/in.spin.spin_dipolar_cut | 64 - 13 files changed, 1 insertion(+), 15445 deletions(-) mode change 100644 => 120000 examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy rename examples/SPIN/dipole_spin/{in.spin.iron_ewald => in.spin.iron_dipole_ewald} (100%) rename examples/SPIN/dipole_spin/{in.spin.iron_pppm => in.spin.iron_dipole_pppm} (100%) delete mode 120000 examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy delete mode 100644 examples/SPIN/pppm_spin/data.2 delete mode 100644 examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py delete mode 100644 examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat delete mode 100644 examples/SPIN/pppm_spin/in.dipole.pppm_dipole delete mode 100644 examples/SPIN/pppm_spin/in.spin.2 delete mode 100644 examples/SPIN/pppm_spin/in.spin.cut_comp delete mode 100644 examples/SPIN/pppm_spin/in.spin.ewald_spin delete mode 100644 examples/SPIN/pppm_spin/in.spin.pppm_spin delete mode 100644 examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut diff --git a/examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy b/examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy deleted file mode 100644 index 69231bb7ee..0000000000 --- a/examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy +++ /dev/null @@ -1,15009 +0,0 @@ -comment 1 -comment 2 -Converted by Ganga P Purja Pun using C++ code on Mon Nov 3 10:48:17 2014 -1 Fe -5001 2.400000000000000e-03 5001 1.134673400048920e-03 5.673367000244601e+00 -26 5.584700000000000e+01 2.855300000000000e+00 BCC - 0.000000000000000e+00 - -2.338738741480766e-02 - -4.628214468925276e-02 - -6.912258036387915e-02 - -9.175603963501618e-02 - -1.141497214000000e-01 - -1.363388222824136e-01 - -1.583226111166723e-01 - -1.800965752913192e-01 - -2.016645989796093e-01 - -2.230289901000000e-01 - -2.441907391820846e-01 - -2.651515164004249e-01 - -2.859130554412839e-01 - -3.064769176965011e-01 - -3.268446844000000e-01 - -3.470179531091855e-01 - -3.669982968636285e-01 - -3.867872784635140e-01 - -4.063864535839295e-01 - -4.257973671999999e-01 - -4.450215551034667e-01 - -4.640605423684923e-01 - -4.829158454463851e-01 - -5.015889707095635e-01 - -5.200814146000000e-01 - -5.383946650297390e-01 - -5.565301991603658e-01 - -5.744894857268537e-01 - -5.922739837155686e-01 - -6.098851423000000e-01 - -6.273244022645037e-01 - -6.445931939756846e-01 - -6.616929394780281e-01 - -6.786250511352716e-01 - -6.953909318999999e-01 - -7.119919765952718e-01 - -7.284295696432279e-01 - -7.447050873484842e-01 - -7.608198966551055e-01 - -7.767753551999997e-01 - -7.925728126189590e-01 - -8.082136084644670e-01 - -8.236990743647939e-01 - -8.390305327768360e-01 - -8.542092970000001e-01 - -8.692366724924486e-01 - -8.841139549244775e-01 - -8.988424321942350e-01 - -9.134233831702263e-01 - -9.278580778000000e-01 - -9.421477783833053e-01 - -9.562937376266863e-01 - -9.702972006149804e-01 - -9.841594035897939e-01 - -9.978815741999999e-01 - -1.011464932626877e+00 - -1.024910689374227e+00 - -1.038220047492379e+00 - -1.051394201530088e+00 - -1.064434338000000e+00 - -1.077341636148692e+00 - -1.090117264995124e+00 - -1.102762386491716e+00 - -1.115278154872840e+00 - -1.127665716000000e+00 - -1.139926208397942e+00 - -1.152060761127338e+00 - -1.164070496370367e+00 - -1.175956528594255e+00 - -1.187719964000000e+00 - -1.199361901614307e+00 - -1.210883431375302e+00 - -1.222285636497208e+00 - -1.233569592577916e+00 - -1.244736367000000e+00 - -1.255787020138112e+00 - -1.266722603828963e+00 - -1.277544163022812e+00 - -1.288252734706093e+00 - -1.298849349000000e+00 - -1.309335029515858e+00 - -1.319710789766606e+00 - -1.329977637188551e+00 - -1.340136572985217e+00 - -1.350188590000000e+00 - -1.360134674013246e+00 - -1.369975802739515e+00 - -1.379712947700534e+00 - -1.389347073262624e+00 - -1.398879136000000e+00 - -1.408310086019347e+00 - -1.417640866058629e+00 - -1.426872412303706e+00 - -1.436005653062347e+00 - -1.445041510000000e+00 - -1.453980898788701e+00 - -1.462824726507764e+00 - -1.471573894410746e+00 - -1.480229297407323e+00 - -1.488791823000000e+00 - -1.497262352264216e+00 - -1.505641758273629e+00 - -1.513930908641532e+00 - -1.522130664940848e+00 - -1.530241881000000e+00 - -1.538265404312065e+00 - -1.546202075663511e+00 - -1.554052729949587e+00 - -1.561818194964572e+00 - -1.569499292000000e+00 - -1.577096836740392e+00 - -1.584611637631811e+00 - -1.592044497451960e+00 - -1.599396212413425e+00 - -1.606667572000000e+00 - -1.613859360067553e+00 - -1.620972353850301e+00 - -1.628007324820493e+00 - -1.634965037585305e+00 - -1.641846251000000e+00 - -1.648651718746855e+00 - -1.655382187120556e+00 - -1.662038397074428e+00 - -1.668621083574689e+00 - -1.675130975000000e+00 - -1.681568794320005e+00 - -1.687935258528783e+00 - -1.694231079461267e+00 - -1.700456962682860e+00 - -1.706613607000000e+00 - -1.712701705964896e+00 - -1.718721948142722e+00 - -1.724675016499694e+00 - -1.730561586828580e+00 - -1.736382330000000e+00 - -1.742137912457411e+00 - -1.747828994017656e+00 - -1.753456229026646e+00 - -1.759020265526974e+00 - -1.764521747000000e+00 - -1.769961312537754e+00 - -1.775339594027171e+00 - -1.780657218386706e+00 - -1.785914807192779e+00 - -1.791112977000000e+00 - -1.796252339747382e+00 - -1.801333500673453e+00 - -1.806357060360666e+00 - -1.811323614328498e+00 - -1.816233753000000e+00 - -1.821088062150410e+00 - -1.825887120985276e+00 - -1.830631504346673e+00 - -1.835321782397329e+00 - -1.839958520000000e+00 - -1.844542277375300e+00 - -1.849073608812209e+00 - -1.853553064572349e+00 - -1.857981190434394e+00 - -1.862358526000000e+00 - -1.866685606181999e+00 - -1.870962962067843e+00 - -1.875191119963197e+00 - -1.879370599902195e+00 - -1.883501918000000e+00 - -1.887585586736770e+00 - -1.891622112755978e+00 - -1.895611998485404e+00 - -1.899555741651499e+00 - -1.903453835000000e+00 - -1.907306767129976e+00 - -1.911115021853308e+00 - -1.914879078883785e+00 - -1.918599413067872e+00 - -1.922276495000000e+00 - -1.925910791456493e+00 - -1.929502763824010e+00 - -1.933052869645757e+00 - -1.936561562187136e+00 - -1.940029290000000e+00 - -1.943456497684402e+00 - -1.946843625242175e+00 - -1.950191109032846e+00 - -1.953499381145042e+00 - -1.956768869000000e+00 - -1.959999996258605e+00 - -1.963193182622893e+00 - -1.966348843806269e+00 - -1.969467390558660e+00 - -1.972549230000000e+00 - -1.975594766012145e+00 - -1.978604397775412e+00 - -1.981578520793180e+00 - -1.984517526364655e+00 - -1.987421802000000e+00 - -1.990291731861874e+00 - -1.993127695559656e+00 - -1.995930069364364e+00 - -1.998699225767272e+00 - -2.001435533000000e+00 - -2.004139355858378e+00 - -2.006811055538481e+00 - -2.009450989763890e+00 - -2.012059511961222e+00 - -2.014636972000000e+00 - -2.017183716742461e+00 - -2.019700089231340e+00 - -2.022186429001382e+00 - -2.024643071393187e+00 - -2.027070349000000e+00 - -2.029468591629637e+00 - -2.031838124095820e+00 - -2.034179268100215e+00 - -2.036492342201070e+00 - -2.038777662000000e+00 - -2.041035540156417e+00 - -2.043266284490031e+00 - -2.045470200083453e+00 - -2.047647589335177e+00 - -2.049798751000000e+00 - -2.051923980684690e+00 - -2.054023570214561e+00 - -2.056097808968247e+00 - -2.058146983649728e+00 - -2.060171377000000e+00 - -2.062171268551674e+00 - -2.064146934640815e+00 - -2.066098649159696e+00 - -2.068026683134947e+00 - -2.069931304000000e+00 - -2.071812776276246e+00 - -2.073671361471072e+00 - -2.075507318519566e+00 - -2.077320903301032e+00 - -2.079112369000000e+00 - -2.080881966139512e+00 - -2.082629940879466e+00 - -2.084356537486872e+00 - -2.086061998635378e+00 - -2.087746563000000e+00 - -2.089410466229110e+00 - -2.091053941828707e+00 - -2.092677220771137e+00 - -2.094280530723314e+00 - -2.095864097000000e+00 - -2.097428142794787e+00 - -2.098972888139794e+00 - -2.100498550462023e+00 - -2.102005344216306e+00 - -2.103493482000000e+00 - -2.104963174393948e+00 - -2.106414628045970e+00 - -2.107848047779690e+00 - -2.109263636820768e+00 - -2.110661595000000e+00 - -2.112042119471926e+00 - -2.113405405101743e+00 - -2.114751645122076e+00 - -2.116081030815763e+00 - -2.117393750000000e+00 - -2.118689987937912e+00 - -2.119969928191390e+00 - -2.121233752504371e+00 - -2.122481640223532e+00 - -2.123713768000000e+00 - -2.124930310308645e+00 - -2.126131439345980e+00 - -2.127317325650607e+00 - -2.128488137848567e+00 - -2.129644042000000e+00 - -2.130785202020548e+00 - -2.131911779449632e+00 - -2.133023934312029e+00 - -2.134121824962966e+00 - -2.135205607000000e+00 - -2.136275433910872e+00 - -2.137331457489147e+00 - -2.138373827747866e+00 - -2.139402692469194e+00 - -2.140418197999999e+00 - -2.141420489142081e+00 - -2.142409707722756e+00 - -2.143385994030927e+00 - -2.144349486926974e+00 - -2.145300323000000e+00 - -2.146238637076898e+00 - -2.147164562479522e+00 - -2.148078231051947e+00 - -2.148979772720135e+00 - -2.149869315000000e+00 - -2.150746983835218e+00 - -2.151612904662093e+00 - -2.152467200947815e+00 - -2.153309993218032e+00 - -2.154141401000000e+00 - -2.154961542883784e+00 - -2.155770535619624e+00 - -2.156568494253713e+00 - -2.157355531798206e+00 - -2.158131760000000e+00 - -2.158897289576013e+00 - -2.159652229917454e+00 - -2.160396688379106e+00 - -2.161130769707277e+00 - -2.161854579000000e+00 - -2.162568220747540e+00 - -2.163271795520776e+00 - -2.163965403104795e+00 - -2.164649143391419e+00 - -2.165323114000000e+00 - -2.165987410839904e+00 - -2.166642128874188e+00 - -2.167287362019562e+00 - -2.167923202786971e+00 - -2.168549742000000e+00 - -2.169167069289456e+00 - -2.169775273557456e+00 - -2.170374442741976e+00 - -2.170964663390078e+00 - -2.171546020000000e+00 - -2.172118595836383e+00 - -2.172682474202094e+00 - -2.173237737093693e+00 - -2.173784464448991e+00 - -2.174322736000000e+00 - -2.174852630794634e+00 - -2.175374225221640e+00 - -2.175887595177988e+00 - -2.176392816678372e+00 - -2.176889964000000e+00 - -2.177379110090651e+00 - -2.177860327096639e+00 - -2.178333686466943e+00 - -2.178799258747679e+00 - -2.179257113000000e+00 - -2.179707317299531e+00 - -2.180149939409128e+00 - -2.180585046165010e+00 - -2.181012703042297e+00 - -2.181432975000000e+00 - -2.181845926509731e+00 - -2.182251621108717e+00 - -2.182650121032542e+00 - -2.183041486916871e+00 - -2.183425780000000e+00 - -2.183803061402426e+00 - -2.184173389857596e+00 - -2.184536823542827e+00 - -2.184893420600431e+00 - -2.185243238000000e+00 - -2.185586332004080e+00 - -2.185922759056265e+00 - -2.186252574500474e+00 - -2.186575831916728e+00 - -2.186892585000000e+00 - -2.187202887393400e+00 - -2.187506791832633e+00 - -2.187804350256584e+00 - -2.188095613705712e+00 - -2.188380633000000e+00 - -2.188659458643119e+00 - -2.188932140238827e+00 - -2.189198726845117e+00 - -2.189459267002233e+00 - -2.189713809000000e+00 - -2.189962400732430e+00 - -2.190205089044370e+00 - -2.190441920581333e+00 - -2.190672942002169e+00 - -2.190898199000000e+00 - -2.191117736662499e+00 - -2.191331600149922e+00 - -2.191539834109547e+00 - -2.191742482380937e+00 - -2.191939589000000e+00 - -2.192131197889608e+00 - -2.192317351831708e+00 - -2.192498093290244e+00 - -2.192673464653123e+00 - -2.192843508000000e+00 - -2.193008265149897e+00 - -2.193167777657277e+00 - -2.193322086821774e+00 - -2.193471233640668e+00 - -2.193615259000000e+00 - -2.193754203483761e+00 - -2.193888106693908e+00 - -2.194017008313546e+00 - -2.194140948496115e+00 - -2.194259967000000e+00 - -2.194374103230534e+00 - -2.194483396307522e+00 - -2.194587885225862e+00 - -2.194687608881331e+00 - -2.194782606000000e+00 - -2.194872915200472e+00 - -2.194958575082935e+00 - -2.195039623893670e+00 - -2.195116099394696e+00 - -2.195188040000000e+00 - -2.195255484352944e+00 - -2.195318470219860e+00 - -2.195377035223315e+00 - -2.195431217130485e+00 - -2.195481054000000e+00 - -2.195526583926446e+00 - -2.195567844428364e+00 - -2.195604873029958e+00 - -2.195637707516086e+00 - -2.195666386000000e+00 - -2.195690946583878e+00 - -2.195711426545218e+00 - -2.195727863658885e+00 - -2.195740296673043e+00 - -2.195748763000000e+00 - -2.195753299607926e+00 - -2.195753945356280e+00 - -2.195750739132009e+00 - -2.195743719093693e+00 - -2.195732923000000e+00 - -2.195718388771941e+00 - -2.195700155840199e+00 - -2.195678263244660e+00 - -2.195652748934943e+00 - -2.195623652000000e+00 - -2.195591012099144e+00 - -2.195554867993407e+00 - -2.195515258985693e+00 - -2.195472225489285e+00 - -2.195425807000000e+00 - -2.195376042760528e+00 - -2.195322973614639e+00 - -2.195266640267298e+00 - -2.195207082686241e+00 - -2.195144342000000e+00 - -2.195078459809379e+00 - -2.195009476453377e+00 - -2.194937433066797e+00 - -2.194862372466152e+00 - -2.194784337000000e+00 - -2.194703368615792e+00 - -2.194619509257747e+00 - -2.194532801771278e+00 - -2.194443290305841e+00 - -2.194351018000000e+00 - -2.194256027737437e+00 - -2.194158364279782e+00 - -2.194058072250755e+00 - -2.193955195446114e+00 - -2.193849779000000e+00 - -2.193741868885436e+00 - -2.193631510785602e+00 - -2.193518750557477e+00 - -2.193403634464252e+00 - -2.193286209000000e+00 - -2.193166521091908e+00 - -2.193044618884907e+00 - -2.192920550384463e+00 - -2.192794362988794e+00 - -2.192666105000000e+00 - -2.192535825071375e+00 - -2.192403570783236e+00 - -2.192269389306454e+00 - -2.192133327558461e+00 - -2.191995432000000e+00 - -2.191855748732582e+00 - -2.191714323538803e+00 - -2.191571201647935e+00 - -2.191426427571225e+00 - -2.191280046000000e+00 - -2.191132101498374e+00 - -2.190982637495000e+00 - -2.190831697104933e+00 - -2.190679323369808e+00 - -2.190525559000000e+00 - -2.190370446239990e+00 - -2.190214026313205e+00 - -2.190056340263544e+00 - -2.189897429222788e+00 - -2.189737334000000e+00 - -2.189576094894156e+00 - -2.189413751026334e+00 - -2.189250341662785e+00 - -2.189085906605225e+00 - -2.188920484000000e+00 - -2.188754111167896e+00 - -2.188586826517446e+00 - -2.188418667831656e+00 - -2.188249671505532e+00 - -2.188079874000000e+00 - -2.187909311655257e+00 - -2.187738019850499e+00 - -2.187566033827133e+00 - -2.187393388939138e+00 - -2.187220120000000e+00 - -2.187046261198758e+00 - -2.186871845656608e+00 - -2.186696906557450e+00 - -2.186521477499284e+00 - -2.186345591000000e+00 - -2.186169278929348e+00 - -2.185992573469870e+00 - -2.185815507881449e+00 - -2.185638116930091e+00 - -2.185460435000000e+00 - -2.185282496723147e+00 - -2.185104339046128e+00 - -2.184925999471230e+00 - -2.184747515559985e+00 - -2.184568926000000e+00 - -2.184390270419004e+00 - -2.184211589307456e+00 - -2.184032923638580e+00 - -2.183854314918697e+00 - -2.183675806000000e+00 - -2.183497440664645e+00 - -2.183319263062145e+00 - -2.183141318226586e+00 - -2.182963652427783e+00 - -2.182786312000000e+00 - -2.182609343803448e+00 - -2.182432796909005e+00 - -2.182256720850984e+00 - -2.182081165100584e+00 - -2.181906180000000e+00 - -2.181731816772078e+00 - -2.181558127901617e+00 - -2.181385166690271e+00 - -2.181212987245827e+00 - -2.181041644000000e+00 - -2.180871191888493e+00 - -2.180701687214938e+00 - -2.180533187286951e+00 - -2.180365750436408e+00 - -2.180199435000000e+00 - -2.180034299706266e+00 - -2.179870405073628e+00 - -2.179707812476292e+00 - -2.179546583956951e+00 - -2.179386782000000e+00 - -2.179228469569652e+00 - -2.179071710572415e+00 - -2.178916570209873e+00 - -2.178763115274171e+00 - -2.178611412000000e+00 - -2.178461526719817e+00 - -2.178313527960817e+00 - -2.178167485170301e+00 - -2.178023468394170e+00 - -2.177881548000000e+00 - -2.177741794911888e+00 - -2.177604281585152e+00 - -2.177469081134519e+00 - -2.177336267165003e+00 - -2.177205914000000e+00 - -2.177078096781969e+00 - -2.176952892179310e+00 - -2.176830377266735e+00 - -2.176710629289710e+00 - -2.176593727000000e+00 - -2.176479750089725e+00 - -2.176368778170715e+00 - -2.176260892035270e+00 - -2.176156174290115e+00 - -2.176054707000000e+00 - -2.175956572480315e+00 - -2.175861855847520e+00 - -2.175770642395214e+00 - -2.175683016800304e+00 - -2.175599066000000e+00 - -2.175518878125867e+00 - -2.175442540126260e+00 - -2.175370140365612e+00 - -2.175301769822078e+00 - -2.175237519000000e+00 - -2.175177478422601e+00 - -2.175121740498959e+00 - -2.175070398200953e+00 - -2.175023544771637e+00 - -2.174981275000000e+00 - -2.174943684570890e+00 - -2.174910868831887e+00 - -2.174882924320826e+00 - -2.174859949548785e+00 - -2.174842043000000e+00 - -2.174829303331104e+00 - -2.174821830410927e+00 - -2.174819725228089e+00 - -2.174823090027552e+00 - -2.174832027000000e+00 - -2.174846638699704e+00 - -2.174867029559900e+00 - -2.174893304738549e+00 - -2.174925569834485e+00 - -2.174963931000000e+00 - -2.175008495084293e+00 - -2.175059370394289e+00 - -2.175116665887380e+00 - -2.175180491027200e+00 - -2.175250956000000e+00 - -2.175328171805043e+00 - -2.175412250937077e+00 - -2.175503306357684e+00 - -2.175601451271103e+00 - -2.175706800000000e+00 - -2.175819467765500e+00 - -2.175939570549688e+00 - -2.176067225041086e+00 - -2.176202548787411e+00 - -2.176345660000000e+00 - -2.176496677644949e+00 - -2.176655722183164e+00 - -2.176822914601843e+00 - -2.176998376191533e+00 - -2.177182229000000e+00 - -2.177374595921169e+00 - -2.177575601341799e+00 - -2.177785370087074e+00 - -2.178004027196875e+00 - -2.178231699000000e+00 - -2.178468512862275e+00 - -2.178714597011325e+00 - -2.178970080062299e+00 - -2.179235091002944e+00 - -2.179509760000000e+00 - -2.179794218272507e+00 - -2.180088598277346e+00 - -2.180393032665419e+00 - -2.180707654074028e+00 - -2.181032597000000e+00 - -2.181367997183408e+00 - -2.181713990526695e+00 - -2.182070713375897e+00 - -2.182438302803596e+00 - -2.182816897000000e+00 - -2.183206635150288e+00 - -2.183607657686531e+00 - -2.184020105275964e+00 - -2.184444118610974e+00 - -2.184879840000000e+00 - -2.185327412889597e+00 - -2.185786981109685e+00 - -2.186258689137973e+00 - -2.186742682377725e+00 - -2.187239107000000e+00 - -2.187748109862624e+00 - -2.188269838801850e+00 - -2.188804442677439e+00 - -2.189352071523296e+00 - -2.189912875000000e+00 - -2.190487003093955e+00 - -2.191074608322116e+00 - -2.191675843787203e+00 - -2.192290862610885e+00 - -2.192919819000000e+00 - -2.193562867915730e+00 - -2.194220164552147e+00 - -2.194891865404003e+00 - -2.195578128862665e+00 - -2.196279113000000e+00 - -2.196994976008069e+00 - -2.197725877814248e+00 - -2.198471979076637e+00 - -2.199233441010543e+00 - -2.200010426000000e+00 - -2.200803097224683e+00 - -2.201611618154960e+00 - -2.202436152922896e+00 - -2.203276866629103e+00 - -2.204133924999999e+00 - -2.205007494076377e+00 - -2.205897739759803e+00 - -2.206804828380775e+00 - -2.207728927012060e+00 - -2.208670203000000e+00 - -2.209628824019662e+00 - -2.210604958519273e+00 - -2.211598775212799e+00 - -2.212610442959744e+00 - -2.213640131000000e+00 - -2.214688008997179e+00 - -2.215754247358006e+00 - -2.216839016713686e+00 - -2.217942487809252e+00 - -2.219064832000000e+00 - -2.220206221175054e+00 - -2.221366827800435e+00 - -2.222546824259503e+00 - -2.223746382727115e+00 - -2.224965677000000e+00 - -2.226204881636015e+00 - -2.227464170011377e+00 - -2.228743716360184e+00 - -2.230043696636770e+00 - -2.231364286000000e+00 - -2.232705659360148e+00 - -2.234067993079961e+00 - -2.235451464138931e+00 - -2.236856249856844e+00 - -2.238282527000000e+00 - -2.239730472524265e+00 - -2.241200265638654e+00 - -2.242692085287406e+00 - -2.244206109271373e+00 - -2.245742517000000e+00 - -2.247301488882056e+00 - -2.248883204910052e+00 - -2.250487845315945e+00 - -2.252115590911750e+00 - -2.253766623000000e+00 - -2.255441123360801e+00 - -2.257139274542631e+00 - -2.258861259219423e+00 - -2.260607260005651e+00 - -2.262377460000000e+00 - -2.264172042724291e+00 - -2.265991192137124e+00 - -2.267835092970031e+00 - -2.269703930922391e+00 - -2.271597891000000e+00 - -2.273517158096056e+00 - -2.275461918662951e+00 - -2.277432359442962e+00 - -2.279428667085979e+00 - -2.281451029000000e+00 - -2.283499633104788e+00 - -2.285574667389452e+00 - -2.287676320195930e+00 - -2.289804780398682e+00 - -2.291960237000000e+00 - -2.294142879454985e+00 - -2.296352898805551e+00 - -2.298590485768695e+00 - -2.300855830078550e+00 - -2.303149122999999e+00 - -2.305470556795997e+00 - -2.307820323545887e+00 - -2.310198615647936e+00 - -2.312605626084681e+00 - -2.315041548000000e+00 - -2.317506574745174e+00 - -2.320000900224320e+00 - -2.322524719122656e+00 - -2.325078227061991e+00 - -2.327661619000000e+00 - -2.330275089774933e+00 - -2.332918835677479e+00 - -2.335593053485966e+00 - -2.338297940187764e+00 - -2.341033693000000e+00 - -2.343800509406319e+00 - -2.346598587410773e+00 - -2.349428125303093e+00 - -2.352289321686241e+00 - -2.355182376000000e+00 - -2.358107488272472e+00 - -2.361064858786305e+00 - -2.364054687769198e+00 - -2.367077175375671e+00 - -2.370132523000000e+00 - -2.373220932737141e+00 - -2.376342606269360e+00 - -2.379497745810629e+00 - -2.382686554578887e+00 - -2.385909236000000e+00 - -2.389165993580208e+00 - -2.392457030846979e+00 - -2.395782552198058e+00 - -2.399142763298191e+00 - -2.402537869000000e+00 - -2.405968074028050e+00 - -2.409433584975734e+00 - -2.412934608682329e+00 - -2.416471351683178e+00 - -2.420044020999999e+00 - -2.423652824137149e+00 - -2.427297969206864e+00 - -2.430979664728804e+00 - -2.434698119632543e+00 - -2.438453543000000e+00 - -2.442246144168148e+00 - -2.446076133195298e+00 - -2.449943720571852e+00 - -2.453849117184546e+00 - -2.457792534000000e+00 - -2.461774182279110e+00 - -2.465794274341647e+00 - -2.469853022790889e+00 - -2.473950640299041e+00 - -2.478087340000000e+00 - -2.482263335430129e+00 - -2.486478840559030e+00 - -2.490734069661931e+00 - -2.495029237377275e+00 - -2.499364559000000e+00 - -2.503740250274207e+00 - -2.508156527124766e+00 - -2.512613605692700e+00 - -2.517111702474631e+00 - -2.521651035000000e+00 - -2.526231821279088e+00 - -2.530854278665131e+00 - -2.535518625205626e+00 - -2.540225080261870e+00 - -2.544973863000000e+00 - -2.549765192573217e+00 - -2.554599288888442e+00 - -2.559476372494764e+00 - -2.564396664604125e+00 - -2.569360386000000e+00 - -2.574367757513646e+00 - -2.579419001423863e+00 - -2.584514340338642e+00 - -2.589653996851589e+00 - -2.594838193999999e+00 - -2.600067155253186e+00 - -2.605341104662645e+00 - -2.610660266783872e+00 - -2.616024866689215e+00 - -2.621435129000000e+00 - -2.626891278432673e+00 - -2.632393541366548e+00 - -2.637942144571998e+00 - -2.643537314797249e+00 - -2.649179279000000e+00 - -2.654868264471787e+00 - -2.660604499292826e+00 - -2.666388211776204e+00 - -2.672219630341834e+00 - -2.678098984000000e+00 - -2.684026502306392e+00 - -2.690002415494505e+00 - -2.696026954017429e+00 - -2.702100348331385e+00 - -2.708222828000000e+00 - -2.714394620651795e+00 - -2.720615948464916e+00 - -2.726887030965477e+00 - -2.733208085290139e+00 - -2.739579324000000e+00 - -2.746000955816228e+00 - -2.752473185385865e+00 - -2.758996214641690e+00 - -2.765570242469367e+00 - -2.772195463000000e+00 - -2.778872066776275e+00 - -2.785600241574056e+00 - -2.792380171842594e+00 - -2.799212037606767e+00 - -2.806096015000000e+00 - -2.813032277129447e+00 - -2.820020994035244e+00 - -2.827062331911353e+00 - -2.834156451970738e+00 - -2.841303512999999e+00 - -2.848503671252426e+00 - -2.855757077985244e+00 - -2.863063881095023e+00 - -2.870424224890850e+00 - -2.877838249999999e+00 - -2.885306093928394e+00 - -2.892827890388094e+00 - -2.900403769651381e+00 - -2.908033857857018e+00 - -2.915718277999999e+00 - -2.923457150039019e+00 - -2.931250588977881e+00 - -2.939098706889091e+00 - -2.947001612872150e+00 - -2.954959411999998e+00 - -2.962972205810575e+00 - -2.971040091434060e+00 - -2.979163163083816e+00 - -2.987341511831155e+00 - -2.995575224999998e+00 - -3.003864386499012e+00 - -3.012209075546996e+00 - -3.020609368336417e+00 - -3.029065337835770e+00 - -3.037577052999999e+00 - -3.046144579520789e+00 - -3.054767979666142e+00 - -3.063447312238444e+00 - -3.072182631692820e+00 - -3.080973988999999e+00 - -3.089821432099915e+00 - -3.098725004829577e+00 - -3.107684748048404e+00 - -3.116700699185534e+00 - -3.125772890999999e+00 - -3.134901352715559e+00 - -3.144086110699870e+00 - -3.153327188100508e+00 - -3.162624603843408e+00 - -3.171978372999998e+00 - -3.181388507546933e+00 - -3.190855016073102e+00 - -3.200377903469057e+00 - -3.209957169965227e+00 - -3.219592812999998e+00 - -3.229284827363896e+00 - -3.239033203402719e+00 - -3.248837927724427e+00 - -3.258698982652799e+00 - -3.268616347999998e+00 - -3.278590000914418e+00 - -3.288619913401403e+00 - -3.298706054004673e+00 - -3.308848387625167e+00 - -3.319046875999998e+00 - -3.329301477934322e+00 - -3.339612147844228e+00 - -3.349978836592516e+00 - -3.360401490990458e+00 - -3.370880054999998e+00 - -3.381414469596773e+00 - -3.392004670266620e+00 - -3.402650589976440e+00 - -3.413352159446950e+00 - -3.424109303999998e+00 - -3.434921945057392e+00 - -3.445790001867386e+00 - -3.456713390096515e+00 - -3.467692020464062e+00 - -3.478725800999998e+00 - -3.489814636890736e+00 - -3.500958427789171e+00 - -3.512157070764700e+00 - -3.523410460589800e+00 - -3.534718486999998e+00 - -3.546081035880271e+00 - -3.557497990199610e+00 - -3.568969229634993e+00 - -3.580494629586285e+00 - -3.592074061999998e+00 - -3.603707395759104e+00 - -3.615394495446970e+00 - -3.627135222559569e+00 - -3.638929435115233e+00 - -3.650776987000000e+00 - -3.662677728742245e+00 - -3.674631507325805e+00 - -3.686638166579447e+00 - -3.698697546469576e+00 - -3.710809483000000e+00 - -3.722973808828209e+00 - -3.735190352595157e+00 - -3.747458940125227e+00 - -3.759779394010754e+00 - -3.772151532000000e+00 - -3.784575168342916e+00 - -3.797050115062026e+00 - -3.809576180292756e+00 - -3.822153166803174e+00 - -3.834780875000000e+00 - -3.847459102820189e+00 - -3.860187643203489e+00 - -3.872966285667494e+00 - -3.885794816080159e+00 - -3.898673017000000e+00 - -3.911600667911320e+00 - -3.924577543724543e+00 - -3.937603416269590e+00 - -3.950678053996523e+00 - -3.963801221000000e+00 - -3.976972678103186e+00 - -3.990192183512261e+00 - -4.003459491521890e+00 - -4.016774351164608e+00 - -4.030136509000000e+00 - -4.043545709147031e+00 - -4.057001691149858e+00 - -4.070504190840202e+00 - -4.084052939835804e+00 - -4.097647667000000e+00 - -4.111288098419088e+00 - -4.124973955231095e+00 - -4.138704955371648e+00 - -4.152480813397504e+00 - -4.166301240000000e+00 - -4.180165942572286e+00 - -4.194074624537170e+00 - -4.208026986370140e+00 - -4.222022725101974e+00 - -4.236061533000000e+00 - -4.250143098846027e+00 - -4.264267108996074e+00 - -4.278433246261039e+00 - -4.292641188627767e+00 - -4.306890611000000e+00 - -4.321181185386233e+00 - -4.335512579090955e+00 - -4.349884456391911e+00 - -4.364296478350024e+00 - -4.378748302000000e+00 - -4.393239580901771e+00 - -4.407769964394226e+00 - -4.422339098999587e+00 - -4.436946628138934e+00 - -4.451592191000000e+00 - -4.466275423153566e+00 - -4.480995955945297e+00 - -4.495753418053649e+00 - -4.510547435209278e+00 - -4.525377628000000e+00 - -4.540243613376725e+00 - -4.555145006346341e+00 - -4.570081418154680e+00 - -4.585052454714511e+00 - -4.600057719000000e+00 - -4.615096811360685e+00 - -4.630169328028963e+00 - -4.645274861878902e+00 - -4.660413001844071e+00 - -4.675583333000000e+00 - -4.690785437259527e+00 - -4.706018892955582e+00 - -4.721283275134317e+00 - -4.736578154793736e+00 - -4.751903099000000e+00 - -4.767257671719769e+00 - -4.782641433752779e+00 - -4.798053942304498e+00 - -4.813494749953581e+00 - -4.828963406000000e+00 - -4.844459456896403e+00 - -4.859982445123970e+00 - -4.875531909767719e+00 - -4.891107385884028e+00 - -4.906708405000000e+00 - -4.922334495555203e+00 - -4.937985181840751e+00 - -4.953659984814029e+00 - -4.969358421588884e+00 - -4.985080006000000e+00 - -5.000824248840914e+00 - -5.016590656340991e+00 - -5.032378731598668e+00 - -5.048187974277996e+00 - -5.064017880000000e+00 - -5.079867940973151e+00 - -5.095737645459726e+00 - -5.111626480823102e+00 - -5.127533934923204e+00 - -5.143459499999997e+00 - -5.159402672483111e+00 - -5.175362954369220e+00 - -5.191339851303958e+00 - -5.207332872891304e+00 - -5.223341533999998e+00 - -5.239365353688981e+00 - -5.255403855076862e+00 - -5.271456565155025e+00 - -5.287523015792912e+00 - -5.303602743999997e+00 - -5.319695290809813e+00 - -5.335800201177900e+00 - -5.351917023850607e+00 - -5.368045312413205e+00 - -5.384184625999997e+00 - -5.400334527792659e+00 - -5.416494583936292e+00 - -5.432664365069262e+00 - -5.448843447960337e+00 - -5.465031412999998e+00 - -5.481227843963791e+00 - -5.497432330198948e+00 - -5.513644465003656e+00 - -5.529863846001168e+00 - -5.546090074999998e+00 - -5.562322757794160e+00 - -5.578561506278419e+00 - -5.594805935740466e+00 - -5.611055664858841e+00 - -5.627310317999997e+00 - -5.643569523867812e+00 - -5.659832914603254e+00 - -5.676100126691991e+00 - -5.692370802379017e+00 - -5.708644587999997e+00 - -5.724921133351554e+00 - -5.741200092816319e+00 - -5.757481124931912e+00 - -5.773763893288205e+00 - -5.790048065999996e+00 - -5.806333315035348e+00 - -5.822619317227983e+00 - -5.838905753168464e+00 - -5.855192307810226e+00 - -5.871478670999998e+00 - -5.887764536642293e+00 - -5.904049603224381e+00 - -5.920333573291820e+00 - -5.936616154283948e+00 - -5.952897057999997e+00 - -5.969175999997380e+00 - -5.985452700712029e+00 - -6.001726884408804e+00 - -6.017998279848357e+00 - -6.034266620999998e+00 - -6.050531645917840e+00 - -6.066793096565948e+00 - -6.083050719154321e+00 - -6.099304265265417e+00 - -6.115553489999997e+00 - -6.131798152082848e+00 - -6.148038016850530e+00 - -6.164272852974367e+00 - -6.180502432221914e+00 - -6.196726531999996e+00 - -6.212944934149927e+00 - -6.229157424398349e+00 - -6.245363792906498e+00 - -6.261563835474968e+00 - -6.277757350999996e+00 - -6.293944141712862e+00 - -6.310124016459128e+00 - -6.326296787703612e+00 - -6.342462271423720e+00 - -6.358620288999997e+00 - -6.374770666045148e+00 - -6.390913231950829e+00 - -6.407047820441565e+00 - -6.423174270811367e+00 - -6.439292425999997e+00 - -6.455402132459349e+00 - -6.471503242529590e+00 - -6.487595612302881e+00 - -6.503679101824962e+00 - -6.519753575999998e+00 - -6.535818903908587e+00 - -6.551874959678351e+00 - -6.567921621040533e+00 - -6.583958769810407e+00 - -6.599986292999997e+00 - -6.616004081814032e+00 - -6.632012031732002e+00 - -6.648010042213294e+00 - -6.663998017633650e+00 - -6.679975866999997e+00 - -6.695943503153600e+00 - -6.711900843425355e+00 - -6.727847809100131e+00 - -6.743784326279565e+00 - -6.759710325999998e+00 - -6.775625743222601e+00 - -6.791530516957345e+00 - -6.807424590371784e+00 - -6.823307911868753e+00 - -6.839180434000000e+00 - -6.855042113095231e+00 - -6.870892911056689e+00 - -6.886732793343159e+00 - -6.902561729209182e+00 - -6.918379693000000e+00 - -6.934186663377454e+00 - -6.949982623974822e+00 - -6.965767562024019e+00 - -6.981541468861679e+00 - -6.997304341000000e+00 - -7.013056179149240e+00 - -7.028796988372566e+00 - -7.044526777567921e+00 - -7.060245560311449e+00 - -7.075953355000000e+00 - -7.091650184045992e+00 - -7.107336074531737e+00 - -7.123011057484204e+00 - -7.138675168614964e+00 - -7.154328448000000e+00 - -7.169970939523060e+00 - -7.185602692089082e+00 - -7.201223758621499e+00 - -7.216834196750369e+00 - -7.232434069000000e+00 - -7.248023441650831e+00 - -7.263602384451917e+00 - -7.279170972021925e+00 - -7.294729285389790e+00 - -7.310277408000000e+00 - -7.325815426345584e+00 - -7.341343434315181e+00 - -7.356861529294433e+00 - -7.372369811668458e+00 - -7.387868387000000e+00 - -7.403357365322682e+00 - -7.418836861854650e+00 - -7.434306995371617e+00 - -7.449767888578398e+00 - -7.465219669000000e+00 - -7.480662468362842e+00 - -7.496096423635060e+00 - -7.511521675509539e+00 - -7.526938368822738e+00 - -7.542346653000000e+00 - -7.557746681513402e+00 - -7.573138613106206e+00 - -7.588522610348394e+00 - -7.603898840111169e+00 - -7.619267474000000e+00 - -7.634628687556104e+00 - -7.649982660818226e+00 - -7.665329578157865e+00 - -7.680669629212444e+00 - -7.696003007000000e+00 - -7.711329908041110e+00 - -7.726650535322031e+00 - -7.741965095546557e+00 - -7.757273799081691e+00 - -7.772576861000000e+00 - -7.787874500482072e+00 - -7.803166941820082e+00 - -7.818454413357075e+00 - -7.833737148083599e+00 - -7.849015383000000e+00 - -7.864289358883056e+00 - -7.879559322305754e+00 - -7.894825523493435e+00 - -7.910088216491122e+00 - -7.925347660000000e+00 - -7.940604117030949e+00 - -7.955857856656654e+00 - -7.971109151088187e+00 - -7.986358275553978e+00 - -8.001605510999999e+00 - -8.016851143003514e+00 - -8.032095461580266e+00 - -8.047338760488806e+00 - -8.062581337981985e+00 - -8.077823497000001e+00 - -8.093065544394179e+00 - -8.108307791577566e+00 - -8.123550554205780e+00 - -8.138794153086785e+00 - -8.154038912999997e+00 - -8.169285162395173e+00 - -8.184533235306290e+00 - -8.199783469410583e+00 - -8.215036206329255e+00 - -8.230291792999997e+00 - -8.245550580528674e+00 - -8.260812923863309e+00 - -8.276079182235739e+00 - -8.291349720375887e+00 - -8.306624906999998e+00 - -8.321905114401627e+00 - -8.337190720129563e+00 - -8.352482105562956e+00 - -8.367779656388556e+00 - -8.383083762999997e+00 - -8.398394819954635e+00 - -8.413713227271362e+00 - -8.429039388338369e+00 - -8.444373710123081e+00 - -8.459716604999997e+00 - -8.475068489773328e+00 - -8.490429785807564e+00 - -8.505800918193746e+00 - -8.521182316459129e+00 - -8.536574414999997e+00 - -8.551977652264261e+00 - -8.567392471335332e+00 - -8.582819319266729e+00 - -8.598258647834163e+00 - -8.613710912999998e+00 - -8.629176574613023e+00 - -8.644656098315155e+00 - -8.660149953296175e+00 - -8.675658612460374e+00 - -8.691182553999997e+00 - -8.706722260346437e+00 - -8.722278218076596e+00 - -8.737850917931995e+00 - -8.753440855866357e+00 - -8.769048531999996e+00 - -8.784674450012169e+00 - -8.800319118245726e+00 - -8.815983049456063e+00 - -8.831666761752983e+00 - -8.847370776999997e+00 - -8.863095620572640e+00 - -8.878841823409489e+00 - -8.894609920288579e+00 - -8.910400450202564e+00 - -8.926213956999996e+00 - -8.942050988642462e+00 - -8.957912097948702e+00 - -8.973797841249739e+00 - -8.989708778929735e+00 - -9.005645476999996e+00 - -9.021608505891232e+00 - -9.037598440089864e+00 - -9.053615857732957e+00 - -9.069661341483132e+00 - -9.085735478999997e+00 - -9.101838862125330e+00 - -9.117972087538210e+00 - -9.134135755396374e+00 - -9.150330469883286e+00 - -9.166556840999997e+00 - -9.182815483079517e+00 - -9.199107013675079e+00 - -9.215432054583626e+00 - -9.231791233265957e+00 - -9.248185180999997e+00 - -9.264614532683632e+00 - -9.281079929109534e+00 - -9.297582014702897e+00 - -9.314121437654787e+00 - -9.330698850999996e+00 - -9.347314912003528e+00 - -9.363970283188971e+00 - -9.380665630745685e+00 - -9.397401624940878e+00 - -9.414178940999998e+00 - -9.430998258244742e+00 - -9.447860260503859e+00 - -9.464765635761319e+00 - -9.481715077019253e+00 - -9.498709280999996e+00 - -9.515748948037771e+00 - -9.532834784442173e+00 - -9.549967500513571e+00 - -9.567147810785697e+00 - -9.584376433999996e+00 - -9.601654092679016e+00 - -9.618981514566920e+00 - -9.636359431588877e+00 - -9.653788580476306e+00 - -9.671269701999998e+00 - -9.688803540653204e+00 - -9.706390846469759e+00 - -9.724032373152683e+00 - -9.741728878390186e+00 - -9.759481124999997e+00 - -9.777289880050315e+00 - -9.795155915261526e+00 - -9.813080006095444e+00 - -9.831062932433847e+00 - -9.849105478999997e+00 - -9.867208434586416e+00 - -9.885372592754736e+00 - -9.903598750780114e+00 - -9.921887710289466e+00 - -9.940240277999996e+00 - -9.958657264807959e+00 - -9.977139486156000e+00 - -9.995687760994512e+00 - -1.001430291248964e+01 - -1.003298577000000e+01 - -1.005173716741557e+01 - -1.007055794170109e+01 - -1.008944893313717e+01 - -1.010841098632109e+01 - -1.012744495000000e+01 - -1.014655167843811e+01 - -1.016573203809090e+01 - -1.018498689280856e+01 - -1.020431709913334e+01 - -1.022372353000000e+01 - -1.024320706932260e+01 - -1.026276860085199e+01 - -1.028240900753776e+01 - -1.030212917226508e+01 - -1.032192999000000e+01 - -1.034181236270672e+01 - -1.036177718920571e+01 - -1.038182537682789e+01 - -1.040195784652257e+01 - -1.042217551000000e+01 - -1.044247927800797e+01 - -1.046287008429113e+01 - -1.048334886197221e+01 - -1.050391653528098e+01 - -1.052457404000000e+01 - -1.054532232135862e+01 - -1.056616233045517e+01 - -1.058709501821704e+01 - -1.060812133414642e+01 - -1.062924224000000e+01 - -1.065045870478386e+01 - -1.067177169452023e+01 - -1.069318217826154e+01 - -1.071469113174534e+01 - -1.073629954000000e+01 - -1.075800839260036e+01 - -1.077981867489276e+01 - -1.080173138018267e+01 - -1.082374751517595e+01 - -1.084586808000000e+01 - -1.086809407471729e+01 - -1.089042651905600e+01 - -1.091286643223940e+01 - -1.093541482646511e+01 - -1.095807273000000e+01 - -1.098084118002027e+01 - -1.100372120627546e+01 - -1.102671384288809e+01 - -1.104982013415814e+01 - -1.107304113000000e+01 - -1.109637788366843e+01 - -1.111983144958023e+01 - -1.114340288661973e+01 - -1.116709326043168e+01 - -1.119090364000000e+01 - -1.121483509746141e+01 - -1.123888871051257e+01 - -1.126306556352589e+01 - -1.128736674843474e+01 - -1.131179335000000e+01 - -1.133634645465832e+01 - -1.136102717560643e+01 - -1.138583662099362e+01 - -1.141077588304154e+01 - -1.143584608000000e+01 - -1.146104834278586e+01 - -1.148638378227322e+01 - -1.151185351768562e+01 - -1.153745868860526e+01 - -1.156320043000000e+01 - -1.158907987623694e+01 - -1.161509817570602e+01 - -1.164125647703402e+01 - -1.166755592508495e+01 - -1.169399768000000e+01 - -1.172058291041322e+01 - -1.174731277861368e+01 - -1.177418844974534e+01 - -1.180121109657743e+01 - -1.182838189999999e+01 - -1.185570204579555e+01 - -1.188317272006268e+01 - -1.191079511332836e+01 - -1.193857042312863e+01 - -1.196649984999999e+01 - -1.199458459773775e+01 - -1.202282587700695e+01 - -1.205122490269986e+01 - -1.207978289369385e+01 - -1.210850107000000e+01 - -1.213738065440104e+01 - -1.216642287877588e+01 - -1.219562898067898e+01 - -1.222500020303083e+01 - -1.225453779000000e+01 - -1.228424298812801e+01 - -1.231411705144751e+01 - -1.234416123799292e+01 - -1.237437680934280e+01 - -1.240476502999999e+01 - -1.243532716862228e+01 - -1.246606450371358e+01 - -1.249697831672881e+01 - -1.252806989018327e+01 - -1.255934050999999e+01 - -1.259079146663310e+01 - -1.262242406008652e+01 - -1.265423959346900e+01 - -1.268623937120698e+01 - -1.271842469999999e+01 - -1.275079689157634e+01 - -1.278335727210730e+01 - -1.281610716656313e+01 - -1.284904789393346e+01 - -1.288218078999999e+01 - -1.291550719883721e+01 - -1.294902845305343e+01 - -1.298274589252790e+01 - -1.301666087289315e+01 - -1.305077474999999e+01 - -1.308508888000826e+01 - -1.311960462335401e+01 - -1.315432334734565e+01 - -1.318924642810263e+01 - -1.322437523999999e+01 - -1.325971115825294e+01 - -1.329525556797775e+01 - -1.333100986045822e+01 - -1.336697543256989e+01 - -1.340315367999999e+01 - -1.343954599979837e+01 - -1.347615379884262e+01 - -1.351297848978655e+01 - -1.355002149050285e+01 - -1.358728421999999e+01 - -1.362476809975143e+01 - -1.366247455932581e+01 - -1.370040503112116e+01 - -1.373856094968169e+01 - -1.377694375999999e+01 - -1.381555491216690e+01 - -1.385439585021465e+01 - -1.389346802391279e+01 - -1.393277289476898e+01 - -1.397231192999999e+01 - -1.401208659972945e+01 - -1.405209837359219e+01 - -1.409234872413346e+01 - -1.413283912961124e+01 - -1.417357107999999e+01 - -1.421454607102127e+01 - -1.425576559243092e+01 - -1.429723113890712e+01 - -1.433894421536596e+01 - -1.438090632999999e+01 - -1.442311899332400e+01 - -1.446558371903957e+01 - -1.450830202765583e+01 - -1.455127544879836e+01 - -1.459450550999999e+01 - -1.463799373973040e+01 - -1.468174167767078e+01 - -1.472575086722947e+01 - -1.477002285383887e+01 - -1.481455918999999e+01 - -1.485936143285468e+01 - -1.490443114031971e+01 - -1.494976987417127e+01 - -1.499537920245961e+01 - -1.504126069999999e+01 - -1.508741594534576e+01 - -1.513384651602358e+01 - -1.518055399754435e+01 - -1.522753998778076e+01 - -1.527480607999999e+01 - -1.532235386668537e+01 - -1.537018495189360e+01 - -1.541830094448208e+01 - -1.546670345694024e+01 - -1.551539410999999e+01 - -1.556437452805486e+01 - -1.561364632974880e+01 - -1.566321114034704e+01 - -1.571307059764629e+01 - -1.576322633999999e+01 - -1.581368000886133e+01 - -1.586443325932826e+01 - -1.591548774371123e+01 - -1.596684510633198e+01 - -1.601850700999999e+01 - -1.607047512763592e+01 - -1.612275112310131e+01 - -1.617533666634843e+01 - -1.622823344044972e+01 - -1.628144312999999e+01 - -1.633496741991010e+01 - -1.638880799548294e+01 - -1.644296655089035e+01 - -1.649744479372194e+01 - -1.655224442999999e+01 - -1.660736716535794e+01 - -1.666281471098534e+01 - -1.671858878335293e+01 - -1.677469110504862e+01 - -1.683112339999999e+01 - -1.688788739643611e+01 - -1.694498483759857e+01 - -1.700241746523662e+01 - -1.706018701398879e+01 - -1.711829522999999e+01 - -1.717674386844329e+01 - -1.723553468924849e+01 - -1.729466945458232e+01 - -1.735414992865347e+01 - -1.741397788000000e+01 - -1.747415508099178e+01 - -1.753468330867943e+01 - -1.759556434768274e+01 - -1.765679999203036e+01 - -1.771839203000000e+01 - -1.778034225038387e+01 - -1.784265246094084e+01 - -1.790532446959567e+01 - -1.796836007816754e+01 - -1.803176110000000e+01 - -1.809552935720682e+01 - -1.815966667575656e+01 - -1.822417488078262e+01 - -1.828905579597735e+01 - -1.835431126000000e+01 - -1.841994311958100e+01 - -1.848595321475806e+01 - -1.855234338946741e+01 - -1.861911549709020e+01 - -1.868627140000000e+01 - -1.875381296458075e+01 - -1.882174205218422e+01 - -1.889006052915166e+01 - -1.895877027181235e+01 - -1.902787316000000e+01 - -1.909737107797965e+01 - -1.916726592078253e+01 - -1.923755957952593e+01 - -1.930825393714747e+01 - -1.937935090000000e+01 - -1.945085238647674e+01 - -1.952276030080435e+01 - -1.959507655061933e+01 - -1.966780305499929e+01 - -1.974094174000000e+01 - -1.981449453618971e+01 - -1.988846337667131e+01 - -1.996285019538828e+01 - -2.003765692760933e+01 - -2.011288552000000e+01 - -2.018853792621815e+01 - -2.026461609876727e+01 - -2.034112199510926e+01 - -2.041805758075517e+01 - -2.049542482000000e+01 - -2.057322568006621e+01 - -2.065146214471047e+01 - -2.073013619484967e+01 - -2.080924980240138e+01 - -2.088880495999999e+01 - -2.096880367169853e+01 - -2.104924793164823e+01 - -2.113013973534757e+01 - -2.121148108557274e+01 - -2.129327399999999e+01 - -2.137552050224973e+01 - -2.145822260294134e+01 - -2.154138232011573e+01 - -2.162500168821614e+01 - -2.170908273999999e+01 - -2.179362750931509e+01 - -2.187863804236205e+01 - -2.196411638687395e+01 - -2.205006458870765e+01 - -2.213648469999998e+01 - -2.222337877888525e+01 - -2.231074889087196e+01 - -2.239859710699802e+01 - -2.248692550346576e+01 - -2.257573614999999e+01 - -2.266503111825121e+01 - -2.275481250533621e+01 - -2.284508240538831e+01 - -2.293584289979252e+01 - -2.302709608999998e+01 - -2.311884408797131e+01 - -2.321108899308483e+01 - -2.330383291176923e+01 - -2.339707796636268e+01 - -2.349082627999998e+01 - -2.358507997580010e+01 - -2.367984117841246e+01 - -2.377511201965127e+01 - -2.387089464198777e+01 - -2.396719118999998e+01 - -2.406400380890314e+01 - -2.416133464354705e+01 - -2.425918584868402e+01 - -2.435755959379285e+01 - -2.445645803999998e+01 - -2.455588334675619e+01 - -2.465583769169985e+01 - -2.475632325621871e+01 - -2.485734222078360e+01 - -2.495889676999998e+01 - -2.506098909313465e+01 - -2.516362138717989e+01 - -2.526679585042222e+01 - -2.537051468121954e+01 - -2.547478008999998e+01 - -2.557959429416147e+01 - -2.568495950782481e+01 - -2.579087794894506e+01 - -2.589735184307986e+01 - -2.600438342000000e+01 - -2.611197491414786e+01 - -2.622012856937007e+01 - -2.632884662779481e+01 - -2.643813132670684e+01 - -2.654798492000000e+01 - -2.665840967182968e+01 - -2.676940784333127e+01 - -2.688098169572292e+01 - -2.699313349264397e+01 - -2.710586551000000e+01 - -2.721918002998715e+01 - -2.733307932892397e+01 - -2.744756569229334e+01 - -2.756264142140602e+01 - -2.767830881000000e+01 - -2.779457014947893e+01 - -2.791142774510221e+01 - -2.802888390934165e+01 - -2.814694096000261e+01 - -2.826560121000000e+01 - -2.838486697334714e+01 - -2.850474058224100e+01 - -2.862522436986088e+01 - -2.874632066501767e+01 - -2.886803181000000e+01 - -2.899036015446983e+01 - -2.911330804180568e+01 - -2.923687781925054e+01 - -2.936107184331833e+01 - -2.948589248000000e+01 - -2.961134209910011e+01 - -2.973742306338333e+01 - -2.986413774439124e+01 - -2.999148852946843e+01 - -3.011947780000000e+01 - -3.024810793640462e+01 - -3.037738133418102e+01 - -3.050730039248281e+01 - -3.063786751048302e+01 - -3.076908508999995e+01 - -3.090095553801825e+01 - -3.103348127528379e+01 - -3.116666472242296e+01 - -3.130050829541340e+01 - -3.143501442000000e+01 - -3.157018552904646e+01 - -3.170602405762165e+01 - -3.184253244456109e+01 - -3.197971313442012e+01 - -3.211756857999995e+01 - -3.225610123724459e+01 - -3.239531355479052e+01 - -3.253520799120049e+01 - -3.267578702273956e+01 - -3.281705312000000e+01 - -3.295900875199519e+01 - -3.310165640007095e+01 - -3.324499854981137e+01 - -3.338903768896250e+01 - -3.353377630999994e+01 - -3.367921690900354e+01 - -3.382536198480008e+01 - -3.397221404252836e+01 - -3.411977559608952e+01 - -3.426804916000000e+01 - -3.441703725062087e+01 - -3.456674239208418e+01 - -3.471716711255165e+01 - -3.486831394366235e+01 - -3.502018541999994e+01 - -3.517278408030963e+01 - -3.532611247314257e+01 - -3.548017315006599e+01 - -3.563496866378715e+01 - -3.579050157000000e+01 - -3.594677442911821e+01 - -3.610378981290209e+01 - -3.626155029281482e+01 - -3.642005843692588e+01 - -3.657931682999995e+01 - -3.673932806450152e+01 - -3.690009471994529e+01 - -3.706161938636306e+01 - -3.722390467398576e+01 - -3.738695318000000e+01 - -3.755076749872251e+01 - -3.771535025114206e+01 - -3.788070405790332e+01 - -3.804683152981476e+01 - -3.821373528999994e+01 - -3.838141797088579e+01 - -3.854988220802454e+01 - -3.871913063690455e+01 - -3.888916589260551e+01 - -3.905999062000000e+01 - -3.923160747217621e+01 - -3.940401910958111e+01 - -3.957722819105772e+01 - -3.975123737141870e+01 - -3.992604931999993e+01 - -4.010166671506960e+01 - -4.027809223215413e+01 - -4.045532854769397e+01 - -4.063337834194039e+01 - -4.081224431000000e+01 - -4.099192915380458e+01 - -4.117243556512365e+01 - -4.135376624213356e+01 - -4.153592389680070e+01 - -4.171891123999993e+01 - -4.190273098404973e+01 - -4.208738585293229e+01 - -4.227287857304115e+01 - -4.245921187066173e+01 - -4.264638848000000e+01 - -4.283441114000928e+01 - -4.302328258823673e+01 - -4.321300556988346e+01 - -4.340358284230594e+01 - -4.359501715999993e+01 - -4.378731127802528e+01 - -4.398046796379431e+01 - -4.417448998677844e+01 - -4.436938011574802e+01 - -4.456514113000000e+01 - -4.476177581459606e+01 - -4.495928695037842e+01 - -4.515767732491430e+01 - -4.535694973791337e+01 - -4.555710698999992e+01 - -4.575815188265746e+01 - -4.596008722124420e+01 - -4.616291581815827e+01 - -4.636664049491562e+01 - -4.657126407000000e+01 - -4.677678936329625e+01 - -4.698321921012249e+01 - -4.719055644645270e+01 - -4.739880390447049e+01 - -4.760796442999992e+01 - -4.781804087601476e+01 - -4.802903608806237e+01 - -4.824095291782189e+01 - -4.845379422957746e+01 - -4.866756289000000e+01 - -4.888226176793614e+01 - -4.909789373759357e+01 - -4.931446167624577e+01 - -4.953196846445736e+01 - -4.975041698999991e+01 - -4.996981014490353e+01 - -5.019015082042799e+01 - -5.041144191483806e+01 - -5.063368633767777e+01 - -5.085688700000000e+01 - -5.108104681363623e+01 - -5.130616869222998e+01 - -5.153225555529192e+01 - -5.175931033093434e+01 - -5.198733594999992e+01 - -5.221633534632925e+01 - -5.244631146064819e+01 - -5.267726723814258e+01 - -5.290920562821528e+01 - -5.314212958000000e+01 - -5.337604204603855e+01 - -5.361094599406351e+01 - -5.384684439089011e+01 - -5.408374019738633e+01 - -5.432163638999991e+01 - -5.456053595406303e+01 - -5.480044186892415e+01 - -5.504135712069162e+01 - -5.528328470761400e+01 - -5.552622762000000e+01 - -5.577018884907901e+01 - -5.601517141284037e+01 - -5.626117832498171e+01 - -5.650821258404100e+01 - -5.675627720999991e+01 - -5.700537523542541e+01 - -5.725550968441112e+01 - -5.750668358361924e+01 - -5.775889996777224e+01 - -5.801216188000000e+01 - -5.826647236807500e+01 - -5.852183447842080e+01 - -5.877825126017432e+01 - -5.903572576827786e+01 - -5.929426106999990e+01 - -5.955386023803142e+01 - -5.981452633626228e+01 - -6.007626243395679e+01 - -6.033907161265666e+01 - -6.060295696000000e+01 - -6.086792156620618e+01 - -6.113396851889991e+01 - -6.140110091270849e+01 - -6.166932185413050e+01 - -6.193863444999990e+01 - -6.220904180836374e+01 - -6.248054704389698e+01 - -6.275315327303672e+01 - -6.302686361375484e+01 - -6.330168120000000e+01 - -6.357760917255472e+01 - -6.385465065869710e+01 - -6.413280879313753e+01 - -6.441208672717147e+01 - -6.469248761000000e+01 - -6.497401459207148e+01 - -6.525667083785252e+01 - -6.554045951020694e+01 - -6.582538376572784e+01 - -6.611144677999999e+01 - -6.639865173804421e+01 - -6.668700181225154e+01 - -6.697650018322166e+01 - -6.726715004865791e+01 - -6.755895460000001e+01 - -6.785191702754956e+01 - -6.814604053706709e+01 - -6.844132833746227e+01 - -6.873778363702108e+01 - -6.903540965000001e+01 - -6.933420959649558e+01 - -6.963418670433917e+01 - -6.993534420146086e+01 - -7.023768531400407e+01 - -7.054121327999999e+01 - -7.084593134500037e+01 - -7.115184275353549e+01 - -7.145895075432828e+01 - -7.176725860332733e+01 - -7.207676955999989e+01 - -7.238748688676215e+01 - -7.269941385037480e+01 - -7.301255372170849e+01 - -7.332690977697268e+01 - -7.364248530000000e+01 - -7.395928357816831e+01 - -7.427730789465394e+01 - -7.459656154154558e+01 - -7.491704782593285e+01 - -7.523877004999987e+01 - -7.556173151464178e+01 - -7.588593553169946e+01 - -7.621138541944168e+01 - -7.653808450163682e+01 - -7.686603610000000e+01 - -7.719524353805981e+01 - -7.752571015313293e+01 - -7.785743928572181e+01 - -7.819043427631229e+01 - -7.852469846999988e+01 - -7.886023521608357e+01 - -7.919704786882774e+01 - -7.953513978918475e+01 - -7.987451434652237e+01 - -8.021517491000000e+01 - -8.055712484895521e+01 - -8.090036753598372e+01 - -8.124490635250547e+01 - -8.159074469172391e+01 - -8.193788593999987e+01 - -8.228633348416081e+01 - -8.263609073313938e+01 - -8.298716109541151e+01 - -8.333954797103145e+01 - -8.369325477000000e+01 - -8.404828491028280e+01 - -8.440464181412719e+01 - -8.476232890793086e+01 - -8.512134962287996e+01 - -8.548170738999985e+01 - -8.584340564352934e+01 - -8.620644783199920e+01 - -8.657083740482393e+01 - -8.693657780824788e+01 - -8.730367250000000e+01 - -8.767212494371194e+01 - -8.804193859639375e+01 - -8.841311692593891e+01 - -8.878566341870939e+01 - -8.915958154999986e+01 - -8.953487479168578e+01 - -8.991154663471849e+01 - -9.028960057395298e+01 - -9.066904010318096e+01 - -9.104986872000001e+01 - -9.143208992686800e+01 - -9.181570723560402e+01 - -9.220072416114067e+01 - -9.258714421980083e+01 - -9.297497092999986e+01 - -9.336420781525349e+01 - -9.375485841426487e+01 - -9.414692626313253e+01 - -9.454041488965315e+01 - -9.493532784000000e+01 - -9.533166867059026e+01 - -9.572944092950100e+01 - -9.612864816948191e+01 - -9.652929395407540e+01 - -9.693138184999984e+01 - -9.733491542620831e+01 - -9.773989825487583e+01 - -9.814633391500892e+01 - -9.855422599474231e+01 - -9.896357808000000e+01 - -9.937439375553778e+01 - -9.978667660951464e+01 - -1.002004302498873e+02 - -1.006156583113964e+02 - -1.010323643999998e+02 - -1.014505521033422e+02 - -1.018702250167552e+02 - -1.022913867648504e+02 - -1.027140410123223e+02 - -1.031381914000000e+02 - -1.035638415489902e+02 - -1.039909950728156e+02 - -1.044196556182856e+02 - -1.048498268814360e+02 - -1.052815124999998e+02 - -1.057147160851634e+02 - -1.061494413040264e+02 - -1.065856918490972e+02 - -1.070234714266025e+02 - -1.074627837000000e+02 - -1.079036323073108e+02 - -1.083460208994117e+02 - -1.087899531790557e+02 - -1.092354329168266e+02 - -1.096824637999998e+02 - -1.101310494754678e+02 - -1.105811936593542e+02 - -1.110329000832090e+02 - -1.114861724712110e+02 - -1.119410145000000e+02 - -1.123974298499644e+02 - -1.128554223365672e+02 - -1.133149957276709e+02 - -1.137761536721920e+02 - -1.142388998999998e+02 - -1.147032381951767e+02 - -1.151691723223398e+02 - -1.156367060267053e+02 - -1.161058430340008e+02 - -1.165765871000000e+02 - -1.170489420136372e+02 - -1.175229116129598e+02 - -1.179984996644491e+02 - -1.184757098197581e+02 - -1.189545458999998e+02 - -1.194350118004852e+02 - -1.199171112501401e+02 - -1.204008480035419e+02 - -1.208862259161727e+02 - -1.213732488000000e+02 - -1.218619204419225e+02 - -1.223522446637547e+02 - -1.228442252993658e+02 - -1.233378661832514e+02 - -1.238331710999998e+02 - -1.243301438371392e+02 - -1.248287883218059e+02 - -1.253291084262349e+02 - -1.258311078947497e+02 - -1.263347906000000e+02 - -1.268401604692280e+02 - -1.273472212887372e+02 - -1.278559768940106e+02 - -1.283664312433523e+02 - -1.288785881999998e+02 - -1.293924515790011e+02 - -1.299080252758494e+02 - -1.304253131892150e+02 - -1.309443191941241e+02 - -1.314650472000000e+02 - -1.319875011267033e+02 - -1.325116848422910e+02 - -1.330376022476014e+02 - -1.335652573069860e+02 - -1.340946538999998e+02 - -1.346257958892211e+02 - -1.351586873010075e+02 - -1.356933320835031e+02 - -1.362297340185993e+02 - -1.367678971000000e+02 - -1.373078254089903e+02 - -1.378495227933144e+02 - -1.383929931342302e+02 - -1.389382404506380e+02 - -1.394852686999998e+02 - -1.400340818144768e+02 - -1.405846838138316e+02 - -1.411370786853171e+02 - -1.416912703410207e+02 - -1.422472628000000e+02 - -1.428050601118040e+02 - -1.433646661562381e+02 - -1.439260848884736e+02 - -1.444893204354731e+02 - -1.450543767999998e+02 - -1.456212579173106e+02 - -1.461899678121767e+02 - -1.467605105156440e+02 - -1.473328900351724e+02 - -1.479071104000000e+02 - -1.484831756560318e+02 - -1.490610898537698e+02 - -1.496408570188282e+02 - -1.502224811435522e+02 - -1.508059663000000e+02 - -1.513913165938295e+02 - -1.519785360517816e+02 - -1.525676287092765e+02 - -1.531585986433134e+02 - -1.537514498999998e+02 - -1.543461865304275e+02 - -1.549428126935839e+02 - -1.555413324987964e+02 - -1.561417499433451e+02 - -1.567440691000000e+02 - -1.573482940967384e+02 - -1.579544290618548e+02 - -1.585624781173004e+02 - -1.591724453723425e+02 - -1.597843348999998e+02 - -1.603981507727703e+02 - -1.610138971515657e+02 - -1.616315781879854e+02 - -1.622511979884414e+02 - -1.628727607000000e+02 - -1.634962704824068e+02 - -1.641217314319286e+02 - -1.647491476962519e+02 - -1.653785235159056e+02 - -1.660098629999998e+02 - -1.666431702132707e+02 - -1.672784494025457e+02 - -1.679157047805161e+02 - -1.685549404452619e+02 - -1.691961606000000e+02 - -1.698393694891200e+02 - -1.704845712252935e+02 - -1.711317699673001e+02 - -1.717809699904770e+02 - -1.724321754999998e+02 - -1.730853906636835e+02 - -1.737406197069920e+02 - -1.743978668390772e+02 - -1.750571362267288e+02 - -1.757184321000000e+02 - -1.763817587329360e+02 - -1.770471204015179e+02 - -1.777145213342737e+02 - -1.783839656916257e+02 - -1.790554576999997e+02 - -1.797290016348361e+02 - -1.804046017812607e+02 - -1.810822624074922e+02 - -1.817619877551305e+02 - -1.824437821000000e+02 - -1.831276497291853e+02 - -1.838135948809234e+02 - -1.845016218201234e+02 - -1.851917348679873e+02 - -1.858839382999998e+02 - -1.865782363787204e+02 - -1.872746334451072e+02 - -1.879731338116912e+02 - -1.886737417231232e+02 - -1.893764615000000e+02 - -1.900812975069574e+02 - -1.907882540726982e+02 - -1.914973354967214e+02 - -1.922085460544087e+02 - -1.929218900999998e+02 - -1.936373720194894e+02 - -1.943549961169706e+02 - -1.950747667123967e+02 - -1.957966881820183e+02 - -1.965207649000000e+02 - -1.972470012275908e+02 - -1.979754014928308e+02 - -1.987059700466389e+02 - -1.994387112870401e+02 - -2.001736295999997e+02 - -2.009107293657797e+02 - -2.016500149830146e+02 - -2.023914908231823e+02 - -2.031351612174878e+02 - -2.038810306000000e+02 - -2.046291034502658e+02 - -2.053793841544099e+02 - -2.061318770718700e+02 - -2.068865865659776e+02 - -2.076435170999997e+02 - -2.084026731731890e+02 - -2.091640591716557e+02 - -2.099276794995817e+02 - -2.106935386300690e+02 - -2.114616410000000e+02 - -2.122319910255027e+02 - -2.130045931490896e+02 - -2.137794518362718e+02 - -2.145565715736208e+02 - -2.153359567999997e+02 - -2.161176119510612e+02 - -2.169015415764713e+02 - -2.176877501734888e+02 - -2.184762421224458e+02 - -2.192670219000000e+02 - -2.200600940505141e+02 - -2.208554631128035e+02 - -2.216531335679009e+02 - -2.224531098207831e+02 - -2.232553963999997e+02 - -2.240599978997985e+02 - -2.248669188401317e+02 - -2.256761637092654e+02 - -2.264877369816284e+02 - -2.273016432000000e+02 - -2.281178869415660e+02 - -2.289364727411434e+02 - -2.297574051254879e+02 - -2.305806886273285e+02 - -2.314063277999997e+02 - -2.322343272067604e+02 - -2.330646913987978e+02 - -2.338974249389632e+02 - -2.347325324124834e+02 - -2.355700184000000e+02 - -2.364098874788788e+02 - -2.372521442301691e+02 - -2.380967932316097e+02 - -2.389438390563173e+02 - -2.397932862999997e+02 - -2.406451395699314e+02 - -2.414994034603918e+02 - -2.423560825773335e+02 - -2.432151815494090e+02 - -2.440767050000000e+02 - -2.449406575494712e+02 - -2.458070438246558e+02 - -2.466758684438366e+02 - -2.475471360143982e+02 - -2.484208511999996e+02 - -2.492970186823550e+02 - -2.501756430678903e+02 - -2.510567289807632e+02 - -2.519402811010791e+02 - -2.528263041000000e+02 - -2.537148026392507e+02 - -2.546057813786489e+02 - -2.554992449908618e+02 - -2.563951981686694e+02 - -2.572936455999996e+02 - -2.581945919701986e+02 - -2.590980419711499e+02 - -2.600040002856254e+02 - -2.609124715849065e+02 - -2.618234606000000e+02 - -2.627369720784054e+02 - -2.636530106775519e+02 - -2.645715811006028e+02 - -2.654926881465747e+02 - -2.664163364999997e+02 - -2.673425308135112e+02 - -2.682712759281322e+02 - -2.692025766270102e+02 - -2.701364375396030e+02 - -2.710728634000000e+02 - -2.720118590149941e+02 - -2.729534291763713e+02 - -2.738975786300543e+02 - -2.748443120676544e+02 - -2.757936342999997e+02 - -2.767455501787848e+02 - -2.777000643997414e+02 - -2.786571816989448e+02 - -2.796169069311608e+02 - -2.805792449000000e+02 - -2.815442003833780e+02 - -2.825117782146733e+02 - -2.834819832031981e+02 - -2.844548201023671e+02 - -2.854302936999997e+02 - -2.864084088239409e+02 - -2.873891703596309e+02 - -2.883725831483384e+02 - -2.893586519481404e+02 - -2.903473816000000e+02 - -2.913387769892773e+02 - -2.923328429461174e+02 - -2.933295843055886e+02 - -2.943290059327143e+02 - -2.953311126999996e+02 - -2.963359094688269e+02 - -2.973434010446480e+02 - -2.983535922946355e+02 - -2.993664881931061e+02 - -3.003820936000000e+02 - -3.014004133189056e+02 - -3.024214522481863e+02 - -3.034452153213495e+02 - -3.044717074825456e+02 - -3.055009335999997e+02 - -3.065328985120693e+02 - -3.075676071368449e+02 - -3.086050644279766e+02 - -3.096452753553112e+02 - -3.106882447999996e+02 - -3.117339776182681e+02 - -3.127824787990806e+02 - -3.138337533166528e+02 - -3.148878060732492e+02 - -3.159446419999996e+02 - -3.170042660531784e+02 - -3.180666831989414e+02 - -3.191318984100575e+02 - -3.201999166629245e+02 - -3.212707428999996e+02 - -3.223443820580361e+02 - -3.234208391391681e+02 - -3.245001191331626e+02 - -3.255822269890704e+02 - -3.266671677000000e+02 - -3.277549462905472e+02 - -3.288455677875165e+02 - -3.299390371822755e+02 - -3.310353594166140e+02 - -3.321345394999996e+02 - -3.332365824854958e+02 - -3.343414934139734e+02 - -3.354492773045120e+02 - -3.365599391517927e+02 - -3.376734840000000e+02 - -3.387899169180687e+02 - -3.399092429402671e+02 - -3.410314670886827e+02 - -3.421565943845668e+02 - -3.432846298999996e+02 - -3.444155787253185e+02 - -3.455494458929433e+02 - -3.466862364711880e+02 - -3.478259555971263e+02 - -3.489686083000000e+02 - -3.501141995805723e+02 - -3.512627346186799e+02 - -3.524142185495274e+02 - -3.535686563776662e+02 - -3.547260531999996e+02 - -3.558864141649047e+02 - -3.570497443588797e+02 - -3.582160488781844e+02 - -3.593853328562213e+02 - -3.605576014000000e+02 - -3.617328596203877e+02 - -3.629111127187760e+02 - -3.640923658296630e+02 - -3.652766239636252e+02 - -3.664638922999996e+02 - -3.676541760949210e+02 - -3.688474804479435e+02 - -3.700438104641370e+02 - -3.712431713192604e+02 - -3.724455682000000e+02 - -3.736510062917217e+02 - -3.748594907617601e+02 - -3.760710267615897e+02 - -3.772856194324323e+02 - -3.785032739999995e+02 - -3.797239957155368e+02 - -3.809477897125092e+02 - -3.821746611611994e+02 - -3.834046153278488e+02 - -3.846376574000000e+02 - -3.858737925371631e+02 - -3.871130260109560e+02 - -3.883553630688227e+02 - -3.896008088834330e+02 - -3.908493686999996e+02 - -3.921010477895665e+02 - -3.933558513233559e+02 - -3.946137845264227e+02 - -3.958748527376295e+02 - -3.971390612000000e+02 - -3.984064151109821e+02 - -3.996769197585321e+02 - -4.009505804131749e+02 - -4.022274022910074e+02 - -4.035073906999995e+02 - -4.047905509809469e+02 - -4.060768883569506e+02 - -4.073664080804837e+02 - -4.086591154923789e+02 - -4.099550159000000e+02 - -4.112541145837781e+02 - -4.125564168232350e+02 - -4.138619279264533e+02 - -4.151706532436620e+02 - -4.164825980999995e+02 - -4.177977678009782e+02 - -4.191161676484082e+02 - -4.204378029703449e+02 - -4.217626791355866e+02 - -4.230908015000000e+02 - -4.244221753941545e+02 - -4.257568060915354e+02 - -4.270946989435893e+02 - -4.284358594322071e+02 - -4.297802928999995e+02 - -4.311280046181774e+02 - -4.324789999621266e+02 - -4.338332843406102e+02 - -4.351908631680312e+02 - -4.365517418000000e+02 - -4.379159255766193e+02 - -4.392834199290754e+02 - -4.406542302894571e+02 - -4.420283620541414e+02 - -4.434058205999995e+02 - -4.447866113008026e+02 - -4.461707395611302e+02 - -4.475582108324218e+02 - -4.489490306166049e+02 - -4.503432043000000e+02 - -4.517407372272212e+02 - -4.531416348857516e+02 - -4.545459027469901e+02 - -4.559535462055746e+02 - -4.573645706999994e+02 - -4.587789817092769e+02 - -4.601967847429616e+02 - -4.616179852648949e+02 - -4.630425886631084e+02 - -4.644706004000000e+02 - -4.659020259847504e+02 - -4.673368709042424e+02 - -4.687751406384571e+02 - -4.702168406679589e+02 - -4.716619764999995e+02 - -4.731105536500806e+02 - -4.745625775980045e+02 - -4.760180538297375e+02 - -4.774769878558138e+02 - -4.789393852000000e+02 - -4.804052513950263e+02 - -4.818745919803221e+02 - -4.833474124743740e+02 - -4.848237183656923e+02 - -4.863035151999994e+02 - -4.877868085453354e+02 - -4.892736039052198e+02 - -4.907639068268139e+02 - -4.922577229425711e+02 - -4.937550578000000e+02 - -4.952559169027076e+02 - -4.967603058178435e+02 - -4.982682301416788e+02 - -4.997796954853789e+02 - -5.012947073999994e+02 - -5.028132714194502e+02 - -5.043353931676896e+02 - -5.058610782730644e+02 - -5.073903323321115e+02 - -5.089231609000000e+02 - -5.104595695386481e+02 - -5.119995639358939e+02 - -5.135431497453484e+02 - -5.150903325247945e+02 - -5.166411178999995e+02 - -5.181955115300345e+02 - -5.197535190105982e+02 - -5.213151459679927e+02 - -5.228803980937674e+02 - -5.244492810000000e+02 - -5.260218002787250e+02 - -5.275979616609960e+02 - -5.291777708470047e+02 - -5.307612334400695e+02 - -5.323483550999995e+02 - -5.339391415258532e+02 - -5.355335984055753e+02 - -5.371317314077364e+02 - -5.387335461786030e+02 - -5.403390484000000e+02 - -5.419482437848817e+02 - -5.435611380730882e+02 - -5.451777369746786e+02 - -5.467980461477442e+02 - -5.484220712999994e+02 - -5.500498181706811e+02 - -5.516812924850077e+02 - -5.533164999617454e+02 - -5.549554463178829e+02 - -5.565981372999994e+02 - -5.582445786620732e+02 - -5.598947761113077e+02 - -5.615487353817318e+02 - -5.632064622631164e+02 - -5.648679624999994e+02 - -5.665332418238921e+02 - -5.682023060429622e+02 - -5.698751609401672e+02 - -5.715518122344557e+02 - -5.732322656999993e+02 - -5.749165271427032e+02 - -5.766046023386582e+02 - -5.782964970855437e+02 - -5.799922172195480e+02 - -5.816917684999994e+02 - -5.833951566715182e+02 - -5.851023876259811e+02 - -5.868134672043320e+02 - -5.885284011210334e+02 - -5.902471951999993e+02 - -5.919698553287222e+02 - -5.936963873375214e+02 - -5.954267970459595e+02 - -5.971610902818754e+02 - -5.988992728999993e+02 - -6.006413507613062e+02 - -6.023873296844711e+02 - -6.041372155081436e+02 - -6.058910141182311e+02 - -6.076487313999993e+02 - -6.094103732273231e+02 - -6.111759454411804e+02 - -6.129454539033432e+02 - -6.147189045204622e+02 - -6.164963032000001e+02 - -6.182776558378988e+02 - -6.200629682925465e+02 - -6.218522464515877e+02 - -6.236454962577363e+02 - -6.254427235999993e+02 - -6.272439343587159e+02 - -6.290491345295636e+02 - -6.308583300588987e+02 - -6.326715267788347e+02 - -6.344887306000001e+02 - -6.363099474872770e+02 - -6.381351833941451e+02 - -6.399644442896572e+02 - -6.417977361628546e+02 - -6.436350648999993e+02 - -6.454764363684590e+02 - -6.473218566292518e+02 - -6.491713317125350e+02 - -6.510248675271151e+02 - -6.528824700000000e+02 - -6.547441451008573e+02 - -6.566098988943567e+02 - -6.584797373808955e+02 - -6.603536664383599e+02 - -6.622316920999993e+02 - -6.641138204605409e+02 - -6.660000574329696e+02 - -6.678904089961051e+02 - -6.697848812885560e+02 - -6.716834803000000e+02 - -6.735862119462199e+02 - -6.754930822688247e+02 - -6.774040973560088e+02 - -6.793192633079277e+02 - -6.812385860999992e+02 - -6.831620716800010e+02 - -6.850897262089175e+02 - -6.870215557906422e+02 - -6.889575663679858e+02 - -6.908977640000001e+02 - -6.928421548145254e+02 - -6.947907448778678e+02 - -6.967435402481692e+02 - -6.987005469959722e+02 - -7.006617711999993e+02 - -7.026272189534540e+02 - -7.045968963883171e+02 - -7.065708096021641e+02 - -7.085489646318440e+02 - -7.105313676000000e+02 - -7.125180246666655e+02 - -7.145089419064375e+02 - -7.165041254104643e+02 - -7.185035813280965e+02 - -7.205073157999993e+02 - -7.225153349567163e+02 - -7.245276449240899e+02 - -7.265442518464891e+02 - -7.285651618951177e+02 - -7.305903812000000e+02 - -7.326199158832851e+02 - -7.346537721472801e+02 - -7.366919561576724e+02 - -7.387344740033407e+02 - -7.407813318999993e+02 - -7.428325361060332e+02 - -7.448880927069067e+02 - -7.469480078569493e+02 - -7.490122878703525e+02 - -7.510809389000000e+02 - -7.531539670309830e+02 - -7.552313785295614e+02 - -7.573131796529314e+02 - -7.593993765758833e+02 - -7.614899754999992e+02 - -7.635849826556215e+02 - -7.656844042998581e+02 - -7.677882466626152e+02 - -7.698965159244972e+02 - -7.720092183000000e+02 - -7.741263600422619e+02 - -7.762479474594095e+02 - -7.783739868214470e+02 - -7.805044843222228e+02 - -7.826394461999992e+02 - -7.847788787331309e+02 - -7.869227882276110e+02 - -7.890711809493379e+02 - -7.912240631015031e+02 - -7.933814410000000e+02 - -7.955433210068886e+02 - -7.977097093640062e+02 - -7.998806123337483e+02 - -8.020560362523712e+02 - -8.042359873999992e+02 - -8.064204720446323e+02 - -8.086094965664213e+02 - -8.108030673053524e+02 - -8.130011905039750e+02 - -8.152038725000000e+02 - -8.174111196729889e+02 - -8.196229383028856e+02 - -8.218393347070877e+02 - -8.240603152936806e+02 - -8.262858863999992e+02 - -8.285160543327190e+02 - -8.307508254786889e+02 - -8.329902062108882e+02 - -8.352342028550189e+02 - -8.374828218000000e+02 - -8.397360694583805e+02 - -8.419939521636865e+02 - -8.442564762682848e+02 - -8.465236481828920e+02 - -8.487954742999991e+02 - -8.510719610066617e+02 - -8.533531147279726e+02 - -8.556389418758610e+02 - -8.579294488297842e+02 - -8.602246420000000e+02 - -8.625245278111681e+02 - -8.648291126593311e+02 - -8.671384029773127e+02 - -8.694524052578884e+02 - -8.717711258999991e+02 - -8.740945712693658e+02 - -8.764227478547659e+02 - -8.787556621558366e+02 - -8.810933206360036e+02 - -8.834357297000000e+02 - -8.857828957473700e+02 - -8.881348253000285e+02 - -8.904915248639498e+02 - -8.928530008754832e+02 - -8.952192597999992e+02 - -8.975903081273602e+02 - -8.999661523549036e+02 - -9.023467989915350e+02 - -9.047322545556517e+02 - -9.071225255000001e+02 - -9.095176182642568e+02 - -9.119175394073789e+02 - -9.143222954857910e+02 - -9.167318930073794e+02 - -9.191463384999990e+02 - -9.215656384936522e+02 - -9.239897994653498e+02 - -9.264188279352956e+02 - -9.288527305046009e+02 - -9.312915136999991e+02 - -9.337351840217814e+02 - -9.361837480744202e+02 - -9.386372124507991e+02 - -9.410955836845210e+02 - -9.435588682999991e+02 - -9.460270728408829e+02 - -9.485002039375468e+02 - -9.509782681943145e+02 - -9.534612721474879e+02 - -9.559492223999991e+02 - -9.584421255818636e+02 - -9.609399882443452e+02 - -9.634428169536077e+02 - -9.659506183300578e+02 - -9.684633989999990e+02 - -9.709811655949806e+02 - -9.735039247636544e+02 - -9.760316831188370e+02 - -9.785644472182881e+02 - -9.811022236999991e+02 - -9.836450192407020e+02 - -9.861928404528198e+02 - -9.887456939756197e+02 - -9.913035865101050e+02 - -9.938665246999991e+02 - -9.964345151588749e+02 - -9.990075645416573e+02 - -1.001585679508894e+03 - -1.004168866725833e+03 - -1.006757132999999e+03 - -1.009350485088950e+03 - -1.011948929193798e+03 - -1.014552472017065e+03 - -1.017161121149714e+03 - -1.019774882999999e+03 - -1.022393763477281e+03 - -1.025017769745607e+03 - -1.027646908706880e+03 - -1.030281186449000e+03 - -1.032920609999999e+03 - -1.035565186772393e+03 - -1.038214923106640e+03 - -1.040869825393126e+03 - -1.043529900494233e+03 - -1.046195154999999e+03 - -1.048865595518282e+03 - -1.051541229525064e+03 - -1.054222063914517e+03 - -1.056908104442841e+03 - -1.059599357999999e+03 - -1.062295832060889e+03 - -1.064997533253958e+03 - -1.067704468147946e+03 - -1.070416643533965e+03 - -1.073134066000000e+03 - -1.075856742179453e+03 - -1.078584679453085e+03 - -1.081317884808236e+03 - -1.084056364390976e+03 - -1.086800124999999e+03 - -1.089549173751501e+03 - -1.092303517161580e+03 - -1.095063162007773e+03 - -1.097828115663242e+03 - -1.100598385000000e+03 - -1.103373976558467e+03 - -1.106154896984741e+03 - -1.108941153067517e+03 - -1.111732751768433e+03 - -1.114529699999999e+03 - -1.117332004656191e+03 - -1.120139672719820e+03 - -1.122952711033347e+03 - -1.125771126202256e+03 - -1.128594925000000e+03 - -1.131424114391635e+03 - -1.134258701616623e+03 - -1.137098693726371e+03 - -1.139944097362279e+03 - -1.142794918999999e+03 - -1.145651165298781e+03 - -1.148512843975744e+03 - -1.151379962155369e+03 - -1.154252525751212e+03 - -1.157130542000000e+03 - -1.160014018647746e+03 - -1.162902961796701e+03 - -1.165797378002409e+03 - -1.168697275086654e+03 - -1.171602659999999e+03 - -1.174513539162380e+03 - -1.177429919411751e+03 - -1.180351807863387e+03 - -1.183279211838743e+03 - -1.186212138000000e+03 - -1.189150592852472e+03 - -1.192094584016226e+03 - -1.195044118757429e+03 - -1.197999203418656e+03 - -1.200959844999999e+03 - -1.203926050837031e+03 - -1.206897827704460e+03 - -1.209875182550288e+03 - -1.212858122751144e+03 - -1.215846655000000e+03 - -1.218840785789916e+03 - -1.221840522671824e+03 - -1.224845872987532e+03 - -1.227856843385819e+03 - -1.230873440999999e+03 - -1.233895673111333e+03 - -1.236923546192640e+03 - -1.239957067026041e+03 - -1.242996243170224e+03 - -1.246041082000000e+03 - -1.249091590572761e+03 - -1.252147775334870e+03 - -1.255209643154299e+03 - -1.258277201722480e+03 - -1.261350457999999e+03 - -1.264429418673061e+03 - -1.267514091394071e+03 - -1.270604483350415e+03 - -1.273700600740823e+03 - -1.276802451000000e+03 - -1.279910042060014e+03 - -1.283023380429426e+03 - -1.286142472688095e+03 - -1.289267326090673e+03 - -1.292397947999999e+03 - -1.295534345774196e+03 - -1.298676526619691e+03 - -1.301824497524618e+03 - -1.304978265240164e+03 - -1.308137837000000e+03 - -1.311303220289759e+03 - -1.314474422298625e+03 - -1.317651449999705e+03 - -1.320834310180745e+03 - -1.324023009999999e+03 - -1.327217556910311e+03 - -1.330417958531748e+03 - -1.333624221890711e+03 - -1.336836353161044e+03 - -1.340054360000000e+03 - -1.343278250622039e+03 - -1.346508031450468e+03 - -1.349743709083262e+03 - -1.352985291084887e+03 - -1.356232784999999e+03 - -1.359486198143600e+03 - -1.362745537187869e+03 - -1.366010809195683e+03 - -1.369282022032803e+03 - -1.372559183000000e+03 - -1.375842299046690e+03 - -1.379131377356324e+03 - -1.382426425045151e+03 - -1.385727449081319e+03 - -1.389034456999999e+03 - -1.392347456524483e+03 - -1.395666454635196e+03 - -1.398991458464414e+03 - -1.402322475610563e+03 - -1.405659513000000e+03 - -1.409002577344138e+03 - -1.412351676333446e+03 - -1.415706817605260e+03 - -1.419068008353351e+03 - -1.422435255999999e+03 - -1.425808567964313e+03 - -1.429187950969556e+03 - -1.432573411998037e+03 - -1.435964958719179e+03 - -1.439362599000000e+03 - -1.442766340439504e+03 - -1.446176189225631e+03 - -1.449592152360744e+03 - -1.453014238529275e+03 - -1.456442454999999e+03 - -1.459876808245435e+03 - -1.463317305593544e+03 - -1.466763954627232e+03 - -1.470216762966463e+03 - -1.473675738000000e+03 - -1.477140887005819e+03 - -1.480612217422037e+03 - -1.484089736511155e+03 - -1.487573451238554e+03 - -1.491063368999999e+03 - -1.494559497483912e+03 - -1.498061844364458e+03 - -1.501570417048641e+03 - -1.505085222548716e+03 - -1.508606267999999e+03 - -1.512133560790714e+03 - -1.515667108906144e+03 - -1.519206919999463e+03 - -1.522753000996140e+03 - -1.526305358999999e+03 - -1.529864001422905e+03 - -1.533428936276007e+03 - -1.537000171179230e+03 - -1.540577712963951e+03 - -1.544161568999999e+03 - -1.547751747018138e+03 - -1.551348254621497e+03 - -1.554951099280540e+03 - -1.558560288310355e+03 - -1.562175828999999e+03 - -1.565797728689906e+03 - -1.569425994958102e+03 - -1.573060635400619e+03 - -1.576701657553543e+03 - -1.580349068999999e+03 - -1.584002877314684e+03 - -1.587663089901193e+03 - -1.591329713983250e+03 - -1.595002756657312e+03 - -1.598682225999999e+03 - -1.602368130282464e+03 - -1.606060476003810e+03 - -1.609759270166310e+03 - -1.613464521194204e+03 - -1.617176236999999e+03 - -1.620894424965112e+03 - -1.624619091996676e+03 - -1.628350245392540e+03 - -1.632087893195996e+03 - -1.635832042999999e+03 - -1.639582702219653e+03 - -1.643339878880967e+03 - -1.647103580589531e+03 - -1.650873814125992e+03 - -1.654650586999999e+03 - -1.658433907212865e+03 - -1.662223782656940e+03 - -1.666020220927786e+03 - -1.669823229228366e+03 - -1.673632814999999e+03 - -1.677448985879331e+03 - -1.681271749582079e+03 - -1.685101113981527e+03 - -1.688937087086922e+03 - -1.692779675999999e+03 - -1.696628887589857e+03 - -1.700484730162859e+03 - -1.704347211664743e+03 - -1.708216339003609e+03 - -1.712092119999999e+03 - -1.715974562928047e+03 - -1.719863675285195e+03 - -1.723759464515762e+03 - -1.727661938269359e+03 - -1.731571103999999e+03 - -1.735486969207614e+03 - -1.739409542118944e+03 - -1.743338830603560e+03 - -1.747274841733617e+03 - -1.751217582999999e+03 - -1.755167062315964e+03 - -1.759123288009624e+03 - -1.763086267739076e+03 - -1.767056008086542e+03 - -1.771032516999999e+03 - -1.775015803098183e+03 - -1.779005873908525e+03 - -1.783002736756524e+03 - -1.787006399126180e+03 - -1.791016869000000e+03 - -1.795034154506543e+03 - -1.799058263107071e+03 - -1.803089202321619e+03 - -1.807126980015989e+03 - -1.811171603999998e+03 - -1.815223082025504e+03 - -1.819281421835726e+03 - -1.823346631247284e+03 - -1.827418718154363e+03 - -1.831497690000000e+03 - -1.835583554215247e+03 - -1.839676319355180e+03 - -1.843775993459518e+03 - -1.847882583413063e+03 - -1.851996096999998e+03 - -1.856116542493618e+03 - -1.860243927542824e+03 - -1.864378259929794e+03 - -1.868519547846306e+03 - -1.872667799000000e+03 - -1.876823020804590e+03 - -1.880985220849939e+03 - -1.885154407199114e+03 - -1.889330588466962e+03 - -1.893513771999998e+03 - -1.897703964771626e+03 - -1.901901175652285e+03 - -1.906105412964281e+03 - -1.910316683519642e+03 - -1.914534995000000e+03 - -1.918760355678869e+03 - -1.922992773607248e+03 - -1.927232256642219e+03 - -1.931478812455566e+03 - -1.935732448999998e+03 - -1.939993174351127e+03 - -1.944260996306766e+03 - -1.948535922544343e+03 - -1.952817960710870e+03 - -1.957107119000000e+03 - -1.961403405774432e+03 - -1.965706828656891e+03 - -1.970017395435863e+03 - -1.974335114379128e+03 - -1.978659992999998e+03 - -1.982992038634364e+03 - -1.987331259958815e+03 - -1.991677665406797e+03 - -1.996031262526477e+03 - -2.000392059000000e+03 - -2.004760062662544e+03 - -2.009135281420714e+03 - -2.013517723394651e+03 - -2.017907396963966e+03 - -2.022304309999998e+03 - -2.026708470129302e+03 - -2.031119885371980e+03 - -2.035538563783372e+03 - -2.039964513323241e+03 - -2.044397742000000e+03 - -2.048838257821666e+03 - -2.053286068652342e+03 - -2.057741182613919e+03 - -2.062203608203423e+03 - -2.066673352999998e+03 - -2.071150424296029e+03 - -2.075634830690161e+03 - -2.080126580708826e+03 - -2.084625682242698e+03 - -2.089132143000000e+03 - -2.093645970720743e+03 - -2.098167173603271e+03 - -2.102695759983049e+03 - -2.107231738184183e+03 - -2.111775115999998e+03 - -2.116325901057278e+03 - -2.120884101683680e+03 - -2.125449726108530e+03 - -2.130022782163747e+03 - -2.134603278000000e+03 - -2.139191221924691e+03 - -2.143786621957349e+03 - -2.148389485981318e+03 - -2.152999821836896e+03 - -2.157617637999998e+03 - -2.162242943074696e+03 - -2.166875744534069e+03 - -2.171516050262848e+03 - -2.176163869133622e+03 - -2.180819209000000e+03 - -2.185482077327040e+03 - -2.190152482871076e+03 - -2.194830433950524e+03 - -2.199515937814626e+03 - -2.204209002999998e+03 - -2.208909638535144e+03 - -2.213617851857877e+03 - -2.218333650781778e+03 - -2.223057044225780e+03 - -2.227788040000000e+03 - -2.232526645541351e+03 - -2.237272869895315e+03 - -2.242026721580949e+03 - -2.246788207788726e+03 - -2.251557336999999e+03 - -2.256334118250544e+03 - -2.261118559161676e+03 - -2.265910667352767e+03 - -2.270710451040453e+03 - -2.275517918999998e+03 - -2.280333080014267e+03 - -2.285155941593499e+03 - -2.289986511539142e+03 - -2.294824798563590e+03 - -2.299670810999998e+03 - -2.304524556927484e+03 - -2.309386044592275e+03 - -2.314255282195762e+03 - -2.319132277836808e+03 - -2.324017039999998e+03 - -2.328909577220459e+03 - -2.333809897224200e+03 - -2.338718008145149e+03 - -2.343633918994289e+03 - -2.348557637999998e+03 - -2.353489172912608e+03 - -2.358428531797252e+03 - -2.363375723128402e+03 - -2.368330755820120e+03 - -2.373293637999998e+03 - -2.378264377427878e+03 - -2.383242982526706e+03 - -2.388229461889857e+03 - -2.393223824063392e+03 - -2.398226076999998e+03 - -2.403236228525699e+03 - -2.408254287477974e+03 - -2.413280262494937e+03 - -2.418314161547432e+03 - -2.423355992999998e+03 - -2.428405765403690e+03 - -2.433463486890615e+03 - -2.438529165661329e+03 - -2.443602810190047e+03 - -2.448684428999998e+03 - -2.453774030522361e+03 - -2.458871622761939e+03 - -2.463977214083831e+03 - -2.469090813490053e+03 - -2.474212428999998e+03 - -2.479342068313477e+03 - -2.484479740528551e+03 - -2.489625454539379e+03 - -2.494779218375099e+03 - -2.499941039999998e+03 - -2.505110927624773e+03 - -2.510288890409285e+03 - -2.515474937052364e+03 - -2.520669075212765e+03 - -2.525871312999998e+03 - -2.531081658990217e+03 - -2.536300122220549e+03 - -2.541526711425658e+03 - -2.546761434689014e+03 - -2.552004299999998e+03 - -2.557255315555890e+03 - -2.562514490474060e+03 - -2.567781833501355e+03 - -2.573057352510476e+03 - -2.578341055999998e+03 - -2.583632952807378e+03 - -2.588933051312229e+03 - -2.594241359879810e+03 - -2.599557887014108e+03 - -2.604882640999998e+03 - -2.610215630196411e+03 - -2.615556863841929e+03 - -2.620906350516468e+03 - -2.626264097579904e+03 - -2.631630113999998e+03 - -2.637004409331177e+03 - -2.642386991059378e+03 - -2.647777867311749e+03 - -2.653177047878767e+03 - -2.658584540999998e+03 - -2.664000354190328e+03 - -2.669424496446296e+03 - -2.674856976816473e+03 - -2.680297803844182e+03 - -2.685746985999998e+03 - -2.691204531699670e+03 - -2.696670449221115e+03 - -2.702144747143579e+03 - -2.707627434527642e+03 - -2.713118519999998e+03 - -2.718618011850782e+03 - -2.724125918263655e+03 - -2.729642247949266e+03 - -2.735167010382318e+03 - -2.740700213999998e+03 - -2.746241866699575e+03 - -2.751791977076697e+03 - -2.757350554006517e+03 - -2.762917606479738e+03 - -2.768493143000000e+03 - -2.774077171851313e+03 - -2.779669701724049e+03 - -2.785270741295763e+03 - -2.790880299095185e+03 - -2.796498383999998e+03 - -2.802125004968091e+03 - -2.807760170344632e+03 - -2.813403888501788e+03 - -2.819056168106567e+03 - -2.824717018000000e+03 - -2.830386447079949e+03 - -2.836064464083062e+03 - -2.841751077483182e+03 - -2.847446295475182e+03 - -2.853150126999998e+03 - -2.858862581346520e+03 - -2.864583667200011e+03 - -2.870313392988722e+03 - -2.876051767015894e+03 - -2.881798798000000e+03 - -2.887554494917011e+03 - -2.893318866668325e+03 - -2.899091922031221e+03 - -2.904873669618204e+03 - -2.910664117999998e+03 - -2.916463275808826e+03 - -2.922271151990944e+03 - -2.928087755363771e+03 - -2.933913094445438e+03 - -2.939747178000000e+03 - -2.945590014959967e+03 - -2.951441614226611e+03 - -2.957301984588625e+03 - -2.963171134666888e+03 - -2.969049072999998e+03 - -2.974935808208847e+03 - -2.980831349417174e+03 - -2.986735705755709e+03 - -2.992648886132359e+03 - -2.998570899000000e+03 - -3.004501752659864e+03 - -3.010441455936329e+03 - -3.016390017858416e+03 - -3.022347447554316e+03 - -3.028313753999998e+03 - -3.034288946006182e+03 - -3.040273032141582e+03 - -3.046266021078663e+03 - -3.052267921739149e+03 - -3.058278743000000e+03 - -3.064298493698561e+03 - -3.070327182685398e+03 - -3.076364818827055e+03 - -3.082411411001809e+03 - -3.088466967999998e+03 - -3.094531498652569e+03 - -3.100605012177602e+03 - -3.106687517554494e+03 - -3.112779023262762e+03 - -3.118879538000000e+03 - -3.124989070695736e+03 - -3.131107630527278e+03 - -3.137235226491168e+03 - -3.143371867254447e+03 - -3.149517561999998e+03 - -3.155672319953097e+03 - -3.161836149115856e+03 - -3.168009058152651e+03 - -3.174191057129923e+03 - -3.180382155000000e+03 - -3.186582360055111e+03 - -3.192791681144167e+03 - -3.199010127274887e+03 - -3.205237707493432e+03 - -3.211474430999998e+03 - -3.217720306909038e+03 - -3.223975343611381e+03 - -3.230239549889151e+03 - -3.236512935355519e+03 - -3.242795509000000e+03 - -3.249087279482800e+03 - -3.255388255944051e+03 - -3.261698447489179e+03 - -3.268017862963467e+03 - -3.274346510999998e+03 - -3.280684400401313e+03 - -3.287031541121871e+03 - -3.293387942369432e+03 - -3.299753611888159e+03 - -3.306128559000000e+03 - -3.312512793688797e+03 - -3.318906324190636e+03 - -3.325309159228279e+03 - -3.331721308860119e+03 - -3.338142781999998e+03 - -3.344573586933190e+03 - -3.351013732692941e+03 - -3.357463228591956e+03 - -3.363922084041577e+03 - -3.370390307999997e+03 - -3.376867909193196e+03 - -3.383354896616435e+03 - -3.389851279509897e+03 - -3.396357067337695e+03 - -3.402872268999997e+03 - -3.409396893188545e+03 - -3.415930949268335e+03 - -3.422474446597307e+03 - -3.429027394238212e+03 - -3.435589800999997e+03 - -3.442161675674332e+03 - -3.448743027574159e+03 - -3.455333866086035e+03 - -3.461934200499129e+03 - -3.468544039999997e+03 - -3.475163393634110e+03 - -3.481792270131310e+03 - -3.488430678432703e+03 - -3.495078627927044e+03 - -3.501736127999997e+03 - -3.508403187927853e+03 - -3.515079816661691e+03 - -3.521766023349286e+03 - -3.528461817510494e+03 - -3.535167207999998e+03 - -3.541882203477436e+03 - -3.548606813620608e+03 - -3.555341047964333e+03 - -3.562084915431213e+03 - -3.568838424999997e+03 - -3.575601585773337e+03 - -3.582374407066678e+03 - -3.589156898185297e+03 - -3.595949068354316e+03 - -3.602750926999998e+03 - -3.609562483468940e+03 - -3.616383746264014e+03 - -3.623214724488114e+03 - -3.630055428392298e+03 - -3.636905866999997e+03 - -3.643766048793625e+03 - -3.650635983516456e+03 - -3.657515680680700e+03 - -3.664405149014039e+03 - -3.671304397999997e+03 - -3.678213437374473e+03 - -3.685132275760156e+03 - -3.692060922035369e+03 - -3.698999385901594e+03 - -3.705947676999997e+03 - -3.712905804797643e+03 - -3.719873778403308e+03 - -3.726851606752037e+03 - -3.733839298718909e+03 - -3.740836863999997e+03 - -3.747844312547997e+03 - -3.754861653211674e+03 - -3.761888895074585e+03 - -3.768926047955085e+03 - -3.775973120999997e+03 - -3.783030123074376e+03 - -3.790097063813473e+03 - -3.797173952745452e+03 - -3.804260798968512e+03 - -3.811357611999997e+03 - -3.818464401472386e+03 - -3.825581176303607e+03 - -3.832707945585785e+03 - -3.839844718954238e+03 - -3.846991505999998e+03 - -3.854148316201428e+03 - -3.861315158822798e+03 - -3.868492043129635e+03 - -3.875678978458987e+03 - -3.882875973999997e+03 - -3.890083038997269e+03 - -3.897300183310783e+03 - -3.904527416633095e+03 - -3.911764748154242e+03 - -3.919012186999997e+03 - -3.926269742452437e+03 - -3.933537424464352e+03 - -3.940815242621297e+03 - -3.948103205720294e+03 - -3.955401322999997e+03 - -3.962709604107895e+03 - -3.970028058998795e+03 - -3.977356697163350e+03 - -3.984695527326294e+03 - -3.992044558999997e+03 - -3.999403802144854e+03 - -4.006773266302151e+03 - -4.014152960820400e+03 - -4.021542894928240e+03 - -4.028943077999997e+03 - -4.036353519583599e+03 - -4.043774229513202e+03 - -4.051205217431756e+03 - -4.058646492564995e+03 - -4.066098063999997e+03 - -4.073559940995820e+03 - -4.081032133755226e+03 - -4.088514652104142e+03 - -4.096007504979870e+03 - -4.103510702000000e+03 - -4.111024253097677e+03 - -4.118548167510886e+03 - -4.126082454416708e+03 - -4.133627123225803e+03 - -4.141182184000000e+03 - -4.148747646853033e+03 - -4.156323520486682e+03 - -4.163909814098826e+03 - -4.171506538118098e+03 - -4.179113701999993e+03 - -4.186731314728609e+03 - -4.194359386189681e+03 - -4.201997926116393e+03 - -4.209646943720986e+03 - -4.217306449000000e+03 - -4.224976452122954e+03 - -4.232656961817923e+03 - -4.240347987240753e+03 - -4.248049538718602e+03 - -4.255761626000000e+03 - -4.263484258397591e+03 - -4.271217445246016e+03 - -4.278961196276451e+03 - -4.286715521743729e+03 - -4.294480431000000e+03 - -4.302255933066315e+03 - -4.310042038085233e+03 - -4.317838756007569e+03 - -4.325646096087124e+03 - -4.333464067999995e+03 - -4.341292681602012e+03 - -4.349131946225953e+03 - -4.356981871466000e+03 - -4.364842467485710e+03 - -4.372713744000000e+03 - -4.380595710372718e+03 - -4.388488375861229e+03 - -4.396391750264422e+03 - -4.404305844160006e+03 - -4.412230667000000e+03 - -4.420166227736474e+03 - -4.428112536405837e+03 - -4.436069603088062e+03 - -4.444037437481978e+03 - -4.452016049000000e+03 - -4.460005447074678e+03 - -4.468005641867199e+03 - -4.476016643204103e+03 - -4.484038460200805e+03 - -4.492071102999995e+03 - -4.500114582060231e+03 - -4.508168906299815e+03 - -4.516234085098625e+03 - -4.524310129075975e+03 - -4.532397048000000e+03 - -4.540494851104932e+03 - -4.548603547974418e+03 - -4.556723148595408e+03 - -4.564853663376500e+03 - -4.572995102000000e+03 - -4.581147473755137e+03 - -4.589310788334117e+03 - -4.597485055595826e+03 - -4.605670285497996e+03 - -4.613866488000000e+03 - -4.622073673035890e+03 - -4.630291850451470e+03 - -4.638521029781397e+03 - -4.646761220207367e+03 - -4.655012431999994e+03 - -4.663274675842531e+03 - -4.671547961173437e+03 - -4.679832297267551e+03 - -4.688127693710799e+03 - -4.696434161000000e+03 - -4.704751709752170e+03 - -4.713080348793824e+03 - -4.721420087561993e+03 - -4.729770937031085e+03 - -4.738132907000000e+03 - -4.746506006604411e+03 - -4.754890245715343e+03 - -4.763285634540516e+03 - -4.771692183448750e+03 - -4.780109901999994e+03 - -4.788538799466528e+03 - -4.796978886096308e+03 - -4.805430172162917e+03 - -4.813892667577567e+03 - -4.822366381999994e+03 - -4.830851325088147e+03 - -4.839347507060687e+03 - -4.847854938123849e+03 - -4.856373628221604e+03 - -4.864903587000000e+03 - -4.873444824101478e+03 - -4.881997349859994e+03 - -4.890561174364984e+03 - -4.899136307099045e+03 - -4.907722758000000e+03 - -4.916320537362784e+03 - -4.924929655587317e+03 - -4.933550122528648e+03 - -4.942181947260091e+03 - -4.950825139999994e+03 - -4.959479711457802e+03 - -4.968145671175524e+03 - -4.976823028809056e+03 - -4.985511794647833e+03 - -4.994211978999993e+03 - -5.002923592007461e+03 - -5.011646643245516e+03 - -5.020381142480443e+03 - -5.029127099988444e+03 - -5.037884526000000e+03 - -5.046653430641881e+03 - -5.055433823857634e+03 - -5.064225715527905e+03 - -5.073029115529123e+03 - -5.081844034000000e+03 - -5.090670481166524e+03 - -5.099508466925161e+03 - -5.108358001180135e+03 - -5.117219094017154e+03 - -5.126091755999993e+03 - -5.134975997626908e+03 - -5.143871827953957e+03 - -5.152779256704796e+03 - -5.161698295082459e+03 - -5.170628952999993e+03 - -5.179571239778229e+03 - -5.188525166029071e+03 - -5.197490742130520e+03 - -5.206467977662855e+03 - -5.215456883000000e+03 - -5.224457468752808e+03 - -5.233469744262066e+03 - -5.242493719420175e+03 - -5.251529405361101e+03 - -5.260576812000000e+03 - -5.269635948683524e+03 - -5.278706825911151e+03 - -5.287789454172008e+03 - -5.296883843495917e+03 - -5.305990003999993e+03 - -5.315107945871962e+03 - -5.324237679253967e+03 - -5.333379214299059e+03 - -5.342532561186867e+03 - -5.351697729999993e+03 - -5.360874730862462e+03 - -5.370063574314554e+03 - -5.379264270604972e+03 - -5.388476829418795e+03 - -5.397701261000000e+03 - -5.406937575887649e+03 - -5.416185784228891e+03 - -5.425445896082409e+03 - -5.434717921547790e+03 - -5.444001871000000e+03 - -5.453297754883592e+03 - -5.462605583222671e+03 - -5.471925366229407e+03 - -5.481257114511772e+03 - -5.490600837999993e+03 - -5.499956546429602e+03 - -5.509324250592133e+03 - -5.518703961068116e+03 - -5.528095687743725e+03 - -5.537499440999993e+03 - -5.546915231361128e+03 - -5.556343068498348e+03 - -5.565782962476614e+03 - -5.575234924238452e+03 - -5.584698964000000e+03 - -5.594175091687396e+03 - -5.603663318133420e+03 - -5.613163653827974e+03 - -5.622676108416792e+03 - -5.632200692000000e+03 - -5.641737415094019e+03 - -5.651286288507457e+03 - -5.660847322604374e+03 - -5.670420527008017e+03 - -5.680005911999993e+03 - -5.689603488367688e+03 - -5.699213267038800e+03 - -5.708835258184300e+03 - -5.718469470901945e+03 - -5.728115915999992e+03 - -5.737774605002216e+03 - -5.747445547634946e+03 - -5.757128753652110e+03 - -5.766824233562706e+03 - -5.776531998000000e+03 - -5.786252057564687e+03 - -5.795984422575620e+03 - -5.805729103393980e+03 - -5.815486110517342e+03 - -5.825255454000000e+03 - -5.835037143865786e+03 - -5.844831191184440e+03 - -5.854637606668529e+03 - -5.864456400127173e+03 - -5.874287581999993e+03 - -5.884131163070459e+03 - -5.893987153665426e+03 - -5.903855564090225e+03 - -5.913736404781277e+03 - -5.923629686000000e+03 - -5.933535418061928e+03 - -5.943453611973397e+03 - -5.953384278439786e+03 - -5.963327427438455e+03 - -5.973283069000000e+03 - -5.983251213525049e+03 - -5.993231872573540e+03 - -6.003225056744913e+03 - -6.013230774891098e+03 - -6.023249038000000e+03 - -6.033279857947543e+03 - -6.043323244258373e+03 - -6.053379206808452e+03 - -6.063447756872029e+03 - -6.073528904999992e+03 - -6.083622661322729e+03 - -6.093729036471069e+03 - -6.103848041095609e+03 - -6.113979685699232e+03 - -6.124123981000000e+03 - -6.134280937646101e+03 - -6.144450565430006e+03 - -6.154632874755873e+03 - -6.164827877191976e+03 - -6.175035583000000e+03 - -6.185256001935748e+03 - -6.195489145360168e+03 - -6.205735024246584e+03 - -6.215993648382001e+03 - -6.226265028000000e+03 - -6.236549173839082e+03 - -6.246846097225249e+03 - -6.257155808917487e+03 - -6.267478318647532e+03 - -6.277813636999993e+03 - -6.288161775039973e+03 - -6.298522743318929e+03 - -6.308896552332133e+03 - -6.319283212690151e+03 - -6.329682735000000e+03 - -6.340095129841887e+03 - -6.350520407726451e+03 - -6.360958579315570e+03 - -6.371409655512612e+03 - -6.381873647000000e+03 - -6.392350564293673e+03 - -6.402840417873253e+03 - -6.413343218449801e+03 - -6.423858977046060e+03 - -6.434387704000000e+03 - -6.444929409479182e+03 - -6.455484104800415e+03 - -6.466051800878468e+03 - -6.476632507643834e+03 - -6.487226235999992e+03 - -6.497832997260840e+03 - -6.508452801649206e+03 - -6.519085659445890e+03 - -6.529731581482401e+03 - -6.540390579000000e+03 - -6.551062663116751e+03 - -6.561747843536938e+03 - -6.572446130639311e+03 - -6.583157536279329e+03 - -6.593882071000000e+03 - -6.604619744763902e+03 - -6.615370568925604e+03 - -6.626134554413510e+03 - -6.636911711064461e+03 - -6.647702049999992e+03 - -6.658505582840396e+03 - -6.669322319643610e+03 - -6.680152270785791e+03 - -6.690995447680221e+03 - -6.701851860999993e+03 - -6.712721521095499e+03 - -6.723604439166686e+03 - -6.734500626205399e+03 - -6.745410092579864e+03 - -6.756332849000000e+03 - -6.767268906377159e+03 - -6.778218275408767e+03 - -6.789180966973428e+03 - -6.800156992270870e+03 - -6.811146362000000e+03 - -6.822149086596000e+03 - -6.833165176809022e+03 - -6.844194643583943e+03 - -6.855237498022965e+03 - -6.866293750999992e+03 - -6.877363413246921e+03 - -6.888446495554016e+03 - -6.899543008749155e+03 - -6.910652963678518e+03 - -6.921776370999992e+03 - -6.932913241460104e+03 - -6.944063586638155e+03 - -6.955227417524035e+03 - -6.966404743973952e+03 - -6.977595577000000e+03 - -6.988799928187199e+03 - -7.000017808173458e+03 - -7.011249227729020e+03 - -7.022494198140058e+03 - -7.033752730000000e+03 - -7.045024833685246e+03 - -7.056310520605544e+03 - -7.067609802022496e+03 - -7.078922688575014e+03 - -7.090249190999992e+03 - -7.101589320140114e+03 - -7.112943086874141e+03 - -7.124310502404821e+03 - -7.135691578318693e+03 - -7.147086324999992e+03 - -7.158494752468790e+03 - -7.169916872475182e+03 - -7.181352696510882e+03 - -7.192802235036809e+03 - -7.204265499000000e+03 - -7.215742499578333e+03 - -7.227233247391960e+03 - -7.238737753333357e+03 - -7.250256028887258e+03 - -7.261788085000000e+03 - -7.273333932305611e+03 - -7.284893581718426e+03 - -7.296467044458082e+03 - -7.308054332025791e+03 - -7.319655454999992e+03 - -7.331270423697963e+03 - -7.342899249833889e+03 - -7.354541944862027e+03 - -7.366198519315069e+03 - -7.377868983999992e+03 - -7.389553350032372e+03 - -7.401251628839381e+03 - -7.412963831476617e+03 - -7.424689968390403e+03 - -7.436430051000000e+03 - -7.448184091042194e+03 - -7.459952098877861e+03 - -7.471734085033887e+03 - -7.483530060856024e+03 - -7.495340038000000e+03 - -7.507164027981260e+03 - -7.519002041143363e+03 - -7.530854088088799e+03 - -7.542720180263871e+03 - -7.554600328999991e+03 - -7.566494545476364e+03 - -7.578402840747203e+03 - -7.590325225748156e+03 - -7.602261711334166e+03 - -7.614212308999990e+03 - -7.626177030375796e+03 - -7.638155885970103e+03 - -7.650148886679111e+03 - -7.662156044359298e+03 - -7.674177370000000e+03 - -7.686212874133715e+03 - -7.698262567927072e+03 - -7.710326462858042e+03 - -7.722404570574414e+03 - -7.734496902000000e+03 - -7.746603467726753e+03 - -7.758724278933637e+03 - -7.770859347070250e+03 - -7.783008683730720e+03 - -7.795172299999991e+03 - -7.807350206747154e+03 - -7.819542415323729e+03 - -7.831748936928582e+03 - -7.843969782379609e+03 - -7.856204962999991e+03 - -7.868454490389281e+03 - -7.880718375856472e+03 - -7.892996630459527e+03 - -7.905289265033489e+03 - -7.917596291000000e+03 - -7.929917719977670e+03 - -7.942253562811284e+03 - -7.954603830544003e+03 - -7.966968534806996e+03 - -7.979347687000000e+03 - -7.991741298275563e+03 - -8.004149379532312e+03 - -8.016571941875890e+03 - -8.029008996834256e+03 - -8.041460555999991e+03 - -8.053926630829063e+03 - -8.066407232164392e+03 - -8.078902371093302e+03 - -8.091412059283156e+03 - -8.103936307999991e+03 - -8.116475128348727e+03 - -8.129028531951320e+03 - -8.141596530160446e+03 - -8.154179133753471e+03 - -8.166776354000000e+03 - -8.179388202500601e+03 - -8.192014690774517e+03 - -8.204655830155478e+03 - -8.217311631752342e+03 - -8.229982107000000e+03 - -8.242667267443709e+03 - -8.255367124181290e+03 - -8.268081688506129e+03 - -8.280810972124258e+03 - -8.293554985999990e+03 - -8.306313740930424e+03 - -8.319087249046417e+03 - -8.331875522237864e+03 - -8.344678571514016e+03 - -8.357496408000001e+03 - -8.370329042981793e+03 - -8.383176487893126e+03 - -8.396038754236946e+03 - -8.408915853538949e+03 - -8.421807796999999e+03 - -8.434714595760075e+03 - -8.447636261558551e+03 - -8.460572806112319e+03 - -8.473524240852536e+03 - -8.486490577000000e+03 - -8.499471825734363e+03 - -8.512467998550057e+03 - -8.525479106914012e+03 - -8.538505162160651e+03 - -8.551546175999989e+03 - -8.564602160205039e+03 - -8.577673125806519e+03 - -8.590759084111069e+03 - -8.603860047081474e+03 - -8.616976026000000e+03 - -8.630107031891077e+03 - -8.643253076647045e+03 - -8.656414171854482e+03 - -8.669590328370747e+03 - -8.682781558000001e+03 - -8.695987872906602e+03 - -8.709209284090668e+03 - -8.722445802791402e+03 - -8.735697441007769e+03 - -8.748964210000000e+03 - -8.762246120773598e+03 - -8.775543185390141e+03 - -8.788855415760128e+03 - -8.802182823160678e+03 - -8.815525418999991e+03 - -8.828883214778334e+03 - -8.842256221886048e+03 - -8.855644451817980e+03 - -8.869047916276779e+03 - -8.882466627000000e+03 - -8.895900595656447e+03 - -8.909349833599377e+03 - -8.922814352320849e+03 - -8.936294163622882e+03 - -8.949789279000001e+03 - -8.963299709806102e+03 - -8.976825467697834e+03 - -8.990366564425331e+03 - -9.003923011733321e+03 - -9.017494820999989e+03 - -9.031082003570244e+03 - -9.044684571593196e+03 - -9.058302536801553e+03 - -9.071935910043938e+03 - -9.085584702999991e+03 - -9.099248927805194e+03 - -9.112928596071970e+03 - -9.126623719398038e+03 - -9.140334309541779e+03 - -9.154060378000000e+03 - -9.167801936143134e+03 - -9.181558995552323e+03 - -9.195331568052554e+03 - -9.209119665711642e+03 - -9.222923300000000e+03 - -9.236742482191501e+03 - -9.250577224366738e+03 - -9.264427538348678e+03 - -9.278293435300837e+03 - -9.292174926999989e+03 - -9.306072025514850e+03 - -9.319984742353185e+03 - -9.333913089239737e+03 - -9.347857078372264e+03 - -9.361816720999988e+03 - -9.375792028076301e+03 - -9.389783011923670e+03 - -9.403789684689073e+03 - -9.417812057757259e+03 - -9.431850143000000e+03 - -9.445903952452922e+03 - -9.459973497383473e+03 - -9.474058789280491e+03 - -9.488159840242311e+03 - -9.502276662000000e+03 - -9.516409266099370e+03 - -9.530557664431180e+03 - -9.544721868948835e+03 - -9.558901891554557e+03 - -9.573097743999990e+03 - -9.587309437907974e+03 - -9.601536984771086e+03 - -9.615780396443668e+03 - -9.630039685320193e+03 - -9.644314862999989e+03 - -9.658605940694017e+03 - -9.672912930240365e+03 - -9.687235843732506e+03 - -9.701574693379191e+03 - -9.715929491000001e+03 - -9.730300248146514e+03 - -9.744686976337332e+03 - -9.759089687418043e+03 - -9.773508393705906e+03 - -9.787943106999999e+03 - -9.802393838806964e+03 - -9.816860600913731e+03 - -9.831343405392694e+03 - -9.845842264577648e+03 - -9.860357189999990e+03 - -9.874888192875391e+03 - -9.889435285292540e+03 - -9.903998479577405e+03 - -9.918577788007758e+03 - -9.933173221999989e+03 - -9.947784792760667e+03 - -9.962412512866247e+03 - -9.977056394630243e+03 - -9.991716449514770e+03 - -1.000639269000000e+04 - -1.002108512827329e+04 - -1.003579377260607e+04 - -1.005051863510592e+04 - -1.006525973450424e+04 - -1.008001708000000e+04 - -1.009479067738785e+04 - -1.010958054488143e+04 - -1.012438669671707e+04 - -1.013920913701616e+04 - -1.015404787999999e+04 - -1.016890294387830e+04 - -1.018377433451942e+04 - -1.019866206104612e+04 - -1.021356614193473e+04 - -1.022848658999999e+04 - -1.024342341422066e+04 - -1.025837662498870e+04 - -1.027334623400460e+04 - -1.028833225445739e+04 - -1.030333470000000e+04 - -1.031835358368700e+04 - -1.033338891534757e+04 - -1.034844070623467e+04 - -1.036350897076085e+04 - -1.037859372000000e+04 - -1.039369496373519e+04 - -1.040881271589677e+04 - -1.042394698923176e+04 - -1.043909779325773e+04 - -1.045426513999999e+04 - -1.046944904320307e+04 - -1.048464951626011e+04 - -1.049986657147346e+04 - -1.051510021951631e+04 - -1.053035046999999e+04 - -1.054561733346490e+04 - -1.056090082649770e+04 - -1.057620096382862e+04 - -1.059151775501402e+04 - -1.060685121000000e+04 - -1.062220133982168e+04 - -1.063756815769902e+04 - -1.065295167679853e+04 - -1.066835190951487e+04 - -1.068376887000000e+04 - -1.069920257172756e+04 - -1.071465302083269e+04 - -1.073012022736731e+04 - -1.074560420973240e+04 - -1.076110497999999e+04 - -1.077662254698522e+04 - -1.079215692468130e+04 - -1.080770812602064e+04 - -1.082327616047952e+04 - -1.083886103999999e+04 - -1.085446277832030e+04 - -1.087008138917964e+04 - -1.088571688451933e+04 - -1.090136927381244e+04 - -1.091703857000000e+04 - -1.093272478707855e+04 - -1.094842793381667e+04 - -1.096414802233435e+04 - -1.097988507119364e+04 - -1.099563909000000e+04 - -1.101141008471468e+04 - -1.102719807131307e+04 - -1.104300306633410e+04 - -1.105882508291791e+04 - -1.107466412999999e+04 - -1.109052021511841e+04 - -1.110639335038349e+04 - -1.112228355101184e+04 - -1.113819083451417e+04 - -1.115411520999999e+04 - -1.117005668368749e+04 - -1.118601527242516e+04 - -1.120199099177015e+04 - -1.121798385114509e+04 - -1.123399386000000e+04 - -1.125002102929127e+04 - -1.126606537454743e+04 - -1.128212691149971e+04 - -1.129820565394142e+04 - -1.131430161000000e+04 - -1.133041478676655e+04 - -1.134654520134832e+04 - -1.136269286880464e+04 - -1.137885779750048e+04 - -1.139503999999999e+04 - -1.141123949060806e+04 - -1.142745627830015e+04 - -1.144369037489935e+04 - -1.145994179819328e+04 - -1.147621056000000e+04 - -1.149249666929363e+04 - -1.150880014040390e+04 - -1.152512098586926e+04 - -1.154145921396878e+04 - -1.155781484000000e+04 - -1.157418788116290e+04 - -1.159057834325663e+04 - -1.160698623573862e+04 - -1.162341157750990e+04 - -1.163985437999999e+04 - -1.165631465167572e+04 - -1.167279241049137e+04 - -1.168928767028212e+04 - -1.170580043559586e+04 - -1.172233071999999e+04 - -1.173887854137991e+04 - -1.175544390951204e+04 - -1.177202683447122e+04 - -1.178862732998528e+04 - -1.180524541000000e+04 - -1.182188108744826e+04 - -1.183853437152247e+04 - -1.185520527417456e+04 - -1.187189381268968e+04 - -1.188860000000000e+04 - -1.190532384555031e+04 - -1.192206535739879e+04 - -1.193882454957090e+04 - -1.195560144455150e+04 - -1.197239604999999e+04 - -1.198920836801576e+04 - -1.200603841862060e+04 - -1.202288622005816e+04 - -1.203975178087160e+04 - -1.205663510999999e+04 - -1.207353621858988e+04 - -1.209045512337030e+04 - -1.210739183876488e+04 - -1.212434637372514e+04 - -1.214131874000000e+04 - -1.215830895146994e+04 - -1.217531702204386e+04 - -1.219234296344827e+04 - -1.220938678454126e+04 - -1.222644850000000e+04 - -1.224352812665298e+04 - -1.226062567426862e+04 - -1.227774115320455e+04 - -1.229487457740941e+04 - -1.231202595999999e+04 - -1.232919531361497e+04 - -1.234638265190763e+04 - -1.236358798719477e+04 - -1.238081132944854e+04 - -1.239805268999999e+04 - -1.241531208224867e+04 - -1.243258952373459e+04 - -1.244988502746729e+04 - -1.246719859854622e+04 - -1.248453025000000e+04 - -1.250187999937352e+04 - -1.251924785997314e+04 - -1.253663384322633e+04 - -1.255403795942784e+04 - -1.257146022000000e+04 - -1.258890063824787e+04 - -1.260635923174130e+04 - -1.262383601348307e+04 - -1.264133098848631e+04 - -1.265884416999999e+04 - -1.267637557565735e+04 - -1.269392521755929e+04 - -1.271149310837373e+04 - -1.272907926320349e+04 - -1.274668368999999e+04 - -1.276430639533002e+04 - -1.278194739917555e+04 - -1.279960671868295e+04 - -1.281728436173200e+04 - -1.283498034000000e+04 - -1.285269466774105e+04 - -1.287042735763161e+04 - -1.288817842259290e+04 - -1.290594787633268e+04 - -1.292373573000000e+04 - -1.294154199365508e+04 - -1.295936667981993e+04 - -1.297720980264566e+04 - -1.299507137776778e+04 - -1.301295141999999e+04 - -1.303084994203483e+04 - -1.304876695061188e+04 - -1.306670245535235e+04 - -1.308465647270176e+04 - -1.310262901999999e+04 - -1.312062011245361e+04 - -1.313862975604251e+04 - -1.315665796055223e+04 - -1.317470474462057e+04 - -1.319277012000000e+04 - -1.321085409533674e+04 - -1.322895668661698e+04 - -1.324707790969205e+04 - -1.326521777718879e+04 - -1.328337630000000e+04 - -1.330155348851537e+04 - -1.331974935491385e+04 - -1.333796391362056e+04 - -1.335619718140170e+04 - -1.337444916999999e+04 - -1.339271988874384e+04 - -1.341100935082290e+04 - -1.342931756987852e+04 - -1.344764455872234e+04 - -1.346599032999999e+04 - -1.348435489664480e+04 - -1.350273827293541e+04 - -1.352114047045672e+04 - -1.353956149695641e+04 - -1.355800137000000e+04 - -1.357646010972569e+04 - -1.359493772045508e+04 - -1.361343421245217e+04 - -1.363194960986463e+04 - -1.365048392000000e+04 - -1.366903714425879e+04 - -1.368760930691950e+04 - -1.370620042690972e+04 - -1.372481050688227e+04 - -1.374343955999999e+04 - -1.376208760473736e+04 - -1.378075465005087e+04 - -1.379944070672178e+04 - -1.381814579185646e+04 - -1.383686991999999e+04 - -1.385561310323773e+04 - -1.387437535187516e+04 - -1.389315667691767e+04 - -1.391195709130158e+04 - -1.393077661000000e+04 - -1.394961524865979e+04 - -1.396847302075987e+04 - -1.398734993803961e+04 - -1.400624601054151e+04 - -1.402516125000000e+04 - -1.404409566989268e+04 - -1.406304928589068e+04 - -1.408202211294199e+04 - -1.410101416389908e+04 - -1.412002544999999e+04 - -1.413905598164077e+04 - -1.415810576964489e+04 - -1.417717482985645e+04 - -1.419626318438561e+04 - -1.421537083999999e+04 - -1.423449779870650e+04 - -1.425364408441530e+04 - -1.427280971628262e+04 - -1.429199469812906e+04 - -1.431119904000000e+04 - -1.433042275698022e+04 - -1.434966586475864e+04 - -1.436892837784737e+04 - -1.438821030874347e+04 - -1.440751167000000e+04 - -1.442683247464153e+04 - -1.444617273693482e+04 - -1.446553246845352e+04 - -1.448491167696990e+04 - -1.450431037999999e+04 - -1.452372859766022e+04 - -1.454316633455064e+04 - -1.456262360064903e+04 - -1.458210041914065e+04 - -1.460159679999998e+04 - -1.462111274782618e+04 - -1.464064828275210e+04 - -1.466020342227678e+04 - -1.467977817411577e+04 - -1.469937255000000e+04 - -1.471898656425745e+04 - -1.473862022905967e+04 - -1.475827355783788e+04 - -1.477794656667906e+04 - -1.479763927000000e+04 - -1.481735168022591e+04 - -1.483708380678435e+04 - -1.485683566151257e+04 - -1.487660726097236e+04 - -1.489639861999999e+04 - -1.491620975095499e+04 - -1.493604066191429e+04 - -1.495589136614776e+04 - -1.497576188555746e+04 - -1.499565223000000e+04 - -1.501556240451360e+04 - -1.503549242791256e+04 - -1.505544231896391e+04 - -1.507541209051985e+04 - -1.509540175000000e+04 - -1.511541130465759e+04 - -1.513544077375174e+04 - -1.515549017500820e+04 - -1.517555951933053e+04 - -1.519564881999999e+04 - -1.521575809081157e+04 - -1.523588734003694e+04 - -1.525603658036919e+04 - -1.527620583277191e+04 - -1.529639510999998e+04 - -1.531660442034102e+04 - -1.533683377728779e+04 - -1.535708319443415e+04 - -1.537735268372974e+04 - -1.539764226000000e+04 - -1.541795193921473e+04 - -1.543828173411788e+04 - -1.545863165713528e+04 - -1.547900172144165e+04 - -1.549939194000000e+04 - -1.551980232569260e+04 - -1.554023289178161e+04 - -1.556068365093051e+04 - -1.558115461506463e+04 - -1.560164579999999e+04 - -1.562215722197032e+04 - -1.564268888875843e+04 - -1.566324081295743e+04 - -1.568381301679686e+04 - -1.570440550999999e+04 - -1.572501829745089e+04 - -1.574565139909988e+04 - -1.576630483256334e+04 - -1.578697860613842e+04 - -1.580767273000000e+04 - -1.582838721786272e+04 - -1.584912209052793e+04 - -1.586987736246908e+04 - -1.589065303680525e+04 - -1.591144913000000e+04 - -1.593226566336701e+04 - -1.595310264072689e+04 - -1.597396007256353e+04 - -1.599483798518879e+04 - -1.601573638999999e+04 - -1.603665529105288e+04 - -1.605759470511345e+04 - -1.607855464838671e+04 - -1.609953513161670e+04 - -1.612053616999998e+04 - -1.614155778004294e+04 - -1.616259997081388e+04 - -1.618366275348782e+04 - -1.620474614514243e+04 - -1.622585016000000e+04 - -1.624697481007329e+04 - -1.626812010728422e+04 - -1.628928606592670e+04 - -1.631047270337715e+04 - -1.633168003000000e+04 - -1.635290805454565e+04 - -1.637415679800609e+04 - -1.639542627592296e+04 - -1.641671649164588e+04 - -1.643802745999998e+04 - -1.645935920179283e+04 - -1.648071172935930e+04 - -1.650208505431875e+04 - -1.652347919039644e+04 - -1.654489414999998e+04 - -1.656632994566724e+04 - -1.658778659427021e+04 - -1.660926410974226e+04 - -1.663076250029903e+04 - -1.665228178000000e+04 - -1.667382196574960e+04 - -1.669538306946903e+04 - -1.671696510420377e+04 - -1.673856808645374e+04 - -1.676019203000000e+04 - -1.678183694695306e+04 - -1.680350285053965e+04 - -1.682518975366077e+04 - -1.684689766850574e+04 - -1.686862660999998e+04 - -1.689037659405139e+04 - -1.691214763326874e+04 - -1.693393974023558e+04 - -1.695575292860696e+04 - -1.697758720999999e+04 - -1.699944259677470e+04 - -1.702131910964586e+04 - -1.704321676352935e+04 - -1.706513556209216e+04 - -1.708707552000000e+04 - -1.710903665790321e+04 - -1.713101898938551e+04 - -1.715302252479822e+04 - -1.717504727292061e+04 - -1.719709325000000e+04 - -1.721916047545785e+04 - -1.724124896174670e+04 - -1.726335872072246e+04 - -1.728548976595536e+04 - -1.730764210999998e+04 - -1.732981576548871e+04 - -1.735201074834581e+04 - -1.737422707347338e+04 - -1.739646475299950e+04 - -1.741872379999999e+04 - -1.744100422776899e+04 - -1.746330604747148e+04 - -1.748562927386205e+04 - -1.750797392735042e+04 - -1.753034002000000e+04 - -1.755272756012299e+04 - -1.757513656385630e+04 - -1.759756704698003e+04 - -1.762001902165879e+04 - -1.764249250000000e+04 - -1.766498749503509e+04 - -1.768750402279969e+04 - -1.771004209797560e+04 - -1.773260173223158e+04 - -1.775518293999998e+04 - -1.777778573725219e+04 - -1.780041013823985e+04 - -1.782305615380817e+04 - -1.784572379125812e+04 - -1.786841306999998e+04 - -1.789112401297027e+04 - -1.791385662520795e+04 - -1.793661091551944e+04 - -1.795938690506571e+04 - -1.798218461000000e+04 - -1.800500404157250e+04 - -1.802784520726593e+04 - -1.805070812126097e+04 - -1.807359280836476e+04 - -1.809649928000000e+04 - -1.811942754077938e+04 - -1.814237760512274e+04 - -1.816534949154946e+04 - -1.818834322012563e+04 - -1.821135879999998e+04 - -1.823439623670011e+04 - -1.825745554979138e+04 - -1.828053675712656e+04 - -1.830363986886144e+04 - -1.832676489999998e+04 - -1.834991186721417e+04 - -1.837308077964562e+04 - -1.839627164834952e+04 - -1.841948449011883e+04 - -1.844271932000000e+04 - -1.846597615248214e+04 - -1.848925500551537e+04 - -1.851255589141731e+04 - -1.853587881367952e+04 - -1.855922379000000e+04 - -1.858259084403384e+04 - -1.860597998459446e+04 - -1.862939122130964e+04 - -1.865282457086503e+04 - -1.867628004999998e+04 - -1.869975767367864e+04 - -1.872325745125265e+04 - -1.874677939400045e+04 - -1.877032351829797e+04 - -1.879388983999998e+04 - -1.881747837395618e+04 - -1.884108913346766e+04 - -1.886472213066709e+04 - -1.888837737699991e+04 - -1.891205489000000e+04 - -1.893575468867888e+04 - -1.895947678210836e+04 - -1.898322118083019e+04 - -1.900698790146692e+04 - -1.903077696000000e+04 - -1.905458837122149e+04 - -1.907842214817702e+04 - -1.910227830328199e+04 - -1.912615684887913e+04 - -1.915005779999998e+04 - -1.917398117252360e+04 - -1.919792697876641e+04 - -1.922189523162585e+04 - -1.924588594641727e+04 - -1.926989913999998e+04 - -1.929393482787026e+04 - -1.931799301676958e+04 - -1.934207372057390e+04 - -1.936617696590223e+04 - -1.939030276000000e+04 - -1.941445110358184e+04 - -1.943862202401437e+04 - -1.946281554213054e+04 - -1.948703165938676e+04 - -1.951127038999998e+04 - -1.953553175531375e+04 - -1.955981576784185e+04 - -1.958412243887696e+04 - -1.960845178142548e+04 - -1.963280380999998e+04 - -1.965717854010317e+04 - -1.968157598764983e+04 - -1.970599616682758e+04 - -1.973043908928781e+04 - -1.975490477000000e+04 - -1.977939322508017e+04 - -1.980390446612710e+04 - -1.982843850672890e+04 - -1.985299536464853e+04 - -1.987757505000000e+04 - -1.990217757132781e+04 - -1.992680295149982e+04 - -1.995145120910892e+04 - -1.997612235106852e+04 - -2.000081638999998e+04 - -2.002553334291399e+04 - -2.005027322692212e+04 - -2.007503605456619e+04 - -2.009982183242756e+04 - -2.012463057999998e+04 - -2.014946232050470e+04 - -2.017431705750974e+04 - -2.019919480128925e+04 - -2.022409557869796e+04 - -2.024901940000000e+04 - -2.027396626876084e+04 - -2.029893620825063e+04 - -2.032392923791251e+04 - -2.034894536415857e+04 - -2.037398460000000e+04 - -2.039904696273123e+04 - -2.042413246681671e+04 - -2.044924112749899e+04 - -2.047437296177629e+04 - -2.049952797999998e+04 - -2.052470619105544e+04 - -2.054990761544010e+04 - -2.057513226917888e+04 - -2.060038015795331e+04 - -2.062565129999998e+04 - -2.065094571854568e+04 - -2.067626342205840e+04 - -2.070160442063917e+04 - -2.072696873225083e+04 - -2.075235637000000e+04 - -2.077776734528838e+04 - -2.080320167696219e+04 - -2.082865938214449e+04 - -2.085414047244347e+04 - -2.087964496000000e+04 - -2.090517285805777e+04 - -2.093072418166662e+04 - -2.095629894648643e+04 - -2.098189716820891e+04 - -2.100751885999998e+04 - -2.103316403410750e+04 - -2.105883270565323e+04 - -2.108452489048020e+04 - -2.111024060421226e+04 - -2.113597985999998e+04 - -2.116174267011207e+04 - -2.118752904964539e+04 - -2.121333901446366e+04 - -2.123917258027344e+04 - -2.126502976000000e+04 - -2.129091056582378e+04 - -2.131681501406569e+04 - -2.134274311932949e+04 - -2.136869489244911e+04 - -2.139467035000000e+04 - -2.142066951097057e+04 - -2.144669238829770e+04 - -2.147273899344209e+04 - -2.149880933837191e+04 - -2.152490343999998e+04 - -2.155102131698669e+04 - -2.157716298229367e+04 - -2.160332844744082e+04 - -2.162951772437019e+04 - -2.165573082999998e+04 - -2.168196778300156e+04 - -2.170822859627157e+04 - -2.173451328139519e+04 - -2.176082185053812e+04 - -2.178715432000000e+04 - -2.181351070821111e+04 - -2.183989103150391e+04 - -2.186629530288904e+04 - -2.189272353140778e+04 - -2.191917573000000e+04 - -2.194565191497987e+04 - -2.197215210512397e+04 - -2.199867631637375e+04 - -2.202522455969623e+04 - -2.205179684999998e+04 - -2.207839320363563e+04 - -2.210501363148952e+04 - -2.213165814783550e+04 - -2.215832677350680e+04 - -2.218501951999998e+04 - -2.221173639532642e+04 - -2.223847741910094e+04 - -2.226524260850044e+04 - -2.229203197306979e+04 - -2.231884553000000e+04 - -2.234568329890952e+04 - -2.237254528774074e+04 - -2.239943150806158e+04 - -2.242634198094407e+04 - -2.245327672000000e+04 - -2.248023573585785e+04 - -2.250721904853940e+04 - -2.253422667413636e+04 - -2.256125861967753e+04 - -2.258831489999998e+04 - -2.261539553480252e+04 - -2.264250054093014e+04 - -2.266962993052693e+04 - -2.269678371062339e+04 - -2.272396189999998e+04 - -2.275116452153000e+04 - -2.277839158301363e+04 - -2.280564309534358e+04 - -2.283291907950545e+04 - -2.286021955000000e+04 - -2.288754451771620e+04 - -2.291489399812011e+04 - -2.294226800704672e+04 - -2.296966655917324e+04 - -2.299708967000000e+04 - -2.302453735490683e+04 - -2.305200962641978e+04 - -2.307950649734620e+04 - -2.310702798236498e+04 - -2.313457409999998e+04 - -2.316214486856879e+04 - -2.318974029613145e+04 - -2.321736039447026e+04 - -2.324500518448656e+04 - -2.327267467999998e+04 - -2.330036889175501e+04 - -2.332808783850466e+04 - -2.335583153764027e+04 - -2.338360000121357e+04 - -2.341139324000000e+04 - -2.343921126672951e+04 - -2.346705410394532e+04 - -2.349492176951476e+04 - -2.352281427072812e+04 - -2.355073162000000e+04 - -2.357867383414989e+04 - -2.360664093193761e+04 - -2.363463292919098e+04 - -2.366264983684289e+04 - -2.369069166999998e+04 - -2.371875844507638e+04 - -2.374685017193912e+04 - -2.377496686591387e+04 - -2.380310855200050e+04 - -2.383127523999998e+04 - -2.385946693403709e+04 - -2.388768365690810e+04 - -2.391592542840760e+04 - -2.394419225713039e+04 - -2.397248416000000e+04 - -2.400080115691363e+04 - -2.402914325571854e+04 - -2.405751046800998e+04 - -2.408590281513924e+04 - -2.411432031000000e+04 - -2.414276296293371e+04 - -2.417123079796694e+04 - -2.419972383203242e+04 - -2.422824206706797e+04 - -2.425678551999998e+04 - -2.428535421485334e+04 - -2.431394816200073e+04 - -2.434256737430352e+04 - -2.437121187300517e+04 - -2.439988166999998e+04 - -2.442857677325164e+04 - -2.445729720103540e+04 - -2.448604297194451e+04 - -2.451481410082247e+04 - -2.454361060000000e+04 - -2.457243248182022e+04 - -2.460127976431730e+04 - -2.463015246522100e+04 - -2.465905059942621e+04 - -2.468797417999998e+04 - -2.471692321945616e+04 - -2.474589773222362e+04 - -2.477489773480251e+04 - -2.480392324581322e+04 - -2.483297427999998e+04 - -2.486205084917968e+04 - -2.489115296405446e+04 - -2.492028064024748e+04 - -2.494943390068509e+04 - -2.497861275999998e+04 - -2.500781722863925e+04 - -2.503704732334474e+04 - -2.506630305872901e+04 - -2.509558444448151e+04 - -2.512489150000000e+04 - -2.515422424757818e+04 - -2.518358269497819e+04 - -2.521296685328307e+04 - -2.524237674371633e+04 - -2.527181237999998e+04 - -2.530127377273551e+04 - -2.533076094162915e+04 - -2.536027390311031e+04 - -2.538981266594794e+04 - -2.541937724999998e+04 - -2.544896767801531e+04 - -2.547858395406606e+04 - -2.550822608802068e+04 - -2.553789410507042e+04 - -2.556758802000000e+04 - -2.559730784246711e+04 - -2.562705359189478e+04 - -2.565682528525429e+04 - -2.568662293247029e+04 - -2.571644655000000e+04 - -2.574629615713407e+04 - -2.577617176604459e+04 - -2.580607338891535e+04 - -2.583600104095400e+04 - -2.586595473999998e+04 - -2.589593450400127e+04 - -2.592594034522632e+04 - -2.595597227610649e+04 - -2.598603031176017e+04 - -2.601611446999998e+04 - -2.604622476879967e+04 - -2.607636122042706e+04 - -2.610652383730750e+04 - -2.613671263455693e+04 - -2.616692763000000e+04 - -2.619716884161440e+04 - -2.622743628160562e+04 - -2.625772996246335e+04 - -2.628804989951923e+04 - -2.631839611000000e+04 - -2.634876861165059e+04 - -2.637916741999917e+04 - -2.640959254907723e+04 - -2.644004401148305e+04 - -2.647052181999998e+04 - -2.650102598983489e+04 - -2.653155654491748e+04 - -2.656211350103963e+04 - -2.659269685960091e+04 - -2.662330663999998e+04 - -2.665394286925502e+04 - -2.668460555517195e+04 - -2.671529470758218e+04 - -2.674601034670874e+04 - -2.677675249000000e+04 - -2.680752115154265e+04 - -2.683831634157976e+04 - -2.686913807564717e+04 - -2.689998637786448e+04 - -2.693086126000000e+04 - -2.696176272916689e+04 - -2.699269080763921e+04 - -2.702364551500381e+04 - -2.705462686113689e+04 - -2.708563485999998e+04 - -2.711666952809900e+04 - -2.714773087942122e+04 - -2.717881892991400e+04 - -2.720993369901594e+04 - -2.724107519999998e+04 - -2.727224344400496e+04 - -2.730343845029767e+04 - -2.733466023562860e+04 - -2.736590881019403e+04 - -2.739718419000000e+04 - -2.742848639412166e+04 - -2.745981543741902e+04 - -2.749117133427855e+04 - -2.752255410001475e+04 - -2.755396375000000e+04 - -2.758540029934807e+04 - -2.761686376223195e+04 - -2.764835415476579e+04 - -2.767987149599797e+04 - -2.771141579999997e+04 - -2.774298707825893e+04 - -2.777458534547961e+04 - -2.780621061813955e+04 - -2.783786291408934e+04 - -2.786954224999998e+04 - -2.790124864062599e+04 - -2.793298209650868e+04 - -2.796474263269793e+04 - -2.799653027215609e+04 - -2.802834503000000e+04 - -2.806018691678819e+04 - -2.809205594694776e+04 - -2.812395213748840e+04 - -2.815587550739401e+04 - -2.818782607000000e+04 - -2.821980383662756e+04 - -2.825180882556652e+04 - -2.828384105454396e+04 - -2.831590053775406e+04 - -2.834798728999998e+04 - -2.838010132665882e+04 - -2.841224266303304e+04 - -2.844441131398464e+04 - -2.847660729395342e+04 - -2.850883061999998e+04 - -2.854108131015271e+04 - -2.857335937943549e+04 - -2.860566484233479e+04 - -2.863799771378746e+04 - -2.867035801000000e+04 - -2.870274574643904e+04 - -2.873516093256026e+04 - -2.876760358436649e+04 - -2.880007372909855e+04 - -2.883257138000000e+04 - -2.886509654365616e+04 - -2.889764923870952e+04 - -2.893022948372628e+04 - -2.896283729252707e+04 - -2.899547267999998e+04 - -2.902813566168059e+04 - -2.906082625190441e+04 - -2.909354446650575e+04 - -2.912629032389195e+04 - -2.915906383999998e+04 - -2.919186502919167e+04 - -2.922469390650106e+04 - -2.925755048733507e+04 - -2.929043478725063e+04 - -2.932334682000000e+04 - -2.935628660019129e+04 - -2.938925415043921e+04 - -2.942224948806936e+04 - -2.945527261979538e+04 - -2.948832356000000e+04 - -2.952140232838030e+04 - -2.955450894361826e+04 - -2.958764342089699e+04 - -2.962080577090842e+04 - -2.965399600999997e+04 - -2.968721415715336e+04 - -2.972046022629084e+04 - -2.975373423280592e+04 - -2.978703619592538e+04 - -2.982036612999997e+04 - -2.985372404652352e+04 - -2.988710995909819e+04 - -2.992052388535540e+04 - -2.995396584761164e+04 - -2.998743586000000e+04 - -3.002093393306212e+04 - -3.005446008516229e+04 - -3.008801433415196e+04 - -3.012159669410924e+04 - -3.015520717999998e+04 - -3.018884580728562e+04 - -3.022251259030155e+04 - -3.025620754490144e+04 - -3.028993068950620e+04 - -3.032368203999997e+04 - -3.035746161072607e+04 - -3.039126941699663e+04 - -3.042510547393189e+04 - -3.045896979612689e+04 - -3.049286239999998e+04 - -3.052678330335746e+04 - -3.056073252467363e+04 - -3.059471007984014e+04 - -3.062871598061521e+04 - -3.066275024000000e+04 - -3.069681287356475e+04 - -3.073090390293319e+04 - -3.076502334621974e+04 - -3.079917121404217e+04 - -3.083334751999997e+04 - -3.086755228023463e+04 - -3.090178551167921e+04 - -3.093604723225209e+04 - -3.097033746063074e+04 - -3.100465620999998e+04 - -3.103900349175437e+04 - -3.107337932446759e+04 - -3.110778372555016e+04 - -3.114221670819769e+04 - -3.117667828999997e+04 - -3.121116848957679e+04 - -3.124568731744623e+04 - -3.128023478769976e+04 - -3.131481092268889e+04 - -3.134941574000000e+04 - -3.138404925321087e+04 - -3.141871147408727e+04 - -3.145340241670125e+04 - -3.148812209933996e+04 - -3.152287053999997e+04 - -3.155764775577736e+04 - -3.159245376185456e+04 - -3.162728857279384e+04 - -3.166215220315186e+04 - -3.169704466999997e+04 - -3.173196599132658e+04 - -3.176691618227545e+04 - -3.180189525721778e+04 - -3.183690323068162e+04 - -3.187194012000000e+04 - -3.190700594323912e+04 - -3.194210071422084e+04 - -3.197722444868163e+04 - -3.201237716636405e+04 - -3.204755888000000e+04 - -3.208276960047787e+04 - -3.211800935023939e+04 - -3.215327814773632e+04 - -3.218857600158763e+04 - -3.222390292999997e+04 - -3.225925895535199e+04 - -3.229464408973093e+04 - -3.233005834462857e+04 - -3.236550173499735e+04 - -3.240097427999997e+04 - -3.243647600017841e+04 - -3.247200691143220e+04 - -3.250756702669824e+04 - -3.254315635678932e+04 - -3.257877492000000e+04 - -3.261442273792899e+04 - -3.265009982555360e+04 - -3.268580619650297e+04 - -3.272154186523808e+04 - -3.275730685000000e+04 - -3.279310116911321e+04 - -3.282892483177912e+04 - -3.286477785354587e+04 - -3.290066026202923e+04 - -3.293657206999998e+04 - -3.297251328378459e+04 - -3.300848392497173e+04 - -3.304448401407080e+04 - -3.308051356412061e+04 - -3.311657258999998e+04 - -3.315266110752813e+04 - -3.318877912993135e+04 - -3.322492667413289e+04 - -3.326110376297835e+04 - -3.329731041000000e+04 - -3.333354662539115e+04 - -3.336981243131684e+04 - -3.340610784669931e+04 - -3.344243288124504e+04 - -3.347878755000000e+04 - -3.351517187197135e+04 - -3.355158586607149e+04 - -3.358802954742114e+04 - -3.362450292603845e+04 - -3.366100601999997e+04 - -3.369753885113907e+04 - -3.373410143432544e+04 - -3.377069378324004e+04 - -3.380731591267414e+04 - -3.384396783999997e+04 - -3.388064958319757e+04 - -3.391736115628571e+04 - -3.395410257481684e+04 - -3.399087385786547e+04 - -3.402767502000000e+04 - -3.406450607498593e+04 - -3.410136704569621e+04 - -3.413825794940452e+04 - -3.417517879208190e+04 - -3.421212959000000e+04 - -3.424911036577375e+04 - -3.428612113814977e+04 - -3.432316192150666e+04 - -3.436023272579379e+04 - -3.439733356999998e+04 - -3.443446447621852e+04 - -3.447162545467578e+04 - -3.450881651888796e+04 - -3.454603769159935e+04 - -3.458328898999997e+04 - -3.462057042742187e+04 - -3.465788201822977e+04 - -3.469522377879945e+04 - -3.473259572783916e+04 - -3.476999788000000e+04 - -3.480743024920274e+04 - -3.484489285737491e+04 - -3.488238572274076e+04 - -3.491990885516477e+04 - -3.495746227000000e+04 - -3.499504598627476e+04 - -3.503266002163332e+04 - -3.507030439252002e+04 - -3.510797911399110e+04 - -3.514568419999997e+04 - -3.518341966538968e+04 - -3.522118553105182e+04 - -3.525898181605689e+04 - -3.529680853433678e+04 - -3.533466569999997e+04 - -3.537255332834070e+04 - -3.541047143775194e+04 - -3.544842004484196e+04 - -3.548639916273562e+04 - -3.552440881000000e+04 - -3.556244900769237e+04 - -3.560051977192599e+04 - -3.563862111528000e+04 - -3.567675304773126e+04 - -3.571491559000000e+04 - -3.575310876677514e+04 - -3.579133259025522e+04 - -3.582958707123636e+04 - -3.586787222387752e+04 - -3.590618806999997e+04 - -3.594453463328037e+04 - -3.598291192576281e+04 - -3.602131995866808e+04 - -3.605975874687618e+04 - -3.609822830999997e+04 - -3.613672866872384e+04 - -3.617525983663845e+04 - -3.621382182906358e+04 - -3.625241466608051e+04 - -3.629103836000000e+04 - -3.632969292147818e+04 - -3.636837837559645e+04 - -3.640709474306420e+04 - -3.644584203277781e+04 - -3.648462026000000e+04 - -3.652342944409004e+04 - -3.656226960170399e+04 - -3.660114075023598e+04 - -3.664004290875195e+04 - -3.667897608999997e+04 - -3.671794030512006e+04 - -3.675693557547587e+04 - -3.679596192058374e+04 - -3.683501935339895e+04 - -3.687410788999997e+04 - -3.691322754870546e+04 - -3.695237834723054e+04 - -3.699156030212950e+04 - -3.703077342834224e+04 - -3.707001774000000e+04 - -3.710929325203417e+04 - -3.714859998429457e+04 - -3.718793795692067e+04 - -3.722730718808447e+04 - -3.726670768999997e+04 - -3.730613947399677e+04 - -3.734560256273038e+04 - -3.738509697431393e+04 - -3.742462271654350e+04 - -3.746417980999997e+04 - -3.750376828013417e+04 - -3.754338813660564e+04 - -3.758303939267375e+04 - -3.762272207245150e+04 - -3.766243618999997e+04 - -3.770218175518502e+04 - -3.774195878945678e+04 - -3.778176731257176e+04 - -3.782160733741773e+04 - -3.786147888000000e+04 - -3.790138195864309e+04 - -3.794131659132003e+04 - -3.798128279431332e+04 - -3.802128058166662e+04 - -3.806130996999997e+04 - -3.810137097737330e+04 - -3.814146362046005e+04 - -3.818158791697343e+04 - -3.822174388615621e+04 - -3.826193153999997e+04 - -3.830215088938532e+04 - -3.834240195971708e+04 - -3.838268477130731e+04 - -3.842299933188884e+04 - -3.846334565999997e+04 - -3.850372377842891e+04 - -3.854413369633216e+04 - -3.858457542816681e+04 - -3.862504900090371e+04 - -3.866555443000000e+04 - -3.870609172486966e+04 - -3.874666090332934e+04 - -3.878726198409722e+04 - -3.882789498399841e+04 - -3.886855991999997e+04 - -3.890925680946781e+04 - -3.894998567054054e+04 - -3.899074651957592e+04 - -3.903153937021765e+04 - -3.907236423999997e+04 - -3.911322114736439e+04 - -3.915411010384250e+04 - -3.919503112747372e+04 - -3.923598424716172e+04 - -3.927696946999997e+04 - -3.931798680038228e+04 - -3.935903628964794e+04 - -3.940011793259103e+04 - -3.944123164809230e+04 - -3.948237770000000e+04 - -3.952355620675491e+04 - -3.956476584662273e+04 - -3.960600801403134e+04 - -3.964728735507886e+04 - -3.968859104999997e+04 - 1.819886919039960e+01 - 1.816405130921966e+01 - 1.812918280091599e+01 - 1.809426424653407e+01 - 1.805929622711938e+01 - 1.802427932371738e+01 - 1.798921411737356e+01 - 1.795410118913339e+01 - 1.791894112004234e+01 - 1.788373449114589e+01 - 1.784848188348950e+01 - 1.781318387811866e+01 - 1.777784105607885e+01 - 1.774245399841551e+01 - 1.770702328617416e+01 - 1.767154950040025e+01 - 1.763603322213927e+01 - 1.760047503243666e+01 - 1.756487551233793e+01 - 1.752923524288855e+01 - 1.749355480513398e+01 - 1.745783478011969e+01 - 1.742207574889119e+01 - 1.738627829249391e+01 - 1.735044299197335e+01 - 1.731457042837498e+01 - 1.727866118274428e+01 - 1.724271583612671e+01 - 1.720673496956776e+01 - 1.717071916411290e+01 - 1.713466900080759e+01 - 1.709858506069732e+01 - 1.706246792482757e+01 - 1.702631817424381e+01 - 1.699013638999150e+01 - 1.695392315311613e+01 - 1.691767904466317e+01 - 1.688140464567809e+01 - 1.684510053720637e+01 - 1.680876730029348e+01 - 1.677240551598491e+01 - 1.673601576532611e+01 - 1.669959862936258e+01 - 1.666315468913977e+01 - 1.662668452570318e+01 - 1.659018872009826e+01 - 1.655366785337049e+01 - 1.651712250656536e+01 - 1.648055326072833e+01 - 1.644396069690488e+01 - 1.640734539614049e+01 - 1.637070793948063e+01 - 1.633404890797076e+01 - 1.629736888265638e+01 - 1.626066844458294e+01 - 1.622394817479593e+01 - 1.618720865434082e+01 - 1.615045046426309e+01 - 1.611367418560821e+01 - 1.607688039942165e+01 - 1.604006968674890e+01 - 1.600324262863542e+01 - 1.596639980612668e+01 - 1.592954180026817e+01 - 1.589266919210536e+01 - 1.585578256268371e+01 - 1.581888249304872e+01 - 1.578196956424585e+01 - 1.574504435732057e+01 - 1.570810745331836e+01 - 1.567115943328470e+01 - 1.563420087826506e+01 - 1.559723236930490e+01 - 1.556025448744972e+01 - 1.552326781374499e+01 - 1.548627292923617e+01 - 1.544927041496875e+01 - 1.541226085198818e+01 - 1.537524482133997e+01 - 1.533822290406956e+01 - 1.530119568122245e+01 - 1.526416373384410e+01 - 1.522712764298000e+01 - 1.519008798967561e+01 - 1.515304535497640e+01 - 1.511600031992786e+01 - 1.507895346557546e+01 - 1.504190537296467e+01 - 1.500485662314096e+01 - 1.496780779714983e+01 - 1.493075947603672e+01 - 1.489371224084713e+01 - 1.485666667262652e+01 - 1.481962335242037e+01 - 1.478258286127416e+01 - 1.474554578023335e+01 - 1.470851269034343e+01 - 1.467148417264987e+01 - 1.463446080819813e+01 - 1.459744317803371e+01 - 1.456043186320207e+01 - 1.452342744474869e+01 - 1.448643050371903e+01 - 1.444944162115858e+01 - 1.441246137811282e+01 - 1.437549035562720e+01 - 1.433852913474722e+01 - 1.430157829651834e+01 - 1.426463842198604e+01 - 1.422771009219579e+01 - 1.419079388819307e+01 - 1.415389039102334e+01 - 1.411700018173210e+01 - 1.408012384136481e+01 - 1.404326195096694e+01 - 1.400641509158398e+01 - 1.396958384426139e+01 - 1.393276879004464e+01 - 1.389597050997923e+01 - 1.385918958511061e+01 - 1.382242659648426e+01 - 1.378568212514566e+01 - 1.374895675214029e+01 - 1.371225105851361e+01 - 1.367556562531110e+01 - 1.363890103357824e+01 - 1.360225786436050e+01 - 1.356563669870335e+01 - 1.352903811765228e+01 - 1.349246270225274e+01 - 1.345591103355023e+01 - 1.341938369259021e+01 - 1.338288126041816e+01 - 1.334640431807955e+01 - 1.330995344661985e+01 - 1.327352922708455e+01 - 1.323713224051912e+01 - 1.320076306796902e+01 - 1.316442229047974e+01 - 1.312811048909675e+01 - 1.309182824486553e+01 - 1.305557613883154e+01 - 1.301935475204027e+01 - 1.298316466553718e+01 - 1.294700646036776e+01 - 1.291088071757748e+01 - 1.287478801821181e+01 - 1.283872894331622e+01 - 1.280270407393619e+01 - 1.276671399111720e+01 - 1.273075927590472e+01 - 1.269484050934423e+01 - 1.265895827248119e+01 - 1.262311314636109e+01 - 1.258730571202939e+01 - 1.255153655053158e+01 - 1.251580624291313e+01 - 1.248011537021950e+01 - 1.244446451349619e+01 - 1.240885425378865e+01 - 1.237328517214237e+01 - 1.233775784960283e+01 - 1.230227286721548e+01 - 1.226683080602582e+01 - 1.223143224707931e+01 - 1.219607777142142e+01 - 1.216076796009764e+01 - 1.212550339415344e+01 - 1.209028465463429e+01 - 1.205511232258567e+01 - 1.201998697905305e+01 - 1.198490920508190e+01 - 1.194987958171770e+01 - 1.191489869000593e+01 - 1.187996711099206e+01 - 1.184508542572157e+01 - 1.181025421523992e+01 - 1.177547406059259e+01 - 1.174074554282507e+01 - 1.170606924298281e+01 - 1.167144574211130e+01 - 1.163687562125602e+01 - 1.160235946146243e+01 - 1.156789784377601e+01 - 1.153349134924223e+01 - 1.149914055890657e+01 - 1.146484605381452e+01 - 1.143060841501152e+01 - 1.139642822354308e+01 - 1.136230606045464e+01 - 1.132824250679170e+01 - 1.129423814359974e+01 - 1.126029355192421e+01 - 1.122640931281059e+01 - 1.119258600730437e+01 - 1.115882421645102e+01 - 1.112512452129600e+01 - 1.109148750288479e+01 - 1.105791374226288e+01 - 1.102440382047573e+01 - 1.099095831856882e+01 - 1.095757781758762e+01 - 1.092426289857761e+01 - 1.089101414258426e+01 - 1.085783213065305e+01 - 1.082471744382945e+01 - 1.079167066315892e+01 - 1.075869236968697e+01 - 1.072578314445905e+01 - 1.069294356852064e+01 - 1.066017422291721e+01 - 1.062747568869424e+01 - 1.059484854689720e+01 - 1.056229337857157e+01 - 1.052981076476282e+01 - 1.049740128651643e+01 - 1.046506552487787e+01 - 1.043280406089261e+01 - 1.040061747560614e+01 - 1.036850635006392e+01 - 1.033647126531143e+01 - 1.030451280239414e+01 - 1.027263154235754e+01 - 1.024082806624708e+01 - 1.020910295510825e+01 - 1.017745678998653e+01 - 1.014589015192738e+01 - 1.011440362197629e+01 - 1.008299778117872e+01 - 1.005167321058014e+01 - 1.002043049122605e+01 - 9.989270204161905e+00 - 9.958192930433185e+00 - 9.927199251085362e+00 - 9.896289747163912e+00 - 9.865464999714312e+00 - 9.834725589782032e+00 - 9.804072098412551e+00 - 9.773505106651340e+00 - 9.743025195543877e+00 - 9.712632946135633e+00 - 9.682328939472086e+00 - 9.652113756598707e+00 - 9.621987978560973e+00 - 9.591952186404358e+00 - 9.562006961174337e+00 - 9.532152883916382e+00 - 9.502390535675973e+00 - 9.472720497498580e+00 - 9.443143350429677e+00 - 9.413659675514742e+00 - 9.384270053799249e+00 - 9.354975066328668e+00 - 9.325775294148480e+00 - 9.296671318304156e+00 - 9.267663719841170e+00 - 9.238753079804999e+00 - 9.209939979241115e+00 - 9.181224999194994e+00 - 9.152608720712111e+00 - 9.124091724837941e+00 - 9.095674592617954e+00 - 9.067357905097630e+00 - 9.039142243322441e+00 - 9.011028188337864e+00 - 8.983016292445305e+00 - 8.955106689123129e+00 - 8.927299195109086e+00 - 8.899593619314148e+00 - 8.871989770649284e+00 - 8.844487458025464e+00 - 8.817086490353660e+00 - 8.789786676544839e+00 - 8.762587825509975e+00 - 8.735489746160036e+00 - 8.708492247405990e+00 - 8.681595138158814e+00 - 8.654798227329470e+00 - 8.628101323828931e+00 - 8.601504236568170e+00 - 8.575006774458155e+00 - 8.548608746409855e+00 - 8.522309961334242e+00 - 8.496110228142285e+00 - 8.470009355744955e+00 - 8.444007153053219e+00 - 8.418103428978053e+00 - 8.392297992430423e+00 - 8.366590652321301e+00 - 8.340981217561657e+00 - 8.315469497062459e+00 - 8.290055299734679e+00 - 8.264738434489287e+00 - 8.239518710237252e+00 - 8.214395935889545e+00 - 8.189369920357137e+00 - 8.164440472550996e+00 - 8.139607401382095e+00 - 8.114870515761401e+00 - 8.090229624599887e+00 - 8.065684536808520e+00 - 8.041235061298275e+00 - 8.016881006980118e+00 - 7.992622182765018e+00 - 7.968458397563950e+00 - 7.944389460287880e+00 - 7.920415179847782e+00 - 7.896535365154623e+00 - 7.872749825119373e+00 - 7.849058368653004e+00 - 7.825460804666484e+00 - 7.801956942070785e+00 - 7.778546589776878e+00 - 7.755229556695729e+00 - 7.732005651738313e+00 - 7.708874683815599e+00 - 7.685836461838553e+00 - 7.662890794718152e+00 - 7.640037491365358e+00 - 7.617276360691148e+00 - 7.594607211606489e+00 - 7.572029853022352e+00 - 7.549544093849708e+00 - 7.527149742999527e+00 - 7.504846609382777e+00 - 7.482634501910429e+00 - 7.460513229493455e+00 - 7.438482601042820e+00 - 7.416542425469502e+00 - 7.394692511684465e+00 - 7.372932668598682e+00 - 7.351262705123121e+00 - 7.329682430168755e+00 - 7.308191652646553e+00 - 7.286790181467484e+00 - 7.265477825542517e+00 - 7.244254393782626e+00 - 7.223119695098779e+00 - 7.202073538401945e+00 - 7.181115732603097e+00 - 7.160246086613204e+00 - 7.139464409343233e+00 - 7.118770509704159e+00 - 7.098164196606950e+00 - 7.077645278962576e+00 - 7.057213565682006e+00 - 7.036868865676214e+00 - 7.016610987856166e+00 - 6.996439741132834e+00 - 6.976354934417186e+00 - 6.956356376620197e+00 - 6.936443876652832e+00 - 6.916617243426063e+00 - 6.896876285850862e+00 - 6.877220812838198e+00 - 6.857650633299039e+00 - 6.838165556144358e+00 - 6.818765390285123e+00 - 6.799449944632306e+00 - 6.780219028096876e+00 - 6.761072449589803e+00 - 6.742010018022058e+00 - 6.723031542304612e+00 - 6.704136831348434e+00 - 6.685325694064492e+00 - 6.666597939363759e+00 - 6.647953376157203e+00 - 6.629391813355797e+00 - 6.610913059870509e+00 - 6.592516924612310e+00 - 6.574203216492170e+00 - 6.555971744421058e+00 - 6.537822317309946e+00 - 6.519754744069803e+00 - 6.501768833611600e+00 - 6.483864394846306e+00 - 6.466041236684891e+00 - 6.448299168038327e+00 - 6.430637997817582e+00 - 6.413057534933630e+00 - 6.395557588297437e+00 - 6.378137966819973e+00 - 6.360798479412210e+00 - 6.343538934985117e+00 - 6.326359142449666e+00 - 6.309258910716826e+00 - 6.292238048697567e+00 - 6.275296365302859e+00 - 6.258433669443673e+00 - 6.241649770030978e+00 - 6.224944475975745e+00 - 6.208317596188945e+00 - 6.191768939581546e+00 - 6.175298315064517e+00 - 6.158905531548833e+00 - 6.142590397945462e+00 - 6.126352723165372e+00 - 6.110192316119535e+00 - 6.094108985718921e+00 - 6.078102540874499e+00 - 6.062172790497243e+00 - 6.046319543498117e+00 - 6.030542608788095e+00 - 6.014841795278149e+00 - 5.999216911879244e+00 - 5.983667767502356e+00 - 5.968194171058448e+00 - 5.952795931458497e+00 - 5.937472857613470e+00 - 5.922224758434336e+00 - 5.907051442832068e+00 - 5.891952719717633e+00 - 5.876928398002004e+00 - 5.861978286596150e+00 - 5.847102194411042e+00 - 5.832299930357648e+00 - 5.817571303346941e+00 - 5.802916122289888e+00 - 5.788334196097460e+00 - 5.773825333680629e+00 - 5.759389343950365e+00 - 5.745026035817635e+00 - 5.730735218193414e+00 - 5.716516699988668e+00 - 5.702370290114368e+00 - 5.688295797481486e+00 - 5.674293031000990e+00 - 5.660361799583851e+00 - 5.646501912141039e+00 - 5.632713177583526e+00 - 5.618995404822279e+00 - 5.605348402768269e+00 - 5.591771980332467e+00 - 5.578265946425844e+00 - 5.564830109959368e+00 - 5.551464279844009e+00 - 5.538168264990741e+00 - 5.524941874310529e+00 - 5.511784916714348e+00 - 5.498697201113163e+00 - 5.485678536417949e+00 - 5.472728731539672e+00 - 5.459847595389306e+00 - 5.447031950668924e+00 - 5.434258417587328e+00 - 5.421509378931341e+00 - 5.408790202589383e+00 - 5.396101725502927e+00 - 5.383442552149385e+00 - 5.370812984345576e+00 - 5.358213038980171e+00 - 5.345642546622406e+00 - 5.333101463094469e+00 - 5.320589727671893e+00 - 5.308107264570896e+00 - 5.295654006874094e+00 - 5.283229887334054e+00 - 5.270834837715376e+00 - 5.258468789944041e+00 - 5.246131676000384e+00 - 5.233823428164784e+00 - 5.221543979540164e+00 - 5.209293263422158e+00 - 5.197071212820756e+00 - 5.184877759775030e+00 - 5.172712837552656e+00 - 5.160576380473933e+00 - 5.148468322098453e+00 - 5.136388595958436e+00 - 5.124337135726472e+00 - 5.112313875048248e+00 - 5.100318748362747e+00 - 5.088351690727316e+00 - 5.076412636057685e+00 - 5.064501518839616e+00 - 5.052618274474592e+00 - 5.040762837425790e+00 - 5.028935142799786e+00 - 5.017135126690616e+00 - 5.005362723409764e+00 - 4.993617868159293e+00 - 4.981900498164465e+00 - 4.970210548621045e+00 - 4.958547954855285e+00 - 4.946912653797631e+00 - 4.935304581602165e+00 - 4.923723674430540e+00 - 4.912169869219803e+00 - 4.900643102722201e+00 - 4.889143311682699e+00 - 4.877670433140317e+00 - 4.866224404407401e+00 - 4.854805162838305e+00 - 4.843412645620055e+00 - 4.832046790470948e+00 - 4.820707535433044e+00 - 4.809394818449872e+00 - 4.798108577205163e+00 - 4.786848749644187e+00 - 4.775615274885523e+00 - 4.764408091170769e+00 - 4.753227136475494e+00 - 4.742072350593207e+00 - 4.730943672320340e+00 - 4.719841039761676e+00 - 4.708764392793848e+00 - 4.697713670947889e+00 - 4.686688813308958e+00 - 4.675689760077749e+00 - 4.664716450776882e+00 - 4.653768824355144e+00 - 4.642846821849820e+00 - 4.631950383864691e+00 - 4.621079449911801e+00 - 4.610233960271208e+00 - 4.599413855814052e+00 - 4.588619077726644e+00 - 4.577849566594633e+00 - 4.567105263324451e+00 - 4.556386109499332e+00 - 4.545692045920192e+00 - 4.535023013830533e+00 - 4.524378955558838e+00 - 4.513759812087895e+00 - 4.503165524982657e+00 - 4.492596037765430e+00 - 4.482051291649467e+00 - 4.471531227881555e+00 - 4.461035790191556e+00 - 4.450564920902143e+00 - 4.440118561957067e+00 - 4.429696656605228e+00 - 4.419299148008472e+00 - 4.408925979093191e+00 - 4.398577092681390e+00 - 4.388252432408600e+00 - 4.377951941955149e+00 - 4.367675563647617e+00 - 4.357423241911437e+00 - 4.347194921954801e+00 - 4.336990545878941e+00 - 4.326810057907454e+00 - 4.316653403787664e+00 - 4.306520526395858e+00 - 4.296411370095723e+00 - 4.286325880845187e+00 - 4.276264002847886e+00 - 4.266225680614548e+00 - 4.256210859410026e+00 - 4.246219484255977e+00 - 4.236251500111860e+00 - 4.226306852214246e+00 - 4.216385487075638e+00 - 4.206487350454588e+00 - 4.196612386873075e+00 - 4.186760542346591e+00 - 4.176931763412669e+00 - 4.167125996517556e+00 - 4.157343187931778e+00 - 4.147583283659849e+00 - 4.137846229598449e+00 - 4.128131973158434e+00 - 4.118440461620333e+00 - 4.108771640965568e+00 - 4.099125458381889e+00 - 4.089501861348100e+00 - 4.079900796648449e+00 - 4.070322211621146e+00 - 4.060766054068578e+00 - 4.051232271987449e+00 - 4.041720812903752e+00 - 4.032231624389123e+00 - 4.022764654839604e+00 - 4.013319852102482e+00 - 4.003897163974346e+00 - 3.994496539375360e+00 - 3.985117927005318e+00 - 3.975761275162846e+00 - 3.966426531955261e+00 - 3.957113646635731e+00 - 3.947822569087183e+00 - 3.938553247905866e+00 - 3.929305631685672e+00 - 3.920079669524097e+00 - 3.910875311427285e+00 - 3.901692507178291e+00 - 3.892531206204140e+00 - 3.883391358396833e+00 - 3.874272913657344e+00 - 3.865175821793835e+00 - 3.856100032879644e+00 - 3.847045497225832e+00 - 3.838012165320722e+00 - 3.828999987558789e+00 - 3.820008914413926e+00 - 3.811038896595444e+00 - 3.802089885254187e+00 - 3.793161831237620e+00 - 3.784254684890362e+00 - 3.775368398252875e+00 - 3.766502923100440e+00 - 3.757658209579520e+00 - 3.748834209295840e+00 - 3.740030874433959e+00 - 3.731248156753105e+00 - 3.722486008117639e+00 - 3.713744380387517e+00 - 3.705023225280349e+00 - 3.696322495070079e+00 - 3.687642142318910e+00 - 3.678982119432947e+00 - 3.670342378801804e+00 - 3.661722872867589e+00 - 3.653123554235752e+00 - 3.644544376023881e+00 - 3.635985291634798e+00 - 3.627446254192749e+00 - 3.618927216218316e+00 - 3.610428130335504e+00 - 3.601948951051534e+00 - 3.593489632231203e+00 - 3.585050126838500e+00 - 3.576630388153148e+00 - 3.568230370457688e+00 - 3.559850028500160e+00 - 3.551489315016799e+00 - 3.543148183918080e+00 - 3.534826590807976e+00 - 3.526524489935861e+00 - 3.518241835011243e+00 - 3.509978579991082e+00 - 3.501734680809670e+00 - 3.493510092697708e+00 - 3.485304769188242e+00 - 3.477118665289576e+00 - 3.468951736765370e+00 - 3.460803939385451e+00 - 3.452675227557384e+00 - 3.444565556219660e+00 - 3.436474882078371e+00 - 3.428403160505571e+00 - 3.420350346590145e+00 - 3.412316396304707e+00 - 3.404301265792477e+00 - 3.396304911176187e+00 - 3.388327288491305e+00 - 3.380368354160161e+00 - 3.372428064623584e+00 - 3.364506375833607e+00 - 3.356603244211646e+00 - 3.348718626640740e+00 - 3.340852480236101e+00 - 3.333004761693424e+00 - 3.325175427644580e+00 - 3.317364435527293e+00 - 3.309571742493616e+00 - 3.301797305408617e+00 - 3.294041081414062e+00 - 3.286303028194412e+00 - 3.278583103726798e+00 - 3.270881265443555e+00 - 3.263197471011956e+00 - 3.255531678390248e+00 - 3.247883845209004e+00 - 3.240253929642225e+00 - 3.232641890347850e+00 - 3.225047684908113e+00 - 3.217471271425511e+00 - 3.209912608923088e+00 - 3.202371655667555e+00 - 3.194848370181972e+00 - 3.187342711658790e+00 - 3.179854638881827e+00 - 3.172384110380890e+00 - 3.164931084707051e+00 - 3.157495521384956e+00 - 3.150077380058776e+00 - 3.142676619877814e+00 - 3.135293200073600e+00 - 3.127927079946843e+00 - 3.120578218905895e+00 - 3.113246577218404e+00 - 3.105932114937815e+00 - 3.098634790846833e+00 - 3.091354565058342e+00 - 3.084091398271724e+00 - 3.076845250485478e+00 - 3.069616081755534e+00 - 3.062403852244847e+00 - 3.055208522175611e+00 - 3.048030052549899e+00 - 3.040868404439169e+00 - 3.033723537524932e+00 - 3.026595412527113e+00 - 3.019483991059011e+00 - 3.012389234177664e+00 - 3.005311102428361e+00 - 2.998249556405217e+00 - 2.991204558170310e+00 - 2.984176069441633e+00 - 2.977164051262350e+00 - 2.970168464749357e+00 - 2.963189271462946e+00 - 2.956226433370632e+00 - 2.949279912203107e+00 - 2.942349669912605e+00 - 2.935435668735732e+00 - 2.928537870478263e+00 - 2.921656236941307e+00 - 2.914790730227295e+00 - 2.907941313056430e+00 - 2.901107948114753e+00 - 2.894290597705669e+00 - 2.887489224186201e+00 - 2.880703790004707e+00 - 2.873934257778331e+00 - 2.867180590721052e+00 - 2.860442752157053e+00 - 2.853720705060128e+00 - 2.847014412004529e+00 - 2.840323835735203e+00 - 2.833648939802342e+00 - 2.826989688360529e+00 - 2.820346045051714e+00 - 2.813717971838249e+00 - 2.807105432809830e+00 - 2.800508392739872e+00 - 2.793926814285955e+00 - 2.787360661385112e+00 - 2.780809898806732e+00 - 2.774274490318202e+00 - 2.767754399418414e+00 - 2.761249589980850e+00 - 2.754760027276096e+00 - 2.748285675987487e+00 - 2.741826499952791e+00 - 2.735382462817888e+00 - 2.728953529693038e+00 - 2.722539666591989e+00 - 2.716140837199994e+00 - 2.709757005928732e+00 - 2.703388138477217e+00 - 2.697034199719776e+00 - 2.690695154612969e+00 - 2.684370968516638e+00 - 2.678061606722120e+00 - 2.671767034388748e+00 - 2.665487216663756e+00 - 2.659222119420964e+00 - 2.652971708466898e+00 - 2.646735949170681e+00 - 2.640514807328682e+00 - 2.634308248813400e+00 - 2.628116239351709e+00 - 2.621938745026414e+00 - 2.615775731978081e+00 - 2.609627166192403e+00 - 2.603493014125890e+00 - 2.597373242133807e+00 - 2.591267815972944e+00 - 2.585176702619338e+00 - 2.579099869106871e+00 - 2.573037281022092e+00 - 2.566988905295047e+00 - 2.560954709471109e+00 - 2.554934660124372e+00 - 2.548928723658388e+00 - 2.542936866838776e+00 - 2.536959057454498e+00 - 2.530995262744329e+00 - 2.525045449466102e+00 - 2.519109584724339e+00 - 2.513187636248425e+00 - 2.507279571988880e+00 - 2.501385358975255e+00 - 2.495504964649074e+00 - 2.489638357011514e+00 - 2.483785503877440e+00 - 2.477946372993181e+00 - 2.472120932153270e+00 - 2.466309149445497e+00 - 2.460510993028623e+00 - 2.454726431004756e+00 - 2.448955431279121e+00 - 2.443197962222979e+00 - 2.437453992749473e+00 - 2.431723490873920e+00 - 2.426006424702946e+00 - 2.420302763016215e+00 - 2.414612474849150e+00 - 2.408935529060812e+00 - 2.403271894158963e+00 - 2.397621539164549e+00 - 2.391984432987164e+00 - 2.386360544006294e+00 - 2.380749841635097e+00 - 2.375152295549876e+00 - 2.369567874852914e+00 - 2.363996548806182e+00 - 2.358438286639424e+00 - 2.352893057314327e+00 - 2.347360830870365e+00 - 2.341841577523073e+00 - 2.336335266205249e+00 - 2.330841866367291e+00 - 2.325361348038680e+00 - 2.319893681430557e+00 - 2.314438836350213e+00 - 2.308996782525400e+00 - 2.303567490482044e+00 - 2.298150930506590e+00 - 2.292747072570897e+00 - 2.287355886755380e+00 - 2.281977343203661e+00 - 2.276611412298537e+00 - 2.271258065216148e+00 - 2.265917272602903e+00 - 2.260589004572198e+00 - 2.255273232290290e+00 - 2.249969926489583e+00 - 2.244679057245269e+00 - 2.239400595715412e+00 - 2.234134513404378e+00 - 2.228880781619142e+00 - 2.223639370658599e+00 - 2.218410251587366e+00 - 2.213193396784469e+00 - 2.207988776668006e+00 - 2.202796362022329e+00 - 2.197616125439223e+00 - 2.192448038696543e+00 - 2.187292072961057e+00 - 2.182148199232985e+00 - 2.177016389630072e+00 - 2.171896616273634e+00 - 2.166788850281173e+00 - 2.161693063906081e+00 - 2.156609229682959e+00 - 2.151537319229026e+00 - 2.146477304323076e+00 - 2.141429157241363e+00 - 2.136392850965788e+00 - 2.131368357474257e+00 - 2.126355648357996e+00 - 2.121354696293322e+00 - 2.116365474412895e+00 - 2.111387955644702e+00 - 2.106422111701483e+00 - 2.101467915161587e+00 - 2.096525339256323e+00 - 2.091594356269759e+00 - 2.086674939419586e+00 - 2.081767062556874e+00 - 2.076870697792070e+00 - 2.071985817585338e+00 - 2.067112395385072e+00 - 2.062250405333861e+00 - 2.057399820685575e+00 - 2.052560613690088e+00 - 2.047732757766644e+00 - 2.042916226752948e+00 - 2.038110994473384e+00 - 2.033317034456518e+00 - 2.028534320143143e+00 - 2.023762825026766e+00 - 2.019002522786289e+00 - 2.014253387371010e+00 - 2.009515392980107e+00 - 2.004788513366984e+00 - 2.000072722331970e+00 - 1.995367994084281e+00 - 1.990674302528751e+00 - 1.985991621875054e+00 - 1.981319927135009e+00 - 1.976659192144684e+00 - 1.972009390577169e+00 - 1.967370497271926e+00 - 1.962742487042732e+00 - 1.958125334423246e+00 - 1.953519013586483e+00 - 1.948923499307053e+00 - 1.944338766657414e+00 - 1.939764790288013e+00 - 1.935201544608222e+00 - 1.930649004305472e+00 - 1.926107145248571e+00 - 1.921575942429786e+00 - 1.917055370205972e+00 - 1.912545403920843e+00 - 1.908046018818900e+00 - 1.903557190023903e+00 - 1.899078893306255e+00 - 1.894611103753838e+00 - 1.890153795996532e+00 - 1.885706946418488e+00 - 1.881270530851602e+00 - 1.876844524133795e+00 - 1.872428902057808e+00 - 1.868023640555410e+00 - 1.863628715350075e+00 - 1.859244102235784e+00 - 1.854869776995271e+00 - 1.850505715382929e+00 - 1.846151893336109e+00 - 1.841808287113597e+00 - 1.837474873250078e+00 - 1.833151627500553e+00 - 1.828838525627810e+00 - 1.824535544058799e+00 - 1.820242659570220e+00 - 1.815959848693184e+00 - 1.811687087278560e+00 - 1.807424351697017e+00 - 1.803171618832717e+00 - 1.798928865872756e+00 - 1.794696068965575e+00 - 1.790473204047284e+00 - 1.786260248130819e+00 - 1.782057178544553e+00 - 1.777863972462110e+00 - 1.773680606381003e+00 - 1.769507057021776e+00 - 1.765343301422396e+00 - 1.761189316819223e+00 - 1.757045080431908e+00 - 1.752910569457795e+00 - 1.748785761158555e+00 - 1.744670632638435e+00 - 1.740565161064786e+00 - 1.736469324420783e+00 - 1.732383100261040e+00 - 1.728306465595185e+00 - 1.724239397824929e+00 - 1.720181874717039e+00 - 1.716133874165168e+00 - 1.712095373335323e+00 - 1.708066350172305e+00 - 1.704046783495335e+00 - 1.700036650108550e+00 - 1.696035927584721e+00 - 1.692044595228792e+00 - 1.688062630443701e+00 - 1.684090010658294e+00 - 1.680126714513943e+00 - 1.676172720475745e+00 - 1.672228006742128e+00 - 1.668292551293985e+00 - 1.664366332353613e+00 - 1.660449328407859e+00 - 1.656541518177628e+00 - 1.652642880144113e+00 - 1.648753392536404e+00 - 1.644873033459887e+00 - 1.641001782122826e+00 - 1.637139617814172e+00 - 1.633286518510287e+00 - 1.629442462986198e+00 - 1.625607430332010e+00 - 1.621781398816242e+00 - 1.617964347766720e+00 - 1.614156256896447e+00 - 1.610357104501046e+00 - 1.606566869528149e+00 - 1.602785531410984e+00 - 1.599013068753329e+00 - 1.595249460964023e+00 - 1.591494688099418e+00 - 1.587748729316499e+00 - 1.584011563661260e+00 - 1.580283170366302e+00 - 1.576563528988570e+00 - 1.572852618951484e+00 - 1.569150419635379e+00 - 1.565456911345500e+00 - 1.561772073862832e+00 - 1.558095886092752e+00 - 1.554428327545355e+00 - 1.550769378486889e+00 - 1.547119019605569e+00 - 1.543477229774924e+00 - 1.539843988467248e+00 - 1.536219276909035e+00 - 1.532603074921508e+00 - 1.528995362108325e+00 - 1.525396118748853e+00 - 1.521805324624735e+00 - 1.518222960029189e+00 - 1.514649006474386e+00 - 1.511083443428444e+00 - 1.507526250258141e+00 - 1.503977408416516e+00 - 1.500436898413773e+00 - 1.496904700394939e+00 - 1.493380795245864e+00 - 1.489865163193006e+00 - 1.486357784560608e+00 - 1.482858641108495e+00 - 1.479367713055452e+00 - 1.475884980161266e+00 - 1.472410424507970e+00 - 1.468944026943859e+00 - 1.465485767394345e+00 - 1.462035627142284e+00 - 1.458593587684006e+00 - 1.455159630175685e+00 - 1.451733734815932e+00 - 1.448315882934573e+00 - 1.444906056735074e+00 - 1.441504236540235e+00 - 1.438110403156542e+00 - 1.434724538391589e+00 - 1.431346623689521e+00 - 1.427976640530080e+00 - 1.424614570482120e+00 - 1.421260394583763e+00 - 1.417914094214416e+00 - 1.414575651360096e+00 - 1.411245047472556e+00 - 1.407922264020345e+00 - 1.404607282835409e+00 - 1.401300085863839e+00 - 1.398000654669480e+00 - 1.394708970355802e+00 - 1.391425015768138e+00 - 1.388148773421020e+00 - 1.384880223867722e+00 - 1.381619349200565e+00 - 1.378366132070768e+00 - 1.375120554406545e+00 - 1.371882598139520e+00 - 1.368652245409923e+00 - 1.365429478679455e+00 - 1.362214280063096e+00 - 1.359006631544336e+00 - 1.355806515436745e+00 - 1.352613914349998e+00 - 1.349428810943258e+00 - 1.346251187518860e+00 - 1.343081026346772e+00 - 1.339918309785753e+00 - 1.336763020411036e+00 - 1.333615141050152e+00 - 1.330474654669161e+00 - 1.327341544046787e+00 - 1.324215791384803e+00 - 1.321097378844990e+00 - 1.317986290481943e+00 - 1.314882509034005e+00 - 1.311786015892630e+00 - 1.308696795174431e+00 - 1.305614830505543e+00 - 1.302540104058677e+00 - 1.299472598550161e+00 - 1.296412297281467e+00 - 1.293359183920592e+00 - 1.290313241355424e+00 - 1.287274452437336e+00 - 1.284242800425524e+00 - 1.281218268758570e+00 - 1.278200840971845e+00 - 1.275190500607243e+00 - 1.272187230813499e+00 - 1.269191014801793e+00 - 1.266201836184906e+00 - 1.263219678244913e+00 - 1.260244524601725e+00 - 1.257276359774731e+00 - 1.254315166659556e+00 - 1.251360928048363e+00 - 1.248413628680403e+00 - 1.245473252809453e+00 - 1.242539783866816e+00 - 1.239613204552696e+00 - 1.236693499248504e+00 - 1.233780652886690e+00 - 1.230874648458874e+00 - 1.227975469917747e+00 - 1.225083101914005e+00 - 1.222197528080320e+00 - 1.219318732110022e+00 - 1.216446698153004e+00 - 1.213581411119631e+00 - 1.210722855169846e+00 - 1.207871013783067e+00 - 1.205025871252235e+00 - 1.202187412198626e+00 - 1.199355621285526e+00 - 1.196530482820713e+00 - 1.193711981112556e+00 - 1.190900100540550e+00 - 1.188094825240966e+00 - 1.185296139829988e+00 - 1.182504029475636e+00 - 1.179718478336080e+00 - 1.176939470878376e+00 - 1.174166992368249e+00 - 1.171401026812090e+00 - 1.168641558834780e+00 - 1.165888574598542e+00 - 1.163142057955574e+00 - 1.160401992993886e+00 - 1.157668365957760e+00 - 1.154941161055026e+00 - 1.152220362585152e+00 - 1.149505957086653e+00 - 1.146797929075238e+00 - 1.144096262593592e+00 - 1.141400943461258e+00 - 1.138711957183691e+00 - 1.136029288721929e+00 - 1.133352922646698e+00 - 1.130682844729473e+00 - 1.128019040871752e+00 - 1.125361495026299e+00 - 1.122710192813904e+00 - 1.120065120718956e+00 - 1.117426263156838e+00 - 1.114793605478939e+00 - 1.112167133798269e+00 - 1.109546832911627e+00 - 1.106932688501257e+00 - 1.104324686965964e+00 - 1.101722813149718e+00 - 1.099127052563592e+00 - 1.096537391606932e+00 - 1.093953815681381e+00 - 1.091376310184498e+00 - 1.088804860939953e+00 - 1.086239454210304e+00 - 1.083680075729654e+00 - 1.081126710640132e+00 - 1.078579345517792e+00 - 1.076037966489376e+00 - 1.073502558540405e+00 - 1.070973108232868e+00 - 1.068449602380304e+00 - 1.065932027008114e+00 - 1.063420367175204e+00 - 1.060914608734753e+00 - 1.058414739347230e+00 - 1.055920744292059e+00 - 1.053432609053344e+00 - 1.050950321750202e+00 - 1.048473868029229e+00 - 1.046003233045439e+00 - 1.043538404185668e+00 - 1.041079368203120e+00 - 1.038626111099421e+00 - 1.036178618557632e+00 - 1.033736877638818e+00 - 1.031300875738098e+00 - 1.028870598541307e+00 - 1.026446032279889e+00 - 1.024027163804816e+00 - 1.021613979927458e+00 - 1.019206467749757e+00 - 1.016804614201984e+00 - 1.014408404816817e+00 - 1.012017826403038e+00 - 1.009632866898133e+00 - 1.007253512894913e+00 - 1.004879750675442e+00 - 1.002511566831996e+00 - 1.000148949144661e+00 - 9.977918847145494e-01 - 9.954403597206510e-01 - 9.930943614528360e-01 - 9.907538771638876e-01 - 9.884188936740620e-01 - 9.860893982148410e-01 - 9.837653780132122e-01 - 9.814468200970017e-01 - 9.791337116433633e-01 - 9.768260399168340e-01 - 9.745237922184445e-01 - 9.722269558574113e-01 - 9.699355181124353e-01 - 9.676494662336389e-01 - 9.653687876978898e-01 - 9.630934699744002e-01 - 9.608235003289306e-01 - 9.585588662885656e-01 - 9.562995554410040e-01 - 9.540455551859868e-01 - 9.517968530931009e-01 - 9.495534368089285e-01 - 9.473152938858177e-01 - 9.450824119343849e-01 - 9.428547786515334e-01 - 9.406323818265262e-01 - 9.384152091378831e-01 - 9.362032482272097e-01 - 9.339964869112888e-01 - 9.317949130473703e-01 - 9.295985145023118e-01 - 9.274072791539573e-01 - 9.252211948367504e-01 - 9.230402494034374e-01 - 9.208644309329761e-01 - 9.186937274260252e-01 - 9.165281267878318e-01 - 9.143676170947915e-01 - 9.122121864230248e-01 - 9.100618228160294e-01 - 9.079165144228375e-01 - 9.057762494101416e-01 - 9.036410159434681e-01 - 9.015108022852656e-01 - 8.993855966397851e-01 - 8.972653871281971e-01 - 8.951501621417270e-01 - 8.930399100640233e-01 - 8.909346191274636e-01 - 8.888342777366450e-01 - 8.867388743114113e-01 - 8.846483971822027e-01 - 8.825628348501290e-01 - 8.804821758633001e-01 - 8.784064086961259e-01 - 8.763355218399448e-01 - 8.742695038377348e-01 - 8.722083433110044e-01 - 8.701520288632569e-01 - 8.681005490981059e-01 - 8.660538926659707e-01 - 8.640120483003465e-01 - 8.619750047630993e-01 - 8.599427507590320e-01 - 8.579152750196485e-01 - 8.558925663402844e-01 - 8.538746136199826e-01 - 8.518614056598554e-01 - 8.498529312415619e-01 - 8.478491793952468e-01 - 8.458501390477595e-01 - 8.438557990450950e-01 - 8.418661484572341e-01 - 8.398811762963594e-01 - 8.379008715007146e-01 - 8.359252231704962e-01 - 8.339542204095658e-01 - 8.319878522912720e-01 - 8.300261079597043e-01 - 8.280689765769632e-01 - 8.261164473121154e-01 - 8.241685093974929e-01 - 8.222251520716921e-01 - 8.202863645582569e-01 - 8.183521361157176e-01 - 8.164224560764958e-01 - 8.144973138478017e-01 - 8.125766987264839e-01 - 8.106606000443977e-01 - 8.087490072689457e-01 - 8.068419098143643e-01 - 8.049392971238847e-01 - 8.030411587461223e-01 - 8.011474841608780e-01 - 7.992582628576694e-01 - 7.973734844327619e-01 - 7.954931384582111e-01 - 7.936172145055983e-01 - 7.917457022017643e-01 - 7.898785912282000e-01 - 7.880158712799969e-01 - 7.861575320154112e-01 - 7.843035631939634e-01 - 7.824539546080472e-01 - 7.806086959262468e-01 - 7.787677769423338e-01 - 7.769311875560446e-01 - 7.750989176225404e-01 - 7.732709569908990e-01 - 7.714472955211897e-01 - 7.696279231052234e-01 - 7.678128297211314e-01 - 7.660020053954494e-01 - 7.641954400346342e-01 - 7.623931236302374e-01 - 7.605950462809293e-01 - 7.588011979868697e-01 - 7.570115688113509e-01 - 7.552261489288551e-01 - 7.534449284973839e-01 - 7.516678976340316e-01 - 7.498950464317325e-01 - 7.481263651057625e-01 - 7.463618439154999e-01 - 7.446014731170009e-01 - 7.428452429690515e-01 - 7.410931437272748e-01 - 7.393451656574506e-01 - 7.376012991597445e-01 - 7.358615346418724e-01 - 7.341258624174279e-01 - 7.323942728636854e-01 - 7.306667564033948e-01 - 7.289433034811010e-01 - 7.272239046205010e-01 - 7.255085503342084e-01 - 7.237972310231134e-01 - 7.220899372662432e-01 - 7.203866596915919e-01 - 7.186873887451811e-01 - 7.169921150530395e-01 - 7.153008293485266e-01 - 7.136135222426403e-01 - 7.119301843519804e-01 - 7.102508063464710e-01 - 7.085753789925818e-01 - 7.069038930034782e-01 - 7.052363390742027e-01 - 7.035727080638011e-01 - 7.019129907750439e-01 - 7.002571779481277e-01 - 6.986052604437083e-01 - 6.969572291357313e-01 - 6.953130748988353e-01 - 6.936727887020229e-01 - 6.920363614522840e-01 - 6.904037839913317e-01 - 6.887750473773369e-01 - 6.871501426160253e-01 - 6.855290605871678e-01 - 6.839117924040222e-01 - 6.822983292013320e-01 - 6.806886620123715e-01 - 6.790827818618205e-01 - 6.774806798407976e-01 - 6.758823471448717e-01 - 6.742877749381793e-01 - 6.726969543916550e-01 - 6.711098767181217e-01 - 6.695265330883416e-01 - 6.679469147191758e-01 - 6.663710129607012e-01 - 6.647988190816884e-01 - 6.632303243195694e-01 - 6.616655199754741e-01 - 6.601043974442724e-01 - 6.585469481315596e-01 - 6.569931633409668e-01 - 6.554430344698831e-01 - 6.538965529680326e-01 - 6.523537102216029e-01 - 6.508144977390269e-01 - 6.492789070902356e-01 - 6.477469297088367e-01 - 6.462185570471877e-01 - 6.446937806333431e-01 - 6.431725921186934e-01 - 6.416549831028872e-01 - 6.401409451291091e-01 - 6.386304698205402e-01 - 6.371235488250266e-01 - 6.356201737964903e-01 - 6.341203364004929e-01 - 6.326240283504814e-01 - 6.311312414023209e-01 - 6.296419672600960e-01 - 6.281561976359686e-01 - 6.266739242956670e-01 - 6.251951391194286e-01 - 6.237198339322255e-01 - 6.222480004492102e-01 - 6.207796305731890e-01 - 6.193147162378443e-01 - 6.178532493027741e-01 - 6.163952216645050e-01 - 6.149406252489860e-01 - 6.134894519984210e-01 - 6.120416938491114e-01 - 6.105973427932988e-01 - 6.091563909278429e-01 - 6.077188302116784e-01 - 6.062846526061169e-01 - 6.048538502614210e-01 - 6.034264152733694e-01 - 6.020023397068369e-01 - 6.005816156757759e-01 - 5.991642353027361e-01 - 5.977501907311656e-01 - 5.963394741611191e-01 - 5.949320777981851e-01 - 5.935279938331314e-01 - 5.921272144271874e-01 - 5.907297318514260e-01 - 5.893355384452119e-01 - 5.879446264415406e-01 - 5.865569881004723e-01 - 5.851726157460215e-01 - 5.837915017610071e-01 - 5.824136384878618e-01 - 5.810390182425506e-01 - 5.796676334763571e-01 - 5.782994765837256e-01 - 5.769345398883866e-01 - 5.755728159164172e-01 - 5.742142971757567e-01 - 5.728589760824728e-01 - 5.715068451452269e-01 - 5.701578968814059e-01 - 5.688121237820786e-01 - 5.674695184134964e-01 - 5.661300733449661e-01 - 5.647937811172017e-01 - 5.634606343850478e-01 - 5.621306258016221e-01 - 5.608037479323033e-01 - 5.594799934047830e-01 - 5.581593548937616e-01 - 5.568418251014721e-01 - 5.555273967809645e-01 - 5.542160626584934e-01 - 5.529078153599613e-01 - 5.516026476869607e-01 - 5.503005524879265e-01 - 5.490015224489507e-01 - 5.477055503706971e-01 - 5.464126291394721e-01 - 5.451227516109934e-01 - 5.438359105997491e-01 - 5.425520989229732e-01 - 5.412713094911021e-01 - 5.399935352390902e-01 - 5.387187691034094e-01 - 5.374470040087604e-01 - 5.361782329113639e-01 - 5.349124487848638e-01 - 5.336496445514358e-01 - 5.323898132502169e-01 - 5.311329480044003e-01 - 5.298790417206248e-01 - 5.286280874266170e-01 - 5.273800783238198e-01 - 5.261350074387794e-01 - 5.248928678300107e-01 - 5.236536526638225e-01 - 5.224173550711992e-01 - 5.211839681868924e-01 - 5.199534851768893e-01 - 5.187258992380968e-01 - 5.175012035574781e-01 - 5.162793913049719e-01 - 5.150604557657682e-01 - 5.138443902158373e-01 - 5.126311878387027e-01 - 5.114208419243966e-01 - 5.102133457996210e-01 - 5.090086927559088e-01 - 5.078068761246483e-01 - 5.066078892445277e-01 - 5.054117254264059e-01 - 5.042183780707232e-01 - 5.030278406156905e-01 - 5.018401064512819e-01 - 5.006551689399448e-01 - 4.994730214827681e-01 - 4.982936576173500e-01 - 4.971170708196209e-01 - 4.959432545161117e-01 - 4.947722021784954e-01 - 4.936039073158257e-01 - 4.924383634713059e-01 - 4.912755642215030e-01 - 4.901155031029966e-01 - 4.889581736357913e-01 - 4.878035694426762e-01 - 4.866516841617155e-01 - 4.855025114095978e-01 - 4.843560447562852e-01 - 4.832122778219742e-01 - 4.820712043014287e-01 - 4.809328179063641e-01 - 4.797971123302187e-01 - 4.786640812406847e-01 - 4.775337183184862e-01 - 4.764060173050261e-01 - 4.752809720122764e-01 - 4.741585762111217e-01 - 4.730388236459319e-01 - 4.719217080626099e-01 - 4.708072233097221e-01 - 4.696953632391141e-01 - 4.685861216425942e-01 - 4.674794923970907e-01 - 4.663754693817960e-01 - 4.652740464091041e-01 - 4.641752174102053e-01 - 4.630789763262008e-01 - 4.619853169869301e-01 - 4.608942333544824e-01 - 4.598057194461572e-01 - 4.587197692038988e-01 - 4.576363766028796e-01 - 4.565555356433393e-01 - 4.554772403132010e-01 - 4.544014845983438e-01 - 4.533282625263808e-01 - 4.522575682421708e-01 - 4.511893957834002e-01 - 4.501237391381080e-01 - 4.490605924783677e-01 - 4.479999499003729e-01 - 4.469418054464263e-01 - 4.458861533467765e-01 - 4.448329877503518e-01 - 4.437823027182840e-01 - 4.427340924804984e-01 - 4.416883512661691e-01 - 4.406450732493647e-01 - 4.396042525949710e-01 - 4.385658835318161e-01 - 4.375299603591805e-01 - 4.364964773180230e-01 - 4.354654286529535e-01 - 4.344368086449737e-01 - 4.334106115882546e-01 - 4.323868317973252e-01 - 4.313654636098987e-01 - 4.303465013528135e-01 - 4.293299393608014e-01 - 4.283157719943348e-01 - 4.273039936389254e-01 - 4.262945986862648e-01 - 4.252875815207442e-01 - 4.242829365388910e-01 - 4.232806581737543e-01 - 4.222807409163533e-01 - 4.212831792180283e-01 - 4.202879675160039e-01 - 4.192951002821390e-01 - 4.183045720190468e-01 - 4.173163772308877e-01 - 4.163305103895081e-01 - 4.153469660738844e-01 - 4.143657388899517e-01 - 4.133868232899575e-01 - 4.124102138463511e-01 - 4.114359052122226e-01 - 4.104638919136763e-01 - 4.094941685453110e-01 - 4.085267297797091e-01 - 4.075615702608746e-01 - 4.065986846247451e-01 - 4.056380675149961e-01 - 4.046797136100241e-01 - 4.037236175791848e-01 - 4.027697740867438e-01 - 4.018181778668817e-01 - 4.008688236537185e-01 - 3.999217061664900e-01 - 3.989768201804763e-01 - 3.980341604347806e-01 - 3.970937216243767e-01 - 3.961554986257766e-01 - 3.952194862561716e-01 - 3.942856791749246e-01 - 3.933540722797152e-01 - 3.924246604937682e-01 - 3.914974386057962e-01 - 3.905724013991230e-01 - 3.896495437210211e-01 - 3.887288605266558e-01 - 3.878103467384126e-01 - 3.868939972364765e-01 - 3.859798068708922e-01 - 3.850677705778728e-01 - 3.841578833358520e-01 - 3.832501400994028e-01 - 3.823445358203205e-01 - 3.814410654593080e-01 - 3.805397240004402e-01 - 3.796405064500310e-01 - 3.787434078281850e-01 - 3.778484231550217e-01 - 3.769555474293507e-01 - 3.760647756653435e-01 - 3.751761029803938e-01 - 3.742895244689736e-01 - 3.734050351897463e-01 - 3.725226302131253e-01 - 3.716423046174657e-01 - 3.707640535037849e-01 - 3.698878720450124e-01 - 3.690137553825144e-01 - 3.681416986254492e-01 - 3.672716969834960e-01 - 3.664037456169829e-01 - 3.655378396196581e-01 - 3.646739742353085e-01 - 3.638121447254376e-01 - 3.629523462980791e-01 - 3.620945741078652e-01 - 3.612388233782960e-01 - 3.603850894480597e-01 - 3.595333675652969e-01 - 3.586836529581271e-01 - 3.578359408972814e-01 - 3.569902267099870e-01 - 3.561465057284826e-01 - 3.553047732480240e-01 - 3.544650245489661e-01 - 3.536272549462773e-01 - 3.527914598373741e-01 - 3.519576346281267e-01 - 3.511257746893044e-01 - 3.502958753213151e-01 - 3.494679319027064e-01 - 3.486419398734283e-01 - 3.478178946841421e-01 - 3.469957917542031e-01 - 3.461756264906874e-01 - 3.453573943334770e-01 - 3.445410907466465e-01 - 3.437267112053919e-01 - 3.429142511753236e-01 - 3.421037061357636e-01 - 3.412950715914754e-01 - 3.404883430871680e-01 - 3.396835161220511e-01 - 3.388805861778083e-01 - 3.380795488742585e-01 - 3.372803997559251e-01 - 3.364831342820857e-01 - 3.356877480644493e-01 - 3.348942367473924e-01 - 3.341025959445759e-01 - 3.333128211902062e-01 - 3.325249080644813e-01 - 3.317388522349806e-01 - 3.309546493345364e-01 - 3.301722950123494e-01 - 3.293917849546400e-01 - 3.286131147929292e-01 - 3.278362801760134e-01 - 3.270612768173198e-01 - 3.262881004205997e-01 - 3.255167466776044e-01 - 3.247472112772871e-01 - 3.239794899591130e-01 - 3.232135784952971e-01 - 3.224494726613195e-01 - 3.216871681318617e-01 - 3.209266606147330e-01 - 3.201679460077643e-01 - 3.194110200806869e-01 - 3.186558785671545e-01 - 3.179025173467112e-01 - 3.171509322207308e-01 - 3.164011189537259e-01 - 3.156530734030461e-01 - 3.149067914068442e-01 - 3.141622688005587e-01 - 3.134195014964591e-01 - 3.126784853846941e-01 - 3.119392163234083e-01 - 3.112016901727622e-01 - 3.104659028247113e-01 - 3.097318502149898e-01 - 3.089995283319454e-01 - 3.082689330721005e-01 - 3.075400602663161e-01 - 3.068129059444455e-01 - 3.060874661234649e-01 - 3.053637367362504e-01 - 3.046417137079979e-01 - 3.039213930418579e-01 - 3.032027708160949e-01 - 3.024858429572295e-01 - 3.017706054435225e-01 - 3.010570543910775e-01 - 3.003451858060657e-01 - 2.996349956970866e-01 - 2.989264801519126e-01 - 2.982196352437723e-01 - 2.975144570351090e-01 - 2.968109415899733e-01 - 2.961090850010212e-01 - 2.954088833712375e-01 - 2.947103327960572e-01 - 2.940134293733013e-01 - 2.933181692489545e-01 - 2.926245486550200e-01 - 2.919325636534309e-01 - 2.912422103009782e-01 - 2.905534849067459e-01 - 2.898663836341845e-01 - 2.891809025716850e-01 - 2.884970379499296e-01 - 2.878147859946116e-01 - 2.871341429080666e-01 - 2.864551048929091e-01 - 2.857776681836698e-01 - 2.851018290276999e-01 - 2.844275836247271e-01 - 2.837549281975342e-01 - 2.830838590248334e-01 - 2.824143724756855e-01 - 2.817464648036653e-01 - 2.810801321714598e-01 - 2.804153709678348e-01 - 2.797521775256636e-01 - 2.790905480675208e-01 - 2.784304789557904e-01 - 2.777719665515425e-01 - 2.771150071618110e-01 - 2.764595971293084e-01 - 2.758057328280932e-01 - 2.751534106502780e-01 - 2.745026269461392e-01 - 2.738533780697315e-01 - 2.732056604090851e-01 - 2.725594703611444e-01 - 2.719148043516682e-01 - 2.712716588414341e-01 - 2.706300302048149e-01 - 2.699899148252890e-01 - 2.693513091897057e-01 - 2.687142097803046e-01 - 2.680786130525787e-01 - 2.674445154290628e-01 - 2.668119133864937e-01 - 2.661808034370396e-01 - 2.655511820876730e-01 - 2.649230457933240e-01 - 2.642963910212357e-01 - 2.636712143601993e-01 - 2.630475123173707e-01 - 2.624252813696634e-01 - 2.618045181320832e-01 - 2.611852191534089e-01 - 2.605673809346502e-01 - 2.599510000768786e-01 - 2.593360731482656e-01 - 2.587225966857610e-01 - 2.581105673020023e-01 - 2.574999816218594e-01 - 2.568908362541323e-01 - 2.562831277681717e-01 - 2.556768527608984e-01 - 2.550720078808991e-01 - 2.544685898158210e-01 - 2.538665952029344e-01 - 2.532660206235198e-01 - 2.526668627769018e-01 - 2.520691183671673e-01 - 2.514727840477828e-01 - 2.508778564832650e-01 - 2.502843323450471e-01 - 2.496922083184503e-01 - 2.491014811741685e-01 - 2.485121476502302e-01 - 2.479242043768022e-01 - 2.473376480750936e-01 - 2.467524755330193e-01 - 2.461686835577825e-01 - 2.455862688342147e-01 - 2.450052280577099e-01 - 2.444255580815592e-01 - 2.438472556710649e-01 - 2.432703175621061e-01 - 2.426947405763887e-01 - 2.421205215374063e-01 - 2.415476572469543e-01 - 2.409761444715131e-01 - 2.404059800179439e-01 - 2.398371607406130e-01 - 2.392696835287547e-01 - 2.387035451998669e-01 - 2.381387425460481e-01 - 2.375752724876774e-01 - 2.370131319015487e-01 - 2.364523176042576e-01 - 2.358928264341899e-01 - 2.353346553264918e-01 - 2.347778012643444e-01 - 2.342222610470114e-01 - 2.336680315481888e-01 - 2.331151097630285e-01 - 2.325634926002070e-01 - 2.320131769932555e-01 - 2.314641599195968e-01 - 2.309164382391606e-01 - 2.303700088852327e-01 - 2.298248689205450e-01 - 2.292810152383314e-01 - 2.287384447851956e-01 - 2.281971546639490e-01 - 2.276571417710518e-01 - 2.271184030444375e-01 - 2.265809356255705e-01 - 2.260447364485637e-01 - 2.255098024678978e-01 - 2.249761308577043e-01 - 2.244437185775247e-01 - 2.239125625576918e-01 - 2.233826599324974e-01 - 2.228540078061592e-01 - 2.223266032159731e-01 - 2.218004431318401e-01 - 2.212755246546400e-01 - 2.207518449320089e-01 - 2.202294009962271e-01 - 2.197081899542086e-01 - 2.191882089472320e-01 - 2.186694550184439e-01 - 2.181519252528444e-01 - 2.176356167922184e-01 - 2.171205268020538e-01 - 2.166066524055817e-01 - 2.160939907132310e-01 - 2.155825389406823e-01 - 2.150722942170351e-01 - 2.145632535999474e-01 - 2.140554143128364e-01 - 2.135487735713488e-01 - 2.130433285376680e-01 - 2.125390763961598e-01 - 2.120360143225986e-01 - 2.115341394866721e-01 - 2.110334491301104e-01 - 2.105339404911263e-01 - 2.100356107692428e-01 - 2.095384571593845e-01 - 2.090424768875718e-01 - 2.085476672286868e-01 - 2.080540254649787e-01 - 2.075615488420417e-01 - 2.070702345483775e-01 - 2.065800798220710e-01 - 2.060910819584345e-01 - 2.056032383022174e-01 - 2.051165461242101e-01 - 2.046310026800104e-01 - 2.041466052775261e-01 - 2.036633511978056e-01 - 2.031812377402102e-01 - 2.027002622847228e-01 - 2.022204221329609e-01 - 2.017417145657832e-01 - 2.012641369577989e-01 - 2.007876866366623e-01 - 2.003123609141739e-01 - 1.998381571847571e-01 - 1.993650728223044e-01 - 1.988931051658790e-01 - 1.984222515391579e-01 - 1.979525093566432e-01 - 1.974838760798574e-01 - 1.970163490394448e-01 - 1.965499255924087e-01 - 1.960846031634822e-01 - 1.956203792216227e-01 - 1.951572511456189e-01 - 1.946952162469976e-01 - 1.942342720345011e-01 - 1.937744160087473e-01 - 1.933156455855021e-01 - 1.928579581617409e-01 - 1.924013511601302e-01 - 1.919458220512063e-01 - 1.914913683490730e-01 - 1.910379875218400e-01 - 1.905856769690048e-01 - 1.901344342343178e-01 - 1.896842568245793e-01 - 1.892351421122624e-01 - 1.887870876905098e-01 - 1.883400911382459e-01 - 1.878941498265747e-01 - 1.874492612709913e-01 - 1.870054230608876e-01 - 1.865626327533365e-01 - 1.861208878413260e-01 - 1.856801858136446e-01 - 1.852405242290795e-01 - 1.848019006561455e-01 - 1.843643126785636e-01 - 1.839277579090688e-01 - 1.834922338318696e-01 - 1.830577379260484e-01 - 1.826242679175190e-01 - 1.821918214082343e-01 - 1.817603959062191e-01 - 1.813299890419420e-01 - 1.809005984096844e-01 - 1.804722215715290e-01 - 1.800448561676805e-01 - 1.796184998471616e-01 - 1.791931502428031e-01 - 1.787688049585256e-01 - 1.783454616010165e-01 - 1.779231178061076e-01 - 1.775017712916434e-01 - 1.770814197185338e-01 - 1.766620606643876e-01 - 1.762436917707559e-01 - 1.758263107475443e-01 - 1.754099153420786e-01 - 1.749945031691721e-01 - 1.745800718793870e-01 - 1.741666192327871e-01 - 1.737541428912765e-01 - 1.733426405128906e-01 - 1.729321098263452e-01 - 1.725225486037993e-01 - 1.721139545737653e-01 - 1.717063253659770e-01 - 1.712996586978482e-01 - 1.708939523524782e-01 - 1.704892041326627e-01 - 1.700854117308264e-01 - 1.696825728315613e-01 - 1.692806852413719e-01 - 1.688797467224855e-01 - 1.684797550119726e-01 - 1.680807078836749e-01 - 1.676826031516292e-01 - 1.672854386236076e-01 - 1.668892120257625e-01 - 1.664939211364053e-01 - 1.660995637803862e-01 - 1.657061377653481e-01 - 1.653136408872399e-01 - 1.649220709518862e-01 - 1.645314258210089e-01 - 1.641417032838678e-01 - 1.637529010922642e-01 - 1.633650171697226e-01 - 1.629780493848234e-01 - 1.625919955117979e-01 - 1.622068533722165e-01 - 1.618226208359533e-01 - 1.614392958070308e-01 - 1.610568761629498e-01 - 1.606753597398519e-01 - 1.602947443525945e-01 - 1.599150279328092e-01 - 1.595362083976419e-01 - 1.591582835876941e-01 - 1.587812513806259e-01 - 1.584051096895935e-01 - 1.580298564486488e-01 - 1.576554895336735e-01 - 1.572820068494865e-01 - 1.569094063844064e-01 - 1.565376859935812e-01 - 1.561668435389086e-01 - 1.557968770322644e-01 - 1.554277844430587e-01 - 1.550595637013555e-01 - 1.546922127252644e-01 - 1.543257294352004e-01 - 1.539601117962810e-01 - 1.535953578647676e-01 - 1.532314655336160e-01 - 1.528684326732572e-01 - 1.525062574192351e-01 - 1.521449377506904e-01 - 1.517844715391133e-01 - 1.514248568043021e-01 - 1.510660915767141e-01 - 1.507081738546517e-01 - 1.503511015850067e-01 - 1.499948728018673e-01 - 1.496394855976185e-01 - 1.492849379312514e-01 - 1.489312277844460e-01 - 1.485783532079666e-01 - 1.482263122946834e-01 - 1.478751030581660e-01 - 1.475247234388987e-01 - 1.471751715323068e-01 - 1.468264454469171e-01 - 1.464785432366154e-01 - 1.461314629165984e-01 - 1.457852025452889e-01 - 1.454397602433564e-01 - 1.450951340257908e-01 - 1.447513219420110e-01 - 1.444083221508569e-01 - 1.440661327109938e-01 - 1.437247516822454e-01 - 1.433841772072484e-01 - 1.430444073901374e-01 - 1.427054403077353e-01 - 1.423672740371242e-01 - 1.420299067307786e-01 - 1.416933365389871e-01 - 1.413575615237460e-01 - 1.410225798197031e-01 - 1.406883895901710e-01 - 1.403549889435149e-01 - 1.400223760032770e-01 - 1.396905489310608e-01 - 1.393595059398338e-01 - 1.390292451224472e-01 - 1.386997645496112e-01 - 1.383710625136722e-01 - 1.380431371824567e-01 - 1.377159866326167e-01 - 1.373896091055998e-01 - 1.370640027752214e-01 - 1.367391657592925e-01 - 1.364150963290927e-01 - 1.360917926783734e-01 - 1.357692529162330e-01 - 1.354474752994454e-01 - 1.351264580487222e-01 - 1.348061993122180e-01 - 1.344866973181728e-01 - 1.341679503229942e-01 - 1.338499565682958e-01 - 1.335327142013654e-01 - 1.332162214320106e-01 - 1.329004765902875e-01 - 1.325854779258548e-01 - 1.322712236439755e-01 - 1.319577119415115e-01 - 1.316449410589970e-01 - 1.313329092858229e-01 - 1.310216149439378e-01 - 1.307110562100912e-01 - 1.304012313067827e-01 - 1.300921386594473e-01 - 1.297837764741680e-01 - 1.294761429396481e-01 - 1.291692364743583e-01 - 1.288630553353233e-01 - 1.285575977268189e-01 - 1.282528620001082e-01 - 1.279488464604472e-01 - 1.276455493846629e-01 - 1.273429690961771e-01 - 1.270411039265308e-01 - 1.267399521912149e-01 - 1.264395121606617e-01 - 1.261397821624623e-01 - 1.258407605612416e-01 - 1.255424456647032e-01 - 1.252448358003494e-01 - 1.249479293256652e-01 - 1.246517245985584e-01 - 1.243562199440227e-01 - 1.240614136699035e-01 - 1.237673041530004e-01 - 1.234738897833225e-01 - 1.231811689369122e-01 - 1.228891399541342e-01 - 1.225978011897444e-01 - 1.223071510285007e-01 - 1.220171878485729e-01 - 1.217279100221359e-01 - 1.214393159216827e-01 - 1.211514039479249e-01 - 1.208641725134118e-01 - 1.205776200272462e-01 - 1.202917448643591e-01 - 1.200065453999493e-01 - 1.197220200388544e-01 - 1.194381672203820e-01 - 1.191549853738593e-01 - 1.188724728867774e-01 - 1.185906281982059e-01 - 1.183094497403516e-01 - 1.180289358802264e-01 - 1.177490851172322e-01 - 1.174698959467804e-01 - 1.171913666738082e-01 - 1.169134957966049e-01 - 1.166362818664215e-01 - 1.163597231976005e-01 - 1.160838182295854e-01 - 1.158085654926154e-01 - 1.155339634301463e-01 - 1.152600105152270e-01 - 1.149867052503320e-01 - 1.147140461081585e-01 - 1.144420315115333e-01 - 1.141706598827868e-01 - 1.138999297876022e-01 - 1.136298397724347e-01 - 1.133603883121320e-01 - 1.130915738073908e-01 - 1.128233947404400e-01 - 1.125558496925181e-01 - 1.122889371862514e-01 - 1.120226557224089e-01 - 1.117570037925019e-01 - 1.114919798574519e-01 - 1.112275824488763e-01 - 1.109638101830490e-01 - 1.107006615250319e-01 - 1.104381349837027e-01 - 1.101762291935612e-01 - 1.099149425817940e-01 - 1.096542736337556e-01 - 1.093942210611990e-01 - 1.091347833750166e-01 - 1.088759590309823e-01 - 1.086177465849946e-01 - 1.083601446468375e-01 - 1.081031518187680e-01 - 1.078467666394599e-01 - 1.075909876365943e-01 - 1.073358133695979e-01 - 1.070812424691808e-01 - 1.068272734935852e-01 - 1.065739049762412e-01 - 1.063211355273724e-01 - 1.060689637753818e-01 - 1.058173883167701e-01 - 1.055664076522099e-01 - 1.053160204177178e-01 - 1.050662253083730e-01 - 1.048170208178578e-01 - 1.045684055544151e-01 - 1.043203782231123e-01 - 1.040729373745031e-01 - 1.038260815947437e-01 - 1.035798095388146e-01 - 1.033341198496129e-01 - 1.030890111353506e-01 - 1.028444819874746e-01 - 1.026005310752415e-01 - 1.023571570589419e-01 - 1.021143585605686e-01 - 1.018721342063349e-01 - 1.016304826397723e-01 - 1.013894025261397e-01 - 1.011488925387934e-01 - 1.009089513225976e-01 - 1.006695774897203e-01 - 1.004307697412456e-01 - 1.001925267601519e-01 - 9.995484714928184e-02 - 9.971772961029543e-02 - 9.948117285600222e-02 - 9.924517553207431e-02 - 9.900973631553432e-02 - 9.877485389836264e-02 - 9.854052696321766e-02 - 9.830675420513860e-02 - 9.807353432053509e-02 - 9.784086599274402e-02 - 9.760874792461041e-02 - 9.737717882679013e-02 - 9.714615739564664e-02 - 9.691568233864475e-02 - 9.668575237168565e-02 - 9.645636620785530e-02 - 9.622752256709627e-02 - 9.599922017186617e-02 - 9.577145773476621e-02 - 9.554423398421420e-02 - 9.531754766036228e-02 - 9.509139748951084e-02 - 9.486578220406576e-02 - 9.464070054491446e-02 - 9.441615125061270e-02 - 9.419213306609350e-02 - 9.396864474309072e-02 - 9.374568502973517e-02 - 9.352325267700241e-02 - 9.330134644110695e-02 - 9.307996508088016e-02 - 9.285910736057421e-02 - 9.263877204899980e-02 - 9.241895790580944e-02 - 9.219966369924239e-02 - 9.198088821288498e-02 - 9.176263021506216e-02 - 9.154488848131032e-02 - 9.132766180778470e-02 - 9.111094897456264e-02 - 9.089474876186458e-02 - 9.067905996494766e-02 - 9.046388137755315e-02 - 9.024921179550818e-02 - 9.003505002157913e-02 - 8.982139485394958e-02 - 8.960824509461397e-02 - 8.939559956013639e-02 - 8.918345705664489e-02 - 8.897181638949078e-02 - 8.876067638185769e-02 - 8.855003585659860e-02 - 8.833989363307079e-02 - 8.813024852794749e-02 - 8.792109937217552e-02 - 8.771244500411417e-02 - 8.750428424959714e-02 - 8.729661594151820e-02 - 8.708943892038122e-02 - 8.688275202450782e-02 - 8.667655409894154e-02 - 8.647084399500883e-02 - 8.626562056133152e-02 - 8.606088264727801e-02 - 8.585662910508592e-02 - 8.565285879275303e-02 - 8.544957056834111e-02 - 8.524676329099723e-02 - 8.504443583456130e-02 - 8.484258706983651e-02 - 8.464121585953427e-02 - 8.444032107793580e-02 - 8.423990160173883e-02 - 8.403995630660985e-02 - 8.384048408000297e-02 - 8.364148380739438e-02 - 8.344295436518863e-02 - 8.324489464319758e-02 - 8.304730353631981e-02 - 8.285017993778075e-02 - 8.265352274723796e-02 - 8.245733086610936e-02 - 8.226160319325253e-02 - 8.206633863307464e-02 - 8.187153609323948e-02 - 8.167719448173898e-02 - 8.148331271120264e-02 - 8.128988969775824e-02 - 8.109692435907066e-02 - 8.090441561287741e-02 - 8.071236238052074e-02 - 8.052076359329230e-02 - 8.032961817777003e-02 - 8.013892505875637e-02 - 7.994868317110082e-02 - 7.975889145271257e-02 - 7.956954884117817e-02 - 7.938065427030368e-02 - 7.919220668490153e-02 - 7.900420503735811e-02 - 7.881664826626886e-02 - 7.862953532075569e-02 - 7.844286516277023e-02 - 7.825663674598571e-02 - 7.807084902471831e-02 - 7.788550095723919e-02 - 7.770059150356423e-02 - 7.751611963202924e-02 - 7.733208431808952e-02 - 7.714848452080215e-02 - 7.696531920714285e-02 - 7.678258736267791e-02 - 7.660028796508990e-02 - 7.641841999039113e-02 - 7.623698241865759e-02 - 7.605597423593993e-02 - 7.587539442823407e-02 - 7.569524197859213e-02 - 7.551551588287067e-02 - 7.533621514035872e-02 - 7.515733874432233e-02 - 7.497888568830134e-02 - 7.480085497230264e-02 - 7.462324560850588e-02 - 7.444605660139321e-02 - 7.426928695221670e-02 - 7.409293566891996e-02 - 7.391700176673981e-02 - 7.374148426439617e-02 - 7.356638217848553e-02 - 7.339169452681224e-02 - 7.321742033027905e-02 - 7.304355861552074e-02 - 7.287010840815517e-02 - 7.269706873346385e-02 - 7.252443862192341e-02 - 7.235221710900047e-02 - 7.218040323296335e-02 - 7.200899602923243e-02 - 7.183799453782064e-02 - 7.166739780328910e-02 - 7.149720486628935e-02 - 7.132741477295296e-02 - 7.115802657678706e-02 - 7.098903933028558e-02 - 7.082045208266741e-02 - 7.065226388294948e-02 - 7.048447379884398e-02 - 7.031708089501212e-02 - 7.015008422428966e-02 - 6.998348285005500e-02 - 6.981727584178653e-02 - 6.965146227138255e-02 - 6.948604121024822e-02 - 6.932101172952453e-02 - 6.915637290177927e-02 - 6.899212381049466e-02 - 6.882826353831664e-02 - 6.866479115768206e-02 - 6.850170575553913e-02 - 6.833900642241270e-02 - 6.817669223943085e-02 - 6.801476230171261e-02 - 6.785321570853013e-02 - 6.769205154760372e-02 - 6.753126891476798e-02 - 6.737086691265436e-02 - 6.721084464422118e-02 - 6.705120121123045e-02 - 6.689193571639933e-02 - 6.673304726820108e-02 - 6.657453497707803e-02 - 6.641639795452120e-02 - 6.625863531334618e-02 - 6.610124617104705e-02 - 6.594422964866814e-02 - 6.578758486543299e-02 - 6.563131094165708e-02 - 6.547540700031643e-02 - 6.531987216906585e-02 - 6.516470557837332e-02 - 6.500990635997374e-02 - 6.485547364331327e-02 - 6.470140656204018e-02 - 6.454770425495959e-02 - 6.439436585565442e-02 - 6.424139050518185e-02 - 6.408877735587415e-02 - 6.393652554954243e-02 - 6.378463422860429e-02 - 6.363310254304622e-02 - 6.348192964216136e-02 - 6.333111467891862e-02 - 6.318065681259971e-02 - 6.303055519506789e-02 - 6.288080898167979e-02 - 6.273141734118348e-02 - 6.258237943694549e-02 - 6.243369443027962e-02 - 6.228536148636779e-02 - 6.213737977420020e-02 - 6.198974846629291e-02 - 6.184246673830131e-02 - 6.169553375986874e-02 - 6.154894870195880e-02 - 6.140271075002260e-02 - 6.125681908485271e-02 - 6.111127288458502e-02 - 6.096607133498923e-02 - 6.082121362330186e-02 - 6.067669893778977e-02 - 6.053252647002724e-02 - 6.038869541057570e-02 - 6.024520494995262e-02 - 6.010205428441878e-02 - 5.995924261312039e-02 - 5.981676913606451e-02 - 5.967463305068377e-02 - 5.953283356000520e-02 - 5.939136987405440e-02 - 5.925024120274393e-02 - 5.910944675075109e-02 - 5.896898572024133e-02 - 5.882885733338872e-02 - 5.868906080796419e-02 - 5.854959534943303e-02 - 5.841046018167366e-02 - 5.827165452667381e-02 - 5.813317759547484e-02 - 5.799502862000658e-02 - 5.785720683145133e-02 - 5.771971144629215e-02 - 5.758254169802959e-02 - 5.744569682168989e-02 - 5.730917604038396e-02 - 5.717297859181381e-02 - 5.703710371771920e-02 - 5.690155065150715e-02 - 5.676631863514842e-02 - 5.663140691176988e-02 - 5.649681471550019e-02 - 5.636254129818796e-02 - 5.622858591623749e-02 - 5.609494780637568e-02 - 5.596162621719655e-02 - 5.582862040612746e-02 - 5.569592962469259e-02 - 5.556355312969728e-02 - 5.543149018219354e-02 - 5.529974004038473e-02 - 5.516830196534387e-02 - 5.503717522021812e-02 - 5.490635906464716e-02 - 5.477585276550550e-02 - 5.464565559606692e-02 - 5.451576682310098e-02 - 5.438618571514530e-02 - 5.425691154653305e-02 - 5.412794360021059e-02 - 5.399928115030668e-02 - 5.387092346220070e-02 - 5.374286982722595e-02 - 5.361511953114147e-02 - 5.348767184376742e-02 - 5.336052605560348e-02 - 5.323368145967647e-02 - 5.310713734132736e-02 - 5.298089299097181e-02 - 5.285494769998652e-02 - 5.272930075794034e-02 - 5.260395145882699e-02 - 5.247889910164562e-02 - 5.235414299012888e-02 - 5.222968242359068e-02 - 5.210551670083303e-02 - 5.198164512479836e-02 - 5.185806699751586e-02 - 5.173478162567831e-02 - 5.161178832737659e-02 - 5.148908640731603e-02 - 5.136667516904735e-02 - 5.124455393713079e-02 - 5.112272202541198e-02 - 5.100117874145336e-02 - 5.087992340415878e-02 - 5.075895533879782e-02 - 5.063827387090040e-02 - 5.051787831631814e-02 - 5.039776799903027e-02 - 5.027794224956293e-02 - 5.015840039018700e-02 - 5.003914174911826e-02 - 4.992016566217095e-02 - 4.980147146451835e-02 - 4.968305848565534e-02 - 4.956492605368701e-02 - 4.944707351707827e-02 - 4.932950021762891e-02 - 4.921220548403189e-02 - 4.909518865563611e-02 - 4.897844908008390e-02 - 4.886198610990230e-02 - 4.874579909103274e-02 - 4.862988736593407e-02 - 4.851425027765261e-02 - 4.839888718215429e-02 - 4.828379743688660e-02 - 4.816898039344981e-02 - 4.805443540666063e-02 - 4.794016183433197e-02 - 4.782615903628512e-02 - 4.771242637003347e-02 - 4.759896319572905e-02 - 4.748576888074151e-02 - 4.737284278529100e-02 - 4.726018427180961e-02 - 4.714779271742187e-02 - 4.703566749191604e-02 - 4.692380796083007e-02 - 4.681221349433169e-02 - 4.670088346648602e-02 - 4.658981725459431e-02 - 4.647901423861556e-02 - 4.636847379587147e-02 - 4.625819530165282e-02 - 4.614817813294777e-02 - 4.603842167462240e-02 - 4.592892531626435e-02 - 4.581968844113481e-02 - 4.571071043517037e-02 - 4.560199068716930e-02 - 4.549352858172214e-02 - 4.538532351139604e-02 - 4.527737487551017e-02 - 4.516968206047602e-02 - 4.506224446147816e-02 - 4.495506148526871e-02 - 4.484813252205796e-02 - 4.474145696749865e-02 - 4.463503423038843e-02 - 4.452886371233129e-02 - 4.442294481444441e-02 - 4.431727694184067e-02 - 4.421185950249874e-02 - 4.410669190344264e-02 - 4.400177354999718e-02 - 4.389710385863231e-02 - 4.379268224561385e-02 - 4.368850811842072e-02 - 4.358458089102907e-02 - 4.348089998166713e-02 - 4.337746480946211e-02 - 4.327427479290449e-02 - 4.317132935104961e-02 - 4.306862790538591e-02 - 4.296616988021409e-02 - 4.286395470044128e-02 - 4.276198178905291e-02 - 4.266025057462805e-02 - 4.255876048879523e-02 - 4.245751096050290e-02 - 4.235650142249979e-02 - 4.225573130868781e-02 - 4.215520004666404e-02 - 4.205490707118502e-02 - 4.195485182346907e-02 - 4.185503374212908e-02 - 4.175545226547943e-02 - 4.165610683241490e-02 - 4.155699688308426e-02 - 4.145812186261490e-02 - 4.135948121993713e-02 - 4.126107439911159e-02 - 4.116290084444992e-02 - 4.106496000347922e-02 - 4.096725133001662e-02 - 4.086977427671171e-02 - 4.077252829257245e-02 - 4.067551282880393e-02 - 4.057872734137224e-02 - 4.048217129089726e-02 - 4.038584413229004e-02 - 4.028974532214836e-02 - 4.019387432351806e-02 - 4.009823059884492e-02 - 4.000281360871143e-02 - 3.990762281263916e-02 - 3.981265768084040e-02 - 3.971791768404272e-02 - 3.962340228400397e-02 - 3.952911094818634e-02 - 3.943504314911767e-02 - 3.934119836154264e-02 - 3.924757605343093e-02 - 3.915417569553582e-02 - 3.906099677494528e-02 - 3.896803876462888e-02 - 3.887530113159737e-02 - 3.878278335807980e-02 - 3.869048493136602e-02 - 3.859840533540703e-02 - 3.850654403935494e-02 - 3.841490053099362e-02 - 3.832347430867683e-02 - 3.823226484521238e-02 - 3.814127162485314e-02 - 3.805049414568009e-02 - 3.795993189727254e-02 - 3.786958436838804e-02 - 3.777945104950908e-02 - 3.768953143238456e-02 - 3.759982501241896e-02 - 3.751033128919119e-02 - 3.742104976390229e-02 - 3.733197993101921e-02 - 3.724312127956968e-02 - 3.715447331892652e-02 - 3.706603555538170e-02 - 3.697780748276271e-02 - 3.688978860838169e-02 - 3.680197844047203e-02 - 3.671437648083043e-02 - 3.662698223859462e-02 - 3.653979522528233e-02 - 3.645281495050149e-02 - 3.636604092401768e-02 - 3.627947265609178e-02 - 3.619310965841749e-02 - 3.610695145022991e-02 - 3.602099755007137e-02 - 3.593524746722872e-02 - 3.584970072102484e-02 - 3.576435683502647e-02 - 3.567921532660211e-02 - 3.559427571435374e-02 - 3.550953752116312e-02 - 3.542500027693078e-02 - 3.534066350384148e-02 - 3.525652672170999e-02 - 3.517258946309138e-02 - 3.508885125628003e-02 - 3.500531162678291e-02 - 3.492197010940873e-02 - 3.483882623525817e-02 - 3.475587953263527e-02 - 3.467312953919303e-02 - 3.459057578876406e-02 - 3.450821781198862e-02 - 3.442605515251815e-02 - 3.434408734999198e-02 - 3.426231393723483e-02 - 3.418073445581654e-02 - 3.409934844816886e-02 - 3.401815545480084e-02 - 3.393715501912345e-02 - 3.385634668688416e-02 - 3.377573000557660e-02 - 3.369530452244349e-02 - 3.361506978424043e-02 - 3.353502533757853e-02 - 3.345517073173793e-02 - 3.337550551749302e-02 - 3.329602924688495e-02 - 3.321674147756795e-02 - 3.313764176353938e-02 - 3.305872964905672e-02 - 3.298000469915312e-02 - 3.290146647870388e-02 - 3.282311452928582e-02 - 3.274494841443989e-02 - 3.266696770524984e-02 - 3.258917195579586e-02 - 3.251156072835543e-02 - 3.243413358906379e-02 - 3.235689009597382e-02 - 3.227982981604406e-02 - 3.220295232152501e-02 - 3.212625717796667e-02 - 3.204974395335523e-02 - 3.197341221860803e-02 - 3.189726154412311e-02 - 3.182129149811844e-02 - 3.174550164996338e-02 - 3.166989158019418e-02 - 3.159446086552403e-02 - 3.151920907660396e-02 - 3.144413578635114e-02 - 3.136924057603768e-02 - 3.129452303273958e-02 - 3.121998273049806e-02 - 3.114561924523454e-02 - 3.107143216011856e-02 - 3.099742105799270e-02 - 3.092358552474080e-02 - 3.084992514925186e-02 - 3.077643951122557e-02 - 3.070312819305190e-02 - 3.062999078663620e-02 - 3.055702688363699e-02 - 3.048423607160382e-02 - 3.041161793396379e-02 - 3.033917207015753e-02 - 3.026689807846873e-02 - 3.019479554128978e-02 - 3.012286404982057e-02 - 3.005110320361238e-02 - 2.997951260681279e-02 - 2.990809185255966e-02 - 2.983684053226568e-02 - 2.976575824919644e-02 - 2.969484460522792e-02 - 2.962409920087884e-02 - 2.955352163824170e-02 - 2.948311151647172e-02 - 2.941286843696999e-02 - 2.934279201383451e-02 - 2.927288185012002e-02 - 2.920313754405053e-02 - 2.913355871301240e-02 - 2.906414496442064e-02 - 2.899489589842786e-02 - 2.892581113440367e-02 - 2.885689028447655e-02 - 2.878813295173805e-02 - 2.871953875071393e-02 - 2.865110730129668e-02 - 2.858283822298987e-02 - 2.851473112218837e-02 - 2.844678561226344e-02 - 2.837900131834860e-02 - 2.831137785774055e-02 - 2.824391484910513e-02 - 2.817661191561155e-02 - 2.810946867322990e-02 - 2.804248474261467e-02 - 2.797565975421473e-02 - 2.790899332866750e-02 - 2.784248508684310e-02 - 2.777613465729838e-02 - 2.770994166752542e-02 - 2.764390574354870e-02 - 2.757802651096095e-02 - 2.751230360164656e-02 - 2.744673664902718e-02 - 2.738132528259552e-02 - 2.731606912935157e-02 - 2.725096782054994e-02 - 2.718602099881922e-02 - 2.712122829441404e-02 - 2.705658933533107e-02 - 2.699210376654040e-02 - 2.692777122629619e-02 - 2.686359134766074e-02 - 2.679956376855050e-02 - 2.673568813034148e-02 - 2.667196407449100e-02 - 2.660839123653040e-02 - 2.654496925932325e-02 - 2.648169779209303e-02 - 2.641857647953893e-02 - 2.635560496230991e-02 - 2.629278288047702e-02 - 2.623010988365326e-02 - 2.616758562366618e-02 - 2.610520975031933e-02 - 2.604298190560967e-02 - 2.598090173551063e-02 - 2.591896889422694e-02 - 2.585718303968204e-02 - 2.579554382343284e-02 - 2.573405088890056e-02 - 2.567270388987125e-02 - 2.561150248485746e-02 - 2.555044633271165e-02 - 2.548953508798725e-02 - 2.542876840653832e-02 - 2.536814594843316e-02 - 2.530766736730480e-02 - 2.524733231969847e-02 - 2.518714047250964e-02 - 2.512709148651639e-02 - 2.506718502244662e-02 - 2.500742074738894e-02 - 2.494779831751132e-02 - 2.488831739145854e-02 - 2.482897764751662e-02 - 2.476977875068464e-02 - 2.471072035836960e-02 - 2.465180213557270e-02 - 2.459302375909131e-02 - 2.453438490494015e-02 - 2.447588522684439e-02 - 2.441752439632618e-02 - 2.435930209686822e-02 - 2.430121799563831e-02 - 2.424327176191257e-02 - 2.418546306971884e-02 - 2.412779159320392e-02 - 2.407025701015483e-02 - 2.401285899981317e-02 - 2.395559723318545e-02 - 2.389847138352894e-02 - 2.384148113010493e-02 - 2.378462615809818e-02 - 2.372790614977233e-02 - 2.367132078182184e-02 - 2.361486973012364e-02 - 2.355855267628842e-02 - 2.350236930912776e-02 - 2.344631931433045e-02 - 2.339040237260871e-02 - 2.333461816188979e-02 - 2.327896637661412e-02 - 2.322344670789084e-02 - 2.316805883183489e-02 - 2.311280243515378e-02 - 2.305767721100430e-02 - 2.300268285332459e-02 - 2.294781904779433e-02 - 2.289308548135576e-02 - 2.283848185163481e-02 - 2.278400785322520e-02 - 2.272966317657758e-02 - 2.267544750906289e-02 - 2.262136054576819e-02 - 2.256740198705395e-02 - 2.251357153295969e-02 - 2.245986887460843e-02 - 2.240629370372433e-02 - 2.235284572997816e-02 - 2.229952464835474e-02 - 2.224633014749699e-02 - 2.219326193897085e-02 - 2.214031972536749e-02 - 2.208750320104361e-02 - 2.203481207216736e-02 - 2.198224604054712e-02 - 2.192980480490446e-02 - 2.187748807809197e-02 - 2.182529556587840e-02 - 2.177322696546572e-02 - 2.172128198614426e-02 - 2.166946034002218e-02 - 2.161776173674180e-02 - 2.156618587797776e-02 - 2.151473246970182e-02 - 2.146340122648612e-02 - 2.141219186176581e-02 - 2.136110408595206e-02 - 2.131013760699968e-02 - 2.125929213929720e-02 - 2.120856739943827e-02 - 2.115796310282077e-02 - 2.110747896148574e-02 - 2.105711468773744e-02 - 2.100686999708853e-02 - 2.095674460640470e-02 - 2.090673823470377e-02 - 2.085685060390323e-02 - 2.080708143284909e-02 - 2.075743043865024e-02 - 2.070789733896461e-02 - 2.065848185338519e-02 - 2.060918370358626e-02 - 2.056000261352416e-02 - 2.051093830731156e-02 - 2.046199050841276e-02 - 2.041315893918832e-02 - 2.036444332670061e-02 - 2.031584339811113e-02 - 2.026735887003067e-02 - 2.021898947028043e-02 - 2.017073493461869e-02 - 2.012259498752183e-02 - 2.007456935661649e-02 - 2.002665777297167e-02 - 1.997885996051357e-02 - 1.993117564943755e-02 - 1.988360457741823e-02 - 1.983614647798445e-02 - 1.978880107994216e-02 - 1.974156811085027e-02 - 1.969444731166336e-02 - 1.964743841723802e-02 - 1.960054115227784e-02 - 1.955375525837354e-02 - 1.950708047707909e-02 - 1.946051654129042e-02 - 1.941406318497287e-02 - 1.936772014474174e-02 - 1.932148716119990e-02 - 1.927536398140690e-02 - 1.922935034564512e-02 - 1.918344598004621e-02 - 1.913765063001423e-02 - 1.909196404425976e-02 - 1.904638595925336e-02 - 1.900091612254435e-02 - 1.895555428061772e-02 - 1.891030016469744e-02 - 1.886515352637163e-02 - 1.882011411999479e-02 - 1.877518167521970e-02 - 1.873035594232305e-02 - 1.868563668110157e-02 - 1.864102363246424e-02 - 1.859651653826993e-02 - 1.855211514697215e-02 - 1.850781921692858e-02 - 1.846362849811174e-02 - 1.841954273425713e-02 - 1.837556167722399e-02 - 1.833168508274460e-02 - 1.828791270638760e-02 - 1.824424429587613e-02 - 1.820067960186819e-02 - 1.815721838079814e-02 - 1.811386039242822e-02 - 1.807060539155448e-02 - 1.802745312809132e-02 - 1.798440336027523e-02 - 1.794145584667328e-02 - 1.789861034396235e-02 - 1.785586661445831e-02 - 1.781322441713358e-02 - 1.777068350457842e-02 - 1.772824363606736e-02 - 1.768590457480606e-02 - 1.764366608520215e-02 - 1.760152792777148e-02 - 1.755948986314423e-02 - 1.751755165530868e-02 - 1.747571306959304e-02 - 1.743397386795286e-02 - 1.739233380686453e-02 - 1.735079266012027e-02 - 1.730935019969591e-02 - 1.726800617515195e-02 - 1.722676035861175e-02 - 1.718561252878033e-02 - 1.714456244423200e-02 - 1.710360987245781e-02 - 1.706275458478830e-02 - 1.702199634263978e-02 - 1.698133492251816e-02 - 1.694077010510486e-02 - 1.690030164730331e-02 - 1.685992932068962e-02 - 1.681965290804600e-02 - 1.677947217681714e-02 - 1.673938689521877e-02 - 1.669939683666028e-02 - 1.665950177991986e-02 - 1.661970150205939e-02 - 1.657999577711447e-02 - 1.654038437906895e-02 - 1.650086708478969e-02 - 1.646144367321789e-02 - 1.642211391798679e-02 - 1.638287759543946e-02 - 1.634373448754158e-02 - 1.630468437732129e-02 - 1.626572704186934e-02 - 1.622686225251448e-02 - 1.618808979718675e-02 - 1.614940946170872e-02 - 1.611082101996680e-02 - 1.607232425440962e-02 - 1.603391895041710e-02 - 1.599560489122978e-02 - 1.595738185903658e-02 - 1.591924963852954e-02 - 1.588120801872957e-02 - 1.584325677844977e-02 - 1.580539569909259e-02 - 1.576762457813194e-02 - 1.572994319938502e-02 - 1.569235134492561e-02 - 1.565484881311209e-02 - 1.561743538476679e-02 - 1.558011083839993e-02 - 1.554287497958433e-02 - 1.550572759639263e-02 - 1.546866846769255e-02 - 1.543169739218311e-02 - 1.539481416304957e-02 - 1.535801856691179e-02 - 1.532131039389481e-02 - 1.528468944222785e-02 - 1.524815551153465e-02 - 1.521170838270258e-02 - 1.517534784896265e-02 - 1.513907371629201e-02 - 1.510288577422132e-02 - 1.506678381600347e-02 - 1.503076764230081e-02 - 1.499483704594779e-02 - 1.495899182406707e-02 - 1.492323178010325e-02 - 1.488755670734373e-02 - 1.485196640180961e-02 - 1.481646066682016e-02 - 1.478103929846549e-02 - 1.474570209596410e-02 - 1.471044886603309e-02 - 1.467527940456368e-02 - 1.464019351058384e-02 - 1.460519099481427e-02 - 1.457027165550810e-02 - 1.453543528903122e-02 - 1.450068170024789e-02 - 1.446601069487559e-02 - 1.443142207965322e-02 - 1.439691566271563e-02 - 1.436249124410753e-02 - 1.432814862414793e-02 - 1.429388761459182e-02 - 1.425970802314729e-02 - 1.422560965483165e-02 - 1.419159231701311e-02 - 1.415765581387266e-02 - 1.412379995194592e-02 - 1.409002455116132e-02 - 1.405632941792580e-02 - 1.402271435207008e-02 - 1.398917917303820e-02 - 1.395572369124169e-02 - 1.392234770932106e-02 - 1.388905104392205e-02 - 1.385583350997071e-02 - 1.382269491788422e-02 - 1.378963507987753e-02 - 1.375665380791922e-02 - 1.372375091366015e-02 - 1.369092621121959e-02 - 1.365817951715469e-02 - 1.362551064978645e-02 - 1.359291942581090e-02 - 1.356040565686591e-02 - 1.352796915179558e-02 - 1.349560973812908e-02 - 1.346332723540702e-02 - 1.343112144483463e-02 - 1.339899219360082e-02 - 1.336693930891053e-02 - 1.333496260043193e-02 - 1.330306188734133e-02 - 1.327123699224855e-02 - 1.323948773476910e-02 - 1.320781393642416e-02 - 1.317621541705235e-02 - 1.314469199166208e-02 - 1.311324348463446e-02 - 1.308186972415766e-02 - 1.305057053367403e-02 - 1.301934573289238e-02 - 1.298819514247371e-02 - 1.295711859027024e-02 - 1.292611590142988e-02 - 1.289518689817567e-02 - 1.286433140253433e-02 - 1.283354924175516e-02 - 1.280284024626999e-02 - 1.277220424320462e-02 - 1.274164105512193e-02 - 1.271115050454398e-02 - 1.268073242580564e-02 - 1.265038664885281e-02 - 1.262011299771964e-02 - 1.258991130045622e-02 - 1.255978138928737e-02 - 1.252972309744999e-02 - 1.249973624798444e-02 - 1.246982067106488e-02 - 1.243997620568067e-02 - 1.241020267461013e-02 - 1.238049990730756e-02 - 1.235086774662455e-02 - 1.232130602051964e-02 - 1.229181455798258e-02 - 1.226239319685087e-02 - 1.223304176770951e-02 - 1.220376010347082e-02 - 1.217454804486660e-02 - 1.214540542341299e-02 - 1.211633207079968e-02 - 1.208732782681391e-02 - 1.205839252771904e-02 - 1.202952600673308e-02 - 1.200072809652295e-02 - 1.197199864009422e-02 - 1.194333748171596e-02 - 1.191474445503102e-02 - 1.188621939116683e-02 - 1.185776212675846e-02 - 1.182937251288597e-02 - 1.180105038815069e-02 - 1.177279558400601e-02 - 1.174460794107161e-02 - 1.171648730396891e-02 - 1.168843351609301e-02 - 1.166044641171630e-02 - 1.163252583370262e-02 - 1.160467163102319e-02 - 1.157688364263099e-02 - 1.154916170933044e-02 - 1.152150567570712e-02 - 1.149391538555893e-02 - 1.146639068095789e-02 - 1.143893140447911e-02 - 1.141153740781534e-02 - 1.138420853673168e-02 - 1.135694462854312e-02 - 1.132974552839056e-02 - 1.130261108533809e-02 - 1.127554114921167e-02 - 1.124853556496432e-02 - 1.122159417997002e-02 - 1.119471684585664e-02 - 1.116790340283271e-02 - 1.114115369710312e-02 - 1.111446758944324e-02 - 1.108784492177717e-02 - 1.106128553754357e-02 - 1.103478929728668e-02 - 1.100835604711145e-02 - 1.098198563223047e-02 - 1.095567791133747e-02 - 1.092943273475230e-02 - 1.090324994987072e-02 - 1.087712940981543e-02 - 1.085107096608238e-02 - 1.082507447053145e-02 - 1.079913977931768e-02 - 1.077326674497864e-02 - 1.074745521859533e-02 - 1.072170505538783e-02 - 1.069601611066200e-02 - 1.067038823886727e-02 - 1.064482129354728e-02 - 1.061931513219808e-02 - 1.059386961330933e-02 - 1.056848458681972e-02 - 1.054315990640127e-02 - 1.051789543133304e-02 - 1.049269102209236e-02 - 1.046754653920045e-02 - 1.044246184044743e-02 - 1.041743677288729e-02 - 1.039247119540387e-02 - 1.036756497988909e-02 - 1.034271797805630e-02 - 1.031793004647734e-02 - 1.029320105343422e-02 - 1.026853085073464e-02 - 1.024391929539164e-02 - 1.021936625852857e-02 - 1.019487159885800e-02 - 1.017043517132599e-02 - 1.014605683522427e-02 - 1.012173646293816e-02 - 1.009747392058842e-02 - 1.007326905588179e-02 - 1.004912173629082e-02 - 1.002503183346208e-02 - 1.000099920653610e-02 - 9.977023717087764e-03 - 9.953105229386335e-03 - 9.929243608872406e-03 - 9.905438720973011e-03 - 9.881690430827046e-03 - 9.857998603258316e-03 - 9.834363104786413e-03 - 9.810783802355094e-03 - 9.787260560990621e-03 - 9.763793247942843e-03 - 9.740381731591760e-03 - 9.717025877967826e-03 - 9.693725554510663e-03 - 9.670480630152000e-03 - 9.647290973567844e-03 - 9.624156453317901e-03 - 9.601076938062841e-03 - 9.578052297039983e-03 - 9.555082399653962e-03 - 9.532167115690399e-03 - 9.509306316445141e-03 - 9.486499872512266e-03 - 9.463747653553711e-03 - 9.441049530896879e-03 - 9.418405376662433e-03 - 9.395815063104617e-03 - 9.373278461427175e-03 - 9.350795443499088e-03 - 9.328365882617906e-03 - 9.305989651970981e-03 - 9.283666624824176e-03 - 9.261396674723778e-03 - 9.239179675408710e-03 - 9.217015500757821e-03 - 9.194904024947497e-03 - 9.172845123632957e-03 - 9.150838672277813e-03 - 9.128884544858834e-03 - 9.106982617538152e-03 - 9.085132766987650e-03 - 9.063334868396023e-03 - 9.041588798714301e-03 - 9.019894435479832e-03 - 8.998251654894885e-03 - 8.976660334271958e-03 - 8.955120351755344e-03 - 8.933631585369030e-03 - 8.912193913264732e-03 - 8.890807213885918e-03 - 8.869471366214972e-03 - 8.848186249259440e-03 - 8.826951742251321e-03 - 8.805767725383001e-03 - 8.784634078744540e-03 - 8.763550682317645e-03 - 8.742517416743529e-03 - 8.721534162832835e-03 - 8.700600801502468e-03 - 8.679717214101214e-03 - 8.658883282492529e-03 - 8.638098888885700e-03 - 8.617363915025602e-03 - 8.596678243443276e-03 - 8.576041757693640e-03 - 8.555454340593486e-03 - 8.534915875110577e-03 - 8.514426244844865e-03 - 8.493985333674233e-03 - 8.473593025909724e-03 - 8.453249206335058e-03 - 8.432953759374154e-03 - 8.412706569850796e-03 - 8.392507523503252e-03 - 8.372356505624580e-03 - 8.352253401838657e-03 - 8.332198098800467e-03 - 8.312190482450988e-03 - 8.292230438871008e-03 - 8.272317855399050e-03 - 8.252452619663047e-03 - 8.232634619050869e-03 - 8.212863740331295e-03 - 8.193139871755427e-03 - 8.173462902270600e-03 - 8.153832719956143e-03 - 8.134249213438031e-03 - 8.114712271802299e-03 - 8.095221784035302e-03 - 8.075777639824947e-03 - 8.056379729417138e-03 - 8.037027942938956e-03 - 8.017722170154111e-03 - 7.998462301028743e-03 - 7.979248227381455e-03 - 7.960079840401237e-03 - 7.940957030626293e-03 - 7.921879690329333e-03 - 7.902847711453821e-03 - 7.883860985421759e-03 - 7.864919405368889e-03 - 7.846022864037674e-03 - 7.827171253341911e-03 - 7.808364466777525e-03 - 7.789602397948123e-03 - 7.770884940051978e-03 - 7.752211987488857e-03 - 7.733583434567862e-03 - 7.714999174963997e-03 - 7.696459103766686e-03 - 7.677963116338556e-03 - 7.659511107448910e-03 - 7.641102971817726e-03 - 7.622738605046243e-03 - 7.604417904226960e-03 - 7.586140765207791e-03 - 7.567907083543369e-03 - 7.549716755813157e-03 - 7.531569679511053e-03 - 7.513465752109027e-03 - 7.495404870064185e-03 - 7.477386931039745e-03 - 7.459411833357052e-03 - 7.441479474804043e-03 - 7.423589753808636e-03 - 7.405742569108545e-03 - 7.387937818890154e-03 - 7.370175402616828e-03 - 7.352455220325825e-03 - 7.334777170378787e-03 - 7.317141152312192e-03 - 7.299547066866589e-03 - 7.281994814230038e-03 - 7.264484294760120e-03 - 7.247015409129196e-03 - 7.229588058070396e-03 - 7.212202142721502e-03 - 7.194857564639825e-03 - 7.177554225359851e-03 - 7.160292026920549e-03 - 7.143070871828701e-03 - 7.125890661781023e-03 - 7.108751299151369e-03 - 7.091652687463649e-03 - 7.074594729473165e-03 - 7.057577328092346e-03 - 7.040600386920140e-03 - 7.023663809440293e-03 - 7.006767499621119e-03 - 6.989911362283671e-03 - 6.973095301761098e-03 - 6.956319222246642e-03 - 6.939583028242014e-03 - 6.922886624933184e-03 - 6.906229917977133e-03 - 6.889612813237578e-03 - 6.873035215956658e-03 - 6.856497031627250e-03 - 6.839998167124653e-03 - 6.823538528849983e-03 - 6.807118022950776e-03 - 6.790736556102037e-03 - 6.774394036012678e-03 - 6.758090370503938e-03 - 6.741825465874382e-03 - 6.725599229831710e-03 - 6.709411571076730e-03 - 6.693262397262002e-03 - 6.677151616823099e-03 - 6.661079138883049e-03 - 6.645044871881905e-03 - 6.629048724424302e-03 - 6.613090605727208e-03 - 6.597170426169362e-03 - 6.581288095176429e-03 - 6.565443521393368e-03 - 6.549636616015259e-03 - 6.533867289690503e-03 - 6.518135451870410e-03 - 6.502441013826720e-03 - 6.486783886693610e-03 - 6.471163980906190e-03 - 6.455581208648475e-03 - 6.440035481784445e-03 - 6.424526710952946e-03 - 6.409054808194274e-03 - 6.393619686148648e-03 - 6.378221257389647e-03 - 6.362859434216829e-03 - 6.347534129405275e-03 - 6.332245256702231e-03 - 6.316992728926398e-03 - 6.301776458848883e-03 - 6.286596360249587e-03 - 6.271452347303485e-03 - 6.256344334335297e-03 - 6.241272235637497e-03 - 6.226235965289892e-03 - 6.211235437617355e-03 - 6.196270567881593e-03 - 6.181341271239764e-03 - 6.166447462747857e-03 - 6.151589057705613e-03 - 6.136765971896623e-03 - 6.121978121401951e-03 - 6.107225422158738e-03 - 6.092507790132517e-03 - 6.077825141615326e-03 - 6.063177393866219e-03 - 6.048564463915550e-03 - 6.033986268442907e-03 - 6.019442724444331e-03 - 6.004933749322879e-03 - 5.990459260846786e-03 - 5.976019176895193e-03 - 5.961613415583682e-03 - 5.947241895231883e-03 - 5.932904533953020e-03 - 5.918601250164555e-03 - 5.904331962789744e-03 - 5.890096590861083e-03 - 5.875895053571317e-03 - 5.861727270328322e-03 - 5.847593160694864e-03 - 5.833492644473149e-03 - 5.819425641715960e-03 - 5.805392072163253e-03 - 5.791391855962741e-03 - 5.777424914193254e-03 - 5.763491167389796e-03 - 5.749590536018355e-03 - 5.735722941127108e-03 - 5.721888304505554e-03 - 5.708086547766434e-03 - 5.694317591457392e-03 - 5.680581357894303e-03 - 5.666877769868901e-03 - 5.653206748498332e-03 - 5.639568216215936e-03 - 5.625962096156960e-03 - 5.612388310444156e-03 - 5.598846782244085e-03 - 5.585337435180374e-03 - 5.571860191464977e-03 - 5.558414974887664e-03 - 5.545001710146245e-03 - 5.531620319651646e-03 - 5.518270727342278e-03 - 5.504952858629092e-03 - 5.491666637149790e-03 - 5.478411987013346e-03 - 5.465188833301630e-03 - 5.451997101098349e-03 - 5.438836715460566e-03 - 5.425707601454353e-03 - 5.412609684284744e-03 - 5.399542889597323e-03 - 5.386507143481766e-03 - 5.373502371672819e-03 - 5.360528500347250e-03 - 5.347585456320476e-03 - 5.334673165238440e-03 - 5.321791553290573e-03 - 5.308940548233661e-03 - 5.296120077396591e-03 - 5.283330067535706e-03 - 5.270570445063373e-03 - 5.257841138170363e-03 - 5.245142075198895e-03 - 5.232473183108559e-03 - 5.219834389656078e-03 - 5.207225623450342e-03 - 5.194646813662877e-03 - 5.182097888019903e-03 - 5.169578774433769e-03 - 5.157089403379224e-03 - 5.144629703265777e-03 - 5.132199601938705e-03 - 5.119799030212023e-03 - 5.107427917986021e-03 - 5.095086194230444e-03 - 5.082773788422456e-03 - 5.070490630851877e-03 - 5.058236652191947e-03 - 5.046011782411770e-03 - 5.033815952050060e-03 - 5.021649092096963e-03 - 5.009511132708167e-03 - 4.997402004872952e-03 - 4.985321640554899e-03 - 4.973269971256597e-03 - 4.961246927915243e-03 - 4.949252441362114e-03 - 4.937286444284467e-03 - 4.925348869112448e-03 - 4.913439647407981e-03 - 4.901558711796497e-03 - 4.889705994683389e-03 - 4.877881427891544e-03 - 4.866084944974813e-03 - 4.854316479151838e-03 - 4.842575962313763e-03 - 4.830863328342665e-03 - 4.819178511323663e-03 - 4.807521444209243e-03 - 4.795892060902922e-03 - 4.784290295384500e-03 - 4.772716080911616e-03 - 4.761169351999607e-03 - 4.749650043687660e-03 - 4.738158090505544e-03 - 4.726693426328077e-03 - 4.715255985490762e-03 - 4.703845704177584e-03 - 4.692462517255530e-03 - 4.681106359266913e-03 - 4.669777166671382e-03 - 4.658474874679097e-03 - 4.647199418051047e-03 - 4.635950733693824e-03 - 4.624728757814554e-03 - 4.613533426035275e-03 - 4.602364675085555e-03 - 4.591222441193854e-03 - 4.580106660340010e-03 - 4.569017270133631e-03 - 4.557954207729684e-03 - 4.546917409606468e-03 - 4.535906813063030e-03 - 4.524922355662980e-03 - 4.513963975024341e-03 - 4.503031608847450e-03 - 4.492125194604706e-03 - 4.481244669721014e-03 - 4.470389973075004e-03 - 4.459561043403103e-03 - 4.448757818627942e-03 - 4.437980237157132e-03 - 4.427228237584914e-03 - 4.416501758569245e-03 - 4.405800739475310e-03 - 4.395125119625431e-03 - 4.384474837838549e-03 - 4.373849833628650e-03 - 4.363250046735974e-03 - 4.352675416676511e-03 - 4.342125883231542e-03 - 4.331601386396421e-03 - 4.321101866314548e-03 - 4.310627263408189e-03 - 4.300177518182486e-03 - 4.289752570999768e-03 - 4.279352362569397e-03 - 4.268976833692708e-03 - 4.258625924837488e-03 - 4.248299577436886e-03 - 4.237997733292803e-03 - 4.227720333115902e-03 - 4.217467318344088e-03 - 4.207238631130676e-03 - 4.197034213451204e-03 - 4.186854006892898e-03 - 4.176697952964437e-03 - 4.166565994071401e-03 - 4.156458073034852e-03 - 4.146374132669977e-03 - 4.136314114934178e-03 - 4.126277962231265e-03 - 4.116265617785051e-03 - 4.106277025130100e-03 - 4.096312127225507e-03 - 4.086370866498099e-03 - 4.076453186851077e-03 - 4.066559032318193e-03 - 4.056688346384167e-03 - 4.046841072375552e-03 - 4.037017154234894e-03 - 4.027216536753351e-03 - 4.017439163691562e-03 - 4.007684978984143e-03 - 3.997953927616382e-03 - 3.988245954341580e-03 - 3.978561003853811e-03 - 3.968899020987378e-03 - 3.959259950174110e-03 - 3.949643736363211e-03 - 3.940050325917084e-03 - 3.930479663940112e-03 - 3.920931695287086e-03 - 3.911406366153988e-03 - 3.901903622192779e-03 - 3.892423408886956e-03 - 3.882965672529350e-03 - 3.873530359308857e-03 - 3.864117415340676e-03 - 3.854726787040829e-03 - 3.845358421069152e-03 - 3.836012264203419e-03 - 3.826688263119290e-03 - 3.817386364639579e-03 - 3.808106515834866e-03 - 3.798848664119608e-03 - 3.789612756624806e-03 - 3.780398740246358e-03 - 3.771206562411011e-03 - 3.762036171140922e-03 - 3.752887514765301e-03 - 3.743760540740341e-03 - 3.734655196719529e-03 - 3.725571430980986e-03 - 3.716509192135922e-03 - 3.707468428387338e-03 - 3.698449087559120e-03 - 3.689451119263604e-03 - 3.680474472533827e-03 - 3.671519094850921e-03 - 3.662584935894309e-03 - 3.653671945297336e-03 - 3.644780071212910e-03 - 3.635909263417586e-03 - 3.627059471971036e-03 - 3.618230645951014e-03 - 3.609422734605362e-03 - 3.600635687799489e-03 - 3.591869456282116e-03 - 3.583123989955615e-03 - 3.574399238584414e-03 - 3.565695152845392e-03 - 3.557011682930304e-03 - 3.548348778903569e-03 - 3.539706391532652e-03 - 3.531084471778191e-03 - 3.522482970666699e-03 - 3.513901839239252e-03 - 3.505341028388093e-03 - 3.496800489111114e-03 - 3.488280173119797e-03 - 3.479780031892506e-03 - 3.471300016604386e-03 - 3.462840078578430e-03 - 3.454400170006921e-03 - 3.445980243580072e-03 - 3.437580250715228e-03 - 3.429200142992534e-03 - 3.420839872683964e-03 - 3.412499392748279e-03 - 3.404178655562702e-03 - 3.395877612913789e-03 - 3.387596218304602e-03 - 3.379334424898988e-03 - 3.371092184764359e-03 - 3.362869450661228e-03 - 3.354666175991870e-03 - 3.346482314543412e-03 - 3.338317819175880e-03 - 3.330172642972068e-03 - 3.322046740007612e-03 - 3.313940064235304e-03 - 3.305852569386344e-03 - 3.297784208976364e-03 - 3.289734936574093e-03 - 3.281704706272533e-03 - 3.273693473070924e-03 - 3.265701191257636e-03 - 3.257727814803984e-03 - 3.249773298074863e-03 - 3.241837595979994e-03 - 3.233920663596386e-03 - 3.226022455622204e-03 - 3.218142926555998e-03 - 3.210282031163023e-03 - 3.202439725215123e-03 - 3.194615964134223e-03 - 3.186810703067027e-03 - 3.179023897602838e-03 - 3.171255503398923e-03 - 3.163505475998486e-03 - 3.155773770652277e-03 - 3.148060343553685e-03 - 3.140365151430291e-03 - 3.132688149313277e-03 - 3.125029293443853e-03 - 3.117388541383308e-03 - 3.109765848736372e-03 - 3.102161171408776e-03 - 3.094574466373093e-03 - 3.087005690728782e-03 - 3.079454801280003e-03 - 3.071921754555924e-03 - 3.064406507880629e-03 - 3.056909018530570e-03 - 3.049429243338136e-03 - 3.041967139485151e-03 - 3.034522664377966e-03 - 3.027095775562892e-03 - 3.019686430816400e-03 - 3.012294588055786e-03 - 3.004920205212209e-03 - 2.997563239705405e-03 - 2.990223649173174e-03 - 2.982901392198357e-03 - 2.975596427311395e-03 - 2.968308712822513e-03 - 2.961038206776656e-03 - 2.953784867392937e-03 - 2.946548653201694e-03 - 2.939329523194637e-03 - 2.932127436582907e-03 - 2.924942352269057e-03 - 2.917774228121468e-03 - 2.910623023643702e-03 - 2.903488699056754e-03 - 2.896371212514376e-03 - 2.889270523304112e-03 - 2.882186591679052e-03 - 2.875119376658924e-03 - 2.868068837676741e-03 - 2.861034934776638e-03 - 2.854017627809473e-03 - 2.847016876513213e-03 - 2.840032640686938e-03 - 2.833064880681456e-03 - 2.826113557103426e-03 - 2.819178630449384e-03 - 2.812260060105674e-03 - 2.805357806481411e-03 - 2.798471831428214e-03 - 2.791602094948384e-03 - 2.784748557109701e-03 - 2.777911179108391e-03 - 2.771089922400815e-03 - 2.764284748007964e-03 - 2.757495616304825e-03 - 2.750722488782177e-03 - 2.743965327115693e-03 - 2.737224092409578e-03 - 2.730498746008289e-03 - 2.723789249648372e-03 - 2.717095565426717e-03 - 2.710417654358784e-03 - 2.703755477800617e-03 - 2.697108999073383e-03 - 2.690478179939920e-03 - 2.683862981660020e-03 - 2.677263366970269e-03 - 2.670679298051182e-03 - 2.664110736894467e-03 - 2.657557646411518e-03 - 2.651019989061974e-03 - 2.644497727126834e-03 - 2.637990823748049e-03 - 2.631499241776077e-03 - 2.625022943767310e-03 - 2.618561892619121e-03 - 2.612116051581085e-03 - 2.605685383984310e-03 - 2.599269852507916e-03 - 2.592869420565223e-03 - 2.586484052278204e-03 - 2.580113710814501e-03 - 2.573758359383719e-03 - 2.567417961609419e-03 - 2.561092481362380e-03 - 2.554781882413309e-03 - 2.548486128464411e-03 - 2.542205184036424e-03 - 2.535939013422343e-03 - 2.529687580238901e-03 - 2.523450848436006e-03 - 2.517228782352248e-03 - 2.511021346720505e-03 - 2.504828506444104e-03 - 2.498650225958320e-03 - 2.492486468967693e-03 - 2.486337200680032e-03 - 2.480202386472821e-03 - 2.474081990653096e-03 - 2.467975978460781e-03 - 2.461884315215007e-03 - 2.455806965243642e-03 - 2.449743893777428e-03 - 2.443695066608286e-03 - 2.437660449328877e-03 - 2.431640007119714e-03 - 2.425633705211946e-03 - 2.419641509634817e-03 - 2.413663385966202e-03 - 2.407699299632079e-03 - 2.401749216909934e-03 - 2.395813103777745e-03 - 2.389890925926915e-03 - 2.383982649399740e-03 - 2.378088240561300e-03 - 2.372207665865560e-03 - 2.366340891258303e-03 - 2.360487883037754e-03 - 2.354648608018378e-03 - 2.348823033118129e-03 - 2.343011124539103e-03 - 2.337212848054228e-03 - 2.331428171390765e-03 - 2.325657062040943e-03 - 2.319899486412222e-03 - 2.314155410784699e-03 - 2.308424802407836e-03 - 2.302707629600105e-03 - 2.297003858807791e-03 - 2.291313456815245e-03 - 2.285636391934661e-03 - 2.279972631361444e-03 - 2.274322142294874e-03 - 2.268684892803898e-03 - 2.263060850445441e-03 - 2.257449982675230e-03 - 2.251852257331842e-03 - 2.246267642469826e-03 - 2.240696106224612e-03 - 2.235137616698782e-03 - 2.229592141925271e-03 - 2.224059650030012e-03 - 2.218540109447705e-03 - 2.213033488566449e-03 - 2.207539755750870e-03 - 2.202058879448589e-03 - 2.196590827868759e-03 - 2.191135569406817e-03 - 2.185693073538250e-03 - 2.180263309295804e-03 - 2.174846245146934e-03 - 2.169441849486111e-03 - 2.164050091629877e-03 - 2.158670941358884e-03 - 2.153304367034930e-03 - 2.147950337590323e-03 - 2.142608822828710e-03 - 2.137279792340324e-03 - 2.131963215445541e-03 - 2.126659061301170e-03 - 2.121367299363035e-03 - 2.116087899310018e-03 - 2.110820830985273e-03 - 2.105566064252215e-03 - 2.100323568822542e-03 - 2.095093314356113e-03 - 2.089875271479949e-03 - 2.084669410319118e-03 - 2.079475699908646e-03 - 2.074294110902819e-03 - 2.069124614088778e-03 - 2.063967179294363e-03 - 2.058821776747180e-03 - 2.053688376991423e-03 - 2.048566950718572e-03 - 2.043457468582260e-03 - 2.038359901240009e-03 - 2.033274219398007e-03 - 2.028200393563254e-03 - 2.023138394473247e-03 - 2.018088193625467e-03 - 2.013049761808302e-03 - 2.008023069533293e-03 - 2.003008088023720e-03 - 1.998004788922133e-03 - 1.993013143739461e-03 - 1.988033123025423e-03 - 1.983064698401174e-03 - 1.978107841939004e-03 - 1.973162523959716e-03 - 1.968228716337500e-03 - 1.963306391971906e-03 - 1.958395521239848e-03 - 1.953496075620802e-03 - 1.948608028019931e-03 - 1.943731350228688e-03 - 1.938866013789267e-03 - 1.934011990485791e-03 - 1.929169252901841e-03 - 1.924337773155020e-03 - 1.919517522737516e-03 - 1.914708474346116e-03 - 1.909910600724645e-03 - 1.905123874118434e-03 - 1.900348266781407e-03 - 1.895583751238830e-03 - 1.890830300301618e-03 - 1.886087886140893e-03 - 1.881356481302734e-03 - 1.876636059328014e-03 - 1.871926593048255e-03 - 1.867228054886164e-03 - 1.862540417322874e-03 - 1.857863653843670e-03 - 1.853197738035545e-03 - 1.848542642643349e-03 - 1.843898340659710e-03 - 1.839264805482605e-03 - 1.834642010884087e-03 - 1.830029929675155e-03 - 1.825428534756660e-03 - 1.820837800826725e-03 - 1.816257700994342e-03 - 1.811688207883416e-03 - 1.807129296515363e-03 - 1.802580940478343e-03 - 1.798043112569654e-03 - 1.793515787775185e-03 - 1.788998939681262e-03 - 1.784492541016137e-03 - 1.779996567290557e-03 - 1.775510992946437e-03 - 1.771035790955467e-03 - 1.766570935188881e-03 - 1.762116400368900e-03 - 1.757672161650980e-03 - 1.753238193179788e-03 - 1.748814468721301e-03 - 1.744400962234815e-03 - 1.739997649147064e-03 - 1.735604504535336e-03 - 1.731221502449809e-03 - 1.726848617398671e-03 - 1.722485824273258e-03 - 1.718133098140551e-03 - 1.713790413411143e-03 - 1.709457744960287e-03 - 1.705135068710917e-03 - 1.700822359316501e-03 - 1.696519591326764e-03 - 1.692226740206531e-03 - 1.687943780998710e-03 - 1.683670689031842e-03 - 1.679407440586236e-03 - 1.675154010255336e-03 - 1.670910372590760e-03 - 1.666676504276520e-03 - 1.662452380680008e-03 - 1.658237976786625e-03 - 1.654033269138933e-03 - 1.649838233189823e-03 - 1.645652843894769e-03 - 1.641477077483747e-03 - 1.637310910181093e-03 - 1.633154317979306e-03 - 1.629007276710043e-03 - 1.624869761977525e-03 - 1.620741749539434e-03 - 1.616623216289868e-03 - 1.612514138626602e-03 - 1.608414492386588e-03 - 1.604324254066237e-03 - 1.600243399893093e-03 - 1.596171905775712e-03 - 1.592109748332882e-03 - 1.588056904380057e-03 - 1.584013350591343e-03 - 1.579979063015354e-03 - 1.575954018417919e-03 - 1.571938194458784e-03 - 1.567931567017785e-03 - 1.563934112240304e-03 - 1.559945807641685e-03 - 1.555966630779868e-03 - 1.551996558434039e-03 - 1.548035566441649e-03 - 1.544083632647983e-03 - 1.540140734902817e-03 - 1.536206849423688e-03 - 1.532281953055403e-03 - 1.528366023373284e-03 - 1.524459038476067e-03 - 1.520560975283225e-03 - 1.516671810636623e-03 - 1.512791522697568e-03 - 1.508920088807869e-03 - 1.505057486015793e-03 - 1.501203692209861e-03 - 1.497358685322736e-03 - 1.493522443062933e-03 - 1.489694942724099e-03 - 1.485876162194853e-03 - 1.482066079697174e-03 - 1.478264672890618e-03 - 1.474471919644568e-03 - 1.470687798121700e-03 - 1.466912286519041e-03 - 1.463145362594138e-03 - 1.459387003990816e-03 - 1.455637189563730e-03 - 1.451895897787254e-03 - 1.448163106500405e-03 - 1.444438793947980e-03 - 1.440722938760434e-03 - 1.437015519703072e-03 - 1.433316514691718e-03 - 1.429625901910583e-03 - 1.425943660193772e-03 - 1.422269768088744e-03 - 1.418604204318803e-03 - 1.414946947952337e-03 - 1.411297977567125e-03 - 1.407657271824714e-03 - 1.404024809794961e-03 - 1.400400570139807e-03 - 1.396784531434119e-03 - 1.393176672533590e-03 - 1.389576972970703e-03 - 1.385985412235932e-03 - 1.382401969107074e-03 - 1.378826622443783e-03 - 1.375259351219489e-03 - 1.371700134514839e-03 - 1.368148952079336e-03 - 1.364605783757036e-03 - 1.361070608632290e-03 - 1.357543405835987e-03 - 1.354024154621594e-03 - 1.350512834317403e-03 - 1.347009424934256e-03 - 1.343513906652181e-03 - 1.340026258589547e-03 - 1.336546459739890e-03 - 1.333074489680093e-03 - 1.329610329681042e-03 - 1.326153959375566e-03 - 1.322705357081586e-03 - 1.319264503327096e-03 - 1.315831378649060e-03 - 1.312405962942001e-03 - 1.308988235813027e-03 - 1.305578177302038e-03 - 1.302175767936687e-03 - 1.298780987783750e-03 - 1.295393816813521e-03 - 1.292014235092867e-03 - 1.288642222828844e-03 - 1.285277760581296e-03 - 1.281920829182064e-03 - 1.278571408463430e-03 - 1.275229478684235e-03 - 1.271895021211065e-03 - 1.268568016022571e-03 - 1.265248443161927e-03 - 1.261936283866222e-03 - 1.258631518851812e-03 - 1.255334128626978e-03 - 1.252044093890807e-03 - 1.248761395151665e-03 - 1.245486013113075e-03 - 1.242217929129610e-03 - 1.238957124307338e-03 - 1.235703579418827e-03 - 1.232457274959363e-03 - 1.229218191838193e-03 - 1.225986311430220e-03 - 1.222761615473843e-03 - 1.219544084856006e-03 - 1.216333699988417e-03 - 1.213130441964228e-03 - 1.209934292565758e-03 - 1.206745233676102e-03 - 1.203563245963205e-03 - 1.200388310525061e-03 - 1.197220409053557e-03 - 1.194059523052293e-03 - 1.190905633902454e-03 - 1.187758723052301e-03 - 1.184618772531461e-03 - 1.181485763720917e-03 - 1.178359677471923e-03 - 1.175240496495629e-03 - 1.172128202790389e-03 - 1.169022777016151e-03 - 1.165924201427151e-03 - 1.162832457974330e-03 - 1.159747527667428e-03 - 1.156669393342115e-03 - 1.153598037513975e-03 - 1.150533441195656e-03 - 1.147475586343000e-03 - 1.144424455192698e-03 - 1.141380029693999e-03 - 1.138342292070108e-03 - 1.135311224784675e-03 - 1.132286810371483e-03 - 1.129269030382949e-03 - 1.126257866687504e-03 - 1.123253302806332e-03 - 1.120255320585528e-03 - 1.117263901594027e-03 - 1.114279029333705e-03 - 1.111300685926414e-03 - 1.108328853214485e-03 - 1.105363515126287e-03 - 1.102404653695880e-03 - 1.099452250276090e-03 - 1.096506289065756e-03 - 1.093566752790314e-03 - 1.090633622975802e-03 - 1.087706882683815e-03 - 1.084786514992603e-03 - 1.081872502714538e-03 - 1.078964828755093e-03 - 1.076063476054719e-03 - 1.073168427526746e-03 - 1.070279665938792e-03 - 1.067397174442816e-03 - 1.064520936417689e-03 - 1.061650934087830e-03 - 1.058787150577005e-03 - 1.055929570192933e-03 - 1.053078175257412e-03 - 1.050232948596978e-03 - 1.047393874491941e-03 - 1.044560935952646e-03 - 1.041734115621369e-03 - 1.038913396581877e-03 - 1.036098763274602e-03 - 1.033290199394467e-03 - 1.030487686748966e-03 - 1.027691209748195e-03 - 1.024900752824401e-03 - 1.022116298137994e-03 - 1.019337829638554e-03 - 1.016565331581354e-03 - 1.013798786681050e-03 - 1.011038178744547e-03 - 1.008283492069452e-03 - 1.005534710312413e-03 - 1.002791817167788e-03 - 1.000054796401326e-03 - 9.973236317525795e-04 - 9.945983071579347e-04 - 9.918788066535795e-04 - 9.891651141399331e-04 - 9.864572135795289e-04 - 9.837550890187182e-04 - 9.810587245440681e-04 - 9.783681042165289e-04 - 9.756832121036981e-04 - 9.730040324093254e-04 - 9.703305493295432e-04 - 9.676627470403841e-04 - 9.650006098016114e-04 - 9.623441219373007e-04 - 9.596932677964791e-04 - 9.570480316324495e-04 - 9.544083978205768e-04 - 9.517743508934125e-04 - 9.491458752396962e-04 - 9.465229553012878e-04 - 9.439055756501852e-04 - 9.412937207895038e-04 - 9.386873752809525e-04 - 9.360865238076440e-04 - 9.334911509791107e-04 - 9.309012414140627e-04 - 9.283167798171848e-04 - 9.257377509839119e-04 - 9.231641396993918e-04 - 9.205959306774516e-04 - 9.180331088080401e-04 - 9.154756590138127e-04 - 9.129235660962607e-04 - 9.103768149701878e-04 - 9.078353906321772e-04 - 9.052992780955343e-04 - 9.027684623946166e-04 - 9.002429285800444e-04 - 8.977226617159664e-04 - 8.952076469091944e-04 - 8.926978693026045e-04 - 8.901933140640126e-04 - 8.876939664445818e-04 - 8.851998117353022e-04 - 8.827108351548252e-04 - 8.802270219825557e-04 - 8.777483575705740e-04 - 8.752748272927118e-04 - 8.728064165680979e-04 - 8.703431108522175e-04 - 8.678848955854838e-04 - 8.654317562117358e-04 - 8.629836782258149e-04 - 8.605406473168484e-04 - 8.581026490766350e-04 - 8.556696689660546e-04 - 8.532416927295966e-04 - 8.508187061075220e-04 - 8.484006947265324e-04 - 8.459876443379812e-04 - 8.435795407180884e-04 - 8.411763696276702e-04 - 8.387781169670006e-04 - 8.363847686436173e-04 - 8.339963104952486e-04 - 8.316127284703911e-04 - 8.292340085393665e-04 - 8.268601366269382e-04 - 8.244910987818749e-04 - 8.221268810991789e-04 - 8.197674696351961e-04 - 8.174128504795555e-04 - 8.150630097863373e-04 - 8.127179337987174e-04 - 8.103776086785577e-04 - 8.080420206116735e-04 - 8.057111559859151e-04 - 8.033850010442538e-04 - 8.010635420033148e-04 - 7.987467653572807e-04 - 7.964346575211490e-04 - 7.941272048473775e-04 - 7.918243938145987e-04 - 7.895262109139402e-04 - 7.872326426395918e-04 - 7.849436755404454e-04 - 7.826592961986925e-04 - 7.803794912312032e-04 - 7.781042473133076e-04 - 7.758335511109105e-04 - 7.735673892815593e-04 - 7.713057485643111e-04 - 7.690486157536814e-04 - 7.667959776727836e-04 - 7.645478211004869e-04 - 7.623041328912646e-04 - 7.600649000053854e-04 - 7.578301093264215e-04 - 7.555997477583347e-04 - 7.533738022910566e-04 - 7.511522599897612e-04 - 7.489351079282785e-04 - 7.467223331578882e-04 - 7.445139227962291e-04 - 7.423098639775247e-04 - 7.401101438263767e-04 - 7.379147496119391e-04 - 7.357236686066337e-04 - 7.335368879604144e-04 - 7.313543950177981e-04 - 7.291761771981462e-04 - 7.270022218267318e-04 - 7.248325162821272e-04 - 7.226670479949025e-04 - 7.205058044241288e-04 - 7.183487730730944e-04 - 7.161959414766152e-04 - 7.140472971809699e-04 - 7.119028277561113e-04 - 7.097625208231147e-04 - 7.076263641063239e-04 - 7.054943452576004e-04 - 7.033664519218169e-04 - 7.012426719956601e-04 - 6.991229932510109e-04 - 6.970074033540157e-04 - 6.948958902400331e-04 - 6.927884418689321e-04 - 6.906850461485944e-04 - 6.885856909689247e-04 - 6.864903643067344e-04 - 6.843990542306164e-04 - 6.823117487354689e-04 - 6.802284359113009e-04 - 6.781491039842488e-04 - 6.760737410664455e-04 - 6.740023352773578e-04 - 6.719348748282754e-04 - 6.698713480434448e-04 - 6.678117432465053e-04 - 6.657560487034911e-04 - 6.637042527655789e-04 - 6.616563438432147e-04 - 6.596123103782944e-04 - 6.575721408025738e-04 - 6.555358236048545e-04 - 6.535033473936704e-04 - 6.514747007198682e-04 - 6.494498721244171e-04 - 6.474288502266283e-04 - 6.454116237722280e-04 - 6.433981815196293e-04 - 6.413885120963034e-04 - 6.393826043225120e-04 - 6.373804471016686e-04 - 6.353820291728463e-04 - 6.333873394523912e-04 - 6.313963669651093e-04 - 6.294091005879305e-04 - 6.274255292885601e-04 - 6.254456421348147e-04 - 6.234694281911996e-04 - 6.214968766042923e-04 - 6.195279765738893e-04 - 6.175627172048796e-04 - 6.156010877068991e-04 - 6.136430774102346e-04 - 6.116886755862946e-04 - 6.097378715435904e-04 - 6.077906546697107e-04 - 6.058470144286753e-04 - 6.039069402835228e-04 - 6.019704216802507e-04 - 6.000374481409778e-04 - 5.981080092530985e-04 - 5.961820946588096e-04 - 5.942596940083503e-04 - 5.923407969721301e-04 - 5.904253932616448e-04 - 5.885134726736782e-04 - 5.866050250202793e-04 - 5.847000400980857e-04 - 5.827985078791194e-04 - 5.809004183470366e-04 - 5.790057613579966e-04 - 5.771145269606196e-04 - 5.752267052829598e-04 - 5.733422863841403e-04 - 5.714612604000550e-04 - 5.695836175305099e-04 - 5.677093480037018e-04 - 5.658384420678564e-04 - 5.639708900266142e-04 - 5.621066823022896e-04 - 5.602458092869138e-04 - 5.583882613744714e-04 - 5.565340290827777e-04 - 5.546831029664671e-04 - 5.528354736013446e-04 - 5.509911316015094e-04 - 5.491500676402182e-04 - 5.473122724461832e-04 - 5.454777367810608e-04 - 5.436464514412940e-04 - 5.418184072613321e-04 - 5.399935951226492e-04 - 5.381720060069473e-04 - 5.363536309736959e-04 - 5.345384609776805e-04 - 5.327264870731968e-04 - 5.309177004752346e-04 - 5.291120923593077e-04 - 5.273096539494221e-04 - 5.255103765544823e-04 - 5.237142514407170e-04 - 5.219212699733492e-04 - 5.201314236865307e-04 - 5.183447040146093e-04 - 5.165611024246747e-04 - 5.147806105331874e-04 - 5.130032200114061e-04 - 5.112289225530487e-04 - 5.094577098620987e-04 - 5.076895736854020e-04 - 5.059245058583464e-04 - 5.041624983517820e-04 - 5.024035430839573e-04 - 5.006476319990773e-04 - 4.988947572035529e-04 - 4.971449107942239e-04 - 4.953980848818115e-04 - 4.936542716805855e-04 - 4.919134634956966e-04 - 4.901756526846954e-04 - 4.884408316006080e-04 - 4.867089926403434e-04 - 4.849801282731475e-04 - 4.832542310892493e-04 - 4.815312937309208e-04 - 4.798113088560132e-04 - 4.780942690954599e-04 - 4.763801672259719e-04 - 4.746689961731605e-04 - 4.729607488395965e-04 - 4.712554181333483e-04 - 4.695529970142063e-04 - 4.678534786182833e-04 - 4.661568561056742e-04 - 4.644631226216267e-04 - 4.627722714285577e-04 - 4.610842958399921e-04 - 4.593991892076899e-04 - 4.577169450300335e-04 - 4.560375568336446e-04 - 4.543610181249096e-04 - 4.526873225594637e-04 - 4.510164638467393e-04 - 4.493484356950898e-04 - 4.476832319569833e-04 - 4.460208465382815e-04 - 4.443612733350173e-04 - 4.427045064285867e-04 - 4.410505399510805e-04 - 4.393993679504339e-04 - 4.377509846774214e-04 - 4.361053844834223e-04 - 4.344625616662297e-04 - 4.328225106365193e-04 - 4.311852259097922e-04 - 4.295507020701359e-04 - 4.279189337521271e-04 - 4.262899156467061e-04 - 4.246636425301464e-04 - 4.230401092565931e-04 - 4.214193107478168e-04 - 4.198012419839599e-04 - 4.181858979868060e-04 - 4.165732738692198e-04 - 4.149633649793705e-04 - 4.133561665739344e-04 - 4.117516738453971e-04 - 4.101498823326724e-04 - 4.085507876181731e-04 - 4.069543852399522e-04 - 4.053606707914893e-04 - 4.037696400086752e-04 - 4.021812887746215e-04 - 4.005956129436248e-04 - 3.990126084760660e-04 - 3.974322714846641e-04 - 3.958545980293214e-04 - 3.942795842513983e-04 - 3.927072264688036e-04 - 3.911375211195356e-04 - 3.895704646516968e-04 - 3.880060534869329e-04 - 3.864442842922655e-04 - 3.848851538066537e-04 - 3.833286587063809e-04 - 3.817747958651508e-04 - 3.802235622593628e-04 - 3.786749548688228e-04 - 3.771289708205180e-04 - 3.755856073392733e-04 - 3.740448616816441e-04 - 3.725067311649692e-04 - 3.709712132043737e-04 - 3.694383053790672e-04 - 3.679080053579325e-04 - 3.663803108503057e-04 - 3.648552195606523e-04 - 3.633327293646475e-04 - 3.618128382932607e-04 - 3.602955444344858e-04 - 3.587808459078391e-04 - 3.572687408998931e-04 - 3.557592277792442e-04 - 3.542523049927096e-04 - 3.527479710408145e-04 - 3.512462245019904e-04 - 3.497470640500036e-04 - 3.482504884770882e-04 - 3.467564967437580e-04 - 3.452650877985240e-04 - 3.437762605764859e-04 - 3.422900143250168e-04 - 3.408063483640538e-04 - 3.393252619896345e-04 - 3.378467546103840e-04 - 3.363708257653936e-04 - 3.348974751341996e-04 - 3.334267024660963e-04 - 3.319585075646510e-04 - 3.304928903038992e-04 - 3.290298507212495e-04 - 3.275693889604049e-04 - 3.261115052402690e-04 - 3.246561999078441e-04 - 3.232034733603981e-04 - 3.217533259984899e-04 - 3.203057585048498e-04 - 3.188607716794152e-04 - 3.174183662346357e-04 - 3.159785430822741e-04 - 3.145413032833238e-04 - 3.131066479369465e-04 - 3.116745782136557e-04 - 3.102450954058189e-04 - 3.088182010197684e-04 - 3.073938965650610e-04 - 3.059721835802734e-04 - 3.045530637916020e-04 - 3.031365390386899e-04 - 3.017226112552691e-04 - 3.003112824793533e-04 - 2.989025548234045e-04 - 2.974964304955006e-04 - 2.960929118913988e-04 - 2.946920014422941e-04 - 2.932937016150965e-04 - 2.918980151023185e-04 - 2.905049446767149e-04 - 2.891144931550728e-04 - 2.877266634923031e-04 - 2.863414587568181e-04 - 2.849588821248430e-04 - 2.835789368717610e-04 - 2.822016263526234e-04 - 2.808269540128114e-04 - 2.794549234525530e-04 - 2.780855383858511e-04 - 2.767188026160350e-04 - 2.753547199733251e-04 - 2.739932944362576e-04 - 2.726345302253411e-04 - 2.712784314751994e-04 - 2.699250024118205e-04 - 2.685742475595017e-04 - 2.672261714415124e-04 - 2.658807786371782e-04 - 2.645380739000219e-04 - 2.631980619957597e-04 - 2.618607478073471e-04 - 2.605261365239288e-04 - 2.591942332540738e-04 - 2.578650431168888e-04 - 2.565385715181067e-04 - 2.552148239188000e-04 - 2.538938058269625e-04 - 2.525755228940477e-04 - 2.512599808919393e-04 - 2.499471856899045e-04 - 2.486371432244064e-04 - 2.473298595107682e-04 - 2.460253406646765e-04 - 2.447235929605613e-04 - 2.434246227773826e-04 - 2.421284365723855e-04 - 2.408350408491505e-04 - 2.395444422583646e-04 - 2.382566475978551e-04 - 2.369716636126905e-04 - 2.356894972066169e-04 - 2.344101555067014e-04 - 2.331336455922197e-04 - 2.318599746393059e-04 - 2.305891500038487e-04 - 2.293211790903458e-04 - 2.280560693749351e-04 - 2.267938284406659e-04 - 2.255344639796373e-04 - 2.242779837481179e-04 - 2.230243955584571e-04 - 2.217737074088738e-04 - 2.205259273750273e-04 - 2.192810635194828e-04 - 2.180391240377155e-04 - 2.168001172473318e-04 - 2.155640515683406e-04 - 2.143309354202995e-04 - 2.131007772856537e-04 - 2.118735858306198e-04 - 2.106493698084787e-04 - 2.094281380089542e-04 - 2.082098992208740e-04 - 2.069946624015073e-04 - 2.057824366286796e-04 - 2.045732309577213e-04 - 2.033670545521807e-04 - 2.021639166762670e-04 - 2.009638266139778e-04 - 1.997667937615743e-04 - 1.985728276099416e-04 - 1.973819376249420e-04 - 1.961941334186818e-04 - 1.950094247288422e-04 - 1.938278211445808e-04 - 1.926493324216112e-04 - 1.914739685443153e-04 - 1.903017394244089e-04 - 1.891326549660665e-04 - 1.879667251315557e-04 - 1.868039600691931e-04 - 1.856443699312781e-04 - 1.844879648170397e-04 - 1.833347550402995e-04 - 1.821847509305592e-04 - 1.810379627269367e-04 - 1.798944008330572e-04 - 1.787540757117569e-04 - 1.776169978023503e-04 - 1.764831776083264e-04 - 1.753526257075039e-04 - 1.742253527510645e-04 - 1.731013693254543e-04 - 1.719806860311682e-04 - 1.708633135911149e-04 - 1.697492627671219e-04 - 1.686385443331759e-04 - 1.675311690584120e-04 - 1.664271477052953e-04 - 1.653264910845736e-04 - 1.642292101438652e-04 - 1.631353157524277e-04 - 1.620448187436031e-04 - 1.609577300754615e-04 - 1.598740606888992e-04 - 1.587938214812250e-04 - 1.577170233258566e-04 - 1.566436772168694e-04 - 1.555737942159133e-04 - 1.545073851968179e-04 - 1.534444610998845e-04 - 1.523850329588589e-04 - 1.513291117056277e-04 - 1.502767082718022e-04 - 1.492278336091406e-04 - 1.481824986061289e-04 - 1.471407142013266e-04 - 1.461024913960903e-04 - 1.450678410475480e-04 - 1.440367739871709e-04 - 1.430093010797408e-04 - 1.419854331666308e-04 - 1.409651810501559e-04 - 1.399485554884026e-04 - 1.389355672434459e-04 - 1.379262270311977e-04 - 1.369205454852166e-04 - 1.359185332657421e-04 - 1.349202010239166e-04 - 1.339255593445051e-04 - 1.329346186642912e-04 - 1.319473893926901e-04 - 1.309638820305585e-04 - 1.299841069283569e-04 - 1.290080743627276e-04 - 1.280357946577360e-04 - 1.270672779908064e-04 - 1.261025344295187e-04 - 1.251415740258344e-04 - 1.241844068414831e-04 - 1.232310428585276e-04 - 1.222814917974582e-04 - 1.213357634573326e-04 - 1.203938676644921e-04 - 1.194558139769228e-04 - 1.185216119071049e-04 - 1.175912709437735e-04 - 1.166648004395201e-04 - 1.157422096820540e-04 - 1.148235078941047e-04 - 1.139087041565015e-04 - 1.129978074560730e-04 - 1.120908266963163e-04 - 1.111877706801771e-04 - 1.102886481165339e-04 - 1.093934676008822e-04 - 1.085022375478793e-04 - 1.076149663238430e-04 - 1.067316622735248e-04 - 1.058523335072715e-04 - 1.049769880021785e-04 - 1.041056336506420e-04 - 1.032382782134568e-04 - 1.023749293560659e-04 - 1.015155946454073e-04 - 1.006602814254268e-04 - 9.980899691604087e-05 - 9.896174827822380e-05 - 9.811854249648769e-05 - 9.727938640362722e-05 - 9.644428669167931e-05 - 9.561324990949941e-05 - 9.478628247235907e-05 - 9.396339064407664e-05 - 9.314458052650697e-05 - 9.232985807344924e-05 - 9.151922908266137e-05 - 9.071269919463392e-05 - 8.991027389908417e-05 - 8.911195851702552e-05 - 8.831775819982511e-05 - 8.752767793866873e-05 - 8.674172256023528e-05 - 8.595989672073575e-05 - 8.518220490590348e-05 - 8.440865141920385e-05 - 8.363924039733809e-05 - 8.287397580722622e-05 - 8.211286142104977e-05 - 8.135590084051729e-05 - 8.060309749193613e-05 - 7.985445459658365e-05 - 7.910997520302950e-05 - 7.836966218298747e-05 - 7.763351820320998e-05 - 7.690154574559998e-05 - 7.617374709914362e-05 - 7.545012436145964e-05 - 7.473067944430294e-05 - 7.401541405207780e-05 - 7.330432968888297e-05 - 7.259742767376570e-05 - 7.189470911942744e-05 - 7.119617492698978e-05 - 7.050182580949816e-05 - 6.981166227552030e-05 - 6.912568461899398e-05 - 6.844389294104750e-05 - 6.776628713300132e-05 - 6.709286687130013e-05 - 6.642363163388969e-05 - 6.575858067871575e-05 - 6.509771305493562e-05 - 6.444102761503343e-05 - 6.378852298738557e-05 - 6.314019758583242e-05 - 6.249604962295056e-05 - 6.185607708979005e-05 - 6.122027775903875e-05 - 6.058864919749181e-05 - 5.996118875684596e-05 - 5.933789356597989e-05 - 5.871876053888907e-05 - 5.810378637807827e-05 - 5.749296757228591e-05 - 5.688630039241354e-05 - 5.628378087841946e-05 - 5.568540486517338e-05 - 5.509116797959273e-05 - 5.450106561933422e-05 - 5.391509296529475e-05 - 5.333324497665832e-05 - 5.275551640753726e-05 - 5.218190179953343e-05 - 5.161239545977182e-05 - 5.104699148146081e-05 - 5.048568375913861e-05 - 4.992846596763329e-05 - 4.937533154817934e-05 - 4.882627374147808e-05 - 4.828128557792042e-05 - 4.774035986717692e-05 - 4.720348921279551e-05 - 4.667066599018748e-05 - 4.614188237688400e-05 - 4.561713035194944e-05 - 4.509640165438987e-05 - 4.457968783032909e-05 - 4.406698023190481e-05 - 4.355826996891768e-05 - 4.305354796420506e-05 - 4.255280495560636e-05 - 4.205603144616347e-05 - 4.156321774032957e-05 - 4.107435395613752e-05 - 4.058942999665175e-05 - 4.010843556869507e-05 - 3.963136019085871e-05 - 3.915819316952545e-05 - 3.868892361719641e-05 - 3.822354046226270e-05 - 3.776203244031561e-05 - 3.730438809005640e-05 - 3.685059575689182e-05 - 3.640064360230198e-05 - 3.595451960373741e-05 - 3.551221155134442e-05 - 3.507370705450421e-05 - 3.463899354241650e-05 - 3.420805825588243e-05 - 3.378088825986720e-05 - 3.335747045272196e-05 - 3.293779155463552e-05 - 3.252183811026268e-05 - 3.210959649877579e-05 - 3.170105292073684e-05 - 3.129619341367949e-05 - 3.089500386055728e-05 - 3.049746997239612e-05 - 3.010357730585059e-05 - 2.971331126487755e-05 - 2.932665707619367e-05 - 2.894359982344077e-05 - 2.856412445132613e-05 - 2.818821573877814e-05 - 2.781585831987375e-05 - 2.744703669454755e-05 - 2.708173520948728e-05 - 2.671993807124836e-05 - 2.636162935767626e-05 - 2.600679300301263e-05 - 2.565541280257304e-05 - 2.530747242805460e-05 - 2.496295542635910e-05 - 2.462184521206604e-05 - 2.428412507785163e-05 - 2.394977819771233e-05 - 2.361878762181457e-05 - 2.329113628448998e-05 - 2.296680701293541e-05 - 2.264578251757474e-05 - 2.232804539557172e-05 - 2.201357814530585e-05 - 2.170236315904943e-05 - 2.139438272306276e-05 - 2.108961903561866e-05 - 2.078805419745760e-05 - 2.048967020582218e-05 - 2.019444897050880e-05 - 1.990237231614296e-05 - 1.961342197777572e-05 - 1.932757961462368e-05 - 1.904482680353188e-05 - 1.876514502948172e-05 - 1.848851571515060e-05 - 1.821492021640795e-05 - 1.794433980831370e-05 - 1.767675569461099e-05 - 1.741214902258527e-05 - 1.715050088166273e-05 - 1.689179228451716e-05 - 1.663600419203502e-05 - 1.638311752659296e-05 - 1.613311314360082e-05 - 1.588597184706167e-05 - 1.564167440067926e-05 - 1.540020151829502e-05 - 1.516153387453479e-05 - 1.492565211244357e-05 - 1.469253682958783e-05 - 1.446216858599219e-05 - 1.423452791421707e-05 - 1.400959531801727e-05 - 1.378735127470914e-05 - 1.356777623611474e-05 - 1.335085063337062e-05 - 1.313655487876277e-05 - 1.292486936494610e-05 - 1.271577446639333e-05 - 1.250925054517824e-05 - 1.230527796605363e-05 - 1.210383708165599e-05 - 1.190490823144681e-05 - 1.170847175649016e-05 - 1.151450799717159e-05 - 1.132299729345123e-05 - 1.113391999104486e-05 - 1.094725644586371e-05 - 1.076298702423590e-05 - 1.058109209097755e-05 - 1.040155202830912e-05 - 1.022434724511555e-05 - 1.004945815519835e-05 - 9.876865191434875e-06 - 9.706548817576976e-06 - 9.538489515829050e-06 - 9.372667791395497e-06 - 9.209064181113714e-06 - 9.047659251528417e-06 - 8.888433598428113e-06 - 8.731367852817854e-06 - 8.576442682615395e-06 - 8.423638791088146e-06 - 8.272936922653283e-06 - 8.124317863654203e-06 - 7.977762440936675e-06 - 7.833251528895281e-06 - 7.690766049713759e-06 - 7.550286971453687e-06 - 7.411795314787993e-06 - 7.275272152381047e-06 - 7.140698608042407e-06 - 7.008055865069554e-06 - 6.877325162999093e-06 - 6.748487797069182e-06 - 6.621525126924672e-06 - 6.496418573295794e-06 - 6.373149617974847e-06 - 6.251699810845691e-06 - 6.132050767139283e-06 - 6.014184168887862e-06 - 5.898081770597224e-06 - 5.783725394973654e-06 - 5.671096936050662e-06 - 5.560178365641361e-06 - 5.450951726966341e-06 - 5.343399138917566e-06 - 5.237502802602254e-06 - 5.133244993336976e-06 - 5.030608065950253e-06 - 4.929574461382145e-06 - 4.830126698086031e-06 - 4.732247378331277e-06 - 4.635919192753656e-06 - 4.541124912789582e-06 - 4.447847398958468e-06 - 4.356069602328335e-06 - 4.265774557056776e-06 - 4.176945389932598e-06 - 4.089565320281935e-06 - 4.003617653697645e-06 - 3.919085793399028e-06 - 3.835953236362346e-06 - 3.754203567594348e-06 - 3.673820472678765e-06 - 3.594787733829004e-06 - 3.517089224074456e-06 - 3.440708918621393e-06 - 3.365630891050476e-06 - 3.291839308866544e-06 - 3.219318444550688e-06 - 3.148052669614368e-06 - 3.078026451876596e-06 - 3.009224366838337e-06 - 2.941631088840265e-06 - 2.875231390541817e-06 - 2.810010156134118e-06 - 2.745952369256776e-06 - 2.683043113446972e-06 - 2.621267584374269e-06 - 2.560611078236376e-06 - 2.501058994098514e-06 - 2.442596843868032e-06 - 2.385210240033010e-06 - 2.328884899906223e-06 - 2.273606655048426e-06 - 2.219361438179688e-06 - 2.166135288678882e-06 - 2.113914360085187e-06 - 2.062684907096663e-06 - 2.012433292648363e-06 - 1.963145994708785e-06 - 1.914809593193956e-06 - 1.867410777738679e-06 - 1.820936351687259e-06 - 1.775373220609589e-06 - 1.730708401732302e-06 - 1.686929024947410e-06 - 1.644022323067757e-06 - 1.601975642837270e-06 - 1.560776441656341e-06 - 1.520412279298016e-06 - 1.480870830315665e-06 - 1.442139880698395e-06 - 1.404207319625165e-06 - 1.367061149777226e-06 - 1.330689483155573e-06 - 1.295080535963615e-06 - 1.260222640873472e-06 - 1.226104237141460e-06 - 1.192713867093549e-06 - 1.160040189500492e-06 - 1.128071969424555e-06 - 1.096798076008267e-06 - 1.066207493417804e-06 - 1.036289310659725e-06 - 1.007032721493895e-06 - 9.784270338592895e-07 - 9.504616588874799e-07 - 9.231261128777845e-07 - 8.964100256766087e-07 - 8.703031286825232e-07 - 8.447952585150839e-07 - 8.198763641874936e-07 - 7.955364948286083e-07 - 7.717658049346632e-07 - 7.485545598914059e-07 - 7.258931238786546e-07 - 7.037719665410901e-07 - 6.821816664988581e-07 - 6.611128998791421e-07 - 6.405564483055948e-07 - 6.205032003278225e-07 - 6.009441408121614e-07 - 5.818703600152187e-07 - 5.632730528626383e-07 - 5.451435094097432e-07 - 5.274731247677268e-07 - 5.102533965000488e-07 - 4.934759162480692e-07 - 4.771323800991179e-07 - 4.612145841662162e-07 - 4.457144176881476e-07 - 4.306238737382497e-07 - 4.159350428538716e-07 - 4.016401077051372e-07 - 3.877313539402903e-07 - 3.742011622647174e-07 - 3.610420046499709e-07 - 3.482464547968944e-07 - 3.358071790150475e-07 - 3.237169340794661e-07 - 3.119685770955318e-07 - 3.005550554375413e-07 - 2.894694062090586e-07 - 2.787047650882795e-07 - 2.682543557659438e-07 - 2.581114909968296e-07 - 2.482695801165890e-07 - 2.387221182727572e-07 - 2.294626890008751e-07 - 2.204849703818711e-07 - 2.117827241548630e-07 - 2.033497996067267e-07 - 1.951801384624956e-07 - 1.872677641420447e-07 - 1.796067867093452e-07 - 1.721914062527642e-07 - 1.650159027896018e-07 - 1.580746421942365e-07 - 1.513620776690125e-07 - 1.448727406655565e-07 - 1.386012477684331e-07 - 1.325423000867771e-07 - 1.266906752868051e-07 - 1.210412352836648e-07 - 1.155889239131470e-07 - 1.103287600176973e-07 - 1.052558455547364e-07 - 1.003653617115032e-07 - 9.565256321109978e-08 - 9.111278671292873e-08 - 8.674144556415159e-08 - 8.253402527034383e-08 - 7.848609177536523e-08 - 7.459328520671134e-08 - 7.085131661573615e-08 - 6.725597593242166e-08 - 6.380312478868793e-08 - 6.048869454868003e-08 - 5.730869376312298e-08 - 5.425920030057914e-08 - 5.133636064443935e-08 - 4.853639660958214e-08 - 4.585559704969457e-08 - 4.329031836991616e-08 - 4.083699031045398e-08 - 3.849210751108346e-08 - 3.625223113812888e-08 - 3.411399355038575e-08 - 3.207408998824199e-08 - 3.012928121511996e-08 - 2.827639696078167e-08 - 2.651232793166280e-08 - 2.483402934338396e-08 - 2.323852311474514e-08 - 2.172289034680298e-08 - 2.028427559044146e-08 - 1.891988778877689e-08 - 1.762699339728036e-08 - 1.640292125402531e-08 - 1.524506224991720e-08 - 1.415086320949184e-08 - 1.311783222446413e-08 - 1.214353712508316e-08 - 1.122560019257377e-08 - 1.036170378687137e-08 - 9.549587722603005e-09 - 8.787044877843281e-09 - 8.071926961605364e-09 - 7.402140903161946e-09 - 6.775645388472587e-09 - 6.190456604129221e-09 - 5.644643792323680e-09 - 5.136326726146161e-09 - 4.663681262833891e-09 - 4.224934232596794e-09 - 3.818361845837701e-09 - 3.442294891302550e-09 - 3.095113141246544e-09 - 2.775244665814773e-09 - 2.481170514027403e-09 - 2.211418834557044e-09 - 1.964565051498559e-09 - 1.739235878927056e-09 - 1.534103359980556e-09 - 1.347885831336700e-09 - 1.179351163642234e-09 - 1.027310894648576e-09 - 8.906218977827446e-10 - 7.681887799049897e-10 - 6.589582548472836e-10 - 5.619214238374888e-10 - 4.761152985830568e-10 - 4.006175343477256e-10 - 3.345492227248809e-10 - 2.770755362128679e-10 - 2.274009179016229e-10 - 1.847722840116674e-10 - 1.484788129161787e-10 - 1.178476648704315e-10 - 9.224748788184573e-11 - 7.108739902161543e-11 - 5.381328706422649e-11 - 3.991151299277479e-11 - 2.890715266694438e-11 - 2.036091648096713e-11 - 1.387293445657948e-11 - 9.080348320515963e-12 - 5.654863833225597e-12 - 3.306507674167889e-12 - 1.780689492983021e-12 - 8.563646514161430e-13 - 3.496037276049943e-13 - 1.104943293034196e-13 - 2.161027650041889e-14 - 5.028049336448720e-16 - 0.000000000000000e+00 - 0.000000000000000e+00 - 7.485272593961791e+04 - 1.493519318697679e+05 - 2.234970831294996e+05 - 2.972876533345640e+05 - 3.707231243774131e+05 - 4.438029864272003e+05 - 5.165267379297798e+05 - 5.888938856077072e+05 - 6.609039444602393e+05 - 7.325564377633340e+05 - 8.038508970696502e+05 - 8.747868622085482e+05 - 9.453638812860892e+05 - 1.015581510685036e+06 - 1.085439315064852e+06 - 1.154936867361703e+06 - 1.224073748788454e+06 - 1.292849548834672e+06 - 1.361263865266626e+06 - 1.429316304127287e+06 - 1.497006479736322e+06 - 1.564334014690106e+06 - 1.631298539861710e+06 - 1.697899694400910e+06 - 1.764137125734180e+06 - 1.830010489564698e+06 - 1.895519449872339e+06 - 1.960663678913685e+06 - 2.025442857222013e+06 - 2.089856673607306e+06 - 2.153904825156247e+06 - 2.217587017232217e+06 - 2.280902963475303e+06 - 2.343852385802290e+06 - 2.406435014406665e+06 - 2.468650587758616e+06 - 2.530498852605031e+06 - 2.591979563969503e+06 - 2.653092485152322e+06 - 2.713837387730482e+06 - 2.774214051557675e+06 - 2.834222264764299e+06 - 2.893861823757447e+06 - 2.953132533220919e+06 - 3.012034206115212e+06 - 3.070566663677527e+06 - 3.128729735421764e+06 - 3.186523259138526e+06 - 3.243947080895115e+06 - 3.301001055035538e+06 - 3.357685044180497e+06 - 3.413998919227402e+06 - 3.469942559350358e+06 - 3.525515852000176e+06 - 3.580718692904367e+06 - 3.635550986067140e+06 - 3.690012643769410e+06 - 3.744103586568788e+06 - 3.797823743299592e+06 - 3.851173051072835e+06 - 3.904151455276238e+06 - 3.956758909574216e+06 - 4.008995375907890e+06 - 4.060860824495079e+06 - 4.112355233830309e+06 - 4.163478590684799e+06 - 4.214230890106475e+06 - 4.264612135419963e+06 - 4.314622338226588e+06 - 4.364261518404378e+06 - 4.413529704108060e+06 - 4.462426931769069e+06 - 4.510953246095533e+06 - 4.559108700072286e+06 - 4.606893354960858e+06 - 4.654307280299488e+06 - 4.701350553903108e+06 - 4.748023261863358e+06 - 4.794325498548575e+06 - 4.840257366603798e+06 - 4.885818976950768e+06 - 4.931010448787929e+06 - 4.975831909590418e+06 - 5.020283495110085e+06 - 5.064365349375471e+06 - 5.108077624691823e+06 - 5.151420481641092e+06 - 5.194394089081923e+06 - 5.236998624149668e+06 - 5.279234272256376e+06 - 5.321101227090800e+06 - 5.362599690618395e+06 - 5.403729873081312e+06 - 5.444491992998408e+06 - 5.484886277165242e+06 - 5.524912960654069e+06 - 5.564572286813851e+06 - 5.603864507270245e+06 - 5.642789881925615e+06 - 5.681348678959022e+06 - 5.719541174826232e+06 - 5.757367654259708e+06 - 5.794828410268617e+06 - 5.831923744138825e+06 - 5.868653965432902e+06 - 5.905019391990117e+06 - 5.941020349926441e+06 - 5.976657173634544e+06 - 6.011930205783804e+06 - 6.046839797320290e+06 - 6.081386307466779e+06 - 6.115570103722748e+06 - 6.149391561864376e+06 - 6.182851065944540e+06 - 6.215949008292822e+06 - 6.248685789515501e+06 - 6.281061818495561e+06 - 6.313077512392686e+06 - 6.344733296643257e+06 - 6.376029604960365e+06 - 6.406966879333793e+06 - 6.437545570030033e+06 - 6.467766135592271e+06 - 6.497629042840399e+06 - 6.527134766871008e+06 - 6.556283791057392e+06 - 6.585076607049545e+06 - 6.613513714774162e+06 - 6.641595622434638e+06 - 6.669322846511072e+06 - 6.696695911760264e+06 - 6.723715351215711e+06 - 6.750381706187615e+06 - 6.776695526262878e+06 - 6.802657369305105e+06 - 6.828267801454599e+06 - 6.853527397128366e+06 - 6.878436739020114e+06 - 6.902996418100249e+06 - 6.927207033615881e+06 - 6.951069193090819e+06 - 6.974583512325577e+06 - 6.997750615397365e+06 - 7.020571134660101e+06 - 7.043045710744397e+06 - 7.065174992557568e+06 - 7.086959637283633e+06 - 7.108400310383311e+06 - 7.129497685594021e+06 - 7.150252444929884e+06 - 7.170665278681723e+06 - 7.190736885417059e+06 - 7.210467971980117e+06 - 7.229859253491821e+06 - 7.248911453349800e+06 - 7.267625303228384e+06 - 7.286001543078595e+06 - 7.304040921128170e+06 - 7.321744193881537e+06 - 7.339112126119829e+06 - 7.356145490900878e+06 - 7.372845069559221e+06 - 7.389211651706094e+06 - 7.405246035229432e+06 - 7.420949026293878e+06 - 7.436321439340766e+06 - 7.451364097088138e+06 - 7.466077830530737e+06 - 7.480463478940005e+06 - 7.494521889864086e+06 - 7.508253919127826e+06 - 7.521660430832772e+06 - 7.534742297357169e+06 - 7.547500399355968e+06 - 7.559935625760819e+06 - 7.572048873780073e+06 - 7.583841048898782e+06 - 7.595313064878696e+06 - 7.606465843758276e+06 - 7.617300315852673e+06 - 7.627817419753745e+06 - 7.638018102330050e+06 - 7.647903318726848e+06 - 7.657474032366097e+06 - 7.666731214946462e+06 - 7.675675846443305e+06 - 7.684308915108687e+06 - 7.692631417471377e+06 - 7.700644358336839e+06 - 7.708348750787240e+06 - 7.715745616181449e+06 - 7.722835984155037e+06 - 7.729620892620270e+06 - 7.736101387766127e+06 - 7.742278524058277e+06 - 7.748153364239094e+06 - 7.753726979327655e+06 - 7.759000448619737e+06 - 7.763974859687817e+06 - 7.768651308381077e+06 - 7.773030898825390e+06 - 7.777114743423343e+06 - 7.780903962854218e+06 - 7.784399686073998e+06 - 7.787603050315368e+06 - 7.790515201087713e+06 - 7.793137292177119e+06 - 7.795470485646380e+06 - 7.797515951834979e+06 - 7.799274869359110e+06 - 7.800748425111664e+06 - 7.801937814262233e+06 - 7.802844240257111e+06 - 7.803468914819297e+06 - 7.803813057948484e+06 - 7.803877897921070e+06 - 7.803664671290156e+06 - 7.803174622885538e+06 - 7.802409005813722e+06 - 7.801369081457905e+06 - 7.800056119477995e+06 - 7.798471397810592e+06 - 7.796616202669007e+06 - 7.794491828543244e+06 - 7.792099578200010e+06 - 7.789440762682715e+06 - 7.786516701311473e+06 - 7.783328721683091e+06 - 7.779878159671083e+06 - 7.776166359425665e+06 - 7.772194673373749e+06 - 7.767964462218953e+06 - 7.763477094941595e+06 - 7.758733948798692e+06 - 7.753736409323964e+06 - 7.748485870327833e+06 - 7.742983733897421e+06 - 7.737231410396548e+06 - 7.731230318465743e+06 - 7.724981885022229e+06 - 7.718487545259933e+06 - 7.711748742649483e+06 - 7.704766928938209e+06 - 7.697543564150140e+06 - 7.690080116586007e+06 - 7.682378062823243e+06 - 7.674438887715982e+06 - 7.666264084395060e+06 - 7.657855154268012e+06 - 7.649213607019073e+06 - 7.640340960609185e+06 - 7.631238741275986e+06 - 7.621908483533815e+06 - 7.612351730173716e+06 - 7.602570032263434e+06 - 7.592564949147409e+06 - 7.582338048446788e+06 - 7.571890906059416e+06 - 7.561225106159844e+06 - 7.550342241199316e+06 - 7.539243911905785e+06 - 7.527931727283904e+06 - 7.516407304615024e+06 - 7.504672269457198e+06 - 7.492728241314434e+06 - 7.480576638153253e+06 - 7.468218723741564e+06 - 7.455655760425863e+06 - 7.442889013018662e+06 - 7.429919748798485e+06 - 7.416749237509867e+06 - 7.403378751363355e+06 - 7.389809565035504e+06 - 7.376042955668893e+06 - 7.362080202872100e+06 - 7.347922588719724e+06 - 7.333571397752370e+06 - 7.319027916976659e+06 - 7.304293435865226e+06 - 7.289369246356713e+06 - 7.274256642855777e+06 - 7.258956922233087e+06 - 7.243471383825325e+06 - 7.227801329435183e+06 - 7.211948063331366e+06 - 7.195912892248592e+06 - 7.179697125387593e+06 - 7.163302074415106e+06 - 7.146729053463890e+06 - 7.129979379132709e+06 - 7.113054370486340e+06 - 7.095955349055575e+06 - 7.078683638837219e+06 - 7.061240566294081e+06 - 7.043627460354994e+06 - 7.025845652414794e+06 - 7.007896476334333e+06 - 6.989781268440476e+06 - 6.971501367526096e+06 - 6.953058114850082e+06 - 6.934452854137335e+06 - 6.915686931578767e+06 - 6.896761695831302e+06 - 6.877678498017876e+06 - 6.858438691727439e+06 - 6.839043633014950e+06 - 6.819494680401385e+06 - 6.799793194873727e+06 - 6.779940539884974e+06 - 6.759938081354136e+06 - 6.739787187666233e+06 - 6.719489229672301e+06 - 6.699045580689385e+06 - 6.678457616500544e+06 - 6.657726715354848e+06 - 6.636854257967380e+06 - 6.615841627519235e+06 - 6.594690209657516e+06 - 6.573401392495350e+06 - 6.551976566611862e+06 - 6.530417125052197e+06 - 6.508724463327511e+06 - 6.486899979414972e+06 - 6.464945073757762e+06 - 6.442861149265066e+06 - 6.420649611312096e+06 - 6.398311867740063e+06 - 6.375849328856199e+06 - 6.353263407433745e+06 - 6.330555518711952e+06 - 6.307727080396090e+06 - 6.284779512657427e+06 - 6.261714238133261e+06 - 6.238532681926889e+06 - 6.215236271607627e+06 - 6.191826437210800e+06 - 6.168304611237747e+06 - 6.144672228655818e+06 - 6.120930726898375e+06 - 6.097081545864792e+06 - 6.073126127920459e+06 - 6.049065917896771e+06 - 6.024902363091142e+06 - 6.000636913266994e+06 - 5.976271020653763e+06 - 5.951806139946896e+06 - 5.927243728307854e+06 - 5.902585245364108e+06 - 5.877832153209144e+06 - 5.852985916402456e+06 - 5.828048001969552e+06 - 5.803019879401957e+06 - 5.777903020657199e+06 - 5.752698900158828e+06 - 5.727408994796395e+06 - 5.702034783925475e+06 - 5.676577749367647e+06 - 5.651039375410506e+06 - 5.625421148807654e+06 - 5.599724558778713e+06 - 5.573951097009313e+06 - 5.548102257651095e+06 - 5.522179537321717e+06 - 5.496184435104840e+06 - 5.470118452550147e+06 - 5.443983093673326e+06 - 5.417779864956085e+06 - 5.391510275346133e+06 - 5.365175836257203e+06 - 5.338778061569033e+06 - 5.312318467627374e+06 - 5.285798573243992e+06 - 5.259219899696662e+06 - 5.232583970729172e+06 - 5.205892312551324e+06 - 5.179146453838928e+06 - 5.152347925733812e+06 - 5.125498261843814e+06 - 5.098598998242779e+06 - 5.071651673470572e+06 - 5.044657828533064e+06 - 5.017619006902143e+06 - 4.990536754515706e+06 - 4.963412619777663e+06 - 4.936248153557934e+06 - 4.909044909192459e+06 - 4.881804442483181e+06 - 4.854528311698059e+06 - 4.827218077571064e+06 - 4.799875303302180e+06 - 4.772501554557402e+06 - 4.745098399468737e+06 - 4.717667408634203e+06 - 4.690210155117837e+06 - 4.662728214449679e+06 - 4.635223164625784e+06 - 4.607696586108224e+06 - 4.580150061825077e+06 - 4.552585177170437e+06 - 4.525003520004408e+06 - 4.497406680653105e+06 - 4.469796251908661e+06 - 4.442173829029216e+06 - 4.414541009738924e+06 - 4.386899394227949e+06 - 4.359250585152469e+06 - 4.331596187634676e+06 - 4.303937809262771e+06 - 4.276277060090966e+06 - 4.248615552639492e+06 - 4.220954901894585e+06 - 4.193296725308497e+06 - 4.165642642799490e+06 - 4.137994276751838e+06 - 4.110353252015833e+06 - 4.082721195907769e+06 - 4.055099738209962e+06 - 4.027490511170732e+06 - 3.999895149504419e+06 - 3.972315290391369e+06 - 3.944752573477943e+06 - 3.917208640876513e+06 - 3.889685137165464e+06 - 3.862183709389194e+06 - 3.834706007058111e+06 - 3.807253682148634e+06 - 3.779828389103201e+06 - 3.752431784830255e+06 - 3.725065528704253e+06 - 3.697731282565667e+06 - 3.670430710720977e+06 - 3.643165479942679e+06 - 3.615937259469279e+06 - 3.588747721005293e+06 - 3.561598538721256e+06 - 3.534491389253709e+06 - 3.507427951705208e+06 - 3.480409907644318e+06 - 3.453438941105620e+06 - 3.426516738589706e+06 - 3.399644989063177e+06 - 3.372825383958653e+06 - 3.346070405300663e+06 - 3.319465764034668e+06 - 3.293075510459727e+06 - 3.266878224028187e+06 - 3.240869303162930e+06 - 3.215052515525467e+06 - 3.189425288821125e+06 - 3.163986116962672e+06 - 3.138734196986282e+06 - 3.113668261011591e+06 - 3.088787111422079e+06 - 3.064089610843659e+06 - 3.039574592322599e+06 - 3.015240898358055e+06 - 2.991087379108502e+06 - 2.967112887579310e+06 - 2.943316282301805e+06 - 2.919696425519270e+06 - 2.896252185185970e+06 - 2.872982434032476e+06 - 2.849886048305633e+06 - 2.826961910405915e+06 - 2.804208907130155e+06 - 2.781625929123051e+06 - 2.759211873644148e+06 - 2.736965641930875e+06 - 2.714886139213983e+06 - 2.692972277509980e+06 - 2.671222972611625e+06 - 2.649637144535781e+06 - 2.628213719738566e+06 - 2.606951628696007e+06 - 2.585849806893141e+06 - 2.564907195391811e+06 - 2.544122739173453e+06 - 2.523495389008342e+06 - 2.503024101022326e+06 - 2.482707834844927e+06 - 2.462545556054412e+06 - 2.442536236120740e+06 - 2.422678849863131e+06 - 2.402972377820649e+06 - 2.383415806334849e+06 - 2.364008125120872e+06 - 2.344748329835404e+06 - 2.325635421794777e+06 - 2.306668405813749e+06 - 2.287846292982958e+06 - 2.269168099757709e+06 - 2.250632846050586e+06 - 2.232239558087812e+06 - 2.213987266957964e+06 - 2.195875007435864e+06 - 2.177901821473463e+06 - 2.160066755143500e+06 - 2.142368857948063e+06 - 2.124807187017495e+06 - 2.107380803567688e+06 - 2.090088772295509e+06 - 2.072930165358991e+06 - 2.055904058912681e+06 - 2.039009532618940e+06 - 2.022245673041180e+06 - 2.005611571515091e+06 - 1.989106323649552e+06 - 1.972729030298793e+06 - 1.956478797095825e+06 - 1.940354734917566e+06 - 1.924355960016194e+06 - 1.908481592593613e+06 - 1.892730757829583e+06 - 1.877102587255698e+06 - 1.861596215902473e+06 - 1.846210783186639e+06 - 1.830945435012332e+06 - 1.815799321323061e+06 - 1.800771597138300e+06 - 1.785861422681660e+06 - 1.771067961851037e+06 - 1.756390384114008e+06 - 1.741827864373811e+06 - 1.727379581118251e+06 - 1.713044718232857e+06 - 1.698822464839031e+06 - 1.684712013805151e+06 - 1.670712563808684e+06 - 1.656823318006428e+06 - 1.643043483055245e+06 - 1.629372271790869e+06 - 1.615808901794204e+06 - 1.602352594044968e+06 - 1.589002574975609e+06 - 1.575758076322615e+06 - 1.562618333634041e+06 - 1.549582587186907e+06 - 1.536650081999105e+06 - 1.523820067124634e+06 - 1.511091797064626e+06 - 1.498464530780005e+06 - 1.485937531189585e+06 - 1.473510066471004e+06 - 1.461181408848471e+06 - 1.448950834625962e+06 - 1.436817625926470e+06 - 1.424781068397768e+06 - 1.412840451407005e+06 - 1.400995070309470e+06 - 1.389244224245752e+06 - 1.377587216393601e+06 - 1.366023355231714e+06 - 1.354551952598923e+06 - 1.343172324427429e+06 - 1.331883792566280e+06 - 1.320685682335073e+06 - 1.309577322956444e+06 - 1.298558048406515e+06 - 1.287627196362487e+06 - 1.276784109496439e+06 - 1.266028134784103e+06 - 1.255358622320226e+06 - 1.244774926866806e+06 - 1.234276408467881e+06 - 1.223862430240984e+06 - 1.213532358913532e+06 - 1.203285566621101e+06 - 1.193121428991948e+06 - 1.183039325468658e+06 - 1.173038640304339e+06 - 1.163118761212139e+06 - 1.153279079987504e+06 - 1.143518992564451e+06 - 1.133837898317260e+06 - 1.124235201394960e+06 - 1.114710310121780e+06 - 1.105262636013577e+06 - 1.095891594215875e+06 - 1.086596604396163e+06 - 1.077377090233802e+06 - 1.068232479242110e+06 - 1.059162202266971e+06 - 1.050165693700918e+06 - 1.041242393088349e+06 - 1.032391743039430e+06 - 1.023613189178869e+06 - 1.014906181731556e+06 - 1.006270174355871e+06 - 9.977046244036794e+05 - 9.892089935677024e+05 - 9.807827465832273e+05 - 9.724253516436865e+05 - 9.641362810046984e+05 - 9.559150102252770e+05 - 9.477610188719215e+05 - 9.396737899139688e+05 - 9.316528091743080e+05 - 9.236975665277143e+05 - 9.158075561735997e+05 - 9.079822751134991e+05 - 9.002212236533747e+05 - 8.925239057014534e+05 - 8.848898281604102e+05 - 8.773185021612709e+05 - 8.698094424648809e+05 - 8.623621663528095e+05 - 8.549761944053203e+05 - 8.476510510446843e+05 - 8.403862637513808e+05 - 8.331813638606276e+05 - 8.260358860837971e+05 - 8.189493675787508e+05 - 8.119213484350282e+05 - 8.049513730504208e+05 - 7.980389891667470e+05 - 7.911837471192866e+05 - 7.843852003599521e+05 - 7.776429053419405e+05 - 7.709564221446526e+05 - 7.643253140173181e+05 - 7.577491471803443e+05 - 7.512274911598503e+05 - 7.447599180231568e+05 - 7.383460026539576e+05 - 7.319853241781880e+05 - 7.256774641850799e+05 - 7.194220067146936e+05 - 7.132185395309449e+05 - 7.070666529520636e+05 - 7.009659400728574e+05 - 6.949159975085063e+05 - 6.889164244086053e+05 - 6.829668228095188e+05 - 6.770667979456050e+05 - 6.712159574726904e+05 - 6.654139120281750e+05 - 6.596602754201142e+05 - 6.539546638052445e+05 - 6.482966962660485e+05 - 6.426859949531512e+05 - 6.371221843431445e+05 - 6.316048918617199e+05 - 6.261337478197705e+05 - 6.207083848228143e+05 - 6.153284385055641e+05 - 6.099935472682050e+05 - 6.047033517354903e+05 - 5.994574954765684e+05 - 5.942556247644721e+05 - 5.890973881315375e+05 - 5.839824370501742e+05 - 5.789104255366600e+05 - 5.738810098259439e+05 - 5.688938490610282e+05 - 5.639486048510919e+05 - 5.590449410545636e+05 - 5.541825244030216e+05 - 5.493610239467514e+05 - 5.445801109611018e+05 - 5.398394595653637e+05 - 5.351387461239359e+05 - 5.304776492529869e+05 - 5.258558503354813e+05 - 5.212730328842620e+05 - 5.167288826663374e+05 - 5.122230881980868e+05 - 5.077553400369428e+05 - 5.033253309731948e+05 - 4.989327564601310e+05 - 4.945773139811803e+05 - 4.902587033143605e+05 - 4.859766266490913e+05 - 4.817307881770549e+05 - 4.775208945372272e+05 - 4.733466546121029e+05 - 4.692077791818720e+05 - 4.651039814988278e+05 - 4.610349770333872e+05 - 4.570004830895544e+05 - 4.530002193970305e+05 - 4.490339078641191e+05 - 4.451012721716975e+05 - 4.412020383482487e+05 - 4.373359346346440e+05 - 4.335026910461138e+05 - 4.297020398291695e+05 - 4.259337153289251e+05 - 4.221974536699117e+05 - 4.184929932504728e+05 - 4.148200744355357e+05 - 4.111784393468680e+05 - 4.075678324287459e+05 - 4.039879999559653e+05 - 4.004386899065928e+05 - 3.969196525836200e+05 - 3.934306400492930e+05 - 3.899714060581240e+05 - 3.865417066557175e+05 - 3.831412995849459e+05 - 3.797699442729113e+05 - 3.764274023566474e+05 - 3.731134371233769e+05 - 3.698278135622827e+05 - 3.665702987827645e+05 - 3.633406615280775e+05 - 3.601386722825769e+05 - 3.569641034535824e+05 - 3.538167290782596e+05 - 3.506963250581825e+05 - 3.476026690576235e+05 - 3.445355402744773e+05 - 3.414947198014101e+05 - 3.384799905288533e+05 - 3.354911367821696e+05 - 3.325279446663284e+05 - 3.295902021531574e+05 - 3.266776986085196e+05 - 3.237902250531212e+05 - 3.209275743946921e+05 - 3.180895409646722e+05 - 3.152759207164211e+05 - 3.124865112943467e+05 - 3.097211117598721e+05 - 3.069795229448014e+05 - 3.042615472339510e+05 - 3.015669883675390e+05 - 2.988956518738279e+05 - 2.962473447339852e+05 - 2.936218752484120e+05 - 2.910190535228683e+05 - 2.884386911235514e+05 - 2.858806009067059e+05 - 2.833445973150213e+05 - 2.808304963224871e+05 - 2.783381153152796e+05 - 2.758672731341289e+05 - 2.734177900017136e+05 - 2.709894875428715e+05 - 2.685821889451269e+05 - 2.661957187314447e+05 - 2.638299027837526e+05 - 2.614845683836235e+05 - 2.591595441417535e+05 - 2.568546601323142e+05 - 2.545697477628685e+05 - 2.523046396706559e+05 - 2.500591699434964e+05 - 2.478331740644226e+05 - 2.456264886409644e+05 - 2.434389516128850e+05 - 2.412704023657298e+05 - 2.391206814330098e+05 - 2.369896306904384e+05 - 2.348770933197599e+05 - 2.327829136173563e+05 - 2.307069372775990e+05 - 2.286490111745211e+05 - 2.266089832623643e+05 - 2.245867029748616e+05 - 2.225820209237310e+05 - 2.205947887183862e+05 - 2.186248592921233e+05 - 2.166720868039439e+05 - 2.147363264605261e+05 - 2.128174347706827e+05 - 2.109152693889452e+05 - 2.090296889843596e+05 - 2.071605535077064e+05 - 2.053077240108720e+05 - 2.034710625599661e+05 - 2.016504325007521e+05 - 1.998456982030229e+05 - 1.980567250370223e+05 - 1.962833797138016e+05 - 1.945255298870997e+05 - 1.927830441323482e+05 - 1.910557922964590e+05 - 1.893436452442803e+05 - 1.876464748512476e+05 - 1.859641540986015e+05 - 1.842965568967865e+05 - 1.826435581738182e+05 - 1.810050340354470e+05 - 1.793808614993985e+05 - 1.777709185575675e+05 - 1.761750842223128e+05 - 1.745932384546507e+05 - 1.730252623268235e+05 - 1.714710377603550e+05 - 1.699304475698536e+05 - 1.684033757560533e+05 - 1.668897071565261e+05 - 1.653893274220018e+05 - 1.639021233234161e+05 - 1.624279825159149e+05 - 1.609667934564489e+05 - 1.595184456811041e+05 - 1.580828296015031e+05 - 1.566598363968120e+05 - 1.552493582649543e+05 - 1.538512882702573e+05 - 1.524655202573447e+05 - 1.510919491064028e+05 - 1.497304705096718e+05 - 1.483809809029638e+05 - 1.470433777326744e+05 - 1.457175592117312e+05 - 1.444034242942686e+05 - 1.431008729933990e+05 - 1.418098060421684e+05 - 1.405301248671864e+05 - 1.392617319094920e+05 - 1.380045303259556e+05 - 1.367584239714278e+05 - 1.355233176631985e+05 - 1.342991169575939e+05 - 1.330857281367400e+05 - 1.318830583220329e+05 - 1.306910153813551e+05 - 1.295095079605118e+05 - 1.283384454277201e+05 - 1.271777378619642e+05 - 1.260272961737778e+05 - 1.248870320778846e+05 - 1.237568578844075e+05 - 1.226366865814357e+05 - 1.215264320654815e+05 - 1.204260088572700e+05 - 1.193353321256488e+05 - 1.182543179024696e+05 - 1.171828828329888e+05 - 1.161209441971572e+05 - 1.150684200368906e+05 - 1.140252290172446e+05 - 1.129912905290012e+05 - 1.119665246989244e+05 - 1.109508522377596e+05 - 1.099441945145749e+05 - 1.089464735474612e+05 - 1.079576119759672e+05 - 1.069775332658437e+05 - 1.060061613940063e+05 - 1.050434208615313e+05 - 1.040892370245828e+05 - 1.031435357647047e+05 - 1.022062434696232e+05 - 1.012772873208916e+05 - 1.003565950684523e+05 - 9.944409498683986e+04 - 9.853971604124359e+04 - 9.764338777276211e+04 - 9.675504027159151e+04 - 9.587460425195689e+04 - 9.500201099602232e+04 - 9.413719236230559e+04 - 9.328008081668093e+04 - 9.243060935253548e+04 - 9.158871152497102e+04 - 9.075432150057999e+04 - 8.992737394814150e+04 - 8.910780408381460e+04 - 8.829554772812854e+04 - 8.749054118346877e+04 - 8.669272128864085e+04 - 8.590202548133289e+04 - 8.511839166524833e+04 - 8.434175826486869e+04 - 8.357206428147563e+04 - 8.280924917713979e+04 - 8.205325293940101e+04 - 8.130401609766987e+04 - 8.056147962909786e+04 - 7.982558503959214e+04 - 7.909627435336930e+04 - 7.837349003289423e+04 - 7.765717506702039e+04 - 7.694727293156023e+04 - 7.624372753229675e+04 - 7.554648331079309e+04 - 7.485548516457589e+04 - 7.417067840840557e+04 - 7.349200889763620e+04 - 7.281942291879337e+04 - 7.215286716185752e+04 - 7.149228885123666e+04 - 7.083763563584826e+04 - 7.018885556144921e+04 - 6.954589717270633e+04 - 6.890870943981725e+04 - 6.827724174191867e+04 - 6.765144392787226e+04 - 6.703126624692857e+04 - 6.641665935636370e+04 - 6.580757439267423e+04 - 6.520396286738058e+04 - 6.460577668030654e+04 - 6.401296820028803e+04 - 6.342549017134596e+04 - 6.284329573351656e+04 - 6.226633845994343e+04 - 6.169457228450359e+04 - 6.112795154311772e+04 - 6.056643099463883e+04 - 6.000996574136701e+04 - 5.945851127624574e+04 - 5.891202351267684e+04 - 5.837045869755570e+04 - 5.783377345558033e+04 - 5.730192482224794e+04 - 5.677487016169035e+04 - 5.625256720967715e+04 - 5.573497408983271e+04 - 5.522204924870504e+04 - 5.471375150828325e+04 - 5.421004006036229e+04 - 5.371087441354901e+04 - 5.321621444975662e+04 - 5.272602039469258e+04 - 5.224025278120609e+04 - 5.175887251825204e+04 - 5.128184085536604e+04 - 5.080911934597862e+04 - 5.034066989608183e+04 - 4.987645473684455e+04 - 4.941643640415772e+04 - 4.896057778639881e+04 - 4.850884207769758e+04 - 4.806119277190277e+04 - 4.761759372195903e+04 - 4.717800906318111e+04 - 4.674240321587012e+04 - 4.631074096205200e+04 - 4.588298735942246e+04 - 4.545910774537743e+04 - 4.503906779825089e+04 - 4.462283347373459e+04 - 4.421037101686000e+04 - 4.380164697651120e+04 - 4.339662816996042e+04 - 4.299528171729217e+04 - 4.259757504220949e+04 - 4.220347581706527e+04 - 4.181295199605238e+04 - 4.142597183433527e+04 - 4.104250383855765e+04 - 4.066251680332360e+04 - 4.028597979815155e+04 - 3.991286213370509e+04 - 3.954313341370015e+04 - 3.917676350485435e+04 - 3.881372250661203e+04 - 3.845398080843414e+04 - 3.809750905736740e+04 - 3.774427812448402e+04 - 3.739425915595785e+04 - 3.704742356207799e+04 - 3.670374297805164e+04 - 3.636318929176292e+04 - 3.602573463927982e+04 - 3.569135138416072e+04 - 3.536001215672983e+04 - 3.503168981923036e+04 - 3.470635744840465e+04 - 3.438398837321134e+04 - 3.406455615393208e+04 - 3.374803457309094e+04 - 3.343439765983423e+04 - 3.312361965186892e+04 - 3.281567499925836e+04 - 3.251053841177231e+04 - 3.220818480242078e+04 - 3.190858928930939e+04 - 3.161172723179306e+04 - 3.131757418548949e+04 - 3.102610591483113e+04 - 3.073729842710719e+04 - 3.045112791454117e+04 - 3.016757076691534e+04 - 2.988660361584138e+04 - 2.960820327321778e+04 - 2.933234674204399e+04 - 2.905901125674980e+04 - 2.878817423326317e+04 - 2.851981328372868e+04 - 2.825390622682930e+04 - 2.799043106146120e+04 - 2.772936599846356e+04 - 2.747068942978120e+04 - 2.721437991599866e+04 - 2.696041623625263e+04 - 2.670877735469368e+04 - 2.645944239579323e+04 - 2.621239068106394e+04 - 2.596760172331024e+04 - 2.572505519859007e+04 - 2.548473096648493e+04 - 2.524660907253227e+04 - 2.501066972455740e+04 - 2.477689330466365e+04 - 2.454526037995217e+04 - 2.431575168300119e+04 - 2.408834810912627e+04 - 2.386303072521571e+04 - 2.363978076395976e+04 - 2.341857962988761e+04 - 2.319940888531031e+04 - 2.298225025100848e+04 - 2.276708562349589e+04 - 2.255389704384009e+04 - 2.234266670372097e+04 - 2.213337697918792e+04 - 2.192601038403303e+04 - 2.172054957464747e+04 - 2.151697738916041e+04 - 2.131527680276242e+04 - 2.111543093252480e+04 - 2.091742306098243e+04 - 2.072123660422193e+04 - 2.052685512482519e+04 - 2.033426234716574e+04 - 2.014344212098682e+04 - 1.995437843426629e+04 - 1.976705544479930e+04 - 1.958145743480243e+04 - 1.939756881213320e+04 - 1.921537413684756e+04 - 1.903485810052154e+04 - 1.885600554387774e+04 - 1.867880143037429e+04 - 1.850323084111479e+04 - 1.832927901452323e+04 - 1.815693131178678e+04 - 1.798617320994377e+04 - 1.781699034075772e+04 - 1.764936845332217e+04 - 1.748329340510924e+04 - 1.731875119617678e+04 - 1.715572795110660e+04 - 1.699420990919751e+04 - 1.683418344358223e+04 - 1.667563503873475e+04 - 1.651855128954979e+04 - 1.636291893365341e+04 - 1.620872481606836e+04 - 1.605595588699932e+04 - 1.590459923143625e+04 - 1.575464203906202e+04 - 1.560607160533683e+04 - 1.545887535681969e+04 - 1.531304082443131e+04 - 1.516855564487381e+04 - 1.502540756956110e+04 - 1.488358445432479e+04 - 1.474307426938193e+04 - 1.460386509288249e+04 - 1.446594509814283e+04 - 1.432930256776952e+04 - 1.419392589719183e+04 - 1.405980357729324e+04 - 1.392692420658459e+04 - 1.379527648729671e+04 - 1.366484921045415e+04 - 1.353563127160237e+04 - 1.340761167272577e+04 - 1.328077950662285e+04 - 1.315512397004589e+04 - 1.303063434970357e+04 - 1.290730001970431e+04 - 1.278511047006237e+04 - 1.266405528001385e+04 - 1.254412410683634e+04 - 1.242530670538782e+04 - 1.230759293022181e+04 - 1.219097272173875e+04 - 1.207543611008671e+04 - 1.196097321598039e+04 - 1.184757424417080e+04 - 1.173522949287449e+04 - 1.162392934478714e+04 - 1.151366426384512e+04 - 1.140442480834694e+04 - 1.129620161634352e+04 - 1.118898540470730e+04 - 1.108276698378667e+04 - 1.097753724013271e+04 - 1.087328713748510e+04 - 1.077000773143687e+04 - 1.066769015148828e+04 - 1.056632560317495e+04 - 1.046590537899618e+04 - 1.036642084361778e+04 - 1.026786343864257e+04 - 1.017022468912003e+04 - 1.007349618928313e+04 - 9.977669609110566e+03 - 9.882736699245763e+03 - 9.788689277747368e+03 - 9.695519238085319e+03 - 9.603218551128393e+03 - 9.511779252802526e+03 - 9.421193453258842e+03 - 9.331453338088948e+03 - 9.242551155902798e+03 - 9.154479227014926e+03 - 9.067229945268125e+03 - 8.980795767109534e+03 - 8.895169220035050e+03 - 8.810342900070031e+03 - 8.726309463870590e+03 - 8.643061639313548e+03 - 8.560592220958239e+03 - 8.478894062727115e+03 - 8.397960086705119e+03 - 8.317783279679375e+03 - 8.238356687487571e+03 - 8.159673421912185e+03 - 8.081726656780256e+03 - 8.004509624589081e+03 - 7.928015622553179e+03 - 7.852238006535134e+03 - 7.777170190090504e+03 - 7.702805651284038e+03 - 7.629137923269694e+03 - 7.556160595291118e+03 - 7.483867321684783e+03 - 7.412251809739373e+03 - 7.341307820993124e+03 - 7.271029178292266e+03 - 7.201409756944273e+03 - 7.132443488123264e+03 - 7.064124361053455e+03 - 6.996446414793790e+03 - 6.929403743407001e+03 - 6.862990497342477e+03 - 6.797200875139910e+03 - 6.732029129721631e+03 - 6.667469570161823e+03 - 6.603516551523545e+03 - 6.540164480186692e+03 - 6.477407817185619e+03 - 6.415241069687017e+03 - 6.353658796883785e+03 - 6.292655608307650e+03 - 6.232226157518487e+03 - 6.172365149982773e+03 - 6.113067340658933e+03 - 6.054327527853383e+03 - 5.996140560115221e+03 - 5.938501333076975e+03 - 5.881404784939355e+03 - 5.824845903828315e+03 - 5.768819722461626e+03 - 5.713321315085574e+03 - 5.658345805472132e+03 - 5.603888359764917e+03 - 5.549944184846402e+03 - 5.496508537213697e+03 - 5.443576713947663e+03 - 5.391144051368102e+03 - 5.339205932358427e+03 - 5.287757780134069e+03 - 5.236795058291703e+03 - 5.186313275265001e+03 - 5.136307977685731e+03 - 5.086774751617681e+03 - 5.037709226449485e+03 - 4.989107068721900e+03 - 4.940963984504954e+03 - 4.893275721702213e+03 - 4.846038063285039e+03 - 4.799246830729600e+03 - 4.752897888312231e+03 - 4.706987133608333e+03 - 4.661510499922751e+03 - 4.616463963202395e+03 - 4.571843532909213e+03 - 4.527645253893021e+03 - 4.483865209302220e+03 - 4.440499515324517e+03 - 4.397544325863069e+03 - 4.354995830474305e+03 - 4.312850249817291e+03 - 4.271103841242844e+03 - 4.229752898292512e+03 - 4.188793745275323e+03 - 4.148222740634546e+03 - 4.108036277499050e+03 - 4.068230779797937e+03 - 4.028802705831530e+03 - 3.989748546349355e+03 - 3.951064821861195e+03 - 3.912748086813885e+03 - 3.874794926585441e+03 - 3.837201956255947e+03 - 3.799965825835211e+03 - 3.763083213042953e+03 - 3.726550823283946e+03 - 3.690365398229224e+03 - 3.654523706502605e+03 - 3.619022543185401e+03 - 3.583858737044133e+03 - 3.549029144619817e+03 - 3.514530650270483e+03 - 3.480360168271582e+03 - 3.446514639490202e+03 - 3.412991033253400e+03 - 3.379786348393921e+03 - 3.346897609451590e+03 - 3.314321868815865e+03 - 3.282056205761040e+03 - 3.250097724763853e+03 - 3.218443559530467e+03 - 3.187090870156345e+03 - 3.156036839918450e+03 - 3.125278679259401e+03 - 3.094813626126841e+03 - 3.064638941053712e+03 - 3.034751909739014e+03 - 3.005149845581890e+03 - 2.975830084543172e+03 - 2.946789986568892e+03 - 2.918026936797055e+03 - 2.889538343339952e+03 - 2.861321641252218e+03 - 2.833374286700636e+03 - 2.805693756659566e+03 - 2.778277556469224e+03 - 2.751123212016022e+03 - 2.724228269242043e+03 - 2.697590301914011e+03 - 2.671206904109025e+03 - 2.645075688971241e+03 - 2.619194294405700e+03 - 2.593560380141823e+03 - 2.568171626715687e+03 - 2.543025737542386e+03 - 2.518120435211838e+03 - 2.493453462030127e+03 - 2.469022585172818e+03 - 2.444825590018873e+03 - 2.420860280374604e+03 - 2.397124484732366e+03 - 2.373616049394018e+03 - 2.350332838436762e+03 - 2.327272738609171e+03 - 2.304433655218562e+03 - 2.281813512846715e+03 - 2.259410255601743e+03 - 2.237221844685107e+03 - 2.215246260811306e+03 - 2.193481506123082e+03 - 2.171925598942706e+03 - 2.150576574458654e+03 - 2.129432488764117e+03 - 2.108491414442484e+03 - 2.087751441300839e+03 - 2.067210678851041e+03 - 2.046867252353801e+03 - 2.026719303565292e+03 - 2.006764993817073e+03 - 1.987002500493615e+03 - 1.967430017215378e+03 - 1.948045754608514e+03 - 1.928847939062915e+03 - 1.909834815497017e+03 - 1.891004644375446e+03 - 1.872355700452609e+03 - 1.853886275802303e+03 - 1.835594678424827e+03 - 1.817479231062563e+03 - 1.799538272810955e+03 - 1.781770158220284e+03 - 1.764173256646331e+03 - 1.746745953278825e+03 - 1.729486647489427e+03 - 1.712393752933919e+03 - 1.695465699568615e+03 - 1.678700930817119e+03 - 1.662097903850073e+03 - 1.645655091966725e+03 - 1.629370981458450e+03 - 1.613244072202941e+03 - 1.597272880432907e+03 - 1.581455933682248e+03 - 1.565791771294578e+03 - 1.550278951289465e+03 - 1.534916043199639e+03 - 1.519701626827566e+03 - 1.504634298568118e+03 - 1.489712666891078e+03 - 1.474935351996483e+03 - 1.460300988758884e+03 - 1.445808223853118e+03 - 1.431455716350942e+03 - 1.417242138357507e+03 - 1.403166173386480e+03 - 1.389226518010158e+03 - 1.375421881007569e+03 - 1.361750982089843e+03 - 1.348212553926219e+03 - 1.334805341072190e+03 - 1.321528098720046e+03 - 1.308379594477261e+03 - 1.295358607457036e+03 - 1.282463927300085e+03 - 1.269694355823267e+03 - 1.257048705895313e+03 - 1.244525800699936e+03 - 1.232124475203576e+03 - 1.219843575042076e+03 - 1.207681956049559e+03 - 1.195638485404256e+03 - 1.183712040621380e+03 - 1.171901509388141e+03 - 1.160205790292893e+03 - 1.148623791762007e+03 - 1.137154432301071e+03 - 1.125796641257775e+03 - 1.114549357263016e+03 - 1.103411528660030e+03 - 1.092382114454342e+03 - 1.081460082700689e+03 - 1.070644411095300e+03 - 1.059934087579793e+03 - 1.049328108720195e+03 - 1.038825480494848e+03 - 1.028425218971371e+03 - 1.018126348582361e+03 - 1.007927902927668e+03 - 9.978289254104482e+02 - 9.878284675679866e+02 - 9.779255898738762e+02 - 9.681193621623704e+02 - 9.584088623012988e+02 - 9.487931771658360e+02 - 9.392714022763922e+02 - 9.298426409505287e+02 - 9.205060057185552e+02 - 9.112606172437117e+02 - 9.021056036681564e+02 - 8.930401022331439e+02 - 8.840632580637879e+02 - 8.751742235821227e+02 - 8.663721600224155e+02 - 8.576562363107178e+02 - 8.490256285516970e+02 - 8.404795212594149e+02 - 8.320171064683727e+02 - 8.236375833541338e+02 - 8.153401590664150e+02 - 8.071240480244585e+02 - 7.989884718119321e+02 - 7.909326598382663e+02 - 7.829558483527250e+02 - 7.750572805483002e+02 - 7.672362073200991e+02 - 7.594918862313154e+02 - 7.518235817392584e+02 - 7.442305655888715e+02 - 7.367121158939042e+02 - 7.292675176279554e+02 - 7.218960630476328e+02 - 7.145970504767349e+02 - 7.073697847820883e+02 - 7.002135778527235e+02 - 6.931277475695276e+02 - 6.861116184218383e+02 - 6.791645215373005e+02 - 6.722857937677298e+02 - 6.654747784472139e+02 - 6.587308253877042e+02 - 6.520532900189463e+02 - 6.454415341582659e+02 - 6.388949257382737e+02 - 6.324128381494658e+02 - 6.259946511571761e+02 - 6.196397502963263e+02 - 6.133475264197438e+02 - 6.071173768094372e+02 - 6.009487042352257e+02 - 5.948409165626937e+02 - 5.887934278801442e+02 - 5.828056577149104e+02 - 5.768770306335107e+02 - 5.710069770500405e+02 - 5.651949326339243e+02 - 5.594403381224611e+02 - 5.537426401234757e+02 - 5.481012901152631e+02 - 5.425157443662293e+02 - 5.369854648776029e+02 - 5.315099185870243e+02 - 5.260885773011631e+02 - 5.207209179649268e+02 - 5.154064223119497e+02 - 5.101445770921985e+02 - 5.049348740937783e+02 - 4.997768095346806e+02 - 4.946698844046663e+02 - 4.896136047862775e+02 - 4.846074811232588e+02 - 4.796510285618583e+02 - 4.747437670096575e+02 - 4.698852205388910e+02 - 4.650749179071526e+02 - 4.603123926691712e+02 - 4.555971823563725e+02 - 4.509288288727789e+02 - 4.463068788207030e+02 - 4.417308827523721e+02 - 4.372003955530256e+02 - 4.327149765501697e+02 - 4.282741889383891e+02 - 4.238776002586995e+02 - 4.195247821802792e+02 - 4.152153101301976e+02 - 4.109487639564401e+02 - 4.067247273397822e+02 - 4.025427875685178e+02 - 3.984025363858318e+02 - 3.943035692477232e+02 - 3.902454851077117e+02 - 3.862278871965347e+02 - 3.822503823673904e+02 - 3.783125809462488e+02 - 3.744140974100913e+02 - 3.705545496319825e+02 - 3.667335588488600e+02 - 3.629507504654170e+02 - 3.592057531920941e+02 - 3.554981990087823e+02 - 3.518277237997781e+02 - 3.481939667588409e+02 - 3.445965704231110e+02 - 3.410351808614133e+02 - 3.375094474036331e+02 - 3.340190228447264e+02 - 3.305635632260179e+02 - 3.271427276872922e+02 - 3.237561788604219e+02 - 3.204035826343936e+02 - 3.170846077594078e+02 - 3.137989262426811e+02 - 3.105462135925898e+02 - 3.073261480789523e+02 - 3.041384108878384e+02 - 3.009826866110996e+02 - 2.978586626197819e+02 - 2.947660292278245e+02 - 2.917044799774912e+02 - 2.886737110898206e+02 - 2.856734216347172e+02 - 2.827033138205502e+02 - 2.797630925185924e+02 - 2.768524653868921e+02 - 2.739711430162750e+02 - 2.711188386172004e+02 - 2.682952682417776e+02 - 2.655001507075566e+02 - 2.627332073441469e+02 - 2.599941621974095e+02 - 2.572827420191948e+02 - 2.545986760992428e+02 - 2.519416963867954e+02 - 2.493115374004747e+02 - 2.467079361520411e+02 - 2.441306322519956e+02 - 2.415793676749632e+02 - 2.390538868162835e+02 - 2.365539368283623e+02 - 2.340792670618049e+02 - 2.316296291092408e+02 - 2.292047772816256e+02 - 2.268044680583002e+02 - 2.244284601550858e+02 - 2.220765149177526e+02 - 2.197483957886078e+02 - 2.174438683808943e+02 - 2.151627007150871e+02 - 2.129046628991759e+02 - 2.106695273325222e+02 - 2.084570687245048e+02 - 2.062670637405841e+02 - 2.040992912166423e+02 - 2.019535322675416e+02 - 1.998295699356443e+02 - 1.977271893831886e+02 - 1.956461779038128e+02 - 1.935863247355415e+02 - 1.915474213798307e+02 - 1.895292611678483e+02 - 1.875316391958052e+02 - 1.855543528482985e+02 - 1.835972014670904e+02 - 1.816599861324650e+02 - 1.797425099308505e+02 - 1.778445779263947e+02 - 1.759659969484732e+02 - 1.741065756739388e+02 - 1.722661246609050e+02 - 1.704444562587039e+02 - 1.686413847511611e+02 - 1.668567261386198e+02 - 1.650902980928235e+02 - 1.633419201885993e+02 - 1.616114136777071e+02 - 1.598986014805750e+02 - 1.582033083619683e+02 - 1.565253606828442e+02 - 1.548645864376032e+02 - 1.532208154238845e+02 - 1.515938789750561e+02 - 1.499836100268175e+02 - 1.483898432531407e+02 - 1.468124148175615e+02 - 1.452511624739094e+02 - 1.437059256375598e+02 - 1.421765451600804e+02 - 1.406628634671130e+02 - 1.391647245894945e+02 - 1.376819739463268e+02 - 1.362144585029153e+02 - 1.347620267668397e+02 - 1.333245285902542e+02 - 1.319018153476916e+02 - 1.304937399101563e+02 - 1.291001564496927e+02 - 1.277209206089626e+02 - 1.263558894821456e+02 - 1.250049214462411e+02 - 1.236678763269726e+02 - 1.223446153162142e+02 - 1.210350008534558e+02 - 1.197388968258891e+02 - 1.184561684202564e+02 - 1.171866820332312e+02 - 1.159303054814129e+02 - 1.146869078350233e+02 - 1.134563593521917e+02 - 1.122385316718855e+02 - 1.110332976232454e+02 - 1.098405311979204e+02 - 1.086601077608261e+02 - 1.074919038117468e+02 - 1.063357969778381e+02 - 1.051916662270612e+02 - 1.040593916259906e+02 - 1.029388543466298e+02 - 1.018299368341955e+02 - 1.007325226151947e+02 - 9.964649633160360e+01 - 9.857174381861689e+01 - 9.750815195741964e+01 - 9.645560874783912e+01 - 9.541400332430685e+01 - 9.438322582683587e+01 - 9.336316750654088e+01 - 9.235372071959520e+01 - 9.135477878367931e+01 - 9.036623609174318e+01 - 8.938798812110527e+01 - 8.841993128541375e+01 - 8.746196304638978e+01 - 8.651398190997742e+01 - 8.557588728936869e+01 - 8.464757961904559e+01 - 8.372896034435935e+01 - 8.281993180539014e+01 - 8.192039735296085e+01 - 8.103026128111058e+01 - 8.014942874495698e+01 - 7.927780590401203e+01 - 7.841529983858037e+01 - 7.756181847617736e+01 - 7.671727071446733e+01 - 7.588156631674119e+01 - 7.505461587372024e+01 - 7.423633095310755e+01 - 7.342662394299153e+01 - 7.262540803009301e+01 - 7.183259736215271e+01 - 7.104810687905130e+01 - 7.027185230277652e+01 - 6.950375028269488e+01 - 6.874371822566854e+01 - 6.799167430460268e+01 - 6.724753760248480e+01 - 6.651122793902957e+01 - 6.578266588744034e+01 - 6.506177289160765e+01 - 6.434847109859102e+01 - 6.364268339115934e+01 - 6.294433351272004e+01 - 6.225334589309644e+01 - 6.156964567793161e+01 - 6.089315882540817e+01 - 6.022381196253272e+01 - 5.956153243192431e+01 - 5.890624835784802e+01 - 5.825788851805937e+01 - 5.761638239540161e+01 - 5.698166019812880e+01 - 5.635365277455941e+01 - 5.573229169643452e+01 - 5.511750921575248e+01 - 5.450923819422894e+01 - 5.390741220139490e+01 - 5.331196548214332e+01 - 5.272283288224639e+01 - 5.213994992103501e+01 - 5.156325275682114e+01 - 5.099267813956413e+01 - 5.042816349744366e+01 - 4.986964685712531e+01 - 4.931706681520628e+01 - 4.877036264381848e+01 - 4.822947419115650e+01 - 4.769434186145065e+01 - 4.716490671386568e+01 - 4.664111036072763e+01 - 4.612289496053356e+01 - 4.561020331071316e+01 - 4.510297873475514e+01 - 4.460116508782800e+01 - 4.410470685618211e+01 - 4.361354903662819e+01 - 4.312763714409483e+01 - 4.264691728541290e+01 - 4.217133607138089e+01 - 4.170084064118655e+01 - 4.123537869187841e+01 - 4.077489840121474e+01 - 4.031934846724150e+01 - 3.986867813088396e+01 - 3.942283710103097e+01 - 3.898177559914080e+01 - 3.854544435810492e+01 - 3.811379455962712e+01 - 3.768677789368684e+01 - 3.726434656726136e+01 - 3.684645322013298e+01 - 3.643305096011807e+01 - 3.602409338288954e+01 - 3.561953452360934e+01 - 3.521932891649128e+01 - 3.482343153306697e+01 - 3.443179775085747e+01 - 3.404438343901749e+01 - 3.366114490993698e+01 - 3.328203887889210e+01 - 3.290702252020257e+01 - 3.253605343510379e+01 - 3.216908962260722e+01 - 3.180608952699355e+01 - 3.144701200592500e+01 - 3.109181631097627e+01 - 3.074046212448961e+01 - 3.039290952642646e+01 - 3.004911898312090e+01 - 2.970905136572861e+01 - 2.937266792505025e+01 - 2.903993030352619e+01 - 2.871080057194543e+01 - 2.838524113862799e+01 - 2.806321475945346e+01 - 2.774468462701056e+01 - 2.742961427426368e+01 - 2.711796757973106e+01 - 2.680970882898042e+01 - 2.650480264209962e+01 - 2.620321398820359e+01 - 2.590490820737408e+01 - 2.560985096325826e+01 - 2.531800827674159e+01 - 2.502934653543958e+01 - 2.474383242809609e+01 - 2.446143296972707e+01 - 2.418211555345684e+01 - 2.390584787621480e+01 - 2.363259794654911e+01 - 2.336233413255323e+01 - 2.309502509558490e+01 - 2.283063979379989e+01 - 2.256914753657127e+01 - 2.231051792982671e+01 - 2.205472087402378e+01 - 2.180172658443576e+01 - 2.155150556919213e+01 - 2.130402866286656e+01 - 2.105926696778129e+01 - 2.081719185319289e+01 - 2.057777503962135e+01 - 2.034098850331043e+01 - 2.010680447006149e+01 - 1.987519550063876e+01 - 1.964613442528577e+01 - 1.941959432580914e+01 - 1.919554855827313e+01 - 1.897397075515799e+01 - 1.875483482712853e+01 - 1.853811494931854e+01 - 1.832378554313712e+01 - 1.811182128985819e+01 - 1.790219714756028e+01 - 1.769488831219516e+01 - 1.748987022919803e+01 - 1.728711861052799e+01 - 1.708660939866258e+01 - 1.688831878332332e+01 - 1.669222321036695e+01 - 1.649829934690638e+01 - 1.630652410217020e+01 - 1.611687463464447e+01 - 1.592932831698975e+01 - 1.574386275792588e+01 - 1.556045580679505e+01 - 1.537908552081595e+01 - 1.519973018767385e+01 - 1.502236832516821e+01 - 1.484697865494502e+01 - 1.467354012841447e+01 - 1.450203191274907e+01 - 1.433243337158686e+01 - 1.416472409674524e+01 - 1.399888388846149e+01 - 1.383489273805109e+01 - 1.367273085728561e+01 - 1.351237865788487e+01 - 1.335381673920349e+01 - 1.319702591751814e+01 - 1.304198719993403e+01 - 1.288868177614133e+01 - 1.273709104714046e+01 - 1.258719659672914e+01 - 1.243898018736778e+01 - 1.229242378719869e+01 - 1.214750954184370e+01 - 1.200421977308728e+01 - 1.186253699764556e+01 - 1.172244390266849e+01 - 1.158392335040491e+01 - 1.144695839482221e+01 - 1.131153225250660e+01 - 1.117762830926809e+01 - 1.104523013501555e+01 - 1.091432145806843e+01 - 1.078488617566414e+01 - 1.065690836231677e+01 - 1.053037224372639e+01 - 1.040526220941685e+01 - 1.028156282144551e+01 - 1.015925878941852e+01 - 1.003833498402321e+01 - 9.918776439618298e+00 - 9.800568334039683e+00 - 9.683696005431957e+00 - 9.568144946174611e+00 - 9.453900787919052e+00 - 9.340949322860192e+00 - 9.229276489267212e+00 - 9.118868359446189e+00 - 9.009711163642070e+00 - 8.901791273796370e+00 - 8.795095191785947e+00 - 8.689609570648638e+00 - 8.585321201853549e+00 - 8.482217005296002e+00 - 8.380284046581689e+00 - 8.279509523576925e+00 - 8.179880760330461e+00 - 8.081385224417300e+00 - 7.984010508389771e+00 - 7.887744326863491e+00 - 7.792574535206823e+00 - 7.698489109519010e+00 - 7.605476146133772e+00 - 7.513523878187234e+00 - 7.422620653280592e+00 - 7.332754935473541e+00 - 7.243915322674125e+00 - 7.156090524556396e+00 - 7.069269365741123e+00 - 6.983440797017198e+00 - 6.898593877074525e+00 - 6.814717779007339e+00 - 6.731801797516630e+00 - 6.649835331100769e+00 - 6.568807890289103e+00 - 6.488709103685009e+00 - 6.409528699865692e+00 - 6.331256515961359e+00 - 6.253882503643640e+00 - 6.177396712290002e+00 - 6.101789297547966e+00 - 6.027050522250886e+00 - 5.953170745278158e+00 - 5.880140434362498e+00 - 5.807950156612827e+00 - 5.736590570385212e+00 - 5.666052441485230e+00 - 5.596326632559173e+00 - 5.527404095182261e+00 - 5.459275884510260e+00 - 5.391933149962507e+00 - 5.325367127621260e+00 - 5.259569151260657e+00 - 5.194530647433734e+00 - 5.130243129823101e+00 - 5.066698206416531e+00 - 5.003887570881058e+00 - 4.941803001453549e+00 - 4.880436373900456e+00 - 4.819779643419130e+00 - 4.759824844738533e+00 - 4.700564110200850e+00 - 4.641989649988083e+00 - 4.584093751736625e+00 - 4.526868793565781e+00 - 4.470307230074105e+00 - 4.414401594729965e+00 - 4.359144507919768e+00 - 4.304528662004969e+00 - 4.250546825086277e+00 - 4.197191851627622e+00 - 4.144456666159979e+00 - 4.092334266478478e+00 - 4.040817732600400e+00 - 3.989900213340690e+00 - 3.939574930757155e+00 - 3.889835183170760e+00 - 3.840674335613269e+00 - 3.792085827136757e+00 - 3.744063169627271e+00 - 3.696599938809659e+00 - 3.649689781941428e+00 - 3.603326418080199e+00 - 3.557503628382808e+00 - 3.512215261374414e+00 - 3.467455236465362e+00 - 3.423217534816642e+00 - 3.379496201686086e+00 - 3.336285348654454e+00 - 3.293579148649655e+00 - 3.251371841226642e+00 - 3.209657725464606e+00 - 3.168431157939940e+00 - 3.127686563504146e+00 - 3.087418425005168e+00 - 3.047621281181530e+00 - 3.008289735457784e+00 - 2.969418446796439e+00 - 2.931002129285814e+00 - 2.893035560502260e+00 - 2.855513571053400e+00 - 2.818431044951714e+00 - 2.781782927380857e+00 - 2.745564215550934e+00 - 2.709769959926351e+00 - 2.674395268211684e+00 - 2.639435297946605e+00 - 2.604885259637663e+00 - 2.570740420206636e+00 - 2.536996093812299e+00 - 2.503647644969884e+00 - 2.470690493614489e+00 - 2.438120105903952e+00 - 2.405931997235836e+00 - 2.374121735683807e+00 - 2.342684934097179e+00 - 2.311617253784086e+00 - 2.280914406216957e+00 - 2.250572146781167e+00 - 2.220586279273893e+00 - 2.190952653478714e+00 - 2.161667162009881e+00 - 2.132725747880213e+00 - 2.104124396422602e+00 - 2.075859132902099e+00 - 2.047926031580743e+00 - 2.020321209266692e+00 - 1.993040822266800e+00 - 1.966081073072867e+00 - 1.939438205166541e+00 - 1.913108500802827e+00 - 1.887088286918805e+00 - 1.861373929947225e+00 - 1.835961834345823e+00 - 1.810848447621857e+00 - 1.786030255213551e+00 - 1.761503779943143e+00 - 1.737265586321442e+00 - 1.713312275115213e+00 - 1.689640483715834e+00 - 1.666246890168493e+00 - 1.643128207113473e+00 - 1.620281182788458e+00 - 1.597702604935450e+00 - 1.575389294699183e+00 - 1.553338108095691e+00 - 1.531545938928566e+00 - 1.510009713407906e+00 - 1.488726392261371e+00 - 1.467692971937850e+00 - 1.446906480207705e+00 - 1.426363979153670e+00 - 1.406062564959602e+00 - 1.385999363940103e+00 - 1.366171536058216e+00 - 1.346576274130787e+00 - 1.327210800124654e+00 - 1.308072368828510e+00 - 1.289158266486426e+00 - 1.270465807665891e+00 - 1.251992339187792e+00 - 1.233735237889272e+00 - 1.215691907984316e+00 - 1.197859785096899e+00 - 1.180236333919823e+00 - 1.162819045897185e+00 - 1.145605442741095e+00 - 1.128593073973588e+00 - 1.111779515284567e+00 - 1.095162371880828e+00 - 1.078739275475473e+00 - 1.062507883334588e+00 - 1.046465881646835e+00 - 1.030610981874106e+00 - 1.014940920295882e+00 - 9.994534611152829e-01 - 9.841463930086627e-01 - 9.690175291593270e-01 - 9.540647093618980e-01 - 9.392857969051628e-01 - 9.246786792729085e-01 - 9.102412696338000e-01 - 8.959715035501604e-01 - 8.818673402027871e-01 - 8.679267639726700e-01 - 8.541477806828601e-01 - 8.405284189410931e-01 - 8.270667316623297e-01 - 8.137607925445277e-01 - 8.006086976874616e-01 - 7.876085666023992e-01 - 7.747585387876328e-01 - 7.620567754307064e-01 - 7.495014602973783e-01 - 7.370907966216457e-01 - 7.248230088485250e-01 - 7.126963429559050e-01 - 7.007090638413013e-01 - 6.888594572109231e-01 - 6.771458292779966e-01 - 6.655665045807759e-01 - 6.541198279036498e-01 - 6.428041637825399e-01 - 6.316178947210964e-01 - 6.205594229105623e-01 - 6.096271692194244e-01 - 5.988195719936049e-01 - 5.881350889221284e-01 - 5.775721954595900e-01 - 5.671293841176136e-01 - 5.568051664208875e-01 - 5.465980707194322e-01 - 5.365066418737608e-01 - 5.265294432641988e-01 - 5.166650544231339e-01 - 5.069120710261563e-01 - 4.972691065208522e-01 - 4.877347899800689e-01 - 4.783077664492044e-01 - 4.689866979017357e-01 - 4.597702612073233e-01 - 4.506571489021905e-01 - 4.416460700276524e-01 - 4.327357479310139e-01 - 4.239249212044141e-01 - 4.152123442913231e-01 - 4.065967853823845e-01 - 3.980770275573000e-01 - 3.896518691214699e-01 - 3.813201217302061e-01 - 3.730806117264635e-01 - 3.649321798861945e-01 - 3.568736798624809e-01 - 3.489039797704173e-01 - 3.410219613244947e-01 - 3.332265187013593e-01 - 3.255165605086018e-01 - 3.178910083898543e-01 - 3.103487958586359e-01 - 3.028888701360887e-01 - 2.955101913786422e-01 - 2.882117315106021e-01 - 2.809924755137371e-01 - 2.738514204626846e-01 - 2.667875748867065e-01 - 2.597999604522775e-01 - 2.528876103054370e-01 - 2.460495685714950e-01 - 2.392848919788540e-01 - 2.325926484518769e-01 - 2.259719167857841e-01 - 2.194217877354759e-01 - 2.129413627175208e-01 - 2.065297538274627e-01 - 2.001860848470379e-01 - 1.939094897086202e-01 - 1.876991127051828e-01 - 1.815541094417414e-01 - 1.754736452756007e-01 - 1.694568956974621e-01 - 1.635030470498157e-01 - 1.576112950508609e-01 - 1.517808453564031e-01 - 1.460109140364644e-01 - 1.403007261766342e-01 - 1.346495165784953e-01 - 1.290565300180611e-01 - 1.235210199704221e-01 - 1.180422494287421e-01 - 1.126194909047226e-01 - 1.072520253105725e-01 - 1.019391428882170e-01 - 9.668014295417104e-02 - 9.147433293860986e-02 - 8.632102939670111e-02 - 8.121955756354367e-02 - 7.616925052308399e-02 - 7.116945022739722e-02 - 6.621950693894064e-02 - 6.131877854698166e-02 - 5.646663155698649e-02 - 5.166244039926220e-02 - 4.690558691983024e-02 - 4.219546135291571e-02 - 3.753146148005052e-02 - 3.291299228995687e-02 - 2.833946692296159e-02 - 2.381030573044091e-02 - 1.932493608562982e-02 - 1.488279323951757e-02 - 1.048331933378767e-02 - 6.125963364112487e-03 - 1.810181928441051e-03 - -2.464561780353438e-03 - -6.698797872311066e-03 - -1.089304914227914e-02 - -1.504783206514415e-02 - -1.916365656771068e-02 - -2.324102555134537e-02 - -2.728043585421590e-02 - -3.128237791440187e-02 - -3.524733543518016e-02 - -3.917578628623598e-02 - -4.306820207473552e-02 - -4.692504798332473e-02 - -5.074678357205704e-02 - -5.453386225593208e-02 - -5.828673132987599e-02 - -6.200583267980977e-02 - -6.569160218738558e-02 - -6.934446987831328e-02 - -7.296486055963237e-02 - -7.655319319650564e-02 - -8.010988114185758e-02 - -8.363533270338043e-02 - -8.712995053780122e-02 - -9.059413193193132e-02 - -9.402826926020177e-02 - -9.743274938790861e-02 - -1.008079541064505e-01 - -1.041542604608216e-01 - -1.074720401131623e-01 - -1.107616598682374e-01 - -1.140234819193764e-01 - -1.172578632830942e-01 - -1.204651563472630e-01 - -1.236457089966172e-01 - -1.267998640735528e-01 - -1.299279600346222e-01 - -1.330303309819349e-01 - -1.361073061299021e-01 - -1.391592104828469e-01 - -1.421863647988072e-01 - -1.451890851855495e-01 - -1.481676836992942e-01 - -1.511224682100277e-01 - -1.540537421399553e-01 - -1.569618050599837e-01 - -1.598469524764272e-01 - -1.627094755828420e-01 - -1.655496618778017e-01 - -1.683677949236447e-01 - -1.711641541517163e-01 - -1.739390154343296e-01 - -1.766926508045859e-01 - -1.794253283544359e-01 - -1.821373127460387e-01 - -1.848288648981078e-01 - -1.875002419786971e-01 - -1.901516978443653e-01 - -1.927834826976386e-01 - -1.953958431846420e-01 - -1.979890227559544e-01 - -2.005632612952037e-01 - -2.031187952951354e-01 - -2.056558581586019e-01 - -2.081746798356756e-01 - -2.106754870586183e-01 - -2.131585035595214e-01 - -2.156239496932611e-01 - -2.180720427808593e-01 - -2.205029972492180e-01 - -2.229170242226580e-01 - -2.253143319488933e-01 - -2.276951258807381e-01 - -2.300596082676421e-01 - -2.324079786235529e-01 - -2.347404337552020e-01 - -2.370571673694448e-01 - -2.393583705568364e-01 - -2.416442317867498e-01 - -2.439149365965413e-01 - -2.461706679522762e-01 - -2.484116061949506e-01 - -2.506379289887288e-01 - -2.528498115997045e-01 - -2.550474267213886e-01 - -2.572309443123204e-01 - -2.594005320626763e-01 - -2.615563552809436e-01 - -2.636985766193694e-01 - -2.658273564814242e-01 - -2.679428529152917e-01 - -2.700452216727706e-01 - -2.721346163277996e-01 - -2.742111879420810e-01 - -2.762750854486131e-01 - -2.783264557785196e-01 - -2.803654434689624e-01 - -2.823921908087395e-01 - -2.844068381756654e-01 - -2.864095239109061e-01 - -2.884003839950212e-01 - -2.903795524955394e-01 - -2.923471617904532e-01 - -2.943033420191942e-01 - -2.962482212763220e-01 - -2.981819256807660e-01 - -3.001045795717013e-01 - -3.020163055275332e-01 - -3.039172239885258e-01 - -3.058074538261057e-01 - -3.076871122705734e-01 - -3.095563141516905e-01 - -3.114151727559051e-01 - -3.132637999546681e-01 - -3.151023057635463e-01 - -3.169307984585886e-01 - -3.187493845723606e-01 - -3.205581689117248e-01 - -3.223572548745565e-01 - -3.241467443749414e-01 - -3.259267374142799e-01 - -3.276973325691862e-01 - -3.294586270053045e-01 - -3.312107160890871e-01 - -3.329536937962613e-01 - -3.346876527428858e-01 - -3.364126840777460e-01 - -3.381288775295205e-01 - -3.398363212268976e-01 - -3.415351019703767e-01 - -3.432253052941175e-01 - -3.449070152459444e-01 - -3.465803145779997e-01 - -3.482452848007116e-01 - -3.499020059501182e-01 - -3.515505568826250e-01 - -3.531910152859590e-01 - -3.548234573752725e-01 - -3.564479582224311e-01 - -3.580645917875246e-01 - -3.596734306319520e-01 - -3.612745463110025e-01 - -3.628680093075062e-01 - -3.644538885605036e-01 - -3.660322520458910e-01 - -3.676031668332329e-01 - -3.691666987516095e-01 - -3.707229124779602e-01 - -3.722718716670178e-01 - -3.738136390608672e-01 - -3.753482761467254e-01 - -3.768758432749062e-01 - -3.783964002465877e-01 - -3.799100056353694e-01 - -3.814167166997948e-01 - -3.829165900177774e-01 - -3.844096813827866e-01 - -3.858960456354959e-01 - -3.873757364088854e-01 - -3.888488064600710e-01 - -3.903153077375676e-01 - -3.917752913452379e-01 - -3.932288075353338e-01 - -3.946759055987133e-01 - -3.961166339473677e-01 - -3.975510402779339e-01 - -3.989791715122148e-01 - -4.004010735521537e-01 - -4.018167915706618e-01 - -4.032263700983349e-01 - -4.046298528561717e-01 - -4.060272827301947e-01 - -4.074187016384220e-01 - -4.088041511045764e-01 - -4.101836719923956e-01 - -4.115573039941210e-01 - -4.129250863351419e-01 - -4.142870577221169e-01 - -4.156432559911067e-01 - -4.169937183587125e-01 - -4.183384813924751e-01 - -4.196775807600287e-01 - -4.210110517890521e-01 - -4.223389293056927e-01 - -4.236612469859990e-01 - -4.249780381358575e-01 - -4.262893357128523e-01 - -4.275951718561576e-01 - -4.288955781548201e-01 - -4.301905856512787e-01 - -4.314802245948859e-01 - -4.327645248125306e-01 - -4.340435157401011e-01 - -4.353172261319986e-01 - -4.365856843065750e-01 - -4.378489181140523e-01 - -4.391069545111200e-01 - -4.403598201489721e-01 - -4.416075414900063e-01 - -4.428501441617211e-01 - -4.440876533447125e-01 - -4.453200938994337e-01 - -4.465474900663732e-01 - -4.477698656375739e-01 - -4.489872440132049e-01 - -4.501996482091757e-01 - -4.514071007293397e-01 - -4.526096234423685e-01 - -4.538072381973440e-01 - -4.549999664346564e-01 - -4.561878287239103e-01 - -4.573708454564815e-01 - -4.585490367840940e-01 - -4.597224223838171e-01 - -4.608910215483196e-01 - -4.620548532229073e-01 - -4.632139359470852e-01 - -4.643682878385313e-01 - -4.655179266829866e-01 - -4.666628700026897e-01 - -4.678031349656974e-01 - -4.689387384105899e-01 - -4.700696968538801e-01 - -4.711960263436956e-01 - -4.723177425902391e-01 - -4.734348612979066e-01 - -4.745473978039702e-01 - -4.756553669920032e-01 - -4.767587833133353e-01 - -4.778576611599107e-01 - -4.789520147944609e-01 - -4.800418577229591e-01 - -4.811272034289876e-01 - -4.822080654661853e-01 - -4.832844566828151e-01 - -4.843563896207272e-01 - -4.854238767122197e-01 - -4.864869303811440e-01 - -4.875455627166793e-01 - -4.885997853037442e-01 - -4.896496095260600e-01 - -4.906950466868944e-01 - -4.917361080077966e-01 - -4.927728043326091e-01 - -4.938051461993963e-01 - -4.948331438840640e-01 - -4.958568075736277e-01 - -4.968761473512240e-01 - -4.978911731225704e-01 - -4.989018945002663e-01 - -4.999083208482176e-01 - -5.009104613021941e-01 - -5.019083248972503e-01 - -5.029019205602130e-01 - -5.038912570358333e-01 - -5.048763428126108e-01 - -5.058571862004539e-01 - -5.068337954285524e-01 - -5.078061785541023e-01 - -5.087743434557772e-01 - -5.097382978215317e-01 - -5.106980492175714e-01 - -5.116536051046018e-01 - -5.126049728172039e-01 - -5.135521595357905e-01 - -5.144951722594635e-01 - -5.154340177423219e-01 - -5.163687027408718e-01 - -5.172992340140365e-01 - -5.182256180631845e-01 - -5.191478612397169e-01 - -5.200659697981208e-01 - -5.209799499565910e-01 - -5.218898077706294e-01 - -5.227955490891694e-01 - -5.236971796844924e-01 - -5.245947053253370e-01 - -5.254881317688337e-01 - -5.263774645512288e-01 - -5.272627090126604e-01 - -5.281438703531137e-01 - -5.290209539977515e-01 - -5.298939652703512e-01 - -5.307629091340913e-01 - -5.316277904778723e-01 - -5.324886142110474e-01 - -5.333453852986519e-01 - -5.341981085648844e-01 - -5.350467886587517e-01 - -5.358914300418783e-01 - -5.367320373706596e-01 - -5.375686152841432e-01 - -5.384011680734792e-01 - -5.392297001047128e-01 - -5.400542157871245e-01 - -5.408747194069761e-01 - -5.416912150785628e-01 - -5.425037068232484e-01 - -5.433121987186342e-01 - -5.441166948984431e-01 - -5.449171994793097e-01 - -5.457137163885653e-01 - -5.465062494211190e-01 - -5.472948023341125e-01 - -5.480793790518950e-01 - -5.488599834110802e-01 - -5.496366191273470e-01 - -5.504092899443518e-01 - -5.511779994928784e-01 - -5.519427513029639e-01 - -5.527035490710489e-01 - -5.534603964642170e-01 - -5.542132970155166e-01 - -5.549622540841348e-01 - -5.557072711574547e-01 - -5.564483519201564e-01 - -5.571854997347668e-01 - -5.579187179919134e-01 - -5.586480102698358e-01 - -5.593733798207278e-01 - -5.600948299343745e-01 - -5.608123641702291e-01 - -5.615259858006734e-01 - -5.622356980349319e-01 - -5.629415042452564e-01 - -5.636434078437447e-01 - -5.643414121719204e-01 - -5.650355204128609e-01 - -5.657257359067179e-01 - -5.664120620074502e-01 - -5.670945018655422e-01 - -5.677730587569899e-01 - -5.684477360210265e-01 - -5.691185368946378e-01 - -5.697854646230838e-01 - -5.704485224954847e-01 - -5.711077138615709e-01 - -5.717630418949810e-01 - -5.724145097236072e-01 - -5.730621208149326e-01 - -5.737058785857441e-01 - -5.743457862811681e-01 - -5.749818469287452e-01 - -5.756140639044424e-01 - -5.762424408221788e-01 - -5.768669806578469e-01 - -5.774876866716016e-01 - -5.781045625480883e-01 - -5.787176116189466e-01 - -5.793268371095267e-01 - -5.799322422747063e-01 - -5.805338304985933e-01 - -5.811316053198213e-01 - -5.817255703521417e-01 - -5.823157287697720e-01 - -5.829020838792335e-01 - -5.834846393919914e-01 - -5.840633987477251e-01 - -5.846383653791880e-01 - -5.852095428966003e-01 - -5.857769347455314e-01 - -5.863405444497650e-01 - -5.869003757905312e-01 - -5.874564321893059e-01 - -5.880087171065591e-01 - -5.885572344676900e-01 - -5.891019879107314e-01 - -5.896429809482692e-01 - -5.901802172691951e-01 - -5.907137006344829e-01 - -5.912434348345698e-01 - -5.917694236578408e-01 - -5.922916709366750e-01 - -5.928101804947136e-01 - -5.933249560457028e-01 - -5.938360014505492e-01 - -5.943433207019595e-01 - -5.948469177828256e-01 - -5.953467966083078e-01 - -5.958429610716830e-01 - -5.963354151930935e-01 - -5.968241629967538e-01 - -5.973092085065336e-01 - -5.977905558475627e-01 - -5.982682091919279e-01 - -5.987421727060626e-01 - -5.992124504335189e-01 - -5.996790465513929e-01 - -6.001419654039183e-01 - -6.006012111567195e-01 - -6.010567880969444e-01 - -6.015087007096906e-01 - -6.019569532209035e-01 - -6.024015499278780e-01 - -6.028424953542454e-01 - -6.032797938560218e-01 - -6.037134498528102e-01 - -6.041434679778884e-01 - -6.045698527611498e-01 - -6.049926086966888e-01 - -6.054117403213235e-01 - -6.058272522301629e-01 - -6.062391491063152e-01 - -6.066474357377917e-01 - -6.070521167750024e-01 - -6.074531969194140e-01 - -6.078506811508277e-01 - -6.082445741313003e-01 - -6.086348804777613e-01 - -6.090216052590219e-01 - -6.094047534940796e-01 - -6.097843300758768e-01 - -6.101603397998798e-01 - -6.105327877567767e-01 - -6.109016791586246e-01 - -6.112670188349342e-01 - -6.116288118244032e-01 - -6.119870634033990e-01 - -6.123417788015699e-01 - -6.126929631816058e-01 - -6.130406216857481e-01 - -6.133847595846266e-01 - -6.137253821544012e-01 - -6.140624946688724e-01 - -6.143961025253998e-01 - -6.147262111225434e-01 - -6.150528258526081e-01 - -6.153759522847098e-01 - -6.156955958775930e-01 - -6.160117619293205e-01 - -6.163244560848270e-01 - -6.166336840291214e-01 - -6.169394513190288e-01 - -6.172417635406579e-01 - -6.175406263458638e-01 - -6.178360454670117e-01 - -6.181280266570051e-01 - -6.184165756494230e-01 - -6.187016981615432e-01 - -6.189834001775048e-01 - -6.192616876391890e-01 - -6.195365661632112e-01 - -6.198080416901866e-01 - -6.200761202902517e-01 - -6.203408078682074e-01 - -6.206021103982113e-01 - -6.208600339819080e-01 - -6.211145848662764e-01 - -6.213657689929696e-01 - -6.216135922609831e-01 - -6.218580610691606e-01 - -6.220991816188346e-01 - -6.223369599996067e-01 - -6.225714026287344e-01 - -6.228025157602012e-01 - -6.230303055354752e-01 - -6.232547783843585e-01 - -6.234759406837302e-01 - -6.236937987287140e-01 - -6.239083589372102e-01 - -6.241196278170006e-01 - -6.243276119301496e-01 - -6.245323178052680e-01 - -6.247337518435782e-01 - -6.249319204108740e-01 - -6.251268303788342e-01 - -6.253184884524475e-01 - -6.255069009766967e-01 - -6.256920746682559e-01 - -6.258740163701917e-01 - -6.260527328726909e-01 - -6.262282307801417e-01 - -6.264005167589047e-01 - -6.265695976839164e-01 - -6.267354804070123e-01 - -6.268981717782514e-01 - -6.270576786775590e-01 - -6.272140080071444e-01 - -6.273671666729116e-01 - -6.275171615794166e-01 - -6.276639997579259e-01 - -6.278076882572314e-01 - -6.279482340166599e-01 - -6.280856440870369e-01 - -6.282199255881125e-01 - -6.283510856176625e-01 - -6.284791313265480e-01 - -6.286040698559974e-01 - -6.287259082244099e-01 - -6.288446536460758e-01 - -6.289603134448759e-01 - -6.290728947784819e-01 - -6.291824049507972e-01 - -6.292888513285516e-01 - -6.293922409846477e-01 - -6.294925812787570e-01 - -6.295898797737625e-01 - -6.296841435561055e-01 - -6.297753800606519e-01 - -6.298635970427606e-01 - -6.299488015475858e-01 - -6.300310009429952e-01 - -6.301102030719377e-01 - -6.301864151575183e-01 - -6.302596446383568e-01 - -6.303298993873763e-01 - -6.303971867419816e-01 - -6.304615141097702e-01 - -6.305228892569528e-01 - -6.305813198299395e-01 - -6.306368133767261e-01 - -6.306893774095105e-01 - -6.307390196514921e-01 - -6.307857478830511e-01 - -6.308295697989852e-01 - -6.308704929504492e-01 - -6.309085250312678e-01 - -6.309436740902202e-01 - -6.309759477467396e-01 - -6.310053535533821e-01 - -6.310318994644450e-01 - -6.310555933584764e-01 - -6.310764430051494e-01 - -6.310944561130111e-01 - -6.311096405770181e-01 - -6.311220043955681e-01 - -6.311315554778594e-01 - -6.311383016234806e-01 - -6.311422506666780e-01 - -6.311434107412031e-01 - -6.311417897164122e-01 - -6.311373953205278e-01 - -6.311302357049288e-01 - -6.311203189243589e-01 - -6.311076528624781e-01 - -6.310922454230109e-01 - -6.310741047155799e-01 - -6.310532389686786e-01 - -6.310296560496979e-01 - -6.310033639455465e-01 - -6.309743708604478e-01 - -6.309426848479184e-01 - -6.309083139781310e-01 - -6.308712663782245e-01 - -6.308315500367087e-01 - -6.307891730465176e-01 - -6.307441436976022e-01 - -6.306964701860184e-01 - -6.306461606431758e-01 - -6.305932231701467e-01 - -6.305376659121696e-01 - -6.304794970062023e-01 - -6.304187245700347e-01 - -6.303553569805046e-01 - -6.302894025962669e-01 - -6.302208694979176e-01 - -6.301497657748981e-01 - -6.300760996409697e-01 - -6.299998795100692e-01 - -6.299211136514613e-01 - -6.298398102240708e-01 - -6.297559773915322e-01 - -6.296696236381925e-01 - -6.295807574013027e-01 - -6.294893864698483e-01 - -6.293955192818200e-01 - -6.292991645521353e-01 - -6.292003301703828e-01 - -6.290990243894826e-01 - -6.289952557946986e-01 - -6.288890326523825e-01 - -6.287803632353285e-01 - -6.286692558944412e-01 - -6.285557190083507e-01 - -6.284397608763040e-01 - -6.283213897612988e-01 - -6.282006141317734e-01 - -6.280774423035318e-01 - -6.279518824496017e-01 - -6.278239431715447e-01 - -6.276936329659792e-01 - -6.275609600561086e-01 - -6.274259327786519e-01 - -6.272885594754783e-01 - -6.271488484695774e-01 - -6.270068083043618e-01 - -6.268624473656752e-01 - -6.267157737459064e-01 - -6.265667960682418e-01 - -6.264155229504741e-01 - -6.262619625962428e-01 - -6.261061232036680e-01 - -6.259480131935671e-01 - -6.257876413121770e-01 - -6.256250157840939e-01 - -6.254601447340036e-01 - -6.252930366972961e-01 - -6.251237002207461e-01 - -6.249521437614608e-01 - -6.247783756272571e-01 - -6.246024042025771e-01 - -6.244242378628240e-01 - -6.242438848129136e-01 - -6.240613535991787e-01 - -6.238766528797192e-01 - -6.236897908519111e-01 - -6.235007757894835e-01 - -6.233096161276966e-01 - -6.231163203935827e-01 - -6.229208970207127e-01 - -6.227233543185018e-01 - -6.225237005131427e-01 - -6.223219439896936e-01 - -6.221180932821515e-01 - -6.219121568092019e-01 - -6.217041429518334e-01 - -6.214940600654550e-01 - -6.212819164164759e-01 - -6.210677203231969e-01 - -6.208514802076882e-01 - -6.206332045396580e-01 - -6.204129016762088e-01 - -6.201905798335827e-01 - -6.199662474146647e-01 - -6.197399127976954e-01 - -6.195115842446862e-01 - -6.192812702436963e-01 - -6.190489791767655e-01 - -6.188147191241502e-01 - -6.185784984898128e-01 - -6.183403256742428e-01 - -6.181002088023494e-01 - -6.178581563548247e-01 - -6.176141767575239e-01 - -6.173682779492388e-01 - -6.171204683326561e-01 - -6.168707564823446e-01 - -6.166191506410910e-01 - -6.163656588303806e-01 - -6.161102891648960e-01 - -6.158530502595377e-01 - -6.155939503803246e-01 - -6.153329975648972e-01 - -6.150702000825419e-01 - -6.148055662334609e-01 - -6.145391042808102e-01 - -6.142708224010276e-01 - -6.140007288452335e-01 - -6.137288318637003e-01 - -6.134551394181680e-01 - -6.131796597624336e-01 - -6.129024013716257e-01 - -6.126233721919256e-01 - -6.123425803085120e-01 - -6.120600340492245e-01 - -6.117757414641359e-01 - -6.114897106263320e-01 - -6.112019497520672e-01 - -6.109124671249474e-01 - -6.106212708396386e-01 - -6.103283687668304e-01 - -6.100337690977098e-01 - -6.097374799911853e-01 - -6.094395093910078e-01 - -6.091398653642833e-01 - -6.088385561024087e-01 - -6.085355898356886e-01 - -6.082309742898534e-01 - -6.079247173286892e-01 - -6.076168274335947e-01 - -6.073073125569597e-01 - -6.069961804304546e-01 - -6.066834389911383e-01 - -6.063690964791788e-01 - -6.060531610171422e-01 - -6.057356401425160e-01 - -6.054165419100932e-01 - -6.050958745176729e-01 - -6.047736455801236e-01 - -6.044498630713394e-01 - -6.041245351487873e-01 - -6.037976695799242e-01 - -6.034692741523835e-01 - -6.031393567367498e-01 - -6.028079252312161e-01 - -6.024749874110954e-01 - -6.021405510415967e-01 - -6.018046242357692e-01 - -6.014672148046522e-01 - -6.011283302871711e-01 - -6.007879786053585e-01 - -6.004461675660895e-01 - -6.001029047914931e-01 - -5.997581981158361e-01 - -5.994120553308485e-01 - -5.990644841299763e-01 - -5.987154923482985e-01 - -5.983650876334137e-01 - -5.980132773866208e-01 - -5.976600693793478e-01 - -5.973054714798371e-01 - -5.969494914365839e-01 - -5.965921366499265e-01 - -5.962334146660923e-01 - -5.958733334161985e-01 - -5.955119002909084e-01 - -5.951491227180785e-01 - -5.947850085981863e-01 - -5.944195652847630e-01 - -5.940528001366523e-01 - -5.936847210858313e-01 - -5.933153356463837e-01 - -5.929446511281147e-01 - -5.925726749957585e-01 - -5.921994146776245e-01 - -5.918248776317639e-01 - -5.914490714685531e-01 - -5.910720036664838e-01 - -5.906936815737919e-01 - -5.903141124838686e-01 - -5.899333037986367e-01 - -5.895512629817115e-01 - -5.891679973989596e-01 - -5.887835143677140e-01 - -5.883978211708401e-01 - -5.880109250637769e-01 - -5.876228334774148e-01 - -5.872335538851382e-01 - -5.868430932520374e-01 - -5.864514587624869e-01 - -5.860586578978172e-01 - -5.856646978273519e-01 - -5.852695857497323e-01 - -5.848733289413443e-01 - -5.844759343592291e-01 - -5.840774091773326e-01 - -5.836777608879199e-01 - -5.832769964405170e-01 - -5.828751228494087e-01 - -5.824721474461222e-01 - -5.820680771414760e-01 - -5.816629188869962e-01 - -5.812566799399100e-01 - -5.808493672421570e-01 - -5.804409877894702e-01 - -5.800315488931496e-01 - -5.796210574409676e-01 - -5.792095201878247e-01 - -5.787969440874288e-01 - -5.783833362006023e-01 - -5.779687035684036e-01 - -5.775530530727403e-01 - -5.771363914738108e-01 - -5.767187255974381e-01 - -5.763000625573806e-01 - -5.758804091701334e-01 - -5.754597721176316e-01 - -5.750381583420940e-01 - -5.746155745735496e-01 - -5.741920274506414e-01 - -5.737675239291555e-01 - -5.733420708457294e-01 - -5.729156748671344e-01 - -5.724883426083383e-01 - -5.720600807791615e-01 - -5.716308961653045e-01 - -5.712007954599810e-01 - -5.707697852850102e-01 - -5.703378722272431e-01 - -5.699050629355835e-01 - -5.694713639828742e-01 - -5.690367818720566e-01 - -5.686013232951076e-01 - -5.681649948578290e-01 - -5.677278029894381e-01 - -5.672897541841998e-01 - -5.668508549514105e-01 - -5.664111117923113e-01 - -5.659705312703284e-01 - -5.655291198708162e-01 - -5.650868839171556e-01 - -5.646438297396282e-01 - -5.641999637601537e-01 - -5.637552925169101e-01 - -5.633098223391846e-01 - -5.628635595080524e-01 - -5.624165104013904e-01 - -5.619686812129524e-01 - -5.615200782186582e-01 - -5.610707080464411e-01 - -5.606205767194389e-01 - -5.601696901727680e-01 - -5.597180550627928e-01 - -5.592656777039943e-01 - -5.588125640834879e-01 - -5.583587201544192e-01 - -5.579041522213387e-01 - -5.574488666805684e-01 - -5.569928694014434e-01 - -5.565361664370690e-01 - -5.560787640439252e-01 - -5.556206683493946e-01 - -5.551618853326125e-01 - -5.547024208857518e-01 - -5.542422809960397e-01 - -5.537814718214656e-01 - -5.533199995563840e-01 - -5.528578699065892e-01 - -5.523950887012330e-01 - -5.519316620139326e-01 - -5.514675956847120e-01 - -5.510028956792654e-01 - -5.505375681122012e-01 - -5.500716185256428e-01 - -5.496050526609592e-01 - -5.491378767346244e-01 - -5.486700964364043e-01 - -5.482017173715276e-01 - -5.477327453596050e-01 - -5.472631862648399e-01 - -5.467930458019109e-01 - -5.463223294669347e-01 - -5.458510432287255e-01 - -5.453791929736209e-01 - -5.449067840000759e-01 - -5.444338218966174e-01 - -5.439603123952597e-01 - -5.434862611282417e-01 - -5.430116738240560e-01 - -5.425365561436022e-01 - -5.420609134355956e-01 - -5.415847511352451e-01 - -5.411080748136494e-01 - -5.406308901525899e-01 - -5.401532026526268e-01 - -5.396750177177082e-01 - -5.391963408895222e-01 - -5.387171774649071e-01 - -5.382375326730170e-01 - -5.377574122460893e-01 - -5.372768215524759e-01 - -5.367957656717409e-01 - -5.363142502106338e-01 - -5.358322806031541e-01 - -5.353498619928253e-01 - -5.348669995911720e-01 - -5.343836987381033e-01 - -5.338999648334884e-01 - -5.334158029976483e-01 - -5.329312184607295e-01 - -5.324462166033185e-01 - -5.319608023124877e-01 - -5.314749807283198e-01 - -5.309887574568507e-01 - -5.305021373834015e-01 - -5.300151254489873e-01 - -5.295277270550899e-01 - -5.290399471460621e-01 - -5.285517906644440e-01 - -5.280632628772480e-01 - -5.275743687930865e-01 - -5.270851133485194e-01 - -5.265955015863814e-01 - -5.261055383771222e-01 - -5.256152286457003e-01 - -5.251245776074701e-01 - -5.246335901741112e-01 - -5.241422711040373e-01 - -5.236506252667474e-01 - -5.231586574906982e-01 - -5.226663726352896e-01 - -5.221737757253558e-01 - -5.216808715970676e-01 - -5.211876649797802e-01 - -5.206941607382560e-01 - -5.202003635069621e-01 - -5.197062778404161e-01 - -5.192119087096243e-01 - -5.187172609937223e-01 - -5.182223393579939e-01 - -5.177271482807863e-01 - -5.172316923981860e-01 - -5.167359765148800e-01 - -5.162400053033168e-01 - -5.157437833544083e-01 - -5.152473152222008e-01 - -5.147506055161414e-01 - -5.142536587718484e-01 - -5.137564794429633e-01 - -5.132590721404230e-01 - -5.127614414610688e-01 - -5.122635918987255e-01 - -5.117655278912282e-01 - -5.112672538418732e-01 - -5.107687741570007e-01 - -5.102700934318621e-01 - -5.097712161511054e-01 - -5.092721464952894e-01 - -5.087728887586368e-01 - -5.082734473837237e-01 - -5.077738269224511e-01 - -5.072740315773641e-01 - -5.067740655070005e-01 - -5.062739331645890e-01 - -5.057736389339202e-01 - -5.052731870571522e-01 - -5.047725816027976e-01 - -5.042718267556677e-01 - -5.037709267723895e-01 - -5.032698858620083e-01 - -5.027687082997551e-01 - -5.022673983228978e-01 - -5.017659599138892e-01 - -5.012643972224838e-01 - -5.007627144504877e-01 - -5.002609154317549e-01 - -4.997590043686060e-01 - -4.992569856498065e-01 - -4.987548629163329e-01 - -4.982526401066572e-01 - -4.977503215591422e-01 - -4.972479113357710e-01 - -4.967454132608579e-01 - -4.962428310876830e-01 - -4.957401690448965e-01 - -4.952374311333114e-01 - -4.947346209581790e-01 - -4.942317423902789e-01 - -4.937287995168010e-01 - -4.932257964768885e-01 - -4.927227367709692e-01 - -4.922196239985463e-01 - -4.917164622446805e-01 - -4.912132554897460e-01 - -4.907100074652099e-01 - -4.902067216434476e-01 - -4.897034018910860e-01 - -4.892000521396699e-01 - -4.886966760659724e-01 - -4.881932772071136e-01 - -4.876898592264887e-01 - -4.871864261030248e-01 - -4.866829812293292e-01 - -4.861795280147214e-01 - -4.856760706607693e-01 - -4.851726126266216e-01 - -4.846691571189501e-01 - -4.841657080652781e-01 - -4.836622690168214e-01 - -4.831588433295234e-01 - -4.826554347812969e-01 - -4.821520468729375e-01 - -4.816486828820545e-01 - -4.811453462713459e-01 - -4.806420406166251e-01 - -4.801387695127853e-01 - -4.796355363816449e-01 - -4.791323444815042e-01 - -4.786291970695780e-01 - -4.781260978727254e-01 - -4.776230503252043e-01 - -4.771200574973888e-01 - -4.766171228253449e-01 - -4.761142497486388e-01 - -4.756114415594656e-01 - -4.751087014547341e-01 - -4.746060327035595e-01 - -4.741034386828772e-01 - -4.736009226286348e-01 - -4.730984877717556e-01 - -4.725961373913972e-01 - -4.720938746127822e-01 - -4.715917026117559e-01 - -4.710896247171748e-01 - -4.705876440070008e-01 - -4.700857635192827e-01 - -4.695839864443119e-01 - -4.690823160197067e-01 - -4.685807553687465e-01 - -4.680793073815264e-01 - -4.675779752270572e-01 - -4.670767621237579e-01 - -4.665756710130068e-01 - -4.660747048828000e-01 - -4.655738667469987e-01 - -4.650731595624170e-01 - -4.645725864569897e-01 - -4.640721505529091e-01 - -4.635718546060059e-01 - -4.630717014390969e-01 - -4.625716940204364e-01 - -4.620718354412200e-01 - -4.615721285948061e-01 - -4.610725762550177e-01 - -4.605731814392849e-01 - -4.600739469669758e-01 - -4.595748755034438e-01 - -4.590759700613133e-01 - -4.585772335293120e-01 - -4.580786685902926e-01 - -4.575802780165928e-01 - -4.570820645542124e-01 - -4.565840309327809e-01 - -4.560861801183225e-01 - -4.555885148408127e-01 - -4.550910375242214e-01 - -4.545937511574892e-01 - -4.540966585092119e-01 - -4.535997618400510e-01 - -4.531030641427475e-01 - -4.526065682230286e-01 - -4.521102761991050e-01 - -4.516141909960451e-01 - -4.511183155232459e-01 - -4.506226519976986e-01 - -4.501272029129367e-01 - -4.496319709853875e-01 - -4.491369589904647e-01 - -4.486421693813144e-01 - -4.481476045149588e-01 - -4.476532669406306e-01 - -4.471591591812127e-01 - -4.466652837454304e-01 - -4.461716431800687e-01 - -4.456782399407630e-01 - -4.451850764283579e-01 - -4.446921550770006e-01 - -4.441994783152980e-01 - -4.437070485743053e-01 - -4.432148683148817e-01 - -4.427229399164072e-01 - -4.422312656936392e-01 - -4.417398479943503e-01 - -4.412486891611525e-01 - -4.407577915365379e-01 - -4.402671575060104e-01 - -4.397767893532367e-01 - -4.392866892910770e-01 - -4.387968597340107e-01 - -4.383073029681190e-01 - -4.378180210879689e-01 - -4.373290163087382e-01 - -4.368402909924953e-01 - -4.363518475687816e-01 - -4.358636880897754e-01 - -4.353758146064535e-01 - -4.348882293452391e-01 - -4.344009344375495e-01 - -4.339139321041776e-01 - -4.334272247184532e-01 - -4.329408142509990e-01 - -4.324547026649819e-01 - -4.319688922210647e-01 - -4.314833850702666e-01 - -4.309981832317592e-01 - -4.305132886299618e-01 - -4.300287034407881e-01 - -4.295444298858639e-01 - -4.290604699557538e-01 - -4.285768254794737e-01 - -4.280934983815344e-01 - -4.276104909880938e-01 - -4.271278053251724e-01 - -4.266454431999359e-01 - -4.261634065006114e-01 - -4.256816972235624e-01 - -4.252003173934318e-01 - -4.247192689049444e-01 - -4.242385536499166e-01 - -4.237581735472888e-01 - -4.232781305399061e-01 - -4.227984264773803e-01 - -4.223190631457318e-01 - -4.218400424415704e-01 - -4.213613663598799e-01 - -4.208830368540804e-01 - -4.204050553934426e-01 - -4.199274237890383e-01 - -4.194501442515862e-01 - -4.189732183034799e-01 - -4.184966476302857e-01 - -4.180204343198091e-01 - -4.175445800025869e-01 - -4.170690862458790e-01 - -4.165939547960728e-01 - -4.161191875920802e-01 - -4.156447863485650e-01 - -4.151707524172177e-01 - -4.146970878143395e-01 - -4.142237944432959e-01 - -4.137508735370036e-01 - -4.132783267358912e-01 - -4.128061559031381e-01 - -4.123343628419361e-01 - -4.118629489726368e-01 - -4.113919157251955e-01 - -4.109212649651476e-01 - -4.104509983224866e-01 - -4.099811172669397e-01 - -4.095116233202941e-01 - -4.090425181490535e-01 - -4.085738034100841e-01 - -4.081054804950061e-01 - -4.076375508831032e-01 - -4.071700161671795e-01 - -4.067028779692610e-01 - -4.062361376606066e-01 - -4.057697965353959e-01 - -4.053038563335837e-01 - -4.048383186645677e-01 - -4.043731849141807e-01 - -4.039084564103662e-01 - -4.034441345521896e-01 - -4.029802208230617e-01 - -4.025167167043049e-01 - -4.020536236099443e-01 - -4.015909428779320e-01 - -4.011286758375757e-01 - -4.006668238996902e-01 - -4.002053885607212e-01 - -3.997443712200008e-01 - -3.992837731698375e-01 - -3.988235956310492e-01 - -3.983638399923307e-01 - -3.979045076012857e-01 - -3.974455996644362e-01 - -3.969871175556028e-01 - -3.965290626455606e-01 - -3.960714361699136e-01 - -3.956142393772600e-01 - -3.951574735515524e-01 - -3.947011399985758e-01 - -3.942452398354794e-01 - -3.937897742524872e-01 - -3.933347447660869e-01 - -3.928801524442024e-01 - -3.924259983101159e-01 - -3.919722839283850e-01 - -3.915190103656777e-01 - -3.910661784756895e-01 - -3.906137895655892e-01 - -3.901618450499643e-01 - -3.897103461604648e-01 - -3.892592935529919e-01 - -3.888086884121152e-01 - -3.883585322771145e-01 - -3.879088261485191e-01 - -3.874595710701922e-01 - -3.870107681556456e-01 - -3.865624182556531e-01 - -3.861145225228043e-01 - -3.856670823544472e-01 - -3.852200986473037e-01 - -3.847735723987576e-01 - -3.843275047747315e-01 - -3.838818965026468e-01 - -3.834367486164244e-01 - -3.829920625791138e-01 - -3.825478392535004e-01 - -3.821040794322394e-01 - -3.816607841213338e-01 - -3.812179544462010e-01 - -3.807755914230820e-01 - -3.803336958584798e-01 - -3.798922686597118e-01 - -3.794513108818827e-01 - -3.790108236907996e-01 - -3.785708078449803e-01 - -3.781312640889848e-01 - -3.776921934895628e-01 - -3.772535969260590e-01 - -3.768154752452403e-01 - -3.763778294637203e-01 - -3.759406605249527e-01 - -3.755039692439986e-01 - -3.750677562951532e-01 - -3.746320226741715e-01 - -3.741967693787305e-01 - -3.737619968727901e-01 - -3.733277061470673e-01 - -3.728938983949728e-01 - -3.724605741247380e-01 - -3.720277341192338e-01 - -3.715953793429491e-01 - -3.711635103186269e-01 - -3.707321278978636e-01 - -3.703012331728173e-01 - -3.698708267439747e-01 - -3.694409092657609e-01 - -3.690114815572269e-01 - -3.685825444178367e-01 - -3.681540985405766e-01 - -3.677261445488677e-01 - -3.672986832474148e-01 - -3.668717154245260e-01 - -3.664452417818624e-01 - -3.660192630178876e-01 - -3.655937798167319e-01 - -3.651687928442244e-01 - -3.647443027770453e-01 - -3.643203103057334e-01 - -3.638968161236534e-01 - -3.634738208501973e-01 - -3.630513251204181e-01 - -3.626293296340570e-01 - -3.622078349959966e-01 - -3.617868418102546e-01 - -3.613663507559756e-01 - -3.609463624258993e-01 - -3.605268773947004e-01 - -3.601078962972172e-01 - -3.596894197319259e-01 - -3.592714482724653e-01 - -3.588539824938156e-01 - -3.584370229705016e-01 - -3.580205702765974e-01 - -3.576046249835235e-01 - -3.571891876270012e-01 - -3.567742587321382e-01 - -3.563598388637925e-01 - -3.559459285557617e-01 - -3.555325283179373e-01 - -3.551196386794110e-01 - -3.547072601423791e-01 - -3.542953931967586e-01 - -3.538840383835105e-01 - -3.534731961849680e-01 - -3.530628670336623e-01 - -3.526530514374770e-01 - -3.522437498876279e-01 - -3.518349628366106e-01 - -3.514266907403692e-01 - -3.510189340474827e-01 - -3.506116931966672e-01 - -3.502049686305037e-01 - -3.497987607886671e-01 - -3.493930701015490e-01 - -3.489878969787067e-01 - -3.485832418243141e-01 - -3.481791050461803e-01 - -3.477754870557839e-01 - -3.473723882547367e-01 - -3.469698090253131e-01 - -3.465677497415546e-01 - -3.461662107762984e-01 - -3.457651925045610e-01 - -3.453646952920019e-01 - -3.449647194961470e-01 - -3.445652654674211e-01 - -3.441663335489293e-01 - -3.437679240760669e-01 - -3.433700373751777e-01 - -3.429726737709668e-01 - -3.425758335909973e-01 - -3.421795171685511e-01 - -3.417837248082679e-01 - -3.413884567949557e-01 - -3.409937134173290e-01 - -3.405994949798623e-01 - -3.402058017865278e-01 - -3.398126341027504e-01 - -3.394199921921239e-01 - -3.390278763247643e-01 - -3.386362867748747e-01 - -3.382452237948665e-01 - -3.378546876227794e-01 - -3.374646785249709e-01 - -3.370751967392704e-01 - -3.366862424749215e-01 - -3.362978159833941e-01 - -3.359099174981644e-01 - -3.355225472182573e-01 - -3.351357053498810e-01 - -3.347493921057998e-01 - -3.343636076973308e-01 - -3.339783523006465e-01 - -3.335936261089775e-01 - -3.332094293460974e-01 - -3.328257621547543e-01 - -3.324426246881435e-01 - -3.320600171619409e-01 - -3.316779397280902e-01 - -3.312963925265998e-01 - -3.309153757279716e-01 - -3.305348894653861e-01 - -3.301549338737799e-01 - -3.297755091265357e-01 - -3.293966153413448e-01 - -3.290182526215280e-01 - -3.286404211114115e-01 - -3.282631209285871e-01 - -3.278863521751846e-01 - -3.275101149642331e-01 - -3.271344093953196e-01 - -3.267592355617253e-01 - -3.263845935667566e-01 - -3.260104834866909e-01 - -3.256369053882101e-01 - -3.252638593756906e-01 - -3.248913455268053e-01 - -3.245193638907094e-01 - -3.241479145199382e-01 - -3.237769974872735e-01 - -3.234066128661293e-01 - -3.230367606622389e-01 - -3.226674409186036e-01 - -3.222986537192250e-01 - -3.219303990783447e-01 - -3.215626770146125e-01 - -3.211954875680534e-01 - -3.208288307426270e-01 - -3.204627065455645e-01 - -3.200971150001409e-01 - -3.197320561103191e-01 - -3.193675298795836e-01 - -3.190035363166080e-01 - -3.186400754009213e-01 - -3.182771471114187e-01 - -3.179147514432106e-01 - -3.175528883799994e-01 - -3.171915578921511e-01 - -3.168307599394173e-01 - -3.164704945026028e-01 - -3.161107615528752e-01 - -3.157515610223091e-01 - -3.153928928534279e-01 - -3.150347570035595e-01 - -3.146771534412893e-01 - -3.143200821026652e-01 - -3.139635429048980e-01 - -3.136075357713601e-01 - -3.132520606345795e-01 - -3.128971174301287e-01 - -3.125427060850263e-01 - -3.121888265003789e-01 - -3.118354785699559e-01 - -3.114826622209773e-01 - -3.111303773636806e-01 - -3.107786238863177e-01 - -3.104274016699458e-01 - -3.100767106006651e-01 - -3.097265505731036e-01 - -3.093769214901858e-01 - -3.090278232197667e-01 - -3.086792556057311e-01 - -3.083312185528201e-01 - -3.079837119302323e-01 - -3.076367355606988e-01 - -3.072902893338402e-01 - -3.069443731087555e-01 - -3.065989866918071e-01 - -3.062541299629242e-01 - -3.059098027895394e-01 - -3.055660049841727e-01 - -3.052227363624680e-01 - -3.048799967605036e-01 - -3.045377860349815e-01 - -3.041961039937703e-01 - -3.038549504461246e-01 - -3.035143252370935e-01 - -3.031742281687436e-01 - -3.028346590287212e-01 - -3.024956176228422e-01 - -3.021571037727226e-01 - -3.018191172891879e-01 - -3.014816579447884e-01 - -3.011447255196590e-01 - -3.008083198102758e-01 - -3.004724406299011e-01 - -3.001370877400161e-01 - -2.998022608844934e-01 - -2.994679598576119e-01 - -2.991341844426006e-01 - -2.988009344054493e-01 - -2.984682095047237e-01 - -2.981360094999961e-01 - -2.978043341494513e-01 - -2.974731831997393e-01 - -2.971425563888731e-01 - -2.968124534589884e-01 - -2.964828741880918e-01 - -2.961538183196636e-01 - -2.958252855581221e-01 - -2.954972756291568e-01 - -2.951697882690829e-01 - -2.948428232168150e-01 - -2.945163801997789e-01 - -2.941904589349781e-01 - -2.938650591314966e-01 - -2.935401805013078e-01 - -2.932158227514122e-01 - -2.928919855851135e-01 - -2.925686687341852e-01 - -2.922458719001491e-01 - -2.919235947316832e-01 - -2.916018369508684e-01 - -2.912805982685433e-01 - -2.909598783275820e-01 - -2.906396768390501e-01 - -2.903199935181080e-01 - -2.900008280188033e-01 - -2.896821799916231e-01 - -2.893640491090957e-01 - -2.890464350819901e-01 - -2.887293375718574e-01 - -2.884127562142981e-01 - -2.880966906629407e-01 - -2.877811406014185e-01 - -2.874661057081589e-01 - -2.871515856017081e-01 - -2.868375799224188e-01 - -2.865240883310016e-01 - -2.862111104788733e-01 - -2.858986460098822e-01 - -2.855866945593247e-01 - -2.852752557499685e-01 - -2.849643292069009e-01 - -2.846539145659956e-01 - -2.843440114851778e-01 - -2.840346195818731e-01 - -2.837257384382189e-01 - -2.834173676812886e-01 - -2.831095069534547e-01 - -2.828021558855677e-01 - -2.824953140398479e-01 - -2.821889810170294e-01 - -2.818831564761255e-01 - -2.815778399984394e-01 - -2.812730311718642e-01 - -2.809687296216254e-01 - -2.806649349155874e-01 - -2.803616466281044e-01 - -2.800588643758425e-01 - -2.797565877594176e-01 - -2.794548163592918e-01 - -2.791535497376408e-01 - -2.788527874670974e-01 - -2.785525291296920e-01 - -2.782527743138438e-01 - -2.779535226034689e-01 - -2.776547735631448e-01 - -2.773565267276963e-01 - -2.770587816777879e-01 - -2.767615379983304e-01 - -2.764647952191276e-01 - -2.761685529026718e-01 - -2.758728106207560e-01 - -2.755775679024411e-01 - -2.752828243050798e-01 - -2.749885793975552e-01 - -2.746948327088052e-01 - -2.744015837838452e-01 - -2.741088321749212e-01 - -2.738165773969221e-01 - -2.735248189792139e-01 - -2.732335564721672e-01 - -2.729427894286903e-01 - -2.726525173657923e-01 - -2.723627397775934e-01 - -2.720734562117226e-01 - -2.717846661993187e-01 - -2.714963692431568e-01 - -2.712085648712142e-01 - -2.709212526021956e-01 - -2.706344319386959e-01 - -2.703481024077038e-01 - -2.700622635195931e-01 - -2.697769147573882e-01 - -2.694920556414950e-01 - -2.692076856844960e-01 - -2.689238043678598e-01 - -2.686404111894522e-01 - -2.683575056539274e-01 - -2.680750872618156e-01 - -2.677931554956217e-01 - -2.675117098420171e-01 - -2.672307498062658e-01 - -2.669502748541435e-01 - -2.666702844564393e-01 - -2.663907781339158e-01 - -2.661117553567487e-01 - -2.658332155842312e-01 - -2.655551583220328e-01 - -2.652775830228958e-01 - -2.650004891310402e-01 - -2.647238761635896e-01 - -2.644477435849875e-01 - -2.641720908275026e-01 - -2.638969173638899e-01 - -2.636222226679477e-01 - -2.633480062028563e-01 - -2.630742674151484e-01 - -2.628010057675256e-01 - -2.625282207270022e-01 - -2.622559117157733e-01 - -2.619840781930577e-01 - -2.617127196438671e-01 - -2.614418354712815e-01 - -2.611714251171109e-01 - -2.609014880694051e-01 - -2.606320237300626e-01 - -2.603630315312080e-01 - -2.600945109576975e-01 - -2.598264614192900e-01 - -2.595588823272051e-01 - -2.592917731268140e-01 - -2.590251332515323e-01 - -2.587589621335352e-01 - -2.584932592080277e-01 - -2.582280238899204e-01 - -2.579632555996659e-01 - -2.576989537753064e-01 - -2.574351178135512e-01 - -2.571717471205571e-01 - -2.569088411498421e-01 - -2.566463993032694e-01 - -2.563844209736399e-01 - -2.561229055922761e-01 - -2.558618525664796e-01 - -2.556012613001373e-01 - -2.553411312228936e-01 - -2.550814617199114e-01 - -2.548222521633088e-01 - -2.545635019702024e-01 - -2.543052105636615e-01 - -2.540473773489130e-01 - -2.537900016856341e-01 - -2.535330829668063e-01 - -2.532766206092137e-01 - -2.530206140025920e-01 - -2.527650625373169e-01 - -2.525099656058339e-01 - -2.522553225882911e-01 - -2.520011328519368e-01 - -2.517473957689335e-01 - -2.514941107682424e-01 - -2.512412772287477e-01 - -2.509888944763962e-01 - -2.507369619085763e-01 - -2.504854789235316e-01 - -2.502344448942996e-01 - -2.499838591881081e-01 - -2.497337211675947e-01 - -2.494840301941274e-01 - -2.492347856449565e-01 - -2.489859868896926e-01 - -2.487376332816026e-01 - -2.484897241934407e-01 - -2.482422589923619e-01 - -2.479952370263670e-01 - -2.477486576676466e-01 - -2.475025202765806e-01 - -2.472568241776227e-01 - -2.470115687463755e-01 - -2.467667533575219e-01 - -2.465223773319763e-01 - -2.462784400223504e-01 - -2.460349407926405e-01 - -2.457918789841980e-01 - -2.455492539346369e-01 - -2.453070649885519e-01 - -2.450653115068263e-01 - -2.448239928212929e-01 - -2.445831082525867e-01 - -2.443426571517872e-01 - -2.441026388729581e-01 - -2.438630527595843e-01 - -2.436238981283992e-01 - -2.433851743000419e-01 - -2.431468806082007e-01 - -2.429090164035606e-01 - -2.426715810065056e-01 - -2.424345737214870e-01 - -2.421979939156839e-01 - -2.419618409122474e-01 - -2.417261139893861e-01 - -2.414908125047008e-01 - -2.412559357926221e-01 - -2.410214831428485e-01 - -2.407874538901436e-01 - -2.405538473594189e-01 - -2.403206628448788e-01 - -2.400878996494245e-01 - -2.398555571012901e-01 - -2.396236345489386e-01 - -2.393921312730178e-01 - -2.391610465589564e-01 - -2.389303797400675e-01 - -2.387001301206918e-01 - -2.384702970040557e-01 - -2.382408797142012e-01 - -2.380118775445049e-01 - -2.377832897784107e-01 - -2.375551157141706e-01 - -2.373273546676602e-01 - -2.371000059435911e-01 - -2.368730688080822e-01 - -2.366465425799626e-01 - -2.364204265795865e-01 - -2.361947200488833e-01 - -2.359694222928865e-01 - -2.357445326362645e-01 - -2.355200503199650e-01 - -2.352959746331166e-01 - -2.350723049000333e-01 - -2.348490404054174e-01 - -2.346261804119323e-01 - -2.344037241869703e-01 - -2.341816710532240e-01 - -2.339600202844186e-01 - -2.337387711161095e-01 - -2.335179228570654e-01 - -2.332974748051559e-01 - -2.330774262250223e-01 - -2.328577763695832e-01 - -2.326385245095027e-01 - -2.324196699339893e-01 - -2.322012119071908e-01 - -2.319831496985562e-01 - -2.317654825913850e-01 - -2.315482098501277e-01 - -2.313313307350805e-01 - -2.311148445095759e-01 - -2.308987504304352e-01 - -2.306830477605995e-01 - -2.304677357746768e-01 - -2.302528137313455e-01 - -2.300382808821649e-01 - -2.298241364802842e-01 - -2.296103797849810e-01 - -2.293970100645507e-01 - -2.291840265929282e-01 - -2.289714285853380e-01 - -2.287592152687787e-01 - -2.285473859575702e-01 - -2.283359398767679e-01 - -2.281248762354934e-01 - -2.279141943457151e-01 - -2.277038934347241e-01 - -2.274939727028900e-01 - -2.272844314557521e-01 - -2.270752689260884e-01 - -2.268664843063303e-01 - -2.266580768713468e-01 - -2.264500458690802e-01 - -2.262423905203003e-01 - -2.260351100742427e-01 - -2.258282037663114e-01 - -2.256216708189812e-01 - -2.254155104759721e-01 - -2.252097219699820e-01 - -2.250043045201664e-01 - -2.247992573593203e-01 - -2.245945797283117e-01 - -2.243902708632074e-01 - -2.241863299547213e-01 - -2.239827562297785e-01 - -2.237795489631809e-01 - -2.235767073479459e-01 - -2.233742305913306e-01 - -2.231721179508258e-01 - -2.229703686190215e-01 - -2.227689817967141e-01 - -2.225679567331226e-01 - -2.223672926389324e-01 - -2.221669887137792e-01 - -2.219670441735496e-01 - -2.217674582593449e-01 - -2.215682301863681e-01 - -2.213693591068690e-01 - -2.211708442449674e-01 - -2.209726848493868e-01 - -2.207748801280919e-01 - -2.205774292618204e-01 - -2.203803314334422e-01 - -2.201835858632719e-01 - -2.199871917828554e-01 - -2.197911484006530e-01 - -2.195954548584606e-01 - -2.194001103587555e-01 - -2.192051141421317e-01 - -2.190104654040938e-01 - -2.188161633272981e-01 - -2.186222070944807e-01 - -2.184285959003400e-01 - -2.182353289399314e-01 - -2.180424054040691e-01 - -2.178498244760091e-01 - -2.176575853577229e-01 - -2.174656872563868e-01 - -2.172741293153170e-01 - -2.170829107184905e-01 - -2.168920306960583e-01 - -2.167014883907840e-01 - -2.165112829716549e-01 - -2.163214136638050e-01 - -2.161318796380734e-01 - -2.159426800456078e-01 - -2.157538140457635e-01 - -2.155652808465100e-01 - -2.153770796378261e-01 - -2.151892095617934e-01 - -2.150016698096599e-01 - -2.148144595574814e-01 - -2.146275779264766e-01 - -2.144410241083473e-01 - -2.142547972973645e-01 - -2.140688966286696e-01 - -2.138833212713278e-01 - -2.136980704068839e-01 - -2.135131431962469e-01 - -2.133285387811797e-01 - -2.131442563097479e-01 - -2.129602949644751e-01 - -2.127766538888946e-01 - -2.125933322205115e-01 - -2.124103291538361e-01 - -2.122276438425608e-01 - -2.120452754131807e-01 - -2.118632230196053e-01 - -2.116814858091140e-01 - -2.115000629262062e-01 - -2.113189535366684e-01 - -2.111381567835468e-01 - -2.109576717897184e-01 - -2.107774976942802e-01 - -2.105976336477213e-01 - -2.104180788038142e-01 - -2.102388322993181e-01 - -2.100598932684242e-01 - -2.098812608470688e-01 - -2.097029341689293e-01 - -2.095249123662445e-01 - -2.093471945702010e-01 - -2.091697799107427e-01 - -2.089926675162990e-01 - -2.088158565139439e-01 - -2.086393460309292e-01 - -2.084631351904399e-01 - -2.082872231124364e-01 - -2.081116089361562e-01 - -2.079362917906518e-01 - -2.077612707758083e-01 - -2.075865450013143e-01 - -2.074121135936494e-01 - -2.072379756933602e-01 - -2.070641303864229e-01 - -2.068905767613353e-01 - -2.067173139701657e-01 - -2.065443411403108e-01 - -2.063716573678470e-01 - -2.061992617242399e-01 - -2.060271533191409e-01 - -2.058553312792487e-01 - -2.056837947057731e-01 - -2.055125426973447e-01 - -2.053415743575506e-01 - -2.051708887985432e-01 - -2.050004850901530e-01 - -2.048303622987561e-01 - -2.046605195888223e-01 - -2.044909560501713e-01 - -2.043216707137636e-01 - -2.041526627003059e-01 - -2.039839311053935e-01 - -2.038154749924674e-01 - -2.036472934779214e-01 - -2.034793856435669e-01 - -2.033117505334730e-01 - -2.031443872603400e-01 - -2.029772949053144e-01 - -2.028104725040109e-01 - -2.026439191805672e-01 - -2.024776340229360e-01 - -2.023116160442759e-01 - -2.021458643362796e-01 - -2.019803779931268e-01 - -2.018151560674621e-01 - -2.016501976152565e-01 - -2.014855017030598e-01 - -2.013210674074579e-01 - -2.011568937830132e-01 - -2.009929798869589e-01 - -2.008293247967324e-01 - -2.006659275530022e-01 - -2.005027871933542e-01 - -2.003399027889975e-01 - -2.001772733993469e-01 - -2.000148980648089e-01 - -1.998527758076494e-01 - -1.996909056937942e-01 - -1.995292867991256e-01 - -1.993679181495860e-01 - -1.992067987609143e-01 - -1.990459276660739e-01 - -1.988853039482369e-01 - -1.987249266385540e-01 - -1.985647947339026e-01 - -1.984049072747179e-01 - -1.982452632992336e-01 - -1.980858618372365e-01 - -1.979267019229292e-01 - -1.977677825816225e-01 - -1.976091028269504e-01 - -1.974506616652059e-01 - -1.972924581269546e-01 - -1.971344912595772e-01 - -1.969767600601777e-01 - -1.968192635197257e-01 - -1.966620006473419e-01 - -1.965049704914111e-01 - -1.963481720619957e-01 - -1.961916043159508e-01 - -1.960352662866058e-01 - -1.958791570023236e-01 - -1.957232754408347e-01 - -1.955676205736371e-01 - -1.954121914050787e-01 - -1.952569869811404e-01 - -1.951020062511957e-01 - -1.949472481743376e-01 - -1.947927118000400e-01 - -1.946383960967118e-01 - -1.944843000224015e-01 - -1.943304226010136e-01 - -1.941767627996486e-01 - -1.940233195719773e-01 - -1.938700919198527e-01 - -1.937170788011597e-01 - -1.935642791691659e-01 - -1.934116920404960e-01 - -1.932593163702813e-01 - -1.931071510855982e-01 - -1.929551951739442e-01 - -1.928034476111422e-01 - -1.926519073523142e-01 - -1.925005733427448e-01 - -1.923494445333268e-01 - -1.921985198850023e-01 - -1.920477983694047e-01 - -1.918972789099489e-01 - -1.917469604078139e-01 - -1.915968418647559e-01 - -1.914469222323946e-01 - -1.912972003977130e-01 - -1.911476753153419e-01 - -1.909983459354311e-01 - -1.908492111828614e-01 - -1.907002699990133e-01 - -1.905515213021572e-01 - -1.904029639829450e-01 - -1.902545969863778e-01 - -1.901064192518998e-01 - -1.899584296832387e-01 - -1.898106271909556e-01 - -1.896630106872466e-01 - -1.895155790805884e-01 - -1.893683312769490e-01 - -1.892212661839438e-01 - -1.890743827110565e-01 - -1.889276797429612e-01 - -1.887811561730439e-01 - -1.886348109311961e-01 - -1.884886428944042e-01 - -1.883426509295119e-01 - -1.881968339481026e-01 - -1.880511908244114e-01 - -1.879057204210790e-01 - -1.877604216379617e-01 - -1.876152933660684e-01 - -1.874703344759240e-01 - -1.873255438107255e-01 - -1.871809202288037e-01 - -1.870364626111082e-01 - -1.868921698587295e-01 - -1.867480408184902e-01 - -1.866040743068453e-01 - -1.864602692045282e-01 - -1.863166243684211e-01 - -1.861731386269271e-01 - -1.860298108368848e-01 - -1.858866398430710e-01 - -1.857436244746902e-01 - -1.856007635808946e-01 - -1.854580560069532e-01 - -1.853155005825300e-01 - -1.851730961153894e-01 - -1.850308414342497e-01 - -1.848887353926573e-01 - -1.847467767859671e-01 - -1.846049644137440e-01 - -1.844632971091011e-01 - -1.843217736893654e-01 - -1.841803929497542e-01 - -1.840391536710132e-01 - -1.838980546953601e-01 - -1.837570948428414e-01 - -1.836162728527662e-01 - -1.834755875142904e-01 - -1.833350376404768e-01 - -1.831946220322505e-01 - -1.830543394615971e-01 - -1.829141886951903e-01 - -1.827741685199023e-01 - -1.826342777082210e-01 - -1.824945150204152e-01 - -1.823548792146146e-01 - -1.822153690716325e-01 - -1.820759833652730e-01 - -1.819367208114371e-01 - -1.817975801678411e-01 - -1.816585602158104e-01 - -1.815196596908165e-01 - -1.813808773333636e-01 - -1.812422118861797e-01 - -1.811036620617022e-01 - -1.809652266051679e-01 - -1.808269042761388e-01 - -1.806886937510042e-01 - -1.805505937426575e-01 - -1.804126030135119e-01 - -1.802747202867512e-01 - -1.801369442562599e-01 - -1.799992736029428e-01 - -1.798617070428147e-01 - -1.797242432859927e-01 - -1.795868810229852e-01 - -1.794496189531687e-01 - -1.793124557648680e-01 - -1.791753901302353e-01 - -1.790384207459855e-01 - -1.789015462957270e-01 - -1.787647654308534e-01 - -1.786280768266134e-01 - -1.784914791546937e-01 - -1.783549710639760e-01 - -1.782185512276328e-01 - -1.780822183108111e-01 - -1.779459709418989e-01 - -1.778098077766785e-01 - -1.776737274641330e-01 - -1.775377286080068e-01 - -1.774018098685905e-01 - -1.772659699092733e-01 - -1.771302073149079e-01 - -1.769945207098710e-01 - -1.768589087303928e-01 - -1.767233699571559e-01 - -1.765879030229077e-01 - -1.764525065751527e-01 - -1.763171791703831e-01 - -1.761819193770276e-01 - -1.760467257991546e-01 - -1.759115970764966e-01 - -1.757765317826701e-01 - -1.756415284467932e-01 - -1.755065856823099e-01 - -1.753717020824757e-01 - -1.752368761936218e-01 - -1.751021065398607e-01 - -1.749673916979465e-01 - -1.748327302843573e-01 - -1.746981207950505e-01 - -1.745635617515470e-01 - -1.744290517410085e-01 - -1.742945892830799e-01 - -1.741601728915786e-01 - -1.740258011048612e-01 - -1.738914724532109e-01 - -1.737571854631234e-01 - -1.736229386541751e-01 - -1.734887304969607e-01 - -1.733545594900176e-01 - -1.732204242005106e-01 - -1.730863230847530e-01 - -1.729522545880760e-01 - -1.728182172369972e-01 - -1.726842095169024e-01 - -1.725502298924380e-01 - -1.724162768405715e-01 - -1.722823488297978e-01 - -1.721484443102564e-01 - -1.720145617082366e-01 - -1.718806995062888e-01 - -1.717468561876117e-01 - -1.716130301380271e-01 - -1.714792197950507e-01 - -1.713454236195253e-01 - -1.712116399980747e-01 - -1.710778673588311e-01 - -1.709441041583024e-01 - -1.708103487974718e-01 - -1.706765996579921e-01 - -1.705428551238503e-01 - -1.704091136122197e-01 - -1.702753735243250e-01 - -1.701416332337174e-01 - -1.700078910979654e-01 - -1.698741454939726e-01 - -1.697403948188084e-01 - -1.696066374424440e-01 - -1.694728717024124e-01 - -1.693390959182572e-01 - -1.692053084687103e-01 - -1.690715077127793e-01 - -1.689376919605925e-01 - -1.688038595533757e-01 - -1.686700088249354e-01 - -1.685361380772680e-01 - -1.684022456043037e-01 - -1.682683297240474e-01 - -1.681343887869522e-01 - -1.680004210524648e-01 - -1.678664247764668e-01 - -1.677323982879569e-01 - -1.675983398888628e-01 - -1.674642478421112e-01 - -1.673301203727337e-01 - -1.671959557470875e-01 - -1.670617522514179e-01 - -1.669275081523977e-01 - -1.667932216748827e-01 - -1.666588910302535e-01 - -1.665245144618999e-01 - -1.663900902261115e-01 - -1.662556165573334e-01 - -1.661210916150787e-01 - -1.659865136192500e-01 - -1.658518808205523e-01 - -1.657171913793817e-01 - -1.655824434869752e-01 - -1.654476353589082e-01 - -1.653127651402884e-01 - -1.651778310039089e-01 - -1.650428311475997e-01 - -1.649077636947325e-01 - -1.647726268054878e-01 - -1.646374186795111e-01 - -1.645021374143022e-01 - -1.643667811219276e-01 - -1.642313479645375e-01 - -1.640958360797542e-01 - -1.639602435821208e-01 - -1.638245685678920e-01 - -1.636888091342957e-01 - -1.635529633807896e-01 - -1.634170294056715e-01 - -1.632810052843662e-01 - -1.631448890987297e-01 - -1.630086789505001e-01 - -1.628723728914803e-01 - -1.627359689604526e-01 - -1.625994652175857e-01 - -1.624628597296842e-01 - -1.623261505411777e-01 - -1.621893356498993e-01 - -1.620524130844338e-01 - -1.619153808874262e-01 - -1.617782370829140e-01 - -1.616409796594323e-01 - -1.615036066042981e-01 - -1.613661159511956e-01 - -1.612285056749289e-01 - -1.610907737177844e-01 - -1.609529180644884e-01 - -1.608149367058714e-01 - -1.606768276166446e-01 - -1.605385887249777e-01 - -1.604002179666082e-01 - -1.602617132920370e-01 - -1.601230726507729e-01 - -1.599842939686116e-01 - -1.598453751511857e-01 - -1.597063141136520e-01 - -1.595671087574746e-01 - -1.594277569704320e-01 - -1.592882566576958e-01 - -1.591486057239582e-01 - -1.590088020577491e-01 - -1.588688434990599e-01 - -1.587287278927537e-01 - -1.585884531125515e-01 - -1.584480170419727e-01 - -1.583074175205078e-01 - -1.581666523320080e-01 - -1.580257193426469e-01 - -1.578846164090064e-01 - -1.577433413163997e-01 - -1.576018918624315e-01 - -1.574602658488709e-01 - -1.573184610699215e-01 - -1.571764753211041e-01 - -1.570343063929105e-01 - -1.568919520623428e-01 - -1.567494100904384e-01 - -1.566066782348808e-01 - -1.564637542612438e-01 - -1.563206358983480e-01 - -1.561773208679784e-01 - -1.560338069324230e-01 - -1.558900918260982e-01 - -1.557461732592160e-01 - -1.556020489404925e-01 - -1.554577165574562e-01 - -1.553131737930803e-01 - -1.551684183667380e-01 - -1.550234479797016e-01 - -1.548782603038531e-01 - -1.547328529851514e-01 - -1.545872236759721e-01 - -1.544413700402710e-01 - -1.542952897416497e-01 - -1.541489804232354e-01 - -1.540024397056934e-01 - -1.538556652055174e-01 - -1.537086545589509e-01 - -1.535614054107616e-01 - -1.534139153265976e-01 - -1.532661818894184e-01 - -1.531182027303390e-01 - -1.529699754364569e-01 - -1.528214975805129e-01 - -1.526727667337492e-01 - -1.525237804315604e-01 - -1.523745362382714e-01 - -1.522250317710374e-01 - -1.520752645246755e-01 - -1.519252320010430e-01 - -1.517749318043420e-01 - -1.516243614355856e-01 - -1.514735183783821e-01 - -1.513224001894709e-01 - -1.511710043669709e-01 - -1.510193283881065e-01 - -1.508673697644896e-01 - -1.507151259726486e-01 - -1.505625944726656e-01 - -1.504097727456887e-01 - -1.502566582737337e-01 - -1.501032485283334e-01 - -1.499495409558064e-01 - -1.497955329817901e-01 - -1.496412220312461e-01 - -1.494866055649385e-01 - -1.493316810218445e-01 - -1.491764458131949e-01 - -1.490208973395277e-01 - -1.488650330073115e-01 - -1.487088502321930e-01 - -1.485523464347014e-01 - -1.483955190026080e-01 - -1.482383652905619e-01 - -1.480808826638546e-01 - -1.479230685198502e-01 - -1.477649202713839e-01 - -1.476064352431592e-01 - -1.474476107543291e-01 - -1.472884441602761e-01 - -1.471289328556787e-01 - -1.469690741904771e-01 - -1.468088654425319e-01 - -1.466483039513407e-01 - -1.464873870643751e-01 - -1.463261120992439e-01 - -1.461644763685366e-01 - -1.460024771711030e-01 - -1.458401117873900e-01 - -1.456773775256328e-01 - -1.455142717039091e-01 - -1.453507916253095e-01 - -1.451869345373153e-01 - -1.450226976893540e-01 - -1.448580783981553e-01 - -1.446930739597145e-01 - -1.445276816274984e-01 - -1.443618986028185e-01 - -1.441957221635531e-01 - -1.440291496154044e-01 - -1.438621781832398e-01 - -1.436948050802729e-01 - -1.435270275400491e-01 - -1.433588428498931e-01 - -1.431902482406432e-01 - -1.430212409022274e-01 - -1.428518180756519e-01 - -1.426819769869911e-01 - -1.425117148424586e-01 - -1.423410288662751e-01 - -1.421699162875700e-01 - -1.419983743276740e-01 - -1.418264001727286e-01 - -1.416539910114460e-01 - -1.414811440470098e-01 - -1.413078564852965e-01 - -1.411341255423312e-01 - -1.409599484327010e-01 - -1.407853222965617e-01 - -1.406102443173973e-01 - -1.404347117561954e-01 - -1.402587217519092e-01 - -1.400822714659246e-01 - -1.399053581557436e-01 - -1.397279789611117e-01 - -1.395501310267636e-01 - -1.393718115937786e-01 - -1.391930178402762e-01 - -1.390137469173205e-01 - -1.388339959972602e-01 - -1.386537622953096e-01 - -1.384730430031857e-01 - -1.382918352262208e-01 - -1.381101361784074e-01 - -1.379279430940128e-01 - -1.377452530885734e-01 - -1.375620633453186e-01 - -1.373783710804598e-01 - -1.371941734475252e-01 - -1.370094676273606e-01 - -1.368242508215203e-01 - -1.366385202106050e-01 - -1.364522729969404e-01 - -1.362655063841710e-01 - -1.360782175127518e-01 - -1.358904035964053e-01 - -1.357020618930480e-01 - -1.355131895302153e-01 - -1.353237837054462e-01 - -1.351338416922692e-01 - -1.349433606493001e-01 - -1.347523377766847e-01 - -1.345607703467432e-01 - -1.343686555800670e-01 - -1.341759906744941e-01 - -1.339827728348106e-01 - -1.337889993407819e-01 - -1.335946674413715e-01 - -1.333997743261954e-01 - -1.332043172962129e-01 - -1.330082936252972e-01 - -1.328117004983506e-01 - -1.326145352418741e-01 - -1.324167951779929e-01 - -1.322184775207451e-01 - -1.320195795498869e-01 - -1.318200985870884e-01 - -1.316200319613715e-01 - -1.314193769770063e-01 - -1.312181309395709e-01 - -1.310162911860090e-01 - -1.308138550466099e-01 - -1.306108198680959e-01 - -1.304071830473609e-01 - -1.302029419358534e-01 - -1.299980938748928e-01 - -1.297926362720222e-01 - -1.295865665431496e-01 - -1.293798820977739e-01 - -1.291725803345192e-01 - -1.289646586840201e-01 - -1.287561146028010e-01 - -1.285469455426532e-01 - -1.283371489741077e-01 - -1.281267223855238e-01 - -1.279156632656401e-01 - -1.277039691180485e-01 - -1.274916374652222e-01 - -1.272786658468367e-01 - -1.270650518164191e-01 - -1.268507929437779e-01 - -1.266358868257778e-01 - -1.264203310530910e-01 - -1.262041232080785e-01 - -1.259872609212462e-01 - -1.257697418614985e-01 - -1.255515637216261e-01 - -1.253327241582721e-01 - -1.251132208452764e-01 - -1.248930515084944e-01 - -1.246722139029198e-01 - -1.244507057917270e-01 - -1.242285249387353e-01 - -1.240056691417677e-01 - -1.237821362222557e-01 - -1.235579240163024e-01 - -1.233330303641722e-01 - -1.231074531412701e-01 - -1.228811902909497e-01 - -1.226542397328350e-01 - -1.224265993926709e-01 - -1.221982672554952e-01 - -1.219692413178169e-01 - -1.217395195880366e-01 - -1.215091001037845e-01 - -1.212779809466277e-01 - -1.210461602256936e-01 - -1.208136360512357e-01 - -1.205804065871132e-01 - -1.203464700244819e-01 - -1.201118245085727e-01 - -1.198764682774020e-01 - -1.196403996473917e-01 - -1.194036168896808e-01 - -1.191661183059585e-01 - -1.189279022478277e-01 - -1.186889671039581e-01 - -1.184493112863093e-01 - -1.182089332317922e-01 - -1.179678314226111e-01 - -1.177260043675167e-01 - -1.174834505981953e-01 - -1.172401686820595e-01 - -1.169961572351099e-01 - -1.167514149230550e-01 - -1.165059404117411e-01 - -1.162597324012717e-01 - -1.160127896494247e-01 - -1.157651109471359e-01 - -1.155166951180050e-01 - -1.152675410245315e-01 - -1.150176475647009e-01 - -1.147670136740031e-01 - -1.145156383362403e-01 - -1.142635205942373e-01 - -1.140106595167702e-01 - -1.137570541746248e-01 - -1.135027037005393e-01 - -1.132476072885310e-01 - -1.129917641930528e-01 - -1.127351736954119e-01 - -1.124778350964029e-01 - -1.122197477241451e-01 - -1.119609110122396e-01 - -1.117013244465126e-01 - -1.114409874638995e-01 - -1.111798996306716e-01 - -1.109180606010562e-01 - -1.106554699641756e-01 - -1.103921273860412e-01 - -1.101280326261970e-01 - -1.098631854961093e-01 - -1.095975858385727e-01 - -1.093312335328026e-01 - -1.090641285282797e-01 - -1.087962708201439e-01 - -1.085276604456853e-01 - -1.082582975002112e-01 - -1.079881821487157e-01 - -1.077173146235393e-01 - -1.074456951780328e-01 - -1.071733241222459e-01 - -1.069002018428373e-01 - -1.066263287812705e-01 - -1.063517054311524e-01 - -1.060763323447030e-01 - -1.058002101349244e-01 - -1.055233394662503e-01 - -1.052457210591484e-01 - -1.049673557111256e-01 - -1.046882442747131e-01 - -1.044083876525769e-01 - -1.041277868396362e-01 - -1.038464428925467e-01 - -1.035643569070283e-01 - -1.032815300276830e-01 - -1.029979634724506e-01 - -1.027136585692167e-01 - -1.024286166734134e-01 - -1.021428391952729e-01 - -1.018563276648054e-01 - -1.015690836461885e-01 - -1.012811087487812e-01 - -1.009924046817547e-01 - -1.007029732152899e-01 - -1.004128161832720e-01 - -1.001219355157012e-01 - -9.983033318947014e-02 - -9.953801123789381e-02 - -9.924497181065381e-02 - -9.895121710675164e-02 - -9.865674937610269e-02 - -9.836157098451072e-02 - -9.806568435550449e-02 - -9.776909196067303e-02 - -9.747179635418697e-02 - -9.717380018935569e-02 - -9.687510621844479e-02 - -9.657571724434684e-02 - -9.627563612429342e-02 - -9.597486578738405e-02 - -9.567340928055243e-02 - -9.537126972794066e-02 - -9.506845031433311e-02 - -9.476495428226560e-02 - -9.446078497156121e-02 - -9.415594584893169e-02 - -9.385044042616277e-02 - -9.354427227181475e-02 - -9.323744504129654e-02 - -9.292996250412121e-02 - -9.262182850819620e-02 - -9.231304696021701e-02 - -9.200362185853247e-02 - -9.169355729461479e-02 - -9.138285746240042e-02 - -9.107152658866502e-02 - -9.075956898041553e-02 - -9.044698911371001e-02 - -9.013379148226228e-02 - -8.981998063663986e-02 - -8.950556130228651e-02 - -8.919053824746566e-02 - -8.887491629233073e-02 - -8.855870039130662e-02 - -8.824189556852820e-02 - -8.792450692262105e-02 - -8.760653968435946e-02 - -8.728799913331863e-02 - -8.696889060279582e-02 - -8.664921956673162e-02 - -8.632899159487925e-02 - -8.600821233560418e-02 - -8.568688750540578e-02 - -8.536502290181033e-02 - -8.504262441718942e-02 - -8.471969805751253e-02 - -8.439624991228166e-02 - -8.407228614692197e-02 - -8.374781300392073e-02 - -8.342283682562317e-02 - -8.309736406563741e-02 - -8.277140122021633e-02 - -8.244495489588025e-02 - -8.211803185128563e-02 - -8.179063884910803e-02 - -8.146278271646745e-02 - -8.113447041766966e-02 - -8.080570906396743e-02 - -8.047650581443898e-02 - -8.014686781276095e-02 - -7.981680240792462e-02 - -7.948631704884632e-02 - -7.915541916537581e-02 - -7.882411634928695e-02 - -7.849241630024972e-02 - -7.816032674199919e-02 - -7.782785552351333e-02 - -7.749501058768483e-02 - -7.716179991262426e-02 - -7.682823159405887e-02 - -7.649431382724470e-02 - -7.616005485767063e-02 - -7.582546305035900e-02 - -7.549054686796573e-02 - -7.515531479419155e-02 - -7.481977542018518e-02 - -7.448393744841550e-02 - -7.414780964186224e-02 - -7.381140084542565e-02 - -7.347471999131863e-02 - -7.313777608894645e-02 - -7.280057821330421e-02 - -7.246313551410177e-02 - -7.212545725749871e-02 - -7.178755277686714e-02 - -7.144943146088469e-02 - -7.111110278446059e-02 - -7.077257629326426e-02 - -7.043386160590276e-02 - -7.009496843792977e-02 - -6.975590657859251e-02 - -6.941668588038064e-02 - -6.907731623736572e-02 - -6.873780762436528e-02 - -6.839817013263073e-02 - -6.805841390025939e-02 - -6.771854911509186e-02 - -6.737858603607710e-02 - -6.703853501790490e-02 - -6.669840646610939e-02 - -6.635821080020089e-02 - -6.601795854049251e-02 - -6.567766029345612e-02 - -6.533732672933422e-02 - -6.499696856244534e-02 - -6.465659655384894e-02 - -6.431622152906083e-02 - -6.397585437117004e-02 - -6.363550601749234e-02 - -6.329518746487584e-02 - -6.295490977261127e-02 - -6.261468405232740e-02 - -6.227452144919842e-02 - -6.193443314782195e-02 - -6.159443038613483e-02 - -6.125452449175782e-02 - -6.091472682299209e-02 - -6.057504875634485e-02 - -6.023550170757411e-02 - -5.989609715178513e-02 - -5.955684662483948e-02 - -5.921776169220818e-02 - -5.887885392543541e-02 - -5.854013491232313e-02 - -5.820161634720029e-02 - -5.786330995026137e-02 - -5.752522743033200e-02 - -5.718738052319666e-02 - -5.684978102238282e-02 - -5.651244078415603e-02 - -5.617537160914179e-02 - -5.583858533460867e-02 - -5.550209389764803e-02 - -5.516590918758542e-02 - -5.483004310132478e-02 - -5.449450760284144e-02 - -5.415931467224975e-02 - -5.382447627285256e-02 - -5.349000433169809e-02 - -5.315591089010736e-02 - -5.282220800586091e-02 - -5.248890761304951e-02 - -5.215602173570349e-02 - -5.182356244333215e-02 - -5.149154173522678e-02 - -5.115997163165661e-02 - -5.082886416999516e-02 - -5.049823136495267e-02 - -5.016808523392447e-02 - -4.983843779429676e-02 - -4.950930104255546e-02 - -4.918068697018742e-02 - -4.885260756307724e-02 - -4.852507478656667e-02 - -4.819810059193260e-02 - -4.787169691654435e-02 - -4.754587567726797e-02 - -4.722064876717863e-02 - -4.689602805511645e-02 - -4.657202539266345e-02 - -4.624865260469157e-02 - -4.592592148337583e-02 - -4.560384379218360e-02 - -4.528243126408893e-02 - -4.496169559628109e-02 - -4.464164845065374e-02 - -4.432230145577399e-02 - -4.400366620090135e-02 - -4.368575422918912e-02 - -4.336857704568598e-02 - -4.305214611378011e-02 - -4.273647284209545e-02 - -4.242156859535529e-02 - -4.210744469338823e-02 - -4.179411239819886e-02 - -4.148158291999365e-02 - -4.116986741259326e-02 - -4.085897697584740e-02 - -4.054892265423421e-02 - -4.023971542131075e-02 - -3.993136619382251e-02 - -3.962388583123071e-02 - -3.931728511726146e-02 - -3.901157477126550e-02 - -3.870676544906659e-02 - -3.840286772630143e-02 - -3.809989211312446e-02 - -3.779784905219891e-02 - -3.749674889469364e-02 - -3.719660192057603e-02 - -3.689741833904486e-02 - -3.659920826728452e-02 - -3.630198174507707e-02 - -3.600574873447752e-02 - -3.571051910326670e-02 - -3.541630263528623e-02 - -3.512310902944081e-02 - -3.483094789226868e-02 - -3.453982873906083e-02 - -3.424976098893085e-02 - -3.396075396966352e-02 - -3.367281691959212e-02 - -3.338595897696143e-02 - -3.310018917253339e-02 - -3.281551644593574e-02 - -3.253194963945627e-02 - -3.224949747985180e-02 - -3.196816859917648e-02 - -3.168797153104005e-02 - -3.140891468854379e-02 - -3.113100638362195e-02 - -3.085425482400445e-02 - -3.057866810270934e-02 - -3.030425420554928e-02 - -3.003102099769914e-02 - -2.975897623664901e-02 - -2.948812757423692e-02 - -2.921848253324668e-02 - -2.895004852283206e-02 - -2.868283284398848e-02 - -2.841684266935389e-02 - -2.815208505554401e-02 - -2.788856694668657e-02 - -2.762629515277662e-02 - -2.736527636581735e-02 - -2.710551716378724e-02 - -2.684702399109470e-02 - -2.658980317107453e-02 - -2.633386090723251e-02 - -2.607920326420626e-02 - -2.582583618939347e-02 - -2.557376551170278e-02 - -2.532299691452088e-02 - -2.507353595904179e-02 - -2.482538808499682e-02 - -2.457855859507147e-02 - -2.433305266394129e-02 - -2.408887533435539e-02 - -2.384603151841623e-02 - -2.360452600145211e-02 - -2.336436343201402e-02 - -2.312554832609387e-02 - -2.288808507226996e-02 - -2.265197791904223e-02 - -2.241723098404469e-02 - -2.218384825955722e-02 - -2.195183359578144e-02 - -2.172119070564114e-02 - -2.149192317903017e-02 - -2.126403446983029e-02 - -2.103752788800763e-02 - -2.081240661670658e-02 - -2.058867370373213e-02 - -2.036633206151460e-02 - -2.014538447470562e-02 - -1.992583358220780e-02 - -1.970768189350454e-02 - -1.949093179354288e-02 - -1.927558551890179e-02 - -1.906164517346932e-02 - -1.884911273803516e-02 - -1.863799005561765e-02 - -1.842827883084014e-02 - -1.821998063919436e-02 - -1.801309692347624e-02 - -1.780762899421212e-02 - -1.760357803216378e-02 - -1.740094507853177e-02 - -1.719973104881908e-02 - -1.699993673354589e-02 - -1.680156278321953e-02 - -1.660460972117107e-02 - -1.640907794332531e-02 - -1.621496771146485e-02 - -1.602227916433384e-02 - -1.583101231371427e-02 - -1.564116703862817e-02 - -1.545274309883748e-02 - -1.526574012772238e-02 - -1.508015761914186e-02 - -1.489599495303444e-02 - -1.471325139301425e-02 - -1.453192606709004e-02 - -1.435201798658663e-02 - -1.417352604127694e-02 - -1.399644899327932e-02 - -1.382078549302728e-02 - -1.364653407164367e-02 - -1.347369313289915e-02 - -1.330226097046918e-02 - -1.313223576283522e-02 - -1.296361556501821e-02 - -1.279639832327015e-02 - -1.263058187022890e-02 - -1.246616392163480e-02 - -1.230314208589229e-02 - -1.214151385550256e-02 - -1.198127661271531e-02 - -1.182242763705999e-02 - -1.166496409538715e-02 - -1.150888304589847e-02 - -1.135418144553720e-02 - -1.120085614521435e-02 - -1.104890388968280e-02 - -1.089832132231912e-02 - -1.074910498405016e-02 - -1.060125131793449e-02 - -1.045475666967276e-02 - -1.030961728045836e-02 - -1.016582929759894e-02 - -1.002338877483435e-02 - -9.882291666582974e-03 - -9.742533838318660e-03 - -9.604111064390042e-03 - -9.467019020603698e-03 - -9.331253297647066e-03 - -9.196809399717920e-03 - -9.063682741005771e-03 - -8.931868652392608e-03 - -8.801362376326071e-03 - -8.672159070075210e-03 - -8.544253813557785e-03 - -8.417641603575709e-03 - -8.292317355716863e-03 - -8.168275911736944e-03 - -8.045512032694060e-03 - -7.924020397696789e-03 - -7.803795618017998e-03 - -7.684832236645861e-03 - -7.567124714929550e-03 - -7.450667444285828e-03 - -7.335454748033539e-03 - -7.221480883382279e-03 - -7.108740043647531e-03 - -6.997226348639058e-03 - -6.886933855315346e-03 - -6.777856561420043e-03 - -6.669988397445708e-03 - -6.563323236817328e-03 - -6.457854897474280e-03 - -6.353577131920331e-03 - -6.250483639666226e-03 - -6.148568068731946e-03 - -6.047824005897748e-03 - -5.948244987599076e-03 - -5.849824501347084e-03 - -5.752555978513681e-03 - -5.656432807264865e-03 - -5.561448332218353e-03 - -5.467595840626229e-03 - -5.374868578311233e-03 - -5.283259752176146e-03 - -5.192762521793490e-03 - -5.103370006626977e-03 - -5.015075286629148e-03 - -4.927871401782054e-03 - -4.841751355904269e-03 - -4.756708115524279e-03 - -4.672734611342882e-03 - -4.589823741835811e-03 - -4.507968371897898e-03 - -4.427161334111035e-03 - -4.347395432360992e-03 - -4.268663440821394e-03 - -4.190958105123732e-03 - -4.114272145237943e-03 - -4.038598254543495e-03 - -3.963929102325757e-03 - -3.890257335680627e-03 - -3.817575578228647e-03 - -3.745876433060482e-03 - -3.675152484340320e-03 - -3.605396296371936e-03 - -3.536600416225055e-03 - -3.468757375181376e-03 - -3.401859688514519e-03 - -3.335899857279008e-03 - -3.270870369624132e-03 - -3.206763701552144e-03 - -3.143572317880366e-03 - -3.081288673370167e-03 - -3.019905214426235e-03 - -2.959414379161780e-03 - -2.899808598243805e-03 - -2.841080297295089e-03 - -2.783221897187762e-03 - -2.726225814481816e-03 - -2.670084462721576e-03 - -2.614790253659214e-03 - -2.560335598217736e-03 - -2.506712907773368e-03 - -2.453914594305456e-03 - -2.401933071402304e-03 - -2.350760756079694e-03 - -2.300390068609935e-03 - -2.250813433830373e-03 - -2.202023282926124e-03 - -2.154012052729510e-03 - -2.106772187286276e-03 - -2.060296139752280e-03 - -2.014576371403607e-03 - -1.969605353508076e-03 - -1.925375568654703e-03 - -1.881879509874747e-03 - -1.839109683164610e-03 - -1.797058608044933e-03 - -1.755718816706420e-03 - -1.715082857166331e-03 - -1.675143293280333e-03 - -1.635892703443056e-03 - -1.597323683697497e-03 - -1.559428848712492e-03 - -1.522200830321536e-03 - -1.485632280183934e-03 - -1.449715870092584e-03 - -1.414444291041649e-03 - -1.379810256474448e-03 - -1.345806501791486e-03 - -1.312425783716085e-03 - -1.279660883530597e-03 - -1.247504606026809e-03 - -1.215949779407020e-03 - -1.184989258561609e-03 - -1.154615923413642e-03 - -1.124822679454977e-03 - -1.095602461024569e-03 - -1.066948228352973e-03 - -1.038852968864840e-03 - -1.011309701783447e-03 - -9.843114734261671e-04 - -9.578513585924095e-04 - -9.319224654553773e-04 - -9.065179311555053e-04 - -8.816309237062864e-04 - -8.572546450286300e-04 - -8.333823272254078e-04 - -8.100072355517002e-04 - -7.871226705798197e-04 - -7.647219641139264e-04 - -7.427984826268421e-04 - -7.213456295816899e-04 - -7.003568409622573e-04 - -6.798255887472549e-04 - -6.597453829223955e-04 - -6.401097674232178e-04 - -6.209123240167792e-04 - -6.021466729184949e-04 - -5.838064694784330e-04 - -5.658854088227745e-04 - -5.483772251938055e-04 - -5.312756891491387e-04 - -5.145746125261390e-04 - -4.982678466736966e-04 - -4.823492804447342e-04 - -4.668128456938979e-04 - -4.516525141842837e-04 - -4.368622962674093e-04 - -4.224362466667431e-04 - -4.083684605074392e-04 - -3.946530726767535e-04 - -3.812842634726816e-04 - -3.682562540846601e-04 - -3.555633067280622e-04 - -3.431997298953713e-04 - -3.311598733734528e-04 - -3.194381292167991e-04 - -3.080289365424697e-04 - -2.969267761950205e-04 - -2.861261725181284e-04 - -2.756216974519896e-04 - -2.654079650780054e-04 - -2.554796342192304e-04 - -2.458314117831762e-04 - -2.364580472261255e-04 - -2.273543358783364e-04 - -2.185151214599497e-04 - -2.099352907310207e-04 - -2.016097775283348e-04 - -1.935335642058985e-04 - -1.857016766078902e-04 - -1.781091887621722e-04 - -1.707512232636694e-04 - -1.636229467286454e-04 - -1.567195750846747e-04 - -1.500363727286114e-04 - -1.435686485603325e-04 - -1.373117617901810e-04 - -1.312611200233150e-04 - -1.254121759173047e-04 - -1.197604333131590e-04 - -1.143014443478538e-04 - -1.090308067994204e-04 - -1.039441703359566e-04 - -9.903723276260782e-05 - -9.430573818110019e-05 - -8.974548326970851e-05 - -8.535231263786576e-05 - -8.112211782233505e-05 - -7.705084341917009e-05 - -7.313448187442813e-05 - -6.936907333027644e-05 - -6.575071119249467e-05 - -6.227553658275769e-05 - -5.893973914900695e-05 - -5.573956203853484e-05 - -5.267129595161032e-05 - -4.973128084575291e-05 - -4.691591029739419e-05 - -4.422162539456759e-05 - -4.164491727590835e-05 - -3.918233061143914e-05 - -3.683045757249665e-05 - -3.458594118927672e-05 - -3.244547785270521e-05 - -3.040581149216269e-05 - -2.846373767254703e-05 - -2.661610506551807e-05 - -2.485980997915884e-05 - -2.319180110803831e-05 - -2.160907991664170e-05 - -2.010869565536285e-05 - -1.868775067119526e-05 - -1.734339969669114e-05 - -1.607284546059277e-05 - -1.487334444060605e-05 - -1.374220506933501e-05 - -1.267678404087566e-05 - -1.167449238525668e-05 - -1.073279264625808e-05 - -9.849195952118955e-06 - -9.021268250139948e-06 - -8.246626567968640e-06 - -7.522936912951058e-06 - -6.847920492700095e-06 - -6.219349168072015e-06 - -5.635044236568559e-06 - -5.092882470932048e-06 - -4.590790895044201e-06 - -4.126746487291455e-06 - -3.698781859286729e-06 - -3.304979520120749e-06 - -2.943472506918129e-06 - -2.612449510984778e-06 - -2.310148834845521e-06 - -2.034859929271865e-06 - -1.784927798002038e-06 - -1.558746837246077e-06 - -1.354763241038800e-06 - -1.171478551126456e-06 - -1.007443551831214e-06 - -8.612614901318561e-07 - -7.315906671893518e-07 - -6.171385461507109e-07 - -5.166657190198488e-07 - -4.289874671965282e-07 - -3.529682224298676e-07 - -2.875261969469119e-07 - -2.316338735426513e-07 - -1.843129441850586e-07 - -1.446395043479685e-07 - -1.117434618507405e-07 - -8.480406305106530e-08 - -6.305553831873507e-08 - -4.578544870958251e-08 - -3.233089380928512e-08 - -2.208448022054805e-08 - -1.449165750478591e-08 - -9.047683233008124e-09 - -5.303766739728543e-09 - -2.863504097386866e-09 - -1.380623394721897e-09 - -5.650641971230870e-10 - -1.790372475752245e-10 - -3.511990521548007e-11 - -8.192061809269277e-13 - 0.000000000000000e+00 diff --git a/examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy b/examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy new file mode 120000 index 0000000000..a93b43f72a --- /dev/null +++ b/examples/SPIN/dipole_spin/Fe_Mishin2006.eam.alloy @@ -0,0 +1 @@ +../iron/Fe_Mishin2006.eam.alloy \ No newline at end of file diff --git a/examples/SPIN/dipole_spin/in.spin.iron_ewald b/examples/SPIN/dipole_spin/in.spin.iron_dipole_ewald similarity index 100% rename from examples/SPIN/dipole_spin/in.spin.iron_ewald rename to examples/SPIN/dipole_spin/in.spin.iron_dipole_ewald diff --git a/examples/SPIN/dipole_spin/in.spin.iron_pppm b/examples/SPIN/dipole_spin/in.spin.iron_dipole_pppm similarity index 100% rename from examples/SPIN/dipole_spin/in.spin.iron_pppm rename to examples/SPIN/dipole_spin/in.spin.iron_dipole_pppm diff --git a/examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy b/examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy deleted file mode 120000 index 6a47c9eebe..0000000000 --- a/examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy +++ /dev/null @@ -1 +0,0 @@ -../cobalt_fcc/Co_PurjaPun_2012.eam.alloy \ No newline at end of file diff --git a/examples/SPIN/pppm_spin/data.2 b/examples/SPIN/pppm_spin/data.2 deleted file mode 100644 index 426e3a9cb4..0000000000 --- a/examples/SPIN/pppm_spin/data.2 +++ /dev/null @@ -1,13 +0,0 @@ -RANDOM INITIALIZATION FOR STOCKMAYER FLUID -2 atoms -1 atom types - - -3.0 3.0 xlo xhi - -3.0 3.0 ylo yhi - -3.0 3.0 zlo zhi - #30.0 30.0 0.0 xy xz yz - -Atoms - -1 1 1.73 0.0 0.0 0.0 0.0 0.0 1.0 -2 1 1.73 0.0 2.5 0.0 0.0 0.0 1.0 diff --git a/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py deleted file mode 100644 index fa7dba417e..0000000000 --- a/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py +++ /dev/null @@ -1,32 +0,0 @@ -#Program fitting the exchange interaction -#Model curve: Bethe-Slater function -import numpy as np, pylab, tkinter -import matplotlib.pyplot as plt -from scipy.optimize import curve_fit -from decimal import * - -print("Loop begin") - -#Definition of the Bethe-Slater function -def func(x,a,b,c): - return 4*a*((x/c)**2)*(1-b*(x/c)**2)*np.exp(-(x/c)**2) - -#Exchange coeff table (data to fit) -rdata, Jdata = np.loadtxt('exchange_hcp_co.dat', usecols=(0,1), unpack=True) -plt.plot(rdata, Jdata, 'b-', label='data') - -#Perform the fit -popt, pcov = curve_fit(func, rdata, Jdata, bounds=(0, [500.,5.,5.])) -plt.plot(rdata, func(rdata, *popt), 'r--', label='fit') - -#Print the fitted params -print("Parameters: a={:.10} (in meV), b={:.10} (adim), c={:.10} (in Ang)".format(*popt)) - -#Ploting the result -plt.xlabel('r_ij') -pylab.xlim([0,6.5]) -plt.ylabel('J_ij') -plt.legend() -plt.show() - -print("Loop end") diff --git a/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat deleted file mode 100644 index 0968fa3edb..0000000000 --- a/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat +++ /dev/null @@ -1,9 +0,0 @@ -2.25569176882662 73.37931034482759 -2.3817863397548162 47.99999999999999 -2.4518388791593697 34.39080459770115 -2.507880910683012 31.816091954022987 -2.5359019264448337 28.137931034482747 -2.5779334500875657 25.011494252873554 -2.6339754816112086 19.126436781609186 -2.760070052539404 13.241379310344826 -3.5446584938704033 6.068965517241367 diff --git a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole deleted file mode 100644 index d029d0a97c..0000000000 --- a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole +++ /dev/null @@ -1,56 +0,0 @@ -# 3d Lennard-Jones melt - -units lj -#atom_style charge -atom_style hybrid sphere dipole -processors * 1 1 - -lattice fcc 0.8442 -#region box block 0 10 0 10 0 10 -region box block 0 5 0 5 0 5 -create_box 3 box -create_atoms 1 box -mass * 1.0 - -region long block 3 6 0 10 0 10 -set region long type 2 -set group all dipole/random 98934 0.75 -#set type 1:2 charge 0.0 - -velocity all create 1.0 87287 - -#pair_style lj/long/coul/long long off 2.5 -#pair_coeff * * 1.0 1.0 2.5 -#pair_coeff * 2 1.0 1.0 5.0 -pair_style lj/cut/dipole/long 3.0 -pair_coeff * * 0.0 0.0 - -#kspace_style pppm/disp 1.0e-4 -#kspace_style pppm/dipole 1.0e-4 -kspace_style ewald/dipole 1.0e-4 -#kspace_modify compute yes gewald 0.1 - -neighbor 0.3 bin -neigh_modify every 2 delay 4 check yes - -group fast type 1 -group slow type 2 -fix 0 all balance 20 1.0 shift x 5 1.0 & - weight group 2 fast 1.0 slow 2.0 weight time 0.66 - -fix 1 all nve - -#dump id all atom 50 dump.melt - -#dump 2 all image 25 image.*.jpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -#thermo 50 -thermo 1 -#run 500 -run 5 diff --git a/examples/SPIN/pppm_spin/in.spin.2 b/examples/SPIN/pppm_spin/in.spin.2 deleted file mode 100644 index 29f3203694..0000000000 --- a/examples/SPIN/pppm_spin/in.spin.2 +++ /dev/null @@ -1,75 +0,0 @@ -# two magnetic atoms in a 3d box - -clear -units metal -atom_style spin - -dimension 3 -#boundary p p p -atom_modify map array - -read_data ../examples/SPIN/pppm_spin/data.2 - - -mass 1 58.93 -#set group all spin/random 31 1.72 - -#velocity all create 100 4928459 rot yes dist gaussian - -pair_style spin/dipolar/cut 4.0 -pair_coeff * * long 2.6 -#pair_style hybrid/overlay spin/exchange 4.0 spin/dipolar/long 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long/qsymp 8.0 -#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -#pair_coeff * * spin/exchange exchange 4.0 0.1 1.135028015e-05 1.064568567 -#pair_coeff * * spin/dipolar/long long 8.0 - -#neighbor 0.1 bin -#neigh_modify every 10 check yes delay 20 -neighbor 0.3 bin -neigh_modify delay 0 -#neigh_modify every 1 delay 10 check yes page 100000000 one 10000000 - -#kspace_style pppm/dipole/spin 1.0e-4 -#kspace_style ewald/dipole/spin 1.0e-4 -#kspace_modify compute yes -#kspace_modify compute yes gewald 0.1 - -fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.0 21 -#fix 3 all nve/spin lattice yes -fix 3 all nve/spin lattice no - -timestep 0.0001 - -thermo_style custom step temp pe ke etotal press -thermo_modify format float %20.16g -thermo 1 - -#compute peratom all pe/atom -#compute pe all reduce sum c_peratom -#thermo_style custom step temp pe c_pe - -#compute peratom2 all stress/atom -#compute peratom2 all stress/atom NULL -#compute p all reduce sum c_peratom2[1] c_peratom2[2] c_peratom2[3] c_peratom2[4] c_peratom2[5] c_peratom2[6] -#variable press equal -(c_p[1]+c_p[2]+c_p[3])/(3*vol) -#variable pxx equal -c_p[1]/vol -#variable pyy equal -c_p[2]/vol -#variable pzz equal -c_p[3]/vol -#variable pxy equal -c_p[4]/vol -#variable pxz equal -c_p[5]/vol -#variable pyz equal -c_p[6]/vol -#thermo_style custom step temp etotal pe c_pe press v_press pxx v_pxx pyy v_pyy pzz v_pzz pxy v_pxy pxz v_pxz pyz v_pyz -#thermo_style custom step etotal pe press v_press v_pxx v_pyy v_pzz v_pxy v_pxz v_pyz -#thermo_style custom step temp etotal press v_press - -compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 1 all custom 1 dump.equil id type x y z c_outsp[1] c_outsp[2] c_outsp[3] -#c_outsp[5] c_outsp[6] c_outsp[7] -#dump_modify 1 format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g" scale yes - -#pair_modify compute no - -run 1 diff --git a/examples/SPIN/pppm_spin/in.spin.cut_comp b/examples/SPIN/pppm_spin/in.spin.cut_comp deleted file mode 100644 index 373c485c94..0000000000 --- a/examples/SPIN/pppm_spin/in.spin.cut_comp +++ /dev/null @@ -1,52 +0,0 @@ -# bcc iron in a 3d periodic box - -clear -units metal -atom_style spin - -dimension 3 -boundary p p p -atom_modify map array - -lattice bcc 2.8665 -region box block 0.0 5.0 0.0 5.0 0.0 5.0 -create_box 1 box -create_atoms 1 box - -mass 1 58.93 -#set group all spin 2.2 0.0 0.0 1.0 -set group all spin/random 31 2.2 - -#pair_style spin/dipolar/cut 5.0 -#pair_coeff * * long 5.0 -pair_style spin/dipolar/long 4.0 -pair_coeff * * long 4.0 - -#neighbor 0.1 bin -#neigh_modify every 10 check yes delay 20 -neighbor 0.3 bin -neigh_modify delay 0 -#neigh_modify every 1 delay 10 check yes page 100000000 one 10000000 - -#kspace_style pppm/dipole/spin 1.0e-4 -#kspace_style ewald/dipole/spin 1.0e-4 -#kspace_modify compute yes -#kspace_modify compute yes gewald 0.1 - -fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.0 21 -#fix 3 all nve/spin lattice yes -fix 3 all nve/spin lattice no - -timestep 0.0001 - -thermo_style custom step temp pe ke etotal press -thermo_modify format float %20.16g -thermo 50 - -compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 50 all custom 1 dump.equil id type x y z c_outsp[1] c_outsp[2] c_outsp[3] -#c_outsp[5] c_outsp[6] c_outsp[7] -#dump_modify 1 format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g" scale yes - -run 10000 diff --git a/examples/SPIN/pppm_spin/in.spin.ewald_spin b/examples/SPIN/pppm_spin/in.spin.ewald_spin deleted file mode 100644 index 889ed086f8..0000000000 --- a/examples/SPIN/pppm_spin/in.spin.ewald_spin +++ /dev/null @@ -1,68 +0,0 @@ -# hcp cobalt in a 3d periodic box - -clear -units metal -atom_style spin - -dimension 3 -boundary p p p - -# necessary for the serial algorithm (sametag) -atom_modify map array - -lattice hcp 2.5071 -region box block 0.0 8.0 0.0 8.0 0.0 8.0 -create_box 1 box -create_atoms 1 box - -# setting mass, mag. moments, and interactions for hcp cobalt - -mass 1 58.93 - -set group all spin/random 31 1.72 -#set group all spin 1.72 0.0 0.0 1.0 -#velocity all create 100 4928459 rot yes dist gaussian - -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long/qsymp 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 -#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -#pair_coeff * * spin/long/qsymp long 8.0 -pair_style spin/dipolar/long 8.0 -pair_coeff * * long 8.0 - -neighbor 0.1 bin -neigh_modify every 10 check yes delay 20 - -kspace_style ewald/dipole/spin 1.0e-4 -#kspace_modify mesh 32 32 32 - -#fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 -fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.0 21 -#fix 3 all nve/spin lattice yes -fix 3 all nve/spin lattice no - -timestep 0.001 - - -compute out_mag all compute/spin -compute out_pe all pe -compute out_ke all ke -compute out_temp all temp - -variable magz equal c_out_mag[3] -variable magnorm equal c_out_mag[4] -variable emag equal c_out_mag[5] -variable tmag equal c_out_mag[6] - -thermo_style custom step time v_magnorm v_tmag temp v_emag ke pe etotal -#thermo_style custom step time v_magnorm v_emag temp etotal -thermo 10 - -compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] - -#run 20000 -run 1000 diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin deleted file mode 100644 index 78dfbb56a0..0000000000 --- a/examples/SPIN/pppm_spin/in.spin.pppm_spin +++ /dev/null @@ -1,66 +0,0 @@ -# hcp cobalt in a 3d periodic box - -clear -units metal -atom_style spin - -dimension 3 -boundary p p p - -# necessary for the serial algorithm (sametag) -atom_modify map array - -lattice hcp 2.5071 -region box block 0.0 8.0 0.0 8.0 0.0 8.0 -create_box 1 box -create_atoms 1 box - -# setting mass, mag. moments, and interactions for hcp cobalt - -mass 1 58.93 - -set group all spin/random 31 1.72 -#set group all spin 1.72 0.0 0.0 1.0 -velocity all create 100 4928459 rot yes dist gaussian - -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long/qsymp 8.0 -pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * spin/exchange exchange 4.0 0.0 1.135028015e-05 1.064568567 -#pair_coeff * * spin/dipolar/long/qsymp long 8.0 -pair_coeff * * spin/dipolar/long long 8.0 - -neighbor 0.1 bin -neigh_modify every 10 check yes delay 20 - -kspace_style pppm/dipole/spin 1.0e-4 -kspace_modify compute yes - -#fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 -fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.0 21 -fix 3 all nve/spin lattice yes - -timestep 0.0001 - - -compute out_mag all compute/spin -compute out_pe all pe -compute out_ke all ke -compute out_temp all temp - -variable magz equal c_out_mag[3] -variable magnorm equal c_out_mag[4] -variable emag equal c_out_mag[5] -variable tmag equal c_out_mag[6] - -thermo_style custom step time v_magnorm v_emag temp etotal -thermo_modify format float %20.16g -thermo 10 - -compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] - -run 20000 -#run 1 diff --git a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut deleted file mode 100644 index a3ca4288fc..0000000000 --- a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut +++ /dev/null @@ -1,64 +0,0 @@ -# hcp cobalt in a 3d periodic box - -clear -units metal -atom_style spin - -dimension 3 -boundary p p p - -# necessary for the serial algorithm (sametag) -atom_modify map array - -lattice hcp 2.5071 -region box block 0.0 8.0 0.0 8.0 0.0 8.0 -create_box 1 box -create_atoms 1 box - -# setting mass, mag. moments, and interactions for hcp cobalt - -mass 1 58.93 - -set group all spin/random 31 1.72 -#set group all spin 1.72 0.0 0.0 1.0 -velocity all create 100 4928459 rot yes dist gaussian - -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 -#pair_style hybrid/overlay eam/alloy spin/dipolar/cut 8.0 -pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * spin/dipolar/cut long 8.0 -#pair_style spin/dipolar/cut 8.0 -#pair_coeff * * long 8.0 - -neighbor 0.1 bin -neigh_modify every 10 check yes delay 20 - -#fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 -fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.0 21 -fix 3 all nve/spin lattice yes -#fix 3 all nve/spin lattice no - -timestep 0.0001 - - -compute out_mag all compute/spin -compute out_pe all pe -compute out_ke all ke -compute out_temp all temp - -variable magz equal c_out_mag[3] -variable magnorm equal c_out_mag[4] -variable emag equal c_out_mag[5] -variable tmag equal c_out_mag[6] - -thermo_style custom step time v_magnorm v_emag temp etotal -thermo_modify format float %20.16g -thermo 10 - -compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] - -run 20000 -#run 10 From 82b50706bd6d72b19dffdf880c93578261b1aeac Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 20 May 2019 22:09:59 -0600 Subject: [PATCH 42/90] Commit2 JT 052019 - some corrections in the examples - deleted an old doc files (now redundant) --- doc/src/pair_spin_long.txt | 84 --------------------------------- examples/SPIN/iron/in.spin.iron | 5 +- 2 files changed, 2 insertions(+), 87 deletions(-) delete mode 100644 doc/src/pair_spin_long.txt diff --git a/doc/src/pair_spin_long.txt b/doc/src/pair_spin_long.txt deleted file mode 100644 index c5b4a7b33e..0000000000 --- a/doc/src/pair_spin_long.txt +++ /dev/null @@ -1,84 +0,0 @@ -"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html) - -:line - -pair_style spin/long command :h3 - -[Syntax:] - -pair_style spin/long cutoff (cutoff) - -cutoff = global cutoff pair (distance in metal units) :ulb,l -:ule - -[Examples:] - -pair_style spin/long 10.0 -pair_coeff * * long 10.0 -pair_coeff 2 3 long 8.0 :pre - -[Description:] - -Style {pair/spin/long} computes interactions between pairs of particles -that each have a magnetic spin. - -:c,image(Eqs/pair_spin_long_range.jpg) - -where si and sj are two magnetic spins of two particles with Lande factors -gi and gj respectively, eij = (ri - rj)/|ri-rj| is the unit vector between -sites i and j, mu0 the vacuum permeability, muB the Bohr magneton (muB = -5.788 eV/T in metal units). - -Style {pair/spin/long} computes magnetic precession vectors: - -:c,image(Eqs/pair_spin_long_range_magforce.jpg) - -with h the Planck constant (in metal units), and a mechanical force: - -:c,image(Eqs/pair_spin_long_range_force.jpg) - - -The following coefficient must be defined for each pair of atoms -types via the "pair_coeff"_pair_coeff.html command as in the examples -above, or in the data file or restart files read by the -"read_data"_read_data.html or "read_restart"_read_restart.html -commands, or by mixing as described below: - -rc (distance units) :ul - -with rc is the radius cutoff of the short-range component of the -long-range interaction (see "(Cerda)"_#Cerda1 for more -explanation). - -:line - -[Restrictions:] - -The {pair/spin/long} style is part of the SPIN package. It is only -enabled if LAMMPS was built with that package. See the -"Making LAMMPS"_Section_start.html#start_3 section for more info. - -The {pair/spin/long} style computes the short-range component of -the dipole-dipole interaction. The functions evaluating the -long-range component are part of the KSPACE package. -They can be enabled only if LAMMPS was built with that package. - -[Related commands:] - -"atom_style spin"_atom_style.html, "pair_coeff"_pair_coeff.html, - -[Default:] none - -:line - -:link(Tranchida6) -[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -Journal of Computational Physics, (2018). - -:link(Cerda1) -[(Cerda)] Cerda, Ballenegger, Lenz, and Holm, J Chem Phys, 129(23), -234104 (2008). diff --git a/examples/SPIN/iron/in.spin.iron b/examples/SPIN/iron/in.spin.iron index c963c919cd..bb1b0e1b4d 100644 --- a/examples/SPIN/iron/in.spin.iron +++ b/examples/SPIN/iron/in.spin.iron @@ -24,8 +24,7 @@ set group all spin 2.2 0.0 0.0 1.0 velocity all create 100 4928459 rot yes dist gaussian pair_style hybrid/overlay eam/alloy spin/exchange 3.5 -#pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe -pair_coeff * * eam/alloy ../examples/SPIN/iron/Fe_Mishin2006.eam.alloy Fe +pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe pair_coeff * * spin/exchange exchange 3.4 0.02726 0.2171 1.841 neighbor 0.1 bin @@ -55,4 +54,4 @@ thermo 50 compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -run 50 +run 50000 From 95ab0565762f1eee1a3327065fad19aa4df48d18 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 21 May 2019 10:07:41 -0600 Subject: [PATCH 43/90] Add PPPM dipole reference --- doc/src/kspace_modify.txt | 3 ++- doc/src/kspace_style.txt | 14 +++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/doc/src/kspace_modify.txt b/doc/src/kspace_modify.txt index 65b2174334..c5a2ce1b69 100644 --- a/doc/src/kspace_modify.txt +++ b/doc/src/kspace_modify.txt @@ -392,7 +392,8 @@ boundaries can be set using "boundary"_boundary.html (the slab approximation in not needed). The {slab} keyword is not currently supported by Ewald or PPPM when using a triclinic simulation cell. The slab correction has also been extended to point dipole interactions -"(Klapp)"_#Klapp in "kspace_style"_kspace_style.html {ewald/disp}. +"(Klapp)"_#Klapp in "kspace_style"_kspace_style.html {ewald/disp}, +{ewald/dipole}, and {pppm/dipole}. NOTE: If you wish to apply an electric field in the Z-direction, in conjunction with the {slab} keyword, you should do it by adding diff --git a/doc/src/kspace_style.txt b/doc/src/kspace_style.txt index 93709600df..98ec1e64e6 100644 --- a/doc/src/kspace_style.txt +++ b/doc/src/kspace_style.txt @@ -113,9 +113,11 @@ The {ewald/disp} style adds a long-range dispersion sum option for but in a more efficient manner than the {ewald} style. The 1/r^6 capability means that Lennard-Jones or Buckingham potentials can be used without a cutoff, i.e. they become full long-range potentials. +The {ewald/disp} style can also be used with point-dipoles, see +"(Toukmaji)"_#Toukmaji. The {ewald/dipole} style adds long-range standard Ewald summations -for dipole-dipole interactions. +for dipole-dipole interactions, see "(Toukmaji)"_#Toukmaji. The {ewald/dipole/spin} style adds long-range standard Ewald summations for magnetic dipole-dipole interactions between @@ -141,7 +143,7 @@ charge value which determines whether a particle is considered charged or not. Its default value is 1.0e-5. The {pppm/dipole} style invokes a particle-particle particle-mesh solver -for dipole-dipole interactions. +for dipole-dipole interactions, following the method of "(Cerda)"_#Cerda2008. The {pppm/dipole/spin} style invokes a particle-particle particle-mesh solver for magnetic dipole-dipole interactions between magnetic spins. @@ -335,7 +337,10 @@ using ideas from chapter 3 of "(Hardy)"_#Hardy2006, with equation 3.197 of particular note. When using {msm} with non-periodic boundary conditions, it is expected that the error estimation will be too pessimistic. RMS force errors for dipoles when using {ewald/disp} -are estimated using equations 33 and 46 of "(Wang)"_#Wang. +or {ewald/dipole} are estimated using equations 33 and 46 of +"(Wang)"_#Wang. The RMS force errors for {pppm/dipole} are estimated +using the equations in "(Cerda)"_#Cerda2008. + See the "kspace_modify"_kspace_modify.html command for additional options of the K-space solvers that can be set, including a {force} @@ -482,6 +487,9 @@ Illinois at Urbana-Champaign, (2006). :link(Sutmann2013) [(Sutmann)] Sutmann, Arnold, Fahrenberger, et. al., Physical review / E 88(6), 063308 (2013) +:link(Cerda2008) +[(Cerda)] Cerda, Ballenegger, Lenz, Holm, J Chem Phys 129, 234104 (2008) + :link(Who2012) [(Who)] Who, Author2, Author3, J of Long Range Solvers, 35, 164-177 (2012). From 2fbc4f504d279c9aa76e95eed2b2ea597e22be78 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 21 May 2019 10:16:13 -0600 Subject: [PATCH 44/90] Per-atom virial is not yet supported with pppm/dipole --- src/KSPACE/ewald_dipole.cpp | 3 +-- src/KSPACE/ewald_dipole_spin.cpp | 1 - src/KSPACE/pppm_dipole.cpp | 7 +++++-- src/KSPACE/pppm_dipole.h | 4 ++++ src/KSPACE/pppm_dipole_spin.cpp | 7 +++++-- src/KSPACE/pppm_dipole_spin.h | 4 ++++ 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 25661555fa..89ef7e39a8 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -12,8 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Julien Tranchida (SNL) - Stan Moore (SNL) + Contributing authors: Julien Tranchida (SNL), Stan Moore (SNL) ------------------------------------------------------------------------- */ #include diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 35f5daafba..dea563eb99 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -13,7 +13,6 @@ /* ---------------------------------------------------------------------- Contributing authors: Julien Tranchida (SNL) - Stan Moore (SNL) ------------------------------------------------------------------------- */ #include diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index 3603222def..278d3b1f9d 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -12,8 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Stan Moore (SNL) - Julien Tranchida (SNL) + Contributing authors: Stan Moore (SNL), Julien Tranchida (SNL) ------------------------------------------------------------------------- */ #include @@ -441,6 +440,10 @@ void PPPMDipole::compute(int eflag, int vflag) else evflag = evflag_atom = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + if (vflag_atom) + error->all(FLERR,"Cannot (yet) compute per-atom virial " + "with kspace style pppm/dipole" + if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); cg_peratom_dipole->ghost_notify(); diff --git a/src/KSPACE/pppm_dipole.h b/src/KSPACE/pppm_dipole.h index 28c731b88b..d06919644b 100644 --- a/src/KSPACE/pppm_dipole.h +++ b/src/KSPACE/pppm_dipole.h @@ -160,6 +160,10 @@ E: PPPM grid stencil extends beyond nearest neighbor processor This is not allowed if the kspace_modify overlap setting is no. +E: Cannot (yet) compute per-atom virial with kspace style pppm/dipole + +This feature is not yet supported. + E: KSpace accuracy must be > 0 The kspace accuracy designated in the input must be greater than zero. diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index 23d7beaece..caa9ba47ab 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -12,8 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Stan Moore (SNL) - Julien Tranchida (SNL) + Contributing author: Julien Tranchida (SNL) ------------------------------------------------------------------------- */ #include @@ -300,6 +299,10 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) else evflag = evflag_atom = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + if (vflag_atom) + error->all(FLERR,"Cannot (yet) compute per-atom virial " + "with kspace style pppm/dipole/spin" + if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); cg_peratom_dipole->ghost_notify(); diff --git a/src/KSPACE/pppm_dipole_spin.h b/src/KSPACE/pppm_dipole_spin.h index c5a384b688..2b4a989d5c 100644 --- a/src/KSPACE/pppm_dipole_spin.h +++ b/src/KSPACE/pppm_dipole_spin.h @@ -119,6 +119,10 @@ E: PPPM grid stencil extends beyond nearest neighbor processor This is not allowed if the kspace_modify overlap setting is no. +E: Cannot (yet) compute per-atom virial with kspace style pppm/dipole/spin + +This feature is not yet supported. + E: KSpace accuracy must be > 0 The kspace accuracy designated in the input must be greater than zero. From 0ee1daa46dd668da6dbd579c94822813f3e156d2 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 21 May 2019 10:24:24 -0600 Subject: [PATCH 45/90] Add Lenz to false-positive list --- doc/utils/sphinx-config/false_positives.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 2d0575ca70..35572f1647 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1405,6 +1405,7 @@ Lenart lennard Lennard Lenosky +Lenz Lett Leuven Leven From ed7c09ac8145218ecea252a991d2ea2efb671df8 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 21 May 2019 10:30:33 -0600 Subject: [PATCH 46/90] Add missing character --- src/KSPACE/pppm_dipole.cpp | 2 +- src/KSPACE/pppm_dipole_spin.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index 278d3b1f9d..21a777dd75 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -442,7 +442,7 @@ void PPPMDipole::compute(int eflag, int vflag) if (vflag_atom) error->all(FLERR,"Cannot (yet) compute per-atom virial " - "with kspace style pppm/dipole" + "with kspace style pppm/dipole"); if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index caa9ba47ab..cee879422c 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -301,7 +301,7 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) if (vflag_atom) error->all(FLERR,"Cannot (yet) compute per-atom virial " - "with kspace style pppm/dipole/spin" + "with kspace style pppm/dipole/spin"); if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); From c2a200fe85907d7c4ef85147a702f7c13fde4297 Mon Sep 17 00:00:00 2001 From: "Vishnu V. Krishnan" Date: Sun, 26 May 2019 14:00:21 +0530 Subject: [PATCH 47/90] A function logfreq3(), for logarithmical spacing Unlike logfreq(), this also allows for fractional ratios Resolves #1471 --- doc/src/variable.txt | 16 +++++++-- src/variable.cpp | 82 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 84 insertions(+), 14 deletions(-) diff --git a/doc/src/variable.txt b/doc/src/variable.txt index e90e9bd04b..7951ecfb86 100644 --- a/doc/src/variable.txt +++ b/doc/src/variable.txt @@ -52,7 +52,7 @@ style = {delete} or {index} or {loop} or {world} or {universe} or {uloop} or {st sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), atan2(y,x), random(x,y,z), normal(x,y,z), ceil(x), floor(x), round(x) ramp(x,y), stagger(x,y), logfreq(x,y,z), logfreq2(x,y,z), - stride(x,y,z), stride2(x,y,z,a,b,c), + logfreq3(x,y,z), stride(x,y,z), stride2(x,y,z,a,b,c), vdisplace(x,y), swiggle(x,y,z), cwiggle(x,y,z) group functions = count(group), mass(group), charge(group), xcm(group,dim), vcm(group,dim), fcm(group,dim), @@ -459,8 +459,8 @@ Math functions: sqrt(x), exp(x), ln(x), log(x), abs(x), \ sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), atan2(y,x), \ random(x,y,z), normal(x,y,z), ceil(x), floor(x), round(x), \ ramp(x,y), stagger(x,y), logfreq(x,y,z), logfreq2(x,y,z), \ - stride(x,y,z), stride2(x,y,z,a,b,c), vdisplace(x,y), \ - swiggle(x,y,z), cwiggle(x,y,z) + logfreq3(x,y,z), stride(x,y,z), stride2(x,y,z,a,b,c), \ + vdisplace(x,y), swiggle(x,y,z), cwiggle(x,y,z) Group functions: count(ID), mass(ID), charge(ID), xcm(ID,dim), \ vcm(ID,dim), fcm(ID,dim), bound(ID,dir), \ gyration(ID), ke(ID), angmom(ID,dim), torque(ID,dim), \ @@ -670,6 +670,16 @@ sequence of output timesteps: 100,150,200,...950,1000,1500,2000,...9500,10000,15000,etc :pre +The logfreq3(x,y,z) function generates y points between x and z (inclusive), +that are separated by a multiplicative ratio: (z/x)^(1/(y-1)). Constraints +are: x,z > 0, y > 1, z-x >= y-1. For eg., if logfreq3(10,25,1000) is used in +a variable by the "fix print"_fix_print.html command, then the interval +between 10 and 1000 is divided into 24 parts with a multiplicative +separation of ~1.21, and it will generate the following sequence of output +timesteps: + +10, 13, 15, 18, 22, 27, 32,...384, 465, 563, 682, 826, 1000 :pre + The stride(x,y,z) function uses the current timestep to generate a new timestep. X,y >= 0 and z > 0 and x <= y are required. The generated timesteps increase in increments of z, from x to y, i.e. it generates diff --git a/src/variable.cpp b/src/variable.cpp index 56b66cad0d..251abf0eff 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -63,8 +63,8 @@ enum{DONE,ADD,SUBTRACT,MULTIPLY,DIVIDE,CARAT,MODULO,UNARY, NOT,EQ,NE,LT,LE,GT,GE,AND,OR,XOR, SQRT,EXP,LN,LOG,ABS,SIN,COS,TAN,ASIN,ACOS,ATAN,ATAN2, RANDOM,NORMAL,CEIL,FLOOR,ROUND,RAMP,STAGGER,LOGFREQ,LOGFREQ2, - STRIDE,STRIDE2,VDISPLACE,SWIGGLE,CWIGGLE,GMASK,RMASK,GRMASK, - IS_ACTIVE,IS_DEFINED,IS_AVAILABLE, + LOGFREQ3,STRIDE,STRIDE2,VDISPLACE,SWIGGLE,CWIGGLE,GMASK,RMASK, + GRMASK,IS_ACTIVE,IS_DEFINED,IS_AVAILABLE, VALUE,ATOMARRAY,TYPEARRAY,INTARRAY,BIGINTARRAY,VECTORARRAY}; // customize by adding a special function @@ -2294,8 +2294,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) sqrt(),exp(),ln(),log(),abs(),sin(),cos(),tan(),asin(),acos(),atan(), atan2(y,x),random(x,y,z),normal(x,y,z),ceil(),floor(),round(), ramp(x,y),stagger(x,y),logfreq(x,y,z),logfreq2(x,y,z), - stride(x,y,z),vdisplace(x,y),swiggle(x,y,z),cwiggle(x,y,z), - gmask(x),rmask(x),grmask(x,y) + logfreq3(x,y,z),stride(x,y,z),vdisplace(x,y),swiggle(x,y,z), + cwiggle(x,y,z),gmask(x),rmask(x),grmask(x,y) ---------------------------------------------------------------------- */ double Variable::collapse_tree(Tree *tree) @@ -2702,6 +2702,35 @@ double Variable::collapse_tree(Tree *tree) return tree->value; } + if (tree->type == LOGFREQ3) { + int ivalue1 = static_cast (collapse_tree(tree->first)); + int ivalue2 = static_cast (collapse_tree(tree->second)); + int ivalue3 = static_cast (collapse_tree(tree->extra[0])); + if (tree->first->type != VALUE || tree->second->type != VALUE || + tree->extra[0]->type != VALUE) return 0.0; + tree->type = VALUE; + if (ivalue1 <= 0 || ivalue2 <= 1 || ivalue3 <= 0 || + ivalue3-ivalue1+1 < ivalue2 ) + error->all(FLERR,"Invalid math function in variable formula"); + if (update->ntimestep < ivalue1) tree->value = ivalue1; + //else if (update->ntimestep <= ivalue3){ + else { + tree->value = ivalue1; + double logsp = ivalue1; + double factor = pow(((double)ivalue3)/ivalue1, 1.0/(ivalue2-1)); + int linsp = ivalue1; + while (update->ntimestep >= (tree->value)) { + logsp *= factor; + linsp++; + if (linsp > logsp) tree->value = linsp; + else tree->value = ceil(logsp)-(((int)ceil(logsp)-1)/ivalue3); + } + } + if (update->ntimestep > ivalue3) + error->all(FLERR,"Calls to variable exceeded limit"); + return tree->value; + } + if (tree->type == STRIDE) { int ivalue1 = static_cast (collapse_tree(tree->first)); int ivalue2 = static_cast (collapse_tree(tree->second)); @@ -2817,8 +2846,8 @@ double Variable::collapse_tree(Tree *tree) sqrt(),exp(),ln(),log(),sin(),cos(),tan(),asin(),acos(),atan(), atan2(y,x),random(x,y,z),normal(x,y,z),ceil(),floor(),round(), ramp(x,y),stagger(x,y),logfreq(x,y,z),logfreq2(x,y,z), - stride(x,y,z),stride2(x,y,z),vdisplace(x,y),swiggle(x,y,z), - cwiggle(x,y,z),gmask(x),rmask(x),grmask(x,y) + logfreq3(x,y,z),stride(x,y,z),stride2(x,y,z),vdisplace(x,y), + swiggle(x,y,z),cwiggle(x,y,z),gmask(x),rmask(x),grmask(x,y) ---------------------------------------------------------------------- */ double Variable::eval_tree(Tree *tree, int i) @@ -3297,8 +3326,8 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow) sqrt(),exp(),ln(),log(),abs(),sin(),cos(),tan(),asin(),acos(),atan(), atan2(y,x),random(x,y,z),normal(x,y,z),ceil(),floor(),round(), ramp(x,y),stagger(x,y),logfreq(x,y,z),logfreq2(x,y,z), - stride(x,y,z),stride2(x,y,z,a,b,c),vdisplace(x,y),swiggle(x,y,z), - cwiggle(x,y,z) + logfreq3(x,y,z),stride(x,y,z),stride2(x,y,z,a,b,c),vdisplace(x,y), + swiggle(x,y,z),cwiggle(x,y,z) ------------------------------------------------------------------------- */ int Variable::math_function(char *word, char *contents, Tree **tree, @@ -3318,9 +3347,9 @@ int Variable::math_function(char *word, char *contents, Tree **tree, strcmp(word,"floor") && strcmp(word,"round") && strcmp(word,"ramp") && strcmp(word,"stagger") && strcmp(word,"logfreq") && strcmp(word,"logfreq2") && - strcmp(word,"stride") && strcmp(word,"stride2") && - strcmp(word,"vdisplace") && strcmp(word,"swiggle") && - strcmp(word,"cwiggle")) + strcmp(word,"logfreq3") && strcmp(word,"stride") && + strcmp(word,"stride2") && strcmp(word,"vdisplace") && + strcmp(word,"swiggle") && strcmp(word,"cwiggle")) return 0; // parse contents for comma-separated args @@ -3580,6 +3609,37 @@ int Variable::math_function(char *word, char *contents, Tree **tree, argstack[nargstack++] = ceil(value); } + } else if (strcmp(word,"logfreq3") == 0) { + if (narg != 3) + print_var_error(FLERR,"Invalid math function in variable formula",ivar); + if (tree) newtree->type = LOGFREQ3; + else { + int ivalue1 = static_cast (value1); + int ivalue2 = static_cast (value2); + int ivalue3 = static_cast (values[0]); + if (ivalue1 <= 0 || ivalue2 <= 1 || ivalue3 <= 0 || + ivalue3-ivalue1+1 < ivalue2 ) + print_var_error(FLERR,"Invalid math function in variable formula",ivar); + double value; + if (update->ntimestep < ivalue1) value = ivalue1; + //else if (update->ntimestep <= ivalue3){ + else { + value = ivalue1; + double logsp = ivalue1; + double factor = pow(((double)ivalue3)/ivalue1, 1.0/(ivalue2-1)); + int linsp = ivalue1; + while (update->ntimestep >= value) { + logsp *= factor; + linsp++; + if (linsp > logsp) value = linsp; + else value = ceil(logsp)-(((int)ceil(logsp)-1)/ivalue3); + } + } + if (update->ntimestep > ivalue3) + error->all(FLERR,"Calls to variable exceeded limit"); + argstack[nargstack++] = value; + } + } else if (strcmp(word,"stride") == 0) { if (narg != 3) print_var_error(FLERR,"Invalid math function in variable formula",ivar); From 35be1724e39ffe2877fae7ddee67bbabe17e4214 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 28 May 2019 15:31:03 -0600 Subject: [PATCH 48/90] Commit JT 052819 - corrected examples in examples/SPIN/dipole_spin - modified warning message in src/SPIN/pair_spin_dipole_*.cpp --- examples/SPIN/dipole_spin/in.spin.iron_dipole_cut | 2 +- examples/SPIN/dipole_spin/in.spin.iron_dipole_ewald | 2 +- examples/SPIN/dipole_spin/in.spin.iron_dipole_pppm | 5 +---- src/SPIN/pair_spin_dipole_cut.cpp | 7 ++++--- src/SPIN/pair_spin_dipole_long.cpp | 7 ++++--- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/examples/SPIN/dipole_spin/in.spin.iron_dipole_cut b/examples/SPIN/dipole_spin/in.spin.iron_dipole_cut index 55bda10b3e..a409fe0563 100644 --- a/examples/SPIN/dipole_spin/in.spin.iron_dipole_cut +++ b/examples/SPIN/dipole_spin/in.spin.iron_dipole_cut @@ -54,6 +54,6 @@ thermo_style custom step time v_magx v_magy v_magz v_magnorm v_tmag v_emag pe thermo 50 compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] +dump 1 all custom 100 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] run 2000 diff --git a/examples/SPIN/dipole_spin/in.spin.iron_dipole_ewald b/examples/SPIN/dipole_spin/in.spin.iron_dipole_ewald index 75e202d61c..58b44b55fe 100644 --- a/examples/SPIN/dipole_spin/in.spin.iron_dipole_ewald +++ b/examples/SPIN/dipole_spin/in.spin.iron_dipole_ewald @@ -56,6 +56,6 @@ thermo_style custom step time v_magx v_magy v_magz v_magnorm v_tmag v_emag pe thermo 50 compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] +dump 1 all custom 100 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] run 2000 diff --git a/examples/SPIN/dipole_spin/in.spin.iron_dipole_pppm b/examples/SPIN/dipole_spin/in.spin.iron_dipole_pppm index ea88b518f3..28d7e4a4bc 100644 --- a/examples/SPIN/dipole_spin/in.spin.iron_dipole_pppm +++ b/examples/SPIN/dipole_spin/in.spin.iron_dipole_pppm @@ -57,9 +57,6 @@ thermo_style custom step time v_magx v_magy v_magz v_magnorm v_tmag v_emag pe thermo 50 compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] +dump 1 all custom 100 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] run 2000 -# min_style spin -# min_modify alpha_damp 1.0 discrete_factor 10 -# minimize 1.0e-16 1.0e-16 10000 10000 diff --git a/src/SPIN/pair_spin_dipole_cut.cpp b/src/SPIN/pair_spin_dipole_cut.cpp index 405657ccbf..4ff198488a 100644 --- a/src/SPIN/pair_spin_dipole_cut.cpp +++ b/src/SPIN/pair_spin_dipole_cut.cpp @@ -152,15 +152,16 @@ void PairSpinDipoleCut::init_style() neighbor->requests[irequest]->half = 0; neighbor->requests[irequest]->full = 1; - // checking if nve/spin is a listed fix + // checking if nve/spin or neb/spin are a listed fix int ifix = 0; while (ifix < modify->nfix) { if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + if (strcmp(modify->fix[ifix]->style,"neb/spin") == 0) break; ifix++; } - if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); + if ((ifix == modify->nfix) && (comm->me == 0)) + error->warning(FLERR,"Using pair/spin style without nve/spin or neb/spin"); // get the lattice_flag from nve/spin diff --git a/src/SPIN/pair_spin_dipole_long.cpp b/src/SPIN/pair_spin_dipole_long.cpp index bf9bdeb91b..e3575a6a07 100644 --- a/src/SPIN/pair_spin_dipole_long.cpp +++ b/src/SPIN/pair_spin_dipole_long.cpp @@ -154,15 +154,16 @@ void PairSpinDipoleLong::init_style() neighbor->requests[irequest]->half = 0; neighbor->requests[irequest]->full = 1; - // checking if nve/spin is a listed fix + // checking if nve/spin or neb/spin are a listed fix int ifix = 0; while (ifix < modify->nfix) { if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + if (strcmp(modify->fix[ifix]->style,"neb/spin") == 0) break; ifix++; } - if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); + if ((ifix == modify->nfix) && (comm->me == 0)) + error->warning(FLERR,"Using pair/spin style without nve/spin or neb/spin"); // get the lattice_flag from nve/spin From 76900b83252c35d4a55acd87def9b8d280b15f50 Mon Sep 17 00:00:00 2001 From: Adrian Diaz Date: Fri, 31 May 2019 11:53:58 -0600 Subject: [PATCH 49/90] avoids the possibility of undefined behavior with memcpy having the same source and destination arrays; this is not every instance of this issue in the source code --- src/math_extra.cpp | 4 ++-- src/rcb.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/math_extra.cpp b/src/math_extra.cpp index 0bba2ad401..f7e5bb646b 100644 --- a/src/math_extra.cpp +++ b/src/math_extra.cpp @@ -56,7 +56,7 @@ int mldivide3(const double m[3][3], const double *v, double *ans) if (fabs(aug[j][i]) > fabs(aug[i][i])) { double tempv[4]; memcpy(tempv,aug[i],4*sizeof(double)); - memcpy(aug[i],aug[j],4*sizeof(double)); + memmove(aug[i],aug[j],4*sizeof(double)); memcpy(aug[j],tempv,4*sizeof(double)); } } @@ -68,7 +68,7 @@ int mldivide3(const double m[3][3], const double *v, double *ans) if (p != i) { double tempv[4]; memcpy(tempv,aug[i],4*sizeof(double)); - memcpy(aug[i],aug[p],4*sizeof(double)); + memmove(aug[i],aug[p],4*sizeof(double)); memcpy(aug[p],tempv,4*sizeof(double)); } diff --git a/src/rcb.cpp b/src/rcb.cpp index 630cef309a..83cdccdf80 100644 --- a/src/rcb.cpp +++ b/src/rcb.cpp @@ -537,7 +537,7 @@ void RCB::compute(int dimension, int n, double **x, double *wt, if (dotmark[i] == markactive) memcpy(&buf[outgoing++],&dots[i],sizeof(Dot)); else - memcpy(&dots[keep++],&dots[i],sizeof(Dot)); + memmove(&dots[keep++],&dots[i],sizeof(Dot)); } // post receives for dots @@ -1029,7 +1029,7 @@ void RCB::compute_old(int dimension, int n, double **x, double *wt, if (dotmark[i] == markactive) memcpy(&buf[outgoing++],&dots[i],sizeof(Dot)); else - memcpy(&dots[keep++],&dots[i],sizeof(Dot)); + memmove(&dots[keep++],&dots[i],sizeof(Dot)); } // post receives for dots From 960a975e2a6c2125215b4945bc7abb1163a29e91 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Mon, 3 Jun 2019 19:50:40 -0600 Subject: [PATCH 50/90] Added compact arrays, removed unused openmp stuff --- src/SNAP/compute_sna_atom.cpp | 63 +-- src/SNAP/compute_sna_atom.h | 3 +- src/SNAP/compute_snad_atom.cpp | 101 ++--- src/SNAP/compute_snad_atom.h | 3 +- src/SNAP/compute_snav_atom.cpp | 112 ++--- src/SNAP/compute_snav_atom.h | 3 +- src/SNAP/openmp_snap.h | 16 - src/SNAP/pair_snap.cpp | 783 +-------------------------------- src/SNAP/pair_snap.h | 56 +-- src/SNAP/sna.cpp | 748 ++++++++----------------------- src/SNAP/sna.h | 58 +-- 11 files changed, 332 insertions(+), 1614 deletions(-) delete mode 100644 src/SNAP/openmp_snap.h diff --git a/src/SNAP/compute_sna_atom.cpp b/src/SNAP/compute_sna_atom.cpp index 5ca63a7e85..17774143d5 100644 --- a/src/SNAP/compute_sna_atom.cpp +++ b/src/SNAP/compute_sna_atom.cpp @@ -25,7 +25,6 @@ #include "comm.h" #include "memory.h" #include "error.h" -#include "openmp_snap.h" using namespace LAMMPS_NS; @@ -115,20 +114,10 @@ ComputeSNAAtom::ComputeSNAAtom(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal compute sna/atom command"); } - nthreads = comm->nthreads; - snaptr = new SNA*[nthreads]; -#if defined(_OPENMP) -#pragma omp parallel default(none) shared(lmp,rfac0,twojmax,rmin0,switchflag,bzeroflag) -#endif - { - int tid = omp_get_thread_num(); + snaptr = new SNA(lmp,rfac0,twojmax,diagonalstyle, + rmin0,switchflag,bzeroflag); - // always unset use_shared_arrays since it does not work with computes - snaptr[tid] = new SNA(lmp,rfac0,twojmax,diagonalstyle, - 0 /*use_shared_arrays*/, rmin0,switchflag,bzeroflag); - } - - ncoeff = snaptr[0]->ncoeff; + ncoeff = snaptr->ncoeff; size_peratom_cols = ncoeff; if (quadraticflag) size_peratom_cols += (ncoeff*(ncoeff+1))/2; peratom_flag = 1; @@ -136,7 +125,6 @@ ComputeSNAAtom::ComputeSNAAtom(LAMMPS *lmp, int narg, char **arg) : nmax = 0; njmax = 0; sna = NULL; - } /* ---------------------------------------------------------------------- */ @@ -147,9 +135,7 @@ ComputeSNAAtom::~ComputeSNAAtom() memory->destroy(radelem); memory->destroy(wjelem); memory->destroy(cutsq); - for (int tid = 0; tidcompute[i]->style,"sna/atom") == 0) count++; if (count > 1 && comm->me == 0) error->warning(FLERR,"More than one compute sna/atom"); -#if defined(_OPENMP) -#pragma omp parallel default(none) -#endif - { - int tid = omp_get_thread_num(); - snaptr[tid]->init(); - } + snaptr->init(); } /* ---------------------------------------------------------------------- */ @@ -223,11 +203,7 @@ void ComputeSNAAtom::compute_peratom() double** const x = atom->x; const int* const mask = atom->mask; -#if defined(_OPENMP) -#pragma omp parallel for default(none) -#endif for (int ii = 0; ii < inum; ii++) { - const int tid = omp_get_thread_num(); const int i = ilist[ii]; if (mask[i] & groupbit) { @@ -241,7 +217,7 @@ void ComputeSNAAtom::compute_peratom() // insure rij, inside, and typej are of size jnum - snaptr[tid]->grow_rij(jnum); + snaptr->grow_rij(jnum); // rij[][3] = displacements between atom I and those neighbors // inside = indices of neighbors of I within cutoff @@ -258,26 +234,26 @@ void ComputeSNAAtom::compute_peratom() const double rsq = delx*delx + dely*dely + delz*delz; int jtype = type[j]; if (rsq < cutsq[itype][jtype] && rsq>1e-20) { - snaptr[tid]->rij[ninside][0] = delx; - snaptr[tid]->rij[ninside][1] = dely; - snaptr[tid]->rij[ninside][2] = delz; - snaptr[tid]->inside[ninside] = j; - snaptr[tid]->wj[ninside] = wjelem[jtype]; - snaptr[tid]->rcutij[ninside] = (radi+radelem[jtype])*rcutfac; + snaptr->rij[ninside][0] = delx; + snaptr->rij[ninside][1] = dely; + snaptr->rij[ninside][2] = delz; + snaptr->inside[ninside] = j; + snaptr->wj[ninside] = wjelem[jtype]; + snaptr->rcutij[ninside] = (radi+radelem[jtype])*rcutfac; ninside++; } } - snaptr[tid]->compute_ui(ninside); - snaptr[tid]->compute_zi(); - snaptr[tid]->compute_bi(); - snaptr[tid]->copy_bi2bvec(); + snaptr->compute_ui(ninside); + snaptr->compute_zi(); + snaptr->compute_bi(); + snaptr->copy_bi2bvec(); for (int icoeff = 0; icoeff < ncoeff; icoeff++) - sna[i][icoeff] = snaptr[tid]->bvec[icoeff]; + sna[i][icoeff] = snaptr->bvec[icoeff]; if (quadraticflag) { int ncount = ncoeff; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bi = snaptr[tid]->bvec[icoeff]; + double bi = snaptr->bvec[icoeff]; // diagonal element of quadratic matrix @@ -286,7 +262,7 @@ void ComputeSNAAtom::compute_peratom() // upper-triangular elements of quadratic matrix for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) - sna[i][ncount++] = bi*snaptr[tid]->bvec[jcoeff]; + sna[i][ncount++] = bi*snaptr->bvec[jcoeff]; } } } else { @@ -305,7 +281,6 @@ double ComputeSNAAtom::memory_usage() double bytes = nmax*size_peratom_cols * sizeof(double); bytes += 3*njmax*sizeof(double); bytes += njmax*sizeof(int); - bytes += snaptr[0]->memory_usage()*comm->nthreads; return bytes; } diff --git a/src/SNAP/compute_sna_atom.h b/src/SNAP/compute_sna_atom.h index 2f6fb18996..56ffccfa7e 100644 --- a/src/SNAP/compute_sna_atom.h +++ b/src/SNAP/compute_sna_atom.h @@ -42,10 +42,9 @@ class ComputeSNAAtom : public Compute { double rcutfac; double *radelem; double *wjelem; - class SNA** snaptr; + class SNA* snaptr; double cutmax; int quadraticflag; - int nthreads; }; } diff --git a/src/SNAP/compute_snad_atom.cpp b/src/SNAP/compute_snad_atom.cpp index b0395d5317..b356d61d3d 100644 --- a/src/SNAP/compute_snad_atom.cpp +++ b/src/SNAP/compute_snad_atom.cpp @@ -25,7 +25,6 @@ #include "comm.h" #include "memory.h" #include "error.h" -#include "openmp_snap.h" using namespace LAMMPS_NS; @@ -113,20 +112,10 @@ ComputeSNADAtom::ComputeSNADAtom(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal compute snad/atom command"); } - nthreads = comm->nthreads; - snaptr = new SNA*[nthreads]; -#if defined(_OPENMP) -#pragma omp parallel default(none) shared(lmp,rfac0,twojmax,rmin0,switchflag,bzeroflag) -#endif - { - int tid = omp_get_thread_num(); + snaptr = new SNA(lmp,rfac0,twojmax,diagonalstyle, + rmin0,switchflag,bzeroflag); - // always unset use_shared_arrays since it does not work with computes - snaptr[tid] = new SNA(lmp,rfac0,twojmax,diagonalstyle, - 0 /*use_shared_arrays*/, rmin0,switchflag,bzeroflag); - } - - ncoeff = snaptr[0]->ncoeff; + ncoeff = snaptr->ncoeff; nperdim = ncoeff; if (quadraticflag) nperdim += (ncoeff*(ncoeff+1))/2; yoffset = nperdim; @@ -138,7 +127,6 @@ ComputeSNADAtom::ComputeSNADAtom(LAMMPS *lmp, int narg, char **arg) : nmax = 0; njmax = 0; snad = NULL; - } /* ---------------------------------------------------------------------- */ @@ -149,9 +137,7 @@ ComputeSNADAtom::~ComputeSNADAtom() memory->destroy(radelem); memory->destroy(wjelem); memory->destroy(cutsq); - for (int tid = 0; tidcompute[i]->style,"snad/atom") == 0) count++; if (count > 1 && comm->me == 0) error->warning(FLERR,"More than one compute snad/atom"); -#if defined(_OPENMP) -#pragma omp parallel default(none) -#endif - { - int tid = omp_get_thread_num(); - snaptr[tid]->init(); - } + snaptr->init(); } /* ---------------------------------------------------------------------- */ @@ -235,11 +215,7 @@ void ComputeSNADAtom::compute_peratom() double** const x = atom->x; const int* const mask = atom->mask; -#if defined(_OPENMP) -#pragma omp parallel for default(none) -#endif for (int ii = 0; ii < inum; ii++) { - const int tid = omp_get_thread_num(); const int i = ilist[ii]; if (mask[i] & groupbit) { @@ -258,7 +234,7 @@ void ComputeSNADAtom::compute_peratom() // insure rij, inside, and typej are of size jnum - snaptr[tid]->grow_rij(jnum); + snaptr->grow_rij(jnum); // rij[][3] = displacements between atom I and those neighbors // inside = indices of neighbors of I within cutoff @@ -276,30 +252,30 @@ void ComputeSNADAtom::compute_peratom() const double rsq = delx*delx + dely*dely + delz*delz; int jtype = type[j]; if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { - snaptr[tid]->rij[ninside][0] = delx; - snaptr[tid]->rij[ninside][1] = dely; - snaptr[tid]->rij[ninside][2] = delz; - snaptr[tid]->inside[ninside] = j; - snaptr[tid]->wj[ninside] = wjelem[jtype]; - snaptr[tid]->rcutij[ninside] = (radi+radelem[jtype])*rcutfac; + snaptr->rij[ninside][0] = delx; + snaptr->rij[ninside][1] = dely; + snaptr->rij[ninside][2] = delz; + snaptr->inside[ninside] = j; + snaptr->wj[ninside] = wjelem[jtype]; + snaptr->rcutij[ninside] = (radi+radelem[jtype])*rcutfac; ninside++; } } - snaptr[tid]->compute_ui(ninside); - snaptr[tid]->compute_zi(); + snaptr->compute_ui(ninside); + snaptr->compute_zi(); if (quadraticflag) { - snaptr[tid]->compute_bi(); - snaptr[tid]->copy_bi2bvec(); + snaptr->compute_bi(); + snaptr->copy_bi2bvec(); } for (int jj = 0; jj < ninside; jj++) { - const int j = snaptr[tid]->inside[jj]; - snaptr[tid]->compute_duidrj(snaptr[tid]->rij[jj], - snaptr[tid]->wj[jj], - snaptr[tid]->rcutij[jj]); - snaptr[tid]->compute_dbidrj(); - snaptr[tid]->copy_dbi2dbvec(); + const int j = snaptr->inside[jj]; + snaptr->compute_duidrj(snaptr->rij[jj], + snaptr->wj[jj], + snaptr->rcutij[jj]); + snaptr->compute_dbidrj(); + snaptr->copy_dbi2dbvec(); // Accumulate -dBi/dRi, -dBi/dRj @@ -307,12 +283,12 @@ void ComputeSNADAtom::compute_peratom() double *snadj = snad[j]+typeoffset; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - snadi[icoeff] += snaptr[tid]->dbvec[icoeff][0]; - snadi[icoeff+yoffset] += snaptr[tid]->dbvec[icoeff][1]; - snadi[icoeff+zoffset] += snaptr[tid]->dbvec[icoeff][2]; - snadj[icoeff] -= snaptr[tid]->dbvec[icoeff][0]; - snadj[icoeff+yoffset] -= snaptr[tid]->dbvec[icoeff][1]; - snadj[icoeff+zoffset] -= snaptr[tid]->dbvec[icoeff][2]; + snadi[icoeff] += snaptr->dbvec[icoeff][0]; + snadi[icoeff+yoffset] += snaptr->dbvec[icoeff][1]; + snadi[icoeff+zoffset] += snaptr->dbvec[icoeff][2]; + snadj[icoeff] -= snaptr->dbvec[icoeff][0]; + snadj[icoeff+yoffset] -= snaptr->dbvec[icoeff][1]; + snadj[icoeff+zoffset] -= snaptr->dbvec[icoeff][2]; } if (quadraticflag) { @@ -321,10 +297,10 @@ void ComputeSNADAtom::compute_peratom() snadj += quadraticoffset; int ncount = 0; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bi = snaptr[tid]->bvec[icoeff]; - double bix = snaptr[tid]->dbvec[icoeff][0]; - double biy = snaptr[tid]->dbvec[icoeff][1]; - double biz = snaptr[tid]->dbvec[icoeff][2]; + double bi = snaptr->bvec[icoeff]; + double bix = snaptr->dbvec[icoeff][0]; + double biy = snaptr->dbvec[icoeff][1]; + double biz = snaptr->dbvec[icoeff][2]; // diagonal elements of quadratic matrix @@ -343,12 +319,12 @@ void ComputeSNADAtom::compute_peratom() // upper-triangular elements of quadratic matrix for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - double dbxtmp = bi*snaptr[tid]->dbvec[jcoeff][0] - + bix*snaptr[tid]->bvec[jcoeff]; - double dbytmp = bi*snaptr[tid]->dbvec[jcoeff][1] - + biy*snaptr[tid]->bvec[jcoeff]; - double dbztmp = bi*snaptr[tid]->dbvec[jcoeff][2] - + biz*snaptr[tid]->bvec[jcoeff]; + double dbxtmp = bi*snaptr->dbvec[jcoeff][0] + + bix*snaptr->bvec[jcoeff]; + double dbytmp = bi*snaptr->dbvec[jcoeff][1] + + biy*snaptr->bvec[jcoeff]; + double dbztmp = bi*snaptr->dbvec[jcoeff][2] + + biz*snaptr->bvec[jcoeff]; snadi[ncount] += dbxtmp; snadi[ncount+yoffset] += dbytmp; @@ -408,6 +384,5 @@ double ComputeSNADAtom::memory_usage() bytes += 3*njmax*sizeof(double); bytes += njmax*sizeof(int); bytes += 3*nperdim*atom->ntypes; - bytes += snaptr[0]->memory_usage()*comm->nthreads; return bytes; } diff --git a/src/SNAP/compute_snad_atom.h b/src/SNAP/compute_snad_atom.h index 92003a9bc5..1fcf540d7c 100644 --- a/src/SNAP/compute_snad_atom.h +++ b/src/SNAP/compute_snad_atom.h @@ -44,10 +44,9 @@ class ComputeSNADAtom : public Compute { double rcutfac; double *radelem; double *wjelem; - class SNA** snaptr; + class SNA* snaptr; double cutmax; int quadraticflag; - int nthreads; }; } diff --git a/src/SNAP/compute_snav_atom.cpp b/src/SNAP/compute_snav_atom.cpp index b2d555f713..9f9ef7a67d 100644 --- a/src/SNAP/compute_snav_atom.cpp +++ b/src/SNAP/compute_snav_atom.cpp @@ -25,7 +25,6 @@ #include "comm.h" #include "memory.h" #include "error.h" -#include "openmp_snap.h" using namespace LAMMPS_NS; @@ -109,20 +108,10 @@ ComputeSNAVAtom::ComputeSNAVAtom(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal compute snav/atom command"); } - nthreads = comm->nthreads; - snaptr = new SNA*[nthreads]; -#if defined(_OPENMP) -#pragma omp parallel default(none) shared(lmp,rfac0,twojmax,rmin0,switchflag,bzeroflag) -#endif - { - int tid = omp_get_thread_num(); + snaptr = new SNA(lmp,rfac0,twojmax,diagonalstyle, + rmin0,switchflag,bzeroflag); - // always unset use_shared_arrays since it does not work with computes - snaptr[tid] = new SNA(lmp,rfac0,twojmax,diagonalstyle, - 0 /*use_shared_arrays*/, rmin0,switchflag,bzeroflag); - } - - ncoeff = snaptr[0]->ncoeff; + ncoeff = snaptr->ncoeff; nperdim = ncoeff; if (quadraticflag) nperdim += (ncoeff*(ncoeff+1))/2; size_peratom_cols = 6*nperdim*atom->ntypes; @@ -144,9 +133,7 @@ ComputeSNAVAtom::~ComputeSNAVAtom() memory->destroy(wjelem); memory->destroy(cutsq); - for (int tid = 0; tidcompute[i]->style,"snav/atom") == 0) count++; if (count > 1 && comm->me == 0) error->warning(FLERR,"More than one compute snav/atom"); -#if defined(_OPENMP) -#pragma omp parallel default(none) -#endif - { - int tid = omp_get_thread_num(); - snaptr[tid]->init(); - } + snaptr->init(); } /* ---------------------------------------------------------------------- */ @@ -230,11 +211,7 @@ void ComputeSNAVAtom::compute_peratom() double** const x = atom->x; const int* const mask = atom->mask; -#if defined(_OPENMP) -#pragma omp parallel for default(none) -#endif for (int ii = 0; ii < inum; ii++) { - const int tid = omp_get_thread_num(); const int i = ilist[ii]; if (mask[i] & groupbit) { @@ -251,7 +228,7 @@ void ComputeSNAVAtom::compute_peratom() // insure rij, inside, and typej are of size jnum - snaptr[tid]->grow_rij(jnum); + snaptr->grow_rij(jnum); // rij[][3] = displacements between atom I and those neighbors // inside = indices of neighbors of I within cutoff @@ -269,31 +246,31 @@ void ComputeSNAVAtom::compute_peratom() const double rsq = delx*delx + dely*dely + delz*delz; int jtype = type[j]; if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { - snaptr[tid]->rij[ninside][0] = delx; - snaptr[tid]->rij[ninside][1] = dely; - snaptr[tid]->rij[ninside][2] = delz; - snaptr[tid]->inside[ninside] = j; - snaptr[tid]->wj[ninside] = wjelem[jtype]; - snaptr[tid]->rcutij[ninside] = (radi+radelem[jtype])*rcutfac; + snaptr->rij[ninside][0] = delx; + snaptr->rij[ninside][1] = dely; + snaptr->rij[ninside][2] = delz; + snaptr->inside[ninside] = j; + snaptr->wj[ninside] = wjelem[jtype]; + snaptr->rcutij[ninside] = (radi+radelem[jtype])*rcutfac; ninside++; } } - snaptr[tid]->compute_ui(ninside); - snaptr[tid]->compute_zi(); + snaptr->compute_ui(ninside); + snaptr->compute_zi(); if (quadraticflag) { - snaptr[tid]->compute_bi(); - snaptr[tid]->copy_bi2bvec(); + snaptr->compute_bi(); + snaptr->copy_bi2bvec(); } for (int jj = 0; jj < ninside; jj++) { - const int j = snaptr[tid]->inside[jj]; + const int j = snaptr->inside[jj]; - snaptr[tid]->compute_duidrj(snaptr[tid]->rij[jj], - snaptr[tid]->wj[jj], - snaptr[tid]->rcutij[jj]); - snaptr[tid]->compute_dbidrj(); - snaptr[tid]->copy_dbi2dbvec(); + snaptr->compute_duidrj(snaptr->rij[jj], + snaptr->wj[jj], + snaptr->rcutij[jj]); + snaptr->compute_dbidrj(); + snaptr->copy_dbi2dbvec(); // Accumulate -dBi/dRi*Ri, -dBi/dRj*Rj @@ -301,18 +278,18 @@ void ComputeSNAVAtom::compute_peratom() double *snavj = snav[j]+typeoffset; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - snavi[icoeff] += snaptr[tid]->dbvec[icoeff][0]*xtmp; - snavi[icoeff+nperdim] += snaptr[tid]->dbvec[icoeff][1]*ytmp; - snavi[icoeff+2*nperdim] += snaptr[tid]->dbvec[icoeff][2]*ztmp; - snavi[icoeff+3*nperdim] += snaptr[tid]->dbvec[icoeff][1]*ztmp; - snavi[icoeff+4*nperdim] += snaptr[tid]->dbvec[icoeff][0]*ztmp; - snavi[icoeff+5*nperdim] += snaptr[tid]->dbvec[icoeff][0]*ytmp; - snavj[icoeff] -= snaptr[tid]->dbvec[icoeff][0]*x[j][0]; - snavj[icoeff+nperdim] -= snaptr[tid]->dbvec[icoeff][1]*x[j][1]; - snavj[icoeff+2*nperdim] -= snaptr[tid]->dbvec[icoeff][2]*x[j][2]; - snavj[icoeff+3*nperdim] -= snaptr[tid]->dbvec[icoeff][1]*x[j][2]; - snavj[icoeff+4*nperdim] -= snaptr[tid]->dbvec[icoeff][0]*x[j][2]; - snavj[icoeff+5*nperdim] -= snaptr[tid]->dbvec[icoeff][0]*x[j][1]; + snavi[icoeff] += snaptr->dbvec[icoeff][0]*xtmp; + snavi[icoeff+nperdim] += snaptr->dbvec[icoeff][1]*ytmp; + snavi[icoeff+2*nperdim] += snaptr->dbvec[icoeff][2]*ztmp; + snavi[icoeff+3*nperdim] += snaptr->dbvec[icoeff][1]*ztmp; + snavi[icoeff+4*nperdim] += snaptr->dbvec[icoeff][0]*ztmp; + snavi[icoeff+5*nperdim] += snaptr->dbvec[icoeff][0]*ytmp; + snavj[icoeff] -= snaptr->dbvec[icoeff][0]*x[j][0]; + snavj[icoeff+nperdim] -= snaptr->dbvec[icoeff][1]*x[j][1]; + snavj[icoeff+2*nperdim] -= snaptr->dbvec[icoeff][2]*x[j][2]; + snavj[icoeff+3*nperdim] -= snaptr->dbvec[icoeff][1]*x[j][2]; + snavj[icoeff+4*nperdim] -= snaptr->dbvec[icoeff][0]*x[j][2]; + snavj[icoeff+5*nperdim] -= snaptr->dbvec[icoeff][0]*x[j][1]; } if (quadraticflag) { @@ -321,10 +298,10 @@ void ComputeSNAVAtom::compute_peratom() snavj += quadraticoffset; int ncount = 0; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bi = snaptr[tid]->bvec[icoeff]; - double bix = snaptr[tid]->dbvec[icoeff][0]; - double biy = snaptr[tid]->dbvec[icoeff][1]; - double biz = snaptr[tid]->dbvec[icoeff][2]; + double bi = snaptr->bvec[icoeff]; + double bix = snaptr->dbvec[icoeff][0]; + double biy = snaptr->dbvec[icoeff][1]; + double biz = snaptr->dbvec[icoeff][2]; // diagonal element of quadratic matrix @@ -348,12 +325,12 @@ void ComputeSNAVAtom::compute_peratom() // upper-triangular elements of quadratic matrix for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - double dbxtmp = bi*snaptr[tid]->dbvec[jcoeff][0] - + bix*snaptr[tid]->bvec[jcoeff]; - double dbytmp = bi*snaptr[tid]->dbvec[jcoeff][1] - + biy*snaptr[tid]->bvec[jcoeff]; - double dbztmp = bi*snaptr[tid]->dbvec[jcoeff][2] - + biz*snaptr[tid]->bvec[jcoeff]; + double dbxtmp = bi*snaptr->dbvec[jcoeff][0] + + bix*snaptr->bvec[jcoeff]; + double dbytmp = bi*snaptr->dbvec[jcoeff][1] + + biy*snaptr->bvec[jcoeff]; + double dbztmp = bi*snaptr->dbvec[jcoeff][2] + + biz*snaptr->bvec[jcoeff]; snavi[ncount] += dbxtmp*xtmp; snavi[ncount+nperdim] += dbytmp*ytmp; snavi[ncount+2*nperdim] += dbztmp*ztmp; @@ -419,6 +396,5 @@ double ComputeSNAVAtom::memory_usage() bytes += njmax*sizeof(int); bytes += 6*nperdim*atom->ntypes; if (quadraticflag) bytes += 6*nperdim*atom->ntypes; - bytes += snaptr[0]->memory_usage()*comm->nthreads; return bytes; } diff --git a/src/SNAP/compute_snav_atom.h b/src/SNAP/compute_snav_atom.h index 9be5e1d389..6bcce346e0 100644 --- a/src/SNAP/compute_snav_atom.h +++ b/src/SNAP/compute_snav_atom.h @@ -44,9 +44,8 @@ class ComputeSNAVAtom : public Compute { double rcutfac; double *radelem; double *wjelem; - class SNA** snaptr; + class SNA* snaptr; int quadraticflag; - int nthreads; }; } diff --git a/src/SNAP/openmp_snap.h b/src/SNAP/openmp_snap.h deleted file mode 100644 index 60a3138c9c..0000000000 --- a/src/SNAP/openmp_snap.h +++ /dev/null @@ -1,16 +0,0 @@ - -#ifndef LMP_OPENMP_SNAP_H -#define LMP_OPENMP_SNAP_H - -#if defined(_OPENMP) -#include -#else -enum omp_sched_t {omp_sched_static, omp_sched_dynamic, omp_sched_guided, omp_sched_auto}; -inline int omp_get_thread_num() { return 0;} -inline int omp_set_num_threads(int num_threads) {return 1;} -/* inline int __sync_fetch_and_add(int* ptr, int value) {int tmp = *ptr; ptr[0]+=value; return tmp;} */ -inline void omp_set_schedule(omp_sched_t schedule,int modifier=1) {} -inline int omp_in_parallel() {return 0;} -#endif - -#endif diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 86e709ba03..ae542e81b4 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -23,7 +23,6 @@ #include "neigh_list.h" #include "neigh_request.h" #include "sna.h" -#include "openmp_snap.h" #include "domain.h" #include "memory.h" #include "error.h" @@ -55,51 +54,6 @@ PairSNAP::PairSNAP(LAMMPS *lmp) : Pair(lmp) coeffelem = NULL; nmax = 0; - nthreads = 1; - - schedule_user = 0; - schedule_time_guided = -1; - schedule_time_dynamic = -1; - ncalls_neigh =-1; - - ilistmask_max = 0; - ilistmask = NULL; - ghostinum = 0; - ghostilist_max = 0; - ghostilist = NULL; - ghostnumneigh_max = 0; - ghostnumneigh = NULL; - ghostneighs = NULL; - ghostfirstneigh = NULL; - ghostneighs_total = 0; - ghostneighs_max = 0; - - i_max = 0; - i_neighmax = 0; - i_numpairs = 0; - i_rij = NULL; - i_inside = NULL; - i_wj = NULL; - i_rcutij = NULL; - i_ninside = NULL; - i_pairs = NULL; - i_uarraytot_r = NULL; - i_uarraytot_i = NULL; - i_zarray_r = NULL; - i_zarray_i = NULL; - - use_shared_arrays = 0; - -#ifdef TIMING_INFO - timers[0] = 0; - timers[1] = 0; - timers[2] = 0; - timers[3] = 0; -#endif - - // Need to set this because restart not handled by PairHybrid - - sna = NULL; beta_max = 0; beta = NULL; @@ -123,35 +77,7 @@ PairSNAP::~PairSNAP() memory->destroy(beta); memory->destroy(bispectrum); - // Need to set this because restart not handled by PairHybrid - - if (sna) { - -#ifdef TIMING_INFO - double time[5]; - double timeave[5]; - double timeave_mpi[5]; - double timemax_mpi[5]; - - for (int i = 0; i < 5; i++) { - time[i] = 0; - timeave[i] = 0; - for (int tid = 0; tidtimers[i]>time[i]) - time[i] = sna[tid]->timers[i]; - timeave[i] += sna[tid]->timers[i]; - } - timeave[i] /= nthreads; - } - MPI_Reduce(timeave, timeave_mpi, 5, MPI_DOUBLE, MPI_SUM, 0, world); - MPI_Reduce(time, timemax_mpi, 5, MPI_DOUBLE, MPI_MAX, 0, world); -#endif - - for (int tid = 0; tiddestroy(setflag); @@ -161,22 +87,11 @@ PairSNAP::~PairSNAP() } -void PairSNAP::compute(int eflag, int vflag) -{ -// if (use_optimized) -// compute_optimized(eflag, vflag); -// else - -// hard-code compute_regular() - - compute_regular(eflag, vflag); -} - /* ---------------------------------------------------------------------- This version is a straightforward implementation ---------------------------------------------------------------------- */ -void PairSNAP::compute_regular(int eflag, int vflag) +void PairSNAP::compute(int eflag, int vflag) { int i,j,jnum,ninside; double delx,dely,delz,evdwl,rsq; @@ -191,7 +106,6 @@ void PairSNAP::compute_regular(int eflag, int vflag) int *type = atom->type; int nlocal = atom->nlocal; int newton_pair = force->newton_pair; - class SNA* snaptr = sna[0]; if (beta_max < list->inum) { memory->grow(beta,list->inum,ncoeff,"PairSNAP:beta"); @@ -315,573 +229,6 @@ void PairSNAP::compute_regular(int eflag, int vflag) if (vflag_fdotr) virial_fdotr_compute(); } -inline int PairSNAP::equal(double* x,double* y) -{ - double dist2 = - (x[0]-y[0])*(x[0]-y[0]) + - (x[1]-y[1])*(x[1]-y[1]) + - (x[2]-y[2])*(x[2]-y[2]); - if (dist2 < 1e-20) return 1; - return 0; -} - -inline double PairSNAP::dist2(double* x,double* y) -{ - return - (x[0]-y[0])*(x[0]-y[0]) + - (x[1]-y[1])*(x[1]-y[1]) + - (x[2]-y[2])*(x[2]-y[2]); -} - -// return extra communication cutoff -// extra_cutoff = max(subdomain_length) - -double PairSNAP::extra_cutoff() -{ - double sublo[3],subhi[3]; - - if (domain->triclinic == 0) { - for (int dim = 0 ; dim < 3 ; dim++) { - sublo[dim] = domain->sublo[dim]; - subhi[dim] = domain->subhi[dim]; - } - } else { - domain->lamda2x(domain->sublo_lamda,sublo); - domain->lamda2x(domain->subhi_lamda,subhi); - } - - double sub_size[3]; - for (int dim = 0; dim < 3; dim++) - sub_size[dim] = subhi[dim] - sublo[dim]; - - double max_sub_size = 0; - for (int dim = 0; dim < 3; dim++) - max_sub_size = MAX(max_sub_size,sub_size[dim]); - - // note: for triclinic, probably need something different - // see Comm::setup() - - return max_sub_size; -} - -// micro load_balancer: each MPI process will -// check with each of its 26 neighbors, -// whether an imbalance exists in the number -// of atoms to calculate forces for. -// If it does it will set ilistmask of one of -// its local atoms to zero, and send its Tag -// to the neighbor process. The neighboring process -// will check its ghost list for the -// ghost atom with the same Tag which is closest -// to its domain center, and build a -// neighborlist for this ghost atom. For this to work, -// the communication cutoff has to be -// as large as the neighbor cutoff + -// maximum subdomain length. - -// Note that at most one atom is exchanged per processor pair. - -// Also note that the local atom assignment -// doesn't change. This load balancer will cause -// some ghost atoms to have full neighborlists -// which are unique to PairSNAP. -// They are not part of the generally accessible neighborlist. -// At the same time corresponding local atoms on -// other MPI processes will not be -// included in the force computation since -// their ilistmask is 0. This does not effect -// any other classes which might -// access the same general neighborlist. -// Reverse communication (newton on) of forces is required. - -// Currently the load balancer does two passes, -// since its exchanging atoms upstream and downstream. - -void PairSNAP::load_balance() -{ - double sublo[3],subhi[3]; - if (domain->triclinic == 0) { - double* sublotmp = domain->sublo; - double* subhitmp = domain->subhi; - for (int dim = 0 ; dim<3 ; dim++) { - sublo[dim]=sublotmp[dim]; - subhi[dim]=subhitmp[dim]; - } - } else { - double* sublotmp = domain->sublo_lamda; - double* subhitmp = domain->subhi_lamda; - domain->lamda2x(sublotmp,sublo); - domain->lamda2x(subhitmp,subhi); - } - - //if (list->inum==0) list->grow(atom->nmax); - - int nlocal = ghostinum; - for (int i=0; i < list->inum; i++) - if (ilistmask[i]) nlocal++; - int ***grid2proc = comm->grid2proc; - int* procgrid = comm->procgrid; - - int nlocal_up,nlocal_down; - MPI_Request request; - - double sub_mid[3]; - for (int dim=0; dim<3; dim++) - sub_mid[dim] = (subhi[dim] + sublo[dim])/2; - - if (comm->cutghostuser < - neighbor->cutneighmax+extra_cutoff()) - error->all(FLERR,"Communication cutoff too small for SNAP micro load balancing"); - - int nrecv = ghostinum; - int totalsend = 0; - int nsend = 0; - int depth = 1; - - for (int dx = -depth; dx < depth+1; dx++) - for (int dy = -depth; dy < depth+1; dy++) - for (int dz = -depth; dz < depth+1; dz++) { - - if (dx == dy && dy == dz && dz == 0) continue; - - int sendloc[3] = {comm->myloc[0], - comm->myloc[1], comm->myloc[2] - }; - sendloc[0] += dx; - sendloc[1] += dy; - sendloc[2] += dz; - for (int dim = 0; dim < 3; dim++) - if (sendloc[dim] >= procgrid[dim]) - sendloc[dim] = sendloc[dim] - procgrid[dim]; - for (int dim = 0; dim < 3; dim++) - if (sendloc[dim] < 0) - sendloc[dim] = procgrid[dim] + sendloc[dim]; - int recvloc[3] = {comm->myloc[0], - comm->myloc[1], comm->myloc[2] - }; - recvloc[0] -= dx; - recvloc[1] -= dy; - recvloc[2] -= dz; - for (int dim = 0; dim < 3; dim++) - if (recvloc[dim] < 0) - recvloc[dim] = procgrid[dim] + recvloc[dim]; - for (int dim = 0; dim < 3; dim++) - if (recvloc[dim] >= procgrid[dim]) - recvloc[dim] = recvloc[dim] - procgrid[dim]; - - int sendproc = grid2proc[sendloc[0]][sendloc[1]][sendloc[2]]; - int recvproc = grid2proc[recvloc[0]][recvloc[1]][recvloc[2]]; - - // two stage process, first upstream movement, then downstream - - MPI_Sendrecv(&nlocal,1,MPI_INT,sendproc,0, - &nlocal_up,1,MPI_INT,recvproc,0,world,MPI_STATUS_IGNORE); - MPI_Sendrecv(&nlocal,1,MPI_INT,recvproc,0, - &nlocal_down,1,MPI_INT,sendproc,0,world,MPI_STATUS_IGNORE); - nsend = 0; - - // send upstream - - if (nlocal > nlocal_up+1) { - - int i = totalsend++; - while(i < list->inum && ilistmask[i] == 0) - i = totalsend++; - - if (i < list->inum) - MPI_Isend(&atom->tag[i],1,MPI_INT,recvproc,0,world,&request); - else { - int j = -1; - MPI_Isend(&j,1,MPI_INT,recvproc,0,world,&request); - } - - if (i < list->inum) { - for (int j = 0; j < list->inum; j++) - if (list->ilist[j] == i) - ilistmask[j] = 0; - nsend = 1; - } - } - - // recv downstream - - if (nlocal < nlocal_down-1) { - nlocal++; - int get_tag = -1; - MPI_Recv(&get_tag,1,MPI_INT,sendproc,0,world,MPI_STATUS_IGNORE); - - // if get_tag -1 the other process didnt have local atoms to send - - if (get_tag >= 0) { - if (ghostinum >= ghostilist_max) { - memory->grow(ghostilist,ghostinum+10, - "PairSnap::ghostilist"); - ghostilist_max = ghostinum+10; - } - if (atom->nlocal + atom->nghost >= ghostnumneigh_max) { - ghostnumneigh_max = atom->nlocal+atom->nghost+100; - memory->grow(ghostnumneigh,ghostnumneigh_max, - "PairSnap::ghostnumneigh"); - memory->grow(ghostfirstneigh,ghostnumneigh_max, - "PairSnap::ghostfirstneigh"); - } - - // find closest ghost image of the transfered particle - - double mindist = 1e200; - int closestghost = -1; - for (int j = 0; j < atom->nlocal + atom->nghost; j++) - if (atom->tag[j] == get_tag) - if (dist2(sub_mid, atom->x[j]) < mindist) { - closestghost = j; - mindist = dist2(sub_mid, atom->x[j]); - } - - // build neighborlist for this particular - // ghost atom, and add it to list->ilist - - if (ghostneighs_max - ghostneighs_total < - neighbor->oneatom) { - memory->grow(ghostneighs, - ghostneighs_total + neighbor->oneatom, - "PairSnap::ghostneighs"); - ghostneighs_max = ghostneighs_total + neighbor->oneatom; - } - - int j = closestghost; - - ghostilist[ghostinum] = j; - ghostnumneigh[j] = 0; - ghostfirstneigh[j] = ghostneighs_total; - - ghostinum++; - int* jlist = ghostneighs + ghostfirstneigh[j]; - - // find all neighbors by looping - // over all local and ghost atoms - - for (int k = 0; k < atom->nlocal + atom->nghost; k++) - if (dist2(atom->x[j],atom->x[k]) < - neighbor->cutneighmax*neighbor->cutneighmax) { - jlist[ghostnumneigh[j]] = k; - ghostnumneigh[j]++; - ghostneighs_total++; - } - } - - if (get_tag >= 0) nrecv++; - } - - // decrease nlocal later, so that it is the - // initial number both for receiving and sending - - if (nsend) nlocal--; - - // second pass through the grid - - MPI_Sendrecv(&nlocal,1,MPI_INT,sendproc,0, - &nlocal_up,1,MPI_INT,recvproc,0,world,MPI_STATUS_IGNORE); - MPI_Sendrecv(&nlocal,1,MPI_INT,recvproc,0, - &nlocal_down,1,MPI_INT,sendproc,0,world,MPI_STATUS_IGNORE); - - // send downstream - - nsend=0; - if (nlocal > nlocal_down+1) { - int i = totalsend++; - while(i < list->inum && ilistmask[i]==0) i = totalsend++; - - if (i < list->inum) - MPI_Isend(&atom->tag[i],1,MPI_INT,sendproc,0,world,&request); - else { - int j =- 1; - MPI_Isend(&j,1,MPI_INT,sendproc,0,world,&request); - } - - if (i < list->inum) { - for (int j=0; jinum; j++) - if (list->ilist[j] == i) ilistmask[j] = 0; - nsend = 1; - } - } - - // receive upstream - - if (nlocal < nlocal_up-1) { - nlocal++; - int get_tag = -1; - - MPI_Recv(&get_tag,1,MPI_INT,recvproc,0,world,MPI_STATUS_IGNORE); - - if (get_tag >= 0) { - if (ghostinum >= ghostilist_max) { - memory->grow(ghostilist,ghostinum+10, - "PairSnap::ghostilist"); - ghostilist_max = ghostinum+10; - } - if (atom->nlocal + atom->nghost >= ghostnumneigh_max) { - ghostnumneigh_max = atom->nlocal + atom->nghost + 100; - memory->grow(ghostnumneigh,ghostnumneigh_max, - "PairSnap::ghostnumneigh"); - memory->grow(ghostfirstneigh,ghostnumneigh_max, - "PairSnap::ghostfirstneigh"); - } - - // find closest ghost image of the transfered particle - - double mindist = 1e200; - int closestghost = -1; - for (int j = 0; j < atom->nlocal + atom->nghost; j++) - if (atom->tag[j] == get_tag) - if (dist2(sub_mid,atom->x[j])x[j]); - } - - // build neighborlist for this particular ghost atom - - if (ghostneighs_max-ghostneighs_total < neighbor->oneatom) { - memory->grow(ghostneighs,ghostneighs_total + neighbor->oneatom, - "PairSnap::ghostneighs"); - ghostneighs_max = ghostneighs_total + neighbor->oneatom; - } - - int j = closestghost; - - ghostilist[ghostinum] = j; - ghostnumneigh[j] = 0; - ghostfirstneigh[j] = ghostneighs_total; - - ghostinum++; - int* jlist = ghostneighs + ghostfirstneigh[j]; - - for (int k = 0; k < atom->nlocal + atom->nghost; k++) - if (dist2(atom->x[j],atom->x[k]) < - neighbor->cutneighmax*neighbor->cutneighmax) { - jlist[ghostnumneigh[j]] = k; - ghostnumneigh[j]++; - ghostneighs_total++; - } - } - - if (get_tag >= 0) nrecv++; - } - if (nsend) nlocal--; - } -} - -void PairSNAP::set_sna_to_shared(int snaid,int i) -{ - sna[snaid]->rij = i_rij[i]; - sna[snaid]->inside = i_inside[i]; - sna[snaid]->wj = i_wj[i]; - sna[snaid]->rcutij = i_rcutij[i]; - sna[snaid]->zarray_r = i_zarray_r[i]; - sna[snaid]->zarray_i = i_zarray_i[i]; - sna[snaid]->uarraytot_r = i_uarraytot_r[i]; - sna[snaid]->uarraytot_i = i_uarraytot_i[i]; -} - -void PairSNAP::build_per_atom_arrays() -{ - -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&starttime); -#endif - - int count = 0; - int neighmax = 0; - for (int ii = 0; ii < list->inum; ii++) - if ((do_load_balance <= 0) || ilistmask[ii]) { - neighmax=MAX(neighmax,list->numneigh[list->ilist[ii]]); - ++count; - } - for (int ii = 0; ii < ghostinum; ii++) { - neighmax=MAX(neighmax,ghostnumneigh[ghostilist[ii]]); - ++count; - } - - if (i_max < count || i_neighmax < neighmax) { - int i_maxt = MAX(count,i_max); - i_neighmax = MAX(neighmax,i_neighmax); - memory->destroy(i_rij); - memory->destroy(i_inside); - memory->destroy(i_wj); - memory->destroy(i_rcutij); - memory->destroy(i_ninside); - memory->destroy(i_pairs); - memory->create(i_rij,i_maxt,i_neighmax,3,"PairSNAP::i_rij"); - memory->create(i_inside,i_maxt,i_neighmax,"PairSNAP::i_inside"); - memory->create(i_wj,i_maxt,i_neighmax,"PairSNAP::i_wj"); - memory->create(i_rcutij,i_maxt,i_neighmax,"PairSNAP::i_rcutij"); - memory->create(i_ninside,i_maxt,"PairSNAP::i_ninside"); - memory->create(i_pairs,i_maxt*i_neighmax,4,"PairSNAP::i_pairs"); - } - - if (i_max < count) { - int jdim = sna[0]->twojmax+1; - memory->destroy(i_uarraytot_r); - memory->destroy(i_uarraytot_i); - memory->create(i_uarraytot_r,count,jdim,jdim,jdim, - "PairSNAP::i_uarraytot_r"); - memory->create(i_uarraytot_i,count,jdim,jdim,jdim, - "PairSNAP::i_uarraytot_i"); - if (i_zarray_r != NULL) - for (int i = 0; i < i_max; i++) { - memory->destroy(i_zarray_r[i]); - memory->destroy(i_zarray_i[i]); - } - - delete [] i_zarray_r; - delete [] i_zarray_i; - i_zarray_r = new double*****[count]; - i_zarray_i = new double*****[count]; - for (int i = 0; i < count; i++) { - memory->create(i_zarray_r[i],jdim,jdim,jdim,jdim,jdim, - "PairSNAP::i_zarray_r"); - memory->create(i_zarray_i[i],jdim,jdim,jdim,jdim,jdim, - "PairSNAP::i_zarray_i"); - } - } - - if (i_max < count) - i_max = count; - - count = 0; - i_numpairs = 0; - for (int ii = 0; ii < list->inum; ii++) { - if ((do_load_balance <= 0) || ilistmask[ii]) { - int i = list->ilist[ii]; - int jnum = list->numneigh[i]; - int* jlist = list->firstneigh[i]; - const double xtmp = atom->x[i][0]; - const double ytmp = atom->x[i][1]; - const double ztmp = atom->x[i][2]; - const int itype = atom->type[i]; - const int ielem = map[itype]; - const double radi = radelem[ielem]; - int ninside = 0; - for (int jj = 0; jj < jnum; jj++) { - int j = jlist[jj]; - j &= NEIGHMASK; - const double delx = atom->x[j][0] - xtmp; - const double dely = atom->x[j][1] - ytmp; - const double delz = atom->x[j][2] - ztmp; - const double rsq = delx*delx + dely*dely + delz*delz; - int jtype = atom->type[j]; - int jelem = map[jtype]; - - i_pairs[i_numpairs][0] = i; - i_pairs[i_numpairs][1] = jj; - i_pairs[i_numpairs][2] = -1; - i_pairs[i_numpairs][3] = count; - if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { - i_rij[count][ninside][0] = delx; - i_rij[count][ninside][1] = dely; - i_rij[count][ninside][2] = delz; - i_inside[count][ninside] = j; - i_wj[count][ninside] = wjelem[jelem]; - i_rcutij[count][ninside] = (radi + radelem[jelem])*rcutfac; - - // update index list with inside index - i_pairs[i_numpairs][2] = ninside++; - } - i_numpairs++; - } - i_ninside[count] = ninside; - count++; - } - } - - for (int ii = 0; ii < ghostinum; ii++) { - int i = ghostilist[ii]; - int jnum = ghostnumneigh[i]; - int* jlist = ghostneighs+ghostfirstneigh[i]; - const double xtmp = atom->x[i][0]; - const double ytmp = atom->x[i][1]; - const double ztmp = atom->x[i][2]; - const int itype = atom->type[i]; - const int ielem = map[itype]; - const double radi = radelem[ielem]; - int ninside = 0; - - for (int jj = 0; jj < jnum; jj++) { - int j = jlist[jj]; - j &= NEIGHMASK; - const double delx = atom->x[j][0] - xtmp; - const double dely = atom->x[j][1] - ytmp; - const double delz = atom->x[j][2] - ztmp; - const double rsq = delx*delx + dely*dely + delz*delz; - int jtype = atom->type[j]; - int jelem = map[jtype]; - - i_pairs[i_numpairs][0] = i; - i_pairs[i_numpairs][1] = jj; - i_pairs[i_numpairs][2] = -1; - i_pairs[i_numpairs][3] = count; - if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { - i_rij[count][ninside][0] = delx; - i_rij[count][ninside][1] = dely; - i_rij[count][ninside][2] = delz; - i_inside[count][ninside] = j; - i_wj[count][ninside] = wjelem[jelem]; - i_rcutij[count][ninside] = (radi + radelem[jelem])*rcutfac; - // update index list with inside index - i_pairs[i_numpairs][2] = ninside++; - } - i_numpairs++; - } - i_ninside[count] = ninside; - count++; - } -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&endtime); - timers[0]+=(endtime.tv_sec-starttime.tv_sec+1.0* - (endtime.tv_nsec-starttime.tv_nsec)/1000000000); -#endif -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&starttime); -#endif - -#if defined(_OPENMP) -#pragma omp parallel for shared(count) default(none) -#endif - for (int ii=0; ii < count; ii++) { - int tid = omp_get_thread_num(); - set_sna_to_shared(tid,ii); - //sna[tid]->compute_ui(i_ninside[ii]); -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&starttime); -#endif - sna[tid]->compute_ui_omp(i_ninside[ii],MAX(int(nthreads/count),1)); -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&endtime); - sna[tid]->timers[0]+=(endtime.tv_sec-starttime.tv_sec+1.0* - (endtime.tv_nsec-starttime.tv_nsec)/1000000000); -#endif - } - -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&starttime); -#endif - for (int ii=0; ii < count; ii++) { - int tid = 0;//omp_get_thread_num(); - set_sna_to_shared(tid,ii); - sna[tid]->compute_zi_omp(MAX(int(nthreads/count),1)); - } -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&endtime); - sna[0]->timers[1]+=(endtime.tv_sec-starttime.tv_sec+1.0* - (endtime.tv_nsec-starttime.tv_nsec)/1000000000); -#endif - -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&endtime); - timers[1]+=(endtime.tv_sec-starttime.tv_sec+1.0* - (endtime.tv_nsec-starttime.tv_nsec)/1000000000); -#endif -} - /* ---------------------------------------------------------------------- compute beta ------------------------------------------------------------------------- */ @@ -914,7 +261,6 @@ void PairSNAP::compute_bispectrum() double **x = atom->x; int *type = atom->type; - class SNA* snaptr = sna[0]; for (int ii = 0; ii < list->inum; ii++) { i = list->ilist[ii]; @@ -991,96 +337,8 @@ void PairSNAP::allocate() void PairSNAP::settings(int narg, char **arg) { - - // set default values for optional arguments - - nthreads = -1; - use_shared_arrays=-1; - do_load_balance = 0; - use_optimized = 1; - - // optional arguments - - for (int i=0; i < narg; i++) { - if (i+2>narg) error->all(FLERR,"Illegal pair_style command"); - if (strcmp(arg[i],"nthreads")==0) { - nthreads=force->inumeric(FLERR,arg[++i]); -#if defined(LMP_USER_OMP) - error->all(FLERR,"Must set number of threads via package omp command"); -#else - omp_set_num_threads(nthreads); - comm->nthreads=nthreads; -#endif - continue; - } - if (strcmp(arg[i],"optimized")==0) { - use_optimized=force->inumeric(FLERR,arg[++i]); - continue; - } - if (strcmp(arg[i],"shared")==0) { - use_shared_arrays=force->inumeric(FLERR,arg[++i]); - continue; - } - if (strcmp(arg[i],"loadbalance")==0) { - do_load_balance = force->inumeric(FLERR,arg[++i]); - if (do_load_balance) { - double mincutoff = extra_cutoff() + - rcutmax + neighbor->skin; - if (comm->cutghostuser < mincutoff) { - char buffer[255]; - - //apparently mincutoff is 0 after sprintf command ????? - - double tmp = mincutoff + 0.1; - sprintf(buffer, "Communication cutoff is too small " - "for SNAP micro load balancing, increased to %lf", - mincutoff+0.1); - if (comm->me==0) - error->warning(FLERR,buffer); - - comm->cutghostuser = tmp; - - } - } - continue; - } - if (strcmp(arg[i],"schedule")==0) { - i++; - if (strcmp(arg[i],"static")==0) - schedule_user = 1; - if (strcmp(arg[i],"dynamic")==0) - schedule_user = 2; - if (strcmp(arg[i],"guided")==0) - schedule_user = 3; - if (strcmp(arg[i],"auto")==0) - schedule_user = 4; - if (strcmp(arg[i],"determine")==0) - schedule_user = 5; - if (schedule_user == 0) - error->all(FLERR,"Illegal pair_style command"); - continue; - } + for (int i=0; i < narg; i++) error->all(FLERR,"Illegal pair_style command"); - } - - if (nthreads < 0) - nthreads = comm->nthreads; - - if (use_shared_arrays < 0) { - if (nthreads > 1 && atom->nlocal <= 2*nthreads) - use_shared_arrays = 1; - else use_shared_arrays = 0; - } - - // check if running non-optimized code with - // optimization flags set - - if (!use_optimized) - if (nthreads > 1 || - use_shared_arrays || - do_load_balance || - schedule_user) - error->all(FLERR,"Illegal pair_style command"); } /* ---------------------------------------------------------------------- @@ -1170,26 +428,14 @@ void PairSNAP::coeff(int narg, char **arg) if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); - sna = new SNA*[nthreads]; + snaptr = new SNA(lmp,rfac0,twojmax, + diagonalstyle, + rmin0,switchflag,bzeroflag); + snaptr->grow_rij(nmax); - // allocate memory for per OpenMP thread data which - // is wrapped into the sna class - -#if defined(_OPENMP) -#pragma omp parallel default(none) -#endif - { - int tid = omp_get_thread_num(); - sna[tid] = new SNA(lmp,rfac0,twojmax, - diagonalstyle,use_shared_arrays, - rmin0,switchflag,bzeroflag); - if (!use_shared_arrays) - sna[tid]->grow_rij(nmax); - } - - if (ncoeff != sna[0]->ncoeff) { + if (ncoeff != snaptr->ncoeff) { if (comm->me == 0) - printf("ncoeff = %d snancoeff = %d \n",ncoeff,sna[0]->ncoeff); + printf("ncoeff = %d snancoeff = %d \n",ncoeff,snaptr->ncoeff); error->all(FLERR,"Incorrect SNAP parameter file"); } @@ -1216,13 +462,7 @@ void PairSNAP::init_style() neighbor->requests[irequest]->half = 0; neighbor->requests[irequest]->full = 1; -#if defined(_OPENMP) -#pragma omp parallel default(none) -#endif - { - int tid = omp_get_thread_num(); - sna[tid]->init(); - } + snaptr->init(); } @@ -1370,6 +610,8 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) } } + if (comm->me == 0) fclose(fpcoeff); + // set flags for required keywords rcutfacflag = 0; @@ -1471,7 +713,6 @@ double PairSNAP::memory_usage() bytes += nmax*sizeof(int); bytes += (2*ncoeffall)*sizeof(double); bytes += (ncoeff*3)*sizeof(double); - bytes += sna[0]->memory_usage()*nthreads; return bytes; } diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h index 1453076b23..b5871c1527 100644 --- a/src/SNAP/pair_snap.h +++ b/src/SNAP/pair_snap.h @@ -29,8 +29,6 @@ public: PairSNAP(class LAMMPS *); ~PairSNAP(); virtual void compute(int, int); - void compute_regular(int, int); - void compute_optimized(int, int); void settings(int, char **); virtual void coeff(int, char **); virtual void init_style(); @@ -43,59 +41,16 @@ public: protected: int ncoeffq, ncoeffall; double **bvec, ***dbvec; - class SNA** sna; + class SNA* snaptr; int nmax; - int nthreads; virtual void allocate(); void read_files(char *, char *); inline int equal(double* x,double* y); inline double dist2(double* x,double* y); - double extra_cutoff(); - void load_balance(); - void set_sna_to_shared(int snaid,int i); - void build_per_atom_arrays(); void compute_beta(); void compute_bispectrum(); - int schedule_user; - double schedule_time_guided; - double schedule_time_dynamic; - - int ncalls_neigh; - int do_load_balance; - int ilistmask_max; - int* ilistmask; - int ghostinum; - int ghostilist_max; - int* ghostilist; - int ghostnumneigh_max; - int* ghostnumneigh; - int* ghostneighs; - int* ghostfirstneigh; - int ghostneighs_total; - int ghostneighs_max; - - int use_optimized; - int use_shared_arrays; - - int i_max; - int i_neighmax; - int i_numpairs; - int **i_pairs; - double ***i_rij; - int **i_inside; - double **i_wj; - double **i_rcutij; - int *i_ninside; - double ****i_uarraytot_r, ****i_uarraytot_i; - double ******i_zarray_r, ******i_zarray_i; - -#ifdef TIMING_INFO - // timespec starttime, endtime; - double timers[4]; -#endif - double rcutmax; // max cutoff for all elements int nelements; // # of unique elements char **elements; // names of unique elements @@ -130,15 +85,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: Must set number of threads via package omp command - -Because you are using the USER-OMP package, set the number of threads -via its settings, not by the pair_style snap nthreads setting. - -W: Communication cutoff is too small for SNAP micro load balancing, increased to %lf - -Self-explanatory. - E: Incorrect args for pair coefficients Self-explanatory. Check the input script or data file. diff --git a/src/SNAP/sna.cpp b/src/SNAP/sna.cpp index b729e4d0d6..b388136caf 100644 --- a/src/SNAP/sna.cpp +++ b/src/SNAP/sna.cpp @@ -21,7 +21,6 @@ #include "math_extra.h" #include #include -#include "openmp_snap.h" #include "memory.h" #include "error.h" @@ -114,12 +113,11 @@ using namespace MathConst; ------------------------------------------------------------------------- */ SNA::SNA(LAMMPS* lmp, double rfac0_in, - int twojmax_in, int diagonalstyle_in, int use_shared_arrays_in, + int twojmax_in, int diagonalstyle_in, double rmin0_in, int switch_flag_in, int bzero_flag_in) : Pointers(lmp) { wself = 1.0; - use_shared_arrays = use_shared_arrays_in; rfac0 = rfac0_in; rmin0 = rmin0_in; switch_flag = switch_flag_in; @@ -141,7 +139,8 @@ SNA::SNA(LAMMPS* lmp, double rfac0_in, wj = NULL; rcutij = NULL; nmax = 0; - idxj = NULL; + idxz = NULL; + idxb= NULL; if (bzero_flag) { double www = wself*wself*wself; @@ -149,133 +148,178 @@ SNA::SNA(LAMMPS* lmp, double rfac0_in, bzero[j] = www*(j+1); } -#ifdef TIMING_INFO - timers = new double[20]; - for(int i = 0; i < 20; i++) timers[i] = 0; - print = 0; - counter = 0; -#endif - build_indexlist(); - - } /* ---------------------------------------------------------------------- */ SNA::~SNA() { - if(!use_shared_arrays) { - destroy_twojmax_arrays(); - memory->destroy(rij); - memory->destroy(inside); - memory->destroy(wj); - memory->destroy(rcutij); - memory->destroy(bvec); - memory->destroy(dbvec); - } - delete[] idxj; + destroy_twojmax_arrays(); + memory->destroy(rij); + memory->destroy(inside); + memory->destroy(wj); + memory->destroy(rcutij); + memory->destroy(bvec); + memory->destroy(dbvec); + delete[] idxz; + delete[] idxb; } void SNA::build_indexlist() { - if(diagonalstyle == 0) { - int idxj_count = 0; + if(diagonalstyle != 3) + error->all(FLERR, "diagonal_style must be 3\n"); - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) - idxj_count++; + // index list for cglist - // indexList can be changed here + int jdim = twojmax + 1; + memory->create(idxcg_block, jdim, jdim, jdim, + "sna:idxcg_block"); - idxj = new SNA_LOOPINDICES[idxj_count]; - idxj_max = idxj_count; + int idxcg_count = 0; + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + idxcg_block[j1][j2][j] = idxcg_count; + for (int m1 = 0; m1 <= j1; m1++) + for (int m2 = 0; m2 <= j2; m2++) + idxcg_count++; + } + idxcg_max = idxcg_count; - idxj_count = 0; + // index list for uarray + // need to include both halves - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { - idxj[idxj_count].j1 = j1; - idxj[idxj_count].j2 = j2; - idxj[idxj_count].j = j; - idxj_count++; + memory->create(idxu_block, jdim, + "sna:idxu_block"); + + int idxu_count = 0; + + for(int j = 0; j <= twojmax; j++) { + idxu_block[j] = idxu_count; + for(int mb = 0; mb <= j; mb++) + for(int ma = 0; ma <= j; ma++) + idxu_count++; + } + idxu_max = idxu_count; + + // index list for beta and B + + int idxb_count = 0; + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) idxb_count++; + + idxb_max = idxb_count; + idxb = new SNA_BINDICES[idxb_max]; + + idxb_count = 0; + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) { + idxb[idxb_count].j1 = j1; + idxb[idxb_count].j2 = j2; + idxb[idxb_count].j = j; + idxb_count++; } - } - if(diagonalstyle == 1) { - int idxj_count = 0; + // reverse index list for beta and b - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j = 0; j <= MIN(twojmax, 2 * j1); j += 2) { - idxj_count++; + memory->create(idxb_block, jdim, jdim, jdim, + "sna:idxb_block"); + idxb_count = 0; + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + if (j < j1) continue; + idxb_block[j1][j2][j] = idxb_count; + idxb_count++; } - // indexList can be changed here + // index list for zlist - idxj = new SNA_LOOPINDICES[idxj_count]; - idxj_max = idxj_count; + int idxz_count = 0; - idxj_count = 0; + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) + idxz_count++; + + idxz_max = idxz_count; + idxz = new SNA_ZINDICES[idxz_max]; + + memory->create(idxz_block, jdim, jdim, jdim, + "sna:idxz_block"); + + idxz_count = 0; + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + idxz_block[j1][j2][j] = idxz_count; - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j = 0; j <= MIN(twojmax, 2 * j1); j += 2) { - idxj[idxj_count].j1 = j1; - idxj[idxj_count].j2 = j1; - idxj[idxj_count].j = j; - idxj_count++; - } - } + // find right beta[jjb] entry + // multiply and divide by j+1 factors + // account for multiplicity of 1, 2, or 3 - if(diagonalstyle == 2) { - int idxj_count = 0; + // CODE HORROR!! Need to figure this out later + double betaj = 1.0; +// #ifdef USE_YDIRECT_ZLIST +// double betaj; +// if (j >= j1) { +// const int jjb = idxb_block[j1][j2][j]; +// if (j1 == j) { +// if (j2 == j) betaj = 3*beta[jjb]; +// else betaj = 2*beta[jjb]; +// } else betaj = beta[jjb]; +// } else if (j >= j2) { +// const int jjb = idxb_block[j][j2][j1]; +// if (j2 == j) betaj = 2*beta[jjb]*(j1+1)/(j+1.0); +// else betaj = beta[jjb]*(j1+1)/(j+1.0); +// } else { +// const int jjb = idxb_block[j2][j][j1]; +// betaj = beta[jjb]*(j1+1)/(j+1.0); +// } +// #else +// double betaj; +// if (j >= j1) { +// const int jjb = idxb_block[j1][j2][j]; +// betaj = beta[jjb]; +// } else if (j >= j2) { +// const int jjb = idxb_block[j][j2][j1]; +// betaj = beta[jjb]*(j1+1)/(j+1.0); +// } else { +// const int jjb = idxb_block[j2][j][j1]; +// betaj = beta[jjb]*(j1+1)/(j+1.0); +// } +// #endif - for(int j1 = 0; j1 <= twojmax; j1++) { - idxj_count++; - } + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + idxz[idxz_count].j1 = j1; + idxz[idxz_count].j2 = j2; + idxz[idxz_count].j = j; + idxz[idxz_count].ma1min = MAX(0, (2 * ma - j - j2 + j1) / 2); + idxz[idxz_count].ma2max = (2 * ma - j - (2 * idxz[idxz_count].ma1min - j1) + j2) / 2; + idxz[idxz_count].na = MIN(j1, (2 * ma - j + j2 + j1) / 2) - idxz[idxz_count].ma1min + 1; + idxz[idxz_count].mb1min = MAX(0, (2 * mb - j - j2 + j1) / 2); + idxz[idxz_count].mb2max = (2 * mb - j - (2 * idxz[idxz_count].mb1min - j1) + j2) / 2; + idxz[idxz_count].nb = MIN(j1, (2 * mb - j + j2 + j1) / 2) - idxz[idxz_count].mb1min + 1; - // indexList can be changed here + // apply to z(j1,j2,j,ma,mb) to unique element of y(j) + // find right beta[jjb] and y_list[jju] entries - idxj = new SNA_LOOPINDICES[idxj_count]; - idxj_max = idxj_count; + const int jju = idxu_block[j] + (j+1)*mb + ma; + idxz[idxz_count].jju = jju; + idxz[idxz_count].betaj = betaj; - idxj_count = 0; - - for(int j1 = 0; j1 <= twojmax; j1++) { - idxj[idxj_count].j1 = j1; - idxj[idxj_count].j2 = j1; - idxj[idxj_count].j = j1; - idxj_count++; - } - } - - if(diagonalstyle == 3) { - int idxj_count = 0; - - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) - if (j >= j1) idxj_count++; - - // indexList can be changed here - - idxj = new SNA_LOOPINDICES[idxj_count]; - idxj_max = idxj_count; - - idxj_count = 0; - - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) - if (j >= j1) { - idxj[idxj_count].j1 = j1; - idxj[idxj_count].j2 = j2; - idxj[idxj_count].j = j; - idxj_count++; + idxz_count++; } - } - + } } /* ---------------------------------------------------------------------- */ @@ -292,16 +336,14 @@ void SNA::grow_rij(int newnmax) nmax = newnmax; - if(!use_shared_arrays) { - memory->destroy(rij); - memory->destroy(inside); - memory->destroy(wj); - memory->destroy(rcutij); - memory->create(rij, nmax, 3, "pair:rij"); - memory->create(inside, nmax, "pair:inside"); - memory->create(wj, nmax, "pair:wj"); - memory->create(rcutij, nmax, "pair:rcutij"); - } + memory->destroy(rij); + memory->destroy(inside); + memory->destroy(wj); + memory->destroy(rcutij); + memory->create(rij, nmax, 3, "pair:rij"); + memory->create(inside, nmax, "pair:inside"); + memory->create(wj, nmax, "pair:wj"); + memory->create(rcutij, nmax, "pair:rcutij"); } /* ---------------------------------------------------------------------- compute Ui by summing over neighbors j @@ -320,10 +362,6 @@ void SNA::compute_ui(int jnum) zero_uarraytot(); addself_uarraytot(wself); -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &starttime); -#endif - for(int j = 0; j < jnum; j++) { x = rij[j][0]; y = rij[j][1]; @@ -339,48 +377,6 @@ void SNA::compute_ui(int jnum) add_uarraytot(r, wj[j], rcutij[j]); } -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &endtime); - timers[0] += (endtime.tv_sec - starttime.tv_sec + 1.0 * - (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); -#endif - -} - -void SNA::compute_ui_omp(int jnum, int sub_threads) -{ - double rsq, r, x, y, z, z0, theta0; - - // utot(j,ma,mb) = 0 for all j,ma,ma - // utot(j,ma,ma) = 1 for all j,ma - // for j in neighbors of i: - // compute r0 = (x,y,z,z0) - // utot(j,ma,mb) += u(r0;j,ma,mb) for all j,ma,mb - - zero_uarraytot(); - addself_uarraytot(wself); - - for(int j = 0; j < jnum; j++) { - x = rij[j][0]; - y = rij[j][1]; - z = rij[j][2]; - rsq = x * x + y * y + z * z; - r = sqrt(rsq); - theta0 = (r - rmin0) * rfac0 * MY_PI / (rcutij[j] - rmin0); - // theta0 = (r - rmin0) * rscale0; - z0 = r / tan(theta0); - omp_set_num_threads(sub_threads); - -#if defined(_OPENMP) -#pragma omp parallel shared(x,y,z,z0,r,sub_threads) default(none) -#endif - { - compute_uarray_omp(x, y, z, z0, r, sub_threads); - } - add_uarraytot(r, wj[j], rcutij[j]); - } - - } /* ---------------------------------------------------------------------- @@ -389,24 +385,6 @@ void SNA::compute_ui_omp(int jnum, int sub_threads) void SNA::compute_zi() { - // for j1 = 0,...,twojmax - // for j2 = 0,twojmax - // for j = |j1-j2|,Min(twojmax,j1+j2),2 - // for ma = 0,...,j - // for mb = 0,...,jmid - // z(j1,j2,j,ma,mb) = 0 - // for ma1 = Max(0,ma+(j1-j2-j)/2),Min(j1,ma+(j1+j2-j)/2) - // sumb1 = 0 - // ma2 = ma-ma1+(j1+j2-j)/2; - // for mb1 = Max(0,mb+(j1-j2-j)/2),Min(j1,mb+(j1+j2-j)/2) - // mb2 = mb-mb1+(j1+j2-j)/2; - // sumb1 += cg(j1,mb1,j2,mb2,j) * - // u(j1,ma1,mb1) * u(j2,ma2,mb2) - // z(j1,j2,j,ma,mb) += sumb1*cg(j1,ma1,j2,ma2,j) - -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &starttime); -#endif // compute_dbidrj() requires full j1/j2/j chunk of z elements // use zarray j1/j2 symmetry @@ -449,84 +427,13 @@ void SNA::compute_zi() } // end loop over j } // end loop over j1, j2 -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &endtime); - timers[1] += (endtime.tv_sec - starttime.tv_sec + 1.0 * - (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); -#endif -} - -void SNA::compute_zi_omp(int sub_threads) -{ - // for j1 = 0,...,twojmax - // for j2 = 0,twojmax - // for j = |j1-j2|,Min(twojmax,j1+j2),2 - // for ma = 0,...,j - // for mb = 0,...,j - // z(j1,j2,j,ma,mb) = 0 - // for ma1 = Max(0,ma+(j1-j2-j)/2),Min(j1,ma+(j1+j2-j)/2) - // sumb1 = 0 - // ma2 = ma-ma1+(j1+j2-j)/2; - // for mb1 = Max(0,mb+(j1-j2-j)/2),Min(j1,mb+(j1+j2-j)/2) - // mb2 = mb-mb1+(j1+j2-j)/2; - // sumb1 += cg(j1,mb1,j2,mb2,j) * - // u(j1,ma1,mb1) * u(j2,ma2,mb2) - // z(j1,j2,j,ma,mb) += sumb1*cg(j1,ma1,j2,ma2,j) - - if(omp_in_parallel()) - omp_set_num_threads(sub_threads); - - // compute_dbidrj() requires full j1/j2/j chunk of z elements - // use zarray j1/j2 symmetry - -#if defined(_OPENMP) -#pragma omp parallel for schedule(auto) default(none) -#endif - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { - - double sumb1_r, sumb1_i; - int ma2, mb2; - - for(int ma = 0; ma <= j; ma++) - for(int mb = 0; mb <= j; mb++) { - zarray_r[j1][j2][j][ma][mb] = 0.0; - zarray_i[j1][j2][j][ma][mb] = 0.0; - - for(int ma1 = MAX(0, (2 * ma - j - j2 + j1) / 2); - ma1 <= MIN(j1, (2 * ma - j + j2 + j1) / 2); ma1++) { - sumb1_r = 0.0; - sumb1_i = 0.0; - - ma2 = (2 * ma - j - (2 * ma1 - j1) + j2) / 2; - - for(int mb1 = MAX(0, (2 * mb - j - j2 + j1) / 2); - mb1 <= MIN(j1, (2 * mb - j + j2 + j1) / 2); mb1++) { - - mb2 = (2 * mb - j - (2 * mb1 - j1) + j2) / 2; - sumb1_r += cgarray[j1][j2][j][mb1][mb2] * - (uarraytot_r[j1][ma1][mb1] * uarraytot_r[j2][ma2][mb2] - - uarraytot_i[j1][ma1][mb1] * uarraytot_i[j2][ma2][mb2]); - sumb1_i += cgarray[j1][j2][j][mb1][mb2] * - (uarraytot_r[j1][ma1][mb1] * uarraytot_i[j2][ma2][mb2] + - uarraytot_i[j1][ma1][mb1] * uarraytot_r[j2][ma2][mb2]); - } - - zarray_r[j1][j2][j][ma][mb] += - sumb1_r * cgarray[j1][j2][j][ma1][ma2]; - zarray_i[j1][j2][j][ma][mb] += - sumb1_i * cgarray[j1][j2][j][ma1][ma2]; - } - } - } } /* ---------------------------------------------------------------------- compute Yi by summing over products of beta and Zi ------------------------------------------------------------------------- */ -void SNA::compute_yi(double* beta) +void SNA::compute_yi(const double* beta) { int j; int idxz_count; @@ -540,18 +447,18 @@ void SNA::compute_yi(double* beta) } // end loop over ma, mb } // end loop over j - for(int JJ = 0; JJ < idxj_max; JJ++) { - const int j1 = idxj[JJ].j1; - const int j2 = idxj[JJ].j2; - const int j3 = idxj[JJ].j; + for(int jjb = 0; jjb < idxb_max; jjb++) { + const int j1 = idxb[jjb].j1; + const int j2 = idxb[jjb].j2; + const int j3 = idxb[jjb].j; j = j3; jjjzarray_r = zarray_r[j1][j2][j3]; jjjzarray_i = zarray_i[j1][j2][j3]; for(int mb = 0; 2*mb <= j; mb++) for(int ma = 0; ma <= j; ma++) { - yarray_r[j][ma][mb] += beta[JJ]*jjjzarray_r[ma][mb]; - yarray_i[j][ma][mb] += beta[JJ]*jjjzarray_i[ma][mb]; + yarray_r[j][ma][mb] += beta[jjb]*jjjzarray_r[ma][mb]; + yarray_i[j][ma][mb] += beta[jjb]*jjjzarray_i[ma][mb]; } // end loop over ma, mb j = j1; @@ -560,8 +467,8 @@ void SNA::compute_yi(double* beta) double j1fac = (j3+1)/(j+1.0); for(int mb = 0; 2*mb <= j; mb++) for(int ma = 0; ma <= j; ma++) { - yarray_r[j][ma][mb] += beta[JJ]*jjjzarray_r[ma][mb]*j1fac; - yarray_i[j][ma][mb] += beta[JJ]*jjjzarray_i[ma][mb]*j1fac; + yarray_r[j][ma][mb] += beta[jjb]*jjjzarray_r[ma][mb]*j1fac; + yarray_i[j][ma][mb] += beta[jjb]*jjjzarray_i[ma][mb]*j1fac; } // end loop over ma, mb j = j2; @@ -570,8 +477,8 @@ void SNA::compute_yi(double* beta) double j2fac = (j3+1)/(j+1.0); for(int mb = 0; 2*mb <= j; mb++) for(int ma = 0; ma <= j; ma++) { - yarray_r[j][ma][mb] += beta[JJ]*jjjzarray_r[ma][mb]*j2fac; - yarray_i[j][ma][mb] += beta[JJ]*jjjzarray_i[ma][mb]*j2fac; + yarray_r[j][ma][mb] += beta[jjb]*jjjzarray_r[ma][mb]*j2fac; + yarray_i[j][ma][mb] += beta[jjb]*jjjzarray_i[ma][mb]*j2fac; } // end loop over ma, mb } // end loop over jjb @@ -655,10 +562,6 @@ void SNA::compute_bi() // b(j1,j2,j) += // 2*Conj(u(j,ma,mb))*z(j1,j2,j,ma,mb) -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &starttime); -#endif - for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) { for(int j = abs(j1 - j2); @@ -691,12 +594,6 @@ void SNA::compute_bi() } } -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &endtime); - timers[2] += (endtime.tv_sec - starttime.tv_sec + 1.0 * - (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); -#endif - } /* ---------------------------------------------------------------------- @@ -760,164 +657,8 @@ void SNA::compute_duidrj(double* rij, double wj, double rcut) z0 = r * cs / sn; dz0dr = z0 / r - (r*rscale0) * (rsq + z0 * z0) / rsq; -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &starttime); -#endif - compute_duarray(x, y, z, z0, r, dz0dr, wj, rcut); -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &endtime); - timers[3] += (endtime.tv_sec - starttime.tv_sec + 1.0 * - (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); -#endif - -} - -/* ---------------------------------------------------------------------- - calculate derivative of Bi w.r.t. atom j - variant using indexlist for j1,j2,j - variant not using symmetry relation -------------------------------------------------------------------------- */ - -void SNA::compute_dbidrj_nonsymm() -{ - // for j1 = 0,...,twojmax - // for j2 = 0,twojmax - // for j = |j1-j2|,Min(twojmax,j1+j2),2 - // dbdr(j1,j2,j) = 0 - // for ma = 0,...,j - // for mb = 0,...,j - // dzdr = 0 - // for ma1 = Max(0,ma+(j1-j2-j)/2),Min(j1,ma+(j1+j2-j)/2) - // sumb1 = 0 - // ma2 = ma-ma1+(j1+j2-j)/2; - // for mb1 = Max(0,mb+(j1-j2-j)/2),Min(j1,mb+(j1+j2-j)/2) - // mb2 = mb-mb1+(j1+j2-j)/2; - // sumb1 += cg(j1,mb1,j2,mb2,j) * - // (dudr(j1,ma1,mb1) * u(j2,ma2,mb2) + - // u(j1,ma1,mb1) * dudr(j2,ma2,mb2)) - // dzdr += sumb1*cg(j1,ma1,j2,ma2,j) - // dbdr(j1,j2,j) += - // Conj(dudr(j,ma,mb))*z(j1,j2,j,ma,mb) + - // Conj(u(j,ma,mb))*dzdr - - double* dbdr; - double* dudr_r, *dudr_i; - double sumb1_r[3], sumb1_i[3], dzdr_r[3], dzdr_i[3]; - int ma2; - -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &starttime); -#endif - - for(int JJ = 0; JJ < idxj_max; JJ++) { - const int j1 = idxj[JJ].j1; - const int j2 = idxj[JJ].j2; - const int j = idxj[JJ].j; - - dbdr = dbarray[j1][j2][j]; - dbdr[0] = 0.0; - dbdr[1] = 0.0; - dbdr[2] = 0.0; - - double** *j1duarray_r = duarray_r[j1]; - double** *j2duarray_r = duarray_r[j2]; - double** *j1duarray_i = duarray_i[j1]; - double** *j2duarray_i = duarray_i[j2]; - double** j1uarraytot_r = uarraytot_r[j1]; - double** j2uarraytot_r = uarraytot_r[j2]; - double** j1uarraytot_i = uarraytot_i[j1]; - double** j2uarraytot_i = uarraytot_i[j2]; - double** j1j2jcgarray = cgarray[j1][j2][j]; - - for(int ma = 0; ma <= j; ma++) - for(int mb = 0; mb <= j; mb++) { - dzdr_r[0] = 0.0; - dzdr_r[1] = 0.0; - dzdr_r[2] = 0.0; - dzdr_i[0] = 0.0; - dzdr_i[1] = 0.0; - dzdr_i[2] = 0.0; - - const int max_mb1 = MIN(j1, (2 * mb - j + j2 + j1) / 2) + 1; - const int max_ma1 = MIN(j1, (2 * ma - j + j2 + j1) / 2) + 1; - - for(int ma1 = MAX(0, (2 * ma - j - j2 + j1) / 2); - ma1 < max_ma1; ma1++) { - - ma2 = (2 * ma - j - (2 * ma1 - j1) + j2) / 2; - sumb1_r[0] = 0.0; - sumb1_r[1] = 0.0; - sumb1_r[2] = 0.0; - sumb1_i[0] = 0.0; - sumb1_i[1] = 0.0; - sumb1_i[2] = 0.0; - - //inside loop 54 operations (mul and add) - for(int mb1 = MAX(0, (2 * mb - j - j2 + j1) / 2), - mb2 = mb + (j1 + j2 - j) / 2 - mb1; - mb1 < max_mb1; mb1++, mb2--) { - - double* dudr1_r, *dudr1_i, *dudr2_r, *dudr2_i; - - dudr1_r = j1duarray_r[ma1][mb1]; - dudr2_r = j2duarray_r[ma2][mb2]; - dudr1_i = j1duarray_i[ma1][mb1]; - dudr2_i = j2duarray_i[ma2][mb2]; - - const double cga_mb1mb2 = j1j2jcgarray[mb1][mb2]; - const double uat_r_ma2mb2 = cga_mb1mb2 * j2uarraytot_r[ma2][mb2]; - const double uat_r_ma1mb1 = cga_mb1mb2 * j1uarraytot_r[ma1][mb1]; - const double uat_i_ma2mb2 = cga_mb1mb2 * j2uarraytot_i[ma2][mb2]; - const double uat_i_ma1mb1 = cga_mb1mb2 * j1uarraytot_i[ma1][mb1]; - - for(int k = 0; k < 3; k++) { - sumb1_r[k] += dudr1_r[k] * uat_r_ma2mb2; - sumb1_r[k] -= dudr1_i[k] * uat_i_ma2mb2; - sumb1_i[k] += dudr1_r[k] * uat_i_ma2mb2; - sumb1_i[k] += dudr1_i[k] * uat_r_ma2mb2; - - sumb1_r[k] += dudr2_r[k] * uat_r_ma1mb1; - sumb1_r[k] -= dudr2_i[k] * uat_i_ma1mb1; - sumb1_i[k] += dudr2_r[k] * uat_i_ma1mb1; - sumb1_i[k] += dudr2_i[k] * uat_r_ma1mb1; - } - } // end loop over mb1,mb2 - - // dzdr += sumb1*cg(j1,ma1,j2,ma2,j) - - dzdr_r[0] += sumb1_r[0] * j1j2jcgarray[ma1][ma2]; - dzdr_r[1] += sumb1_r[1] * j1j2jcgarray[ma1][ma2]; - dzdr_r[2] += sumb1_r[2] * j1j2jcgarray[ma1][ma2]; - dzdr_i[0] += sumb1_i[0] * j1j2jcgarray[ma1][ma2]; - dzdr_i[1] += sumb1_i[1] * j1j2jcgarray[ma1][ma2]; - dzdr_i[2] += sumb1_i[2] * j1j2jcgarray[ma1][ma2]; - } // end loop over ma1,ma2 - - // dbdr(j1,j2,j) += - // Conj(dudr(j,ma,mb))*z(j1,j2,j,ma,mb) + - // Conj(u(j,ma,mb))*dzdr - - dudr_r = duarray_r[j][ma][mb]; - dudr_i = duarray_i[j][ma][mb]; - - for(int k = 0; k < 3; k++) - dbdr[k] += - (dudr_r[k] * zarray_r[j1][j2][j][ma][mb] + - dudr_i[k] * zarray_i[j1][j2][j][ma][mb]) + - (uarraytot_r[j][ma][mb] * dzdr_r[k] + - uarraytot_i[j][ma][mb] * dzdr_i[k]); - } //end loop over ma mb - - } //end loop over j1 j2 j - -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &endtime); - timers[4] += (endtime.tv_sec - starttime.tv_sec + 1.0 * - (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); -#endif - } /* ---------------------------------------------------------------------- @@ -958,14 +699,10 @@ void SNA::compute_dbidrj() double jjjmambzarray_r; double jjjmambzarray_i; -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &starttime); -#endif - - for(int JJ = 0; JJ < idxj_max; JJ++) { - const int j1 = idxj[JJ].j1; - const int j2 = idxj[JJ].j2; - const int j = idxj[JJ].j; + for(int jjb = 0; jjb < idxb_max; jjb++) { + const int j1 = idxb[jjb].j1; + const int j2 = idxb[jjb].j2; + const int j = idxb[jjb].j; dbdr = dbarray[j1][j2][j]; dbdr[0] = 0.0; @@ -1149,12 +886,6 @@ void SNA::compute_dbidrj() } //end loop over j1 j2 j -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME, &endtime); - timers[4] += (endtime.tv_sec - starttime.tv_sec + 1.0 * - (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); -#endif - } /* ---------------------------------------------------------------------- @@ -1251,27 +982,6 @@ void SNA::add_uarraytot(double r, double wj, double rcut) } } -void SNA::add_uarraytot_omp(double r, double wj, double rcut) -{ - double sfac; - - sfac = compute_sfac(r, rcut); - - sfac *= wj; - -#if defined(_OPENMP) -#pragma omp for -#endif - for (int j = 0; j <= twojmax; j++) - for (int ma = 0; ma <= j; ma++) - for (int mb = 0; mb <= j; mb++) { - uarraytot_r[j][ma][mb] += - sfac * uarray_r[j][ma][mb]; - uarraytot_i[j][ma][mb] += - sfac * uarray_i[j][ma][mb]; - } -} - /* ---------------------------------------------------------------------- compute Wigner U-functions for one neighbor ------------------------------------------------------------------------- */ @@ -1348,88 +1058,6 @@ void SNA::compute_uarray(double x, double y, double z, } } -void SNA::compute_uarray_omp(double x, double y, double z, - double z0, double r, int /*sub_threads*/) -{ - double r0inv; - double a_r, b_r, a_i, b_i; - double rootpq; - - // compute Cayley-Klein parameters for unit quaternion - - r0inv = 1.0 / sqrt(r * r + z0 * z0); - a_r = r0inv * z0; - a_i = -r0inv * z; - b_r = r0inv * y; - b_i = -r0inv * x; - - // VMK Section 4.8.2 - - uarray_r[0][0][0] = 1.0; - uarray_i[0][0][0] = 0.0; - - for (int j = 1; j <= twojmax; j++) { -#if defined(_OPENMP) -#pragma omp for -#endif - for (int mb = 0; mb < j; mb++) { - uarray_r[j][0][mb] = 0.0; - uarray_i[j][0][mb] = 0.0; - - for (int ma = 0; ma < j; ma++) { - rootpq = rootpqarray[j - ma][j - mb]; - uarray_r[j][ma][mb] += - rootpq * - (a_r * uarray_r[j - 1][ma][mb] + - a_i * uarray_i[j - 1][ma][mb]); - uarray_i[j][ma][mb] += - rootpq * - (a_r * uarray_i[j - 1][ma][mb] - - a_i * uarray_r[j - 1][ma][mb]); - - rootpq = rootpqarray[ma + 1][j - mb]; - uarray_r[j][ma + 1][mb] = - -rootpq * - (b_r * uarray_r[j - 1][ma][mb] + - b_i * uarray_i[j - 1][ma][mb]); - uarray_i[j][ma + 1][mb] = - -rootpq * - (b_r * uarray_i[j - 1][ma][mb] - - b_i * uarray_r[j - 1][ma][mb]); - } - } - - int mb = j; - uarray_r[j][0][mb] = 0.0; - uarray_i[j][0][mb] = 0.0; - -#if defined(_OPENMP) -#pragma omp for -#endif - for (int ma = 0; ma < j; ma++) { - rootpq = rootpqarray[j - ma][mb]; - uarray_r[j][ma][mb] += - rootpq * - (b_r * uarray_r[j - 1][ma][mb - 1] - - b_i * uarray_i[j - 1][ma][mb - 1]); - uarray_i[j][ma][mb] += - rootpq * - (b_r * uarray_i[j - 1][ma][mb - 1] + - b_i * uarray_r[j - 1][ma][mb - 1]); - - rootpq = rootpqarray[ma + 1][mb]; - uarray_r[j][ma + 1][mb] = - rootpq * - (a_r * uarray_r[j - 1][ma][mb - 1] - - a_i * uarray_i[j - 1][ma][mb - 1]); - uarray_i[j][ma + 1][mb] = - rootpq * - (a_r * uarray_i[j - 1][ma][mb - 1] + - a_i * uarray_r[j - 1][ma][mb - 1]); - } - } -} - /* ---------------------------------------------------------------------- compute derivatives of Wigner U-functions for one neighbor see comments in compute_uarray() @@ -1644,20 +1272,18 @@ void SNA::create_twojmax_arrays() bzero = NULL; - if(!use_shared_arrays) { - memory->create(uarraytot_r, jdim, jdim, jdim, - "sna:uarraytot"); - memory->create(zarray_r, jdim, jdim, jdim, jdim, jdim, - "sna:zarray"); - memory->create(uarraytot_i, jdim, jdim, jdim, - "sna:uarraytot"); - memory->create(zarray_i, jdim, jdim, jdim, jdim, jdim, - "sna:zarray"); - memory->create(yarray_r, jdim, jdim, jdim, - "sna:yarray"); - memory->create(yarray_i, jdim, jdim, jdim, - "sna:yarray"); - } + memory->create(uarraytot_r, jdim, jdim, jdim, + "sna:uarraytot"); + memory->create(zarray_r, jdim, jdim, jdim, jdim, jdim, + "sna:zarray"); + memory->create(uarraytot_i, jdim, jdim, jdim, + "sna:uarraytot"); + memory->create(zarray_i, jdim, jdim, jdim, jdim, jdim, + "sna:zarray"); + memory->create(yarray_r, jdim, jdim, jdim, + "sna:yarray"); + memory->create(yarray_i, jdim, jdim, jdim, + "sna:yarray"); } @@ -1680,14 +1306,12 @@ void SNA::destroy_twojmax_arrays() if (bzero_flag) memory->destroy(bzero); - if(!use_shared_arrays) { - memory->destroy(uarraytot_r); - memory->destroy(zarray_r); - memory->destroy(uarraytot_i); - memory->destroy(zarray_i); - memory->destroy(yarray_r); - memory->destroy(yarray_i); - } + memory->destroy(uarraytot_r); + memory->destroy(zarray_r); + memory->destroy(uarraytot_i); + memory->destroy(zarray_i); + memory->destroy(yarray_r); + memory->destroy(yarray_i); } /* ---------------------------------------------------------------------- diff --git a/src/SNAP/sna.h b/src/SNAP/sna.h index 2c90da1d30..b93b0ac7b0 100644 --- a/src/SNAP/sna.h +++ b/src/SNAP/sna.h @@ -24,14 +24,19 @@ namespace LAMMPS_NS { -struct SNA_LOOPINDICES { +struct SNA_ZINDICES { + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju; + double betaj; +}; + +struct SNA_BINDICES { int j1, j2, j; }; class SNA : protected Pointers { public: - SNA(LAMMPS*, double, int, int, int, double, int, int); + SNA(LAMMPS*, double, int, int, double, int, int); SNA(LAMMPS* lmp) : Pointers(lmp) {}; ~SNA(); @@ -44,10 +49,8 @@ public: // functions for bispectrum coefficients void compute_ui(int); - void compute_ui_omp(int, int); void compute_zi(); - void compute_zi_omp(int); - void compute_yi(double*); + void compute_yi(const double*); void compute_bi(); void copy_bi2bvec(); @@ -56,20 +59,10 @@ public: void compute_duidrj(double*, double, double); void compute_dbidrj(); void compute_deidrj(double*); - void compute_dbidrj_nonsymm(); void copy_dbi2dbvec(); double compute_sfac(double, double); double compute_dsfac(double, double); -#ifdef TIMING_INFO - double* timers; - timespec starttime, endtime; - int print; - int counter; -#endif - - //per sna class instance for OMP use - double* bvec, ** dbvec; double** rij; int* inside; @@ -83,16 +76,17 @@ public: double*** uarraytot_r, *** uarraytot_i; double***** zarray_r, ***** zarray_i; double*** yarray_r, *** yarray_i; - double*** uarraytot_r_b, *** uarraytot_i_b; - double***** zarray_r_b, ***** zarray_i_b; double*** uarray_r, *** uarray_i; private: double rmin0, rfac0; - //use indexlist instead of loops, constructor generates these - SNA_LOOPINDICES* idxj; - int idxj_max; + // use indexlist instead of loops, constructor generates these + + SNA_ZINDICES* idxz; + SNA_BINDICES* idxb; + int idxcg_max, idxu_max, idxz_max, idxb_max; + // data for bispectrum coefficients double***** cgarray; @@ -104,6 +98,21 @@ private: double**** duarray_r, **** duarray_i; double**** dbarray; + double* cglist; + int*** idxcg_block; + + double* ulisttot_r, * ulisttot_i; + double* ulist_r, * ulist_i; + int* idxu_block; + + double* zlist_r, * zlist_i; + int*** idxz_block; + + int*** idxb_block; + + double** dulist_r, ** dulist_i; + double* ylist_r, * ylist_i; + static const int nmaxfactorial = 167; static const double nfac_table[]; double factorial(int); @@ -118,22 +127,13 @@ private: void zero_uarraytot(); void addself_uarraytot(double); void add_uarraytot(double, double, double); - void add_uarraytot_omp(double, double, double); void compute_uarray(double, double, double, double, double); - void compute_uarray_omp(double, double, double, - double, double, int); double deltacg(int, int, int); int compute_ncoeff(); void compute_duarray(double, double, double, double, double, double, double, double); - // if number of atoms are small use per atom arrays - // for twojmax arrays, rij, inside, bvec - // this will increase the memory footprint considerably, - // but allows parallel filling and reuse of these arrays - int use_shared_arrays; - // Sets the style for the switching function // 0 = none // 1 = cosine From 239dfe163ccbaa8bb7c46a05b86d5e86de4d0e50 Mon Sep 17 00:00:00 2001 From: "Vishnu V. Krishnan" Date: Sat, 8 Jun 2019 17:11:20 +0530 Subject: [PATCH 51/90] Simplify vim-files Resolves #1500 --- tools/vim/README.txt | 24 +++++++++++------------- tools/vim/filetype.vim | 4 ++++ 2 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 tools/vim/filetype.vim diff --git a/tools/vim/README.txt b/tools/vim/README.txt index eb040aa4cd..578ff4945e 100644 --- a/tools/vim/README.txt +++ b/tools/vim/README.txt @@ -22,24 +22,22 @@ in the syntax file (lammps.vim). You can easily add new ones. (0) Create/edit ~/.vimrc to contain: syntax on -(1) Create directories ~/.vim and ~/.vim/syntax +(1) Create directories ~/.vim/syntax and ~/.vim/ftdetect (2) Copy lammps.vim to ~/.vim/syntax/lammps.vim -(3) Create/edit ~/.vim/filetype.vim to contain - -" vim syntax highlight customizations -if exists("did_load_filetypes") - finish -endif - -augroup filetypedetect - au! BufRead,BufNewFile in.* setfiletype lammps - au! BufRead,BufNewFile *.lmp setfiletype lammps -augroup END -(4) the end +(3) Copy filetype.vim as ~/.vim/ftdetect/lammps.vim Gerolf Ziegenhain 2007 +Distribution Packaging guidelines: +================================== + +(0) Copy lammps.vim to ${VIMFILES}/syntax/lammps.vim +(1) Copy filetype.vim as ${VIMFILES}/ftdetect/lammps.vim + +${VIMFILES} is typically /usr/share/vim/vimfiles +Consult your packaging guidlines for exact location. + --------------- updated by Sam Bateman, 11/2010 diff --git a/tools/vim/filetype.vim b/tools/vim/filetype.vim new file mode 100644 index 0000000000..8bc2315144 --- /dev/null +++ b/tools/vim/filetype.vim @@ -0,0 +1,4 @@ +augroup filetypedetect + au! BufRead,BufNewFile in.* setfiletype lammps + au! BufRead,BufNewFile *.lmp setfiletype lammps +augroup END From 72b295d7f48538f310b658b63497904a0659a082 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 10 Jun 2019 18:21:17 -0400 Subject: [PATCH 52/90] add support for internal style variables to info command --- src/info.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/info.cpp b/src/info.cpp index ac2ee4a96d..25b9879408 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -67,7 +67,7 @@ namespace LAMMPS_NS { // same as in variable.cpp enum {INDEX,LOOP,WORLD,UNIVERSE,ULOOP,STRING,GETENV, - SCALARFILE,ATOMFILE,FORMAT,EQUAL,ATOM,PYTHON}; + SCALARFILE,ATOMFILE,FORMAT,EQUAL,ATOM,VECTOR,PYTHON,INTERNAL}; enum {COMPUTES=1<<0, DUMPS=1<<1, @@ -106,7 +106,7 @@ static const int STYLES = ATOM_STYLES | INTEGRATE_STYLES | MINIMIZE_STYLES static const char *varstyles[] = { "index", "loop", "world", "universe", "uloop", "string", "getenv", - "file", "atomfile", "format", "equal", "atom", "python", "(unknown)"}; + "file", "atomfile", "format", "equal", "atom", "vector", "python", "internal", "(unknown)"}; static const char *mapstyles[] = { "none", "array", "hash" }; @@ -599,6 +599,10 @@ void Info::command(int narg, char **arg) int ndata = 1; fprintf(out,"Variable[%3d]: %-10s, style = %-10s, def =", i,names[i],varstyles[style[i]]); + if (style[i] == INTERNAL) { + fprintf(out,"%g\n",input->variable->dvalue[i]); + continue; + } if ((style[i] != LOOP) && (style[i] != ULOOP)) ndata = input->variable->num[i]; for (int j=0; j < ndata; ++j) From 3e2f3a80583494420eda14e4ce178f5b71695e60 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 10 Jun 2019 18:22:04 -0400 Subject: [PATCH 53/90] avoid a case of mixing malloc()/free() with new/delete --- src/variable.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index 376cc8045a..7cbdc57d3a 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -288,11 +288,11 @@ void Variable::set(int narg, char **arg) int maxcopy = strlen(arg[2]) + 1; int maxwork = maxcopy; - char *scopy = new char[maxcopy]; - char *work = new char[maxwork]; + char *scopy = (char *) memory->smalloc(maxcopy,"var:string/copy"); + char *work = (char *) memory->smalloc(maxwork,"var:string/work"); strcpy(scopy,arg[2]); input->substitute(scopy,work,maxcopy,maxwork,1); - delete [] work; + memory->sfree(work); int ivar = find(arg[0]); if (ivar >= 0) { @@ -310,7 +310,7 @@ void Variable::set(int narg, char **arg) data[nvar] = new char*[num[nvar]]; copy(1,&scopy,data[nvar]); } - delete [] scopy; + memory->sfree(scopy); // GETENV // remove pre-existing var if also style GETENV (allows it to be reset) From 7f4c611e2148387acedb58b2f7767cf54c936b14 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jun 2019 06:51:03 -0400 Subject: [PATCH 54/90] must use C++ compiler to check for include files --- cmake/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 911b6f0f15..8ab9540482 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1135,7 +1135,7 @@ endif() if(PKG_USER-INTEL) include(CheckIncludeFile) - check_include_file(immintrin.h FOUND_IMMINTRIN) + check_include_file_cxx(immintrin.h FOUND_IMMINTRIN) if(NOT FOUND_IMMINTRIN) message(FATAL_ERROR "immintrin.h header not found, Intel package won't work without it") endif() From 3d5db63381117c65cb581920a11654a1682c4365 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jun 2019 10:36:04 -0400 Subject: [PATCH 55/90] minor cleanup --- tools/vim/README.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/vim/README.txt b/tools/vim/README.txt index 578ff4945e..29ce1822b8 100644 --- a/tools/vim/README.txt +++ b/tools/vim/README.txt @@ -7,10 +7,10 @@ end on *.lmp or start with in.* (see mysyntax.vim). By far not all commands are included in the syntax file (lammps.vim). You can easily add new ones. -=To enable the highlighting: +=To enable the highlighting (compatible with old versions of VIM): ============================ (0) Create a ~/.vimrc - You can have a look in /usr/local/share/vim/current/vimrc.example + You can have a look in /usr/share/vim/vim*/vimrc_example.vim (1) Insert in ~/.vimrc let mysyntaxfile = "~/.vim/mysyntax.vim" just before @@ -24,7 +24,7 @@ in the syntax file (lammps.vim). You can easily add new ones. syntax on (1) Create directories ~/.vim/syntax and ~/.vim/ftdetect (2) Copy lammps.vim to ~/.vim/syntax/lammps.vim -(3) Copy filetype.vim as ~/.vim/ftdetect/lammps.vim +(3) Copy filetype.vim to ~/.vim/ftdetect/lammps.vim Gerolf Ziegenhain 2007 From fd55d7d367a2063d67d082c250232d5d468fe78e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jun 2019 11:15:04 -0400 Subject: [PATCH 56/90] update list of known LAMMPS keywords --- tools/vim/lammps.vim | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tools/vim/lammps.vim b/tools/vim/lammps.vim index be26f3081e..69676ba451 100644 --- a/tools/vim/lammps.vim +++ b/tools/vim/lammps.vim @@ -2,25 +2,26 @@ " Language: Lammps Simulation Script File " Maintainer: Gerolf Ziegenhain " Updates: Axel Kohlmeyer , Sam Bateman , Daniel Möller Montull -" Latest Revision: 2012-06-19 +" Latest Revision: 2019-06-11 syn clear -syn keyword lammpsOutput log write_restart restart dump undump thermo thermo_modify thermo_style print -syn keyword lammpsRead include read read_restart read_data +syn keyword lammpsOutput log write_data write_dump info shell write_restart restart dump undump thermo thermo_modify thermo_style print timer +syn keyword lammpsRead include read_restart read_data read_dump molecule syn keyword lammpsLattice boundary units atom_style lattice region create_box create_atoms dielectric -syn keyword lammpsLattice delete_atoms change_box dimension replicate -syn keyword lammpsParticle pair_coeff pair_style pair_modify mass velocity angle_coeff angle_style -syn keyword lammpsParticle atom_modify atom_style bond_coeff bond_style delete_bonds kspace_style +syn keyword lammpsLattice delete_atoms displace_atoms change_box dimension replicate +syn keyword lammpsParticle pair_coeff pair_style pair_modify pair_write mass velocity angle_coeff angle_style +syn keyword lammpsParticle atom_modify atom_style bond_coeff bond_style bond_write create_bonds delete_bonds kspace_style syn keyword lammpsParticle kspace_modify dihedral_style dihedral_coeff improper_style improper_coeff -syn keyword lammpsSetup min_style fix_modify run_style timestep neighbor neigh_modify fix unfix -syn keyword lammpsSetup communicate newton nthreads processors reset_timestep -syn keyword lammpsRun minimize run -syn keyword lammpsDefine variable group compute +syn keyword lammpsSetup min_style fix_modify run_style timestep neighbor neigh_modify fix unfix suffix special_bonds +syn keyword lammpsSetup balance box clear comm_modify comm_style newton package processors reset_ids reset_timestep +syn keyword lammpsRun minimize run rerun tad neb prd quit server temper temper/grem temper/npt +syn keyword lammpsRun min/spin message hyper dynamical_matrix +syn keyword lammpsDefine variable group compute python set uncompute kim_query syn keyword lammpsRepeat jump next loop -syn keyword lammpsOperator equal add sub mult div +syn keyword lammpsOperator equal add sub mult div syn keyword lammpsConditional if then elif else From dbafb92dd5202571be499acbe306f50cb18ff8e2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jun 2019 14:02:41 -0400 Subject: [PATCH 57/90] cmake minor cleanup and removal of redundant code and empty lines --- cmake/CMakeLists.txt | 7 +------ cmake/Modules/Packages/USER-INTEL.cmake | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 40d3de0e7b..8f7ac9a6e7 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -33,7 +33,6 @@ include(LAMMPSUtils) get_lammps_version(${LAMMPS_SOURCE_DIR}/version.h LAMMPS_VERSION) - include(PreventInSourceBuilds) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS) @@ -51,6 +50,7 @@ check_for_autogen_files(${LAMMPS_SOURCE_DIR}) # these need ot be done early (before further tests). ##################################################################### include(CheckCCompilerFlag) +include(CheckIncludeFileCXX) if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -restrict") @@ -186,10 +186,6 @@ if(LAMMPS_EXCEPTIONS) set(LAMMPS_API_DEFINES "${LAMMPS_API_DEFINES} -DLAMMPS_EXCEPTIONS") endif() -option(CMAKE_VERBOSE_MAKEFILE "Verbose makefile" OFF) - - - # "hard" dependencies between packages resulting # in an error instead of skipping over files pkg_depends(MPIIO MPI) @@ -198,7 +194,6 @@ pkg_depends(USER-LB MPI) pkg_depends(USER-PHONON KSPACE) pkg_depends(USER-SCAFACOS MPI) -include(CheckIncludeFileCXX) find_package(OpenMP QUIET) # TODO: this is a temporary workaround until a better solution is found. AK 2019-05-30 diff --git a/cmake/Modules/Packages/USER-INTEL.cmake b/cmake/Modules/Packages/USER-INTEL.cmake index f61b8f1630..3c0cc7ba24 100644 --- a/cmake/Modules/Packages/USER-INTEL.cmake +++ b/cmake/Modules/Packages/USER-INTEL.cmake @@ -1,5 +1,4 @@ if(PKG_USER-INTEL) - include(CheckIncludeFile) check_include_file_cxx(immintrin.h FOUND_IMMINTRIN) if(NOT FOUND_IMMINTRIN) message(FATAL_ERROR "immintrin.h header not found, Intel package won't work without it") From 4fbf96a353a10f97798b607fb3aae8297a7e1626 Mon Sep 17 00:00:00 2001 From: sniblett402 Date: Tue, 11 Jun 2019 13:48:01 -0700 Subject: [PATCH 58/90] Bugfix for bond_style table with MPI Summary Very small bug fix - an incorrect MPI datatype was causing undefined behaviour for tabulated bond potentials (bond_style table). Author(s) Sam Niblett, LBNL Licensing By submitting this pull request, I agree, that my contribution will be included in LAMMPS and redistributed under either the GNU General Public License version 2 (GPL v2) or the GNU Lesser General Public License version 2.1 (LGPL v2.1). Backward Compatibility No impact Implementation Notes The equilibrium bond length of the tabulated potential (tb->r0) was incorrectly specified as an MPI_INT during a broadcast. Therefore, all non-root processes received a truncated value of this parameter. This simple fix produced the expected behaviour for me. --- src/MOLECULE/bond_table.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MOLECULE/bond_table.cpp b/src/MOLECULE/bond_table.cpp index 94e843eb65..fc71654a44 100644 --- a/src/MOLECULE/bond_table.cpp +++ b/src/MOLECULE/bond_table.cpp @@ -503,7 +503,7 @@ void BondTable::param_extract(Table *tb, char *line) void BondTable::bcast_table(Table *tb) { MPI_Bcast(&tb->ninput,1,MPI_INT,0,world); - MPI_Bcast(&tb->r0,1,MPI_INT,0,world); + MPI_Bcast(&tb->r0,1,MPI_DOUBLE,0,world); int me; MPI_Comm_rank(world,&me); From 400751f30f71b181e7ca1e38f4a3424459965911 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 11 Jun 2019 19:09:23 -0400 Subject: [PATCH 59/90] remove redundant call to broadcast r0 --- src/MOLECULE/bond_table.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MOLECULE/bond_table.cpp b/src/MOLECULE/bond_table.cpp index fc71654a44..10851774d7 100644 --- a/src/MOLECULE/bond_table.cpp +++ b/src/MOLECULE/bond_table.cpp @@ -522,7 +522,6 @@ void BondTable::bcast_table(Table *tb) MPI_Bcast(&tb->fplo,1,MPI_DOUBLE,0,world); MPI_Bcast(&tb->fphi,1,MPI_DOUBLE,0,world); } - MPI_Bcast(&tb->r0,1,MPI_INT,0,world); } /* ---------------------------------------------------------------------- From 0559e155f23330999239847396384115fc698311 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Tue, 11 Jun 2019 18:24:02 -0600 Subject: [PATCH 60/90] Implemented lists instead of multidim arrays --- src/SNAP/compute_sna_atom.cpp | 7 +- src/SNAP/compute_snad_atom.cpp | 34 +- src/SNAP/compute_snav_atom.cpp | 46 +- src/SNAP/pair_snap.cpp | 8 +- src/SNAP/sna.cpp | 1160 ++++++++++++++------------------ src/SNAP/sna.h | 25 +- 6 files changed, 566 insertions(+), 714 deletions(-) diff --git a/src/SNAP/compute_sna_atom.cpp b/src/SNAP/compute_sna_atom.cpp index 17774143d5..fea37faca0 100644 --- a/src/SNAP/compute_sna_atom.cpp +++ b/src/SNAP/compute_sna_atom.cpp @@ -247,13 +247,12 @@ void ComputeSNAAtom::compute_peratom() snaptr->compute_ui(ninside); snaptr->compute_zi(); snaptr->compute_bi(); - snaptr->copy_bi2bvec(); for (int icoeff = 0; icoeff < ncoeff; icoeff++) - sna[i][icoeff] = snaptr->bvec[icoeff]; + sna[i][icoeff] = snaptr->blist[icoeff]; if (quadraticflag) { int ncount = ncoeff; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bi = snaptr->bvec[icoeff]; + double bi = snaptr->blist[icoeff]; // diagonal element of quadratic matrix @@ -262,7 +261,7 @@ void ComputeSNAAtom::compute_peratom() // upper-triangular elements of quadratic matrix for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) - sna[i][ncount++] = bi*snaptr->bvec[jcoeff]; + sna[i][ncount++] = bi*snaptr->blist[jcoeff]; } } } else { diff --git a/src/SNAP/compute_snad_atom.cpp b/src/SNAP/compute_snad_atom.cpp index b356d61d3d..156380eccc 100644 --- a/src/SNAP/compute_snad_atom.cpp +++ b/src/SNAP/compute_snad_atom.cpp @@ -266,7 +266,6 @@ void ComputeSNADAtom::compute_peratom() snaptr->compute_zi(); if (quadraticflag) { snaptr->compute_bi(); - snaptr->copy_bi2bvec(); } for (int jj = 0; jj < ninside; jj++) { @@ -275,7 +274,6 @@ void ComputeSNADAtom::compute_peratom() snaptr->wj[jj], snaptr->rcutij[jj]); snaptr->compute_dbidrj(); - snaptr->copy_dbi2dbvec(); // Accumulate -dBi/dRi, -dBi/dRj @@ -283,12 +281,12 @@ void ComputeSNADAtom::compute_peratom() double *snadj = snad[j]+typeoffset; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - snadi[icoeff] += snaptr->dbvec[icoeff][0]; - snadi[icoeff+yoffset] += snaptr->dbvec[icoeff][1]; - snadi[icoeff+zoffset] += snaptr->dbvec[icoeff][2]; - snadj[icoeff] -= snaptr->dbvec[icoeff][0]; - snadj[icoeff+yoffset] -= snaptr->dbvec[icoeff][1]; - snadj[icoeff+zoffset] -= snaptr->dbvec[icoeff][2]; + snadi[icoeff] += snaptr->dblist[icoeff][0]; + snadi[icoeff+yoffset] += snaptr->dblist[icoeff][1]; + snadi[icoeff+zoffset] += snaptr->dblist[icoeff][2]; + snadj[icoeff] -= snaptr->dblist[icoeff][0]; + snadj[icoeff+yoffset] -= snaptr->dblist[icoeff][1]; + snadj[icoeff+zoffset] -= snaptr->dblist[icoeff][2]; } if (quadraticflag) { @@ -297,10 +295,10 @@ void ComputeSNADAtom::compute_peratom() snadj += quadraticoffset; int ncount = 0; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bi = snaptr->bvec[icoeff]; - double bix = snaptr->dbvec[icoeff][0]; - double biy = snaptr->dbvec[icoeff][1]; - double biz = snaptr->dbvec[icoeff][2]; + double bi = snaptr->blist[icoeff]; + double bix = snaptr->dblist[icoeff][0]; + double biy = snaptr->dblist[icoeff][1]; + double biz = snaptr->dblist[icoeff][2]; // diagonal elements of quadratic matrix @@ -319,12 +317,12 @@ void ComputeSNADAtom::compute_peratom() // upper-triangular elements of quadratic matrix for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - double dbxtmp = bi*snaptr->dbvec[jcoeff][0] - + bix*snaptr->bvec[jcoeff]; - double dbytmp = bi*snaptr->dbvec[jcoeff][1] - + biy*snaptr->bvec[jcoeff]; - double dbztmp = bi*snaptr->dbvec[jcoeff][2] - + biz*snaptr->bvec[jcoeff]; + double dbxtmp = bi*snaptr->dblist[jcoeff][0] + + bix*snaptr->blist[jcoeff]; + double dbytmp = bi*snaptr->dblist[jcoeff][1] + + biy*snaptr->blist[jcoeff]; + double dbztmp = bi*snaptr->dblist[jcoeff][2] + + biz*snaptr->blist[jcoeff]; snadi[ncount] += dbxtmp; snadi[ncount+yoffset] += dbytmp; diff --git a/src/SNAP/compute_snav_atom.cpp b/src/SNAP/compute_snav_atom.cpp index 9f9ef7a67d..6caff0820c 100644 --- a/src/SNAP/compute_snav_atom.cpp +++ b/src/SNAP/compute_snav_atom.cpp @@ -260,7 +260,6 @@ void ComputeSNAVAtom::compute_peratom() snaptr->compute_zi(); if (quadraticflag) { snaptr->compute_bi(); - snaptr->copy_bi2bvec(); } for (int jj = 0; jj < ninside; jj++) { @@ -270,7 +269,6 @@ void ComputeSNAVAtom::compute_peratom() snaptr->wj[jj], snaptr->rcutij[jj]); snaptr->compute_dbidrj(); - snaptr->copy_dbi2dbvec(); // Accumulate -dBi/dRi*Ri, -dBi/dRj*Rj @@ -278,18 +276,18 @@ void ComputeSNAVAtom::compute_peratom() double *snavj = snav[j]+typeoffset; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - snavi[icoeff] += snaptr->dbvec[icoeff][0]*xtmp; - snavi[icoeff+nperdim] += snaptr->dbvec[icoeff][1]*ytmp; - snavi[icoeff+2*nperdim] += snaptr->dbvec[icoeff][2]*ztmp; - snavi[icoeff+3*nperdim] += snaptr->dbvec[icoeff][1]*ztmp; - snavi[icoeff+4*nperdim] += snaptr->dbvec[icoeff][0]*ztmp; - snavi[icoeff+5*nperdim] += snaptr->dbvec[icoeff][0]*ytmp; - snavj[icoeff] -= snaptr->dbvec[icoeff][0]*x[j][0]; - snavj[icoeff+nperdim] -= snaptr->dbvec[icoeff][1]*x[j][1]; - snavj[icoeff+2*nperdim] -= snaptr->dbvec[icoeff][2]*x[j][2]; - snavj[icoeff+3*nperdim] -= snaptr->dbvec[icoeff][1]*x[j][2]; - snavj[icoeff+4*nperdim] -= snaptr->dbvec[icoeff][0]*x[j][2]; - snavj[icoeff+5*nperdim] -= snaptr->dbvec[icoeff][0]*x[j][1]; + snavi[icoeff] += snaptr->dblist[icoeff][0]*xtmp; + snavi[icoeff+nperdim] += snaptr->dblist[icoeff][1]*ytmp; + snavi[icoeff+2*nperdim] += snaptr->dblist[icoeff][2]*ztmp; + snavi[icoeff+3*nperdim] += snaptr->dblist[icoeff][1]*ztmp; + snavi[icoeff+4*nperdim] += snaptr->dblist[icoeff][0]*ztmp; + snavi[icoeff+5*nperdim] += snaptr->dblist[icoeff][0]*ytmp; + snavj[icoeff] -= snaptr->dblist[icoeff][0]*x[j][0]; + snavj[icoeff+nperdim] -= snaptr->dblist[icoeff][1]*x[j][1]; + snavj[icoeff+2*nperdim] -= snaptr->dblist[icoeff][2]*x[j][2]; + snavj[icoeff+3*nperdim] -= snaptr->dblist[icoeff][1]*x[j][2]; + snavj[icoeff+4*nperdim] -= snaptr->dblist[icoeff][0]*x[j][2]; + snavj[icoeff+5*nperdim] -= snaptr->dblist[icoeff][0]*x[j][1]; } if (quadraticflag) { @@ -298,10 +296,10 @@ void ComputeSNAVAtom::compute_peratom() snavj += quadraticoffset; int ncount = 0; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bi = snaptr->bvec[icoeff]; - double bix = snaptr->dbvec[icoeff][0]; - double biy = snaptr->dbvec[icoeff][1]; - double biz = snaptr->dbvec[icoeff][2]; + double bi = snaptr->blist[icoeff]; + double bix = snaptr->dblist[icoeff][0]; + double biy = snaptr->dblist[icoeff][1]; + double biz = snaptr->dblist[icoeff][2]; // diagonal element of quadratic matrix @@ -325,12 +323,12 @@ void ComputeSNAVAtom::compute_peratom() // upper-triangular elements of quadratic matrix for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - double dbxtmp = bi*snaptr->dbvec[jcoeff][0] - + bix*snaptr->bvec[jcoeff]; - double dbytmp = bi*snaptr->dbvec[jcoeff][1] - + biy*snaptr->bvec[jcoeff]; - double dbztmp = bi*snaptr->dbvec[jcoeff][2] - + biz*snaptr->bvec[jcoeff]; + double dbxtmp = bi*snaptr->dblist[jcoeff][0] + + bix*snaptr->blist[jcoeff]; + double dbytmp = bi*snaptr->dblist[jcoeff][1] + + biy*snaptr->blist[jcoeff]; + double dbztmp = bi*snaptr->dblist[jcoeff][2] + + biz*snaptr->blist[jcoeff]; snavi[ncount] += dbxtmp*xtmp; snavi[ncount+nperdim] += dbytmp*ytmp; snavi[ncount+2*nperdim] += dbztmp*ztmp; diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index ae542e81b4..6a65f872fd 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -166,17 +166,14 @@ void PairSNAP::compute(int eflag, int vflag) } } - // compute Ui, Zi, and Bi for atom I + // compute Ui, Yi for atom I snaptr->compute_ui(ninside); - snaptr->compute_zi(); // for neighbors of I within cutoff: // compute Fij = dEi/dRj = -dEi/dRi // add to Fi, subtract from Fj - // compute beta_i*Z_i = Y_i - snaptr->compute_yi(beta[ii]); for (int jj = 0; jj < ninside; jj++) { @@ -310,10 +307,9 @@ void PairSNAP::compute_bispectrum() snaptr->compute_ui(ninside); snaptr->compute_zi(); snaptr->compute_bi(); - snaptr->copy_bi2bvec(); for (int k = 0; k < ncoeff; k++) - bispectrum[ii][k] = snaptr->bvec[k]; + bispectrum[ii][k] = snaptr->blist[k]; } } diff --git a/src/SNAP/sna.cpp b/src/SNAP/sna.cpp index b388136caf..131ac48fdb 100644 --- a/src/SNAP/sna.cpp +++ b/src/SNAP/sna.cpp @@ -128,8 +128,6 @@ SNA::SNA(LAMMPS* lmp, double rfac0_in, ncoeff = compute_ncoeff(); - create_twojmax_arrays(); - bvec = NULL; dbvec = NULL; memory->create(bvec, ncoeff, "pair:bvec"); @@ -142,20 +140,21 @@ SNA::SNA(LAMMPS* lmp, double rfac0_in, idxz = NULL; idxb= NULL; + build_indexlist(); + create_twojmax_arrays(); + if (bzero_flag) { double www = wself*wself*wself; for(int j = 0; j <= twojmax; j++) bzero[j] = www*(j+1); } - build_indexlist(); } /* ---------------------------------------------------------------------- */ SNA::~SNA() { - destroy_twojmax_arrays(); memory->destroy(rij); memory->destroy(inside); memory->destroy(wj); @@ -164,6 +163,7 @@ SNA::~SNA() memory->destroy(dbvec); delete[] idxz; delete[] idxb; + destroy_twojmax_arrays(); } void SNA::build_indexlist() @@ -234,9 +234,10 @@ void SNA::build_indexlist() for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { - if (j < j1) continue; - idxb_block[j1][j2][j] = idxb_count; - idxb_count++; + if (j >= j1) { + idxb_block[j1][j2][j] = idxb_count; + idxb_count++; + } } // index list for zlist @@ -266,38 +267,6 @@ void SNA::build_indexlist() // multiply and divide by j+1 factors // account for multiplicity of 1, 2, or 3 - // CODE HORROR!! Need to figure this out later - double betaj = 1.0; -// #ifdef USE_YDIRECT_ZLIST -// double betaj; -// if (j >= j1) { -// const int jjb = idxb_block[j1][j2][j]; -// if (j1 == j) { -// if (j2 == j) betaj = 3*beta[jjb]; -// else betaj = 2*beta[jjb]; -// } else betaj = beta[jjb]; -// } else if (j >= j2) { -// const int jjb = idxb_block[j][j2][j1]; -// if (j2 == j) betaj = 2*beta[jjb]*(j1+1)/(j+1.0); -// else betaj = beta[jjb]*(j1+1)/(j+1.0); -// } else { -// const int jjb = idxb_block[j2][j][j1]; -// betaj = beta[jjb]*(j1+1)/(j+1.0); -// } -// #else -// double betaj; -// if (j >= j1) { -// const int jjb = idxb_block[j1][j2][j]; -// betaj = beta[jjb]; -// } else if (j >= j2) { -// const int jjb = idxb_block[j][j2][j1]; -// betaj = beta[jjb]*(j1+1)/(j+1.0); -// } else { -// const int jjb = idxb_block[j2][j][j1]; -// betaj = beta[jjb]*(j1+1)/(j+1.0); -// } -// #endif - for (int mb = 0; 2*mb <= j; mb++) for (int ma = 0; ma <= j; ma++) { idxz[idxz_count].j1 = j1; @@ -311,11 +280,9 @@ void SNA::build_indexlist() idxz[idxz_count].nb = MIN(j1, (2 * mb - j + j2 + j1) / 2) - idxz[idxz_count].mb1min + 1; // apply to z(j1,j2,j,ma,mb) to unique element of y(j) - // find right beta[jjb] and y_list[jju] entries const int jju = idxu_block[j] + (j+1)*mb + ma; idxz[idxz_count].jju = jju; - idxz[idxz_count].betaj = betaj; idxz_count++; } @@ -386,105 +353,168 @@ void SNA::compute_ui(int jnum) void SNA::compute_zi() { - // compute_dbidrj() requires full j1/j2/j chunk of z elements - // use zarray j1/j2 symmetry + int ma2, mb2; + for(int jjz = 0; jjz < idxz_max; jjz++) { + const int j1 = idxz[jjz].j1; + const int j2 = idxz[jjz].j2; + const int j = idxz[jjz].j; + const int ma1min = idxz[jjz].ma1min; + const int ma2max = idxz[jjz].ma2max; + const int na = idxz[jjz].na; + const int mb1min = idxz[jjz].mb1min; + const int mb2max = idxz[jjz].mb2max; + const int nb = idxz[jjz].nb; - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j2 = 0; j2 <= j1; j2++) { - for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { - double sumb1_r, sumb1_i; - int ma2, mb2; - for(int mb = 0; 2*mb <= j; mb++) - for(int ma = 0; ma <= j; ma++) { - zarray_r[j1][j2][j][ma][mb] = 0.0; - zarray_i[j1][j2][j][ma][mb] = 0.0; + const double* cgblock = cglist + idxcg_block[j1][j2][j]; - for(int ma1 = MAX(0, (2 * ma - j - j2 + j1) / 2); - ma1 <= MIN(j1, (2 * ma - j + j2 + j1) / 2); ma1++) { - sumb1_r = 0.0; - sumb1_i = 0.0; + zlist_r[jjz] = 0.0; + zlist_i[jjz] = 0.0; - ma2 = (2 * ma - j - (2 * ma1 - j1) + j2) / 2; + int jju1 = idxu_block[j1] + (j1+1)*mb1min; + int jju2 = idxu_block[j2] + (j2+1)*mb2max; + int icgb = mb1min*(j2+1) + mb2max; + for(int ib = 0; ib < nb; ib++) { - for(int mb1 = MAX(0, (2 * mb - j - j2 + j1) / 2); - mb1 <= MIN(j1, (2 * mb - j + j2 + j1) / 2); mb1++) { + double suma1_r = 0.0; + double suma1_i = 0.0; - mb2 = (2 * mb - j - (2 * mb1 - j1) + j2) / 2; - sumb1_r += cgarray[j1][j2][j][mb1][mb2] * - (uarraytot_r[j1][ma1][mb1] * uarraytot_r[j2][ma2][mb2] - - uarraytot_i[j1][ma1][mb1] * uarraytot_i[j2][ma2][mb2]); - sumb1_i += cgarray[j1][j2][j][mb1][mb2] * - (uarraytot_r[j1][ma1][mb1] * uarraytot_i[j2][ma2][mb2] + - uarraytot_i[j1][ma1][mb1] * uarraytot_r[j2][ma2][mb2]); - } // end loop over mb1 + const double* u1_r = &ulisttot_r[jju1]; + const double* u1_i = &ulisttot_i[jju1]; + const double* u2_r = &ulisttot_r[jju2]; + const double* u2_i = &ulisttot_i[jju2]; - zarray_r[j1][j2][j][ma][mb] += - sumb1_r * cgarray[j1][j2][j][ma1][ma2]; - zarray_i[j1][j2][j][ma][mb] += - sumb1_i * cgarray[j1][j2][j][ma1][ma2]; - } // end loop over ma1 - } // end loop over ma, mb - } // end loop over j - } // end loop over j1, j2 + int ma1 = ma1min; + int ma2 = ma2max; + int icga = ma1min*(j2+1) + ma2max; + for(int ia = 0; ia < na; ia++) { + suma1_r += cgblock[icga] * (u1_r[ma1] * u2_r[ma2] - u1_i[ma1] * u2_i[ma2]); + suma1_i += cgblock[icga] * (u1_r[ma1] * u2_i[ma2] + u1_i[ma1] * u2_r[ma2]); + ma1++; + ma2--; + icga += j2; + } // end loop over ia + zlist_r[jjz] += cgblock[icgb] * suma1_r; + zlist_i[jjz] += cgblock[icgb] * suma1_i; + jju1 += j1+1; + jju2 -= j2+1; + icgb += j2; + } // end loop over ib + +// // apply symmetry factor + +// const double jfac = 1.0/(j+1); +// zlist_r[jjz] *= jfac; +// zlist_i[jjz] *= jfac; + + } // end loop over jjz } /* ---------------------------------------------------------------------- - compute Yi by summing over products of beta and Zi + compute Yi from Ui without storing Zi, looping over ylist ------------------------------------------------------------------------- */ void SNA::compute_yi(const double* beta) { - int j; - int idxz_count; - double **jjjzarray_r, **jjjzarray_i; - for(int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j]; for(int mb = 0; 2*mb <= j; mb++) for(int ma = 0; ma <= j; ma++) { - yarray_r[j][ma][mb] = 0.0; - yarray_i[j][ma][mb] = 0.0; + ylist_r[jju] = 0.0; + ylist_i[jju] = 0.0; + jju++; } // end loop over ma, mb } // end loop over j for(int jjb = 0; jjb < idxb_max; jjb++) { - const int j1 = idxb[jjb].j1; - const int j2 = idxb[jjb].j2; - const int j3 = idxb[jjb].j; + const int j1b = idxb[jjb].j1; + const int j2b = idxb[jjb].j2; + const int j3b = idxb[jjb].j; - j = j3; - jjjzarray_r = zarray_r[j1][j2][j3]; - jjjzarray_i = zarray_i[j1][j2][j3]; - for(int mb = 0; 2*mb <= j; mb++) - for(int ma = 0; ma <= j; ma++) { - yarray_r[j][ma][mb] += beta[jjb]*jjjzarray_r[ma][mb]; - yarray_i[j][ma][mb] += beta[jjb]*jjjzarray_i[ma][mb]; - } // end loop over ma, mb - - j = j1; - jjjzarray_r = zarray_r[j3][j2][j1]; - jjjzarray_i = zarray_i[j3][j2][j1]; - double j1fac = (j3+1)/(j+1.0); - for(int mb = 0; 2*mb <= j; mb++) - for(int ma = 0; ma <= j; ma++) { - yarray_r[j][ma][mb] += beta[jjb]*jjjzarray_r[ma][mb]*j1fac; - yarray_i[j][ma][mb] += beta[jjb]*jjjzarray_i[ma][mb]*j1fac; - } // end loop over ma, mb - - j = j2; - jjjzarray_r = zarray_r[j3][j1][j2]; - jjjzarray_i = zarray_i[j3][j1][j2]; - double j2fac = (j3+1)/(j+1.0); - for(int mb = 0; 2*mb <= j; mb++) - for(int ma = 0; ma <= j; ma++) { - yarray_r[j][ma][mb] += beta[jjb]*jjjzarray_r[ma][mb]*j2fac; - yarray_i[j][ma][mb] += beta[jjb]*jjjzarray_i[ma][mb]*j2fac; - } // end loop over ma, mb + compute_yterm(j1b,j2b,j3b,beta); + compute_yterm(j3b,j2b,j1b,beta); + compute_yterm(j3b,j1b,j2b,beta); } // end loop over jjb } +void SNA::compute_yterm(int j1, int j2, int j, const double* beta) { + double betaj; + + int jju = idxu_block[j]; + int jjz = idxz_block[j1][j2][j]; + + // pick out right beta value + + if (j >= j1) { + const int jjb = idxb_block[j1][j2][j]; + betaj = beta[jjb]; + } else if (j >= j2) { + const int jjb = idxb_block[j][j2][j1]; + betaj = beta[jjb]*(j1+1)/(j+1.0); + } else { + const int jjb = idxb_block[j2][j][j1]; + betaj = beta[jjb]*(j1+1)/(j+1.0); + } + + // can replace this with a single loop over jjz + + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + + const int ma1min = idxz[jjz].ma1min; + const int ma2max = idxz[jjz].ma2max; + const int na = idxz[jjz].na; + const int mb1min = idxz[jjz].mb1min; + const int mb2max = idxz[jjz].mb2max; + const int nb = idxz[jjz].nb; + + const double* cgblock = cglist + idxcg_block[j1][j2][j]; + + double ztmp_r = 0.0; + double ztmp_i = 0.0; + + int jju1 = idxu_block[j1] + (j1+1)*mb1min; + int jju2 = idxu_block[j2] + (j2+1)*mb2max; + int icgb = mb1min*(j2+1) + mb2max; + for(int ib = 0; ib < nb; ib++) { + + double suma1_r = 0.0; + double suma1_i = 0.0; + + const double* u1_r = &ulisttot_r[jju1]; + const double* u1_i = &ulisttot_i[jju1]; + const double* u2_r = &ulisttot_r[jju2]; + const double* u2_i = &ulisttot_i[jju2]; + + int ma1 = ma1min; + int ma2 = ma2max; + int icga = ma1min*(j2+1) + ma2max; + + for(int ia = 0; ia < na; ia++) { + suma1_r += cgblock[icga] * (u1_r[ma1] * u2_r[ma2] - u1_i[ma1] * u2_i[ma2]); + suma1_i += cgblock[icga] * (u1_r[ma1] * u2_i[ma2] + u1_i[ma1] * u2_r[ma2]); + ma1++; + ma2--; + icga += j2; + } // end loop over ia + + ztmp_r += cgblock[icgb] * suma1_r; + ztmp_i += cgblock[icgb] * suma1_i; + jju1 += j1+1; + jju2 -= j2+1; + icgb += j2; + } // end loop over ib + + // printf("jju betaj ztmp ylist %d %g %g %d %d %d %d %d\n",jju,betaj,ztmp_r,j1,j2,j,ma,mb); + ylist_r[jju] += betaj*ztmp_r; + ylist_i[jju] += betaj*ztmp_i; + jjz++; + jju++; + } // end loop over ma, mb +} + /* ---------------------------------------------------------------------- compute dEidRj ------------------------------------------------------------------------- */ @@ -496,19 +526,21 @@ void SNA::compute_deidrj(double* dedr) dedr[k] = 0.0; for(int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j]; for(int mb = 0; 2*mb < j; mb++) for(int ma = 0; ma <= j; ma++) { - double* dudr_r = duarray_r[j][ma][mb]; - double* dudr_i = duarray_i[j][ma][mb]; - double jjjmambyarray_r = yarray_r[j][ma][mb]; - double jjjmambyarray_i = yarray_i[j][ma][mb]; + double* dudr_r = dulist_r[jju]; + double* dudr_i = dulist_i[jju]; + double jjjmambyarray_r = ylist_r[jju]; + double jjjmambyarray_i = ylist_i[jju]; + for(int k = 0; k < 3; k++) dedr[k] += dudr_r[k] * jjjmambyarray_r + dudr_i[k] * jjjmambyarray_i; - + jju++; } //end loop over ma mb // For j even, handle middle column @@ -517,30 +549,33 @@ void SNA::compute_deidrj(double* dedr) int mb = j/2; for(int ma = 0; ma < mb; ma++) { - double* dudr_r = duarray_r[j][ma][mb]; - double* dudr_i = duarray_i[j][ma][mb]; - double jjjmambyarray_r = yarray_r[j][ma][mb]; - double jjjmambyarray_i = yarray_i[j][ma][mb]; + double* dudr_r = dulist_r[jju]; + double* dudr_i = dulist_i[jju]; + double jjjmambyarray_r = ylist_r[jju]; + double jjjmambyarray_i = ylist_i[jju]; + for(int k = 0; k < 3; k++) dedr[k] += dudr_r[k] * jjjmambyarray_r + dudr_i[k] * jjjmambyarray_i; - + jju++; } int ma = mb; - double* dudr_r = duarray_r[j][ma][mb]; - double* dudr_i = duarray_i[j][ma][mb]; - double jjjmambyarray_r = yarray_r[j][ma][mb]; - double jjjmambyarray_i = yarray_i[j][ma][mb]; + double* dudr_r = dulist_r[jju]; + double* dudr_i = dulist_i[jju]; + double jjjmambyarray_r = ylist_r[jju]; + double jjjmambyarray_i = ylist_i[jju]; + for(int k = 0; k < 3; k++) dedr[k] += (dudr_r[k] * jjjmambyarray_r + dudr_i[k] * jjjmambyarray_i)*0.5; - + jju++; + } // end if jeven - } // End loop over j + } // end loop over j for(int k = 0; k < 3; k++) dedr[k] *= 2.0; @@ -562,103 +597,41 @@ void SNA::compute_bi() // b(j1,j2,j) += // 2*Conj(u(j,ma,mb))*z(j1,j2,j,ma,mb) - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j2 = 0; j2 <= j1; j2++) { - for(int j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) { - barray[j1][j2][j] = 0.0; + for(int jjb = 0; jjb < idxb_max; jjb++) { + const int j1 = idxb[jjb].j1; + const int j2 = idxb[jjb].j2; + const int j = idxb[jjb].j; - for(int mb = 0; 2*mb < j; mb++) - for(int ma = 0; ma <= j; ma++) - barray[j1][j2][j] += - uarraytot_r[j][ma][mb] * zarray_r[j1][j2][j][ma][mb] + - uarraytot_i[j][ma][mb] * zarray_i[j1][j2][j][ma][mb]; + int jjz = idxz_block[j1][j2][j]; + int jju = idxu_block[j]; + double sumzu = 0.0; + for (int mb = 0; 2*mb < j; mb++) + for (int ma = 0; ma <= j; ma++) { + sumzu += ulisttot_r[jju]*zlist_r[jjz] + + ulisttot_i[jju]*zlist_i[jjz]; + jjz++; + jju++; + } // end loop over ma, mb - // For j even, special treatment for middle column + // For j even, handle middle column - if (j%2 == 0) { - int mb = j/2; - for(int ma = 0; ma < mb; ma++) - barray[j1][j2][j] += - uarraytot_r[j][ma][mb] * zarray_r[j1][j2][j][ma][mb] + - uarraytot_i[j][ma][mb] * zarray_i[j1][j2][j][ma][mb]; - int ma = mb; - barray[j1][j2][j] += - (uarraytot_r[j][ma][mb] * zarray_r[j1][j2][j][ma][mb] + - uarraytot_i[j][ma][mb] * zarray_i[j1][j2][j][ma][mb])*0.5; - } - - barray[j1][j2][j] *= 2.0; - if (bzero_flag) - barray[j1][j2][j] -= bzero[j]; + if (j%2 == 0) { + int mb = j/2; + for(int ma = 0; ma < mb; ma++) { + sumzu += ulisttot_r[jju]*zlist_r[jjz] + + ulisttot_i[jju]*zlist_i[jjz]; + jjz++; + jju++; } - } -} - -/* ---------------------------------------------------------------------- - copy Bi array to a vector -------------------------------------------------------------------------- */ - -void SNA::copy_bi2bvec() -{ - int ncount, j1, j2, j; - - ncount = 0; - - for(j1 = 0; j1 <= twojmax; j1++) - if(diagonalstyle == 0) { - for(j2 = 0; j2 <= j1; j2++) - for(j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) { - bvec[ncount] = barray[j1][j2][j]; - ncount++; - } - } else if(diagonalstyle == 1) { - j2 = j1; - for(j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) { - bvec[ncount] = barray[j1][j2][j]; - ncount++; - } - } else if(diagonalstyle == 2) { - j = j2 = j1; - bvec[ncount] = barray[j1][j2][j]; - ncount++; - } else if(diagonalstyle == 3) { - for(j2 = 0; j2 <= j1; j2++) - for(j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) - if (j >= j1) { - bvec[ncount] = barray[j1][j2][j]; - ncount++; - } - } -} - -/* ---------------------------------------------------------------------- - calculate derivative of Ui w.r.t. atom j -------------------------------------------------------------------------- */ - -void SNA::compute_duidrj(double* rij, double wj, double rcut) -{ - double rsq, r, x, y, z, z0, theta0, cs, sn; - double dz0dr; - - x = rij[0]; - y = rij[1]; - z = rij[2]; - rsq = x * x + y * y + z * z; - r = sqrt(rsq); - double rscale0 = rfac0 * MY_PI / (rcut - rmin0); - theta0 = (r - rmin0) * rscale0; - cs = cos(theta0); - sn = sin(theta0); - z0 = r * cs / sn; - dz0dr = z0 / r - (r*rscale0) * (rsq + z0 * z0) / rsq; - - compute_duarray(x, y, z, z0, r, dz0dr, wj, rcut); + sumzu += 0.5*(ulisttot_r[jju]*zlist_r[jjz] + + ulisttot_i[jju]*zlist_i[jjz]); + jjz++; + jju++; + } // end if jeven + blist[jjb] = 2.0*sumzu; + } } /* ---------------------------------------------------------------------- @@ -698,44 +671,36 @@ void SNA::compute_dbidrj() double** jjjzarray_i; double jjjmambzarray_r; double jjjmambzarray_i; + int jjz, jju; for(int jjb = 0; jjb < idxb_max; jjb++) { const int j1 = idxb[jjb].j1; const int j2 = idxb[jjb].j2; const int j = idxb[jjb].j; - dbdr = dbarray[j1][j2][j]; + dbdr = dblist[jjb]; dbdr[0] = 0.0; dbdr[1] = 0.0; dbdr[2] = 0.0; // Sum terms Conj(dudr(j,ma,mb))*z(j1,j2,j,ma,mb) + jjz = idxz_block[j1][j2][j]; + jju = idxu_block[j]; + for(int k = 0; k < 3; k++) sumzdu_r[k] = 0.0; - // use zarray j1/j2 symmetry (optional) - - if (j1 >= j2) { - jjjzarray_r = zarray_r[j1][j2][j]; - jjjzarray_i = zarray_i[j1][j2][j]; - } else { - jjjzarray_r = zarray_r[j2][j1][j]; - jjjzarray_i = zarray_i[j2][j1][j]; - } - for(int mb = 0; 2*mb < j; mb++) for(int ma = 0; ma <= j; ma++) { - - dudr_r = duarray_r[j][ma][mb]; - dudr_i = duarray_i[j][ma][mb]; - jjjmambzarray_r = jjjzarray_r[ma][mb]; - jjjmambzarray_i = jjjzarray_i[ma][mb]; + dudr_r = dulist_r[jju]; + dudr_i = dulist_i[jju]; for(int k = 0; k < 3; k++) sumzdu_r[k] += - dudr_r[k] * jjjmambzarray_r + - dudr_i[k] * jjjmambzarray_i; - + dudr_r[k] * zlist_r[jjz] + + dudr_i[k] * zlist_i[jjz]; + jjz++; + jju++; } //end loop over ma mb // For j even, handle middle column @@ -743,24 +708,24 @@ void SNA::compute_dbidrj() if (j%2 == 0) { int mb = j/2; for(int ma = 0; ma < mb; ma++) { - dudr_r = duarray_r[j][ma][mb]; - dudr_i = duarray_i[j][ma][mb]; - jjjmambzarray_r = jjjzarray_r[ma][mb]; - jjjmambzarray_i = jjjzarray_i[ma][mb]; + dudr_r = dulist_r[jju]; + dudr_i = dulist_i[jju]; for(int k = 0; k < 3; k++) sumzdu_r[k] += - dudr_r[k] * jjjmambzarray_r + - dudr_i[k] * jjjmambzarray_i; + dudr_r[k] * zlist_r[jjz] + + dudr_i[k] * zlist_i[jjz]; + jjz++; + jju++; } int ma = mb; - dudr_r = duarray_r[j][ma][mb]; - dudr_i = duarray_i[j][ma][mb]; - jjjmambzarray_r = jjjzarray_r[ma][mb]; - jjjmambzarray_i = jjjzarray_i[ma][mb]; + dudr_r = dulist_r[jju]; + dudr_i = dulist_i[jju]; for(int k = 0; k < 3; k++) sumzdu_r[k] += - (dudr_r[k] * jjjmambzarray_r + - dudr_i[k] * jjjmambzarray_i)*0.5; + (dudr_r[k] * zlist_r[jjz] + + dudr_i[k] * zlist_i[jjz])*0.5; + jjz++; + jju++; } // end if jeven for(int k = 0; k < 3; k++) @@ -770,115 +735,97 @@ void SNA::compute_dbidrj() double j1fac = (j+1)/(j1+1.0); + jjz = idxz_block[j][j2][j1]; + jju = idxu_block[j1]; + for(int k = 0; k < 3; k++) sumzdu_r[k] = 0.0; - // use zarray j1/j2 symmetry (optional) - - if (j >= j2) { - jjjzarray_r = zarray_r[j][j2][j1]; - jjjzarray_i = zarray_i[j][j2][j1]; - } else { - jjjzarray_r = zarray_r[j2][j][j1]; - jjjzarray_i = zarray_i[j2][j][j1]; - } - - for(int mb1 = 0; 2*mb1 < j1; mb1++) - for(int ma1 = 0; ma1 <= j1; ma1++) { - - dudr_r = duarray_r[j1][ma1][mb1]; - dudr_i = duarray_i[j1][ma1][mb1]; - jjjmambzarray_r = jjjzarray_r[ma1][mb1]; - jjjmambzarray_i = jjjzarray_i[ma1][mb1]; + for(int mb = 0; 2*mb < j1; mb++) + for(int ma = 0; ma <= j1; ma++) { + dudr_r = dulist_r[jju]; + dudr_i = dulist_i[jju]; for(int k = 0; k < 3; k++) sumzdu_r[k] += - dudr_r[k] * jjjmambzarray_r + - dudr_i[k] * jjjmambzarray_i; - - } //end loop over ma1 mb1 + dudr_r[k] * zlist_r[jjz] + + dudr_i[k] * zlist_i[jjz]; + jjz++; + jju++; + } //end loop over ma mb // For j1 even, handle middle column if (j1%2 == 0) { - int mb1 = j1/2; - for(int ma1 = 0; ma1 < mb1; ma1++) { - dudr_r = duarray_r[j1][ma1][mb1]; - dudr_i = duarray_i[j1][ma1][mb1]; - jjjmambzarray_r = jjjzarray_r[ma1][mb1]; - jjjmambzarray_i = jjjzarray_i[ma1][mb1]; + int mb = j1/2; + for(int ma = 0; ma < mb; ma++) { + dudr_r = dulist_r[jju]; + dudr_i = dulist_i[jju]; for(int k = 0; k < 3; k++) sumzdu_r[k] += - dudr_r[k] * jjjmambzarray_r + - dudr_i[k] * jjjmambzarray_i; + dudr_r[k] * zlist_r[jjz] + + dudr_i[k] * zlist_i[jjz]; + jjz++; + jju++; } - int ma1 = mb1; - dudr_r = duarray_r[j1][ma1][mb1]; - dudr_i = duarray_i[j1][ma1][mb1]; - jjjmambzarray_r = jjjzarray_r[ma1][mb1]; - jjjmambzarray_i = jjjzarray_i[ma1][mb1]; + int ma = mb; + dudr_r = dulist_r[jju]; + dudr_i = dulist_i[jju]; for(int k = 0; k < 3; k++) sumzdu_r[k] += - (dudr_r[k] * jjjmambzarray_r + - dudr_i[k] * jjjmambzarray_i)*0.5; + (dudr_r[k] * zlist_r[jjz] + + dudr_i[k] * zlist_i[jjz])*0.5; + jjz++; + jju++; } // end if j1even for(int k = 0; k < 3; k++) dbdr[k] += 2.0*sumzdu_r[k]*j1fac; - // Sum over Conj(dudr(j2,ma2,mb2))*z(j1,j,j2,ma2,mb2) + // Sum over Conj(dudr(j2,ma2,mb2))*z(j,j1,j2,ma2,mb2) double j2fac = (j+1)/(j2+1.0); + jjz = idxz_block[j][j1][j2]; + jju = idxu_block[j2]; + for(int k = 0; k < 3; k++) sumzdu_r[k] = 0.0; - // use zarray j1/j2 symmetry (optional) - - if (j1 >= j) { - jjjzarray_r = zarray_r[j1][j][j2]; - jjjzarray_i = zarray_i[j1][j][j2]; - } else { - jjjzarray_r = zarray_r[j][j1][j2]; - jjjzarray_i = zarray_i[j][j1][j2]; - } - - for(int mb2 = 0; 2*mb2 < j2; mb2++) - for(int ma2 = 0; ma2 <= j2; ma2++) { - - dudr_r = duarray_r[j2][ma2][mb2]; - dudr_i = duarray_i[j2][ma2][mb2]; - jjjmambzarray_r = jjjzarray_r[ma2][mb2]; - jjjmambzarray_i = jjjzarray_i[ma2][mb2]; + for(int mb = 0; 2*mb < j2; mb++) + for(int ma = 0; ma <= j2; ma++) { + dudr_r = dulist_r[jju]; + dudr_i = dulist_i[jju]; for(int k = 0; k < 3; k++) sumzdu_r[k] += - dudr_r[k] * jjjmambzarray_r + - dudr_i[k] * jjjmambzarray_i; - - } //end loop over ma2 mb2 + dudr_r[k] * zlist_r[jjz] + + dudr_i[k] * zlist_i[jjz]; + jjz++; + jju++; + } //end loop over ma mb // For j2 even, handle middle column if (j2%2 == 0) { - int mb2 = j2/2; - for(int ma2 = 0; ma2 < mb2; ma2++) { - dudr_r = duarray_r[j2][ma2][mb2]; - dudr_i = duarray_i[j2][ma2][mb2]; - jjjmambzarray_r = jjjzarray_r[ma2][mb2]; - jjjmambzarray_i = jjjzarray_i[ma2][mb2]; + int mb = j2/2; + for(int ma = 0; ma < mb; ma++) { + dudr_r = dulist_r[jju]; + dudr_i = dulist_i[jju]; for(int k = 0; k < 3; k++) sumzdu_r[k] += - dudr_r[k] * jjjmambzarray_r + - dudr_i[k] * jjjmambzarray_i; + dudr_r[k] * zlist_r[jjz] + + dudr_i[k] * zlist_i[jjz]; + jjz++; + jju++; } - int ma2 = mb2; - dudr_r = duarray_r[j2][ma2][mb2]; - dudr_i = duarray_i[j2][ma2][mb2]; - jjjmambzarray_r = jjjzarray_r[ma2][mb2]; - jjjmambzarray_i = jjjzarray_i[ma2][mb2]; + int ma = mb; + dudr_r = dulist_r[jju]; + dudr_i = dulist_i[jju]; for(int k = 0; k < 3; k++) sumzdu_r[k] += - (dudr_r[k] * jjjmambzarray_r + - dudr_i[k] * jjjmambzarray_i)*0.5; + (dudr_r[k] * zlist_r[jjz] + + dudr_i[k] * zlist_i[jjz])*0.5; + jjz++; + jju++; } // end if j2even for(int k = 0; k < 3; k++) @@ -889,75 +836,56 @@ void SNA::compute_dbidrj() } /* ---------------------------------------------------------------------- - copy Bi derivatives into a vector + calculate derivative of Ui w.r.t. atom j ------------------------------------------------------------------------- */ -void SNA::copy_dbi2dbvec() +void SNA::compute_duidrj(double* rij, double wj, double rcut) { - int ncount, j1, j2, j; + double rsq, r, x, y, z, z0, theta0, cs, sn; + double dz0dr; - ncount = 0; + x = rij[0]; + y = rij[1]; + z = rij[2]; + rsq = x * x + y * y + z * z; + r = sqrt(rsq); + double rscale0 = rfac0 * MY_PI / (rcut - rmin0); + theta0 = (r - rmin0) * rscale0; + cs = cos(theta0); + sn = sin(theta0); + z0 = r * cs / sn; + dz0dr = z0 / r - (r*rscale0) * (rsq + z0 * z0) / rsq; - for(j1 = 0; j1 <= twojmax; j1++) { - if(diagonalstyle == 0) { - for(j2 = 0; j2 <= j1; j2++) - for(j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) { - dbvec[ncount][0] = dbarray[j1][j2][j][0]; - dbvec[ncount][1] = dbarray[j1][j2][j][1]; - dbvec[ncount][2] = dbarray[j1][j2][j][2]; - ncount++; - } - } else if(diagonalstyle == 1) { - j2 = j1; - for(j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) { - dbvec[ncount][0] = dbarray[j1][j2][j][0]; - dbvec[ncount][1] = dbarray[j1][j2][j][1]; - dbvec[ncount][2] = dbarray[j1][j2][j][2]; - ncount++; - } - } else if(diagonalstyle == 2) { - j = j2 = j1; - dbvec[ncount][0] = dbarray[j1][j2][j][0]; - dbvec[ncount][1] = dbarray[j1][j2][j][1]; - dbvec[ncount][2] = dbarray[j1][j2][j][2]; - ncount++; - } else if(diagonalstyle == 3) { - for(j2 = 0; j2 <= j1; j2++) - for(j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) - if (j >= j1) { - dbvec[ncount][0] = dbarray[j1][j2][j][0]; - dbvec[ncount][1] = dbarray[j1][j2][j][1]; - dbvec[ncount][2] = dbarray[j1][j2][j][2]; - ncount++; - } - } - } + compute_duarray(x, y, z, z0, r, dz0dr, wj, rcut); } /* ---------------------------------------------------------------------- */ void SNA::zero_uarraytot() { - for (int j = 0; j <= twojmax; j++) - for (int ma = 0; ma <= j; ma++) - for (int mb = 0; mb <= j; mb++) { - uarraytot_r[j][ma][mb] = 0.0; - uarraytot_i[j][ma][mb] = 0.0; + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j]; + for (int mb = 0; mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + ulisttot_r[jju] = 0.0; + ulisttot_i[jju] = 0.0; + jju++; } + } } /* ---------------------------------------------------------------------- */ void SNA::addself_uarraytot(double wself_in) { - for (int j = 0; j <= twojmax; j++) + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j]; for (int ma = 0; ma <= j; ma++) { - uarraytot_r[j][ma][ma] = wself_in; - uarraytot_i[j][ma][ma] = 0.0; + ulisttot_r[jju] = wself_in; + ulisttot_i[jju] = 0.0; + jju += j+2; } + } } /* ---------------------------------------------------------------------- @@ -972,14 +900,17 @@ void SNA::add_uarraytot(double r, double wj, double rcut) sfac *= wj; - for (int j = 0; j <= twojmax; j++) - for (int ma = 0; ma <= j; ma++) - for (int mb = 0; mb <= j; mb++) { - uarraytot_r[j][ma][mb] += - sfac * uarray_r[j][ma][mb]; - uarraytot_i[j][ma][mb] += - sfac * uarray_i[j][ma][mb]; + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j]; + for (int mb = 0; mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + ulisttot_r[jju] += + sfac * ulist_r[jju]; + ulisttot_i[jju] += + sfac * ulist_i[jju]; + jju++; } + } } /* ---------------------------------------------------------------------- @@ -1003,63 +934,72 @@ void SNA::compute_uarray(double x, double y, double z, // VMK Section 4.8.2 - uarray_r[0][0][0] = 1.0; - uarray_i[0][0][0] = 0.0; + ulist_r[0] = 1.0; + ulist_i[0] = 0.0; for (int j = 1; j <= twojmax; j++) { + int jju = idxu_block[j]; + int jjup = idxu_block[j-1]; // fill in left side of matrix layer from previous layer for (int mb = 0; 2*mb <= j; mb++) { - uarray_r[j][0][mb] = 0.0; - uarray_i[j][0][mb] = 0.0; + ulist_r[jju] = 0.0; + ulist_i[jju] = 0.0; for (int ma = 0; ma < j; ma++) { rootpq = rootpqarray[j - ma][j - mb]; - uarray_r[j][ma][mb] += + ulist_r[jju] += rootpq * - (a_r * uarray_r[j - 1][ma][mb] + - a_i * uarray_i[j - 1][ma][mb]); - uarray_i[j][ma][mb] += + (a_r * ulist_r[jjup] + + a_i * ulist_i[jjup]); + ulist_i[jju] += rootpq * - (a_r * uarray_i[j - 1][ma][mb] - - a_i * uarray_r[j - 1][ma][mb]); + (a_r * ulist_i[jjup] - + a_i * ulist_r[jjup]); rootpq = rootpqarray[ma + 1][j - mb]; - uarray_r[j][ma + 1][mb] = + ulist_r[jju+1] = -rootpq * - (b_r * uarray_r[j - 1][ma][mb] + - b_i * uarray_i[j - 1][ma][mb]); - uarray_i[j][ma + 1][mb] = + (b_r * ulist_r[jjup] + + b_i * ulist_i[jjup]); + ulist_i[jju+1] = -rootpq * - (b_r * uarray_i[j - 1][ma][mb] - - b_i * uarray_r[j - 1][ma][mb]); + (b_r * ulist_i[jjup] - + b_i * ulist_r[jjup]); + jju++; + jjup++; } + jju++; } // copy left side to right side with inversion symmetry VMK 4.4(2) // u[ma-j][mb-j] = (-1)^(ma-mb)*Conj([u[ma][mb]) - int mbpar = -1; + jju = idxu_block[j]; + jjup = jju+(j+1)*(j+1)-1; + int mbpar = 1; for (int mb = 0; 2*mb <= j; mb++) { - mbpar = -mbpar; - int mapar = -mbpar; + int mapar = mbpar; for (int ma = 0; ma <= j; ma++) { - mapar = -mapar; if (mapar == 1) { - uarray_r[j][j-ma][j-mb] = uarray_r[j][ma][mb]; - uarray_i[j][j-ma][j-mb] = -uarray_i[j][ma][mb]; + ulist_r[jjup] = ulist_r[jju]; + ulist_i[jjup] = -ulist_i[jju]; } else { - uarray_r[j][j-ma][j-mb] = -uarray_r[j][ma][mb]; - uarray_i[j][j-ma][j-mb] = uarray_i[j][ma][mb]; + ulist_r[jjup] = -ulist_r[jju]; + ulist_i[jjup] = ulist_i[jju]; } + mapar = -mapar; + jju++; + jjup--; } + mbpar = -mbpar; } } } /* ---------------------------------------------------------------------- - compute derivatives of Wigner U-functions for one neighbor + Compute derivatives of Wigner U-functions for one neighbor see comments in compute_uarray() ------------------------------------------------------------------------- */ @@ -1109,93 +1049,105 @@ void SNA::compute_duarray(double x, double y, double z, db_i[0] += -r0inv; db_r[1] += r0inv; - uarray_r[0][0][0] = 1.0; - duarray_r[0][0][0][0] = 0.0; - duarray_r[0][0][0][1] = 0.0; - duarray_r[0][0][0][2] = 0.0; - uarray_i[0][0][0] = 0.0; - duarray_i[0][0][0][0] = 0.0; - duarray_i[0][0][0][1] = 0.0; - duarray_i[0][0][0][2] = 0.0; + ulist_r[0] = 1.0; + dulist_r[0][0] = 0.0; + dulist_r[0][1] = 0.0; + dulist_r[0][2] = 0.0; + ulist_i[0] = 0.0; + dulist_i[0][0] = 0.0; + dulist_i[0][1] = 0.0; + dulist_i[0][2] = 0.0; for (int j = 1; j <= twojmax; j++) { + int jju = idxu_block[j]; + int jjup = idxu_block[j-1]; for (int mb = 0; 2*mb <= j; mb++) { - uarray_r[j][0][mb] = 0.0; - duarray_r[j][0][mb][0] = 0.0; - duarray_r[j][0][mb][1] = 0.0; - duarray_r[j][0][mb][2] = 0.0; - uarray_i[j][0][mb] = 0.0; - duarray_i[j][0][mb][0] = 0.0; - duarray_i[j][0][mb][1] = 0.0; - duarray_i[j][0][mb][2] = 0.0; + ulist_r[jju] = 0.0; + dulist_r[jju][0] = 0.0; + dulist_r[jju][1] = 0.0; + dulist_r[jju][2] = 0.0; + ulist_i[jju] = 0.0; + dulist_i[jju][0] = 0.0; + dulist_i[jju][1] = 0.0; + dulist_i[jju][2] = 0.0; for (int ma = 0; ma < j; ma++) { rootpq = rootpqarray[j - ma][j - mb]; - uarray_r[j][ma][mb] += rootpq * - (a_r * uarray_r[j - 1][ma][mb] + - a_i * uarray_i[j - 1][ma][mb]); - uarray_i[j][ma][mb] += rootpq * - (a_r * uarray_i[j - 1][ma][mb] - - a_i * uarray_r[j - 1][ma][mb]); + ulist_r[jju] += rootpq * + (a_r * ulist_r[jjup] + + a_i * ulist_i[jjup]); + ulist_i[jju] += rootpq * + (a_r * ulist_i[jjup] - + a_i * ulist_r[jjup]); for (int k = 0; k < 3; k++) { - duarray_r[j][ma][mb][k] += - rootpq * (da_r[k] * uarray_r[j - 1][ma][mb] + - da_i[k] * uarray_i[j - 1][ma][mb] + - a_r * duarray_r[j - 1][ma][mb][k] + - a_i * duarray_i[j - 1][ma][mb][k]); - duarray_i[j][ma][mb][k] += - rootpq * (da_r[k] * uarray_i[j - 1][ma][mb] - - da_i[k] * uarray_r[j - 1][ma][mb] + - a_r * duarray_i[j - 1][ma][mb][k] - - a_i * duarray_r[j - 1][ma][mb][k]); + dulist_r[jju][k] += + rootpq * (da_r[k] * ulist_r[jjup] + + da_i[k] * ulist_i[jjup] + + a_r * dulist_r[jjup][k] + + a_i * dulist_i[jjup][k]); + dulist_i[jju][k] += + rootpq * (da_r[k] * ulist_i[jjup] - + da_i[k] * ulist_r[jjup] + + a_r * dulist_i[jjup][k] - + a_i * dulist_r[jjup][k]); } rootpq = rootpqarray[ma + 1][j - mb]; - uarray_r[j][ma + 1][mb] = - -rootpq * (b_r * uarray_r[j - 1][ma][mb] + - b_i * uarray_i[j - 1][ma][mb]); - uarray_i[j][ma + 1][mb] = - -rootpq * (b_r * uarray_i[j - 1][ma][mb] - - b_i * uarray_r[j - 1][ma][mb]); + ulist_r[jju+1] = + -rootpq * (b_r * ulist_r[jjup] + + b_i * ulist_i[jjup]); + ulist_i[jju+1] = + -rootpq * (b_r * ulist_i[jjup] - + b_i * ulist_r[jjup]); for (int k = 0; k < 3; k++) { - duarray_r[j][ma + 1][mb][k] = - -rootpq * (db_r[k] * uarray_r[j - 1][ma][mb] + - db_i[k] * uarray_i[j - 1][ma][mb] + - b_r * duarray_r[j - 1][ma][mb][k] + - b_i * duarray_i[j - 1][ma][mb][k]); - duarray_i[j][ma + 1][mb][k] = - -rootpq * (db_r[k] * uarray_i[j - 1][ma][mb] - - db_i[k] * uarray_r[j - 1][ma][mb] + - b_r * duarray_i[j - 1][ma][mb][k] - - b_i * duarray_r[j - 1][ma][mb][k]); + dulist_r[jju+1][k] = + -rootpq * (db_r[k] * ulist_r[jjup] + + db_i[k] * ulist_i[jjup] + + b_r * dulist_r[jjup][k] + + b_i * dulist_i[jjup][k]); + dulist_i[jju+1][k] = + -rootpq * (db_r[k] * ulist_i[jjup] - + db_i[k] * ulist_r[jjup] + + b_r * dulist_i[jjup][k] - + b_i * dulist_r[jjup][k]); } + jju++; + jjup++; } + jju++; } - int mbpar = -1; + // copy left side to right side with inversion symmetry VMK 4.4(2) + // u[ma-j][mb-j] = (-1)^(ma-mb)*Conj([u[ma][mb]) + + jju = idxu_block[j]; + jjup = jju+(j+1)*(j+1)-1; + int mbpar = 1; for (int mb = 0; 2*mb <= j; mb++) { - mbpar = -mbpar; - int mapar = -mbpar; + int mapar = mbpar; for (int ma = 0; ma <= j; ma++) { - mapar = -mapar; if (mapar == 1) { - uarray_r[j][j-ma][j-mb] = uarray_r[j][ma][mb]; - uarray_i[j][j-ma][j-mb] = -uarray_i[j][ma][mb]; + ulist_r[jjup] = ulist_r[jju]; + ulist_i[jjup] = -ulist_i[jju]; for (int k = 0; k < 3; k++) { - duarray_r[j][j-ma][j-mb][k] = duarray_r[j][ma][mb][k]; - duarray_i[j][j-ma][j-mb][k] = -duarray_i[j][ma][mb][k]; + dulist_r[jjup][k] = dulist_r[jju][k]; + dulist_i[jjup][k] = -dulist_i[jju][k]; } } else { - uarray_r[j][j-ma][j-mb] = -uarray_r[j][ma][mb]; - uarray_i[j][j-ma][j-mb] = uarray_i[j][ma][mb]; + ulist_r[jjup] = -ulist_r[jju]; + ulist_i[jjup] = ulist_i[jju]; for (int k = 0; k < 3; k++) { - duarray_r[j][j-ma][j-mb][k] = -duarray_r[j][ma][mb][k]; - duarray_i[j][j-ma][j-mb][k] = duarray_i[j][ma][mb][k]; + dulist_r[jjup][k] = -dulist_r[jju][k]; + dulist_i[jjup][k] = dulist_i[jju][k]; } } + mapar = -mapar; + jju++; + jjup--; } + mbpar = -mbpar; } } @@ -1204,23 +1156,25 @@ void SNA::compute_duarray(double x, double y, double z, sfac *= wj; dsfac *= wj; - - for (int j = 0; j <= twojmax; j++) - for (int ma = 0; ma <= j; ma++) - for (int mb = 0; mb <= j; mb++) { - duarray_r[j][ma][mb][0] = dsfac * uarray_r[j][ma][mb] * ux + - sfac * duarray_r[j][ma][mb][0]; - duarray_i[j][ma][mb][0] = dsfac * uarray_i[j][ma][mb] * ux + - sfac * duarray_i[j][ma][mb][0]; - duarray_r[j][ma][mb][1] = dsfac * uarray_r[j][ma][mb] * uy + - sfac * duarray_r[j][ma][mb][1]; - duarray_i[j][ma][mb][1] = dsfac * uarray_i[j][ma][mb] * uy + - sfac * duarray_i[j][ma][mb][1]; - duarray_r[j][ma][mb][2] = dsfac * uarray_r[j][ma][mb] * uz + - sfac * duarray_r[j][ma][mb][2]; - duarray_i[j][ma][mb][2] = dsfac * uarray_i[j][ma][mb] * uz + - sfac * duarray_i[j][ma][mb][2]; + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_block[j]; + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + dulist_r[jju][0] = dsfac * ulist_r[jju] * ux + + sfac * dulist_r[jju][0]; + dulist_i[jju][0] = dsfac * ulist_i[jju] * ux + + sfac * dulist_i[jju][0]; + dulist_r[jju][1] = dsfac * ulist_r[jju] * uy + + sfac * dulist_r[jju][1]; + dulist_i[jju][1] = dsfac * ulist_i[jju] * uy + + sfac * dulist_i[jju][1]; + dulist_r[jju][2] = dsfac * ulist_r[jju] * uz + + sfac * dulist_r[jju][2]; + dulist_i[jju][2] = dsfac * ulist_i[jju] * uz + + sfac * dulist_i[jju][2]; + jju++; } + } } /* ---------------------------------------------------------------------- @@ -1229,89 +1183,89 @@ void SNA::compute_duarray(double x, double y, double z, double SNA::memory_usage() { + int jdimpq = twojmax + 2; int jdim = twojmax + 1; double bytes; - bytes = jdim * jdim * jdim * jdim * jdim * sizeof(double); - bytes += 2 * jdim * jdim * jdim * sizeof(complex); - bytes += 2 * jdim * jdim * jdim * sizeof(double); - bytes += jdim * jdim * jdim * 3 * sizeof(complex); - bytes += jdim * jdim * jdim * 3 * sizeof(double); - bytes += ncoeff * sizeof(double); - bytes += jdim * jdim * jdim * jdim * jdim * sizeof(complex); + bytes = ncoeff * sizeof(double); // coeff + + bytes += jdimpq*jdimpq * sizeof(double); // pqarray + bytes += idxcg_max * sizeof(double); // cglist + bytes += jdim * jdim * jdim * sizeof(int); // idxcg_block + + bytes += idxu_max * sizeof(double) * 2; // ulist + bytes += idxu_max * sizeof(double) * 2; // ulisttot + bytes += idxu_max * 3 * sizeof(double) * 2; // dulist + bytes += jdim * sizeof(int); // idxu_block + + bytes += idxz_max * 9 * sizeof(int); // idxz + bytes += idxz_max * sizeof(double) * 2; // zlist + bytes += jdim * jdim * jdim * sizeof(int); // idxz_block + + bytes += idxu_max * sizeof(double) * 2; // ylist + bytes += idxb_max * 3 * sizeof(int); // idxb + + bytes += jdim * jdim * jdim * sizeof(int); // idxb_block + return bytes; } - /* ---------------------------------------------------------------------- */ void SNA::create_twojmax_arrays() { - int jdim = twojmax + 1; - - memory->create(cgarray, jdim, jdim, jdim, jdim, jdim, - "sna:cgarray"); - memory->create(rootpqarray, jdim+1, jdim+1, + int jdimpq = twojmax + 2; + memory->create(rootpqarray, jdimpq, jdimpq, "sna:rootpqarray"); - memory->create(barray, jdim, jdim, jdim, - "sna:barray"); - memory->create(dbarray, jdim, jdim, jdim, 3, - "sna:dbarray"); - - memory->create(duarray_r, jdim, jdim, jdim, 3, - "sna:duarray"); - memory->create(duarray_i, jdim, jdim, jdim, 3, - "sna:duarray"); - - memory->create(uarray_r, jdim, jdim, jdim, - "sna:uarray"); - memory->create(uarray_i, jdim, jdim, jdim, - "sna:uarray"); + memory->create(cglist, idxcg_max, "sna:cglist"); + memory->create(ulist_r, idxu_max, "sna:ulist"); + memory->create(ulist_i, idxu_max, "sna:ulist"); + memory->create(ulisttot_r, idxu_max, "sna:ulisttot"); + memory->create(ulisttot_i, idxu_max, "sna:ulisttot"); + memory->create(dulist_r, idxu_max, 3, "sna:dulist"); + memory->create(dulist_i, idxu_max, 3, "sna:dulist"); + memory->create(zlist_r, idxz_max, "sna:zlist"); + memory->create(zlist_i, idxz_max, "sna:zlist"); + memory->create(blist, idxb_max, "sna:blist"); + memory->create(dblist, idxb_max, 3, "sna:dblist"); + memory->create(ylist_r, idxu_max, "sna:ylist"); + memory->create(ylist_i, idxu_max, "sna:ylist"); if (bzero_flag) - memory->create(bzero, jdim,"sna:bzero"); + memory->create(bzero, twojmax+1,"sna:bzero"); else bzero = NULL; - - memory->create(uarraytot_r, jdim, jdim, jdim, - "sna:uarraytot"); - memory->create(zarray_r, jdim, jdim, jdim, jdim, jdim, - "sna:zarray"); - memory->create(uarraytot_i, jdim, jdim, jdim, - "sna:uarraytot"); - memory->create(zarray_i, jdim, jdim, jdim, jdim, jdim, - "sna:zarray"); - memory->create(yarray_r, jdim, jdim, jdim, - "sna:yarray"); - memory->create(yarray_i, jdim, jdim, jdim, - "sna:yarray"); - } /* ---------------------------------------------------------------------- */ void SNA::destroy_twojmax_arrays() { - memory->destroy(cgarray); memory->destroy(rootpqarray); - memory->destroy(barray); + memory->destroy(cglist); + memory->destroy(idxcg_block); - memory->destroy(dbarray); + memory->destroy(ulist_r); + memory->destroy(ulist_i); + memory->destroy(ulisttot_r); + memory->destroy(ulisttot_i); + memory->destroy(dulist_r); + memory->destroy(dulist_i); + memory->destroy(idxu_block); - memory->destroy(duarray_r); - memory->destroy(duarray_i); + memory->destroy(zlist_r); + memory->destroy(zlist_i); + memory->destroy(blist); + memory->destroy(dblist); + memory->destroy(idxz_block); - memory->destroy(uarray_r); - memory->destroy(uarray_i); + memory->destroy(ylist_r); + memory->destroy(ylist_i); + + memory->destroy(idxb_block); if (bzero_flag) memory->destroy(bzero); - memory->destroy(uarraytot_r); - memory->destroy(zarray_r); - memory->destroy(uarraytot_i); - memory->destroy(zarray_i); - memory->destroy(yarray_r); - memory->destroy(yarray_i); } /* ---------------------------------------------------------------------- @@ -1527,28 +1481,33 @@ void SNA::init_clebsch_gordan() int m, aa2, bb2, cc2; int ifac; - for (int j1 = 0; j1 <= twojmax; j1++) - for (int j2 = 0; j2 <= twojmax; j2++) - for (int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) - for (int m1 = 0; m1 <= j1; m1 += 1) { + int idxcg_count = 0; + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + for (int m1 = 0; m1 <= j1; m1++) { aa2 = 2 * m1 - j1; - for (int m2 = 0; m2 <= j2; m2 += 1) { + for (int m2 = 0; m2 <= j2; m2++) { // -c <= cc <= c bb2 = 2 * m2 - j2; m = (aa2 + bb2 + j) / 2; - if(m < 0 || m > j) continue; + if(m < 0 || m > j) { + cglist[idxcg_count] = 0.0; + idxcg_count++; + continue; + } sum = 0.0; for (int z = MAX(0, MAX(-(j - j2 + aa2) - / 2, -(j - j1 - bb2) / 2)); - z <= MIN((j1 + j2 - j) / 2, - MIN((j1 - aa2) / 2, (j2 + bb2) / 2)); - z++) { + / 2, -(j - j1 - bb2) / 2)); + z <= MIN((j1 + j2 - j) / 2, + MIN((j1 - aa2) / 2, (j2 + bb2) / 2)); + z++) { ifac = z % 2 ? -1 : 1; sum += ifac / (factorial(z) * @@ -1558,20 +1517,22 @@ void SNA::init_clebsch_gordan() factorial((j - j2 + aa2) / 2 + z) * factorial((j - j1 - bb2) / 2 + z)); } - + cc2 = 2 * m - j; dcg = deltacg(j1, j2, j); sfaccg = sqrt(factorial((j1 + aa2) / 2) * - factorial((j1 - aa2) / 2) * - factorial((j2 + bb2) / 2) * - factorial((j2 - bb2) / 2) * - factorial((j + cc2) / 2) * - factorial((j - cc2) / 2) * - (j + 1)); - - cgarray[j1][j2][j][m1][m2] = sum * dcg * sfaccg; + factorial((j1 - aa2) / 2) * + factorial((j2 + bb2) / 2) * + factorial((j2 - bb2) / 2) * + factorial((j + cc2) / 2) * + factorial((j - cc2) / 2) * + (j + 1)); + + cglist[idxcg_count] = sum * dcg * sfaccg; + idxcg_count++; } } + } } /* ---------------------------------------------------------------------- @@ -1586,74 +1547,6 @@ void SNA::init_rootpqarray() rootpqarray[p][q] = sqrt(static_cast(p)/q); } -/* ---------------------------------------------------------------------- - a = j/2 -------------------------------------------------------------------------- */ - -void SNA::jtostr(char* str, int j) -{ - if(j % 2 == 0) - sprintf(str, "%d", j / 2); - else - sprintf(str, "%d/2", j); -} - -/* ---------------------------------------------------------------------- - aa = m - j/2 -------------------------------------------------------------------------- */ - -void SNA::mtostr(char* str, int j, int m) -{ - if(j % 2 == 0) - sprintf(str, "%d", m - j / 2); - else - sprintf(str, "%d/2", 2 * m - j); -} - -/* ---------------------------------------------------------------------- - list values of Clebsch-Gordan coefficients - using notation of VMK Table 8.11 -------------------------------------------------------------------------- */ - -void SNA::print_clebsch_gordan(FILE* file) -{ - char stra[20], strb[20], strc[20], straa[20], strbb[20], strcc[20]; - int m, aa2, bb2; - - fprintf(file, "a, aa, b, bb, c, cc, c(a,aa,b,bb,c,cc) \n"); - - for (int j1 = 0; j1 <= twojmax; j1++) { - jtostr(stra, j1); - - for (int j2 = 0; j2 <= twojmax; j2++) { - jtostr(strb, j2); - - for (int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { - jtostr(strc, j); - - for (int m1 = 0; m1 <= j1; m1 += 1) { - mtostr(straa, j1, m1); - aa2 = 2 * m1 - j1; - - for (int m2 = 0; m2 <= j2; m2 += 1) { - bb2 = 2 * m2 - j2; - m = (aa2 + bb2 + j) / 2; - - if(m < 0 || m > j) continue; - - mtostr(strbb, j2, m2); - mtostr(strcc, j, m); - - fprintf(file, "%s\t%s\t%s\t%s\t%s\t%s\t%g\n", - stra, straa, strb, strbb, strc, strcc, - cgarray[j1][j2][j][m1][m2]); - } - } - } - } - } -} - /* ---------------------------------------------------------------------- */ int SNA::compute_ncoeff() @@ -1663,25 +1556,10 @@ int SNA::compute_ncoeff() ncount = 0; for (int j1 = 0; j1 <= twojmax; j1++) - if(diagonalstyle == 0) { - for (int j2 = 0; j2 <= j1; j2++) - for (int j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) - ncount++; - } else if(diagonalstyle == 1) { - int j2 = j1; - + for (int j2 = 0; j2 <= j1; j2++) for (int j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) - ncount++; - } else if(diagonalstyle == 2) { - ncount++; - } else if(diagonalstyle == 3) { - for (int j2 = 0; j2 <= j1; j2++) - for (int j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) - if (j >= j1) ncount++; - } + j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) ncount++; return ncount; } diff --git a/src/SNAP/sna.h b/src/SNAP/sna.h index b93b0ac7b0..b54ad3482a 100644 --- a/src/SNAP/sna.h +++ b/src/SNAP/sna.h @@ -26,7 +26,6 @@ namespace LAMMPS_NS { struct SNA_ZINDICES { int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju; - double betaj; }; struct SNA_BINDICES { @@ -51,19 +50,20 @@ public: void compute_ui(int); void compute_zi(); void compute_yi(const double*); + void compute_yterm(int, int, int, const double*); void compute_bi(); - void copy_bi2bvec(); // functions for derivatives void compute_duidrj(double*, double, double); void compute_dbidrj(); void compute_deidrj(double*); - void copy_dbi2dbvec(); double compute_sfac(double, double); double compute_dsfac(double, double); double* bvec, ** dbvec; + double* blist; + double** dblist; double** rij; int* inside; double* wj; @@ -73,31 +73,17 @@ public: void grow_rij(int); int twojmax, diagonalstyle; - double*** uarraytot_r, *** uarraytot_i; - double***** zarray_r, ***** zarray_i; - double*** yarray_r, *** yarray_i; - double*** uarray_r, *** uarray_i; private: double rmin0, rfac0; - // use indexlist instead of loops, constructor generates these + // data for bispectrum coefficients SNA_ZINDICES* idxz; SNA_BINDICES* idxb; int idxcg_max, idxu_max, idxz_max, idxb_max; - // data for bispectrum coefficients - - double***** cgarray; double** rootpqarray; - double*** barray; - - // derivatives of data - - double**** duarray_r, **** duarray_i; - double**** dbarray; - double* cglist; int*** idxcg_block; @@ -121,9 +107,6 @@ private: void destroy_twojmax_arrays(); void init_clebsch_gordan(); void init_rootpqarray(); - void jtostr(char*, int); - void mtostr(char*, int, int); - void print_clebsch_gordan(FILE*); void zero_uarraytot(); void addself_uarraytot(double); void add_uarraytot(double, double, double); From 7a33d1e328d71e339a709f7eb89da09348db2d73 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Wed, 12 Jun 2019 11:36:42 -0600 Subject: [PATCH 61/90] Code cleanup --- src/KSPACE/ewald_dipole_spin.cpp | 1 - src/KSPACE/pppm_dipole_spin.cpp | 5 ----- src/SPIN/fix_nve_spin.cpp | 8 -------- 3 files changed, 14 deletions(-) diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index dea563eb99..698203c85c 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -53,7 +53,6 @@ EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp) : mub = 9.274e-4; // in A.Ang^2 mu_0 = 785.15; // in eV/Ang/A^2 mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 - //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index cee879422c..878d40c82e 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -72,8 +72,6 @@ PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp) : mub = 9.274e-4; // in A.Ang^2 mu_0 = 785.15; // in eV/Ang/A^2 mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 - //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } @@ -107,9 +105,6 @@ void PPPMDipoleSpin::init() // error check spinflag = atom->sp?1:0; - //qsum_qsq(0); // q[i] is probably not declared ? - //if (spinflag && q2) - // error->all(FLERR,"Cannot use charges with Kspace style PPPMDipoleSpin"); triclinic_check(); diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 0d72261ad8..595ddb0cc2 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -305,13 +305,6 @@ void FixNVESpin::initial_integrate(int /*vflag*/) } } - // update fm_kspace if long-range - // remove short-range comp. of fm_kspace - - if (long_spin_flag) { - - } - // update half s for all atoms if (sector_flag) { // sectoring seq. update @@ -451,7 +444,6 @@ void FixNVESpin::ComputeInteractionsSpin(int i) double **sp = atom->sp; double **fm = atom->fm; - //double **fm_long = atom->fm_long; // force computation for spin i From a973700295d264b09503728f805d451c054470da Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Wed, 12 Jun 2019 16:42:28 -0600 Subject: [PATCH 62/90] Completed back-porting of Zombie SNAP improvements, particularly noteworthy is reduction in memory footprint, elimination of most multidimensional arrays, elimination of diagonal_style, elimination of Z array in force calculation. --- doc/src/compute_sna_atom.txt | 39 ++++++--------- doc/src/pair_snap.txt | 8 +-- potentials/Ta06A.snapparam | 1 - potentials/W_2940_2017_2.snapparam | 1 - src/SNAP/compute_sna_atom.cpp | 19 ++----- src/SNAP/compute_sna_atom.h | 2 +- src/SNAP/compute_snad_atom.cpp | 21 +++----- src/SNAP/compute_snad_atom.h | 2 +- src/SNAP/compute_snav_atom.cpp | 21 ++------ src/SNAP/compute_snav_atom.h | 2 +- src/SNAP/pair_snap.cpp | 75 +++++++++++++++++----------- src/SNAP/pair_snap.h | 4 +- src/SNAP/sna.cpp | 80 +++++++++++++++--------------- src/SNAP/sna.h | 9 ++-- 14 files changed, 130 insertions(+), 154 deletions(-) diff --git a/doc/src/compute_sna_atom.txt b/doc/src/compute_sna_atom.txt index efbf2e9ea3..10e68f5698 100644 --- a/doc/src/compute_sna_atom.txt +++ b/doc/src/compute_sna_atom.txt @@ -24,12 +24,8 @@ twojmax = band limit for bispectrum components (non-negative integer) :l R_1, R_2,... = list of cutoff radii, one for each type (distance units) :l w_1, w_2,... = list of neighbor weights, one for each type :l zero or more keyword/value pairs may be appended :l -keyword = {diagonal} or {rmin0} or {switchflag} or {bzeroflag} or {quadraticflag} :l - {diagonal} value = {0} or {1} or {2} or {3} - {0} = all j1, j2, j <= twojmax, j2 <= j1 - {1} = subset satisfying j1 == j2 - {2} = subset satisfying j1 == j2 == j3 - {3} = subset satisfying j2 <= j1 <= j +keyword = {rmin0} or {switchflag} or {bzeroflag} or {quadraticflag} :l +// {3} = subset satisfying j2 <= j1 <= j {rmin0} value = parameter in distance to angle conversion (distance units) {switchflag} value = {0} or {1} {0} = do not use switching function @@ -44,7 +40,7 @@ keyword = {diagonal} or {rmin0} or {switchflag} or {bzeroflag} or {quadraticflag [Examples:] -compute b all sna/atom 1.4 0.99363 6 2.0 2.4 0.75 1.0 diagonal 3 rmin0 0.0 +compute b all sna/atom 1.4 0.99363 6 2.0 2.4 0.75 1.0 rmin0 0.0 compute db all sna/atom 1.4 0.95 6 2.0 1.0 compute vb all sna/atom 1.4 0.95 6 2.0 1.0 :pre @@ -151,7 +147,7 @@ The argument {rfac0} and the optional keyword {rmin0} define the linear mapping from radial distance to polar angle {theta0} on the 3-sphere. -The argument {twojmax} and the keyword {diagonal} define which +The argument {twojmax} defines which bispectrum components are generated. See section below on output for a detailed explanation of the number of bispectrum components and the ordered in which they are listed. @@ -192,25 +188,20 @@ command that includes all pairs in the neighbor list. Compute {sna/atom} calculates a per-atom array, each column corresponding to a particular bispectrum component. The total number of columns and the identity of the bispectrum component contained in -each column depend on the values of {twojmax} and {diagonal}, as +each column depend of the value of {twojmax}, as described by the following piece of python code: for j1 in range(0,twojmax+1): - if(diagonal==2): - print j1/2.,j1/2.,j1/2. - elif(diagonal==1): - for j in range(0,min(twojmax,2*j1)+1,2): - print j1/2.,j1/2.,j/2. - elif(diagonal==0): - for j2 in range(0,j1+1): - for j in range(j1-j2,min(twojmax,j1+j2)+1,2): - print j1/2.,j2/2.,j/2. - elif(diagonal==3): - for j2 in range(0,j1+1): - for j in range(j1-j2,min(twojmax,j1+j2)+1,2): - if (j>=j1): print j1/2.,j2/2.,j/2. :pre + for j2 in range(0,j1+1): + for j in range(j1-j2,min(twojmax,j1+j2)+1,2): + if (j>=j1): print j1/2.,j2/2.,j/2. :pre -Compute {snad/atom} evaluates a per-atom array. The columns are +NOTE: the {diagonal} keyword allowing other possible choices +for the number of bispectrum components was removed in 2019, +since all potentials use the value of 3, corresponding to the +above set of bispectrum components. + +ompute {snad/atom} evaluates a per-atom array. The columns are arranged into {ntypes} blocks, listed in order of atom type {I}. Each block contains three sub-blocks corresponding to the {x}, {y}, and {z} components of the atom position. Each of these sub-blocks contains @@ -259,7 +250,7 @@ package"_Build_package.html doc page for more info. [Default:] -The optional keyword defaults are {diagonal} = 0, {rmin0} = 0, +The optional keyword defaults are {rmin0} = 0, {switchflag} = 1, {bzeroflag} = 1, {quadraticflag} = 0, :line diff --git a/doc/src/pair_snap.txt b/doc/src/pair_snap.txt index a796cfdeba..1fba74a188 100644 --- a/doc/src/pair_snap.txt +++ b/doc/src/pair_snap.txt @@ -38,7 +38,7 @@ where {B_k^i} is the {k}-th bispectrum component of atom {i}, and {beta_k^alpha_i} is the corresponding linear coefficient that depends on {alpha_i}, the SNAP element of atom {i}. The number of bispectrum components used and their definitions -depend on the values of {twojmax} and {diagonalstyle} +depend on the value of {twojmax} defined in the SNAP parameter file described below. The bispectrum calculation is described in more detail in "compute sna/atom"_compute_sna_atom.html. @@ -125,14 +125,13 @@ This line is followed by {ncoeff} coefficients, one per line. The SNAP parameter file can contain blank and comment lines (start with #) anywhere. Each non-blank non-comment line must contain one keyword/value pair. The required keywords are {rcutfac} and -{twojmax}. Optional keywords are {rfac0}, {rmin0}, {diagonalstyle}, +{twojmax}. Optional keywords are {rfac0}, {rmin0}, {switchflag}, and {bzeroflag}. The default values for these keywords are {rfac0} = 0.99363 {rmin0} = 0.0 -{diagonalstyle} = 3 {switchflag} = 0 {bzeroflag} = 1 {quadraticflag} = 1 :ul @@ -144,6 +143,9 @@ If {quadraticflag} is set to 1, then the SNAP energy expression includes the qua The SNAP element file should contain {K}({K}+1)/2 additional coefficients for each element, the upper-triangular elements of alpha. +NOTE: The previously used {diagonalstyle} keyword was removed in 2019, +since all known SNAP potentials use the default value of 3. + :line [Mixing, shift, table, tail correction, restart, rRESPA info]: diff --git a/potentials/Ta06A.snapparam b/potentials/Ta06A.snapparam index 283629d658..629d96d708 100644 --- a/potentials/Ta06A.snapparam +++ b/potentials/Ta06A.snapparam @@ -10,6 +10,5 @@ twojmax 6 rfac0 0.99363 rmin0 0 -diagonalstyle 3 bzeroflag 0 quadraticflag 0 diff --git a/potentials/W_2940_2017_2.snapparam b/potentials/W_2940_2017_2.snapparam index 27ab61a266..49f3094d08 100644 --- a/potentials/W_2940_2017_2.snapparam +++ b/potentials/W_2940_2017_2.snapparam @@ -8,6 +8,5 @@ twojmax 8 rfac0 0.99363 rmin0 0 -diagonalstyle 3 bzeroflag 0 quadraticflag 0 diff --git a/src/SNAP/compute_sna_atom.cpp b/src/SNAP/compute_sna_atom.cpp index fea37faca0..cc7a84281e 100644 --- a/src/SNAP/compute_sna_atom.cpp +++ b/src/SNAP/compute_sna_atom.cpp @@ -44,7 +44,6 @@ ComputeSNAAtom::ComputeSNAAtom(LAMMPS *lmp, int narg, char **arg) : // default values - diagonalstyle = 0; rmin0 = 0.0; switchflag = 1; bzeroflag = 1; @@ -84,14 +83,7 @@ ComputeSNAAtom::ComputeSNAAtom(LAMMPS *lmp, int narg, char **arg) : int iarg = nargmin; while (iarg < narg) { - if (strcmp(arg[iarg],"diagonal") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal compute sna/atom command"); - diagonalstyle = atoi(arg[iarg+1]); - if (diagonalstyle < 0 || diagonalstyle > 3) - error->all(FLERR,"Illegal compute sna/atom command"); - iarg += 2; - } else if (strcmp(arg[iarg],"rmin0") == 0) { + if (strcmp(arg[iarg],"rmin0") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal compute sna/atom command"); rmin0 = atof(arg[iarg+1]); @@ -114,7 +106,7 @@ ComputeSNAAtom::ComputeSNAAtom(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal compute sna/atom command"); } - snaptr = new SNA(lmp,rfac0,twojmax,diagonalstyle, + snaptr = new SNA(lmp,rfac0,twojmax, rmin0,switchflag,bzeroflag); ncoeff = snaptr->ncoeff; @@ -123,7 +115,6 @@ ComputeSNAAtom::ComputeSNAAtom(LAMMPS *lmp, int narg, char **arg) : peratom_flag = 1; nmax = 0; - njmax = 0; sna = NULL; } @@ -277,9 +268,9 @@ void ComputeSNAAtom::compute_peratom() double ComputeSNAAtom::memory_usage() { - double bytes = nmax*size_peratom_cols * sizeof(double); - bytes += 3*njmax*sizeof(double); - bytes += njmax*sizeof(int); + double bytes = nmax*size_peratom_cols * sizeof(double); // sna + bytes += snaptr->memory_usage(); // SNA object + return bytes; } diff --git a/src/SNAP/compute_sna_atom.h b/src/SNAP/compute_sna_atom.h index 56ffccfa7e..105a62a37a 100644 --- a/src/SNAP/compute_sna_atom.h +++ b/src/SNAP/compute_sna_atom.h @@ -34,7 +34,7 @@ class ComputeSNAAtom : public Compute { double memory_usage(); private: - int nmax, njmax, diagonalstyle; + int nmax; int ncoeff; double **cutsq; class NeighList *list; diff --git a/src/SNAP/compute_snad_atom.cpp b/src/SNAP/compute_snad_atom.cpp index 156380eccc..37587a0aae 100644 --- a/src/SNAP/compute_snad_atom.cpp +++ b/src/SNAP/compute_snad_atom.cpp @@ -44,7 +44,6 @@ ComputeSNADAtom::ComputeSNADAtom(LAMMPS *lmp, int narg, char **arg) : // default values - diagonalstyle = 0; rmin0 = 0.0; switchflag = 1; bzeroflag = 1; @@ -82,14 +81,7 @@ ComputeSNADAtom::ComputeSNADAtom(LAMMPS *lmp, int narg, char **arg) : int iarg = nargmin; while (iarg < narg) { - if (strcmp(arg[iarg],"diagonal") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal compute snad/atom command"); - diagonalstyle = atof(arg[iarg+1]); - if (diagonalstyle < 0 || diagonalstyle > 3) - error->all(FLERR,"Illegal compute snad/atom command"); - iarg += 2; - } else if (strcmp(arg[iarg],"rmin0") == 0) { + if (strcmp(arg[iarg],"rmin0") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal compute snad/atom command"); rmin0 = atof(arg[iarg+1]); @@ -112,7 +104,7 @@ ComputeSNADAtom::ComputeSNADAtom(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal compute snad/atom command"); } - snaptr = new SNA(lmp,rfac0,twojmax,diagonalstyle, + snaptr = new SNA(lmp,rfac0,twojmax, rmin0,switchflag,bzeroflag); ncoeff = snaptr->ncoeff; @@ -125,7 +117,6 @@ ComputeSNADAtom::ComputeSNADAtom(LAMMPS *lmp, int narg, char **arg) : peratom_flag = 1; nmax = 0; - njmax = 0; snad = NULL; } @@ -378,9 +369,9 @@ void ComputeSNADAtom::unpack_reverse_comm(int n, int *list, double *buf) double ComputeSNADAtom::memory_usage() { - double bytes = nmax*size_peratom_cols * sizeof(double); - bytes += 3*njmax*sizeof(double); - bytes += njmax*sizeof(int); - bytes += 3*nperdim*atom->ntypes; + + double bytes = nmax*size_peratom_cols * sizeof(double); // snad + bytes += snaptr->memory_usage(); // SNA object + return bytes; } diff --git a/src/SNAP/compute_snad_atom.h b/src/SNAP/compute_snad_atom.h index 1fcf540d7c..ac353d8553 100644 --- a/src/SNAP/compute_snad_atom.h +++ b/src/SNAP/compute_snad_atom.h @@ -36,7 +36,7 @@ class ComputeSNADAtom : public Compute { double memory_usage(); private: - int nmax, njmax, diagonalstyle; + int nmax; int ncoeff, nperdim, yoffset, zoffset; double **cutsq; class NeighList *list; diff --git a/src/SNAP/compute_snav_atom.cpp b/src/SNAP/compute_snav_atom.cpp index 6caff0820c..1f702496ed 100644 --- a/src/SNAP/compute_snav_atom.cpp +++ b/src/SNAP/compute_snav_atom.cpp @@ -44,7 +44,6 @@ ComputeSNAVAtom::ComputeSNAVAtom(LAMMPS *lmp, int narg, char **arg) : // default values - diagonalstyle = 0; rmin0 = 0.0; switchflag = 1; bzeroflag = 1; @@ -78,14 +77,7 @@ ComputeSNAVAtom::ComputeSNAVAtom(LAMMPS *lmp, int narg, char **arg) : int iarg = nargmin; while (iarg < narg) { - if (strcmp(arg[iarg],"diagonal") == 0) { - if (iarg+2 > narg) - error->all(FLERR,"Illegal compute snav/atom command"); - diagonalstyle = atof(arg[iarg+1]); - if (diagonalstyle < 0 || diagonalstyle > 3) - error->all(FLERR,"Illegal compute snav/atom command"); - iarg += 2; - } else if (strcmp(arg[iarg],"rmin0") == 0) { + if (strcmp(arg[iarg],"rmin0") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal compute snav/atom command"); rmin0 = atof(arg[iarg+1]); @@ -108,7 +100,7 @@ ComputeSNAVAtom::ComputeSNAVAtom(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal compute snav/atom command"); } - snaptr = new SNA(lmp,rfac0,twojmax,diagonalstyle, + snaptr = new SNA(lmp,rfac0,twojmax, rmin0,switchflag,bzeroflag); ncoeff = snaptr->ncoeff; @@ -119,7 +111,6 @@ ComputeSNAVAtom::ComputeSNAVAtom(LAMMPS *lmp, int narg, char **arg) : peratom_flag = 1; nmax = 0; - njmax = 0; snav = NULL; } @@ -389,10 +380,8 @@ void ComputeSNAVAtom::unpack_reverse_comm(int n, int *list, double *buf) double ComputeSNAVAtom::memory_usage() { - double bytes = nmax*size_peratom_cols * sizeof(double); - bytes += 3*njmax*sizeof(double); - bytes += njmax*sizeof(int); - bytes += 6*nperdim*atom->ntypes; - if (quadraticflag) bytes += 6*nperdim*atom->ntypes; + double bytes = nmax*size_peratom_cols * sizeof(double); // snav + bytes += snaptr->memory_usage(); // SNA object + return bytes; } diff --git a/src/SNAP/compute_snav_atom.h b/src/SNAP/compute_snav_atom.h index 6bcce346e0..9df17cc667 100644 --- a/src/SNAP/compute_snav_atom.h +++ b/src/SNAP/compute_snav_atom.h @@ -36,7 +36,7 @@ class ComputeSNAVAtom : public Compute { double memory_usage(); private: - int nmax, njmax, diagonalstyle; + int nmax; int ncoeff, nperdim; double **cutsq; class NeighList *list; diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 6a65f872fd..6eb05f85a4 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -34,10 +34,6 @@ using namespace LAMMPS_NS; #define MAXLINE 1024 #define MAXWORD 3 -// Outstanding issues with quadratic term -// 1. there seems to a problem with compute_optimized energy calc -// it does not match compute_regular, even when quadratic coeffs = 0 - /* ---------------------------------------------------------------------- */ PairSNAP::PairSNAP(LAMMPS *lmp) : Pair(lmp) @@ -53,8 +49,6 @@ PairSNAP::PairSNAP(LAMMPS *lmp) : Pair(lmp) wjelem = NULL; coeffelem = NULL; - nmax = 0; - beta_max = 0; beta = NULL; bispectrum = NULL; @@ -74,6 +68,7 @@ PairSNAP::~PairSNAP() memory->destroy(wjelem); memory->destroy(coeffelem); } + memory->destroy(beta); memory->destroy(bispectrum); @@ -115,7 +110,8 @@ void PairSNAP::compute(int eflag, int vflag) // compute dE_i/dB_i = beta_i for all i in list - compute_bispectrum(); + if (quadraticflag || eflag) + compute_bispectrum(); compute_beta(); numneigh = list->numneigh; @@ -209,15 +205,25 @@ void PairSNAP::compute(int eflag, int vflag) evdwl = coeffi[0]; // E = beta.B + 0.5*B^t.alpha.B - // coeff[k] = beta[k-1] or - // coeff[k] = alpha_ii or - // coeff[k] = alpha_ij = alpha_ji, j != i // linear contributions - for (int k = 0; k < ncoeff; k++) - evdwl += beta[ii][k]*bispectrum[ii][k]; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) + evdwl += coeffi[icoeff+1]*bispectrum[ii][icoeff]; + // quadratic contributions + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = bispectrum[ii][icoeff]; + evdwl += 0.5*coeffi[k++]*bveci*bveci; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + double bvecj = bispectrum[ii][jcoeff]; + evdwl += coeffi[k++]*bveci*bvecj; + } + } + } ev_tally_full(i,2.0*evdwl,0.0,0.0,0.0,0.0,0.0); } @@ -241,8 +247,23 @@ void PairSNAP::compute_beta() const int ielem = map[itype]; double* coeffi = coeffelem[ielem]; - for (int k = 1; k <= ncoeff; k++) - beta[ii][k-1] = coeffi[k]; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) + beta[ii][icoeff] = coeffi[icoeff+1]; + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = bispectrum[ii][icoeff]; + beta[ii][icoeff] += coeffi[k]*bveci; + k++; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + double bvecj = bispectrum[ii][jcoeff]; + beta[ii][icoeff] += coeffi[k]*bvecj; + beta[ii][jcoeff] += coeffi[k]*bveci; + k++; + } + } + } } } @@ -308,8 +329,8 @@ void PairSNAP::compute_bispectrum() snaptr->compute_zi(); snaptr->compute_bi(); - for (int k = 0; k < ncoeff; k++) - bispectrum[ii][k] = snaptr->blist[k]; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) + bispectrum[ii][icoeff] = snaptr->blist[icoeff]; } } @@ -354,8 +375,6 @@ void PairSNAP::coeff(int narg, char **arg) memory->destroy(wjelem); memory->destroy(coeffelem); } - memory->destroy(beta); - memory->destroy(bispectrum); char* type1 = arg[0]; char* type2 = arg[1]; @@ -425,9 +444,7 @@ void PairSNAP::coeff(int narg, char **arg) if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); snaptr = new SNA(lmp,rfac0,twojmax, - diagonalstyle, rmin0,switchflag,bzeroflag); - snaptr->grow_rij(nmax); if (ncoeff != snaptr->ncoeff) { if (comm->me == 0) @@ -617,7 +634,6 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) rfac0 = 0.99363; rmin0 = 0.0; - diagonalstyle = 3; switchflag = 1; bzeroflag = 1; quadraticflag = 0; @@ -678,8 +694,6 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) rfac0 = atof(keyval); else if (strcmp(keywd,"rmin0") == 0) rmin0 = atof(keyval); - else if (strcmp(keywd,"diagonalstyle") == 0) - diagonalstyle = atoi(keyval); else if (strcmp(keywd,"switchflag") == 0) switchflag = atoi(keyval); else if (strcmp(keywd,"bzeroflag") == 0) @@ -702,13 +716,16 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) double PairSNAP::memory_usage() { double bytes = Pair::memory_usage(); + int n = atom->ntypes+1; - bytes += n*n*sizeof(int); - bytes += n*n*sizeof(double); - bytes += 3*nmax*sizeof(double); - bytes += nmax*sizeof(int); - bytes += (2*ncoeffall)*sizeof(double); - bytes += (ncoeff*3)*sizeof(double); + bytes += n*n*sizeof(int); // setflag + bytes += n*n*sizeof(double); // cutsq + bytes += n*sizeof(int); // map + bytes += beta_max*ncoeff*sizeof(double); // bispectrum + bytes += beta_max*ncoeff*sizeof(double); // beta + + bytes += snaptr->memory_usage(); // SNA object + return bytes; } diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h index b5871c1527..c64eaa5d4e 100644 --- a/src/SNAP/pair_snap.h +++ b/src/SNAP/pair_snap.h @@ -40,9 +40,7 @@ public: protected: int ncoeffq, ncoeffall; - double **bvec, ***dbvec; class SNA* snaptr; - int nmax; virtual void allocate(); void read_files(char *, char *); inline int equal(double* x,double* y); @@ -60,7 +58,7 @@ protected: double** beta; // betas for all atoms in list double** bispectrum; // bispectrum components for all atoms in list int *map; // mapping from atom types to elements - int twojmax, diagonalstyle, switchflag, bzeroflag; + int twojmax, switchflag, bzeroflag; double rfac0, rmin0, wj1, wj2; int rcutfacflag, twojmaxflag; // flags for required parameters int beta_max; // length of beta diff --git a/src/SNAP/sna.cpp b/src/SNAP/sna.cpp index 131ac48fdb..75601b8e17 100644 --- a/src/SNAP/sna.cpp +++ b/src/SNAP/sna.cpp @@ -113,7 +113,7 @@ using namespace MathConst; ------------------------------------------------------------------------- */ SNA::SNA(LAMMPS* lmp, double rfac0_in, - int twojmax_in, int diagonalstyle_in, + int twojmax_in, double rmin0_in, int switch_flag_in, int bzero_flag_in) : Pointers(lmp) { wself = 1.0; @@ -124,21 +124,16 @@ SNA::SNA(LAMMPS* lmp, double rfac0_in, bzero_flag = bzero_flag_in; twojmax = twojmax_in; - diagonalstyle = diagonalstyle_in; ncoeff = compute_ncoeff(); - bvec = NULL; - dbvec = NULL; - memory->create(bvec, ncoeff, "pair:bvec"); - memory->create(dbvec, ncoeff, 3, "pair:dbvec"); rij = NULL; inside = NULL; wj = NULL; rcutij = NULL; nmax = 0; idxz = NULL; - idxb= NULL; + idxb = NULL; build_indexlist(); create_twojmax_arrays(); @@ -159,8 +154,6 @@ SNA::~SNA() memory->destroy(inside); memory->destroy(wj); memory->destroy(rcutij); - memory->destroy(bvec); - memory->destroy(dbvec); delete[] idxz; delete[] idxb; destroy_twojmax_arrays(); @@ -168,8 +161,6 @@ SNA::~SNA() void SNA::build_indexlist() { - if(diagonalstyle != 3) - error->all(FLERR, "diagonal_style must be 3\n"); // index list for cglist @@ -180,7 +171,7 @@ void SNA::build_indexlist() int idxcg_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { idxcg_block[j1][j2][j] = idxcg_count; for (int m1 = 0; m1 <= j1; m1++) for (int m2 = 0; m2 <= j2; m2++) @@ -209,7 +200,7 @@ void SNA::build_indexlist() int idxb_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) + for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) if (j >= j1) idxb_count++; idxb_max = idxb_count; @@ -218,7 +209,7 @@ void SNA::build_indexlist() idxb_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) + for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) if (j >= j1) { idxb[idxb_count].j1 = j1; idxb[idxb_count].j2 = j2; @@ -233,7 +224,7 @@ void SNA::build_indexlist() idxb_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { if (j >= j1) { idxb_block[j1][j2][j] = idxb_count; idxb_count++; @@ -246,7 +237,7 @@ void SNA::build_indexlist() for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) + for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) for (int mb = 0; 2*mb <= j; mb++) for (int ma = 0; ma <= j; ma++) idxz_count++; @@ -260,7 +251,7 @@ void SNA::build_indexlist() idxz_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { idxz_block[j1][j2][j] = idxz_count; // find right beta[jjb] entry @@ -288,6 +279,7 @@ void SNA::build_indexlist() } } } + /* ---------------------------------------------------------------------- */ void SNA::init() @@ -312,6 +304,7 @@ void SNA::grow_rij(int newnmax) memory->create(wj, nmax, "pair:wj"); memory->create(rcutij, nmax, "pair:rcutij"); } + /* ---------------------------------------------------------------------- compute Ui by summing over neighbors j ------------------------------------------------------------------------- */ @@ -401,12 +394,6 @@ void SNA::compute_zi() icgb += j2; } // end loop over ib -// // apply symmetry factor - -// const double jfac = 1.0/(j+1); -// zlist_r[jjz] *= jfac; -// zlist_i[jjz] *= jfac; - } // end loop over jjz } @@ -631,6 +618,11 @@ void SNA::compute_bi() } // end if jeven blist[jjb] = 2.0*sumzu; + + // apply bzero shift + + if (bzero_flag) + blist[jjb] -= bzero[j]; } } @@ -1186,25 +1178,38 @@ double SNA::memory_usage() int jdimpq = twojmax + 2; int jdim = twojmax + 1; double bytes; - bytes = ncoeff * sizeof(double); // coeff + + bytes = 0; bytes += jdimpq*jdimpq * sizeof(double); // pqarray bytes += idxcg_max * sizeof(double); // cglist - bytes += jdim * jdim * jdim * sizeof(int); // idxcg_block bytes += idxu_max * sizeof(double) * 2; // ulist bytes += idxu_max * sizeof(double) * 2; // ulisttot bytes += idxu_max * 3 * sizeof(double) * 2; // dulist - bytes += jdim * sizeof(int); // idxu_block - bytes += idxz_max * 9 * sizeof(int); // idxz bytes += idxz_max * sizeof(double) * 2; // zlist - bytes += jdim * jdim * jdim * sizeof(int); // idxz_block - + bytes += idxb_max * sizeof(double); // blist + bytes += idxb_max * 3 * sizeof(double); // dblist bytes += idxu_max * sizeof(double) * 2; // ylist - bytes += idxb_max * 3 * sizeof(int); // idxb - bytes += jdim * jdim * jdim * sizeof(int); // idxb_block + bytes += jdim * jdim * jdim * sizeof(int); // idxcg_block + bytes += jdim * sizeof(int); // idxu_block + bytes += jdim * jdim * jdim * sizeof(int); // idxz_block + bytes += jdim * jdim * jdim * sizeof(int); // idxb_block + + bytes += idxz_max * sizeof(SNA_ZINDICES); // idxz + bytes += idxb_max * sizeof(SNA_BINDICES); // idxb + + bytes += jdim * sizeof(double); // bzero + + bytes += nmax * 3 * sizeof(double); // rij + bytes += nmax * sizeof(int); // inside + bytes += nmax * sizeof(double); // wj + bytes += nmax * sizeof(double); // rcutij + + printf("SNAP Z list Memory Usage %d\n",idxz_max * sizeof(double) * 2); + printf("SNAP CG list Memory Usage %d\n",idxcg_max * sizeof(double)); return bytes; } @@ -1242,25 +1247,22 @@ void SNA::destroy_twojmax_arrays() { memory->destroy(rootpqarray); memory->destroy(cglist); - memory->destroy(idxcg_block); - memory->destroy(ulist_r); memory->destroy(ulist_i); memory->destroy(ulisttot_r); memory->destroy(ulisttot_i); memory->destroy(dulist_r); memory->destroy(dulist_i); - memory->destroy(idxu_block); - memory->destroy(zlist_r); memory->destroy(zlist_i); memory->destroy(blist); memory->destroy(dblist); - memory->destroy(idxz_block); - memory->destroy(ylist_r); memory->destroy(ylist_i); + memory->destroy(idxcg_block); + memory->destroy(idxu_block); + memory->destroy(idxz_block); memory->destroy(idxb_block); if (bzero_flag) @@ -1484,7 +1486,7 @@ void SNA::init_clebsch_gordan() int idxcg_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { for (int m1 = 0; m1 <= j1; m1++) { aa2 = 2 * m1 - j1; @@ -1557,7 +1559,7 @@ int SNA::compute_ncoeff() for (int j1 = 0; j1 <= twojmax; j1++) for (int j2 = 0; j2 <= j1; j2++) - for (int j = abs(j1 - j2); + for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) if (j >= j1) ncount++; diff --git a/src/SNAP/sna.h b/src/SNAP/sna.h index b54ad3482a..1e08ef123c 100644 --- a/src/SNAP/sna.h +++ b/src/SNAP/sna.h @@ -18,9 +18,7 @@ #ifndef LMP_SNA_H #define LMP_SNA_H -#include #include "pointers.h" -#include namespace LAMMPS_NS { @@ -35,7 +33,7 @@ struct SNA_BINDICES { class SNA : protected Pointers { public: - SNA(LAMMPS*, double, int, int, double, int, int); + SNA(LAMMPS*, double, int, double, int, int); SNA(LAMMPS* lmp) : Pointers(lmp) {}; ~SNA(); @@ -61,7 +59,6 @@ public: double compute_sfac(double, double); double compute_dsfac(double, double); - double* bvec, ** dbvec; double* blist; double** dblist; double** rij; @@ -72,7 +69,7 @@ public: void grow_rij(int); - int twojmax, diagonalstyle; + int twojmax; private: double rmin0, rfac0; @@ -126,7 +123,7 @@ private: double wself; int bzero_flag; // 1 if bzero subtracted from barray - double *bzero; // array of B values for isolated atoms + double* bzero; // array of B values for isolated atoms }; } From 3f523ea906a417232a7be1e8d64778fef41041d0 Mon Sep 17 00:00:00 2001 From: athomps Date: Wed, 12 Jun 2019 17:02:59 -0600 Subject: [PATCH 63/90] Not part of this pull request --- examples/snap/W.nnsnap | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 examples/snap/W.nnsnap diff --git a/examples/snap/W.nnsnap b/examples/snap/W.nnsnap deleted file mode 100644 index 6ca97a701a..0000000000 --- a/examples/snap/W.nnsnap +++ /dev/null @@ -1,16 +0,0 @@ -# DATE: 2017-02-20 CONTRIBUTOR: Mitchell Wood mitwood@sandia.gov CITATION: Wood, M. A. and Thompson, A. P. "Quantum-Accurate Molecular Dynamics Potential for Tungsten" arXiv:1702.07042 [physics.comp-ph] -# -# Definition of SNAP+ZBL potential. -variable zblcutinner equal 4 -variable zblcutouter equal 4.8 -variable zblz equal 74 - -# Specify hybrid with SNAP and ZBL - -pair_style hybrid/overlay & -zbl ${zblcutinner} ${zblcutouter} & -nn/snap -pair_coeff 1 1 zbl ${zblz} ${zblz} -pair_coeff * * nn/snap W_2940_2017_2.snapcoeff W_2940_2017_2.snapparam W - -#Nomenclature on the snap files are Element_DakotaID_Year_Month From f8e257d21967470b0e4c6e47bd3830a3192e871a Mon Sep 17 00:00:00 2001 From: athomps Date: Wed, 12 Jun 2019 17:04:05 -0600 Subject: [PATCH 64/90] Not part of this pull request --- src/SNAP/pair_nn_snap.cpp | 1824 ------------------------------------- 1 file changed, 1824 deletions(-) delete mode 100644 src/SNAP/pair_nn_snap.cpp diff --git a/src/SNAP/pair_nn_snap.cpp b/src/SNAP/pair_nn_snap.cpp deleted file mode 100644 index e90f6d6b1b..0000000000 --- a/src/SNAP/pair_nn_snap.cpp +++ /dev/null @@ -1,1824 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#include -#include -#include -#include "pair_nn_snap.h" -#include "atom.h" -#include "atom_vec.h" -#include "force.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "sna.h" -#include "openmp_snap.h" -#include "domain.h" -#include "memory.h" -#include "error.h" - -#include - -using namespace LAMMPS_NS; - -#define MAXLINE 1024 -#define MAXWORD 3 - -// Outstanding issues with quadratic term -// 1. there seems to a problem with compute_optimized energy calc -// it does not match compute_regular, even when quadratic coeffs = 0 - -/* ---------------------------------------------------------------------- */ - -PairNNSNAP::PairNNSNAP(LAMMPS *lmp) : Pair(lmp) -{ - single_enable = 0; - restartinfo = 0; - one_coeff = 1; - manybody_flag = 1; - - nelements = 0; - elements = NULL; - radelem = NULL; - wjelem = NULL; - coeffelem = NULL; - - nmax = 0; - nthreads = 1; - - schedule_user = 0; - schedule_time_guided = -1; - schedule_time_dynamic = -1; - ncalls_neigh =-1; - - ilistmask_max = 0; - ilistmask = NULL; - ghostinum = 0; - ghostilist_max = 0; - ghostilist = NULL; - ghostnumneigh_max = 0; - ghostnumneigh = NULL; - ghostneighs = NULL; - ghostfirstneigh = NULL; - ghostneighs_total = 0; - ghostneighs_max = 0; - - i_max = 0; - i_neighmax = 0; - i_numpairs = 0; - i_rij = NULL; - i_inside = NULL; - i_wj = NULL; - i_rcutij = NULL; - i_ninside = NULL; - i_pairs = NULL; - i_uarraytot_r = NULL; - i_uarraytot_i = NULL; - i_zarray_r = NULL; - i_zarray_i = NULL; - - use_shared_arrays = 0; - -#ifdef TIMING_INFO - timers[0] = 0; - timers[1] = 0; - timers[2] = 0; - timers[3] = 0; -#endif - - // Need to set this because restart not handled by PairHybrid - - sna = NULL; - - beta_max = 0; -} - -/* ---------------------------------------------------------------------- */ - -PairNNSNAP::~PairNNSNAP() -{ - if (copymode) return; - - if (nelements) { - for (int i = 0; i < nelements; i++) - delete[] elements[i]; - delete[] elements; - memory->destroy(radelem); - memory->destroy(wjelem); - memory->destroy(coeffelem); - memory->destroy(beta); - } - - // Need to set this because restart not handled by PairHybrid - - if (sna) { - -#ifdef TIMING_INFO - double time[5]; - double timeave[5]; - double timeave_mpi[5]; - double timemax_mpi[5]; - - for (int i = 0; i < 5; i++) { - time[i] = 0; - timeave[i] = 0; - for (int tid = 0; tidtimers[i]>time[i]) - time[i] = sna[tid]->timers[i]; - timeave[i] += sna[tid]->timers[i]; - } - timeave[i] /= nthreads; - } - MPI_Reduce(timeave, timeave_mpi, 5, MPI_DOUBLE, MPI_SUM, 0, world); - MPI_Reduce(time, timemax_mpi, 5, MPI_DOUBLE, MPI_MAX, 0, world); -#endif - - for (int tid = 0; tiddestroy(setflag); - memory->destroy(cutsq); - memory->destroy(map); - } - -} - -void PairNNSNAP::compute(int eflag, int vflag) -{ -// if (use_optimized) -// compute_optimized(eflag, vflag); -// else - -// hard-code compute_regular() - - compute_regular(eflag, vflag); -} - -/* ---------------------------------------------------------------------- - This version is a straightforward implementation - ---------------------------------------------------------------------- */ - -void PairNNSNAP::compute_regular(int eflag, int vflag) -{ - int i,j,jnum,ninside; - double delx,dely,delz,evdwl,rsq; - double fij[3]; - int *jlist,*numneigh,**firstneigh; - evdwl = 0.0; - - ev_init(eflag,vflag); - - double **x = atom->x; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - class SNA* snaptr = sna[0]; - - if (beta_max < list->inum) { - memory->grow(beta,list->inum,ncoeff,"PairNNSNAP:beta"); - beta_max = list->inum; - } - - // compute dE_i/dB_i = beta_i for all i in list - - compute_beta(); - - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - for (int ii = 0; ii < list->inum; ii++) { - i = list->ilist[ii]; - - const double xtmp = x[i][0]; - const double ytmp = x[i][1]; - const double ztmp = x[i][2]; - const int itype = type[i]; - const int ielem = map[itype]; - const double radi = radelem[ielem]; - - jlist = firstneigh[i]; - jnum = numneigh[i]; - - // insure rij, inside, wj, and rcutij are of size jnum - - snaptr->grow_rij(jnum); - - // rij[][3] = displacements between atom I and those neighbors - // inside = indices of neighbors of I within cutoff - // wj = weights for neighbors of I within cutoff - // rcutij = cutoffs for neighbors of I within cutoff - // note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi - - ninside = 0; - for (int jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - delx = x[j][0] - xtmp; - dely = x[j][1] - ytmp; - delz = x[j][2] - ztmp; - rsq = delx*delx + dely*dely + delz*delz; - int jtype = type[j]; - int jelem = map[jtype]; - - if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { - snaptr->rij[ninside][0] = delx; - snaptr->rij[ninside][1] = dely; - snaptr->rij[ninside][2] = delz; - snaptr->inside[ninside] = j; - snaptr->wj[ninside] = wjelem[jelem]; - snaptr->rcutij[ninside] = (radi + radelem[jelem])*rcutfac; - ninside++; - } - } - - // compute Ui, Zi, and Bi for atom I - - snaptr->compute_ui(ninside); - snaptr->compute_zi(); - if (quadraticflag) { - snaptr->compute_bi(); - snaptr->copy_bi2bvec(); - } - - // for neighbors of I within cutoff: - // compute Fij = dEi/dRj = -dEi/dRi - // add to Fi, subtract from Fj - - // compute beta_i*Z_i = Y_i - - snaptr->compute_yi(beta[ii]); - - for (int jj = 0; jj < ninside; jj++) { - int j = snaptr->inside[jj]; - snaptr->compute_duidrj(snaptr->rij[jj], - snaptr->wj[jj],snaptr->rcutij[jj]); - -// // quadratic contributions - -// if (quadraticflag) { -// int k = ncoeff+1; -// for (int icoeff = 0; icoeff < ncoeff; icoeff++) { -// double bveci = snaptr->bvec[icoeff]; -// double fack = coeffi[k]*bveci; -// double* dbveci = snaptr->dbvec[icoeff]; -// fij[0] += fack*dbveci[0]; -// fij[1] += fack*dbveci[1]; -// fij[2] += fack*dbveci[2]; -// k++; -// for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { -// double facki = coeffi[k]*bveci; -// double fackj = coeffi[k]*snaptr->bvec[jcoeff]; -// double* dbvecj = snaptr->dbvec[jcoeff]; - -// fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; -// fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; -// fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; -// k++; -// } -// } -// } - - snaptr->compute_deidrj(fij); - - f[i][0] += fij[0]; - f[i][1] += fij[1]; - f[i][2] += fij[2]; - f[j][0] -= fij[0]; - f[j][1] -= fij[1]; - f[j][2] -= fij[2]; - - // tally per-atom virial contribution - - if (vflag) - ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0, - fij[0],fij[1],fij[2], - -snaptr->rij[jj][0],-snaptr->rij[jj][1], - -snaptr->rij[jj][2]); - } - - // tally energy contribution - - if (eflag) { - - // evdwl = energy of atom I, sum over coeffs_k * Bi_k - - double* coeffi = coeffelem[ielem]; - evdwl = coeffi[0]; - if (!quadraticflag) { - snaptr->compute_bi(); - snaptr->copy_bi2bvec(); - } - - // E = beta.B + 0.5*B^t.alpha.B - // coeff[k] = beta[k-1] or - // coeff[k] = alpha_ii or - // coeff[k] = alpha_ij = alpha_ji, j != i - - // linear contributions - - for (int k = 1; k <= ncoeff; k++) - evdwl += coeffi[k]*snaptr->bvec[k-1]; - - // quadratic contributions - - if (quadraticflag) { - int k = ncoeff+1; - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bveci = snaptr->bvec[icoeff]; - evdwl += 0.5*coeffi[k++]*bveci*bveci; - for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - evdwl += coeffi[k++]*bveci*snaptr->bvec[jcoeff]; - } - } - } - ev_tally_full(i,2.0*evdwl,0.0,0.0,0.0,0.0,0.0); - } - - } - - if (vflag_fdotr) virial_fdotr_compute(); -} - - -/* ---------------------------------------------------------------------- - This version is optimized for threading, micro-load balancing - ---------------------------------------------------------------------- */ - -void PairNNSNAP::compute_optimized(int eflag, int vflag) -{ - // if reneighboring took place do load_balance if requested - if (do_load_balance > 0 && - (neighbor->ncalls != ncalls_neigh)) { - ghostinum = 0; - // reset local ghost neighbor lists - ncalls_neigh = neighbor->ncalls; - if (ilistmask_max < list->inum) { - memory->grow(ilistmask,list->inum,"PairSnap::ilistmask"); - ilistmask_max = list->inum; - } - for (int i = 0; i < list->inum; i++) - ilistmask[i] = 1; - - //multiple passes for loadbalancing - for (int i = 0; i < do_load_balance; i++) - load_balance(); - } - - int numpairs = 0; - for (int ii = 0; ii < list->inum; ii++) { - if ((do_load_balance <= 0) || ilistmask[ii]) { - int i = list->ilist[ii]; - int jnum = list->numneigh[i]; - numpairs += jnum; - } - } - - if (do_load_balance) - for (int ii = 0; ii < ghostinum; ii++) { - int i = ghostilist[ii]; - int jnum = ghostnumneigh[i]; - numpairs += jnum; - } - - // optimized schedule setting - - int time_dynamic = 0; - int time_guided = 0; - - if (schedule_user == 0) schedule_user = 4; - - switch (schedule_user) { - case 1: - omp_set_schedule(omp_sched_static,1); - break; - case 2: - omp_set_schedule(omp_sched_dynamic,1); - break; - case 3: - omp_set_schedule(omp_sched_guided,2); - break; - case 4: - omp_set_schedule(omp_sched_auto,0); - break; - case 5: - if (numpairs < 8*nthreads) omp_set_schedule(omp_sched_dynamic,1); - else if (schedule_time_guided < 0.0) { - omp_set_schedule(omp_sched_guided,2); - if (!eflag && !vflag) time_guided = 1; - } else if (schedule_time_dynamic<0.0) { - omp_set_schedule(omp_sched_dynamic,1); - if (!eflag && !vflag) time_dynamic = 1; - } else if (schedule_time_guidedcreate(pairs_tid_unique,numpairs,4,"numpairs"); - pairs = pairs_tid_unique; - } - - if (!use_shared_arrays) { - numpairs = 0; - for (int ii = 0; ii < list->inum; ii++) { - if ((do_load_balance <= 0) || ilistmask[ii]) { - int i = list->ilist[ii]; - int jnum = list->numneigh[i]; - for (int jj = 0; jjx; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - - numneigh = list->numneigh; - firstneigh = list->firstneigh; - -#ifdef TIMING_INFO - // only update micro timers after setup - static int count=0; - if (count<2) { - sna[tid]->timers[0] = 0; - sna[tid]->timers[1] = 0; - sna[tid]->timers[2] = 0; - sna[tid]->timers[3] = 0; - sna[tid]->timers[4] = 0; - } - count++; -#endif - - // did thread start working on interactions of new atom - int iold = -1; - - double starttime, endtime; - if (time_dynamic || time_guided) - starttime = MPI_Wtime(); - -#if defined(_OPENMP) -#pragma omp for schedule(runtime) -#endif - for (int iijj = 0; iijj < numpairs; iijj++) { - int i = 0; - if (use_shared_arrays) { - i = i_pairs[iijj][0]; - if (iold != i) { - set_sna_to_shared(tid,i_pairs[iijj][3]); - ielem = map[type[i]]; - } - iold = i; - } else { - i = pairs[iijj][0]; - if (iold != i) { - iold = i; - const double xtmp = x[i][0]; - const double ytmp = x[i][1]; - const double ztmp = x[i][2]; - const int itype = type[i]; - ielem = map[itype]; - const double radi = radelem[ielem]; - - if (i < nlocal) { - jlist = firstneigh[i]; - jnum = numneigh[i]; - } else { - jlist = ghostneighs+ghostfirstneigh[i]; - jnum = ghostnumneigh[i]; - } - - // insure rij, inside, wj, and rcutij are of size jnum - - sna[tid]->grow_rij(jnum); - - // rij[][3] = displacements between atom I and those neighbors - // inside = indices of neighbors of I within cutoff - // wj = weights of neighbors of I within cutoff - // rcutij = cutoffs of neighbors of I within cutoff - // note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi - - ninside = 0; - for (jj = 0; jj < jnum; jj++) { - int j = jlist[jj]; - j &= NEIGHMASK; - delx = x[j][0] - xtmp; //unitialised - dely = x[j][1] - ytmp; - delz = x[j][2] - ztmp; - rsq = delx*delx + dely*dely + delz*delz; - jtype = type[j]; - int jelem = map[jtype]; - - if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { //unitialised - sna[tid]->rij[ninside][0] = delx; - sna[tid]->rij[ninside][1] = dely; - sna[tid]->rij[ninside][2] = delz; - sna[tid]->inside[ninside] = j; - sna[tid]->wj[ninside] = wjelem[jelem]; - sna[tid]->rcutij[ninside] = (radi + radelem[jelem])*rcutfac; - ninside++; - - // update index list with inside index - pairs[iijj + (jj - pairs[iijj][1])][2] = - ninside-1; //unitialised - } - } - - // compute Ui and Zi for atom I - - sna[tid]->compute_ui(ninside); //unitialised - sna[tid]->compute_zi(); - } - } - if (quadraticflag) { - sna[tid]->compute_bi(); - sna[tid]->copy_bi2bvec(); - } - - // for neighbors of I within cutoff: - // compute dUi/drj and dBi/drj - // Fij = dEi/dRj = -dEi/dRi => add to Fi, subtract from Fj - - // entry into loop if inside index is set - - double* coeffi = coeffelem[ielem]; - - if (pairs[iijj][2] >= 0) { - jj = pairs[iijj][2]; - int j = sna[tid]->inside[jj]; - sna[tid]->compute_duidrj(sna[tid]->rij[jj], - sna[tid]->wj[jj],sna[tid]->rcutij[jj]); - - sna[tid]->compute_dbidrj(); - sna[tid]->copy_dbi2dbvec(); - - fij[0] = 0.0; - fij[1] = 0.0; - fij[2] = 0.0; - - // linear contributions - - for (k = 1; k <= ncoeff; k++) { - double bgb = coeffi[k]; - fij[0] += bgb*sna[tid]->dbvec[k-1][0]; - fij[1] += bgb*sna[tid]->dbvec[k-1][1]; - fij[2] += bgb*sna[tid]->dbvec[k-1][2]; - } - - // quadratic contributions - - if (quadraticflag) { - int k = ncoeff+1; - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bveci = sna[tid]->bvec[icoeff]; - double fack = coeffi[k]*bveci; - double* dbveci = sna[tid]->dbvec[icoeff]; - fij[0] += fack*sna[tid]->dbvec[icoeff][0]; - fij[1] += fack*sna[tid]->dbvec[icoeff][1]; - fij[2] += fack*sna[tid]->dbvec[icoeff][2]; - k++; - for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - double facki = coeffi[k]*bveci; - double fackj = coeffi[k]*sna[tid]->bvec[jcoeff]; - double* dbvecj = sna[tid]->dbvec[jcoeff]; - fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; - fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; - fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; - k++; - } - } - } - -#if defined(_OPENMP) -#pragma omp critical -#endif - { - f[i][0] += fij[0]; - f[i][1] += fij[1]; - f[i][2] += fij[2]; - f[j][0] -= fij[0]; - f[j][1] -= fij[1]; - f[j][2] -= fij[2]; - - // tally per-atom virial contribution - - if (vflag) - ev_tally_xyz(i,j,nlocal,newton_pair,0.0,0.0, - fij[0],fij[1],fij[2], - -sna[tid]->rij[jj][0],-sna[tid]->rij[jj][1], - -sna[tid]->rij[jj][2]); - } - } - - // evdwl = energy of atom I, sum over coeffs_k * Bi_k - // only call this for first pair of each atom i - // if atom has no pairs, eatom=0, which is wrong - - if (eflag&&pairs[iijj][1] == 0) { - evdwl = coeffi[0]; - - if (!quadraticflag) { - sna[tid]->compute_bi(); - sna[tid]->copy_bi2bvec(); - } - - // E = beta.B + 0.5*B^t.alpha.B - // coeff[k] = beta[k-1] or - // coeff[k] = alpha_ii or - // coeff[k] = alpha_ij = alpha_ji, j != i - - // linear contributions - - for (int k = 1; k <= ncoeff; k++) - evdwl += coeffi[k]*sna[tid]->bvec[k-1]; - - // quadratic contributions - - if (quadraticflag) { - int k = ncoeff+1; - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - double bveci = sna[tid]->bvec[icoeff]; - evdwl += 0.5*coeffi[k++]*bveci*bveci; - for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - evdwl += coeffi[k++]*bveci*sna[tid]->bvec[jcoeff]; - } - } - } - -#if defined(_OPENMP) -#pragma omp critical -#endif - ev_tally_full(i,2.0*evdwl,0.0,0.0,0.0,0.0,0.0); - } - - } - if (time_dynamic || time_guided) - endtime = MPI_Wtime(); - if (time_dynamic) schedule_time_dynamic = endtime - starttime; - if (time_guided) schedule_time_guided = endtime - starttime; - if (!use_shared_arrays) memory->destroy(pairs); - - }// end of pragma omp parallel - - if (vflag_fdotr) virial_fdotr_compute(); - -} - -inline int PairNNSNAP::equal(double* x,double* y) -{ - double dist2 = - (x[0]-y[0])*(x[0]-y[0]) + - (x[1]-y[1])*(x[1]-y[1]) + - (x[2]-y[2])*(x[2]-y[2]); - if (dist2 < 1e-20) return 1; - return 0; -} - -inline double PairNNSNAP::dist2(double* x,double* y) -{ - return - (x[0]-y[0])*(x[0]-y[0]) + - (x[1]-y[1])*(x[1]-y[1]) + - (x[2]-y[2])*(x[2]-y[2]); -} - -// return extra communication cutoff -// extra_cutoff = max(subdomain_length) - -double PairNNSNAP::extra_cutoff() -{ - double sublo[3],subhi[3]; - - if (domain->triclinic == 0) { - for (int dim = 0 ; dim < 3 ; dim++) { - sublo[dim] = domain->sublo[dim]; - subhi[dim] = domain->subhi[dim]; - } - } else { - domain->lamda2x(domain->sublo_lamda,sublo); - domain->lamda2x(domain->subhi_lamda,subhi); - } - - double sub_size[3]; - for (int dim = 0; dim < 3; dim++) - sub_size[dim] = subhi[dim] - sublo[dim]; - - double max_sub_size = 0; - for (int dim = 0; dim < 3; dim++) - max_sub_size = MAX(max_sub_size,sub_size[dim]); - - // note: for triclinic, probably need something different - // see Comm::setup() - - return max_sub_size; -} - -// micro load_balancer: each MPI process will -// check with each of its 26 neighbors, -// whether an imbalance exists in the number -// of atoms to calculate forces for. -// If it does it will set ilistmask of one of -// its local atoms to zero, and send its Tag -// to the neighbor process. The neighboring process -// will check its ghost list for the -// ghost atom with the same Tag which is closest -// to its domain center, and build a -// neighborlist for this ghost atom. For this to work, -// the communication cutoff has to be -// as large as the neighbor cutoff + -// maximum subdomain length. - -// Note that at most one atom is exchanged per processor pair. - -// Also note that the local atom assignment -// doesn't change. This load balancer will cause -// some ghost atoms to have full neighborlists -// which are unique to PairNNSNAP. -// They are not part of the generally accessible neighborlist. -// At the same time corresponding local atoms on -// other MPI processes will not be -// included in the force computation since -// their ilistmask is 0. This does not effect -// any other classes which might -// access the same general neighborlist. -// Reverse communication (newton on) of forces is required. - -// Currently the load balancer does two passes, -// since its exchanging atoms upstream and downstream. - -void PairNNSNAP::load_balance() -{ - double sublo[3],subhi[3]; - if (domain->triclinic == 0) { - double* sublotmp = domain->sublo; - double* subhitmp = domain->subhi; - for (int dim = 0 ; dim<3 ; dim++) { - sublo[dim]=sublotmp[dim]; - subhi[dim]=subhitmp[dim]; - } - } else { - double* sublotmp = domain->sublo_lamda; - double* subhitmp = domain->subhi_lamda; - domain->lamda2x(sublotmp,sublo); - domain->lamda2x(subhitmp,subhi); - } - - //if (list->inum==0) list->grow(atom->nmax); - - int nlocal = ghostinum; - for (int i=0; i < list->inum; i++) - if (ilistmask[i]) nlocal++; - int ***grid2proc = comm->grid2proc; - int* procgrid = comm->procgrid; - - int nlocal_up,nlocal_down; - MPI_Request request; - - double sub_mid[3]; - for (int dim=0; dim<3; dim++) - sub_mid[dim] = (subhi[dim] + sublo[dim])/2; - - if (comm->cutghostuser < - neighbor->cutneighmax+extra_cutoff()) - error->all(FLERR,"Communication cutoff too small for SNAP micro load balancing"); - - int nrecv = ghostinum; - int totalsend = 0; - int nsend = 0; - int depth = 1; - - for (int dx = -depth; dx < depth+1; dx++) - for (int dy = -depth; dy < depth+1; dy++) - for (int dz = -depth; dz < depth+1; dz++) { - - if (dx == dy && dy == dz && dz == 0) continue; - - int sendloc[3] = {comm->myloc[0], - comm->myloc[1], comm->myloc[2] - }; - sendloc[0] += dx; - sendloc[1] += dy; - sendloc[2] += dz; - for (int dim = 0; dim < 3; dim++) - if (sendloc[dim] >= procgrid[dim]) - sendloc[dim] = sendloc[dim] - procgrid[dim]; - for (int dim = 0; dim < 3; dim++) - if (sendloc[dim] < 0) - sendloc[dim] = procgrid[dim] + sendloc[dim]; - int recvloc[3] = {comm->myloc[0], - comm->myloc[1], comm->myloc[2] - }; - recvloc[0] -= dx; - recvloc[1] -= dy; - recvloc[2] -= dz; - for (int dim = 0; dim < 3; dim++) - if (recvloc[dim] < 0) - recvloc[dim] = procgrid[dim] + recvloc[dim]; - for (int dim = 0; dim < 3; dim++) - if (recvloc[dim] >= procgrid[dim]) - recvloc[dim] = recvloc[dim] - procgrid[dim]; - - int sendproc = grid2proc[sendloc[0]][sendloc[1]][sendloc[2]]; - int recvproc = grid2proc[recvloc[0]][recvloc[1]][recvloc[2]]; - - // two stage process, first upstream movement, then downstream - - MPI_Sendrecv(&nlocal,1,MPI_INT,sendproc,0, - &nlocal_up,1,MPI_INT,recvproc,0,world,MPI_STATUS_IGNORE); - MPI_Sendrecv(&nlocal,1,MPI_INT,recvproc,0, - &nlocal_down,1,MPI_INT,sendproc,0,world,MPI_STATUS_IGNORE); - nsend = 0; - - // send upstream - - if (nlocal > nlocal_up+1) { - - int i = totalsend++; - while(i < list->inum && ilistmask[i] == 0) - i = totalsend++; - - if (i < list->inum) - MPI_Isend(&atom->tag[i],1,MPI_INT,recvproc,0,world,&request); - else { - int j = -1; - MPI_Isend(&j,1,MPI_INT,recvproc,0,world,&request); - } - - if (i < list->inum) { - for (int j = 0; j < list->inum; j++) - if (list->ilist[j] == i) - ilistmask[j] = 0; - nsend = 1; - } - } - - // recv downstream - - if (nlocal < nlocal_down-1) { - nlocal++; - int get_tag = -1; - MPI_Recv(&get_tag,1,MPI_INT,sendproc,0,world,MPI_STATUS_IGNORE); - - // if get_tag -1 the other process didnt have local atoms to send - - if (get_tag >= 0) { - if (ghostinum >= ghostilist_max) { - memory->grow(ghostilist,ghostinum+10, - "PairSnap::ghostilist"); - ghostilist_max = ghostinum+10; - } - if (atom->nlocal + atom->nghost >= ghostnumneigh_max) { - ghostnumneigh_max = atom->nlocal+atom->nghost+100; - memory->grow(ghostnumneigh,ghostnumneigh_max, - "PairSnap::ghostnumneigh"); - memory->grow(ghostfirstneigh,ghostnumneigh_max, - "PairSnap::ghostfirstneigh"); - } - - // find closest ghost image of the transfered particle - - double mindist = 1e200; - int closestghost = -1; - for (int j = 0; j < atom->nlocal + atom->nghost; j++) - if (atom->tag[j] == get_tag) - if (dist2(sub_mid, atom->x[j]) < mindist) { - closestghost = j; - mindist = dist2(sub_mid, atom->x[j]); - } - - // build neighborlist for this particular - // ghost atom, and add it to list->ilist - - if (ghostneighs_max - ghostneighs_total < - neighbor->oneatom) { - memory->grow(ghostneighs, - ghostneighs_total + neighbor->oneatom, - "PairSnap::ghostneighs"); - ghostneighs_max = ghostneighs_total + neighbor->oneatom; - } - - int j = closestghost; - - ghostilist[ghostinum] = j; - ghostnumneigh[j] = 0; - ghostfirstneigh[j] = ghostneighs_total; - - ghostinum++; - int* jlist = ghostneighs + ghostfirstneigh[j]; - - // find all neighbors by looping - // over all local and ghost atoms - - for (int k = 0; k < atom->nlocal + atom->nghost; k++) - if (dist2(atom->x[j],atom->x[k]) < - neighbor->cutneighmax*neighbor->cutneighmax) { - jlist[ghostnumneigh[j]] = k; - ghostnumneigh[j]++; - ghostneighs_total++; - } - } - - if (get_tag >= 0) nrecv++; - } - - // decrease nlocal later, so that it is the - // initial number both for receiving and sending - - if (nsend) nlocal--; - - // second pass through the grid - - MPI_Sendrecv(&nlocal,1,MPI_INT,sendproc,0, - &nlocal_up,1,MPI_INT,recvproc,0,world,MPI_STATUS_IGNORE); - MPI_Sendrecv(&nlocal,1,MPI_INT,recvproc,0, - &nlocal_down,1,MPI_INT,sendproc,0,world,MPI_STATUS_IGNORE); - - // send downstream - - nsend=0; - if (nlocal > nlocal_down+1) { - int i = totalsend++; - while(i < list->inum && ilistmask[i]==0) i = totalsend++; - - if (i < list->inum) - MPI_Isend(&atom->tag[i],1,MPI_INT,sendproc,0,world,&request); - else { - int j =- 1; - MPI_Isend(&j,1,MPI_INT,sendproc,0,world,&request); - } - - if (i < list->inum) { - for (int j=0; jinum; j++) - if (list->ilist[j] == i) ilistmask[j] = 0; - nsend = 1; - } - } - - // receive upstream - - if (nlocal < nlocal_up-1) { - nlocal++; - int get_tag = -1; - - MPI_Recv(&get_tag,1,MPI_INT,recvproc,0,world,MPI_STATUS_IGNORE); - - if (get_tag >= 0) { - if (ghostinum >= ghostilist_max) { - memory->grow(ghostilist,ghostinum+10, - "PairSnap::ghostilist"); - ghostilist_max = ghostinum+10; - } - if (atom->nlocal + atom->nghost >= ghostnumneigh_max) { - ghostnumneigh_max = atom->nlocal + atom->nghost + 100; - memory->grow(ghostnumneigh,ghostnumneigh_max, - "PairSnap::ghostnumneigh"); - memory->grow(ghostfirstneigh,ghostnumneigh_max, - "PairSnap::ghostfirstneigh"); - } - - // find closest ghost image of the transfered particle - - double mindist = 1e200; - int closestghost = -1; - for (int j = 0; j < atom->nlocal + atom->nghost; j++) - if (atom->tag[j] == get_tag) - if (dist2(sub_mid,atom->x[j])x[j]); - } - - // build neighborlist for this particular ghost atom - - if (ghostneighs_max-ghostneighs_total < neighbor->oneatom) { - memory->grow(ghostneighs,ghostneighs_total + neighbor->oneatom, - "PairSnap::ghostneighs"); - ghostneighs_max = ghostneighs_total + neighbor->oneatom; - } - - int j = closestghost; - - ghostilist[ghostinum] = j; - ghostnumneigh[j] = 0; - ghostfirstneigh[j] = ghostneighs_total; - - ghostinum++; - int* jlist = ghostneighs + ghostfirstneigh[j]; - - for (int k = 0; k < atom->nlocal + atom->nghost; k++) - if (dist2(atom->x[j],atom->x[k]) < - neighbor->cutneighmax*neighbor->cutneighmax) { - jlist[ghostnumneigh[j]] = k; - ghostnumneigh[j]++; - ghostneighs_total++; - } - } - - if (get_tag >= 0) nrecv++; - } - if (nsend) nlocal--; - } -} - -void PairNNSNAP::set_sna_to_shared(int snaid,int i) -{ - sna[snaid]->rij = i_rij[i]; - sna[snaid]->inside = i_inside[i]; - sna[snaid]->wj = i_wj[i]; - sna[snaid]->rcutij = i_rcutij[i]; - sna[snaid]->zarray_r = i_zarray_r[i]; - sna[snaid]->zarray_i = i_zarray_i[i]; - sna[snaid]->uarraytot_r = i_uarraytot_r[i]; - sna[snaid]->uarraytot_i = i_uarraytot_i[i]; -} - -void PairNNSNAP::build_per_atom_arrays() -{ - -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&starttime); -#endif - - int count = 0; - int neighmax = 0; - for (int ii = 0; ii < list->inum; ii++) - if ((do_load_balance <= 0) || ilistmask[ii]) { - neighmax=MAX(neighmax,list->numneigh[list->ilist[ii]]); - ++count; - } - for (int ii = 0; ii < ghostinum; ii++) { - neighmax=MAX(neighmax,ghostnumneigh[ghostilist[ii]]); - ++count; - } - - if (i_max < count || i_neighmax < neighmax) { - int i_maxt = MAX(count,i_max); - i_neighmax = MAX(neighmax,i_neighmax); - memory->destroy(i_rij); - memory->destroy(i_inside); - memory->destroy(i_wj); - memory->destroy(i_rcutij); - memory->destroy(i_ninside); - memory->destroy(i_pairs); - memory->create(i_rij,i_maxt,i_neighmax,3,"PairNNSNAP::i_rij"); - memory->create(i_inside,i_maxt,i_neighmax,"PairNNSNAP::i_inside"); - memory->create(i_wj,i_maxt,i_neighmax,"PairNNSNAP::i_wj"); - memory->create(i_rcutij,i_maxt,i_neighmax,"PairNNSNAP::i_rcutij"); - memory->create(i_ninside,i_maxt,"PairNNSNAP::i_ninside"); - memory->create(i_pairs,i_maxt*i_neighmax,4,"PairNNSNAP::i_pairs"); - } - - if (i_max < count) { - int jdim = sna[0]->twojmax+1; - memory->destroy(i_uarraytot_r); - memory->destroy(i_uarraytot_i); - memory->create(i_uarraytot_r,count,jdim,jdim,jdim, - "PairNNSNAP::i_uarraytot_r"); - memory->create(i_uarraytot_i,count,jdim,jdim,jdim, - "PairNNSNAP::i_uarraytot_i"); - if (i_zarray_r != NULL) - for (int i = 0; i < i_max; i++) { - memory->destroy(i_zarray_r[i]); - memory->destroy(i_zarray_i[i]); - } - - delete [] i_zarray_r; - delete [] i_zarray_i; - i_zarray_r = new double*****[count]; - i_zarray_i = new double*****[count]; - for (int i = 0; i < count; i++) { - memory->create(i_zarray_r[i],jdim,jdim,jdim,jdim,jdim, - "PairNNSNAP::i_zarray_r"); - memory->create(i_zarray_i[i],jdim,jdim,jdim,jdim,jdim, - "PairNNSNAP::i_zarray_i"); - } - } - - if (i_max < count) - i_max = count; - - count = 0; - i_numpairs = 0; - for (int ii = 0; ii < list->inum; ii++) { - if ((do_load_balance <= 0) || ilistmask[ii]) { - int i = list->ilist[ii]; - int jnum = list->numneigh[i]; - int* jlist = list->firstneigh[i]; - const double xtmp = atom->x[i][0]; - const double ytmp = atom->x[i][1]; - const double ztmp = atom->x[i][2]; - const int itype = atom->type[i]; - const int ielem = map[itype]; - const double radi = radelem[ielem]; - int ninside = 0; - for (int jj = 0; jj < jnum; jj++) { - int j = jlist[jj]; - j &= NEIGHMASK; - const double delx = atom->x[j][0] - xtmp; - const double dely = atom->x[j][1] - ytmp; - const double delz = atom->x[j][2] - ztmp; - const double rsq = delx*delx + dely*dely + delz*delz; - int jtype = atom->type[j]; - int jelem = map[jtype]; - - i_pairs[i_numpairs][0] = i; - i_pairs[i_numpairs][1] = jj; - i_pairs[i_numpairs][2] = -1; - i_pairs[i_numpairs][3] = count; - if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { - i_rij[count][ninside][0] = delx; - i_rij[count][ninside][1] = dely; - i_rij[count][ninside][2] = delz; - i_inside[count][ninside] = j; - i_wj[count][ninside] = wjelem[jelem]; - i_rcutij[count][ninside] = (radi + radelem[jelem])*rcutfac; - - // update index list with inside index - i_pairs[i_numpairs][2] = ninside++; - } - i_numpairs++; - } - i_ninside[count] = ninside; - count++; - } - } - - for (int ii = 0; ii < ghostinum; ii++) { - int i = ghostilist[ii]; - int jnum = ghostnumneigh[i]; - int* jlist = ghostneighs+ghostfirstneigh[i]; - const double xtmp = atom->x[i][0]; - const double ytmp = atom->x[i][1]; - const double ztmp = atom->x[i][2]; - const int itype = atom->type[i]; - const int ielem = map[itype]; - const double radi = radelem[ielem]; - int ninside = 0; - - for (int jj = 0; jj < jnum; jj++) { - int j = jlist[jj]; - j &= NEIGHMASK; - const double delx = atom->x[j][0] - xtmp; - const double dely = atom->x[j][1] - ytmp; - const double delz = atom->x[j][2] - ztmp; - const double rsq = delx*delx + dely*dely + delz*delz; - int jtype = atom->type[j]; - int jelem = map[jtype]; - - i_pairs[i_numpairs][0] = i; - i_pairs[i_numpairs][1] = jj; - i_pairs[i_numpairs][2] = -1; - i_pairs[i_numpairs][3] = count; - if (rsq < cutsq[itype][jtype]&&rsq>1e-20) { - i_rij[count][ninside][0] = delx; - i_rij[count][ninside][1] = dely; - i_rij[count][ninside][2] = delz; - i_inside[count][ninside] = j; - i_wj[count][ninside] = wjelem[jelem]; - i_rcutij[count][ninside] = (radi + radelem[jelem])*rcutfac; - // update index list with inside index - i_pairs[i_numpairs][2] = ninside++; - } - i_numpairs++; - } - i_ninside[count] = ninside; - count++; - } -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&endtime); - timers[0]+=(endtime.tv_sec-starttime.tv_sec+1.0* - (endtime.tv_nsec-starttime.tv_nsec)/1000000000); -#endif -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&starttime); -#endif - -#if defined(_OPENMP) -#pragma omp parallel for shared(count) default(none) -#endif - for (int ii=0; ii < count; ii++) { - int tid = omp_get_thread_num(); - set_sna_to_shared(tid,ii); - //sna[tid]->compute_ui(i_ninside[ii]); -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&starttime); -#endif - sna[tid]->compute_ui_omp(i_ninside[ii],MAX(int(nthreads/count),1)); -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&endtime); - sna[tid]->timers[0]+=(endtime.tv_sec-starttime.tv_sec+1.0* - (endtime.tv_nsec-starttime.tv_nsec)/1000000000); -#endif - } - -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&starttime); -#endif - for (int ii=0; ii < count; ii++) { - int tid = 0;//omp_get_thread_num(); - set_sna_to_shared(tid,ii); - sna[tid]->compute_zi_omp(MAX(int(nthreads/count),1)); - } -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&endtime); - sna[0]->timers[1]+=(endtime.tv_sec-starttime.tv_sec+1.0* - (endtime.tv_nsec-starttime.tv_nsec)/1000000000); -#endif - -#ifdef TIMING_INFO - clock_gettime(CLOCK_REALTIME,&endtime); - timers[1]+=(endtime.tv_sec-starttime.tv_sec+1.0* - (endtime.tv_nsec-starttime.tv_nsec)/1000000000); -#endif -} - -/* ---------------------------------------------------------------------- - compute beta -------------------------------------------------------------------------- */ - -void PairNNSNAP::compute_beta() -{ - int i; - int *type = atom->type; - - for (int ii = 0; ii < list->inum; ii++) { - i = list->ilist[ii]; - const int itype = type[i]; - const int ielem = map[itype]; - double* coeffi = coeffelem[ielem]; - - for (int k = 1; k <= ncoeff; k++) - beta[ii][k-1] = coeffi[k]; - } -} - -/* ---------------------------------------------------------------------- - allocate all arrays -------------------------------------------------------------------------- */ - -void PairNNSNAP::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(map,n+1,"pair:map"); -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairNNSNAP::settings(int narg, char **arg) -{ - - // set default values for optional arguments - - nthreads = -1; - use_shared_arrays=-1; - do_load_balance = 0; - use_optimized = 1; - - // optional arguments - - for (int i=0; i < narg; i++) { - if (i+2>narg) error->all(FLERR,"Illegal pair_style command"); - if (strcmp(arg[i],"nthreads")==0) { - nthreads=force->inumeric(FLERR,arg[++i]); -#if defined(LMP_USER_OMP) - error->all(FLERR,"Must set number of threads via package omp command"); -#else - omp_set_num_threads(nthreads); - comm->nthreads=nthreads; -#endif - continue; - } - if (strcmp(arg[i],"optimized")==0) { - use_optimized=force->inumeric(FLERR,arg[++i]); - continue; - } - if (strcmp(arg[i],"shared")==0) { - use_shared_arrays=force->inumeric(FLERR,arg[++i]); - continue; - } - if (strcmp(arg[i],"loadbalance")==0) { - do_load_balance = force->inumeric(FLERR,arg[++i]); - if (do_load_balance) { - double mincutoff = extra_cutoff() + - rcutmax + neighbor->skin; - if (comm->cutghostuser < mincutoff) { - char buffer[255]; - - //apparently mincutoff is 0 after sprintf command ????? - - double tmp = mincutoff + 0.1; - sprintf(buffer, "Communication cutoff is too small " - "for SNAP micro load balancing, increased to %lf", - mincutoff+0.1); - if (comm->me==0) - error->warning(FLERR,buffer); - - comm->cutghostuser = tmp; - - } - } - continue; - } - if (strcmp(arg[i],"schedule")==0) { - i++; - if (strcmp(arg[i],"static")==0) - schedule_user = 1; - if (strcmp(arg[i],"dynamic")==0) - schedule_user = 2; - if (strcmp(arg[i],"guided")==0) - schedule_user = 3; - if (strcmp(arg[i],"auto")==0) - schedule_user = 4; - if (strcmp(arg[i],"determine")==0) - schedule_user = 5; - if (schedule_user == 0) - error->all(FLERR,"Illegal pair_style command"); - continue; - } - error->all(FLERR,"Illegal pair_style command"); - } - - if (nthreads < 0) - nthreads = comm->nthreads; - - if (use_shared_arrays < 0) { - if (nthreads > 1 && atom->nlocal <= 2*nthreads) - use_shared_arrays = 1; - else use_shared_arrays = 0; - } - - // check if running non-optimized code with - // optimization flags set - - if (!use_optimized) - if (nthreads > 1 || - use_shared_arrays || - do_load_balance || - schedule_user) - error->all(FLERR,"Illegal pair_style command"); -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairNNSNAP::coeff(int narg, char **arg) -{ - if (narg < 5) error->all(FLERR,"Incorrect args for pair coefficients"); - if (!allocated) allocate(); - - if (nelements) { - for (int i = 0; i < nelements; i++) - delete[] elements[i]; - delete[] elements; - memory->destroy(radelem); - memory->destroy(wjelem); - memory->destroy(coeffelem); - memory->destroy(beta); - } - - char* type1 = arg[0]; - char* type2 = arg[1]; - char* coefffilename = arg[2]; - char* paramfilename = arg[3]; - char** elemtypes = &arg[4]; - - // insure I,J args are * * - - if (strcmp(type1,"*") != 0 || strcmp(type2,"*") != 0) - error->all(FLERR,"Incorrect args for pair coefficients"); - - // read snapcoeff and snapparam files - - read_files(coefffilename,paramfilename); - - if (!quadraticflag) - ncoeff = ncoeffall - 1; - else { - - // ncoeffall should be (ncoeff+2)*(ncoeff+1)/2 - // so, ncoeff = floor(sqrt(2*ncoeffall))-1 - - ncoeff = sqrt(2*ncoeffall)-1; - ncoeffq = (ncoeff*(ncoeff+1))/2; - int ntmp = 1+ncoeff+ncoeffq; - if (ntmp != ncoeffall) { - printf("ncoeffall = %d ntmp = %d ncoeff = %d \n",ncoeffall,ntmp,ncoeff); - error->all(FLERR,"Incorrect SNAP coeff file"); - } - } - - // read args that map atom types to SNAP elements - // map[i] = which element the Ith atom type is, -1 if not mapped - // map[0] is not used - - for (int i = 1; i <= atom->ntypes; i++) { - char* elemname = elemtypes[i-1]; - int jelem; - for (jelem = 0; jelem < nelements; jelem++) - if (strcmp(elemname,elements[jelem]) == 0) - break; - - if (jelem < nelements) - map[i] = jelem; - else if (strcmp(elemname,"NULL") == 0) map[i] = -1; - else error->all(FLERR,"Incorrect args for pair coefficients"); - } - - // clear setflag since coeff() called once with I,J = * * - - int n = atom->ntypes; - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - // set setflag i,j for type pairs where both are mapped to elements - - int count = 0; - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - if (map[i] >= 0 && map[j] >= 0) { - setflag[i][j] = 1; - count++; - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); - - sna = new SNA*[nthreads]; - - // allocate memory for per OpenMP thread data which - // is wrapped into the sna class - -#if defined(_OPENMP) -#pragma omp parallel default(none) -#endif - { - int tid = omp_get_thread_num(); - sna[tid] = new SNA(lmp,rfac0,twojmax, - diagonalstyle,use_shared_arrays, - rmin0,switchflag,bzeroflag); - if (!use_shared_arrays) - sna[tid]->grow_rij(nmax); - } - - if (ncoeff != sna[0]->ncoeff) { - if (comm->me == 0) - printf("ncoeff = %d snancoeff = %d \n",ncoeff,sna[0]->ncoeff); - error->all(FLERR,"Incorrect SNAP parameter file"); - } - - // Calculate maximum cutoff for all elements - - rcutmax = 0.0; - for (int ielem = 0; ielem < nelements; ielem++) - rcutmax = MAX(2.0*radelem[ielem]*rcutfac,rcutmax); - -} - -/* ---------------------------------------------------------------------- - init specific to this pair style -------------------------------------------------------------------------- */ - -void PairNNSNAP::init_style() -{ - if (force->newton_pair == 0) - error->all(FLERR,"Pair style SNAP requires newton pair on"); - - // need a full neighbor list - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - -#if defined(_OPENMP) -#pragma omp parallel default(none) -#endif - { - int tid = omp_get_thread_num(); - sna[tid]->init(); - } - -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairNNSNAP::init_one(int i, int j) -{ - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - return (radelem[map[i]] + - radelem[map[j]])*rcutfac; -} - -/* ---------------------------------------------------------------------- */ - -void PairNNSNAP::read_files(char *coefffilename, char *paramfilename) -{ - - // open SNAP coefficient file on proc 0 - - FILE *fpcoeff; - if (comm->me == 0) { - fpcoeff = force->open_potential(coefffilename); - if (fpcoeff == NULL) { - char str[128]; - snprintf(str,128,"Cannot open SNAP coefficient file %s",coefffilename); - error->one(FLERR,str); - } - } - - char line[MAXLINE],*ptr; - int eof = 0; - - int n; - int nwords = 0; - while (nwords == 0) { - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fpcoeff); - if (ptr == NULL) { - eof = 1; - fclose(fpcoeff); - } else n = strlen(line) + 1; - } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - - // strip comment, skip line if blank - - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = atom->count_words(line); - } - if (nwords != 2) - error->all(FLERR,"Incorrect format in SNAP coefficient file"); - - // words = ptrs to all words in line - // strip single and double quotes from words - - char* words[MAXWORD]; - int iword = 0; - words[iword] = strtok(line,"' \t\n\r\f"); - iword = 1; - words[iword] = strtok(NULL,"' \t\n\r\f"); - - nelements = atoi(words[0]); - ncoeffall = atoi(words[1]); - - // set up element lists - - elements = new char*[nelements]; - memory->create(radelem,nelements,"pair:radelem"); - memory->create(wjelem,nelements,"pair:wjelem"); - memory->create(coeffelem,nelements,ncoeffall,"pair:coeffelem"); - - // Loop over nelements blocks in the SNAP coefficient file - - for (int ielem = 0; ielem < nelements; ielem++) { - - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fpcoeff); - if (ptr == NULL) { - eof = 1; - fclose(fpcoeff); - } else n = strlen(line) + 1; - } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) - error->all(FLERR,"Incorrect format in SNAP coefficient file"); - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - - nwords = atom->count_words(line); - if (nwords != 3) - error->all(FLERR,"Incorrect format in SNAP coefficient file"); - - iword = 0; - words[iword] = strtok(line,"' \t\n\r\f"); - iword = 1; - words[iword] = strtok(NULL,"' \t\n\r\f"); - iword = 2; - words[iword] = strtok(NULL,"' \t\n\r\f"); - - char* elemtmp = words[0]; - int n = strlen(elemtmp) + 1; - elements[ielem] = new char[n]; - strcpy(elements[ielem],elemtmp); - - radelem[ielem] = atof(words[1]); - wjelem[ielem] = atof(words[2]); - - - if (comm->me == 0) { - if (screen) fprintf(screen,"SNAP Element = %s, Radius %g, Weight %g \n", - elements[ielem], radelem[ielem], wjelem[ielem]); - if (logfile) fprintf(logfile,"SNAP Element = %s, Radius %g, Weight %g \n", - elements[ielem], radelem[ielem], wjelem[ielem]); - } - - for (int icoeff = 0; icoeff < ncoeffall; icoeff++) { - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fpcoeff); - if (ptr == NULL) { - eof = 1; - fclose(fpcoeff); - } else n = strlen(line) + 1; - } - - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) - error->all(FLERR,"Incorrect format in SNAP coefficient file"); - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - - nwords = atom->count_words(line); - if (nwords != 1) - error->all(FLERR,"Incorrect format in SNAP coefficient file"); - - iword = 0; - words[iword] = strtok(line,"' \t\n\r\f"); - - coeffelem[ielem][icoeff] = atof(words[0]); - - } - } - - // set flags for required keywords - - rcutfacflag = 0; - twojmaxflag = 0; - - // Set defaults for optional keywords - - rfac0 = 0.99363; - rmin0 = 0.0; - diagonalstyle = 3; - switchflag = 1; - bzeroflag = 1; - quadraticflag = 0; - - // open SNAP parameter file on proc 0 - - FILE *fpparam; - if (comm->me == 0) { - fpparam = force->open_potential(paramfilename); - if (fpparam == NULL) { - char str[128]; - snprintf(str,128,"Cannot open SNAP parameter file %s",paramfilename); - error->one(FLERR,str); - } - } - - eof = 0; - while (1) { - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fpparam); - if (ptr == NULL) { - eof = 1; - fclose(fpparam); - } else n = strlen(line) + 1; - } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - - // strip comment, skip line if blank - - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = atom->count_words(line); - if (nwords == 0) continue; - - if (nwords != 2) - error->all(FLERR,"Incorrect format in SNAP parameter file"); - - // words = ptrs to all words in line - // strip single and double quotes from words - - char* keywd = strtok(line,"' \t\n\r\f"); - char* keyval = strtok(NULL,"' \t\n\r\f"); - - if (comm->me == 0) { - if (screen) fprintf(screen,"SNAP keyword %s %s \n",keywd,keyval); - if (logfile) fprintf(logfile,"SNAP keyword %s %s \n",keywd,keyval); - } - - if (strcmp(keywd,"rcutfac") == 0) { - rcutfac = atof(keyval); - rcutfacflag = 1; - } else if (strcmp(keywd,"twojmax") == 0) { - twojmax = atoi(keyval); - twojmaxflag = 1; - } else if (strcmp(keywd,"rfac0") == 0) - rfac0 = atof(keyval); - else if (strcmp(keywd,"rmin0") == 0) - rmin0 = atof(keyval); - else if (strcmp(keywd,"diagonalstyle") == 0) - diagonalstyle = atoi(keyval); - else if (strcmp(keywd,"switchflag") == 0) - switchflag = atoi(keyval); - else if (strcmp(keywd,"bzeroflag") == 0) - bzeroflag = atoi(keyval); - else if (strcmp(keywd,"quadraticflag") == 0) - quadraticflag = atoi(keyval); - else - error->all(FLERR,"Incorrect SNAP parameter file"); - } - - if (rcutfacflag == 0 || twojmaxflag == 0) - error->all(FLERR,"Incorrect SNAP parameter file"); - -} - -/* ---------------------------------------------------------------------- - memory usage -------------------------------------------------------------------------- */ - -double PairNNSNAP::memory_usage() -{ - double bytes = Pair::memory_usage(); - int n = atom->ntypes+1; - bytes += n*n*sizeof(int); - bytes += n*n*sizeof(double); - bytes += 3*nmax*sizeof(double); - bytes += nmax*sizeof(int); - bytes += (2*ncoeffall)*sizeof(double); - bytes += (ncoeff*3)*sizeof(double); - bytes += sna[0]->memory_usage()*nthreads; - return bytes; -} - From be5d3d6a19345a7378e2df0eaea3b7ad6e1ac660 Mon Sep 17 00:00:00 2001 From: athomps Date: Wed, 12 Jun 2019 17:04:22 -0600 Subject: [PATCH 65/90] Not part of this pull request --- examples/snap/in.nnsnap | 45 ----------------------------------------- 1 file changed, 45 deletions(-) delete mode 100644 examples/snap/in.nnsnap diff --git a/examples/snap/in.nnsnap b/examples/snap/in.nnsnap deleted file mode 100644 index d575757d56..0000000000 --- a/examples/snap/in.nnsnap +++ /dev/null @@ -1,45 +0,0 @@ -# Demonstrate SNAP Ta potential - -# Initialize simulation - -variable nsteps index 100 -variable nrep equal 4 -variable a equal 3.1803 -units metal - -# generate the box and atom positions using a BCC lattice - -variable nx equal ${nrep} -variable ny equal ${nrep} -variable nz equal ${nrep} - -boundary p p p - -lattice bcc $a -region box block 0 ${nx} 0 ${ny} 0 ${nz} -create_box 1 box -create_atoms 1 box - -mass 1 183.84 - -# choose potential - -include W.nnsnap - -# Setup output - -thermo 10 -thermo_modify norm yes - -# Set up NVE run - -timestep 0.5e-3 -neighbor 1.0 bin -neigh_modify once no every 1 delay 0 check yes - -# Run MD - -velocity all create 300.0 4928459 -fix 1 all nve -run ${nsteps} - From c5c03230cb2a1a8649f902b2dce0983c5a309565 Mon Sep 17 00:00:00 2001 From: athomps Date: Wed, 12 Jun 2019 17:05:47 -0600 Subject: [PATCH 66/90] Not part of this pull request --- src/SNAP/pair_nn_snap.h | 184 ---------------------------------------- 1 file changed, 184 deletions(-) delete mode 100644 src/SNAP/pair_nn_snap.h diff --git a/src/SNAP/pair_nn_snap.h b/src/SNAP/pair_nn_snap.h deleted file mode 100644 index f77ddee207..0000000000 --- a/src/SNAP/pair_nn_snap.h +++ /dev/null @@ -1,184 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(nn/snap,PairNNSNAP) - -#else - -#ifndef LMP_PAIR_NN_SNAP_H -#define LMP_PAIR_NN_SNAP_H - -#include "pair.h" - -namespace LAMMPS_NS { - -class PairNNSNAP : public Pair { -public: - PairNNSNAP(class LAMMPS *); - ~PairNNSNAP(); - virtual void compute(int, int); - void compute_regular(int, int); - void compute_optimized(int, int); - void settings(int, char **); - virtual void coeff(int, char **); - virtual void init_style(); - virtual double init_one(int, int); - virtual double memory_usage(); - - double rcutfac, quadraticflag; // declared public to workaround gcc 4.9 - int ncoeff; // compiler bug, manifest in KOKKOS package - -protected: - int ncoeffq, ncoeffall; - double **bvec, ***dbvec; - class SNA** sna; - int nmax; - int nthreads; - virtual void allocate(); - void read_files(char *, char *); - inline int equal(double* x,double* y); - inline double dist2(double* x,double* y); - double extra_cutoff(); - void load_balance(); - void set_sna_to_shared(int snaid,int i); - void build_per_atom_arrays(); - - void compute_beta(); - - int schedule_user; - double schedule_time_guided; - double schedule_time_dynamic; - - int ncalls_neigh; - int do_load_balance; - int ilistmask_max; - int* ilistmask; - int ghostinum; - int ghostilist_max; - int* ghostilist; - int ghostnumneigh_max; - int* ghostnumneigh; - int* ghostneighs; - int* ghostfirstneigh; - int ghostneighs_total; - int ghostneighs_max; - - int use_optimized; - int use_shared_arrays; - - int i_max; - int i_neighmax; - int i_numpairs; - int **i_pairs; - double ***i_rij; - int **i_inside; - double **i_wj; - double **i_rcutij; - int *i_ninside; - double ****i_uarraytot_r, ****i_uarraytot_i; - double ******i_zarray_r, ******i_zarray_i; - -#ifdef TIMING_INFO - // timespec starttime, endtime; - double timers[4]; -#endif - - double rcutmax; // max cutoff for all elements - int nelements; // # of unique elements - char **elements; // names of unique elements - double *radelem; // element radii - double *wjelem; // elements weights - double **coeffelem; // element bispectrum coefficients - double** beta; // betas for all atoms in list - int *map; // mapping from atom types to elements - int twojmax, diagonalstyle, switchflag, bzeroflag; - double rfac0, rmin0, wj1, wj2; - int rcutfacflag, twojmaxflag; // flags for required parameters - int beta_max; // length of beta -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: - -E: Communication cutoff too small for SNAP micro load balancing - -This can happen if you change the neighbor skin after your pair_style -command or if your box dimensions grow during a run. You can set the -cutoff explicitly via the comm_modify cutoff command. - -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: Must set number of threads via package omp command - -Because you are using the USER-OMP package, set the number of threads -via its settings, not by the pair_style snap nthreads setting. - -W: Communication cutoff is too small for SNAP micro load balancing, increased to %lf - -Self-explanatory. - -E: Incorrect args for pair coefficients - -Self-explanatory. Check the input script or data file. - -E: Incorrect SNAP coeff file - -UNDOCUMENTED - -E: Incorrect SNAP parameter file - -The file cannot be parsed correctly, check its internal syntax. - -E: Pair style SNAP requires newton pair on - -See the newton command. This is a restriction to use the SNAP -potential. - -E: All pair coeffs are not set - -All pair coefficients must be set in the data file or by the -pair_coeff command before running a simulation. - -E: Cannot open SNAP coefficient file %s - -The specified SNAP coefficient file cannot be opened. Check that the -path and name are correct. - -E: Incorrect format in SNAP coefficient file - -Incorrect number of words per line in the coefficient file. - -E: Cannot open SNAP parameter file %s - -The specified SNAP parameter file cannot be opened. Check that the -path and name are correct. - -E: Incorrect format in SNAP parameter file - -Incorrect number of words per line in the parameter file. - -E: Did not find all elements in SNAP coefficient file. - -One or more elements listed in the pair_coeff command were not found in the coefficient file. - -*/ From 65b87fa2781c5f7dd9a4599193c026d8b37825ae Mon Sep 17 00:00:00 2001 From: "Aidan P. Thompson" Date: Thu, 13 Jun 2019 09:54:56 -0600 Subject: [PATCH 67/90] Updated SNAP in KOKKOS package so it compiles and runs --- src/KOKKOS/pair_snap_kokkos_impl.h | 18 +----- src/KOKKOS/sna_kokkos.h | 8 +-- src/KOKKOS/sna_kokkos_impl.h | 97 ++++++++++++------------------ src/SNAP/sna.cpp | 3 - 4 files changed, 39 insertions(+), 87 deletions(-) diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index bb2a5e9171..0ec4ed0995 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -85,9 +85,6 @@ void PairSNAPKokkos::init_style() if (force->newton_pair == 0) error->all(FLERR,"Pair style SNAP requires newton pair on"); - if (diagonalstyle != 3) - error->all(FLERR,"Must use diagonal style = 3 with pair snap/kk"); - // irequest = neigh request made by parent class neighflag = lmp->kokkos->neighflag; @@ -343,23 +340,12 @@ void PairSNAPKokkos::coeff(int narg, char **arg) Kokkos::deep_copy(d_coeffelem,h_coeffelem); Kokkos::deep_copy(d_map,h_map); - // deallocate non-kokkos sna - - if (sna) { - for (int tid = 0; tid(rfac0,twojmax, - diagonalstyle,use_shared_arrays, rmin0,switchflag,bzeroflag); - //if (!use_shared_arrays) - snaKK.grow_rij(nmax); + snaKK.grow_rij(0); snaKK.init(); } @@ -667,8 +653,6 @@ double PairSNAPKokkos::memory_usage() int n = atom->ntypes+1; bytes += n*n*sizeof(int); bytes += n*n*sizeof(double); - bytes += 3*nmax*sizeof(double); - bytes += nmax*sizeof(int); bytes += (2*ncoeffall)*sizeof(double); bytes += (ncoeff*3)*sizeof(double); bytes += snaKK.memory_usage(); diff --git a/src/KOKKOS/sna_kokkos.h b/src/KOKKOS/sna_kokkos.h index 7a80b262b7..40e5fe0ad4 100644 --- a/src/KOKKOS/sna_kokkos.h +++ b/src/KOKKOS/sna_kokkos.h @@ -48,7 +48,7 @@ inline SNAKokkos(const SNAKokkos& sna, const typename Kokkos::TeamPolicy::member_type& team); inline - SNAKokkos(double, int, int, int, double, int, int); + SNAKokkos(double, int, double, int, int); KOKKOS_INLINE_FUNCTION ~SNAKokkos(); @@ -178,12 +178,6 @@ inline double, double, double, // compute_duidrj double, double, double, double, double); - // if number of atoms are small use per atom arrays - // for twojmax arrays, rij, inside, bvec - // this will increase the memory footprint considerably, - // but allows parallel filling and reuse of these arrays - int use_shared_arrays; - // Sets the style for the switching function // 0 = none // 1 = cosine diff --git a/src/KOKKOS/sna_kokkos_impl.h b/src/KOKKOS/sna_kokkos_impl.h index 0f2a450a3d..c43003af97 100644 --- a/src/KOKKOS/sna_kokkos_impl.h +++ b/src/KOKKOS/sna_kokkos_impl.h @@ -27,19 +27,17 @@ static const double MY_PI = 3.14159265358979323846; // pi template inline SNAKokkos::SNAKokkos(double rfac0_in, - int twojmax_in, int diagonalstyle_in, int use_shared_arrays_in, + int twojmax_in, double rmin0_in, int switch_flag_in, int bzero_flag_in) { wself = 1.0; - use_shared_arrays = use_shared_arrays_in; rfac0 = rfac0_in; rmin0 = rmin0_in; switch_flag = switch_flag_in; bzero_flag = bzero_flag_in; twojmax = twojmax_in; - diagonalstyle = diagonalstyle_in; ncoeff = compute_ncoeff(); @@ -70,14 +68,12 @@ KOKKOS_INLINE_FUNCTION SNAKokkos::SNAKokkos(const SNAKokkos& sna, const typename Kokkos::TeamPolicy::member_type& team) { wself = sna.wself; - use_shared_arrays = sna.use_shared_arrays; rfac0 = sna.rfac0; rmin0 = sna.rmin0; switch_flag = sna.switch_flag; bzero_flag = sna.bzero_flag; twojmax = sna.twojmax; - diagonalstyle = sna.diagonalstyle; ncoeff = sna.ncoeff; nmax = sna.nmax; @@ -104,48 +100,45 @@ template inline void SNAKokkos::build_indexlist() { - if(diagonalstyle == 3) { - int idxj_count = 0; - int idxj_full_count = 0; + int idxj_count = 0; + int idxj_full_count = 0; - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { - if (j >= j1) idxj_count++; - idxj_full_count++; - } + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + if (j >= j1) idxj_count++; + idxj_full_count++; + } - // indexList can be changed here + // indexList can be changed here - idxj = Kokkos::View("SNAKokkos::idxj",idxj_count); - idxj_full = Kokkos::View("SNAKokkos::idxj_full",idxj_full_count); - auto h_idxj = Kokkos::create_mirror_view(idxj); - auto h_idxj_full = Kokkos::create_mirror_view(idxj_full); + idxj = Kokkos::View("SNAKokkos::idxj",idxj_count); + idxj_full = Kokkos::View("SNAKokkos::idxj_full",idxj_full_count); + auto h_idxj = Kokkos::create_mirror_view(idxj); + auto h_idxj_full = Kokkos::create_mirror_view(idxj_full); - idxj_max = idxj_count; - idxj_full_max = idxj_full_count; + idxj_max = idxj_count; + idxj_full_max = idxj_full_count; - idxj_count = 0; - idxj_full_count = 0; + idxj_count = 0; + idxj_full_count = 0; - for(int j1 = 0; j1 <= twojmax; j1++) - for(int j2 = 0; j2 <= j1; j2++) - for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { - if (j >= j1) { - h_idxj[idxj_count].j1 = j1; - h_idxj[idxj_count].j2 = j2; - h_idxj[idxj_count].j = j; - idxj_count++; - } - h_idxj_full[idxj_full_count].j1 = j1; - h_idxj_full[idxj_full_count].j2 = j2; - h_idxj_full[idxj_full_count].j = j; - idxj_full_count++; - } - Kokkos::deep_copy(idxj,h_idxj); - Kokkos::deep_copy(idxj_full,h_idxj_full); - - } + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + if (j >= j1) { + h_idxj[idxj_count].j1 = j1; + h_idxj[idxj_count].j2 = j2; + h_idxj[idxj_count].j = j; + idxj_count++; + } + h_idxj_full[idxj_full_count].j1 = j1; + h_idxj_full[idxj_full_count].j2 = j2; + h_idxj_full[idxj_full_count].j = j; + idxj_full_count++; + } + Kokkos::deep_copy(idxj,h_idxj); + Kokkos::deep_copy(idxj_full,h_idxj_full); } /* ---------------------------------------------------------------------- */ @@ -1223,26 +1216,10 @@ int SNAKokkos::compute_ncoeff() ncount = 0; for (int j1 = 0; j1 <= twojmax; j1++) - if(diagonalstyle == 0) { - for (int j2 = 0; j2 <= j1; j2++) - for (int j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) - ncount++; - } else if(diagonalstyle == 1) { - int j2 = j1; - + for (int j2 = 0; j2 <= j1; j2++) for (int j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) - ncount++; - } else if(diagonalstyle == 2) { - ncount++; - } else if(diagonalstyle == 3) { - for (int j2 = 0; j2 <= j1; j2++) - for (int j = abs(j1 - j2); - j <= MIN(twojmax, j1 + j2); j += 2) - if (j >= j1) ncount++; - } - + j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) ncount++; return ncount; } diff --git a/src/SNAP/sna.cpp b/src/SNAP/sna.cpp index 75601b8e17..fd25d35677 100644 --- a/src/SNAP/sna.cpp +++ b/src/SNAP/sna.cpp @@ -1208,9 +1208,6 @@ double SNA::memory_usage() bytes += nmax * sizeof(double); // wj bytes += nmax * sizeof(double); // rcutij - printf("SNAP Z list Memory Usage %d\n",idxz_max * sizeof(double) * 2); - printf("SNAP CG list Memory Usage %d\n",idxcg_max * sizeof(double)); - return bytes; } /* ---------------------------------------------------------------------- */ From 67a1a63f5fec8a68f460e07d0c4768838cf83ce2 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Thu, 13 Jun 2019 10:10:37 -0600 Subject: [PATCH 68/90] Removed old text --- doc/src/compute_sna_atom.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/src/compute_sna_atom.txt b/doc/src/compute_sna_atom.txt index 10e68f5698..9dca6b1c6f 100644 --- a/doc/src/compute_sna_atom.txt +++ b/doc/src/compute_sna_atom.txt @@ -25,7 +25,6 @@ R_1, R_2,... = list of cutoff radii, one for each type (distance units) :l w_1, w_2,... = list of neighbor weights, one for each type :l zero or more keyword/value pairs may be appended :l keyword = {rmin0} or {switchflag} or {bzeroflag} or {quadraticflag} :l -// {3} = subset satisfying j2 <= j1 <= j {rmin0} value = parameter in distance to angle conversion (distance units) {switchflag} value = {0} or {1} {0} = do not use switching function From 5fb505ca8cbb7f0a8be96ae400eff1a0802eff98 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Thu, 13 Jun 2019 10:24:18 -0600 Subject: [PATCH 69/90] Fixed typo --- doc/src/compute_sna_atom.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/compute_sna_atom.txt b/doc/src/compute_sna_atom.txt index 9dca6b1c6f..518d28aec9 100644 --- a/doc/src/compute_sna_atom.txt +++ b/doc/src/compute_sna_atom.txt @@ -200,7 +200,7 @@ for the number of bispectrum components was removed in 2019, since all potentials use the value of 3, corresponding to the above set of bispectrum components. -ompute {snad/atom} evaluates a per-atom array. The columns are +Compute {snad/atom} evaluates a per-atom array. The columns are arranged into {ntypes} blocks, listed in order of atom type {I}. Each block contains three sub-blocks corresponding to the {x}, {y}, and {z} components of the atom position. Each of these sub-blocks contains From c1550ba29be413c47472974c1caddd3c64f4da66 Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Thu, 13 Jun 2019 22:23:01 +0200 Subject: [PATCH 70/90] implementation of inner/middle/outer for lj/class2 Implementation of inner/middle/outer functions in style lj/class2 to enable integration with respa --- src/CLASS2/pair_lj_class2.cpp | 1117 +++++++++++++++++++++------------ src/CLASS2/pair_lj_class2.h | 142 ++--- 2 files changed, 783 insertions(+), 476 deletions(-) diff --git a/src/CLASS2/pair_lj_class2.cpp b/src/CLASS2/pair_lj_class2.cpp index f2eef55290..dc34f39655 100644 --- a/src/CLASS2/pair_lj_class2.cpp +++ b/src/CLASS2/pair_lj_class2.cpp @@ -1,406 +1,711 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include "pair_lj_class2.h" -#include "atom.h" -#include "comm.h" -#include "force.h" -#include "neigh_list.h" -#include "math_const.h" -#include "memory.h" -#include "error.h" - -using namespace LAMMPS_NS; -using namespace MathConst; - -/* ---------------------------------------------------------------------- */ - -PairLJClass2::PairLJClass2(LAMMPS *lmp) : Pair(lmp) -{ - writedata = 1; -} - -/* ---------------------------------------------------------------------- */ - -PairLJClass2::~PairLJClass2() -{ - if (copymode) return; - - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - - memory->destroy(cut); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(offset); - } -} - -/* ---------------------------------------------------------------------- */ - -void PairLJClass2::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; - double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj; - int *ilist,*jlist,*numneigh,**firstneigh; - - evdwl = 0.0; - ev_init(eflag,vflag); - - double **x = atom->x; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - double *special_lj = force->special_lj; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - // loop over neighbors of my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - factor_lj = special_lj[sbmask(j)]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - jtype = type[j]; - - if (rsq < cutsq[itype][jtype]) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; - forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); - fpair = factor_lj*forcelj*r2inv; - - f[i][0] += delx*fpair; - f[i][1] += dely*fpair; - f[i][2] += delz*fpair; - if (newton_pair || j < nlocal) { - f[j][0] -= delx*fpair; - f[j][1] -= dely*fpair; - f[j][2] -= delz*fpair; - } - - if (eflag) { - evdwl = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - - offset[itype][jtype]; - evdwl *= factor_lj; - } - - if (evflag) ev_tally(i,j,nlocal,newton_pair, - evdwl,0.0,fpair,delx,dely,delz); - } - } - } - - if (vflag_fdotr) virial_fdotr_compute(); -} - -/* ---------------------------------------------------------------------- - allocate all arrays -------------------------------------------------------------------------- */ - -void PairLJClass2::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(epsilon,n+1,n+1,"pair:epsilon"); - memory->create(sigma,n+1,n+1,"pair:sigma"); - memory->create(lj1,n+1,n+1,"pair:lj1"); - memory->create(lj2,n+1,n+1,"pair:lj2"); - memory->create(lj3,n+1,n+1,"pair:lj3"); - memory->create(lj4,n+1,n+1,"pair:lj4"); - memory->create(offset,n+1,n+1,"pair:offset"); -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairLJClass2::settings(int narg, char **arg) -{ - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); - - cut_global = force->numeric(FLERR,arg[0]); - - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - } -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairLJClass2::coeff(int narg, char **arg) -{ - if (narg < 4 || narg > 5) error->all(FLERR,"Incorrect args for pair coefficients"); - if (!allocated) allocate(); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - double epsilon_one = force->numeric(FLERR,arg[2]); - double sigma_one = force->numeric(FLERR,arg[3]); - - double cut_one = cut_global; - if (narg == 5) cut_one = force->numeric(FLERR,arg[4]); - - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - epsilon[i][j] = epsilon_one; - sigma[i][j] = sigma_one; - cut[i][j] = cut_one; - setflag[i][j] = 1; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairLJClass2::init_one(int i, int j) -{ - // always mix epsilon,sigma via sixthpower rules - // mix distance via user-defined rule - - if (setflag[i][j] == 0) { - epsilon[i][j] = 2.0 * sqrt(epsilon[i][i]*epsilon[j][j]) * - pow(sigma[i][i],3.0) * pow(sigma[j][j],3.0) / - (pow(sigma[i][i],6.0) + pow(sigma[j][j],6.0)); - sigma[i][j] = - pow((0.5 * (pow(sigma[i][i],6.0) + pow(sigma[j][j],6.0))),1.0/6.0); - cut[i][j] = mix_distance(cut[i][i],cut[j][j]); - } - - lj1[i][j] = 18.0 * epsilon[i][j] * pow(sigma[i][j],9.0); - lj2[i][j] = 18.0 * epsilon[i][j] * pow(sigma[i][j],6.0); - lj3[i][j] = 2.0 * epsilon[i][j] * pow(sigma[i][j],9.0); - lj4[i][j] = 3.0 * epsilon[i][j] * pow(sigma[i][j],6.0); - - if (offset_flag && (cut[i][j] > 0.0)) { - double ratio = sigma[i][j] / cut[i][j]; - offset[i][j] = epsilon[i][j] * (2.0*pow(ratio,9.0) - 3.0*pow(ratio,6.0)); - } else offset[i][j] = 0.0; - - lj1[j][i] = lj1[i][j]; - lj2[j][i] = lj2[i][j]; - lj3[j][i] = lj3[i][j]; - lj4[j][i] = lj4[i][j]; - offset[j][i] = offset[i][j]; - - // compute I,J contribution to long-range tail correction - // count total # of atoms of type I and J via Allreduce - - if (tail_flag) { - int *type = atom->type; - int nlocal = atom->nlocal; - - double count[2],all[2]; - count[0] = count[1] = 0.0; - for (int k = 0; k < nlocal; k++) { - if (type[k] == i) count[0] += 1.0; - if (type[k] == j) count[1] += 1.0; - } - MPI_Allreduce(count,all,2,MPI_DOUBLE,MPI_SUM,world); - - double sig3 = sigma[i][j]*sigma[i][j]*sigma[i][j]; - double sig6 = sig3*sig3; - double rc3 = cut[i][j]*cut[i][j]*cut[i][j]; - double rc6 = rc3*rc3; - etail_ij = 2.0*MY_PI*all[0]*all[1]*epsilon[i][j] * - sig6 * (sig3 - 3.0*rc3) / (3.0*rc6); - ptail_ij = 2.0*MY_PI*all[0]*all[1]*epsilon[i][j] * - sig6 * (sig3 - 2.0*rc3) / rc6; - } - - return cut[i][j]; -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairLJClass2::write_restart(FILE *fp) -{ - write_restart_settings(fp); - - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) { - fwrite(&epsilon[i][j],sizeof(double),1,fp); - fwrite(&sigma[i][j],sizeof(double),1,fp); - fwrite(&cut[i][j],sizeof(double),1,fp); - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairLJClass2::read_restart(FILE *fp) -{ - read_restart_settings(fp); - allocate(); - - int i,j; - int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) { - if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); - if (setflag[i][j]) { - if (me == 0) { - fread(&epsilon[i][j],sizeof(double),1,fp); - fread(&sigma[i][j],sizeof(double),1,fp); - fread(&cut[i][j],sizeof(double),1,fp); - } - MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairLJClass2::write_restart_settings(FILE *fp) -{ - fwrite(&cut_global,sizeof(double),1,fp); - fwrite(&offset_flag,sizeof(int),1,fp); - fwrite(&mix_flag,sizeof(int),1,fp); - fwrite(&tail_flag,sizeof(int),1,fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairLJClass2::read_restart_settings(FILE *fp) -{ - int me = comm->me; - if (me == 0) { - fread(&cut_global,sizeof(double),1,fp); - fread(&offset_flag,sizeof(int),1,fp); - fread(&mix_flag,sizeof(int),1,fp); - fread(&tail_flag,sizeof(int),1,fp); - } - MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); - MPI_Bcast(&offset_flag,1,MPI_INT,0,world); - MPI_Bcast(&mix_flag,1,MPI_INT,0,world); - MPI_Bcast(&tail_flag,1,MPI_INT,0,world); -} - - -/* ---------------------------------------------------------------------- - proc 0 writes to data file -------------------------------------------------------------------------- */ - -void PairLJClass2::write_data(FILE *fp) -{ - for (int i = 1; i <= atom->ntypes; i++) - fprintf(fp,"%d %g %g\n",i,epsilon[i][i],sigma[i][i]); -} - -/* ---------------------------------------------------------------------- - proc 0 writes all pairs to data file -------------------------------------------------------------------------- */ - -void PairLJClass2::write_data_all(FILE *fp) -{ - for (int i = 1; i <= atom->ntypes; i++) - for (int j = i; j <= atom->ntypes; j++) - fprintf(fp,"%d %d %g %g %g\n",i,j,epsilon[i][j],sigma[i][j],cut[i][j]); -} - -/* ---------------------------------------------------------------------- */ - -double PairLJClass2::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq, - double /*factor_coul*/, double factor_lj, - double &fforce) -{ - double r2inv,rinv,r3inv,r6inv,forcelj,philj; - - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; - forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); - fforce = factor_lj*forcelj*r2inv; - - philj = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - - offset[itype][jtype]; - return factor_lj*philj; -} - -/* ---------------------------------------------------------------------- */ - -void *PairLJClass2::extract(const char *str, int &dim) -{ - dim = 2; - if (strcmp(str,"epsilon") == 0) return (void *) epsilon; - if (strcmp(str,"sigma") == 0) return (void *) sigma; - return NULL; -} +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_lj_class2.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "update.h" +#include "integrate.h" +#include "respa.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +/* ---------------------------------------------------------------------- */ + +PairLJClass2::PairLJClass2(LAMMPS *lmp) : Pair(lmp) +{ + respa_enable = 1; + writedata = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairLJClass2::~PairLJClass2() +{ + if (copymode) return; + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairLJClass2::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + ev_init(eflag,vflag); + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + evdwl = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - + offset[itype][jtype]; + evdwl *= factor_lj; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- +*/ + +void PairLJClass2::compute_inner() +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fpair; + double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj,rsw; + int *ilist,*jlist,*numneigh,**firstneigh; + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; + + double cut_out_on = cut_respa[0]; + double cut_out_off = cut_respa[1]; + + double cut_out_diff = cut_out_off - cut_out_on; + double cut_out_on_sq = cut_out_on*cut_out_on; + double cut_out_off_sq = cut_out_off*cut_out_off; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cut_out_off_sq) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + jtype = type[j]; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + if (rsq > cut_out_on_sq) { + rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff; + fpair *= 1.0 - rsw*rsw*(3.0 - 2.0*rsw); + } + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +void PairLJClass2::compute_middle() +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fpair; + double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj,rsw; + int *ilist,*jlist,*numneigh,**firstneigh; + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; + + double cut_in_off = cut_respa[0]; + double cut_in_on = cut_respa[1]; + double cut_out_on = cut_respa[2]; + double cut_out_off = cut_respa[3]; + + double cut_in_diff = cut_in_on - cut_in_off; + double cut_out_diff = cut_out_off - cut_out_on; + double cut_in_off_sq = cut_in_off*cut_in_off; + double cut_in_on_sq = cut_in_on*cut_in_on; + double cut_out_on_sq = cut_out_on*cut_out_on; + double cut_out_off_sq = cut_out_off*cut_out_off; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cut_out_off_sq && rsq > cut_in_off_sq) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + jtype = type[j]; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + if (rsq < cut_in_on_sq) { + rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff; + fpair *= rsw*rsw*(3.0 - 2.0*rsw); + } + if (rsq > cut_out_on_sq) { + rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff; + fpair *= 1.0 + rsw*rsw*(2.0*rsw - 3.0); + } + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +void PairLJClass2::compute_outer(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj,rsw; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + ev_init(eflag,vflag); + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + double cut_in_off = cut_respa[2]; + double cut_in_on = cut_respa[3]; + + double cut_in_diff = cut_in_on - cut_in_off; + double cut_in_off_sq = cut_in_off*cut_in_off; + double cut_in_on_sq = cut_in_on*cut_in_on; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + if (rsq > cut_in_off_sq) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + if (rsq < cut_in_on_sq) { + rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff; + fpair *= rsw*rsw*(3.0 - 2.0*rsw); + } + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + } + + if (eflag) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + evdwl = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - + offset[itype][jtype]; + evdwl *= factor_lj; + } + + if (vflag) { + if (rsq <= cut_in_off_sq) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + } else if (rsq < cut_in_on_sq) + fpair = factor_lj*forcelj*r2inv; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,fpair,delx,dely,delz); + } + } + } +} +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairLJClass2::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(epsilon,n+1,n+1,"pair:epsilon"); + memory->create(sigma,n+1,n+1,"pair:sigma"); + memory->create(lj1,n+1,n+1,"pair:lj1"); + memory->create(lj2,n+1,n+1,"pair:lj2"); + memory->create(lj3,n+1,n+1,"pair:lj3"); + memory->create(lj4,n+1,n+1,"pair:lj4"); + memory->create(offset,n+1,n+1,"pair:offset"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairLJClass2::settings(int narg, char **arg) +{ + if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + + cut_global = force->numeric(FLERR,arg[0]); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut[i][j] = cut_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairLJClass2::coeff(int narg, char **arg) +{ + if (narg < 4 || narg > 5) error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double epsilon_one = force->numeric(FLERR,arg[2]); + double sigma_one = force->numeric(FLERR,arg[3]); + + double cut_one = cut_global; + if (narg == 5) cut_one = force->numeric(FLERR,arg[4]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + epsilon[i][j] = epsilon_one; + sigma[i][j] = sigma_one; + cut[i][j] = cut_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairLJClass2::init_style() +{ + // request regular or rRESPA neighbor list + + int irequest; + int respa = 0; + + if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { + if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; + if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + } + + irequest = neighbor->request(this,instance_me); + + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; + + // set rRESPA cutoffs + + if (strstr(update->integrate_style,"respa") && + ((Respa *) update->integrate)->level_inner >= 0) + cut_respa = ((Respa *) update->integrate)->cutoff; + else cut_respa = NULL; +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairLJClass2::init_one(int i, int j) +{ + // always mix epsilon,sigma via sixthpower rules + // mix distance via user-defined rule + + if (setflag[i][j] == 0) { + epsilon[i][j] = 2.0 * sqrt(epsilon[i][i]*epsilon[j][j]) * + pow(sigma[i][i],3.0) * pow(sigma[j][j],3.0) / + (pow(sigma[i][i],6.0) + pow(sigma[j][j],6.0)); + sigma[i][j] = + pow((0.5 * (pow(sigma[i][i],6.0) + pow(sigma[j][j],6.0))),1.0/6.0); + cut[i][j] = mix_distance(cut[i][i],cut[j][j]); + } + + lj1[i][j] = 18.0 * epsilon[i][j] * pow(sigma[i][j],9.0); + lj2[i][j] = 18.0 * epsilon[i][j] * pow(sigma[i][j],6.0); + lj3[i][j] = 2.0 * epsilon[i][j] * pow(sigma[i][j],9.0); + lj4[i][j] = 3.0 * epsilon[i][j] * pow(sigma[i][j],6.0); + + if (offset_flag && (cut[i][j] > 0.0)) { + double ratio = sigma[i][j] / cut[i][j]; + offset[i][j] = epsilon[i][j] * (2.0*pow(ratio,9.0) - 3.0*pow(ratio,6.0)); + } else offset[i][j] = 0.0; + + lj1[j][i] = lj1[i][j]; + lj2[j][i] = lj2[i][j]; + lj3[j][i] = lj3[i][j]; + lj4[j][i] = lj4[i][j]; + offset[j][i] = offset[i][j]; + + // check interior rRESPA cutoff + + if (cut_respa && cut[i][j] < cut_respa[3]) + error->all(FLERR,"Pair cutoff < Respa interior cutoff"); + + // compute I,J contribution to long-range tail correction + // count total # of atoms of type I and J via Allreduce + + if (tail_flag) { + int *type = atom->type; + int nlocal = atom->nlocal; + + double count[2],all[2]; + count[0] = count[1] = 0.0; + for (int k = 0; k < nlocal; k++) { + if (type[k] == i) count[0] += 1.0; + if (type[k] == j) count[1] += 1.0; + } + MPI_Allreduce(count,all,2,MPI_DOUBLE,MPI_SUM,world); + + double sig3 = sigma[i][j]*sigma[i][j]*sigma[i][j]; + double sig6 = sig3*sig3; + double rc3 = cut[i][j]*cut[i][j]*cut[i][j]; + double rc6 = rc3*rc3; + etail_ij = 2.0*MY_PI*all[0]*all[1]*epsilon[i][j] * + sig6 * (sig3 - 3.0*rc3) / (3.0*rc6); + ptail_ij = 2.0*MY_PI*all[0]*all[1]*epsilon[i][j] * + sig6 * (sig3 - 2.0*rc3) / rc6; + } + + return cut[i][j]; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairLJClass2::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&epsilon[i][j],sizeof(double),1,fp); + fwrite(&sigma[i][j],sizeof(double),1,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairLJClass2::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&epsilon[i][j],sizeof(double),1,fp); + fread(&sigma[i][j],sizeof(double),1,fp); + fread(&cut[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairLJClass2::write_restart_settings(FILE *fp) +{ + fwrite(&cut_global,sizeof(double),1,fp); + fwrite(&offset_flag,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); + fwrite(&tail_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairLJClass2::read_restart_settings(FILE *fp) +{ + int me = comm->me; + if (me == 0) { + fread(&cut_global,sizeof(double),1,fp); + fread(&offset_flag,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + fread(&tail_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&offset_flag,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + MPI_Bcast(&tail_flag,1,MPI_INT,0,world); +} + + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairLJClass2::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp,"%d %g %g\n",i,epsilon[i][i],sigma[i][i]); +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairLJClass2::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp,"%d %d %g %g %g\n",i,j,epsilon[i][j],sigma[i][j],cut[i][j]); +} + +/* ---------------------------------------------------------------------- */ + +double PairLJClass2::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq, + double /*factor_coul*/, double factor_lj, + double &fforce) +{ + double r2inv,rinv,r3inv,r6inv,forcelj,philj; + + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fforce = factor_lj*forcelj*r2inv; + + philj = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - + offset[itype][jtype]; + return factor_lj*philj; +} + +/* ---------------------------------------------------------------------- */ + +void *PairLJClass2::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"epsilon") == 0) return (void *) epsilon; + if (strcmp(str,"sigma") == 0) return (void *) sigma; + return NULL; +} \ No newline at end of file diff --git a/src/CLASS2/pair_lj_class2.h b/src/CLASS2/pair_lj_class2.h index 02a1f44ff7..47610c0d06 100644 --- a/src/CLASS2/pair_lj_class2.h +++ b/src/CLASS2/pair_lj_class2.h @@ -1,70 +1,72 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(lj/class2,PairLJClass2) - -#else - -#ifndef LMP_PAIR_LJ_CLASS2_H -#define LMP_PAIR_LJ_CLASS2_H - -#include "pair.h" - -namespace LAMMPS_NS { - -class PairLJClass2 : public Pair { - public: - PairLJClass2(class LAMMPS *); - virtual ~PairLJClass2(); - virtual void compute(int, int); - virtual void settings(int, char **); - void coeff(int, char **); - virtual double init_one(int, int); - void write_restart(FILE *); - void read_restart(FILE *); - void write_restart_settings(FILE *); - void read_restart_settings(FILE *); - void write_data(FILE *); - void write_data_all(FILE *); - double single(int, int, int, int, double, double, double, double &); - void *extract(const char *, int &); - - protected: - double cut_global; - double **cut; - double **epsilon,**sigma; - double **lj1,**lj2,**lj3,**lj4,**offset; - - virtual void allocate(); -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: - -E: Illegal ... command - -Self-explanatory. Check the input script syntax and compare to the -documentation for the command. You can use -echo screen as a -command-line option when running LAMMPS to see the offending line. - -E: Incorrect args for pair coefficients - -Self-explanatory. Check the input script or data file. - -*/ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(lj/class2,PairLJClass2) + +#else + +#ifndef LMP_PAIR_LJ_CLASS2_H +#define LMP_PAIR_LJ_CLASS2_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairLJClass2 : public Pair { + public: + PairLJClass2(class LAMMPS *); + virtual ~PairLJClass2(); + virtual void compute(int, int); + virtual void settings(int, char **); + void coeff(int, char **); + void init_style(); + virtual double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void write_data(FILE *); + void write_data_all(FILE *); + double single(int, int, int, int, double, double, double, double &); + void *extract(const char *, int &); + + void compute_inner(); + void compute_middle(); + void compute_outer(int, int); + + protected: + double cut_global; + double **cut; + double **epsilon,**sigma; + double **lj1,**lj2,**lj3,**lj4,**offset; + double *cut_respa; + + virtual void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: +E: Illegal ... command +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. +E: Incorrect args for pair coefficients +Self-explanatory. Check the input script or data file. +E: Pair cutoff < Respa interior cutoff +One or more pairwise cutoffs are too short to use with the specified +rRESPA cutoffs. +*/ \ No newline at end of file From 4d7d3a5d530c7b847dd08ca62aa7d091a94e6139 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Thu, 13 Jun 2019 15:56:18 -0600 Subject: [PATCH 71/90] Switched algorithm for compute_yi to one based on zlist ordering --- src/SNAP/sna.cpp | 155 +++++++++++++++++++++++------------------------ 1 file changed, 76 insertions(+), 79 deletions(-) diff --git a/src/SNAP/sna.cpp b/src/SNAP/sna.cpp index fd25d35677..ec545c51b2 100644 --- a/src/SNAP/sna.cpp +++ b/src/SNAP/sna.cpp @@ -398,13 +398,18 @@ void SNA::compute_zi() } /* ---------------------------------------------------------------------- - compute Yi from Ui without storing Zi, looping over ylist + compute Yi from Ui without storing Zi, looping over zlist indices ------------------------------------------------------------------------- */ void SNA::compute_yi(const double* beta) { + int j; + int jjz; + int jju; + double betaj; + for(int j = 0; j <= twojmax; j++) { - int jju = idxu_block[j]; + jju = idxu_block[j]; for(int mb = 0; 2*mb <= j; mb++) for(int ma = 0; ma <= j; ma++) { ylist_r[jju] = 0.0; @@ -413,93 +418,85 @@ void SNA::compute_yi(const double* beta) } // end loop over ma, mb } // end loop over j - for(int jjb = 0; jjb < idxb_max; jjb++) { - const int j1b = idxb[jjb].j1; - const int j2b = idxb[jjb].j2; - const int j3b = idxb[jjb].j; + int ma2, mb2; + for(int jjz = 0; jjz < idxz_max; jjz++) { + const int j1 = idxz[jjz].j1; + const int j2 = idxz[jjz].j2; + const int j = idxz[jjz].j; + const int ma1min = idxz[jjz].ma1min; + const int ma2max = idxz[jjz].ma2max; + const int na = idxz[jjz].na; + const int mb1min = idxz[jjz].mb1min; + const int mb2max = idxz[jjz].mb2max; + const int nb = idxz[jjz].nb; - compute_yterm(j1b,j2b,j3b,beta); - compute_yterm(j3b,j2b,j1b,beta); - compute_yterm(j3b,j1b,j2b,beta); + const double* cgblock = cglist + idxcg_block[j1][j2][j]; + int mb = (2 * (mb1min+mb2max) - j1 - j2 + j) / 2; + int ma = (2 * (ma1min+ma2max) - j1 - j2 + j) / 2; - } // end loop over jjb + double ztmp_r = 0.0; + double ztmp_i = 0.0; -} + int jju1 = idxu_block[j1] + (j1+1)*mb1min; + int jju2 = idxu_block[j2] + (j2+1)*mb2max; + int icgb = mb1min*(j2+1) + mb2max; + for(int ib = 0; ib < nb; ib++) { -void SNA::compute_yterm(int j1, int j2, int j, const double* beta) { - double betaj; + double suma1_r = 0.0; + double suma1_i = 0.0; - int jju = idxu_block[j]; - int jjz = idxz_block[j1][j2][j]; + const double* u1_r = &ulisttot_r[jju1]; + const double* u1_i = &ulisttot_i[jju1]; + const double* u2_r = &ulisttot_r[jju2]; + const double* u2_i = &ulisttot_i[jju2]; + + int ma1 = ma1min; + int ma2 = ma2max; + int icga = ma1min*(j2+1) + ma2max; + + for(int ia = 0; ia < na; ia++) { + suma1_r += cgblock[icga] * (u1_r[ma1] * u2_r[ma2] - u1_i[ma1] * u2_i[ma2]); + suma1_i += cgblock[icga] * (u1_r[ma1] * u2_i[ma2] + u1_i[ma1] * u2_r[ma2]); + ma1++; + ma2--; + icga += j2; + } // end loop over ia + + ztmp_r += cgblock[icgb] * suma1_r; + ztmp_i += cgblock[icgb] * suma1_i; + jju1 += j1+1; + jju2 -= j2+1; + icgb += j2; + } // end loop over ib + + // apply to z(j1,j2,j,ma,mb) to unique element of y(j) + // find right y_list[jju] and beta[jjb] entries + // multiply and divide by j+1 factors + // account for multiplicity of 1, 2, or 3 + + const int jju = idxz[jjz].jju; // pick out right beta value - if (j >= j1) { - const int jjb = idxb_block[j1][j2][j]; - betaj = beta[jjb]; - } else if (j >= j2) { - const int jjb = idxb_block[j][j2][j1]; - betaj = beta[jjb]*(j1+1)/(j+1.0); - } else { - const int jjb = idxb_block[j2][j][j1]; - betaj = beta[jjb]*(j1+1)/(j+1.0); - } + if (j >= j1) { + const int jjb = idxb_block[j1][j2][j]; + if (j1 == j) { + if (j2 == j) betaj = 3*beta[jjb]; + else betaj = 2*beta[jjb]; + } else betaj = beta[jjb]; + } else if (j >= j2) { + const int jjb = idxb_block[j][j2][j1]; + if (j2 == j) betaj = 2*beta[jjb]*(j1+1)/(j+1.0); + else betaj = beta[jjb]*(j1+1)/(j+1.0); + } else { + const int jjb = idxb_block[j2][j][j1]; + betaj = beta[jjb]*(j1+1)/(j+1.0); + } - // can replace this with a single loop over jjz + ylist_r[jju] += betaj*ztmp_r; + ylist_i[jju] += betaj*ztmp_i; - for (int mb = 0; 2*mb <= j; mb++) - for (int ma = 0; ma <= j; ma++) { - - const int ma1min = idxz[jjz].ma1min; - const int ma2max = idxz[jjz].ma2max; - const int na = idxz[jjz].na; - const int mb1min = idxz[jjz].mb1min; - const int mb2max = idxz[jjz].mb2max; - const int nb = idxz[jjz].nb; - - const double* cgblock = cglist + idxcg_block[j1][j2][j]; - - double ztmp_r = 0.0; - double ztmp_i = 0.0; - - int jju1 = idxu_block[j1] + (j1+1)*mb1min; - int jju2 = idxu_block[j2] + (j2+1)*mb2max; - int icgb = mb1min*(j2+1) + mb2max; - for(int ib = 0; ib < nb; ib++) { - - double suma1_r = 0.0; - double suma1_i = 0.0; - - const double* u1_r = &ulisttot_r[jju1]; - const double* u1_i = &ulisttot_i[jju1]; - const double* u2_r = &ulisttot_r[jju2]; - const double* u2_i = &ulisttot_i[jju2]; - - int ma1 = ma1min; - int ma2 = ma2max; - int icga = ma1min*(j2+1) + ma2max; - - for(int ia = 0; ia < na; ia++) { - suma1_r += cgblock[icga] * (u1_r[ma1] * u2_r[ma2] - u1_i[ma1] * u2_i[ma2]); - suma1_i += cgblock[icga] * (u1_r[ma1] * u2_i[ma2] + u1_i[ma1] * u2_r[ma2]); - ma1++; - ma2--; - icga += j2; - } // end loop over ia - - ztmp_r += cgblock[icgb] * suma1_r; - ztmp_i += cgblock[icgb] * suma1_i; - jju1 += j1+1; - jju2 -= j2+1; - icgb += j2; - } // end loop over ib - - // printf("jju betaj ztmp ylist %d %g %g %d %d %d %d %d\n",jju,betaj,ztmp_r,j1,j2,j,ma,mb); - ylist_r[jju] += betaj*ztmp_r; - ylist_i[jju] += betaj*ztmp_i; - jjz++; - jju++; - } // end loop over ma, mb + } // end loop over jjz } /* ---------------------------------------------------------------------- From e7116c8680934943ee8b8f513b70357a3e3a105c Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 14 Jun 2019 09:04:03 +0200 Subject: [PATCH 72/90] Update pair_class2.txt Addition of a few lines in the documentation file --- doc/src/pair_class2.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/src/pair_class2.txt b/doc/src/pair_class2.txt index 8d4aa48602..2d6b325fed 100644 --- a/doc/src/pair_class2.txt +++ b/doc/src/pair_class2.txt @@ -155,9 +155,12 @@ All of the lj/class2 pair styles write their information to "binary restart files"_restart.html, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -All of the lj/class2 pair styles can only be used via the {pair} -keyword of the "run_style respa"_run_style.html command. They do not -support the {inner}, {middle}, {outer} keywords. +Only the {lj/class2} pair style support the use of the +{inner}, {middle}, and {outer} keywords of the "run_style +respa"_run_style.html command, meaning the pairwise forces can be +partitioned by distance at different levels of the rRESPA hierarchy. +The other styles only support the {pair} keyword of run_style respa. +See the "run_style"_run_style.html command for details. [Restrictions:] From 43e3c1520b21578be3501bf6a168f552ed58af56 Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 14 Jun 2019 11:50:56 +0200 Subject: [PATCH 73/90] cleaning pair_lj_class2.h of windows line endings removing DOS/Windows style CR/LF line endings --- src/CLASS2/pair_lj_class2.h | 145 ++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 72 deletions(-) diff --git a/src/CLASS2/pair_lj_class2.h b/src/CLASS2/pair_lj_class2.h index 47610c0d06..5bb2a1f0d9 100644 --- a/src/CLASS2/pair_lj_class2.h +++ b/src/CLASS2/pair_lj_class2.h @@ -1,72 +1,73 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(lj/class2,PairLJClass2) - -#else - -#ifndef LMP_PAIR_LJ_CLASS2_H -#define LMP_PAIR_LJ_CLASS2_H - -#include "pair.h" - -namespace LAMMPS_NS { - -class PairLJClass2 : public Pair { - public: - PairLJClass2(class LAMMPS *); - virtual ~PairLJClass2(); - virtual void compute(int, int); - virtual void settings(int, char **); - void coeff(int, char **); - void init_style(); - virtual double init_one(int, int); - void write_restart(FILE *); - void read_restart(FILE *); - void write_restart_settings(FILE *); - void read_restart_settings(FILE *); - void write_data(FILE *); - void write_data_all(FILE *); - double single(int, int, int, int, double, double, double, double &); - void *extract(const char *, int &); - - void compute_inner(); - void compute_middle(); - void compute_outer(int, int); - - protected: - double cut_global; - double **cut; - double **epsilon,**sigma; - double **lj1,**lj2,**lj3,**lj4,**offset; - double *cut_respa; - - virtual void allocate(); -}; - -} - -#endif -#endif - -/* ERROR/WARNING messages: -E: Illegal ... command -Self-explanatory. Check the input script syntax and compare to the -documentation for the command. You can use -echo screen as a -command-line option when running LAMMPS to see the offending line. -E: Incorrect args for pair coefficients -Self-explanatory. Check the input script or data file. -E: Pair cutoff < Respa interior cutoff -One or more pairwise cutoffs are too short to use with the specified -rRESPA cutoffs. -*/ \ No newline at end of file +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(lj/class2,PairLJClass2) + +#else + +#ifndef LMP_PAIR_LJ_CLASS2_H +#define LMP_PAIR_LJ_CLASS2_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairLJClass2 : public Pair { + public: + PairLJClass2(class LAMMPS *); + virtual ~PairLJClass2(); + virtual void compute(int, int); + virtual void settings(int, char **); + void coeff(int, char **); + void init_style(); + virtual double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void write_data(FILE *); + void write_data_all(FILE *); + double single(int, int, int, int, double, double, double, double &); + void *extract(const char *, int &); + + void compute_inner(); + void compute_middle(); + void compute_outer(int, int); + + protected: + double cut_global; + double **cut; + double **epsilon,**sigma; + double **lj1,**lj2,**lj3,**lj4,**offset; + double *cut_respa; + + virtual void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: +E: Illegal ... command +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. +E: Incorrect args for pair coefficients +Self-explanatory. Check the input script or data file. +E: Pair cutoff < Respa interior cutoff +One or more pairwise cutoffs are too short to use with the specified +rRESPA cutoffs. +*/ + From ac57b41b4dd478c1354c7999641ee9d282ccbf75 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 14 Jun 2019 07:13:06 -0400 Subject: [PATCH 74/90] fix line endings and missing EOL at end --- src/CLASS2/pair_lj_class2.cpp | 1422 ++++++++++++++++----------------- src/CLASS2/pair_lj_class2.h | 1 - 2 files changed, 711 insertions(+), 712 deletions(-) diff --git a/src/CLASS2/pair_lj_class2.cpp b/src/CLASS2/pair_lj_class2.cpp index dc34f39655..60b988926a 100644 --- a/src/CLASS2/pair_lj_class2.cpp +++ b/src/CLASS2/pair_lj_class2.cpp @@ -1,711 +1,711 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include "pair_lj_class2.h" -#include "atom.h" -#include "comm.h" -#include "force.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "update.h" -#include "integrate.h" -#include "respa.h" -#include "math_const.h" -#include "memory.h" -#include "error.h" - -using namespace LAMMPS_NS; -using namespace MathConst; - -/* ---------------------------------------------------------------------- */ - -PairLJClass2::PairLJClass2(LAMMPS *lmp) : Pair(lmp) -{ - respa_enable = 1; - writedata = 1; -} - -/* ---------------------------------------------------------------------- */ - -PairLJClass2::~PairLJClass2() -{ - if (copymode) return; - - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - - memory->destroy(cut); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(offset); - } -} - -/* ---------------------------------------------------------------------- */ - -void PairLJClass2::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; - double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj; - int *ilist,*jlist,*numneigh,**firstneigh; - - evdwl = 0.0; - ev_init(eflag,vflag); - - double **x = atom->x; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - double *special_lj = force->special_lj; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - // loop over neighbors of my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - factor_lj = special_lj[sbmask(j)]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - jtype = type[j]; - - if (rsq < cutsq[itype][jtype]) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; - forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); - fpair = factor_lj*forcelj*r2inv; - - f[i][0] += delx*fpair; - f[i][1] += dely*fpair; - f[i][2] += delz*fpair; - if (newton_pair || j < nlocal) { - f[j][0] -= delx*fpair; - f[j][1] -= dely*fpair; - f[j][2] -= delz*fpair; - } - - if (eflag) { - evdwl = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - - offset[itype][jtype]; - evdwl *= factor_lj; - } - - if (evflag) ev_tally(i,j,nlocal,newton_pair, - evdwl,0.0,fpair,delx,dely,delz); - } - } - } - - if (vflag_fdotr) virial_fdotr_compute(); -} - -/* ---------------------------------------------------------------------- -*/ - -void PairLJClass2::compute_inner() -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fpair; - double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj,rsw; - int *ilist,*jlist,*numneigh,**firstneigh; - - double **x = atom->x; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - double *special_lj = force->special_lj; - int newton_pair = force->newton_pair; - - inum = list->inum_inner; - ilist = list->ilist_inner; - numneigh = list->numneigh_inner; - firstneigh = list->firstneigh_inner; - - double cut_out_on = cut_respa[0]; - double cut_out_off = cut_respa[1]; - - double cut_out_diff = cut_out_off - cut_out_on; - double cut_out_on_sq = cut_out_on*cut_out_on; - double cut_out_off_sq = cut_out_off*cut_out_off; - - // loop over neighbors of my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - factor_lj = special_lj[sbmask(j)]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if (rsq < cut_out_off_sq) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; - jtype = type[j]; - forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); - fpair = factor_lj*forcelj*r2inv; - if (rsq > cut_out_on_sq) { - rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff; - fpair *= 1.0 - rsw*rsw*(3.0 - 2.0*rsw); - } - - f[i][0] += delx*fpair; - f[i][1] += dely*fpair; - f[i][2] += delz*fpair; - if (newton_pair || j < nlocal) { - f[j][0] -= delx*fpair; - f[j][1] -= dely*fpair; - f[j][2] -= delz*fpair; - } - } - } - } -} - -/* ---------------------------------------------------------------------- */ - -void PairLJClass2::compute_middle() -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,fpair; - double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj,rsw; - int *ilist,*jlist,*numneigh,**firstneigh; - - double **x = atom->x; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - double *special_lj = force->special_lj; - int newton_pair = force->newton_pair; - - inum = list->inum_middle; - ilist = list->ilist_middle; - numneigh = list->numneigh_middle; - firstneigh = list->firstneigh_middle; - - double cut_in_off = cut_respa[0]; - double cut_in_on = cut_respa[1]; - double cut_out_on = cut_respa[2]; - double cut_out_off = cut_respa[3]; - - double cut_in_diff = cut_in_on - cut_in_off; - double cut_out_diff = cut_out_off - cut_out_on; - double cut_in_off_sq = cut_in_off*cut_in_off; - double cut_in_on_sq = cut_in_on*cut_in_on; - double cut_out_on_sq = cut_out_on*cut_out_on; - double cut_out_off_sq = cut_out_off*cut_out_off; - - // loop over neighbors of my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - factor_lj = special_lj[sbmask(j)]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if (rsq < cut_out_off_sq && rsq > cut_in_off_sq) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; - jtype = type[j]; - forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); - fpair = factor_lj*forcelj*r2inv; - if (rsq < cut_in_on_sq) { - rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff; - fpair *= rsw*rsw*(3.0 - 2.0*rsw); - } - if (rsq > cut_out_on_sq) { - rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff; - fpair *= 1.0 + rsw*rsw*(2.0*rsw - 3.0); - } - - f[i][0] += delx*fpair; - f[i][1] += dely*fpair; - f[i][2] += delz*fpair; - if (newton_pair || j < nlocal) { - f[j][0] -= delx*fpair; - f[j][1] -= dely*fpair; - f[j][2] -= delz*fpair; - } - } - } - } -} - -/* ---------------------------------------------------------------------- */ - -void PairLJClass2::compute_outer(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; - double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj,rsw; - int *ilist,*jlist,*numneigh,**firstneigh; - - evdwl = 0.0; - ev_init(eflag,vflag); - - double **x = atom->x; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - double *special_lj = force->special_lj; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - double cut_in_off = cut_respa[2]; - double cut_in_on = cut_respa[3]; - - double cut_in_diff = cut_in_on - cut_in_off; - double cut_in_off_sq = cut_in_off*cut_in_off; - double cut_in_on_sq = cut_in_on*cut_in_on; - - // loop over neighbors of my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - factor_lj = special_lj[sbmask(j)]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - jtype = type[j]; - - if (rsq < cutsq[itype][jtype]) { - if (rsq > cut_in_off_sq) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; - forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); - fpair = factor_lj*forcelj*r2inv; - if (rsq < cut_in_on_sq) { - rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff; - fpair *= rsw*rsw*(3.0 - 2.0*rsw); - } - - f[i][0] += delx*fpair; - f[i][1] += dely*fpair; - f[i][2] += delz*fpair; - if (newton_pair || j < nlocal) { - f[j][0] -= delx*fpair; - f[j][1] -= dely*fpair; - f[j][2] -= delz*fpair; - } - } - - if (eflag) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; - evdwl = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - - offset[itype][jtype]; - evdwl *= factor_lj; - } - - if (vflag) { - if (rsq <= cut_in_off_sq) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; - forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); - fpair = factor_lj*forcelj*r2inv; - } else if (rsq < cut_in_on_sq) - fpair = factor_lj*forcelj*r2inv; - } - - if (evflag) ev_tally(i,j,nlocal,newton_pair, - evdwl,0.0,fpair,delx,dely,delz); - } - } - } -} -/* ---------------------------------------------------------------------- - allocate all arrays -------------------------------------------------------------------------- */ - -void PairLJClass2::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(epsilon,n+1,n+1,"pair:epsilon"); - memory->create(sigma,n+1,n+1,"pair:sigma"); - memory->create(lj1,n+1,n+1,"pair:lj1"); - memory->create(lj2,n+1,n+1,"pair:lj2"); - memory->create(lj3,n+1,n+1,"pair:lj3"); - memory->create(lj4,n+1,n+1,"pair:lj4"); - memory->create(offset,n+1,n+1,"pair:offset"); -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairLJClass2::settings(int narg, char **arg) -{ - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); - - cut_global = force->numeric(FLERR,arg[0]); - - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - } -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairLJClass2::coeff(int narg, char **arg) -{ - if (narg < 4 || narg > 5) error->all(FLERR,"Incorrect args for pair coefficients"); - if (!allocated) allocate(); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - double epsilon_one = force->numeric(FLERR,arg[2]); - double sigma_one = force->numeric(FLERR,arg[3]); - - double cut_one = cut_global; - if (narg == 5) cut_one = force->numeric(FLERR,arg[4]); - - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - epsilon[i][j] = epsilon_one; - sigma[i][j] = sigma_one; - cut[i][j] = cut_one; - setflag[i][j] = 1; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init specific to this pair style -------------------------------------------------------------------------- */ - -void PairLJClass2::init_style() -{ - // request regular or rRESPA neighbor list - - int irequest; - int respa = 0; - - if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { - if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; - if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; - } - - irequest = neighbor->request(this,instance_me); - - if (respa >= 1) { - neighbor->requests[irequest]->respaouter = 1; - neighbor->requests[irequest]->respainner = 1; - } - if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; - - // set rRESPA cutoffs - - if (strstr(update->integrate_style,"respa") && - ((Respa *) update->integrate)->level_inner >= 0) - cut_respa = ((Respa *) update->integrate)->cutoff; - else cut_respa = NULL; -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairLJClass2::init_one(int i, int j) -{ - // always mix epsilon,sigma via sixthpower rules - // mix distance via user-defined rule - - if (setflag[i][j] == 0) { - epsilon[i][j] = 2.0 * sqrt(epsilon[i][i]*epsilon[j][j]) * - pow(sigma[i][i],3.0) * pow(sigma[j][j],3.0) / - (pow(sigma[i][i],6.0) + pow(sigma[j][j],6.0)); - sigma[i][j] = - pow((0.5 * (pow(sigma[i][i],6.0) + pow(sigma[j][j],6.0))),1.0/6.0); - cut[i][j] = mix_distance(cut[i][i],cut[j][j]); - } - - lj1[i][j] = 18.0 * epsilon[i][j] * pow(sigma[i][j],9.0); - lj2[i][j] = 18.0 * epsilon[i][j] * pow(sigma[i][j],6.0); - lj3[i][j] = 2.0 * epsilon[i][j] * pow(sigma[i][j],9.0); - lj4[i][j] = 3.0 * epsilon[i][j] * pow(sigma[i][j],6.0); - - if (offset_flag && (cut[i][j] > 0.0)) { - double ratio = sigma[i][j] / cut[i][j]; - offset[i][j] = epsilon[i][j] * (2.0*pow(ratio,9.0) - 3.0*pow(ratio,6.0)); - } else offset[i][j] = 0.0; - - lj1[j][i] = lj1[i][j]; - lj2[j][i] = lj2[i][j]; - lj3[j][i] = lj3[i][j]; - lj4[j][i] = lj4[i][j]; - offset[j][i] = offset[i][j]; - - // check interior rRESPA cutoff - - if (cut_respa && cut[i][j] < cut_respa[3]) - error->all(FLERR,"Pair cutoff < Respa interior cutoff"); - - // compute I,J contribution to long-range tail correction - // count total # of atoms of type I and J via Allreduce - - if (tail_flag) { - int *type = atom->type; - int nlocal = atom->nlocal; - - double count[2],all[2]; - count[0] = count[1] = 0.0; - for (int k = 0; k < nlocal; k++) { - if (type[k] == i) count[0] += 1.0; - if (type[k] == j) count[1] += 1.0; - } - MPI_Allreduce(count,all,2,MPI_DOUBLE,MPI_SUM,world); - - double sig3 = sigma[i][j]*sigma[i][j]*sigma[i][j]; - double sig6 = sig3*sig3; - double rc3 = cut[i][j]*cut[i][j]*cut[i][j]; - double rc6 = rc3*rc3; - etail_ij = 2.0*MY_PI*all[0]*all[1]*epsilon[i][j] * - sig6 * (sig3 - 3.0*rc3) / (3.0*rc6); - ptail_ij = 2.0*MY_PI*all[0]*all[1]*epsilon[i][j] * - sig6 * (sig3 - 2.0*rc3) / rc6; - } - - return cut[i][j]; -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairLJClass2::write_restart(FILE *fp) -{ - write_restart_settings(fp); - - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) { - fwrite(&epsilon[i][j],sizeof(double),1,fp); - fwrite(&sigma[i][j],sizeof(double),1,fp); - fwrite(&cut[i][j],sizeof(double),1,fp); - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairLJClass2::read_restart(FILE *fp) -{ - read_restart_settings(fp); - allocate(); - - int i,j; - int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) { - if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); - if (setflag[i][j]) { - if (me == 0) { - fread(&epsilon[i][j],sizeof(double),1,fp); - fread(&sigma[i][j],sizeof(double),1,fp); - fread(&cut[i][j],sizeof(double),1,fp); - } - MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairLJClass2::write_restart_settings(FILE *fp) -{ - fwrite(&cut_global,sizeof(double),1,fp); - fwrite(&offset_flag,sizeof(int),1,fp); - fwrite(&mix_flag,sizeof(int),1,fp); - fwrite(&tail_flag,sizeof(int),1,fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairLJClass2::read_restart_settings(FILE *fp) -{ - int me = comm->me; - if (me == 0) { - fread(&cut_global,sizeof(double),1,fp); - fread(&offset_flag,sizeof(int),1,fp); - fread(&mix_flag,sizeof(int),1,fp); - fread(&tail_flag,sizeof(int),1,fp); - } - MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); - MPI_Bcast(&offset_flag,1,MPI_INT,0,world); - MPI_Bcast(&mix_flag,1,MPI_INT,0,world); - MPI_Bcast(&tail_flag,1,MPI_INT,0,world); -} - - -/* ---------------------------------------------------------------------- - proc 0 writes to data file -------------------------------------------------------------------------- */ - -void PairLJClass2::write_data(FILE *fp) -{ - for (int i = 1; i <= atom->ntypes; i++) - fprintf(fp,"%d %g %g\n",i,epsilon[i][i],sigma[i][i]); -} - -/* ---------------------------------------------------------------------- - proc 0 writes all pairs to data file -------------------------------------------------------------------------- */ - -void PairLJClass2::write_data_all(FILE *fp) -{ - for (int i = 1; i <= atom->ntypes; i++) - for (int j = i; j <= atom->ntypes; j++) - fprintf(fp,"%d %d %g %g %g\n",i,j,epsilon[i][j],sigma[i][j],cut[i][j]); -} - -/* ---------------------------------------------------------------------- */ - -double PairLJClass2::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq, - double /*factor_coul*/, double factor_lj, - double &fforce) -{ - double r2inv,rinv,r3inv,r6inv,forcelj,philj; - - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; - forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); - fforce = factor_lj*forcelj*r2inv; - - philj = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - - offset[itype][jtype]; - return factor_lj*philj; -} - -/* ---------------------------------------------------------------------- */ - -void *PairLJClass2::extract(const char *str, int &dim) -{ - dim = 2; - if (strcmp(str,"epsilon") == 0) return (void *) epsilon; - if (strcmp(str,"sigma") == 0) return (void *) sigma; - return NULL; -} \ No newline at end of file +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_lj_class2.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "update.h" +#include "integrate.h" +#include "respa.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +/* ---------------------------------------------------------------------- */ + +PairLJClass2::PairLJClass2(LAMMPS *lmp) : Pair(lmp) +{ + respa_enable = 1; + writedata = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairLJClass2::~PairLJClass2() +{ + if (copymode) return; + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairLJClass2::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + ev_init(eflag,vflag); + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + evdwl = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - + offset[itype][jtype]; + evdwl *= factor_lj; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- +*/ + +void PairLJClass2::compute_inner() +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fpair; + double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj,rsw; + int *ilist,*jlist,*numneigh,**firstneigh; + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; + + double cut_out_on = cut_respa[0]; + double cut_out_off = cut_respa[1]; + + double cut_out_diff = cut_out_off - cut_out_on; + double cut_out_on_sq = cut_out_on*cut_out_on; + double cut_out_off_sq = cut_out_off*cut_out_off; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cut_out_off_sq) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + jtype = type[j]; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + if (rsq > cut_out_on_sq) { + rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff; + fpair *= 1.0 - rsw*rsw*(3.0 - 2.0*rsw); + } + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +void PairLJClass2::compute_middle() +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,fpair; + double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj,rsw; + int *ilist,*jlist,*numneigh,**firstneigh; + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; + + double cut_in_off = cut_respa[0]; + double cut_in_on = cut_respa[1]; + double cut_out_on = cut_respa[2]; + double cut_out_off = cut_respa[3]; + + double cut_in_diff = cut_in_on - cut_in_off; + double cut_out_diff = cut_out_off - cut_out_on; + double cut_in_off_sq = cut_in_off*cut_in_off; + double cut_in_on_sq = cut_in_on*cut_in_on; + double cut_out_on_sq = cut_out_on*cut_out_on; + double cut_out_off_sq = cut_out_off*cut_out_off; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cut_out_off_sq && rsq > cut_in_off_sq) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + jtype = type[j]; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + if (rsq < cut_in_on_sq) { + rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff; + fpair *= rsw*rsw*(3.0 - 2.0*rsw); + } + if (rsq > cut_out_on_sq) { + rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff; + fpair *= 1.0 + rsw*rsw*(2.0*rsw - 3.0); + } + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +void PairLJClass2::compute_outer(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,rinv,r2inv,r3inv,r6inv,forcelj,factor_lj,rsw; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + ev_init(eflag,vflag); + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + double cut_in_off = cut_respa[2]; + double cut_in_on = cut_respa[3]; + + double cut_in_diff = cut_in_on - cut_in_off; + double cut_in_off_sq = cut_in_off*cut_in_off; + double cut_in_on_sq = cut_in_on*cut_in_on; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + if (rsq > cut_in_off_sq) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + if (rsq < cut_in_on_sq) { + rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff; + fpair *= rsw*rsw*(3.0 - 2.0*rsw); + } + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + } + + if (eflag) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + evdwl = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - + offset[itype][jtype]; + evdwl *= factor_lj; + } + + if (vflag) { + if (rsq <= cut_in_off_sq) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fpair = factor_lj*forcelj*r2inv; + } else if (rsq < cut_in_on_sq) + fpair = factor_lj*forcelj*r2inv; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,fpair,delx,dely,delz); + } + } + } +} +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairLJClass2::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(epsilon,n+1,n+1,"pair:epsilon"); + memory->create(sigma,n+1,n+1,"pair:sigma"); + memory->create(lj1,n+1,n+1,"pair:lj1"); + memory->create(lj2,n+1,n+1,"pair:lj2"); + memory->create(lj3,n+1,n+1,"pair:lj3"); + memory->create(lj4,n+1,n+1,"pair:lj4"); + memory->create(offset,n+1,n+1,"pair:offset"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairLJClass2::settings(int narg, char **arg) +{ + if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + + cut_global = force->numeric(FLERR,arg[0]); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut[i][j] = cut_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairLJClass2::coeff(int narg, char **arg) +{ + if (narg < 4 || narg > 5) error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double epsilon_one = force->numeric(FLERR,arg[2]); + double sigma_one = force->numeric(FLERR,arg[3]); + + double cut_one = cut_global; + if (narg == 5) cut_one = force->numeric(FLERR,arg[4]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + epsilon[i][j] = epsilon_one; + sigma[i][j] = sigma_one; + cut[i][j] = cut_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairLJClass2::init_style() +{ + // request regular or rRESPA neighbor list + + int irequest; + int respa = 0; + + if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { + if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; + if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + } + + irequest = neighbor->request(this,instance_me); + + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; + + // set rRESPA cutoffs + + if (strstr(update->integrate_style,"respa") && + ((Respa *) update->integrate)->level_inner >= 0) + cut_respa = ((Respa *) update->integrate)->cutoff; + else cut_respa = NULL; +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairLJClass2::init_one(int i, int j) +{ + // always mix epsilon,sigma via sixthpower rules + // mix distance via user-defined rule + + if (setflag[i][j] == 0) { + epsilon[i][j] = 2.0 * sqrt(epsilon[i][i]*epsilon[j][j]) * + pow(sigma[i][i],3.0) * pow(sigma[j][j],3.0) / + (pow(sigma[i][i],6.0) + pow(sigma[j][j],6.0)); + sigma[i][j] = + pow((0.5 * (pow(sigma[i][i],6.0) + pow(sigma[j][j],6.0))),1.0/6.0); + cut[i][j] = mix_distance(cut[i][i],cut[j][j]); + } + + lj1[i][j] = 18.0 * epsilon[i][j] * pow(sigma[i][j],9.0); + lj2[i][j] = 18.0 * epsilon[i][j] * pow(sigma[i][j],6.0); + lj3[i][j] = 2.0 * epsilon[i][j] * pow(sigma[i][j],9.0); + lj4[i][j] = 3.0 * epsilon[i][j] * pow(sigma[i][j],6.0); + + if (offset_flag && (cut[i][j] > 0.0)) { + double ratio = sigma[i][j] / cut[i][j]; + offset[i][j] = epsilon[i][j] * (2.0*pow(ratio,9.0) - 3.0*pow(ratio,6.0)); + } else offset[i][j] = 0.0; + + lj1[j][i] = lj1[i][j]; + lj2[j][i] = lj2[i][j]; + lj3[j][i] = lj3[i][j]; + lj4[j][i] = lj4[i][j]; + offset[j][i] = offset[i][j]; + + // check interior rRESPA cutoff + + if (cut_respa && cut[i][j] < cut_respa[3]) + error->all(FLERR,"Pair cutoff < Respa interior cutoff"); + + // compute I,J contribution to long-range tail correction + // count total # of atoms of type I and J via Allreduce + + if (tail_flag) { + int *type = atom->type; + int nlocal = atom->nlocal; + + double count[2],all[2]; + count[0] = count[1] = 0.0; + for (int k = 0; k < nlocal; k++) { + if (type[k] == i) count[0] += 1.0; + if (type[k] == j) count[1] += 1.0; + } + MPI_Allreduce(count,all,2,MPI_DOUBLE,MPI_SUM,world); + + double sig3 = sigma[i][j]*sigma[i][j]*sigma[i][j]; + double sig6 = sig3*sig3; + double rc3 = cut[i][j]*cut[i][j]*cut[i][j]; + double rc6 = rc3*rc3; + etail_ij = 2.0*MY_PI*all[0]*all[1]*epsilon[i][j] * + sig6 * (sig3 - 3.0*rc3) / (3.0*rc6); + ptail_ij = 2.0*MY_PI*all[0]*all[1]*epsilon[i][j] * + sig6 * (sig3 - 2.0*rc3) / rc6; + } + + return cut[i][j]; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairLJClass2::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&epsilon[i][j],sizeof(double),1,fp); + fwrite(&sigma[i][j],sizeof(double),1,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairLJClass2::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&epsilon[i][j],sizeof(double),1,fp); + fread(&sigma[i][j],sizeof(double),1,fp); + fread(&cut[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairLJClass2::write_restart_settings(FILE *fp) +{ + fwrite(&cut_global,sizeof(double),1,fp); + fwrite(&offset_flag,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); + fwrite(&tail_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairLJClass2::read_restart_settings(FILE *fp) +{ + int me = comm->me; + if (me == 0) { + fread(&cut_global,sizeof(double),1,fp); + fread(&offset_flag,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + fread(&tail_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&offset_flag,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + MPI_Bcast(&tail_flag,1,MPI_INT,0,world); +} + + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairLJClass2::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp,"%d %g %g\n",i,epsilon[i][i],sigma[i][i]); +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairLJClass2::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp,"%d %d %g %g %g\n",i,j,epsilon[i][j],sigma[i][j],cut[i][j]); +} + +/* ---------------------------------------------------------------------- */ + +double PairLJClass2::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq, + double /*factor_coul*/, double factor_lj, + double &fforce) +{ + double r2inv,rinv,r3inv,r6inv,forcelj,philj; + + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; + forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); + fforce = factor_lj*forcelj*r2inv; + + philj = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - + offset[itype][jtype]; + return factor_lj*philj; +} + +/* ---------------------------------------------------------------------- */ + +void *PairLJClass2::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"epsilon") == 0) return (void *) epsilon; + if (strcmp(str,"sigma") == 0) return (void *) sigma; + return NULL; +} diff --git a/src/CLASS2/pair_lj_class2.h b/src/CLASS2/pair_lj_class2.h index 5bb2a1f0d9..7680498a07 100644 --- a/src/CLASS2/pair_lj_class2.h +++ b/src/CLASS2/pair_lj_class2.h @@ -70,4 +70,3 @@ E: Pair cutoff < Respa interior cutoff One or more pairwise cutoffs are too short to use with the specified rRESPA cutoffs. */ - From e73b34a5b1fe9937b87e58b62dd20500d6a87a3e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 14 Jun 2019 15:46:28 -0400 Subject: [PATCH 75/90] do not run tally callback setup multiple times per time step --- src/USER-TALLY/README | 2 +- src/USER-TALLY/compute_force_tally.cpp | 5 +++++ src/USER-TALLY/compute_heat_flux_tally.cpp | 5 +++++ src/USER-TALLY/compute_pe_mol_tally.cpp | 5 +++++ src/USER-TALLY/compute_pe_tally.cpp | 5 +++++ src/USER-TALLY/compute_stress_tally.cpp | 5 +++++ 6 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/USER-TALLY/README b/src/USER-TALLY/README index 5f073b4d67..2167c72eb5 100644 --- a/src/USER-TALLY/README +++ b/src/USER-TALLY/README @@ -21,7 +21,7 @@ The person who created this package is Axel Kohlmeyer (akohlmey@gmail.com) at Temple University with a little help and inspiration from Loris Ercole (SISSA/ISAS Trieste), who contributed compute heat/flux/tally. -Additional contributed compute style for this package are welcome. +Additional contributed compute styles for this package are welcome. Please contact Axel, if you have questions about the implementation. diff --git a/src/USER-TALLY/compute_force_tally.cpp b/src/USER-TALLY/compute_force_tally.cpp index 0ec1d332a4..69f0db0b23 100644 --- a/src/USER-TALLY/compute_force_tally.cpp +++ b/src/USER-TALLY/compute_force_tally.cpp @@ -85,6 +85,11 @@ void ComputeForceTally::init() void ComputeForceTally::pair_setup_callback(int, int) { + // run setup only once per time step. + // we may be called from multiple pair styles + + if (did_setup == update->ntimestep) return; + const int ntotal = atom->nlocal + atom->nghost; // grow per-atom storage, if needed diff --git a/src/USER-TALLY/compute_heat_flux_tally.cpp b/src/USER-TALLY/compute_heat_flux_tally.cpp index f8db92a730..0f7979d7ed 100644 --- a/src/USER-TALLY/compute_heat_flux_tally.cpp +++ b/src/USER-TALLY/compute_heat_flux_tally.cpp @@ -87,6 +87,11 @@ void ComputeHeatFluxTally::init() /* ---------------------------------------------------------------------- */ void ComputeHeatFluxTally::pair_setup_callback(int, int) { + // run setup only once per time step. + // we may be called from multiple pair styles + + if (did_setup == update->ntimestep) return; + const int ntotal = atom->nlocal + atom->nghost; // grow per-atom storage, if needed diff --git a/src/USER-TALLY/compute_pe_mol_tally.cpp b/src/USER-TALLY/compute_pe_mol_tally.cpp index 264ddca270..bb0ff89b9e 100644 --- a/src/USER-TALLY/compute_pe_mol_tally.cpp +++ b/src/USER-TALLY/compute_pe_mol_tally.cpp @@ -82,6 +82,11 @@ void ComputePEMolTally::init() void ComputePEMolTally::pair_setup_callback(int, int) { + // run setup only once per time step. + // we may be called from multiple pair styles + + if (did_setup == update->ntimestep) return; + etotal[0] = etotal[1] = etotal[2] = etotal[3] = 0.0; did_setup = update->ntimestep; } diff --git a/src/USER-TALLY/compute_pe_tally.cpp b/src/USER-TALLY/compute_pe_tally.cpp index 3031915ebe..de678f59b8 100644 --- a/src/USER-TALLY/compute_pe_tally.cpp +++ b/src/USER-TALLY/compute_pe_tally.cpp @@ -84,6 +84,11 @@ void ComputePETally::init() void ComputePETally::pair_setup_callback(int, int) { + // run setup only once per time step. + // we may be called from multiple pair styles + + if (did_setup == update->ntimestep) return; + const int ntotal = atom->nlocal + atom->nghost; // grow per-atom storage, if needed diff --git a/src/USER-TALLY/compute_stress_tally.cpp b/src/USER-TALLY/compute_stress_tally.cpp index 8ed40ae8e2..d769b61d9a 100644 --- a/src/USER-TALLY/compute_stress_tally.cpp +++ b/src/USER-TALLY/compute_stress_tally.cpp @@ -87,6 +87,11 @@ void ComputeStressTally::init() void ComputeStressTally::pair_setup_callback(int, int) { + // run setup only once per time step. + // we may be called from multiple pair styles + + if (did_setup == update->ntimestep) return; + const int ntotal = atom->nlocal + atom->nghost; // grow per-atom storage, if needed From 98d9a9a4d2ae8f2cb78ebb069b299f9d3f152e12 Mon Sep 17 00:00:00 2001 From: Gareth Tribello Date: Sun, 16 Jun 2019 16:09:32 +0100 Subject: [PATCH 76/90] Added call to PLUMED with setStopFlag so that PLUMED can stop LAMMPS if it needs to. This would be needed if you were computing committors for example --- src/USER-PLUMED/fix_plumed.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/USER-PLUMED/fix_plumed.cpp b/src/USER-PLUMED/fix_plumed.cpp index 9921747b22..127c22964a 100644 --- a/src/USER-PLUMED/fix_plumed.cpp +++ b/src/USER-PLUMED/fix_plumed.cpp @@ -406,6 +406,8 @@ void FixPlumed::post_force(int /* vflag */) // pass all pointers to plumed: p->cmd("setStep",&step); + int plumedStopCondition=0; + p->cmd("setStopFlag",&plumedStopCondition); p->cmd("setPositions",&atom->x[0][0]); p->cmd("setBox",&box[0][0]); p->cmd("setForces",&atom->f[0][0]); @@ -478,6 +480,8 @@ void FixPlumed::post_force(int /* vflag */) // do the real calculation: p->cmd("performCalc"); + if(plumedStopCondition) error->all(FLERR,"received instruction from PLUMED to stop"); + // retransform virial to lammps representation and assign it to this // fix's virial. If the energy is biased, Plumed is giving back the full // virial and therefore we have to subtract the initial virial i.e. virial_lmp. From 75e2981bda5b424287bf2a1873f66ffea2151cea Mon Sep 17 00:00:00 2001 From: Gareth Tribello Date: Sun, 16 Jun 2019 17:52:20 +0100 Subject: [PATCH 77/90] Using force_timeout call instead of throwing error for plumed stop --- src/USER-PLUMED/fix_plumed.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/USER-PLUMED/fix_plumed.cpp b/src/USER-PLUMED/fix_plumed.cpp index 127c22964a..8bd0ecca05 100644 --- a/src/USER-PLUMED/fix_plumed.cpp +++ b/src/USER-PLUMED/fix_plumed.cpp @@ -34,6 +34,7 @@ #include "modify.h" #include "pair.h" #include "utils.h" +#include "timer.h" #include "plumed/wrapper/Plumed.h" @@ -480,7 +481,7 @@ void FixPlumed::post_force(int /* vflag */) // do the real calculation: p->cmd("performCalc"); - if(plumedStopCondition) error->all(FLERR,"received instruction from PLUMED to stop"); + if(plumedStopCondition) timer->force_timeout(); // retransform virial to lammps representation and assign it to this // fix's virial. If the energy is biased, Plumed is giving back the full From 4178c5167bac70bd89e4d6ae6d38dee3216ea24a Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 16 Jun 2019 14:47:07 -0600 Subject: [PATCH 78/90] clarify template error/warning message --- doc/src/Errors_messages.txt | 12 ++++++------ doc/src/Errors_warnings.txt | 10 +++++++--- src/USER-MISC/fix_bond_react.cpp | 23 +++++++++++++++-------- src/USER-MISC/fix_bond_react.h | 20 ++++++++------------ 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/doc/src/Errors_messages.txt b/doc/src/Errors_messages.txt index 7249bfddfd..3475af2226 100644 --- a/doc/src/Errors_messages.txt +++ b/doc/src/Errors_messages.txt @@ -636,12 +636,12 @@ Please ensure reaction map files are properly formatted. :dd {Bond/react: Atom affected by reaction too close to template edge} :dt -This means an atom which changes type during the reaction is too close -to an 'edge' atom defined in the superimpose file. This could cause -incorrect assignment of bonds, angle, etc. Generally, this means you -must include more atoms in your templates, such that there are at -least two atoms between each atom involved in the reaction and an edge -atom. :dd +This means an atom which changes type or connectivity during the +reaction is too close to an 'edge' atom defined in the superimpose +file. This could cause incorrect assignment of bonds, angle, etc. +Generally, this means you must include more atoms in your templates, +such that there are at least two atoms between each atom involved in +the reaction and an edge atom. :dd {Bond/react: Fix bond/react needs ghost atoms from farther away} :dt diff --git a/doc/src/Errors_warnings.txt b/doc/src/Errors_warnings.txt index 164a29e21d..1507d6b22c 100644 --- a/doc/src/Errors_warnings.txt +++ b/doc/src/Errors_warnings.txt @@ -82,10 +82,14 @@ bond/angle/dihedral. LAMMPS computes this by taking the maximum bond length, multiplying by the number of bonds in the interaction (e.g. 3 for a dihedral) and adding a small amount of stretch. :dd -{Bond/react: An atom in 'react #%d' changes bond connectivity but not atom type} :dt +{Bond/react: Atom affected by reaction too close to template edge} :dt -You may want to double-check that all atom types are properly assigned -in the post-reaction template. :dd +This means an atom which changes type or connectivity during the +reaction is too close to an 'edge' atom defined in the superimpose +file. This could cause incorrect assignment of bonds, angle, etc. +Generally, this means you must include more atoms in your templates, +such that there are at least two atoms between each atom involved in +the reaction and an edge atom. :dd {Both groups in compute group/group have a net charge; the Kspace boundary correction to energy will be non-zero} :dt diff --git a/src/USER-MISC/fix_bond_react.cpp b/src/USER-MISC/fix_bond_react.cpp index 7e2a228992..c641912db6 100644 --- a/src/USER-MISC/fix_bond_react.cpp +++ b/src/USER-MISC/fix_bond_react.cpp @@ -157,6 +157,7 @@ FixBondReact::FixBondReact(LAMMPS *lmp, int narg, char **arg) : // this looks excessive // the price of vectorization (all reactions in one command)? + memory->create(rxn_name,nreacts,MAXLINE,"bond/react:rxn_name"); memory->create(nevery,nreacts,"bond/react:nevery"); memory->create(cutsq,nreacts,2,"bond/react:cutsq"); memory->create(unreacted_mol,nreacts,"bond/react:unreacted_mol"); @@ -207,8 +208,7 @@ FixBondReact::FixBondReact(LAMMPS *lmp, int narg, char **arg) : iarg++; - iarg++; // read in reaction name here - //for example, rxn_name[rxn] = ... + rxn_name[rxn] = arg[iarg++]; int igroup = group->find(arg[iarg++]); if (igroup == -1) error->all(FLERR,"Could not find fix group ID"); @@ -1720,8 +1720,11 @@ void FixBondReact::find_landlocked_atoms(int myrxn) // bad molecule templates check // if atoms change types, but aren't landlocked, that's bad for (int i = 0; i < twomol->natoms; i++) { - if (twomol->type[i] != onemol->type[equivalences[i][1][myrxn]-1] && landlocked_atoms[i][myrxn] == 0) - error->one(FLERR,"Bond/react: Atom affected by reaction too close to template edge"); + if (twomol->type[i] != onemol->type[equivalences[i][1][myrxn]-1] && landlocked_atoms[i][myrxn] == 0) { + char str[128]; + snprintf(str,128,"Bond/react: Atom affected by reaction %s too close to template edge",rxn_name[myrxn]); + error->all(FLERR,str); + } } // additionally, if a bond changes type, but neither involved atom is landlocked, bad @@ -1737,7 +1740,9 @@ void FixBondReact::find_landlocked_atoms(int myrxn) onemol_batom = onemol->bond_atom[onemol_atomi-1][m]; if (onemol_batom == equivalences[twomol_atomj-1][1][myrxn]) { if (twomol->bond_type[i][j] != onemol->bond_type[onemol_atomi-1][m]) { - error->one(FLERR,"Bond/react: Bond type affected by reaction too close to template edge"); + char str[128]; + snprintf(str,128,"Bond/react: Atom affected by reaction %s too close to template edge",rxn_name[myrxn]); + error->all(FLERR,str); } } } @@ -1747,7 +1752,9 @@ void FixBondReact::find_landlocked_atoms(int myrxn) onemol_batom = onemol->bond_atom[onemol_atomj-1][m]; if (onemol_batom == equivalences[i][1][myrxn]) { if (twomol->bond_type[i][j] != onemol->bond_type[onemol_atomj-1][m]) { - error->one(FLERR,"Bond/react: Bond type affected by reaction too close to template edge"); + char str[128]; + snprintf(str,128,"Bond/react: Atom affected by reaction %s too close to template edge",rxn_name[myrxn]); + error->all(FLERR,str); } } } @@ -1763,7 +1770,7 @@ void FixBondReact::find_landlocked_atoms(int myrxn) int ii = reverse_equiv[i][1][myrxn] - 1; for (int j = 0; j < twomol_nxspecial[ii][0]; j++) { if (delete_atoms[equivalences[twomol_xspecial[ii][j]-1][1][myrxn]-1][myrxn] == 0) { - error->one(FLERR,"Bond/react: A deleted atom cannot remain bonded to an atom that is not deleted"); + error->all(FLERR,"Bond/react: A deleted atom cannot remain bonded to an atom that is not deleted"); } } } @@ -1774,7 +1781,7 @@ void FixBondReact::find_landlocked_atoms(int myrxn) for (int i = 0; i < twomol->natoms; i++) { if (twomol_nxspecial[i][0] != onemol_nxspecial[equivalences[i][1][myrxn]-1][0] && landlocked_atoms[i][myrxn] == 0) { char str[128]; - sprintf(str,"Bond/react: An atom in 'react #%d' changes bond connectivity but not atom type",myrxn+1); + snprintf(str,128,"Bond/react: Atom affected by reaction %s too close to template edge",rxn_name[myrxn]); error->warning(FLERR,str); break; } diff --git a/src/USER-MISC/fix_bond_react.h b/src/USER-MISC/fix_bond_react.h index 36fc13ae21..1ac8d624a9 100644 --- a/src/USER-MISC/fix_bond_react.h +++ b/src/USER-MISC/fix_bond_react.h @@ -67,6 +67,7 @@ class FixBondReact : public Fix { int *groupbits; int rxnID; // integer ID for identifying current bond/react + char **rxn_name; // name of reaction int *reaction_count; int *reaction_count_total; int nmax; // max num local atoms @@ -213,14 +214,14 @@ E: Bond/react: Unknown section in map file Please ensure reaction map files are properly formatted. -E: Bond/react: Atom affected by reaction too close to template edge +E or W: Bond/react: Atom affected by reaction %s too close to template edge -This means an atom which changes type during the reaction is too close -to an 'edge' atom defined in the superimpose file. This could cause -incorrect assignment of bonds, angle, etc. Generally, this means you -must include more atoms in your templates, such that there are at -least two atoms between each atom involved in the reaction and an edge -atom. +This means an atom which changes type or connectivity during the +reaction is too close to an 'edge' atom defined in the superimpose +file. This could cause incorrect assignment of bonds, angle, etc. +Generally, this means you must include more atoms in your templates, +such that there are at least two atoms between each atom involved in +the reaction and an edge atom. E: Bond/react: Fix bond/react needs ghost atoms from farther away @@ -233,11 +234,6 @@ E: Bond/react: A deleted atom cannot remain bonded to an atom that is not delete Self-explanatory. -W: Bond/react: An atom in 'react #%d' changes bond connectivity but not atom type - -You may want to double-check that all atom types are properly assigned -in the post-reaction template. - E: Bond/react special bond generation overflow The number of special bonds per-atom created by a reaction exceeds the From fd93c27dcb2ddb01f86c03b2ea13e344e2e29585 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Jun 2019 07:35:30 -0400 Subject: [PATCH 79/90] make valgrind happy by fully initializing line buffer for thermo output --- src/thermo.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/thermo.cpp b/src/thermo.cpp index 3e777edf82..f4ab7b0779 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -113,9 +113,11 @@ Thermo::Thermo(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) if (strcmp(style,"one") == 0) { line = new char[256+6*64]; + memset(line,0,256+6*64); strcpy(line,ONE); } else if (strcmp(style,"multi") == 0) { line = new char[256+12*64]; + memset(line,0,256+12*64); strcpy(line,MULTI); lineflag = MULTILINE; From 4c0cd0a019d4dbd0e8367cb02b3530ad97ace525 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Jun 2019 07:36:03 -0400 Subject: [PATCH 80/90] remove memory leak by freeing custom MPI data types --- src/USER-LB/fix_lb_fluid.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/USER-LB/fix_lb_fluid.cpp b/src/USER-LB/fix_lb_fluid.cpp index 6f1dfc9982..9e6b9c72f1 100644 --- a/src/USER-LB/fix_lb_fluid.cpp +++ b/src/USER-LB/fix_lb_fluid.cpp @@ -547,6 +547,18 @@ FixLbFluid::~FixLbFluid() } else { delete [] NodeArea; } + MPI_Type_free(&passxf); + MPI_Type_free(&passyf); + MPI_Type_free(&passzf); + MPI_Type_free(&passxu); + MPI_Type_free(&passyu); + MPI_Type_free(&passzf); + MPI_Type_free(&passxrho); + MPI_Type_free(&passyrho); + MPI_Type_free(&passzrho); + MPI_Type_free(&passxtemp); + MPI_Type_free(&passytemp); + MPI_Type_free(&passztemp); } int FixLbFluid::setmask() From 92615bda3aa3e02f525648fb155684a433cc8a8e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Jun 2019 07:38:11 -0400 Subject: [PATCH 81/90] update kolmogorov/crespi/full example input for recent change in REBO --- examples/USER/misc/kolmogorov_crespi_full/CH.rebo | 1 + examples/USER/misc/kolmogorov_crespi_full/in.bilayer-graphene | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 120000 examples/USER/misc/kolmogorov_crespi_full/CH.rebo diff --git a/examples/USER/misc/kolmogorov_crespi_full/CH.rebo b/examples/USER/misc/kolmogorov_crespi_full/CH.rebo new file mode 120000 index 0000000000..c5a6a40100 --- /dev/null +++ b/examples/USER/misc/kolmogorov_crespi_full/CH.rebo @@ -0,0 +1 @@ +../../../../potentials/CH.rebo \ No newline at end of file diff --git a/examples/USER/misc/kolmogorov_crespi_full/in.bilayer-graphene b/examples/USER/misc/kolmogorov_crespi_full/in.bilayer-graphene index 63ac92cb05..c3e59337de 100644 --- a/examples/USER/misc/kolmogorov_crespi_full/in.bilayer-graphene +++ b/examples/USER/misc/kolmogorov_crespi_full/in.bilayer-graphene @@ -18,7 +18,7 @@ group adsorbate type 2 ######################## Potential defition ######################## pair_style hybrid/overlay rebo kolmogorov/crespi/full 16.0 #################################################################### -pair_coeff * * rebo CH.airebo NULL C # chemical +pair_coeff * * rebo CH.rebo NULL C # chemical pair_coeff * * kolmogorov/crespi/full CC.KC-full C C # long range #################################################################### # Neighbor update settings From b1458ceebfe3c15fb827b20e9b81c179b0875b8f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Jun 2019 07:42:18 -0400 Subject: [PATCH 82/90] fix typo --- src/USER-LB/fix_lb_fluid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/USER-LB/fix_lb_fluid.cpp b/src/USER-LB/fix_lb_fluid.cpp index 9e6b9c72f1..31c54aee76 100644 --- a/src/USER-LB/fix_lb_fluid.cpp +++ b/src/USER-LB/fix_lb_fluid.cpp @@ -552,7 +552,7 @@ FixLbFluid::~FixLbFluid() MPI_Type_free(&passzf); MPI_Type_free(&passxu); MPI_Type_free(&passyu); - MPI_Type_free(&passzf); + MPI_Type_free(&passzu); MPI_Type_free(&passxrho); MPI_Type_free(&passyrho); MPI_Type_free(&passzrho); From 5fc3081a55eb0555a3bab32b11ea178f04616645 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Jun 2019 14:23:30 -0400 Subject: [PATCH 83/90] make building tools (msi2lmp, chain.x) an option, which is off by default --- cmake/CMakeLists.txt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 8f7ac9a6e7..67561c536b 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -106,6 +106,8 @@ if(BUILD_LIB) endif() endif() +option(BUILD_TOOLS "Build and install LAMMPS tools (msi2lmp, binary2txt, chain)" OFF) + if(NOT BUILD_EXE AND NOT BUILD_LIB) message(FATAL_ERROR "You need to at least enable one of two following options: BUILD_LIB or BUILD_EXE") endif() @@ -518,6 +520,18 @@ if(BUILD_EXE) install(TARGETS lmp DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES ${LAMMPS_DOC_DIR}/lammps.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 RENAME ${LAMMPS_BINARY}.1) +if(BUILD_TOOLS) + add_executable(binary2txt ${LAMMPS_TOOLS_DIR}/binary2txt.cpp) + install(TARGETS binary2txt DESTINATION ${CMAKE_INSTALL_BINDIR}) + + # ninja-build currently does not support fortran. thus we skip building this tool + if(NOT CMAKE_GENERATOR STREQUAL "Ninja") + message(STATUS "Skipping building 'chain.x' with Ninja build tool due to lack of Fortran support") + enable_language(Fortran) + add_executable(chain.x ${LAMMPS_TOOLS_DIR}/chain.f) + target_link_libraries(chain.x ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) + endif() + enable_language(C) get_filename_component(MSI2LMP_SOURCE_DIR ${LAMMPS_TOOLS_DIR}/msi2lmp/src ABSOLUTE) file(GLOB MSI2LMP_SOURCES ${MSI2LMP_SOURCE_DIR}/[^.]*.c) @@ -525,7 +539,6 @@ if(BUILD_EXE) target_link_libraries(msi2lmp m) install(TARGETS msi2lmp DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES ${LAMMPS_DOC_DIR}/msi2lmp.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) - endif() include(Documentation) From f4f4a7c85013b037947e9617e237f5a67c757273 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Jun 2019 14:24:51 -0400 Subject: [PATCH 84/90] adapt for Ninja build tool, which cannot handle sub-builds and fortran so builds of downloaded libraries are not supported right now --- cmake/CMakeLists.txt | 4 ++++ cmake/Modules/Packages/KIM.cmake | 3 +++ cmake/Modules/Packages/LATTE.cmake | 3 +++ cmake/Modules/Packages/USER-PLUMED.cmake | 3 +++ cmake/Modules/Packages/VORONOI.cmake | 3 +++ 5 files changed, 16 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 67561c536b..7f212ac48e 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -224,6 +224,9 @@ if(PKG_MSCG OR PKG_USER-ATC OR PKG_USER-AWPMD OR PKG_USER-PLUMED OR PKG_USER-QUI find_package(LAPACK) find_package(BLAS) if(NOT LAPACK_FOUND OR NOT BLAS_FOUND) + if(CMAKE_GENERATOR STREQUAL "Ninja") + status(FATAL_ERROR "Cannot build internal linear algebra library with Ninja build tool due to lack for Fortran support") + endif() enable_language(Fortran) file(GLOB LAPACK_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/linalg/[^.]*.[fF]) add_library(linalg STATIC ${LAPACK_SOURCES}) @@ -519,6 +522,7 @@ if(BUILD_EXE) set_target_properties(lmp PROPERTIES OUTPUT_NAME ${LAMMPS_BINARY}) install(TARGETS lmp DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES ${LAMMPS_DOC_DIR}/lammps.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 RENAME ${LAMMPS_BINARY}.1) +endif() if(BUILD_TOOLS) add_executable(binary2txt ${LAMMPS_TOOLS_DIR}/binary2txt.cpp) diff --git a/cmake/Modules/Packages/KIM.cmake b/cmake/Modules/Packages/KIM.cmake index 21ebd0f8e0..8815f73881 100644 --- a/cmake/Modules/Packages/KIM.cmake +++ b/cmake/Modules/Packages/KIM.cmake @@ -13,6 +13,9 @@ if(PKG_KIM) endif() option(DOWNLOAD_KIM "Download KIM-API from OpenKIM instead of using an already installed one" ${DOWNLOAD_KIM_DEFAULT}) if(DOWNLOAD_KIM) + if(CMAKE_GENERATOR STREQUAL "Ninja") + message(FATAL_ERROR "Cannot build downloaded KIM-API library with Ninja build tool") + endif() message(STATUS "KIM-API download requested - we will build our own") enable_language(C) enable_language(Fortran) diff --git a/cmake/Modules/Packages/LATTE.cmake b/cmake/Modules/Packages/LATTE.cmake index a709561562..de7116780b 100644 --- a/cmake/Modules/Packages/LATTE.cmake +++ b/cmake/Modules/Packages/LATTE.cmake @@ -11,6 +11,9 @@ if(PKG_LATTE) if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR message(FATAL_ERROR "For downlading LATTE you need at least cmake-3.7") endif() + if(CMAKE_GENERATOR STREQUAL "Ninja") + message(FATAL_ERROR "Cannot build downloaded LATTE library with Ninja build tool") + endif() message(STATUS "LATTE download requested - we will build our own") include(ExternalProject) ExternalProject_Add(latte_build diff --git a/cmake/Modules/Packages/USER-PLUMED.cmake b/cmake/Modules/Packages/USER-PLUMED.cmake index 422527dd06..500558fc72 100644 --- a/cmake/Modules/Packages/USER-PLUMED.cmake +++ b/cmake/Modules/Packages/USER-PLUMED.cmake @@ -17,6 +17,9 @@ if(PKG_USER-PLUMED) option(DOWNLOAD_PLUMED "Download Plumed package instead of using an already installed one" ${DOWNLOAD_PLUMED_DEFAULT}) if(DOWNLOAD_PLUMED) + if(CMAKE_GENERATOR STREQUAL "Ninja") + message(FATAL_ERROR "Cannot build downloaded Plumed library with Ninja build tool") + endif() if(BUILD_MPI) set(PLUMED_CONFIG_MPI "--enable-mpi") set(PLUMED_CONFIG_CC ${CMAKE_MPI_C_COMPILER}) diff --git a/cmake/Modules/Packages/VORONOI.cmake b/cmake/Modules/Packages/VORONOI.cmake index df4551b6e7..5ce974a7ae 100644 --- a/cmake/Modules/Packages/VORONOI.cmake +++ b/cmake/Modules/Packages/VORONOI.cmake @@ -7,6 +7,9 @@ if(PKG_VORONOI) endif() option(DOWNLOAD_VORO "Download and compile the Voro++ library instead of using an already installed one" ${DOWNLOAD_VORO_DEFAULT}) if(DOWNLOAD_VORO) + if(CMAKE_GENERATOR STREQUAL "Ninja") + message(FATAL_ERROR "Cannot build downloaded Voro++ library with Ninja build tool") + endif() message(STATUS "Voro++ download requested - we will build our own") include(ExternalProject) From e9666f585f1924142e2c044c53d765806d35076d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Jun 2019 15:46:54 -0400 Subject: [PATCH 85/90] update log files for kolmogorov/crespi/full potential --- ...++.1 => log.5Jun19.bilayer-graphene.g++.1} | 51 ++++++++++--------- ...++.4 => log.5Jun19.bilayer-graphene.g++.4} | 51 ++++++++++--------- 2 files changed, 54 insertions(+), 48 deletions(-) rename examples/USER/misc/kolmogorov_crespi_full/{log.16Mar18.bilayer-graphene.g++.1 => log.5Jun19.bilayer-graphene.g++.1} (59%) rename examples/USER/misc/kolmogorov_crespi_full/{log.16Mar18.bilayer-graphene.g++.4 => log.5Jun19.bilayer-graphene.g++.4} (59%) diff --git a/examples/USER/misc/kolmogorov_crespi_full/log.16Mar18.bilayer-graphene.g++.1 b/examples/USER/misc/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.1 similarity index 59% rename from examples/USER/misc/kolmogorov_crespi_full/log.16Mar18.bilayer-graphene.g++.1 rename to examples/USER/misc/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.1 index a06b3effdd..c74f9956a2 100644 --- a/examples/USER/misc/kolmogorov_crespi_full/log.16Mar18.bilayer-graphene.g++.1 +++ b/examples/USER/misc/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (8 Mar 2018) +LAMMPS (5 Jun 2019) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) using 1 OpenMP thread(s) per MPI task # Initialization units metal @@ -21,6 +22,8 @@ read_data Bi_gr_AB_stack_2L_noH_300K.data 0 = max # of 1-3 neighbors 0 = max # of 1-4 neighbors 1 = max # of special neighbors + special bonds CPU = 0.000353813 secs + read_data CPU = 0.0043292 secs mass 1 12.0107 # carbon mass (g/mole) | membrane mass 2 12.0107 # carbon mass (g/mole) | adsorbate # Separate atom groups @@ -32,8 +35,8 @@ group adsorbate type 2 ######################## Potential defition ######################## pair_style hybrid/overlay rebo kolmogorov/crespi/full 16.0 #################################################################### -pair_coeff * * rebo CH.airebo NULL C # chemical -Reading potential file CH.airebo with DATE: 2011-10-25 +pair_coeff * * rebo CH.rebo NULL C # chemical +Reading potential file CH.rebo with DATE: 2018-7-3 pair_coeff * * kolmogorov/crespi/full CC.KC-full C C # long range #################################################################### # Neighbor update settings @@ -92,32 +95,32 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 16.96 | 16.96 | 16.96 Mbytes Step TotEng PotEng KinEng v_REBO v_KC Temp v_adsxcom v_adsycom v_adszcom v_adsvxcom v_adsvycom v_adsvzcom - 0 -5025.3867722725 -5040.0767391239 14.6899668514 -5011.2636297759 -28.8131093480 83.6251135127 22.0155657205 20.2812150219 3.4623630945 0.0282287195 0.0535565745 0.2193320108 - 100 -5025.3962433293 -5041.3829775585 15.9867342292 -5012.5109377234 -28.8720398351 91.0071804888 22.0181858078 20.2867731676 3.4456714402 0.0241525932 0.0573807336 -0.5235069014 - 200 -5025.3942568861 -5041.9638220670 16.5695651809 -5012.7804299195 -29.1833921475 94.3250439654 22.0203529515 20.2926376511 3.3740502908 0.0186420748 0.0595018114 -0.7867265577 - 300 -5025.3919463074 -5040.9705419367 15.5785956293 -5012.0510295102 -28.9195124265 88.6837826830 22.0218424095 20.2984380400 3.3199036613 0.0106250874 0.0544668352 -0.1513745908 - 400 -5025.3965376948 -5041.6929964127 16.2964587179 -5012.6418090677 -29.0511873450 92.7703393702 22.0224243957 20.3034636122 3.3515794172 0.0006844935 0.0458598502 0.6967704496 - 500 -5025.4050172900 -5042.1712310053 16.7662137153 -5013.1850218645 -28.9862091408 95.4444989087 22.0220673443 20.3074634962 3.4286173278 -0.0078273439 0.0340764532 0.6845095066 - 600 -5025.3985715734 -5041.2158947893 15.8173232159 -5012.4875319345 -28.7283628548 90.0427797270 22.0209262700 20.3103065099 3.4653840648 -0.0141442608 0.0229602847 0.0009001093 - 700 -5025.3997561572 -5041.6276721306 16.2279159734 -5012.7093581188 -28.9183140118 92.3801482386 22.0191651506 20.3120184840 3.4291788224 -0.0208485646 0.0104216414 -0.6668311564 - 800 -5025.3967603736 -5042.3401685987 16.9434082251 -5013.3044877099 -29.0356808888 96.4532085367 22.0167259920 20.3122737443 3.3535033285 -0.0279747378 -0.0060833621 -0.7003492925 - 900 -5025.3984542801 -5042.2820667481 16.8836124680 -5013.4066841442 -28.8753826039 96.1128111061 22.0136711877 20.3107854823 3.3206430872 -0.0331979094 -0.0237440547 0.1335648638 - 1000 -5025.3988185618 -5041.9160822433 16.5172636815 -5012.8147737982 -29.1013084450 94.0273088606 22.0102627032 20.3075977018 3.3736867454 -0.0340065996 -0.0390649991 0.7872380119 -Loop time of 156.142 on 1 procs for 1000 steps with 1360 atoms + 0 -5025.3867727863 -5040.0767396377 14.6899668514 -5011.2636302897 -28.8131093480 83.6251135127 22.0155657205 20.2812150219 3.4623630945 0.0282287195 0.0535565745 0.2193320108 + 100 -5025.3962438431 -5041.3829780735 15.9867342304 -5012.5109382383 -28.8720398352 91.0071804956 22.0181858078 20.2867731676 3.4456714402 0.0241525932 0.0573807336 -0.5235069015 + 200 -5025.3942574000 -5041.9638225847 16.5695651847 -5012.7804304371 -29.1833921476 94.3250439874 22.0203529515 20.2926376511 3.3740502908 0.0186420748 0.0595018114 -0.7867265578 + 300 -5025.3919468212 -5040.9705424499 15.5785956286 -5012.0510300232 -28.9195124266 88.6837826792 22.0218424095 20.2984380400 3.3199036613 0.0106250874 0.0544668352 -0.1513745907 + 400 -5025.3965382086 -5041.6929969192 16.2964587107 -5012.6418095739 -29.0511873454 92.7703393292 22.0224243957 20.3034636122 3.3515794172 0.0006844935 0.0458598502 0.6967704497 + 500 -5025.4050178038 -5042.1712315208 16.7662137170 -5013.1850223792 -28.9862091417 95.4444989189 22.0220673443 20.3074634962 3.4286173278 -0.0078273439 0.0340764532 0.6845095066 + 600 -5025.3985720873 -5041.2158953052 15.8173232179 -5012.4875324499 -28.7283628553 90.0427797386 22.0209262700 20.3103065099 3.4653840648 -0.0141442608 0.0229602847 0.0009001092 + 700 -5025.3997566711 -5041.6276726420 16.2279159709 -5012.7093586298 -28.9183140122 92.3801482242 22.0191651506 20.3120184840 3.4291788224 -0.0208485646 0.0104216414 -0.6668311565 + 800 -5025.3967608874 -5042.3401691104 16.9434082230 -5013.3044882226 -29.0356808878 96.4532085250 22.0167259920 20.3122737443 3.3535033285 -0.0279747378 -0.0060833621 -0.7003492926 + 900 -5025.3984547937 -5042.2820672614 16.8836124676 -5013.4066846579 -28.8753826035 96.1128111040 22.0136711877 20.3107854823 3.3206430872 -0.0331979094 -0.0237440547 0.1335648640 + 1000 -5025.3988190757 -5041.9160827657 16.5172636900 -5012.8147743212 -29.1013084444 94.0273089090 22.0102627032 20.3075977018 3.3736867454 -0.0340065996 -0.0390649991 0.7872380119 +Loop time of 103.724 on 1 procs for 1000 steps with 1360 atoms -Performance: 0.553 ns/day, 43.373 hours/ns, 6.404 timesteps/s -99.6% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 0.833 ns/day, 28.812 hours/ns, 9.641 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 155.99 | 155.99 | 155.99 | 0.0 | 99.90 -Bond | 0.00075769 | 0.00075769 | 0.00075769 | 0.0 | 0.00 +Pair | 103.59 | 103.59 | 103.59 | 0.0 | 99.87 +Bond | 0.00022388 | 0.00022388 | 0.00022388 | 0.0 | 0.00 Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 0.084217 | 0.084217 | 0.084217 | 0.0 | 0.05 -Output | 0.0016122 | 0.0016122 | 0.0016122 | 0.0 | 0.00 -Modify | 0.034797 | 0.034797 | 0.034797 | 0.0 | 0.02 -Other | | 0.02838 | | | 0.02 +Comm | 0.082476 | 0.082476 | 0.082476 | 0.0 | 0.08 +Output | 0.0010884 | 0.0010884 | 0.0010884 | 0.0 | 0.00 +Modify | 0.032938 | 0.032938 | 0.032938 | 0.0 | 0.03 +Other | | 0.01749 | | | 0.02 Nlocal: 1360 ave 1360 max 1360 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -133,4 +136,4 @@ Ave neighs/atom = 195.004 Ave special neighs/atom = 0 Neighbor list builds = 0 Dangerous builds = 0 -Total wall time: 0:02:36 +Total wall time: 0:01:43 diff --git a/examples/USER/misc/kolmogorov_crespi_full/log.16Mar18.bilayer-graphene.g++.4 b/examples/USER/misc/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.4 similarity index 59% rename from examples/USER/misc/kolmogorov_crespi_full/log.16Mar18.bilayer-graphene.g++.4 rename to examples/USER/misc/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.4 index 58322f9ce0..b90ee7ee2e 100644 --- a/examples/USER/misc/kolmogorov_crespi_full/log.16Mar18.bilayer-graphene.g++.4 +++ b/examples/USER/misc/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (8 Mar 2018) +LAMMPS (5 Jun 2019) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88) using 1 OpenMP thread(s) per MPI task # Initialization units metal @@ -21,6 +22,8 @@ read_data Bi_gr_AB_stack_2L_noH_300K.data 0 = max # of 1-3 neighbors 0 = max # of 1-4 neighbors 1 = max # of special neighbors + special bonds CPU = 0.000187874 secs + read_data CPU = 0.00234103 secs mass 1 12.0107 # carbon mass (g/mole) | membrane mass 2 12.0107 # carbon mass (g/mole) | adsorbate # Separate atom groups @@ -32,8 +35,8 @@ group adsorbate type 2 ######################## Potential defition ######################## pair_style hybrid/overlay rebo kolmogorov/crespi/full 16.0 #################################################################### -pair_coeff * * rebo CH.airebo NULL C # chemical -Reading potential file CH.airebo with DATE: 2011-10-25 +pair_coeff * * rebo CH.rebo NULL C # chemical +Reading potential file CH.rebo with DATE: 2018-7-3 pair_coeff * * kolmogorov/crespi/full CC.KC-full C C # long range #################################################################### # Neighbor update settings @@ -92,32 +95,32 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 11.13 | 11.13 | 11.13 Mbytes Step TotEng PotEng KinEng v_REBO v_KC Temp v_adsxcom v_adsycom v_adszcom v_adsvxcom v_adsvycom v_adsvzcom - 0 -5025.3867722725 -5040.0767391239 14.6899668514 -5011.2636297759 -28.8131093480 83.6251135127 22.0155657205 20.2812150219 3.4623630945 0.0282287195 0.0535565745 0.2193320108 - 100 -5025.3962433293 -5041.3829775585 15.9867342292 -5012.5109377234 -28.8720398351 91.0071804888 22.0181858078 20.2867731676 3.4456714402 0.0241525932 0.0573807336 -0.5235069014 - 200 -5025.3942568861 -5041.9638220670 16.5695651809 -5012.7804299195 -29.1833921475 94.3250439654 22.0203529515 20.2926376511 3.3740502908 0.0186420748 0.0595018114 -0.7867265577 - 300 -5025.3919463074 -5040.9705419367 15.5785956293 -5012.0510295103 -28.9195124265 88.6837826830 22.0218424095 20.2984380400 3.3199036613 0.0106250874 0.0544668352 -0.1513745908 - 400 -5025.3965376948 -5041.6929964127 16.2964587179 -5012.6418090677 -29.0511873450 92.7703393702 22.0224243957 20.3034636122 3.3515794172 0.0006844935 0.0458598502 0.6967704496 - 500 -5025.4050172900 -5042.1712310053 16.7662137153 -5013.1850218645 -28.9862091408 95.4444989088 22.0220673443 20.3074634962 3.4286173278 -0.0078273439 0.0340764532 0.6845095066 - 600 -5025.3985715734 -5041.2158947893 15.8173232159 -5012.4875319345 -28.7283628548 90.0427797270 22.0209262700 20.3103065099 3.4653840648 -0.0141442608 0.0229602847 0.0009001093 - 700 -5025.3997561572 -5041.6276721306 16.2279159734 -5012.7093581188 -28.9183140118 92.3801482386 22.0191651506 20.3120184840 3.4291788224 -0.0208485646 0.0104216414 -0.6668311564 - 800 -5025.3967603736 -5042.3401685987 16.9434082251 -5013.3044877099 -29.0356808888 96.4532085367 22.0167259920 20.3122737443 3.3535033285 -0.0279747378 -0.0060833621 -0.7003492925 - 900 -5025.3984542801 -5042.2820667481 16.8836124680 -5013.4066841442 -28.8753826039 96.1128111061 22.0136711877 20.3107854823 3.3206430872 -0.0331979094 -0.0237440547 0.1335648638 - 1000 -5025.3988185618 -5041.9160822433 16.5172636815 -5012.8147737983 -29.1013084450 94.0273088606 22.0102627032 20.3075977018 3.3736867454 -0.0340065996 -0.0390649991 0.7872380119 -Loop time of 42.5422 on 4 procs for 1000 steps with 1360 atoms + 0 -5025.3867727863 -5040.0767396377 14.6899668514 -5011.2636302897 -28.8131093480 83.6251135127 22.0155657205 20.2812150219 3.4623630945 0.0282287195 0.0535565745 0.2193320108 + 100 -5025.3962438431 -5041.3829780735 15.9867342304 -5012.5109382383 -28.8720398352 91.0071804956 22.0181858078 20.2867731676 3.4456714402 0.0241525932 0.0573807336 -0.5235069015 + 200 -5025.3942574000 -5041.9638225847 16.5695651847 -5012.7804304371 -29.1833921476 94.3250439874 22.0203529515 20.2926376511 3.3740502908 0.0186420748 0.0595018114 -0.7867265578 + 300 -5025.3919468212 -5040.9705424499 15.5785956286 -5012.0510300232 -28.9195124266 88.6837826792 22.0218424095 20.2984380400 3.3199036613 0.0106250874 0.0544668352 -0.1513745907 + 400 -5025.3965382086 -5041.6929969192 16.2964587107 -5012.6418095739 -29.0511873454 92.7703393291 22.0224243957 20.3034636122 3.3515794172 0.0006844935 0.0458598502 0.6967704497 + 500 -5025.4050178038 -5042.1712315208 16.7662137170 -5013.1850223792 -28.9862091417 95.4444989189 22.0220673443 20.3074634962 3.4286173278 -0.0078273439 0.0340764532 0.6845095066 + 600 -5025.3985720873 -5041.2158953052 15.8173232179 -5012.4875324499 -28.7283628553 90.0427797386 22.0209262700 20.3103065099 3.4653840648 -0.0141442608 0.0229602847 0.0009001092 + 700 -5025.3997566711 -5041.6276726420 16.2279159709 -5012.7093586298 -28.9183140122 92.3801482242 22.0191651506 20.3120184840 3.4291788224 -0.0208485646 0.0104216414 -0.6668311565 + 800 -5025.3967608874 -5042.3401691104 16.9434082230 -5013.3044882226 -29.0356808878 96.4532085250 22.0167259920 20.3122737443 3.3535033285 -0.0279747378 -0.0060833621 -0.7003492926 + 900 -5025.3984547938 -5042.2820672614 16.8836124676 -5013.4066846579 -28.8753826035 96.1128111040 22.0136711877 20.3107854823 3.3206430872 -0.0331979094 -0.0237440547 0.1335648640 + 1000 -5025.3988190757 -5041.9160827657 16.5172636900 -5012.8147743212 -29.1013084444 94.0273089090 22.0102627032 20.3075977018 3.3736867454 -0.0340065996 -0.0390649991 0.7872380119 +Loop time of 33.7338 on 4 procs for 1000 steps with 1360 atoms -Performance: 2.031 ns/day, 11.817 hours/ns, 23.506 timesteps/s -98.9% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 2.561 ns/day, 9.370 hours/ns, 29.644 timesteps/s +94.1% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 39.928 | 40.992 | 42.377 | 15.8 | 96.36 -Bond | 0.0003643 | 0.00043392 | 0.00048113 | 0.0 | 0.00 +Pair | 30.833 | 31.356 | 32.18 | 9.1 | 92.95 +Bond | 0.00026059 | 0.00029182 | 0.00031185 | 0.0 | 0.00 Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 0.12253 | 1.5076 | 2.5698 | 82.1 | 3.54 -Output | 0.0012577 | 0.0013637 | 0.0016453 | 0.4 | 0.00 -Modify | 0.010833 | 0.012247 | 0.013317 | 0.9 | 0.03 -Other | | 0.02864 | | | 0.07 +Comm | 1.443 | 2.2722 | 2.8091 | 34.3 | 6.74 +Output | 0.00068855 | 0.00095087 | 0.0017185 | 0.0 | 0.00 +Modify | 0.010187 | 0.011709 | 0.015284 | 1.9 | 0.03 +Other | | 0.09241 | | | 0.27 Nlocal: 340 ave 344 max 334 min Histogram: 1 0 0 0 0 0 1 0 1 1 @@ -133,4 +136,4 @@ Ave neighs/atom = 195.004 Ave special neighs/atom = 0 Neighbor list builds = 0 Dangerous builds = 0 -Total wall time: 0:00:42 +Total wall time: 0:00:33 From 995b6b31a240a3f1315c4641764727c53858afdd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Jun 2019 16:05:54 -0400 Subject: [PATCH 86/90] flag a couple more packages that contain sub-builds of downloaded code --- cmake/Modules/Packages/MSCG.cmake | 3 +++ cmake/Modules/Packages/USER-SCAFACOS.cmake | 3 +++ 2 files changed, 6 insertions(+) diff --git a/cmake/Modules/Packages/MSCG.cmake b/cmake/Modules/Packages/MSCG.cmake index e8744bc192..b442580583 100644 --- a/cmake/Modules/Packages/MSCG.cmake +++ b/cmake/Modules/Packages/MSCG.cmake @@ -11,6 +11,9 @@ if(PKG_MSCG) if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR message(FATAL_ERROR "For downlading MSCG you need at least cmake-3.7") endif() + if(CMAKE_GENERATOR STREQUAL "Ninja") + message(FATAL_ERROR "Cannot build downloaded MSCG library with Ninja build tool") + endif() include(ExternalProject) if(NOT LAPACK_FOUND) set(EXTRA_MSCG_OPTS "-DLAPACK_LIBRARIES=${CMAKE_CURRENT_BINARY_DIR}/liblinalg.a") diff --git a/cmake/Modules/Packages/USER-SCAFACOS.cmake b/cmake/Modules/Packages/USER-SCAFACOS.cmake index adb002081f..475f2585c8 100644 --- a/cmake/Modules/Packages/USER-SCAFACOS.cmake +++ b/cmake/Modules/Packages/USER-SCAFACOS.cmake @@ -13,6 +13,9 @@ if(PKG_USER-SCAFACOS) endif() option(DOWNLOAD_SCAFACOS "Download ScaFaCoS library instead of using an already installed one" ${DOWNLOAD_SCAFACOS_DEFAULT}) if(DOWNLOAD_SCAFACOS) + if(CMAKE_GENERATOR STREQUAL "Ninja") + message(FATAL_ERROR "Cannot build downloaded ScaFaCoS library with Ninja build tool") + endif() message(STATUS "ScaFaCoS download requested - we will build our own") include(ExternalProject) ExternalProject_Add(scafacos_build From 81cdce9b04fe4d50fe2d568baed3afccb40da2d1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 18 Jun 2019 00:14:48 -0400 Subject: [PATCH 87/90] flag and document that USER-TALLY computes are not compatible with dynamic groups --- doc/src/compute_tally.txt | 2 ++ src/USER-TALLY/compute_force_tally.cpp | 1 + src/USER-TALLY/compute_heat_flux_tally.cpp | 1 + src/USER-TALLY/compute_pe_mol_tally.cpp | 1 + src/USER-TALLY/compute_pe_tally.cpp | 1 + src/USER-TALLY/compute_stress_tally.cpp | 1 + 6 files changed, 7 insertions(+) diff --git a/doc/src/compute_tally.txt b/doc/src/compute_tally.txt index 6401be54e9..125eba1302 100644 --- a/doc/src/compute_tally.txt +++ b/doc/src/compute_tally.txt @@ -88,6 +88,8 @@ potentials only include the pair potential portion of the EAM interaction when used by this compute, not the embedding term. Also bonded or Kspace interactions do not contribute to this compute. +The computes in this package are not compatible with dynamic groups. + [Related commands:] {compute group/group}_compute_group_group.html, {compute diff --git a/src/USER-TALLY/compute_force_tally.cpp b/src/USER-TALLY/compute_force_tally.cpp index 0ec1d332a4..ba155db586 100644 --- a/src/USER-TALLY/compute_force_tally.cpp +++ b/src/USER-TALLY/compute_force_tally.cpp @@ -41,6 +41,7 @@ ComputeForceTally::ComputeForceTally(LAMMPS *lmp, int narg, char **arg) : vector_flag = 0; peratom_flag = 1; timeflag = 1; + dynamic_group_allow = 0; comm_reverse = size_peratom_cols = 3; extscalar = 1; diff --git a/src/USER-TALLY/compute_heat_flux_tally.cpp b/src/USER-TALLY/compute_heat_flux_tally.cpp index f8db92a730..4aff25d952 100644 --- a/src/USER-TALLY/compute_heat_flux_tally.cpp +++ b/src/USER-TALLY/compute_heat_flux_tally.cpp @@ -38,6 +38,7 @@ ComputeHeatFluxTally::ComputeHeatFluxTally(LAMMPS *lmp, int narg, char **arg) : vector_flag = 1; timeflag = 1; + dynamic_group_allow = 0; comm_reverse = 7; extvector = 1; diff --git a/src/USER-TALLY/compute_pe_mol_tally.cpp b/src/USER-TALLY/compute_pe_mol_tally.cpp index 264ddca270..08b3ae4d73 100644 --- a/src/USER-TALLY/compute_pe_mol_tally.cpp +++ b/src/USER-TALLY/compute_pe_mol_tally.cpp @@ -39,6 +39,7 @@ ComputePEMolTally::ComputePEMolTally(LAMMPS *lmp, int narg, char **arg) : vector_flag = 1; size_vector = 4; timeflag = 1; + dynamic_group_allow = 0; extvector = 1; peflag = 1; // we need Pair::ev_tally() to be run diff --git a/src/USER-TALLY/compute_pe_tally.cpp b/src/USER-TALLY/compute_pe_tally.cpp index 3031915ebe..7b920d903d 100644 --- a/src/USER-TALLY/compute_pe_tally.cpp +++ b/src/USER-TALLY/compute_pe_tally.cpp @@ -40,6 +40,7 @@ ComputePETally::ComputePETally(LAMMPS *lmp, int narg, char **arg) : vector_flag = 0; peratom_flag = 1; timeflag = 1; + dynamic_group_allow = 0; comm_reverse = size_peratom_cols = 2; extscalar = 1; diff --git a/src/USER-TALLY/compute_stress_tally.cpp b/src/USER-TALLY/compute_stress_tally.cpp index 8ed40ae8e2..f61f498f43 100644 --- a/src/USER-TALLY/compute_stress_tally.cpp +++ b/src/USER-TALLY/compute_stress_tally.cpp @@ -41,6 +41,7 @@ ComputeStressTally::ComputeStressTally(LAMMPS *lmp, int narg, char **arg) : vector_flag = 0; peratom_flag = 1; timeflag = 1; + dynamic_group_allow = 0; comm_reverse = size_peratom_cols = 6; extscalar = 0; From 961dcfc2619d8d3b5ebc3a4e9b424e776d239e81 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 18 Jun 2019 11:50:06 -0400 Subject: [PATCH 88/90] mention alternate build environment generators for cmake --- doc/src/Build_cmake.txt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/doc/src/Build_cmake.txt b/doc/src/Build_cmake.txt index 265c16e3d4..a16ba995a8 100644 --- a/doc/src/Build_cmake.txt +++ b/doc/src/Build_cmake.txt @@ -32,10 +32,18 @@ cmake \[options ...\] ../cmake # configuration with (command-line) cmake make # compilation :pre The cmake command will detect available features, enable selected -packages and options, and will generate the build environment. The make -command will then compile and link LAMMPS, producing (by default) an -executable called "lmp" and a library called "liblammps.a" in the -"build" folder. +packages and options, and will generate the build environment. By default +this build environment will be created for "Unix Makefiles" on most +platforms and particularly on Linux. However, alternate build tools +(e.g. Ninja) and support files for Integrated Development Environments +(IDE) like Eclipse, CodeBlocks, or Kate can be generated, too. This is +selected via the "-G" command line flag. For the rest of the documentation +we will assume that the build environment is generated for makefiles +and thus the make command will be used to compile and link LAMMPS as +indicated above, producing (by default) an executable called "lmp" and +a library called "liblammps.a" in the "build" folder. When generating +a build environment for the "Ninja" build tool, the build command would +be "ninja" instead of "make". If your machine has multiple CPU cores (most do these days), using a command like "make -jN" (with N being the number of available local From d98c105d3433655fc4f0e6aeb0085f71e3f49668 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 18 Jun 2019 11:52:09 -0400 Subject: [PATCH 89/90] step version string to 18 June 2019 --- doc/lammps.1 | 2 +- doc/src/Manual.txt | 4 ++-- src/version.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lammps.1 b/doc/lammps.1 index f4a801779a..7ba31bfd06 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,4 +1,4 @@ -.TH LAMMPS "5 June 2019" "2019-06-05" +.TH LAMMPS "18 June 2019" "2019-06-18" .SH NAME .B LAMMPS \- Molecular Dynamics Simulator. diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 2fa9623f36..ba6ab8aac7 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ LAMMPS Users Manual - + @@ -21,7 +21,7 @@ :line LAMMPS Documentation :c,h1 -5 Jun 2019 version :c,h2 +18 Jun 2019 version :c,h2 "What is a LAMMPS version?"_Manual_version.html diff --git a/src/version.h b/src/version.h index 06ee8ab8f4..c2f6fcaf92 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "5 Jun 2019" +#define LAMMPS_VERSION "18 Jun 2019" From 98fbaef406c77e138733419e54a7834ce6fcf89f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 18 Jun 2019 15:00:27 -0400 Subject: [PATCH 90/90] workaround for ICE issue with gcc 4.8.x --- src/lmptype.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lmptype.h b/src/lmptype.h index 20d29880ed..12fa6cc4fb 100644 --- a/src/lmptype.h +++ b/src/lmptype.h @@ -211,7 +211,7 @@ typedef int bigint; #elif defined(__INTEL_COMPILER) # define _noopt #elif defined(__GNUC__) -# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) +# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)) # define _noopt __attribute__((optimize("O0","no-var-tracking-assignments"))) # else # define _noopt __attribute__((optimize("O0")))