From 2b5795fc0dc2dad3662efba4aad7eb0d1ea597cb Mon Sep 17 00:00:00 2001 From: MoseyQAQ Date: Sun, 2 Aug 2026 14:39:15 +0800 Subject: [PATCH 1/2] Fix JSON coordinate units --- docs/advanced/json/json_para.md | 4 ++-- source/source_io/module_json/init_info.cpp | 8 ++++---- source/source_io/module_json/output_info.cpp | 8 ++++---- .../source_io/module_json/test/para_json_test.cpp | 14 +++++++++++--- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/docs/advanced/json/json_para.md b/docs/advanced/json/json_para.md index 1ae86190fc..8f417ab6a9 100644 --- a/docs/advanced/json/json_para.md +++ b/docs/advanced/json/json_para.md @@ -64,7 +64,7 @@ An array of dicts, including information about each self-consistent field (SCF) - `force` - [array(array(double))] The forces calculated on each atom. Unit in eV/Angstrom. - `stress` - [array(array(double))] The stress tensor. Unit in Kbar. - `cell` - [array(array(double))] The cell parameters. Unit in Angstrom. -- `coordinate` - [array(array(double))] The coordinates of the atoms in the box after the simulation. +- `coordinate` - [array(array(double))] The coordinates of the atoms in the box after the simulation. Unit in Angstrom. - `total_mag` , `absolute_mag` , `mag` - [double] The total magnetic moment; total absolute magnetic moment; and a list of magnetic moments for each atom, respectively. - `scf_converge` - [bool] A boolean indicating whether the scf optimization has converged. - `scf` - [array(object(str:double)] A list of each scf step, each item contains: @@ -82,4 +82,4 @@ Parameters regarding the final converged results and the optimized geometry: - `coordinate` - [array(array(double))] The final atomic coordinates. - `relax_converge` - [bool] A boolean indicating whether the geometry optimization has converged. - `dos` - [array(array(array(double)))] The state energy, and the dimension is NSPIN\*NKPOINT\*NBAND. -- `dos_weight` - [array(array(array(double)))] The weight of each state, and the dimension is same as `dos`. \ No newline at end of file +- `dos_weight` - [array(array(array(double)))] The weight of each state, and the dimension is same as `dos`. diff --git a/source/source_io/module_json/init_info.cpp b/source/source_io/module_json/init_info.cpp index 647df761bb..7db09fe425 100644 --- a/source/source_io/module_json/init_info.cpp +++ b/source/source_io/module_json/init_info.cpp @@ -98,7 +98,7 @@ void gen_stru(UnitCell* ucell) } // atom coordinate, mag and label - double lat0 = ucell->lat0; + const double lat0_angstrom = ucell->lat0_angstrom; std::string* label = ucell->atom_label.data(); for (int i = 0; i < ntype; i++) { @@ -107,9 +107,9 @@ void gen_stru(UnitCell* ucell) for (int j = 0; j < na; j++) { Json::jsonValue coordinateArray(JarrayType); - coordinateArray.JPushBack(tau[j][0] * lat0); - coordinateArray.JPushBack(tau[j][1] * lat0); - coordinateArray.JPushBack(tau[j][2] * lat0); + coordinateArray.JPushBack(tau[j][0] * lat0_angstrom); + coordinateArray.JPushBack(tau[j][1] * lat0_angstrom); + coordinateArray.JPushBack(tau[j][2] * lat0_angstrom); Json::AbacusJson::add_json({"init", "coordinate"}, coordinateArray, true); // Json::AbacusJson::add_Json(coordinateArray,true,"init","coordinate"); diff --git a/source/source_io/module_json/output_info.cpp b/source/source_io/module_json/output_info.cpp index 0789bf67f5..ba9ff0dddd 100644 --- a/source/source_io/module_json/output_info.cpp +++ b/source/source_io/module_json/output_info.cpp @@ -92,15 +92,15 @@ namespace Json } //add coordinate int ntype = ucell->ntype; - double lat0 = ucell->lat0; + const double lat0_angstrom = ucell->lat0_angstrom; for(int i=0;i* tau = ucell->atoms[i].tau.data(); int na = ucell->atoms[i].na; for(int j=0;jatoms[i].mag[j],true); } diff --git a/source/source_io/module_json/test/para_json_test.cpp b/source/source_io/module_json/test/para_json_test.cpp index 1c1012b56f..a88095333a 100644 --- a/source/source_io/module_json/test/para_json_test.cpp +++ b/source/source_io/module_json/test/para_json_test.cpp @@ -7,6 +7,7 @@ #include "source_io/module_json/readin_info.h" #include "source_io/module_parameter/parameter.h" #include "source_io/module_json/para_json.h" +#include "source_base/constants.h" #include "source_base/version.h" #undef private /************************************************ @@ -326,6 +327,7 @@ TEST(AbacusJsonTest, Init_stru_test) ucell.atoms = atomlist; ucell.atom_label.resize(1); ucell.lat0 = lat0; + ucell.lat0_angstrom = lat0 * ModuleBase::BOHR_TO_A; ModuleBase::Vector3 tau[2]; @@ -364,9 +366,15 @@ TEST(AbacusJsonTest, Init_stru_test) ASSERT_EQ(Json::AbacusJson::doc["init"]["coordinate"][0][1].GetDouble(), 0); ASSERT_EQ(Json::AbacusJson::doc["init"]["coordinate"][0][2].GetDouble(), 0); - ASSERT_EQ(Json::AbacusJson::doc["init"]["coordinate"][1][0].GetDouble(), 1.0); - ASSERT_EQ(Json::AbacusJson::doc["init"]["coordinate"][1][1].GetDouble(), 1.0); - ASSERT_EQ(Json::AbacusJson::doc["init"]["coordinate"][1][2].GetDouble(), 1.0); + EXPECT_NEAR(Json::AbacusJson::doc["init"]["coordinate"][1][0].GetDouble(), + ModuleBase::BOHR_TO_A, + 1.0e-12); + EXPECT_NEAR(Json::AbacusJson::doc["init"]["coordinate"][1][1].GetDouble(), + ModuleBase::BOHR_TO_A, + 1.0e-12); + EXPECT_NEAR(Json::AbacusJson::doc["init"]["coordinate"][1][2].GetDouble(), + ModuleBase::BOHR_TO_A, + 1.0e-12); ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][0][0].GetDouble(), 0.1); ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][0][1].GetDouble(), 0.1); From b746b87c269f9ede18eafdb8ccafcf040c5e5f98 Mon Sep 17 00:00:00 2001 From: MoseyQAQ Date: Sun, 2 Aug 2026 15:37:49 +0800 Subject: [PATCH 2/2] Fix JSON cell units --- docs/advanced/json/json_para.md | 2 +- source/source_io/module_json/init_info.cpp | 18 ++++++++--------- source/source_io/module_json/output_info.cpp | 18 ++++++++--------- .../module_json/test/para_json_test.cpp | 20 +++++++++---------- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/docs/advanced/json/json_para.md b/docs/advanced/json/json_para.md index 8f417ab6a9..36e5cbebc9 100644 --- a/docs/advanced/json/json_para.md +++ b/docs/advanced/json/json_para.md @@ -82,4 +82,4 @@ Parameters regarding the final converged results and the optimized geometry: - `coordinate` - [array(array(double))] The final atomic coordinates. - `relax_converge` - [bool] A boolean indicating whether the geometry optimization has converged. - `dos` - [array(array(array(double)))] The state energy, and the dimension is NSPIN\*NKPOINT\*NBAND. -- `dos_weight` - [array(array(array(double)))] The weight of each state, and the dimension is same as `dos`. +- `dos_weight` - [array(array(array(double)))] The weight of each state, and the dimension is same as `dos`. \ No newline at end of file diff --git a/source/source_io/module_json/init_info.cpp b/source/source_io/module_json/init_info.cpp index 7db09fe425..83ff731c1e 100644 --- a/source/source_io/module_json/init_info.cpp +++ b/source/source_io/module_json/init_info.cpp @@ -128,15 +128,15 @@ void gen_stru(UnitCell* ucell) Json::jsonValue cellArray1(JarrayType); Json::jsonValue cellArray2(JarrayType); Json::jsonValue cellArray3(JarrayType); - cellArray1.JPushBack(ucell->latvec.e11); - cellArray1.JPushBack(ucell->latvec.e12); - cellArray1.JPushBack(ucell->latvec.e13); - cellArray2.JPushBack(ucell->latvec.e21); - cellArray2.JPushBack(ucell->latvec.e22); - cellArray2.JPushBack(ucell->latvec.e23); - cellArray3.JPushBack(ucell->latvec.e31); - cellArray3.JPushBack(ucell->latvec.e32); - cellArray3.JPushBack(ucell->latvec.e33); + cellArray1.JPushBack(ucell->latvec.e11 * lat0_angstrom); + cellArray1.JPushBack(ucell->latvec.e12 * lat0_angstrom); + cellArray1.JPushBack(ucell->latvec.e13 * lat0_angstrom); + cellArray2.JPushBack(ucell->latvec.e21 * lat0_angstrom); + cellArray2.JPushBack(ucell->latvec.e22 * lat0_angstrom); + cellArray2.JPushBack(ucell->latvec.e23 * lat0_angstrom); + cellArray3.JPushBack(ucell->latvec.e31 * lat0_angstrom); + cellArray3.JPushBack(ucell->latvec.e32 * lat0_angstrom); + cellArray3.JPushBack(ucell->latvec.e33 * lat0_angstrom); Json::AbacusJson::add_json({"init", "cell"}, cellArray1, true); Json::AbacusJson::add_json({"init", "cell"}, cellArray2, true); Json::AbacusJson::add_json({"init", "cell"}, cellArray3, true); diff --git a/source/source_io/module_json/output_info.cpp b/source/source_io/module_json/output_info.cpp index ba9ff0dddd..aa6d60aef1 100644 --- a/source/source_io/module_json/output_info.cpp +++ b/source/source_io/module_json/output_info.cpp @@ -111,15 +111,15 @@ namespace Json Json::jsonValue cellArray1(JarrayType); Json::jsonValue cellArray2(JarrayType); Json::jsonValue cellArray3(JarrayType); - cellArray1.JPushBack(ucell->latvec.e11); - cellArray1.JPushBack(ucell->latvec.e12); - cellArray1.JPushBack(ucell->latvec.e13); - cellArray2.JPushBack(ucell->latvec.e21); - cellArray2.JPushBack(ucell->latvec.e22); - cellArray2.JPushBack(ucell->latvec.e23); - cellArray3.JPushBack(ucell->latvec.e31); - cellArray3.JPushBack(ucell->latvec.e32); - cellArray3.JPushBack(ucell->latvec.e33); + cellArray1.JPushBack(ucell->latvec.e11 * lat0_angstrom); + cellArray1.JPushBack(ucell->latvec.e12 * lat0_angstrom); + cellArray1.JPushBack(ucell->latvec.e13 * lat0_angstrom); + cellArray2.JPushBack(ucell->latvec.e21 * lat0_angstrom); + cellArray2.JPushBack(ucell->latvec.e22 * lat0_angstrom); + cellArray2.JPushBack(ucell->latvec.e23 * lat0_angstrom); + cellArray3.JPushBack(ucell->latvec.e31 * lat0_angstrom); + cellArray3.JPushBack(ucell->latvec.e32 * lat0_angstrom); + cellArray3.JPushBack(ucell->latvec.e33 * lat0_angstrom); Json::AbacusJson::add_json({"output",-1,"cell"}, cellArray1,true); Json::AbacusJson::add_json({"output",-1,"cell"}, cellArray2,true); Json::AbacusJson::add_json({"output",-1,"cell"}, cellArray3,true); diff --git a/source/source_io/module_json/test/para_json_test.cpp b/source/source_io/module_json/test/para_json_test.cpp index a88095333a..ca98e61159 100644 --- a/source/source_io/module_json/test/para_json_test.cpp +++ b/source/source_io/module_json/test/para_json_test.cpp @@ -376,15 +376,13 @@ TEST(AbacusJsonTest, Init_stru_test) ModuleBase::BOHR_TO_A, 1.0e-12); - ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][0][0].GetDouble(), 0.1); - ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][0][1].GetDouble(), 0.1); - ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][0][2].GetDouble(), 0.1); - - ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][1][0].GetDouble(), 0.2); - ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][1][1].GetDouble(), 0.2); - ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][1][2].GetDouble(), 0.2); - - ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][2][0].GetDouble(), 0.3); - ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][2][1].GetDouble(), 0.3); - ASSERT_EQ(Json::AbacusJson::doc["init"]["cell"][2][2].GetDouble(), 0.3); + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; ++j) + { + EXPECT_NEAR(Json::AbacusJson::doc["init"]["cell"][i][j].GetDouble(), + (i + 1) * ModuleBase::BOHR_TO_A, + 1.0e-12); + } + } }