441 double dt = args.
scalar<
double>(
"dt");
442 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
443 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
444 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
445 xt::pyarray<double>& mesh_velocity_dof = args.
array<
double>(
"mesh_velocity_dof");
446 double MOVING_DOMAIN = args.
scalar<
double>(
"MOVING_DOMAIN");
447 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
448 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
449 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
450 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
451 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
452 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
453 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
454 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
455 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
456 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
457 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
458 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
459 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
460 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
461 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
462 int nElements_global = args.
scalar<
int>(
"nElements_global");
463 double useMetrics = args.
scalar<
double>(
"useMetrics");
464 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
465 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
466 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
467 double sc_uref = args.
scalar<
double>(
"sc_uref");
468 double sc_alpha = args.
scalar<
double>(
"sc_alpha");
469 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
470 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
471 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
472 double degree_polynomial = args.
scalar<
double>(
"degree_polynomial");
473 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
474 xt::pyarray<double>& u_dof_old = args.
array<
double>(
"u_dof_old");
475 xt::pyarray<double>& velocity = args.
array<
double>(
"velocity");
476 xt::pyarray<double>& velocity_old = args.
array<
double>(
"velocity_old");
477 xt::pyarray<double>& q_m = args.
array<
double>(
"q_m");
478 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
479 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
480 xt::pyarray<double>& q_porosity_old = args.
array<
double>(
"q_porosity_old");
481 xt::pyarray<double>& q_rho = args.
array<
double>(
"q_rho");
482 xt::pyarray<double>& q_rho_old = args.
array<
double>(
"q_rho_old");
484 xt::pyarray<double>& q_r = args.
array<
double>(
"q_r");
485 const double alpha_L = args.
scalar<
double>(
"alpha_L");
486 const double alpha_T = args.
scalar<
double>(
"alpha_T");
487 const double Dm = args.
scalar<
double>(
"Dm");
493 const double rho_f = args.
scalar<
double>(
"rho_f");
494 const double rho_s = args.
scalar<
double>(
"rho_s");
495 int forceStrongConditions = args.
scalar<
int>(
"forceStrongConditions");
497 xt::pyarray<double>& q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
498 xt::pyarray<double>& q_dV = args.
array<
double>(
"q_dV");
499 xt::pyarray<double>& q_dV_last = args.
array<
double>(
"q_dV_last");
500 xt::pyarray<double>& cfl = args.
array<
double>(
"cfl");
501 xt::pyarray<double>& edge_based_cfl = args.
array<
double>(
"edge_based_cfl");
502 xt::pyarray<double>& q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
503 xt::pyarray<double>& q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
504 int offset_u = args.
scalar<
int>(
"offset_u");
505 int stride_u = args.
scalar<
int>(
"stride_u");
506 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
507 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
508 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
509 xt::pyarray<int>& elementBoundaryMaterialTypes = args.
array<
int>(
"elementBoundaryMaterialTypes");
510 xt::pyarray<int>& isExteriorBoundaryPhysical = args.
array<
int>(
"isExteriorBoundaryPhysical");
511 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
512 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
513 xt::pyarray<double>& ebqe_velocity_ext = args.
array<
double>(
"ebqe_velocity_ext");
514 xt::pyarray<int>& isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
515 xt::pyarray<double>& ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
516 xt::pyarray<int>& isFluxBoundary_u = args.
array<
int>(
"isFluxBoundary_u");
517 xt::pyarray<double>& ebqe_bc_flux_u_ext = args.
array<
double>(
"ebqe_bc_flux_u_ext");
518 xt::pyarray<double>& ebqe_bc_diffusiveFlux_u_ext = args.
array<
double>(
"ebqe_bc_diffusiveFlux_u_ext");
519 xt::pyarray<double>& ebqe_porosity = args.
array<
double>(
"ebqe_porosity");
520 xt::pyarray<double>& ebqe_rho = args.
array<
double>(
"ebqe_rho");
522 double epsFact = args.
scalar<
double>(
"epsFact");
523 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
524 xt::pyarray<double>& ebqe_flux = args.
array<
double>(
"ebqe_flux");
525 int stage = args.
scalar<
int>(
"stage");
526 xt::pyarray<double>& uTilde_dof = args.
array<
double>(
"uTilde_dof");
527 double cE = args.
scalar<
double>(
"cE");
529 double cK = args.
scalar<
double>(
"cK");
530 double uL = args.
scalar<
double>(
"uL");
531 double uR = args.
scalar<
double>(
"uR");
532 int numDOFs = args.
scalar<
int>(
"numDOFs");
533 int NNZ = args.
scalar<
int>(
"NNZ");
534 xt::pyarray<int>& csrRowIndeces_DofLoops = args.
array<
int>(
"csrRowIndeces_DofLoops");
535 xt::pyarray<int>& csrColumnOffsets_DofLoops = args.
array<
int>(
"csrColumnOffsets_DofLoops");
536 xt::pyarray<int>& csrRowIndeces_CellLoops = args.
array<
int>(
"csrRowIndeces_CellLoops");
537 xt::pyarray<int>& csrColumnOffsets_CellLoops = args.
array<
int>(
"csrColumnOffsets_CellLoops");
538 xt::pyarray<int>& csrColumnOffsets_eb_CellLoops = args.
array<
int>(
"csrColumnOffsets_eb_CellLoops");
539 xt::pyarray<double>& ML = args.
array<
double>(
"ML");
540 int LUMPED_MASS_MATRIX = args.
scalar<
int>(
"LUMPED_MASS_MATRIX");
545 xt::pyarray<double>& uLow = args.
array<
double>(
"uLow");
546 xt::pyarray<double>& dLow = args.
array<
double>(
"dLow");
547 xt::pyarray<double>& dt_times_dH_minus_dL = args.
array<
double>(
"dt_times_dH_minus_dL");
548 xt::pyarray<double>& min_u_bc = args.
array<
double>(
"min_u_bc");
549 xt::pyarray<double>& max_u_bc = args.
array<
double>(
"max_u_bc");
550 xt::pyarray<double>& quantDOFs = args.
array<
double>(
"quantDOFs");
555 xt::pyarray<double>& Sn_dof = args.
array<
double>(
"Sn_dof");
556 const double k_d = args.
scalar<
double>(
"k_d");
557 const double c_sat = args.
scalar<
double>(
"c_sat");
559 xt::pyarray<int>& a_rowptr = args.
array<
int>(
"a_rowptr");
560 xt::pyarray<int>& a_colind = args.
array<
int>(
"a_colind");
564 xt::pyarray<int>& isDiffusiveFluxBoundary_u = args.
array<
int>(
"isDiffusiveFluxBoundary_u");
565 xt::pyarray<int>& isAdvectiveFluxBoundary_u = args.
array<
int>(
"isAdvectiveFluxBoundary_u");
566 xt::pyarray<double>& ebqe_bc_advectiveFlux_u_ext = args.
array<
double>(
"ebqe_bc_advectiveFlux_u_ext");
567 xt::pyarray<double>& ebqe_penalty_ext = args.
array<
double>(
"ebqe_penalty_ext");
569 double physicalDiffusion = args.
scalar<
double>(
"physicalDiffusion");
570 const double eb_adjoint_sigma = args.
scalar<
double>(
"eb_adjoint_sigma");
572 double meanEntropy = 0., meanOmega = 0., maxEntropy = -1E10, minEntropy = 1E10;
573 const double eps_rho = (rho_s - rho_f)/rho_f;
574 const double zL_mass = uL + eps_rho*uL*uL;
575 const double zR_mass = uR + eps_rho*uR*uR;
576 maxVel.resize(nElements_global, 0.0);
587 m_dof.resize(numDOFs,0.0);
602 for (
int eN=0; eN<nElements_global; eN++)
603 for (
int k=0; k<nQuadraturePoints_element; k++)
605 int eN_k = eN*nQuadraturePoints_element + k;
606 double jac[nSpace*nSpace], jacDet, jacInv[nSpace*nSpace], x, y,
z;
607 ck.calculateMapping_element(eN,
611 mesh_trial_ref.data(),
612 mesh_grad_trial_ref.data(),
617 const double dV = fabs(jacDet)*dV_ref.data()[k];
618 const double theta_k = q_porosity_old.data()[eN_k];
619 for (
int i=0; i<nDOF_test_element; i++)
621 int eN_i = eN*nDOF_test_element+i;
622 const int gi = u_l2g.data()[eN_i];
623 const double w = u_test_ref.data()[k*nDOF_trial_element+i]*dV;
628 for (
int i=0; i<numDOFs; i++)
635 const double un_i = u_dof_old.data()[i];
640 psi.resize(numDOFs,0.0);
641 eta.resize(numDOFs,0.0);
644 for (
int i=0; i<numDOFs; i++)
653 const double mass_scale_i = fmax(
theta_dof_proj[i]*rho_f, 1.0e-14);
654 const double z_i =
m_dof[i]/mass_scale_i;
655 eta[i] =
ELOG(z_i,zL_mass,zR_mass);
672 for(
int eN=0;eN<nElements_global;eN++)
676 elementResidual_u[nDOF_test_element],
677 element_entropy_residual[nDOF_test_element];
678 double elementTransport[nDOF_test_element][nDOF_trial_element];
679 double elementDiffusion[nDOF_test_element][nDOF_trial_element];
680 double elementTransposeTransport[nDOF_test_element][nDOF_trial_element];
681 for (
int i=0;i<nDOF_test_element;i++)
683 elementResidual_u[i]=0.0;
690 for (
int i=0;i<nDOF_test_element;i++)
692 element_entropy_residual[i]=0.0;
693 for (
int j=0;j<nDOF_trial_element;j++)
695 elementTransport[i][j]=0.0;
696 elementDiffusion[i][j]=0.0;
697 elementTransposeTransport[i][j]=0.0;
702 for (
int k=0;k<nQuadraturePoints_element;k++)
705 int eN_k = eN*nQuadraturePoints_element+k,
706 eN_k_nSpace = eN_k*nSpace,
707 eN_nDOF_trial_element = eN*nDOF_trial_element;
710 entVisc_minus_artComp,
712 grad_u[nSpace],grad_u_old[nSpace],grad_uTilde[nSpace],
713 rho_out=0.0,rho_out_old=0.0,
714 m=0.0,dm=0.0,mn=0.0,dmn=0.0,
715 H=0.0,Hn=0.0,HTilde=0.0,
716 f[nSpace],fn[nSpace],
df[nSpace],dfn[nSpace],
722 Lstar_u[nDOF_test_element],
724 tau=0.0,tau0=0.0,tau1=0.0,
725 numDiff0=0.0,numDiff1=0.0,
728 jacInv[nSpace*nSpace],
729 u_grad_trial[nDOF_trial_element*nSpace],
730 u_test_dV[nDOF_trial_element],
731 u_grad_test_dV[nDOF_test_element*nSpace],
733 G[nSpace*nSpace],G_dd_G,tr_G,
735 aux_entropy_residual=0.0, DENTROPY_un, DENTROPY_uni;
737 ck.calculateMapping_element(eN,
741 mesh_trial_ref.data(),
742 mesh_grad_trial_ref.data(),
747 ck.calculateMappingVelocity_element(eN,
749 mesh_velocity_dof.data(),
751 mesh_trial_ref.data(),
754 dV = fabs(jacDet)*dV_ref.data()[k];
755 ck.calculateG(jacInv,G,G_dd_G,tr_G);
757 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],
761 ck.valFromDOF(u_dof.data(),
762 &u_l2g.data()[eN_nDOF_trial_element],
763 &u_trial_ref.data()[k*nDOF_trial_element],
765 ck.valFromDOF(u_dof_old.data(),
766 &u_l2g.data()[eN_nDOF_trial_element],
767 &u_trial_ref.data()[k*nDOF_trial_element],
770 ck.gradFromDOF(u_dof.data(),
771 &u_l2g.data()[eN_nDOF_trial_element],
774 ck.gradFromDOF(u_dof_old.data(),
775 &u_l2g.data()[eN_nDOF_trial_element],
778 ck.gradFromDOF(uTilde_dof.data(),
779 &u_l2g.data()[eN_nDOF_trial_element],
783 for (
int j=0;j<nDOF_trial_element;j++)
785 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
786 for (
int I=0;I<nSpace;I++)
788 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
798 &velocity.data()[eN_k_nSpace],
802 q_porosity.data()[eN*nQuadraturePoints_element+k],
813 q_rho.data()[eN_k] = rho_out;
817 &velocity_old.data()[eN_k_nSpace],
821 q_porosity_old.data()[eN*nQuadraturePoints_element+k],
837 double mesh_velocity[3];
838 mesh_velocity[0] =
xt;
839 mesh_velocity[1] = yt;
840 mesh_velocity[2] = zt;
842 for (
int I=0;I<nSpace;I++)
844 f[I] -= MOVING_DOMAIN*m*mesh_velocity[I];
845 df[I] -= MOVING_DOMAIN*dm*mesh_velocity[I];
846 fn[I] -= MOVING_DOMAIN*mn*mesh_velocity[I];
847 dfn[I] -= MOVING_DOMAIN*dmn*mesh_velocity[I];
852 if (q_dV_last.data()[eN_k] <= -100)
853 q_dV_last.data()[eN_k] = dV;
854 q_dV.data()[eN_k] = dV;
856 q_m_betaBDF.data()[eN_k]*q_dV_last.data()[eN_k]/dV,
862 const double thetaW_k = std::max(q_porosity_old.data()[eN_k], 1.0e-8);
863 double dfn_pore[nSpace];
864 for (
int I=0; I<nSpace; I++) dfn_pore[I] = dfn[I] / thetaW_k;
868 double normVel=0., norm_grad_un=0.;
869 for (
int I=0;I<nSpace;I++)
871 Hn += dfn[I]*grad_u_old[I];
872 HTilde += dfn[I]*grad_uTilde[I];
873 fn[I] = dfn[I]*un-MOVING_DOMAIN*m*mesh_velocity[I];
874 H += dfn[I]*grad_u[I];
875 normVel += dfn[I]*
df[I];
876 norm_grad_un += grad_u_old[I]*grad_u_old[I];
878 normVel = std::sqrt(normVel);
879 norm_grad_un = std::sqrt(norm_grad_un)+1E-10;
882 calculateCFL(elementDiameter.data()[eN]/degree_polynomial,dfn_pore,cfl.data()[eN_k]);
893 meanEntropy +=
EPOWER(
u,0,1)*dV;
895 maxEntropy = fmax(maxEntropy,
EPOWER(
u,0,1));
896 minEntropy = fmin(minEntropy,
EPOWER(
u,0,1));
899 double hK=elementDiameter.data()[eN]/degree_polynomial;
900 entVisc_minus_artComp = fmax(1-cK*fmax(un*(1-un),0)/hK/norm_grad_un,0);
908 pdeResidual_u =
ck.Mass_strong(m_t) +
ck.Advection_strong(
df,grad_u);
910 for (
int i=0;i<nDOF_test_element;i++)
912 int i_nSpace = i*nSpace;
913 Lstar_u[i] =
ck.Advection_adjoint(
df,&u_grad_test_dV[i_nSpace]);
923 tau = useMetrics*tau1+(1.0-useMetrics)*tau0;
925 subgridError_u = -tau*pdeResidual_u;
929 ck.calculateNumericalDiffusion(shockCapturingDiffusion,
930 elementDiameter.data()[eN],
934 ck.calculateNumericalDiffusion(shockCapturingDiffusion,
942 q_numDiff_u.data()[eN_k] = useMetrics*numDiff1+(1.0-useMetrics)*numDiff0;
946 aux_entropy_residual = m_t;
947 for (
int I=0;I<nSpace;I++)
948 aux_entropy_residual += dfn[I]*grad_u_old[I];
950 DENTROPY_un =
DEPOWER(mn,uL,uR);
953 const double mass_scale_k = fmax(q_porosity_old.data()[eN_k]*rho_f, 1.0e-14);
954 const double z_n = mn/mass_scale_k;
955 DENTROPY_un =
DELOG(z_n,zL_mass,zR_mass)/mass_scale_k;
957 calculateCFL(elementDiameter.data()[eN]/degree_polynomial,dfn_pore,cfl.data()[eN_k]);
960 calculateCFL(elementDiameter.data()[eN]/degree_polynomial,dfn_pore,cfl.data()[eN_k]);
962 for(
int i=0;i<nDOF_test_element;i++)
964 int i_nSpace=i*nSpace;
968 elementResidual_u[i] +=
969 ck.Mass_weak(dt*m_t,u_test_dV[i]) +
970 1./3*dt*(
ck.Advection_weak(fn,&u_grad_test_dV[i_nSpace]) +
971 ck.Diffusion_weak(a_rowptr.data(),a_colind.data(),a,grad_u,&u_grad_test_dV[i_nSpace])+
972 ck.NumericalDiffusion(physicalDiffusion, grad_u_old, &u_grad_test_dV[i_nSpace])) +
973 1./9*dt*dt*
ck.NumericalDiffusion(Hn,dfn,&u_grad_test_dV[i_nSpace]) +
974 1./3*dt*entVisc_minus_artComp*
ck.NumericalDiffusion(q_numDiff_u_last.data()[eN_k]+physicalDiffusion,
976 &u_grad_test_dV[i_nSpace]);
979 elementResidual_u[i] +=
980 ck.Mass_weak(dt*m_t,u_test_dV[i]) +
981 dt*(
ck.Advection_weak(fn,&u_grad_test_dV[i_nSpace]) +
982 ck.Diffusion_weak(a_rowptr.data(),a_colind.data(),an,grad_u,&u_grad_test_dV[i_nSpace])+
983 ck.NumericalDiffusion(physicalDiffusion, grad_u_old, &u_grad_test_dV[i_nSpace])) +
984 0.5*dt*dt*
ck.NumericalDiffusion(HTilde,dfn,&u_grad_test_dV[i_nSpace]) +
985 dt*entVisc_minus_artComp*
ck.NumericalDiffusion(q_numDiff_u_last.data()[eN_k]+physicalDiffusion,
987 &u_grad_test_dV[i_nSpace]);
991 elementResidual_u[i] +=
992 ck.Mass_weak(m_t,u_test_dV[i]) +
993 ck.Advection_weak(
f,&u_grad_test_dV[i_nSpace]) +
994 ck.Diffusion_weak(a_rowptr.data(),a_colind.data(),a,grad_u,&u_grad_test_dV[i_nSpace]) +
995 ck.SubgridError(subgridError_u,Lstar_u[i]) +
996 ck.NumericalDiffusion(q_numDiff_u_last.data()[eN_k] + physicalDiffusion,
998 &u_grad_test_dV[i_nSpace]);
1005 int eN_i=eN*nDOF_test_element+i;
1008 element_entropy_residual[i] += DENTROPY_un*aux_entropy_residual*u_test_dV[i];
1010 elementResidual_u[i] += (
u-un)*u_test_dV[i];
1012 for(
int j=0;j<nDOF_trial_element;j++)
1014 int j_nSpace = j*nSpace;
1015 int i_nSpace = i*nSpace;
1016 elementTransport[i][j] +=
1017 ck.AdvectionJacobian_weak(adv_df,
1018 u_trial_ref.data()[k*nDOF_trial_element+j],
1019 &u_grad_test_dV[i_nSpace])
1021 ck.SimpleDiffusionJacobian_weak(a_rowptr.data(),
1024 &u_grad_trial[j_nSpace],
1025 &u_grad_test_dV[i_nSpace]);
1030 elementDiffusion[i][j] +=
ck.NumericalDiffusionJacobian(physicalDiffusion,
1031 &u_grad_trial[j_nSpace],
1032 &u_grad_test_dV[i_nSpace]);
1033 elementTransposeTransport[i][j] +=
ck.AdvectionJacobian_weak(adv_df,
1034 u_trial_ref.data()[k*nDOF_trial_element+i],
1035 &u_grad_test_dV[j_nSpace])+
1036 ck.SimpleDiffusionJacobian_weak(a_rowptr.data(),
1039 &u_grad_trial[j_nSpace],
1040 &u_grad_test_dV[i_nSpace]);
1047 elementResidual_u[i] +=
1048 ck.Mass_weak(m_t,u_test_dV[i]) +
1049 ck.Advection_weak(
f,&u_grad_test_dV[i_nSpace])+
1050 ck.Diffusion_weak(a_rowptr.data(),a_colind.data(),a,grad_u,&u_grad_test_dV[i_nSpace]);
1060 q_u.data()[eN_k] =
u;
1061 q_m.data()[eN_k] = m;
1068 for(
int i=0;i<nDOF_test_element;i++)
1070 int eN_i=eN*nDOF_test_element+i;
1071 int gi = offset_u+stride_u*u_l2g.data()[eN_i];
1072 globalResidual.data()[gi] += elementResidual_u[i];
1083 for (
int j=0;j<nDOF_trial_element;j++)
1085 int eN_i_j = eN_i*nDOF_trial_element+j;
1087 csrColumnOffsets_CellLoops.data()[eN_i_j]] += elementTransport[i][j];
1089 csrColumnOffsets_CellLoops.data()[eN_i_j]] += elementDiffusion[i][j];
1091 csrColumnOffsets_CellLoops.data()[eN_i_j]]
1092 += elementTransposeTransport[i][j];
1103 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
1105 double min_u_bc_local = 1E10, max_u_bc_local = -1E10;
1106 int ebN = exteriorElementBoundariesArray.data()[ebNE],
1107 eN = elementBoundaryElementsArray.data()[ebN*2+0],
1108 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+0],
1109 eN_nDOF_trial_element = eN*nDOF_trial_element;
1110 const int eN_out = elementBoundaryElementsArray.data()[ebN*2+1];
1111 const int ebFlag = elementBoundaryMaterialTypes.data()[ebN];
1113 if (ebFlag <= 0 || isExteriorBoundaryPhysical.data()[ebNE] == 0 || eN_out >= 0)
1117 double elementResidual_u[nDOF_test_element],
1118 fluxTransport[nDOF_test_element][nDOF_trial_element];
1119 for (
int i=0;i<nDOF_test_element;i++)
1121 elementResidual_u[i]=0.0;
1122 for (
int j=0;j<nDOF_trial_element;j++)
1123 fluxTransport[i][j] = 0.0;
1125 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
1127 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
1128 ebNE_kb_nSpace = ebNE_kb*nSpace,
1129 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
1130 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
1154 difffluxjacobian_ext=0.0,
1157 jac_ext[nSpace*nSpace],
1159 jacInv_ext[nSpace*nSpace],
1160 boundaryJac[nSpace*(nSpace-1)],
1161 metricTensor[(nSpace-1)*(nSpace-1)],
1162 metricTensorDetSqrt,
1164 u_test_dS[nDOF_test_element],
1165 u_grad_trial_trace[nDOF_trial_element*nSpace],
1166 u_grad_test_dS[nDOF_trial_element*nSpace],
1167 normal[nSpace],x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,
1169 G[nSpace*nSpace],G_dd_G,tr_G;
1175 ck.calculateMapping_elementBoundary(eN,
1181 mesh_trial_trace_ref.data(),
1182 mesh_grad_trial_trace_ref.data(),
1183 boundaryJac_ref.data(),
1189 metricTensorDetSqrt,
1193 ck.calculateMappingVelocity_elementBoundary(eN,
1197 mesh_velocity_dof.data(),
1199 mesh_trial_trace_ref.data(),
1200 xt_ext,yt_ext,zt_ext,
1205 dS = ((1.0-MOVING_DOMAIN)*metricTensorDetSqrt + MOVING_DOMAIN*integralScaling)*dS_ref.data()[kb];
1208 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
1211 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],
1213 u_grad_trial_trace);
1217 ck.valFromDOF(u_dof_old.data(),
1218 &u_l2g.data()[eN_nDOF_trial_element],
1219 &u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],
1221 ck.gradFromDOF(u_dof_old.data(),
1222 &u_l2g.data()[eN_nDOF_trial_element],
1228 ck.valFromDOF(u_dof.data(),
1229 &u_l2g.data()[eN_nDOF_trial_element],
1230 &u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],
1232 ck.gradFromDOF(u_dof.data(),
1233 &u_l2g.data()[eN_nDOF_trial_element],
1238 for (
int j=0;j<nDOF_trial_element;j++)
1240 u_test_dS[j] = u_test_trace_ref.data()[ebN_local_kb*nDOF_test_element+j]*dS;
1241 for (
int I=0;I<nSpace;I++)
1242 u_grad_test_dS[j*nSpace+I] = u_grad_trial_trace[j*nSpace+I]*dS;
1248 bc_u_ext = isDOFBoundary_u.data()[ebNE_kb]*ebqe_bc_u_ext.data()[ebNE_kb]+
1249 (1-isDOFBoundary_u.data()[ebNE_kb])*u_ext;
1256 double rho_out_ext=0.0,rho_out_bc=0.0;
1259 &ebqe_velocity_ext.data()[ebNE_kb_nSpace],
1263 ebqe_porosity.data()[ebNE_kb],
1274 ebqe_rho.data()[ebNE_kb] = rho_out_ext;
1278 &ebqe_velocity_ext.data()[ebNE_kb_nSpace],
1282 ebqe_porosity.data()[ebNE_kb],
1295 double mesh_velocity[3];
1296 mesh_velocity[0] = xt_ext;
1297 mesh_velocity[1] = yt_ext;
1298 mesh_velocity[2] = zt_ext;
1300 for (
int I=0;I<nSpace;I++)
1302 f_ext[I] -= MOVING_DOMAIN*m_ext*mesh_velocity[I];
1303 df_ext[I] -= MOVING_DOMAIN*dm_ext*mesh_velocity[I];
1304 bc_f_ext[I] -= MOVING_DOMAIN*bc_m_ext*mesh_velocity[I];
1305 bc_df_ext[I] -= MOVING_DOMAIN*bc_dm_ext*mesh_velocity[I];
1311 isFluxBoundary_u.data()[ebNE_kb],
1312 forceStrongConditions,
1314 ebqe_bc_flux_u_ext.data()[ebNE_kb],
1321 isDOFBoundary_u.data()[ebNE_kb],
1322 isDiffusiveFluxBoundary_u.data()[ebNE_kb],
1326 ebqe_bc_diffusiveFlux_u_ext.data()[ebNE_kb],
1330 ebqe_penalty_ext.data()[ebNE_kb],
1332 flux_ext = flux_adv_ext + flux_diff_ext;
1333 double boundary_flow = 0.0;
1334 for (
int I=0; I<nSpace; I++)
1335 boundary_flow += normal[I]*df_ext[I];
1337 ebqe_flux.data()[ebNE_kb] = flux_ext;
1338 if (isDOFBoundary_u.data()[ebNE_kb] == 1)
1339 ebqe_u.data()[ebNE_kb] = bc_u_ext;
1340 else if (boundary_flow >= 0.0)
1341 ebqe_u.data()[ebNE_kb] = u_ext;
1343 ebqe_u.data()[ebNE_kb] = bc_u_ext;
1347 flux_ext *= 1./3*dt;
1355 for (
int i=0;i<nDOF_test_element;i++)
1360 elementResidual_u[i] +=
ck.ExteriorElementBoundaryFlux(flux_ext,u_test_dS[i])+
1361 ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_u.data()[ebNE_kb],
1362 isDiffusiveFluxBoundary_u.data()[ebNE_kb],
1370 &u_grad_test_dS[i*nSpace]);
1376 const double boundaryAdvectiveContribution =
1377 ck.ExteriorElementBoundaryFlux(flux_ext,u_test_dS[i]);
1378 const double boundaryDiffusiveContribution =
1379 ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_u.data()[ebNE_kb],
1380 isDiffusiveFluxBoundary_u.data()[ebNE_kb],
1388 &u_grad_test_dS[i*nSpace]);
1389 const double boundaryResidualContribution =
1390 boundaryAdvectiveContribution + boundaryDiffusiveContribution;
1392 isFluxBoundary_u.data()[ebNE_kb],
1393 forceStrongConditions,
1398 if (dflux_u_u_ext> 0.0)
1400 double boundaryTransportContribution = 0.0;
1401 for (
int j=0;j<nDOF_trial_element;j++)
1403 int ebN_local_kb_j=ebN_local_kb*nDOF_trial_element+j;
1404 double advJacobian_ext = 0.0, diffJacobian_ext = 0.0;
1406 isFluxBoundary_u.data()[ebNE_kb],
1407 forceStrongConditions,
1412 isDiffusiveFluxBoundary_u.data()[ebNE_kb],
1419 &u_grad_trial_trace[j*nSpace],
1420 u_trial_trace_ref.data()[ebN_local_kb_j],
1421 ebqe_penalty_ext.data()[ebNE_kb],
1423 difffluxjacobian_ext = advJacobian_ext*u_trial_trace_ref.data()[ebN_local_kb_j]
1425 const double localFluxTransportContribution =
1426 difffluxjacobian_ext*u_test_dS[i];
1427 fluxTransport[i][j] += localFluxTransportContribution;
1428 boundaryTransportContribution +=
1429 localFluxTransportContribution*u_dof_old.data()[u_l2g.data()[eN_nDOF_trial_element+j]];
1431 elementResidual_u[i] += boundaryResidualContribution - boundaryTransportContribution;
1435 elementResidual_u[i] += boundaryResidualContribution;
1451 if (isDOFBoundary_u.data()[ebNE_kb] == 1 && boundary_flow < 0.0)
1453 const double upwind_penalty_rate = -boundary_flow;
1454 elementResidual_u[i] += upwind_penalty_rate
1455 * (u_ext - bc_u_ext)
1469 const double u_for_bound =
1470 isDOFBoundary_u.data()[ebNE_kb]
1471 ? ebqe_bc_u_ext.data()[ebNE_kb]
1472 : ebqe_u.data()[ebNE_kb];
1473 min_u_bc_local = fmin(u_for_bound, min_u_bc_local);
1474 max_u_bc_local = fmax(u_for_bound, max_u_bc_local);
1479 for (
int i=0;i<nDOF_test_element;i++)
1481 int eN_i = eN*nDOF_test_element+i;
1482 int gi = offset_u+stride_u*u_l2g.data()[eN_i];
1485 globalResidual.data()[gi] += dt*elementResidual_u[i];
1487 min_u_bc[gi] = fmin(min_u_bc_local,min_u_bc[gi]);
1488 max_u_bc[gi] = fmax(max_u_bc_local,max_u_bc[gi]);
1489 for (
int j=0;j<nDOF_trial_element;j++)
1492 TransportMatrix[csrRowIndeces_CellLoops.data()[eN_i] + csrColumnOffsets_eb_CellLoops.data()[ebN_i_j]]
1493 += fluxTransport[i][j];
1495 += fluxTransport[j][i];
1507 min_u_bc[gi] = fmin(min_u_bc_local,min_u_bc[gi]);
1508 max_u_bc[gi] = fmax(max_u_bc_local,max_u_bc[gi]);
1512 globalResidual.data()[offset_u+stride_u*r_l2g.data()[eN_i]] += elementResidual_u[i];
1518 meanEntropy /= meanOmega;
1519 double norm_factor = fmax(fabs(maxEntropy - meanEntropy), fabs(meanEntropy-minEntropy));
1520 for(
int eN=0;eN<nElements_global;eN++)
1522 double hK=elementDiameter.data()[eN]/degree_polynomial;
1523 double linear_viscosity =
cMax*hK*
maxVel[eN];
1524 double entropy_viscosity =
cE*hK*hK*
maxEntRes[eN]/norm_factor;
1525 for (
int k=0;k<nQuadraturePoints_element;k++)
1527 int eN_k = eN*nQuadraturePoints_element+k;
1528 q_numDiff_u.data()[eN_k] = fmin(linear_viscosity,entropy_viscosity);
1543 for (
int i=0; i<numDOFs; i++)
1545 double etaMaxi, etaMini;
1549 etaMaxi = fabs(
eta[i]);
1550 etaMini = fabs(
eta[i]);
1553 double alpha_numerator = 0., alpha_denominator = 0.;
1554 for (
int offset=csrRowIndeces_DofLoops.data()[i]; offset<csrRowIndeces_DofLoops.data()[i+1]; offset++)
1556 int j = csrColumnOffsets_DofLoops.data()[offset];
1560 etaMaxi = fmax(etaMaxi,fabs(
eta[j]));
1561 etaMini = fmin(etaMini,fabs(
eta[j]));
1566 const double mi =
m_dof[i];
1567 const double mj =
m_dof[j];
1568 alpha_numerator += mi - mj;
1569 alpha_denominator += fabs(mi - mj);
1580 double alphai = alpha_numerator/(alpha_denominator+1E-15);
1581 quantDOFs[i] = alphai;
1593 for (
int i=0; i<numDOFs; i++)
1595 const double mi_mass =
m_dof[i];
1599 const double drho_du = rho_s - rho_f;
1600 const double dmdu_i = theta_i * (rho_i + ui_mass*drho_du);
1601 double ith_dissipative_term_mass = 0;
1602 double ith_low_order_dissipative_term_mass = 0;
1603 double ith_flux_term_mass = 0;
1609 for (
int offset=csrRowIndeces_DofLoops.data()[i]; offset<csrRowIndeces_DofLoops.data()[i+1]; offset++)
1611 int j = csrColumnOffsets_DofLoops.data()[offset];
1612 const double mj_mass =
m_dof[j];
1615 double dLowij, dLij, dEVij, dHij;
1621 double solij = 0.5*(ui_mass+uj_mass);
1622 double Compij = cK*fmax(solij*(1.0-solij),0.0)/(fabs(ui_mass-uj_mass)+1E-14);
1625 dLij = dLowij*fmax(
psi[i],
psi[j]);
1631 dHij = fmin(dLowij,dEVij) * fmax(1.0-Compij,0.0);
1635 dHij = dLij * fmax(1.0-Compij,0.0);
1650 ith_dissipative_term_mass += dHij*(uj_mass-ui_mass);
1651 ith_low_order_dissipative_term_mass += dLowij*(uj_mass-ui_mass);
1653 dt_times_dH_minus_dL[ij] = dt*(dHij - dLowij);
1663 dt_times_dH_minus_dL[ij]=0;
1669 double mi = ML.data()[i];
1681 edge_based_cfl.data()[i] = 2.*fabs(dLii)/(mi * fmax(dmdu_i, 1.0e-14));
1694 const double S_n_i = Sn_dof.data()[i];
1695 const double rho_w_i = rho_f * (1.0 + ((rho_s - rho_f)/rho_f) * ui_mass);
1696 const double R_diss_i = theta_i * rho_w_i * k_d * S_n_i
1697 * (c_sat - ui_mass);
1699 const double mLow_i = mi_mass - dt/mi*(ith_flux_term_mass
1700 + boundary_integral_mass
1701 - ith_low_order_dissipative_term_mass)
1706 if (LUMPED_MASS_MATRIX==1)
1708 const double mHigh_i = mi_mass - dt/mi*(ith_flux_term_mass
1709 + boundary_integral_mass
1710 - ith_dissipative_term_mass)
1715 globalResidual.data()[i] += dt*(ith_flux_term_mass - ith_dissipative_term_mass - R_diss_i);
1758 const double drho_du = rho_s - rho_f;
1760 std::valarray<double> m_new(numDOFs);
1761 for (
int i=0; i<numDOFs; i++)
1763 const double ci = u_dof.data()[i];
1765 const double rho_ci = rho_f*(1.0 + (drho_du/rho_f)*ci);
1766 m_new[i] = theta_i*rho_ci*ci;
1769 for (
int i=0; i<numDOFs; i++)
1771 const double ci = u_dof.data()[i];
1773 const double rho_ci = rho_f*(1.0 + (drho_du/rho_f)*ci);
1774 const double mi_new = m_new[i];
1775 const double mn_i =
m_dof[i];
1776 const double MLi = ML.data()[i];
1778 double ith_upwind_flux_term_mass = 0.0;
1779 for (
int offset=csrRowIndeces_DofLoops.data()[i]; offset<csrRowIndeces_DofLoops.data()[i+1]; offset++)
1781 int j = csrColumnOffsets_DofLoops.data()[offset];
1784 const double cj = u_dof.data()[j];
1785 const double rho_cj = rho_f*(1.0 + (drho_du/rho_f)*cj);
1788 const double delta_c = cj - ci;
1789 const double T_neg = fmax(0.0, -T_ij);
1790 const double D_neg = fmax(0.0, -D_ij);
1791 const double rho_up = (-T_ij*delta_c <= 0.0) ? rho_ci : rho_cj;
1793 const double a_ij = T_neg*(rho_up/rho_f) + D_neg;
1794 ith_upwind_flux_term_mass += -a_ij*delta_c;
1822 const double dHij = 0.0;
1823 dt_times_dH_minus_dL.data()[ij] = dt*(dHij - dLow.data()[ij]);
1828 dLow.data()[ij] = 0.0;
1829 dt_times_dH_minus_dL.data()[ij] = 0.0;
1835 const double S_n_i = Sn_dof.data()[i];
1836 const double rho_w_i = rho_ci;
1837 const double R_diss_i = theta_i * rho_w_i * k_d * S_n_i * (c_sat - ci);
1839 globalResidual.data()[i] = MLi*(mi_new - mn_i)/dt
1840 + ith_upwind_flux_term_mass
1862 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1863 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1864 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1865 xt::pyarray<double>& mesh_velocity_dof = args.
array<
double>(
"mesh_velocity_dof");
1866 double MOVING_DOMAIN = args.
scalar<
double>(
"MOVING_DOMAIN");
1867 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1868 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1869 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1870 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1871 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1872 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1873 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1874 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1875 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
1876 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1877 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1878 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1879 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1880 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
1881 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1882 int nElements_global = args.
scalar<
int>(
"nElements_global");
1883 double useMetrics = args.
scalar<
double>(
"useMetrics");
1884 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
1885 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
1886 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
1887 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1888 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
1889 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1890 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1891 xt::pyarray<double>& velocity = args.
array<
double>(
"velocity");
1892 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
1893 xt::pyarray<double>& q_rho = args.
array<
double>(
"q_rho");
1894 xt::pyarray<double>& q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
1895 xt::pyarray<double>& cfl = args.
array<
double>(
"cfl");
1896 xt::pyarray<double>& q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
1897 xt::pyarray<int>& csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
1898 xt::pyarray<int>& csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
1899 xt::pyarray<double>& globalJacobian = args.
array<
double>(
"globalJacobian");
1900 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1901 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1902 xt::pyarray<int>& elementBoundaryMaterialTypes = args.
array<
int>(
"elementBoundaryMaterialTypes");
1903 xt::pyarray<int>& isExteriorBoundaryPhysical = args.
array<
int>(
"isExteriorBoundaryPhysical");
1904 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1905 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1906 xt::pyarray<double>& ebqe_velocity_ext = args.
array<
double>(
"ebqe_velocity_ext");
1907 xt::pyarray<int>& isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
1908 xt::pyarray<double>& ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
1909 xt::pyarray<int>& isFluxBoundary_u = args.
array<
int>(
"isFluxBoundary_u");
1910 xt::pyarray<double>& ebqe_bc_flux_u_ext = args.
array<
double>(
"ebqe_bc_flux_u_ext");
1911 xt::pyarray<double>& ebqe_porosity = args.
array<
double>(
"ebqe_porosity");
1912 xt::pyarray<double>& ebqe_rho = args.
array<
double>(
"ebqe_rho");
1913 xt::pyarray<int>& csrColumnOffsets_eb_u_u = args.
array<
int>(
"csrColumnOffsets_eb_u_u");
1917 double physicalDiffusion = args.
scalar<
double>(
"physicalDiffusion");
1918 const double alpha_L = args.
scalar<
double>(
"alpha_L");
1919 const double alpha_T = args.
scalar<
double>(
"alpha_T");
1920 const double Dm = args.
scalar<
double>(
"Dm");
1921 int forceStrongConditions = args.
scalar<
int>(
"forceStrongConditions");
1927 const double rho_f = args.
scalar<
double>(
"rho_f");
1928 const double rho_s = args.
scalar<
double>(
"rho_s");
1933 double Ct_sge = 4.0;
1938 xt::pyarray<int>& a_rowptr = args.
array<
int>(
"a_rowptr");
1939 xt::pyarray<int>& a_colind = args.
array<
int>(
"a_colind");
1942 xt::pyarray<int>& isDiffusiveFluxBoundary_u = args.
array<
int>(
"isDiffusiveFluxBoundary_u");
1943 xt::pyarray<double>& ebqe_penalty_ext = args.
array<
double>(
"ebqe_penalty_ext");
1968 const double dt = args.
scalar<
double>(
"dt");
1969 const int numDOFs = args.
scalar<
int>(
"numDOFs");
1970 xt::pyarray<double>& ML = args.
array<
double>(
"ML");
1971 xt::pyarray<double>& dLow = args.
array<
double>(
"dLow");
1972 xt::pyarray<double>& Sn_dof = args.
array<
double>(
"Sn_dof");
1973 const double k_d = args.
scalar<
double>(
"k_d");
1974 const double c_sat = args.
scalar<
double>(
"c_sat");
1975 xt::pyarray<int>& csrRowIndeces_DofLoops = args.
array<
int>(
"csrRowIndeces_DofLoops");
1976 xt::pyarray<int>& csrColumnOffsets_DofLoops = args.
array<
int>(
"csrColumnOffsets_DofLoops");
1977 const double drho_du = rho_s - rho_f;
1980 std::valarray<double> dmdu(numDOFs);
1981 for (
int i=0; i<numDOFs; i++)
1983 const double ci = u_dof.data()[i];
1985 const double rho_ci = rho_f*(1.0 + (drho_du/rho_f)*ci);
1986 dmdu[i] = theta_i*(rho_ci + ci*drho_du);
1989 for (
int i=0; i<numDOFs; i++)
1991 const double ci = u_dof.data()[i];
1993 const double rho_ci = rho_f*(1.0 + (drho_du/rho_f)*ci);
1994 const double MLi = ML.data()[i];
1995 const double S_n_i = Sn_dof.data()[i];
1997 const double dRdiss_dci = theta_i*k_d*S_n_i*( drho_du*(c_sat - ci) - rho_ci );
2001 for (
int offset=csrRowIndeces_DofLoops.data()[i]; offset<csrRowIndeces_DofLoops.data()[i+1]; offset++)
2003 int j = csrColumnOffsets_DofLoops.data()[offset];
2012 const double cj = u_dof.data()[j];
2013 const double rho_cj= rho_f*(1.0 + (drho_du/rho_f)*cj);
2014 const double T_neg = fmax(0.0, -T_ij);
2015 const double D_neg = fmax(0.0, -D_ij);
2016 const double rho_up= (-T_ij*(cj - ci) <= 0.0) ? rho_ci : rho_cj;
2017 const double a_ij = T_neg*(rho_up/rho_f) + D_neg;
2018 globalJacobian.data()[ij] += -a_ij;
2026 globalJacobian.data()[diag_ij] += MLi*dmdu[i]/dt
2040 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
2042 int ebN = exteriorElementBoundariesArray.data()[ebNE];
2043 const int eN_out = elementBoundaryElementsArray.data()[ebN*2+1];
2044 const int ebFlag = elementBoundaryMaterialTypes.data()[ebN];
2045 if (ebFlag <= 0 || isExteriorBoundaryPhysical.data()[ebNE] == 0 || eN_out >= 0)
2047 int eN = elementBoundaryElementsArray.data()[ebN*2+0],
2048 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+0],
2049 eN_nDOF_trial_element = eN*nDOF_trial_element;
2050 double fluxJacobian_u_u[nDOF_test_element][nDOF_trial_element];
2051 for (
int i=0;i<nDOF_test_element;i++)
2052 for (
int j=0;j<nDOF_trial_element;j++)
2053 fluxJacobian_u_u[i][j]=0.0;
2054 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
2056 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
2057 ebNE_kb_nSpace = ebNE_kb*nSpace,
2058 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
2059 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
2060 double u_ext=0.0, grad_u_ext[nSpace], m_ext=0.0, dm_ext=0.0,
2061 f_ext[nSpace], df_ext[nSpace], a_ext[
nnz], da_ext[
nnz],
2062 bc_a_ext[
nnz], bc_da_ext[
nnz], difffluxjacobian_ext=0.0,
2063 bc_u_ext=0.0, bc_m_ext=0.0, bc_dm_ext=0.0,
2064 bc_f_ext[nSpace], bc_df_ext[nSpace],
2065 jac_ext[nSpace*nSpace], jacDet_ext, jacInv_ext[nSpace*nSpace],
2066 boundaryJac[nSpace*(nSpace-1)], metricTensor[(nSpace-1)*(nSpace-1)],
2067 metricTensorDetSqrt, dS, u_test_dS[nDOF_test_element],
2068 u_grad_trial_trace[nDOF_trial_element*nSpace],
2069 u_grad_test_dS[nDOF_trial_element*nSpace], normal[nSpace],
2070 x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,
2071 G[nSpace*nSpace],G_dd_G,tr_G;
2072 ck.calculateMapping_elementBoundary(eN,ebN_local,kb,ebN_local_kb,mesh_dof.data(),mesh_l2g.data(),mesh_trial_trace_ref.data(),mesh_grad_trial_trace_ref.data(),boundaryJac_ref.data(),jac_ext,jacDet_ext,jacInv_ext,boundaryJac,metricTensor,metricTensorDetSqrt,normal_ref.data(),normal,x_ext,y_ext,z_ext);
2073 ck.calculateMappingVelocity_elementBoundary(eN,ebN_local,kb,ebN_local_kb,mesh_velocity_dof.data(),mesh_l2g.data(),mesh_trial_trace_ref.data(),xt_ext,yt_ext,zt_ext,normal,boundaryJac,metricTensor,integralScaling);
2074 dS = ((1.0-MOVING_DOMAIN)*metricTensorDetSqrt + MOVING_DOMAIN*integralScaling)*dS_ref.data()[kb];
2075 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
2076 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,u_grad_trial_trace);
2077 ck.valFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],u_ext);
2078 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial_trace,grad_u_ext);
2079 for (
int j=0;j<nDOF_trial_element;j++)
2081 u_test_dS[j] = u_test_trace_ref.data()[ebN_local_kb*nDOF_test_element+j]*dS;
2082 for (
int I=0;I<nSpace;I++)
2083 u_grad_test_dS[j*nSpace+I]= u_grad_trial_trace[j*nSpace+I]*dS;
2085 bc_u_ext = isDOFBoundary_u.data()[ebNE_kb]*ebqe_bc_u_ext.data()[ebNE_kb]+(1-isDOFBoundary_u.data()[ebNE_kb])*u_ext;
2086 double rho_out_ext=0.0,rho_out_bc=0.0;
2087 evaluateCoefficients(a_rowptr.data(),a_colind.data(),&ebqe_velocity_ext.data()[ebNE_kb_nSpace],alpha_L,alpha_T,Dm,ebqe_porosity.data()[ebNE_kb],rho_f,rho_s,u_ext,rho_out_ext,m_ext,dm_ext,f_ext,df_ext,a_ext,da_ext);
2088 evaluateCoefficients(a_rowptr.data(),a_colind.data(),&ebqe_velocity_ext.data()[ebNE_kb_nSpace],alpha_L,alpha_T,Dm,ebqe_porosity.data()[ebNE_kb],rho_f,rho_s,bc_u_ext,rho_out_bc,bc_m_ext,bc_dm_ext,bc_f_ext,bc_df_ext,bc_a_ext,bc_da_ext);
2089 double mesh_velocity[3]; mesh_velocity[0]=xt_ext; mesh_velocity[1]=yt_ext; mesh_velocity[2]=zt_ext;
2090 for (
int I=0;I<nSpace;I++)
2092 f_ext[I] -= MOVING_DOMAIN*m_ext*mesh_velocity[I];
2093 df_ext[I] -= MOVING_DOMAIN*dm_ext*mesh_velocity[I];
2094 bc_f_ext[I] -= MOVING_DOMAIN*bc_m_ext*mesh_velocity[I];
2095 bc_df_ext[I] -= MOVING_DOMAIN*bc_dm_ext*mesh_velocity[I];
2097 for (
int i=0;i<nDOF_test_element;i++)
2098 for (
int j=0;j<nDOF_trial_element;j++)
2100 int ebN_local_kb_j=ebN_local_kb*nDOF_trial_element+j;
2101 double advJacobian_ext = 0.0, diffJacobian_ext = 0.0;
2103 exteriorNumericalDiffusiveFluxDerivative(isDOFBoundary_u.data()[ebNE_kb],isDiffusiveFluxBoundary_u.data()[ebNE_kb],a_rowptr.data(),a_colind.data(),normal,a_ext,da_ext,grad_u_ext,&u_grad_trial_trace[j*nSpace],u_trial_trace_ref.data()[ebN_local_kb_j],ebqe_penalty_ext.data()[ebNE_kb],diffJacobian_ext);
2104 difffluxjacobian_ext = advJacobian_ext*u_trial_trace_ref.data()[ebN_local_kb_j] + diffJacobian_ext;
2105 fluxJacobian_u_u[i][j] += difffluxjacobian_ext*u_test_dS[i];
2108 for (
int i=0;i<nDOF_test_element;i++)
2110 int eN_i = eN*nDOF_test_element+i;
2111 for (
int j=0;j<nDOF_trial_element;j++)
2114 globalJacobian.data()[csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_eb_u_u.data()[ebN_i_j]] += fluxJacobian_u_u[i][j];
2124 for(
int eN=0;eN<nElements_global;eN++)
2126 double elementJacobian_u_u[nDOF_test_element][nDOF_trial_element];
2127 for (
int i=0;i<nDOF_test_element;i++)
2128 for (
int j=0;j<nDOF_trial_element;j++)
2130 elementJacobian_u_u[i][j]=0.0;
2132 for (
int k=0;k<nQuadraturePoints_element;k++)
2134 int eN_k = eN*nQuadraturePoints_element+k,
2135 eN_k_nSpace = eN_k*nSpace,
2136 eN_nDOF_trial_element = eN*nDOF_trial_element;
2142 f[nSpace],
df[nSpace],
2146 dpdeResidual_u_u[nDOF_trial_element],
2147 Lstar_u[nDOF_test_element],
2148 dsubgridError_u_u[nDOF_trial_element],
2149 tau=0.0,tau0=0.0,tau1=0.0,
2152 jacInv[nSpace*nSpace],
2153 u_grad_trial[nDOF_trial_element*nSpace],
2155 u_test_dV[nDOF_test_element],
2156 u_grad_test_dV[nDOF_test_element*nSpace],
2158 G[nSpace*nSpace],G_dd_G,tr_G;
2163 ck.calculateMapping_element(eN,
2167 mesh_trial_ref.data(),
2168 mesh_grad_trial_ref.data(),
2173 ck.calculateMappingVelocity_element(eN,
2175 mesh_velocity_dof.data(),
2177 mesh_trial_ref.data(),
2180 dV = fabs(jacDet)*dV_ref.data()[k];
2181 ck.calculateG(jacInv,G,G_dd_G,tr_G);
2183 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],jacInv,u_grad_trial);
2185 ck.valFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_ref.data()[k*nDOF_trial_element],
u);
2187 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial,grad_u);
2189 for (
int j=0;j<nDOF_trial_element;j++)
2191 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
2192 for (
int I=0;I<nSpace;I++)
2194 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
2204 &velocity.data()[eN_k_nSpace],
2208 q_porosity.data()[eN*nQuadraturePoints_element+k],
2222 double mesh_velocity[3];
2223 mesh_velocity[0] =
xt;
2224 mesh_velocity[1] = yt;
2225 mesh_velocity[2] = zt;
2227 for(
int I=0;I<nSpace;I++)
2229 f[I] -= MOVING_DOMAIN*m*mesh_velocity[I];
2230 df[I] -= MOVING_DOMAIN*dm*mesh_velocity[I];
2236 q_m_betaBDF.data()[eN_k],
2247 for (
int i=0;i<nDOF_test_element;i++)
2249 int i_nSpace = i*nSpace;
2250 Lstar_u[i]=
ck.Advection_adjoint(
df,&u_grad_test_dV[i_nSpace]);
2253 for (
int j=0;j<nDOF_trial_element;j++)
2255 int j_nSpace = j*nSpace;
2256 dpdeResidual_u_u[j]=
ck.MassJacobian_strong(dm_t,u_trial_ref.data()[k*nDOF_trial_element+j]) +
2257 ck.AdvectionJacobian_strong(
df,&u_grad_trial[j_nSpace]);
2272 tau = useMetrics*tau1+(1.0-useMetrics)*tau0;
2274 for(
int j=0;j<nDOF_trial_element;j++)
2275 dsubgridError_u_u[j] = -tau*dpdeResidual_u_u[j];
2277 for(
int i=0;i<nDOF_test_element;i++)
2279 for(
int j=0;j<nDOF_trial_element;j++)
2281 int j_nSpace = j*nSpace;
2282 int i_nSpace = i*nSpace;
2285 elementJacobian_u_u[i][j] +=
2286 ck.MassJacobian_weak(dm_t,
2287 u_trial_ref.data()[k*nDOF_trial_element+j],
2289 ck.AdvectionJacobian_weak(
df,
2290 u_trial_ref.data()[k*nDOF_trial_element+j],
2291 &u_grad_test_dV[i_nSpace]) +
2292 ck.DiffusionJacobian_weak(a_rowptr.data(),a_colind.data(),a,da,
2293 grad_u,&u_grad_test_dV[i_nSpace],1.0,
2294 u_trial_ref.data()[k*nDOF_trial_element+j],&u_grad_trial[j_nSpace])
2296 ck.NumericalDiffusionJacobian(physicalDiffusion,
2297 &u_grad_trial[j_nSpace],
2298 &u_grad_test_dV[i_nSpace]);
2302 elementJacobian_u_u[i][j] +=
2303 ck.MassJacobian_weak(dm_t,
2304 u_trial_ref.data()[k*nDOF_trial_element+j],
2306 ck.AdvectionJacobian_weak(
df,
2307 u_trial_ref.data()[k*nDOF_trial_element+j],
2308 &u_grad_test_dV[i_nSpace]) +
2309 ck.DiffusionJacobian_weak(a_rowptr.data(),a_colind.data(),a,da,
2310 grad_u,&u_grad_test_dV[i_nSpace],1.0,
2311 u_trial_ref.data()[k*nDOF_trial_element+j],&u_grad_trial[j_nSpace])+
2313 ck.SubgridErrorJacobian(dsubgridError_u_u[j],Lstar_u[i]) +
2314 ck.NumericalDiffusionJacobian(q_numDiff_u_last.data()[eN_k] + physicalDiffusion,
2315 &u_grad_trial[j_nSpace],
2316 &u_grad_test_dV[i_nSpace]);
2323 elementJacobian_u_u[i][j] +=
2324 ck.MassJacobian_weak(1.0,
2325 u_trial_ref.data()[k*nDOF_trial_element+j],
2334 for (
int i=0;i<nDOF_test_element;i++)
2336 int eN_i = eN*nDOF_test_element+i;
2337 for (
int j=0;j<nDOF_trial_element;j++)
2339 int eN_i_j = eN_i*nDOF_trial_element+j;
2340 globalJacobian.data()[csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_u_u.data()[eN_i_j]] += elementJacobian_u_u[i][j];
2349 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
2351 int ebN = exteriorElementBoundariesArray.data()[ebNE];
2352 const int eN_out = elementBoundaryElementsArray.data()[ebN*2+1];
2353 const int ebFlag = elementBoundaryMaterialTypes.data()[ebN];
2354 if (ebFlag <= 0 || isExteriorBoundaryPhysical.data()[ebNE] == 0 || eN_out >= 0)
2356 int eN = elementBoundaryElementsArray.data()[ebN*2+0],
2357 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+0],
2358 eN_nDOF_trial_element = eN*nDOF_trial_element;
2359 double fluxJacobian_u_u[nDOF_test_element][nDOF_trial_element];
2360 for (
int i=0;i<nDOF_test_element;i++)
2361 for (
int j=0;j<nDOF_trial_element;j++)
2363 fluxJacobian_u_u[i][j]=0.0;
2365 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
2367 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
2368 ebNE_kb_nSpace = ebNE_kb*nSpace,
2369 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
2370 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
2384 difffluxjacobian_ext=0.0,
2392 diffusiveFluxJacobian_u_u[nDOF_trial_element],
2394 jac_ext[nSpace*nSpace],
2396 jacInv_ext[nSpace*nSpace],
2397 boundaryJac[nSpace*(nSpace-1)],
2398 metricTensor[(nSpace-1)*(nSpace-1)],
2399 metricTensorDetSqrt,
2401 u_test_dS[nDOF_test_element],
2402 u_grad_trial_trace[nDOF_trial_element*nSpace],
2403 u_grad_test_dS[nDOF_trial_element*nSpace],
2404 normal[nSpace],x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,
2406 G[nSpace*nSpace],G_dd_G,tr_G;
2411 ck.calculateMapping_elementBoundary(eN,
2417 mesh_trial_trace_ref.data(),
2418 mesh_grad_trial_trace_ref.data(),
2419 boundaryJac_ref.data(),
2425 metricTensorDetSqrt,
2429 ck.calculateMappingVelocity_elementBoundary(eN,
2433 mesh_velocity_dof.data(),
2435 mesh_trial_trace_ref.data(),
2436 xt_ext,yt_ext,zt_ext,
2441 dS = ((1.0-MOVING_DOMAIN)*metricTensorDetSqrt + MOVING_DOMAIN*integralScaling)*dS_ref.data()[kb];
2442 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
2445 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,u_grad_trial_trace);
2447 ck.valFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],u_ext);
2448 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial_trace,grad_u_ext);
2450 for (
int j=0;j<nDOF_trial_element;j++)
2452 u_test_dS[j] = u_test_trace_ref.data()[ebN_local_kb*nDOF_test_element+j]*dS;
2453 for (
int I=0;I<nSpace;I++)
2455 u_grad_test_dS[j*nSpace+I]= u_grad_trial_trace[j*nSpace+I]*dS;
2461 bc_u_ext = isDOFBoundary_u.data()[ebNE_kb]*ebqe_bc_u_ext.data()[ebNE_kb]+(1-isDOFBoundary_u.data()[ebNE_kb])*u_ext;
2468 double rho_out_ext=0.0,rho_out_bc=0.0;
2471 &ebqe_velocity_ext.data()[ebNE_kb_nSpace],
2475 ebqe_porosity.data()[ebNE_kb],
2490 &ebqe_velocity_ext.data()[ebNE_kb_nSpace],
2494 ebqe_porosity.data()[ebNE_kb],
2508 double mesh_velocity[3];
2509 mesh_velocity[0] = xt_ext;
2510 mesh_velocity[1] = yt_ext;
2511 mesh_velocity[2] = zt_ext;
2512 for (
int I=0;I<nSpace;I++)
2514 f_ext[I] -= MOVING_DOMAIN*m_ext*mesh_velocity[I];
2515 df_ext[I] -= MOVING_DOMAIN*dm_ext*mesh_velocity[I];
2516 bc_f_ext[I] -= MOVING_DOMAIN*bc_m_ext*mesh_velocity[I];
2517 bc_df_ext[I] -= MOVING_DOMAIN*bc_dm_ext*mesh_velocity[I];
2525 for (
int i=0;i<nDOF_test_element;i++)
2526 for (
int j=0;j<nDOF_trial_element;j++)
2528 int ebN_local_kb_j=ebN_local_kb*nDOF_trial_element+j;
2530 double advJacobian_ext = 0.0, diffJacobian_ext = 0.0;
2532 isFluxBoundary_u.data()[ebNE_kb],
2533 forceStrongConditions,
2538 isDiffusiveFluxBoundary_u.data()[ebNE_kb],
2545 &u_grad_trial_trace[j*nSpace],
2546 u_trial_trace_ref.data()[ebN_local_kb_j],
2547 ebqe_penalty_ext.data()[ebNE_kb],
2549 difffluxjacobian_ext = advJacobian_ext*u_trial_trace_ref.data()[ebN_local_kb_j]
2551 fluxJacobian_u_u[i][j] += difffluxjacobian_ext*u_test_dS[i];
2557 for (
int i=0;i<nDOF_test_element;i++)
2559 int eN_i = eN*nDOF_test_element+i;
2560 for (
int j=0;j<nDOF_trial_element;j++)
2563 globalJacobian.data()[csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_eb_u_u.data()[ebN_i_j]] += fluxJacobian_u_u[i][j];