#include #include #include #include #include #include #include #include #include "models/IonModel.h" #include "models/StokesModel.h" #include "models/PoissonSolver.h" #include "models/MultiPhysController.h" #include "common/Utilities.h" #include "analysis/ElectroChemistry.h" using namespace std; //*************************************************************************** // Test lattice-Boltzmann Ion Model coupled with Poisson equation //*************************************************************************** int main(int argc, char **argv) { // Initialize MPI and error handlers //Utilities::startup( argc, argv ); Utilities::startup( argc, argv, true ); Utilities::MPI comm( MPI_COMM_WORLD ); int rank = comm.getRank(); int nprocs = comm.getSize(); { // Limit scope so variables that contain communicators will free before MPI_Finialize if (rank == 0){ printf("********************************************************\n"); printf("Running LBPM Nernst-Planck Membrane solver \n"); printf("********************************************************\n"); } // Initialize compute device int device=ScaLBL_SetDevice(rank); NULL_USE( device ); ScaLBL_DeviceBarrier(); comm.barrier(); PROFILE_ENABLE(1); //PROFILE_ENABLE_TRACE(); //PROFILE_ENABLE_MEMORY(); PROFILE_SYNCHRONIZE(); PROFILE_START("Main"); Utilities::setErrorHandlers(); auto filename = argv[1]; //ScaLBL_StokesModel StokesModel(rank,nprocs,comm); ScaLBL_IonModel IonModel(rank,nprocs,comm); ScaLBL_Poisson PoissonSolver(rank,nprocs,comm); ScaLBL_Multiphys_Controller Study(rank,nprocs,comm);//multiphysics controller coordinating multi-model coupling bool SlipBC = false; // Load controller information Study.ReadParams(filename); // Load user input database files for Navier-Stokes and Ion solvers //StokesModel.ReadParams(filename); // Setup other model specific structures //StokesModel.SetDomain(); //StokesModel.ReadInput(); //StokesModel.Create(); // creating the model will create data structure to match the pore structure and allocate variables //comm.barrier(); //if (rank == 0) printf("Stokes model setup complete\n"); IonModel.ReadParams(filename); IonModel.SetDomain(); IonModel.ReadInput(); IonModel.Create(); IonModel.SetMembrane(); comm.barrier(); if (rank == 0) printf("Ion model setup complete\n"); fflush(stdout); // Create analysis object ElectroChemistryAnalyzer Analysis(IonModel); // Get internal iteration number //StokesModel.timestepMax = Study.getStokesNumIter_PNP_coupling(StokesModel.time_conv,IonModel.time_conv); //StokesModel.Initialize(); // initializing the model will set initial conditions for variables //comm.barrier(); //if (rank == 0) printf("Stokes model initialized \n"); //fflush(stdout); //IonModel.timestepMax = Study.getIonNumIter_PNP_coupling(StokesModel.time_conv,IonModel.time_conv); IonModel.timestepMax = Study.getIonNumIter_NernstPlanck_coupling(IonModel.time_conv); IonModel.Initialize(); IonModel.DummyFluidVelocity(); comm.barrier(); if (rank == 0) printf("Ion model initialized \n"); // Get maximal time converting factor based on Sotkes and Ion solvers //Study.getTimeConvMax_PNP_coupling(StokesModel.time_conv,IonModel.time_conv); Study.time_conv_MainLoop = IonModel.timestepMax[0]*IonModel.time_conv[0]; //----------------------------------- print out for debugging ------------------------------------------// if (rank==0){ for (size_t i=0;i