Update binary format of dump custom
This commit is contained in:
@ -302,7 +302,7 @@ void DumpCustom::init_style()
|
|||||||
strcpy(vformat[i],ptr);
|
strcpy(vformat[i],ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
vformat[i] = strcat(vformat[i]," ");
|
if (i+1 < size_one) vformat[i] = strcat(vformat[i]," ");
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup boundary string
|
// setup boundary string
|
||||||
@ -381,8 +381,83 @@ void DumpCustom::write_header(bigint ndump)
|
|||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpCustom::format_magic_string_binary()
|
||||||
|
{
|
||||||
|
// use negative ntimestep as marker for new format
|
||||||
|
bigint fmtlen = strlen(MAGIC_STRING);
|
||||||
|
bigint marker = -fmtlen;
|
||||||
|
fwrite(&marker, sizeof(bigint), 1, fp);
|
||||||
|
fwrite(MAGIC_STRING, sizeof(char), fmtlen, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpCustom::format_endian_binary()
|
||||||
|
{
|
||||||
|
int endian = ENDIAN;
|
||||||
|
fwrite(&endian, sizeof(int), 1, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpCustom::format_revision_binary()
|
||||||
|
{
|
||||||
|
int revision = FORMAT_REVISION;
|
||||||
|
fwrite(&revision, sizeof(int), 1, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpCustom::header_unit_style_binary()
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
if (unit_flag && !unit_count) {
|
||||||
|
++unit_count;
|
||||||
|
len = strlen(update->unit_style);
|
||||||
|
fwrite(&len, sizeof(int), 1, fp);
|
||||||
|
fwrite(update->unit_style, sizeof(char), len, fp);
|
||||||
|
} else {
|
||||||
|
fwrite(&len, sizeof(int), 1, fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpCustom::header_columns_binary()
|
||||||
|
{
|
||||||
|
int len = strlen(columns);
|
||||||
|
fwrite(&len, sizeof(int), 1, fp);
|
||||||
|
fwrite(columns, sizeof(char), len, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpCustom::header_time_binary()
|
||||||
|
{
|
||||||
|
char flag = time_flag ? 1 : 0;
|
||||||
|
fwrite(&flag, sizeof(char), 1, fp);
|
||||||
|
|
||||||
|
if (time_flag) {
|
||||||
|
double t = compute_time();
|
||||||
|
fwrite(&t, sizeof(double), 1, fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpCustom::header_format_binary()
|
||||||
|
{
|
||||||
|
format_magic_string_binary();
|
||||||
|
format_endian_binary();
|
||||||
|
format_revision_binary();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
void DumpCustom::header_binary(bigint ndump)
|
void DumpCustom::header_binary(bigint ndump)
|
||||||
{
|
{
|
||||||
|
header_format_binary();
|
||||||
|
|
||||||
fwrite(&update->ntimestep,sizeof(bigint),1,fp);
|
fwrite(&update->ntimestep,sizeof(bigint),1,fp);
|
||||||
fwrite(&ndump,sizeof(bigint),1,fp);
|
fwrite(&ndump,sizeof(bigint),1,fp);
|
||||||
fwrite(&domain->triclinic,sizeof(int),1,fp);
|
fwrite(&domain->triclinic,sizeof(int),1,fp);
|
||||||
@ -394,6 +469,11 @@ void DumpCustom::header_binary(bigint ndump)
|
|||||||
fwrite(&boxzlo,sizeof(double),1,fp);
|
fwrite(&boxzlo,sizeof(double),1,fp);
|
||||||
fwrite(&boxzhi,sizeof(double),1,fp);
|
fwrite(&boxzhi,sizeof(double),1,fp);
|
||||||
fwrite(&size_one,sizeof(int),1,fp);
|
fwrite(&size_one,sizeof(int),1,fp);
|
||||||
|
|
||||||
|
header_unit_style_binary();
|
||||||
|
header_time_binary();
|
||||||
|
header_columns_binary();
|
||||||
|
|
||||||
if (multiproc) fwrite(&nclusterprocs,sizeof(int),1,fp);
|
if (multiproc) fwrite(&nclusterprocs,sizeof(int),1,fp);
|
||||||
else fwrite(&nprocs,sizeof(int),1,fp);
|
else fwrite(&nprocs,sizeof(int),1,fp);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,10 @@ class DumpCustom : public Dump {
|
|||||||
DumpCustom(class LAMMPS *, int, char **);
|
DumpCustom(class LAMMPS *, int, char **);
|
||||||
virtual ~DumpCustom();
|
virtual ~DumpCustom();
|
||||||
|
|
||||||
|
const char * MAGIC_STRING = "DUMPCUSTOM";
|
||||||
|
const int FORMAT_REVISION = 0x0002;
|
||||||
|
const int ENDIAN = 0x0001;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int nevery; // dump frequency for output
|
int nevery; // dump frequency for output
|
||||||
int iregion; // -1 if no region, else which region
|
int iregion; // -1 if no region, else which region
|
||||||
@ -107,6 +111,14 @@ class DumpCustom : public Dump {
|
|||||||
int add_custom(char *, int);
|
int add_custom(char *, int);
|
||||||
virtual int modify_param(int, char **);
|
virtual int modify_param(int, char **);
|
||||||
|
|
||||||
|
void header_format_binary();
|
||||||
|
void header_unit_style_binary();
|
||||||
|
void header_time_binary();
|
||||||
|
void header_columns_binary();
|
||||||
|
void format_magic_string_binary();
|
||||||
|
void format_endian_binary();
|
||||||
|
void format_revision_binary();
|
||||||
|
|
||||||
typedef void (DumpCustom::*FnPtrHeader)(bigint);
|
typedef void (DumpCustom::*FnPtrHeader)(bigint);
|
||||||
FnPtrHeader header_choice; // ptr to write header functions
|
FnPtrHeader header_choice; // ptr to write header functions
|
||||||
void header_binary(bigint);
|
void header_binary(bigint);
|
||||||
|
|||||||
@ -36,4 +36,5 @@ set_tests_properties(DumpCustom PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMM
|
|||||||
|
|
||||||
if (BUILD_TOOLS)
|
if (BUILD_TOOLS)
|
||||||
set_tests_properties(DumpAtom PROPERTIES ENVIRONMENT "BINARY2TXT_BINARY=$<TARGET_FILE:binary2txt>")
|
set_tests_properties(DumpAtom PROPERTIES ENVIRONMENT "BINARY2TXT_BINARY=$<TARGET_FILE:binary2txt>")
|
||||||
|
set_tests_properties(DumpCustom PROPERTIES ENVIRONMENT "BINARY2TXT_BINARY=$<TARGET_FILE:binary2txt>")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@ -24,46 +24,110 @@ char * BINARY2TXT_BINARY = nullptr;
|
|||||||
class DumpCustomTest : public MeltTest {
|
class DumpCustomTest : public MeltTest {
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(DumpCustomTest, run0)
|
TEST_F(DumpCustomTest, run1)
|
||||||
{
|
{
|
||||||
auto dump_file = "dump_custom_run0.melt";
|
auto dump_file = "dump_custom_run1.melt";
|
||||||
|
|
||||||
if (!verbose) ::testing::internal::CaptureStdout();
|
if (!verbose) ::testing::internal::CaptureStdout();
|
||||||
command(fmt::format("dump id all custom 1 {} id type x y vx fx", dump_file));
|
command(fmt::format("dump id all custom 1 {} id type x y vx fx", dump_file));
|
||||||
command("run 0");
|
command("dump_modify id units yes");
|
||||||
|
command("run 1");
|
||||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||||
|
|
||||||
|
|
||||||
ASSERT_FILE_EXISTS(dump_file);
|
ASSERT_FILE_EXISTS(dump_file);
|
||||||
auto lines = read_lines(dump_file);
|
auto lines = read_lines(dump_file);
|
||||||
ASSERT_EQ(lines.size(), 41);
|
ASSERT_EQ(lines.size(), 84);
|
||||||
ASSERT_STREQ(lines[4].c_str(), "ITEM: BOX BOUNDS pp pp pp");
|
ASSERT_STREQ(lines[6].c_str(), "ITEM: BOX BOUNDS pp pp pp");
|
||||||
ASSERT_EQ(utils::split_words(lines[5]).size(), 2);
|
ASSERT_EQ(utils::split_words(lines[7]).size(), 2);
|
||||||
ASSERT_STREQ(lines[8].c_str(), "ITEM: ATOMS id type x y vx fx");
|
ASSERT_STREQ(lines[10].c_str(), "ITEM: ATOMS id type x y vx fx");
|
||||||
ASSERT_EQ(utils::split_words(lines[9]).size(), 6);
|
ASSERT_EQ(utils::split_words(lines[11]).size(), 6);
|
||||||
delete_file(dump_file);
|
delete_file(dump_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(DumpCustomTest, triclinic_run0)
|
TEST_F(DumpCustomTest, binary_run1)
|
||||||
{
|
{
|
||||||
auto dump_file = "dump_custom_tri_run0.melt";
|
auto text_file = "dump_custom_text_run1.melt";
|
||||||
|
auto binary_file = "dump_custom_binary_run1.melt.bin";
|
||||||
|
auto converted_file = fmt::format("{}.txt", binary_file);
|
||||||
|
|
||||||
|
if(!BINARY2TXT_BINARY) GTEST_SKIP();
|
||||||
|
|
||||||
|
if (!verbose) ::testing::internal::CaptureStdout();
|
||||||
|
command(fmt::format("dump id0 all custom 1 {} id type x y vx fx", text_file));
|
||||||
|
command(fmt::format("dump id1 all custom 1 {} id type x y vx fx", binary_file));
|
||||||
|
command("dump_modify id0 units yes");
|
||||||
|
command("dump_modify id1 units yes");
|
||||||
|
command("run 1");
|
||||||
|
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||||
|
|
||||||
|
ASSERT_FILE_EXISTS(text_file);
|
||||||
|
ASSERT_FILE_EXISTS(binary_file);
|
||||||
|
|
||||||
|
if (!verbose) ::testing::internal::CaptureStdout();
|
||||||
|
std::string cmdline = fmt::format("{} {}", BINARY2TXT_BINARY, binary_file);
|
||||||
|
system(cmdline.c_str());
|
||||||
|
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||||
|
|
||||||
|
ASSERT_FILE_EXISTS(converted_file);
|
||||||
|
ASSERT_FILE_EQUAL(text_file, converted_file);
|
||||||
|
delete_file(text_file);
|
||||||
|
delete_file(binary_file);
|
||||||
|
delete_file(converted_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(DumpCustomTest, triclinic_run1)
|
||||||
|
{
|
||||||
|
auto dump_file = "dump_custom_tri_run1.melt";
|
||||||
if (!verbose) ::testing::internal::CaptureStdout();
|
if (!verbose) ::testing::internal::CaptureStdout();
|
||||||
|
|
||||||
command("change_box all triclinic");
|
command("change_box all triclinic");
|
||||||
command(fmt::format("dump id all custom 1 {} id type x y vx fx", dump_file));
|
command(fmt::format("dump id all custom 1 {} id type x y vx fx", dump_file));
|
||||||
command("run 0");
|
command("dump_modify id units yes");
|
||||||
|
command("run 1");
|
||||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||||
|
|
||||||
ASSERT_FILE_EXISTS(dump_file);
|
ASSERT_FILE_EXISTS(dump_file);
|
||||||
|
|
||||||
auto lines = read_lines(dump_file);
|
auto lines = read_lines(dump_file);
|
||||||
ASSERT_STREQ(lines[4].c_str(), "ITEM: BOX BOUNDS xy xz yz pp pp pp");
|
ASSERT_STREQ(lines[6].c_str(), "ITEM: BOX BOUNDS xy xz yz pp pp pp");
|
||||||
ASSERT_EQ(utils::split_words(lines[5]).size(), 3);
|
ASSERT_EQ(utils::split_words(lines[7]).size(), 3);
|
||||||
|
|
||||||
ASSERT_EQ(lines.size(), 41);
|
ASSERT_EQ(lines.size(), 84);
|
||||||
delete_file(dump_file);
|
delete_file(dump_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DumpCustomTest, binary_triclinic_run1)
|
||||||
|
{
|
||||||
|
auto text_file = "dump_custom_tri_text_run1.melt";
|
||||||
|
auto binary_file = "dump_custom_tri_binary_run1.melt.bin";
|
||||||
|
auto converted_file = fmt::format("{}.txt", binary_file);
|
||||||
|
|
||||||
|
if(!BINARY2TXT_BINARY) GTEST_SKIP();
|
||||||
|
|
||||||
|
if (!verbose) ::testing::internal::CaptureStdout();
|
||||||
|
command(fmt::format("dump id0 all custom 1 {} id type x y vx fx", text_file));
|
||||||
|
command(fmt::format("dump id1 all custom 1 {} id type x y vx fx", binary_file));
|
||||||
|
command("dump_modify id0 units yes");
|
||||||
|
command("dump_modify id1 units yes");
|
||||||
|
command("run 1");
|
||||||
|
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||||
|
|
||||||
|
ASSERT_FILE_EXISTS(text_file);
|
||||||
|
ASSERT_FILE_EXISTS(binary_file);
|
||||||
|
|
||||||
|
if (!verbose) ::testing::internal::CaptureStdout();
|
||||||
|
std::string cmdline = fmt::format("{} {}", BINARY2TXT_BINARY, binary_file);
|
||||||
|
system(cmdline.c_str());
|
||||||
|
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||||
|
|
||||||
|
ASSERT_FILE_EXISTS(converted_file);
|
||||||
|
ASSERT_FILE_EQUAL(text_file, converted_file);
|
||||||
|
delete_file(text_file);
|
||||||
|
delete_file(binary_file);
|
||||||
|
delete_file(converted_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user