/* * Ion transporte LB Model */ #ifndef ScaLBL_IonModel_INC #define ScaLBL_IonModel_INC #include #include #include #include #include #include #include #include #include "common/ScaLBL.h" #include "common/Communication.h" #include "common/Membrane.h" #include "common/MPI.h" #include "analysis/Minkowski.h" #include "ProfilerApp.h" class ScaLBL_IonModel { public: ScaLBL_IonModel(int RANK, int NP, const Utilities::MPI &COMM); ~ScaLBL_IonModel(); // functions in they should be run void ReadParams(string filename, vector &num_iter); void ReadParams(string filename); void ReadParams(std::shared_ptr db0); void SetDomain(); void SetMembrane(); void ReadInput(); void Create(); void Initialize(); void Run(double *Velocity, double *ElectricField); void RunMembrane(double *Velocity, double *ElectricField, double *Psi); void getIonConcentration(DoubleArray &IonConcentration, const size_t ic); void getIonConcentration_debug(int timestep); void getIonFluxDiffusive(DoubleArray &IonFlux_x, DoubleArray &IonFlux_y, DoubleArray &IonFlux_z, const size_t ic); void getIonFluxAdvective(DoubleArray &IonFlux_x, DoubleArray &IonFlux_y, DoubleArray &IonFlux_z, const size_t ic); void getIonFluxElectrical(DoubleArray &IonFlux_x, DoubleArray &IonFlux_y, DoubleArray &IonFlux_z, const size_t ic); void getIonFluxDiffusive_debug(int timestep); void getIonFluxAdvective_debug(int timestep); void getIonFluxElectrical_debug(int timestep); void DummyFluidVelocity(); void DummyElectricField(); void Checkpoint(); double CalIonDenConvergence(vector &ci_avg_previous); bool Restart; int timestep; vector timestepMax; int BoundaryConditionSolid; double h; //domain resolution, unit [um/lu] double kb, electron_charge, T, Vt; double k2_inv; double tolerance; double fluidVelx_dummy, fluidVely_dummy, fluidVelz_dummy; double Ex_dummy, Ey_dummy, Ez_dummy; size_t number_ion_species; vector BoundaryConditionInlet; vector BoundaryConditionOutlet; vector IonDiffusivity; //User input unit [m^2/sec] vector IonValence; vector IonConcentration; //unit [mol/m^3] vector MembraneIonConcentration; //unit [mol/m^3] vector ThresholdVoltage; vector MassFractionIn; vector MassFractionOut; vector ThresholdMassFractionIn; vector ThresholdMassFractionOut; vector Cin; //inlet boundary value, can be either concentration [mol/m^3] or flux [mol/m^2/sec] vector Cout; //outlet boundary value, can be either concentration [mol/m^3] or flux [mol/m^2/sec] vector tau; vector time_conv; int Nx, Ny, Nz, N, Np; int rank, nprocx, nprocy, nprocz, nprocs; double Lx, Ly, Lz; std::shared_ptr Dm; // this domain is for analysis std::shared_ptr Mask; // this domain is for lbm std::shared_ptr ScaLBL_Comm; // input databaseF std::shared_ptr db; std::shared_ptr domain_db; std::shared_ptr ion_db; IntArray Map; DoubleArray Distance; int *NeighborList; int *dvcMap; double *fq; double *Ci; double *ChargeDensity; double *IonSolid; double *FluidVelocityDummy; double *ElectricFieldDummy; double *FluxDiffusive; double *FluxAdvective; double *FluxElectrical; /* these support membrane capabilities */ bool USE_MEMBRANE; std::shared_ptr membrane_db; std::shared_ptr IonMembrane; DoubleArray MembraneDistance; int MembraneCount; // number of links the cross the membrane private: Utilities::MPI comm; // filenames char LocalRankString[8]; char LocalRankFilename[40]; char LocalRestartFile[40]; char OutputFilename[200]; //int rank,nprocs; void LoadParams(std::shared_ptr db0); void AssignSolidBoundary(double *ion_solid); void AssignIonConcentration_FromFile(double *Ci, const vector &File_ion, int ic); void AssignIonConcentrationMembrane( double *Ci, int ic); void IonConcentration_LB_to_Phys(DoubleArray &Den_reg); void IonFlux_LB_to_Phys(DoubleArray &Den_reg, const size_t ic); }; #endif