refactoring Restart

This commit is contained in:
James E McClure 2018-06-27 16:31:03 -04:00
parent aac2002926
commit dcb2ad878e
2 changed files with 96 additions and 37 deletions

View File

@ -5,6 +5,8 @@
#include "common/Communication.h" #include "common/Communication.h"
#include "common/MPI_Helpers.h" #include "common/MPI_Helpers.h"
#include "common/ScaLBL.h" #include "common/ScaLBL.h"
#include "models/ColorModel.h"
#include "IO/MeshDatabase.h" #include "IO/MeshDatabase.h"
#include "threadpool/thread_pool.h" #include "threadpool/thread_pool.h"
@ -42,21 +44,22 @@ public:
filename(filename_), phase(phase_), dist(dist_), N(N_) {} filename(filename_), phase(phase_), dist(dist_), N(N_) {}
virtual void run() { virtual void run() {
PROFILE_START("Save Checkpoint",1); PROFILE_START("Save Checkpoint",1);
char *IDS;
IDS = new char [N]; int q,n;
char local_id=0; double value;
for (int idx=0; idx<N; idx++){ ofstream File(filename,ios::binary);
if (dist(idx) < 0.f ) local_id = 0; for (int n=0; n<N; n++){
else if (phase(idx) > 0.f) local_id = 1; // Write the two density values
else local_id=2; value = cPhi[n];
IDS[idx] = local_id; File.write((char*) &value, sizeof(value));
// Write the distributions
for (int q=0; q<19; q++){
value = cfq[q*N+n];
File.write((char*) &value, sizeof(value));
}
} }
FILE *RESTART = fopen(filename,"wb"); File.close();
fwrite(IDS,1,N,RESTART);
// fwrite(Distance.get(),8,Distance.length(),ID);
fclose(RESTART);
PROFILE_STOP("Save Checkpoint",1); PROFILE_STOP("Save Checkpoint",1);
}; };
private: private:
WriteRestartWorkItem(); WriteRestartWorkItem();

View File

