25 std::cout <<
"TestViscidKernels.." << std::endl;
28 std::vector<bool> dimComputeDV(2,
false);
29 std::vector<bool> dimComputeTV(2,
false);
30 std::vector<bool> dimComputeStressTensor(2,
false);
31 std::vector<bool> dimComputeHeatFlux(2,
false);
32 std::vector<bool> dimComputeDV2(2,
true);
33 std::vector<bool> dimComputeTEF(2,
true);
37 std::vector<bool> dimViscidUniformFlux(2,
true);
40 for(
int nDim = 2;nDim <= 3;nDim++){
44 realGridExtent.resize(numDim*2,0.0);
45 for(
int iDim = 0;iDim < numDim;iDim++)
46 realGridExtent[iDim*2 + 1] = 1.0;
48 std::vector<size_t> &numNodes(testGrid.
GridSizes());
49 numNodes.resize(numDim);
59 size_t numNodesDomain = 1;
60 size_t numCellsDomain = 1;
61 std::vector<double> dX(numDim,0.0);
66 for(
int iDim = 0;iDim < numDim;iDim++){
67 numNodesDomain *= numNodes[iDim];
68 numCellsDomain *= (numNodes[iDim]-1);
69 dX[iDim] = (realGridExtent[iDim*2+1] - realGridExtent[iDim*2])/(numNodes[iDim]-1);
70 gridMetric[iDim] = 1.0/dX[iDim];
71 gridJacobian[0] *= gridMetric[iDim];
75 std::cout <<
"Grid finalization failed." << std::endl;
85 double specGasConst = 1.0;
88 std::vector<double> vVec(numDim,0.0);
91 if(numDim == 3) vVec[2] = 2.0;
95 double pressure = 1.0;
97 double temperature = pressure/density/specGasConst;
99 std::vector<double> expectedRhoM1(numNodesDomain,1.0/density);
100 std::vector<double> expectedFlux((numDim+2)*numNodesDomain,0.0);
101 std::vector<double> expectedPressure(numNodesDomain,pressure);
102 std::vector<double> expectedTemperature(numNodesDomain,temperature);
103 std::vector<double> expectedVHat(numDim*numNodesDomain,0.0);
104 std::vector<double> expectedVelocity(numDim*numNodesDomain,0.0);
105 std::vector<double> expectedInternalEnergy(numNodesDomain,pressure/(gamma-1.0));
106 std::vector<double> expectedRHS((numDim+2)*numNodesDomain,0.0);
108 std::vector<double> ke(numNodesDomain,0.0);
109 std::vector<double> rho(numNodesDomain,density);
111 std::vector<double> rhoV(numDim*numNodesDomain,0.0);
112 std::vector<double> rhoE(numNodesDomain,0.0);
117 for(
int iDim = 0;iDim < numDim;iDim++){
118 for(
int iPoint = 0;iPoint < numNodesDomain;iPoint++){
119 rhoV[iDim*numNodesDomain + iPoint] = rho[iPoint]*vVec[iDim];
120 ke[iPoint] += .5*rho[iPoint]*vVec[iDim]*vVec[iDim];
121 expectedVelocity[iDim*numNodesDomain+iPoint] = vVec[iDim];
122 expectedVHat[iDim*numNodesDomain+iPoint] = vVec[iDim]/dX[iDim];
126 for(
int iPoint = 0;iPoint < numNodesDomain;iPoint++){
128 rhoE[iPoint] = expectedPressure[iPoint]/(gamma-1.0)+ ke[iPoint];
131 std::vector<double> T(numNodesDomain,0.0);
132 std::vector<double> p(numNodesDomain,0.0);
133 std::vector<double> rhom1(numNodesDomain,0.0);
134 std::vector<double>
velocity(numDim*numNodesDomain,-.1);
135 std::vector<double> internalEnergy(numNodesDomain,0.);
137 std::vector<double *> vBuffers(numDim,(
double *)NULL);
138 for(
int iDim = 0;iDim < numDim;iDim++)
139 vBuffers[iDim] = &velocity[iDim*numNodesDomain];
141 bool computeDVWorks =
true;
147 T.resize(numNodesDomain,0.0);
148 p.resize(numNodesDomain,0.0);
149 velocity.resize(numDim*numNodesDomain,-.1);
150 rhom1.resize(numNodesDomain,0.0);
152 std::vector<double *> myStateBuffers(numDim+2,NULL);
153 myStateBuffers[0] = &rho[0];
154 for(
int iDim = 0;iDim < numDim;iDim++)
155 myStateBuffers[iDim+1] = &rhoV[iDim*numNodesDomain];
156 myStateBuffers[numDim+1] = &rhoE[0];
158 std::vector<double *> myDVBuffers(4+numDim,NULL);
159 myDVBuffers[0] = &p[0];
160 myDVBuffers[1] = &T[0];
161 myDVBuffers[2] = &rhom1[0];
163 for(
int iDim = 0;iDim < numDim;iDim++){
164 vBuffers[iDim] = &velocity[iDim*numNodesDomain];
165 myDVBuffers[3+iDim] = vBuffers[iDim];
167 myDVBuffers[numDim+3] = &internalEnergy[0];
184 std::cout <<
"Failed to initialize EOS" << std::endl;
189 std::cout <<
"ComputeDVBuffer failed." << std::endl;
194 std::cout <<
"ComputePressure failed." << std::endl;
198 std::cout <<
"ComputeTemperature failed." << std::endl;
201 bool printPressure=
true;
202 bool printTemperature=
true;
203 bool printVelocity=
true;
204 bool printVolume=
true;
205 for(
int iNode = 0;iNode < numNodesDomain;iNode++){
206 if(std::abs(p[iNode] - expectedPressure[iNode]) > 1e-15){
207 computeDVWorks =
false;
209 std::cout <<
"In ComputeDVTest, Expected pressure=" << expectedPressure[iNode]
210 <<
" got pressure=" << p[iNode] <<
" at iNode=" << iNode << std::endl;
211 std::cout <<
"No further error messages will be generated for pressure" << std::endl;
215 if(std::abs(T[iNode] - expectedTemperature[iNode]) > 1e-15){
216 computeDVWorks =
false;
217 if(printTemperature) {
218 std::cout <<
"In ComputeDVTest, Expected temperature=" << expectedTemperature[iNode]
219 <<
" got temperature=" << T[iNode] <<
" at iNode=" << iNode << std::endl;
220 std::cout <<
"No further error messages will be generated for temperature" << std::endl;
221 printTemperature=
false;
224 if(std::abs(rhom1[iNode] - expectedRhoM1[iNode]) > 1e-15){
225 computeDVWorks =
false;
227 std::cout <<
"In ComputeDVTest, Expected volume=" << expectedRhoM1[iNode]
228 <<
" got volume=" << rhom1[iNode] <<
" at iNode=" << iNode << std::endl;
229 std::cout <<
"No further error messages will be generated for volume" << std::endl;
233 for(
int iDim = 0;iDim < numDim;iDim++){
234 if(std::abs(velocity[iDim*numNodesDomain+iNode] -
235 expectedVelocity[iDim*numNodesDomain+iNode]) > 1e-15){
236 computeDVWorks =
false;
238 std::cout <<
"In ComputeDVTest, Expected velocity=" << expectedVelocity[iNode]
239 <<
" got velocity=" << velocity[iNode] <<
" at iNode=" 240 << iNode <<
" iDim=" << iDim << std::endl;
241 std::cout <<
"No further error messages will be generated for velocity" << std::endl;
251 std::cout <<
"Running tests for "<<numDim<<
"D ComputeTV" << std::endl;
253 std::vector<double> mu(numNodesDomain,0.0);
254 std::vector<double> lambda(numNodesDomain,0.0);
255 std::vector<double> kappa(numNodesDomain,0.0);
257 std::vector<double *> myTVBuffers(3,NULL);
258 myTVBuffers[0] = &mu[0];
259 myTVBuffers[1] = &lambda[0];
260 myTVBuffers[2] = &kappa[0];
263 double power = 0.666;
265 double bulkViscFac = 2;
266 double Cp = gamma/(gamma-1);
268 double tempMu = beta*pow(expectedTemperature[0],power);
269 double tempLambda = (bulkViscFac - 2.0/3.0)*tempMu;
270 double tempKappa = Cp*tempMu/Pr;
271 std::vector<double> expectedMu(numNodesDomain,tempMu);
272 std::vector<double> expectedLambda(numNodesDomain,tempLambda);
273 std::vector<double> expectedKappa(numNodesDomain,tempKappa);
274 bool computeTVWorks=
true;
275 bool muFailed =
false;
276 bool lambdaFailed =
false;
277 bool kappaFailed =
false;
280 bufferExtent,numNodes,myDVBuffers[1],myTVBuffers,beta,power,bulkViscFac,Cp,Pr))
282 std::cout <<
"ComputeTVBuffer failed." << std::endl;
286 bool printLambda =
true;
287 bool printKappa =
true;
289 for(
int iNode = 0;iNode < numNodesDomain;iNode++){
290 error = std::abs((mu[iNode] - expectedMu[iNode])/expectedMu[iNode]);
292 computeTVWorks =
false;
295 std::cout <<
"In ComputeTvTest, Expected mu=" << expectedMu[iNode]
296 <<
" got mu=" << mu[iNode] <<
" at iNode=" << iNode << std::endl;
297 std::cout <<
"Temperature was " << T[iNode] << std::endl;
298 std::cout <<
"No further error messages will be generated for mu" << std::endl;
302 error = std::abs((lambda[iNode] - expectedLambda[iNode])/expectedLambda[iNode]);
304 computeTVWorks =
false;
307 std::cout <<
"In ComputeTvTest, Expected lambda=" << expectedLambda[iNode]
308 <<
" got lambda=" << lambda[iNode] <<
" at iNode=" << iNode << std::endl;
309 std::cout <<
"Temperature was " << T[iNode] << std::endl;
310 std::cout <<
"No further error messages will be generated for lambda" << std::endl;
314 error = std::abs((kappa[iNode] - expectedKappa[iNode])/expectedKappa[iNode]);
316 computeTVWorks =
false;
319 std::cout <<
"In ComputeTvTest, Expected kappa=" << expectedKappa[iNode]
320 <<
" got kappa=" << kappa[iNode] <<
" at iNode=" << iNode << std::endl;
321 std::cout <<
"Temperature was " << T[iNode] << std::endl;
322 std::cout <<
"No further error messages will be generated for kappa" << std::endl;
328 dimComputeTV[numDim-2] = computeTVWorks;
330 std::cout <<
"Mu failed" << std::endl;
333 std::cout <<
"Lambda failed" << std::endl;
336 std::cout <<
"Kappa failed" << std::endl;
339 std::cout <<
"Done running tests for "<<numDim<<
"D ComputeTV" << std::endl;
340 std::cout <<
"Running tests for "<<numDim<<
"D ComputeStressTensor" << std::endl;
347 std::vector<double *> myVelGradBuffer(numDim,NULL);
348 for(
int i=0;i<numDim;i++){
349 myVelGradBuffer[i] =
new double [numDim*numNodesDomain];
350 for(
int j=0;j<numDim;j++){
351 int offset=j*numNodesDomain;
352 double value =
static_cast<double>(i*numDim+j+1);
353 for(
int k=0;k<numNodesDomain;k++){
357 myVelGradBuffer[i][offset+k]=value;
367 std::vector<double *> myTauBuffer(numDim*numDim,NULL);
368 std::vector<double> myTau(numDim*(numDim+1)*numNodesDomain/2,0);
369 size_t bufferIndex = 0;
370 for(
int i=0;i<numDim;i++){
371 for(
int j=0;j<numDim;j++){
372 int index = i*numDim + j;
374 myTauBuffer[index] = &myTau[bufferIndex];
375 bufferIndex += numNodesDomain;
377 myTauBuffer[index] = myTauBuffer[j*numDim+i];
384 myTVBuffers, myVelGradBuffer, myTauBuffer)){
385 std::cout <<
"Calculation of the stress tensor failed" << std::endl;
392 std::vector<double> tauExpected;
395 tauExpected.push_back(tempMu/Re*(1*gridMetric[0]+1*gridMetric[0])
396 + tempLambda/Re*(1*gridMetric[0]+4*gridMetric[1]));
397 tauExpected.push_back(tempMu/Re*(2*gridMetric[0]+3*gridMetric[1]));
398 tauExpected.push_back(tempMu/Re*(2*gridMetric[0]+3*gridMetric[1]));
399 tauExpected.push_back(tempMu/Re*(4*gridMetric[1]+4*gridMetric[1])
400 + tempLambda/Re*(1*gridMetric[0]+4*gridMetric[1]));
413 tauExpected.push_back(tempMu/Re*(1*gridMetric[0]+1*gridMetric[0])
414 + tempLambda/Re*(1*gridMetric[0]+5*gridMetric[1]+9*gridMetric[2]));
415 tauExpected.push_back(tempMu/Re*(2*gridMetric[0]+4*gridMetric[1]));
416 tauExpected.push_back(tempMu/Re*(3*gridMetric[0]+7*gridMetric[2]));
417 tauExpected.push_back(tempMu/Re*(2*gridMetric[0]+4*gridMetric[1]));
418 tauExpected.push_back(tempMu/Re*(5*gridMetric[1]+5*gridMetric[1])
419 + tempLambda/Re*(1*gridMetric[0]+5*gridMetric[1]+9*gridMetric[2]));
420 tauExpected.push_back(tempMu/Re*(6*gridMetric[1]+8*gridMetric[2]));
421 tauExpected.push_back(tempMu/Re*(3*gridMetric[0]+7*gridMetric[2]));
422 tauExpected.push_back(tempMu/Re*(6*gridMetric[1]+8*gridMetric[2]));
423 tauExpected.push_back(tempMu/Re*(9*gridMetric[2]+9*gridMetric[2])
424 + tempLambda/Re*(1*gridMetric[0]+5*gridMetric[1]+9*gridMetric[2]));
427 for(
int i=0;i<tauExpected.size();i++){
428 tauExpected[i] *= gridJacobian[0];
432 bool tauFailed=
false;
433 bool computeTauWorks=
true;
434 for(
int i=0;i<numDim*numDim;i++){
436 for(
int iNode = 0;iNode < numNodesDomain;iNode++){
437 double error = std::abs((myTauBuffer[i][iNode] - tauExpected[i])/tauExpected[i]);
439 computeTauWorks =
false;
442 std::cout <<
"In ComputeTauTest, Expected tau[" << i <<
"]=" << tauExpected[i]
443 <<
" got tau=" << myTauBuffer[i][iNode] <<
" at iNode=" << iNode
444 <<
" error=" << error << std::endl;
445 std::cout <<
"No further error messages will be generated for this tau index" 452 dimComputeStressTensor[numDim-2] = computeTauWorks;
454 std::cout <<
"Tau failed" << std::endl;
456 std::cout <<
"Done running tests for "<<numDim<<
"D ComputeStressTensor" << std::endl;
458 std::cout <<
"Running tests for "<<numDim<<
"D ComputeHeatFlux" << std::endl;
463 std::vector<double *> myTempGradBuffer(numDim,NULL);
464 std::vector<double> myTempGrad(numDim*numNodesDomain,0);
465 for(
int i=0;i<numDim;i++){
466 myTempGradBuffer[i] = &myTempGrad[i*numNodesDomain];
467 double value =
static_cast<double>(i+1);
468 for(
int k=0;k<numNodesDomain;k++){
469 myTempGradBuffer[i][k]=value;
474 std::vector<double *> myHeatFluxBuffer(numDim,NULL);
475 std::vector<double> myHeatFlux(numDim*numNodesDomain,0);
476 for(
int i=0;i<numDim;i++){
477 myHeatFluxBuffer[i] = &myHeatFlux[i*numNodesDomain];
481 gridJacobian, Re, myTVBuffers, myTempGradBuffer,
483 std::cout <<
"Calculation of the heat flux vector failed" << std::endl;
490 std::vector<double> heatFluxExpected;
491 for(
int iDim = 0;iDim < numDim;iDim++)
492 heatFluxExpected.push_back(Cp*tempMu/Pr/Re*(iDim+1)*gridMetric[iDim]*gridJacobian[0]);
495 bool heatFluxFailed=
false;
496 bool computeHeatFluxWorks=
true;
497 for(
int i=0;i<numDim;i++){
498 bool printHeatFlux=
true;
499 for(
int iNode = 0;iNode < numNodesDomain;iNode++){
500 double error = std::abs((myHeatFluxBuffer[i][iNode] - heatFluxExpected[i])/
501 heatFluxExpected[i]);
503 computeHeatFluxWorks =
false;
504 heatFluxFailed =
true;
506 std::cout <<
"In ComputeHeatFluxTest, Expected heatFlux[" << i <<
"]=" 507 << heatFluxExpected[i]
508 <<
" got heatFlux=" << myHeatFluxBuffer[i][iNode] <<
" at iNode=" 509 << iNode <<
" error=" << error << std::endl;
510 std::cout <<
"No further error messages will be generated for this q index" 517 dimComputeHeatFlux[numDim-2] = computeHeatFluxWorks;
519 std::cout <<
"Heat flux failed" << std::endl;
521 std::cout <<
"Done running tests for " << numDim
522 <<
"D ComputeHeatFlux" << std::endl;
529 std::cout <<
"Running tests for " << numDim
530 <<
"D viscous flux" << std::endl;
532 std::vector<size_t> fortranBufferInterval(2*numDim,1);
533 for(
int iDim = 0;iDim < numDim;iDim++){
534 fortranBufferInterval[2*iDim+1] = bufferInterval[2*iDim+1] + 1;
537 for(
int iDim = 0;iDim < numDim;iDim++){
538 vBuffers[iDim] = &velocity[iDim*numNodesDomain];
548 for(
int iDim = 0;iDim < numDim;iDim++){
550 for(
int iVel = 0;iVel < numDim;iVel++){
551 int tensorIndex = iDim*numDim + iVel;
552 size_t dirOffset = iVel*numNodesDomain;
555 (&numDim,&numNodesDomain,&numNodes[0],&fortranBufferInterval[0],
556 &velocity[dirOffset],myTauBuffer[tensorIndex],myHeatFluxBuffer[iDim]);
561 for(
int iDim = 0;iDim < numDim;iDim++){
562 bool triggered =
false;
563 double expectedValue = 0;
564 for(
int iVel = 0;iVel < numDim;iVel++){
565 int tensorIndex = iDim*numDim + iVel;
566 expectedValue += (vVec[iVel] * tauExpected[tensorIndex]);
568 expectedValue += heatFluxExpected[iDim];
569 for(
size_t iPoint = 0;iPoint < numNodesDomain;iPoint++){
570 if((std::abs(myHeatFluxBuffer[iDim][iPoint] - expectedValue)/std::abs(expectedValue)) >
572 dimComputeTEF[nDim-2] =
false;
574 std::cout <<
"Failed in " << (iDim+1) <<
"/" << numDim
575 <<
" dimension " << std::endl;
576 std::cout <<
"TEF(" << iPoint <<
") [r,e] = [" << myHeatFluxBuffer[iDim][iPoint]
577 <<
"," << expectedValue <<
"]" << std::endl;
584 for(
int iDim = 0;iDim < numDim;iDim++){
586 std::vector<double> viscidFlux(numNodesDomain*(numDim+2),0.0);
587 std::vector<double> expectedFlux((numDim+2)*numNodesDomain,0.0);
588 std::vector<double> scaledTau(numNodesDomain,0.0);
590 for(
size_t iPoint = 0;iPoint < numNodesDomain;iPoint++){
593 for(
int ivDim = 0;ivDim < numDim;ivDim++){
594 size_t iOffset = ivDim*numNodesDomain;
595 fOffset = iOffset + numNodesDomain;
596 size_t vectorOffset = ivDim*numNodesDomain;
599 int tauIndex=iDim*numDim+ivDim;
600 expectedFlux[iPoint+fOffset] += tauExpected[tauIndex]*gridMetric[iDim];
603 expectedFlux[iPoint+(numDim+1)*numNodesDomain] +=
604 tauExpected[tauIndex]*velocity[vectorOffset+iPoint]*gridMetric[iDim];
608 expectedFlux[iPoint+(numDim+1)*numNodesDomain] +=
609 heatFluxExpected[iDim]*gridMetric[iDim];
611 fOffset += numNodesDomain;
614 int fluxDim = iDim + 1;
615 int tau1=iDim*numDim;
620 (&numDim,&fluxDim,&numNodes[0],&numNodesDomain,&fortranBufferInterval[0],
621 &
gridType,&gridMetric[0],&myTau[0],&myHeatFlux[0],&viscidFlux[0]);
623 std::vector<bool> uniformFlux(numDim+2,
true);
624 for(
int fDim = 0 ;fDim < (numDim+2);fDim++){
625 size_t fOffset = fDim * numNodesDomain;
626 bool triggered =
false;
627 for(
size_t iPoint = 0;iPoint < numNodesDomain;iPoint++){
628 double error= std::abs((viscidFlux[fOffset+iPoint] - expectedFlux[fOffset+iPoint])/
629 expectedFlux[fOffset+iPoint]);
632 std::cout <<
"iDim " << iDim <<
" Flux Dimension " << fDim << std::endl;
633 std::cout << std::scientific << std::setprecision(16)
634 <<
"\tActual: " << viscidFlux[fOffset+iPoint] << std::endl
635 <<
"\tExpected: " << expectedFlux[fOffset+iPoint] << std::endl
636 <<
"\tError: " << error << std::endl;
639 uniformFlux[fDim] =
false;
643 for(
int fDim = 0;fDim < (numDim+2);fDim++){
644 if(!uniformFlux[fDim]){
645 dimViscidUniformFlux[numDim-2] =
false;
646 std::cout <<
"uniform flux failed in dim,fdim " << iDim
647 <<
"," << fDim << std::endl;
650 std::cout <<
"Done running tests for "<<numDim<<
"D viscous flux" << std::endl;
655 bool computeDVWorks =
true;
656 bool computeTVWorks =
true;
657 bool computeStressTensorWorks =
true;
658 bool computeHeatFluxWorks =
true;
659 bool viscidUniformFluxWorks =
true;
660 bool computeTotalEnergyFlux =
true;
662 for(
int nDim = 2;nDim <= 3;nDim++){
664 computeDVWorks = computeDVWorks && dimComputeDV2[nDim-2];
665 computeTVWorks = computeTVWorks && dimComputeTV[nDim-2];
666 computeTotalEnergyFlux = computeTotalEnergyFlux && dimComputeTEF[nDim-2];
667 computeStressTensorWorks = computeStressTensorWorks && dimComputeStressTensor[nDim-2];
668 computeHeatFluxWorks = computeHeatFluxWorks && dimComputeHeatFlux[nDim-2];
669 viscidUniformFluxWorks = viscidUniformFluxWorks && dimViscidUniformFlux[nDim-2];
672 serialUnitResults.
UpdateResult(
"Viscid:Kernels:ComputeTEF",computeTotalEnergyFlux);
673 serialUnitResults.
UpdateResult(
"Viscid:Kernels:DV",computeDVWorks);
674 serialUnitResults.
UpdateResult(
"Viscid:Kernels:TV",computeTVWorks);
675 serialUnitResults.
UpdateResult(
"Viscid:Kernels:StressTensor",computeStressTensorWorks);
676 serialUnitResults.
UpdateResult(
"Viscid:Kernels:HeatFlux",computeHeatFluxWorks);
677 serialUnitResults.
UpdateResult(
"Viscid:Kernels:UniformViscidFlux",viscidUniformFluxWorks);
693 const std::string functionName(
"TestViscidKernelsMetrics");
695 std::cout <<
"Running " << functionName << std::endl;
697 bool testResult =
true;
700 std::vector<bool> dimComputeDV(2,
false);
701 std::vector<bool> dimComputeTV(2,
false);
702 std::vector<bool> dimComputeStressTensor(2,
false);
703 std::vector<bool> dimComputeHeatFlux(2,
false);
704 std::vector<bool> dimComputeDV2(2,
true);
705 std::vector<bool> dimComputeTEF(2,
true);
707 std::vector<bool> dimViscidUniformFlux(2,
true);
714 std::cout <<
"Testing viscid kernels with " 717 " Curvilinear ") <<
" metrics." << std::endl;
720 for(
int nDim = 2;nDim <= 3;nDim++){
723 std::cout <<
"Testing viscid kernels in " << nDim <<
" dimensions." << std::endl;
728 realGridExtent.resize(numDim*2,0.0);
729 for(
int iDim = 0;iDim < numDim;iDim++)
730 realGridExtent[iDim*2 + 1] = 1.0;
732 std::vector<size_t> &numNodes(testGrid.
GridSizes());
733 numNodes.resize(numDim);
739 size_t numNodesDomain = 1;
740 size_t numCellsDomain = 1;
741 for(
int iDim = 0;iDim < numDim;iDim++){
742 numNodesDomain *= numNodes[iDim];
743 numCellsDomain *= (numNodes[iDim]-1);
746 std::vector<double> dX;
751 dX.resize(numDim,0.0);
752 gridMetric.resize(numDim,0.0);
753 gridJacobian.resize(1,1.0);
754 for(
int iDim = 0;iDim < numDim;iDim++){
755 dX[iDim] = (realGridExtent[iDim*2+1] - realGridExtent[iDim*2])/(numNodes[iDim]-1);
756 gridMetric[iDim] = 1.0/dX[iDim];
757 gridJacobian[0] *= gridMetric[iDim];
761 dX.resize(numDim*numNodesDomain,0.0);
762 gridMetric.resize(numDim*numNodesDomain,0.0);
763 gridJacobian.resize(numNodesDomain,1.0);
764 for(
int iDim = 0;iDim < numDim;iDim++){
765 size_t dimOffset = iDim*numNodesDomain;
766 for(
size_t iPoint = 0;iPoint < numNodesDomain;iPoint++){
767 dX[dimOffset+iPoint] = (realGridExtent[iDim*2+1] - realGridExtent[iDim*2])/(numNodes[iDim]-1);
768 gridMetric[dimOffset+iPoint] = 1.0/dX[dimOffset+iPoint];
769 gridJacobian[iPoint] *= gridMetric[dimOffset+iPoint];
773 dX.resize(numDim*numDim*numNodesDomain,0.0);
774 gridMetric.resize(numDim*numDim*numNodesDomain,0.0);
775 gridJacobian.resize(numNodesDomain,0.0);
776 for(
int iDim = 0;iDim < numDim;iDim++){
777 size_t iIndex = iDim*numDim;
778 for(
int jDim = 0;jDim < numDim;jDim++){
779 size_t ijIndex = iIndex + jDim;
780 size_t metricOffset = ijIndex*numNodesDomain;
782 for(
int iPoint = 0;iPoint < numNodesDomain;iPoint++){
783 dX[metricOffset+iPoint] = (realGridExtent[iDim*2+1] - realGridExtent[iDim*2])/(numNodes[iDim]-1);
784 gridMetric[metricOffset+iPoint] = 1.0/dX[metricOffset+iPoint];
785 gridJacobian[iPoint] *= gridMetric[metricOffset+iPoint];
792 std::cout <<
"Grid finalization failed." << std::endl;
802 double specGasConst = 1.0;
805 std::vector<double> vVec(numDim,0.0);
808 if(numDim == 3) vVec[2] = 2.0;
812 double pressure = 1.0;
813 double density = 1.2;
814 double temperature = pressure/density/specGasConst;
816 std::vector<double> expectedRhoM1(numNodesDomain,1.0/density);
817 std::vector<double> expectedFlux((numDim+2)*numNodesDomain,0.0);
818 std::vector<double> expectedPressure(numNodesDomain,pressure);
819 std::vector<double> expectedTemperature(numNodesDomain,temperature);
820 std::vector<double> expectedVHat(numDim*numNodesDomain,0.0);
821 std::vector<double> expectedVelocity(numDim*numNodesDomain,0.0);
822 std::vector<double> expectedRHS((numDim+2)*numNodesDomain,0.0);
824 std::vector<double> ke(numNodesDomain,0.0);
825 std::vector<double> rho(numNodesDomain,density);
826 std::vector<double> rhoV(numDim*numNodesDomain,1.0);
827 std::vector<double> rhoE(numNodesDomain,0.0);
833 for(
int iDim = 0;iDim < numDim;iDim++){
834 double dx = dX[iDim];
836 dx = dX[iDim*numNodesDomain];
838 dx = dX[iDim*numDim*numNodesDomain];
840 for(
int iPoint = 0;iPoint < numNodesDomain;iPoint++){
841 rhoV[iDim*numNodesDomain + iPoint] = rho[iPoint]*vVec[iDim];
842 ke[iPoint] += .5*rho[iPoint]*vVec[iDim]*vVec[iDim];
843 expectedVelocity[iDim*numNodesDomain+iPoint] = vVec[iDim];
844 expectedVHat[iDim*numNodesDomain+iPoint] = vVec[iDim]/dx;
848 for(
int iPoint = 0;iPoint < numNodesDomain;iPoint++){
850 rhoE[iPoint] = expectedPressure[iPoint]/(gamma-1.0)+ ke[iPoint];
853 std::vector<double> T(numNodesDomain,0.0);
854 std::vector<double> p(numNodesDomain,0.0);
855 std::vector<double> rhom1(numNodesDomain,0.0);
856 std::vector<double>
velocity(numDim*numNodesDomain,-.1);
857 std::vector<double> internalEnergy(numNodesDomain,0.);
859 std::vector<double *> vBuffers(numDim,(
double *)NULL);
860 for(
int iDim = 0;iDim < numDim;iDim++)
861 vBuffers[iDim] = &velocity[iDim*numNodesDomain];
863 bool computeDVWorks =
true;
864 bool pfailed =
false;
865 bool tfailed =
false;
866 bool rfailed =
false;
867 bool vfailed =
false;
873 T.resize(numNodesDomain,0.0);
874 p.resize(numNodesDomain,0.0);
875 velocity.resize(numDim*numNodesDomain,-.1);
876 rhom1.resize(numNodesDomain,0.0);
878 std::vector<double *> myStateBuffers(numDim+2,NULL);
879 myStateBuffers[0] = &rho[0];
880 for(
int iDim = 0;iDim < numDim;iDim++)
881 myStateBuffers[iDim+1] = &rhoV[iDim*numNodesDomain];
882 myStateBuffers[numDim+1] = &rhoE[0];
884 std::vector<double *> myDVBuffers(4+numDim,NULL);
885 myDVBuffers[0] = &p[0];
886 myDVBuffers[1] = &T[0];
887 myDVBuffers[2] = &rhom1[0];
889 for(
int iDim = 0;iDim < numDim;iDim++){
890 vBuffers[iDim] = &velocity[iDim*numNodesDomain];
891 myDVBuffers[3+iDim] = vBuffers[iDim];
893 myDVBuffers[numDim+3] = &internalEnergy[0];
910 std::cout <<
"Failed to initialize EOS" << std::endl;
915 std::cout <<
"ComputeDVBuffer failed." << std::endl;
920 std::cout <<
"ComputePressure failed." << std::endl;
924 std::cout <<
"ComputeTemperature failed." << std::endl;
928 bool printPressure=
true;
929 bool printTemperature=
true;
930 bool printVelocity=
true;
931 bool printVolume=
true;
932 for(
int iNode = 0;iNode < numNodesDomain;iNode++){
933 if(std::abs(p[iNode] - expectedPressure[iNode]) > 1e-15){
934 computeDVWorks =
false;
936 std::cout <<
"In ComputeDVTest, Expected pressure=" << expectedPressure[iNode]
937 <<
" got pressure=" << p[iNode] <<
" at iNode=" << iNode << std::endl;
938 std::cout <<
"No further error messages will be generated for pressure" << std::endl;
942 if(std::abs(T[iNode] - expectedTemperature[iNode]) > 1e-15){
943 computeDVWorks =
false;
944 if(printTemperature) {
945 std::cout <<
"In ComputeDVTest, Expected temperature=" << expectedTemperature[iNode]
946 <<
" got temperature=" << T[iNode] <<
" at iNode=" << iNode << std::endl;
947 std::cout <<
"No further error messages will be generated for temperature" << std::endl;
948 printTemperature=
false;
951 if(std::abs(rhom1[iNode] - expectedRhoM1[iNode]) > 1e-15){
952 computeDVWorks =
false;
954 std::cout <<
"In ComputeDVTest, Expected volume=" << expectedRhoM1[iNode]
955 <<
" got volume=" << rhom1[iNode] <<
" at iNode=" << iNode << std::endl;
956 std::cout <<
"No further error messages will be generated for volume" << std::endl;
960 for(
int iDim = 0;iDim < numDim;iDim++){
961 if(std::abs(velocity[iDim*numNodesDomain+iNode] -
962 expectedVelocity[iDim*numNodesDomain+iNode]) > 1e-15){
963 computeDVWorks =
false;
965 std::cout <<
"In ComputeDVTest, Expected velocity=" << expectedVelocity[iNode]
966 <<
" got velocity=" << velocity[iNode] <<
" at iNode=" 967 << iNode <<
" iDim=" << iDim << std::endl;
968 std::cout <<
"No further error messages will be generated for velocity" << std::endl;
975 dimComputeDV2[numDim-2] = computeDVWorks ;
980 std::cout <<
"Running tests for "<<numDim<<
"D ComputeTV" << std::endl;
982 std::vector<double> mu(numNodesDomain,0.0);
983 std::vector<double> lambda(numNodesDomain,0.0);
984 std::vector<double> kappa(numNodesDomain,0.0);
986 std::vector<double *> myTVBuffers(3,NULL);
987 myTVBuffers[0] = &mu[0];
988 myTVBuffers[1] = &lambda[0];
989 myTVBuffers[2] = &kappa[0];
992 double power = 0.666;
994 double bulkViscFac = 2;
995 double Cp = gamma/(gamma-1);
997 double tempMu = beta*pow(expectedTemperature[0],power);
998 double tempLambda = (bulkViscFac - 2.0/3.0)*tempMu;
999 double tempKappa = Cp*tempMu/Pr;
1000 std::vector<double> expectedMu(numNodesDomain,tempMu);
1001 std::vector<double> expectedLambda(numNodesDomain,tempLambda);
1002 std::vector<double> expectedKappa(numNodesDomain,tempKappa);
1003 bool computeTVWorks=
true;
1004 bool muFailed =
false;
1005 bool lambdaFailed =
false;
1006 bool kappaFailed =
false;
1009 bufferExtent,numNodes,myDVBuffers[1],myTVBuffers,beta,power,bulkViscFac,Cp,Pr))
1011 std::cout <<
"ComputeTVBuffer failed." << std::endl;
1014 bool printMu =
true;
1015 bool printLambda =
true;
1016 bool printKappa =
true;
1018 for(
int iNode = 0;iNode < numNodesDomain;iNode++){
1019 error = std::abs((mu[iNode] - expectedMu[iNode])/expectedMu[iNode]);
1021 computeTVWorks =
false;
1024 std::cout <<
"In ComputeTvTest, Expected mu=" << expectedMu[iNode]
1025 <<
" got mu=" << mu[iNode] <<
" at iNode=" << iNode << std::endl;
1026 std::cout <<
"Temperature was " << T[iNode] << std::endl;
1027 std::cout <<
"No further error messages will be generated for mu" << std::endl;
1031 error = std::abs((lambda[iNode] - expectedLambda[iNode])/expectedLambda[iNode]);
1033 computeTVWorks =
false;
1034 lambdaFailed =
true;
1036 std::cout <<
"In ComputeTvTest, Expected lambda=" << expectedLambda[iNode]
1037 <<
" got lambda=" << lambda[iNode] <<
" at iNode=" << iNode << std::endl;
1038 std::cout <<
"Temperature was " << T[iNode] << std::endl;
1039 std::cout <<
"No further error messages will be generated for lambda" << std::endl;
1043 error = std::abs((kappa[iNode] - expectedKappa[iNode])/expectedKappa[iNode]);
1045 computeTVWorks =
false;
1048 std::cout <<
"In ComputeTvTest, Expected kappa=" << expectedKappa[iNode]
1049 <<
" got kappa=" << kappa[iNode] <<
" at iNode=" << iNode << std::endl;
1050 std::cout <<
"Temperature was " << T[iNode] << std::endl;
1051 std::cout <<
"No further error messages will be generated for kappa" << std::endl;
1057 dimComputeTV[numDim-2] = computeTVWorks;
1059 std::cout <<
"Mu failed" << std::endl;
1062 std::cout <<
"Lambda failed" << std::endl;
1065 std::cout <<
"Kappa failed" << std::endl;
1068 std::cout <<
"Done running tests for "<<numDim<<
"D ComputeTV" << std::endl;
1069 std::cout <<
"Running tests for "<<numDim<<
"D ComputeStressTensor" << std::endl;
1076 std::vector<double *> myVelGradBuffer(numDim,NULL);
1077 for(
int i=0;i<numDim;i++){
1078 myVelGradBuffer[i] =
new double [numDim*numNodesDomain];
1079 for(
int j=0;j<numDim;j++){
1080 int offset=j*numNodesDomain;
1081 double value =
static_cast<double>(i*numDim+j+1);
1082 for(
int k=0;k<numNodesDomain;k++){
1086 myVelGradBuffer[i][offset+k]=value;
1096 std::vector<double *> myTauBuffer(numDim*numDim,NULL);
1097 std::vector<double> myTau(numDim*(numDim+1)*numNodesDomain/2,0);
1098 size_t bufferIndex = 0;
1099 for(
int i=0;i<numDim;i++){
1100 for(
int j=0;j<numDim;j++){
1101 int index = i*numDim + j;
1103 myTauBuffer[index] = &myTau[bufferIndex];
1104 bufferIndex += numNodesDomain;
1106 myTauBuffer[index] = myTauBuffer[j*numDim+i];
1113 myTVBuffers, myVelGradBuffer, myTauBuffer)){
1114 std::cout <<
"Calculation of the stress tensor failed" << std::endl;
1121 std::vector<double> tauExpected;
1125 double metricX = gridMetric[0];
1126 double metricY = gridMetric[1];
1129 metricY = gridMetric[numNodesDomain];
1131 metricY = gridMetric[3*numNodesDomain];
1134 tauExpected.push_back(tempMu/Re*(1*metricX+1*metricX)
1135 + tempLambda/Re*(1*metricX+4*metricY));
1136 tauExpected.push_back(tempMu/Re*(2*metricX+3*metricY));
1137 tauExpected.push_back(tempMu/Re*(2*metricX+3*metricY));
1138 tauExpected.push_back(tempMu/Re*(4*metricY+4*metricY)
1139 + tempLambda/Re*(1*metricX+4*metricY));
1149 double metricX = gridMetric[0];
1150 double metricY = gridMetric[1];
1151 double metricZ = gridMetric[2];
1153 metricY = gridMetric[numNodesDomain];
1154 metricZ = gridMetric[2*numNodesDomain];
1156 metricY = gridMetric[4*numNodesDomain];
1157 metricZ = gridMetric[8*numNodesDomain];
1160 tauExpected.push_back(tempMu/Re*(1*metricX+1*metricX)
1161 + tempLambda/Re*(1*metricX+5*metricY+9*metricZ));
1162 tauExpected.push_back(tempMu/Re*(2*metricX+4*metricY));
1163 tauExpected.push_back(tempMu/Re*(3*metricX+7*metricZ));
1164 tauExpected.push_back(tempMu/Re*(2*metricX+4*metricY));
1165 tauExpected.push_back(tempMu/Re*(5*metricY+5*metricY)
1166 + tempLambda/Re*(1*metricX+5*metricY+9*metricZ));
1167 tauExpected.push_back(tempMu/Re*(6*metricY+8*metricZ));
1168 tauExpected.push_back(tempMu/Re*(3*metricX+7*metricZ));
1169 tauExpected.push_back(tempMu/Re*(6*metricY+8*metricZ));
1170 tauExpected.push_back(tempMu/Re*(9*metricZ+9*metricZ)
1171 + tempLambda/Re*(1*metricX+5*metricY+9*metricZ));
1174 for(
int i=0;i<tauExpected.size();i++){
1175 tauExpected[i] *= gridJacobian[0];
1179 bool tauFailed=
false;
1180 bool computeTauWorks=
true;
1181 for(
int i=0;i<numDim*numDim;i++){
1183 for(
int iNode = 0;iNode < numNodesDomain;iNode++){
1184 double error = std::abs((myTauBuffer[i][iNode] - tauExpected[i])/tauExpected[i]);
1186 computeTauWorks =
false;
1189 std::cout <<
"In ComputeTauTest, Expected tau[" << i <<
"]=" << tauExpected[i]
1190 <<
" got tau=" << myTauBuffer[i][iNode] <<
" at iNode=" << iNode
1191 <<
" error=" << error << std::endl;
1192 std::cout <<
"No further error messages will be generated for this tau index" 1199 dimComputeStressTensor[numDim-2] = computeTauWorks;
1201 std::cout <<
"Tau failed" << std::endl;
1203 std::cout <<
"Done running tests for "<<numDim<<
"D ComputeStressTensor" << std::endl;
1205 std::cout <<
"Running tests for "<<numDim<<
"D ComputeHeatFlux" << std::endl;
1210 std::vector<double *> myTempGradBuffer(numDim,NULL);
1211 std::vector<double> myTempGrad(numDim*numNodesDomain,0);
1212 for(
int i=0;i<numDim;i++){
1213 myTempGradBuffer[i] = &myTempGrad[i*numNodesDomain];
1214 double value =
static_cast<double>(i+1);
1215 for(
int k=0;k<numNodesDomain;k++){
1216 myTempGradBuffer[i][k]=value;
1221 std::vector<double *> myHeatFluxBuffer(numDim,NULL);
1222 std::vector<double> myHeatFlux(numDim*numNodesDomain,0);
1223 for(
int i=0;i<numDim;i++){
1224 myHeatFluxBuffer[i] = &myHeatFlux[i*numNodesDomain];
1228 gridJacobian, Re, myTVBuffers, myTempGradBuffer,
1230 std::cout <<
"Calculation of the heat flux vector failed" << std::endl;
1237 std::vector<double> heatFluxExpected;
1239 for(
int iDim = 0;iDim < numDim;iDim++){
1240 double metric = gridMetric[iDim*numNodesDomain];
1241 double jac = gridJacobian[0];
1242 heatFluxExpected.push_back(Cp*tempMu/Pr/Re*(iDim+1)*metric*jac);
1245 for(
int iDim = 0;iDim < numDim;iDim++){
1246 heatFluxExpected.push_back(Cp*tempMu/Pr/Re*(iDim+1)*gridMetric[iDim]*gridJacobian[0]);
1249 for(
int iDim = 0;iDim < numDim;iDim++){
1250 double metric = gridMetric[iDim*numDim*numNodesDomain];
1251 double jac = gridJacobian[0];
1252 heatFluxExpected.push_back(Cp*tempMu/Pr/Re*(iDim+1)*metric*jac);
1258 bool heatFluxFailed=
false;
1259 bool computeHeatFluxWorks=
true;
1260 for(
int i=0;i<numDim;i++){
1261 bool printHeatFlux=
true;
1262 for(
int iNode = 0;iNode < numNodesDomain;iNode++){
1263 double error = std::abs((myHeatFluxBuffer[i][iNode] - heatFluxExpected[i])/
1264 heatFluxExpected[i]);
1266 computeHeatFluxWorks =
false;
1267 heatFluxFailed =
true;
1269 std::cout <<
"In ComputeHeatFluxTest, Expected heatFlux[" << i <<
"]=" 1270 << heatFluxExpected[i]
1271 <<
" got heatFlux=" << myHeatFluxBuffer[i][iNode] <<
" at iNode=" 1272 << iNode <<
" error=" << error << std::endl;
1273 std::cout <<
"No further error messages will be generated for this q index" 1275 printHeatFlux=
false;
1280 dimComputeHeatFlux[numDim-2] = computeHeatFluxWorks;
1282 std::cout <<
"Heat flux failed" << std::endl;
1284 std::cout <<
"Done running tests for " << numDim
1285 <<
"D ComputeHeatFlux" << std::endl;
1292 std::cout <<
"Running tests for " << numDim
1293 <<
"D viscous flux" << std::endl;
1295 std::vector<size_t> fortranBufferInterval(2*numDim,1);
1296 for(
int iDim = 0;iDim < numDim;iDim++){
1297 fortranBufferInterval[2*iDim+1] = bufferInterval[2*iDim+1] + 1;
1300 for(
int iDim = 0;iDim < numDim;iDim++){
1301 vBuffers[iDim] = &velocity[iDim*numNodesDomain];
1311 for(
int iDim = 0;iDim < numDim;iDim++){
1313 for(
int iVel = 0;iVel < numDim;iVel++){
1314 int tensorIndex = iDim*numDim + iVel;
1315 size_t dirOffset = iVel*numNodesDomain;
1318 (&numDim,&numNodesDomain,&numNodes[0],&fortranBufferInterval[0],
1319 &velocity[dirOffset],myTauBuffer[tensorIndex],myHeatFluxBuffer[iDim]);
1324 for(
int iDim = 0;iDim < numDim;iDim++){
1325 bool triggered =
false;
1326 double expectedValue = 0;
1327 for(
int iVel = 0;iVel < numDim;iVel++){
1328 int tensorIndex = iDim*numDim + iVel;
1329 expectedValue += (vVec[iVel] * tauExpected[tensorIndex]);
1331 expectedValue += heatFluxExpected[iDim];
1332 for(
size_t iPoint = 0;iPoint < numNodesDomain;iPoint++){
1333 if((std::abs(myHeatFluxBuffer[iDim][iPoint] - expectedValue)/std::abs(expectedValue)) >
1335 dimComputeTEF[nDim-2] =
false;
1337 std::cout <<
"Failed in " << (iDim+1) <<
"/" << numDim
1338 <<
" dimension " << std::endl;
1339 std::cout <<
"TEF(" << iPoint <<
") [r,e] = [" << myHeatFluxBuffer[iDim][iPoint]
1340 <<
"," << expectedValue <<
"]" << std::endl;
1348 for(
int iDim = 0;iDim < numDim;iDim++){
1350 double metricX = gridMetric[iDim];
1353 metricX = gridMetric[iDim*numNodesDomain];
1355 metricX = gridMetric[iDim*numDim*numNodesDomain];
1358 std::vector<double> viscidFlux(numNodesDomain*(numDim+2),0.0);
1359 std::vector<double> expectedFlux((numDim+2)*numNodesDomain,0.0);
1360 std::vector<double> scaledTau(numNodesDomain,0.0);
1362 for(
size_t iPoint = 0;iPoint < numNodesDomain;iPoint++){
1365 for(
int ivDim = 0;ivDim < numDim;ivDim++){
1366 size_t iOffset = ivDim*numNodesDomain;
1367 fOffset = iOffset + numNodesDomain;
1368 size_t vectorOffset = ivDim*numNodesDomain;
1371 int tauIndex=iDim*numDim+ivDim;
1372 expectedFlux[iPoint+fOffset] += tauExpected[tauIndex]*metricX;
1375 expectedFlux[iPoint+(numDim+1)*numNodesDomain] +=
1376 tauExpected[tauIndex]*velocity[vectorOffset+iPoint]*metricX;
1380 expectedFlux[iPoint+(numDim+1)*numNodesDomain] +=
1381 heatFluxExpected[iDim]*metricX;
1383 fOffset += numNodesDomain;
1386 int fluxDim = iDim + 1;
1387 int tau1=iDim*numDim;
1392 (&numDim,&fluxDim,&numNodes[0],&numNodesDomain,&fortranBufferInterval[0],
1393 &
gridType,&gridMetric[0],&myTau[0],&myHeatFlux[0],&viscidFlux[0]);
1395 std::vector<bool> uniformFlux(numDim+2,
true);
1396 for(
int fDim = 0 ;fDim < (numDim+2);fDim++){
1397 size_t fOffset = fDim * numNodesDomain;
1398 bool triggered =
false;
1399 for(
size_t iPoint = 0;iPoint < numNodesDomain;iPoint++){
1400 double error= std::abs((viscidFlux[fOffset+iPoint] - expectedFlux[fOffset+iPoint])/
1401 expectedFlux[fOffset+iPoint]);
1404 std::cout <<
"iDim " << iDim <<
" Flux Dimension " << fDim << std::endl;
1405 std::cout << std::scientific << std::setprecision(16)
1406 <<
"\tActual: " << viscidFlux[fOffset+iPoint] << std::endl
1407 <<
"\tExpected: " << expectedFlux[fOffset+iPoint] << std::endl
1408 <<
"\tError: " << error << std::endl;
1411 uniformFlux[fDim] =
false;
1415 for(
int fDim = 0;fDim < (numDim+2);fDim++){
1416 if(!uniformFlux[fDim]){
1417 dimViscidUniformFlux[numDim-2] =
false;
1418 std::cout <<
"uniform flux failed in dim,fdim " << iDim
1419 <<
"," << fDim << std::endl;
1422 std::cout <<
"Done running tests for "<<numDim<<
"D viscous flux" << std::endl;
1428 bool computeDVWorks =
true;
1429 bool computeTVWorks =
true;
1430 bool computeStressTensorWorks =
true;
1431 bool computeHeatFluxWorks =
true;
1432 bool viscidUniformFluxWorks =
true;
1433 bool computeTotalEnergyFlux =
true;
1435 for(
int nDim = 2;nDim <= 3;nDim++){
1437 computeDVWorks = computeDVWorks && dimComputeDV2[nDim-2];
1438 computeTVWorks = computeTVWorks && dimComputeTV[nDim-2];
1439 computeTotalEnergyFlux = computeTotalEnergyFlux && dimComputeTEF[nDim-2];
1440 computeStressTensorWorks = computeStressTensorWorks && dimComputeStressTensor[nDim-2];
1441 computeHeatFluxWorks = computeHeatFluxWorks && dimComputeHeatFlux[nDim-2];
1442 viscidUniformFluxWorks = viscidUniformFluxWorks && dimViscidUniformFlux[nDim-2];
1444 if(computeStressTensorWorks && computeHeatFluxWorks && viscidUniformFluxWorks)
1454 serialUnitResults.
UpdateResult(
"Viscid:Kernels:GridMetrics",testResult);
1463 std::cout <<
"TestVelocityGradient..." << std::endl;
1476 std::ostringstream messageStream;
1480 operator_t sbpOperator2d;
1481 operator_t sbpOperator3d;
1482 halo_t &simHalo2d(simGrid2d.
Halo());
1483 halo_t &simHalo3d(simGrid3d.
Halo());
1487 state_t paramState2d;
1488 state_t paramState3d;
1490 bool parTestViscidRHS =
true;
1491 bool VelocityGradientWorks =
true;
1492 bool TemperatureGradientWorks =
true;
1494 std::cout <<
"Starting 2D linear Velocity Gradient Test" << std::endl;
1498 std::vector<size_t>
gridSizes(2,numNodes);
1501 std::vector<double> physicalExtent(4,1.0);
1502 physicalExtent[0] = 0.0;
1503 physicalExtent[2] = 0.0;
1506 std::vector<bool> periodicDirs(2,
false);
1510 parTestViscidRHS =
false;
1511 std::cout <<
"Failed to setup 2D grid in TestViscidRHS" << std::endl;
1515 std::cout << messageStream.str() << std::endl;
1516 messageStream.str(
"");
1517 messageStream.clear();
1521 int numDim = gridSizes.size();
1525 parTestViscidRHS =
false;
1526 std::cout <<
"Failed to setup state in TestViscidRHS" << std::endl;
1538 double power = 0.666;
1540 double bulkViscFac = 2;
1542 std::vector<double> &dX(simGrid2d.
DX());
1545 paramState2d.
AddField(
"dX",
's',numDim,8,
"space");
1546 paramState2d.
Create(numPointsBuffer,0);
1558 std::vector<double> rho(numPointsBuffer,1.0);
1559 std::vector<double> rhoV(numDim*numPointsBuffer,0.0);
1560 std::vector<double> rhoE(numPointsBuffer,1.0/(gamma-1.0));
1562 std::vector<double> T(numPointsBuffer,0.0);
1563 std::vector<double> p(numPointsBuffer,0.0);
1564 std::vector<double>
V(3*numPointsBuffer,0.0);
1565 std::vector<double> rhom1(numPointsBuffer,0.0);
1567 simState2d.SetFieldBuffer(
"simTime",&t);
1568 simState2d.SetFieldBuffer(
"rho",&rho[0]);
1569 simState2d.SetFieldBuffer(
"rhoV",&rhoV[0]);
1570 simState2d.SetFieldBuffer(
"rhoE",&rhoE[0]);
1572 simState2d.SetFieldBuffer(
"pressure",&p[0]);
1573 simState2d.SetFieldBuffer(
"temperature",&T[0]);
1574 simState2d.SetFieldBuffer(
"velocity",&V[0]);
1575 simState2d.SetFieldBuffer(
"rhom1",&rhom1[0]);
1577 state_t rhsState(simState2d);
1583 if(viscidRHS2d.Initialize(simGrid2d,simState2d,paramState2d,sbpOperator2d)){
1584 parTestViscidRHS =
false;
1585 std::cout <<
"Failed to initialize RHS in TestViscidRHS" << std::endl;
1591 std::vector<int> numThreadsDim;
1593 viscidRHS2d.InitThreadIntervals();
1595 if(viscidRHS2d.SetupRHS(simGrid2d,simState2d,rhsState)){
1596 parTestViscidRHS =
false;
1597 std::cout <<
"Failed to setup RHS in TestViscidRHS" << std::endl;
1601 parallelUnitResults.
UpdateResult(
"Viscid:RHS:RunsInParallel",parTestViscidRHS);
1608 std::vector<double> velGradExpected(numDim*numDim*numPointsBuffer,-999.0);
1609 std::vector<double> tempGradExpected(numDim*numPointsBuffer,-999.0);
1610 std::vector<double> uAmp;
1611 std::vector<double> vAmp;
1612 std::vector<double> tempAmp;
1613 uAmp.push_back(1.0);
1614 uAmp.push_back(2.0);
1615 uAmp.push_back(0.0);
1616 vAmp.push_back(3.0);
1617 vAmp.push_back(4.0);
1618 vAmp.push_back(0.0);
1619 tempAmp.push_back(5.0);
1620 tempAmp.push_back(6.0);
1621 tempAmp.push_back(0.0);
1624 size_t iStart = partitionBufferInterval2d[0].first;
1625 size_t iEnd = partitionBufferInterval2d[0].second;
1626 size_t jStart = partitionBufferInterval2d[1].first;
1627 size_t jEnd = partitionBufferInterval2d[1].second;
1628 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
1630 size_t jPartIndex = (jIndex - jStart) + partitionInterval2d[1].first;
1631 double y = jPartIndex*dX[1];
1632 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
1633 size_t bufferIndex = jBufferIndex + iIndex;
1634 size_t iPartIndex = (iIndex - iStart) + partitionInterval2d[0].first;
1635 double x = iPartIndex*dX[0];
1637 rhoV[bufferIndex] = rho[bufferIndex]*
1642 rhoE[bufferIndex] += rho[bufferIndex]/(gamma-1)*
1643 testfixtures::viscid::Linear(tempAmp,x0,y0,0.,x,y,0.,-1);
1649 rhoE[bufferIndex] = rhoE[bufferIndex] + (rhoV[bufferIndex]*rhoV[bufferIndex] +
1658 for(
int dIndex = 0; dIndex<numDim; dIndex++){
1661 velGradExpected[bufferIndex+numPointsBuffer+dIndex*numDim*
numPointsBuffer] =
1670 for(
int dIndex = 0; dIndex<numDim; dIndex++){
1677 int returnCode = viscidRHS2d.ComputeDV(0);
1679 VelocityGradientWorks =
false;
1680 std::cout <<
"ComputeVelGrad failed when computing DV " << std::endl;
1684 std::cout <<
"Calculating Velocity Gradient" << std::endl;
1685 returnCode = viscidRHS2d.ComputeVelGrad(0);
1687 VelocityGradientWorks =
false;
1691 VelocityGradientWorks =
CheckResult(VelocityGradientWorks,testComm);
1692 if(!VelocityGradientWorks){
1693 std::cout <<
"Velocity Gradient Calculation Failed" << std::endl;
1700 std::cout <<
"Checking Velocity Gradient calculation" << std::endl;
1701 const std::vector<double *> &velGradBuffers(viscidRHS2d.VelGradBuffers());
1703 if(VelocityGradientWorks){
1704 bool printVelGrad =
true;
1705 for(
int iDim = 0;iDim < numDim;iDim++){
1706 const double* velGradData = velGradBuffers[iDim];
1708 for(
int jDim = 0;jDim < numDim;jDim++){
1709 const double* velGradDataComponent = &velGradData[jDim*
numPointsBuffer];
1711 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
1713 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
1714 size_t bufferIndex = jBufferIndex + iIndex;
1715 size_t expectedIndex = numPointsBuffer*iDim*numDim+jDim*numPointsBuffer+bufferIndex;
1717 double error = std::abs(velGradDataComponent[bufferIndex] -
1718 velGradExpected[expectedIndex])/velGradExpected[expectedIndex];
1721 VelocityGradientWorks =
false;
1723 std::cout << std::scientific << std::setprecision(16)
1724 <<
"In ComputeVelGrad: "<< std::endl
1725 <<
"Expected velGrad=" << velGradExpected[expectedIndex] << std::endl
1726 <<
" got velGrad=" << velGradDataComponent[bufferIndex] << std::endl
1727 <<
" at (i,j,bufferIndex)=(" << iDim <<
"," << jDim <<
"," 1728 << bufferIndex <<
")" << std::endl;
1729 std::cout <<
"Error =" << error << std::endl;;
1730 std::cout <<
"No further error messages will be generated for velGrad 2D Linear" << std::endl;
1739 VelocityGradientWorks =
CheckResult(VelocityGradientWorks,testComm);
1740 if(!VelocityGradientWorks){
1741 std::cout <<
"Velocity Gradient Compare Failed" << std::endl;
1745 std::cout <<
"Calculating Temperature Gradient" << std::endl;
1746 returnCode = viscidRHS2d.ComputeTemperatureGrad(0);
1748 TemperatureGradientWorks =
false;
1752 TemperatureGradientWorks =
CheckResult(TemperatureGradientWorks,testComm);
1753 if(!TemperatureGradientWorks){
1754 std::cout <<
"Temperature Gradient Calculation Failed" << std::endl;
1760 std::cout <<
"Checking Temperature Gradient calculation" << std::endl;
1761 const std::vector<double *> &tempGradBuffers(viscidRHS2d.TemperatureGradBuffers());
1763 if(TemperatureGradientWorks){
1764 bool printTempGrad =
true;
1765 for(
int iDim = 0;iDim < numDim;iDim++){
1766 const double* tempGradDataComponent = tempGradBuffers[iDim];
1768 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
1770 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
1771 size_t bufferIndex = jBufferIndex + iIndex;
1772 size_t expectedIndex = bufferIndex+numPointsBuffer*iDim;
1774 double error = std::abs(tempGradDataComponent[bufferIndex] -
1775 tempGradExpected[expectedIndex])/tempGradExpected[expectedIndex];
1778 TemperatureGradientWorks =
false;
1780 std::cout << std::scientific << std::setprecision(16)
1781 <<
"In ComputeTemperatureGrad: "<< std::endl
1782 <<
"Expected tempGrad=" << tempGradExpected[expectedIndex] << std::endl
1783 <<
" got tempGrad=" << tempGradDataComponent[bufferIndex] << std::endl
1784 <<
" at (i,bufferIndex)=(" << iDim <<
"," 1785 << bufferIndex <<
")" << std::endl;
1786 std::cout <<
"Temperature " << T[bufferIndex] << std::endl;
1787 std::cout <<
"Error =" << error << std::endl;;
1788 std::cout <<
"No further error messages will be generated for tempGrad 2D Linear" 1790 printTempGrad=
false;
1797 TemperatureGradientWorks =
CheckResult(TemperatureGradientWorks,testComm);
1798 if(!TemperatureGradientWorks){
1799 std::cout <<
"Temperature Gradient Compare Failed" << std::endl;
1802 std::cout <<
"Done with 2D linear Velocity Gradient Test" << std::endl;
1803 std::cout <<
"Starting 3D linear Velocity Gradient Test" << std::endl;
1806 gridSizes.resize(3,numNodes);
1809 physicalExtent.resize(6,1.0);
1810 physicalExtent[0] = 0.0;
1811 physicalExtent[2] = 0.0;
1812 physicalExtent[4] = 0.0;
1815 periodicDirs.resize(3,
false);
1819 parTestViscidRHS =
false;
1820 std::cout <<
"Failed to setup 3D grid in TestViscidRHS" << std::endl;
1824 std::cout << messageStream.str() << std::endl;
1825 messageStream.str(
"");
1826 messageStream.clear();
1830 numDim = gridSizes.size();
1833 parTestViscidRHS =
false;
1834 std::cout <<
"Failed to setup state in TestViscidRHS" << std::endl;
1841 const std::vector<size_t> &bufferSizes3d(simGrid3d.
BufferSizes());
1844 std::vector<double> &dX3d(simGrid3d.
DX());
1847 paramState3d.
AddField(
"dX",
's',3,8,
"space");
1848 paramState3d.
Create(numPointsBuffer,0);
1860 rho.resize(numPointsBuffer,1.0);
1861 rhoV.resize(3*numPointsBuffer,0.0);
1862 rhoE.resize(numPointsBuffer);
1863 rhoE.assign(rhoE.size(),1.0/(gamma-1));
1865 T.resize(numPointsBuffer,0.0);
1866 p.resize(numPointsBuffer,0.0);
1867 V.resize(3*numPointsBuffer,0.0);
1869 rhom1.resize(numPointsBuffer,0.0);
1881 state_t rhsState3d(simState3d);
1887 if(viscidRHS3d.Initialize(simGrid3d,simState3d,paramState3d,sbpOperator3d)){
1888 parTestViscidRHS =
false;
1889 std::cout <<
"Failed to initialize RHS in TestViscidRHS" << std::endl;
1893 std::vector<int> numThreadsDim3;
1895 viscidRHS3d.InitThreadIntervals();
1897 if(viscidRHS3d.SetupRHS(simGrid3d,simState3d,rhsState3d)){
1898 parTestViscidRHS =
false;
1899 std::cout <<
"Failed to setup RHS in TestViscidRHS" << std::endl;
1903 parallelUnitResults.
UpdateResult(
"Viscid:RHS:RunsInParallel",parTestViscidRHS);
1910 velGradExpected.resize(numDim*numDim*numPointsBuffer,-999.0);
1911 tempGradExpected.resize(numDim*numPointsBuffer,-999.0);
1915 std::vector<double> wAmp;
1916 uAmp.push_back(1.0);
1917 uAmp.push_back(2.0);
1918 uAmp.push_back(3.0);
1919 vAmp.push_back(4.0);
1920 vAmp.push_back(5.0);
1921 vAmp.push_back(6.0);
1922 wAmp.push_back(7.0);
1923 wAmp.push_back(8.0);
1924 wAmp.push_back(9.0);
1925 tempAmp.push_back(10.0);
1926 tempAmp.push_back(11.0);
1927 tempAmp.push_back(12.0);
1931 iStart = partitionBufferInterval3d[0].first;
1932 iEnd = partitionBufferInterval3d[0].second;
1933 jStart = partitionBufferInterval3d[1].first;
1934 jEnd = partitionBufferInterval3d[1].second;
1935 size_t kStart = partitionBufferInterval3d[2].first;
1936 size_t kEnd = partitionBufferInterval3d[2].second;
1937 size_t nPlane = bufferSizes3d[0]*bufferSizes3d[1];
1938 for(
size_t kIndex = kStart;kIndex <= kEnd;kIndex++){
1939 size_t kBufferIndex = kIndex*nPlane;
1940 size_t kPartIndex = (kIndex - kStart) + partitionInterval3d[2].first;
1941 double z = kPartIndex*dX3d[2];
1942 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
1943 size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes3d[0];
1944 size_t jPartIndex = (jIndex - jStart) + partitionInterval3d[1].first;
1945 double y = jPartIndex*dX3d[1];
1946 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
1947 size_t bufferIndex = jkBufferIndex + iIndex;
1948 size_t iPartIndex = (iIndex - iStart) + partitionInterval3d[0].first;
1949 double x = iPartIndex*dX3d[0];
1951 rhoV[bufferIndex] = rho[bufferIndex]*
1959 rhoE[bufferIndex] += rho[bufferIndex]/(gamma-1)*
1960 testfixtures::viscid::Linear(tempAmp,x0,y0,z0,x,y,z,-1);
1962 rhoE[bufferIndex] = rhoE[bufferIndex] + (rhoV[bufferIndex]*rhoV[bufferIndex] +
1972 for(
int dIndex = 0; dIndex<numDim; dIndex++){
1975 velGradExpected[bufferIndex+numPointsBuffer+dIndex*numDim*
numPointsBuffer] =
1977 velGradExpected[bufferIndex+2*numPointsBuffer+dIndex*numDim*
numPointsBuffer] =
1986 for(
int dIndex = 0; dIndex<numDim; dIndex++){
1994 returnCode = viscidRHS3d.ComputeDV(0);
1996 VelocityGradientWorks =
false;
1997 std::cout <<
"ComputeVelGrad failed when computing DV " << std::endl;
2001 std::cout <<
"Calculating Velocity Gradient" << std::endl;
2002 returnCode = viscidRHS3d.ComputeVelGrad(0);
2004 VelocityGradientWorks =
false;
2008 VelocityGradientWorks =
CheckResult(VelocityGradientWorks,testComm);
2009 if(!VelocityGradientWorks){
2010 std::cout <<
"Velocity Gradient Calculation Failed" << std::endl;
2013 if(VelocityGradientWorks){
2014 std::cout <<
"Checking Velocity Gradient calculation" << std::endl;
2018 const std::vector<double *> &velGradBuffers3d(viscidRHS3d.VelGradBuffers());
2020 bool printVelGrad =
true;
2021 for(
int iDim = 0;iDim < numDim;iDim++){
2022 const double* velGradData3d = velGradBuffers3d[iDim];
2024 for(
int jDim = 0;jDim < numDim;jDim++){
2025 const double* velGradDataComponent3d = &velGradData3d[jDim*
numPointsBuffer];
2027 for(
size_t kIndex = kStart;kIndex <= kEnd;kIndex++){
2028 size_t kBufferIndex = kIndex*nPlane;
2029 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2030 size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes3d[0];
2031 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2032 size_t bufferIndex = jkBufferIndex + iIndex;
2033 size_t expectedIndex = numPointsBuffer*iDim*numDim+jDim*numPointsBuffer+bufferIndex;
2035 double error = std::abs(velGradDataComponent3d[bufferIndex] -
2036 velGradExpected[expectedIndex])/velGradExpected[expectedIndex];
2039 VelocityGradientWorks =
false;
2041 std::cout << std::scientific << std::setprecision(16)
2042 <<
"In ComputeVelGrad: "<< std::endl
2043 <<
"Expected velGrad=" << velGradExpected[expectedIndex] << std::endl
2044 <<
" got velGrad=" << velGradDataComponent3d[bufferIndex] << std::endl
2045 <<
" at (i,j,bufferIndex)=(" << iDim <<
"," << jDim <<
"," 2046 << bufferIndex <<
")" << std::endl;
2047 std::cout <<
"Error =" << error << std::endl;;
2048 std::cout <<
"No further error messages will be generated for velGrad 3d" << std::endl;
2060 std::cout <<
"Calculating Temperature Gradient" << std::endl;
2061 returnCode = viscidRHS3d.ComputeTemperatureGrad(0);
2063 TemperatureGradientWorks =
false;
2067 TemperatureGradientWorks =
CheckResult(TemperatureGradientWorks,testComm);
2068 if(!TemperatureGradientWorks){
2069 std::cout <<
"Temperature Gradient Calculation Failed" << std::endl;
2075 std::cout <<
"Checking Temperature Gradient calculation" << std::endl;
2076 const std::vector<double *> &tempGradBuffers3d(viscidRHS3d.TemperatureGradBuffers());
2078 if(TemperatureGradientWorks){
2079 bool printTempGrad =
true;
2080 for(
int iDim = 0;iDim < numDim;iDim++){
2081 const double* tempGradDataComponent = tempGradBuffers3d[iDim];
2083 for(
size_t kIndex = kStart;kIndex <= kEnd;kIndex++){
2084 size_t kBufferIndex = kIndex*nPlane;
2085 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2086 size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes3d[0];
2087 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2088 size_t bufferIndex = jkBufferIndex + iIndex;
2089 size_t expectedIndex = bufferIndex + numPointsBuffer*iDim;
2091 double error = std::abs(tempGradDataComponent[bufferIndex] -
2092 tempGradExpected[expectedIndex])/tempGradExpected[expectedIndex];
2095 TemperatureGradientWorks =
false;
2097 std::cout << std::scientific << std::setprecision(16)
2098 <<
"In ComputeTemperatureGrad: "<< std::endl
2099 <<
"Expected tempGrad=" << tempGradExpected[expectedIndex] << std::endl
2100 <<
" got tempGrad=" << tempGradDataComponent[bufferIndex] << std::endl
2101 <<
" at (i,bufferIndex)=(" << iDim <<
"," 2102 << bufferIndex <<
")" << std::endl;
2103 std::cout <<
"Temperature " << T[bufferIndex] << std::endl;
2104 std::cout <<
"Error =" << error << std::endl;;
2105 std::cout <<
"No further error messages will be generated for tempGrad 3D Linear" 2107 printTempGrad=
false;
2116 std::cout <<
"Done with 3D linear Velocity Gradient Test" << std::endl;
2118 TemperatureGradientWorks =
CheckResult(TemperatureGradientWorks,testComm);
2119 if(!TemperatureGradientWorks){
2120 std::cout <<
"Temperature Gradient Compare Failed" << std::endl;
2123 VelocityGradientWorks =
CheckResult(VelocityGradientWorks,testComm);
2124 if(!VelocityGradientWorks){
2125 std::cout <<
"Velocity Gradient Compare Failed" << std::endl;
2129 parallelUnitResults.
UpdateResult(
"Viscid:RHS:VelocityGradient",VelocityGradientWorks);
2130 parallelUnitResults.
UpdateResult(
"Viscid:RHS:TemperatureGradient",TemperatureGradientWorks);
2136 std::cout <<
"TestVelocityGradientPeriodic..." << std::endl;
2149 std::ostringstream messageStream;
2153 operator_t sbpOperator2d;
2154 operator_t sbpOperator3d;
2155 halo_t &simHalo2d(simGrid2d.
Halo());
2156 halo_t &simHalo3d(simGrid3d.
Halo());
2160 state_t paramState2d;
2161 state_t paramState3d;
2163 bool parTestViscidRHS =
true;
2164 bool VelocityGradientWorks =
true;
2165 bool TemperatureGradientWorks =
true;
2167 std::cout <<
"Starting 2D periodic Velocity Gradient Test" << std::endl;
2171 std::vector<size_t>
gridSizes(2,numNodes);
2174 std::vector<double> physicalExtent(4,1.0);
2175 physicalExtent[0] = 0.0;
2176 physicalExtent[2] = 0.0;
2179 std::vector<bool> periodicDirs(2,
true);
2183 parTestViscidRHS =
false;
2184 std::cout <<
"Failed to setup 2D grid in TestViscidRHS" << std::endl;
2188 std::cout << messageStream.str() << std::endl;
2189 messageStream.str(
"");
2190 messageStream.clear();
2194 int numDim = gridSizes.size();
2197 parTestViscidRHS =
false;
2198 std::cout <<
"Failed to setup state in TestViscidRHS" << std::endl;
2211 double power = 0.666;
2213 double bulkViscFac = 2;
2214 std::vector<double> &dX(simGrid2d.
DX());
2217 paramState2d.
AddField(
"dX",
's',numDim,8,
"space");
2218 paramState2d.
Create(numPointsBuffer,0);
2230 std::vector<double> rho(numPointsBuffer,1.0);
2231 std::vector<double> rhoV(numDim*numPointsBuffer,0.0);
2232 std::vector<double> rhoE(numPointsBuffer,1.0/(gamma-1.0));
2234 std::vector<double> T(numPointsBuffer,0.0);
2235 std::vector<double> p(numPointsBuffer,0.0);
2236 std::vector<double>
V(numDim*numPointsBuffer,0.0);
2237 std::vector<double> rhom1(numPointsBuffer,0.0);
2239 simState2d.SetFieldBuffer(
"simTime",&t);
2240 simState2d.SetFieldBuffer(
"rho",&rho[0]);
2241 simState2d.SetFieldBuffer(
"rhoV",&rhoV[0]);
2242 simState2d.SetFieldBuffer(
"rhoE",&rhoE[0]);
2244 simState2d.SetFieldBuffer(
"pressure",&p[0]);
2245 simState2d.SetFieldBuffer(
"temperature",&T[0]);
2246 simState2d.SetFieldBuffer(
"velocity",&V[0]);
2247 simState2d.SetFieldBuffer(
"rhom1",&rhom1[0]);
2249 state_t rhsState(simState2d);
2255 if(viscidRHS2d.Initialize(simGrid2d,simState2d,paramState2d,sbpOperator2d)){
2256 parTestViscidRHS =
false;
2257 std::cout <<
"Failed to initialize RHS in TestViscidRHS" << std::endl;
2262 std::vector<int> numThreadsDim;
2264 viscidRHS2d.InitThreadIntervals();
2266 if(viscidRHS2d.SetupRHS(simGrid2d,simState2d,rhsState)){
2267 parTestViscidRHS =
false;
2268 std::cout <<
"Failed to setup RHS in TestViscidRHS" << std::endl;
2273 parallelUnitResults.
UpdateResult(
"Viscid:RHS:RunsInParallel",parTestViscidRHS);
2280 std::vector<double> velGradExpected(numDim*numDim*numPointsBuffer,-999.0);
2281 std::vector<double> tempGradExpected(numDim*numPointsBuffer,-999.0);
2282 std::vector<double> uAmp;
2283 std::vector<double> vAmp;
2284 std::vector<double> tempAmp;
2285 uAmp.push_back(1.0);
2286 uAmp.push_back(2.0);
2287 uAmp.push_back(0.0);
2288 vAmp.push_back(3.0);
2289 vAmp.push_back(4.0);
2290 vAmp.push_back(0.0);
2291 tempAmp.push_back(5.0);
2292 tempAmp.push_back(6.0);
2293 tempAmp.push_back(0.0);
2294 std::vector<double> period(numDim,0);
2295 for(
int i=0;i<numDim;i++){
2296 period[i]=dX[i]*numNodes;
2300 size_t iStart = partitionBufferInterval2d[0].first;
2301 size_t iEnd = partitionBufferInterval2d[0].second;
2302 size_t jStart = partitionBufferInterval2d[1].first;
2303 size_t jEnd = partitionBufferInterval2d[1].second;
2304 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2306 size_t jPartIndex = (jIndex - jStart) + partitionInterval2d[1].first;
2307 double y = jPartIndex*dX[1];
2308 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2309 size_t bufferIndex = jBufferIndex + iIndex;
2310 size_t iPartIndex = (iIndex - iStart) + partitionInterval2d[0].first;
2311 double x = iPartIndex*dX[0];
2313 rhoV[bufferIndex] = rho[bufferIndex]*
2319 rhoE[bufferIndex] += rho[bufferIndex]/(gamma-1)*
2320 testfixtures::viscid::Cosine(tempAmp,period,x0,y0,0.,x,y,0.,-1);
2326 rhoE[bufferIndex] = rhoE[bufferIndex] + (rhoV[bufferIndex]*rhoV[bufferIndex] +
2334 for(
int dIndex = 0; dIndex<numDim; dIndex++){
2337 velGradExpected[bufferIndex+numPointsBuffer+dIndex*numDim*
numPointsBuffer] =
2346 for(
int dIndex = 0; dIndex<numDim; dIndex++){
2355 int returnCode = viscidRHS2d.ComputeDV(0);
2357 VelocityGradientWorks =
false;
2358 std::cout <<
"ComputeVelGrad failed when computing DV " << std::endl;
2364 std::cout <<
"Calculating Velocity Gradient" << std::endl;
2365 returnCode = viscidRHS2d.ComputeVelGrad(0);
2367 std::cout <<
"ComputeVelGrad failed, aborting tests." << std::endl;
2368 VelocityGradientWorks =
false;
2374 VelocityGradientWorks =
CheckResult(VelocityGradientWorks,testComm);
2375 if(!VelocityGradientWorks){
2376 std::cout <<
"Velocity Gradient Calculation Failed" << std::endl;
2384 if(VelocityGradientWorks){
2385 std::cout <<
"Checking Velocity Gradient calculation" << std::endl;
2387 const std::vector<double *> &velGradBuffers(viscidRHS2d.VelGradBuffers());
2389 bool printVelGrad =
true;
2390 for(
int iDim = 0;iDim < numDim;iDim++){
2391 const double* velGradData = velGradBuffers[iDim];
2393 for(
int jDim = 0;jDim < numDim;jDim++){
2394 const double* velGradDataComponent = &velGradData[jDim*
numPointsBuffer];
2396 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2398 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2399 size_t bufferIndex = jBufferIndex + iIndex;
2400 size_t expectedIndex = numPointsBuffer*iDim*numDim+jDim*numPointsBuffer+bufferIndex;
2403 double error = std::abs(velGradDataComponent[bufferIndex] -
2404 velGradExpected[expectedIndex])/velGradExpected[expectedIndex];
2407 VelocityGradientWorks =
false;
2409 std::cout << std::scientific << std::setprecision(16)
2410 <<
"In ComputeVelGrad: "<< std::endl
2411 <<
"Expected velGrad=" << velGradExpected[expectedIndex] << std::endl
2412 <<
" got velGrad=" << velGradDataComponent[bufferIndex] << std::endl
2413 <<
" at (i,j,bufferIndex)=(" << iDim <<
"," << jDim <<
"," 2414 << bufferIndex <<
")" << std::endl;
2415 std::cout <<
"Error =" << error << std::endl;;
2416 std::cout <<
"No further error messages will be generated for velGrad 2D Cosine" << std::endl;
2426 VelocityGradientWorks =
CheckResult(VelocityGradientWorks,testComm);
2427 if(!VelocityGradientWorks){
2428 std::cout <<
"Velocity Gradient Compare Failed" << std::endl;
2432 std::cout <<
"Calculating Temperature Gradient" << std::endl;
2433 returnCode = viscidRHS2d.ComputeTemperatureGrad(0);
2435 TemperatureGradientWorks =
false;
2439 TemperatureGradientWorks =
CheckResult(TemperatureGradientWorks,testComm);
2440 if(!TemperatureGradientWorks){
2441 std::cout <<
"Temperature Gradient Calculation Failed" << std::endl;
2447 std::cout <<
"Checking Temperature Gradient calculation" << std::endl;
2448 const std::vector<double *> &tempGradBuffers(viscidRHS2d.TemperatureGradBuffers());
2450 if(TemperatureGradientWorks){
2451 bool printTempGrad =
true;
2452 for(
int iDim = 0;iDim < numDim;iDim++){
2453 const double* tempGradDataComponent = tempGradBuffers[iDim];
2455 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2457 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2458 size_t bufferIndex = jBufferIndex + iIndex;
2459 size_t expectedIndex = bufferIndex+numPointsBuffer*iDim;
2461 double error = std::abs(tempGradDataComponent[bufferIndex] -
2462 tempGradExpected[expectedIndex])/tempGradExpected[expectedIndex];
2465 TemperatureGradientWorks =
false;
2467 std::cout << std::scientific << std::setprecision(16)
2468 <<
"In ComputeTemperatureGrad: "<< std::endl
2469 <<
"Expected tempGrad=" << tempGradExpected[expectedIndex] << std::endl
2470 <<
" got tempGrad=" << tempGradDataComponent[bufferIndex] << std::endl
2471 <<
" at (i,bufferIndex)=(" << iDim <<
"," 2472 << bufferIndex <<
")" << std::endl;
2473 std::cout <<
"Temperature " << T[bufferIndex] << std::endl;
2474 std::cout <<
"Error =" << error << std::endl;;
2475 std::cout <<
"No further error messages will be generated for tempGrad 2D periodic" 2477 printTempGrad=
false;
2484 TemperatureGradientWorks =
CheckResult(TemperatureGradientWorks,testComm);
2485 if(!TemperatureGradientWorks){
2486 std::cout <<
"Temperature Gradient Compare Failed" << std::endl;
2489 std::cout <<
"Done with 2D periodic Velocity Gradient Test" << std::endl;
2490 std::cout <<
"Starting 3D periodic Velocity Gradient Test" << std::endl;
2493 gridSizes.resize(3,numNodes);
2496 physicalExtent.resize(6,1.0);
2497 physicalExtent[0] = 0.0;
2498 physicalExtent[2] = 0.0;
2499 physicalExtent[4] = 0.0;
2502 periodicDirs.resize(3,
true);
2506 parTestViscidRHS =
false;
2507 std::cout <<
"Failed to setup 3D grid in TestViscidRHS" << std::endl;
2511 std::cout << messageStream.str() << std::endl;
2512 messageStream.str(
"");
2513 messageStream.clear();
2517 numDim = gridSizes.size();
2520 parTestViscidRHS =
false;
2521 std::cout <<
"Failed to setup state in TestViscidRHS" << std::endl;
2527 const std::vector<size_t> &bufferSizes3d(simGrid3d.
BufferSizes());
2530 std::vector<double> &dX3d(simGrid3d.
DX());
2533 paramState3d.
AddField(
"dX",
's',numDim,8,
"space");
2534 paramState3d.
Create(numPointsBuffer,0);
2546 rho.resize(numPointsBuffer,1.0);
2547 rhoV.resize(numDim*numPointsBuffer,0.0);
2548 rhoE.resize(numPointsBuffer);
2549 rhoE.assign(rhoE.size(),1.0/(gamma-1));
2551 T.resize(numPointsBuffer,0.0);
2552 p.resize(numPointsBuffer,0.0);
2553 V.resize(numDim*numPointsBuffer,0.0);
2555 rhom1.resize(numPointsBuffer,0.0);
2567 state_t rhsState3d(simState3d);
2572 if(viscidRHS3d.Initialize(simGrid3d,simState3d,paramState3d,sbpOperator3d)){
2573 parTestViscidRHS =
false;
2574 std::cout <<
"Failed to initialize RHS in TestViscidRHS" << std::endl;
2578 std::vector<int> numThreadsDim3;
2580 viscidRHS3d.InitThreadIntervals();
2582 if(viscidRHS3d.SetupRHS(simGrid3d,simState3d,rhsState3d)){
2583 parTestViscidRHS =
false;
2584 std::cout <<
"Failed to setup RHS in TestViscidRHS" << std::endl;
2588 parallelUnitResults.
UpdateResult(
"Viscid:RHS:RunsInParallel",parTestViscidRHS);
2595 velGradExpected.resize(numDim*numDim*numPointsBuffer,-999.0);
2596 tempGradExpected.resize(numDim*numPointsBuffer,-999.0);
2600 std::vector<double> wAmp;
2601 uAmp.push_back(1.0);
2602 uAmp.push_back(2.0);
2603 uAmp.push_back(3.0);
2604 vAmp.push_back(4.0);
2605 vAmp.push_back(5.0);
2606 vAmp.push_back(6.0);
2607 wAmp.push_back(7.0);
2608 wAmp.push_back(8.0);
2609 wAmp.push_back(9.0);
2610 tempAmp.push_back(10.0);
2611 tempAmp.push_back(11.0);
2612 tempAmp.push_back(12.0);
2613 period.resize(numDim,0);
2614 for(
int i=0;i<numDim;i++){
2615 period[i]=dX3d[i]*numNodes;
2620 iStart = partitionBufferInterval3d[0].first;
2621 iEnd = partitionBufferInterval3d[0].second;
2622 jStart = partitionBufferInterval3d[1].first;
2623 jEnd = partitionBufferInterval3d[1].second;
2624 size_t kStart = partitionBufferInterval3d[2].first;
2625 size_t kEnd = partitionBufferInterval3d[2].second;
2626 size_t nPlane = bufferSizes3d[0]*bufferSizes3d[1];
2627 for(
size_t kIndex = kStart;kIndex <= kEnd;kIndex++){
2628 size_t kBufferIndex = kIndex*nPlane;
2629 size_t kPartIndex = (kIndex - kStart) + partitionInterval3d[2].first;
2630 double z = kPartIndex*dX3d[2];
2631 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2632 size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes3d[0];
2633 size_t jPartIndex = (jIndex - jStart) + partitionInterval3d[1].first;
2634 double y = jPartIndex*dX3d[1];
2635 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2636 size_t bufferIndex = jkBufferIndex + iIndex;
2637 size_t iPartIndex = (iIndex - iStart) + partitionInterval3d[0].first;
2638 double x = iPartIndex*dX3d[0];
2640 rhoV[bufferIndex] = rho[bufferIndex]*
2648 rhoE[bufferIndex] += rho[bufferIndex]/(gamma-1)*
2649 testfixtures::viscid::Cosine(tempAmp,period,x0,y0,z0,x,y,z,-1);
2651 rhoE[bufferIndex] = rhoE[bufferIndex] + (rhoV[bufferIndex]*rhoV[bufferIndex] +
2661 for(
int dIndex = 0; dIndex<numDim; dIndex++){
2664 velGradExpected[bufferIndex+numPointsBuffer+dIndex*numDim*
numPointsBuffer] =
2666 velGradExpected[bufferIndex+2*numPointsBuffer+dIndex*numDim*
numPointsBuffer] =
2675 for(
int dIndex = 0; dIndex<numDim; dIndex++){
2683 returnCode = viscidRHS3d.ComputeDV(0);
2685 VelocityGradientWorks =
false;
2686 std::cout <<
"ComputeVelGrad failed when computing DV " << std::endl;
2690 std::cout <<
"Calling ComputeVelGrad" << std::endl;
2691 returnCode = viscidRHS3d.ComputeVelGrad(0);
2693 VelocityGradientWorks =
false;
2697 VelocityGradientWorks =
CheckResult(VelocityGradientWorks,testComm);
2698 if(!VelocityGradientWorks){
2699 std::cout <<
"Velocity Gradient Calculation Failed" << std::endl;
2702 if(VelocityGradientWorks){
2703 std::cout <<
"Checking Velocity Gradient calculation" << std::endl;
2707 const std::vector<double *> &velGradBuffers3d(viscidRHS3d.VelGradBuffers());
2709 bool printVelGrad =
true;
2710 for(
int iDim = 0;iDim < numDim;iDim++){
2711 const double* velGradData3d = velGradBuffers3d[iDim];
2713 for(
int jDim = 0;jDim < numDim;jDim++){
2714 const double* velGradDataComponent3d = &velGradData3d[jDim*
numPointsBuffer];
2716 for(
size_t kIndex = kStart;kIndex <= kEnd;kIndex++){
2717 size_t kBufferIndex = kIndex*nPlane;
2718 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2719 size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes3d[0];
2720 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2721 size_t bufferIndex = jkBufferIndex + iIndex;
2722 size_t expectedIndex = numPointsBuffer*iDim*numDim+jDim*numPointsBuffer+bufferIndex;
2724 double error = std::abs(velGradDataComponent3d[bufferIndex] -
2725 velGradExpected[expectedIndex])/velGradExpected[expectedIndex];
2728 VelocityGradientWorks =
false;
2730 std::cout << std::scientific << std::setprecision(16)
2731 <<
"In ComputeVelGrad: "<< std::endl
2732 <<
"Expected velGrad=" << velGradExpected[expectedIndex] << std::endl
2733 <<
" got velGrad=" << velGradDataComponent3d[bufferIndex] << std::endl
2734 <<
" at (i,j,bufferIndex)=(" << iDim <<
"," << jDim <<
"," 2735 << bufferIndex <<
")" << std::endl;
2736 std::cout <<
"Error =" << error << std::endl;;
2737 std::cout <<
"No further error messages will be generated for velGrad 3d" << std::endl;
2748 VelocityGradientWorks =
CheckResult(VelocityGradientWorks,testComm);
2749 if(!VelocityGradientWorks){
2750 std::cout <<
"Velocity Gradient Compare Failed" << std::endl;
2754 std::cout <<
"Calculating Temperature Gradient" << std::endl;
2755 returnCode = viscidRHS3d.ComputeTemperatureGrad(0);
2757 TemperatureGradientWorks =
false;
2761 TemperatureGradientWorks =
CheckResult(TemperatureGradientWorks,testComm);
2762 if(!TemperatureGradientWorks){
2763 std::cout <<
"Temperature Gradient Calculation Failed" << std::endl;
2769 std::cout <<
"Checking Temperature Gradient calculation" << std::endl;
2770 const std::vector<double *> &tempGradBuffers3d(viscidRHS3d.TemperatureGradBuffers());
2772 if(TemperatureGradientWorks){
2773 bool printTempGrad =
true;
2774 for(
int iDim = 0;iDim < numDim;iDim++){
2775 const double* tempGradDataComponent = tempGradBuffers3d[iDim];
2777 for(
size_t kIndex = kStart;kIndex <= kEnd;kIndex++){
2778 size_t kBufferIndex = kIndex*nPlane;
2779 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2780 size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes3d[0];
2781 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2782 size_t bufferIndex = jkBufferIndex + iIndex;
2783 size_t expectedIndex = bufferIndex + numPointsBuffer*iDim;
2785 double error = std::abs(tempGradDataComponent[bufferIndex] -
2786 tempGradExpected[expectedIndex])/tempGradExpected[expectedIndex];
2789 TemperatureGradientWorks =
false;
2791 std::cout << std::scientific << std::setprecision(16)
2792 <<
"In ComputeTemperatureGrad: "<< std::endl
2793 <<
"Expected tempGrad=" << tempGradExpected[expectedIndex] << std::endl
2794 <<
" got tempGrad=" << tempGradDataComponent[bufferIndex] << std::endl
2795 <<
" at (i,bufferIndex)=(" << iDim <<
"," 2796 << bufferIndex <<
")" << std::endl;
2797 std::cout <<
"Temperature " << T[bufferIndex] << std::endl;
2798 std::cout <<
"Error =" << error << std::endl;;
2799 std::cout <<
"No further error messages will be generated for tempGrad 3D Linear" 2801 printTempGrad=
false;
2810 std::cout <<
"Done with 3D periodic Velocity Gradient Test" << std::endl;
2812 parallelUnitResults.
UpdateResult(
"Viscid:RHS:VelocityGradientPeriodic",VelocityGradientWorks);
2813 parallelUnitResults.
UpdateResult(
"Viscid:RHS:TemperatureGradientPeriodic",TemperatureGradientWorks);
2815 std::cout <<
"Done TestVelocityGradientPeriodic..." << std::endl;
2821 std::cout <<
"TestViscidRHS..." << std::endl;
2834 std::ostringstream messageStream;
2837 operator_t sbpOperator;
2838 halo_t &simHalo(simGrid.
Halo());
2842 bool parTestViscidRHS =
true;
2846 gridSizes,2,testComm,&messageStream)){
2847 parTestViscidRHS =
false;
2854 parTestViscidRHS =
false;
2858 std::cout << messageStream.str() << std::endl;
2864 double power = 2.0/3.0;
2866 double bulkViscFac = 0.6;
2887 std::vector<double> rho(numPointsBuffer,1.0);
2888 std::vector<double> rhoV(3*numPointsBuffer,0.0);
2889 std::vector<double> rhoE(3*numPointsBuffer,1.0/(gamma-1.0));
2891 std::vector<double> dRho(numPointsBuffer,0.0);
2892 std::vector<double> dRhoV(3*numPointsBuffer,0.0);
2893 std::vector<double> dRhoE(numPointsBuffer,0.0);
2895 std::vector<double> T(numPointsBuffer,0.0);
2896 std::vector<double> p(numPointsBuffer,0.0);
2897 std::vector<double>
V(3*numPointsBuffer,0.0);
2899 std::vector<double> rhom1(numPointsBuffer,0.0);
2902 simState.SetFieldBuffer(
"simTime",&t);
2903 simState.SetFieldBuffer(
"rho",&rho[0]);
2904 simState.SetFieldBuffer(
"rhoV",&rhoV[0]);
2905 simState.SetFieldBuffer(
"rhoE",&rhoE[0]);
2907 simState.SetFieldBuffer(
"pressure",&p[0]);
2908 simState.SetFieldBuffer(
"temperature",&T[0]);
2909 simState.SetFieldBuffer(
"velocity",&V[0]);
2910 simState.SetFieldBuffer(
"rhom1",&rhom1[0]);
2912 state_t rhsState(simState);
2927 std::cout <<
"Initialize" << std::endl;
2928 if(eulerRHS.Initialize(simGrid,simState,paramState,sbpOperator)){
2929 parTestViscidRHS =
false;
2933 std::cout <<
"SetupRHS" << std::endl;
2934 if(eulerRHS.SetupRHS(simGrid,simState,rhsState)){
2935 parTestViscidRHS =
false;
2940 eulerRHS.InitThreadIntervals();
2943 std::cout <<
"RHS" << std::endl;
2944 int returnCode = eulerRHS.RHS(0);
2946 parTestViscidRHS =
false;
2948 std::cout <<
"Done RHS" << std::endl;
2950 parTestViscidRHS =
CheckResult(parTestViscidRHS,testComm);
2951 if(!parTestViscidRHS){
2952 std::cout <<
"Problem 0" << std::endl;
2955 if(parTestViscidRHS){
2956 for(
size_t iPoint = 0;(iPoint <
numPointsBuffer)&&parTestViscidRHS;iPoint++){
2957 if(std::abs(dRho[iPoint]) > 1e-15) parTestViscidRHS =
false;
2958 for(
int iDim = 0;iDim < numDim;iDim++)
2959 if(std::abs(dRhoV[iPoint+iDim*numPointsBuffer]) > 1e-15) parTestViscidRHS =
false;
2960 if(std::abs(dRhoE[iPoint]) > 1e-15) parTestViscidRHS =
false;
2964 parTestViscidRHS =
CheckResult(parTestViscidRHS,testComm);
2965 if(!parTestViscidRHS){
2966 std::cout <<
"Problem 1" << std::endl;
2969 parallelUnitResults.
UpdateResult(
"Viscid:ViscidRHS:3dWorksInParallel",parTestViscidRHS);
2985 std::cout <<
"Running viscid kernels tests with full curvilinear metrics." 2988 bool tauCurvilinear =
true;
2989 bool qCurvilinear =
true;
2990 bool flux1dTest =
true;
2992 for(
int numDim = 1;numDim <= 3;numDim++){
2995 std::vector<size_t>
numPoints(numDim,1);
2997 for(
int iDim = 0;iDim < numDim;iDim++){
2998 numPoints[iDim] = 2*std::pow(2,iDim) + 1;
2999 numPointsBuffer *= numPoints[iDim];
3005 std::vector<double> mu(numPointsBuffer,0.0);
3006 std::vector<double> lambda(numPointsBuffer,0.0);
3007 std::vector<double> gradVIJK(numDim*numDim*numPointsBuffer,0.0);
3008 std::vector<double> gradVXYZ(numDim*numDim*numPointsBuffer,0.0);
3010 std::vector<double>
gridMetric(numDim*numDim*numPointsBuffer,0.0);
3011 std::vector<double>
velocity(numDim*numPointsBuffer,0.0);
3012 std::vector<double> gradT(numDim*numPointsBuffer,0.0);
3013 std::vector<double> tau(numDim*numDim*numPointsBuffer,0.0);
3014 std::vector<double> expectedTau(numDim*numDim*numPointsBuffer,0.0);
3016 double piValue = 4.0*std::atan(1.0);
3018 std::vector<double> metricValues(numDim*numDim,0.0);
3019 std::vector<double> gradValuesIJK(numDim*numDim,0.0);
3020 std::vector<double> gradValuesXYZ(numDim*numDim,0.0);
3033 for(
int iDim = 0;iDim < numDim;iDim++){
3034 for(
int jDim = 0;jDim < numDim;jDim++){
3035 int component = iDim*numDim + jDim;
3036 gradValuesIJK[component] =
static_cast<double>(component + 1);
3037 metricValues[component] =
static_cast<double>(component+1)/100.0;
3041 gradVIJK[component*numPointsBuffer+iPoint] = gradValuesIJK[component];
3042 gridMetric[component*numPointsBuffer+iPoint] = metricValues[component];
3049 for(
int iDim = 0;iDim < numDim;iDim++){
3051 velocity[iDim*numPointsBuffer+iPoint] =
static_cast<double>(iDim+1);
3052 gradT[iDim*numPointsBuffer+iPoint] =
static_cast<double>(iDim+4);
3060 gridJacobian[iPoint] =
static_cast<double>(iPoint+1);
3061 mu[iPoint] =
static_cast<double>(iPoint*iPoint + 1)/1000.0;
3062 lambda[iPoint] = std::cos(static_cast<double>(iPoint+1)/(2.0*piValue));
3067 double divValue = 0.0;
3068 for(
int iDim = 0;iDim < numDim;iDim++){
3069 int gradOffset = iDim;
3070 for(
int jDim = 0;jDim < numDim;jDim++){
3071 int component = iDim*numDim + jDim;
3072 int metricOffset = jDim;
3073 for(
int kDim = 0;kDim < numDim;kDim++){
3074 gradValuesXYZ[component] += gradValuesIJK[gradOffset+kDim*numDim]*metricValues[jDim+kDim*numDim];
3077 divValue += gradValuesXYZ[component];
3083 std::vector<size_t> fortranInterval;
3084 regionInterval.
Flatten(fortranInterval);
3085 for(
int iDim = 0;iDim < numDim;iDim++){
3086 fortranInterval[iDim*2]++;
3087 fortranInterval[iDim*2+1]++;
3091 std::vector<double*> bufferPtrArray(10,NULL);
3092 bufferPtrArray[0] = &mu[0];
3093 bufferPtrArray[1] = &lambda[0];
3094 bufferPtrArray[2] = &lambda[0];
3095 std::vector<double *> velGradBuffers(numDim,NULL);
3096 std::vector<double *> tauBuffers(numDim*numDim,NULL);
3098 for(
int iDim = 0;iDim < numDim;iDim++){
3100 for(
int jDim = 0;jDim < numDim;jDim++){
3101 size_t tauComponent = iDim*numDim + jDim;
3102 size_t tauTComponent = jDim*numDim + iDim;
3107 expectedTau[tauComponent*numPointsBuffer+iPoint] = (gridJacobian[iPoint]/Re)*
3108 (mu[iPoint]*(gradValuesXYZ[tauComponent]+gradValuesXYZ[tauTComponent]) +
3109 lambda[iPoint]*divValue);
3116 expectedTau[tauComponent*numPointsBuffer+iPoint] = (gridJacobian[iPoint]/Re)*
3117 (mu[iPoint]*(gradValuesXYZ[tauComponent]+gradValuesXYZ[tauTComponent]));
3126 expectedTau[tauComponent*numPointsBuffer+iPoint] = (gridJacobian[iPoint]/Re)*
3127 (mu[iPoint]*(gradValuesXYZ[tauComponent]+gradValuesXYZ[tauTComponent]));
3137 std::cout <<
"Checking tau in " << numDim <<
" dimensions...";
3139 Re,bufferPtrArray,velGradBuffers,tauBuffers)){
3140 std::cout <<
"Compute Tau failed." << std::endl;
3144 double errMax = -10000.0;
3145 double errMin = 1000000.0;
3147 for(
int iDim = 0;iDim < numDim;iDim++){
3148 for(
int jDim = 0;jDim < numDim;jDim++){
3149 size_t tauComponent = iDim*numDim + jDim;
3153 error = std::abs(tau[tauComponent+iPoint] -
3154 expectedTau[tauComponent+iPoint])/std::abs(expectedTau[tauComponent+iPoint]);
3157 if(error > errMax) errMax = error;
3158 if(error < errMin) errMin = error;
3165 tauCurvilinear =
false;
3166 std::cout <<
"failed." << std::endl
3167 <<
"TAU Error: " << errMax << std::endl;
3169 std::cout <<
"passed." << std::endl;
3172 std::vector<double> expectedQ(numDim*numPointsBuffer,0.0);
3173 std::vector<double> q(numDim*numPointsBuffer,0.0);
3174 std::vector<double *> gradTBuffers(numDim,NULL);
3175 std::vector<double *> heatFluxBuffers(numDim,NULL);
3176 for(
int iDim = 0;iDim < numDim;iDim++){
3181 for(
int jDim = 0;jDim < numDim;jDim++){
3184 dTdX += gradTValue*metricValues[iDim+jDim*numDim];
3188 expectedQ[qIndex+iPoint] = lambda[iPoint]*gridJacobian[iPoint]*dTdX/Re;
3191 std::cout <<
"Checking heat flux in " << numDim <<
" dimensions....";
3194 gridJacobian,Re,bufferPtrArray,gradTBuffers,
3196 std::cout <<
"ComputeHeatFlux failed." << std::endl;
3202 double err = std::abs(q[iPoint] - expectedQ[iPoint])/std::abs(expectedQ[iPoint]);
3205 qCurvilinear =
false;
3207 if(errMax < err) errMax = err;
3208 if(errMin > err) errMin = err;
3211 std::cout <<
"failed." << std::endl
3212 <<
"Max Heat Flux Error : " << errMax << std::endl;
3214 std::cout <<
"passed." << std::endl;
3219 int numTauComponents = (numDim*(numDim+1))/2;
3220 std::vector<double> tau2(numTauComponents*numPointsBuffer,0);
3221 for(
int iDim = 0;iDim < numDim;iDim++){
3222 for(
int jDim = 0;jDim < numDim;jDim++){
3225 tau2[tComponent*numPointsBuffer+iPoint] = mu[iPoint]*(tComponent+1);
3231 std::vector<double> energyVector(numDim*numPointsBuffer,0);
3232 for(
int iDim = 0;iDim < numDim;iDim++){
3234 energyVector[iDim*numPointsBuffer+iPoint] = lambda[iPoint]*(iDim+1);
3241 std::vector<int> symmetricIndex(numDim*numDim,0);
3243 symmetricIndex[0] = 0;
3245 symmetricIndex[0] = 0;
3246 symmetricIndex[1] = 1;
3247 symmetricIndex[2] = 1;
3248 symmetricIndex[3] = 2;
3251 symmetricIndex[0] = 0;
3252 symmetricIndex[1] = 1;
3253 symmetricIndex[2] = 2;
3254 symmetricIndex[3] = 1;
3255 symmetricIndex[4] = 3;
3256 symmetricIndex[5] = 4;
3257 symmetricIndex[6] = 2;
3258 symmetricIndex[7] = 4;
3259 symmetricIndex[8] = 5;
3262 std::cout <<
"Checking flux in " << numDim <<
" dimensions....";
3263 for(
int iDim = 0;iDim < numDim;iDim++){
3267 std::cout <<
"(" << fluxDir <<
")...";
3271 std::vector<double> flux((numDim+2)*numPointsBuffer,0);
3272 std::vector<double> expectedFlux((numDim+2)*numPointsBuffer,0);
3276 &
gridType,&gridMetric[0],&tau2[0],&energyVector[0],&flux[0]);
3279 for(
int jDim = 0;jDim < numDim;jDim++){
3281 for(
int kDim = 0;kDim < numDim;kDim++){
3282 int tauComponent = symmetricIndex[jDim+kDim*numDim];
3283 double *metricComponent = &gridMetric[metricOffset+kDim*
numPointsBuffer];
3285 expectedFlux[(jDim+1)*numPointsBuffer + iPoint] +=
3286 metricComponent[iPoint]*tau2[tauComponent*numPointsBuffer+iPoint];
3292 for(
int jDim = 0;jDim < numDim;jDim++){
3293 double *metricComponent = &gridMetric[metricOffset+jDim*
numPointsBuffer];
3295 expectedFlux[(numDim+1)*numPointsBuffer + iPoint] +=
3296 metricComponent[iPoint]*energyVector[jDim*numPointsBuffer+iPoint];
3300 double maxError = -10000.0;
3301 double minError = 10000.0;
3302 for(
int iDim = 0;iDim < numDim+2;iDim++){
3303 bool triggered =
false;
3305 double error = std::abs(flux[iDim*numPointsBuffer+iPoint] -
3306 expectedFlux[iDim*numPointsBuffer+iPoint])/
3307 std::abs(expectedFlux[iDim*numPointsBuffer+iPoint]);
3310 std::cout <<
"Flux component " << iDim <<
" failed." << std::endl;
3315 if(error > maxError) maxError = error;
3316 if(error < minError) minError = error;
3320 std::cout <<
"failed." << std::endl
3321 <<
"Max flux error: " << maxError << std::endl;
3326 std::cout <<
"passed." << std::endl;
3330 serialUnitResults.
UpdateResult(
"Viscid:ComputeHeatFlux:Curvilinear",qCurvilinear);
3331 serialUnitResults.
UpdateResult(
"Viscid:ComputeTau:Curvilinear",tauCurvilinear);
3332 serialUnitResults.
UpdateResult(
"Viscid:StrongFlux1D:Curvilinear",flux1dTest);
double Cosine(std::vector< double > amp, std::vector< double > period, double x0, double y0, double z0, double x, double y, double z, int direction)
void const size_t const size_t const size_t const int const int const double * gridMetric
int ComputeDVBuffer(const pcpp::IndexIntervalType ®ionInterval, const std::vector< size_t > &bufferSizes, const std::vector< double *> &stateBuffers, std::vector< double *> &dvBuffers)
int ComputeTauBuffer(const pcpp::IndexIntervalType ®ionInterval, const std::vector< size_t > &bufferSize, int gridType, const std::vector< double > &gridMetrics, const std::vector< double > &gridJacobian, const double &Re, const std::vector< double *> &tvBuffers, const std::vector< double *> &velGradBuffers, std::vector< double *> &tauBuffers)
void TestVelocityGradient(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
subroutine ywxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y)
YWXPY point-wise operator performing Y = WX + Y, where all are vectors.
void SetPeriodicDirs(const std::vector< bool > &inPeriodic)
void Flatten(ContainerType &output) const
void const size_t * numPoints
void TestVelocityGradientPeriodic(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
plascom2::operators::sbp::base operator_t
const std::vector< double > & DX() const
pcpp::IndexIntervalType & PartitionInterval()
void SetNumThreads(int numThreads)
int ComputeHeatFluxBuffer(const pcpp::IndexIntervalType ®ionInterval, const std::vector< size_t > &bufferSize, int gridType, const std::vector< double > &gridMetrics, const std::vector< double > &gridJacobian, const double &Re, const std::vector< double *> &tvBuffers, const std::vector< double *> &temperatureGradBuffers, std::vector< double *> &heatFluxBuffers)
void const size_t const size_t * gridSizes
bool CheckResult(bool &localResult, pcpp::CommunicatorType &testComm)
void const size_t const size_t const size_t const double const double double * y
void SetupPressureBuffer(double *const inPtr)
int ComputePressureBuffer(const pcpp::IndexIntervalType ®ionInterval, const std::vector< size_t > &bufferSizes)
Compute pressure for the entire buffer.
void const size_t const size_t const size_t const int const int * gridType
pcpp::CommunicatorType comm_t
void SetGamma(const double &inValue)
virtual size_t Create(size_t number_of_nodes=0, size_t number_of_cells=0)
void SetSpecificGasConstant(const double &inValue)
void const size_t const size_t const size_t const int * fluxDir
void const size_t const size_t const size_t const int const double const int const double * velocity
pcpp::IndexIntervalType interval_t
void SetupInternalEnergyBuffer(double *const inPtr)
void SetGridSizes(const std::vector< size_t > &inSize)
pcpp::ParallelGlobalType global_t
subroutine strongflux1d(numDim, fluxDir, gridSizes, numPoints, opInterval, gridType, gridMetric, tauBuffer, energyBuffer, fluxBuffer)
Compute the curvilinear cartesian viscous fluxes in 1 dimension.
void const size_t const size_t const size_t const double const double * x
const std::vector< size_t > & BufferSizes() const
void SetupTemperatureBuffer(double *const inPtr)
static const int NUMGRIDTYPES
Encapsulating class for collections of test results.
void TestViscidKernelsMetrics(ix::test::results &serialUnitResults)
Tests viscid kernels on uniform grid using all metric types.
simulation::domain::base< grid_t, state_t > domain_t
simulation::state::base state_t
pcpp::IndexIntervalType & PartitionBufferInterval()
void TestViscidRHS(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
const std::vector< size_t > & GridSizes() const
void SetupSpecificVolumeBuffer(double *const inPtr)
void SetGridSpacings(const std::vector< double > &inSpacing)
int InitializeSimulationFixtures(GridType &inGrid, plascom2::operators::sbp::base &inOperator, int interiorOrder, pcpp::CommunicatorType &inComm, std::ostream *messageStreamPtr=NULL)
int ComputeTVBufferPower(const pcpp::IndexIntervalType ®ionInterval, const std::vector< size_t > &bufferSize, const double *temperatureBuffer, std::vector< double *> &tvBuffer, const double beta, const double power, const double bulkViscFac, const double specificHeat, const double prandtlNumber)
Compute transport coefficients using the power law.
Main encapsulation of MPI.
int InitializeMaterialProperties()
Derive material properties from a minimum required set.
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t double * a
Testing constructs for unit testing.
double Linear(std::vector< double > amp, double x0, double y0, double z0, double x, double y, double z, int direction)
int SetupViscidState(const GridType &inGrid, StateType &inState, StateType &inParams, int numScalars, bool withFluxes=false)
int SetupThreads(std::vector< int > &numThreadPartitions)
Encapsulation for a collection of operator stencils.
void const size_t const size_t const size_t const int const double * gridJacobian
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 size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t * bufferInterval
void UpdateResult(const std::string &name, const ValueType &result)
Updates an existing test result.
Perfect Gas Equation of State.
const std::vector< double > & PhysicalExtent() const
simulation::grid::halo halo_t
Simple Block Structured Mesh object.
void AddField(const std::string &name, char loc, unsigned int ncomp, unsigned int dsize, const std::string &unit)
fixtures::CommunicatorType & Communicator() const
simulation::grid::parallel_blockstructured grid_t
int ComputeTemperatureBuffer(const pcpp::IndexIntervalType ®ionInterval, const std::vector< size_t > &bufferSizes)
Compute temperature for the entire buffer.
void SetFieldBuffer(const std::string &name, void *buf)
void TestViscidKernelsCurvilinear(ix::test::results &serialUnitResults)
Tests viscid kernels with full curvilinear metrics.
void SetPhysicalExtent(const std::vector< double > &inExtent)
int Finalize(bool allocateCoordinateData=false)
void InitSimple(const ContainerType &inSize)
size_t BufferSize() const
void const size_t * numPointsBuffer
void TestViscidKernels(ix::test::results &serialUnitResults)
void FC_MODULE(euler, flux1d, EULER, FLUX1D)(const int *numDim