Revamping atom data storage in fixes
This commit is contained in:
@ -21,6 +21,7 @@
|
|||||||
#include "compute_rheo_vshift.h"
|
#include "compute_rheo_vshift.h"
|
||||||
#include "domain.h"
|
#include "domain.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
#include "fix_store_peratom.h"
|
||||||
#include "force.h"
|
#include "force.h"
|
||||||
#include "modify.h"
|
#include "modify.h"
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
@ -33,15 +34,30 @@ using namespace FixConst;
|
|||||||
|
|
||||||
FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) :
|
FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) :
|
||||||
Fix(lmp, narg, arg), compute_grad(nullptr), compute_kernel(nullptr),
|
Fix(lmp, narg, arg), compute_grad(nullptr), compute_kernel(nullptr),
|
||||||
compute_interface(nullptr), compute_rhosum(nullptr), compute_vshift(nullptr)
|
compute_interface(nullptr), compute_rhosum(nullptr), compute_vshift(nullptr),
|
||||||
|
fix_store_visc(nullptr), fix_store_pres(nullptr), fix_store_cond(nullptr),
|
||||||
|
fix_store_surf(nullptr), fix_store_fp(nullptr), surface(nullptr), conductivity(nullptr),
|
||||||
|
viscosity(nullptr), pressure(nullptr), f_pressure(nullptr)
|
||||||
{
|
{
|
||||||
|
time_integrate = 1;
|
||||||
|
|
||||||
|
viscosity_fix_defined = 0;
|
||||||
|
pressure_fix_defined = 0;
|
||||||
|
thermal_fix_defined = 0;
|
||||||
|
surface_fix_defined = 0;
|
||||||
|
|
||||||
thermal_flag = 0;
|
thermal_flag = 0;
|
||||||
rhosum_flag = 0;
|
rhosum_flag = 0;
|
||||||
shift_flag = 0;
|
shift_flag = 0;
|
||||||
solid_flag = 0;
|
interface_flag = 0;
|
||||||
|
surface_flag = 0;
|
||||||
|
|
||||||
rho0 = 1.0;
|
rho0 = 1.0;
|
||||||
csq = 1.0;
|
csq = 1.0;
|
||||||
|
|
||||||
|
if (igroup != 0)
|
||||||
|
error->all(FLERR,"fix rheo command requires group all");
|
||||||
|
|
||||||
if (atom->rho_flag != 1)
|
if (atom->rho_flag != 1)
|
||||||
error->all(FLERR,"fix rheo command requires atom_style with density");
|
error->all(FLERR,"fix rheo command requires atom_style with density");
|
||||||
if (atom->status_flag != 1)
|
if (atom->status_flag != 1)
|
||||||
@ -68,6 +84,10 @@ FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
shift_flag = 1;
|
shift_flag = 1;
|
||||||
} else if (strcmp(arg[iarg],"thermal") == 0) {
|
} else if (strcmp(arg[iarg],"thermal") == 0) {
|
||||||
thermal_flag = 1;
|
thermal_flag = 1;
|
||||||
|
} else if (strcmp(arg[iarg],"surface/detection") == 0) {
|
||||||
|
surface_flag = 1;
|
||||||
|
} else if (strcmp(arg[iarg],"interface/reconstruction") == 0) {
|
||||||
|
interface_flag = 1;
|
||||||
} else if (strcmp(arg[iarg],"rhosum") == 0) {
|
} else if (strcmp(arg[iarg],"rhosum") == 0) {
|
||||||
rhosum_flag = 1;
|
rhosum_flag = 1;
|
||||||
if(iarg + 1 >= narg) error->all(FLERR,"Illegal rhosum option in fix rheo");
|
if(iarg + 1 >= narg) error->all(FLERR,"Illegal rhosum option in fix rheo");
|
||||||
@ -86,17 +106,18 @@ FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
}
|
}
|
||||||
iarg += 1;
|
iarg += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
time_integrate = 1;
|
|
||||||
thermal_fix_defined = 0;
|
|
||||||
viscosity_fix_defined = 0;
|
|
||||||
pressure_fix_defined = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
FixRHEO::~FixRHEO()
|
FixRHEO::~FixRHEO()
|
||||||
{
|
{
|
||||||
|
if (fix_store_visc) modify->delete_fix("rheo_store_visc");
|
||||||
|
if (fix_store_pres) modify->delete_fix("rheo_store_pres");
|
||||||
|
if (fix_store_surf) modify->delete_fix("rheo_store_surf");
|
||||||
|
if (fix_store_cond) modify->delete_fix("rheo_store_cond");
|
||||||
|
if (fix_store_fp) modify->delete_fix("rheo_store_fp");
|
||||||
|
|
||||||
if (compute_kernel) modify->delete_compute("rheo_kernel");
|
if (compute_kernel) modify->delete_compute("rheo_kernel");
|
||||||
if (compute_grad) modify->delete_compute("rheo_grad");
|
if (compute_grad) modify->delete_compute("rheo_grad");
|
||||||
if (compute_interface) modify->delete_compute("rheo_interface");
|
if (compute_interface) modify->delete_compute("rheo_interface");
|
||||||
@ -110,13 +131,18 @@ void FixRHEO::post_constructor()
|
|||||||
{
|
{
|
||||||
compute_kernel = dynamic_cast<ComputeRHEOKernel *>(modify->add_compute(fmt::format("rheo_kernel all rheo/kernel {} {} {}", kernel_style, zmin_kernel, cut)));
|
compute_kernel = dynamic_cast<ComputeRHEOKernel *>(modify->add_compute(fmt::format("rheo_kernel all rheo/kernel {} {} {}", kernel_style, zmin_kernel, cut)));
|
||||||
|
|
||||||
if (thermal_flag)
|
fix_store_visc = dynamic_cast<FixStorePeratom *>(modify->add_fix("rheo_store_visc all STORE/PERATOM 0 1"))
|
||||||
compute_grad = dynamic_cast<ComputeRHEOGrad *>(modify->add_compute(fmt::format("rheo_grad all rheo/grad {} velocity rho viscosity temprature", cut)));
|
fix_store_visc->disable = 1;
|
||||||
else
|
viscosity = fix_store_visc->vstore;
|
||||||
compute_grad = dynamic_cast<ComputeRHEOGrad *>(modify->add_compute(fmt::format("rheo_grad all rheo/grad {} velocity rho viscosity", cut)));
|
fix_store_pres = dynamic_cast<FixStorePeratom *>(modify->add_fix("rheo_store_pres all STORE/PERATOM 0 1"))
|
||||||
compute_grad->fix_rheo = this;
|
pressure = fix_store_pres->vstore;
|
||||||
|
fix_store_pres->disable = 1;
|
||||||
|
|
||||||
compute_interface = dynamic_cast<ComputeRHEOInterface *>(modify->add_compute(fmt::format("rheo_interface all rheo/interface {}", cut)));
|
|
||||||
|
std::string cmd = "rheo_grad all rheo/grad {} velocity rho viscosity";
|
||||||
|
if (thermal_flag) cmd += "temperature";
|
||||||
|
compute_grad = dynamic_cast<ComputeRHEOGrad *>(modify->add_compute(fmt::format(cmd, cut)));
|
||||||
|
compute_grad->fix_rheo = this;
|
||||||
|
|
||||||
if (rhosum_flag)
|
if (rhosum_flag)
|
||||||
compute_rhosum = dynamic_cast<ComputeRHEORhoSum *>(modify->add_compute(fmt::format("rheo_rhosum all rheo/rho/sum {} {}", cut, zmin_rhosum)));
|
compute_rhosum = dynamic_cast<ComputeRHEORhoSum *>(modify->add_compute(fmt::format("rheo_rhosum all rheo/rho/sum {} {}", cut, zmin_rhosum)));
|
||||||
@ -124,11 +150,25 @@ void FixRHEO::post_constructor()
|
|||||||
if (shift_flag)
|
if (shift_flag)
|
||||||
compute_vshift = dynamic_cast<ComputeRHEOVShift *>(modify->add_compute(fmt::format("rheo_vshift all rheo/vshift {}", cut)));
|
compute_vshift = dynamic_cast<ComputeRHEOVShift *>(modify->add_compute(fmt::format("rheo_vshift all rheo/vshift {}", cut)));
|
||||||
|
|
||||||
|
if (surface_flag) {
|
||||||
|
fix_store_surf = dynamic_cast<FixStorePeratom *>(modify->add_fix("rheo_store_surf all STORE/PERATOM 0 1"))
|
||||||
|
surface = fix_store_surf->vstore;
|
||||||
|
fix_store_surf->disable = 1;
|
||||||
|
}
|
||||||
|
|
||||||
//todo here
|
if (thermal_flag) {
|
||||||
//allocate memory for viscosity, pressure, etc
|
fix_store_cond = dynamic_cast<FixStorePeratom *>(modify->add_fix("rheo_store_cond all STORE/PERATOM 0 1"))
|
||||||
//don't want to save to restart/datafiles (could disable fix store/state)
|
conductivity = fix_store_cond->vstore;
|
||||||
//but do want it available for dupm files
|
fix_store_cond->disable = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (interface_flag) {
|
||||||
|
compute_interface = dynamic_cast<ComputeRHEOInterface *>(modify->add_compute(fmt::format("rheo_interface all rheo/interface {}", cut)));
|
||||||
|
|
||||||
|
fix_store_fp = dynamic_cast<FixStorePeratom *>(modify->add_fix("rheo_store_fp all STORE/PERATOM 0 3"))
|
||||||
|
f_pressure = fix_store_fp->astore;
|
||||||
|
fix_store_fp->disable = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -158,19 +198,23 @@ void FixRHEO::init()
|
|||||||
void FixRHEO::setup_pre_force(int /*vflag*/)
|
void FixRHEO::setup_pre_force(int /*vflag*/)
|
||||||
{
|
{
|
||||||
// Check to confirm all accessory fixes are defined
|
// Check to confirm all accessory fixes are defined
|
||||||
if(!thermal_fix_defined && thermal_flag)
|
|
||||||
error->all(FLERR, "Missing fix rheo/thermal");
|
|
||||||
|
|
||||||
if (!viscosity_fix_defined)
|
if (!viscosity_fix_defined)
|
||||||
error->all(FLERR, "Missing fix rheo/viscosity");
|
error->all(FLERR, "Missing fix rheo/viscosity");
|
||||||
|
|
||||||
if (!pressure_fix_defined)
|
if (!pressure_fix_defined)
|
||||||
error->all(FLERR, "Missing fix rheo/pressure");
|
error->all(FLERR, "Missing fix rheo/pressure");
|
||||||
|
|
||||||
|
if(!thermal_fix_defined && thermal_flag)
|
||||||
|
error->all(FLERR, "Missing fix rheo/thermal");
|
||||||
|
|
||||||
|
if(!surface_fix_defined && surface_flag)
|
||||||
|
error->all(FLERR, "Missing fix rheo/surface");
|
||||||
|
|
||||||
// Reset to zero for next run
|
// Reset to zero for next run
|
||||||
thermal_fix_defined = 0;
|
thermal_fix_defined = 0;
|
||||||
viscosity_fix_defined = 0;
|
viscosity_fix_defined = 0;
|
||||||
pressure_fix_defined = 0;
|
pressure_fix_defined = 0;
|
||||||
|
surface_fix_defined = 0;
|
||||||
|
|
||||||
pre_force(0);
|
pre_force(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,17 +41,25 @@ class FixRHEO : public Fix {
|
|||||||
int thermal_flag;
|
int thermal_flag;
|
||||||
int rhosum_flag;
|
int rhosum_flag;
|
||||||
int shift_flag;
|
int shift_flag;
|
||||||
int solid_flag;
|
int interface_flag;
|
||||||
|
int surface_flag;
|
||||||
|
|
||||||
int thermal_fix_defined;
|
|
||||||
int viscosity_fix_defined;
|
int viscosity_fix_defined;
|
||||||
int pressure_fix_defined;
|
int pressure_fix_defined;
|
||||||
|
int thermal_fix_defined;
|
||||||
|
int surface_fix_defined;
|
||||||
|
|
||||||
// Non-persistent per-atom arrays are initialized here
|
// Non-persistent per-atom arrays
|
||||||
int *surface;
|
int *surface;
|
||||||
double *conductivity, *viscosity, *pressure;
|
double *conductivity, *viscosity, *pressure;
|
||||||
double **f_pressure;
|
double **f_pressure;
|
||||||
|
|
||||||
|
class FixStorePeratom *fix_store_visc;
|
||||||
|
class FixStorePeratom *fix_store_pres;
|
||||||
|
class FixStorePeratom *fix_store_cond;
|
||||||
|
class FixStorePeratom *fix_store_surf;
|
||||||
|
class FixStorePeratom *fix_store_fp;
|
||||||
|
|
||||||
class ComputeRHEOGrad *compute_grad;
|
class ComputeRHEOGrad *compute_grad;
|
||||||
class ComputeRHEOKernel *compute_kernel;
|
class ComputeRHEOKernel *compute_kernel;
|
||||||
class ComputeRHEOInterface *compute_interface;
|
class ComputeRHEOInterface *compute_interface;
|
||||||
|
|||||||
@ -39,6 +39,7 @@ FixRHEOViscosity::FixRHEOViscosity(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
viscosity_style = NONE;
|
viscosity_style = NONE;
|
||||||
|
|
||||||
comm_forward = 1;
|
comm_forward = 1;
|
||||||
|
nmax = atom->nmax;
|
||||||
|
|
||||||
int ntypes = atom->ntypes;
|
int ntypes = atom->ntypes;
|
||||||
int iarg = 3;
|
int iarg = 3;
|
||||||
@ -107,8 +108,10 @@ void FixRHEOViscosity::init()
|
|||||||
|
|
||||||
void FixRHEOViscosity::setup_pre_force(int /*vflag*/)
|
void FixRHEOViscosity::setup_pre_force(int /*vflag*/)
|
||||||
{
|
{
|
||||||
// Identify whether this is the last instance of fix viscosity
|
// Identify whether this is the first/last instance of fix viscosity
|
||||||
// Will handle communication
|
// First will handle growing arrays
|
||||||
|
// Last will handle communication
|
||||||
|
first_flag = 0
|
||||||
last_flag = 0;
|
last_flag = 0;
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -118,6 +121,7 @@ void FixRHEOViscosity::setup_pre_force(int /*vflag*/)
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (i == 0) first_flag = 1;
|
||||||
if ((i + 1) == fixlist.size()) last_flag = 1;
|
if ((i + 1) == fixlist.size()) last_flag = 1;
|
||||||
|
|
||||||
pre_force(0);
|
pre_force(0);
|
||||||
@ -138,6 +142,11 @@ void FixRHEOViscosity::pre_force(int /*vflag*/)
|
|||||||
int nlocal = atom->nlocal;
|
int nlocal = atom->nlocal;
|
||||||
int dim = domain->dimension;
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
if (first_flag & nmax < atom->nmax) {
|
||||||
|
nmax = atom->nmax;
|
||||||
|
fix_rheo->fix_store_visc->grow_arrays(nmax);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < nlocal; i++) {
|
for (i = 0; i < nlocal; i++) {
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
if (viscosity_style == CONSTANT) {
|
if (viscosity_style == CONSTANT) {
|
||||||
|
|||||||
@ -38,7 +38,8 @@ class FixRHEOViscosity : public Fix {
|
|||||||
double *eta_type, eta;
|
double *eta_type, eta;
|
||||||
double npow, K, gd0, tau0;
|
double npow, K, gd0, tau0;
|
||||||
int viscosity_style;
|
int viscosity_style;
|
||||||
int last_flag;
|
int first_flag, last_flag;
|
||||||
|
int nmax;
|
||||||
class FixRHEO *fix_rheo;
|
class FixRHEO *fix_rheo;
|
||||||
class ComputeRHEOGrad *compute_grad;
|
class ComputeRHEOGrad *compute_grad;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user