From 3005664beec32d2a69e42a10389d91dfe75f797e Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 13 Jul 2023 18:14:24 -0400 Subject: [PATCH 01/15] lmp: support unit real --- source/lmp/pair_deepmd.cpp | 56 +++++++++++++++++++-------------- source/lmp/pair_deepmd.h | 1 + source/lmp/tests/test_lammps.py | 40 +++++++++++++++++++++-- 3 files changed, 72 insertions(+), 25 deletions(-) diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index 53dda6bc8e..8dac566c55 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -336,11 +336,19 @@ PairDeepMD::PairDeepMD(LAMMPS *lmp) if (lmp->citeme) { lmp->citeme->add(cite_user_deepmd_package); } - if (strcmp(update->unit_style, "metal") != 0) { + int unit_convert; + if (strcmp(update->unit_style, "metal") == 0) { + unit_convert == utils::NOCONVERT; + } + else if (strcmp(update->unit_style, "real") == 0) { + unit_convert == utils::METAL2REAL; + } else { error->all( FLERR, - "Pair deepmd requires metal unit, please set it by \"units metal\""); + "Pair deepmd requires metal or real unit, please set it by \"units metal\" or \"units real\""); } + double conversion_factor = utils::get_conversion_factor(utils::ENERGY, + unit_convert); restartinfo = 1; #if LAMMPS_VERSION_NUMBER >= 20201130 centroidstressflag = @@ -353,6 +361,8 @@ PairDeepMD::PairDeepMD(LAMMPS *lmp) pppmflag = 1; respa_enable = 0; writedata = 0; + unit_convert_flag = utils::get_supported_conversions(utils::ENERGY); + cutoff = 0.; numb_types = 0; numb_types_spin = 0; @@ -568,7 +578,7 @@ void PairDeepMD::compute(int eflag, int vflag) { } if (eflag_atom) { for (int ii = 0; ii < nlocal; ++ii) { - eatom[ii] += deatom[ii]; + eatom[ii] += scale[1][1] * deatom[ii]; } } // Added by Davide Tisi 2020 @@ -582,15 +592,15 @@ void PairDeepMD::compute(int eflag, int vflag) { // vatom[ii][3] += 1.0 * dvatom[9*ii+3]; // vatom[ii][4] += 1.0 * dvatom[9*ii+6]; // vatom[ii][5] += 1.0 * dvatom[9*ii+7]; - cvatom[ii][0] += -1.0 * dvatom[9 * ii + 0]; // xx - cvatom[ii][1] += -1.0 * dvatom[9 * ii + 4]; // yy - cvatom[ii][2] += -1.0 * dvatom[9 * ii + 8]; // zz - cvatom[ii][3] += -1.0 * dvatom[9 * ii + 3]; // xy - cvatom[ii][4] += -1.0 * dvatom[9 * ii + 6]; // xz - cvatom[ii][5] += -1.0 * dvatom[9 * ii + 7]; // yz - cvatom[ii][6] += -1.0 * dvatom[9 * ii + 1]; // yx - cvatom[ii][7] += -1.0 * dvatom[9 * ii + 2]; // zx - cvatom[ii][8] += -1.0 * dvatom[9 * ii + 5]; // zy + cvatom[ii][0] += -scale[1][1] * dvatom[9 * ii + 0]; // xx + cvatom[ii][1] += -scale[1][1] * dvatom[9 * ii + 4]; // yy + cvatom[ii][2] += -scale[1][1] * dvatom[9 * ii + 8]; // zz + cvatom[ii][3] += -scale[1][1] * dvatom[9 * ii + 3]; // xy + cvatom[ii][4] += -scale[1][1] * dvatom[9 * ii + 6]; // xz + cvatom[ii][5] += -scale[1][1] * dvatom[9 * ii + 7]; // yz + cvatom[ii][6] += -scale[1][1] * dvatom[9 * ii + 1]; // yx + cvatom[ii][7] += -scale[1][1] * dvatom[9 * ii + 2]; // zx + cvatom[ii][8] += -scale[1][1] * dvatom[9 * ii + 5]; // zy } } } @@ -620,7 +630,7 @@ void PairDeepMD::compute(int eflag, int vflag) { dvatom = all_atom_virial[0]; if (eflag_atom) { for (int ii = 0; ii < nlocal; ++ii) { - eatom[ii] += deatom[ii]; + eatom[ii] += eatom * deatom[ii]; } } // Added by Davide Tisi 2020 @@ -634,15 +644,15 @@ void PairDeepMD::compute(int eflag, int vflag) { // vatom[ii][3] += 1.0 * dvatom[9*ii+3]; // vatom[ii][4] += 1.0 * dvatom[9*ii+6]; // vatom[ii][5] += 1.0 * dvatom[9*ii+7]; - cvatom[ii][0] += -1.0 * dvatom[9 * ii + 0]; // xx - cvatom[ii][1] += -1.0 * dvatom[9 * ii + 4]; // yy - cvatom[ii][2] += -1.0 * dvatom[9 * ii + 8]; // zz - cvatom[ii][3] += -1.0 * dvatom[9 * ii + 3]; // xy - cvatom[ii][4] += -1.0 * dvatom[9 * ii + 6]; // xz - cvatom[ii][5] += -1.0 * dvatom[9 * ii + 7]; // yz - cvatom[ii][6] += -1.0 * dvatom[9 * ii + 1]; // yx - cvatom[ii][7] += -1.0 * dvatom[9 * ii + 2]; // zx - cvatom[ii][8] += -1.0 * dvatom[9 * ii + 5]; // zy + cvatom[ii][0] += -scale[1][1] * dvatom[9 * ii + 0]; // xx + cvatom[ii][1] += -scale[1][1] * dvatom[9 * ii + 4]; // yy + cvatom[ii][2] += -scale[1][1] * dvatom[9 * ii + 8]; // zz + cvatom[ii][3] += -scale[1][1] * dvatom[9 * ii + 3]; // xy + cvatom[ii][4] += -scale[1][1] * dvatom[9 * ii + 6]; // xz + cvatom[ii][5] += -scale[1][1] * dvatom[9 * ii + 7]; // yz + cvatom[ii][6] += -scale[1][1] * dvatom[9 * ii + 1]; // yx + cvatom[ii][7] += -scale[1][1] * dvatom[9 * ii + 2]; // zx + cvatom[ii][8] += -scale[1][1] * dvatom[9 * ii + 5]; // zy } } if (out_freq > 0 && update->ntimestep % out_freq == 0) { @@ -830,7 +840,7 @@ void PairDeepMD::allocate() { continue; } setflag[i][j] = 1; - scale[i][j] = 1; + scale[i][j] = conversion_factor; } } } diff --git a/source/lmp/pair_deepmd.h b/source/lmp/pair_deepmd.h index feff28b9a4..b2a9832745 100644 --- a/source/lmp/pair_deepmd.h +++ b/source/lmp/pair_deepmd.h @@ -131,6 +131,7 @@ class PairDeepMD : public Pair { tagint *tagsend, *tagrecv; double *stdfsend, *stdfrecv; std::vector type_idx_map; + double conversion_factor; }; } // namespace LAMMPS_NS diff --git a/source/lmp/tests/test_lammps.py b/source/lmp/tests/test_lammps.py index d07e4fb287..b1058351ba 100644 --- a/source/lmp/tests/test_lammps.py +++ b/source/lmp/tests/test_lammps.py @@ -217,6 +217,7 @@ # https://github.com/lammps/lammps/blob/1e1311cf401c5fc2614b5d6d0ff3230642b76597/src/update.cpp#L193 nktv2p = 1.6021765e6 +metal2real = 23.060549 sp.check_output( "{} -m deepmd convert-from pbtxt -i {} -o {}".format( @@ -244,9 +245,9 @@ def teardown_module(): os.remove(data_type_map_file) -def _lammps(data_file) -> PyLammps: +def _lammps(data_file, units="metal") -> PyLammps: lammps = PyLammps() - lammps.units("metal") + lammps.units(units) lammps.boundary("p p p") lammps.atom_style("atomic") lammps.neighbor("2.0 bin") @@ -268,6 +269,10 @@ def lammps(): def lammps_type_map(): yield _lammps(data_file=data_type_map_file) +@pytest.fixture +def lammps_real(): + yield _lammps(data_file=data_file, units="real") + def test_pair_deepmd(lammps): lammps.pair_style(f"deepmd {pb_file.resolve()}") @@ -432,3 +437,34 @@ def test_pair_deepmd_type_map(lammps_type_map): for ii in range(6): assert lammps_type_map.atoms[ii].force == pytest.approx(expected_f[ii]) lammps_type_map.run(1) + + + +def test_pair_deepmd_real(lammps_real): + lammps.pair_style(f"deepmd {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e * metal2real) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx(expected_f[ii] * metal2real) + lammps.run(1) + + +def test_pair_deepmd_virial_real(lammps_real): + lammps.pair_style(f"deepmd {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e * metal2real) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx(expected_f[ii] * metal2real) + for ii in range(9): + assert np.array( + lammps.variables[f"virial{ii}"].value + ) / nktv2p == pytest.approx(expected_v[:, ii] * metal2real) From 51622337a4d194fe9dad9f3817a4ccfa3fe4f403 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 13 Jul 2023 18:21:36 -0400 Subject: [PATCH 02/15] fix typo Signed-off-by: Jinzhe Zeng --- source/lmp/pair_deepmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index 8dac566c55..2c0103af70 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -630,7 +630,7 @@ void PairDeepMD::compute(int eflag, int vflag) { dvatom = all_atom_virial[0]; if (eflag_atom) { for (int ii = 0; ii < nlocal; ++ii) { - eatom[ii] += eatom * deatom[ii]; + eatom[ii] += scale[1][1] * deatom[ii]; } } // Added by Davide Tisi 2020 From b1f131a4e6fc4de8f3039d7c085392b1fc888698 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 13 Jul 2023 18:45:23 -0400 Subject: [PATCH 03/15] Update test_lammps.py Signed-off-by: Jinzhe Zeng --- source/lmp/tests/test_lammps.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/source/lmp/tests/test_lammps.py b/source/lmp/tests/test_lammps.py index b1058351ba..5d304be8a9 100644 --- a/source/lmp/tests/test_lammps.py +++ b/source/lmp/tests/test_lammps.py @@ -441,30 +441,30 @@ def test_pair_deepmd_type_map(lammps_type_map): def test_pair_deepmd_real(lammps_real): - lammps.pair_style(f"deepmd {pb_file.resolve()}") - lammps.pair_coeff("* *") - lammps.run(0) - assert lammps.eval("pe") == pytest.approx(expected_e * metal2real) + lammps_real.pair_style(f"deepmd {pb_file.resolve()}") + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) for ii in range(6): - assert lammps.atoms[ii].force == pytest.approx(expected_f[ii] * metal2real) - lammps.run(1) + assert lammps_real.atoms[ii].force == pytest.approx(expected_f[ii] * metal2real) + lammps_real.run(1) def test_pair_deepmd_virial_real(lammps_real): - lammps.pair_style(f"deepmd {pb_file.resolve()}") - lammps.pair_coeff("* *") - lammps.compute("virial all centroid/stress/atom NULL pair") + lammps_real.pair_style(f"deepmd {pb_file.resolve()}") + lammps_real.pair_coeff("* *") + lammps_real.compute("virial all centroid/stress/atom NULL pair") for ii in range(9): jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] - lammps.variable(f"virial{jj} atom c_virial[{ii+1}]") - lammps.dump( + lammps_real.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps_real.dump( "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) ) - lammps.run(0) - assert lammps.eval("pe") == pytest.approx(expected_e * metal2real) + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) for ii in range(6): - assert lammps.atoms[ii].force == pytest.approx(expected_f[ii] * metal2real) + assert lammps_real.atoms[ii].force == pytest.approx(expected_f[ii] * metal2real) for ii in range(9): assert np.array( - lammps.variables[f"virial{ii}"].value + lammps_real.variables[f"virial{ii}"].value ) / nktv2p == pytest.approx(expected_v[:, ii] * metal2real) From a9bb26bbf9746942279ea5c4a7a7d3d0fdce4025 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 13 Jul 2023 18:59:50 -0400 Subject: [PATCH 04/15] fix scale Signed-off-by: Jinzhe Zeng --- source/lmp/pair_deepmd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index 2c0103af70..ceb5e69399 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -1172,7 +1172,7 @@ void PairDeepMD::coeff(int narg, char **arg) { for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo, i); j <= jhi; j++) { setflag[i][j] = 1; - scale[i][j] = 1.0; + scale[i][j] = conversion_factor; if (i > numb_types || j > numb_types) { char warning_msg[1024]; sprintf(warning_msg, @@ -1219,7 +1219,7 @@ double PairDeepMD::init_one(int i, int j) { } if (setflag[i][j] == 0) { - scale[i][j] = 1.0; + scale[i][j] = conversion_factor; } scale[j][i] = scale[i][j]; From 2befd233e443503beeac1ac738f1130019cb2fbe Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 31 Aug 2023 17:19:08 -0400 Subject: [PATCH 05/15] merge; fix timestep Signed-off-by: Jinzhe Zeng --- source/lmp/pair_deepmd.cpp | 70 +++++++++++++++++---------------- source/lmp/tests/test_lammps.py | 22 ++++++++--- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index 4aba07a2fb..6a1bb8154c 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -585,7 +585,7 @@ void PairDeepMD::compute(int eflag, int vflag) { } if (eflag_atom) { for (int ii = 0; ii < nlocal; ++ii) { - eatom[ii] += scale[1][1] * deatom[ii]; + eatom[ii] += conversion_factor * deatom[ii]; } } // Added by Davide Tisi 2020 @@ -599,15 +599,15 @@ void PairDeepMD::compute(int eflag, int vflag) { // vatom[ii][3] += 1.0 * dvatom[9*ii+3]; // vatom[ii][4] += 1.0 * dvatom[9*ii+6]; // vatom[ii][5] += 1.0 * dvatom[9*ii+7]; - cvatom[ii][0] += scale[1][1] * dvatom[9 * ii + 0]; // xx - cvatom[ii][1] += scale[1][1] * dvatom[9 * ii + 4]; // yy - cvatom[ii][2] += scale[1][1] * dvatom[9 * ii + 8]; // zz - cvatom[ii][3] += scale[1][1] * dvatom[9 * ii + 3]; // xy - cvatom[ii][4] += scale[1][1] * dvatom[9 * ii + 6]; // xz - cvatom[ii][5] += scale[1][1] * dvatom[9 * ii + 7]; // yz - cvatom[ii][6] += scale[1][1] * dvatom[9 * ii + 1]; // yx - cvatom[ii][7] += scale[1][1] * dvatom[9 * ii + 2]; // zx - cvatom[ii][8] += scale[1][1] * dvatom[9 * ii + 5]; // zy + cvatom[ii][0] += conversion_factor * dvatom[9 * ii + 0]; // xx + cvatom[ii][1] += conversion_factor * dvatom[9 * ii + 4]; // yy + cvatom[ii][2] += conversion_factor * dvatom[9 * ii + 8]; // zz + cvatom[ii][3] += conversion_factor * dvatom[9 * ii + 3]; // xy + cvatom[ii][4] += conversion_factor * dvatom[9 * ii + 6]; // xz + cvatom[ii][5] += conversion_factor * dvatom[9 * ii + 7]; // yz + cvatom[ii][6] += conversion_factor * dvatom[9 * ii + 1]; // yx + cvatom[ii][7] += conversion_factor * dvatom[9 * ii + 2]; // zx + cvatom[ii][8] += conversion_factor * dvatom[9 * ii + 5]; // zy } } } @@ -637,7 +637,7 @@ void PairDeepMD::compute(int eflag, int vflag) { dvatom = all_atom_virial[0]; if (eflag_atom) { for (int ii = 0; ii < nlocal; ++ii) { - eatom[ii] += scale[1][1] * deatom[ii]; + eatom[ii] += conversion_factor * deatom[ii]; } } // Added by Davide Tisi 2020 @@ -651,15 +651,15 @@ void PairDeepMD::compute(int eflag, int vflag) { // vatom[ii][3] += 1.0 * dvatom[9*ii+3]; // vatom[ii][4] += 1.0 * dvatom[9*ii+6]; // vatom[ii][5] += 1.0 * dvatom[9*ii+7]; - cvatom[ii][0] += scale[1][1] * dvatom[9 * ii + 0]; // xx - cvatom[ii][1] += scale[1][1] * dvatom[9 * ii + 4]; // yy - cvatom[ii][2] += scale[1][1] * dvatom[9 * ii + 8]; // zz - cvatom[ii][3] += scale[1][1] * dvatom[9 * ii + 3]; // xy - cvatom[ii][4] += scale[1][1] * dvatom[9 * ii + 6]; // xz - cvatom[ii][5] += scale[1][1] * dvatom[9 * ii + 7]; // yz - cvatom[ii][6] += scale[1][1] * dvatom[9 * ii + 1]; // yx - cvatom[ii][7] += scale[1][1] * dvatom[9 * ii + 2]; // zx - cvatom[ii][8] += scale[1][1] * dvatom[9 * ii + 5]; // zy + cvatom[ii][0] += conversion_factor * dvatom[9 * ii + 0]; // xx + cvatom[ii][1] += conversion_factor * dvatom[9 * ii + 4]; // yy + cvatom[ii][2] += conversion_factor * dvatom[9 * ii + 8]; // zz + cvatom[ii][3] += conversion_factor * dvatom[9 * ii + 3]; // xy + cvatom[ii][4] += conversion_factor * dvatom[9 * ii + 6]; // xz + cvatom[ii][5] += conversion_factor * dvatom[9 * ii + 7]; // yz + cvatom[ii][6] += conversion_factor * dvatom[9 * ii + 1]; // yx + cvatom[ii][7] += conversion_factor * dvatom[9 * ii + 2]; // zx + cvatom[ii][8] += conversion_factor * dvatom[9 * ii + 5]; // zy } } if (out_freq > 0 && update->ntimestep % out_freq == 0) { @@ -783,7 +783,7 @@ void PairDeepMD::compute(int eflag, int vflag) { if (!atom->sp_flag) { for (int ii = 0; ii < nall; ++ii) { for (int dd = 0; dd < 3; ++dd) { - f[ii][dd] += scale[1][1] * dforce[3 * ii + dd]; + f[ii][dd] += conversion_factor * dforce[3 * ii + dd]; } } } else { @@ -792,12 +792,14 @@ void PairDeepMD::compute(int eflag, int vflag) { for (int ii = 0; ii < nall; ++ii) { for (int dd = 0; dd < 3; ++dd) { int new_idx = new_idx_map[ii]; - f[ii][dd] += scale[1][1] * dforce[3 * new_idx + dd]; + f[ii][dd] += conversion_factor * dforce[3 * new_idx + dd]; if (dtype[ii] < numb_types_spin && ii < nlocal) { - fm[ii][dd] += scale[1][1] * dforce[3 * (new_idx + nlocal) + dd] / + fm[ii][dd] += conversion_factor * + dforce[3 * (new_idx + nlocal) + dd] / (hbar / spin_norm[dtype[ii]]); } else if (dtype[ii] < numb_types_spin) { - fm[ii][dd] += scale[1][1] * dforce[3 * (new_idx + nghost) + dd] / + fm[ii][dd] += conversion_factor * + dforce[3 * (new_idx + nghost) + dd] / (hbar / spin_norm[dtype[ii]]); } } @@ -812,15 +814,15 @@ void PairDeepMD::compute(int eflag, int vflag) { // accumulate energy and virial if (eflag) { - eng_vdwl += scale[1][1] * dener; + eng_vdwl += conversion_factor * dener; } if (vflag) { - virial[0] += 1.0 * dvirial[0] * scale[1][1]; - virial[1] += 1.0 * dvirial[4] * scale[1][1]; - virial[2] += 1.0 * dvirial[8] * scale[1][1]; - virial[3] += 1.0 * dvirial[3] * scale[1][1]; - virial[4] += 1.0 * dvirial[6] * scale[1][1]; - virial[5] += 1.0 * dvirial[7] * scale[1][1]; + virial[0] += 1.0 * dvirial[0] * conversion_factor; + virial[1] += 1.0 * dvirial[4] * conversion_factor; + virial[2] += 1.0 * dvirial[8] * conversion_factor; + virial[3] += 1.0 * dvirial[3] * conversion_factor; + virial[4] += 1.0 * dvirial[6] * conversion_factor; + virial[5] += 1.0 * dvirial[7] * conversion_factor; } } @@ -847,7 +849,7 @@ void PairDeepMD::allocate() { continue; } setflag[i][j] = 1; - scale[i][j] = conversion_factor; + scale[i][j] = 1; } } } @@ -1183,7 +1185,7 @@ void PairDeepMD::coeff(int narg, char **arg) { for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo, i); j <= jhi; j++) { setflag[i][j] = 1; - scale[i][j] = conversion_factor; + scale[i][j] = 1.0; if (i > numb_types || j > numb_types) { char warning_msg[1024]; sprintf(warning_msg, @@ -1230,7 +1232,7 @@ double PairDeepMD::init_one(int i, int j) { } if (setflag[i][j] == 0) { - scale[i][j] = conversion_factor; + scale[i][j] = 1.0; } scale[j][i] = scale[i][j]; diff --git a/source/lmp/tests/test_lammps.py b/source/lmp/tests/test_lammps.py index 1f34ed5fc0..ba1743f1a1 100644 --- a/source/lmp/tests/test_lammps.py +++ b/source/lmp/tests/test_lammps.py @@ -255,7 +255,12 @@ def _lammps(data_file, units="metal") -> PyLammps: lammps.read_data(data_file.resolve()) lammps.mass("1 16") lammps.mass("2 2") - lammps.timestep(0.0005) + if units == "metal": + lammps.timestep(0.0005) + elif units == "real": + lammps.timestep(0.5) + else: + raise ValueError("units should be metal or real") lammps.fix("1 all nve") return lammps @@ -276,7 +281,9 @@ def lammps_type_map(): @pytest.fixture def lammps_real(): - yield _lammps(data_file=data_file, units="real") + lmp = _lammps(data_file=data_file, units="real") + yield lmp + lmp.close() def test_pair_deepmd(lammps): @@ -466,7 +473,9 @@ def test_pair_deepmd_real(lammps_real): lammps_real.run(0) assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) for ii in range(6): - assert lammps_real.atoms[ii].force == pytest.approx(expected_f[ii] * metal2real) + assert lammps_type_map.atoms[ii].force == pytest.approx( + expected_f[lammps_type_map.atoms[ii].id - 1] * metal2real + ) lammps_real.run(1) @@ -483,8 +492,11 @@ def test_pair_deepmd_virial_real(lammps_real): lammps_real.run(0) assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) for ii in range(6): - assert lammps_real.atoms[ii].force == pytest.approx(expected_f[ii] * metal2real) + assert lammps_type_map.atoms[ii].force == pytest.approx( + expected_f[lammps_type_map.atoms[ii].id - 1] * metal2real + ) + idx_map = lammps.lmp.numpy.extract_atom("id") - 1 for ii in range(9): assert np.array( lammps_real.variables[f"virial{ii}"].value - ) / nktv2p == pytest.approx(expected_v[:, ii] * metal2real) + ) / nktv2p == pytest.approx(expected_v[idx_map, ii] * metal2real) From 4d78282ebd0ee955764b136e19fc275ef67a4791 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 31 Aug 2023 17:30:48 -0400 Subject: [PATCH 06/15] do not declare Signed-off-by: Jinzhe Zeng --- source/lmp/pair_deepmd.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index 6a1bb8154c..f342fed69f 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -354,8 +354,7 @@ PairDeepMD::PairDeepMD(LAMMPS *lmp) "Pair deepmd requires metal or real unit, please set it by " "\"units metal\" or \"units real\""); } - double conversion_factor = - utils::get_conversion_factor(utils::ENERGY, unit_convert); + conversion_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); restartinfo = 1; #if LAMMPS_VERSION_NUMBER >= 20201130 centroidstressflag = From b2828da5395efe0ab290dbeda74d7bf4f4ca464e Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 31 Aug 2023 20:26:46 -0400 Subject: [PATCH 07/15] == -> = Signed-off-by: Jinzhe Zeng --- source/lmp/pair_deepmd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index f342fed69f..88e6701e79 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -346,9 +346,9 @@ PairDeepMD::PairDeepMD(LAMMPS *lmp) } int unit_convert; if (strcmp(update->unit_style, "metal") == 0) { - unit_convert == utils::NOCONVERT; + unit_convert = utils::NOCONVERT; } else if (strcmp(update->unit_style, "real") == 0) { - unit_convert == utils::METAL2REAL; + unit_convert = utils::METAL2REAL; } else { error->all(FLERR, "Pair deepmd requires metal or real unit, please set it by " From faf8d4ba91456df060fbcc826c12e1c81f041b95 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 31 Aug 2023 20:38:53 -0400 Subject: [PATCH 08/15] fix typo Signed-off-by: Jinzhe Zeng --- source/lmp/tests/test_lammps.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/lmp/tests/test_lammps.py b/source/lmp/tests/test_lammps.py index ba1743f1a1..b5904cff28 100644 --- a/source/lmp/tests/test_lammps.py +++ b/source/lmp/tests/test_lammps.py @@ -473,8 +473,8 @@ def test_pair_deepmd_real(lammps_real): lammps_real.run(0) assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) for ii in range(6): - assert lammps_type_map.atoms[ii].force == pytest.approx( - expected_f[lammps_type_map.atoms[ii].id - 1] * metal2real + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * metal2real ) lammps_real.run(1) @@ -492,8 +492,8 @@ def test_pair_deepmd_virial_real(lammps_real): lammps_real.run(0) assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) for ii in range(6): - assert lammps_type_map.atoms[ii].force == pytest.approx( - expected_f[lammps_type_map.atoms[ii].id - 1] * metal2real + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * metal2real ) idx_map = lammps.lmp.numpy.extract_atom("id") - 1 for ii in range(9): From eff76798f25eeed700b0e1089c3bd1a77ceef8a8 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 31 Aug 2023 20:49:12 -0400 Subject: [PATCH 09/15] fix typo Signed-off-by: Jinzhe Zeng --- source/lmp/tests/test_lammps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/lmp/tests/test_lammps.py b/source/lmp/tests/test_lammps.py index b5904cff28..e927a1608e 100644 --- a/source/lmp/tests/test_lammps.py +++ b/source/lmp/tests/test_lammps.py @@ -495,7 +495,7 @@ def test_pair_deepmd_virial_real(lammps_real): assert lammps_real.atoms[ii].force == pytest.approx( expected_f[lammps_real.atoms[ii].id - 1] * metal2real ) - idx_map = lammps.lmp.numpy.extract_atom("id") - 1 + idx_map = lammps_real.lmp.numpy.extract_atom("id") - 1 for ii in range(9): assert np.array( lammps_real.variables[f"virial{ii}"].value From bf4c69262d6c09648185bd183501be859e04d3a5 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 31 Aug 2023 21:26:27 -0400 Subject: [PATCH 10/15] nktv2p_real Signed-off-by: Jinzhe Zeng --- source/lmp/tests/test_lammps.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/lmp/tests/test_lammps.py b/source/lmp/tests/test_lammps.py index e927a1608e..1fbee6c7c4 100644 --- a/source/lmp/tests/test_lammps.py +++ b/source/lmp/tests/test_lammps.py @@ -217,6 +217,7 @@ # https://github.com/lammps/lammps/blob/1e1311cf401c5fc2614b5d6d0ff3230642b76597/src/update.cpp#L193 nktv2p = 1.6021765e6 +nktv2p_real = 68568.415 metal2real = 23.060549 sp.check_output( @@ -499,4 +500,4 @@ def test_pair_deepmd_virial_real(lammps_real): for ii in range(9): assert np.array( lammps_real.variables[f"virial{ii}"].value - ) / nktv2p == pytest.approx(expected_v[idx_map, ii] * metal2real) + ) / nktv2p_real == pytest.approx(expected_v[idx_map, ii] * metal2real) From dd078e37a27b8715eecfc899971f518934892a17 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 31 Aug 2023 23:29:45 -0400 Subject: [PATCH 11/15] keep scale; rename conversion_factor --- source/lmp/pair_deepmd.cpp | 70 +++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index 88e6701e79..10e5a05654 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -354,7 +354,7 @@ PairDeepMD::PairDeepMD(LAMMPS *lmp) "Pair deepmd requires metal or real unit, please set it by " "\"units metal\" or \"units real\""); } - conversion_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); + ener_unit_cvt_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); restartinfo = 1; #if LAMMPS_VERSION_NUMBER >= 20201130 centroidstressflag = @@ -584,7 +584,7 @@ void PairDeepMD::compute(int eflag, int vflag) { } if (eflag_atom) { for (int ii = 0; ii < nlocal; ++ii) { - eatom[ii] += conversion_factor * deatom[ii]; + eatom[ii] += scale[1][1] * deatom[ii]; } } // Added by Davide Tisi 2020 @@ -598,15 +598,15 @@ void PairDeepMD::compute(int eflag, int vflag) { // vatom[ii][3] += 1.0 * dvatom[9*ii+3]; // vatom[ii][4] += 1.0 * dvatom[9*ii+6]; // vatom[ii][5] += 1.0 * dvatom[9*ii+7]; - cvatom[ii][0] += conversion_factor * dvatom[9 * ii + 0]; // xx - cvatom[ii][1] += conversion_factor * dvatom[9 * ii + 4]; // yy - cvatom[ii][2] += conversion_factor * dvatom[9 * ii + 8]; // zz - cvatom[ii][3] += conversion_factor * dvatom[9 * ii + 3]; // xy - cvatom[ii][4] += conversion_factor * dvatom[9 * ii + 6]; // xz - cvatom[ii][5] += conversion_factor * dvatom[9 * ii + 7]; // yz - cvatom[ii][6] += conversion_factor * dvatom[9 * ii + 1]; // yx - cvatom[ii][7] += conversion_factor * dvatom[9 * ii + 2]; // zx - cvatom[ii][8] += conversion_factor * dvatom[9 * ii + 5]; // zy + cvatom[ii][0] += scale[1][1] * dvatom[9 * ii + 0]; // xx + cvatom[ii][1] += scale[1][1] * dvatom[9 * ii + 4]; // yy + cvatom[ii][2] += scale[1][1] * dvatom[9 * ii + 8]; // zz + cvatom[ii][3] += scale[1][1] * dvatom[9 * ii + 3]; // xy + cvatom[ii][4] += scale[1][1] * dvatom[9 * ii + 6]; // xz + cvatom[ii][5] += scale[1][1] * dvatom[9 * ii + 7]; // yz + cvatom[ii][6] += scale[1][1] * dvatom[9 * ii + 1]; // yx + cvatom[ii][7] += scale[1][1] * dvatom[9 * ii + 2]; // zx + cvatom[ii][8] += scale[1][1] * dvatom[9 * ii + 5]; // zy } } } @@ -636,7 +636,7 @@ void PairDeepMD::compute(int eflag, int vflag) { dvatom = all_atom_virial[0]; if (eflag_atom) { for (int ii = 0; ii < nlocal; ++ii) { - eatom[ii] += conversion_factor * deatom[ii]; + eatom[ii] += scale[1][1] * deatom[ii]; } } // Added by Davide Tisi 2020 @@ -650,15 +650,15 @@ void PairDeepMD::compute(int eflag, int vflag) { // vatom[ii][3] += 1.0 * dvatom[9*ii+3]; // vatom[ii][4] += 1.0 * dvatom[9*ii+6]; // vatom[ii][5] += 1.0 * dvatom[9*ii+7]; - cvatom[ii][0] += conversion_factor * dvatom[9 * ii + 0]; // xx - cvatom[ii][1] += conversion_factor * dvatom[9 * ii + 4]; // yy - cvatom[ii][2] += conversion_factor * dvatom[9 * ii + 8]; // zz - cvatom[ii][3] += conversion_factor * dvatom[9 * ii + 3]; // xy - cvatom[ii][4] += conversion_factor * dvatom[9 * ii + 6]; // xz - cvatom[ii][5] += conversion_factor * dvatom[9 * ii + 7]; // yz - cvatom[ii][6] += conversion_factor * dvatom[9 * ii + 1]; // yx - cvatom[ii][7] += conversion_factor * dvatom[9 * ii + 2]; // zx - cvatom[ii][8] += conversion_factor * dvatom[9 * ii + 5]; // zy + cvatom[ii][0] += scale[1][1] * dvatom[9 * ii + 0]; // xx + cvatom[ii][1] += scale[1][1] * dvatom[9 * ii + 4]; // yy + cvatom[ii][2] += scale[1][1] * dvatom[9 * ii + 8]; // zz + cvatom[ii][3] += scale[1][1] * dvatom[9 * ii + 3]; // xy + cvatom[ii][4] += scale[1][1] * dvatom[9 * ii + 6]; // xz + cvatom[ii][5] += scale[1][1] * dvatom[9 * ii + 7]; // yz + cvatom[ii][6] += scale[1][1] * dvatom[9 * ii + 1]; // yx + cvatom[ii][7] += scale[1][1] * dvatom[9 * ii + 2]; // zx + cvatom[ii][8] += scale[1][1] * dvatom[9 * ii + 5]; // zy } } if (out_freq > 0 && update->ntimestep % out_freq == 0) { @@ -782,7 +782,7 @@ void PairDeepMD::compute(int eflag, int vflag) { if (!atom->sp_flag) { for (int ii = 0; ii < nall; ++ii) { for (int dd = 0; dd < 3; ++dd) { - f[ii][dd] += conversion_factor * dforce[3 * ii + dd]; + f[ii][dd] += scale[1][1] * dforce[3 * ii + dd]; } } } else { @@ -791,13 +791,13 @@ void PairDeepMD::compute(int eflag, int vflag) { for (int ii = 0; ii < nall; ++ii) { for (int dd = 0; dd < 3; ++dd) { int new_idx = new_idx_map[ii]; - f[ii][dd] += conversion_factor * dforce[3 * new_idx + dd]; + f[ii][dd] += scale[1][1] * dforce[3 * new_idx + dd]; if (dtype[ii] < numb_types_spin && ii < nlocal) { - fm[ii][dd] += conversion_factor * + fm[ii][dd] += scale[1][1] * dforce[3 * (new_idx + nlocal) + dd] / (hbar / spin_norm[dtype[ii]]); } else if (dtype[ii] < numb_types_spin) { - fm[ii][dd] += conversion_factor * + fm[ii][dd] += scale[1][1] * dforce[3 * (new_idx + nghost) + dd] / (hbar / spin_norm[dtype[ii]]); } @@ -813,15 +813,15 @@ void PairDeepMD::compute(int eflag, int vflag) { // accumulate energy and virial if (eflag) { - eng_vdwl += conversion_factor * dener; + eng_vdwl += scale[1][1] * dener; } if (vflag) { - virial[0] += 1.0 * dvirial[0] * conversion_factor; - virial[1] += 1.0 * dvirial[4] * conversion_factor; - virial[2] += 1.0 * dvirial[8] * conversion_factor; - virial[3] += 1.0 * dvirial[3] * conversion_factor; - virial[4] += 1.0 * dvirial[6] * conversion_factor; - virial[5] += 1.0 * dvirial[7] * conversion_factor; + virial[0] += 1.0 * dvirial[0] * scale[1][1]; + virial[1] += 1.0 * dvirial[4] * scale[1][1]; + virial[2] += 1.0 * dvirial[8] * scale[1][1]; + virial[3] += 1.0 * dvirial[3] * scale[1][1]; + virial[4] += 1.0 * dvirial[6] * scale[1][1]; + virial[5] += 1.0 * dvirial[7] * scale[1][1]; } } @@ -848,7 +848,7 @@ void PairDeepMD::allocate() { continue; } setflag[i][j] = 1; - scale[i][j] = 1; + scale[i][j] = 1.0 * ener_unit_cvt_factor; } } } @@ -1184,7 +1184,7 @@ void PairDeepMD::coeff(int narg, char **arg) { for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo, i); j <= jhi; j++) { setflag[i][j] = 1; - scale[i][j] = 1.0; + scale[i][j] = 1.0 * ener_unit_cvt_factor; if (i > numb_types || j > numb_types) { char warning_msg[1024]; sprintf(warning_msg, @@ -1231,7 +1231,7 @@ double PairDeepMD::init_one(int i, int j) { } if (setflag[i][j] == 0) { - scale[i][j] = 1.0; + scale[i][j] = 1.0 * ener_unit_cvt_factor; } scale[j][i] = scale[i][j]; From dba21a39803be76cf14f7980889c74891fe70874 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 03:30:10 +0000 Subject: [PATCH 12/15] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/lmp/pair_deepmd.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index 10e5a05654..11f7a2d1c8 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -354,7 +354,8 @@ PairDeepMD::PairDeepMD(LAMMPS *lmp) "Pair deepmd requires metal or real unit, please set it by " "\"units metal\" or \"units real\""); } - ener_unit_cvt_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); + ener_unit_cvt_factor = + utils::get_conversion_factor(utils::ENERGY, unit_convert); restartinfo = 1; #if LAMMPS_VERSION_NUMBER >= 20201130 centroidstressflag = @@ -793,12 +794,10 @@ void PairDeepMD::compute(int eflag, int vflag) { int new_idx = new_idx_map[ii]; f[ii][dd] += scale[1][1] * dforce[3 * new_idx + dd]; if (dtype[ii] < numb_types_spin && ii < nlocal) { - fm[ii][dd] += scale[1][1] * - dforce[3 * (new_idx + nlocal) + dd] / + fm[ii][dd] += scale[1][1] * dforce[3 * (new_idx + nlocal) + dd] / (hbar / spin_norm[dtype[ii]]); } else if (dtype[ii] < numb_types_spin) { - fm[ii][dd] += scale[1][1] * - dforce[3 * (new_idx + nghost) + dd] / + fm[ii][dd] += scale[1][1] * dforce[3 * (new_idx + nghost) + dd] / (hbar / spin_norm[dtype[ii]]); } } From a7b8b878a19caed3cb986be5ec57d0511a95deb7 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Thu, 31 Aug 2023 23:30:59 -0400 Subject: [PATCH 13/15] update the header file --- source/lmp/pair_deepmd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/lmp/pair_deepmd.h b/source/lmp/pair_deepmd.h index b2a9832745..e811bc99b9 100644 --- a/source/lmp/pair_deepmd.h +++ b/source/lmp/pair_deepmd.h @@ -131,7 +131,7 @@ class PairDeepMD : public Pair { tagint *tagsend, *tagrecv; double *stdfsend, *stdfrecv; std::vector type_idx_map; - double conversion_factor; + double ener_unit_cvt_factor; }; } // namespace LAMMPS_NS From 40e4c8630e5f79d4489adf16722af20bd76803b0 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Fri, 1 Sep 2023 01:47:19 -0400 Subject: [PATCH 14/15] convert model deviation --- source/lmp/pair_deepmd.cpp | 12 ++- source/lmp/tests/test_lammps.py | 134 ++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 3 deletions(-) diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index 11f7a2d1c8..f285bed8ea 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -728,6 +728,12 @@ void PairDeepMD::compute(int eflag, int vflag) { all_v_avg = sqrt(all_v_avg / 9); } if (rank == 0) { + all_v_max *= scale[1][1]; + all_v_min *= scale[1][1]; + all_v_avg *= scale[1][1]; + all_f_max *= scale[1][1]; + all_f_min *= scale[1][1]; + all_f_avg *= scale[1][1]; fp << setw(12) << update->ntimestep << " " << setw(18) << all_v_max << " " << setw(18) << all_v_min << " " << setw(18) << all_v_avg << " " << setw(18) << all_f_max << " " << setw(18) << all_f_min @@ -753,7 +759,7 @@ void PairDeepMD::compute(int eflag, int vflag) { displacements, MPI_DOUBLE, 0, world); if (rank == 0) { for (int dd = 0; dd < all_nlocal; ++dd) { - std_f_all[tagrecv[dd] - 1] = stdfrecv[dd]; + std_f_all[tagrecv[dd] - 1] = stdfrecv[dd] * scale[1][1]; } for (int dd = 0; dd < all_nlocal; ++dd) { fp << " " << setw(18) << std_f_all[dd]; @@ -1007,11 +1013,11 @@ void PairDeepMD::settings(int narg, char **arg) { iarg += 1; } else if (string(arg[iarg]) == string("relative")) { out_rel = 1; - eps = atof(arg[iarg + 1]); + eps = atof(arg[iarg + 1]) / ener_unit_cvt_factor; iarg += 2; } else if (string(arg[iarg]) == string("relative_v")) { out_rel_v = 1; - eps_v = atof(arg[iarg + 1]); + eps_v = atof(arg[iarg + 1]) / ener_unit_cvt_factor; iarg += 2; } else if (string(arg[iarg]) == string("virtual_len")) { virtual_len.resize(numb_types_spin); diff --git a/source/lmp/tests/test_lammps.py b/source/lmp/tests/test_lammps.py index 1fbee6c7c4..98fe258142 100644 --- a/source/lmp/tests/test_lammps.py +++ b/source/lmp/tests/test_lammps.py @@ -501,3 +501,137 @@ def test_pair_deepmd_virial_real(lammps_real): assert np.array( lammps_real.variables[f"virial{ii}"].value ) / nktv2p_real == pytest.approx(expected_v[idx_map, ii] * metal2real) + + +def test_pair_deepmd_model_devi_real(lammps_real): + lammps_real.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve() + ) + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * metal2real) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v))) * metal2real) + + +def test_pair_deepmd_model_devi_virial_real(lammps_real): + lammps_real.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve() + ) + ) + lammps_real.pair_coeff("* *") + lammps_real.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps_real.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps_real.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * metal2real + ) + idx_map = lammps_real.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps_real.variables[f"virial{ii}"].value + ) / nktv2p_real == pytest.approx(expected_v[idx_map, ii] * metal2real) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * metal2real) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v))) * metal2real) + + +def test_pair_deepmd_model_devi_atomic_relative_real(lammps_real): + relative = 1.0 + lammps_real.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic relative {}".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve(), relative * metal2real + ) + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + assert md[7:] == pytest.approx(expected_md_f * metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * metal2real) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v))) * metal2real) + + +def test_pair_deepmd_model_devi_atomic_relative_v_real(lammps_real): + relative = 1.0 + lammps_real.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic relative_v {}".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve(), relative * metal2real + ) + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx(expected_e * metal2real) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * metal2real + ) + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + norm = ( + np.abs( + np.mean([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) + ) + / 6 + ) + expected_md_v /= norm + relative + assert md[1] == pytest.approx(np.max(expected_md_v) * metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * metal2real) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v))) * metal2real) \ No newline at end of file From 8a4222e970817274238489c792648742d21511da Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 05:47:43 +0000 Subject: [PATCH 15/15] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/lmp/tests/test_lammps.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/source/lmp/tests/test_lammps.py b/source/lmp/tests/test_lammps.py index 98fe258142..78eaf7ea4e 100644 --- a/source/lmp/tests/test_lammps.py +++ b/source/lmp/tests/test_lammps.py @@ -528,7 +528,9 @@ def test_pair_deepmd_model_devi_real(lammps_real): ) assert md[1] == pytest.approx(np.max(expected_md_v) * metal2real) assert md[2] == pytest.approx(np.min(expected_md_v) * metal2real) - assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v))) * metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * metal2real + ) def test_pair_deepmd_model_devi_virial_real(lammps_real): @@ -568,14 +570,19 @@ def test_pair_deepmd_model_devi_virial_real(lammps_real): ) assert md[1] == pytest.approx(np.max(expected_md_v) * metal2real) assert md[2] == pytest.approx(np.min(expected_md_v) * metal2real) - assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v))) * metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * metal2real + ) def test_pair_deepmd_model_devi_atomic_relative_real(lammps_real): relative = 1.0 lammps_real.pair_style( "deepmd {} {} out_file {} out_freq 1 atomic relative {}".format( - pb_file.resolve(), pb_file2.resolve(), md_file.resolve(), relative * metal2real + pb_file.resolve(), + pb_file2.resolve(), + md_file.resolve(), + relative * metal2real, ) ) lammps_real.pair_coeff("* *") @@ -599,14 +606,19 @@ def test_pair_deepmd_model_devi_atomic_relative_real(lammps_real): ) assert md[1] == pytest.approx(np.max(expected_md_v) * metal2real) assert md[2] == pytest.approx(np.min(expected_md_v) * metal2real) - assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v))) * metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * metal2real + ) def test_pair_deepmd_model_devi_atomic_relative_v_real(lammps_real): relative = 1.0 lammps_real.pair_style( "deepmd {} {} out_file {} out_freq 1 atomic relative_v {}".format( - pb_file.resolve(), pb_file2.resolve(), md_file.resolve(), relative * metal2real + pb_file.resolve(), + pb_file2.resolve(), + md_file.resolve(), + relative * metal2real, ) ) lammps_real.pair_coeff("* *") @@ -634,4 +646,6 @@ def test_pair_deepmd_model_devi_atomic_relative_v_real(lammps_real): expected_md_v /= norm + relative assert md[1] == pytest.approx(np.max(expected_md_v) * metal2real) assert md[2] == pytest.approx(np.min(expected_md_v) * metal2real) - assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v))) * metal2real) \ No newline at end of file + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * metal2real + )