new output vars for dumps

This commit is contained in:
Steve Plimpton
2021-12-07 09:16:19 -07:00
parent 1a4511bb8d
commit 1afdd3c011
3 changed files with 68 additions and 23 deletions

View File

@ -937,9 +937,28 @@ void Dump::modify_params(int narg, char **arg)
n = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
if (n <= 0) error->all(FLERR,"Illegal dump_modify command");
}
output->time_dump[idump] = 0;
output->every_dump[idump] = n;
iarg += 2;
} else if (strcmp(arg[iarg],"delta") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command");
int idump;
for (idump = 0; idump < output->ndump; idump++)
if (strcmp(id,output->dump[idump]->id) == 0) break;
double delta;
if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) {
delete [] output->var_dump[idump];
output->var_dump[idump] = utils::strdup(&arg[iarg+1][2]);
delta = 0.0;
} else {
delta = utils::numeric(FLERR,arg[iarg+1],false,lmp);
if (delta <= 0.0) error->all(FLERR,"Illegal dump_modify command");
}
output->time_dump[idump] = 1;
output->delta_dump[idump] = delta;
iarg += 2;
} else if (strcmp(arg[iarg],"fileper") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command");
if (!multiproc)

View File

@ -59,7 +59,9 @@ Output::Output(LAMMPS *lmp) : Pointers(lmp)
ndump = 0;
max_dump = 0;
time_dump = nullptr;
every_dump = nullptr;
delta_dump = nullptr;
next_dump = nullptr;
last_dump = nullptr;
var_dump = nullptr;
@ -92,7 +94,9 @@ Output::~Output()
if (thermo) delete thermo;
delete [] var_thermo;
memory->destroy(time_dump);
memory->destroy(every_dump);
memory->destroy(delta_dump);
memory->destroy(next_dump);
memory->destroy(last_dump);
for (int i = 0; i < ndump; i++) delete [] var_dump[i];
@ -126,12 +130,13 @@ void Output::init()
for (int i = 0; i < ndump; i++) dump[i]->init();
for (int i = 0; i < ndump; i++)
if (every_dump[i] == 0) {
if ((time_dump[i] == 0 && every_dump[i] == 0) ||
(time_dump[i] == 1 && delta_dump[i] == 0.0)} {
ivar_dump[i] = input->variable->find(var_dump[i]);
if (ivar_dump[i] < 0)
error->all(FLERR,"Variable name for dump every does not exist");
error->all(FLERR,"Variable name for dump every or delta does not exist");
if (!input->variable->equalstyle(ivar_dump[i]))
error->all(FLERR,"Variable for dump every is invalid style");
error->all(FLERR,"Variable for dump every or delta is invalid style");
}
if (restart_flag_single && restart_every_single == 0) {
@ -176,7 +181,7 @@ void Output::setup(int memflag)
if (ndump && update->restrict_output == 0) {
for (int idump = 0; idump < ndump; idump++) {
if (dump[idump]->clearstep || every_dump[idump] == 0)
if (dump[idump]->clearstep || var_dump[idump])
modify->clearstep_compute();
writeflag = 0;
if (every_dump[idump] && ntimestep % every_dump[idump] == 0 &&
@ -187,6 +192,7 @@ void Output::setup(int memflag)
dump[idump]->write();
last_dump[idump] = ntimestep;
}
if (every_dump[idump])
next_dump[idump] =
(ntimestep/every_dump[idump])*every_dump[idump] + every_dump[idump];
@ -197,7 +203,8 @@ void Output::setup(int memflag)
error->all(FLERR,"Dump every variable returned a bad timestep");
next_dump[idump] = nextdump;
}
if (dump[idump]->clearstep || every_dump[idump] == 0) {
if (dump[idump]->clearstep || var_dump[idump]) {
if (writeflag) modify->addstep_compute(next_dump[idump]);
else modify->addstep_compute_all(next_dump[idump]);
}
@ -287,21 +294,35 @@ void Output::write(bigint ntimestep)
if (next_dump_any == ntimestep) {
for (int idump = 0; idump < ndump; idump++) {
if (next_dump[idump] == ntimestep) {
if (dump[idump]->clearstep || every_dump[idump] == 0)
if (dump[idump]->clearstep || var_dump[idump])
modify->clearstep_compute();
if (last_dump[idump] != ntimestep) {
dump[idump]->write();
last_dump[idump] = ntimestep;
}
if (every_dump[idump]) next_dump[idump] += every_dump[idump];
else {
bigint nextdump = static_cast<bigint>
(input->variable->compute_equal(ivar_dump[idump]));
if (nextdump <= ntimestep)
error->all(FLERR,"Dump every variable returned a bad timestep");
next_dump[idump] = nextdump;
if (time_dump[idump] == 0) {
if (every_dump[idump]) next_dump[idump] += every_dump[idump];
else {
bigint nextdump = static_cast<bigint>
(input->variable->compute_equal(ivar_dump[idump]));
if (nextdump <= ntimestep)
error->all(FLERR,"Dump every variable returned a bad timestep");
next_dump[idump] = nextdump;
}
} else {
if (delta_dump[idump] > 0.0) {
bigint nextstep =
next_dump[idump] += every_dump[idump];
} else {
double nexttime = input->variable->compute_equal(ivar_dump[idump]);
if (nexttime <= current_time) // NOTE: what is current time
error->all(FLERR,"Dump delta variable returned a bad time");
next_dump[idump] = nextdump;
}
}
if (dump[idump]->clearstep || every_dump[idump] == 0)
if (dump[idump]->clearstep || var_dump[idump])
modify->addstep_compute(next_dump[idump]);
}
if (idump) next_dump_any = MIN(next_dump_any,next_dump[idump]);
@ -547,7 +568,9 @@ void Output::add_dump(int narg, char **arg)
max_dump += DELTA;
dump = (Dump **)
memory->srealloc(dump,max_dump*sizeof(Dump *),"output:dump");
memory->grow(time_dump,max_dump,"output:time_dump");
memory->grow(every_dump,max_dump,"output:every_dump");
memory->grow(delta_dump,max_dump,"output:delta_dump");
memory->grow(next_dump,max_dump,"output:next_dump");
memory->grow(last_dump,max_dump,"output:last_dump");
var_dump = (char **)
@ -555,13 +578,6 @@ void Output::add_dump(int narg, char **arg)
memory->grow(ivar_dump,max_dump,"output:ivar_dump");
}
// initialize per-dump data to suitable default values
every_dump[ndump] = 0;
last_dump[ndump] = -1;
var_dump[ndump] = nullptr;
ivar_dump[ndump] = -1;
// create the Dump
if (dump_map->find(arg[2]) != dump_map->end()) {
@ -569,10 +585,16 @@ void Output::add_dump(int narg, char **arg)
dump[ndump] = dump_creator(lmp, narg, arg);
} else error->all(FLERR,utils::check_packages_for_style("dump",arg[2],lmp));
// initialize per-dump data to suitable default values
time_dump[ndump] = 0;
every_dump[ndump] = utils::inumeric(FLERR,arg[3],false,lmp);
if (every_dump[ndump] <= 0) error->all(FLERR,"Illegal dump command");
delta_dump[ndump] = 0.0;
last_dump[ndump] = -1;
var_dump[ndump] = nullptr;
ivar_dump[ndump] = -1;
ndump++;
}
@ -624,7 +646,9 @@ void Output::delete_dump(char *id)
for (int i = idump+1; i < ndump; i++) {
dump[i-1] = dump[i];
time_dump[i-1] = time_dump[i];
every_dump[i-1] = every_dump[i];
delta_dump[i-1] = delta_dump[i];
next_dump[i-1] = next_dump[i];
last_dump[i-1] = last_dump[i];
var_dump[i-1] = var_dump[i];

View File

@ -36,10 +36,12 @@ class Output : protected Pointers {
int ndump; // # of Dumps defined
int max_dump; // max size of Dump list
bigint next_dump_any; // next timestep for any Dump
int *every_dump; // write freq for each Dump, 0 if var
int *time_dump; // 0/1 if write every N timesteps or Delta in sim time
int *every_dump; // write every this many timesteps, 0 if var
double *delta_dump; // write every this delta sim time, 0.0 if var
bigint *next_dump; // next timestep to do each Dump
bigint *last_dump; // last timestep each snapshot was output
char **var_dump; // variable name for dump frequency
char **var_dump; // variable name for dump frequency (steps or sim time)
int *ivar_dump; // variable index for dump frequency
Dump **dump; // list of defined Dumps