1 #ifndef __EULER_RHS_H__ 2 #define __EULER_RHS_H__ 32 #define CONSTANT_CFL 1 34 static const int DV = 1;
35 static const int TV = 2;
40 static const int TAU = 64;
42 static const int AO = 256;
47 static const int BC = 8192;
58 template<
typename Gr
idT,
typename StateT,
typename OperatorT>
72 using rhs_base_t::globalPtr;
76 rhs() : rhs_base_t(), exchangeFlux(true),
77 exchangeDV(false), artificialDissipation(false),useWENO(false)
87 int Initialize(GridType &inGrid, StateType &inState, StateType &inParam,
88 OperatorType &inOperator)
94 std::cout <<
"EulerRHS:Fatal error: Init failed." << std::endl;
99 std::cout <<
"EulerRHS:Fatal error: Set Grid failed." << std::endl;
103 if(SetParamState(inParam)){
104 std::cout <<
"EulerRHS:Fatal error: Set params failed." << std::endl;
111 globalPtr->FunctionEntry(
"InitializeState");
114 if(InitializeState(inState)){
115 std::cout <<
"EulerRHS:Fatal error: Initialize state failed." << std::endl;
120 if(SetTargetState(inState)){
122 globalPtr->ErrOut(
"Target data setup failed.\n");
124 std::cout <<
"EulerRHS::InitState:Error: Target data setup failed." 133 globalPtr->FunctionExit(
"InitializeState");
144 globalPtr->FunctionEntry(
"HaloSetup");
148 if(HaloSetup(inGrid.Halo())){
149 std::cout <<
"EulerRHS:Fatal error: Halo setup failed." << std::endl;
156 globalPtr->FunctionExit(
"HaloSetup");
157 globalPtr->FunctionEntry(
"SetupOperators");
161 if(SetupOperators(inOperator)){
162 std::cout <<
"EulerRHS:Fatal error: Operator setup failed." << std::endl;
168 globalPtr->FunctionExit(
"SetupOperators");
180 int Initialize(GridType &inGrid, StateType &inState, StateType &inParam,
181 StateType &targetState,OperatorType &inOperator)
187 std::cout <<
"EulerRHS:Fatal error: Init failed." << std::endl;
192 std::cout <<
"EulerRHS:Fatal error: Set Grid failed." << std::endl;
196 if(SetParamState(inParam)){
197 std::cout <<
"EulerRHS:Fatal error: Set params failed." << std::endl;
205 globalPtr->FunctionEntry(
"InitializeState");
208 if(InitializeState(inState)){
209 std::cout <<
"EulerRHS:Fatal error: Initialize state failed." << std::endl;
213 if(SetTargetState(targetState)){
215 globalPtr->ErrOut(
"Target data setup failed.\n");
217 std::cout <<
"EulerRHS::InitState:Error: Target data setup failed." 226 globalPtr->FunctionExit(
"InitializeState");
237 globalPtr->FunctionEntry(
"HaloSetup");
241 if(HaloSetup(inGrid.Halo())){
242 std::cout <<
"EulerRHS:Fatal error: Halo setup failed." << std::endl;
249 globalPtr->FunctionExit(
"HaloSetup");
250 globalPtr->FunctionEntry(
"SetupOperators");
254 if(SetupOperators(inOperator)){
255 std::cout <<
"EulerRHS:Fatal error: Operator setup failed." << std::endl;
261 globalPtr->FunctionExit(
"SetupOperators");
273 StateType &rhsState,
int myThreadId = 0)
281 errorCode = SetHalo(inGrid.Halo());
291 errorCode = SetState(inState);
300 errorCode = SetRHSState(rhsState);
318 &fortranBufferInterval(fortranBufferIntervals[threadId]);
325 globalPtr->FunctionEntry(
"ZeroRHS");
330 for(
int iEquation = 0;iEquation < numEquations;iEquation++){
333 &fortranBufferInterval[0],&zero,myRHSBuffers[iEquation]);
339 &fortranBufferInterval[0],&zero,viscidFluxBuffers[iEquation]);
348 globalPtr->FunctionExit(
"ZeroRHS");
358 PrepareBuffers(threadId);
362 if(ComputeDV(threadId))
370 if(ComputeTV(threadId))
373 if(refRe > 0 || artificialDissipation){
375 if(ComputeVelGrad(threadId))
378 if(artificialDissipation){
379 if(ComputeVelDiv(threadId))
383 if(ComputeStressTensor(threadId))
386 if(ComputeTemperatureGrad(threadId))
390 if(ComputeConcentrationGrad(threadId)){
395 if(ComputeHeatFlux(threadId))
400 if(ComputeViscidEnergyFlux(threadId))
413 for(
int iDim = 0;iDim < numDim;iDim++){
416 if(InviscidFlux(iDim,threadId))
422 if(ViscousFlux(iDim,threadId))
428 if(ExchangeState(threadId))
432 if(ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId))
435 int wenoStatus = ApplyWENO(iDim,threadId);
442 std::ostringstream statusMessage;
443 statusMessage <<
"ApplyWENO returned error code (" 444 << wenoStatus <<
"), exiting." 446 globalPtr->StdOut(statusMessage.str());
455 AccumulateToRHS(m1,dFluxBuffer,threadId);
459 if(ExchangeBuffer(fluxMessageId,numEquations,viscidFluxBuffer,threadId))
462 if(ApplyOperator(iDim,numEquations,viscidFluxBuffer,dFluxBuffer,threadId,
true))
466 AccumulateToRHS(m2,dFluxBuffer,threadId,
true);
470 AccumulateViscousFluxes(-1.0,viscidFluxBuffers,inviscidFluxBuffers,threadId,!exchangeFlux);
473 if(ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId))
478 if(ApplyOperator(iDim,numEquations,inviscidFluxBuffer,dFluxBuffer,threadId))
482 AccumulateToRHS(m1,dFluxBuffer,threadId);
490 GridScaleRHS(threadId);
499 globalPtr->FunctionEntry(
"HandleBCs");
502 int returnCode = HandleBoundaryConditions(threadId);
507 globalPtr->FunctionExit(
"HandleBCs");
516 returnCode = HandleSources(threadId);
520 return(returnCode+200);
538 globalPtr->FunctionEntry(
"ApplyWENO");
542 int winWidth = coeffsWENO.hiAll - coeffsWENO.loAll + 1;
544 double fluxWindow[winWidth*numEquations];
545 double projFluxWindow[winWidth*numEquations];
546 double projFluxReconst[numEquations];
548 double stateL[numEquations];
549 double stateR[numEquations];
550 double deltaState[numEquations];
551 double projDeltaState[numEquations];
552 double fluxL[numEquations];
553 double fluxR[numEquations];
555 double tmat[numEquations*numEquations];
556 double tinv[numEquations*numEquations];
557 double lambda[numEquations*numEquations];
558 double lambdaL[numEquations*numEquations];
559 double lambdaR[numEquations*numEquations];
560 double normVec[numDim];
561 for (
int i=0; i<numDim; i++) {
562 if (i == iDim) normVec[i] = 1;
566 const std::vector<pcpp::IndexIntervalType>
567 &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
574 int jDim = (iDim + 1)%numDim;
575 int kDim = (iDim + 2)%numDim;
577 size_t js = regionInterval[jDim].first;
578 size_t je = regionInterval[jDim].second;
584 ks = regionInterval[kDim].first;
585 ke = regionInterval[kDim].second;
588 for (
size_t k=ks; k<=ke; k++) {
594 opInterval[kDim].first = k;
595 opInterval[kDim].second = k;
598 for (
size_t j=js; j<=je; j++) {
599 opInterval[jDim].first = j;
600 opInterval[jDim].second = j;
602 size_t is = regionInterval[iDim].first;
603 size_t ie = regionInterval[iDim].second;
605 opInterval[iDim].first = is + coeffsWENO.loAll - 1;
606 opInterval[iDim].second = ie + coeffsWENO.hiAll;
608 std::vector<size_t> indices;
612 for (
int loc=0; loc<winWidth; loc++) {
613 for (
int eqn=0; eqn<numEquations; eqn++) {
615 fluxWindow[eqn*winWidth + loc] = inviscidFluxBuffer[eqn*
numPointsBuffer + indices[loc]];
620 for (
size_t ii=-coeffsWENO.loAll; ii<indices.size()-coeffsWENO.hiAll; ii++) {
622 for (
int eqn=0; eqn<numEquations; eqn++) {
623 stateL[eqn] = myStateBuffers[eqn][indices[ii]];
624 stateR[eqn] = myStateBuffers[eqn][indices[ii+1]];
625 deltaState[eqn] = stateR[eqn] - stateL[eqn];
631 double gamma = eosPtr->GetGamma();
633 (&numDim, &stateL[0], &stateL[0], &gamma, &normVec[0], &tmat[0], &tinv[0], &lambdaL[0]);
635 (&numDim, &stateR[0], &stateR[0], &gamma, &normVec[0], &tmat[0], &tinv[0], &lambdaR[0]);
640 (&numDim, &stateL[0], &stateR[0], &gamma, &normVec[0], &tmat[0], &tinv[0], &lambda[0]);
642 WENO::Project(numEquations, winWidth, &tinv[0], &fluxWindow[0], &projFluxWindow[0]);
645 WENO::Project(numEquations, 1, &tinv[0], &deltaState[0], &projDeltaState[0]);
648 for (
int eqn=0; eqn<numEquations; eqn++) {
649 int diag = eqn*(numEquations+1);
650 int group = (1 + (int) copysign(1.0, lambda[diag]))/2;
652 int startLoc = coeffsWENO.LoGroup(group) - coeffsWENO.loAll;
653 WENO::ReconstPointVal(&projFluxWindow[eqn*winWidth + startLoc], coeffsWENO, group, projFluxReconst[eqn]);
656 double lambdaAbs = std::abs(lambda[diag]);
657 double entropyFix = (eta > lambdaAbs ? 0.5*(eta - lambdaAbs) : 0);
658 entropyFix *= projDeltaState[eqn];
667 projFluxReconst[eqn] -= entropyFix;
670 WENO::Project(numEquations, 1, &tmat[0], &projFluxReconst[0], &fluxR[0]);
672 for (
int eqn=0; eqn<numEquations && ii > -coeffsWENO.loAll; eqn++) {
673 dFluxBuffer[eqn*
numPointsBuffer + indices[ii]] = fluxR[eqn] - fluxL[eqn];
677 for (
int loc=1; loc<winWidth; loc++) {
678 for (
int eqn=0; eqn<numEquations; eqn++) {
679 int currIndex = eqn*winWidth + loc;
680 int newIndex = eqn*winWidth + (loc-1);
681 fluxWindow[newIndex] = fluxWindow[currIndex];
686 for (
int eqn=0; ((eqn<numEquations) && (ii < (indices.size()-coeffsWENO.hiAll-1))); eqn++) {
688 fluxWindow[eqn*winWidth + (winWidth-1)] = inviscidFluxBuffer[eqn*
numPointsBuffer + indices[ii+coeffsWENO.hiAll+1]];
691 for (
int eqn=0; eqn<numEquations; eqn++) {
692 fluxL[eqn] = fluxR[eqn];
703 globalPtr->FunctionExit(
"ApplyWENO");
714 size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
715 std::vector<double> &
gridMetric(gridPtr->Metric());
722 globalPtr->FunctionEntry(
"ArtificialDissipation");
726 double dilRamp = 10.0;
727 double sigmaDil = inputSigmaDil;
729 double dilCutoff = -1.5;
736 for(
int iDim = 0;iDim < numDim;iDim++){
738 int dissDir = iDim + 1;
747 for(
int iEquation= 0;iEquation < numEquations;iEquation++){
750 double *stateBuf = myStateBuffers[iEquation];
758 ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId);
763 ApplyDissipationOperator(iDim,numEquations,inviscidFluxBuffer,dFluxBuffer,
false,threadId);
765 for(
int iEquation= 0;iEquation < numEquations;iEquation++){
774 (&numDim,&
numPointsBuffer,&bufferSizes[0],dOpInterval,alphaDissipation,
779 ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId);
784 ApplyDissipationOperator(iDim,numEquations,inviscidFluxBuffer,dFluxBuffer,
true,threadId);
787 for(
int iEquation= 0;iEquation < numEquations;iEquation++){
790 double *rhsPtr = myRHSBuffers[iEquation];
803 globalPtr->FunctionExit(
"ArtificialDissipation");
817 if(artificialDissipation){
818 returnCode = ArtificialDissipation(myThreadId);
836 else if (!subRegionsPtr || !domainBoundariesPtr)
839 std::vector<BoundaryType> &domainBoundaries(*domainBoundariesPtr);
840 std::vector<BCType> &domainBCs(*domainBCsPtr);
841 std::vector<GridRegionType> &gridRegions(*subRegionsPtr);
842 std::vector<double> &
gridMetric(gridPtr->Metric());
845 int numBCs = domainBCs.size();
846 int numGridRegions = gridRegions.size();
847 int numDomainBoundaries = domainBoundaries.size();
851 if(numDomainBoundaries == 0)
854 typename std::vector<BoundaryType>::iterator dbIt = domainBoundaries.begin();
858 double gamma = eosPtr->GetGamma();
859 gasParams[0] = refRe;
860 gasParams[1] = gamma;
861 gasParams[2] = specGasConst;
862 gasParams[3] = temperatureScale;
863 gasParams[4] = refSndSpd;
864 gasParams[5] = std::max(gamma/refPr,5.0/3.0);
866 while(dbIt != domainBoundaries.end()){
868 BoundaryType &domainBoundary(*dbIt++);
869 GridRegionType &gridRegion(gridRegions[domainBoundary.
GridRegionID()]);
871 &threadPartBufferIndices(gridRegion.threadPartitionBufferIndices[threadId]);
872 size_t numBoundaryPoints = threadPartBufferIndices.size();
874 if(numBoundaryPoints > 0){
876 BCType &boundaryCondition(domainBoundary.
BC());
878 int bcType = boundaryCondition.BCType();
883 int normalDir = gridRegion.normalDirection;
885 std::vector<size_t> regionSizes(regionInterval.
Sizes());
886 size_t numPointsRegion = regionInterval.
NNodes();
892 StateType &bcParamState(boundaryCondition.Params());
893 double *
bcParams = bcParamState.template GetFieldBuffer<double>(
"Numbers");
894 int *bcFlags = bcParamState.template GetFieldBuffer<int>(
"Flags");
896 const std::string &bcName(boundaryCondition.BCName());
897 const std::string ®ionName(gridRegion.regionName);
898 const std::string &boundaryName(domainBoundary.
Name());
917 regionOpBufferInterval,bcParams,bcFlags,
918 numEquations,myStateBuffers,targetStateBuffers,myRHSBuffers);
923 regionOpBufferInterval,bcParams,bcFlags,iMask,
holeMask,
924 numEquations,myStateBuffers,targetStateBuffers,myRHSBuffers);
931 bcParams[2] = boundaryWeight;
935 &numPointsRegion,&numBoundaryPoints,&threadPartBufferIndices[0],
937 rhoPtr,rhoVPtr,rhoEPtr,viscidFluxBuffer,&
numScalar,scalarPtr,
938 rhoRHSPtr,rhoVRHSPtr,rhoERHSPtr,scalarRHSPtr,
939 rhoTargetPtr,rhoVTargetPtr,rhoETargetPtr,scalarTargetPtr);
947 std::ostringstream errMsg;
948 errMsg <<
"EulerRHS::HandleBoundaryConditions: Error SAT_NOSLIP_ISOTHERMAL " 949 <<
"is not implemented for scalar transport. Aborting." << std::endl;
951 globalPtr->StdOut(errMsg.str());
953 std::cout << errMsg.str();
957 bcParams[3] = boundaryWeight;
962 &numPointsRegion,&numBoundaryPoints,&threadPartBufferIndices[0],&
gridType,
963 &gridMetric[0],&gridJacobian[0],&bcParams[0],&gasParams[0],rhoPtr,rhoVPtr,
964 rhoEPtr,&
numScalar,scalarPtr,rhoRHSPtr,rhoVRHSPtr,rhoERHSPtr,
965 scalarRHSPtr,rhoTargetPtr,rhoVTargetPtr,rhoETargetPtr,
966 scalarTargetPtr,muPtr,lambdaPtr);
970 std::ostringstream errMsg;
971 errMsg <<
"EulerRHS::HandleBoundaryConditions:Error: SAT_NOSLIP_ISOTHERMAL " 972 <<
"not a valid BC for inviscid (Re = 0) flows. Aborting." << std::endl;
974 globalPtr->StdOut(errMsg.str());
976 std::cout << errMsg.str();
983 bcParams[1] = boundaryWeight;
987 &numPointsRegion,&numBoundaryPoints,&threadPartBufferIndices[0],&
gridType,
988 &gridMetric[0],&gridJacobian[0],
bcParams,&gasParams[0],rhoPtr,rhoVPtr,
989 rhoEPtr,&
numScalar,scalarPtr,rhoRHSPtr,rhoVRHSPtr,rhoERHSPtr,
990 scalarRHSPtr,rhoTargetPtr,rhoVTargetPtr,rhoETargetPtr,scalarTargetPtr);
994 std::ostringstream errMsg;
995 errMsg <<
"EulerRHS::HandleBoundaryConditions:Error: Could not resolve BC(" 996 << bcName <<
") = " << bcType <<
". Aborting." << std::endl;
998 globalPtr->StdOut(errMsg.str());
1000 std::cout << errMsg.str() << std::endl;
1015 int threadId,
bool skipDensity=
false)
1019 size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1028 globalPtr->FunctionEntry(
"ApplyOperator");
1032 int startComponent = 0;
1033 if(skipDensity) startComponent = 1;
1035 for(
int iComp = startComponent;iComp <
numComponents;iComp++){
1042 &uBuffer[compOffset],&duBuffer[compOffset]);
1057 globalPtr->FunctionExit(
"ApplyOperator");
1065 bool split =
false,
int threadId = 0)
1069 size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1078 globalPtr->FunctionEntry(
"ApplyDissOperator");
1082 int numStencilsDiss = 0;
1083 int *stencilSizesDiss = NULL;
1084 int *stencilStartsDiss = NULL;
1085 int numStencilValuesDiss = 0;
1086 double *stencilWeightsDiss = NULL;
1087 int *stencilOffsetsDiss = NULL;
1088 int *stencilConnDiss = NULL;
1092 numStencilsDiss = artDissOperatorSplit.numStencils;
1093 stencilSizesDiss = artDissOperatorSplit.stencilSizes;
1094 stencilStartsDiss = artDissOperatorSplit.stencilStarts;
1095 stencilWeightsDiss = artDissOperatorSplit.stencilWeights;
1096 stencilOffsetsDiss = artDissOperatorSplit.stencilOffsets;
1097 stencilConnDiss = artDissConnSplit;
1099 numStencilsDiss = artDissOperator.numStencils;
1100 stencilSizesDiss = artDissOperator.stencilSizes;
1101 stencilStartsDiss = artDissOperator.stencilStarts;
1102 stencilWeightsDiss = artDissOperator.stencilWeights;
1103 stencilOffsetsDiss = artDissOperator.stencilOffsets;
1104 stencilConnDiss = artDissConn;
1114 &dDir,dOpInterval,&numStencilsDiss,stencilSizesDiss,
1115 stencilStartsDiss,&numStencilValuesDiss,stencilWeightsDiss,
1116 stencilOffsetsDiss,&stencilConnDiss[dirOffset],
1117 &uBuffer[compOffset],&duBuffer[compOffset]);
1132 globalPtr->FunctionExit(
"ApplyDissOperator");
1145 globalPtr->FunctionEntry(
"GridScaleRHS");
1149 size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1150 std::vector<double> &
gridJacobian(gridPtr->Jacobian());
1153 for(
int iEquation = 0;iEquation < numEquations;iEquation++){
1154 double *rhsPtr = myRHSBuffers[iEquation];
1170 globalPtr->FunctionExit(
"GridScaleRHS");
1182 globalPtr->FunctionEntry(
"AccumulateRHS");
1186 size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1189 int startComponent = 0;
1190 if(skipDensity) startComponent = 1;
1191 for(
int iComp = startComponent;iComp < numEquations;iComp++){
1202 globalPtr->FunctionExit(
"AccumulateRHS");
1216 globalPtr->FunctionEntry(
"ComputeDV");
1221 const std::vector<pcpp::IndexIntervalType>
1222 &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1225 std::vector<size_t> &fortranOpInterval(fortranPartitionBufferIntervals[threadId]);
1232 myStateBuffers,dvBuffers);
1235 returnCode = eosPtr->ComputePressureBuffer(regionInterval,
bufferSizes);
1236 returnCode = eosPtr->ComputeTemperatureBuffer(regionInterval,
bufferSizes);
1238 if(!returnCode && exchangeDV){
1239 returnCode = ExchangeDV(threadId);
1246 globalPtr->FunctionExit(
"ComputeDV");
1260 globalPtr->FunctionEntry(
"ComputeTV");
1265 const std::vector<pcpp::IndexIntervalType>
1266 &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1269 std::vector<size_t> &fortranOpInterval(fortranPartitionBufferIntervals[threadId]);
1273 if(transportModel ==
POWER) {
1274 double heatCapacityCp = eosPtr->GetHeatCapacityCp();
1276 temperaturePtr,tvBuffers,
1277 beta,power,bulkViscFac,heatCapacityCp,refPr);
1279 std::ostringstream errMsg;
1280 errMsg <<
"EulerRHS::RHS:Error: Unknown transport model in EulerRHS. Aborting." 1283 globalPtr->StdOut(errMsg.str());
1284 globalPtr->FunctionExit(
"ComputeTV");
1286 std::cout << errMsg.str();
1296 globalPtr->FunctionExit(
"ComputeTV");
1311 globalPtr->FunctionEntry(
"InviscidFlux");
1315 size_t *fluxOpInterval = NULL;
1317 fluxOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1319 fluxOpInterval = &fortranBufferIntervals[threadId][0];
1326 globalPtr->FunctionEntry(
"ComputeVHat");
1331 std::vector<double> &
gridMetric(gridPtr->Metric());
1332 double *
velocity = &velocityPtr[0];
1333 int fluxDim = iDim + 1;
1344 globalPtr->FunctionExit(
"ComputeVHat");
1345 globalPtr->FunctionEntry(
"Flux1D");
1354 &fluxDim,&
gridType,&gridMetric[0],rhoPtr,rhoVPtr,rhoEPtr,
1355 &
velHat[0],pressurePtr,inviscidFluxBuffer);
1362 globalPtr->FunctionExit(
"Flux1D");
1372 globalPtr->FunctionEntry(
"ScalarFlux1D");
1379 &
numScalar,scalarPtr,&velHat[0],inviscidFluxBuffers[numDim+2]);
1385 globalPtr->FunctionExit(
"ScalarFlux1D");
1395 globalPtr->FunctionExit(
"InviscidFlux");
1408 globalPtr->FunctionEntry(
"ComputeVelDiv");
1412 const std::vector<pcpp::IndexIntervalType>
1413 &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1415 std::vector<size_t> &fortranOpInterval(fortranPartitionBufferIntervals[threadId]);
1416 std::vector<double> &
gridMetric(gridPtr->Metric());
1417 std::vector<double> &
gridJacobian(gridPtr->Jacobian());
1423 &fortranOpInterval[0],&zero,velDiv);
1434 globalPtr->FunctionExit(
"ComputeVelDiv");
1448 globalPtr->FunctionEntry(
"ComputeScalarGrad");
1451 const size_t *
opInterval = &fortranPartitionBufferIntervals[threadId][0];
1452 std::vector<double> &
gridMetric(gridPtr->Metric());
1453 std::vector<double> &
gridJacobian(gridPtr->Jacobian());
1455 if(communicateData){
1456 ExchangeBuffer(scalarMessageId,1,scalarData,threadId);
1460 for(
int i=0;i<numDim;i++){
1462 ApplyOperator(i,1,scalarData,&tempVector[gradOffset],threadId);
1473 globalPtr->FunctionExit(
"ComputeScalarGrad");
1488 globalPtr->FunctionEntry(
"ComputeVelGrad");
1494 for(
int i=0;i<numDim;i++){
1495 ApplyOperator(i,numDim,velocityPtr,velGradBuffers[i],threadId);
1502 globalPtr->FunctionExit(
"ComputeVelGrad");
1515 globalPtr->FunctionEntry(
"ComputeConcGrad");
1518 const size_t *
opInterval = &fortranPartitionBufferIntervals[threadId][0];
1521 for(
int iScalar = 0;iScalar <
numScalar;iScalar++){
1523 size_t scalarGradOffset = numDim*scalarOffset;
1527 rhom1Ptr,&scalarPtr[scalarOffset],tempScalar);
1529 ComputeScalarGradient(tempScalar,&scalarGrad[scalarGradOffset],threadId,
true);
1543 for(
int iDim = 0;iDim < numDim; iDim++){
1547 &scalarDiffusivity[scalarOffset],&scalarGrad[scalarGradOffset+dirOffset]);
1556 globalPtr->FunctionExit(
"ComputeConcGrad");
1567 globalPtr->FunctionEntry(
"ComputeTempGrad");
1572 const std::vector<pcpp::IndexIntervalType>
1573 &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1575 std::vector<size_t> &fortranOpInterval(fortranPartitionBufferIntervals[threadId]);
1578 for(
int i=0;i<numDim;i++){
1579 ApplyOperator(i,1,temperaturePtr,temperatureGradBuffers[i],threadId);
1586 globalPtr->FunctionExit(
"ComputeTempGrad");
1599 globalPtr->FunctionEntry(
"ComputeStressTensor");
1603 const std::vector<pcpp::IndexIntervalType>
1604 &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1606 std::vector<double> &
gridMetric(gridPtr->Metric());
1607 std::vector<double> &
gridJacobian(gridPtr->Jacobian());
1611 tvBuffers, velGradBuffers, tauBuffers);
1618 globalPtr->FunctionExit(
"ComputeStressTensor");
1632 globalPtr->FunctionEntry(
"ComputeHeatFlux");
1636 const std::vector<pcpp::IndexIntervalType>
1637 &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1639 std::vector<double> &
gridMetric(gridPtr->Metric());
1640 std::vector<double> &
gridJacobian(gridPtr->Jacobian());
1645 tvBuffers, temperatureGradBuffers, heatFluxBuffers);
1653 globalPtr->FunctionExit(
"ComputeHeatFlux");
1666 globalPtr->FunctionEntry(
"ViscidEnergyFlux");
1670 const std::vector<pcpp::IndexIntervalType>
1671 &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1673 const size_t *
opInterval = &fortranPartitionBufferIntervals[threadId][0];
1675 for(
int iDim = 0;iDim < numDim;iDim++){
1678 for(
int iVel = 0;iVel < numDim;iVel++){
1679 int tensorIndex = iDim*numDim + iVel;
1684 &velocityPtr[dirOffset],tauBuffers[tensorIndex],heatFluxBuffers[iDim]);
1693 globalPtr->FunctionExit(
"ViscidEnergyFlux");
1705 globalPtr->FunctionEntry(
"ViscousFlux");
1709 size_t *fluxOpInterval = NULL;
1711 fluxOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1713 fluxOpInterval = &fortranBufferIntervals[threadId][0];
1715 std::vector<double> &
gridMetric(gridPtr->Metric());
1723 int fluxDim = iDim + 1;
1724 int tau1=iDim*numDim;
1737 for(
int iScalar = 0;iScalar <
numScalar;iScalar++){
1738 size_t fluxOffset = numDim+2+iScalar;
1742 &
gridType,&gridMetric[0],&scalarGrad[scalarGradOffset],
1743 viscidFluxBuffers[fluxOffset]);
1751 globalPtr->FunctionExit(
"ViscousFlux");
1761 int threadId,
bool fullInterval =
false)
1767 globalPtr->FunctionEntry(
"AccumulateVFlux");
1771 size_t *bufferOpInterval = NULL;
1773 bufferOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1775 bufferOpInterval = &fortranBufferIntervals[threadId][0];
1778 for(
int iComp = 1;iComp < numEquations;iComp++){
1787 globalPtr->FunctionExit(
"AccumulateVFlux");
1797 for(
int iDim = 0;iDim < numDV;iDim++)
1798 haloPtr->PackMessageBuffers(dvMessageId,iDim,1,dvBuffers[iDim]);
1806 haloPtr->PackMessageBuffers(messageId,0,numEquations,dataBuffer);
1812 haloPtr->UnPackMessageBuffers(messageId,0,numEquations,dataBuffer);
1817 haloPtr->SendMessage(messageId,gridNeighbors,*gridCommPtr);
1818 haloPtr->ReceiveMessage(messageId,gridNeighbors,*gridCommPtr);
1824 for(
int iDim = 0;iDim < numDV;iDim++)
1825 haloPtr->UnPackMessageBuffers(dvMessageId,iDim,1,dvBuffers[iDim]);
1832 haloPtr->SendMessage(dvMessageId,gridNeighbors,*gridCommPtr);
1833 haloPtr->ReceiveMessage(dvMessageId,gridNeighbors,*gridCommPtr);
1842 globalPtr->FunctionEntry(
"ExchangeDV");
1846 PackDVMessage(threadId);
1850 ExchangeDVMessage();
1853 UnpackDVMessage(threadId);
1858 globalPtr->FunctionExit(
"ExchangeDV");
1871 globalPtr->FunctionEntry(
"ExchangeBuffer");
1874 PackBufferMessage(messageId,numEquations,dataBuffer,threadId);
1879 ExchangeBufferMessage(messageId);
1884 UnpackBufferMessage(messageId,numEquations,dataBuffer,threadId);
1890 globalPtr->FunctionExit(
"ExchangeBuffer");
1901 return(ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId));
1910 globalPtr->FunctionEntry(
"ExchangeState");
1916 haloPtr->PackMessageBuffers(fluxMessageId,0,1,rhoPtr);
1917 haloPtr->PackMessageBuffers(fluxMessageId,1,numDim,rhoVPtr);
1918 haloPtr->PackMessageBuffers(fluxMessageId,numDim+1,1,rhoEPtr);
1920 haloPtr->SendMessage(fluxMessageId,gridNeighbors,gridPtr->Communicator());
1921 haloPtr->ReceiveMessage(fluxMessageId,gridNeighbors,gridPtr->Communicator());
1923 haloPtr->UnPackMessageBuffers(fluxMessageId,0,1,rhoPtr);
1924 haloPtr->UnPackMessageBuffers(fluxMessageId,1,numDim,rhoVPtr);
1925 haloPtr->UnPackMessageBuffers(fluxMessageId,numDim+1,1,rhoEPtr);
1932 globalPtr->FunctionExit(
"ExchangeState");
1949 globalPtr->FunctionEntry(
"SetParamState");
1957 int paramHandle = paramState.GetDataIndex(
"refRe");
1958 if(paramHandle >= 0){
1960 const double *paramPtr = paramData.
Data<
double>();
1970 int paramHandle = paramState.GetDataIndex(
"inputDiffusivity");
1971 if(paramHandle >= 0){
1973 inputDiffusivity = paramData.
Data<
double>();
1975 inputDiffusivity = NULL;
1980 int paramHandle = paramState.GetDataIndex(
"refPr");
1981 if(paramHandle >= 0){
1983 const double *paramPtr = paramData.
Data<
double>();
2007 int paramHandle = paramState.GetDataIndex(
"nonDimensional");
2008 std::ostringstream statusMsg;
2009 statusMsg << (paramHandle >= 0 ?
"User chose" :
"Defaulting to");
2010 if(paramHandle >= 0){
2012 const int *paramPtr = paramData.
Data<
int>();
2013 nonDimensionalMode = *paramPtr;
2014 statusMsg << (nonDimensionalMode==1 ?
" non-dimensional " :
2015 nonDimensionalMode==2 ?
" PlasComCM-non-dimensional " :
2018 nonDimensionalMode = 1;
2019 statusMsg <<
" non-dimensional ";
2021 statusMsg <<
"mode." << std::endl;
2023 globalPtr->StdOut(statusMsg.str());
2025 std::cout << statusMsg.str();
2034 bool haveRefRho =
false;
2035 bool haveRefPressure =
false;
2036 bool haveRefTemperature =
false;
2038 int paramHandle = paramState.GetDataIndex(
"refRho");
2039 if(paramHandle >= 0){
2041 ¶mData(paramState.Field(paramHandle));
2042 const double *paramPtr = paramData.
Data<
double>();
2049 int paramHandle = paramState.GetDataIndex(
"refPressure");
2050 if(paramHandle >= 0){
2052 ¶mData(paramState.Field(paramHandle));
2053 const double *paramPtr = paramData.
Data<
double>();
2054 refPressure = *paramPtr;
2055 haveRefPressure =
true;
2060 int paramHandle = paramState.GetDataIndex(
"refTemperature");
2061 if(paramHandle >= 0){
2063 ¶mData(paramState.Field(paramHandle));
2064 const double *paramPtr = paramData.
Data<
double>();
2065 refTemperature = *paramPtr;
2066 haveRefTemperature =
true;
2070 if(!(haveRefRho && haveRefPressure && haveRefTemperature)){
2072 refPressure = 101325;
2073 refTemperature = 288.15;
2074 std::ostringstream statusMessage;
2075 statusMessage <<
"Warning: EOS reference state missing or incomplete in input. " << std::endl
2076 <<
"User must specify refRho, refPressure, and refTemperature. " << std::endl
2077 <<
"Setting to default values: " << std::endl
2078 <<
"\t refRho=" << refRho << std::endl
2079 <<
"\t refPressure=" << refPressure << std::endl
2080 <<
"\t refTemperature=" << refTemperature << std::endl
2083 globalPtr->StdOut(statusMessage.str());
2085 std::cout << statusMessage.str();
2090 int paramHandle = paramState.GetDataIndex(
"refLength");
2091 if(paramHandle >= 0){
2093 ¶mData(paramState.Field(paramHandle));
2094 const double *paramPtr = paramData.
Data<
double>();
2095 refLength = *paramPtr;
2098 std::ostringstream statusMessage;
2099 statusMessage <<
"Warning: Could not find refLength in input" << std::endl
2100 <<
"Setting to default value " << refLength << std::endl;
2102 globalPtr->StdOut(statusMessage.str());
2104 std::cout << statusMessage.str();
2116 if(gasModel ==
IDEAL) {
2119 gammaHandle = paramState.GetDataIndex(
"gamma");
2120 if(gammaHandle < 0) {
2121 std::ostringstream statusMessage;
2122 statusMessage <<
"Gamma does not exist in input parameter state." 2123 <<
" Exiting." << std::endl;
2125 globalPtr->StdOut(statusMessage.str());
2126 globalPtr->FunctionExit(
"SetParamState");
2128 std::cout << statusMessage.str();
2134 const double *gammaPtr = gammaData.
Data<
double>();
2136 std::ostringstream statusMessage;
2137 statusMessage <<
"Gamma not defined in input parameter state." 2138 <<
" Exiting." << std::endl;
2140 globalPtr->StdOut(statusMessage.str());
2141 globalPtr->FunctionExit(
"SetParamState");
2143 std::cout << statusMessage.str();
2148 eosPtr->SetGamma(*gammaPtr);
2150 std::ostringstream statusMessage;
2151 statusMessage <<
"Error: Unknown gas model selected." << gasModel
2152 <<
" Exiting." << std::endl;
2154 globalPtr->StdOut(statusMessage.str());
2155 globalPtr->FunctionExit(
"SetParamState");
2157 std::cout << statusMessage.str();
2163 if(transportModel ==
POWER) {
2166 powerHandle = paramState.GetDataIndex(
"power");
2167 if(powerHandle < 0) {
2168 std::ostringstream statusMessage;
2169 statusMessage <<
"Power does not exist in input parameter state." << std::endl
2170 <<
" Required for the Power Law transport model." << std::endl
2171 <<
" Exiting." << std::endl;
2173 globalPtr->StdOut(statusMessage.str());
2174 globalPtr->FunctionExit(
"SetParamState");
2176 std::cout << statusMessage.str();
2182 &powerData(paramState.Field(powerHandle));
2183 powerPtr = powerData.
Data<
double>();
2185 std::ostringstream statusMessage;
2186 statusMessage <<
"Power not defined in input parameter state." << std::endl
2187 <<
"Required for the Power Law transport model." << std::endl
2188 <<
"Example: power=2/3 for air." << std::endl
2189 <<
"Exiting." << std::endl;
2191 globalPtr->StdOut(statusMessage.str());
2192 globalPtr->FunctionExit(
"SetParamState");
2194 std::cout << statusMessage.str();
2201 betaHandle = paramState.GetDataIndex(
"beta");
2202 if(betaHandle < 0) {
2203 std::ostringstream statusMessage;
2204 statusMessage <<
"beta does not exist in input parameter state." << std::endl
2205 <<
"Required for the beta Law transport model." << std::endl
2206 <<
"Exiting." << std::endl;
2208 globalPtr->StdOut(statusMessage.str());
2209 globalPtr->FunctionExit(
"SetParamState");
2211 std::cout << statusMessage.str();
2217 &betaData(paramState.Field(betaHandle));
2218 betaPtr = betaData.
Data<
double>();
2220 std::ostringstream statusMessage;
2221 statusMessage <<
"beta not defined in input parameter state." << std::endl
2222 <<
"Required for the beta Law transport model." << std::endl
2223 <<
"Example: beta=4.093*10^-7 for air." << std::endl
2224 <<
"Exiting." << std::endl;
2226 globalPtr->StdOut(statusMessage.str());
2227 globalPtr->FunctionExit(
"SetParamState");
2229 std::cout << statusMessage.str();
2236 bulkViscFacHandle = paramState.GetDataIndex(
"bulkViscFac");
2237 if(bulkViscFacHandle < 0) {
2238 std::ostringstream statusMessage;
2239 statusMessage <<
"bulkViscFac does not exist in input parameter state." << std::endl
2240 <<
"Required for the bulkViscFac Law transport model."<< std::endl
2241 <<
"Exiting." << std::endl;
2243 globalPtr->StdOut(statusMessage.str());
2244 globalPtr->FunctionExit(
"SetParamState");
2246 std::cout << statusMessage.str();
2252 &bulkViscFacData(paramState.Field(bulkViscFacHandle));
2253 bulkViscFacPtr = bulkViscFacData.
Data<
double>();
2254 if(!bulkViscFacPtr) {
2255 std::ostringstream statusMessage;
2256 statusMessage <<
"bulkViscFac not defined in input parameter state." << std::endl
2257 <<
"Required for the bulkViscFac Law transport model."<< std::endl
2258 <<
"Example: bulkViscFac=0.6 for air." << std::endl
2259 <<
"Exiting." << std::endl;
2261 globalPtr->StdOut(statusMessage.str());
2262 globalPtr->FunctionExit(
"SetParamState");
2264 std::cout << statusMessage.str();
2268 bulkViscFac = *bulkViscFacPtr;
2271 std::ostringstream statusMessage;
2272 statusMessage <<
"Error: Unknown transport model selected." 2273 << transportModel <<
" Exiting." << std::endl;
2275 globalPtr->StdOut(statusMessage.str());
2276 globalPtr->FunctionExit(
"SetParamState");
2278 std::cout << statusMessage.str();
2287 if(gasModel ==
IDEAL) {
2288 double gamma = eosPtr->GetGamma();
2289 if(nonDimensionalMode == 1){
2291 refSpecGasConst = refPressure/refRho/refTemperature;
2292 refVelocity = sqrt(refPressure/refRho);
2293 refSndSpd = refVelocity*sqrt(gamma);
2294 refEnergy = refPressure/(gamma-1.0)/refRho;
2295 refCp = refSpecGasConst*gamma/(gamma-1.0);
2296 refCv = refCp-refSpecGasConst;
2299 pressureScale = refPressure;
2300 temperatureScale = refTemperature;
2301 velocityScale = refVelocity;
2303 }
else if(nonDimensionalMode == 2){
2305 specGasConst = (gamma-1)/gamma;
2306 refSpecGasConst = refPressure/refRho/refTemperature;
2307 refVelocity = sqrt(gamma*refPressure/refRho);
2308 refSndSpd = refVelocity;
2309 refEnergy = refPressure/(gamma-1.0)/refRho;
2310 refCp = refSpecGasConst*gamma/(gamma-1.0);
2311 refCv = refCp-refSpecGasConst;
2313 pressureScale = refRho*refSndSpd*refSndSpd;
2314 temperatureScale = (gamma-1)*refTemperature;
2315 velocityScale = refSndSpd;
2317 std::ostringstream statusMessage;
2318 statusMessage <<
"Enabling legacy PlasComCM nonDimensionalization mode." << std::endl;
2320 globalPtr->StdOut(statusMessage.str());
2322 std::cout << statusMessage.str();
2327 refVelocity = sqrt(refPressure/refRho);
2328 specGasConst = refPressure/refRho/refTemperature;
2329 refSndSpd = refVelocity*sqrt(gamma);
2330 refCp = specGasConst*gamma/(gamma-1.0);
2331 refCv = refCp-specGasConst;
2332 refEnergy = refPressure/(gamma-1.0)/refRho;
2336 refTemperature = 1.0;
2338 refSpecGasConst = 1.0;
2340 pressureScale = 1.0;
2341 temperatureScale = 1.0;
2342 velocityScale = 1.0;
2345 eosPtr->SetSpecificGasConstant(specGasConst);
2346 eosPtr->InitializeMaterialProperties();
2354 if(nonDimensionalMode != 0){
2355 refMu = refRho*refVelocity*refLength/refRe;
2356 refKappa = refCp*refMu/refPr;
2367 if(nonDimensionalMode == 1){
2368 if(transportModel ==
POWER){
2371 }
else if(nonDimensionalMode == 2){
2372 double gamma = eosPtr->GetGamma();
2373 if(transportModel ==
POWER){
2375 beta = pow(gamma-1,power);
2383 std::ostringstream refStateMsg;
2384 refStateMsg <<
"EulerRHS Reference State: " << std::endl
2385 <<
"Reynolds Number: \t" << refRe << std::endl
2386 <<
"Prandtl Number: \t" << refPr << std::endl
2388 <<
"Length Reference: \t" << refLength << std::endl
2389 <<
"Density Reference: \t" << refRho << std::endl
2390 <<
"Pressure Reference: \t" << refPressure << std::endl
2391 <<
"Temperature Reference: \t" << refTemperature << std::endl
2393 <<
"Specific Gas Constant Reference: \t" << refSpecGasConst << std::endl
2394 <<
"Energy Reference: \t" << refEnergy << std::endl
2395 <<
"Velocity Reference: \t" << refVelocity << std::endl
2396 <<
"Speed of Sound Reference: \t" << refSndSpd << std::endl
2397 <<
"Cp Reference: \t" << refCp << std::endl
2398 <<
"Cv Reference: \t" << refCv << std::endl;
2400 if(nonDimensionalMode == 0) {
2401 refStateMsg <<
"EulerRHS set to run in dimensional mode." << std::endl
2402 <<
"Specific Gas Constant: \t" << specGasConst << std::endl
2403 <<
"Speed of sound: \t" << refSndSpd << std::endl
2404 <<
"Cp: \t" << eosPtr->GetHeatCapacityCp() << std::endl
2405 <<
"Cv: \t" << eosPtr->GetHeatCapacityCv() << std::endl;
2409 globalPtr->StdOut(refStateMsg.str());
2411 std::cout << refStateMsg.str();
2414 std::ostringstream paramStatusMsg;
2420 int inputCFLHandle = paramState.GetDataIndex(
"inputCFL");
2421 if(inputCFLHandle >= 0){
2423 const double *inCFLPtr = cflData.
Data<
double>();
2424 inputCFL = *inCFLPtr;
2425 paramStatusMsg <<
"Input CFL = " << inputCFL << std::endl;
2429 paramStatusMsg <<
"Defaulting CFL = " << inputCFL << std::endl;
2434 int inputDTHandle = paramState.GetDataIndex(
"inputDT");
2435 if(inputDTHandle >= 0){
2437 const double *inputDTPtr = inputDTData.
Data<
double>();
2438 inputDT = *inputDTPtr;
2439 paramStatusMsg <<
"Input DT = " << inputDT << std::endl;
2443 paramStatusMsg <<
"User-specified DT is invalid, defaulting to CONSTANT_CFL mode." 2447 sigmaHandle = paramState.GetDataIndex(
"sigmaDissipation");
2448 if(sigmaHandle >= 0){
2450 sigmaPtr = sigmaData.
Data<
double>();
2451 inputSigma = *sigmaPtr;
2457 int sigmaDilHandle = paramState.GetDataIndex(
"sigmaDilatation");
2458 if(sigmaDilHandle >= 0){
2460 sigmaDilPtr = sigmaData.
Data<
double>();
2461 inputSigmaDil = *sigmaDilPtr;
2464 inputSigmaDil = 0.0;
2468 if(inputSigma > 0.0 || inputSigmaDil > 0.0){
2469 artificialDissipation =
true;
2471 if(artificialDissipation){
2472 if(inputSigma < 0 || inputSigmaDil < 0){
2480 int paramHandle = paramState.GetDataIndex(
"Flags");
2481 if(paramHandle >= 0){
2483 const int *paramPtr = paramData.
Data<
int>();
2484 int optionFlags = *paramPtr;
2489 useWENO = optionFlags&
USEWENO;
2493 paramStatusMsg <<
"EulerRHS: Viscous flow, enabling DV exchange." << std::endl;
2496 if(artificialDissipation){
2497 paramStatusMsg <<
"EulerRHS: Artificial dissipation ON.";
2499 paramStatusMsg <<
" Enabling DV exchange.";
2500 paramStatusMsg << std::endl;
2504 paramStatusMsg <<
"EulerRHS: Enabling flux exchange." << std::endl;
2512 globalPtr->StdOut(paramStatusMsg.str());
2513 globalPtr->FunctionExit(
"SetParamState");
2516 std::cout << paramStatusMsg.str();
2526 if(!gridInitialized)
2529 baseStatePtr = &inState;
2531 timeHandle = inState.GetDataIndex(
"simTime");
2535 timePtr = timeData.
Data<
double>();
2540 cflHandle = inState.GetDataIndex(
"simCFL");
2543 cflPtr = cflData.
Data<
double>();
2546 dtHandle = inState.GetDataIndex(
"simDT");
2549 dtPtr = dtData.
Data<
double>();
2553 rhoHandle = inState.GetFieldHandle(
"rho");
2557 rhoPtr = rhoData.
Data<
double>();
2562 rhoVHandle = inState.GetFieldHandle(
"rhoV");
2566 rhoVPtr = rhoVData.
Data<
double>();
2571 rhoEHandle = inState.GetFieldHandle(
"rhoE");
2575 rhoEPtr = rhoEData.
Data<
double>();
2579 pressureHandle = inState.GetDataIndex(
"pressure");
2580 if(pressureHandle >= 0){
2582 pressurePtr = pressureData.
Data<
double>();
2585 temperatureHandle = inState.GetDataIndex(
"temperature");
2586 if(temperatureHandle >= 0){
2588 temperaturePtr = temperatureData.
Data<
double>();
2592 rhom1Handle = inState.GetDataIndex(
"rhom1");
2593 if(rhom1Handle >= 0){
2595 rhom1Ptr = rhom1Data.
Data<
double>();
2598 velocityHandle = inState.GetDataIndex(
"velocity");
2599 if(velocityHandle >= 0){
2601 velocityPtr = velocityData.
Data<
double>();
2604 internalEnergyHandle = inState.GetDataIndex(
"internalEnergy");
2605 if(internalEnergyHandle >= 0){
2607 internalEnergyPtr = internalEnergyData.
Data<
double>();
2611 scalarHandle = inState.GetFieldHandle(
"scalarVars");
2612 if(scalarHandle >= 0){
2613 int scalarDataIndex = inState.GetFieldIndexByHandle(scalarHandle);
2615 numScalar = inState.Meta()[scalarDataIndex].ncomp;
2616 scalarPtr = scalarData.Data<
double>();
2625 int scalarGradHandle = inState.GetDataIndex(
"scalarGrad");
2626 if(scalarGradHandle >= 0){
2628 scalarGrad = gradData.
Data<
double>();
2635 int stencilConnHandle = inState.GetDataIndex(
"sconn");
2636 if(stencilConnHandle >= 0){
2641 stencilConn = scData.
Data<
int>();
2648 int iMaskHandle = inState.GetDataIndex(
"imask");
2649 if(iMaskHandle >= 0){
2651 iMask = imData.
Data<
int>();
2658 int dilatationHandle = inState.GetDataIndex(
"divV");
2659 if(dilatationHandle >= 0){
2661 velDiv = dilData.
Data<
double>();
2669 muHandle = inState.GetDataIndex(
"mu");
2672 muPtr = muData.
Data<
double>();
2678 lambdaHandle = inState.GetDataIndex(
"lambda");
2679 if(lambdaHandle >= 0 ){
2681 lambdaPtr = lambdaData.
Data<
double>();
2687 kappaHandle = inState.GetDataIndex(
"kappa");
2688 if(kappaHandle >= 0){
2690 kappaPtr = kappaData.
Data<
double>();
2695 int diffusivityHandle = inState.GetDataIndex(
"scalarDiffusivity");
2696 if(diffusivityHandle >= 0){
2698 int numDiff = inState.Meta()[diffusivityHandle].ncomp;
2700 std::cerr <<
"Scalar Diffusivities of improper size ( " 2701 << numDiff <<
" != number of scalars (" 2705 scalarDiffusivity = diffusivityData.Data<
double>();
2707 scalarDiffusivity = NULL;
2712 myStateBuffers.resize(numEquations+1,NULL);
2716 myStateBuffers[iEquation++] = rhoPtr;
2717 for(
int iDim = 0;iDim < numDim;iDim++)
2719 myStateBuffers[iEquation++] = rhoEPtr;
2720 for(
int iScalar = 0;iScalar <
numScalar;iScalar++)
2722 myRHSBuffers.resize(numEquations+1,NULL);
2724 if(dvBuffers.empty()){
2734 dvBuffers.resize(numDV);
2740 dvBuffers[0] = pressurePtr;
2743 pressurePtr = dvBuffers[0];
2746 dvBuffers[1] = temperaturePtr;
2749 temperaturePtr = dvBuffers[1];
2752 dvBuffers[2] = rhom1Ptr;
2755 rhom1Ptr = dvBuffers[2];
2759 for(
int iDim = 0;iDim < numDim;iDim++)
2761 if(internalEnergyPtr){
2762 dvBuffers[3+numDim] = internalEnergyPtr;
2765 internalEnergyPtr = dvBuffers[3+numDim];
2769 if(tvBuffers.empty()){
2772 tvBuffers.resize(numTV,NULL);
2776 tvBuffers[0] = muPtr;
2779 muPtr = tvBuffers[0];
2782 tvBuffers[1] = lambdaPtr;
2785 lambdaPtr = tvBuffers[1];
2788 tvBuffers[2] = kappaPtr;
2791 kappaPtr = tvBuffers[2];
2794 if(!scalarDiffusivity){
2797 for(
int iScalar = 0;iScalar <
numScalar;iScalar++){
2799 tvBuffers[3+iScalar] = &scalarDiffusivity[scalarOffset];
2800 double defaultDiffusivity = 1.0;
2801 if(inputDiffusivity){
2802 defaultDiffusivity = inputDiffusivity[iScalar];
2805 scalarDiffusivity[scalarOffset+iPoint] = defaultDiffusivity;
2815 rhsState.AddField(
"vHat",
'n',1,8,
"");
2816 rhsState.AddField(
"viscidEnergy",
'n',3,8,
"");
2817 rhsState.AddField(
"inviscidFlux",
'n',numEquations,8,
"");
2818 rhsState.AddField(
"viscidFlux",
'n',numEquations,8,
"");
2819 rhsState.AddField(
"dFlux",
'n',numEquations,8,
"");
2820 if(refRe > 0 || artificialDissipation){
2821 rhsState.AddField(
"velGrad",
'n',numDim*numDim,8,
"");
2822 if(artificialDissipation){
2823 rhsState.AddField(
"velDiv",
'n',1,8,
"");
2824 rhsState.AddField(
"sigmaDiss",
'n',1,8,
"");
2825 rhsState.AddField(
"alphaDiss",
'n',1,8,
"");
2829 rhsState.AddField(
"tau",
'n',(numDim*(numDim+1))/2,8,
"");
2830 rhsState.AddField(
"temperatureGrad",
'n',numDim,8,
"");
2831 rhsState.AddField(
"heatFlux",
'n',numDim,8,
"");
2832 rhsState.AddField(
"scalarGrad",
'n',numDim*numScalar,8,
"");
2837 velHat = rhsState.template GetFieldBuffer<double>(
"vHat");
2838 viscidEnergy = rhsState.template GetFieldBuffer<double>(
"viscidEnergy");
2839 if(artificialDissipation){
2841 rhsState.SetFieldBuffer(
"velDiv",velDiv);
2843 velDiv = rhsState.template GetFieldBuffer<double>(
"velDiv");
2846 alphaDissipation = rhsState.template GetFieldBuffer<double>(
"alphaDiss");
2849 alphaDissipation = NULL;
2852 velocityHandle = inState.GetDataIndex(
"velocity");
2853 if(velocityHandle >= 0){
2855 velocityPtr = velocityData.
Data<
double>();
2859 if(inviscidFluxBuffers.empty()){
2860 inviscidFluxBuffers.resize(numEquations);
2862 int inviscidFluxHandle = rhsState.GetDataIndex(
"inviscidFlux");
2863 inviscidFluxBuffer = rhsState.GetRealFieldBuffer(inviscidFluxHandle);
2864 for(
int i=0;i<numEquations;i++){
2869 if(viscidFluxBuffers.empty()){
2870 viscidFluxBuffers.resize(numEquations);
2872 int viscidFluxHandle = rhsState.GetDataIndex(
"viscidFlux");
2873 viscidFluxBuffer = rhsState.GetRealFieldBuffer(viscidFluxHandle);
2874 for(
int i=0;i<numEquations;i++){
2879 if(dFluxBuffers.empty()){
2880 dFluxBuffers.resize(numEquations);
2882 int dFluxHandle = rhsState.GetDataIndex(
"dFlux");
2883 dFluxBuffer = rhsState.GetRealFieldBuffer(dFluxHandle);
2884 for(
int i=0;i<numEquations;i++){
2889 if(velGradBuffers.empty()){
2890 velGradBuffers.resize(numDim);
2892 int velGradHandle = rhsState.GetDataIndex(
"velGrad");
2893 velGradBufferPtr = rhsState.GetRealFieldBuffer(velGradHandle);
2894 for(
int i=0;i<numDim;i++){
2898 if(scalarGrad == NULL)
2899 scalarGrad = rhsState.GetRealFieldBuffer(rhsState.GetDataIndex(
"scalarGrad"));
2901 rhsState.SetFieldBuffer(
"scalarGrad",scalarGrad);
2903 if(tauBuffers.empty()){
2904 tauBuffers.resize(numDim*numDim);
2906 int tauHandle = rhsState.GetDataIndex(
"tau");
2907 tauBufferPtr = rhsState.GetRealFieldBuffer(tauHandle);
2912 size_t bufferIndex = 0;
2913 for(
int i=0;i<numDim;i++){
2914 for(
int j=0;j<numDim;j++){
2915 int index = i*numDim + j;
2917 tauBuffers[index] = &tauBufferPtr[bufferIndex];
2920 tauBuffers[index] = tauBuffers[j*numDim+i];
2926 if(temperatureGradBuffers.empty()){
2927 temperatureGradBuffers.resize(numDim);
2929 int temperatureGradHandle = rhsState.GetDataIndex(
"temperatureGrad");
2930 temperatureGradBufferPtr = rhsState.GetRealFieldBuffer(temperatureGradHandle);
2931 for(
int i=0;i<numDim;i++){
2932 temperatureGradBuffers[i] = &temperatureGradBufferPtr[i*
numPointsBuffer];
2935 if(heatFluxBuffers.empty()){
2936 heatFluxBuffers.resize(numDim);
2938 int heatFluxHandle = rhsState.GetDataIndex(
"heatFlux");
2939 heatFluxBufferPtr = rhsState.GetRealFieldBuffer(heatFluxHandle);
2941 for(
int i=0;i<numDim;i++){
2950 eosPtr->SetupPressureBuffer(pressurePtr);
2951 eosPtr->SetupTemperatureBuffer(temperaturePtr);
2952 eosPtr->SetupSpecificVolumeBuffer(rhom1Ptr);
2953 eosPtr->SetupInternalEnergyBuffer(internalEnergyPtr);
2955 dScalarHandle = scalarHandle;
2957 stateInitialized =
true;
2965 if(!stateInitialized)
2968 targetState.CopyStateData(inState);
2970 int rhoTargetHandle = inState.GetDataIndex(
"rhoTarget");
2971 int rhoETargetHandle = -1;
2972 int rhoVTargetHandle = -1;
2973 int scalarTargetHandle = -1;
2975 bool targetData =
false;
2977 if(rhoTargetHandle < 0){
2978 rhoTargetHandle = targetState.GetDataIndex(
"rho");
2979 rhoVTargetHandle = targetState.GetDataIndex(
"rhoV");
2980 rhoETargetHandle = targetState.GetDataIndex(
"rhoE");
2982 scalarTargetHandle = targetState.GetDataIndex(
"scalarVars");
2986 rhoVTargetHandle = inState.GetDataIndex(
"rhoVTarget");
2987 rhoETargetHandle = inState.GetDataIndex(
"rhoETarget");
2989 scalarTargetHandle = inState.GetDataIndex(
"scalarVarsTarget");
2992 if(rhoTargetHandle < 0 ||
2993 rhoVTargetHandle < 0 ||
2994 rhoETargetHandle < 0 ||
2995 (
numScalar > 0 && scalarTargetHandle < 0)){
2996 std::cerr <<
"RHS Target Handles problem: " << rhoTargetHandle <<
" " 2997 << rhoVTargetHandle <<
" " << rhoETargetHandle << std::endl;
3003 targetState.SetFieldBuffer(
"rho",inState.GetRealFieldBuffer(rhoTargetHandle));
3004 targetState.SetFieldBuffer(
"rhoV",inState.GetRealFieldBuffer(rhoVTargetHandle));
3005 targetState.SetFieldBuffer(
"rhoE",inState.GetRealFieldBuffer(rhoETargetHandle));
3007 targetState.SetFieldBuffer(
"scalarVars",inState.GetRealFieldBuffer(scalarTargetHandle));
3010 rhoTargetPtr = targetState.GetRealFieldBufferByHandle(rhoHandle);
3011 rhoVTargetPtr = targetState.GetRealFieldBufferByHandle(rhoVHandle);
3012 rhoETargetPtr = targetState.GetRealFieldBufferByHandle(rhoEHandle);
3014 scalarTargetPtr = targetState.GetRealFieldBufferByHandle(scalarHandle);
3017 targetStateBuffers.resize(0);
3018 int numTargetVars = numEquations+1;
3019 targetStateBuffers.resize(numTargetVars,NULL);
3022 targetStateBuffers[iEquation++] = rhoTargetPtr;
3023 for(
int iDim = 0;iDim < numDim;iDim++)
3024 targetStateBuffers[iEquation++] = &rhoVTargetPtr[iDim*
numPointsBuffer];
3025 targetStateBuffers[iEquation++] = rhoETargetPtr;
3028 for(
int iScalar = 0;iScalar <
numScalar;iScalar++)
3029 targetStateBuffers[iEquation++] = &scalarTargetPtr[iScalar*
numPointsBuffer];
3039 if(!stateInitialized)
3042 rhoPtr = inState.GetRealFieldBufferByHandle(rhoHandle);
3043 rhoVPtr = inState.GetRealFieldBufferByHandle(rhoVHandle);
3044 rhoEPtr = inState.GetRealFieldBufferByHandle(rhoEHandle);
3047 myStateBuffers[iEquation++] = rhoPtr;
3048 for(
int iDim = 0;iDim < numDim;iDim++)
3050 myStateBuffers[iEquation++] = rhoEPtr;
3053 scalarPtr = inState.GetRealFieldBufferByHandle(scalarHandle);
3054 for(
int iScalar = 0;iScalar <
numScalar;iScalar++)
3077 dRhoHandle = rhsState.GetFieldHandle(
"rho");
3078 dRhoVHandle = rhsState.GetFieldHandle(
"rhoV");
3079 dRhoEHandle = rhsState.GetFieldHandle(
"rhoE");
3081 dScalarHandle = rhsState.GetFieldHandle(
"scalarVars");
3084 rhoRHSPtr = rhsState.GetRealFieldBufferByHandle(dRhoHandle);
3085 rhoVRHSPtr = rhsState.GetRealFieldBufferByHandle(dRhoVHandle);
3086 rhoERHSPtr = rhsState.GetRealFieldBufferByHandle(dRhoEHandle);
3089 scalarRHSPtr = rhsState.GetRealFieldBufferByHandle(dScalarHandle);
3091 scalarRHSPtr = NULL;
3094 myRHSBuffers[iEquation++] = rhoRHSPtr;
3095 for(
int iDim = 0;iDim < numDim;iDim++)
3097 myRHSBuffers[iEquation++] = rhoERHSPtr;
3098 for(
int iScalar = 0;iScalar <
numScalar;iScalar++)
3113 if(!operatorInitialized)
3132 if(artificialDissipation){
3147 boundaryDepth,&periodicDirs[0],
3150 if(artificialDissipation){
3152 artDissOperator.boundaryDepth,&periodicDirs[0],
3156 artDissOperatorSplit.boundaryDepth,&periodicDirs[0],
3157 artDissConnSplit,
true);
3200 if(!operatorInitialized){
3201 myOperator.Copy(inOperator);
3208 boundaryDepth = myOperator.boundaryDepth;
3209 boundaryWeight = myOperator.boundaryWeight;
3210 numStencilValues = myOperator.numValues;
3213 for(
int iStencil = 0;iStencil <
numStencils;iStencil++)
3215 operatorInitialized =
true;
3217 if(artificialDissipation){
3218 int interiorOrderAD = (myOperator.overallOrder-1)*2;
3220 std::cerr <<
"RHS ERROR: Artificial dissipation operator failed to initialize." << std::endl;
3222 operatorInitialized =
false;
3224 int *startPtr = artDissOperator.stencilStarts;
3225 int numStencilsAD = artDissOperator.numStencils;
3227 for(
int iStencil = 0;iStencil < numStencilsAD;iStencil++)
3228 startPtr[iStencil]++;
3229 startPtr = artDissOperatorSplit.stencilStarts;
3230 numStencilsAD = artDissOperator.numStencils;
3231 for(
int iStencil = 0;iStencil < numStencilsAD;iStencil++)
3232 startPtr[iStencil]++;
3239 operatorInitialized =
false;
3244 if(SetupStencilConnectivities())
3247 gridPtr->SetupDifferentialOperator(&myOperator,&stencilConn[0]);
3248 std::ostringstream metricMessages;
3249 if(gridPtr->ComputeMetrics(metricMessages)){
3250 std::ostringstream failMessage;
3251 failMessage <<
"euler::rhs::SetupOperators: Error: grid::ComputeMetrics failed " 3252 <<
"with messages:" << std::endl << metricMessages.str() << std::endl;
3254 globalPtr->ErrOut(failMessage.str());
3256 std::cout << failMessage.str();
3261 globalPtr->StdOut(
"Grid metric messages:\n",3);
3262 globalPtr->StdOut(metricMessages.str());
3264 std::cout <<
"Grid metric messages:\n" << metricMessages.str() << std::endl;
3268 int gridMetricsHandle = baseStatePtr->GetDataIndex(
"gridMetrics");
3269 if(gridMetricsHandle >= 0){
3270 std::vector<double>
gridMetric(gridPtr->Metric());
3271 baseStatePtr->SetFieldBuffer(
"gridMetrics",&
gridMetric[0]);
3285 bool inParallel =
false;
3288 inParallel = omp_in_parallel();
3290 myThreadId = omp_get_thread_num();
3291 numThreads = omp_get_num_threads();
3297 fortranBufferIntervals.resize(numThreads);
3298 fortranPartitionBufferIntervals.resize(numThreads);
3305 std::vector<pcpp::IndexIntervalType> &threadPartitionBufferIntervals(gridPtr->ThreadPartitionBufferIntervals());
3306 if(threadPartitionBufferIntervals.size() != numThreads)
3309 threadPartitionBufferIntervals[myThreadId].Flatten(fortranPartitionBufferIntervals[myThreadId]);
3311 std::vector<pcpp::IndexIntervalType> &threadBufferIntervals(gridPtr->ThreadBufferIntervals());
3312 if(threadBufferIntervals.size() != numThreads)
3314 threadBufferIntervals[myThreadId].Flatten(fortranBufferIntervals[myThreadId]);
3317 std::vector<size_t>::iterator opIt = fortranPartitionBufferIntervals[myThreadId].begin();
3318 while(opIt != fortranPartitionBufferIntervals[myThreadId].end()){
3323 std::vector<size_t>::iterator bufIt = fortranBufferIntervals[myThreadId].begin();
3324 while(bufIt != fortranBufferIntervals[myThreadId].end()){
3341 numThreads = omp_get_num_threads();
3344 if(gridPtr != &inGrid){
3349 myThreadId = omp_get_thread_num();
3359 partitionInterval = gridPtr->PartitionInterval();
3360 partitionBufferInterval = gridPtr->PartitionBufferInterval();
3361 numPointsPartition = partitionInterval.NNodes();
3364 gridCommPtr = &gridPtr->Communicator();
3365 subRegionsPtr = &gridPtr->SubRegions();
3366 gridCommPtr->CartNeighbors(gridNeighbors);
3377 gridInitialized =
true;
3403 std::vector<size_t>::iterator opIt =
opInterval.begin();
3410 InitThreadIntervals();
3427 if(periodicDirs.empty()){
3428 periodicDirs.resize(numDim,1);
3463 void SetDomainBCs(std::vector<BoundaryType> &domainBoundaries,std::vector<BCType> &domainBCs)
3466 domainBCsPtr = &domainBCs;
3467 domainBoundariesPtr = &domainBoundaries;
3468 assert(subRegionsPtr != NULL);
3470 std::vector<GridRegionType> &gridRegions(*subRegionsPtr);
3472 int numBCs = domainBCs.size();
3473 int numGridRegions = gridRegions.size();
3474 int numDomainBoundaries = domainBoundaries.size();
3475 int holeStencil = myOperator.numStencils;
3476 int adHole = artDissOperator.numStencils;
3477 int adSplitHole = artDissOperatorSplit.numStencils;
3478 int adBoundaryDepth = artDissOperator.boundaryDepth;
3479 int adSplitBoundaryDepth = artDissOperatorSplit.boundaryDepth;
3495 std::vector<size_t> partitionBufferExtent;
3496 partitionBufferInterval.Flatten(partitionBufferExtent);
3502 bool haveHoles =
false;
3505 size_t numHoles = gridPtr->FlagMask(iMask,0,
holeMask);
3506 size_t numHolesGrid = 0;
3508 if(numHolesGrid > 0){
3513 typename std::vector<BoundaryType>::iterator dbIt = domainBoundaries.begin();
3514 while(dbIt != domainBoundaries.end()){
3515 BoundaryType &domainBoundary(*dbIt++);
3516 GridRegionType &gridRegion(gridRegions[domainBoundary.
GridRegionID()]);
3518 int boundaryNormalDirection = gridRegion.normalDirection;
3522 BCType &boundaryCondition(domainBoundary.
BC());
3524 int bcType = boundaryCondition.BCType();
3531 partitionBufferInterval,
3533 if(opInterval.
NNodes() > 0) {
3534 std::vector<size_t> opExtents;
3535 opInterval.
Flatten(opExtents);
3549 haloPtr->PackMessageBuffers(maskMessageId,0,1,iMask);
3550 haloPtr->SendMessage(maskMessageId,gridNeighbors,*gridCommPtr);
3551 haloPtr->ReceiveMessage(maskMessageId,gridNeighbors,*gridCommPtr);
3552 haloPtr->UnPackMessageBuffers(maskMessageId,0,1,iMask);
3555 boundaryDepth,
holeMask,iMask,stencilConn);
3558 if(artificialDissipation){
3560 adBoundaryDepth,
holeMask,iMask,artDissConn);
3562 adSplitBoundaryDepth,
holeMask,iMask,artDissConnSplit);
3565 std::string errorMessage(
"rhs::SetDomainBCs:Error: Hole detection failed.\n");
3567 globalPtr->ErrOut(errorMessage);
3569 std::cerr << errorMessage;
3583 virtual int ProcessHalo(HaloType &inHalo,GridType &inGrid,StateType &inState,StateType &rhsState)
3591 {
return(dvBuffers); };
3593 {
return(tvBuffers); };
3595 {
return(myStateBuffers); };
3597 {
return(myRHSBuffers); };
3599 {
return(inviscidFluxBuffer); };
3601 {
return(dFluxBuffer); };
3603 {
return(numEquations); };
3607 {
return(coeffsWENO); };
3609 {
return(velGradBuffers); };
3611 {
return(temperatureGradBuffers); };
3617 minSpacing.resize(numDim,std::numeric_limits<double>::max());
3620 for(
int iDim = 0;iDim < numDim;iDim++){
3621 minSpacing[iDim] = gridDX[iDim];
3659 if(*dtPtr != inputDT){
3693 myThreadId = omp_get_thread_num();
3694 numThreads = omp_get_num_threads();
3714 temperatureHandle = -1;
3715 pressureHandle = -1;
3733 velocityHandle = -1;
3735 internalEnergyHandle = -1;
3738 numPointsPartition = 0;
3744 baseStatePtr = NULL;
3754 rhoTargetPtr = NULL;
3755 rhoVTargetPtr = NULL;
3756 rhoETargetPtr = NULL;
3757 scalarTargetPtr = NULL;
3759 temperaturePtr = NULL;
3763 scalarRHSPtr = NULL;
3765 momentumFluxPtr = NULL;
3766 energyFluxPtr = NULL;
3767 scalarFluxPtr = NULL;
3768 fluxComponentPtr = NULL;
3771 internalEnergyPtr = NULL;
3772 massSourcePtr = NULL;
3773 momentumSourcePtr = NULL;
3774 energySourcePtr = NULL;
3775 scalarSourcePtr = NULL;
3777 viscidFluxBuffer = NULL;
3778 inviscidFluxBuffer = NULL;
3783 viscidEnergy = NULL;
3784 velGradBufferPtr = NULL;
3787 alphaDissipation = NULL;
3791 inputDiffusivity = NULL;
3792 scalarDiffusivity = NULL;
3796 temperatureGradBufferPtr = NULL;
3802 subRegionsPtr = NULL;
3803 domainBoundariesPtr = NULL;
3804 domainBCsPtr = NULL;
3809 artDissConnSplit = NULL;
3814 stateInitialized =
false;
3815 gridInitialized =
false;
3816 threadsInitialized =
false;
3817 operatorInitialized =
false;
3823 scalarMessageId = -1;
int HandleSources(const pcpp::IndexIntervalType ®ionInterval)
void const size_t const size_t const size_t const int const int const double * gridMetric
static const int EXCHANGEDV
subroutine vhatcomponent(numDim, numPointsBuffer, bufferSizes, opInterval, gridType, gridMetric, velDir, velocity, velHatComponent)
int ComputeDVBuffer(const pcpp::IndexIntervalType ®ionInterval, const std::vector< size_t > &bufferSizes, const std::vector< double *> &stateBuffers, std::vector< double *> &dvBuffers)
double * inviscidFluxBuffer
std::vector< double * > & RHSBuffers()
subroutine assignmentyx(numDim, numPoints, bufferSize, bufferInterval, X, Y)
ASSIGNMENTYX point-wise operator performing Y = X.
std::vector< double * > velGradBuffers
int SetTargetState(StateType &inState)
int SetupOperators(OperatorType &inOperator)
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)
std::vector< BCType > * domainBCsPtr
subroutine noslip_isothermal(numDim, bufferSizes, numPointsBuffer, patchNormalDir, patchSizes, numPointsPatch, numPatchPointsOp, patchPointsOp, gridType, gridMetric, jacobianDeterminant, bcParams, gasParams, rhoBuffer, rhoVBuffer, rhoEBuffer, numscalar, scalarBuffer, rhoRHS, rhoVRHS, rhoERHS, scalarRHS, rhoTarget, rhoVTarget, rhoETarget, scalarTarget, muBuffer, lambdaBuffer)
subroutine dissipationweight(numDim, bufferSize, numPoints, bufferInterval, sigmaDissipation, sigmaDilatation, dilatationRamp, dilatationCutoff, divV, sigmaDiss)
double * sigmaDissipation
subroutine ywxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y)
YWXPY point-wise operator performing Y = WX + Y, where all are vectors.
std::vector< int > gridNeighbors
const std::string & Name() const
int InitStep(GridType &inGrid, StateType &inState)
int ComputeTV(int threadId)
void size_t int size_t int size_t int int * stencilSizes
std::vector< double > minSpacing
void GetFlatIndices(const sizeextent &extent, ContainerType &indices) const
int Initialize(GridType &inGrid, StateType &inState, StateType &inParam, OperatorType &inOperator)
std::vector< double > gridMetric
int InitializeState(StateType &inState)
double * momentumSourcePtr
std::vector< size_t > opInterval
std::vector< int > & PeriodicDirs()
pcpp::IndexIntervalType partitionInterval
void Flatten(ContainerType &output) const
std::vector< bool > dvBuffersMine
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 double * X
void UnpackDVMessage(int threadId)
void double double double double double double double *void const size_t const size_t const size_t const double const double const double const double const double double * sigmaDiss
std::vector< std::vector< size_t > > fortranPartitionBufferIntervals
double * temperatureGradBufferPtr
void size_t int size_t int size_t int int int int double int int double * uBuffer
double * fluxComponentPtr
int ViscousFlux(int iDim, int threadId)
int SetupStencilConnectivities()
double * heatFluxBufferPtr
rhs_base_t::BoundaryType BoundaryType
subroutine applyoperator(numDim, dimSizes, numComponents, numPoints, opDir, opInterval, numStencils, stencilSizes, stencilStarts, numValues, stencilWeights, stencilOffsets, stencilID, U, dU)
applyoperator applies an operator specified as a stencil set to the provided state data ...
std::vector< double * > dFluxBuffers
double * scalarDiffusivity
std::vector< std::vector< size_t > > fortranBufferIntervals
std::vector< size_t > bufferSizes
virtual int ProcessBoundary(GridType &inGrid, StateType &inState, StateType &rhsState)
std::vector< std::vector< double * > > haloDVBuffers
rhs_base_t::BCType BCType
void ReconstPointVal(double vals[], CoeffsWENO &coeffs, int group, double &pVal)
int ExchangeState(int threadId)
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)
std::vector< double * > dvBuffers
virtual int ProcessInterior(GridType &inGrid, StateType &inState, StateType &rhsState)
void size_t int size_t int size_t int int int * stencilStarts
void const size_t const size_t * gridSizes
double EntropyFixEta(int n, double lambdaL[], double lambdaR[])
void RenewStream(std::ostringstream &outStream)
double * internalEnergyPtr
simulation::grid::subregion GridRegionType
void const size_t const size_t const size_t const int const int const double const double const double const double const double * velHat
void GridScaleRHS(int threadId)
WENO::CoeffsWENO & WENOCoefficients()
int PrepareBuffers(int threadId)
void const size_t const size_t const size_t const int const int * gridType
static const int holeMask
void SpongeZone(const std::vector< size_t > &bufferSizes, int normalDir, const pcpp::IndexIntervalType &spongeRegion, const pcpp::IndexIntervalType &partitionOpInterval, const pcpp::IndexIntervalType &opBufferInterval, const double *bcParams, const int *bcFlags, const int *iMask, const int disabledMask, const int numEquations, const std::vector< double *> &stateBuffers, const std::vector< double *> &targetBuffers, std::vector< double *> &rhsBuffers)
int ComputeTemperatureGrad(int threadId)
void const size_t const size_t const size_t * opInterval
subroutine yxy(numDim, numPoints, bufferSize, bufferInterval, X, Y)
YXY point-wise operator performing Y = XY (all vectors)
subroutine scalarflux1d(numDim, numPoints, gridSizes, opInterval, numScalars, scalarBuffer, velHat, fluxBuffer)
Flux for scalar transport.
std::vector< double * > myStateBuffers
int HandleSources(int myThreadId)
void const size_t const size_t const size_t const int const double const int const double * velocity
subroutine assignmentxa(numDim, numPoints, bufferSize, bufferInterval, a, X)
ASSIGNMENTXA point-wise operator performing X = scalar a.
int ComputeVelDiv(int threadId)
simulation::rhs::domain_base< GridType, StateType, OperatorType > rhs_base_t
int SetupRHS(GridType &inGrid, StateType &inState, StateType &rhsState, int myThreadId=0)
std::vector< double * > & DVBuffers()
subroutine strongflux1d(numDim, fluxDir, gridSizes, numPoints, opInterval, gridType, gridMetric, tauBuffer, energyBuffer, fluxBuffer)
Compute the curvilinear cartesian viscous fluxes in 1 dimension.
int ComputeHeatFlux(int threadId)
int ComputeDV(int threadId)
double * velGradBufferPtr
int DetectHoles(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int holeBit, int *inMask, int *stencilID)
Detect unstructured holes and set up boundary stencil id's accordingly.
eos::perfect_gas * perfectGasPtr
static const int HEATFLUX
OperatorType artDissOperatorSplit
std::vector< double * > inviscidFluxBuffers
int ComputeScalarGradient(double *scalarData, double *gradData, int threadId=0, bool communicateData=false)
std::vector< double * > & StateBuffers()
void size_t int size_t int size_t int int int int double int * stencilOffsets
int ExchangeInviscidFlux(int threadId)
subroutine ijkgradtoxyzdiv(numDim, numPoints, gridSizes, opInterval, gridType, gridJacobian, gridMetric, gradVBuffer, divBuffer)
int CreateMessageBuffers(int numComponents, int componentSize=8)
subroutine farfield(numDim, bufferSizes, numPointsBuffer, patchNormalDir, patchSizes, numPointsPatch, numPatchPointsOp, patchPointsOp, gridType, gridMetric, jacobianDeterminant, bcParams, gasParams, rhoBuffer, rhoVBuffer, rhoEBuffer, viscousFluxBuffer, numscalar, scalarBuffer, rhoRHS, rhoVRHS, rhoERHS, scalarRHS, rhoTarget, rhoVTarget, rhoETarget, scalarTarget)
int SetRHSState(StateType &rhsState)
pcpp::IndexIntervalType partitionBufferInterval
double * InviscidFluxBuffer()
int ApplyOperator(int dDir, int numComponents, double *uBuffer, double *duBuffer, int threadId, bool skipDensity=false)
std::vector< double > gridDX
void UnpackBufferMessage(int messageId, int numEquations, double *dataBuffer, int threadId)
int ComputeConcentrationGrad(int threadId)
int InitThreadIntervals()
int SetParamState(const StateType ¶mState)
void const size_t const size_t const int const size_t const size_t const size_t const size_t const int const double const double const double const double const double const double const double const double const int * numScalar
static const int EXCHANGEFLUX
int ExchangeDV(int threadId)
int Initialize(GridType &inGrid, StateType &inState, StateType &inParam, StateType &targetState, OperatorType &inOperator)
OperatorType artDissOperator
subroutine flux1d(numDim, numPoints, gridSizes, opInterval, fluxDir, gridType, gridMetric, rhoBuffer, rhoVBuffer, rhoEBuffer, velHat, pressureBuffer, fluxBuffer)
int Initialize(stencilset &stencilSet1, stencilset &stencilSet2, int interiorOrder)
std::vector< double * > targetStateBuffers
const double * bulkViscFacPtr
double * viscidFluxBuffer
std::vector< int > periodicDirs
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.
void Project(int n, int m, double T[], double vals[], double res[])
std::vector< double * > heatFluxBuffers
static const int CONCGRAD
subroutine slip_adiabatic(numDim, bufferSizes, numPointsBuffer, patchNormalDir, patchSizes, numPointsPatch, numPatchPointsOp, patchPointsOp, gridType, gridMetric, jacobianDeterminant, bcParams, gasParams, rhoBuffer, rhoVBuffer, rhoEBuffer, numscalar, scalarBuffer, rhoRHS, rhoVRHS, rhoERHS, scalarRHS, rhoTarget, rhoVTarget, rhoETarget, scalarTarget)
Main encapsulation of MPI.
std::vector< double * > & TVBuffers()
int ExchangeBuffer(int messageId, int numEquations, double *dataBuffer, int threadId)
void AccumulateToRHS(double a, double *dfBuffer, int threadId, bool skipDensity=false)
void LinearSponge(const std::vector< size_t > &bufferSizes, int normalDir, const pcpp::IndexIntervalType &spongeRegion, const pcpp::IndexIntervalType &partitionOpInterval, const pcpp::IndexIntervalType &opBufferInterval, const double *bcParams, const int *bcFlags, const int numEquations, const std::vector< double *> &stateBuffers, const std::vector< double *> &targetBuffers, std::vector< double *> &rhsBuffers)
base API for equations of state
int CreateStencilConnectivity(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int *stencilID, bool fortranInterval=false)
Creates simple stencil connectivity assuming all domain boundaries are physical boundaries.
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
sizeextent RelativeTranslation(const sizeextent &inOrigin, const sizeextent &inDestination) const
std::vector< double * > viscidFluxBuffers
virtual int ProcessInterior2(GridType &inGrid, StateType &inState, StateType &rhsState)
std::vector< size_t > gridSizes
std::vector< double * > tvBuffers
subroutine gradijktogradxyz(numDim, numPoints, gridSizes, opInterval, gridType, gridJacobian, gridMetric, gradIJK, gradXYZ)
Converts Cartesian (computational) gradient to physical coordinates.
subroutine alphaweight(numDim, numPointsBuffer, bufferSizes, opInterval, gridType, gridMetric, alphaDir, alphaW)
std::vector< BoundaryType > * domainBoundariesPtr
int ComputeViscidEnergyFlux(int threadId)
WENO::CoeffsWENO coeffsWENO
simulation::grid::halo HaloType
void size_t int size_t int size_t int int int int double int int double double * duBuffer
void const size_t const size_t const size_t const int const double * gridJacobian
int ComputeVelGrad(int threadId)
int ApplyDissipationOperator(int dDir, int numComponents, double *uBuffer, double *duBuffer, bool split=false, int threadId=0)
fixtures::CommunicatorType * gridCommPtr
double TimeStep(double *outCFL=NULL)
void const size_t const size_t * bufferSizes
size_t numPointsPartition
double * alphaDissipation
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 double double * Y
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
std::vector< double * > myRHSBuffers
Perfect Gas Equation of State.
int HandleBoundaryConditions(int threadId)
void const size_t const size_t const int const size_t const size_t const size_t const size_t const int const double const double const double const double * gasParams
subroutine zxy(numDim, numPoints, bufferSize, bufferInterval, X, Y, Z)
ZXY point-wise operator performing Z = XY (all vectors)
bool artificialDissipation
void double double double double double double double *void const size_t const size_t const size_t const double * sigmaDissipation
virtual int ProcessHalo(HaloType &inHalo, GridType &inGrid, StateType &inState, StateType &rhsState)
void size_t int size_t int size_t int int int int double * stencilWeights
void size_t int size_t int size_t int * numStencils
std::vector< double * > tauBuffers
std::vector< std::vector< double * > > haloFluxBuffers
void AccumulateViscousFluxes(double a, std::vector< double *> &X, std::vector< double *> &Y, int threadId, bool fullInterval=false)
int InviscidFlux(int iDim, int threadId)
int ComputeStressTensor(int threadId)
std::vector< double > gridDXM1
void PackDVMessage(int threadId)
std::vector< size_t > Sizes() const
void ExchangeBufferMessage(int messageId)
int ApplyWENO(int iDim, int threadId)
std::vector< double * > temperatureGradBuffers
subroutine yaxpy(N1, N2, N3, localInterval, a, X, Y)
int HaloSetup(HaloType &inHalo)
int ArtificialDissipation(int threadId)
Simple Block Structured Mesh object.
int SetHalo(HaloType &inHalo)
void size_t int * numComponents
std::vector< double * > & VelGradBuffers()
int SetGrid(GridType &inGrid)
void SetDomainBCs(std::vector< BoundaryType > &domainBoundaries, std::vector< BCType > &domainBCs)
void SetMask(const std::vector< size_t > &opIndices, int maskBits, int *inMask)
rhs_base_t::GlobalType GlobalType
subroutine sat_form_roe_matrices(ND, u_in, u_out, gamma, norm, tmat, tinv, lambda)
size_t * numPointsStencil
std::vector< bool > haveHalo
void InitSimple(const ContainerType &inSize)
void const size_t * numPointsBuffer
void const size_t const size_t const int const size_t const size_t const size_t const size_t const int const double const double const double * bcParams
void FC_MODULE(euler, flux1d, EULER, FLUX1D)(const int *numDim
std::vector< GridRegionType > * subRegionsPtr
std::vector< double * > & TemperatureGradBuffers()
int SetState(StateType &inState)
void PackBufferMessage(int messageId, int numEquations, double *dataBuffer, int threadId)
std::vector< std::vector< double * > > haloStateBuffers
const double * inputDiffusivity
const double * sigmaDilPtr