1 #ifndef __MAXWELL_SOLVER_H__ 2 #define __MAXWELL_SOLVER_H__ 15 double *recipDeltaX,
double *inputField,
double *outputField);
20 double *recipDeltaX,
double *Efield,
double *dBdt);
25 double *recipDeltaX,
double *Hfield,
double *J,
double *dDdt);
28 double *epsMu,
double *recipEpsMu);
31 double *epsMu,
double *Efield,
double *Dfield);
34 double *recipEpsMu,
double *Dfield,
double *Efield);
37 double *recipEpsMu,
double *Bfield,
double *Hfield);
40 double *epsMu,
double *Hfield,
double *Bfield);
44 template<
typename Gr
idT,
typename StateT,
typename OperatorT>
60 int Initialize(GridType &inGrid, StateType &inState,
const StateType ¶mState, OperatorType &inOperator)
91 int SetupRHS(GridType &inGrid, StateType &inState, StateType &rhsState,
int myThreadID = 0)
94 int masterThread = (myThreadID == 0);
135 bool masterThread = (threadID == 0);
141 int numBCs = domainBCs.size();
142 int numGridRegions = gridRegions.size();
143 int numDomainBoundaries = domainBoundaries.size();
147 if(numDomainBoundaries == 0)
150 typename std::vector<BoundaryType>::iterator dbIt = domainBoundaries.begin();
158 while(dbIt != domainBoundaries.end()) {
160 BoundaryType &domainBoundary(*dbIt++);
161 GridRegionType &gridRegion(gridRegions[domainBoundary.
GridRegionID()]);
162 std::vector<size_t> &threadPartBufferIndices(gridRegion.threadPartitionBufferIndices[threadID]);
163 size_t numBoundaryPoints = threadPartBufferIndices.size();
165 if(numBoundaryPoints > 0) {
167 BCType &boundaryCondition(domainBoundary.
BC());
169 int bcType = boundaryCondition.BCType();
174 int normalDir = gridRegion.normalDirection;
175 std::vector<size_t> regionSizes(gridRegion.regionInterval.Sizes());
176 size_t numPointsRegion = gridRegion.regionInterval.NNodes();
181 StateType &bcParamState(boundaryCondition.Params());
182 double *
bcParams = bcParamState.template GetFieldBuffer<double>(
"Numbers");
183 int *bcFlags = bcParamState.template GetFieldBuffer<int>(
"Flags");
186 const std::string &bcName(boundaryCondition.BCName());
209 std::cout <<
"MaxwellRHS:HandleBoundaryConditions: Error: SAT_FARFIELD" 210 <<
" has not been implemented (yet)." << std::endl;
218 for(
int iComp=0; iComp<3; iComp++) {
226 for(
int iComp=0; iComp<3; iComp++) {
236 std::cout <<
"MaxwellRHS:HandleBoundaryConditions: Error: SAT_SLIPWALL_ADIABATIC" 237 <<
" has not been implemented (yet)." << std::endl;
251 std::cout <<
"ERROR! MaxwellRHS:Could not resolve BC(" 252 << bcName <<
") = " << bcType << std::endl;
311 std::cout <<
"ComputeDV - Compute B-field from H-field failed." << std::endl;
318 std::cout <<
"ComputeDV - Compute D-field from E-field failed." << std::endl;
425 int masterThread = 1;
428 myThreadID = omp_get_thread_num();
429 masterThread = (myThreadID == 0);
442 mu0Handle = paramState.GetDataIndex(
"mu0");
446 mu0Ptr = mu0Data.Data<
double>();
451 cflHandle = paramState.GetDataIndex(
"inputCFL");
455 cflPtr = cflData.Data<
double>();
473 cRefPtr = cRefData.Data<
double>();
493 int masterThread = 1;
496 myThreadID = omp_get_thread_num();
497 masterThread = (myThreadID == 0);
505 timePtr = timeData.Data<
double>();
542 jHandle = inState.GetDataIndex(
"J");
546 jPtr = jData.Data<
double>();
558 epsilonHandle = inState.GetDataIndex(
"epsilon");
559 if(epsilonHandle < 0)
562 epsilonPtr = epsilonData.
Data<
double>();
566 muHandle = inState.GetDataIndex(
"mu");
570 muPtr = muData.
Data<
double>();
602 int masterThread = 1;
605 myThreadID = omp_get_thread_num();
606 numThreads = omp_get_num_threads();
607 masterThread = (myThreadID == 0);
617 if(numThreads == 1) {
621 std::cout <<
"CreateStencilConnectivity failed." << std::endl;
628 std::cout <<
"CreateStencilConnectivity failed." << std::endl;
660 int masterThread = 1;
663 myThreadID = omp_get_thread_num();
664 masterThread = (myThreadID == 0);
687 for(
int iStencil=0; iStencil<
numStencils; iStencil++)
747 int masterThread = 1;
750 myThreadId = omp_get_thread_num();
751 numThreads = omp_get_max_threads();
752 masterThread = (myThreadId == 0);
762 std::vector<pcpp::IndexIntervalType> &threadPartitionBufferIntervals(
gridPtr->ThreadPartitionBufferIntervals());
763 if(threadPartitionBufferIntervals.size() != numThreads)
767 std::vector<pcpp::IndexIntervalType> &threadBufferIntervals(
gridPtr->ThreadBufferIntervals());
768 if(threadBufferIntervals.size() != numThreads)
795 numThreads = omp_get_num_threads();
800 int masterThread = 1;
803 myThreadID = omp_get_thread_num();
804 masterThread = (myThreadID == 0);
838 std::vector<size_t>::iterator opIt =
opInterval.begin();
858 dEHandle = rhsState.GetFieldHandle(
"Efield");
859 dHHandle = rhsState.GetFieldHandle(
"Hfield");
886 int masterThread = 1;
889 myThreadID = omp_get_thread_num();
890 masterThread = (myThreadID == 0);
897 std::cout <<
"WARNING: Defaulting to periodic domain in RHS object." << std::endl;
930 int numDomainBoundaries = domainBoundaries.size();
931 int numGridRegions = gridRegions.size();
934 typename std::vector<BoundaryType>::iterator dbIt = domainBoundaries.begin();
936 while(dbIt != domainBoundaries.end()) {
938 BoundaryType &domainBoundary(*dbIt++);
939 GridRegionType &gridRegion(gridRegions[domainBoundary.
GridRegionID()]);
941 int boundaryNormalDirection = gridRegion.normalDirection;
945 if(boundaryNormalDirection != 0) {
949 boundaryPartitionInterval,
951 boundaryNormalDirection,
957 boundaryPartitionInterval,
962 assert(returnCode == 0);
988 size_t iDimxnumPointsBuffer;
991 if (
numDim != 3)
return(1);
993 for (
int iDim=0; iDim<
numDim; iDim++) {
995 oneOverDX = 1.0/
dX[iDim];
997 recipDX[iPoint+iDimxnumPointsBuffer] = oneOverDX;
1015 int masterThread = 1;
1018 myThreadID = omp_get_thread_num();
1019 numThreads = omp_get_num_threads();
1020 masterThread = (myThreadID == 0);
int SetParamState(const StateType ¶mState)
std::vector< size_t > gridSizes
int Initialize(GridType &inGrid, StateType &inState, const StateType ¶mState, OperatorType &inOperator)
int ComputeMaxwellRHS_Bfield(int numDim, size_t *numX, int numComponents, size_t numPoints, size_t *opInterval, int *stencilID, plascom2::operators::sbp::base &inOperator, double *recipDeltaX, double *Efield, double *dBdt)
pcpp::IndexIntervalType partitionInterval
rhs_base_t::BoundaryType BoundaryType
void SetDomainBoundaries(std::vector< BoundaryType > &domainBoundaries)
std::vector< int > & PeriodicDirs()
int ConvertBfieldtoHfield(int numDim, size_t numPoints, size_t *numX, size_t *opInterval, double *recipEpsMu, double *Bfield, double *Hfield)
void Flatten(ContainerType &output) const
void const size_t * numPoints
int CartNeighbors(std::vector< int > &neighborRanks)
int ComputeMaxwellRHS_Dfield(int numDim, size_t *numX, int numComponents, size_t numPoints, size_t *opInterval, int *stencilID, plascom2::operators::sbp::base &inOperator, double *recipDeltaX, double *Hfield, double *J, double *dDdt)
int HaloSetup(HaloType &inHalo)
int ComputeCurl(int numDim, size_t *numX, int numComponents, size_t numPoints, size_t *opInterval, int *stencilID, plascom2::operators::sbp::base &inOperator, double *recipDeltaX, double *inputField, double *outputField)
rhs_base_t::BCType BCType
pcpp::IndexIntervalType partitionBufferInterval
int BoundaryStencilConnectivity(std::vector< size_t > &bufferSizes, pcpp::IndexIntervalType &partitionInterval, pcpp::IndexIntervalType &partitionBufferInterval, pcpp::IndexIntervalType &boundaryInterval, int boundaryDepth, int boundaryDirection, int *stencilConnectivity)
Update a stencil connectivity with a boundary.
int InitStep(GridType &inGrid, StateType &inState)
std::vector< double > gridMetric
void SetDomainBCs(std::vector< BCType > &domainBCs)
std::vector< double * > & RHSBuffers()
int SetHalo(HaloType &inHalo)
int InitializeState(StateType &inState)
std::vector< double > recipEpsMu
size_t * numPointsStencil
void const size_t const size_t const size_t * opInterval
size_t numPointsPartition
std::vector< size_t > bufferSizes
simulation::rhs::domain_base< GridType, StateType, OperatorType > rhs_base_t
const double * epsilon0Ptr
int SetupStencilConnectivities()
std::vector< size_t > opInterval
std::vector< double > recipDX
std::vector< bool > haveHalo
double TimeStep(double *outCFL=NULL)
std::vector< double * > myStateBuffers
int ComputeDV(int threadID)
std::vector< double * > & StateBuffers()
int HoleStencilConnectivity(std::vector< size_t > &bufferSizes, pcpp::IndexIntervalType &partitionInterval, pcpp::IndexIntervalType &partitionBufferInterval, pcpp::IndexIntervalType &holeInterval, int holeStencil, int *stencilConnectivity)
Update a stencil connectivity with a hole.
std::vector< GridRegionType > * subRegionsPtr
int SetupOperator(OperatorType &inOperator)
void size_t int size_t int size_t int int int int double int int * stencilID
int MaxwellRHS(int threadID)
int ConvertHfieldtoBfield(int numDim, size_t numPoints, size_t *numX, size_t *opInterval, double *epsMu, double *Hfield, double *Bfield)
int SetRHSState(StateType &rhsState)
Main encapsulation of MPI.
int CreateStencilConnectivity(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int *stencilID, bool fortranInterval=false)
Creates simple stencil connectivity assuming all domain boundaries are physical boundaries.
int ComputeSATDirichletBC(const std::vector< size_t > &bufferIndices, double *rhsVar, double *stateVar, const double &value, const double &weight)
Encapsulation for a collection of operator stencils.
int ComputeRecipDXUniformGrid()
fixtures::CommunicatorType * gridCommPtr
int SetupRHS(GridType &inGrid, StateType &inState, StateType &rhsState, int myThreadID=0)
std::vector< BoundaryType > * domainBoundariesPtr
int SetGrid(GridType &inGrid)
int InitThreadIntervals()
int HandleBoundaryConditions(int threadID)
int ConvertEfieldtoDfield(int numDim, size_t numPoints, size_t *numX, size_t *opInterval, double *epsMu, double *Efield, double *Dfield)
std::vector< std::vector< size_t > > fortranBufferIntervals
simulation::grid::subregion GridRegionType
int ComputeRecipEpsMu(int numDim, size_t numPoints, size_t *numX, size_t *opInterval, double *epsMu, double *recipEpsMu)
std::vector< int > periodicDirs
std::vector< std::vector< size_t > > fortranPartitionBufferIntervals
int HandleSources(int threadID)
int ConvertDfieldtoEfield(int numDim, size_t numPoints, size_t *numX, size_t *opInterval, double *recipEpsMu, double *Dfield, double *Efield)
simulation::grid::halo HaloType
Simple Block Structured Mesh object.
void size_t int * numComponents
std::vector< double * > myRHSBuffers
void const size_t const size_t const int const size_t const size_t const size_t const size_t const int const double const double const double * bcParams
std::vector< BCType > * domainBCsPtr
std::vector< int > gridNeighbors
int SetState(StateType &inState)