22 double epsLarge = 1e-3;
37 std::ostringstream messageStream;
41 for(
int numDim = 2;numDim < 4;numDim++){
44 operator_t sbpOperator;
45 halo_t &simHalo(simGrid.
Halo());
49 weno_t &coeffsWENO(rhsWENO.WENOCoefficients());
51 bool parTestWENO =
true;
55 gridSizes,2,testComm,&messageStream)){
56 std::cout <<
"CreateSimulationFixtures failed: " << messageStream.str() << std::endl;
60 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Equal:InitFixtures",parTestWENO);
73 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Equal:SetupState",parTestWENO);
78 std::cout << messageStream.str() << std::endl;
79 std::cout <<
"WENO:ApplyWENO:Equal:Testing WENO in " << numDim <<
" dimensions." << std::endl;
88 std::vector<double> numbers(4,0.0);
92 paramState.
Create(numPointsBuffer,0);
101 std::vector<double> rho(numPointsBuffer,-1000.0);
102 std::vector<double> rhoV(numDim*numPointsBuffer,-1000.0);
103 std::vector<double> rhoE(numPointsBuffer,-1000.0);
105 size_t iStart = partitionBufferInterval[0].first;
106 size_t iEnd = partitionBufferInterval[0].second;
107 size_t jStart = partitionBufferInterval[1].first;
108 size_t jEnd = partitionBufferInterval[1].second;
115 kStart = partitionBufferInterval[2].first;
116 kEnd = partitionBufferInterval[2].second;
119 for (
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
121 for (
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
122 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
123 for (
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
124 size_t bufferIndex = jBufferIndex + iIndex;
125 rho[bufferIndex] = 1.0;
126 for (
int vDim=0; vDim<numDim; vDim++) {
129 rhoE[bufferIndex] = 4.0 + 0.5*numDim;
135 std::vector<double> dRho(numPointsBuffer,-1000.0);
136 std::vector<double> dRhoV(numDim*numPointsBuffer,-1000.0);
137 std::vector<double> dRhoE(numPointsBuffer,-1000.0);
139 std::vector<double> T(numPointsBuffer,0.0);
140 std::vector<double> p(numPointsBuffer,0.0);
141 std::vector<double>
V(numDim*numPointsBuffer,0.0);
143 std::vector<double> rhom1(numPointsBuffer,0.0);
146 simState.SetFieldBuffer(
"simTime",&t);
147 simState.SetFieldBuffer(
"rho",&rho[0]);
148 simState.SetFieldBuffer(
"rhoV",&rhoV[0]);
149 simState.SetFieldBuffer(
"rhoE",&rhoE[0]);
151 simState.SetFieldBuffer(
"pressure",&p[0]);
152 simState.SetFieldBuffer(
"temperature",&T[0]);
153 simState.SetFieldBuffer(
"velocity",&V[0]);
154 simState.SetFieldBuffer(
"rhom1",&rhom1[0]);
156 state_t rhsState(simState);
163 std::vector<double> inParams;
164 std::vector<int> inFlags;
172 std::cout <<
"Calling rhsWENO initialize." << std::endl;
173 if(rhsWENO.Initialize(simGrid,simState,paramState,sbpOperator)){
176 std::cout <<
"Calling rhsWENO initialize DONE!!." << std::endl;
177 std::vector<int> numThreadsDim;
178 std::cout <<
"MADE IT HERE" << std::endl;
180 std::cout <<
"Setting up threads for grid object failed." << std::endl;
183 std::cout <<
"MADE IT HERE2" << std::endl;
184 rhsWENO.InitThreadIntervals();
185 std::cout <<
"MADE IT HERE3" << std::endl;
187 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Equal:InitRHS",parTestWENO);
191 if(rhsWENO.SetupRHS(simGrid,simState,rhsState)){
195 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Equal:SetupRHS",parTestWENO);
205 rhsWENO.ExchangeState(0);
218 for (
size_t kIndex = 0; kIndex < kFinal && parTestWENO; kIndex++) {
220 for (
size_t jIndex = 0; jIndex < bufferSizes[1] && parTestWENO; jIndex++) {
221 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
222 for (
size_t iIndex = 0; iIndex < bufferSizes[0] && parTestWENO; iIndex++) {
223 size_t bufferIndex = jBufferIndex + iIndex;
226 if (iIndex < iStart || iIndex > iEnd) c++;
227 if (jIndex < jStart || jIndex > jEnd) c++;
228 if (numDim == 3 && (kIndex < kStart || kIndex > kEnd)) c++;
229 if (c != 1)
continue;
231 if (std::abs(rho[bufferIndex] - 1.0) > eps) {
233 std::cout <<
"Failed state exchange, rho " << rho[bufferIndex] << std::endl;
235 for (
int vDim=0; vDim<numDim; vDim++) {
236 if (std::abs(rhoV[bufferIndex + vDim*numPointsBuffer] - 1.0) > eps) {
238 std::cout <<
"Failed state exchange, rhoV" << vDim <<
" " 242 if (std::abs(rhoE[bufferIndex] - (4.0 + 0.5*numDim)) > eps) {
244 std::cout <<
"Failed state exchange, rhoE " << rhoE[bufferIndex] << std::endl;
248 std::cout <<
"iIndex = " << iIndex <<
", jIndex = " << jIndex
249 <<
", kIndex = " << kIndex << std::endl;
250 std::cout <<
"iStart = " << iStart <<
", jStart = " << jStart
251 <<
", kStart = " << kStart << std::endl;
252 std::cout <<
"iEnd = " << iEnd <<
", jEnd = " << jEnd
253 <<
", kEnd = " << kEnd << std::endl;
259 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Equal:ExchangeState",parTestWENO);
264 double *inviscidFluxBuffer(rhsWENO.InviscidFluxBuffer());
265 double *dFluxBuffer(rhsWENO.DFluxBuffer());
267 for(
int iDim = 0;iDim < numDim;iDim++){
270 std::cout <<
"Checking WENO in dimension(" << iDim <<
")" 275 for (
int j=0; j<numDim+2; j++) {
276 size_t bufferIndex = j*numPointsBuffer + i;
277 dFluxBuffer[bufferIndex] = -1000;
281 rhsWENO.ComputeDV(0);
282 rhsWENO.InviscidFlux(iDim,0);
283 rhsWENO.ExchangeInviscidFlux(0);
299 double expectedMassFlux = 1.0;
300 std::vector<double> expectedMomFlux(numDim,1.0);
301 expectedMomFlux[iDim] = 2.6;
302 double expectedEnergyFlux = 5.6+.5*numDim;
304 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
306 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
307 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
308 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
309 size_t bufferIndex = jBufferIndex + iIndex;
310 double actualMassFlux = inviscidFluxBuffer[bufferIndex];
311 if(std::abs(actualMassFlux - expectedMassFlux) > eps){
313 std::cout <<
"MassFlux(actual,expected) = (" << actualMassFlux
314 <<
"," << expectedMassFlux <<
")" << std::endl;
316 for(
int vDim = 0;vDim < numDim;vDim++){
317 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
318 double actualMomFlux = inviscidFluxBuffer[vIndex];
319 if(std::abs(actualMomFlux - expectedMomFlux[vDim]) > eps) {
321 std::cout <<
"MomFlux(actual,expected) = (" << actualMomFlux
322 <<
"," << expectedMomFlux[vDim] <<
")" << std::endl;
325 size_t bufferIndexE = bufferIndex + (numDim+1)*numPointsBuffer;
326 double actualEnergyFlux = inviscidFluxBuffer[bufferIndexE];
327 if(std::abs(actualEnergyFlux- expectedEnergyFlux) > eps){
329 std::cout <<
"EnergyFlux(actual,expected) = (" << actualEnergyFlux
330 <<
"," << expectedEnergyFlux <<
")" << std::endl;
336 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Equal:FluxCheck",parTestWENO);
341 int statusWENO = rhsWENO.ApplyWENO(iDim,0);
344 std::cout <<
"ApplyWENO returned error code " << statusWENO << std::endl;
347 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Equal:ErrorApplyWENO",parTestWENO);
354 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
356 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
357 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
358 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
359 size_t bufferIndex = jBufferIndex + iIndex;
360 for(
int eqn = 0; eqn < numDim+2; eqn++){
362 if(std::abs(dFluxBuffer[eIndex]) > eps)
365 std::cout <<
"Failed dFluxBuffer " << dFluxBuffer[eIndex] << std::endl;
372 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Equal:dFluxCheck",parTestWENO);
385 for(
int numDim = 2;numDim < 4;numDim++){
387 std::cout <<
"TestWENO:ApplyWENO:Jump:Testing WENO in " << numDim <<
" dimensions." << std::endl;
389 for (
int jumpDim=0; jumpDim<numDim; jumpDim++) {
391 operator_t sbpOperator;
392 halo_t &simHalo(simGrid.
Halo());
396 weno_t &coeffsWENO(rhsWENO.WENOCoefficients());
398 bool parTestWENO =
true;
400 double length = 20.0;
401 std::vector<size_t>
gridSizes(numDim,numPoints);
402 double dx = length/(numPoints - 1);
405 gridSizes,2,testComm,&messageStream)){
415 std::vector<int> cartNeighbors;
417 gridCommPtr->CartNeighbors(cartNeighbors);
420 int xyzMessageId = simHalo.CreateMessageBuffers(numDim);
421 simHalo.PackMessageBuffers(xyzMessageId,0,numDim,&gridCoords[0]);
423 simHalo.SendMessage(0,cartNeighbors,testComm);
424 simHalo.ReceiveMessage(0,cartNeighbors,testComm);
425 simHalo.UnPackMessageBuffers(0,0,numDim,&gridCoords[0]);
427 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Jump:InitFixtures",parTestWENO);
440 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Jump:SetupState",parTestWENO);
445 std::cout << messageStream.str() << std::endl;
446 std::cout <<
"Testing WENO jump in " << jumpDim <<
" dimension." << std::endl;
455 std::vector<double> numbers(4,0.0);
459 paramState.
Create(numPointsBuffer,0);
468 std::vector<double> rho(numPointsBuffer,-1000.0);
469 std::vector<double> rhoV(numDim*numPointsBuffer,-1000.0);
470 std::vector<double> rhoE(numPointsBuffer,-1000.0);
475 double rhoEL = 4.0 + 2.0*numDim;
480 double rhoER = 8.0 + 9.0*numDim;
483 double loc1 = 0.25*length;
484 double loc2 = 0.75*length;
487 double checkLoc1 = loc1;
488 double checkLoc2 = loc2 + dx;
490 size_t iStart = partitionBufferInterval[0].first;
491 size_t iEnd = partitionBufferInterval[0].second;
492 size_t jStart = partitionBufferInterval[1].first;
493 size_t jEnd = partitionBufferInterval[1].second;
500 kStart = partitionBufferInterval[2].first;
501 kEnd = partitionBufferInterval[2].second;
504 for (
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
506 for (
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
507 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
508 for (
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
509 size_t bufferIndex = jBufferIndex + iIndex;
513 if (cloc < loc1 || cloc > loc2) {
514 rho[bufferIndex] = rhoL;
515 for (
int vDim=0; vDim<numDim; vDim++) {
518 rhoE[bufferIndex] = rhoEL;
520 rho[bufferIndex] = rhoR;
521 for (
int vDim=0; vDim<numDim; vDim++) {
524 rhoE[bufferIndex] = rhoER;
530 std::vector<double> dRho(numPointsBuffer,-1000.0);
531 std::vector<double> dRhoV(numDim*numPointsBuffer,-1000.0);
532 std::vector<double> dRhoE(numPointsBuffer,-1000.0);
534 std::vector<double> T(numPointsBuffer,0.0);
535 std::vector<double> p(numPointsBuffer,0.0);
536 std::vector<double>
V(numDim*numPointsBuffer,0.0);
538 std::vector<double> rhom1(numPointsBuffer,0.0);
540 simState.SetFieldBuffer(
"simTime",&t);
541 simState.SetFieldBuffer(
"rho",&rho[0]);
542 simState.SetFieldBuffer(
"rhoV",&rhoV[0]);
543 simState.SetFieldBuffer(
"rhoE",&rhoE[0]);
545 simState.SetFieldBuffer(
"pressure",&p[0]);
546 simState.SetFieldBuffer(
"temperature",&T[0]);
547 simState.SetFieldBuffer(
"velocity",&V[0]);
548 simState.SetFieldBuffer(
"rhom1",&rhom1[0]);
550 state_t rhsState(simState);
557 std::vector<double> inParams;
558 std::vector<int> inFlags;
560 if(rhsWENO.Initialize(simGrid,simState,paramState,sbpOperator)){
563 std::vector<int> numThreadsDim;
565 std::cout <<
"Setting up threads for grid object failed." << std::endl;
568 rhsWENO.InitThreadIntervals();
570 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Jump:InitRHS",parTestWENO);
575 if(rhsWENO.SetupRHS(simGrid,simState,rhsState)){
579 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Jump:SetupRHS",parTestWENO);
589 rhsWENO.ExchangeState(0);
602 for (
size_t kIndex = 0; kIndex < kFinal && parTestWENO; kIndex++) {
604 for (
size_t jIndex = 0; jIndex < bufferSizes[1] && parTestWENO; jIndex++) {
605 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
606 for (
size_t iIndex = 0; iIndex < bufferSizes[0] && parTestWENO; iIndex++) {
607 size_t bufferIndex = jBufferIndex + iIndex;
610 if (iIndex < iStart || iIndex > iEnd) c++;
611 if (jIndex < jStart || jIndex > jEnd) c++;
612 if (numDim == 3 && (kIndex < kStart || kIndex > kEnd)) c++;
613 if (c != 1)
continue;
617 if (cloc < loc1 || cloc > loc2) {
618 if (std::abs(rho[bufferIndex] - rhoL) > eps) {
620 std::cout <<
"Failed state exchange, rho " << rho[bufferIndex] << std::endl;
622 for (
int vDim=0; vDim<numDim; vDim++) {
623 if (std::abs(rhoV[bufferIndex + vDim*numPointsBuffer] - rhoVL) > eps) {
625 std::cout <<
"Failed state exchange, rhoV" << vDim <<
" " 629 if (std::abs(rhoE[bufferIndex] - rhoEL) > eps) {
631 std::cout <<
"Failed state exchange, rhoE " << rhoE[bufferIndex] << std::endl;
634 if (std::abs(rho[bufferIndex] - rhoR) > eps) {
636 std::cout <<
"Failed state exchange, rho " << rho[bufferIndex] << std::endl;
638 for (
int vDim=0; vDim<numDim; vDim++) {
639 if (std::abs(rhoV[bufferIndex + vDim*numPointsBuffer] - rhoVR) > eps) {
641 std::cout <<
"Failed state exchange, rhoV" << vDim <<
" " 645 if (std::abs(rhoE[bufferIndex] - rhoER) > eps) {
647 std::cout <<
"Failed state exchange, rhoE " << rhoE[bufferIndex] << std::endl;
652 std::cout <<
"iIndex = " << iIndex <<
", jIndex = " << jIndex
653 <<
", kIndex = " << kIndex << std::endl;
654 std::cout <<
"iStart = " << iStart <<
", jStart = " << jStart
655 <<
", kStart = " << kStart << std::endl;
656 std::cout <<
"iEnd = " << iEnd <<
", jEnd = " << jEnd
657 <<
", kEnd = " << kEnd << std::endl;
663 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Jump:ExchangeState",parTestWENO);
668 double *inviscidFluxBuffer(rhsWENO.InviscidFluxBuffer());
669 double *dFluxBuffer(rhsWENO.DFluxBuffer());
671 for(
int iDim = 0;iDim < numDim;iDim++){
674 std::cout <<
"Checking WENO in dimension(" << iDim <<
")" 679 for (
int j=0; j<numDim+2; j++) {
680 size_t bufferIndex = j*numPointsBuffer + i;
681 dFluxBuffer[bufferIndex] = -1000;
685 rhsWENO.ComputeDV(0);
686 rhsWENO.InviscidFlux(iDim,0);
687 rhsWENO.ExchangeInviscidFlux(0);
704 double fluxRhoL = 2.0;
705 double fluxRhoVMainL = 5.6;
706 double fluxRhoVAltL = 4.0;
707 double fluxRhoEL = 11.2 + 4.0*numDim;
710 double fluxRhoR = 6.0;
711 double fluxRhoVMainR = 21.2;
712 double fluxRhoVAltR = 18.0;
713 double fluxRhoER = 33.6 + 27.0*numDim;
715 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
717 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
718 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
719 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
720 size_t bufferIndex = jBufferIndex + iIndex;
724 if (cloc < loc1 || cloc > loc2) {
725 if(std::abs(inviscidFluxBuffer[bufferIndex] - fluxRhoL) > eps) {
727 std::cout <<
"Flux check failed: rho = " << inviscidFluxBuffer[bufferIndex]
728 <<
", expected " << fluxRhoL << std::endl;
730 for(
int vDim = 0;vDim < numDim;vDim++){
731 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
733 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVMainL) > eps) {
734 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
735 <<
", expected " << fluxRhoVMainL << std::endl;
739 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVAltL) > eps) {
740 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
741 <<
", expected " << fluxRhoVAltL << std::endl;
746 if(std::abs(inviscidFluxBuffer[bufferIndex + (numDim+1)*
numPointsBuffer] -
748 std::cout <<
"Flux check failed: rhoE = " 749 << inviscidFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
750 <<
", expected " << fluxRhoEL << std::endl;
754 if(std::abs(inviscidFluxBuffer[bufferIndex] - fluxRhoR) > eps) {
756 std::cout <<
"Flux check failed: rho = " << inviscidFluxBuffer[bufferIndex]
757 <<
", expected " << fluxRhoR << std::endl;
759 for(
int vDim = 0;vDim < numDim;vDim++){
760 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
762 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVMainR) > eps) {
763 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
764 <<
", expected " << fluxRhoVMainR << std::endl;
768 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVAltR) > eps) {
769 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
770 <<
", expected " << fluxRhoVAltR << std::endl;
775 if(std::abs(inviscidFluxBuffer[bufferIndex + (numDim+1)*
numPointsBuffer] -
777 std::cout <<
"Flux check failed: rhoE = " 778 << inviscidFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
779 <<
", expected " << fluxRhoER << std::endl;
785 std::cout <<
"i = " << iIndex <<
", j = " << jIndex <<
", k = " << kIndex
786 <<
", jumpDim = " << jumpDim <<
", cloc = " << cloc << std::endl;
787 std::cout <<
"rho = " << rho[bufferIndex];
788 for (
int vDim=0; vDim<numDim; vDim++) {
789 std::cout <<
", rhoV[" << vDim <<
"] = " << rhoV[bufferIndex + vDim*
numPointsBuffer];
791 std::cout <<
", rhoE = " << rhoE[bufferIndex] << std::endl;
797 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Jump:FluxCheck",parTestWENO);
802 int statusWENO = rhsWENO.ApplyWENO(iDim,0);
805 std::cout <<
"ApplyWENO returned error code " << statusWENO << std::endl;
808 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Jump:ErrorApplyWENO",parTestWENO);
814 double dFluxRho = fluxRhoR - fluxRhoL;
815 double dFluxRhoVMain = fluxRhoVMainR - fluxRhoVMainL;
816 double dFluxRhoVAlt = fluxRhoVAltR - fluxRhoVAltL;
817 double dFluxRhoE = fluxRhoER - fluxRhoEL;
820 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
822 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
823 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
824 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
825 size_t bufferIndex = jBufferIndex + iIndex;
829 if (iDim == jumpDim && std::abs(cloc - checkLoc1) < eps) {
830 if(std::abs(dFluxBuffer[bufferIndex] - dFluxRho) > epsLarge) {
832 std::cout <<
"dFlux check failed: rho = " << dFluxBuffer[bufferIndex]
833 <<
", expected " << dFluxRho << std::endl;
835 for(
int vDim = 0;vDim < numDim;vDim++){
836 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
838 if(std::abs(dFluxBuffer[vIndex] - dFluxRhoVMain) > epsLarge) {
839 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
840 <<
", expected " << dFluxRhoVMain << std::endl;
844 if(std::abs(dFluxBuffer[vIndex] - dFluxRhoVAlt) > epsLarge) {
845 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
846 <<
", expected " << dFluxRhoVAlt << std::endl;
852 dFluxRhoE) > epsLarge) {
853 std::cout <<
"dFlux check failed: rhoE = " 854 << dFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
855 <<
", expected " << dFluxRhoE << std::endl;
858 }
else if (iDim == jumpDim && std::abs(cloc - checkLoc2) < eps) {
859 if(std::abs(dFluxBuffer[bufferIndex] + dFluxRho) > epsLarge) {
861 std::cout <<
"dFlux check failed: rho = " << dFluxBuffer[bufferIndex]
862 <<
", expected " << -dFluxRho << std::endl;
864 for(
int vDim = 0;vDim < numDim;vDim++){
865 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
867 if(std::abs(dFluxBuffer[vIndex] + dFluxRhoVMain) > epsLarge) {
868 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
869 <<
", expected " << -dFluxRhoVMain << std::endl;
873 if(std::abs(dFluxBuffer[vIndex] + dFluxRhoVAlt) > epsLarge) {
874 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
875 <<
", expected " << -dFluxRhoVAlt << std::endl;
881 dFluxRhoE) > epsLarge) {
882 std::cout <<
"dFlux check failed: rhoE = " 883 << dFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
884 <<
", expected " << -dFluxRhoE << std::endl;
887 }
else if (iDim == jumpDim && (std::abs(cloc - checkLoc1) < stenWidth*dx+eps)
888 || (std::abs(cloc - checkLoc2) < stenWidth*dx+eps)) {
891 for(
int eqn = 0; eqn < numDim+2; eqn++){
893 if(std::abs(dFluxBuffer[eIndex]) > epsLarge)
896 std::cout <<
"Failed dFluxBuffer " << dFluxBuffer[eIndex] << std::endl;
900 for(
int eqn = 0; eqn < numDim+2; eqn++){
902 if(std::abs(dFluxBuffer[eIndex]) > eps)
905 std::cout <<
"Failed dFluxBuffer " << dFluxBuffer[eIndex] << std::endl;
911 std::cout <<
"i = " << iIndex <<
", j = " << jIndex <<
", k = " << kIndex
912 <<
", jumpDim = " << jumpDim <<
", cloc = " << cloc << std::endl;
913 std::cout <<
"checkLoc1 = " << checkLoc1 <<
", checkLoc2 = " << checkLoc2 << std::endl;
914 std::cout <<
"rho = " << rho[bufferIndex];
915 for (
int vDim=0; vDim<numDim; vDim++) {
916 std::cout <<
", rhoV[" << vDim <<
"] = " << rhoV[bufferIndex + vDim*
numPointsBuffer];
918 std::cout <<
", rhoE = " << rhoE[bufferIndex] << std::endl;
924 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:Jump:dFluxCheck",parTestWENO);
938 for(
int numDim = 2;numDim < 4;numDim++){
940 std::cout <<
"TestWENO:ApplyWENO:TransonicJump:Testing WENO in " << numDim <<
" dimensions." << std::endl;
942 for (
int jumpDim=0; jumpDim<numDim; jumpDim++) {
944 operator_t sbpOperator;
945 halo_t &simHalo(simGrid.
Halo());
949 weno_t &coeffsWENO(rhsWENO.WENOCoefficients());
951 bool parTestWENO =
true;
953 double length = 20.0;
954 std::vector<size_t>
gridSizes(numDim,numPoints);
955 double dx = length/(numPoints - 1);
958 gridSizes,2,testComm,&messageStream)){
968 std::vector<int> cartNeighbors;
970 gridCommPtr->CartNeighbors(cartNeighbors);
973 int xyzMessageId = simHalo.CreateMessageBuffers(numDim);
974 simHalo.PackMessageBuffers(xyzMessageId,0,numDim,&gridCoords[0]);
976 simHalo.SendMessage(0,cartNeighbors,testComm);
977 simHalo.ReceiveMessage(0,cartNeighbors,testComm);
978 simHalo.UnPackMessageBuffers(0,0,numDim,&gridCoords[0]);
980 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:TransonicJump:InitFixtures",parTestWENO);
993 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:TransonicJump:SetupState",parTestWENO);
998 std::cout << messageStream.str() << std::endl;
999 std::cout <<
"Testing WENO jump in " << jumpDim <<
" dimension." << std::endl;
1008 std::vector<double> numbers(4,0.0);
1012 paramState.
Create(numPointsBuffer,0);
1021 std::vector<double> rho(numPointsBuffer,-1000.0);
1022 std::vector<double> rhoV(numDim*numPointsBuffer,-1000.0);
1023 std::vector<double> rhoE(numPointsBuffer,-1000.0);
1040 double loc1 = 0.25*length;
1041 double loc2 = 0.75*length;
1044 double checkLoc1 = loc1;
1045 double checkLoc2 = loc2 + dx;
1047 size_t iStart = partitionBufferInterval[0].first;
1048 size_t iEnd = partitionBufferInterval[0].second;
1049 size_t jStart = partitionBufferInterval[1].first;
1050 size_t jEnd = partitionBufferInterval[1].second;
1057 kStart = partitionBufferInterval[2].first;
1058 kEnd = partitionBufferInterval[2].second;
1061 for (
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
1063 for (
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
1064 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
1065 for (
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
1066 size_t bufferIndex = jBufferIndex + iIndex;
1070 if (cloc < loc1 || cloc > loc2) {
1071 rho[bufferIndex] = rhoL;
1072 for (
int vDim=0; vDim<numDim; vDim++) {
1073 if (vDim == jumpDim) rhoV[bufferIndex + vDim*
numPointsBuffer] = rhoVL;
1076 rhoE[bufferIndex] = rhoEL;
1078 rho[bufferIndex] = rhoR;
1079 for (
int vDim=0; vDim<numDim; vDim++) {
1080 if (vDim == jumpDim) rhoV[bufferIndex + vDim*
numPointsBuffer] = rhoVR;
1083 rhoE[bufferIndex] = rhoER;
1089 std::vector<double> dRho(numPointsBuffer,-1000.0);
1090 std::vector<double> dRhoV(numDim*numPointsBuffer,-1000.0);
1091 std::vector<double> dRhoE(numPointsBuffer,-1000.0);
1093 std::vector<double> T(numPointsBuffer,0.0);
1094 std::vector<double> p(numPointsBuffer,0.0);
1095 std::vector<double>
V(numDim*numPointsBuffer,0.0);
1097 std::vector<double> rhom1(numPointsBuffer,0.0);
1099 simState.SetFieldBuffer(
"simTime",&t);
1100 simState.SetFieldBuffer(
"rho",&rho[0]);
1101 simState.SetFieldBuffer(
"rhoV",&rhoV[0]);
1102 simState.SetFieldBuffer(
"rhoE",&rhoE[0]);
1104 simState.SetFieldBuffer(
"pressure",&p[0]);
1105 simState.SetFieldBuffer(
"temperature",&T[0]);
1106 simState.SetFieldBuffer(
"velocity",&V[0]);
1107 simState.SetFieldBuffer(
"rhom1",&rhom1[0]);
1109 state_t rhsState(simState);
1116 std::vector<double> inParams;
1117 std::vector<int> inFlags;
1119 if(rhsWENO.Initialize(simGrid,simState,paramState,sbpOperator)){
1120 parTestWENO =
false;
1122 std::vector<int> numThreadsDim;
1124 std::cout <<
"Setting up threads for grid object failed." << std::endl;
1127 rhsWENO.InitThreadIntervals();
1129 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:TransonicJump:InitRHS",parTestWENO);
1134 if(rhsWENO.SetupRHS(simGrid,simState,rhsState)){
1135 parTestWENO =
false;
1138 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:TransonicJump:SetupRHS",parTestWENO);
1148 rhsWENO.ExchangeState(0);
1161 for (
size_t kIndex = 0; kIndex < kFinal && parTestWENO; kIndex++) {
1163 for (
size_t jIndex = 0; jIndex < bufferSizes[1] && parTestWENO; jIndex++) {
1164 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
1165 for (
size_t iIndex = 0; iIndex < bufferSizes[0] && parTestWENO; iIndex++) {
1166 size_t bufferIndex = jBufferIndex + iIndex;
1169 if (iIndex < iStart || iIndex > iEnd) c++;
1170 if (jIndex < jStart || jIndex > jEnd) c++;
1171 if (numDim == 3 && (kIndex < kStart || kIndex > kEnd)) c++;
1172 if (c != 1)
continue;
1176 if (cloc < loc1 || cloc > loc2) {
1177 if (std::abs(rho[bufferIndex] - rhoL) > eps) {
1178 parTestWENO =
false;
1179 std::cout <<
"Failed state exchange, rho " << rho[bufferIndex] << std::endl;
1181 for (
int vDim=0; vDim<numDim; vDim++) {
1182 if (vDim == jumpDim) {
1183 if (std::abs(rhoV[bufferIndex + vDim*numPointsBuffer] - rhoVL) > eps) {
1184 parTestWENO =
false;
1185 std::cout <<
"Failed state exchange, rhoV" << vDim <<
" " 1189 if (std::abs(rhoV[bufferIndex + vDim*numPointsBuffer]) > eps) {
1190 parTestWENO =
false;
1191 std::cout <<
"Failed state exchange, rhoV" << vDim <<
" " 1196 if (std::abs(rhoE[bufferIndex] - rhoEL) > eps) {
1197 parTestWENO =
false;
1198 std::cout <<
"Failed state exchange, rhoE " << rhoE[bufferIndex] << std::endl;
1201 if (std::abs(rho[bufferIndex] - rhoR) > eps) {
1202 parTestWENO =
false;
1203 std::cout <<
"Failed state exchange, rho " << rho[bufferIndex] << std::endl;
1205 for (
int vDim=0; vDim<numDim; vDim++) {
1206 if (vDim == jumpDim) {
1207 if (std::abs(rhoV[bufferIndex + vDim*numPointsBuffer] - rhoVR) > eps) {
1208 parTestWENO =
false;
1209 std::cout <<
"Failed state exchange, rhoV" << vDim <<
" " 1213 if (std::abs(rhoV[bufferIndex + vDim*numPointsBuffer]) > eps) {
1214 parTestWENO =
false;
1215 std::cout <<
"Failed state exchange, rhoV" << vDim <<
" " 1220 if (std::abs(rhoE[bufferIndex] - rhoER) > eps) {
1221 parTestWENO =
false;
1222 std::cout <<
"Failed state exchange, rhoE " << rhoE[bufferIndex] << std::endl;
1227 std::cout <<
"iIndex = " << iIndex <<
", jIndex = " << jIndex
1228 <<
", kIndex = " << kIndex << std::endl;
1229 std::cout <<
"iStart = " << iStart <<
", jStart = " << jStart
1230 <<
", kStart = " << kStart << std::endl;
1231 std::cout <<
"iEnd = " << iEnd <<
", jEnd = " << jEnd
1232 <<
", kEnd = " << kEnd << std::endl;
1238 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:TransonicJump:ExchangeState",parTestWENO);
1243 double *inviscidFluxBuffer(rhsWENO.InviscidFluxBuffer());
1244 double *dFluxBuffer(rhsWENO.DFluxBuffer());
1246 for(
int iDim = 0;iDim < numDim;iDim++){
1249 std::cout <<
"Checking WENO in dimension(" << iDim <<
")" 1254 for (
int j=0; j<numDim+2; j++) {
1255 size_t bufferIndex = j*numPointsBuffer + i;
1256 dFluxBuffer[bufferIndex] = -1000;
1260 rhsWENO.ComputeDV(0);
1261 rhsWENO.InviscidFlux(iDim,0);
1262 rhsWENO.ExchangeInviscidFlux(0);
1279 double fluxRhoL = 1.0;
1280 double fluxRhoVMainL = 2.6;
1281 double fluxRhoVAltL = 0.0;
1282 double fluxRhoEL = 6.1;
1283 double fluxRhoVTransverseL = 1.6;
1286 double fluxRhoR = 0.0;
1287 double fluxRhoVMainR = 0.4;
1288 double fluxRhoVAltR = 0.0;
1289 double fluxRhoER = 0.0;
1290 double fluxRhoVTransverseR = 0.4;
1292 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
1294 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
1295 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
1296 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
1297 size_t bufferIndex = jBufferIndex + iIndex;
1301 if (iDim == jumpDim) {
1302 if (cloc < loc1 || cloc > loc2) {
1303 if(std::abs(inviscidFluxBuffer[bufferIndex] - fluxRhoL) > eps) {
1304 parTestWENO =
false;
1305 std::cout <<
"Flux check failed: rho = " << inviscidFluxBuffer[bufferIndex]
1306 <<
", expected " << fluxRhoL << std::endl;
1308 for(
int vDim = 0;vDim < numDim;vDim++){
1309 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
1311 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVMainL) > eps) {
1312 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
1313 <<
", expected " << fluxRhoVMainL << std::endl;
1314 parTestWENO =
false;
1317 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVAltL) > eps) {
1318 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
1319 <<
", expected " << fluxRhoVAltL << std::endl;
1320 parTestWENO =
false;
1324 if(std::abs(inviscidFluxBuffer[bufferIndex + (numDim+1)*
numPointsBuffer] -
1326 std::cout <<
"Flux check failed: rhoE = " 1327 << inviscidFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
1328 <<
", expected " << fluxRhoEL << std::endl;
1329 parTestWENO =
false;
1332 if(std::abs(inviscidFluxBuffer[bufferIndex] - fluxRhoR) > eps) {
1333 parTestWENO =
false;
1334 std::cout <<
"Flux check failed: rho = " << inviscidFluxBuffer[bufferIndex]
1335 <<
", expected " << fluxRhoR << std::endl;
1337 for(
int vDim = 0;vDim < numDim;vDim++){
1338 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
1340 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVMainR) > eps) {
1341 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
1342 <<
", expected " << fluxRhoVMainR << std::endl;
1343 parTestWENO =
false;
1346 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVAltR) > eps) {
1347 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
1348 <<
", expected " << fluxRhoVAltR << std::endl;
1349 parTestWENO =
false;
1353 if(std::abs(inviscidFluxBuffer[bufferIndex + (numDim+1)*
numPointsBuffer] -
1355 std::cout <<
"Flux check failed: rhoE = " 1356 << inviscidFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
1357 <<
", expected " << fluxRhoER << std::endl;
1358 parTestWENO =
false;
1362 for(
int eqn = 0; eqn < numDim+2; eqn++){
1365 if (cloc < loc1 || cloc > loc2) {
1366 if(std::abs(inviscidFluxBuffer[eIndex] - fluxRhoVTransverseL) > eps)
1368 parTestWENO =
false;
1369 std::cout <<
"Flux check failed in transverse direction " 1370 << inviscidFluxBuffer[eIndex] << std::endl;
1373 if(std::abs(inviscidFluxBuffer[eIndex] - fluxRhoVTransverseR) > eps)
1375 parTestWENO =
false;
1376 std::cout <<
"Flux check failed in transverse direction " 1377 << inviscidFluxBuffer[eIndex] << std::endl;
1381 if(std::abs(inviscidFluxBuffer[eIndex]) > eps)
1383 parTestWENO =
false;
1384 std::cout <<
"Flux check failed in transverse direction " 1385 << inviscidFluxBuffer[eIndex] << std::endl;
1392 std::cout <<
"i = " << iIndex <<
", j = " << jIndex <<
", k = " << kIndex
1393 <<
", jumpDim = " << jumpDim <<
", cloc = " << cloc << std::endl;
1394 std::cout <<
"rho = " << rho[bufferIndex];
1395 for (
int vDim=0; vDim<numDim; vDim++) {
1396 std::cout <<
", rhoV[" << vDim <<
"] = " << rhoV[bufferIndex + vDim*
numPointsBuffer];
1398 std::cout <<
", rhoE = " << rhoE[bufferIndex] << std::endl;
1404 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:TransonicJump:FluxCheck",parTestWENO);
1409 int statusWENO = rhsWENO.ApplyWENO(iDim,0);
1411 parTestWENO =
false;
1412 std::cout <<
"ApplyWENO returned error code " << statusWENO << std::endl;
1415 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:TransonicJump:ErrorApplyWENO",parTestWENO);
1450 double dFluxLargeRho = -1.149;
1451 double dFluxLargeRhoVMain = -2.130;
1452 double dFluxLargeRhoVAlt = 0.0;
1453 double dFluxLargeRhoE = -6.807;
1456 double dFluxSmallRho = 0.149;
1457 double dFluxSmallRhoVMain = -0.0698;
1458 double dFluxSmallRhoVAlt = 0.0;
1459 double dFluxSmallRhoE = 0.707;
1462 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
1464 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
1465 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
1466 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
1467 size_t bufferIndex = jBufferIndex + iIndex;
1471 if (iDim == jumpDim && std::abs(cloc - checkLoc1) < eps) {
1472 if(std::abs(dFluxBuffer[bufferIndex] - dFluxLargeRho) > epsLarge) {
1473 parTestWENO =
false;
1474 std::cout <<
"dFlux check failed: rho = " << dFluxBuffer[bufferIndex]
1475 <<
", expected " << dFluxLargeRho << std::endl;
1477 for(
int vDim = 0;vDim < numDim;vDim++){
1478 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
1480 if(std::abs(dFluxBuffer[vIndex] - dFluxLargeRhoVMain) > epsLarge) {
1481 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
1482 <<
", expected " << dFluxLargeRhoVMain << std::endl;
1483 parTestWENO =
false;
1486 if(std::abs(dFluxBuffer[vIndex] - dFluxLargeRhoVAlt) > epsLarge) {
1487 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
1488 <<
", expected " << dFluxLargeRhoVAlt << std::endl;
1489 parTestWENO =
false;
1494 dFluxLargeRhoE) > epsLarge) {
1495 std::cout <<
"dFlux check failed: rhoE = " 1496 << dFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
1497 <<
", expected " << dFluxLargeRhoE << std::endl;
1498 parTestWENO =
false;
1500 }
else if (iDim == jumpDim && std::abs(cloc - (checkLoc1-dx)) < eps) {
1501 if(std::abs(dFluxBuffer[bufferIndex] - dFluxSmallRho) > epsLarge) {
1502 parTestWENO =
false;
1503 std::cout <<
"dFlux check failed: rho = " << dFluxBuffer[bufferIndex]
1504 <<
", expected " << dFluxSmallRho << std::endl;
1506 for(
int vDim = 0;vDim < numDim;vDim++){
1507 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
1509 if(std::abs(dFluxBuffer[vIndex] - dFluxSmallRhoVMain) > epsLarge) {
1510 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
1511 <<
", expected " << dFluxSmallRhoVMain << std::endl;
1512 parTestWENO =
false;
1515 if(std::abs(dFluxBuffer[vIndex] - dFluxSmallRhoVAlt) > epsLarge) {
1516 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
1517 <<
", expected " << dFluxSmallRhoVAlt << std::endl;
1518 parTestWENO =
false;
1523 dFluxSmallRhoE) > epsLarge) {
1524 std::cout <<
"dFlux check failed: rhoE = " 1525 << dFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
1526 <<
", expected " << dFluxSmallRhoE << std::endl;
1527 parTestWENO =
false;
1529 }
else if (iDim == jumpDim && std::abs(cloc - checkLoc2) < eps) {
1530 if(std::abs(dFluxBuffer[bufferIndex] + dFluxLargeRho) > epsLarge) {
1531 parTestWENO =
false;
1532 std::cout <<
"dFlux check failed: rho = " << dFluxBuffer[bufferIndex]
1533 <<
", expected " << -dFluxLargeRho << std::endl;
1535 for(
int vDim = 0;vDim < numDim;vDim++){
1536 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
1538 if(std::abs(dFluxBuffer[vIndex] + dFluxLargeRhoVMain) > epsLarge) {
1539 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
1540 <<
", expected " << -dFluxLargeRhoVMain << std::endl;
1541 parTestWENO =
false;
1544 if(std::abs(dFluxBuffer[vIndex] + dFluxLargeRhoVAlt) > epsLarge) {
1545 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
1546 <<
", expected " << -dFluxLargeRhoVAlt << std::endl;
1547 parTestWENO =
false;
1552 dFluxLargeRhoE) > epsLarge) {
1553 std::cout <<
"dFlux check failed: rhoE = " 1554 << dFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
1555 <<
", expected " << -dFluxLargeRhoE << std::endl;
1556 parTestWENO =
false;
1558 }
else if (iDim == jumpDim && std::abs(cloc - (checkLoc2-dx)) < eps) {
1559 if(std::abs(dFluxBuffer[bufferIndex] + dFluxSmallRho) > epsLarge) {
1560 parTestWENO =
false;
1561 std::cout <<
"dFlux check failed: rho = " << dFluxBuffer[bufferIndex]
1562 <<
", expected " << -dFluxSmallRho << std::endl;
1564 for(
int vDim = 0;vDim < numDim;vDim++){
1565 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
1567 if(std::abs(dFluxBuffer[vIndex] + dFluxSmallRhoVMain) > epsLarge) {
1568 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
1569 <<
", expected " << -dFluxSmallRhoVMain << std::endl;
1570 parTestWENO =
false;
1573 if(std::abs(dFluxBuffer[vIndex] + dFluxSmallRhoVAlt) > epsLarge) {
1574 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
1575 <<
", expected " << -dFluxSmallRhoVAlt << std::endl;
1576 parTestWENO =
false;
1581 dFluxSmallRhoE) > epsLarge) {
1582 std::cout <<
"dFlux check failed: rhoE = " 1583 << dFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
1584 <<
", expected " << -dFluxSmallRhoE << std::endl;
1585 parTestWENO =
false;
1587 }
else if (iDim == jumpDim && (std::abs(cloc - checkLoc1) < stenWidth*dx+eps)
1588 || (std::abs(cloc - checkLoc2) < stenWidth*dx+eps)) {
1591 for(
int eqn = 0; eqn < numDim+2; eqn++){
1593 if(std::abs(dFluxBuffer[eIndex]) > epsLarge)
1595 parTestWENO =
false;
1596 std::cout <<
"Failed dFluxBuffer " << dFluxBuffer[eIndex] << std::endl;
1600 for(
int eqn = 0; eqn < numDim+2; eqn++){
1602 if(std::abs(dFluxBuffer[eIndex]) > eps)
1604 parTestWENO =
false;
1605 std::cout <<
"Failed dFluxBuffer " << dFluxBuffer[eIndex] << std::endl;
1611 std::cout <<
"i = " << iIndex <<
", j = " << jIndex <<
", k = " << kIndex
1612 <<
", jumpDim = " << jumpDim <<
", cloc = " << cloc << std::endl;
1613 std::cout <<
"checkLoc1 = " << checkLoc1 <<
", checkLoc2 = " << checkLoc2 << std::endl;
1614 std::cout <<
"rho = " << rho[bufferIndex];
1615 for (
int vDim=0; vDim<numDim; vDim++) {
1616 std::cout <<
", rhoV[" << vDim <<
"] = " << rhoV[bufferIndex + vDim*
numPointsBuffer];
1618 std::cout <<
", rhoE = " << rhoE[bufferIndex] << std::endl;
1624 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:TransonicJump:dFluxCheck",parTestWENO);
1638 for(
int numDim = 2;numDim < 4;numDim++){
1640 std::cout <<
"TestWENO:ApplyWENO:JumpMetric:Testing WENO in " << numDim <<
" dimensions." << std::endl;
1642 for (
int jumpDim=0; jumpDim<numDim; jumpDim++) {
1644 operator_t sbpOperator;
1645 halo_t &simHalo(simGrid.
Halo());
1649 weno_t &coeffsWENO(rhsWENO.WENOCoefficients());
1651 bool parTestWENO =
true;
1653 double length = 20.0;
1654 std::vector<size_t>
gridSizes(numDim,numPoints);
1655 double dx = length/(numPoints - 1);
1658 gridSizes,2,testComm,&messageStream)){
1659 parTestWENO =
false;
1663 parTestWENO =
false;
1668 std::vector<int> cartNeighbors;
1670 gridCommPtr->CartNeighbors(cartNeighbors);
1673 int xyzMessageId = simHalo.CreateMessageBuffers(numDim);
1674 simHalo.PackMessageBuffers(xyzMessageId,0,numDim,&gridCoords[0]);
1676 simHalo.SendMessage(0,cartNeighbors,testComm);
1677 simHalo.ReceiveMessage(0,cartNeighbors,testComm);
1678 simHalo.UnPackMessageBuffers(0,0,numDim,&gridCoords[0]);
1680 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:JumpMetric:InitFixtures",parTestWENO);
1690 parTestWENO =
false;
1693 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:JumpMetric:SetupState",parTestWENO);
1698 std::cout << messageStream.str() << std::endl;
1699 std::cout <<
"Testing WENO jump in " << jumpDim <<
" dimension." << std::endl;
1708 std::vector<double> numbers(4,0.0);
1712 paramState.
Create(numPointsBuffer,0);
1721 std::vector<double> rho(numPointsBuffer,-1000.0);
1722 std::vector<double> rhoV(numDim*numPointsBuffer,-1000.0);
1723 std::vector<double> rhoE(numPointsBuffer,-1000.0);
1728 double rhoEL = 4.0 + 2.0*numDim;
1733 double rhoER = 8.0 + 9.0*numDim;
1736 double loc1 = 0.25*length;
1737 double loc2 = 0.75*length;
1740 double checkLoc1 = loc1;
1741 double checkLoc2 = loc2 + dx;
1743 size_t iStart = partitionBufferInterval[0].first;
1744 size_t iEnd = partitionBufferInterval[0].second;
1745 size_t jStart = partitionBufferInterval[1].first;
1746 size_t jEnd = partitionBufferInterval[1].second;
1753 kStart = partitionBufferInterval[2].first;
1754 kEnd = partitionBufferInterval[2].second;
1757 for (
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
1759 for (
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
1760 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
1761 for (
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
1762 size_t bufferIndex = jBufferIndex + iIndex;
1766 if (cloc < loc1 || cloc > loc2) {
1767 rho[bufferIndex] = rhoL;
1768 for (
int vDim=0; vDim<numDim; vDim++) {
1771 rhoE[bufferIndex] = rhoEL;
1773 rho[bufferIndex] = rhoR;
1774 for (
int vDim=0; vDim<numDim; vDim++) {
1777 rhoE[bufferIndex] = rhoER;
1783 std::vector<double> dRho(numPointsBuffer,-1000.0);
1784 std::vector<double> dRhoV(numDim*numPointsBuffer,-1000.0);
1785 std::vector<double> dRhoE(numPointsBuffer,-1000.0);
1787 std::vector<double> T(numPointsBuffer,0.0);
1788 std::vector<double> p(numPointsBuffer,0.0);
1789 std::vector<double>
V(numDim*numPointsBuffer,0.0);
1791 std::vector<double> rhom1(numPointsBuffer,0.0);
1793 simState.SetFieldBuffer(
"simTime",&t);
1794 simState.SetFieldBuffer(
"rho",&rho[0]);
1795 simState.SetFieldBuffer(
"rhoV",&rhoV[0]);
1796 simState.SetFieldBuffer(
"rhoE",&rhoE[0]);
1798 simState.SetFieldBuffer(
"pressure",&p[0]);
1799 simState.SetFieldBuffer(
"temperature",&T[0]);
1800 simState.SetFieldBuffer(
"velocity",&V[0]);
1801 simState.SetFieldBuffer(
"rhom1",&rhom1[0]);
1803 state_t rhsState(simState);
1810 std::vector<double> inParams;
1811 std::vector<int> inFlags;
1813 if(rhsWENO.Initialize(simGrid,simState,paramState,sbpOperator)){
1814 parTestWENO =
false;
1816 std::vector<int> numThreadsDim;
1818 std::cout <<
"Setting up threads for grid object failed." << std::endl;
1821 rhsWENO.InitThreadIntervals();
1823 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:JumpMetric:InitRHS",parTestWENO);
1828 if(rhsWENO.SetupRHS(simGrid,simState,rhsState)){
1829 parTestWENO =
false;
1832 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:JumpMetric:SetupRHS",parTestWENO);
1842 rhsWENO.ExchangeState(0);
1855 for (
size_t kIndex = 0; kIndex < kFinal && parTestWENO; kIndex++) {
1857 for (
size_t jIndex = 0; jIndex < bufferSizes[1] && parTestWENO; jIndex++) {
1858 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
1859 for (
size_t iIndex = 0; iIndex < bufferSizes[0] && parTestWENO; iIndex++) {
1860 size_t bufferIndex = jBufferIndex + iIndex;
1863 if (iIndex < iStart || iIndex > iEnd) c++;
1864 if (jIndex < jStart || jIndex > jEnd) c++;
1865 if (numDim == 3 && (kIndex < kStart || kIndex > kEnd)) c++;
1866 if (c != 1)
continue;
1870 if (cloc < loc1 || cloc > loc2) {
1871 if (std::abs(rho[bufferIndex] - rhoL) > eps) {
1872 parTestWENO =
false;
1873 std::cout <<
"Failed state exchange, rho " << rho[bufferIndex] << std::endl;
1875 for (
int vDim=0; vDim<numDim; vDim++) {
1876 if (std::abs(rhoV[bufferIndex + vDim*numPointsBuffer] - rhoVL) > eps) {
1877 parTestWENO =
false;
1878 std::cout <<
"Failed state exchange, rhoV" << vDim <<
" " 1882 if (std::abs(rhoE[bufferIndex] - rhoEL) > eps) {
1883 parTestWENO =
false;
1884 std::cout <<
"Failed state exchange, rhoE " << rhoE[bufferIndex] << std::endl;
1887 if (std::abs(rho[bufferIndex] - rhoR) > eps) {
1888 parTestWENO =
false;
1889 std::cout <<
"Failed state exchange, rho " << rho[bufferIndex] << std::endl;
1891 for (
int vDim=0; vDim<numDim; vDim++) {
1892 if (std::abs(rhoV[bufferIndex + vDim*numPointsBuffer] - rhoVR) > eps) {
1893 parTestWENO =
false;
1894 std::cout <<
"Failed state exchange, rhoV" << vDim <<
" " 1898 if (std::abs(rhoE[bufferIndex] - rhoER) > eps) {
1899 parTestWENO =
false;
1900 std::cout <<
"Failed state exchange, rhoE " << rhoE[bufferIndex] << std::endl;
1905 std::cout <<
"iIndex = " << iIndex <<
", jIndex = " << jIndex
1906 <<
", kIndex = " << kIndex << std::endl;
1907 std::cout <<
"iStart = " << iStart <<
", jStart = " << jStart
1908 <<
", kStart = " << kStart << std::endl;
1909 std::cout <<
"iEnd = " << iEnd <<
", jEnd = " << jEnd
1910 <<
", kEnd = " << kEnd << std::endl;
1916 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:JumpMetric:ExchangeState",parTestWENO);
1921 double *inviscidFluxBuffer(rhsWENO.InviscidFluxBuffer());
1922 double *dFluxBuffer(rhsWENO.DFluxBuffer());
1924 for(
int iDim = 0;iDim < numDim;iDim++){
1927 std::cout <<
"Checking WENO in dimension(" << iDim <<
")" 1932 for (
int j=0; j<numDim+2; j++) {
1933 size_t bufferIndex = j*numPointsBuffer + i;
1934 dFluxBuffer[bufferIndex] = -1000;
1938 rhsWENO.ComputeDV(0);
1939 rhsWENO.InviscidFlux(iDim,0);
1940 rhsWENO.ExchangeInviscidFlux(0);
1956 double metric = 1.0/(2*(numDim-1));
1959 double fluxRhoL = 2.0*metric;
1960 double fluxRhoVMainL = 5.6*metric;
1961 double fluxRhoVAltL = 4.0*metric;
1962 double fluxRhoEL = (11.2 + 4.0*numDim)*metric;
1965 double fluxRhoR = 6.0*metric;
1966 double fluxRhoVMainR = 21.2*metric;
1967 double fluxRhoVAltR = 18.0*metric;
1968 double fluxRhoER = (33.6 + 27.0*numDim)*metric;
1970 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
1972 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
1973 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
1974 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
1975 size_t bufferIndex = jBufferIndex + iIndex;
1979 if (cloc < loc1 || cloc > loc2) {
1980 if(std::abs(inviscidFluxBuffer[bufferIndex] - fluxRhoL) > eps) {
1981 parTestWENO =
false;
1982 std::cout <<
"Flux check failed: rho = " << inviscidFluxBuffer[bufferIndex]
1983 <<
", expected " << fluxRhoL << std::endl;
1985 for(
int vDim = 0;vDim < numDim;vDim++){
1986 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
1988 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVMainL) > eps) {
1989 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
1990 <<
", expected " << fluxRhoVMainL << std::endl;
1991 parTestWENO =
false;
1994 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVAltL) > eps) {
1995 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
1996 <<
", expected " << fluxRhoVAltL << std::endl;
1997 parTestWENO =
false;
2001 if(std::abs(inviscidFluxBuffer[bufferIndex + (numDim+1)*
numPointsBuffer] -
2003 std::cout <<
"Flux check failed: rhoE = " 2004 << inviscidFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
2005 <<
", expected " << fluxRhoEL << std::endl;
2006 parTestWENO =
false;
2009 if(std::abs(inviscidFluxBuffer[bufferIndex] - fluxRhoR) > eps) {
2010 parTestWENO =
false;
2011 std::cout <<
"Flux check failed: rho = " << inviscidFluxBuffer[bufferIndex]
2012 <<
", expected " << fluxRhoR << std::endl;
2014 for(
int vDim = 0;vDim < numDim;vDim++){
2015 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
2017 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVMainR) > eps) {
2018 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
2019 <<
", expected " << fluxRhoVMainR << std::endl;
2020 parTestWENO =
false;
2023 if(std::abs(inviscidFluxBuffer[vIndex] - fluxRhoVAltR) > eps) {
2024 std::cout <<
"Flux check failed: rhoV = " << inviscidFluxBuffer[vIndex]
2025 <<
", expected " << fluxRhoVAltR << std::endl;
2026 parTestWENO =
false;
2030 if(std::abs(inviscidFluxBuffer[bufferIndex + (numDim+1)*
numPointsBuffer] -
2032 std::cout <<
"Flux check failed: rhoE = " 2033 << inviscidFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
2034 <<
", expected " << fluxRhoER << std::endl;
2035 parTestWENO =
false;
2040 std::cout <<
"i = " << iIndex <<
", j = " << jIndex <<
", k = " << kIndex
2041 <<
", jumpDim = " << jumpDim <<
", cloc = " << cloc << std::endl;
2042 std::cout <<
"rho = " << rho[bufferIndex];
2043 for (
int vDim=0; vDim<numDim; vDim++) {
2044 std::cout <<
", rhoV[" << vDim <<
"] = " << rhoV[bufferIndex + vDim*
numPointsBuffer];
2046 std::cout <<
", rhoE = " << rhoE[bufferIndex] << std::endl;
2052 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:JumpMetric:FluxCheck",parTestWENO);
2057 int statusWENO = rhsWENO.ApplyWENO(iDim,0);
2059 parTestWENO =
false;
2060 std::cout <<
"ApplyWENO returned error code " << statusWENO << std::endl;
2063 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:JumpMetric:ErrorApplyWENO",parTestWENO);
2069 double dFluxRho = fluxRhoR - fluxRhoL;
2070 double dFluxRhoVMain = fluxRhoVMainR - fluxRhoVMainL;
2071 double dFluxRhoVAlt = fluxRhoVAltR - fluxRhoVAltL;
2072 double dFluxRhoE = fluxRhoER - fluxRhoEL;
2075 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
2077 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
2078 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
2079 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
2080 size_t bufferIndex = jBufferIndex + iIndex;
2084 if (iDim == jumpDim && std::abs(cloc - checkLoc1) < eps) {
2085 if(std::abs(dFluxBuffer[bufferIndex] - dFluxRho) > epsLarge) {
2086 parTestWENO =
false;
2087 std::cout <<
"dFlux check failed: rho = " << dFluxBuffer[bufferIndex]
2088 <<
", expected " << dFluxRho << std::endl;
2090 for(
int vDim = 0;vDim < numDim;vDim++){
2091 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
2093 if(std::abs(dFluxBuffer[vIndex] - dFluxRhoVMain) > epsLarge) {
2094 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
2095 <<
", expected " << dFluxRhoVMain << std::endl;
2096 parTestWENO =
false;
2099 if(std::abs(dFluxBuffer[vIndex] - dFluxRhoVAlt) > epsLarge) {
2100 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
2101 <<
", expected " << dFluxRhoVAlt << std::endl;
2102 parTestWENO =
false;
2107 dFluxRhoE) > epsLarge) {
2108 std::cout <<
"dFlux check failed: rhoE = " 2109 << dFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
2110 <<
", expected " << dFluxRhoE << std::endl;
2111 parTestWENO =
false;
2113 }
else if (iDim == jumpDim && std::abs(cloc - checkLoc2) < eps) {
2114 if(std::abs(dFluxBuffer[bufferIndex] + dFluxRho) > epsLarge) {
2115 parTestWENO =
false;
2116 std::cout <<
"dFlux check failed: rho = " << dFluxBuffer[bufferIndex]
2117 <<
", expected " << -dFluxRho << std::endl;
2119 for(
int vDim = 0;vDim < numDim;vDim++){
2120 size_t vIndex = bufferIndex + (vDim+1)*numPointsBuffer;
2122 if(std::abs(dFluxBuffer[vIndex] + dFluxRhoVMain) > epsLarge) {
2123 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
2124 <<
", expected " << -dFluxRhoVMain << std::endl;
2125 parTestWENO =
false;
2128 if(std::abs(dFluxBuffer[vIndex] + dFluxRhoVAlt) > epsLarge) {
2129 std::cout <<
"dFlux check failed: rhoV = " << dFluxBuffer[vIndex]
2130 <<
", expected " << -dFluxRhoVAlt << std::endl;
2131 parTestWENO =
false;
2136 dFluxRhoE) > epsLarge) {
2137 std::cout <<
"dFlux check failed: rhoE = " 2138 << dFluxBuffer[bufferIndex + (numDim+1)*numPointsBuffer]
2139 <<
", expected " << -dFluxRhoE << std::endl;
2140 parTestWENO =
false;
2142 }
else if (iDim == jumpDim && (std::abs(cloc - checkLoc1) < stenWidth*dx+eps)
2143 || (std::abs(cloc - checkLoc2) < stenWidth*dx+eps)) {
2146 for(
int eqn = 0; eqn < numDim+2; eqn++){
2148 if(std::abs(dFluxBuffer[eIndex]) > epsLarge)
2150 parTestWENO =
false;
2151 std::cout <<
"Failed dFluxBuffer " << dFluxBuffer[eIndex] << std::endl;
2155 for(
int eqn = 0; eqn < numDim+2; eqn++){
2157 if(std::abs(dFluxBuffer[eIndex]) > eps)
2159 parTestWENO =
false;
2160 std::cout <<
"Failed dFluxBuffer " << dFluxBuffer[eIndex] << std::endl;
2166 std::cout <<
"i = " << iIndex <<
", j = " << jIndex <<
", k = " << kIndex
2167 <<
", jumpDim = " << jumpDim <<
", cloc = " << cloc << std::endl;
2168 std::cout <<
"checkLoc1 = " << checkLoc1 <<
", checkLoc2 = " << checkLoc2 << std::endl;
2169 std::cout <<
"rho = " << rho[bufferIndex];
2170 for (
int vDim=0; vDim<numDim; vDim++) {
2171 std::cout <<
", rhoV[" << vDim <<
"] = " << rhoV[bufferIndex + vDim*
numPointsBuffer];
2173 std::cout <<
", rhoE = " << rhoE[bufferIndex] << std::endl;
2179 parallelUnitResults.
UpdateResult(
"WENO:ApplyWENO:JumpMetric:dFluxCheck",parTestWENO);
2194 double epsLarge = 1e-2;
2209 std::ostringstream messageStream;
2213 for(
int numDim = 2;numDim < 4;numDim++){
2216 operator_t sbpOperator;
2217 halo_t &simHalo(simGrid.
Halo());
2221 weno_t &coeffsWENO(rhsWENO.WENOCoefficients());
2223 bool parTestWENO =
true;
2224 std::vector<size_t>
gridSizes(numDim,21);
2227 gridSizes,2,testComm,&messageStream)){
2228 parTestWENO =
false;
2231 parallelUnitResults.
UpdateResult(
"WENO:RHS:Equal:InitFixtures",parTestWENO);
2241 parTestWENO =
false;
2244 parallelUnitResults.
UpdateResult(
"WENO:RHS:Equal:SetupState",parTestWENO);
2249 std::cout << messageStream.str() << std::endl;
2250 std::cout <<
"TestWENO_RHS:Equal:Testing WENO in " << numDim <<
" dimensions." << std::endl;
2258 std::vector<double> numbers(4,0.0);
2262 paramState.
Create(numPointsBuffer,0);
2271 std::vector<double> rho(numPointsBuffer,-1000.0);
2272 std::vector<double> rhoV(numDim*numPointsBuffer,-1000.0);
2273 std::vector<double> rhoE(numPointsBuffer,-1000.0);
2275 size_t iStart = partitionBufferInterval[0].first;
2276 size_t iEnd = partitionBufferInterval[0].second;
2277 size_t jStart = partitionBufferInterval[1].first;
2278 size_t jEnd = partitionBufferInterval[1].second;
2285 kStart = partitionBufferInterval[2].first;
2286 kEnd = partitionBufferInterval[2].second;
2289 for (
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
2291 for (
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
2292 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
2293 for (
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
2294 size_t bufferIndex = jBufferIndex + iIndex;
2295 rho[bufferIndex] = 1.0;
2296 for (
int vDim=0; vDim<numDim; vDim++) {
2299 rhoE[bufferIndex] = 4.0 + 0.5*numDim;
2304 std::vector<double> dRho(numPointsBuffer,-1000.0);
2305 std::vector<double> dRhoV(numDim*numPointsBuffer,-1000.0);
2306 std::vector<double> dRhoE(numPointsBuffer,-1000.0);
2308 std::vector<double> T(numPointsBuffer,0.0);
2309 std::vector<double> p(numPointsBuffer,0.0);
2310 std::vector<double>
V(numDim*numPointsBuffer,0.0);
2312 std::vector<double> rhom1(numPointsBuffer,0.0);
2315 simState.SetFieldBuffer(
"simTime",&t);
2316 simState.SetFieldBuffer(
"rho",&rho[0]);
2317 simState.SetFieldBuffer(
"rhoV",&rhoV[0]);
2318 simState.SetFieldBuffer(
"rhoE",&rhoE[0]);
2320 simState.SetFieldBuffer(
"pressure",&p[0]);
2321 simState.SetFieldBuffer(
"temperature",&T[0]);
2322 simState.SetFieldBuffer(
"velocity",&V[0]);
2323 simState.SetFieldBuffer(
"rhom1",&rhom1[0]);
2325 state_t rhsState(simState);
2332 std::vector<double> inParams;
2333 std::vector<int> inFlags;
2342 if(rhsWENO.Initialize(simGrid,simState,paramState,sbpOperator)){
2343 parTestWENO =
false;
2345 std::vector<int> numThreadsDim;
2347 std::cout <<
"Setting up threads for grid object failed." << std::endl;
2350 rhsWENO.InitThreadIntervals();
2352 parallelUnitResults.
UpdateResult(
"WENO:RHS:Equal:InitRHS",parTestWENO);
2357 if(rhsWENO.SetupRHS(simGrid,simState,rhsState)){
2358 parTestWENO =
false;
2361 parallelUnitResults.
UpdateResult(
"WENO:RHS:Equal:SetupRHS",parTestWENO);
2366 int status = rhsWENO.RHS(0);
2368 parTestWENO =
false;
2369 std::cout <<
"RHS returned error code " << status << std::endl;
2372 parallelUnitResults.
UpdateResult(
"WENO:RHS:Equal:ErrorRHS",parTestWENO);
2377 std::vector<double* > &rhsBuffers(rhsWENO.RHSBuffers());
2379 for (
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
2381 for (
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
2382 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
2383 for (
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
2384 size_t bufferIndex = jBufferIndex + iIndex;
2385 for (
int eqn=0; eqn<numDim+2; eqn++) {
2386 if (rhsBuffers[eqn][bufferIndex] > eps) {
2387 parTestWENO =
false;
2388 std::cout <<
"Failed rhsBuffers[" << eqn <<
"] " 2389 << rhsBuffers[eqn][bufferIndex]
2390 <<
", i = " << iIndex <<
", j = " << jIndex
2391 <<
", k = " << kIndex
2399 parallelUnitResults.
UpdateResult(
"WENO:RHS:Equal:CheckRHS",parTestWENO);
2410 for(
int numDim = 2;numDim < 4;numDim++){
2412 std::cout <<
"TestWENO:RHS:Jump:Testing WENO in " << numDim <<
" dimensions." << std::endl;
2414 for (
int jumpDim=0; jumpDim<numDim; jumpDim++) {
2416 operator_t sbpOperator;
2417 halo_t &simHalo(simGrid.
Halo());
2421 weno_t &coeffsWENO(rhsWENO.WENOCoefficients());
2423 bool parTestWENO =
true;
2425 double length = 20.0;
2426 std::vector<size_t>
gridSizes(numDim,numPoints);
2427 double dx = length/(numPoints - 1);
2430 gridSizes,2,testComm,&messageStream)){
2431 parTestWENO =
false;
2435 parTestWENO =
false;
2440 std::vector<int> cartNeighbors;
2442 gridCommPtr->CartNeighbors(cartNeighbors);
2445 int xyzMessageId = simHalo.CreateMessageBuffers(numDim);
2446 simHalo.PackMessageBuffers(xyzMessageId,0,numDim,&gridCoords[0]);
2448 simHalo.SendMessage(0,cartNeighbors,testComm);
2449 simHalo.ReceiveMessage(0,cartNeighbors,testComm);
2450 simHalo.UnPackMessageBuffers(0,0,numDim,&gridCoords[0]);
2452 parallelUnitResults.
UpdateResult(
"WENO:RHS:Jump:InitFixtures",parTestWENO);
2462 parTestWENO =
false;
2465 parallelUnitResults.
UpdateResult(
"WENO:RHS:Jump:SetupState",parTestWENO);
2470 std::cout << messageStream.str() << std::endl;
2471 std::cout <<
"Testing WENO jump in " << jumpDim <<
" dimension." << std::endl;
2480 std::vector<double> numbers(4,0.0);
2484 paramState.
Create(numPointsBuffer,0);
2493 std::vector<double> rho(numPointsBuffer,-1000.0);
2494 std::vector<double> rhoV(numDim*numPointsBuffer,-1000.0);
2495 std::vector<double> rhoE(numPointsBuffer,-1000.0);
2500 double rhoEL = 4.0 + 2.0*numDim;
2505 double rhoER = 8.0 + 9.0*numDim;
2508 double loc1 = 0.25*length;
2509 double loc2 = 0.75*length;
2512 double checkLoc1 = loc1;
2513 double checkLoc2 = loc2 + dx;
2515 size_t iStart = partitionBufferInterval[0].first;
2516 size_t iEnd = partitionBufferInterval[0].second;
2517 size_t jStart = partitionBufferInterval[1].first;
2518 size_t jEnd = partitionBufferInterval[1].second;
2525 kStart = partitionBufferInterval[2].first;
2526 kEnd = partitionBufferInterval[2].second;
2529 for (
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
2531 for (
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
2532 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
2533 for (
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
2534 size_t bufferIndex = jBufferIndex + iIndex;
2538 if (cloc < loc1 || cloc > loc2) {
2539 rho[bufferIndex] = rhoL;
2540 for (
int vDim=0; vDim<numDim; vDim++) {
2543 rhoE[bufferIndex] = rhoEL;
2545 rho[bufferIndex] = rhoR;
2546 for (
int vDim=0; vDim<numDim; vDim++) {
2549 rhoE[bufferIndex] = rhoER;
2555 std::vector<double> dRho(numPointsBuffer,-1000.0);
2556 std::vector<double> dRhoV(numDim*numPointsBuffer,-1000.0);
2557 std::vector<double> dRhoE(numPointsBuffer,-1000.0);
2559 std::vector<double> T(numPointsBuffer,0.0);
2560 std::vector<double> p(numPointsBuffer,0.0);
2561 std::vector<double>
V(numDim*numPointsBuffer,0.0);
2563 std::vector<double> rhom1(numPointsBuffer,0.0);
2565 simState.SetFieldBuffer(
"simTime",&t);
2566 simState.SetFieldBuffer(
"rho",&rho[0]);
2567 simState.SetFieldBuffer(
"rhoV",&rhoV[0]);
2568 simState.SetFieldBuffer(
"rhoE",&rhoE[0]);
2570 simState.SetFieldBuffer(
"pressure",&p[0]);
2571 simState.SetFieldBuffer(
"temperature",&T[0]);
2572 simState.SetFieldBuffer(
"velocity",&V[0]);
2573 simState.SetFieldBuffer(
"rhom1",&rhom1[0]);
2575 state_t rhsState(simState);
2582 std::vector<double> inParams;
2583 std::vector<int> inFlags;
2585 if(rhsWENO.Initialize(simGrid,simState,paramState,sbpOperator)){
2586 parTestWENO =
false;
2588 std::vector<int> numThreadsDim;
2590 std::cout <<
"Setting up threads for grid object failed." << std::endl;
2593 rhsWENO.InitThreadIntervals();
2595 parallelUnitResults.
UpdateResult(
"WENO:RHS:Jump:InitRHS",parTestWENO);
2600 if(rhsWENO.SetupRHS(simGrid,simState,rhsState)){
2601 parTestWENO =
false;
2604 parallelUnitResults.
UpdateResult(
"WENO:RHS:Jump:SetupRHS",parTestWENO);
2609 int statusWENO = rhsWENO.RHS(0);
2611 parTestWENO =
false;
2612 std::cout <<
"RHS returned error code " << statusWENO << std::endl;
2615 parallelUnitResults.
UpdateResult(
"WENO:RHS:Jump:ErrorRHS",parTestWENO);
2620 std::vector<double* > &rhsBuffers(rhsWENO.RHSBuffers());
2625 double fluxRhoL = 2.0;
2626 double fluxRhoVMainL = 5.6;
2627 double fluxRhoVAltL = 4.0;
2628 double fluxRhoEL = 11.2 + 4.0*numDim;
2631 double fluxRhoR = 6.0;
2632 double fluxRhoVMainR = 21.2;
2633 double fluxRhoVAltR = 18.0;
2634 double fluxRhoER = 33.6 + 27.0*numDim;
2636 double dFluxRho = (fluxRhoR - fluxRhoL)/dx;
2637 double dFluxRhoVMain = (fluxRhoVMainR - fluxRhoVMainL)/dx;
2638 double dFluxRhoVAlt = (fluxRhoVAltR - fluxRhoVAltL)/dx;
2639 double dFluxRhoE = (fluxRhoER - fluxRhoEL)/dx;
2670 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
2672 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
2673 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
2674 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
2675 size_t bufferIndex = jBufferIndex + iIndex;
2679 if (std::abs(cloc - checkLoc1) < eps) {
2680 if(std::abs(rhsBuffers[0][bufferIndex] + dFluxRho) > epsLarge) {
2681 parTestWENO =
false;
2682 std::cout <<
"RHS check failed: rho = " << rhsBuffers[0][bufferIndex]
2683 <<
", expected " << -dFluxRho << std::endl;
2685 for(
int vDim = 0;vDim < numDim;vDim++){
2686 if(vDim == jumpDim){
2687 if(std::abs(rhsBuffers[vDim+1][bufferIndex] + dFluxRhoVMain) > epsLarge) {
2688 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
2689 <<
", expected " << -dFluxRhoVMain << std::endl;
2690 parTestWENO =
false;
2693 if(std::abs(rhsBuffers[vDim+1][bufferIndex] + dFluxRhoVAlt) > epsLarge) {
2694 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
2695 <<
", expected " << -dFluxRhoVAlt << std::endl;
2696 parTestWENO =
false;
2700 if(std::abs(rhsBuffers[numDim+1][bufferIndex] + dFluxRhoE) > epsLarge) {
2701 std::cout <<
"RHS check failed: rhoE = " 2702 << rhsBuffers[numDim+1][bufferIndex]
2703 <<
", expected " << -dFluxRhoE << std::endl;
2704 parTestWENO =
false;
2706 }
else if (std::abs(cloc - checkLoc2) < eps) {
2707 if(std::abs(rhsBuffers[0][bufferIndex] - dFluxRho) > epsLarge) {
2708 parTestWENO =
false;
2709 std::cout <<
"RHS check failed: rho = " << rhsBuffers[0][bufferIndex]
2710 <<
", expected " << dFluxRho << std::endl;
2712 for(
int vDim = 0;vDim < numDim;vDim++){
2713 if(vDim == jumpDim){
2714 if(std::abs(rhsBuffers[vDim+1][bufferIndex] - dFluxRhoVMain) > epsLarge) {
2715 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
2716 <<
", expected " << dFluxRhoVMain << std::endl;
2717 parTestWENO =
false;
2720 if(std::abs(rhsBuffers[vDim+1][bufferIndex] - dFluxRhoVAlt) > epsLarge) {
2721 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
2722 <<
", expected " << dFluxRhoVAlt << std::endl;
2723 parTestWENO =
false;
2727 if(std::abs(rhsBuffers[numDim+1][bufferIndex] - dFluxRhoE) > epsLarge) {
2728 std::cout <<
"RHS check failed: rhoE = " 2729 << rhsBuffers[numDim+1][bufferIndex]
2730 <<
", expected " << dFluxRhoE << std::endl;
2731 parTestWENO =
false;
2733 }
else if ((std::abs(cloc - checkLoc1) < stenWidth*dx+eps)
2734 || (std::abs(cloc - checkLoc2) < stenWidth*dx+eps)) {
2737 for(
int eqn = 0; eqn < numDim+2; eqn++){
2738 if(std::abs(rhsBuffers[eqn][bufferIndex]) > epsLarge)
2740 parTestWENO =
false;
2741 std::cout <<
"Failed RHS " << rhsBuffers[eqn][bufferIndex] << std::endl;
2745 for(
int eqn = 0; eqn < numDim+2; eqn++){
2746 if(std::abs(rhsBuffers[eqn][bufferIndex]) > eps)
2748 parTestWENO =
false;
2749 std::cout <<
"Failed RHS " << rhsBuffers[eqn][bufferIndex] << std::endl;
2755 std::cout <<
"i = " << iIndex <<
", j = " << jIndex <<
", k = " << kIndex
2756 <<
", jumpDim = " << jumpDim <<
", cloc = " << cloc << std::endl;
2757 std::cout <<
"checkLoc1 = " << checkLoc1 <<
", checkLoc2 = " << checkLoc2 << std::endl;
2758 std::cout <<
"rho = " << rho[bufferIndex];
2759 for (
int vDim=0; vDim<numDim; vDim++) {
2760 std::cout <<
", rhoV[" << vDim <<
"] = " << rhoV[bufferIndex + vDim*
numPointsBuffer];
2762 std::cout <<
", rhoE = " << rhoE[bufferIndex] << std::endl;
2767 parallelUnitResults.
UpdateResult(
"WENO:RHS:Jump:CheckRHS",parTestWENO);
2781 for(
int numDim = 2;numDim < 4;numDim++){
2783 std::cout <<
"TestWENO:RHS:TransonicJump:Testing WENO in " << numDim <<
" dimensions." << std::endl;
2785 for (
int jumpDim=0; jumpDim<numDim; jumpDim++) {
2787 operator_t sbpOperator;
2788 halo_t &simHalo(simGrid.
Halo());
2792 weno_t &coeffsWENO(rhsWENO.WENOCoefficients());
2794 bool parTestWENO =
true;
2796 double length = 20.0;
2797 std::vector<size_t>
gridSizes(numDim,numPoints);
2798 double dx = length/(numPoints - 1);
2801 gridSizes,2,testComm,&messageStream)){
2802 parTestWENO =
false;
2806 parTestWENO =
false;
2811 std::vector<int> cartNeighbors;
2813 gridCommPtr->CartNeighbors(cartNeighbors);
2816 int xyzMessageId = simHalo.CreateMessageBuffers(numDim);
2817 simHalo.PackMessageBuffers(xyzMessageId,0,numDim,&gridCoords[0]);
2819 simHalo.SendMessage(0,cartNeighbors,testComm);
2820 simHalo.ReceiveMessage(0,cartNeighbors,testComm);
2821 simHalo.UnPackMessageBuffers(0,0,numDim,&gridCoords[0]);
2823 parallelUnitResults.
UpdateResult(
"WENO:RHS:TransonicJump:InitFixtures",parTestWENO);
2833 parTestWENO =
false;
2836 parallelUnitResults.
UpdateResult(
"WENO:RHS:TransonicJump:SetupState",parTestWENO);
2841 std::cout << messageStream.str() << std::endl;
2842 std::cout <<
"Testing WENO jump in " << jumpDim <<
" dimension." << std::endl;
2851 std::vector<double> numbers(4,0.0);
2855 paramState.
Create(numPointsBuffer,0);
2864 std::vector<double> rho(numPointsBuffer,-1000.0);
2865 std::vector<double> rhoV(numDim*numPointsBuffer,-1000.0);
2866 std::vector<double> rhoE(numPointsBuffer,-1000.0);
2883 double loc1 = 0.25*length;
2884 double loc2 = 0.75*length;
2887 double checkLoc1 = loc1;
2888 double checkLoc2 = loc2 + dx;
2890 size_t iStart = partitionBufferInterval[0].first;
2891 size_t iEnd = partitionBufferInterval[0].second;
2892 size_t jStart = partitionBufferInterval[1].first;
2893 size_t jEnd = partitionBufferInterval[1].second;
2900 kStart = partitionBufferInterval[2].first;
2901 kEnd = partitionBufferInterval[2].second;
2904 for (
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
2906 for (
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
2907 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
2908 for (
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
2909 size_t bufferIndex = jBufferIndex + iIndex;
2913 if (cloc < loc1 || cloc > loc2) {
2914 rho[bufferIndex] = rhoL;
2915 for (
int vDim=0; vDim<numDim; vDim++) {
2916 if (vDim == jumpDim) rhoV[bufferIndex + vDim*
numPointsBuffer] = rhoVL;
2919 rhoE[bufferIndex] = rhoEL;
2921 rho[bufferIndex] = rhoR;
2922 for (
int vDim=0; vDim<numDim; vDim++) {
2923 if (vDim == jumpDim) rhoV[bufferIndex + vDim*
numPointsBuffer] = rhoVR;
2926 rhoE[bufferIndex] = rhoER;
2932 std::vector<double> dRho(numPointsBuffer,-1000.0);
2933 std::vector<double> dRhoV(numDim*numPointsBuffer,-1000.0);
2934 std::vector<double> dRhoE(numPointsBuffer,-1000.0);
2936 std::vector<double> T(numPointsBuffer,0.0);
2937 std::vector<double> p(numPointsBuffer,0.0);
2938 std::vector<double>
V(numDim*numPointsBuffer,0.0);
2940 std::vector<double> rhom1(numPointsBuffer,0.0);
2942 simState.SetFieldBuffer(
"simTime",&t);
2943 simState.SetFieldBuffer(
"rho",&rho[0]);
2944 simState.SetFieldBuffer(
"rhoV",&rhoV[0]);
2945 simState.SetFieldBuffer(
"rhoE",&rhoE[0]);
2947 simState.SetFieldBuffer(
"pressure",&p[0]);
2948 simState.SetFieldBuffer(
"temperature",&T[0]);
2949 simState.SetFieldBuffer(
"velocity",&V[0]);
2950 simState.SetFieldBuffer(
"rhom1",&rhom1[0]);
2952 state_t rhsState(simState);
2959 std::vector<double> inParams;
2960 std::vector<int> inFlags;
2962 if(rhsWENO.Initialize(simGrid,simState,paramState,sbpOperator)){
2963 parTestWENO =
false;
2965 std::vector<int> numThreadsDim;
2967 std::cout <<
"Setting up threads for grid object failed." << std::endl;
2970 rhsWENO.InitThreadIntervals();
2972 parallelUnitResults.
UpdateResult(
"WENO:RHS:TransonicJump:InitRHS",parTestWENO);
2977 if(rhsWENO.SetupRHS(simGrid,simState,rhsState)){
2978 parTestWENO =
false;
2981 parallelUnitResults.
UpdateResult(
"WENO:RHS:TransonicJump:SetupRHS",parTestWENO);
2986 int statusWENO = rhsWENO.RHS(0);
2988 parTestWENO =
false;
2989 std::cout <<
"RHS returned error code " << statusWENO << std::endl;
2992 parallelUnitResults.
UpdateResult(
"WENO:RHS:TransonicJump:ErrorRHS",parTestWENO);
2997 std::vector<double* > &rhsBuffers(rhsWENO.RHSBuffers());
3030 double dFluxLargeRho = 1.149/dx;
3031 double dFluxLargeRhoVMain = 2.130/dx;
3032 double dFluxLargeRhoVAlt = 0.0/dx;
3033 double dFluxLargeRhoE = 6.807/dx;
3036 double dFluxSmallRho = -0.149/dx;
3037 double dFluxSmallRhoVMain = 0.0698/dx;
3038 double dFluxSmallRhoVAlt = 0.0/dx;
3039 double dFluxSmallRhoE = -0.707/dx;
3042 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
3044 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
3045 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
3046 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
3047 size_t bufferIndex = jBufferIndex + iIndex;
3051 if (std::abs(cloc - checkLoc1) < eps) {
3052 if(std::abs(rhsBuffers[0][bufferIndex] - dFluxLargeRho) > epsLarge) {
3053 parTestWENO =
false;
3054 std::cout <<
"RHS check failed: rho = " << rhsBuffers[0][bufferIndex]
3055 <<
", expected " << dFluxLargeRho << std::endl;
3057 for(
int vDim = 0;vDim < numDim;vDim++){
3058 if(vDim == jumpDim){
3059 if(std::abs(rhsBuffers[vDim+1][bufferIndex] - dFluxLargeRhoVMain) > epsLarge) {
3060 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3061 <<
", expected " << dFluxLargeRhoVMain << std::endl;
3062 parTestWENO =
false;
3065 if(std::abs(rhsBuffers[vDim+1][bufferIndex] - dFluxLargeRhoVAlt) > epsLarge) {
3066 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3067 <<
", expected " << dFluxLargeRhoVAlt << std::endl;
3068 parTestWENO =
false;
3072 if(std::abs(rhsBuffers[numDim+1][bufferIndex] -
3073 dFluxLargeRhoE) > epsLarge) {
3074 std::cout <<
"RHS check failed: rhoE = " 3075 << rhsBuffers[numDim+1][bufferIndex]
3076 <<
", expected " << dFluxLargeRhoE << std::endl;
3077 parTestWENO =
false;
3079 }
else if (std::abs(cloc - (checkLoc1-dx)) < eps) {
3080 if(std::abs(rhsBuffers[0][bufferIndex] - dFluxSmallRho) > epsLarge) {
3081 parTestWENO =
false;
3082 std::cout <<
"RHS check failed: rho = " << rhsBuffers[0][bufferIndex]
3083 <<
", expected " << dFluxSmallRho << std::endl;
3085 for(
int vDim = 0;vDim < numDim;vDim++){
3086 if(vDim == jumpDim){
3087 if(std::abs(rhsBuffers[vDim+1][bufferIndex] - dFluxSmallRhoVMain) > epsLarge) {
3088 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3089 <<
", expected " << dFluxSmallRhoVMain << std::endl;
3090 parTestWENO =
false;
3093 if(std::abs(rhsBuffers[vDim+1][bufferIndex] - dFluxSmallRhoVAlt) > epsLarge) {
3094 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3095 <<
", expected " << dFluxSmallRhoVAlt << std::endl;
3096 parTestWENO =
false;
3100 if(std::abs(rhsBuffers[numDim+1][bufferIndex] -
3101 dFluxSmallRhoE) > epsLarge) {
3102 std::cout <<
"RHS check failed: rhoE = " 3103 << rhsBuffers[numDim+1][bufferIndex]
3104 <<
", expected " << dFluxSmallRhoE << std::endl;
3105 parTestWENO =
false;
3107 }
else if (std::abs(cloc - checkLoc2) < eps) {
3108 if(std::abs(rhsBuffers[0][bufferIndex] + dFluxLargeRho) > epsLarge) {
3109 parTestWENO =
false;
3110 std::cout <<
"RHS check failed: rho = " << rhsBuffers[0][bufferIndex]
3111 <<
", expected " << -dFluxLargeRho << std::endl;
3113 for(
int vDim = 0;vDim < numDim;vDim++){
3114 if(vDim == jumpDim){
3115 if(std::abs(rhsBuffers[vDim+1][bufferIndex] + dFluxLargeRhoVMain) > epsLarge) {
3116 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3117 <<
", expected " << -dFluxLargeRhoVMain << std::endl;
3118 parTestWENO =
false;
3121 if(std::abs(rhsBuffers[vDim+1][bufferIndex] + dFluxLargeRhoVAlt) > epsLarge) {
3122 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3123 <<
", expected " << -dFluxLargeRhoVAlt << std::endl;
3124 parTestWENO =
false;
3128 if(std::abs(rhsBuffers[numDim+1][bufferIndex] +
3129 dFluxLargeRhoE) > epsLarge) {
3130 std::cout <<
"RHS check failed: rhoE = " 3131 << rhsBuffers[numDim+1][bufferIndex]
3132 <<
", expected " << -dFluxLargeRhoE << std::endl;
3133 parTestWENO =
false;
3135 }
else if (std::abs(cloc - (checkLoc2-dx)) < eps) {
3136 if(std::abs(rhsBuffers[0][bufferIndex] + dFluxSmallRho) > epsLarge) {
3137 parTestWENO =
false;
3138 std::cout <<
"RHS check failed: rho = " << rhsBuffers[0][bufferIndex]
3139 <<
", expected " << -dFluxSmallRho << std::endl;
3141 for(
int vDim = 0;vDim < numDim;vDim++){
3142 if(vDim == jumpDim){
3143 if(std::abs(rhsBuffers[vDim+1][bufferIndex] + dFluxSmallRhoVMain) > epsLarge) {
3144 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3145 <<
", expected " << -dFluxSmallRhoVMain << std::endl;
3146 parTestWENO =
false;
3149 if(std::abs(rhsBuffers[vDim+1][bufferIndex] + dFluxSmallRhoVAlt) > epsLarge) {
3150 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3151 <<
", expected " << -dFluxSmallRhoVAlt << std::endl;
3152 parTestWENO =
false;
3156 if(std::abs(rhsBuffers[numDim+1][bufferIndex] +
3157 dFluxSmallRhoE) > epsLarge) {
3158 std::cout <<
"RHS check failed: rhoE = " 3159 << rhsBuffers[numDim+1][bufferIndex]
3160 <<
", expected " << -dFluxSmallRhoE << std::endl;
3161 parTestWENO =
false;
3163 }
else if ((std::abs(cloc - checkLoc1) < stenWidth*dx+eps)
3164 || (std::abs(cloc - checkLoc2) < stenWidth*dx+eps)) {
3167 for(
int eqn = 0; eqn < numDim+2; eqn++){
3168 if(std::abs(rhsBuffers[eqn][bufferIndex]) > epsLarge)
3170 parTestWENO =
false;
3171 std::cout <<
"RHS check failed " << rhsBuffers[eqn][bufferIndex] << std::endl;
3175 for(
int eqn = 0; eqn < numDim+2; eqn++){
3176 if(std::abs(rhsBuffers[eqn][bufferIndex]) > eps)
3178 parTestWENO =
false;
3179 std::cout <<
"RHS check failed " << rhsBuffers[eqn][bufferIndex] << std::endl;
3185 std::cout <<
"i = " << iIndex <<
", j = " << jIndex <<
", k = " << kIndex
3186 <<
", jumpDim = " << jumpDim <<
", cloc = " << cloc << std::endl;
3187 std::cout <<
"checkLoc1 = " << checkLoc1 <<
", checkLoc2 = " << checkLoc2 << std::endl;
3188 std::cout <<
"rho = " << rho[bufferIndex];
3189 for (
int vDim=0; vDim<numDim; vDim++) {
3190 std::cout <<
", rhoV[" << vDim <<
"] = " << rhoV[bufferIndex + vDim*
numPointsBuffer];
3192 std::cout <<
", rhoE = " << rhoE[bufferIndex] << std::endl;
3197 parallelUnitResults.
UpdateResult(
"WENO:RHS:TransonicJump:CheckRHS",parTestWENO);
3211 for(
int numDim = 2;numDim < 4;numDim++){
3213 std::cout <<
"TestWENO:RHS:JumpMetric:Testing WENO in " << numDim <<
" dimensions." << std::endl;
3215 for (
int jumpDim=0; jumpDim<numDim; jumpDim++) {
3217 operator_t sbpOperator;
3218 halo_t &simHalo(simGrid.
Halo());
3222 weno_t &coeffsWENO(rhsWENO.WENOCoefficients());
3224 bool parTestWENO =
true;
3226 double length = 20.0;
3227 std::vector<size_t>
gridSizes(numDim,numPoints);
3228 double dx = length/(numPoints - 1);
3231 gridSizes,2,testComm,&messageStream)){
3232 parTestWENO =
false;
3236 parTestWENO =
false;
3241 std::vector<int> cartNeighbors;
3243 gridCommPtr->CartNeighbors(cartNeighbors);
3246 int xyzMessageId = simHalo.CreateMessageBuffers(numDim);
3247 simHalo.PackMessageBuffers(xyzMessageId,0,numDim,&gridCoords[0]);
3249 simHalo.SendMessage(0,cartNeighbors,testComm);
3250 simHalo.ReceiveMessage(0,cartNeighbors,testComm);
3251 simHalo.UnPackMessageBuffers(0,0,numDim,&gridCoords[0]);
3253 parallelUnitResults.
UpdateResult(
"WENO:RHS:JumpMetric:InitFixtures",parTestWENO);
3263 parTestWENO =
false;
3266 parallelUnitResults.
UpdateResult(
"WENO:RHS:JumpMetric:SetupState",parTestWENO);
3271 std::cout << messageStream.str() << std::endl;
3272 std::cout <<
"Testing WENO jump in " << jumpDim <<
" dimension." << std::endl;
3281 std::vector<double> numbers(4,0.0);
3285 paramState.
Create(numPointsBuffer,0);
3294 std::vector<double> rho(numPointsBuffer,-1000.0);
3295 std::vector<double> rhoV(numDim*numPointsBuffer,-1000.0);
3296 std::vector<double> rhoE(numPointsBuffer,-1000.0);
3301 double rhoEL = 4.0 + 2.0*numDim;
3306 double rhoER = 8.0 + 9.0*numDim;
3309 double loc1 = 0.25*length;
3310 double loc2 = 0.75*length;
3313 double checkLoc1 = loc1;
3314 double checkLoc2 = loc2 + dx;
3316 size_t iStart = partitionBufferInterval[0].first;
3317 size_t iEnd = partitionBufferInterval[0].second;
3318 size_t jStart = partitionBufferInterval[1].first;
3319 size_t jEnd = partitionBufferInterval[1].second;
3326 kStart = partitionBufferInterval[2].first;
3327 kEnd = partitionBufferInterval[2].second;
3330 for (
size_t kIndex = kStart; kIndex <= kEnd; kIndex++) {
3332 for (
size_t jIndex = jStart; jIndex <= jEnd; jIndex++) {
3333 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
3334 for (
size_t iIndex = iStart; iIndex <= iEnd; iIndex++) {
3335 size_t bufferIndex = jBufferIndex + iIndex;
3339 if (cloc < loc1 || cloc > loc2) {
3340 rho[bufferIndex] = rhoL;
3341 for (
int vDim=0; vDim<numDim; vDim++) {
3344 rhoE[bufferIndex] = rhoEL;
3346 rho[bufferIndex] = rhoR;
3347 for (
int vDim=0; vDim<numDim; vDim++) {
3350 rhoE[bufferIndex] = rhoER;
3356 std::vector<double> dRho(numPointsBuffer,-1000.0);
3357 std::vector<double> dRhoV(numDim*numPointsBuffer,-1000.0);
3358 std::vector<double> dRhoE(numPointsBuffer,-1000.0);
3360 std::vector<double> T(numPointsBuffer,0.0);
3361 std::vector<double> p(numPointsBuffer,0.0);
3362 std::vector<double>
V(numDim*numPointsBuffer,0.0);
3364 std::vector<double> rhom1(numPointsBuffer,0.0);
3366 simState.SetFieldBuffer(
"simTime",&t);
3367 simState.SetFieldBuffer(
"rho",&rho[0]);
3368 simState.SetFieldBuffer(
"rhoV",&rhoV[0]);
3369 simState.SetFieldBuffer(
"rhoE",&rhoE[0]);
3371 simState.SetFieldBuffer(
"pressure",&p[0]);
3372 simState.SetFieldBuffer(
"temperature",&T[0]);
3373 simState.SetFieldBuffer(
"velocity",&V[0]);
3374 simState.SetFieldBuffer(
"rhom1",&rhom1[0]);
3376 state_t rhsState(simState);
3383 std::vector<double> inParams;
3384 std::vector<int> inFlags;
3386 if(rhsWENO.Initialize(simGrid,simState,paramState,sbpOperator)){
3387 parTestWENO =
false;
3389 std::vector<int> numThreadsDim;
3391 std::cout <<
"Setting up threads for grid object failed." << std::endl;
3394 rhsWENO.InitThreadIntervals();
3396 parallelUnitResults.
UpdateResult(
"WENO:RHS:JumpMetric:InitRHS",parTestWENO);
3401 if(rhsWENO.SetupRHS(simGrid,simState,rhsState)){
3402 parTestWENO =
false;
3405 parallelUnitResults.
UpdateResult(
"WENO:RHS:JumpMetric:SetupRHS",parTestWENO);
3410 int statusWENO = rhsWENO.RHS(0);
3412 parTestWENO =
false;
3413 std::cout <<
"RHS returned error code " << statusWENO << std::endl;
3416 parallelUnitResults.
UpdateResult(
"WENO:RHS:JumpMetric:ErrorRHS",parTestWENO);
3421 std::vector<double* > &rhsBuffers(rhsWENO.RHSBuffers());
3426 double fluxRhoL = 2.0;
3427 double fluxRhoVMainL = 5.6;
3428 double fluxRhoVAltL = 4.0;
3429 double fluxRhoEL = 11.2 + 4.0*numDim;
3432 double fluxRhoR = 6.0;
3433 double fluxRhoVMainR = 21.2;
3434 double fluxRhoVAltR = 18.0;
3435 double fluxRhoER = 33.6 + 27.0*numDim;
3437 double dFluxRho = (fluxRhoR - fluxRhoL)/dx;
3438 double dFluxRhoVMain = (fluxRhoVMainR - fluxRhoVMainL)/dx;
3439 double dFluxRhoVAlt = (fluxRhoVAltR - fluxRhoVAltL)/dx;
3440 double dFluxRhoE = (fluxRhoER - fluxRhoEL)/dx;
3471 for(
size_t kIndex = kStart;((kIndex <= kEnd)&&parTestWENO);kIndex++){
3473 for(
size_t jIndex = jStart;((jIndex <= jEnd)&&parTestWENO);jIndex++){
3474 size_t jBufferIndex = jIndex*bufferSizes[0] + kBufferIndex;
3475 for(
size_t iIndex = iStart;((iIndex <= iEnd) && parTestWENO);iIndex++){
3476 size_t bufferIndex = jBufferIndex + iIndex;
3480 if (std::abs(cloc - checkLoc1) < eps) {
3481 if(std::abs(rhsBuffers[0][bufferIndex] + dFluxRho) > epsLarge) {
3482 parTestWENO =
false;
3483 std::cout <<
"RHS check failed: rho = " << rhsBuffers[0][bufferIndex]
3484 <<
", expected " << -dFluxRho << std::endl;
3486 for(
int vDim = 0;vDim < numDim;vDim++){
3487 if(vDim == jumpDim){
3488 if(std::abs(rhsBuffers[vDim+1][bufferIndex] + dFluxRhoVMain) > epsLarge) {
3489 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3490 <<
", expected " << -dFluxRhoVMain << std::endl;
3491 parTestWENO =
false;
3494 if(std::abs(rhsBuffers[vDim+1][bufferIndex] + dFluxRhoVAlt) > epsLarge) {
3495 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3496 <<
", expected " << -dFluxRhoVAlt << std::endl;
3497 parTestWENO =
false;
3501 if(std::abs(rhsBuffers[numDim+1][bufferIndex] + dFluxRhoE) > epsLarge) {
3502 std::cout <<
"RHS check failed: rhoE = " 3503 << rhsBuffers[numDim+1][bufferIndex]
3504 <<
", expected " << -dFluxRhoE << std::endl;
3505 parTestWENO =
false;
3507 }
else if (std::abs(cloc - checkLoc2) < eps) {
3508 if(std::abs(rhsBuffers[0][bufferIndex] - dFluxRho) > epsLarge) {
3509 parTestWENO =
false;
3510 std::cout <<
"RHS check failed: rho = " << rhsBuffers[0][bufferIndex]
3511 <<
", expected " << dFluxRho << std::endl;
3513 for(
int vDim = 0;vDim < numDim;vDim++){
3514 if(vDim == jumpDim){
3515 if(std::abs(rhsBuffers[vDim+1][bufferIndex] - dFluxRhoVMain) > epsLarge) {
3516 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3517 <<
", expected " << dFluxRhoVMain << std::endl;
3518 parTestWENO =
false;
3521 if(std::abs(rhsBuffers[vDim+1][bufferIndex] - dFluxRhoVAlt) > epsLarge) {
3522 std::cout <<
"RHS check failed: rhoV = " << rhsBuffers[vDim+1][bufferIndex]
3523 <<
", expected " << dFluxRhoVAlt << std::endl;
3524 parTestWENO =
false;
3528 if(std::abs(rhsBuffers[numDim+1][bufferIndex] - dFluxRhoE) > epsLarge) {
3529 std::cout <<
"RHS check failed: rhoE = " 3530 << rhsBuffers[numDim+1][bufferIndex]
3531 <<
", expected " << dFluxRhoE << std::endl;
3532 parTestWENO =
false;
3534 }
else if ((std::abs(cloc - checkLoc1) < stenWidth*dx+eps)
3535 || (std::abs(cloc - checkLoc2) < stenWidth*dx+eps)) {
3538 for(
int eqn = 0; eqn < numDim+2; eqn++){
3539 if(std::abs(rhsBuffers[eqn][bufferIndex]) > epsLarge)
3541 parTestWENO =
false;
3542 std::cout <<
"Failed RHS " << rhsBuffers[eqn][bufferIndex] << std::endl;
3546 for(
int eqn = 0; eqn < numDim+2; eqn++){
3547 if(std::abs(rhsBuffers[eqn][bufferIndex]) > eps)
3549 parTestWENO =
false;
3550 std::cout <<
"Failed RHS " << rhsBuffers[eqn][bufferIndex] << std::endl;
3556 std::cout <<
"i = " << iIndex <<
", j = " << jIndex <<
", k = " << kIndex
3557 <<
", jumpDim = " << jumpDim <<
", cloc = " << cloc << std::endl;
3558 std::cout <<
"checkLoc1 = " << checkLoc1 <<
", checkLoc2 = " << checkLoc2 << std::endl;
3559 std::cout <<
"rho = " << rho[bufferIndex];
3560 for (
int vDim=0; vDim<numDim; vDim++) {
3561 std::cout <<
", rhoV[" << vDim <<
"] = " << rhoV[bufferIndex + vDim*
numPointsBuffer];
3563 std::cout <<
", rhoE = " << rhoE[bufferIndex] << std::endl;
3568 parallelUnitResults.
UpdateResult(
"WENO:RHS:JumpMetric:CheckRHS",parTestWENO);
simulation::state::base state_t
void const size_t * numPoints
plascom2::operators::sbp::base operator_t
pcpp::IndexIntervalType & PartitionInterval()
int GenerateCoordinates(std::ostream &)
void const size_t const size_t * gridSizes
pcpp::CommunicatorType comm_t
virtual size_t Create(size_t number_of_nodes=0, size_t number_of_cells=0)
pcpp::IndexIntervalType interval_t
int SetupEulerState(const GridType &inGrid, StateType &inState, StateType &inParams, int numScalars, bool withFluxes=false)
pcpp::ParallelGlobalType global_t
const std::vector< size_t > & BufferSizes() const
void TestWENO_RHS(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
Encapsulating class for collections of test results.
simulation::domain::base< grid_t, state_t > domain_t
pcpp::IndexIntervalType & PartitionBufferInterval()
Main encapsulation of MPI.
void TestWENO_ApplyWENO(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
Testing constructs for unit testing.
int SetupThreads(std::vector< int > &numThreadPartitions)
Encapsulation for a collection of operator stencils.
int CreateSimulationFixtures(GridType &inGrid, HaloType &inHalo, plascom2::operators::sbp::base &inOperator, const std::vector< size_t > &gridSizes, int interiorOrder, pcpp::CommunicatorType &inComm, std::ostream *messageStreamPtr=NULL)
void const size_t const size_t * bufferSizes
void const size_t const size_t const size_t const int const double * V
void UpdateResult(const std::string &name, const ValueType &result)
Updates an existing test result.
std::vector< double > & CoordinateData()
simulation::grid::halo halo_t
Simple Block Structured Mesh object.
fixtures::CommunicatorType & Communicator() const
simulation::grid::parallel_blockstructured grid_t
void SetFieldBuffer(const std::string &name, void *buf)
size_t BufferSize() const
void const size_t * numPointsBuffer