@ -14,6 +14,44 @@ ScaLBL_ColorModel::~ScaLBL_ColorModel(){
} }
/*void ScaLBL_ColorModel::WriteCheckpoint(const char *FILENAME, const double *cPhi, const double *cfq, int Np)
{
int q,n;
double value;
ofstream File(FILENAME,ios::binary);
for (n=0; n<Np; n++){
// Write the two density values
value = cPhi[n];
File.write((char*) &value, sizeof(value));
// Write the even distributions
for (q=0; q<19; q++){
value = cfq[q*Np+n];
File.write((char*) &value, sizeof(value));
}
}
File.close();
}
void ScaLBL_ColorModel::ReadCheckpoint(char *FILENAME, double *cPhi, double *cfq, int Np)
{
int q=0, n=0;
double value=0;
ifstream File(FILENAME,ios::binary);
for (n=0; n<Np; n++){
File.read((char*) &value, sizeof(value));
cPhi[n] = value;
// Read the distributions
for (q=0; q<19; q++){
File.read((char*) &value, sizeof(value));
cfq[q*Np+n] = value;
}
}
File.close();
}
*/
void ScaLBL_ColorModel::ReadParams(string filename){ void ScaLBL_ColorModel::ReadParams(string filename){
// read the input database // read the input database
db = std::make_shared<Database>( filename ); db = std::make_shared<Database>( filename );
@ -92,31 +130,8 @@ void ScaLBL_ColorModel::ReadInput(){
ReadBinaryFile(LocalRankFilename, Averages->SDs.data(), N); ReadBinaryFile(LocalRankFilename, Averages->SDs.data(), N);
MPI_Barrier(comm); MPI_Barrier(comm);
if (rank == 0) cout << "Domain set." << endl; if (rank == 0) cout << "Domain set." << endl;
// Read restart file
if (Restart == true){
if (rank==0){
printf("Reading restart file! \n");
ifstream restart("Restart.txt");
if (restart.is_open()){
restart >> timestep;
printf("Restarting from timestep =%i \n",timestep);
}
else{
printf("WARNING:No Restart.txt file, setting timestep=0 \n");
timestep=0;
}
}
MPI_Bcast(&timestep,1,MPI_INT,0,comm);
FILE *RESTART = fopen(LocalRestartFile,"rb");
if (RESTART==NULL) ERROR("lbpm_color_simulator: Error opening file: Restart.xxxxx");
readID=fread(id,1,N,RESTART);
if (readID != size_t(N)) printf("lbpm_color_simulator: Error reading Restart (rank=%i) \n",rank);
fclose(RESTART);
MPI_Barrier(comm);
}
} }
void ScaLBL_ColorModel::AssignComponentLabels(double *phase) void ScaLBL_ColorModel::AssignComponentLabels(double *phase)
{ {
size_t NLABELS=0; size_t NLABELS=0;
@ -320,6 +335,7 @@ void ScaLBL_ColorModel::AssignSolidPotential(){
delete [] Tmp; delete [] Tmp;
delete [] Dst; delete [] Dst;
/*
DoubleArray Psx(Nx,Ny,Nz); DoubleArray Psx(Nx,Ny,Nz);
DoubleArray Psy(Nx,Ny,Nz); DoubleArray Psy(Nx,Ny,Nz);
DoubleArray Psz(Nx,Ny,Nz); DoubleArray Psz(Nx,Ny,Nz);
@ -327,12 +343,14 @@ void ScaLBL_ColorModel::AssignSolidPotential(){
ScaLBL_Comm->RegularLayout(Map,&SolidPotential[0],Psx); ScaLBL_Comm->RegularLayout(Map,&SolidPotential[0],Psx);
ScaLBL_Comm->RegularLayout(Map,&SolidPotential[Np],Psy); ScaLBL_Comm->RegularLayout(Map,&SolidPotential[Np],Psy);
ScaLBL_Comm->RegularLayout(Map,&SolidPotential[2*Np],Psz); ScaLBL_Comm->RegularLayout(Map,&SolidPotential[2*Np],Psz);
for (int n=0; n<N; n++) Psnorm(n) = Psx(n)*Psx(n)+Psy(n)*Psy(n)+Psz(n)*Psz(n); for (int n=0; n<N; n++) Psnorm(n) = Psx(n)*Psx(n)+Psy(n)*Psy(n)+Psz(n)*Psz(n);
FILE *PFILE; FILE *PFILE;
sprintf(LocalRankFilename,"Potential.%05i.raw",rank); sprintf(LocalRankFilename,"Potential.%05i.raw",rank);
PFILE = fopen(LocalRankFilename,"wb"); PFILE = fopen(LocalRankFilename,"wb");
fwrite(Psnorm.data(),8,N,PFILE); fwrite(Psnorm.data(),8,N,PFILE);
fclose(PFILE); fclose(PFILE);
*/
} }
void ScaLBL_ColorModel::Initialize(){ void ScaLBL_ColorModel::Initialize(){
/* /*
@ -367,6 +385,44 @@ void ScaLBL_ColorModel::Initialize(){
if (rank==0) printf ("Initializing distributions \n"); if (rank==0) printf ("Initializing distributions \n");
ScaLBL_D3Q19_Init(fq, Np); ScaLBL_D3Q19_Init(fq, Np);
if (Restart == true){
if (rank==0){
printf("Reading restart file! \n");
ifstream restart("Restart.txt");
if (restart.is_open()){
restart >> timestep;
printf("Restarting from timestep =%i \n",timestep);
}
else{
printf("WARNING:No Restart.txt file, setting timestep=0 \n");
timestep=0;
}
}
MPI_Bcast(&timestep,1,MPI_INT,0,comm);
// Read in the restart file to CPU buffers
double *cPhi = new double[Np];
double *cDist = new double[19*Np];
ifstream File(LocalRestartFile,ios::binary);
for (n=0; n<Np; n++){
File.read((char*) &value, sizeof(value));
cPhi[n] = value;
// Read the distributions
for (q=0; q<19; q++){
File.read((char*) &value, sizeof(value));
cDist[q*Np+n] = value;
}
}
File.close();
// Copy the restart data to the GPU
ScaLBL_CopyToDevice(fq,cDist,19*Np*sizeof(double));
ScaLBL_CopyToDevice(Phi,cPhi,Np*sizeof(double));
ScaLBL_DeviceBarrier();
delete [] cPhi;
delete [] cDist;
MPI_Barrier(comm);
}
if (rank==0) printf ("Initializing phase field \n"); if (rank==0) printf ("Initializing phase field \n");
ScaLBL_DFH_Init(Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_DFH_Init(Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np);
ScaLBL_DFH_Init(Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_DFH_Init(Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np);