41 string NavierStokesImplicitCFE::className =
43 "NavierStokesImplicitCFE", NavierStokesImplicitCFE::create,
44 "NavierStokes equations in conservative variables.");
46 NavierStokesImplicitCFE::NavierStokesImplicitCFE(
77 std::placeholders::_2,
78 std::placeholders::_3,
79 std::placeholders::_4);
83 std::placeholders::_2,
84 std::placeholders::_3,
85 std::placeholders::_4);
91 std::placeholders::_2,
92 std::placeholders::_3,
93 std::placeholders::_4);
97 std::placeholders::_2,
98 std::placeholders::_3,
99 std::placeholders::_4);
102 std::placeholders::_2,
103 std::placeholders::_3,
104 std::placeholders::_4);
120 size_t nvariables = inarray.size();
126 for (
int i = 0; i < nvariables; ++i)
146 for (
int i = 0; i < nvariables; ++i)
160 for (
int i = 0; i < nvariables-1; ++i)
169 m_varConv->GetPressure(inarray, inarrayDiff[0]);
172 m_varConv->GetTemperature(inarray, inarrayDiff[nvariables-2]);
175 m_varConv->GetVelocityVector(inarray, inarrayDiff);
189 m_varConv->GetTemperature(pFwd, inFwd[nvariables-2]);
190 m_varConv->GetTemperature(pBwd, inBwd[nvariables-2]);
192 m_varConv->GetVelocityVector(pFwd, inFwd);
193 m_varConv->GetVelocityVector(pBwd, inBwd);
200 for (
int i = 0; i < nvariables; ++i)
251 TwoThird=2.0*OneThird;
252 FourThird=4.0*OneThird;
255 tmpArray = OutputMatrix->GetPtr();
256 int nrow = OutputMatrix->GetRows();
258 tmpArray[0+0*nrow]=tmp*(-FourThird*u*nx-v*ny);
259 tmpArray[0+1*nrow]=tmp*(FourThird*nx);
260 tmpArray[0+2*nrow]=tmp*ny;
261 tmpArray[0+3*nrow]=0.0;
262 tmpArray[1+0*nrow]=tmp*(-v*nx+TwoThird*u*ny);
263 tmpArray[1+1*nrow]=tmp*(-TwoThird*ny);
264 tmpArray[1+2*nrow]=tmp*nx;
265 tmpArray[1+3*nrow]=0.0;
266 tmpArray[2+0*nrow]=(FourThird*u*u+v*v+tmp2*(E-q2))*nx+OneThird*u*v*ny;
267 tmpArray[2+0*nrow]=-tmp*(*OutputMatrix)(2,0);
268 tmpArray[2+1*nrow]=(FourThird-tmp2)*u*nx-TwoThird*v*ny;
269 tmpArray[2+1*nrow]=tmp*(*OutputMatrix)(2,1);
270 tmpArray[2+2*nrow]=(1-tmp2)*v*nx+u*ny;
271 tmpArray[2+2*nrow]=tmp*(*OutputMatrix)(2,2);
272 tmpArray[2+3*nrow]=tmp*tmp2*nx;
309 TwoThird=2.0*OneThird;
310 FourThird=4.0*OneThird;
313 tmpArray = OutputMatrix->GetPtr();
314 int nrow = OutputMatrix->GetRows();
316 tmpArray[0+0*nrow]=tmp*(TwoThird*v*nx-u*ny);
317 tmpArray[0+1*nrow]=tmp*ny;
318 tmpArray[0+2*nrow]=tmp*(-TwoThird)*nx;
319 tmpArray[0+3*nrow]=0.0;
320 tmpArray[1+0*nrow]=tmp*(-u*nx-FourThird*v*ny);
321 tmpArray[1+1*nrow]=tmp*nx;
322 tmpArray[1+2*nrow]=tmp*(FourThird*ny);
323 tmpArray[1+3*nrow]=0.0;
324 tmpArray[2+0*nrow]=OneThird*u*v*nx+(FourThird*v*v+u*u+tmp2*(E-q2))*ny;
325 tmpArray[2+0*nrow]=-tmp*(*OutputMatrix)(2,0);
326 tmpArray[2+1*nrow]=(1-tmp2)*u*ny+v*nx;
327 tmpArray[2+1*nrow]=tmp*(*OutputMatrix)(2,1);
328 tmpArray[2+2*nrow]=(FourThird-tmp2)*v*ny-TwoThird*u*nx;
329 tmpArray[2+2*nrow]=tmp*(*OutputMatrix)(2,2);
330 tmpArray[2+3*nrow]=tmp*tmp2*ny;
375 TwoThird=2.0*OneThird;
376 FourThird=4.0*OneThird;
379 tmpArray = OutputMatrix->GetPtr();
380 int nrow = OutputMatrix->GetRows();
382 tmpArray[0+0*nrow]=tmpx*(-FourThird*u)+tmpy*(-v)+tmpz*(-w);
383 tmpArray[0+1*nrow]=tmpx*FourThird;
384 tmpArray[0+2*nrow]=tmpy;
385 tmpArray[0+3*nrow]=tmpz;
386 tmpArray[0+4*nrow]=0.0;
387 tmpArray[1+0*nrow]=tmpx*(-v)+tmpy*(TwoThird*u);
388 tmpArray[1+1*nrow]=tmpy*(-TwoThird);
389 tmpArray[1+2*nrow]=tmpx;
390 tmpArray[1+3*nrow]=0.0;
391 tmpArray[1+4*nrow]=0.0;
392 tmpArray[2+0*nrow]=tmpx*(-w)+tmpz*(TwoThird*u);
393 tmpArray[2+1*nrow]=tmpz*(-TwoThird);
394 tmpArray[2+2*nrow]=0.0;
395 tmpArray[2+3*nrow]=tmpx;
396 tmpArray[2+4*nrow]=0.0;
397 tmpArray[3+0*nrow]=-tmpx*(FourThird*u*u+v*v+w*w+tmp2*(E-q2))
398 +tmpy*(-OneThird*u*v)+tmpz*(-OneThird*u*w);
399 tmpArray[3+1*nrow]=tmpx*(FourThird-tmp2)*u+tmpy*(-TwoThird*v)
401 tmpArray[3+2*nrow]=tmpx*(1.0-tmp2)*v+tmpy*u;
402 tmpArray[3+3*nrow]=tmpx*(1.0-tmp2)*w+tmpz*u;
403 tmpArray[3+4*nrow]=tmpx*tmp2;
448 TwoThird=2.0*OneThird;
449 FourThird=4.0*OneThird;
452 tmpArray = OutputMatrix->GetPtr();
453 int nrow = OutputMatrix->GetRows();
455 tmpArray[0+0*nrow]=tmpx*(TwoThird*v)+tmpy*(-u);
456 tmpArray[0+1*nrow]=tmpy;
457 tmpArray[0+2*nrow]=tmpx*(-TwoThird);
458 tmpArray[0+3*nrow]=0.0;
459 tmpArray[0+4*nrow]=0.0;
460 tmpArray[1+0*nrow]=tmpx*(-u)+tmpy*(-FourThird*v)+tmpz*(-w);
461 tmpArray[1+1*nrow]=tmpx;
462 tmpArray[1+2*nrow]=tmpy*FourThird;
463 tmpArray[1+3*nrow]=tmpz;
464 tmpArray[1+4*nrow]=0.0;
465 tmpArray[2+0*nrow]=tmpy*(-w)+tmpz*(TwoThird*v);
466 tmpArray[2+1*nrow]=0.0;
467 tmpArray[2+2*nrow]=tmpz*(-TwoThird);
468 tmpArray[2+3*nrow]=tmpy;
469 tmpArray[2+4*nrow]=0.0;
470 tmpArray[3+0*nrow]=tmpx*(-OneThird*u*v)-tmpy*(u*u+FourThird*v*v+w*w
471 +tmp2*(E-q2))+tmpz*(-OneThird*v*w);
472 tmpArray[3+1*nrow]=tmpx*v+tmpy*(1-tmp2)*u;
473 tmpArray[3+2*nrow]=tmpx*(-TwoThird*u)+tmpy*(FourThird-tmp2)*v
475 tmpArray[3+3*nrow]=tmpy*(1-tmp2)*w+tmpz*v;
476 tmpArray[3+4*nrow]=tmpy*tmp2;
521 TwoThird=2.0*OneThird;
522 FourThird=4.0*OneThird;
525 tmpArray = OutputMatrix->GetPtr();
526 int nrow = OutputMatrix->GetRows();
528 tmpArray[0+0*nrow]=tmpx*(TwoThird*w)+tmpz*(-u);
529 tmpArray[0+1*nrow]=tmpz;
530 tmpArray[0+2*nrow]=0.0;
531 tmpArray[0+3*nrow]=tmpx*(-TwoThird);
532 tmpArray[0+4*nrow]=0.0;
533 tmpArray[1+0*nrow]=tmpy*(TwoThird*w)+tmpz*(-v);
534 tmpArray[1+1*nrow]=0.0;
535 tmpArray[1+2*nrow]=tmpz;
536 tmpArray[1+3*nrow]=tmpy*(-TwoThird);
537 tmpArray[1+4*nrow]=0.0;
538 tmpArray[2+0*nrow]=tmpx*(-u)+tmpy*(-v)+tmpz*(-FourThird*w);
539 tmpArray[2+1*nrow]=tmpx;
540 tmpArray[2+2*nrow]=tmpy;
541 tmpArray[2+3*nrow]=tmpz*FourThird;
542 tmpArray[2+4*nrow]=0.0;
543 tmpArray[3+0*nrow]=tmpx*(-OneThird*u*w)+tmpy*(-OneThird*v*w)
544 -tmpz*(u*u+v*v+FourThird*w*w+tmp2*(E-q2));
545 tmpArray[3+1*nrow]=tmpx*w+tmpz*(1-tmp2)*u;
546 tmpArray[3+2*nrow]=tmpy*w+tmpz*(1-tmp2)*v;
547 tmpArray[3+3*nrow]=tmpx*(-TwoThird*u)+tmpy*(-TwoThird*v)
548 +tmpz*(FourThird-tmp2)*w;
549 tmpArray[3+4*nrow]=tmpz*tmp2;
571 tmpArray = OutputMatrix->GetPtr();
572 int nrow = OutputMatrix->GetRows();
611 NekDouble s12=FourThird*du_dx-TwoThrid*dv_dy;
614 NekDouble s23=FourThird*dv_dy-TwoThrid*du_dx;
618 NekDouble qx=-gamma*mu*oPr*(orho1*dU4_dx-U[3]*orho2*dU1_dx
619 -u*(orho1*dU2_dx-U[1]*orho2*dU1_dx)
620 -v*(orho1*dU3_dx-U[2]*orho2*dU1_dx));
621 NekDouble qy=-gamma*mu*oPr*(orho1*dU4_dy-U[3]*orho2*dU1_dy
622 -u*(orho1*dU2_dy-U[1]*orho2*dU1_dy)
623 -v*(orho1*dU3_dy-U[2]*orho2*dU1_dy));
632 dT_dU[0]=oCv*(-orho2*U4+orho3*U2*U2+orho3*U3*U3);
633 dT_dU[1]=-oCv*orho2*U2;
634 dT_dU[2]=-oCv*orho2*U3;
640 tmpArray[i+j*nrow]=dmu_dT*dT_dU[j]*tmp[i];
657 du_dx_dU1=-orho2*dU2_dx+2*orho3*U2*dU1_dx;
658 du_dx_dU2=-orho2*dU1_dx;
659 du_dy_dU1=-orho2*dU2_dy+2*orho3*U2*dU1_dy;
660 du_dy_dU2=-orho2*dU1_dy;
661 dv_dx_dU1=-orho2*dU3_dx+2*orho3*U3*dU1_dx;
663 dv_dy_dU1=-orho2*dU3_dy+2*orho3*U3*dU1_dy;
665 ds12_dU1=FourThird*du_dx_dU1-TwoThrid*dv_dy_dU1;
666 ds12_dU2=FourThird*du_dx_dU2;
667 ds12_dU3=-TwoThrid*dv_dy_dU3;
668 ds13_dU1=du_dy_dU1+dv_dx_dU1;
674 ds23_dU1=FourThird*dv_dy_dU1-TwoThrid*du_dx_dU1;
675 ds23_dU2=-TwoThrid*du_dx_dU2;
676 ds23_dU3=FourThird*dv_dy_dU3;
677 dsnx_dU1=ds12_dU1*nx+ds22_dU1*ny;
678 dsnx_dU2=ds12_dU2*nx+ds22_dU2*ny;
679 dsnx_dU3=ds12_dU3*nx+ds22_dU3*ny;
680 dsny_dU1=ds13_dU1*nx+ds23_dU1*ny;
681 dsny_dU2=ds13_dU2*nx+ds23_dU2*ny;
682 dsny_dU3=ds13_dU3*nx+ds23_dU3*ny;
683 dsnv_dU1=u*dsnx_dU1+v*dsny_dU1-orho2*U2*snx-orho2*U3*sny;
684 dsnv_dU2=u*dsnx_dU2+v*dsny_dU2+orho1*snx;
685 dsnv_dU3=u*dsnx_dU3+v*dsny_dU3+orho1*sny;
686 tmpArray[0+0*nrow]=tmpArray[0+0*nrow]+mu*dsnx_dU1;
687 tmpArray[0+1*nrow]=tmpArray[0+1*nrow]+mu*dsnx_dU2;
688 tmpArray[0+2*nrow]=tmpArray[0+2*nrow]+mu*dsnx_dU3;
689 tmpArray[1+0*nrow]=tmpArray[1+0*nrow]+mu*dsny_dU1;
690 tmpArray[1+1*nrow]=tmpArray[1+1*nrow]+mu*dsny_dU2;
691 tmpArray[1+2*nrow]=tmpArray[1+2*nrow]+mu*dsny_dU3;
692 tmpArray[2+0*nrow]=tmpArray[2+0*nrow]+mu*dsnv_dU1;
693 tmpArray[2+1*nrow]=tmpArray[2+1*nrow]+mu*dsnv_dU2;
694 tmpArray[2+2*nrow]=tmpArray[2+2*nrow]+mu*dsnv_dU3;
697 NekDouble dqx_dU1,dqx_dU2,dqx_dU3,dqx_dU4;
698 NekDouble dqy_dU1,dqy_dU2,dqy_dU3,dqy_dU4;
700 dqx_dU1=tmpx*(-orho2*dU4_dx+2*orho3*U4*dU1_dx+2*orho3*U2*dU2_dx
701 -3*orho4*U2*U2*dU1_dx+2*orho3*U3*dU3_dx-3*orho4*U3*U3*dU1_dx);
702 dqx_dU2=tmpx*(-orho2*dU2_dx+2*orho3*U2*dU1_dx);
703 dqx_dU3=tmpx*(-orho2*dU3_dx+2*orho3*U3*dU1_dx);
704 dqx_dU4=-tmpx*orho2*dU1_dx;
706 dqy_dU1=tmpy*(-orho2*dU4_dy+2*orho3*U4*dU1_dy+2*orho3*U2*dU2_dy
707 -3*orho4*U2*U2*dU1_dy+2*orho3*U3*dU3_dy-3*orho4*U3*U3*dU1_dy);
708 dqy_dU2=tmpy*(-orho2*dU2_dy+2*orho3*U2*dU1_dy);
709 dqy_dU3=tmpy*(-orho2*dU3_dy+2*orho3*U3*dU1_dy);
710 dqy_dU4=-tmpy*orho2*dU1_dy;
711 tmpArray[2+0*nrow]=tmpArray[2+0*nrow]-dqx_dU1-dqy_dU1;
712 tmpArray[2+1*nrow]=tmpArray[2+1*nrow]-dqx_dU2-dqy_dU2;
713 tmpArray[2+2*nrow]=tmpArray[2+2*nrow]-dqx_dU3-dqy_dU3;
714 tmpArray[2+3*nrow]=tmpArray[2+3*nrow]-dqx_dU4-dqy_dU4;
736 tmpArray = OutputMatrix->GetPtr();
737 int nrow = OutputMatrix->GetRows();
791 NekDouble s12=FourThird*du_dx-TwoThrid*dv_dy-TwoThrid*dw_dz;
795 NekDouble s23=FourThird*dv_dy-TwoThrid*du_dx-TwoThrid*dw_dz;
799 NekDouble s34=FourThird*dw_dz-TwoThrid*du_dx-TwoThrid*dv_dy;
804 NekDouble qx=-tmp2*(orho1*dU5_dx-U5*orho2*dU1_dx-u*(orho1*dU2_dx
805 -U2*orho2*dU1_dx)-v*(orho1*dU3_dx-U3*orho2*dU1_dx)
806 -w*(orho1*dU4_dx-U4*orho2*dU1_dx));
807 NekDouble qy=-tmp2*(orho1*dU5_dy-U5*orho2*dU1_dy-u*(orho1*dU2_dy
808 -U2*orho2*dU1_dy)-v*(orho1*dU3_dy-U3*orho2*dU1_dy)
809 -w*(orho1*dU4_dy-U4*orho2*dU1_dy));
810 NekDouble qz=-tmp2*(orho1*dU5_dz-U5*orho2*dU1_dz-u*(orho1*dU2_dz
811 -U2*orho2*dU1_dz)-v*(orho1*dU3_dz-U3*orho2*dU1_dz)
812 -w*(orho1*dU4_dz-U4*orho2*dU1_dz));
822 dT_dU[0]=oCv*(-orho2*U5+orho3*U2*U2+orho3*U3*U3+orho3*U4*U4);
823 dT_dU[1]=-oCv*orho2*U2;
824 dT_dU[2]=-oCv*orho2*U3;
825 dT_dU[3]=-oCv*orho2*U4;
831 tmpArray[i+j*nrow]=dmu_dT*dT_dU[j]*tmp[i];
845 NekDouble ds12_dU1,ds12_dU2,ds12_dU3,ds12_dU4;
849 NekDouble ds23_dU1,ds23_dU2,ds23_dU3,ds23_dU4;
853 NekDouble ds34_dU1,ds34_dU2,ds34_dU3,ds34_dU4;
854 NekDouble dsnx_dU1,dsnx_dU2,dsnx_dU3,dsnx_dU4;
855 NekDouble dsny_dU1,dsny_dU2,dsny_dU3,dsny_dU4;
856 NekDouble dsnz_dU1,dsnz_dU2,dsnz_dU3,dsnz_dU4;
857 NekDouble dsnv_dU1,dsnv_dU2,dsnv_dU3,dsnv_dU4;
859 du_dx_dU1=-orho2*dU2_dx+2*orho3*U2*dU1_dx;
860 du_dx_dU2=-orho2*dU1_dx;
861 du_dy_dU1=-orho2*dU2_dy+2*orho3*U2*dU1_dy;
862 du_dy_dU2=-orho2*dU1_dy;
863 du_dz_dU1=-orho2*dU2_dz+2*orho3*U2*dU1_dz;
864 du_dz_dU2=-orho2*dU1_dz;
865 dv_dx_dU1=-orho2*dU3_dx+2*orho3*U3*dU1_dx;
866 dv_dx_dU3=-orho2*dU1_dx;
867 dv_dy_dU1=-orho2*dU3_dy+2*orho3*U3*dU1_dy;
868 dv_dy_dU3=-orho2*dU1_dy;
869 dv_dz_dU1=-orho2*dU3_dz+2*orho3*U3*dU1_dz;
870 dv_dz_dU3=-orho2*dU1_dz;
871 dw_dx_dU1=-orho2*dU4_dx+2*orho3*U4*dU1_dx;
872 dw_dx_dU4=-orho2*dU1_dx;
873 dw_dy_dU1=-orho2*dU4_dy+2*orho3*U4*dU1_dy;
874 dw_dy_dU4=-orho2*dU1_dy;
875 dw_dz_dU1=-orho2*dU4_dz+2*orho3*U4*dU1_dz;
876 dw_dz_dU4=-orho2*dU1_dz;
877 ds12_dU1=FourThird*du_dx_dU1-TwoThrid*dv_dy_dU1-TwoThrid*dw_dz_dU1;
878 ds12_dU2=FourThird*du_dx_dU2;
879 ds12_dU3=-TwoThrid*dv_dy_dU3;
880 ds12_dU4=-TwoThrid*dw_dz_dU4;
881 ds13_dU1=du_dy_dU1+dv_dx_dU1;
884 ds14_dU1=dw_dx_dU1+du_dz_dU1;
887 ds22_dU1=du_dy_dU1+dv_dx_dU1;
890 ds23_dU1=FourThird*dv_dy_dU1-TwoThrid*du_dx_dU1-TwoThrid*dw_dz_dU1;
891 ds23_dU2=-TwoThrid*du_dx_dU2;
892 ds23_dU3=FourThird*dv_dy_dU3;
893 ds23_dU4=-TwoThrid*dw_dz_dU4;
894 ds24_dU1=dv_dz_dU1+dw_dy_dU1;
897 ds32_dU1=dw_dx_dU1+du_dz_dU1;
900 ds33_dU1=dv_dz_dU1+dw_dy_dU1;
903 ds34_dU1=FourThird*dw_dz_dU1-TwoThrid*du_dx_dU1-TwoThrid*dv_dy_dU1;
904 ds34_dU2=-TwoThrid*du_dx_dU2;
905 ds34_dU3=-TwoThrid*dv_dy_dU3;
906 ds34_dU4=FourThird*dw_dz_dU4;
907 dsnx_dU1=ds12_dU1*nx+ds22_dU1*ny+ds32_dU1*nz;
908 dsnx_dU2=ds12_dU2*nx+ds22_dU2*ny+ds32_dU2*nz;
909 dsnx_dU3=ds12_dU3*nx+ds22_dU3*ny;
910 dsnx_dU4=ds12_dU4*nx+ds32_dU4*nz;
911 dsny_dU1=ds13_dU1*nx+ds23_dU1*ny+ds33_dU1*nz;
912 dsny_dU2=ds13_dU2*nx+ds23_dU2*ny;
913 dsny_dU3=ds13_dU3*nx+ds23_dU3*ny+ds33_dU3*nz;
914 dsny_dU4=ds23_dU4*ny+ds33_dU4*nz;
915 dsnz_dU1=ds14_dU1*nx+ds24_dU1*ny+ds34_dU1*nz;
916 dsnz_dU2=ds14_dU2*nx+ds34_dU2*nz;
917 dsnz_dU3=ds24_dU3*ny+ds34_dU3*nz;
919 dsnz_dU4=ds14_dU4*nx+ds24_dU4*ny+ds34_dU4*nz;
920 dsnv_dU1=u*dsnx_dU1+v*dsny_dU1+w*dsnz_dU1-orho2*U2*snx
921 -orho2*U3*sny-orho2*U4*snz;
922 dsnv_dU2=u*dsnx_dU2+v*dsny_dU2+w*dsnz_dU2+orho1*snx;
923 dsnv_dU3=u*dsnx_dU3+v*dsny_dU3+w*dsnz_dU3+orho1*sny;
924 dsnv_dU4=u*dsnx_dU4+v*dsny_dU4+w*dsnz_dU4+orho1*snz;
925 tmpArray[0+0*nrow]=tmpArray[0+0*nrow]+mu*dsnx_dU1;
926 tmpArray[0+1*nrow]=tmpArray[0+1*nrow]+mu*dsnx_dU2;
927 tmpArray[0+2*nrow]=tmpArray[0+2*nrow]+mu*dsnx_dU3;
928 tmpArray[0+3*nrow]=tmpArray[0+3*nrow]+mu*dsnx_dU4;
929 tmpArray[1+0*nrow]=tmpArray[1+0*nrow]+mu*dsny_dU1;
930 tmpArray[1+1*nrow]=tmpArray[1+1*nrow]+mu*dsny_dU2;
931 tmpArray[1+2*nrow]=tmpArray[1+2*nrow]+mu*dsny_dU3;
932 tmpArray[1+3*nrow]=tmpArray[1+3*nrow]+mu*dsny_dU4;
933 tmpArray[2+0*nrow]=tmpArray[2+0*nrow]+mu*dsnz_dU1;
934 tmpArray[2+1*nrow]=tmpArray[2+1*nrow]+mu*dsnz_dU2;
935 tmpArray[2+2*nrow]=tmpArray[2+2*nrow]+mu*dsnz_dU3;
936 tmpArray[2+3*nrow]=tmpArray[2+3*nrow]+mu*dsnz_dU4;
937 tmpArray[3+0*nrow]=tmpArray[3+0*nrow]+mu*dsnv_dU1;
938 tmpArray[3+1*nrow]=tmpArray[3+1*nrow]+mu*dsnv_dU2;
939 tmpArray[3+2*nrow]=tmpArray[3+2*nrow]+mu*dsnv_dU3;
940 tmpArray[3+3*nrow]=tmpArray[3+3*nrow]+mu*dsnv_dU4;
943 NekDouble dqx_dU1,dqx_dU2,dqx_dU3,dqx_dU4,dqx_dU5;
944 NekDouble dqy_dU1,dqy_dU2,dqy_dU3,dqy_dU4,dqy_dU5;
945 NekDouble dqz_dU1,dqz_dU2,dqz_dU3,dqz_dU4,dqz_dU5;
947 dqx_dU1=tmpx*(-orho2*dU5_dx+2*orho3*U5*dU1_dx+2*orho3*U2*dU2_dx
948 -3*orho4*U2*U2*dU1_dx+2*orho3*U3*dU3_dx-3*orho4*U3*U3*dU1_dx
949 +2*orho3*U4*dU4_dx-3*orho4*U4*U4*dU1_dx);
950 dqx_dU2=tmpx*(-orho2*dU2_dx+2*orho3*U2*dU1_dx);
951 dqx_dU3=tmpx*(-orho2*dU3_dx+2*orho3*U3*dU1_dx);
952 dqx_dU4=tmpx*(-orho2*dU4_dx+2*orho3*U4*dU1_dx);
953 dqx_dU5=-tmpx*orho2*dU1_dx;
955 dqy_dU1=tmpy*(-orho2*dU5_dy+2*orho3*U5*dU1_dy+2*orho3*U2*dU2_dy
956 -3*orho4*U2*U2*dU1_dy+2*orho3*U3*dU3_dy-3*orho4*U3*U3*dU1_dy
957 +2*orho3*U4*dU4_dy-3*orho4*U4*U4*dU1_dy);
958 dqy_dU2=tmpy*(-orho2*dU2_dy+2*orho3*U2*dU1_dy);
959 dqy_dU3=tmpy*(-orho2*dU3_dy+2*orho3*U3*dU1_dy);
960 dqy_dU4=tmpy*(-orho2*dU4_dy+2*orho3*U4*dU1_dy);
961 dqy_dU5=-tmpy*orho2*dU1_dy;
963 dqz_dU1=tmpz*(-orho2*dU5_dz+2*orho3*U5*dU1_dz+2*orho3*U2*dU2_dz
964 -3*orho4*U2*U2*dU1_dz+2*orho3*U3*dU3_dz-3*orho4*U3*U3*dU1_dz
965 +2*orho3*U4*dU4_dz-3*orho4*U4*U4*dU1_dz);
966 dqz_dU2=tmpz*(-orho2*dU2_dz+2*orho3*U2*dU1_dz);
967 dqz_dU3=tmpz*(-orho2*dU3_dz+2*orho3*U3*dU1_dz);
968 dqz_dU4=tmpz*(-orho2*dU4_dz+2*orho3*U4*dU1_dz);
969 dqz_dU5=-tmpz*orho2*dU1_dz;
970 tmpArray[3+0*nrow]=tmpArray[3+0*nrow]-dqx_dU1-dqy_dU1-dqz_dU1;
971 tmpArray[3+1*nrow]=tmpArray[3+1*nrow]-dqx_dU2-dqy_dU2-dqz_dU2;
972 tmpArray[3+2*nrow]=tmpArray[3+2*nrow]-dqx_dU3-dqy_dU3-dqz_dU3;
973 tmpArray[3+3*nrow]=tmpArray[3+3*nrow]-dqx_dU4-dqy_dU4-dqz_dU4;
974 tmpArray[3+4*nrow]=tmpArray[3+4*nrow]-dqx_dU5-dqy_dU5-dqz_dU5;
978 const int nConvectiveFields,
988 int nSpaceDim =
m_graph->GetSpaceDimension();
994 for(
int j = 0; j < nSpaceDim; j++)
1004 for(
int npnt = 0; npnt < nElmtPnt; npnt++)
1006 for(
int j = 0; j < nConvectiveFields; j++)
1008 pointVar[j] = locVars[j][npnt];
1010 for(
int j = 0; j < nSpaceDim; j++)
1012 for(
int k = 0; k < nConvectiveFields; k++)
1014 pointDerv[j][k] = locDerv[j][k][npnt];
1018 pointmu = locmu[npnt];
1019 pointDmuDT = locDmuDT[npnt];
1023 for (
int j =0; j < nConvectiveFields; j++)
1025 int noffset = j*nConvectiveFields;
1028 tmp1 = PntJacArray[npnt] + (noffset+1),1,
1029 tmp2 = wspMatData + (noffset-j),1,
1030 tmp3 = PntJacArray[npnt] + (noffset+1),1);
1067 int nConvectiveFields = inarray.size();
1068 std::shared_ptr<LocalRegions::ExpansionVector> expvect =
1070 int nTotElmt = (*expvect).size();
1071 int nPts = explist->GetTotPoints();
1072 int nSpaceDim =
m_graph->GetSpaceDimension();
1081 m_varConv->GetTemperature(inarray,temperature);
1082 m_varConv->GetDynamicViscosity(temperature, mu);
1100 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1102 int nElmtPnt = (*expvect)[nelmt]->GetTotPoints();
1103 int noffest = explist->GetPhys_Offset(nelmt);
1105 for(
int j = 0; j < nConvectiveFields; j++)
1107 locVars[j] = inarray[j]+noffest;
1110 for(
int j = 0; j < nSpaceDim; j++)
1112 locnormal[j] = normals[j]+noffest;
1115 locmu = mu + noffest;
1116 for(
int npnt = 0; npnt < nElmtPnt; npnt++)
1118 for(
int j = 0; j < nConvectiveFields; j++)
1120 pointVar[j] = locVars[j][npnt];
1122 for(
int j = 0; j < nSpaceDim; j++)
1124 pointnormals[j] = locnormal[j][npnt];
1127 pointmu = locmu[npnt];
1130 pointVar,PointFJac);
1131 for (
int j =0; j < nConvectiveFields; j++)
1133 ElmtJacArray[0][j][nFluxDir][nelmt][npnt] = 0.0;
1135 for (
int j =0; j < nConvectiveFields; j++)
1137 int noffset = j*(nConvectiveFields-1);
1138 for (
int i =0; i < nConvectiveFields-1; i++)
1140 ElmtJacArray[i+1][j][nFluxDir][nelmt][npnt] =
1141 PointFJac_data[noffset+i];
1149 const int nConvectiveFields,
1158 int nSpaceDim =
m_graph->GetSpaceDimension();
1169 for(
int npnt = 0; npnt < nElmtPnt; npnt++)
1171 for(
int j = 0; j < nConvectiveFields; j++)
1173 pointVar[j] = locVars[j][npnt];
1175 for(
int j = 0; j < nSpaceDim; j++)
1177 pointnormals[j] = locnormal[j][npnt];
1180 pointmu = locmu[npnt];
1184 Vmath::Zero(nConvectiveFields,PntJacArray[npnt],nConvectiveFields);
1185 for (
int j =0; j < nConvectiveFields; j++)
1187 int noffset = j*(nConvectiveFields-1);
1189 tmp1 = wspMatData + noffset,1,
1190 tmp2 = PntJacArray[npnt] + noffset+j+1,1);
1202 int nConvectiveFields = inarray.size();
1203 std::shared_ptr<LocalRegions::ExpansionVector> expvect =
1205 int nTotElmt = (*expvect).size();
1206 int nPts = explist->GetTotPoints();
1207 int nSpaceDim =
m_graph->GetSpaceDimension();
1213 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1215 int nElmtPnt = (*expvect)[nelmt]->GetTotPoints();
1217 for(
int npnt = 0; npnt < nElmtPnt; npnt++)
1232 m_varConv->GetTemperature(inarray,temperature);
1233 m_varConv->GetDynamicViscosity(temperature, mu);
1265 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1267 int nElmtPnt = (*expvect)[nelmt]->GetTotPoints();
1268 int noffest = explist->GetPhys_Offset(nelmt);
1270 for (
int j = 0; j < nConvectiveFields; j++)
1272 locVars[j] = inarray[j]+noffest;
1275 for (
int j = 0; j < nSpaceDim; j++)
1277 locnormal[j] = normals[j]+noffest;
1280 locmu = mu + noffest;
1281 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1283 for (
int j = 0; j < nConvectiveFields; j++)
1285 pointVar[j] = locVars[j][npnt];
1287 for (
int j = 0; j < nSpaceDim; j++)
1289 pointnormals[j] = locnormal[j][npnt];
1292 pointmu = locmu[npnt];
1295 pointVar,PointFJac);
1296 tmpMatinnData = PointFJac->GetPtr();
1297 tmpMatoutData = ElmtJac[nelmt][npnt]->GetPtr();
1301 for (
int j =0; j < nConvectiveFields; j++)
1304 tmp1 = tmpMatinnData + (j*(nConvectiveFields-1)),1,
1305 tmp2 = tmpMatoutData + (1+j*nConvectiveFields),1);
1315 int nConvectiveFields =
m_fields.size();
1325 for(
int j = 0; j< nConvectiveFields; j++)
1340 int npoints = mu.size();
1344 m_varConv->GetTemperature(inarray,temperature);
1345 m_varConv->GetDynamicViscosity(temperature, mu);
1348 m_varConv->GetDmuDT(temperature,mu,DmuDT);
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
virtual void v_InitObject()
Initialization object for CFSImplicit class.
Array< OneD, NekDouble > m_muav
NekDouble m_bndEvaluateTime
Array< OneD, NekDouble > m_muavTrace
std::string m_shockCaptureType
SolverUtils::DiffusionSharedPtr m_diffusion
VariableConverterSharedPtr m_varConv
ArtificialDiffusionSharedPtr m_artificialDiffusion
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void GetPhysicalAV(const Array< OneD, const Array< OneD, NekDouble >> &physfield)
Calculate the physical artificial viscosity.
void InitObject_Explicit()
bool m_is_diffIP
flag to switch between IP and LDG an enum could be added for more options
Array< OneD, NekDouble > m_mu
std::string m_ViscosityType
void GetdFlux_dU_2D(const Array< OneD, NekDouble > &normals, const NekDouble mu, const NekDouble dmu_dT, const Array< OneD, NekDouble > &U, const Array< OneD, const Array< OneD, NekDouble > > &qfield, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian Input: normals:Point normals mu: dynamicviscosity dmu_dT: mu's deriva...
virtual void v_GetDiffusionFluxJacPoint(const Array< OneD, NekDouble > &conservVar, const Array< OneD, const Array< OneD, NekDouble >> &conseDeriv, const NekDouble mu, const NekDouble DmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &fluxJac)
Array< OneD, GetdFlux_dDeriv > m_GetdFlux_dDeriv_Array
virtual void v_GetFluxDerivJacDirctn(const MultiRegions::ExpListSharedPtr &explist, const Array< OneD, const Array< OneD, NekDouble >> &normals, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray5D< NekDouble > &ElmtJacArray, const int nFluxDir)
void GetdFlux_dQx_3D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian derived with Qx=[drho_dx,drhou_dx,drhov_dx,drhow_dx,...
virtual void v_DoDiffusionCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)
virtual void v_CalcMuDmuDT(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &mu, Array< OneD, NekDouble > &DmuDT)
virtual void v_InitObject()
Initialization object for CompressibleFlowSystem class.
void GetdFlux_dQx_2D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian:
virtual void v_CalcPhysDeriv(const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield)
void GetdFlux_dQy_3D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian derived with Qy=[drho_dy,drhou_dy,drhov_dy,drhow_dy,...
virtual void v_MinusDiffusionFluxJacPoint(const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const TensorOfArray3D< NekDouble > &locDerv, const Array< OneD, NekDouble > &locmu, const Array< OneD, NekDouble > &locDmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
virtual ~NavierStokesImplicitCFE()
void GetdFlux_dQz_3D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian derived with Qz=[drho_dz,drhou_dz,drhov_dz,drhow_dz,...
void GetdFlux_dQy_2D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian:
virtual void v_GetFluxDerivJacDirctnElmt(const int nConvectiveFields, const int nElmtPnt, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &locmu, const Array< OneD, const Array< OneD, NekDouble >> &locnormal, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
void GetdFlux_dU_3D(const Array< OneD, NekDouble > &normals, const NekDouble mu, const NekDouble dmu_dT, const Array< OneD, NekDouble > &U, const Array< OneD, const Array< OneD, NekDouble >> &qfield, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian Input: normals:Point normals mu: dynamicviscosity dmu_dT: mu's deriva...
int m_spacedim
Spatial dimension (>= expansion dim).
SpatialDomains::MeshGraphSharedPtr m_graph
Pointer to graph defining mesh.
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
SOLVER_UTILS_EXPORT int GetNpoints()
SOLVER_UTILS_EXPORT int GetNcoeffs()
SOLVER_UTILS_EXPORT int GetTotPoints()
Base class for unsteady solvers.
bool m_CalcPhysicalAV
flag to update artificial viscosity
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
EquationSystemFactory & GetEquationSystemFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
The above copyright notice and this permission notice shall be included.
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.