1 #ifndef __MAXWELL_UTIL_H__ 2 #define __MAXWELL_UTIL_H__ 9 template<
typename Gr
idType,
typename StateType>
15 const std::vector<size_t> &
bufferSizes(inGrid.BufferSizes());
18 if (numDim != 3)
return(1);
21 inState.AddField(
"simTime",
's',1,8,
"s");
23 inState.AddField(
"Efield",
'n',3,8,
"");
24 inState.AddField(
"Bfield",
'n',3,8,
"");
25 inState.AddField(
"Dfield",
'n',3,8,
"");
26 inState.AddField(
"Hfield",
'n',3,8,
"");
27 inState.AddField(
"J",
'n',3,8,
"");
28 inState.AddField(
"epsilonMu",
'n',2,8,
"");
30 inState.Create(numPointsBuffer, 0);
31 inState.SetStateFields(
"Efield Hfield");
34 inParams.AddField(
"epsilon0",
's',1,8,
"");
35 inParams.AddField(
"mu0",
's',1,8,
"");
37 inParams.AddField(
"inputCFL",
's',1,8,
"");
38 inParams.AddField(
"inputDT",
's',1,8,
"s");
39 inParams.AddField(
"refC",
's',1,8,
"speed");
41 inParams.Create(numPointsBuffer, 0);
48 template<
typename Gr
idType,
typename StateType>
50 double *constE,
double *constB,
double *constJ,
51 double &constEps,
double &constMu,
52 bool everyWhere =
false)
56 int timeHandle = inState.GetDataIndex(
"simTime");
60 double *timePtr = timeData.
Data<
double>();
64 int EfieldHandle = inState.GetDataIndex(
"Efield");
68 double *EfieldPtr = EfieldData.
Data<
double>();
72 int BfieldHandle = inState.GetDataIndex(
"Bfield");
76 double *BfieldPtr = BfieldData.
Data<
double>();
80 int DfieldHandle = inState.GetDataIndex(
"Dfield");
84 double *DfieldPtr = DfieldData.
Data<
double>();
88 int HfieldHandle = inState.GetDataIndex(
"Hfield");
92 double *HfieldPtr = HfieldData.
Data<
double>();
96 int JHandle = inState.GetDataIndex(
"J");
100 double *JPtr = JData.
Data<
double>();
104 int epsilonMuHandle = inState.GetDataIndex(
"epsilonMu");
105 if(epsilonMuHandle < 0)
108 double *epsilonMuPtr = epsilonMuData.
Data<
double>();
114 const std::vector<size_t> &
gridSizes(inGrid.GridSizes());
115 const std::vector<size_t> &
bufferSizes(inGrid.BufferSizes());
120 if (numDim != 3)
return(-1);
125 std::vector<double> constD(3, 0.0);
126 constD[0]=constEps*constE[0];
127 constD[1]=constEps*constE[1];
128 constD[2]=constEps*constE[2];
130 std::vector<double> constH(3, 0.0);
131 constH[0]=constB[0]/constMu;
132 constH[1]=constB[1]/constMu;
133 constH[2]=constB[2]/constMu;
141 epsilonMuPtr[iPoint] = constEps;
144 EfieldPtr[iPoint] = constE[0];
146 EfieldPtr[iPoint+twoxnumPointsBuffer] = constE[2];
148 BfieldPtr[iPoint] = constB[0];
150 BfieldPtr[iPoint+twoxnumPointsBuffer] = constB[2];
152 DfieldPtr[iPoint] = constD[0];
154 DfieldPtr[iPoint+twoxnumPointsBuffer] = constD[2];
156 HfieldPtr[iPoint] = constH[0];
158 HfieldPtr[iPoint+twoxnumPointsBuffer] = constH[2];
160 JPtr[iPoint] = constJ[0];
162 JPtr[iPoint+twoxnumPointsBuffer] = constJ[2];
168 size_t iStart = partitionBufferInterval[0].first;
169 size_t iEnd = partitionBufferInterval[0].second;
170 size_t jStart = partitionBufferInterval[1].first;
171 size_t jEnd = partitionBufferInterval[1].second;
172 size_t kStart = partitionBufferInterval[2].first;
173 size_t kEnd = partitionBufferInterval[2].second;
178 for(
size_t kIndex=kStart; kIndex<=kEnd; kIndex++) {
179 size_t kBufferIndex = kIndex*nPlane;
180 for(
size_t jIndex=jStart; jIndex<=jEnd; jIndex++) {
181 size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes[0];
182 for(
size_t iIndex=iStart; iIndex<=iEnd; iIndex++) {
183 size_t bufferIndex = jkBufferIndex + iIndex;
185 epsilonMuPtr[bufferIndex] = constEps;
188 EfieldPtr[bufferIndex] = constE[0];
190 EfieldPtr[bufferIndex+twoxnumPointsBuffer] = constE[2];
192 BfieldPtr[bufferIndex] = constB[0];
194 BfieldPtr[bufferIndex+twoxnumPointsBuffer] = constB[2];
196 DfieldPtr[bufferIndex] = constD[0];
198 DfieldPtr[bufferIndex+twoxnumPointsBuffer] = constD[2];
200 HfieldPtr[bufferIndex] = constH[0];
202 HfieldPtr[bufferIndex+twoxnumPointsBuffer] = constH[2];
204 JPtr[bufferIndex] = constJ[0];
206 JPtr[bufferIndex+twoxnumPointsBuffer] = constJ[2];
218 template<
typename Gr
idType,
typename StateType>
223 int timeHandle = inState.GetDataIndex(
"simTime");
227 double *timePtr = timeData.
Data<
double>();
231 int EfieldHandle = inState.GetDataIndex(
"Efield");
235 double *EfieldPtr = EfieldData.
Data<
double>();
239 int BfieldHandle = inState.GetDataIndex(
"Bfield");
243 double *BfieldPtr = BfieldData.
Data<
double>();
247 int DfieldHandle = inState.GetDataIndex(
"Dfield");
251 double *DfieldPtr = DfieldData.
Data<
double>();
255 int HfieldHandle = inState.GetDataIndex(
"Hfield");
259 double *HfieldPtr = HfieldData.
Data<
double>();
263 int JHandle = inState.GetDataIndex(
"J");
267 double *JPtr = JData.
Data<
double>();
271 int epsilonMuHandle = inState.GetDataIndex(
"epsilonMu");
272 if(epsilonMuHandle < 0)
275 double *epsilonMuPtr = epsilonMuData.
Data<
double>();
281 const std::vector<size_t> &
gridSizes(inGrid.GridSizes());
282 const std::vector<size_t> &
bufferSizes(inGrid.BufferSizes());
287 if (numDim != 3)
return(-1);
293 size_t iStart = partitionBufferInterval[0].first;
294 size_t iEnd = partitionBufferInterval[0].second;
295 size_t jStart = partitionBufferInterval[1].first;
296 size_t jEnd = partitionBufferInterval[1].second;
297 size_t kStart = partitionBufferInterval[2].first;
298 size_t kEnd = partitionBufferInterval[2].second;
303 size_t iStartG = partitionInterval[0].first;
304 size_t iEndG = partitionInterval[0].second;
305 size_t jStartG = partitionInterval[1].first;
306 size_t jEndG = partitionInterval[1].second;
307 size_t kStartG = partitionInterval[2].first;
308 size_t kEndG = partitionInterval[2].second;
312 for(
size_t kIndex=kStart; kIndex<=kEnd; kIndex++) {
313 size_t kBufferIndex = kIndex*nPlane;
314 size_t kGridIndex = (kStartG+kIndex-kStart)*nPlaneG;
315 for(
size_t jIndex=jStart; jIndex<=jEnd; jIndex++) {
316 size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes[0];
317 size_t jkGridIndex = kGridIndex + (jStartG+jIndex-jStart)*gridSizes[0];
318 for(
size_t iIndex=iStart; iIndex<=iEnd; iIndex++) {
319 size_t bufferIndex = jkBufferIndex + iIndex;
320 size_t gridIndex = jkGridIndex + (iStartG+iIndex-iStart+1);
322 epsilonMuPtr[bufferIndex] = gridIndex;
325 EfieldPtr[bufferIndex] = gridIndex;
327 EfieldPtr[bufferIndex+twoxnumPointsBuffer] = gridIndex;
329 BfieldPtr[bufferIndex] = gridIndex;
331 BfieldPtr[bufferIndex+twoxnumPointsBuffer] = gridIndex;
333 DfieldPtr[bufferIndex] = gridIndex*gridIndex;
335 DfieldPtr[bufferIndex+twoxnumPointsBuffer] = gridIndex*gridIndex;
337 HfieldPtr[bufferIndex] = 1.0;
339 HfieldPtr[bufferIndex+twoxnumPointsBuffer] = 1.0;
341 JPtr[bufferIndex] = gridIndex;
343 JPtr[bufferIndex+twoxnumPointsBuffer] = gridIndex;
353 template<
typename Gr
idType,
typename StateType>
358 int eps0Handle = inParams.GetDataIndex(
"epsilon0");
362 double *eps0Ptr = eps0Data.
Data<
double>();
366 int mu0Handle = inParams.GetDataIndex(
"mu0");
370 double *mu0Ptr = mu0Data.
Data<
double>();
374 int CFLHandle = inParams.GetDataIndex(
"inputCFL");
378 double *CFLPtr = CFLData.
Data<
double>();
382 int deltaTHandle = inParams.GetDataIndex(
"inputDT");
386 double *deltaTPtr = deltaTData.
Data<
double>();
390 int cRefHandle = inParams.GetDataIndex(
"refC");
394 double *cRefPtr = cRefData.
Data<
double>();
399 const std::vector<double> &dX(inGrid.DX());
400 const std::vector<size_t> &
bufferSizes(inGrid.BufferSizes());
403 if (numDim != 3)
return(-1);
405 std::vector<double>::const_iterator dxIt = dX.begin();
406 double minSpacing = *dxIt;
407 while(dxIt != dX.end()) {
408 if(*dxIt < minSpacing) minSpacing = *dxIt;
412 *eps0Ptr = 8.85418782e-12;
413 *mu0Ptr = 1.25663706e-6;
416 *cRefPtr = 299792458.131;
417 *deltaTPtr = (*CFLPtr)*minSpacing/(*cRefPtr);
458 template<
typename Gr
idType,
typename StateType>
460 const std::vector<double> &inputParams,
461 const std::vector<int> &inputFlags,
466 double pulseAmp = 1.0;
467 double pulseWidth = 0.01;
468 double pulseCutOffWidth = 1.0;
469 double pulseCenterX = 0.0;
471 int numInputParams = inputParams.size();
473 if(numInputParams > 0)
474 pulseAmp = inputParams[0];
475 if(numInputParams > 1)
476 pulseWidth = inputParams[1];
477 if(numInputParams > 2)
478 pulseCutOffWidth = inputParams[2];
479 if(numInputParams > 3)
480 pulseCenterX = inputParams[3];
484 const std::vector<size_t> &
bufferSizes(inGrid.BufferSizes());
485 const std::vector<size_t> &
gridSizes(inGrid.GridSizes());
488 const std::vector<simulation::grid::subregion> &gridSubRegions(inGrid.SubRegions());
489 const std::vector<double> &dX(inGrid.DX());
490 const std::vector<double> &coordinateData(inGrid.CoordinateData());
491 const std::vector<double> &physicalExtent(inGrid.PhysicalExtent());
497 std::cout <<
"GaussianPulse1DXDir: Grid Sizes: (";
499 std::cout <<
")" << std::endl
500 <<
"GaussianPulse1DXDir: Partition Interval: ";
501 partitionInterval.PrettyPrint(std::cout);
502 std::cout << std::endl <<
"GaussianPulse1DXDir: Partition Buffer Interval: ";
503 partitionBufferInterval.PrettyPrint(std::cout);
504 std::cout << std::endl;
506 std::cout <<
"GaussianPulse1DXDir: Amplitude: " 507 << pulseAmp << std::endl
508 <<
"GaussianPulse1DXDir: Width: " 509 << pulseWidth << std::endl
510 <<
"GaussianPulse1DXDir: CutOffWidth: " 511 << pulseCutOffWidth << std::endl
512 <<
"GaussianPulse1DXDir: CenterX: " 513 << pulseCenterX << std::endl;
516 int timeHandle = inState.GetDataIndex(
"simTime");
520 double *timePtr = timeData.
Data<
double>();
524 int EfieldHandle = inState.GetDataIndex(
"Efield");
528 double *EfieldPtr = EfieldData.
Data<
double>();
532 int BfieldHandle = inState.GetDataIndex(
"Bfield");
536 double *BfieldPtr = BfieldData.
Data<
double>();
540 int DfieldHandle = inState.GetDataIndex(
"Dfield");
544 double *DfieldPtr = DfieldData.
Data<
double>();
548 int HfieldHandle = inState.GetDataIndex(
"Hfield");
552 double *HfieldPtr = HfieldData.
Data<
double>();
556 int JHandle = inState.GetDataIndex(
"J");
560 double *JPtr = JData.
Data<
double>();
564 int epsilonMuHandle = inState.GetDataIndex(
"epsilonMu");
565 if(epsilonMuHandle < 0)
568 double *epsilonMuPtr = epsilonMuData.
Data<
double>();
573 int eps0Handle = inParams.GetDataIndex(
"epsilon0");
577 double *eps0Ptr = eps0Data.
Data<
double>();
581 int mu0Handle = inParams.GetDataIndex(
"mu0");
585 double *mu0Ptr = mu0Data.
Data<
double>();
589 int CFLHandle = inParams.GetDataIndex(
"inputCFL");
593 double *CFLPtr = CFLData.
Data<
double>();
597 int deltaTHandle = inParams.GetDataIndex(
"inputDT");
601 double *deltaTPtr = deltaTData.
Data<
double>();
605 int cRefHandle = inParams.GetDataIndex(
"refC");
609 double *cRefPtr = cRefData.
Data<
double>();
616 if(numDim != 3)
return(-1);
618 double recipCRef = 1.0/(*cRefPtr);
620 size_t iStart = partitionBufferInterval[0].first;
621 size_t iEnd = partitionBufferInterval[0].second;
622 size_t jStart = partitionBufferInterval[1].first;
623 size_t jEnd = partitionBufferInterval[1].second;
624 size_t kStart = partitionBufferInterval[2].first;
625 size_t kEnd = partitionBufferInterval[2].second;
627 for(
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
628 size_t kBufferIndex = kIndex*nPlane;
629 for(
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
630 size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes[0];
631 for(
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
632 size_t bufferIndex = jkBufferIndex + iIndex;
634 size_t iPartIndex = (iIndex - iStart) + partitionInterval[0].first;
635 double x = iPartIndex*dX[0];
636 double xRad = x - pulseCenterX;
638 if(std::fabs(xRad) <= pulseCutOffWidth) {
int InitializeMaxwellParameters(const GridType &inGrid, StateType &inParams, double CFLValue)
int InitializeMaxwellStateConstFields(const GridType &inGrid, StateType &inState, double *constE, double *constB, double *constJ, double &constEps, double &constMu, bool everyWhere=false)
int InitializeGaussianPulse1DXDir(const GridType &inGrid, StateType &inState, StateType &inParams, const std::vector< double > &inputParams, const std::vector< int > &inputFlags, int threadID)
void const size_t const size_t * gridSizes
void const size_t const size_t const size_t const double const double * x
int InitializeMaxwellStateGridIndices(const GridType &inGrid, StateType &inState)
int SetupMaxwellStateAndParameters(const GridType &inGrid, StateType &inState, StateType &inParams)
void const size_t const size_t * bufferSizes
Simple Block Structured Mesh object.
void InitSimple(const ContainerType &inSize)
void const size_t * numPointsBuffer
double Pulse(double amp, double width, double centerX, double centerY, double centerZ, double x, double y, double z)