add restart support to fix deform. only "initial" data is restored and some consistency check performed

This commit is contained in:
Axel Kohlmeyer 2017-06-10 17:28:17 -04:00
parent dd44189d1f
commit daa77176ad
3 changed files with 49 additions and 14 deletions

View File

@ -565,8 +565,10 @@ more instructions on how to use the accelerated styles effectively.
[Restart, fix_modify, output, run start/stop, minimize info:]
No information about this fix is written to "binary restart
files"_restart.html. None of the "fix_modify"_fix_modify.html options
This fix will restore the initial box settings from "binary restart
files"_restart.html, which allows the fix to be properly continue
deformation, when using the start/stop options of the "run"_run.html
command. None of the "fix_modify"_fix_modify.html options
are relevant to this fix. No global or per-atom quantities are stored
by this fix for access by various "output
commands"_Section_howto.html#howto_15.

View File

@ -37,7 +37,7 @@ using namespace LAMMPS_NS;
using namespace FixConst;
using namespace MathConst;
enum{NONE,FINAL,DELTA,SCALE,VEL,ERATE,TRATE,VOLUME,WIGGLE,VARIABLE};
enum{NONE=0,FINAL,DELTA,SCALE,VEL,ERATE,TRATE,VOLUME,WIGGLE,VARIABLE};
enum{ONE_FROM_ONE,ONE_FROM_TWO,TWO_FROM_ONE};
// same as domain.cpp, fix_nvt_sllod.cpp, compute_temp_deform.cpp
@ -52,6 +52,7 @@ rfix(NULL), irregular(NULL), set(NULL)
if (narg < 4) error->all(FLERR,"Illegal fix deform command");
no_change_box = 1;
restart_global = 1;
nevery = force->inumeric(FLERR,arg[3]);
if (nevery <= 0) error->all(FLERR,"Illegal fix deform command");
@ -59,12 +60,7 @@ rfix(NULL), irregular(NULL), set(NULL)
// set defaults
set = new Set[6];
set[0].style = set[1].style = set[2].style =
set[3].style = set[4].style = set[5].style = NONE;
set[0].hstr = set[1].hstr = set[2].hstr =
set[3].hstr = set[4].hstr = set[5].hstr = NULL;
set[0].hratestr = set[1].hratestr = set[2].hratestr =
set[3].hratestr = set[4].hratestr = set[5].hratestr = NULL;
memset(set,0,6*sizeof(Set));
// parse arguments
@ -343,11 +339,9 @@ rfix(NULL), irregular(NULL), set(NULL)
set[i].hi_initial = domain->boxhi[i];
set[i].vol_initial = domain->xprd * domain->yprd * domain->zprd;
}
for (int i = 3; i < 6; i++) {
if (i == 5) set[i].tilt_initial = domain->xy;
else if (i == 4) set[i].tilt_initial = domain->xz;
else if (i == 3) set[i].tilt_initial = domain->yz;
}
set[3].tilt_initial = domain->yz;
set[4].tilt_initial = domain->xz;
set[5].tilt_initial = domain->xy;
// reneighboring only forced if flips can occur due to shape changes
@ -955,6 +949,43 @@ void FixDeform::end_of_step()
if (kspace_flag) force->kspace->setup();
}
/* ----------------------------------------------------------------------
write Set data to restart file
------------------------------------------------------------------------- */
void FixDeform::write_restart(FILE *fp)
{
if (comm->me == 0) {
int size = 6*sizeof(Set);
fwrite(&size,sizeof(int),1,fp);
fwrite(set,sizeof(Set),6,fp);
}
}
/* ----------------------------------------------------------------------
use selected state info from restart file to restart the Fix
------------------------------------------------------------------------- */
void FixDeform::restart(char *buf)
{
int samestyle = 1;
Set *set_restart = (Set *) buf;
for (int i=0; i<6; ++i) {
// restore data from initial state
set[i].lo_initial = set_restart[i].lo_initial;
set[i].hi_initial = set_restart[i].hi_initial;
set[i].vol_initial = set_restart[i].vol_initial;
set[i].tilt_initial = set_restart[i].tilt_initial;
// check if style settings are consitent (should do the whole set?)
if (set[i].style != set_restart[i].style)
samestyle = 0;
if (set[i].substyle != set_restart[i].substyle)
samestyle = 0;
}
if (!samestyle)
error->all(FLERR,"Fix deform settings not consistent with restart");
}
/* ---------------------------------------------------------------------- */
void FixDeform::options(int narg, char **arg)

View File

@ -35,6 +35,8 @@ class FixDeform : public Fix {
void init();
virtual void pre_exchange();
virtual void end_of_step();
virtual void write_restart(FILE *);
virtual void restart(char *buf);
double memory_usage();
protected: