From f48b71f46ba66655f1b9a20753737391ba3e42c5 Mon Sep 17 00:00:00 2001 From: Steve Plimpton <sjplimp@sandia.gov> Date: Fri, 4 Nov 2016 10:56:04 -0600 Subject: [PATCH] added examples/threebody, fix reaxc/speceies/kk --- doc/src/compute_temp_profile.txt | 4 +- doc/src/fix_reax_bonds.txt | 26 +++ doc/src/fix_reaxc_species.txt | 26 +++ doc/src/suffix.txt | 7 + examples/threebody/BNC.tersoff | 74 +++++++ examples/threebody/CdTeZnSeHgS0.sw | 233 ++++++++++++++++++++ examples/threebody/InP.vashishta | 38 ++++ examples/threebody/Si.sw | 18 ++ examples/threebody/in.threebody | 116 ++++++++++ potentials/CdTe.sw | 8 +- potentials/CdTeZnSeHgS0.sw | 14 +- src/KOKKOS/fix_qeq_reax_kokkos.cpp | 76 +++++-- src/KOKKOS/fix_qeq_reax_kokkos.h | 2 +- src/KOKKOS/fix_reaxc_species_kokkos.cpp | 20 +- src/KOKKOS/fix_wall_reflect_kokkos.h | 2 - src/KOKKOS/neigh_full_kokkos.h | 1 + src/KOKKOS/neigh_list_kokkos.cpp | 5 +- src/KOKKOS/neigh_list_kokkos.h | 3 +- src/KOKKOS/pair_reax_c_kokkos.h | 2 - src/KOKKOS/pair_sw_kokkos.cpp | 68 ++++-- src/KOKKOS/pair_sw_kokkos.h | 8 + src/KOKKOS/pair_tersoff_kokkos.cpp | 270 +++++++++++++++--------- src/KOKKOS/pair_tersoff_kokkos.h | 10 +- src/KOKKOS/pair_tersoff_mod_kokkos.cpp | 237 +++++++++++++-------- src/KOKKOS/pair_tersoff_mod_kokkos.h | 10 +- src/KOKKOS/pair_tersoff_zbl_kokkos.cpp | 235 +++++++++++++-------- src/KOKKOS/pair_tersoff_zbl_kokkos.h | 9 +- src/pair_morse.cpp | 3 +- 28 files changed, 1184 insertions(+), 341 deletions(-) create mode 100644 examples/threebody/BNC.tersoff create mode 100644 examples/threebody/CdTeZnSeHgS0.sw create mode 100644 examples/threebody/InP.vashishta create mode 100644 examples/threebody/Si.sw create mode 100644 examples/threebody/in.threebody diff --git a/doc/src/compute_temp_profile.txt b/doc/src/compute_temp_profile.txt index fedbd5cb32..54eebd6d8f 100644 --- a/doc/src/compute_temp_profile.txt +++ b/doc/src/compute_temp_profile.txt @@ -69,8 +69,8 @@ velocity for each atom. Note that if there is only one atom in the bin, its thermal velocity will thus be 0.0. After the spatially-averaged velocity field has been subtracted from -each atom, the temperature is calculated by the formula KE = (dim/2 N -- dim*Nx*Ny*Nz) k T, where KE = total kinetic energy of the group of +each atom, the temperature is calculated by the formula KE = (dim*N +- dim*Nx*Ny*Nz) k T/2, where KE = total kinetic energy of the group of atoms (sum of 1/2 m v^2), dim = 2 or 3 = dimensionality of the simulation, N = number of atoms in the group, k = Boltzmann constant, and T = temperature. The dim*Nx*Ny*Nz term are degrees of freedom diff --git a/doc/src/fix_reax_bonds.txt b/doc/src/fix_reax_bonds.txt index a0396ce210..a85e140b62 100644 --- a/doc/src/fix_reax_bonds.txt +++ b/doc/src/fix_reax_bonds.txt @@ -8,6 +8,7 @@ fix reax/bonds command :h3 fix reax/c/bonds command :h3 +fix reax/c/bonds/kk command :h3 [Syntax:] @@ -47,6 +48,31 @@ commands"_Section_howto.html#howto_15. No parameter of this fix can be used with the {start/stop} keywords of the "run"_run.html command. This fix is not invoked during "energy minimization"_minimize.html. +: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 in "Section_accelerate"_Section_accelerate.html +of the manual. 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 "Making +LAMMPS"_Section_start.html#start_3 section 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"_Section_start.html#start_7 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section_accelerate"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] The fix reax/bonds command requires that the "pair_style diff --git a/doc/src/fix_reaxc_species.txt b/doc/src/fix_reaxc_species.txt index 630c802a83..00db91900e 100644 --- a/doc/src/fix_reaxc_species.txt +++ b/doc/src/fix_reaxc_species.txt @@ -7,6 +7,7 @@ :line fix reax/c/species command :h3 +fix reax/c/species/kk command :h3 [Syntax:] @@ -129,6 +130,31 @@ No parameter of this fix can be used with the {start/stop} keywords of the "run"_run.html command. This fix is not invoked during "energy minimization"_minimize.html. +: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 in "Section_accelerate"_Section_accelerate.html +of the manual. 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 "Making +LAMMPS"_Section_start.html#start_3 section 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"_Section_start.html#start_7 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section_accelerate"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] The fix species currently only works with diff --git a/doc/src/suffix.txt b/doc/src/suffix.txt index 669d483f00..70c6a3031b 100644 --- a/doc/src/suffix.txt +++ b/doc/src/suffix.txt @@ -94,6 +94,13 @@ Of course this is also possible by not using any suffix commands, and explictly appending or not appending the suffix to the relevant commands in your input script. +NOTE: The default "run_style"_run_style.html verlet is invoked prior to +reading the input script and is therefore not affected by a suffix command +in the input script. The KOKKOS package requires "run_style verlet/kk", +so when using the KOKKOS package it is necessary to either use the command +line "-sf kk" command or add an explicit "run_style verlet" command to the +input script. + [Restrictions:] none [Related commands:] diff --git a/examples/threebody/BNC.tersoff b/examples/threebody/BNC.tersoff new file mode 100644 index 0000000000..1630062524 --- /dev/null +++ b/examples/threebody/BNC.tersoff @@ -0,0 +1,74 @@ +# DATE: 2013-03-21 CONTRIBUTOR: Cem Sevik CITATION: Kinaci, Haskins, Sevik and Cagin, Phys Rev B, 86, 115410 (2012) +# Tersoff parameters for B, C, and BN-C hybrid based graphene like nano structures +# multiple entries can be added to this file, LAMMPS reads the ones it needs + +# these entries are in LAMMPS "metal" units: +# A,B = eV; lambda1,lambda2,lambda3 = 1/Angstroms; R,D = Angstroms +# other quantities are unitless + +# Cem Sevik (csevik at anadolu.edu.tr) takes full blame for this +# file. It specifies B-N, B-C, and N-C interaction parameters +# generated and published by the reseacrh group of Prof. Tahir Cagin. + +# 1. Physical Review B 84, 085409 2011 +# Characterization of thermal transport in low-dimensional boron nitride nanostructures, +# + +# 2. Physical Review B 86, 075403 2012 +# Influence of disorder on thermal transport properties of boron nitride nanostructures +# + +# 3. Physical Review B 86, 075403 2012, Please see for further information about B-C and N-C parameters +# Thermal conductivity of BN-C nanostructures +# + +# The file also specifies C-C, interaction parameters +# generated and published by the reseacrh group of Dr. D. A. Broido +# Physical Review B 81, 205441 2010 +# Optimized Tersoff and Brenner empirical potential parameters for +# lattice dynamics and phonon thermal transport in carbon nanotubes and graphene + +# Users in referring the full parameters can cite the full parameter paper (3) as: +# A. Kinaci, J. B. Haskins, C. Sevik, T. Cagin, Physical Review B 86, 115410 (2012) +# Thermal conductivity of BN-C nanostructures +# + +# format of a single entry (one or more lines): +# element 1, element 2, element 3, +# m, gamma, lambda3, c, d, costheta0, n, beta, lambda2, B, R, D, lambda1, A + +N B B 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.199 340.00 1.95 0.05 3.568 1380.0 +N B N 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.199 340.00 1.95 0.05 3.568 1380.0 +N B C 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.199 340.00 1.95 0.05 3.568 1380.0 + +B N B 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.199 340.00 1.95 0.05 3.568 1380.0 +B N N 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.199 340.00 1.95 0.05 3.568 1380.0 +B N C 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.199 340.00 1.95 0.05 3.568 1380.0 + +N N B 3.0 1.0 0.0 17.7959 5.9484 0.00000 0.6184432 0.019251 2.6272721 138.77866 2.0 0.1 2.8293093 128.86866 +N N N 3.0 1.0 0.0 17.7959 5.9484 0.00000 0.6184432 0.019251 2.6272721 138.77866 2.0 0.1 2.8293093 128.86866 +N N C 3.0 1.0 0.0 17.7959 5.9484 0.00000 0.6184432 0.019251 2.6272721 138.77866 2.0 0.1 2.8293093 128.86866 + +B B B 3.0 1.0 0.0 0.52629 0.001587 0.5 3.9929061 1.6e-6 2.0774982 43.132016 2.0 0.1 2.2372578 40.0520156 +B B N 3.0 1.0 0.0 0.52629 0.001587 0.5 3.9929061 1.6e-6 2.0774982 43.132016 2.0 0.1 2.2372578 40.0520156 +B B C 3.0 1.0 0.0 0.52629 0.001587 0.5 3.9929061 1.6e-6 2.0774982 43.132016 2.0 0.1 2.2372578 40.0520156 + +C C C 3.0 1.0 0.0 3.8049e4 4.3484 -0.93000 0.72751 1.5724e-7 2.2119 430.00 1.95 0.15 3.4879 1393.6 +C C B 3.0 1.0 0.0 3.8049e4 4.3484 -0.93000 0.72751 1.5724e-7 2.2119 430.00 1.95 0.15 3.4879 1393.6 +C C N 3.0 1.0 0.0 3.8049e4 4.3484 -0.93000 0.72751 1.5724e-7 2.2119 430.00 1.95 0.15 3.4879 1393.6 + +C B B 3.0 1.0 0.0 3.8049e4 4.3484 -0.93000 0.72751 1.5724e-7 2.2054 339.068910 1.95 0.10 3.5279 1386.78 +C B N 3.0 1.0 0.0 3.8049e4 4.3484 -0.93000 0.72751 1.5724e-7 2.2054 339.068910 1.95 0.10 3.5279 1386.78 +C B C 3.0 1.0 0.0 3.8049e4 4.3484 -0.93000 0.72751 1.5724e-7 2.2054 339.068910 1.95 0.10 3.5279 1386.78 + +C N B 3.0 1.0 0.0 3.8049e4 4.3484 -0.93000 0.72751 1.5724e-7 2.2054 387.575152 1.95 0.10 3.5279 1386.78 +C N N 3.0 1.0 0.0 3.8049e4 4.3484 -0.93000 0.72751 1.5724e-7 2.2054 387.575152 1.95 0.10 3.5279 1386.78 +C N C 3.0 1.0 0.0 3.8049e4 4.3484 -0.93000 0.72751 1.5724e-7 2.2054 387.575152 1.95 0.10 3.5279 1386.78 + +B C C 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.2054 339.068910 1.95 0.10 3.5279 1386.78 +B C B 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.2054 339.068910 1.95 0.10 3.5279 1386.78 +B C N 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.2054 339.068910 1.95 0.10 3.5279 1386.78 + +N C C 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.2054 387.575152 1.95 0.10 3.5279 1386.78 +N C B 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.2054 387.575152 1.95 0.10 3.5279 1386.78 +N C N 3.0 1.0 0.0 25000 4.3484 -0.89000 0.72751 1.25724e-7 2.2054 387.575152 1.95 0.10 3.5279 1386.78 diff --git a/examples/threebody/CdTeZnSeHgS0.sw b/examples/threebody/CdTeZnSeHgS0.sw new file mode 100644 index 0000000000..d6f05d41df --- /dev/null +++ b/examples/threebody/CdTeZnSeHgS0.sw @@ -0,0 +1,233 @@ +### DATE: 2013-08-09 CONTRIBUTOR: X. W. Zhou, xzhou@sandia.gov, CITATION: Zhou, Ward, Martin, van Swol, Cruz-Campa, and D. Zubia, Phys. Rev. B, 88, 085309 (2013). +# +# Note that the way the parameters can be entered is not unique. +# As one way, we assume that eps_ijk is equal to eps_ik and +# lambda_ijk is equal to sqrt(lambda_ij*eps_ij*lambda_ik*eps_ik)/eps_ik, +# and all other parameters in the ijk line are for ik. +# +# The twobody ik pair parameters are entered on the i*k lines, where * +# can be any species. This is consistent with the LAMMPS requirement +# that twobody ik parameters be defined on the ikk line. Entries on all +# the other i*k lines are ignored by LAMMPS +# +# These entries are in LAMMPS "metal" units: epsilon = eV; +# sigma = Angstroms; other quantities are unitless +# +# cutoff distance = 4.632 +# eps sigma a lambda gamma cos(theta) A B p q tol +Cd Cd Cd 1.182358e+00 2.663951e+00 1.527956e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.674460e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Cd Te 1.385284e+00 2.352141e+00 1.810919e+00 3.002537e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Cd Zn 6.908179e-01 2.238699e+00 1.812616e+00 4.251831e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Cd Se 1.352371e+00 2.045165e+00 1.953387e+00 3.038855e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Cd Hg 4.881231e-01 2.432694e+00 1.677987e+00 5.058167e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Cd S 1.300376e+00 1.804151e+00 2.124568e+00 3.099013e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Te Cd 1.182358e+00 2.663951e+00 1.527956e+00 3.517858e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.674460e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Te Te 1.385284e+00 2.352141e+00 1.810919e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Te Zn 6.908179e-01 2.238699e+00 1.812616e+00 4.602259e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Te Se 1.352371e+00 2.045165e+00 1.953387e+00 3.289311e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Te Hg 4.881231e-01 2.432694e+00 1.677987e+00 5.475051e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Te S 1.300376e+00 1.804151e+00 2.124568e+00 3.354428e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Zn Cd 1.182358e+00 2.663951e+00 1.527956e+00 2.484224e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.674460e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Zn Te 1.385284e+00 2.352141e+00 1.810919e+00 2.295069e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Zn Zn 6.908179e-01 2.238699e+00 1.812616e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Zn Se 1.352371e+00 2.045165e+00 1.953387e+00 2.322829e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Zn Hg 4.881231e-01 2.432694e+00 1.677987e+00 3.866344e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Zn S 1.300376e+00 1.804151e+00 2.124568e+00 2.368813e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Se Cd 1.182358e+00 2.663951e+00 1.527956e+00 3.475816e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.674460e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Se Te 1.385284e+00 2.352141e+00 1.810919e+00 3.211159e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Se Zn 6.908179e-01 2.238699e+00 1.812616e+00 4.547256e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Se Se 1.352371e+00 2.045165e+00 1.953387e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Se Hg 4.881231e-01 2.432694e+00 1.677987e+00 5.409618e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Se S 1.300376e+00 1.804151e+00 2.124568e+00 3.314338e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Hg Cd 1.182358e+00 2.663951e+00 1.527956e+00 2.088207e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.674460e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Hg Te 1.385284e+00 2.352141e+00 1.810919e+00 1.929206e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Hg Zn 6.908179e-01 2.238699e+00 1.812616e+00 2.731909e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Hg Se 1.352371e+00 2.045165e+00 1.953387e+00 1.952541e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Hg Hg 4.881231e-01 2.432694e+00 1.677987e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd Hg S 1.300376e+00 1.804151e+00 2.124568e+00 1.991194e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd S Cd 1.182358e+00 2.663951e+00 1.527956e+00 3.408343e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.674460e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd S Te 1.385284e+00 2.352141e+00 1.810919e+00 3.148823e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd S Zn 6.908179e-01 2.238699e+00 1.812616e+00 4.458985e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd S Se 1.352371e+00 2.045165e+00 1.953387e+00 3.186911e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Cd S Hg 4.881231e-01 2.432694e+00 1.677987e+00 5.304605e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Cd S S 1.300376e+00 1.804151e+00 2.124568e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Cd Cd 1.385284e+00 2.352141e+00 1.810919e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Cd Te 1.849775e+00 2.905254e+00 1.594353e+00 2.812506e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.307283e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Cd Zn 1.546239e+00 2.056363e+00 1.907922e+00 3.076200e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Cd Se 1.295053e+00 2.231716e+00 1.809645e+00 3.361313e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Cd Hg 1.204715e+00 2.135591e+00 1.892491e+00 3.485063e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Cd S 1.450015e+00 2.297301e+00 1.726905e+00 3.176630e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Te Cd 1.385284e+00 2.352141e+00 1.810919e+00 3.755548e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Te Te 1.849775e+00 2.905254e+00 1.594353e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.307283e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Te Zn 1.546239e+00 2.056363e+00 1.907922e+00 3.554713e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Te Se 1.295053e+00 2.231716e+00 1.809645e+00 3.884177e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Te Hg 1.204715e+00 2.135591e+00 1.892491e+00 4.027176e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Te S 1.450015e+00 2.297301e+00 1.726905e+00 3.670765e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Zn Cd 1.385284e+00 2.352141e+00 1.810919e+00 3.433620e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Zn Te 1.849775e+00 2.905254e+00 1.594353e+00 2.971408e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.307283e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Zn Zn 1.546239e+00 2.056363e+00 1.907922e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Zn Se 1.295053e+00 2.231716e+00 1.809645e+00 3.551222e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Zn Hg 1.204715e+00 2.135591e+00 1.892491e+00 3.681964e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Zn S 1.450015e+00 2.297301e+00 1.726905e+00 3.356105e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Se Cd 1.385284e+00 2.352141e+00 1.810919e+00 3.142373e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Se Te 1.849775e+00 2.905254e+00 1.594353e+00 2.719366e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.307283e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Se Zn 1.546239e+00 2.056363e+00 1.907922e+00 2.974328e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Se Se 1.295053e+00 2.231716e+00 1.809645e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Se Hg 1.204715e+00 2.135591e+00 1.892491e+00 3.369652e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Se S 1.450015e+00 2.297301e+00 1.726905e+00 3.071433e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Hg Cd 1.385284e+00 2.352141e+00 1.810919e+00 3.030791e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Hg Te 1.849775e+00 2.905254e+00 1.594353e+00 2.622805e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.307283e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te Hg Zn 1.546239e+00 2.056363e+00 1.907922e+00 2.868714e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Hg Se 1.295053e+00 2.231716e+00 1.809645e+00 3.134597e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Hg Hg 1.204715e+00 2.135591e+00 1.892491e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te Hg S 1.450015e+00 2.297301e+00 1.726905e+00 2.962370e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te S Cd 1.385284e+00 2.352141e+00 1.810919e+00 3.325065e+01 1.200000e+00 -3.333333e-01 7.049600e+00 8.861252e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te S Te 1.849775e+00 2.905254e+00 1.594353e+00 2.877465e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.307283e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Te S Zn 1.546239e+00 2.056363e+00 1.907922e+00 3.147250e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te S Se 1.295053e+00 2.231716e+00 1.809645e+00 3.438949e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te S Hg 1.204715e+00 2.135591e+00 1.892491e+00 3.565557e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Te S S 1.450015e+00 2.297301e+00 1.726905e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Cd Cd 6.908179e-01 2.238699e+00 1.812616e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Cd Te 1.546239e+00 2.056363e+00 1.907922e+00 2.172335e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Cd Zn 1.392961e+00 2.367650e+00 1.525521e+00 2.288736e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.676279e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Cd Se 1.691181e+00 2.028827e+00 1.836907e+00 2.077161e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Cd Hg 4.951616e-01 2.239186e+00 1.761363e+00 3.838766e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Cd S 2.208390e+00 2.323783e+00 1.589241e+00 1.817721e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Te Cd 6.908179e-01 2.238699e+00 1.812616e+00 4.862279e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Te Te 1.546239e+00 2.056363e+00 1.907922e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Te Zn 1.392961e+00 2.367650e+00 1.525521e+00 3.424146e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.676279e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Te Se 1.691181e+00 2.028827e+00 1.836907e+00 3.107611e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Te Hg 4.951616e-01 2.239186e+00 1.761363e+00 5.743124e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Te S 2.208390e+00 2.323783e+00 1.589241e+00 2.719467e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Zn Cd 6.908179e-01 2.238699e+00 1.812616e+00 4.614993e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Zn Te 1.546239e+00 2.056363e+00 1.907922e+00 3.084711e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Zn Zn 1.392961e+00 2.367650e+00 1.525521e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.676279e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Zn Se 1.691181e+00 2.028827e+00 1.836907e+00 2.949563e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Zn Hg 4.951616e-01 2.239186e+00 1.761363e+00 5.451040e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Zn S 2.208390e+00 2.323783e+00 1.589241e+00 2.581160e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Se Cd 6.908179e-01 2.238699e+00 1.812616e+00 5.085067e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Se Te 1.546239e+00 2.056363e+00 1.907922e+00 3.398914e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Se Zn 1.392961e+00 2.367650e+00 1.525521e+00 3.581039e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.676279e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Se Se 1.691181e+00 2.028827e+00 1.836907e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Se Hg 4.951616e-01 2.239186e+00 1.761363e+00 6.006272e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Se S 2.208390e+00 2.323783e+00 1.589241e+00 2.844072e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Hg Cd 6.908179e-01 2.238699e+00 1.812616e+00 2.751535e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Hg Te 1.546239e+00 2.056363e+00 1.907922e+00 1.839156e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Hg Zn 1.392961e+00 2.367650e+00 1.525521e+00 1.937704e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.676279e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Hg Se 1.691181e+00 2.028827e+00 1.836907e+00 1.758578e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Hg Hg 4.951616e-01 2.239186e+00 1.761363e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn Hg S 2.208390e+00 2.323783e+00 1.589241e+00 1.538930e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn S Cd 6.908179e-01 2.238699e+00 1.812616e+00 5.810847e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.010632e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn S Te 1.546239e+00 2.056363e+00 1.907922e+00 3.884033e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.255846e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Zn S Zn 1.392961e+00 2.367650e+00 1.525521e+00 4.092153e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.676279e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn S Se 1.691181e+00 2.028827e+00 1.836907e+00 3.713865e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn S Hg 4.951616e-01 2.239186e+00 1.761363e+00 6.863534e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Zn S S 2.208390e+00 2.323783e+00 1.589241e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Cd Cd 1.352371e+00 2.045165e+00 1.953387e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Cd Te 1.295053e+00 2.231716e+00 1.809645e+00 3.321142e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Cd Zn 1.691181e+00 2.028827e+00 1.836907e+00 2.906271e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Cd Se 2.400781e+00 2.789002e+00 1.544925e+00 2.439242e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.672131e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Cd Hg 1.299758e+00 2.113406e+00 1.831821e+00 3.315126e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Cd S 1.307592e+00 2.229392e+00 1.747782e+00 3.305180e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Te Cd 1.352371e+00 2.045165e+00 1.953387e+00 3.180382e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Te Te 1.295053e+00 2.231716e+00 1.809645e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Te Zn 1.691181e+00 2.028827e+00 1.836907e+00 2.844016e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Te Se 2.400781e+00 2.789002e+00 1.544925e+00 2.386992e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.672131e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Te Hg 1.299758e+00 2.113406e+00 1.831821e+00 3.244113e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Te S 1.307592e+00 2.229392e+00 1.747782e+00 3.234380e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Zn Cd 1.352371e+00 2.045165e+00 1.953387e+00 3.634382e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Zn Te 1.295053e+00 2.231716e+00 1.809645e+00 3.713938e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Zn Zn 1.691181e+00 2.028827e+00 1.836907e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Zn Se 2.400781e+00 2.789002e+00 1.544925e+00 2.727735e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.672131e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Zn Hg 1.299758e+00 2.113406e+00 1.831821e+00 3.707211e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Zn S 1.307592e+00 2.229392e+00 1.747782e+00 3.696088e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Se Cd 1.352371e+00 2.045165e+00 1.953387e+00 4.330238e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Se Te 1.295053e+00 2.231716e+00 1.809645e+00 4.425026e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Se Zn 1.691181e+00 2.028827e+00 1.836907e+00 3.872260e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Se Se 2.400781e+00 2.789002e+00 1.544925e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.672131e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Se Hg 1.299758e+00 2.113406e+00 1.831821e+00 4.417011e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Se S 1.307592e+00 2.229392e+00 1.747782e+00 4.403758e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Hg Cd 1.352371e+00 2.045165e+00 1.953387e+00 3.186153e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Hg Te 1.295053e+00 2.231716e+00 1.809645e+00 3.255898e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Hg Zn 1.691181e+00 2.028827e+00 1.836907e+00 2.849177e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Hg Se 2.400781e+00 2.789002e+00 1.544925e+00 2.391323e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.672131e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se Hg Hg 1.299758e+00 2.113406e+00 1.831821e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se Hg S 1.307592e+00 2.229392e+00 1.747782e+00 3.240249e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se S Cd 1.352371e+00 2.045165e+00 1.953387e+00 3.195742e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.116149e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se S Te 1.295053e+00 2.231716e+00 1.809645e+00 3.265696e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.005396e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se S Zn 1.691181e+00 2.028827e+00 1.836907e+00 2.857751e+01 1.200000e+00 -3.333333e-01 7.049600e+00 9.510930e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se S Se 2.400781e+00 2.789002e+00 1.544925e+00 2.398520e+01 1.200000e+00 -3.333333e-01 7.917000e+00 7.672131e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Se S Hg 1.299758e+00 2.113406e+00 1.831821e+00 3.259780e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Se S S 1.307592e+00 2.229392e+00 1.747782e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Cd Cd 4.881231e-01 2.432694e+00 1.677987e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Cd Te 1.204715e+00 2.135591e+00 1.892491e+00 2.068740e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Cd Zn 4.951616e-01 2.239186e+00 1.761363e+00 3.226819e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Cd Se 1.299758e+00 2.113406e+00 1.831821e+00 1.991668e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Cd Hg 1.272807e+00 2.699097e+00 1.498503e+00 2.012643e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.211532e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Cd S 1.531211e+00 2.025045e+00 1.833708e+00 1.834976e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Te Cd 4.881231e-01 2.432694e+00 1.677987e+00 5.105765e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Te Te 1.204715e+00 2.135591e+00 1.892491e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Te Zn 4.951616e-01 2.239186e+00 1.761363e+00 5.069347e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Te Se 1.299758e+00 2.113406e+00 1.831821e+00 3.128919e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Te Hg 1.272807e+00 2.699097e+00 1.498503e+00 3.161872e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.211532e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Te S 1.531211e+00 2.025045e+00 1.833708e+00 2.882756e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Zn Cd 4.881231e-01 2.432694e+00 1.677987e+00 3.273348e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Zn Te 1.204715e+00 2.135591e+00 1.892491e+00 2.083602e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Zn Zn 4.951616e-01 2.239186e+00 1.761363e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Zn Se 1.299758e+00 2.113406e+00 1.831821e+00 2.005976e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Zn Hg 1.272807e+00 2.699097e+00 1.498503e+00 2.027102e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.211532e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Zn S 1.531211e+00 2.025045e+00 1.833708e+00 1.848159e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Se Cd 4.881231e-01 2.432694e+00 1.677987e+00 5.303345e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Se Te 1.204715e+00 2.135591e+00 1.892491e+00 3.375766e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Se Zn 4.951616e-01 2.239186e+00 1.761363e+00 5.265518e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Se Se 1.299758e+00 2.113406e+00 1.831821e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Se Hg 1.272807e+00 2.699097e+00 1.498503e+00 3.284228e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.211532e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Se S 1.531211e+00 2.025045e+00 1.833708e+00 2.994311e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Hg Cd 4.881231e-01 2.432694e+00 1.677987e+00 5.248074e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Hg Te 1.204715e+00 2.135591e+00 1.892491e+00 3.340584e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Hg Zn 4.951616e-01 2.239186e+00 1.761363e+00 5.210641e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Hg Se 1.299758e+00 2.113406e+00 1.831821e+00 3.216129e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Hg Hg 1.272807e+00 2.699097e+00 1.498503e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.211532e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg Hg S 1.531211e+00 2.025045e+00 1.833708e+00 2.963105e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg S Cd 4.881231e-01 2.432694e+00 1.677987e+00 5.756205e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.250999e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg S Te 1.204715e+00 2.135591e+00 1.892491e+00 3.664028e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.445180e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg S Zn 4.951616e-01 2.239186e+00 1.761363e+00 5.715148e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.461167e-01 4.000000e+00 0.000000e+00 0.000000e+00 +Hg S Se 1.299758e+00 2.113406e+00 1.831821e+00 3.527522e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.150200e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg S Hg 1.272807e+00 2.699097e+00 1.498503e+00 3.564673e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.211532e+00 4.000000e+00 0.000000e+00 0.000000e+00 +Hg S S 1.531211e+00 2.025045e+00 1.833708e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Cd Cd 1.300376e+00 1.804151e+00 2.124568e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Cd Te 1.450015e+00 2.297301e+00 1.726905e+00 3.077737e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Cd Zn 2.208390e+00 2.323783e+00 1.589241e+00 2.493905e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Cd Se 1.307592e+00 2.229392e+00 1.747782e+00 3.241019e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Cd Hg 1.531211e+00 2.025045e+00 1.833708e+00 2.995023e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Cd S 2.434871e+00 2.423171e+00 1.711097e+00 2.375088e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.049688e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Te Cd 1.300376e+00 1.804151e+00 2.124568e+00 3.431904e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Te Te 1.450015e+00 2.297301e+00 1.726905e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Te Zn 2.208390e+00 2.323783e+00 1.589241e+00 2.633490e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Te Se 1.307592e+00 2.229392e+00 1.747782e+00 3.422421e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Te Hg 1.531211e+00 2.025045e+00 1.833708e+00 3.162656e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Te S 2.434871e+00 2.423171e+00 1.711097e+00 2.508023e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.049688e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Zn Cd 1.300376e+00 1.804151e+00 2.124568e+00 4.235326e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Zn Te 1.450015e+00 2.297301e+00 1.726905e+00 4.010837e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Zn Zn 2.208390e+00 2.323783e+00 1.589241e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Zn Se 1.307592e+00 2.229392e+00 1.747782e+00 4.223622e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Zn Hg 1.531211e+00 2.025045e+00 1.833708e+00 3.903046e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Zn S 2.434871e+00 2.423171e+00 1.711097e+00 3.095161e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.049688e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Se Cd 1.300376e+00 1.804151e+00 2.124568e+00 3.259006e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Se Te 1.450015e+00 2.297301e+00 1.726905e+00 3.086266e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Se Zn 2.208390e+00 2.323783e+00 1.589241e+00 2.500815e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Se Se 1.307592e+00 2.229392e+00 1.747782e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Se Hg 1.531211e+00 2.025045e+00 1.833708e+00 3.003322e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Se S 2.434871e+00 2.423171e+00 1.711097e+00 2.381670e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.049688e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Hg Cd 1.300376e+00 1.804151e+00 2.124568e+00 3.526684e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Hg Te 1.450015e+00 2.297301e+00 1.726905e+00 3.339756e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Hg Zn 2.208390e+00 2.323783e+00 1.589241e+00 2.706220e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Hg Se 1.307592e+00 2.229392e+00 1.747782e+00 3.516939e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S Hg Hg 1.531211e+00 2.025045e+00 1.833708e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S Hg S 2.434871e+00 2.423171e+00 1.711097e+00 2.577288e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.049688e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S S Cd 1.300376e+00 1.804151e+00 2.124568e+00 4.447203e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.540087e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S S Te 1.450015e+00 2.297301e+00 1.726905e+00 4.211484e+01 1.200000e+00 -3.333333e-01 7.049600e+00 7.794685e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S S Zn 2.208390e+00 2.323783e+00 1.589241e+00 3.412585e+01 1.200000e+00 -3.333333e-01 7.049600e+00 4.643181e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S S Se 1.307592e+00 2.229392e+00 1.747782e+00 4.434914e+01 1.200000e+00 -3.333333e-01 7.049600e+00 6.932325e-01 4.000000e+00 0.000000e+00 0.000000e+00 +S S Hg 1.531211e+00 2.025045e+00 1.833708e+00 4.098300e+01 1.200000e+00 -3.333333e-01 7.049600e+00 1.184541e+00 4.000000e+00 0.000000e+00 0.000000e+00 +S S S 2.434871e+00 2.423171e+00 1.711097e+00 3.250000e+01 1.200000e+00 -3.333333e-01 7.917000e+00 1.049688e+00 4.000000e+00 0.000000e+00 0.000000e+00 diff --git a/examples/threebody/InP.vashishta b/examples/threebody/InP.vashishta new file mode 100644 index 0000000000..9fefd4ef19 --- /dev/null +++ b/examples/threebody/InP.vashishta @@ -0,0 +1,38 @@ +# DATE: 2015-10-14 CONTRIBUTOR: Aidan Thompson, athomps@sandia.gov CITATION: Branicio, Rino, Gan and Tsuzuki, J. Phys Condensed Matter 21 (2009) 095002 +# +# Vashishta potential file for InP, Branicio, Rino, Gan and Tsuzuki, +# J. Phys Condensed Matter 21 (2009) 095002 +# +# These entries are in LAMMPS "metal" units: +# H = eV*Angstroms^eta; Zi, Zj = |e| (e = electronic charge); +# lambda1, lambda4, rc, r0, gamma = Angstroms; +# D = eV*Angstroms^4; W = eV*Angstroms^6; B = eV; +# other quantities are unitless + +# element1 element2 element3 +# H eta Zi Zj lambda1 D lambda4 +# W rc B gamma r0 C cos(theta) + +In In In 273.584 7 -1.21 -1.21 4.5 0.0 2.75 + 0.0 6.0 0.0 0.0 0.0 0.0 0.0 + +P P P 1813.06 7 1.21 1.21 4.5 52.7067 2.75 + 0.0 6.0 0.0 0.0 0.0 0.0 -0.333333333333 + +In P P 4847.09 9 1.21 -1.21 4.5 26.3533 2.75 + 270.105 6.0 4.34967 1.0 3.55 7.0 -0.333333333333 + +P In In 4847.09 9 1.21 -1.21 4.5 26.3533 2.75 + 270.105 6.0 4.34967 1.0 3.55 7.0 -0.333333333333 + +In In P 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + +In P In 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + +P In P 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + +P P In 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 0.0 0.0 0.0 0.0 0.0 0.0 0.0 diff --git a/examples/threebody/Si.sw b/examples/threebody/Si.sw new file mode 100644 index 0000000000..db4be100ef --- /dev/null +++ b/examples/threebody/Si.sw @@ -0,0 +1,18 @@ +# DATE: 2007-06-11 CONTRIBUTOR: Aidan Thompson, athomps@sandia.gov CITATION: Stillinger and Weber, Phys Rev B, 31, 5262, (1985) +# Stillinger-Weber parameters for various elements and mixtures +# multiple entries can be added to this file, LAMMPS reads the ones it needs +# these entries are in LAMMPS "metal" units: +# epsilon = eV; sigma = Angstroms +# other quantities are unitless + +# format of a single entry (one or more lines): +# element 1, element 2, element 3, +# epsilon, sigma, a, lambda, gamma, costheta0, A, B, p, q, tol + +# Here are the original parameters in metal units, for Silicon from: +# +# Stillinger and Weber, Phys. Rev. B, v. 31, p. 5262, (1985) +# + +Si Si Si 2.1683 2.0951 1.80 21.0 1.20 -0.333333333333 + 7.049556277 0.6022245584 4.0 0.0 0.0 diff --git a/examples/threebody/in.threebody b/examples/threebody/in.threebody new file mode 100644 index 0000000000..6eff77d6d6 --- /dev/null +++ b/examples/threebody/in.threebody @@ -0,0 +1,116 @@ +# Simple regression tests for threebody potentials + +# NOTE: These are not intended to represent real materials + +units metal + +atom_style atomic +atom_modify map array +boundary p p p +atom_modify sort 0 0.0 + +# temperature + +variable t equal 1800.0 + +# cubic diamond unit cell + +variable a equal 5.431 +lattice custom $a & + a1 1.0 0.0 0.0 & + a2 0.0 1.0 0.0 & + a3 0.0 0.0 1.0 & + basis 0.0 0.0 0.0 & + basis 0.0 0.5 0.5 & + basis 0.5 0.0 0.5 & + basis 0.5 0.5 0.0 & + basis 0.25 0.25 0.25 & + basis 0.25 0.75 0.75 & + basis 0.75 0.25 0.75 & + basis 0.75 0.75 0.25 + +region myreg block 0 4 & + 0 4 & + 0 4 + +create_box 8 myreg +create_atoms 1 region myreg & + basis 1 1 & + basis 2 2 & + basis 3 3 & + basis 4 4 & + basis 5 5 & + basis 6 6 & + basis 7 7 & + basis 8 8 + +mass * 28.06 + +velocity all create $t 5287287 mom yes rot yes dist gaussian + +# Equilibrate using Stillinger-Weber model for silicon + +pair_style sw +pair_coeff * * Si.sw Si Si Si Si Si Si Si Si + +thermo 10 +fix 1 all nvt temp $t $t 0.1 +fix_modify 1 energy yes +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes +run 100 + +write_restart restart.equil + +# Test Stillinger-Weber model for Cd/Te/Zn/Se/Hg/S + +clear +read_restart restart.equil + +pair_style sw +pair_coeff * * CdTeZnSeHgS0.sw Cd Zn Hg Cd Te S Se Te + +thermo 10 +fix 1 all nvt temp $t $t 0.1 +fix_modify 1 energy yes +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes +run 100 + +# Test Vashishta model for In/P + +clear +read_restart restart.equil + +pair_style vashishta +pair_coeff * * InP.vashishta In In In In P P P P + +thermo 10 +fix 1 all nvt temp $t $t 0.1 +fix_modify 1 energy yes +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes +run 100 + +# Test Tersoff model for B/N/C + +clear +read_restart restart.equil + +variable fac equal 0.6 +change_box all x scale ${fac} y scale ${fac} z scale ${fac} remap + +pair_style tersoff +pair_coeff * * BNC.tersoff N N N C B B C B + +thermo 10 +fix 1 all nvt temp $t $t 0.1 +fix_modify 1 energy yes +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes +run 100 + diff --git a/potentials/CdTe.sw b/potentials/CdTe.sw index ed79f7d384..3259657d06 100644 --- a/potentials/CdTe.sw +++ b/potentials/CdTe.sw @@ -18,9 +18,11 @@ # sqrt(lambda_ij*epsilon_ij*lambda_ik*epsilon_ik)/lambda_ik, and the # results are directly entered in this table. Obviously, this # conversion does not change the two-body parameters epsilon_ijj. -# All other ik pair parameters are entered on the i*k line, where * -# can be any species. This is consistent with the requirement of -# the ik parameter being on the ikk line. + +# The twobody ik pair parameters are entered on the i*k lines, where * +# can be any species. This is consistent with the LAMMPS requirement +# that twobody ik parameters be defined on the ikk line. Entries on all +# the other i*k lines are ignored by LAMMPS # These entries are in LAMMPS "metal" units: epsilon = eV; # sigma = Angstroms; other quantities are unitless diff --git a/potentials/CdTeZnSeHgS0.sw b/potentials/CdTeZnSeHgS0.sw index cae54097dd..d6f05d41df 100644 --- a/potentials/CdTeZnSeHgS0.sw +++ b/potentials/CdTeZnSeHgS0.sw @@ -1,9 +1,17 @@ ### DATE: 2013-08-09 CONTRIBUTOR: X. W. Zhou, xzhou@sandia.gov, CITATION: Zhou, Ward, Martin, van Swol, Cruz-Campa, and D. Zubia, Phys. Rev. B, 88, 085309 (2013). # -# Note that the way the parameters can be entered is not unique. As one way, we assume that eps_ijk is equal to eps_ik and lambda_ijk is equal to -# sqrt(lambda_ij*eps_ij*lambda_ik*eps_ik)/eps_ik, and all other parameters in the ijk line are for ik. +# Note that the way the parameters can be entered is not unique. +# As one way, we assume that eps_ijk is equal to eps_ik and +# lambda_ijk is equal to sqrt(lambda_ij*eps_ij*lambda_ik*eps_ik)/eps_ik, +# and all other parameters in the ijk line are for ik. +# +# The twobody ik pair parameters are entered on the i*k lines, where * +# can be any species. This is consistent with the LAMMPS requirement +# that twobody ik parameters be defined on the ikk line. Entries on all +# the other i*k lines are ignored by LAMMPS # -# These entries are in LAMMPS "metal" units: epsilon = eV; sigma = Angstroms; other quantities are unitless; +# These entries are in LAMMPS "metal" units: epsilon = eV; +# sigma = Angstroms; other quantities are unitless # # cutoff distance = 4.632 # eps sigma a lambda gamma cos(theta) A B p q tol diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp index d39d5cc84a..0c0039a18a 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -37,7 +37,7 @@ #include "math_const.h" #include "memory.h" #include "error.h" -#include "pair_kokkos.h" +#include "pair_reax_c_kokkos.h" using namespace LAMMPS_NS; using namespace FixConst; @@ -62,6 +62,11 @@ FixQEqReaxKokkos<DeviceType>::FixQEqReaxKokkos(LAMMPS *lmp, int narg, char **arg nmax = nmax = m_cap = 0; allocated_flag = 0; + + reaxc = (PairReaxC *) force->pair_match("reax/c/kk",1); + use_pair_list = 0; + if (reaxc->execution_space == this->execution_space) + use_pair_list = 1; } /* ---------------------------------------------------------------------- */ @@ -80,29 +85,54 @@ void FixQEqReaxKokkos<DeviceType>::init() atomKK->k_q.modify<LMPHostType>(); atomKK->k_q.sync<LMPDeviceType>(); - FixQEqReax::init(); + //FixQEqReax::init(); + { + if (!atom->q_flag) error->all(FLERR,"Fix qeq/reax requires atom attribute q"); + + ngroup = group->count(igroup); + if (ngroup == 0) error->all(FLERR,"Fix qeq/reax group has no atoms"); + + // need a half neighbor list w/ Newton off and ghost neighbors + // built whenever re-neighboring occurs + + if (!use_pair_list) { + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->fix = 1; + neighbor->requests[irequest]->newton = 2; + neighbor->requests[irequest]->ghost = 1; + } + + init_shielding(); + init_taper(); + + if (strstr(update->integrate_style,"respa")) + nlevels_respa = ((Respa *) update->integrate)->nlevels; + } neighflag = lmp->kokkos->neighflag; - int irequest = neighbor->nrequest - 1; - - neighbor->requests[irequest]-> - kokkos_host = Kokkos::Impl::is_same<DeviceType,LMPHostType>::value && - !Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value; - neighbor->requests[irequest]-> - kokkos_device = Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value; - - if (neighflag == FULL) { - neighbor->requests[irequest]->fix = 1; - neighbor->requests[irequest]->pair = 0; - neighbor->requests[irequest]->full = 1; - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full_cluster = 0; - } else { //if (neighflag == HALF || neighflag == HALFTHREAD) - neighbor->requests[irequest]->fix = 1; - neighbor->requests[irequest]->full = 0; - neighbor->requests[irequest]->half = 1; - neighbor->requests[irequest]->full_cluster = 0; - neighbor->requests[irequest]->ghost = 1; + + if (!use_pair_list) { + int irequest = neighbor->nrequest - 1; + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same<DeviceType,LMPHostType>::value && + !Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->fix = 1; + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full_cluster = 0; + } else { //if (neighflag == HALF || neighflag == HALFTHREAD) + neighbor->requests[irequest]->fix = 1; + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + neighbor->requests[irequest]->full_cluster = 0; + neighbor->requests[irequest]->ghost = 1; + } } int ntypes = atom->ntypes; @@ -213,6 +243,8 @@ void FixQEqReaxKokkos<DeviceType>::pre_force(int vflag) k_shield.template sync<DeviceType>(); k_tap.template sync<DeviceType>(); + if (use_pair_list) + list = reaxc->list; NeighListKokkos<DeviceType>* k_list = static_cast<NeighListKokkos<DeviceType>*>(list); d_numneigh = k_list->d_numneigh; d_neighbors = k_list->d_neighbors; diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.h b/src/KOKKOS/fix_qeq_reax_kokkos.h index eca0d761b7..fcfc28fa74 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.h +++ b/src/KOKKOS/fix_qeq_reax_kokkos.h @@ -146,7 +146,7 @@ class FixQEqReaxKokkos : public FixQEqReax { double memory_usage(); protected: - int inum; + int inum,use_pair_list; int allocated_flag; typedef Kokkos::DualView<int***,DeviceType> tdual_int_1d; diff --git a/src/KOKKOS/fix_reaxc_species_kokkos.cpp b/src/KOKKOS/fix_reaxc_species_kokkos.cpp index d3de0c998c..17b42174c6 100644 --- a/src/KOKKOS/fix_reaxc_species_kokkos.cpp +++ b/src/KOKKOS/fix_reaxc_species_kokkos.cpp @@ -71,12 +71,6 @@ void FixReaxCSpeciesKokkos::init() "pair_style reax/c/kk"); FixReaxCSpecies::init(); - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->pair = 0; - neighbor->requests[irequest]->fix = 1; - neighbor->requests[irequest]->newton = 2; - neighbor->requests[irequest]->ghost = 1; } /* ---------------------------------------------------------------------- */ @@ -86,12 +80,20 @@ void FixReaxCSpeciesKokkos::FindMolecule() int i,j,ii,jj,inum,itype,jtype,loop,looptot; int change,done,anychange; int *mask = atom->mask; - int *ilist; double bo_tmp,bo_cut; double **spec_atom = f_SPECBOND->array_atom; - inum = list->inum; - ilist = list->ilist; + inum = reaxc->list->inum; + typename ArrayTypes<LMPHostType>::t_int_1d ilist; + if (reaxc->execution_space == Host) { + NeighListKokkos<LMPHostType>* k_list = static_cast<NeighListKokkos<LMPHostType>*>(reaxc->list); + k_list->k_ilist.sync<LMPHostType>(); + ilist = k_list->k_ilist.h_view; + } else { + NeighListKokkos<LMPDeviceType>* k_list = static_cast<NeighListKokkos<LMPDeviceType>*>(reaxc->list); + k_list->k_ilist.sync<LMPHostType>(); + ilist = k_list->k_ilist.h_view; + } for (ii = 0; ii < inum; ii++) { i = ilist[ii]; diff --git a/src/KOKKOS/fix_wall_reflect_kokkos.h b/src/KOKKOS/fix_wall_reflect_kokkos.h index f5e28796fd..d59088b592 100644 --- a/src/KOKKOS/fix_wall_reflect_kokkos.h +++ b/src/KOKKOS/fix_wall_reflect_kokkos.h @@ -41,8 +41,6 @@ class FixWallReflectKokkos : public FixWallReflect { void operator()(TagFixWallReflectPostIntegrate, const int&) const; protected: - class AtomKokkos *atomKK; - typename AT::t_x_array x; typename AT::t_v_array v; typename AT::t_int_1d_randomread mask; diff --git a/src/KOKKOS/neigh_full_kokkos.h b/src/KOKKOS/neigh_full_kokkos.h index 883b6dc115..9125b5fbe2 100644 --- a/src/KOKKOS/neigh_full_kokkos.h +++ b/src/KOKKOS/neigh_full_kokkos.h @@ -164,6 +164,7 @@ if (GHOST) { list->gnum = 0; } + list->k_ilist.template modify<DeviceType>(); } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/neigh_list_kokkos.cpp b/src/KOKKOS/neigh_list_kokkos.cpp index 5fe796f84d..cbba2120bd 100644 --- a/src/KOKKOS/neigh_list_kokkos.cpp +++ b/src/KOKKOS/neigh_list_kokkos.cpp @@ -49,8 +49,9 @@ void NeighListKokkos<Device>::grow(int nmax) if (nmax <= maxatoms) return; maxatoms = nmax; - d_ilist = - typename ArrayTypes<Device>::t_int_1d("neighlist:ilist",maxatoms); + k_ilist = + DAT::tdual_int_1d("neighlist:ilist",maxatoms); + d_ilist = k_ilist.view<Device>(); d_numneigh = typename ArrayTypes<Device>::t_int_1d("neighlist:numneigh",maxatoms); d_neighbors = diff --git a/src/KOKKOS/neigh_list_kokkos.h b/src/KOKKOS/neigh_list_kokkos.h index 5200b24595..85f0f38d2c 100644 --- a/src/KOKKOS/neigh_list_kokkos.h +++ b/src/KOKKOS/neigh_list_kokkos.h @@ -71,7 +71,8 @@ public: void clean_copy(); void grow(int nmax); typename ArrayTypes<Device>::t_neighbors_2d d_neighbors; - typename ArrayTypes<Device>::t_int_1d d_ilist; // local indices of I atoms + typename DAT::tdual_int_1d k_ilist; // local indices of I atoms + typename ArrayTypes<Device>::t_int_1d d_ilist; typename ArrayTypes<Device>::t_int_1d d_numneigh; // # of J neighs for each I typename ArrayTypes<Device>::t_int_1d d_stencil; // # of J neighs for each I typename ArrayTypes<LMPHostType>::t_int_1d h_stencil; // # of J neighs per I diff --git a/src/KOKKOS/pair_reax_c_kokkos.h b/src/KOKKOS/pair_reax_c_kokkos.h index 204ad7732f..2d746dee0d 100644 --- a/src/KOKKOS/pair_reax_c_kokkos.h +++ b/src/KOKKOS/pair_reax_c_kokkos.h @@ -426,8 +426,6 @@ class PairReaxCKokkos : public PairReaxC { typename AT::t_ffloat_2d_dl d_sum_ovun; typename AT::t_ffloat_2d_dl d_dBOpx, d_dBOpy, d_dBOpz; - class AtomKokkos *atomKK; - int neighflag,newton_pair, maxnumneigh, maxhb, maxbo; int nlocal,nall,eflag,vflag; F_FLOAT cut_nbsq, cut_hbsq, cut_bosq, bo_cut, thb_cut, thb_cutsq; diff --git a/src/KOKKOS/pair_sw_kokkos.cpp b/src/KOKKOS/pair_sw_kokkos.cpp index bb81a29c0a..d2cda316be 100644 --- a/src/KOKKOS/pair_sw_kokkos.cpp +++ b/src/KOKKOS/pair_sw_kokkos.cpp @@ -121,6 +121,18 @@ void PairSWKokkos<DeviceType>::compute(int eflag_in, int vflag_in) EV_FLOAT ev; EV_FLOAT ev_all; + // build short neighbor list + + int max_neighs = d_neighbors.dimension_1(); + + if ((d_neighbors_short.dimension_1() != max_neighs) || + (d_neighbors_short.dimension_0() != ignum)) { + d_neighbors_short = Kokkos::View<int**,DeviceType>("SW::neighbors_short",ignum,max_neighs); + } + if (d_numneigh_short.dimension_0()!=ignum) + d_numneigh_short = Kokkos::View<int*,DeviceType>("SW::numneighs_short",ignum); + Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType,TagPairSWComputeShortNeigh>(0,neighflag==FULL?ignum:inum), *this); + // loop over neighbor list of my atoms if (neighflag == HALF) { @@ -174,6 +186,38 @@ void PairSWKokkos<DeviceType>::compute(int eflag_in, int vflag_in) copymode = 0; } + +/* ---------------------------------------------------------------------- */ + +template<class DeviceType> +KOKKOS_INLINE_FUNCTION +void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeShortNeigh, const int& ii) const { + const int i = d_ilist[ii]; + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + + const int jnum = d_numneigh[i]; + int inside = 0; + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors(i,jj); + j &= NEIGHMASK; + + const X_FLOAT delx = xtmp - x(j,0); + const X_FLOAT dely = ytmp - x(j,1); + const X_FLOAT delz = ztmp - x(j,2); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cutmax*cutmax) { + d_neighbors_short(i,inside) = j; + inside++; + } + } + d_numneigh_short(i) = inside; +} + +/* ---------------------------------------------------------------------- */ + template<class DeviceType> template<int NEIGHFLAG, int EVFLAG> KOKKOS_INLINE_FUNCTION @@ -196,14 +240,14 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeHalf<NEIGHFLAG,EVFLAG> // two-body interactions, skip half of them - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; F_FLOAT fxtmpi = 0.0; F_FLOAT fytmpi = 0.0; F_FLOAT fztmpi = 0.0; for (int jj = 0; jj < jnum; jj++) { - int j = d_neighbors(i,jj); + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; const tagint jtag = tag[j]; @@ -245,7 +289,7 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeHalf<NEIGHFLAG,EVFLAG> const int jnumm1 = jnum - 1; for (int jj = 0; jj < jnumm1; jj++) { - int j = d_neighbors(i,jj); + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; const int jtype = d_map[type[j]]; const int ijparam = d_elem2param(itype,jtype,jtype); @@ -260,7 +304,7 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeHalf<NEIGHFLAG,EVFLAG> F_FLOAT fztmpj = 0.0; for (int kk = jj+1; kk < jnum; kk++) { - int k = d_neighbors(i,kk); + int k = d_neighbors_short(i,kk); k &= NEIGHMASK; const int ktype = d_map[type[k]]; const int ikparam = d_elem2param(itype,ktype,ktype); @@ -331,14 +375,14 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeFullA<NEIGHFLAG,EVFLAG // two-body interactions - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; F_FLOAT fxtmpi = 0.0; F_FLOAT fytmpi = 0.0; F_FLOAT fztmpi = 0.0; for (int jj = 0; jj < jnum; jj++) { - int j = d_neighbors(i,jj); + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; const tagint jtag = tag[j]; @@ -368,7 +412,7 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeFullA<NEIGHFLAG,EVFLAG const int jnumm1 = jnum - 1; for (int jj = 0; jj < jnumm1; jj++) { - int j = d_neighbors(i,jj); + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; const int jtype = d_map[type[j]]; const int ijparam = d_elem2param(itype,jtype,jtype); @@ -380,7 +424,7 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeFullA<NEIGHFLAG,EVFLAG if (rsq1 >= d_params[ijparam].cutsq) continue; for (int kk = jj+1; kk < jnum; kk++) { - int k = d_neighbors(i,kk); + int k = d_neighbors_short(i,kk); k &= NEIGHMASK; const int ktype = d_map[type[k]]; const int ikparam = d_elem2param(itype,ktype,ktype); @@ -438,14 +482,14 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeFullB<NEIGHFLAG,EVFLAG const X_FLOAT ytmpi = x(i,1); const X_FLOAT ztmpi = x(i,2); - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; F_FLOAT fxtmpi = 0.0; F_FLOAT fytmpi = 0.0; F_FLOAT fztmpi = 0.0; for (int jj = 0; jj < jnum; jj++) { - int j = d_neighbors(i,jj); + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; if (j >= nlocal) continue; const int jtype = d_map[type[j]]; @@ -461,10 +505,10 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeFullB<NEIGHFLAG,EVFLAG if (rsq1 >= d_params[jiparam].cutsq) continue; - const int j_jnum = d_numneigh[j]; + const int j_jnum = d_numneigh_short[j]; for (int kk = 0; kk < j_jnum; kk++) { - int k = d_neighbors(j,kk); + int k = d_neighbors_short(j,kk); k &= NEIGHMASK; if (k == i) continue; const int ktype = d_map[type[k]]; diff --git a/src/KOKKOS/pair_sw_kokkos.h b/src/KOKKOS/pair_sw_kokkos.h index cec240e064..c722d9d52c 100644 --- a/src/KOKKOS/pair_sw_kokkos.h +++ b/src/KOKKOS/pair_sw_kokkos.h @@ -34,6 +34,8 @@ struct TagPairSWComputeFullA{}; template<int NEIGHFLAG, int EVFLAG> struct TagPairSWComputeFullB{}; +struct TagPairSWComputeShortNeigh{}; + namespace LAMMPS_NS { template<class DeviceType> @@ -75,6 +77,9 @@ class PairSWKokkos : public PairSW { KOKKOS_INLINE_FUNCTION void operator()(TagPairSWComputeFullB<NEIGHFLAG,EVFLAG>, const int&) const; + KOKKOS_INLINE_FUNCTION + void operator()(TagPairSWComputeShortNeigh, const int&) const; + template<int NEIGHFLAG> KOKKOS_INLINE_FUNCTION void ev_tally(EV_FLOAT &ev, const int &i, const int &j, @@ -136,6 +141,9 @@ class PairSWKokkos : public PairSW { int nlocal,nall,eflag,vflag; int inum; + Kokkos::View<int**,DeviceType> d_neighbors_short; + Kokkos::View<int*,DeviceType> d_numneigh_short; + friend void pair_virial_fdotr_compute<PairSWKokkos>(PairSWKokkos*); }; diff --git a/src/KOKKOS/pair_tersoff_kokkos.cpp b/src/KOKKOS/pair_tersoff_kokkos.cpp index cf9b510ed6..162661430b 100644 --- a/src/KOKKOS/pair_tersoff_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_kokkos.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Ray Shan (SNL) + Contributing author: Ray Shan (SNL) and Christian Trott (SNL) ------------------------------------------------------------------------- */ #include <math.h> @@ -191,7 +191,7 @@ void PairTersoffKokkos<DeviceType>::compute(int eflag_in, int vflag_in) nall = atom->nlocal + atom->nghost; newton_pair = force->newton_pair; - const int inum = list->inum; + inum = list->inum; const int ignum = inum + list->gnum; NeighListKokkos<DeviceType>* k_list = static_cast<NeighListKokkos<DeviceType>*>(list); d_numneigh = k_list->d_numneigh; @@ -204,6 +204,18 @@ void PairTersoffKokkos<DeviceType>::compute(int eflag_in, int vflag_in) EV_FLOAT ev; EV_FLOAT ev_all; + // build short neighbor list + + int max_neighs = d_neighbors.dimension_1(); + + if ((d_neighbors_short.dimension_1() != max_neighs) || + (d_neighbors_short.dimension_0() != ignum)) { + d_neighbors_short = Kokkos::View<int**,DeviceType>("Tersoff::neighbors_short",ignum,max_neighs); + } + if (d_numneigh_short.dimension_0()!=ignum) + d_numneigh_short = Kokkos::View<int*,DeviceType>("Tersoff::numneighs_short",ignum); + Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType,TagPairTersoffComputeShortNeigh>(0,neighflag==FULL?ignum:inum), *this); + if (neighflag == HALF) { if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy<DeviceType, TagPairTersoffComputeHalf<HALF,1> >(0,inum),*this,ev); @@ -257,6 +269,35 @@ void PairTersoffKokkos<DeviceType>::compute(int eflag_in, int vflag_in) /* ---------------------------------------------------------------------- */ +template<class DeviceType> +KOKKOS_INLINE_FUNCTION +void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeShortNeigh, const int& ii) const { + const int i = d_ilist[ii]; + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + + const int jnum = d_numneigh[i]; + int inside = 0; + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors(i,jj); + j &= NEIGHMASK; + + const X_FLOAT delx = xtmp - x(j,0); + const X_FLOAT dely = ytmp - x(j,1); + const X_FLOAT delz = ztmp - x(j,2); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cutmax*cutmax) { + d_neighbors_short(i,inside) = j; + inside++; + } + } + d_numneigh_short(i) = inside; +} + +/* ---------------------------------------------------------------------- */ + template<class DeviceType> template<int NEIGHFLAG, int EVFLAG> KOKKOS_INLINE_FUNCTION @@ -273,21 +314,22 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeHalf<NEIGHFL const int itype = type(i); const int itag = tag(i); - int j,k,jj,kk,jtag,jtype,ktype; - F_FLOAT rsq1, cutsq1, rsq2, cutsq2, rij, rik, bo_ij; F_FLOAT fi[3], fj[3], fk[3]; - X_FLOAT delx1, dely1, delz1, delx2, dely2, delz2; //const AtomNeighborsConst d_neighbors_i = k_list.get_neighbors_const(i); - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; // repulsive - for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + F_FLOAT f_x = 0.0; + F_FLOAT f_y = 0.0; + F_FLOAT f_z = 0.0; + + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; - jtype = type(j); - jtag = tag(j); + const int jtype = type(j); + const int jtag = tag(j); if (itag > jtag) { if ((itag+jtag) % 2 == 0) continue; @@ -315,9 +357,9 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeHalf<NEIGHFL (tmp_fcd - tmp_fce*paramskk(itype,jtype,jtype).lam1) / r; const F_FLOAT eng = tmp_fce * paramskk(itype,jtype,jtype).biga * tmp_exp; - a_f(i,0) += delx*frep; - a_f(i,1) += dely*frep; - a_f(i,2) += delz*frep; + f_x += delx*frep; + f_y += dely*frep; + f_z += delz*frep; a_f(j,0) -= delx*frep; a_f(j,1) -= dely*frep; a_f(j,2) -= delz*frep; @@ -330,35 +372,35 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeHalf<NEIGHFL // attractive: bond order - for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; - jtype = type(j); + const int jtype = type(j); - delx1 = xtmp - x(j,0); - dely1 = ytmp - x(j,1); - delz1 = ztmp - x(j,2); - rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; - cutsq1 = paramskk(itype,jtype,jtype).cutsq; + const F_FLOAT delx1 = xtmp - x(j,0); + const F_FLOAT dely1 = ytmp - x(j,1); + const F_FLOAT delz1 = ztmp - x(j,2); + const F_FLOAT rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; + const F_FLOAT cutsq1 = paramskk(itype,jtype,jtype).cutsq; - bo_ij = 0.0; + F_FLOAT bo_ij = 0.0; if (rsq1 > cutsq1) continue; - rij = sqrt(rsq1); + const F_FLOAT rij = sqrt(rsq1); - for (kk = 0; kk < jnum; kk++) { + for (int kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + int k = d_neighbors_short(i,kk); k &= NEIGHMASK; - ktype = type(k); + const int ktype = type(k); - delx2 = xtmp - x(k,0); - dely2 = ytmp - x(k,1); - delz2 = ztmp - x(k,2); - rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; - cutsq2 = paramskk(itype,jtype,ktype).cutsq; + const F_FLOAT delx2 = xtmp - x(k,0); + const F_FLOAT dely2 = ytmp - x(k,1); + const F_FLOAT delz2 = ztmp - x(k,2); + const F_FLOAT rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + const F_FLOAT cutsq2 = paramskk(itype,jtype,ktype).cutsq; if (rsq2 > cutsq2) continue; - rik = sqrt(rsq2); + const F_FLOAT rik = sqrt(rsq2); bo_ij += bondorder(itype,jtype,ktype,rij,delx1,dely1,delz1,rik,delx2,dely2,delz2); } @@ -369,58 +411,64 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeHalf<NEIGHFL const F_FLOAT bij = ters_bij_k(itype,jtype,jtype,bo_ij); const F_FLOAT fatt = -0.5*bij * dfa / rij; const F_FLOAT prefactor = 0.5*fa * ters_dbij(itype,jtype,jtype,bo_ij); - const F_FLOAT eng = 0.5*bij * fa; - a_f(i,0) += delx1*fatt; - a_f(i,1) += dely1*fatt; - a_f(i,2) += delz1*fatt; - a_f(j,0) -= delx1*fatt; - a_f(j,1) -= dely1*fatt; - a_f(j,2) -= delz1*fatt; + f_x += delx1*fatt; + f_y += dely1*fatt; + f_z += delz1*fatt; + F_FLOAT fj_x = -delx1*fatt; + F_FLOAT fj_y = -dely1*fatt; + F_FLOAT fj_z = -delz1*fatt; if (EVFLAG) { + const F_FLOAT eng = 0.5*bij * fa; if (eflag) ev.evdwl += eng; if (vflag_either || eflag_atom) - this->template ev_tally<NEIGHFLAG>(ev,i,j,eng,fatt,delx1,dely1,delz1); + this->template ev_tally<NEIGHFLAG>(ev,i,j,eng,fatt,delx1,dely1,delz1); } // attractive: three-body force - for (kk = 0; kk < jnum; kk++) { + for (int kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + int k = d_neighbors_short(i,kk); k &= NEIGHMASK; - ktype = type(k); + const int ktype = type(k); - delx2 = xtmp - x(k,0); - dely2 = ytmp - x(k,1); - delz2 = ztmp - x(k,2); - rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; - cutsq2 = paramskk(itype,jtype,ktype).cutsq; + const F_FLOAT delx2 = xtmp - x(k,0); + const F_FLOAT dely2 = ytmp - x(k,1); + const F_FLOAT delz2 = ztmp - x(k,2); + const F_FLOAT rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + const F_FLOAT cutsq2 = paramskk(itype,jtype,ktype).cutsq; if (rsq2 > cutsq2) continue; - rik = sqrt(rsq2); + const F_FLOAT rik = sqrt(rsq2); ters_dthb(itype,jtype,ktype,prefactor,rij,delx1,dely1,delz1, - rik,delx2,dely2,delz2,fi,fj,fk); - - a_f(i,0) += fi[0]; - a_f(i,1) += fi[1]; - a_f(i,2) += fi[2]; - a_f(j,0) += fj[0]; - a_f(j,1) += fj[1]; - a_f(j,2) += fj[2]; + rik,delx2,dely2,delz2,fi,fj,fk); + + f_x += fi[0]; + f_y += fi[1]; + f_z += fi[2]; + fj_x += fj[0]; + fj_y += fj[1]; + fj_z += fj[2]; a_f(k,0) += fk[0]; a_f(k,1) += fk[1]; a_f(k,2) += fk[2]; if (vflag_atom) { - F_FLOAT delrij[3], delrik[3]; - delrij[0] = -delx1; delrij[1] = -dely1; delrij[2] = -delz1; - delrik[0] = -delx2; delrik[1] = -dely2; delrik[2] = -delz2; - if (vflag_either) this->template v_tally3<NEIGHFLAG>(ev,i,j,k,fj,fk,delrij,delrik); + F_FLOAT delrij[3], delrik[3]; + delrij[0] = -delx1; delrij[1] = -dely1; delrij[2] = -delz1; + delrik[0] = -delx2; delrik[1] = -dely2; delrik[2] = -delz2; + if (vflag_either) this->template v_tally3<NEIGHFLAG>(ev,i,j,k,fj,fk,delrij,delrik); } } + a_f(j,0) += fj_x; + a_f(j,1) += fj_y; + a_f(j,2) += fj_z; } + a_f(i,0) += f_x; + a_f(i,1) += f_y; + a_f(i,2) += f_z; } template<class DeviceType> @@ -450,12 +498,15 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullA<NEIGHF X_FLOAT delx1, dely1, delz1, delx2, dely2, delz2; //const AtomNeighborsConst d_neighbors_i = k_list.get_neighbors_const(i); - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; // repulsive + F_FLOAT f_x = 0.0; + F_FLOAT f_y = 0.0; + F_FLOAT f_z = 0.0; for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + j = d_neighbors_short(i,jj); j &= NEIGHMASK; const int jtype = type(j); @@ -475,9 +526,9 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullA<NEIGHF (tmp_fcd - tmp_fce*paramskk(itype,jtype,jtype).lam1) / r; const F_FLOAT eng = tmp_fce * paramskk(itype,jtype,jtype).biga * tmp_exp; - f(i,0) += delx*frep; - f(i,1) += dely*frep; - f(i,2) += delz*frep; + f_x += delx*frep; + f_y += dely*frep; + f_z += delz*frep; if (EVFLAG) { if (eflag) @@ -490,7 +541,7 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullA<NEIGHF // attractive: bond order for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + j = d_neighbors_short(i,jj); j &= NEIGHMASK; jtype = type(j); @@ -506,7 +557,7 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullA<NEIGHF for (kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + k = d_neighbors_short(i,kk); k &= NEIGHMASK; ktype = type(k); @@ -530,9 +581,9 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullA<NEIGHF const F_FLOAT prefactor = 0.5*fa * ters_dbij(itype,jtype,jtype,bo_ij); const F_FLOAT eng = 0.5*bij * fa; - f(i,0) += delx1*fatt; - f(i,1) += dely1*fatt; - f(i,2) += delz1*fatt; + f_x += delx1*fatt; + f_y += dely1*fatt; + f_z += delz1*fatt; if (EVFLAG) { if (eflag) ev.evdwl += 0.5*eng; @@ -544,7 +595,7 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullA<NEIGHF for (kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + k = d_neighbors_short(i,kk); k &= NEIGHMASK; ktype = type(k); @@ -559,9 +610,9 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullA<NEIGHF ters_dthb(itype,jtype,ktype,prefactor,rij,delx1,dely1,delz1, rik,delx2,dely2,delz2,fi,fj,fk); - f(i,0) += fi[0]; - f(i,1) += fi[1]; - f(i,2) += fi[2]; + f_x += fi[0]; + f_y += fi[1]; + f_z += fi[2]; if (vflag_atom) { F_FLOAT delrij[3], delrik[3]; @@ -571,6 +622,9 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullA<NEIGHF } } } + f(i,0) += f_x; + f(i,1) += f_y; + f(i,2) += f_z; } template<class DeviceType> @@ -599,12 +653,16 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullB<NEIGHF F_FLOAT fj[3], fk[3]; X_FLOAT delx1, dely1, delz1, delx2, dely2, delz2; - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; + + F_FLOAT f_x = 0.0; + F_FLOAT f_y = 0.0; + F_FLOAT f_z = 0.0; // attractive: bond order for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + j = d_neighbors_short(i,jj); j &= NEIGHMASK; if (j >= nlocal) continue; jtype = type(j); @@ -619,10 +677,10 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullB<NEIGHF if (rsq1 > cutsq1) continue; rij = sqrt(rsq1); - j_jnum = d_numneigh[j]; + j_jnum = d_numneigh_short[j]; for (kk = 0; kk < j_jnum; kk++) { - k = d_neighbors(j,kk); + k = d_neighbors_short(j,kk); if (k == i) continue; k &= NEIGHMASK; ktype = type(k); @@ -648,9 +706,9 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullB<NEIGHF const F_FLOAT prefactor = 0.5*fa * ters_dbij(jtype,itype,itype,bo_ij); const F_FLOAT eng = 0.5*bij * fa; - f(i,0) -= delx1*fatt; - f(i,1) -= dely1*fatt; - f(i,2) -= delz1*fatt; + f_x -= delx1*fatt; + f_y -= dely1*fatt; + f_z -= delz1*fatt; if (EVFLAG) { if (eflag) @@ -662,7 +720,7 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullB<NEIGHF // attractive: three-body force for (kk = 0; kk < j_jnum; kk++) { - k = d_neighbors(j,kk); + k = d_neighbors_short(j,kk); if (k == i) continue; k &= NEIGHMASK; ktype = type(k); @@ -677,9 +735,9 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullB<NEIGHF rik = sqrt(rsq2); ters_dthbj(jtype,itype,ktype,prefactor,rij,delx1,dely1,delz1, rik,delx2,dely2,delz2,fj,fk); - f(i,0) += fj[0]; - f(i,1) += fj[1]; - f(i,2) += fj[2]; + f_x += fj[0]; + f_y += fj[1]; + f_z += fj[2]; if (vflag_atom) { F_FLOAT delrji[3], delrjk[3]; @@ -692,11 +750,14 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeFullB<NEIGHF const F_FLOAT prefactor_jk = 0.5*fa_jk * ters_dbij(jtype,ktype,itype,bo_ij); ters_dthbk(jtype,ktype,itype,prefactor_jk,rik,delx2,dely2,delz2, rij,delx1,dely1,delz1,fk); - f(i,0) += fk[0]; - f(i,1) += fk[1]; - f(i,2) += fk[2]; + f_x += fk[0]; + f_y += fk[1]; + f_z += fk[2]; } } + f(i,0) += f_x; + f(i,1) += f_y; + f(i,2) += f_z; } template<class DeviceType> @@ -749,8 +810,9 @@ double PairTersoffKokkos<DeviceType>::bondorder(const int &i, const int &j, cons const F_FLOAT costheta = (dx1*dx2 + dy1*dy2 + dz1*dz2)/(rij*rik); - if (int(paramskk(i,j,k).powerm) == 3) arg = pow(paramskk(i,j,k).lam3 * (rij-rik),3.0); - else arg = paramskk(i,j,k).lam3 * (rij-rik); + const F_FLOAT param = paramskk(i,j,k).lam3 * (rij-rik); + if (int(paramskk(i,j,k).powerm) == 3) arg = param*param*param;//pow(paramskk(i,j,k).lam3 * (rij-rik),3.0); + else arg = param; if (arg > 69.0776) ex_delr = 1.e30; else if (arg < -69.0776) ex_delr = 0.0; @@ -780,7 +842,6 @@ KOKKOS_INLINE_FUNCTION double PairTersoffKokkos<DeviceType>:: ters_dgijk(const int &i, const int &j, const int &k, const F_FLOAT &cos) const { - const F_FLOAT ters_c = paramskk(i,j,k).c * paramskk(i,j,k).c; const F_FLOAT ters_d = paramskk(i,j,k).d * paramskk(i,j,k).d; const F_FLOAT hcth = paramskk(i,j,k).h - cos; @@ -838,9 +899,9 @@ double PairTersoffKokkos<DeviceType>::ters_dbij(const int &i, const int &j, const int &k, const F_FLOAT &bo) const { const F_FLOAT tmp = paramskk(i,j,k).beta * bo; - if (tmp > paramskk(i,j,k).c1) return paramskk(i,j,k).beta * -0.5*pow(tmp,-1.5); + if (tmp > paramskk(i,j,k).c1) return paramskk(i,j,k).beta * -0.5/sqrt(tmp*tmp);//*pow(tmp,-1.5); if (tmp > paramskk(i,j,k).c2) - return paramskk(i,j,k).beta * (-0.5*pow(tmp,-1.5) * + return paramskk(i,j,k).beta * (-0.5/sqrt(tmp*tmp) * //*pow(tmp,-1.5) * (1.0 - 0.5*(1.0 + 1.0/(2.0*paramskk(i,j,k).powern)) * pow(tmp,-paramskk(i,j,k).powern))); if (tmp < paramskk(i,j,k).c4) return 0.0; @@ -883,15 +944,16 @@ void PairTersoffKokkos<DeviceType>::ters_dthb( fc = ters_fc_k(i,j,k,rik); dfc = ters_dfc(i,j,k,rik); - if (int(paramskk(i,j,k).powerm) == 3) tmp = pow(paramskk(i,j,k).lam3 * (rij-rik),3.0); - else tmp = paramskk(i,j,k).lam3 * (rij-rik); + const F_FLOAT param = paramskk(i,j,k).lam3 * (rij-rik); + if (int(paramskk(i,j,k).powerm) == 3) tmp = param*param*param;//pow(paramskk(i,j,k).lam3 * (rij-rik),3.0); + else tmp = param; if (tmp > 69.0776) ex_delr = 1.e30; else if (tmp < -69.0776) ex_delr = 0.0; else ex_delr = exp(tmp); if (int(paramskk(i,j,k).powerm) == 3) - dex_delr = 3.0*pow(paramskk(i,j,k).lam3,3.0) * pow(rij-rik,2.0)*ex_delr; + dex_delr = 3.0*param*param*paramskk(i,j,k).lam3*ex_delr;//pow(rij-rik,2.0)*ex_delr; else dex_delr = paramskk(i,j,k).lam3 * ex_delr; cos = vec3_dot(rij_hat,rik_hat); @@ -951,15 +1013,16 @@ void PairTersoffKokkos<DeviceType>::ters_dthbj( fc = ters_fc_k(i,j,k,rik); dfc = ters_dfc(i,j,k,rik); - if (int(paramskk(i,j,k).powerm) == 3) tmp = pow(paramskk(i,j,k).lam3 * (rij-rik),3.0); - else tmp = paramskk(i,j,k).lam3 * (rij-rik); + const F_FLOAT param = paramskk(i,j,k).lam3 * (rij-rik); + if (int(paramskk(i,j,k).powerm) == 3) tmp = param*param*param;//pow(paramskk(i,j,k).lam3 * (rij-rik),3.0); + else tmp = param;//paramskk(i,j,k).lam3 * (rij-rik); if (tmp > 69.0776) ex_delr = 1.e30; else if (tmp < -69.0776) ex_delr = 0.0; else ex_delr = exp(tmp); if (int(paramskk(i,j,k).powerm) == 3) - dex_delr = 3.0*pow(paramskk(i,j,k).lam3,3.0) * pow(rij-rik,2.0)*ex_delr; + dex_delr = 3.0*param*param*paramskk(i,j,k).lam3*ex_delr;//pow(paramskk(i,j,k).lam3,3.0) * pow(rij-rik,2.0)*ex_delr; else dex_delr = paramskk(i,j,k).lam3 * ex_delr; cos = vec3_dot(rij_hat,rik_hat); @@ -1012,15 +1075,16 @@ void PairTersoffKokkos<DeviceType>::ters_dthbk( fc = ters_fc_k(i,j,k,rik); dfc = ters_dfc(i,j,k,rik); - if (int(paramskk(i,j,k).powerm) == 3) tmp = pow(paramskk(i,j,k).lam3 * (rij-rik),3.0); - else tmp = paramskk(i,j,k).lam3 * (rij-rik); + const F_FLOAT param = paramskk(i,j,k).lam3 * (rij-rik); + if (int(paramskk(i,j,k).powerm) == 3) tmp = param*param*param;//pow(paramskk(i,j,k).lam3 * (rij-rik),3.0); + else tmp = param;//paramskk(i,j,k).lam3 * (rij-rik); if (tmp > 69.0776) ex_delr = 1.e30; else if (tmp < -69.0776) ex_delr = 0.0; else ex_delr = exp(tmp); if (int(paramskk(i,j,k).powerm) == 3) - dex_delr = 3.0*pow(paramskk(i,j,k).lam3,3.0) * pow(rij-rik,2.0)*ex_delr; + dex_delr = 3.0*param*param*paramskk(i,j,k).lam3*ex_delr;//pow(paramskk(i,j,k).lam3,3.0) * pow(rij-rik,2.0)*ex_delr; else dex_delr = paramskk(i,j,k).lam3 * ex_delr; cos = vec3_dot(rij_hat,rik_hat); diff --git a/src/KOKKOS/pair_tersoff_kokkos.h b/src/KOKKOS/pair_tersoff_kokkos.h index c810a052dc..7490d3f45a 100644 --- a/src/KOKKOS/pair_tersoff_kokkos.h +++ b/src/KOKKOS/pair_tersoff_kokkos.h @@ -39,6 +39,8 @@ struct TagPairTersoffComputeFullA{}; template<int NEIGHFLAG, int EVFLAG> struct TagPairTersoffComputeFullB{}; +struct TagPairTersoffComputeShortNeigh{}; + template<class DeviceType> class PairTersoffKokkos : public PairTersoff { public: @@ -77,6 +79,9 @@ class PairTersoffKokkos : public PairTersoff { KOKKOS_INLINE_FUNCTION void operator()(TagPairTersoffComputeFullB<NEIGHFLAG,EVFLAG>, const int&) const; + KOKKOS_INLINE_FUNCTION + void operator()(TagPairTersoffComputeShortNeigh, const int&) const; + KOKKOS_INLINE_FUNCTION double ters_fc_k(const int &i, const int &j, const int &k, const F_FLOAT &r) const; @@ -184,6 +189,7 @@ class PairTersoffKokkos : public PairTersoff { // hardwired to space for 15 atom types //params_ters m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + int inum; typename AT::t_x_array_randomread x; typename AT::t_f_array f; typename AT::t_int_1d_randomread type; @@ -203,10 +209,12 @@ class PairTersoffKokkos : public PairTersoff { typename ArrayTypes<DeviceType>::t_int_1d_randomread d_numneigh; //NeighListKokkos<DeviceType> k_list; - class AtomKokkos *atomKK; int neighflag,newton_pair; int nlocal,nall,eflag,vflag; + Kokkos::View<int**,DeviceType> d_neighbors_short; + Kokkos::View<int*,DeviceType> d_numneigh_short; + friend void pair_virial_fdotr_compute<PairTersoffKokkos>(PairTersoffKokkos*); }; diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp index 8cfaa63e7a..0c8f46a30d 100644 --- a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp @@ -191,7 +191,7 @@ void PairTersoffMODKokkos<DeviceType>::compute(int eflag_in, int vflag_in) nall = atom->nlocal + atom->nghost; newton_pair = force->newton_pair; - const int inum = list->inum; + inum = list->inum; const int ignum = inum + list->gnum; NeighListKokkos<DeviceType>* k_list = static_cast<NeighListKokkos<DeviceType>*>(list); d_numneigh = k_list->d_numneigh; @@ -204,6 +204,18 @@ void PairTersoffMODKokkos<DeviceType>::compute(int eflag_in, int vflag_in) EV_FLOAT ev; EV_FLOAT ev_all; + // build short neighbor list + + int max_neighs = d_neighbors.dimension_1(); + + if ((d_neighbors_short.dimension_1() != max_neighs) || + (d_neighbors_short.dimension_0() != ignum)) { + d_neighbors_short = Kokkos::View<int**,DeviceType>("Tersoff::neighbors_short",ignum,max_neighs); + } + if (d_numneigh_short.dimension_0()!=ignum) + d_numneigh_short = Kokkos::View<int*,DeviceType>("Tersoff::numneighs_short",ignum); + Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType,TagPairTersoffMODComputeShortNeigh>(0,neighflag==FULL?ignum:inum), *this); + if (neighflag == HALF) { if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy<DeviceType, TagPairTersoffMODComputeHalf<HALF,1> >(0,inum),*this,ev); @@ -257,6 +269,35 @@ void PairTersoffMODKokkos<DeviceType>::compute(int eflag_in, int vflag_in) /* ---------------------------------------------------------------------- */ +template<class DeviceType> +KOKKOS_INLINE_FUNCTION +void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeShortNeigh, const int& ii) const { + const int i = d_ilist[ii]; + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + + const int jnum = d_numneigh[i]; + int inside = 0; + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors(i,jj); + j &= NEIGHMASK; + + const X_FLOAT delx = xtmp - x(j,0); + const X_FLOAT dely = ytmp - x(j,1); + const X_FLOAT delz = ztmp - x(j,2); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cutmax*cutmax) { + d_neighbors_short(i,inside) = j; + inside++; + } + } + d_numneigh_short(i) = inside; +} + +/* ---------------------------------------------------------------------- */ + template<class DeviceType> template<int NEIGHFLAG, int EVFLAG> KOKKOS_INLINE_FUNCTION @@ -273,21 +314,22 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeHalf<N const int itype = type(i); const int itag = tag(i); - int j,k,jj,kk,jtag,jtype,ktype; - F_FLOAT rsq1, cutsq1, rsq2, cutsq2, rij, rik, bo_ij; F_FLOAT fi[3], fj[3], fk[3]; - X_FLOAT delx1, dely1, delz1, delx2, dely2, delz2; //const AtomNeighborsConst d_neighbors_i = k_list.get_neighbors_const(i); - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; // repulsive - for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + F_FLOAT f_x = 0.0; + F_FLOAT f_y = 0.0; + F_FLOAT f_z = 0.0; + + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; - jtype = type(j); - jtag = tag(j); + const int jtype = type(j); + const int jtag = tag(j); if (itag > jtag) { if ((itag+jtag) % 2 == 0) continue; @@ -315,9 +357,9 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeHalf<N (tmp_fcd - tmp_fce*paramskk(itype,jtype,jtype).lam1) / r; const F_FLOAT eng = tmp_fce * paramskk(itype,jtype,jtype).biga * tmp_exp; - a_f(i,0) += delx*frep; - a_f(i,1) += dely*frep; - a_f(i,2) += delz*frep; + f_x += delx*frep; + f_y += dely*frep; + f_z += delz*frep; a_f(j,0) -= delx*frep; a_f(j,1) -= dely*frep; a_f(j,2) -= delz*frep; @@ -330,35 +372,35 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeHalf<N // attractive: bond order - for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; - jtype = type(j); + const int jtype = type(j); - delx1 = xtmp - x(j,0); - dely1 = ytmp - x(j,1); - delz1 = ztmp - x(j,2); - rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; - cutsq1 = paramskk(itype,jtype,jtype).cutsq; + const F_FLOAT delx1 = xtmp - x(j,0); + const F_FLOAT dely1 = ytmp - x(j,1); + const F_FLOAT delz1 = ztmp - x(j,2); + const F_FLOAT rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; + const F_FLOAT cutsq1 = paramskk(itype,jtype,jtype).cutsq; - bo_ij = 0.0; + F_FLOAT bo_ij = 0.0; if (rsq1 > cutsq1) continue; - rij = sqrt(rsq1); + const F_FLOAT rij = sqrt(rsq1); - for (kk = 0; kk < jnum; kk++) { + for (int kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + int k = d_neighbors_short(i,kk); k &= NEIGHMASK; - ktype = type(k); + const int ktype = type(k); - delx2 = xtmp - x(k,0); - dely2 = ytmp - x(k,1); - delz2 = ztmp - x(k,2); - rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; - cutsq2 = paramskk(itype,jtype,ktype).cutsq; + const F_FLOAT delx2 = xtmp - x(k,0); + const F_FLOAT dely2 = ytmp - x(k,1); + const F_FLOAT delz2 = ztmp - x(k,2); + const F_FLOAT rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + const F_FLOAT cutsq2 = paramskk(itype,jtype,ktype).cutsq; if (rsq2 > cutsq2) continue; - rik = sqrt(rsq2); + const F_FLOAT rik = sqrt(rsq2); bo_ij += bondorder(itype,jtype,ktype,rij,delx1,dely1,delz1,rik,delx2,dely2,delz2); } @@ -369,58 +411,64 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeHalf<N const F_FLOAT bij = ters_bij_k(itype,jtype,jtype,bo_ij); const F_FLOAT fatt = -0.5*bij * dfa / rij; const F_FLOAT prefactor = 0.5*fa * ters_dbij(itype,jtype,jtype,bo_ij); - const F_FLOAT eng = 0.5*bij * fa; - a_f(i,0) += delx1*fatt; - a_f(i,1) += dely1*fatt; - a_f(i,2) += delz1*fatt; - a_f(j,0) -= delx1*fatt; - a_f(j,1) -= dely1*fatt; - a_f(j,2) -= delz1*fatt; + f_x += delx1*fatt; + f_y += dely1*fatt; + f_z += delz1*fatt; + F_FLOAT fj_x = -delx1*fatt; + F_FLOAT fj_y = -dely1*fatt; + F_FLOAT fj_z = -delz1*fatt; if (EVFLAG) { + const F_FLOAT eng = 0.5*bij * fa; if (eflag) ev.evdwl += eng; if (vflag_either || eflag_atom) - this->template ev_tally<NEIGHFLAG>(ev,i,j,eng,fatt,delx1,dely1,delz1); + this->template ev_tally<NEIGHFLAG>(ev,i,j,eng,fatt,delx1,dely1,delz1); } // attractive: three-body force - for (kk = 0; kk < jnum; kk++) { + for (int kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + int k = d_neighbors_short(i,kk); k &= NEIGHMASK; - ktype = type(k); + const int ktype = type(k); - delx2 = xtmp - x(k,0); - dely2 = ytmp - x(k,1); - delz2 = ztmp - x(k,2); - rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; - cutsq2 = paramskk(itype,jtype,ktype).cutsq; + const F_FLOAT delx2 = xtmp - x(k,0); + const F_FLOAT dely2 = ytmp - x(k,1); + const F_FLOAT delz2 = ztmp - x(k,2); + const F_FLOAT rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + const F_FLOAT cutsq2 = paramskk(itype,jtype,ktype).cutsq; if (rsq2 > cutsq2) continue; - rik = sqrt(rsq2); + const F_FLOAT rik = sqrt(rsq2); ters_dthb(itype,jtype,ktype,prefactor,rij,delx1,dely1,delz1, - rik,delx2,dely2,delz2,fi,fj,fk); - - a_f(i,0) += fi[0]; - a_f(i,1) += fi[1]; - a_f(i,2) += fi[2]; - a_f(j,0) += fj[0]; - a_f(j,1) += fj[1]; - a_f(j,2) += fj[2]; + rik,delx2,dely2,delz2,fi,fj,fk); + + f_x += fi[0]; + f_y += fi[1]; + f_z += fi[2]; + fj_x += fj[0]; + fj_y += fj[1]; + fj_z += fj[2]; a_f(k,0) += fk[0]; a_f(k,1) += fk[1]; a_f(k,2) += fk[2]; if (vflag_atom) { - F_FLOAT delrij[3], delrik[3]; - delrij[0] = -delx1; delrij[1] = -dely1; delrij[2] = -delz1; - delrik[0] = -delx2; delrik[1] = -dely2; delrik[2] = -delz2; - if (vflag_either) this->template v_tally3<NEIGHFLAG>(ev,i,j,k,fj,fk,delrij,delrik); + F_FLOAT delrij[3], delrik[3]; + delrij[0] = -delx1; delrij[1] = -dely1; delrij[2] = -delz1; + delrik[0] = -delx2; delrik[1] = -dely2; delrik[2] = -delz2; + if (vflag_either) this->template v_tally3<NEIGHFLAG>(ev,i,j,k,fj,fk,delrij,delrik); } } + a_f(j,0) += fj_x; + a_f(j,1) += fj_y; + a_f(j,2) += fj_z; } + a_f(i,0) += f_x; + a_f(i,1) += f_y; + a_f(i,2) += f_z; } template<class DeviceType> @@ -450,12 +498,15 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullA< X_FLOAT delx1, dely1, delz1, delx2, dely2, delz2; //const AtomNeighborsConst d_neighbors_i = k_list.get_neighbors_const(i); - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; // repulsive + F_FLOAT f_x = 0.0; + F_FLOAT f_y = 0.0; + F_FLOAT f_z = 0.0; for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + j = d_neighbors_short(i,jj); j &= NEIGHMASK; const int jtype = type(j); @@ -475,9 +526,9 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullA< (tmp_fcd - tmp_fce*paramskk(itype,jtype,jtype).lam1) / r; const F_FLOAT eng = tmp_fce * paramskk(itype,jtype,jtype).biga * tmp_exp; - f(i,0) += delx*frep; - f(i,1) += dely*frep; - f(i,2) += delz*frep; + f_x += delx*frep; + f_y += dely*frep; + f_z += delz*frep; if (EVFLAG) { if (eflag) @@ -490,7 +541,7 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullA< // attractive: bond order for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + j = d_neighbors_short(i,jj); j &= NEIGHMASK; jtype = type(j); @@ -506,7 +557,7 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullA< for (kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + k = d_neighbors_short(i,kk); k &= NEIGHMASK; ktype = type(k); @@ -530,9 +581,9 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullA< const F_FLOAT prefactor = 0.5*fa * ters_dbij(itype,jtype,jtype,bo_ij); const F_FLOAT eng = 0.5*bij * fa; - f(i,0) += delx1*fatt; - f(i,1) += dely1*fatt; - f(i,2) += delz1*fatt; + f_x += delx1*fatt; + f_y += dely1*fatt; + f_z += delz1*fatt; if (EVFLAG) { if (eflag) ev.evdwl += 0.5*eng; @@ -544,7 +595,7 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullA< for (kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + k = d_neighbors_short(i,kk); k &= NEIGHMASK; ktype = type(k); @@ -559,9 +610,9 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullA< ters_dthb(itype,jtype,ktype,prefactor,rij,delx1,dely1,delz1, rik,delx2,dely2,delz2,fi,fj,fk); - f(i,0) += fi[0]; - f(i,1) += fi[1]; - f(i,2) += fi[2]; + f_x += fi[0]; + f_y += fi[1]; + f_z += fi[2]; if (vflag_atom) { F_FLOAT delrij[3], delrik[3]; @@ -571,6 +622,9 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullA< } } } + f(i,0) += f_x; + f(i,1) += f_y; + f(i,2) += f_z; } template<class DeviceType> @@ -599,12 +653,16 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullB< F_FLOAT fj[3], fk[3]; X_FLOAT delx1, dely1, delz1, delx2, dely2, delz2; - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; + + F_FLOAT f_x = 0.0; + F_FLOAT f_y = 0.0; + F_FLOAT f_z = 0.0; // attractive: bond order for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + j = d_neighbors_short(i,jj); j &= NEIGHMASK; if (j >= nlocal) continue; jtype = type(j); @@ -619,10 +677,10 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullB< if (rsq1 > cutsq1) continue; rij = sqrt(rsq1); - j_jnum = d_numneigh[j]; + j_jnum = d_numneigh_short[j]; for (kk = 0; kk < j_jnum; kk++) { - k = d_neighbors(j,kk); + k = d_neighbors_short(j,kk); if (k == i) continue; k &= NEIGHMASK; ktype = type(k); @@ -648,9 +706,9 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullB< const F_FLOAT prefactor = 0.5*fa * ters_dbij(jtype,itype,itype,bo_ij); const F_FLOAT eng = 0.5*bij * fa; - f(i,0) -= delx1*fatt; - f(i,1) -= dely1*fatt; - f(i,2) -= delz1*fatt; + f_x -= delx1*fatt; + f_y -= dely1*fatt; + f_z -= delz1*fatt; if (EVFLAG) { if (eflag) @@ -662,7 +720,7 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullB< // attractive: three-body force for (kk = 0; kk < j_jnum; kk++) { - k = d_neighbors(j,kk); + k = d_neighbors_short(j,kk); if (k == i) continue; k &= NEIGHMASK; ktype = type(k); @@ -677,9 +735,9 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullB< rik = sqrt(rsq2); ters_dthbj(jtype,itype,ktype,prefactor,rij,delx1,dely1,delz1, rik,delx2,dely2,delz2,fj,fk); - f(i,0) += fj[0]; - f(i,1) += fj[1]; - f(i,2) += fj[2]; + f_x += fj[0]; + f_y += fj[1]; + f_z += fj[2]; if (vflag_atom) { F_FLOAT delrji[3], delrjk[3]; @@ -692,11 +750,14 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeFullB< const F_FLOAT prefactor_jk = 0.5*fa_jk * ters_dbij(jtype,ktype,itype,bo_ij); ters_dthbk(jtype,ktype,itype,prefactor_jk,rik,delx2,dely2,delz2, rij,delx1,dely1,delz1,fk); - f(i,0) += fk[0]; - f(i,1) += fk[1]; - f(i,2) += fk[2]; + f_x += fk[0]; + f_y += fk[1]; + f_z += fk[2]; } } + f(i,0) += f_x; + f(i,1) += f_y; + f(i,2) += f_z; } template<class DeviceType> diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.h b/src/KOKKOS/pair_tersoff_mod_kokkos.h index 07a76b4e66..5a26fa1557 100644 --- a/src/KOKKOS/pair_tersoff_mod_kokkos.h +++ b/src/KOKKOS/pair_tersoff_mod_kokkos.h @@ -39,6 +39,8 @@ struct TagPairTersoffMODComputeFullA{}; template<int NEIGHFLAG, int EVFLAG> struct TagPairTersoffMODComputeFullB{}; +struct TagPairTersoffMODComputeShortNeigh{}; + template<class DeviceType> class PairTersoffMODKokkos : public PairTersoffMOD { public: @@ -77,6 +79,9 @@ class PairTersoffMODKokkos : public PairTersoffMOD { KOKKOS_INLINE_FUNCTION void operator()(TagPairTersoffMODComputeFullB<NEIGHFLAG,EVFLAG>, const int&) const; + KOKKOS_INLINE_FUNCTION + void operator()(TagPairTersoffMODComputeShortNeigh, const int&) const; + KOKKOS_INLINE_FUNCTION double ters_fc_k(const int &i, const int &j, const int &k, const F_FLOAT &r) const; @@ -184,6 +189,7 @@ class PairTersoffMODKokkos : public PairTersoffMOD { // hardwired to space for 15 atom types //params_ters m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + int inum; typename AT::t_x_array_randomread x; typename AT::t_f_array f; typename AT::t_int_1d_randomread type; @@ -203,10 +209,12 @@ class PairTersoffMODKokkos : public PairTersoffMOD { typename ArrayTypes<DeviceType>::t_int_1d_randomread d_numneigh; //NeighListKokkos<DeviceType> k_list; - class AtomKokkos *atomKK; int neighflag,newton_pair; int nlocal,nall,eflag,vflag; + Kokkos::View<int**,DeviceType> d_neighbors_short; + Kokkos::View<int*,DeviceType> d_numneigh_short; + friend void pair_virial_fdotr_compute<PairTersoffMODKokkos>(PairTersoffMODKokkos*); }; diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp index 382cff8ef5..6f011aecf4 100644 --- a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp @@ -205,7 +205,7 @@ void PairTersoffZBLKokkos<DeviceType>::compute(int eflag_in, int vflag_in) nall = atom->nlocal + atom->nghost; newton_pair = force->newton_pair; - const int inum = list->inum; + inum = list->inum; const int ignum = inum + list->gnum; NeighListKokkos<DeviceType>* k_list = static_cast<NeighListKokkos<DeviceType>*>(list); d_numneigh = k_list->d_numneigh; @@ -218,6 +218,18 @@ void PairTersoffZBLKokkos<DeviceType>::compute(int eflag_in, int vflag_in) EV_FLOAT ev; EV_FLOAT ev_all; + // build short neighbor list + + int max_neighs = d_neighbors.dimension_1(); + + if ((d_neighbors_short.dimension_1() != max_neighs) || + (d_neighbors_short.dimension_0() != ignum)) { + d_neighbors_short = Kokkos::View<int**,DeviceType>("Tersoff::neighbors_short",ignum,max_neighs); + } + if (d_numneigh_short.dimension_0()!=ignum) + d_numneigh_short = Kokkos::View<int*,DeviceType>("Tersoff::numneighs_short",ignum); + Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType,TagPairTersoffZBLComputeShortNeigh>(0,neighflag==FULL?ignum:inum), *this); + if (neighflag == HALF) { if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy<DeviceType, TagPairTersoffZBLComputeHalf<HALF,1> >(0,inum),*this,ev); @@ -271,6 +283,35 @@ void PairTersoffZBLKokkos<DeviceType>::compute(int eflag_in, int vflag_in) /* ---------------------------------------------------------------------- */ +template<class DeviceType> +KOKKOS_INLINE_FUNCTION +void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeShortNeigh, const int& ii) const { + const int i = d_ilist[ii]; + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + + const int jnum = d_numneigh[i]; + int inside = 0; + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors(i,jj); + j &= NEIGHMASK; + + const X_FLOAT delx = xtmp - x(j,0); + const X_FLOAT dely = ytmp - x(j,1); + const X_FLOAT delz = ztmp - x(j,2); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cutmax*cutmax) { + d_neighbors_short(i,inside) = j; + inside++; + } + } + d_numneigh_short(i) = inside; +} + +/* ---------------------------------------------------------------------- */ + template<class DeviceType> template<int NEIGHFLAG, int EVFLAG> KOKKOS_INLINE_FUNCTION @@ -287,21 +328,22 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeHalf<N const int itype = type(i); const int itag = tag(i); - int j,k,jj,kk,jtag,jtype,ktype; - F_FLOAT rsq1, cutsq1, rsq2, cutsq2, rij, rik, bo_ij; F_FLOAT fi[3], fj[3], fk[3]; - X_FLOAT delx1, dely1, delz1, delx2, dely2, delz2; //const AtomNeighborsConst d_neighbors_i = k_list.get_neighbors_const(i); - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; // repulsive - for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + F_FLOAT f_x = 0.0; + F_FLOAT f_y = 0.0; + F_FLOAT f_z = 0.0; + + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; - jtype = type(j); - jtag = tag(j); + const int jtype = type(j); + const int jtag = tag(j); if (itag > jtag) { if ((itag+jtag) % 2 == 0) continue; @@ -359,9 +401,9 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeHalf<N eng = (1.0 - fermi_k(itype,jtype,jtype,r)) * eng_z + fermi_k(itype,jtype,jtype,r) * eng_t; - a_f(i,0) += delx*frep; - a_f(i,1) += dely*frep; - a_f(i,2) += delz*frep; + f_x += delx*frep; + f_y += dely*frep; + f_z += delz*frep; a_f(j,0) -= delx*frep; a_f(j,1) -= dely*frep; a_f(j,2) -= delz*frep; @@ -374,35 +416,35 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeHalf<N // attractive: bond order - for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + for (int jj = 0; jj < jnum; jj++) { + int j = d_neighbors_short(i,jj); j &= NEIGHMASK; - jtype = type(j); + const int jtype = type(j); - delx1 = xtmp - x(j,0); - dely1 = ytmp - x(j,1); - delz1 = ztmp - x(j,2); - rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; - cutsq1 = paramskk(itype,jtype,jtype).cutsq; + const F_FLOAT delx1 = xtmp - x(j,0); + const F_FLOAT dely1 = ytmp - x(j,1); + const F_FLOAT delz1 = ztmp - x(j,2); + const F_FLOAT rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; + const F_FLOAT cutsq1 = paramskk(itype,jtype,jtype).cutsq; - bo_ij = 0.0; + F_FLOAT bo_ij = 0.0; if (rsq1 > cutsq1) continue; - rij = sqrt(rsq1); + const F_FLOAT rij = sqrt(rsq1); - for (kk = 0; kk < jnum; kk++) { + for (int kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + int k = d_neighbors_short(i,kk); k &= NEIGHMASK; - ktype = type(k); + const int ktype = type(k); - delx2 = xtmp - x(k,0); - dely2 = ytmp - x(k,1); - delz2 = ztmp - x(k,2); - rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; - cutsq2 = paramskk(itype,jtype,ktype).cutsq; + const F_FLOAT delx2 = xtmp - x(k,0); + const F_FLOAT dely2 = ytmp - x(k,1); + const F_FLOAT delz2 = ztmp - x(k,2); + const F_FLOAT rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + const F_FLOAT cutsq2 = paramskk(itype,jtype,ktype).cutsq; if (rsq2 > cutsq2) continue; - rik = sqrt(rsq2); + const F_FLOAT rik = sqrt(rsq2); bo_ij += bondorder(itype,jtype,ktype,rij,delx1,dely1,delz1,rik,delx2,dely2,delz2); } @@ -413,58 +455,64 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeHalf<N const F_FLOAT bij = ters_bij_k(itype,jtype,jtype,bo_ij); const F_FLOAT fatt = -0.5*bij * dfa / rij; const F_FLOAT prefactor = 0.5*fa * ters_dbij(itype,jtype,jtype,bo_ij); - const F_FLOAT eng = 0.5*bij * fa; - a_f(i,0) += delx1*fatt; - a_f(i,1) += dely1*fatt; - a_f(i,2) += delz1*fatt; - a_f(j,0) -= delx1*fatt; - a_f(j,1) -= dely1*fatt; - a_f(j,2) -= delz1*fatt; + f_x += delx1*fatt; + f_y += dely1*fatt; + f_z += delz1*fatt; + F_FLOAT fj_x = -delx1*fatt; + F_FLOAT fj_y = -dely1*fatt; + F_FLOAT fj_z = -delz1*fatt; if (EVFLAG) { + const F_FLOAT eng = 0.5*bij * fa; if (eflag) ev.evdwl += eng; if (vflag_either || eflag_atom) - this->template ev_tally<NEIGHFLAG>(ev,i,j,eng,fatt,delx1,dely1,delz1); + this->template ev_tally<NEIGHFLAG>(ev,i,j,eng,fatt,delx1,dely1,delz1); } // attractive: three-body force - for (kk = 0; kk < jnum; kk++) { + for (int kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + int k = d_neighbors_short(i,kk); k &= NEIGHMASK; - ktype = type(k); + const int ktype = type(k); - delx2 = xtmp - x(k,0); - dely2 = ytmp - x(k,1); - delz2 = ztmp - x(k,2); - rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; - cutsq2 = paramskk(itype,jtype,ktype).cutsq; + const F_FLOAT delx2 = xtmp - x(k,0); + const F_FLOAT dely2 = ytmp - x(k,1); + const F_FLOAT delz2 = ztmp - x(k,2); + const F_FLOAT rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + const F_FLOAT cutsq2 = paramskk(itype,jtype,ktype).cutsq; if (rsq2 > cutsq2) continue; - rik = sqrt(rsq2); + const F_FLOAT rik = sqrt(rsq2); ters_dthb(itype,jtype,ktype,prefactor,rij,delx1,dely1,delz1, - rik,delx2,dely2,delz2,fi,fj,fk); - - a_f(i,0) += fi[0]; - a_f(i,1) += fi[1]; - a_f(i,2) += fi[2]; - a_f(j,0) += fj[0]; - a_f(j,1) += fj[1]; - a_f(j,2) += fj[2]; + rik,delx2,dely2,delz2,fi,fj,fk); + + f_x += fi[0]; + f_y += fi[1]; + f_z += fi[2]; + fj_x += fj[0]; + fj_y += fj[1]; + fj_z += fj[2]; a_f(k,0) += fk[0]; a_f(k,1) += fk[1]; a_f(k,2) += fk[2]; if (vflag_atom) { - F_FLOAT delrij[3], delrik[3]; - delrij[0] = -delx1; delrij[1] = -dely1; delrij[2] = -delz1; - delrik[0] = -delx2; delrik[1] = -dely2; delrik[2] = -delz2; - if (vflag_either) this->template v_tally3<NEIGHFLAG>(ev,i,j,k,fj,fk,delrij,delrik); + F_FLOAT delrij[3], delrik[3]; + delrij[0] = -delx1; delrij[1] = -dely1; delrij[2] = -delz1; + delrik[0] = -delx2; delrik[1] = -dely2; delrik[2] = -delz2; + if (vflag_either) this->template v_tally3<NEIGHFLAG>(ev,i,j,k,fj,fk,delrij,delrik); } } + a_f(j,0) += fj_x; + a_f(j,1) += fj_y; + a_f(j,2) += fj_z; } + a_f(i,0) += f_x; + a_f(i,1) += f_y; + a_f(i,2) += f_z; } template<class DeviceType> @@ -498,8 +546,11 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullA< // repulsive + F_FLOAT f_x = 0.0; + F_FLOAT f_y = 0.0; + F_FLOAT f_z = 0.0; for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + j = d_neighbors_short(i,jj); j &= NEIGHMASK; const int jtype = type(j); @@ -549,9 +600,9 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullA< eng = (1.0 - fermi_k(itype,jtype,jtype,r)) * eng_z + fermi_k(itype,jtype,jtype,r) * eng_t; - f(i,0) += delx*frep; - f(i,1) += dely*frep; - f(i,2) += delz*frep; + f_x += delx*frep; + f_y += dely*frep; + f_z += delz*frep; if (EVFLAG) { if (eflag) @@ -564,7 +615,7 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullA< // attractive: bond order for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + j = d_neighbors_short(i,jj); j &= NEIGHMASK; jtype = type(j); @@ -580,7 +631,7 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullA< for (kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + k = d_neighbors_short(i,kk); k &= NEIGHMASK; ktype = type(k); @@ -604,9 +655,9 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullA< const F_FLOAT prefactor = 0.5*fa * ters_dbij(itype,jtype,jtype,bo_ij); const F_FLOAT eng = 0.5*bij * fa; - f(i,0) += delx1*fatt; - f(i,1) += dely1*fatt; - f(i,2) += delz1*fatt; + f_x += delx1*fatt; + f_y += dely1*fatt; + f_z += delz1*fatt; if (EVFLAG) { if (eflag) ev.evdwl += 0.5*eng; @@ -618,7 +669,7 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullA< for (kk = 0; kk < jnum; kk++) { if (jj == kk) continue; - k = d_neighbors(i,kk); + k = d_neighbors_short(i,kk); k &= NEIGHMASK; ktype = type(k); @@ -633,9 +684,9 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullA< ters_dthb(itype,jtype,ktype,prefactor,rij,delx1,dely1,delz1, rik,delx2,dely2,delz2,fi,fj,fk); - f(i,0) += fi[0]; - f(i,1) += fi[1]; - f(i,2) += fi[2]; + f_x += fi[0]; + f_y += fi[1]; + f_z += fi[2]; if (vflag_atom) { F_FLOAT delrij[3], delrik[3]; @@ -645,6 +696,9 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullA< } } } + f(i,0) += f_x; + f(i,1) += f_y; + f(i,2) += f_z; } template<class DeviceType> @@ -673,12 +727,16 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullB< F_FLOAT fj[3], fk[3]; X_FLOAT delx1, dely1, delz1, delx2, dely2, delz2; - const int jnum = d_numneigh[i]; + const int jnum = d_numneigh_short[i]; + + F_FLOAT f_x = 0.0; + F_FLOAT f_y = 0.0; + F_FLOAT f_z = 0.0; // attractive: bond order for (jj = 0; jj < jnum; jj++) { - j = d_neighbors(i,jj); + j = d_neighbors_short(i,jj); j &= NEIGHMASK; if (j >= nlocal) continue; jtype = type(j); @@ -693,10 +751,10 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullB< if (rsq1 > cutsq1) continue; rij = sqrt(rsq1); - j_jnum = d_numneigh[j]; + j_jnum = d_numneigh_short[j]; for (kk = 0; kk < j_jnum; kk++) { - k = d_neighbors(j,kk); + k = d_neighbors_short(j,kk); if (k == i) continue; k &= NEIGHMASK; ktype = type(k); @@ -722,9 +780,9 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullB< const F_FLOAT prefactor = 0.5*fa * ters_dbij(jtype,itype,itype,bo_ij); const F_FLOAT eng = 0.5*bij * fa; - f(i,0) -= delx1*fatt; - f(i,1) -= dely1*fatt; - f(i,2) -= delz1*fatt; + f_x -= delx1*fatt; + f_y -= dely1*fatt; + f_z -= delz1*fatt; if (EVFLAG) { if (eflag) @@ -736,7 +794,7 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullB< // attractive: three-body force for (kk = 0; kk < j_jnum; kk++) { - k = d_neighbors(j,kk); + k = d_neighbors_short(j,kk); if (k == i) continue; k &= NEIGHMASK; ktype = type(k); @@ -751,9 +809,9 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullB< rik = sqrt(rsq2); ters_dthbj(jtype,itype,ktype,prefactor,rij,delx1,dely1,delz1, rik,delx2,dely2,delz2,fj,fk); - f(i,0) += fj[0]; - f(i,1) += fj[1]; - f(i,2) += fj[2]; + f_x += fj[0]; + f_y += fj[1]; + f_z += fj[2]; if (vflag_atom) { F_FLOAT delrji[3], delrjk[3]; @@ -766,11 +824,14 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeFullB< const F_FLOAT prefactor_jk = 0.5*fa_jk * ters_dbij(jtype,ktype,itype,bo_ij); ters_dthbk(jtype,ktype,itype,prefactor_jk,rik,delx2,dely2,delz2, rij,delx1,dely1,delz1,fk); - f(i,0) += fk[0]; - f(i,1) += fk[1]; - f(i,2) += fk[2]; + f_x += fk[0]; + f_y += fk[1]; + f_z += fk[2]; } } + f(i,0) += f_x; + f(i,1) += f_y; + f(i,2) += f_z; } template<class DeviceType> diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.h b/src/KOKKOS/pair_tersoff_zbl_kokkos.h index d580634197..136366d3fa 100644 --- a/src/KOKKOS/pair_tersoff_zbl_kokkos.h +++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.h @@ -39,6 +39,8 @@ struct TagPairTersoffZBLComputeFullA{}; template<int NEIGHFLAG, int EVFLAG> struct TagPairTersoffZBLComputeFullB{}; +struct TagPairTersoffZBLComputeShortNeigh{}; + template<class DeviceType> class PairTersoffZBLKokkos : public PairTersoffZBL { public: @@ -77,6 +79,8 @@ class PairTersoffZBLKokkos : public PairTersoffZBL { KOKKOS_INLINE_FUNCTION void operator()(TagPairTersoffZBLComputeFullB<NEIGHFLAG,EVFLAG>, const int&) const; + KOKKOS_INLINE_FUNCTION + void operator()(TagPairTersoffZBLComputeShortNeigh, const int&) const; KOKKOS_INLINE_FUNCTION double ters_fc_k(const int &i, const int &j, const int &k, const F_FLOAT &r) const; @@ -190,6 +194,7 @@ class PairTersoffZBLKokkos : public PairTersoffZBL { // hardwired to space for 15 atom types //params_ters m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + int inum; typename AT::t_x_array_randomread x; typename AT::t_f_array f; typename AT::t_int_1d_randomread type; @@ -209,10 +214,12 @@ class PairTersoffZBLKokkos : public PairTersoffZBL { typename ArrayTypes<DeviceType>::t_int_1d_randomread d_numneigh; //NeighListKokkos<DeviceType> k_list; - class AtomKokkos *atomKK; int neighflag,newton_pair; int nlocal,nall,eflag,vflag; + Kokkos::View<int**,DeviceType> d_neighbors_short; + Kokkos::View<int*,DeviceType> d_numneigh_short; + // ZBL F_FLOAT global_a_0; // Bohr radius for Coulomb repulsion F_FLOAT global_epsilon_0; // permittivity of vacuum for Coulomb repulsion diff --git a/src/pair_morse.cpp b/src/pair_morse.cpp index 4e2d47be5c..9170eb7a1d 100644 --- a/src/pair_morse.cpp +++ b/src/pair_morse.cpp @@ -176,7 +176,8 @@ void PairMorse::settings(int narg, char **arg) void PairMorse::coeff(int narg, char **arg) { - if (narg < 5 || narg > 6) error->all(FLERR,"Incorrect args for pair coefficients"); + if (narg < 5 || narg > 6) + error->all(FLERR,"Incorrect args for pair coefficients"); if (!allocated) allocate(); int ilo,ihi,jlo,jhi; -- GitLab