improve error handling for thermo output

This commit is contained in:
Axel Kohlmeyer
2025-02-17 23:43:01 -05:00
parent 5d4a277623
commit 9be6b5a05b

View File

@ -88,7 +88,7 @@ static constexpr char YAML[] = "step temp ke pe ebond eangle edihed eimp evdwl e
#define FORMAT_INT_YAML_DEFAULT "%d"
static constexpr char FORMAT_MULTI_HEADER[] =
"------------ Step {:14} ----- CPU = {:12.7g} (sec) -------------";
"------------ Step {:14} ----- CPU = {:12.7g} (sec) -------------";
enum { SCALAR, VECTOR, ARRAY };
@ -136,7 +136,7 @@ Thermo::Thermo(LAMMPS *_lmp, int narg, char **arg) :
lineflag = YAMLLINE;
} else if (strcmp(style, "custom") == 0) {
if (narg == 1) error->all(FLERR, "Illegal thermo style custom command");
if (narg == 1) error->all(FLERR, Error::ARGZERO, "Illegal thermo style custom command");
// expand args if any have wildcard character "*"
@ -159,7 +159,7 @@ Thermo::Thermo(LAMMPS *_lmp, int narg, char **arg) :
}
} else
error->all(FLERR, "Illegal thermo style command");
error->all(FLERR, Error::ARGZERO, "Illegal thermo style {}", style);
index_temp = index_press_scalar = index_press_vector = index_pe = -1;
@ -297,7 +297,9 @@ void Thermo::init()
for (int i = 0; i < ncompute; i++) {
computes[i] = modify->get_compute_by_id(id_compute[i]);
if (!computes[i]) error->all(FLERR, "Could not find thermo compute with ID {}", id_compute[i]);
if (!computes[i])
error->all(FLERR, Error::NOLASTLINE, "Could not find thermo compute with ID {}",
id_compute[i]);
}
// find current ptr for each Fix ID
@ -305,17 +307,20 @@ void Thermo::init()
for (int i = 0; i < nfix; i++) {
fixes[i] = modify->get_fix_by_id(id_fix[i]);
if (!fixes[i]) error->all(FLERR, "Could not find thermo fix ID {}", id_fix[i]);
if (!fixes[i])
error->all(FLERR, Error::NOLASTLINE, "Could not find thermo fix ID {}", id_fix[i]);
if (output->thermo_every % fixes[i]->global_freq)
error->all(FLERR, "Thermo and fix {} not computed at compatible times", id_fix[i]);
error->all(FLERR, Error::NOLASTLINE, "Thermo and fix {} not computed at compatible times",
id_fix[i]);
}
// find current ptr for each Variable ID
for (int i = 0; i < nvariable; i++) {
variables[i] = input->variable->find(id_variable[i]);
if (variables[i] < 0) error->all(FLERR, "Could not find thermo variable {}", id_variable[i]);
if (variables[i] < 0)
error->all(FLERR, Error::NOLASTLINE, "Could not find thermo variable {}", id_variable[i]);
}
// set ptrs to keyword-specific Compute objects
@ -486,7 +491,7 @@ bigint Thermo::lost_check()
nlocal[0] = atom->nlocal;
nlocal[1] = error->get_numwarn();
MPI_Allreduce(nlocal, ntotal, 2, MPI_LMP_BIGINT, MPI_SUM, world);
if (ntotal[0] < 0) error->all(FLERR, "Too many total atoms");
if (ntotal[0] < 0) error->all(FLERR, Error::NOLASTLINE, "Too many total atoms");
// print notification, if future warnings will be ignored
bigint maxwarn = error->get_maxwarn();
@ -494,7 +499,8 @@ bigint Thermo::lost_check()
warnbefore = 1;
if (comm->me == 0)
error->message(FLERR,
"WARNING: Too many warnings: {} vs {}. All future warnings will be suppressed",
"WARNING: Too many warnings: {} vs {}. "
"All future warnings will be suppressed",
ntotal[1], maxwarn);
}
error->set_allwarn(MIN(MAXSMALLINT, ntotal[1]));
@ -509,7 +515,8 @@ bigint Thermo::lost_check()
// error message
if (lostflag == Thermo::ERROR)
error->all(FLERR, "Lost atoms: original {} current {}", atom->natoms, ntotal[0]);
error->all(FLERR, Error::NOLASTLINE, "Lost atoms: original {} current {}", atom->natoms,
ntotal[0]);
// warning message
@ -537,16 +544,18 @@ void Thermo::modify_params(int narg, char **arg)
while (iarg < narg) {
if (strcmp(arg[iarg], "temp") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "thermo_modify temp", error);
if (index_temp < 0) error->all(FLERR, "Thermo style does not use temp");
if (index_temp < 0) error->all(FLERR, iarg + 1, "Thermo style does not use temp");
delete[] id_compute[index_temp];
id_compute[index_temp] = utils::strdup(arg[iarg + 1]);
temperature = modify->get_compute_by_id(arg[iarg + 1]);
if (!temperature)
error->all(FLERR, "Could not find thermo_modify temperature compute {}", arg[iarg + 1]);
error->all(FLERR, iarg + 1, "Could not find thermo_modify temperature compute {}",
arg[iarg + 1]);
if (temperature->tempflag == 0)
error->all(FLERR, "Thermo_modify compute {} does not compute temperature", arg[iarg + 1]);
error->all(FLERR, iarg + 1, "Thermo_modify compute {} does not compute temperature",
arg[iarg + 1]);
if (temperature->igroup != 0 && comm->me == 0)
error->warning(FLERR, "Temperature for thermo pressure is not for group all");
@ -557,12 +566,16 @@ void Thermo::modify_params(int narg, char **arg)
if (index_press_scalar >= 0) {
pcompute = modify->get_compute_by_id(id_compute[index_press_scalar]);
if (!pcompute)
error->all(FLERR, "Pressure compute {} for thermo output does not exist",
error->all(FLERR, Error::NOPOINTER,
"Pressure compute {} for thermo output does "
"not exist",
id_compute[index_press_scalar]);
} else if (index_press_vector >= 0) {
pcompute = modify->get_compute_by_id(id_compute[index_press_vector]);
if (!pcompute)
error->all(FLERR, "Pressure compute {} for thermo output does not exist",
error->all(FLERR, Error::NOPOINTER,
"Pressure compute {} for thermo output does "
"not exist",
id_compute[index_press_vector]);
} else
pcompute = modify->get_compute_by_id("thermo_press");
@ -594,10 +607,10 @@ void Thermo::modify_params(int narg, char **arg)
iarg += 2;
} else if (strcmp(arg[iarg], "triclinic/general") == 0) {
if (iarg + 2 > narg) error->all(FLERR, "Illegal thermo_modify command");
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "thermo_modify tricinic/general", error);
triclinic_general = utils::logical(FLERR, arg[iarg + 1], false, lmp);
if (triclinic_general && !domain->triclinic_general)
error->all(FLERR,
error->all(FLERR, iarg,
"Thermo_modify triclinic/general cannot be used "
"if simulation box is not general triclinic");
iarg += 2;
@ -611,7 +624,7 @@ void Thermo::modify_params(int narg, char **arg)
else if (strcmp(arg[iarg + 1], "error") == 0)
lostflag = Thermo::ERROR;
else
error->all(FLERR, "Unknown thermo_modify lost argument: {}", arg[iarg + 1]);
error->all(FLERR, iarg + 1, "Unknown thermo_modify lost argument: {}", arg[iarg + 1]);
iarg += 2;
} else if (strcmp(arg[iarg], "lost/bond") == 0) {
@ -623,7 +636,7 @@ void Thermo::modify_params(int narg, char **arg)
else if (strcmp(arg[iarg + 1], "error") == 0)
lostbond = Thermo::ERROR;
else
error->all(FLERR, "Unknown thermo_modify lost/bond argument: {}", arg[iarg + 1]);
error->all(FLERR, iarg + 1, "Unknown thermo_modify lost/bond argument: {}", arg[iarg + 1]);
iarg += 2;
} else if (strcmp(arg[iarg], "warn") == 0) {
@ -663,7 +676,7 @@ void Thermo::modify_params(int narg, char **arg)
else if (strcmp(arg[iarg + 1], "yaml") == 0)
lineflag = YAMLLINE;
else
error->all(FLERR, "Unknown thermo_modify line argument: {}", arg[iarg + 1]);
error->all(FLERR, iarg + 1, "Unknown thermo_modify line argument: {}", arg[iarg + 1]);
iarg += 2;
} else if (strcmp(arg[iarg], "colname") == 0) {
@ -686,7 +699,7 @@ void Thermo::modify_params(int narg, char **arg)
}
}
if ((icol < 0) || (icol >= nfield_initial))
error->all(FLERR, "Invalid thermo_modify colname argument: {}", arg[iarg + 1]);
error->all(FLERR, iarg + 1, "Invalid thermo_modify colname argument: {}", arg[iarg + 1]);
keyword_user[icol] = arg[iarg + 2];
iarg += 3;
}
@ -713,7 +726,8 @@ void Thermo::modify_params(int narg, char **arg)
auto found = format_int_user.find('%');
found = format_int_user.find('d', found);
if (found == std::string::npos)
error->all(FLERR, "Thermo_modify int format does not contain a d conversion character");
error->all(FLERR, iarg + 2,
"Thermo_modify int format does not contain a d conversion character");
format_bigint_user =
format_int_user.replace(found, 1, std::string(BIGINT_FORMAT).substr(1));
} else if (strcmp(arg[iarg + 1], "float") == 0) {
@ -729,7 +743,7 @@ void Thermo::modify_params(int narg, char **arg)
else
icol = i;
if (icol < 0 || (icol >= nfield_initial))
error->all(FLERR, "Invalid thermo_modify format argument: {}", arg[iarg + 1]);
error->all(FLERR, iarg + 1, "Invalid thermo_modify format argument: {}", arg[iarg + 1]);
format_column_user[icol] = arg[iarg + 2];
}
} else {
@ -746,13 +760,13 @@ void Thermo::modify_params(int narg, char **arg)
}
}
if ((icol < 0) || (icol >= nfield_initial))
error->all(FLERR, "Invalid thermo_modify format argument: {}", arg[iarg + 1]);
error->all(FLERR, iarg + 1, "Invalid thermo_modify format argument: {}", arg[iarg + 1]);
format_column_user[icol] = arg[iarg + 2];
}
iarg += 3;
} else
error->all(FLERR, "Unknown thermo_modify keyword: {}", arg[iarg]);
error->all(FLERR, iarg, "Unknown thermo_modify keyword: {}", arg[iarg]);
}
}