5 #ifndef _COMETESBGKDISCRETIZER_H_
6 #define _COMETESBGKDISCRETIZER_H_
28 #define SQR(x) ((x)*(x))
64 const T dT,
const int order,
const bool transient,
const T underRelaxation,
65 const T rho_init,
const T T_init,
const T MW,
const int conOrder,
66 COMETBCMap& bcMap, map<
int, vector<int> > faceReflectionArrayMap,
127 for(
int direction=0;direction<
_numDir;direction++)
142 _fN2Arrays[direction] = &dynamic_cast<TArray&>(fN2nd[_cells]);
144 _fasArrays[direction] = &dynamic_cast<TArray&>(fndFAS[_cells]);
172 for(
int c=start;((c<cellcount)&&(c>-1));c+=sweep)
175 for(
int dir=0;dir<
_numDir;dir++)
226 throw CException(
"Unexpected value for boundary cell map.");
248 for(
int c=start;((c<cellcount)&&(c>-1));c+=sweep)
251 for(
int dir=0;dir<
_numDir;dir++)
300 throw CException(
"Unexpected value for boundary cell map.");
305 template<
class MatrixType>
309 const T onePointFive(1.5);
310 const T pointFive(0.5);
314 for(
int direction=0;direction<
_numDir;direction++)
325 Amat->getElement(count,count) -= fbydT*(onePointFive*f[cell]- two*fN1[cell]
326 + pointFive*fN2[cell]);
327 BVec[count-1] -= fbydT*onePointFive;
331 Amat->getElement(count,count) -= fbydT;
332 BVec[count-1] -= fbydT*(f[cell]- fN1[cell]);
354 for(
int dir=0;dir<
_numDir;dir++)
356 limitCoeff1[dir]=T(1.e20);
367 for(
int j=0;j<neibcount;j++)
376 for(
int dir=0;dir<
_numDir;dir++)
379 Grads[dir].accumulate(Gcoeff,f[cell2]-f[cell]);
380 if(min1[dir]>f[cell2])min1[dir]=f[cell2];
381 if(max1[dir]<f[cell2])max1[dir]=f[cell2];
385 for(
int j=0;j<neibcount;j++)
390 for(
int dir=0;dir<
_numDir;dir++)
395 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
396 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
402 for(
int j=0;j<neibcount;j++)
418 for(
int dir=0;dir<
_numDir;dir++)
420 limitCoeff2[dir]=T(1.e20);
430 for(
int nj=0;nj<neibcount1;nj++)
437 Gcoeff=gMat.
getCoeff(cell2, cell22);
439 for(
int dir=0;dir<
_numDir;dir++)
442 NeibGrads[dir].accumulate(Gcoeff,f[cell22]-f[cell2]);
443 if(min2[dir]>f[cell22])min2[dir]=f[cell22];
444 if(max2[dir]<f[cell22])max2[dir]=f[cell22];
449 for(
int nj=0;nj<neibcount1;nj++)
454 for(
int dir=0;dir<
_numDir;dir++)
459 VectorT3 fVec=faceCoords[f1]-cellCoords[cell2];
460 T SOU=(neibGrad[0]*fVec[0]+neibGrad[1]*fVec[1]+neibGrad[2]*fVec[2]);
467 for(
int dir=0;dir<
_numDir;dir++)
470 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
471 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
474 GradType& neibGrad=NeibGrads[count-1];
479 const T uwall = v[1][0];
480 const T vwall = v[1][1];
481 const T wwall = v[1][2];
482 const T wallV_dot_en = uwall*en[0]+vwall*en[1]+wwall*en[2];
483 if((c_dot_en-wallV_dot_en)>
T_Scalar(0))
486 BVec[count-1]-=flux*f[cell];
490 const int ibFace = ibFaceIndex[face];
494 const TArray& fIB =
dynamic_cast<const TArray&
>(fnd[ibFaces]);
495 BVec[count-1]-=flux*fIB[ibFace];
502 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
503 VectorT3 rVec=cellCoords[cell2]-cellCoords[cell];
504 T r=gMat.
computeR(grad,f,rVec,cell,cell2);
505 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
508 BVec[count-1]-=flux*f[cell];
511 BVec[count-1]-=(flux*f[cell]+flux*SOU*limitCoeff1[dir]);
516 VectorT3 fVec=faceCoords[face]-cellCoords[cell2];
517 VectorT3 rVec=cellCoords[cell]-cellCoords[cell2];
518 T r=gMat.
computeR(neibGrad,f,rVec,cell2,cell);
519 T SOU=(neibGrad[0]*fVec[0]+neibGrad[1]*fVec[1]+neibGrad[2]*fVec[2]);
521 BVec[count-1]-=flux*f[cell2];
524 BVec[count-1]-=(flux*f[cell2]+flux*SOU*limitCoeff2[dir]);
532 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
533 VectorT3 rVec=cellCoords[cell2]-cellCoords[cell];
534 T r=gMat.
computeR(grad,f,rVec,cell,cell2);
535 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
538 BVec[count-1]-=flux*f[cell];
541 BVec[count-1]-=(flux*f[cell]+flux*SOU*limitCoeff1[dir]);
545 BVec[count-1]-=flux*f[cell2];
558 for(
int j=0;j<neibcount;j++)
575 for(
int dir=0;dir<
_numDir;dir++)
578 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
579 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
585 const T uwall = v[1][0];
586 const T vwall = v[1][1];
587 const T wwall = v[1][2];
588 const T wallV_dot_en = uwall*en[0]+vwall*en[1]+wwall*en[2];
589 if((c_dot_en-wallV_dot_en)>
T_Scalar(0))
592 BVec[count-1]-=flux*f[cell];
596 const int ibFace = ibFaceIndex[face];
600 const TArray& fIB =
dynamic_cast<const TArray&
>(fnd[ibFaces]);
601 BVec[count-1]-=flux*fIB[ibFace];
609 BVec[count-1]-=flux*f[cell];
612 BVec[count-1]-=flux*f[cell2];
637 for(
int dir=0;dir<
_numDir;dir++)
639 limitCoeff1[dir]=T(1.e20);
650 for(
int j=0;j<neibcount;j++)
659 for(
int dir=0;dir<
_numDir;dir++)
662 Grads[dir].accumulate(Gcoeff,f[cell2]-f[cell]);
663 if(min1[dir]>f[cell2])min1[dir]=f[cell2];
664 if(max1[dir]<f[cell2])max1[dir]=f[cell2];
668 for(
int j=0;j<neibcount;j++)
673 for(
int dir=0;dir<
_numDir;dir++)
678 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
679 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
685 for(
int j=0;j<neibcount;j++)
701 for(
int dir=0;dir<
_numDir;dir++)
703 limitCoeff2[dir]=T(1.e20);
713 for(
int nj=0;nj<neibcount1;nj++)
720 Gcoeff=gMat.
getCoeff(cell2, cell22);
722 for(
int dir=0;dir<
_numDir;dir++)
725 NeibGrads[dir].accumulate(Gcoeff,f[cell22]-f[cell2]);
726 if(min2[dir]>f[cell22])min2[dir]=f[cell22];
727 if(max2[dir]<f[cell22])max2[dir]=f[cell22];
732 for(
int nj=0;nj<neibcount1;nj++)
737 for(
int dir=0;dir<
_numDir;dir++)
742 VectorT3 fVec=faceCoords[f1]-cellCoords[cell2];
743 T SOU=(neibGrad[0]*fVec[0]+neibGrad[1]*fVec[1]+neibGrad[2]*fVec[2]);
754 T uwall = (*(
_bcMap[Fgid]))[
"specifiedXVelocity"];
755 T vwall = (*(
_bcMap[Fgid]))[
"specifiedYVelocity"];
756 T wwall = (*(
_bcMap[Fgid]))[
"specifiedZVelocity"];
757 T Twall = (*(
_bcMap[Fgid]))[
"specifiedTemperature"];
758 const T wallV_dot_en = uwall*en[0]+vwall*en[1]+wwall*en[2];
760 const vector<int>& vecReflection=(*pos).second;
761 T alpha=(*(
_bcMap[Fgid]))[
"accommodationCoefficient"];
762 T m1alpha = one-alpha;
763 const T pi(acos(-1.0));
769 for(
int dir1=0;dir1<
_numDir;dir1++)
772 const T fwall = 1.0/pow(pi*Twall,1.5)*exp(-(pow(
_cx[dir1]-uwall,2.0)+pow(
_cy[dir1]-vwall,2.0)+pow(
_cz[dir1]-wwall,2.0))/Twall);
773 flux=
_cx[dir1]*Af[0]+
_cy[dir1]*Af[1]+
_cz[dir1]*Af[2];
774 const T c_dot_en =
_cx[dir1]*en[0]+
_cy[dir1]*en[1]+
_cz[dir1]*en[2];
776 if((c_dot_en-wallV_dot_en)>
T_Scalar(0))
778 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
779 VectorT3 rVec=cellCoords[cell2]-cellCoords[cell];
780 T r=gMat.
computeR(grad,f,rVec,cell,cell2);
781 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
785 BVec[count-1]-=flux*f[cell];
786 Nmr = Nmr + f[cell]*
_wts[dir1]*(c_dot_en -wallV_dot_en);
790 BVec[count-1]-=flux*(f[cell]+limitCoeff1[dir1]*SOU);
791 Nmr = Nmr + (f[cell]+limitCoeff1[dir1]*SOU)*
_wts[dir1]*(c_dot_en -wallV_dot_en);
796 Dmr = Dmr - fwall*
_wts[dir1]*(c_dot_en-wallV_dot_en);
801 const T nwall = Nmr/Dmr;
806 for(
int dir1=0;dir1<
_numDir;dir1++)
809 flux=
_cx[dir1]*Af[0]+
_cy[dir1]*Af[1]+
_cz[dir1]*Af[2];
810 const T c1_dot_en =
_cx[dir1]*en[0]+
_cy[dir1]*en[1]+
_cz[dir1]*en[2];
811 if((c1_dot_en-wallV_dot_en)<
T_Scalar(0))
813 const T coeff1 = 1.0/pow(pi*Twall,1.5)*exp(-(pow(
_cx[dir1]-uwall,2.0)+pow(
_cy[dir1]-vwall,2.0)+pow(
_cz[dir1]-wwall,2.0))/Twall);
816 const int direction_incident = vecReflection[dir1];
818 GradType& grad=Grads[direction_incident];
819 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
820 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
823 BVec[count-1]-=flux*m1alpha*dsfi[cell];
825 BVec[count-1]-=flux*m1alpha*(dsfi[cell]+limitCoeff1[direction_incident]*SOU);
827 BVec[count-1]-=flux*alpha*(nwall*coeff1);
896 for(
int dir=0;dir<
_numDir;dir++)
899 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
900 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
905 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
906 VectorT3 rVec=cellCoords[cell2]-cellCoords[cell];
907 T r=gMat.
computeR(grad,f,rVec,cell,cell2);
908 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
911 BVec[count-1]-=flux*f[cell];
914 BVec[count-1]-=flux*(f[cell]+limitCoeff1[dir]*SOU);
919 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
920 VectorT3 rVec=cellCoords[cell2]-cellCoords[cell];
921 T r=gMat.
computeR(grad,f,rVec,cell,cell2);
922 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
925 BVec[count-1]-=flux*f[cell];
928 BVec[count-1]-=flux*(f[cell]+limitCoeff1[dir]*SOU);
937 for(
int dir=0;dir<
_numDir;dir++)
940 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
941 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
946 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
947 VectorT3 rVec=cellCoords[cell2]-cellCoords[cell];
948 T r=gMat.
computeR(grad,f,rVec,cell,cell2);
949 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
952 BVec[count-1]-=flux*f[cell];
955 BVec[count-1]-=flux*(f[cell]+limitCoeff1[dir]*SOU);
959 BVec[count-1]-=flux*f[cell2];
967 const vector<int>& vecReflection=(*pos).second;
970 for(
int dir1=0;dir1<
_numDir;dir1++)
973 flux=
_cx[dir1]*Af[0]+
_cy[dir1]*Af[1]+
_cz[dir1]*Af[2];
974 const T c_dot_en =
_cx[dir1]*en[0]+
_cy[dir1]*en[1]+
_cz[dir1]*en[2];
978 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
979 VectorT3 rVec=cellCoords[cell2]-cellCoords[cell];
980 T r=gMat.
computeR(grad,f,rVec,cell,cell2);
981 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
984 BVec[count-1]-=flux*f[cell];
986 BVec[count-1]-=flux*(f[cell]+limitCoeff1[dir1]*SOU);
990 const int direction_incident = vecReflection[dir1];
992 BVec[count-1]-=flux*dsfi[cell];
1000 for(
int dir=0;dir<
_numDir;dir++)
1003 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
1004 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
1007 const T uwall = v[1][0];
1008 const T vwall = v[1][1];
1009 const T wwall = v[1][2];
1010 const T wallV_dot_en = uwall*en[0]+vwall*en[1]+wwall*en[2];
1011 if((c_dot_en-wallV_dot_en)>
T_Scalar(0))
1014 BVec[count-1]-=flux*f[cell];
1018 const int ibFace = ibFaceIndex[face];
1022 const TArray& fIB =
dynamic_cast<const TArray&
>(fnd[ibFaces]);
1023 BVec[count-1]-=flux*fIB[ibFace];
1031 for(
int dir=0;dir<
_numDir;dir++)
1034 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
1035 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
1038 GradType& neibGrad=NeibGrads[count-1];
1041 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
1042 VectorT3 rVec=cellCoords[cell2]-cellCoords[cell];
1043 T r=gMat.
computeR(grad,f,rVec,cell,cell2);
1044 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
1047 BVec[count-1]-=flux*f[cell];
1050 BVec[count-1]-=flux*(f[cell]+limitCoeff1[dir]*SOU);
1055 VectorT3 fVec=faceCoords[face]-cellCoords[cell2];
1056 VectorT3 rVec=cellCoords[cell]-cellCoords[cell2];
1057 T r=gMat.
computeR(neibGrad,f,rVec,cell2,cell);
1058 T SOU=(neibGrad[0]*fVec[0]+neibGrad[1]*fVec[1]+neibGrad[2]*fVec[2]);
1060 BVec[count-1]-=flux*f[cell2];
1063 BVec[count-1]-=flux*(f[cell2]+limitCoeff2[dir]*SOU);
1072 for(
int dir=0;dir<
_numDir;dir++)
1075 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
1076 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
1081 BVec[count-1]-=flux*f[cell];
1084 BVec[count-1]-=flux*f[cell2];
1100 for(
int j=0;j<neibcount;j++)
1119 T uwall = (*(
_bcMap[Fgid]))[
"specifiedXVelocity"];
1120 T vwall = (*(
_bcMap[Fgid]))[
"specifiedYVelocity"];
1121 T wwall = (*(
_bcMap[Fgid]))[
"specifiedZVelocity"];
1122 T Twall = (*(
_bcMap[Fgid]))[
"specifiedTemperature"];
1123 const T wallV_dot_en = uwall*en[0]+vwall*en[1]+wwall*en[2];
1125 const vector<int>& vecReflection=(*pos).second;
1126 T alpha=(*(
_bcMap[Fgid]))[
"accommodationCoefficient"];
1127 T m1alpha = one-alpha;
1128 const T pi(acos(-1.0));
1134 for(
int dir1=0;dir1<
_numDir;dir1++)
1137 const T fwall = 1.0/pow(pi*Twall,1.5)*exp(-(pow(
_cx[dir1]-uwall,2.0)+pow(
_cy[dir1]-vwall,2.0)+pow(
_cz[dir1]-wwall,2.0))/Twall);
1138 flux=
_cx[dir1]*Af[0]+
_cy[dir1]*Af[1]+
_cz[dir1]*Af[2];
1139 const T c_dot_en =
_cx[dir1]*en[0]+
_cy[dir1]*en[1]+
_cz[dir1]*en[2];
1140 if((c_dot_en-wallV_dot_en)>
T_Scalar(0))
1143 BVec[count-1]-=flux*f[cell];
1144 Nmr = Nmr + f[cell]*
_wts[dir1]*(c_dot_en -wallV_dot_en);
1148 Dmr = Dmr - fwall*
_wts[dir1]*(c_dot_en-wallV_dot_en);
1153 const T nwall = Nmr/Dmr;
1158 for(
int dir1=0;dir1<
_numDir;dir1++)
1161 flux=
_cx[dir1]*Af[0]+
_cy[dir1]*Af[1]+
_cz[dir1]*Af[2];
1162 const T c1_dot_en =
_cx[dir1]*en[0]+
_cy[dir1]*en[1]+
_cz[dir1]*en[2];
1163 if((c1_dot_en-wallV_dot_en)<
T_Scalar(0))
1165 const T coeff1 = 1.0/pow(pi*Twall,1.5)*exp(-(pow(
_cx[dir1]-uwall,2.0)+pow(
_cy[dir1]-vwall,2.0)+pow(
_cz[dir1]-wwall,2.0))/Twall);
1168 const int direction_incident = vecReflection[dir1];
1171 BVec[count-1]-=flux*m1alpha*dsfi[cell];
1173 BVec[count-1]-=flux*alpha*(nwall*coeff1);
1242 for(
int dir=0;dir<
_numDir;dir++)
1245 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
1246 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
1251 BVec[count-1]-=flux*f[cell];
1256 BVec[count-1]-=flux*f[cell];
1264 for(
int dir=0;dir<
_numDir;dir++)
1267 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
1268 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
1273 BVec[count-1]-=flux*f[cell];
1276 BVec[count-1]-=flux*f[cell2];
1284 const vector<int>& vecReflection=(*pos).second;
1287 for(
int dir1=0;dir1<
_numDir;dir1++)
1290 flux=
_cx[dir1]*Af[0]+
_cy[dir1]*Af[1]+
_cz[dir1]*Af[2];
1291 const T c_dot_en =
_cx[dir1]*en[0]+
_cy[dir1]*en[1]+
_cz[dir1]*en[2];
1295 BVec[count-1]-=flux*f[cell];
1299 const int direction_incident = vecReflection[dir1];
1301 BVec[count-1]-=flux*dsfi[cell];
1309 for(
int dir=0;dir<
_numDir;dir++)
1312 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
1313 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
1316 const T uwall = v[1][0];
1317 const T vwall = v[1][1];
1318 const T wwall = v[1][2];
1319 const T wallV_dot_en = uwall*en[0]+vwall*en[1]+wwall*en[2];
1320 if((c_dot_en-wallV_dot_en)>
T_Scalar(0))
1323 BVec[count-1]-=flux*f[cell];
1327 const int ibFace = ibFaceIndex[face];
1331 const TArray& fIB =
dynamic_cast<const TArray&
>(fnd[ibFaces]);
1332 BVec[count-1]-=flux*fIB[ibFace];
1340 for(
int dir=0;dir<
_numDir;dir++)
1343 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
1344 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
1349 BVec[count-1]-=flux*f[cell];
1352 BVec[count-1]-=flux*f[cell2];
1359 for(
int dir=0;dir<
_numDir;dir++)
1362 flux=
_cx[dir]*Af[0]+
_cy[dir]*Af[1]+
_cz[dir]*Af[2];
1363 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
1368 BVec[count-1]-=flux*f[cell];
1371 BVec[count-1]-=flux*f[cell2];
1378 template<
class MatrixType>
1391 for(
int direction=0;direction<
_numDir;direction++)
1397 T C1=(
_cx[direction]-v[cell][0]);
1398 T C2=(
_cy[direction]-v[cell][1]);
1399 T C3=(
_cz[direction]-v[cell][2]);
1401 Amat->getElement(count,order+1)+=coeff*fEqES[cell]*(two*
_coeffg[cell][1]*C1-
_coeffg[cell][2]);
1402 Amat->getElement(count,order+2)+=coeff*fEqES[cell]*(two*
_coeffg[cell][3]*C2-
_coeffg[cell][4]);
1403 Amat->getElement(count,order+3)+=coeff*fEqES[cell]*(two*
_coeffg[cell][5]*C3-
_coeffg[cell][6]);
1404 Amat->getElement(count,count)-=coeff;
1406 BVec[count-1]+=coeff*(fEqES[cell]-fV[direction]);
1408 Amat->getElement(_numDir+1,count)+=
_wts[direction]*C1/density[cell];
1409 BVec[
_numDir]+=
_cx[direction]*
_wts[direction]*fV[direction]/density[cell];
1410 Amat->getElement(_numDir+2,count)+=
_wts[direction]*C2/density[cell];
1411 BVec[_numDir+1]+=
_cy[direction]*
_wts[direction]*fV[direction]/density[cell];
1412 Amat->getElement(_numDir+3,count)+=
_wts[direction]*C3/density[cell];
1413 BVec[_numDir+2]+=
_cz[direction]*
_wts[direction]*fV[direction]/density[cell];
1417 Amat->getElement(_numDir+1,_numDir+1)-=1;
1419 Amat->getElement(_numDir+2,_numDir+2)-=1;
1420 BVec[_numDir+1]-=v[cell][1];
1421 Amat->getElement(_numDir+3,_numDir+3)-=1;
1422 BVec[_numDir+2]-=v[cell][2];
1425 template<
class MatrixType>
1437 for(
int direction=0;direction<
_numDir;direction++)
1442 T C1=(
_cx[direction]-v[cell][0]);
1443 T C2=(
_cy[direction]-v[cell][1]);
1444 T C3=(
_cz[direction]-v[cell][2]);
1452 Amat->getElement(count,order+1)+=coeff*fGamma*(two*
_coeffg[cell][1]*C1-
_coeffg[cell][2]);
1453 Amat->getElement(count,order+2)+=coeff*fGamma*(two*
_coeffg[cell][3]*C2-
_coeffg[cell][4]);
1454 Amat->getElement(count,order+3)+=coeff*fGamma*(two*
_coeffg[cell][5]*C3-
_coeffg[cell][6]);
1455 Amat->getElement(count,count)-=coeff;
1457 BVec[count-1]+=coeff*fGamma;
1458 BVec[count-1]-=coeff*f[cell];
1463 template<
class MatrixType>
1470 for(
int dir=0;dir<
_numDir;dir++)
1473 density+=f[cell]*
_wts[dir];
1478 for(
int dir=0;dir<
_numDir;dir++)
1481 T C1=(
_cx[dir]-v[cell][0]);
1482 T C2=(
_cy[dir]-v[cell][1]);
1483 T C3=(
_cz[dir]-v[cell][2]);
1485 Amat->getElement(_numDir+1,count)+=
_wts[dir]*C1/density;
1487 Amat->getElement(_numDir+2,count)+=
_wts[dir]*C2/density;
1488 BVec[_numDir+1]+=
_cy[dir]*
_wts[dir]*f[cell]/density;
1489 Amat->getElement(_numDir+3,count)+=
_wts[dir]*C3/density;
1490 BVec[_numDir+2]+=
_cz[dir]*
_wts[dir]*f[cell]/density;
1493 Amat->getElement(_numDir+1,_numDir+1)-=1;
1495 Amat->getElement(_numDir+2,_numDir+2)-=1;
1496 BVec[_numDir+1]-=v[cell][1];
1497 Amat->getElement(_numDir+3,_numDir+3)-=1;
1498 BVec[_numDir+2]-=v[cell][2];
1506 for(
int direction=0;direction<
_numDir;direction++)
1511 fRes[cell]=-Rvec[direction];
1517 vR[cell][1]=-Rvec[_numDir+1];
1518 vR[cell][2]=-Rvec[_numDir+2];
1525 for(
int direction=0;direction<
_numDir;direction++)
1528 fRes[cell]=-Rvec[direction];
1531 vR[cell][1]=-Rvec[_numDir+1];
1532 vR[cell][2]=-Rvec[_numDir+2];
1547 for(
int dir=0;dir<
_numDir;dir++)
1561 for(
int dir=0;dir<
_numDir;dir++)
1565 _stress[cell][1] +=
SQR((
_cy[dir]-v[cell][1]))*f[cell]*_wts[dir];
1566 _stress[cell][2] +=
SQR((
_cz[dir]-v[cell][2]))*f[cell]*_wts[dir];
1567 _stress[cell][3] +=(
_cx[dir]-v[cell][0])*(
_cy[dir]-v[cell][1])*f[cell]*_wts[dir];
1568 _stress[cell][4] +=(
_cy[dir]-v[cell][1])*(
_cz[dir]-v[cell][2])*f[cell]*_wts[dir];
1569 _stress[cell][5] +=(
_cz[dir]-v[cell][2])*(
_cx[dir]-v[cell][0])*f[cell]*_wts[dir];
1595 for(
int c=0;c<cellcount;c++)
1598 for(
int dir=0;dir<
_numDir;dir++)
1668 throw CException(
"Unexpected value for boundary cell map.");
1673 temp[o]=ResidSum[o];
1675 temp[_numDir+3]=traceSum;
1680 MPI::COMM_WORLD.Allreduce( MPI::IN_PLACE, temp.
getData(), _numDir+4, MPI::DOUBLE, MPI::SUM);
1691 for(
int o=0;o<_numDir+3;o++)
1693 ResidScalar+=temp[o];
1696 ResidScalar/=temp[_numDir+3];
1727 for(
int c=0;c<cellcount;c++)
1730 for(
int dir=0;dir<
_numDir;dir++)
1799 throw CException(
"Unexpected value for boundary cell map.");
1804 temp[o]=ResidSum[o];
1806 temp[_numDir+3]=traceSum;
1811 MPI::COMM_WORLD.Allreduce( MPI::IN_PLACE, temp.
getData(), _numDir+4, MPI::DOUBLE, MPI::SUM);
1822 for(
int o=0;o<_numDir+3;o++)
1824 ResidScalar+=temp[o];
1827 ResidScalar/=temp[_numDir+3];
1860 for(
int dir=0;dir<
_numDir;dir++)
1863 bVec[count]-=fasArray[c];
1867 bVec[
_numDir]-=fasArray[c][0];
1868 bVec[_numDir+1]-=fasArray[c][1];
1869 bVec[_numDir+2]-=fasArray[c][2];
1874 FaceToFg::iterator id;
1877 if(id->second[0]<=faceIndex && id->second[1]>faceIndex)
1880 throw CException(
"Didn't find matching FaceGroup!");
1887 for(
int i=0;i<length;i++)
1894 for(
int i=0;i<length;i++)
1903 for(
int dir=0;dir<
_numDir;dir++)
1910 o[_numDir+1]=v[c][1];
1911 o[_numDir+2]=v[c][2];
1927 for(
int dir=0;dir<
_numDir;dir++)
1929 limitCoeff1[dir]=T(1.e20);
1940 for(
int j=0;j<neibcount;j++)
1949 for(
int dir=0;dir<
_numDir;dir++)
1952 Grads[dir].accumulate(Gcoeff,f[cell2]-f[cell]);
1953 if(min1[dir]>f[cell2])min1[dir]=f[cell2];
1954 if(max1[dir]<f[cell2])max1[dir]=f[cell2];
1958 for(
int j=0;j<neibcount;j++)
1963 for(
int dir=0;dir<
_numDir;dir++)
1968 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
1969 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
1975 for(
int j=0;j<neibcount;j++)
1991 for(
int dir=0;dir<
_numDir;dir++)
1994 const T c_dot_en =
_cx[dir]*en[0]+
_cy[dir]*en[1]+
_cz[dir]*en[2];
1998 VectorT3 fVec=faceCoords[face]-cellCoords[cell];
1999 VectorT3 rVec=cellCoords[cell2]-cellCoords[cell];
2000 T r=gMat.
computeR(grad,f,rVec,cell,cell2);
2001 T SOU=(grad[0]*fVec[0]+grad[1]*fVec[1]+grad[2]*fVec[2]);
2002 f[cell2]=(f[cell]+limitCoeff1[dir]*SOU);
const FaceGroupList & getBoundaryFaceGroups() const
int getCount(const int i) const
DistFunctFields< T > TDistFF
shared_ptr< FaceGroup > FaceGroupPtr
const StorageSite & getIBFaces() const
Array< VectorT10 > VectorT10Array
void Distribute(const int cell, TArray &BVec, TArray &Rvec)
map< int, COMETBC< T > * > COMETBCMap
const GeomFields & _geomFields
void COMETMacro(const int cell, MatrixType Amat, TArray &BVec)
void setBoundaryValFine(const int cell, const int cellcount, const GradMatrix &gMat)
Vector< T_Scalar, 3 > VectorT3
void COMETSolveFine(const int sweep, const int level)
bool hasArray(const StorageSite &s) const
MacroFields & _macroFields
void ComputeMacroparameters(const int cell)
ArrowHeadMatrix< T, 3 > TArrow
VectorT3Array & _velocityResidual
void findResid(const bool plusFAS)
X computeR(const Gradient< X > &g, const Array< X > &x, const Coord dist, int i, int j) const
const IntArray & _BCfArray
Coord & getCoeff(const int i, const int j)
const CRConnectivity & _cellFaces
void COMETConvection(const int cell, TArrow &Amat, TArray &BVec, const int cellcount)
void COMETCollision(const int cell, MatrixType Amat, TArray &BVec)
void COMETSolve(const int sweep, const int level)
void computeLimitCoeff(T &lc, const T x, const T &dx, const T &min, const T &max, const LimitFunc &f)
SquareMatrixESBGK< T > TSquareESBGK
Vector< T, 10 > VectorT10
void COMETConvectionFine(const int cell, TArrow &Amat, TArray &BVec, const GradMatrix &gMat)
NumTypeTraits< T >::T_Scalar T_Scalar
const VectorT3Array & _faceArea
void multiply(const XArray &x, XArray &b)
virtual void * getData() const
T_Scalar & getElement(const int i, const int j)
const TArray & _cellVolume
COMETESBGKDiscretizer(const Mesh &mesh, const GeomFields &geomfields, const StorageSite &solidFaces, MacroFields ¯oFields, TQuad &quadrature, TDistFF &dsfPtr, TDistFF &dsfPtr1, TDistFF &dsfPtr2, TDistFF &dsfEqPtrES, TDistFF &dsfPtrRes, TDistFF &dsfPtrFAS, const T dT, const int order, const bool transient, const T underRelaxation, const T rho_init, const T T_init, const T MW, const int conOrder, COMETBCMap &bcMap, map< int, vector< int > > faceReflectionArrayMap, const IntArray &BCArray, const IntArray &BCfArray, const IntArray &ZCArray)
void findResidFine(const bool plusFAS)
GradModelType::GradMatrixType GradMatrix
map< int, vector< int > > _faceReflectionArrayMap
const Field & _areaMagField
TArray & _collisionFrequency
void ArrayAbs(TArray &o1, TArray &o2)
static GradMatrixType & getGradientMatrix(const Mesh &mesh, const GeomFields &geomFields)
Array< VectorT5 > VectorT5Array
Tangent fabs(const Tangent &a)
GradientModel< T > GradModelType
void COMETConvectionFine(const int cell, TArrow &Amat, TArray &BVec, const int cellcount, const GradMatrix &gMat)
map< int, VecInt2 > FaceToFg
void addFAS(const int c, TArray &bVec)
void makeValueArray(const int c, TArray &o)
void COMETUnsteady(const int cell, MatrixType Amat, TArray &BVec)
Array< GradType > GradArray
const StorageSite & _solidFaces
VectorT3Array * _velocityFASCorrection
Array< VectorT3 > VectorT3Array
Field velocityFASCorrection
std::vector< Field * > dsf
const IntArray & _BCArray
const StorageSite & _cells
void Distribute(const int cell, TArray &Rvec)
const StorageSite & _faces
VectorT3Array & _velocity
void COMETTest(const int cell, MatrixType Amat, TArray &BVec, TArray &fV)
const TArray & _faceAreaMag
void COMETConvection(const int cell, TArrow &Amat, TArray &BVec)
const CRConnectivity & _faceCells
int findFgId(const int faceIndex)
const IntArray & _ZCArray
Array< VectorT6 > VectorT6Array