forked from lijiext/lammps
Update binary format of dump custom
This commit is contained in:
parent
71ec14087d
commit
fbcc97586f
|
@ -302,7 +302,7 @@ void DumpCustom::init_style()
|
|||
strcpy(vformat[i],ptr);
|
||||
}
|
||||
|
||||
vformat[i] = strcat(vformat[i]," ");
|
||||
if (i+1 < size_one) vformat[i] = strcat(vformat[i]," ");
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
header_format_binary();
|
||||
|
||||
fwrite(&update->ntimestep,sizeof(bigint),1,fp);
|
||||
fwrite(&ndump,sizeof(bigint),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(&boxzhi,sizeof(double),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);
|
||||
else fwrite(&nprocs,sizeof(int),1,fp);
|
||||
}
|
||||
|
|
|
@ -29,6 +29,10 @@ class DumpCustom : public Dump {
|
|||
DumpCustom(class LAMMPS *, int, char **);
|
||||
virtual ~DumpCustom();
|
||||
|
||||
const char * MAGIC_STRING = "DUMPCUSTOM";
|
||||
const int FORMAT_REVISION = 0x0002;
|
||||
const int ENDIAN = 0x0001;
|
||||
|
||||
protected:
|
||||
int nevery; // dump frequency for output
|
||||
int iregion; // -1 if no region, else which region
|
||||
|
@ -107,6 +111,14 @@ class DumpCustom : public Dump {
|
|||
int add_custom(char *, int);
|
||||
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);
|
||||
FnPtrHeader header_choice; // ptr to write header functions
|
||||
void header_binary(bigint);
|
||||
|
|
|
@ -36,4 +36,5 @@ set_tests_properties(DumpCustom PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMM
|
|||
|
||||
if (BUILD_TOOLS)
|
||||
set_tests_properties(DumpAtom PROPERTIES ENVIRONMENT "BINARY2TXT_BINARY=$<TARGET_FILE:binary2txt>")
|
||||
set_tests_properties(DumpCustom PROPERTIES ENVIRONMENT "BINARY2TXT_BINARY=$<TARGET_FILE:binary2txt>")
|
||||
endif()
|
||||
|
|
|
@ -24,46 +24,110 @@ char * BINARY2TXT_BINARY = nullptr;
|
|||
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();
|
||||
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();
|
||||
|
||||
|
||||
ASSERT_FILE_EXISTS(dump_file);
|
||||
auto lines = read_lines(dump_file);
|
||||
ASSERT_EQ(lines.size(), 41);
|
||||
ASSERT_STREQ(lines[4].c_str(), "ITEM: BOX BOUNDS pp pp pp");
|
||||
ASSERT_EQ(utils::split_words(lines[5]).size(), 2);
|
||||
ASSERT_STREQ(lines[8].c_str(), "ITEM: ATOMS id type x y vx fx");
|
||||
ASSERT_EQ(utils::split_words(lines[9]).size(), 6);
|
||||
ASSERT_EQ(lines.size(), 84);
|
||||
ASSERT_STREQ(lines[6].c_str(), "ITEM: BOX BOUNDS pp pp pp");
|
||||
ASSERT_EQ(utils::split_words(lines[7]).size(), 2);
|
||||
ASSERT_STREQ(lines[10].c_str(), "ITEM: ATOMS id type x y vx fx");
|
||||
ASSERT_EQ(utils::split_words(lines[11]).size(), 6);
|
||||
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();
|
||||
|
||||
command("change_box all triclinic");
|
||||
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();
|
||||
|
||||
ASSERT_FILE_EXISTS(dump_file);
|
||||
|
||||
auto lines = read_lines(dump_file);
|
||||
ASSERT_STREQ(lines[4].c_str(), "ITEM: BOX BOUNDS xy xz yz pp pp pp");
|
||||
ASSERT_EQ(utils::split_words(lines[5]).size(), 3);
|
||||
ASSERT_STREQ(lines[6].c_str(), "ITEM: BOX BOUNDS xy xz yz pp pp pp");
|
||||
ASSERT_EQ(utils::split_words(lines[7]).size(), 3);
|
||||
|
||||
ASSERT_EQ(lines.size(), 41);
|
||||
ASSERT_EQ(lines.size(), 84);
|
||||
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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue