restart for Poisson model

This commit is contained in:
James McClure 2022-07-29 18:11:32 -04:00
parent 3cc12ac36e
commit 777e216b35
7 changed files with 132 additions and 3 deletions

View File

@ -61,6 +61,9 @@ void ScaLBL_IonModel::ReadParams(string filename, vector<int> &num_iter) {
Ex_dummy = 0.0; //for debugging, unit [V/m]
Ey_dummy = 0.0; //for debugging, unit [V/m]
Ez_dummy = 0.0; //for debugging, unit [V/m]
sprintf(LocalRankString, "%05d", rank);
sprintf(LocalRestartFile, "%s%s", "Restart.", LocalRankString);
//--------------------------------------------------------------------------//
BoundaryConditionSolid = 0;
@ -329,6 +332,9 @@ void ScaLBL_IonModel::ReadParams(string filename) {
Ex_dummy = 0.0; //for debugging, unit [V/m]
Ey_dummy = 0.0; //for debugging, unit [V/m]
Ez_dummy = 0.0; //for debugging, unit [V/m]
sprintf(LocalRankString, "%05d", rank);
sprintf(LocalRestartFile, "%s%s", "Restart.", LocalRankString);
//--------------------------------------------------------------------------//
// Read domain parameters
@ -345,6 +351,9 @@ void ScaLBL_IonModel::ReadParams(string filename) {
if (ion_db->keyExists("tolerance")) {
tolerance = ion_db->getScalar<double>("tolerance");
}
if (ion_db->keyExists("Restart")) {
Restart = ion_db->getScalar<bool>("Restart");
}
if (ion_db->keyExists("temperature")) {
T = ion_db->getScalar<int>("temperature");
//re-calculate thermal voltage
@ -1114,6 +1123,43 @@ void ScaLBL_IonModel::Initialize() {
IonConcentration[ic], Np);
}
}
/** RESTART **/
if (Restart == true) {
if (rank == 0) {
printf(" ION MODEL: Reading restart file! \n");
}
double*cDist;
double *Ci_host;
cDist = new double[7 * number_ion_species * Np];
Ci_host = new double[number_ion_species * Np];
ifstream File(LocalRestartFile, ios::binary);
int idx;
double value,sum;
// Read the distributions
for (size_t ic = 0; ic < number_ion_species; ic++){
for (int n = 0; n < Np; n++) {
sum = 0.0;
for (int q = 0; q < 7; q++) {
File.read((char *)&value, sizeof(value));
cDist[ic * q * Np + n] = value;
sum += value;
}
Ci_host[ic * Np + n] = sum;
}
}
File.close();
// Copy the restart data to the GPU
ScaLBL_CopyToDevice(Ci, Ci_host, Np * number_ion_species* sizeof(double));
ScaLBL_CopyToDevice(fq, cDist, 7 * Np * number_ion_species *sizeof(double));
ScaLBL_Comm->Barrier();
comm.barrier();
delete[] Ci_host;
delete[] cDist;
}
/** END RESTART **/
if (rank == 0)
printf("LB Ion Solver: initializing charge density\n");
for (size_t ic = 0; ic < number_ion_species; ic++) {
@ -1594,6 +1640,32 @@ void ScaLBL_IonModel::RunMembrane(double *Velocity, double *ElectricField, doubl
//if (rank==0) printf("********************************************************\n");
}
void ScaLBL_IonModel::Checkpoint(){
if (rank == 0) {
printf(" ION MODEL: Writing restart file! \n");
}
int idx;
double value,sum;
double*cDist;
cDist = new double[7 * number_ion_species * Np];
ScaLBL_CopyToHost(cDist, fq, 7 * Np * number_ion_species *sizeof(double));
ofstream File(LocalRestartFile, ios::binary);
for (size_t ic = 0; ic < number_ion_species; ic++){
for (int n = 0; n < Np; n++) {
// Write the distributions
for (int q = 0; q < 7; q++) {
value = cDist[ic * q * Np + n];
File.write((char *)&value, sizeof(value));
}
}
}
File.close();
delete[] cDist;
}
void ScaLBL_IonModel::getIonConcentration(DoubleArray &IonConcentration,
const size_t ic) {

View File

@ -49,9 +49,10 @@ public:
void getIonFluxElectrical_debug(int timestep);
void DummyFluidVelocity();
void DummyElectricField();
void Checkpoint();
double CalIonDenConvergence(vector<double> &ci_avg_previous);
//bool Restart,pBC;
bool Restart;
int timestep;
vector<int> timestepMax;
int BoundaryConditionSolid;

View File

@ -16,6 +16,7 @@ void ScaLBL_Multiphys_Controller::ReadParams(string filename) {
// Default parameters
timestepMax = 10000;
Restart = false;
restart_interval = 100000;
num_iter_Stokes = 1;
num_iter_Ion.push_back(1);
analysis_interval = 500;
@ -35,6 +36,9 @@ void ScaLBL_Multiphys_Controller::ReadParams(string filename) {
visualization_interval =
study_db->getScalar<int>("visualization_interval");
}
if (study_db->keyExists("restart_interval")) {
restart_interval = study_db->getScalar<int>("restart_interval");
}
if (study_db->keyExists("tolerance")) {
tolerance = study_db->getScalar<double>("tolerance");
}

View File

@ -38,6 +38,7 @@ public:
vector<int> num_iter_Ion;
int analysis_interval;
int visualization_interval;
int restart_interval;
double tolerance;
double time_conv_max;
double time_conv_MainLoop;

View File

@ -66,8 +66,12 @@ void ScaLBL_Poisson::ReadParams(string filename){
TestPeriodicTime = 1.0;//unit: [sec]
TestPeriodicTimeConv = 0.01; //unit [sec/lt]
TestPeriodicSaveInterval = 0.1; //unit [sec]
Restart = "false";
// LB-Poisson Model parameters
if (electric_db->keyExists( "Restart" )){
Restart = electric_db->getScalar<bool>("Restart");
}
if (electric_db->keyExists( "timestepMax" )){
timestepMax = electric_db->getScalar<int>( "timestepMax" );
}
@ -134,6 +138,10 @@ void ScaLBL_Poisson::ReadParams(string filename){
//Re-calcualte model parameters if user updates input
epsilon0_LB = epsilon0*(h*1.0e-6);//unit:[C/(V*lu)]
epsilon_LB = epsilon0_LB*epsilonR;//electric permittivity
/* restart string */
sprintf(LocalRankString, "%05d", rank);
sprintf(LocalRestartFile, "%s%s", "Psi.", LocalRankString);
if (rank==0) printf("***********************************************************************************\n");
if (rank==0) printf("LB-Poisson Solver: steady-state MaxTimeStep = %i; steady-state tolerance = %.3g \n", timestepMax,tolerance);
@ -203,7 +211,7 @@ void ScaLBL_Poisson::ReadInput(){
sprintf(LocalRankString,"%05d",Dm->rank());
sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString);
sprintf(LocalRestartFile,"%s%s","Restart.",LocalRankString);
sprintf(LocalRestartFile,"%s%s","Psi.",LocalRankString);
if (domain_db->keyExists( "Filename" )){
@ -566,6 +574,21 @@ void ScaLBL_Poisson::Potential_Init(double *psi_init){
else{//mixed periodic and non-periodic BCs are not supported!
ERROR("Error: check the type of inlet and outlet boundary condition! Mixed periodic and non-periodic BCs are found!\n");
}
/** RESTART **/
if (Restart == true) {
if (rank == 0) {
printf(" POISSON MODEL: Reading restart file! \n");
}
ifstream File(LocalRestartFile, ios::binary);
double value;
// Read the distributions
for (int n = 0; n < Nx*Ny*Nz; n++) {
File.read((char *)&value, sizeof(value));
psi_init[ n] = value;
}
File.close();
}
/** END RESTART **/
}
double ScaLBL_Poisson::getBoundaryVoltagefromPeriodicBC(double V0, double freq, double phase_shift, int time_step){
@ -1040,6 +1063,27 @@ void ScaLBL_Poisson::SolvePoissonAAeven(double *ChargeDensity, bool UseSlippingV
}
}
void ScaLBL_Poisson::Checkpoint(){
if (rank == 0) {
printf(" POISSON MODEL: Writing restart file! \n");
}
double value;
double *cPsi;
cPsi = new double[Nx*Ny*Nz];
ScaLBL_CopyToHost(cPsi, Psi, Nx*Ny*Nz *sizeof(double));
ofstream File(LocalRestartFile, ios::binary);
for (int n = 0; n < Nx*Ny*Nz; n++) {
value = cPsi[n];
File.write((char *)&value, sizeof(value));
}
File.close();
delete[] cPsi;
}
void ScaLBL_Poisson::DummyChargeDensity(){
double *ChargeDensity_host;
ChargeDensity_host = new double[Np];

View File

@ -40,9 +40,11 @@ public:
void getElectricField(DoubleArray &Values_x, DoubleArray &Values_y,
DoubleArray &Values_z);
void getElectricField_debug(int timestep);
void Checkpoint();
void DummyChargeDensity(); //for debugging
//bool Restart,pBC;
bool Restart;
int timestep, timestepMax;
int analysis_interval;
int BoundaryConditionInlet;

View File

@ -149,6 +149,11 @@ int main(int argc, char **argv)
//IonModel.getIonConcentration_debug(timestep);
}
if (timestep%Study.restart_interval==0){
IonModel.Checkpoint();
PoissonSolver.Checkpoint();
}
}
if (rank==0) printf("Save simulation raw data at maximum timestep\n");