261 double dt = args.
scalar<
double>(
"dt");
262 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
263 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
264 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
265 xt::pyarray<double>& mesh_velocity_dof = args.
array<
double>(
"mesh_velocity_dof");
266 double MOVING_DOMAIN = args.
scalar<
double>(
"MOVING_DOMAIN");
267 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
268 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
269 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
270 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
271 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
272 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
273 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
274 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
275 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
276 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
277 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
278 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
279 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
280 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
281 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
282 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
283 int nElements_global = args.
scalar<
int>(
"nElements_global");
284 double useMetrics = args.
scalar<
double>(
"useMetrics");
285 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
286 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
287 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
288 double sc_uref = args.
scalar<
double>(
"sc_uref");
289 double sc_alpha = args.
scalar<
double>(
"sc_alpha");
290 const xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
291 const xt::pyarray<double>& porosity_dof = args.
array<
double>(
"porosity_dof");
292 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
293 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
294 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
295 xt::pyarray<double>& elementBoundaryDiameter = args.
array<
double>(
"elementBoundaryDiameter");
296 double degree_polynomial = args.
scalar<
double>(
"degree_polynomial");
297 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
298 xt::pyarray<double>& u_dof_old = args.
array<
double>(
"u_dof_old");
299 xt::pyarray<double>& velocity = args.
array<
double>(
"velocity");
300 xt::pyarray<double>& q_m = args.
array<
double>(
"q_m");
301 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
302 xt::pyarray<double>& q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
303 xt::pyarray<double>& q_dV = args.
array<
double>(
"q_dV");
304 xt::pyarray<double>& q_dV_last = args.
array<
double>(
"q_dV_last");
305 xt::pyarray<double>& cfl = args.
array<
double>(
"cfl");
306 xt::pyarray<double>& edge_based_cfl = args.
array<
double>(
"edge_based_cfl");
307 xt::pyarray<double>& q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
308 xt::pyarray<double>& q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
309 int offset_u = args.
scalar<
int>(
"offset_u");
310 int stride_u = args.
scalar<
int>(
"stride_u");
311 xt::pyarray<int>& csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
312 xt::pyarray<int>& csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
313 xt::pyarray<int>& csrColumnOffsets_eb_u_u = args.
array<
int>(
"csrColumnOffsets_eb_u_u");
314 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
315 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
316 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
317 xt::pyarray<int>& elementBoundariesArray = args.
array<
int>(
"elementBoundariesArray");
318 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
319 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
320 xt::pyarray<double>& ebqe_velocity_ext = args.
array<
double>(
"ebqe_velocity_ext");
321 const xt::pyarray<double>& ebqe_porosity_ext = args.
array<
double>(
"ebqe_porosity_ext");
322 xt::pyarray<int>& isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
323 xt::pyarray<double>& ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
324 xt::pyarray<int>& isFluxBoundary_u = args.
array<
int>(
"isFluxBoundary_u");
325 xt::pyarray<double>& ebqe_bc_flux_u_ext = args.
array<
double>(
"ebqe_bc_flux_u_ext");
326 xt::pyarray<double>& ebqe_phi = args.
array<
double>(
"ebqe_phi");
327 double epsFact = args.
scalar<
double>(
"epsFact");
328 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
329 xt::pyarray<double>& ebqe_flux = args.
array<
double>(
"ebqe_flux");
330 int stage = args.
scalar<
int>(
"stage");
331 xt::pyarray<double>& uTilde_dof = args.
array<
double>(
"uTilde_dof");
332 double cE = args.
scalar<
double>(
"cE");
334 double cK = args.
scalar<
double>(
"cK");
335 double uL = args.
scalar<
double>(
"uL");
336 double uR = args.
scalar<
double>(
"uR");
337 int numDOFs = args.
scalar<
int>(
"numDOFs");
338 int NNZ = args.
scalar<
int>(
"NNZ");
339 xt::pyarray<int>& csrRowIndeces_DofLoops = args.
array<
int>(
"csrRowIndeces_DofLoops");
340 xt::pyarray<int>& csrColumnOffsets_DofLoops = args.
array<
int>(
"csrColumnOffsets_DofLoops");
341 xt::pyarray<int>& csrRowIndeces_CellLoops = args.
array<
int>(
"csrRowIndeces_CellLoops");
342 xt::pyarray<int>& csrColumnOffsets_CellLoops = args.
array<
int>(
"csrColumnOffsets_CellLoops");
343 xt::pyarray<int>& csrColumnOffsets_eb_CellLoops = args.
array<
int>(
"csrColumnOffsets_eb_CellLoops");
344 xt::pyarray<double>& ML = args.
array<
double>(
"ML");
345 int LUMPED_MASS_MATRIX = args.
scalar<
int>(
"LUMPED_MASS_MATRIX");
346 int STABILIZATION_TYPE = args.
scalar<
int>(
"STABILIZATION_TYPE");
347 int ENTROPY_TYPE = args.
scalar<
int>(
"ENTROPY_TYPE");
348 xt::pyarray<double>& uLow = args.
array<
double>(
"uLow");
349 xt::pyarray<double>& dLow = args.
array<
double>(
"dLow");
350 xt::pyarray<double>& dt_times_dH_minus_dL = args.
array<
double>(
"dt_times_dH_minus_dL");
351 xt::pyarray<double>& min_u_bc = args.
array<
double>(
"min_u_bc");
352 xt::pyarray<double>& max_u_bc = args.
array<
double>(
"max_u_bc");
353 xt::pyarray<double>& quantDOFs = args.
array<
double>(
"quantDOFs");
354 xt::pyarray<double>& ebqe_phi_s = args.
array<
double>(
"ebqe_phi_s");
355 double ghost_penalty_constant = args.
scalar<
double>(
"ghost_penalty_constant");
356 const xt::pyarray<double>& phi_solid = args.
array<
double>(
"phi_solid");
357 xt::pyarray<double>& phi_solid_nodes = args.
array<
double>(
"phi_solid_nodes");
358 bool useExact = args.
scalar<
int>(
"useExact");
359 xt::pyarray<double>& isActiveR = args.
array<
double>(
"isActiveR");
360 xt::pyarray<double>& isActiveDOF = args.
array<
double>(
"isActiveDOF");
361 xt::pyarray<int>& isActiveElement = args.
array<
int>(
"isActiveElement");
362 double meanEntropy = 0., meanOmega = 0., maxEntropy = -1E10, minEntropy = 1E10;
363 maxVel.resize(nElements_global, 0.0);
379 for(
int eN=0;eN<nElements_global;eN++)
382 double elementResidual_u[nDOF_test_element];
383 bool element_active=
false;
384 isActiveElement[eN]=0;
385 for (
int i=0;i<nDOF_test_element;i++)
387 elementResidual_u[i]=0.0;
389 double element_phi_s[nDOF_mesh_trial_element];
390 for (
int j=0;j<nDOF_mesh_trial_element;j++)
392 int eN_j = eN*nDOF_mesh_trial_element+j;
393 element_phi_s[j] = phi_solid_nodes.data()[u_l2g.data()[eN_j]];
395 double element_nodes[nDOF_mesh_trial_element*3];
396 for (
int i=0;i<nDOF_mesh_trial_element;i++)
398 int eN_i=eN*nDOF_mesh_trial_element+i;
400 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
402 int icase_s =
gf_s.
calculate(element_phi_s, element_nodes, x_ref.data(),
false);
406 isActiveElement[eN]=1;
408 for (
int ebN_element=0;ebN_element < nDOF_mesh_trial_element; ebN_element++)
410 const int ebN = elementBoundariesArray.data()[eN*nDOF_mesh_trial_element+ebN_element];
413 if (elementBoundaryElementsArray[ebN*2+1] != -1 && element_phi_s[(ebN_element+1)%nDOF_mesh_trial_element]*element_phi_s[(ebN_element+2)%nDOF_mesh_trial_element] <= 0.0)
416 if (elementBoundaryElementsArray[ebN*2 + 0] == eN)
421 else if (icase_s == 1)
424 isActiveElement[eN]=1;
427 for (
int k=0;k<nQuadraturePoints_element;k++)
430 int eN_k = eN*nQuadraturePoints_element+k,
431 eN_k_nSpace = eN_k*nSpace,
432 eN_nDOF_trial_element = eN*nDOF_trial_element;
434 entVisc_minus_artComp,
436 grad_u[nSpace],grad_u_old[nSpace],grad_uTilde[nSpace],
438 H=0.0,Hn=0.0,HTilde=0.0,
439 f[nSpace],fn[nSpace],
df[nSpace],
442 Lstar_u[nDOF_test_element],
444 tau=0.0,tau0=0.0,tau1=0.0,
445 numDiff0=0.0,numDiff1=0.0,
448 jacInv[nSpace*nSpace],
449 u_grad_trial[nDOF_trial_element*nSpace],
450 u_test_dV[nDOF_trial_element],
451 u_grad_test_dV[nDOF_test_element*nSpace],
456 G[nSpace*nSpace],G_dd_G,tr_G;
458 const double H_s =
gf_s.
H(0.0,phi_solid.data()[eN_k]);
460 ck.calculateMapping_element(eN,
464 mesh_trial_ref.data(),
465 mesh_grad_trial_ref.data(),
470 ck.calculateMappingVelocity_element(eN,
472 mesh_velocity_dof.data(),
474 mesh_trial_ref.data(),
477 dV = fabs(jacDet)*dV_ref.data()[k];
478 ck.calculateG(jacInv,G,G_dd_G,tr_G);
480 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],
484 ck.valFromDOF(u_dof.data(),
485 &u_l2g.data()[eN_nDOF_trial_element],
486 &u_trial_ref.data()[k*nDOF_trial_element],
488 ck.valFromDOF(u_dof_old.data(),
489 &u_l2g.data()[eN_nDOF_trial_element],
490 &u_trial_ref.data()[k*nDOF_trial_element],
493 ck.gradFromDOF(u_dof.data(),
494 &u_l2g.data()[eN_nDOF_trial_element],
497 ck.gradFromDOF(u_dof_old.data(),
498 &u_l2g.data()[eN_nDOF_trial_element],
501 ck.gradFromDOF(uTilde_dof.data(),
502 &u_l2g.data()[eN_nDOF_trial_element],
506 for (
int j=0;j<nDOF_trial_element;j++)
508 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
509 for (
int I=0;I<nSpace;I++)
511 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
515 porosity = q_porosity.data()[eN_k];
532 double mesh_velocity[3];
533 mesh_velocity[0] =
xt;
534 mesh_velocity[1] = yt;
535 mesh_velocity[2] = zt;
537 for (
int I=0;I<nSpace;I++)
539 f[I] -= MOVING_DOMAIN*m*mesh_velocity[I];
540 df[I] -= MOVING_DOMAIN*dm*mesh_velocity[I];
545 if (q_dV_last.data()[eN_k] <= -100)
546 q_dV_last.data()[eN_k] = dV;
547 q_dV.data()[eN_k] = dV;
549 q_m_betaBDF.data()[eN_k]*q_dV_last.data()[eN_k]/dV,
555 if (STABILIZATION_TYPE==1)
557 double normVel=0., norm_grad_un=0.;
558 for (
int I=0;I<nSpace;I++)
560 Hn +=
df[I]*grad_u_old[I];
561 HTilde +=
df[I]*grad_uTilde[I];
562 fn[I] = porosity*
df[I]*un-MOVING_DOMAIN*m*mesh_velocity[I];
563 H +=
df[I]*grad_u[I];
564 normVel +=
df[I]*
df[I];
565 norm_grad_un += grad_u_old[I]*grad_u_old[I];
567 normVel = std::sqrt(normVel);
568 norm_grad_un = std::sqrt(norm_grad_un)+1E-10;
571 calculateCFL(elementDiameter.data()[eN]/degree_polynomial,
df,cfl.data()[eN_k]);
585 maxEntropy = fmax(maxEntropy,
ENTROPY(
u,0,1));
586 minEntropy = fmin(minEntropy,
ENTROPY(
u,0,1));
589 double hK=elementDiameter.data()[eN]/degree_polynomial;
590 entVisc_minus_artComp = fmax(1-cK*fmax(un*(1-un),0)/hK/norm_grad_un,0);
598 pdeResidual_u =
ck.Mass_strong(m_t) +
ck.Advection_strong(
df,grad_u);
600 for (
int i=0;i<nDOF_test_element;i++)
604 int i_nSpace = i*nSpace;
605 Lstar_u[i] =
ck.Advection_adjoint(
df,&u_grad_test_dV[i_nSpace]);
615 tau = useMetrics*tau1+(1.0-useMetrics)*tau0;
617 subgridError_u = -tau*pdeResidual_u;
622 ck.calculateNumericalDiffusion(shockCapturingDiffusion,
623 elementDiameter.data()[eN],
628 ck.calculateNumericalDiffusion(shockCapturingDiffusion,
636 q_numDiff_u.data()[eN_k] = useMetrics*numDiff1+(1.0-useMetrics)*numDiff0;
653 for(
int i=0;i<nDOF_test_element;i++)
655 int eN_i=eN*nDOF_test_element+i;
658 int i_nSpace=i*nSpace;
659 if (STABILIZATION_TYPE==1)
662 elementResidual_u[i] +=
663 ck.Mass_weak(dt*m_t,u_test_dV[i]) +
664 1./3*dt*
ck.Advection_weak(fn,&u_grad_test_dV[i_nSpace]) +
665 1./9*dt*dt*
ck.NumericalDiffusion(Hn,
df,&u_grad_test_dV[i_nSpace]) +
666 1./3*dt*entVisc_minus_artComp*
ck.NumericalDiffusion(q_numDiff_u_last.data()[eN_k],
668 &u_grad_test_dV[i_nSpace]);
671 elementResidual_u[i] +=
672 ck.Mass_weak(dt*m_t,u_test_dV[i]) +
673 dt*
ck.Advection_weak(fn,&u_grad_test_dV[i_nSpace]) +
674 0.5*dt*dt*
ck.NumericalDiffusion(HTilde,
df,&u_grad_test_dV[i_nSpace]) +
675 dt*entVisc_minus_artComp*
ck.NumericalDiffusion(q_numDiff_u_last.data()[eN_k],
677 &u_grad_test_dV[i_nSpace]);
681 elementResidual_u[i] +=
682 H_s*(
ck.Mass_weak(m_t,u_test_dV[i]) +
683 ck.Advection_weak(
f,&u_grad_test_dV[i_nSpace]) +
684 ck.SubgridError(subgridError_u,Lstar_u[i]) +
685 ck.NumericalDiffusion(q_numDiff_u_last.data()[eN_k],
687 &u_grad_test_dV[i_nSpace]));
691 isActiveR.data()[offset_u + stride_u*r_l2g.data()[eN_i]] = 1.0;
692 isActiveDOF.data()[u_l2g.data()[eN_i]] = 1.0;
700 q_u.data()[eN_k] =
u;
701 q_m.data()[eN_k] = m;
706 for(
int i=0;i<nDOF_test_element;i++)
708 int eN_i=eN*nDOF_test_element+i;
709 globalResidual.data()[offset_u+stride_u*r_l2g.data()[eN_i]] += elementResidual_u[i];
715 if(isActiveElement[elementBoundaryElementsArray[(*it)*2+0]] && isActiveElement[elementBoundaryElementsArray[(*it)*2+1]])
717 std::map<int,double> DW_Dn_jump;
718 double gamma_cutfem=ghost_penalty_constant,
719 h_cutfem=elementBoundaryDiameter.data()[*it];
720 int eN_nDOF_trial_element = elementBoundaryElementsArray.data()[(*it)*2+0]*nDOF_trial_element;
737 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
739 double Du_Dn_jump=0.0, dS;
740 for (
int eN_side=0;eN_side < 2; eN_side++)
743 eN = elementBoundaryElementsArray.data()[ebN*2+eN_side];
744 for (
int i=0;i<nDOF_test_element;i++)
746 DW_Dn_jump[r_l2g.data()[eN*nDOF_test_element+i]] = 0.0;
749 for (
int eN_side=0;eN_side < 2; eN_side++)
752 eN = elementBoundaryElementsArray[ebN*2+eN_side],
753 ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+eN_side],
754 eN_nDOF_trial_element = eN*nDOF_trial_element,
755 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
756 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
759 jac_int[nSpace*nSpace],
761 jacInv_int[nSpace*nSpace],
762 boundaryJac[nSpace*(nSpace-1)],
763 metricTensor[(nSpace-1)*(nSpace-1)],
765 u_test_dS[nDOF_test_element],
766 u_grad_trial_trace[nDOF_trial_element*nSpace],
767 u_grad_test_dS[nDOF_trial_element*nSpace],
768 normal[nSpace],x_int,y_int,z_int,xt_int,yt_int,zt_int,integralScaling,
769 G[nSpace*nSpace],G_dd_G,tr_G,h_phi,h_penalty,penalty;
770 for (
int I=0; I<nSpace;I++)
773 ck.calculateMapping_elementBoundary(eN,
779 mesh_trial_trace_ref.data(),
780 mesh_grad_trial_trace_ref.data(),
781 boundaryJac_ref.data(),
792 ck.calculateMappingVelocity_elementBoundary(eN,
796 mesh_velocity_dof.data(),
798 mesh_trial_trace_ref.data(),
799 xt_int,yt_int,zt_int,
804 dS = metricTensorDetSqrt*dS_ref.data()[kb];
807 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_int,u_grad_trial_trace);
809 ck.valFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],u_int);
810 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial_trace,grad_u_int);
811 for (
int I=0;I<nSpace;I++)
813 Du_Dn_jump += grad_u_int[I]*normal[I];
815 for (
int i=0;i<nDOF_test_element;i++)
817 int eN_i = eN*nDOF_test_element + i;
818 for (
int I=0;I<nSpace;I++)
819 DW_Dn_jump[r_l2g[eN_i]] += u_grad_trial_trace[i*nSpace+I]*normal[I];
822 for (std::map<int,double>::iterator W_it=DW_Dn_jump.begin(); W_it!=DW_Dn_jump.end(); ++W_it)
824 int i_global = W_it->first;
825 double DW_Dn_jump_i = W_it->second;
826 globalResidual.data()[offset_u+stride_u*i_global]+=gamma_cutfem*h_cutfem*Du_Dn_jump*DW_Dn_jump_i*dS;
989 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
991 int ebN = exteriorElementBoundariesArray.data()[ebNE],
992 eN = elementBoundaryElementsArray.data()[ebN*2+0],
993 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+0],
994 eN_nDOF_trial_element = eN*nDOF_trial_element;
995 double elementResidual_u[nDOF_test_element];
996 for (
int i=0;i<nDOF_test_element;i++)
998 elementResidual_u[i]=0.0;
1000 double element_phi_s[nDOF_mesh_trial_element];
1001 for (
int j=0;j<nDOF_mesh_trial_element;j++)
1003 int eN_j = eN*nDOF_mesh_trial_element+j;
1004 element_phi_s[j] = phi_solid_nodes[u_l2g.data()[eN_j]];
1006 double element_nodes[nDOF_mesh_trial_element*3];
1007 for (
int i=0;i<nDOF_mesh_trial_element;i++)
1009 int eN_i=eN*nDOF_mesh_trial_element+i;
1010 for(
int I=0;I<3;I++)
1011 element_nodes[i*3 + I] = mesh_dof[mesh_l2g.data()[eN_i]*3 + I];
1013 double mesh_dof_ref[12]={0.,0.,0.,1.,0.,0.,0.,1.,0.,0.,0.,1.};
1014 double xb_ref_calc[nQuadraturePoints_elementBoundary*3];
1015 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
1017 double x=0.0,y=0.0,
z=0.0;
1018 for (
int j=0;j<nDOF_mesh_trial_element;j++)
1020 int ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb;
1021 int ebN_local_kb_j = ebN_local_kb*nDOF_mesh_trial_element+j;
1022 x += mesh_dof_ref[j*3+0]*mesh_trial_trace_ref.data()[ebN_local_kb_j];
1023 y += mesh_dof_ref[j*3+1]*mesh_trial_trace_ref.data()[ebN_local_kb_j];
1024 z += mesh_dof_ref[j*3+2]*mesh_trial_trace_ref.data()[ebN_local_kb_j];
1026 xb_ref_calc[3*kb+0] = x;
1027 xb_ref_calc[3*kb+1] = y;
1028 xb_ref_calc[3*kb+2] =
z;
1030 int icase_s =
gf_s.
calculate(element_phi_s, element_nodes, xb_ref_calc,
true);
1031 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
1033 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
1034 ebNE_kb_nSpace = ebNE_kb*nSpace,
1035 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
1036 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
1050 jac_ext[nSpace*nSpace],
1052 jacInv_ext[nSpace*nSpace],
1053 boundaryJac[nSpace*(nSpace-1)],
1054 metricTensor[(nSpace-1)*(nSpace-1)],
1055 metricTensorDetSqrt,
1057 u_test_dS[nDOF_test_element],
1058 u_grad_trial_trace[nDOF_trial_element*nSpace],
1059 normal[nSpace],x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,
1063 G[nSpace*nSpace],G_dd_G,tr_G;
1069 ck.calculateMapping_elementBoundary(eN,
1075 mesh_trial_trace_ref.data(),
1076 mesh_grad_trial_trace_ref.data(),
1077 boundaryJac_ref.data(),
1083 metricTensorDetSqrt,
1087 ck.calculateMappingVelocity_elementBoundary(eN,
1091 mesh_velocity_dof.data(),
1093 mesh_trial_trace_ref.data(),
1094 xt_ext,yt_ext,zt_ext,
1100 dS = ((1.0-MOVING_DOMAIN)*metricTensorDetSqrt + MOVING_DOMAIN*integralScaling)*dS_ref.data()[kb];
1103 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
1106 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],
1108 u_grad_trial_trace);
1110 if (STABILIZATION_TYPE==1)
1112 ck.valFromDOF(u_dof_old.data(),
1113 &u_l2g.data()[eN_nDOF_trial_element],
1114 &u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],
1116 ck.gradFromDOF(u_dof_old.data(),
1117 &u_l2g.data()[eN_nDOF_trial_element],
1123 ck.valFromDOF(u_dof.data(),
1124 &u_l2g.data()[eN_nDOF_trial_element],
1125 &u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],
1127 ck.gradFromDOF(u_dof.data(),
1128 &u_l2g.data()[eN_nDOF_trial_element],
1133 for (
int j=0;j<nDOF_trial_element;j++)
1135 u_test_dS[j] = u_test_trace_ref.data()[ebN_local_kb*nDOF_test_element+j]*dS;
1140 bc_u_ext = isDOFBoundary_u.data()[ebNE_kb]*ebqe_bc_u_ext.data()[ebNE_kb]+(1-isDOFBoundary_u.data()[ebNE_kb])*u_ext;
1142 porosity_ext = ebqe_porosity_ext.data()[ebNE_kb];
1168 double mesh_velocity[3];
1169 mesh_velocity[0] = xt_ext;
1170 mesh_velocity[1] = yt_ext;
1171 mesh_velocity[2] = zt_ext;
1173 for (
int I=0;I<nSpace;I++)
1176 f_ext[I] -= MOVING_DOMAIN*m_ext*mesh_velocity[I];
1177 df_ext[I] -= MOVING_DOMAIN*dm_ext*mesh_velocity[I];
1178 bc_f_ext[I] -= MOVING_DOMAIN*bc_m_ext*mesh_velocity[I];
1179 bc_df_ext[I] -= MOVING_DOMAIN*bc_dm_ext*mesh_velocity[I];
1185 isFluxBoundary_u.data()[ebNE_kb],
1188 ebqe_bc_flux_u_ext.data()[ebNE_kb],
1192 ebqe_flux.data()[ebNE_kb] = flux_ext;
1195 ebqe_u.data()[ebNE_kb] = u_ext;
1197 ebqe_u.data()[ebNE_kb] = bc_u_ext;
1199 if (STABILIZATION_TYPE==1)
1201 flux_ext *= 1./3*dt;
1208 const double H_s =
gf_s.
H(0.0, ebqe_phi_s.data()[ebNE_kb]);
1209 if (isActiveElement[eN])
1211 for (
int i=0;i<nDOF_test_element;i++)
1214 elementResidual_u[i] += H_s*
ck.ExteriorElementBoundaryFlux(flux_ext,u_test_dS[i]);
1221 for (
int i=0;i<nDOF_test_element;i++)
1223 int eN_i = eN*nDOF_test_element+i;
1224 globalResidual.data()[offset_u+stride_u*r_l2g.data()[eN_i]] += elementResidual_u[i];
1227 if (STABILIZATION_TYPE==1)
1229 meanEntropy /= meanOmega;
1230 double norm_factor = fmax(fabs(maxEntropy - meanEntropy), fabs(meanEntropy-minEntropy));
1231 for(
int eN=0;eN<nElements_global;eN++)
1233 double hK=elementDiameter.data()[eN]/degree_polynomial;
1234 double linear_viscosity =
cMax*hK*
maxVel[eN];
1235 double entropy_viscosity =
cE*hK*hK*
maxEntRes[eN]/norm_factor;
1236 for (
int k=0;k<nQuadraturePoints_element;k++)
1238 int eN_k = eN*nQuadraturePoints_element+k;
1239 q_numDiff_u.data()[eN_k] = fmin(linear_viscosity,entropy_viscosity);
1248 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1249 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1250 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1251 xt::pyarray<double>& mesh_velocity_dof = args.
array<
double>(
"mesh_velocity_dof");
1252 double MOVING_DOMAIN = args.
scalar<
double>(
"MOVING_DOMAIN");
1253 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1254 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
1255 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1256 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1257 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1258 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1259 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1260 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1261 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1262 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
1263 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1264 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1265 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1266 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1267 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
1268 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1269 int nElements_global = args.
scalar<
int>(
"nElements_global");
1270 double useMetrics = args.
scalar<
double>(
"useMetrics");
1271 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
1272 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
1273 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
1274 const xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
1275 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1276 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
1277 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1278 xt::pyarray<double>& elementBoundaryDiameter = args.
array<
double>(
"elementBoundaryDiameter");
1279 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1280 xt::pyarray<double>& velocity = args.
array<
double>(
"velocity");
1281 xt::pyarray<double>& q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
1282 xt::pyarray<double>& cfl = args.
array<
double>(
"cfl");
1283 xt::pyarray<double>& q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
1284 xt::pyarray<int>& csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
1285 xt::pyarray<int>& csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
1286 xt::pyarray<double>& globalJacobian = args.
array<
double>(
"globalJacobian");
1287 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1288 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1289 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1290 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1291 xt::pyarray<double>& ebqe_velocity_ext = args.
array<
double>(
"ebqe_velocity_ext");
1292 const xt::pyarray<double>& ebqe_porosity_ext = args.
array<
double>(
"ebqe_porosity_ext");
1293 xt::pyarray<int>& isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
1294 xt::pyarray<double>& ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
1295 xt::pyarray<int>& isFluxBoundary_u = args.
array<
int>(
"isFluxBoundary_u");
1296 xt::pyarray<double>& ebqe_bc_flux_u_ext = args.
array<
double>(
"ebqe_bc_flux_u_ext");
1297 xt::pyarray<int>& csrColumnOffsets_eb_u_u = args.
array<
int>(
"csrColumnOffsets_eb_u_u");
1298 int STABILIZATION_TYPE = args.
scalar<
int>(
"STABILIZATION_TYPE");
1299 xt::pyarray<double>& ebqe_phi_s = args.
array<
double>(
"ebqe_phi_s");
1300 const xt::pyarray<double>& phi_solid = args.
array<
double>(
"phi_solid");
1301 double ghost_penalty_constant = args.
scalar<
double>(
"ghost_penalty_constant");
1302 xt::pyarray<double>& phi_solid_nodes = args.
array<
double>(
"phi_solid_nodes");
1303 bool useExact = args.
scalar<
int>(
"useExact");
1304 xt::pyarray<double>& isActiveR = args.
array<
double>(
"isActiveR");
1305 xt::pyarray<double>& isActiveDOF = args.
array<
double>(
"isActiveDOF");
1306 xt::pyarray<int>& isActiveElement = args.
array<
int>(
"isActiveElement");
1308 double Ct_sge = 4.0;
1313 for(
int eN=0;eN<nElements_global;eN++)
1315 double elementJacobian_u_u[nDOF_test_element][nDOF_trial_element];
1316 for (
int i=0;i<nDOF_test_element;i++)
1317 for (
int j=0;j<nDOF_trial_element;j++)
1319 elementJacobian_u_u[i][j]=0.0;
1321 double element_phi_s[nDOF_mesh_trial_element];
1322 for (
int j=0;j<nDOF_mesh_trial_element;j++)
1324 int eN_j = eN*nDOF_mesh_trial_element+j;
1325 element_phi_s[j] = phi_solid_nodes.data()[u_l2g.data()[eN_j]];
1327 double element_nodes[nDOF_mesh_trial_element*3];
1328 for (
int i=0;i<nDOF_mesh_trial_element;i++)
1330 int eN_i=eN*nDOF_mesh_trial_element+i;
1331 for(
int I=0;I<3;I++)
1332 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
1334 int icase_s =
gf_s.
calculate(element_phi_s, element_nodes, x_ref.data(),
false);
1335 for (
int k=0;k<nQuadraturePoints_element;k++)
1337 int eN_k = eN*nQuadraturePoints_element+k,
1338 eN_k_nSpace = eN_k*nSpace,
1339 eN_nDOF_trial_element = eN*nDOF_trial_element;
1345 f[nSpace],
df[nSpace],
1347 dpdeResidual_u_u[nDOF_trial_element],
1348 Lstar_u[nDOF_test_element],
1349 dsubgridError_u_u[nDOF_trial_element],
1350 tau=0.0,tau0=0.0,tau1=0.0,
1353 jacInv[nSpace*nSpace],
1354 u_grad_trial[nDOF_trial_element*nSpace],
1356 u_test_dV[nDOF_test_element],
1357 u_grad_test_dV[nDOF_test_element*nSpace],
1362 G[nSpace*nSpace],G_dd_G,tr_G;
1385 ck.calculateMapping_element(eN,
1389 mesh_trial_ref.data(),
1390 mesh_grad_trial_ref.data(),
1395 ck.calculateMappingVelocity_element(eN,
1397 mesh_velocity_dof.data(),
1399 mesh_trial_ref.data(),
1402 dV = fabs(jacDet)*dV_ref.data()[k];
1403 ck.calculateG(jacInv,G,G_dd_G,tr_G);
1405 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],jacInv,u_grad_trial);
1407 ck.valFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_ref.data()[k*nDOF_trial_element],
u);
1409 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial,grad_u);
1411 for (
int j=0;j<nDOF_trial_element;j++)
1413 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
1414 for (
int I=0;I<nSpace;I++)
1416 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
1420 porosity = q_porosity.data()[eN_k];
1425 const double H_s =
gf_s.
H(0.0, phi_solid.data()[eN_k]);
1438 double mesh_velocity[3];
1439 mesh_velocity[0] =
xt;
1440 mesh_velocity[1] = yt;
1441 mesh_velocity[2] = zt;
1443 for(
int I=0;I<nSpace;I++)
1446 f[I] -= MOVING_DOMAIN*m*mesh_velocity[I];
1447 df[I] -= MOVING_DOMAIN*dm*mesh_velocity[I];
1453 q_m_betaBDF.data()[eN_k],
1462 for (
int i=0;i<nDOF_test_element;i++)
1466 int i_nSpace = i*nSpace;
1467 Lstar_u[i]=
ck.Advection_adjoint(
df,&u_grad_test_dV[i_nSpace]);
1470 for (
int j=0;j<nDOF_trial_element;j++)
1474 int j_nSpace = j*nSpace;
1475 dpdeResidual_u_u[j]=
ck.MassJacobian_strong(dm_t,u_trial_ref.data()[k*nDOF_trial_element+j]) +
1476 ck.AdvectionJacobian_strong(
df,&u_grad_trial[j_nSpace]);
1491 tau = useMetrics*tau1+(1.0-useMetrics)*tau0;
1493 for(
int j=0;j<nDOF_trial_element;j++)
1494 dsubgridError_u_u[j] = -tau*dpdeResidual_u_u[j];
1496 for(
int i=0;i<nDOF_test_element;i++)
1500 for(
int j=0;j<nDOF_trial_element;j++)
1504 int j_nSpace = j*nSpace;
1505 int i_nSpace = i*nSpace;
1506 if (STABILIZATION_TYPE==0)
1508 elementJacobian_u_u[i][j] +=
1509 H_s*(
ck.MassJacobian_weak(dm_t,
1510 u_trial_ref.data()[k*nDOF_trial_element+j],
1512 ck.AdvectionJacobian_weak(
df,
1513 u_trial_ref.data()[k*nDOF_trial_element+j],
1514 &u_grad_test_dV[i_nSpace]) +
1515 ck.SubgridErrorJacobian(dsubgridError_u_u[j],Lstar_u[i]) +
1516 ck.NumericalDiffusionJacobian(q_numDiff_u_last.data()[eN_k],
1517 &u_grad_trial[j_nSpace],
1518 &u_grad_test_dV[i_nSpace]));
1522 elementJacobian_u_u[i][j] +=
1523 ck.MassJacobian_weak(1.0,
1524 u_trial_ref.data()[k*nDOF_trial_element+j],
1533 for (
int i=0;i<nDOF_test_element;i++)
1535 int eN_i = eN*nDOF_test_element+i;
1536 for (
int j=0;j<nDOF_trial_element;j++)
1538 int eN_i_j = eN_i*nDOF_trial_element+j;
1539 globalJacobian.data()[csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_u_u.data()[eN_i_j]] += elementJacobian_u_u[i][j];
1546 std::map<int,double> DW_Dn_jump;
1547 std::map<std::pair<int, int>,
int> u_u_nz;
1548 double gamma_cutfem=ghost_penalty_constant,
1549 h_cutfem=elementBoundaryDiameter.data()[*it];
1550 int eN_nDOF_trial_element = elementBoundaryElementsArray.data()[(*it)*2+0]*nDOF_trial_element;
1567 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
1569 double Du_Dn_jump=0.0, dS;
1570 for (
int eN_side=0;eN_side < 2; eN_side++)
1573 eN = elementBoundaryElementsArray.data()[ebN*2+eN_side];
1574 for (
int i=0;i<nDOF_test_element;i++)
1576 DW_Dn_jump[r_l2g.data()[eN*nDOF_test_element+i]] = 0.0;
1579 for (
int eN_side=0;eN_side < 2; eN_side++)
1582 eN = elementBoundaryElementsArray.data()[ebN*2+eN_side],
1583 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+eN_side],
1584 eN_nDOF_trial_element = eN*nDOF_trial_element,
1585 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
1586 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
1589 jac_int[nSpace*nSpace],
1591 jacInv_int[nSpace*nSpace],
1592 boundaryJac[nSpace*(nSpace-1)],
1593 metricTensor[(nSpace-1)*(nSpace-1)],
1594 metricTensorDetSqrt,
1595 u_test_dS[nDOF_test_element],
1596 u_grad_trial_trace[nDOF_trial_element*nSpace],
1597 u_grad_test_dS[nDOF_trial_element*nSpace],
1598 normal[nSpace],x_int,y_int,z_int,xt_int,yt_int,zt_int,integralScaling,
1599 G[nSpace*nSpace],G_dd_G,tr_G,h_phi,h_penalty,penalty;
1600 for (
int I=0; I<nSpace;I++)
1601 grad_u_int[I] = 0.0;
1604 ck.calculateMapping_elementBoundary(eN,
1610 mesh_trial_trace_ref.data(),
1611 mesh_grad_trial_trace_ref.data(),
1612 boundaryJac_ref.data(),
1618 metricTensorDetSqrt,
1623 ck.calculateMappingVelocity_elementBoundary(eN,
1627 mesh_velocity_dof.data(),
1629 mesh_trial_trace_ref.data(),
1630 xt_int,yt_int,zt_int,
1635 dS = metricTensorDetSqrt*dS_ref.data()[kb];
1638 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_int,u_grad_trial_trace);
1639 for (
int i=0;i<nDOF_test_element;i++)
1641 int eN_i = eN*nDOF_test_element + i;
1642 for (
int I=0;I<nSpace;I++)
1643 DW_Dn_jump[r_l2g.data()[eN_i]] += u_grad_trial_trace[i*nSpace+I]*normal[I];
1646 for (
int eN_side=0;eN_side < 2; eN_side++)
1649 eN = elementBoundaryElementsArray.data()[ebN*2+eN_side];
1650 for (
int i=0;i<nDOF_test_element;i++)
1652 int eN_i = eN*nDOF_test_element+i;
1653 for (
int eN_side2=0;eN_side2 < 2; eN_side2++)
1655 int eN2 = elementBoundaryElementsArray.data()[ebN*2+eN_side2];
1656 for (
int j=0;j<nDOF_test_element;j++)
1658 int eN_i_j = eN_i*nDOF_test_element + j;
1659 int eN2_j = eN2*nDOF_test_element + j;
1663 i*nDOF_trial_element +
1665 std::pair<int,int> ij = std::make_pair(u_l2g.data()[eN_i], u_l2g.data()[eN2_j]);
1666 if (u_u_nz.count(ij))
1668 assert(u_u_nz[ij] == csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_eb_u_u.data()[ebN_i_j]);
1671 u_u_nz[ij] = csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_eb_u_u.data()[ebN_i_j];
1676 for (std::map<int,double>::iterator Wi_it=DW_Dn_jump.begin(); Wi_it!=DW_Dn_jump.end(); ++Wi_it)
1677 for (std::map<int,double>::iterator Wj_it=DW_Dn_jump.begin(); Wj_it!=DW_Dn_jump.end(); ++Wj_it)
1679 int i_global = Wi_it->first,
1680 j_global = Wj_it->first;
1681 double DW_Dn_jump_i = Wi_it->second,
1682 DW_Dn_jump_j = Wj_it->second;
1683 std::pair<int,int> ij = std::make_pair(i_global, j_global);
1684 globalJacobian.data()[u_u_nz.at(ij)] += gamma_cutfem*h_cutfem*DW_Dn_jump_j*DW_Dn_jump_i*dS;
1692 if (STABILIZATION_TYPE==0)
1693 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
1695 int ebN = exteriorElementBoundariesArray.data()[ebNE];
1696 int eN = elementBoundaryElementsArray.data()[ebN*2+0],
1697 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+0],
1698 eN_nDOF_trial_element = eN*nDOF_trial_element;
1699 double element_phi_s[nDOF_mesh_trial_element];
1700 for (
int j=0;j<nDOF_mesh_trial_element;j++)
1702 int eN_j = eN*nDOF_mesh_trial_element+j;
1703 element_phi_s[j] = phi_solid_nodes.data()[u_l2g.data()[eN_j]];
1705 double element_nodes[nDOF_mesh_trial_element*3];
1706 for (
int i=0;i<nDOF_mesh_trial_element;i++)
1708 int eN_i=eN*nDOF_mesh_trial_element+i;
1709 for(
int I=0;I<3;I++)
1710 element_nodes[i*3 + I] = mesh_dof[mesh_l2g.data()[eN_i]*3 + I];
1712 double mesh_dof_ref[12]={0.,0.,0.,1.,0.,0.,0.,1.,0.,0.,0.,1.};
1713 double xb_ref_calc[nQuadraturePoints_elementBoundary*3];
1714 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
1716 double x=0.0,y=0.0,
z=0.0;
1717 for (
int j=0;j<nDOF_mesh_trial_element;j++)
1719 int ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb;
1720 int ebN_local_kb_j = ebN_local_kb*nDOF_mesh_trial_element+j;
1721 x += mesh_dof_ref[j*3+0]*mesh_trial_trace_ref.data()[ebN_local_kb_j];
1722 y += mesh_dof_ref[j*3+1]*mesh_trial_trace_ref.data()[ebN_local_kb_j];
1723 z += mesh_dof_ref[j*3+2]*mesh_trial_trace_ref.data()[ebN_local_kb_j];
1725 xb_ref_calc[3*kb+0] = x;
1726 xb_ref_calc[3*kb+1] = y;
1727 xb_ref_calc[3*kb+2] =
z;
1729 int icase_s =
gf_s.
calculate(element_phi_s, element_nodes, xb_ref_calc,
true);
1730 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
1732 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
1733 ebNE_kb_nSpace = ebNE_kb*nSpace,
1734 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
1735 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
1749 fluxJacobian_u_u[nDOF_trial_element],
1750 jac_ext[nSpace*nSpace],
1752 jacInv_ext[nSpace*nSpace],
1753 boundaryJac[nSpace*(nSpace-1)],
1754 metricTensor[(nSpace-1)*(nSpace-1)],
1755 metricTensorDetSqrt,
1757 u_test_dS[nDOF_test_element],
1758 u_grad_trial_trace[nDOF_trial_element*nSpace],
1759 normal[nSpace],x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,
1763 G[nSpace*nSpace],G_dd_G,tr_G;
1786 ck.calculateMapping_elementBoundary(eN,
1792 mesh_trial_trace_ref.data(),
1793 mesh_grad_trial_trace_ref.data(),
1794 boundaryJac_ref.data(),
1800 metricTensorDetSqrt,
1804 ck.calculateMappingVelocity_elementBoundary(eN,
1808 mesh_velocity_dof.data(),
1810 mesh_trial_trace_ref.data(),
1811 xt_ext,yt_ext,zt_ext,
1817 dS = ((1.0-MOVING_DOMAIN)*metricTensorDetSqrt + MOVING_DOMAIN*integralScaling)*dS_ref.data()[kb];
1819 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
1822 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,u_grad_trial_trace);
1824 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);
1825 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial_trace,grad_u_ext);
1827 for (
int j=0;j<nDOF_trial_element;j++)
1829 u_test_dS[j] = u_test_trace_ref.data()[ebN_local_kb*nDOF_test_element+j]*dS;
1834 bc_u_ext = isDOFBoundary_u.data()[ebNE_kb]*ebqe_bc_u_ext.data()[ebNE_kb]+(1-isDOFBoundary_u.data()[ebNE_kb])*u_ext;
1836 porosity_ext = ebqe_porosity_ext.data()[ebNE_kb];
1862 double mesh_velocity[3];
1863 mesh_velocity[0] = xt_ext;
1864 mesh_velocity[1] = yt_ext;
1865 mesh_velocity[2] = zt_ext;
1867 for (
int I=0;I<nSpace;I++)
1870 f_ext[I] -= MOVING_DOMAIN*m_ext*mesh_velocity[I];
1871 df_ext[I] -= MOVING_DOMAIN*dm_ext*mesh_velocity[I];
1872 bc_f_ext[I] -= MOVING_DOMAIN*bc_m_ext*mesh_velocity[I];
1873 bc_df_ext[I] -= MOVING_DOMAIN*bc_dm_ext*mesh_velocity[I];
1879 isFluxBoundary_u.data()[ebNE_kb],
1886 for (
int j=0;j<nDOF_trial_element;j++)
1889 int ebN_local_kb_j=ebN_local_kb*nDOF_trial_element+j;
1890 fluxJacobian_u_u[j]=
ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_u_u_ext,u_trial_trace_ref.data()[ebN_local_kb_j]);
1895 const double H_s =
gf_s.
H(0.0, ebqe_phi_s[ebNE_kb]);
1896 if (isActiveElement[eN])
1898 for (
int i=0;i<nDOF_test_element;i++)
1900 int eN_i = eN*nDOF_test_element+i;
1902 for (
int j=0;j<nDOF_trial_element;j++)
1905 globalJacobian.data()[csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_eb_u_u.data()[ebN_i_j]] += H_s*fluxJacobian_u_u[j]*u_test_dS[i];
2030 double dt = args.
scalar<
double>(
"dt");
2031 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
2032 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
2033 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
2034 xt::pyarray<double>& mesh_velocity_dof = args.
array<
double>(
"mesh_velocity_dof");
2035 double MOVING_DOMAIN = args.
scalar<
double>(
"MOVING_DOMAIN");
2036 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
2037 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
2038 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
2039 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
2040 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
2041 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
2042 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
2043 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
2044 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
2045 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
2046 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
2047 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
2048 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
2049 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
2050 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
2051 int nElements_global = args.
scalar<
int>(
"nElements_global");
2052 double useMetrics = args.
scalar<
double>(
"useMetrics");
2053 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
2054 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
2055 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
2056 double sc_uref = args.
scalar<
double>(
"sc_uref");
2057 double sc_alpha = args.
scalar<
double>(
"sc_alpha");
2058 const xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
2059 const xt::pyarray<double>& porosity_dof = args.
array<
double>(
"porosity_dof");
2060 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
2061 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
2062 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
2063 double degree_polynomial = args.
scalar<
double>(
"degree_polynomial");
2064 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
2065 xt::pyarray<double>& u_dof_old = args.
array<
double>(
"u_dof_old");
2066 xt::pyarray<double>& velocity = args.
array<
double>(
"velocity");
2067 xt::pyarray<double>& q_m = args.
array<
double>(
"q_m");
2068 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
2069 xt::pyarray<double>& q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
2070 xt::pyarray<double>& q_dV = args.
array<
double>(
"q_dV");
2071 xt::pyarray<double>& q_dV_last = args.
array<
double>(
"q_dV_last");
2072 xt::pyarray<double>& cfl = args.
array<
double>(
"cfl");
2073 xt::pyarray<double>& edge_based_cfl = args.
array<
double>(
"edge_based_cfl");
2074 xt::pyarray<double>& q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
2075 xt::pyarray<double>& q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
2076 int offset_u = args.
scalar<
int>(
"offset_u");
2077 int stride_u = args.
scalar<
int>(
"stride_u");
2078 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
2079 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
2080 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
2081 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
2082 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
2083 xt::pyarray<double>& ebqe_velocity_ext = args.
array<
double>(
"ebqe_velocity_ext");
2084 const xt::pyarray<double>& ebqe_porosity_ext = args.
array<
double>(
"ebqe_porosity_ext");
2085 xt::pyarray<int>& isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
2086 xt::pyarray<double>& ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
2087 xt::pyarray<int>& isFluxBoundary_u = args.
array<
int>(
"isFluxBoundary_u");
2088 xt::pyarray<double>& ebqe_bc_flux_u_ext = args.
array<
double>(
"ebqe_bc_flux_u_ext");
2089 xt::pyarray<double>& ebqe_phi = args.
array<
double>(
"ebqe_phi");
2090 double epsFact = args.
scalar<
double>(
"epsFact");
2091 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
2092 xt::pyarray<double>& ebqe_flux = args.
array<
double>(
"ebqe_flux");
2093 int stage = args.
scalar<
int>(
"stage");
2094 xt::pyarray<double>& uTilde_dof = args.
array<
double>(
"uTilde_dof");
2095 double cE = args.
scalar<
double>(
"cE");
2097 double cK = args.
scalar<
double>(
"cK");
2098 double uL = args.
scalar<
double>(
"uL");
2099 double uR = args.
scalar<
double>(
"uR");
2100 int numDOFs = args.
scalar<
int>(
"numDOFs");
2101 int NNZ = args.
scalar<
int>(
"NNZ");
2102 xt::pyarray<int>& csrRowIndeces_DofLoops = args.
array<
int>(
"csrRowIndeces_DofLoops");
2103 xt::pyarray<int>& csrColumnOffsets_DofLoops = args.
array<
int>(
"csrColumnOffsets_DofLoops");
2104 xt::pyarray<int>& csrRowIndeces_CellLoops = args.
array<
int>(
"csrRowIndeces_CellLoops");
2105 xt::pyarray<int>& csrColumnOffsets_CellLoops = args.
array<
int>(
"csrColumnOffsets_CellLoops");
2106 xt::pyarray<int>& csrColumnOffsets_eb_CellLoops = args.
array<
int>(
"csrColumnOffsets_eb_CellLoops");
2107 xt::pyarray<double>& ML = args.
array<
double>(
"ML");
2108 int LUMPED_MASS_MATRIX = args.
scalar<
int>(
"LUMPED_MASS_MATRIX");
2109 int STABILIZATION_TYPE = args.
scalar<
int>(
"STABILIZATION_TYPE");
2110 int ENTROPY_TYPE = args.
scalar<
int>(
"ENTROPY_TYPE");
2111 xt::pyarray<double>& uLow = args.
array<
double>(
"uLow");
2112 xt::pyarray<double>& dLow = args.
array<
double>(
"dLow");
2113 xt::pyarray<double>& dt_times_dH_minus_dL = args.
array<
double>(
"dt_times_dH_minus_dL");
2114 xt::pyarray<double>& min_u_bc = args.
array<
double>(
"min_u_bc");
2115 xt::pyarray<double>& max_u_bc = args.
array<
double>(
"max_u_bc");
2116 xt::pyarray<double>& quantDOFs = args.
array<
double>(
"quantDOFs");
2123 psi.resize(numDOFs,0.0);
2124 eta.resize(numDOFs,0.0);
2128 for (
int i=0; i<numDOFs; i++)
2131 if (STABILIZATION_TYPE==2)
2133 double porosity_times_solni = porosity_dof.data()[i]*u_dof_old.data()[i];
2134 eta[i] = ENTROPY_TYPE == 0 ?
ENTROPY(porosity_times_solni,uL,uR) :
ENTROPY_LOG(porosity_times_solni,uL,uR);
2148 for(
int eN=0;eN<nElements_global;eN++)
2152 elementResidual_u[nDOF_test_element],
2153 element_entropy_residual[nDOF_test_element];
2154 double elementTransport[nDOF_test_element][nDOF_trial_element];
2155 double elementTransposeTransport[nDOF_test_element][nDOF_trial_element];
2156 for (
int i=0;i<nDOF_test_element;i++)
2158 elementResidual_u[i]=0.0;
2159 element_entropy_residual[i]=0.0;
2160 for (
int j=0;j<nDOF_trial_element;j++)
2162 elementTransport[i][j]=0.0;
2163 elementTransposeTransport[i][j]=0.0;
2167 for (
int k=0;k<nQuadraturePoints_element;k++)
2170 int eN_k = eN*nQuadraturePoints_element+k,
2171 eN_k_nSpace = eN_k*nSpace,
2172 eN_nDOF_trial_element = eN*nDOF_trial_element;
2175 aux_entropy_residual=0., DENTROPY_un, DENTROPY_uni,
2177 u=0.0, un=0.0, grad_un[nSpace], porosity_times_velocity[nSpace],
2178 u_test_dV[nDOF_trial_element],
2179 u_grad_trial[nDOF_trial_element*nSpace],
2180 u_grad_test_dV[nDOF_test_element*nSpace],
2182 jac[nSpace*nSpace], jacDet, jacInv[nSpace*nSpace],
2187 ck.calculateMapping_element(eN,
2191 mesh_trial_ref.data(),
2192 mesh_grad_trial_ref.data(),
2197 ck.calculateMappingVelocity_element(eN,
2199 mesh_velocity_dof.data(),
2201 mesh_trial_ref.data(),
2203 dV = fabs(jacDet)*dV_ref.data()[k];
2205 ck.valFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_ref.data()[k*nDOF_trial_element],
u);
2207 ck.valFromDOF(u_dof_old.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_ref.data()[k*nDOF_trial_element],un);
2209 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],jacInv,u_grad_trial);
2210 ck.gradFromDOF(u_dof_old.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial,grad_un);
2213 for (
int j=0;j<nDOF_trial_element;j++)
2215 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
2216 for (
int I=0;I<nSpace;I++)
2217 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
2221 if (q_dV_last.data()[eN_k] <= -100)
2222 q_dV_last.data()[eN_k] = dV;
2223 q_dV.data()[eN_k] = dV;
2225 porosity = q_porosity.data()[eN_k];
2229 double mesh_velocity[3];
2230 mesh_velocity[0] =
xt;
2231 mesh_velocity[1] = yt;
2232 mesh_velocity[2] = zt;
2234 for (
int I=0;I<nSpace;I++)
2235 porosity_times_velocity[I] = porosity*(velocity.data()[eN_k_nSpace+I]-MOVING_DOMAIN*mesh_velocity[I]);
2240 calculateCFL(elementDiameter.data()[eN]/degree_polynomial,porosity_times_velocity,cfl.data()[eN_k]);
2245 if (STABILIZATION_TYPE==2)
2247 for (
int I=0;I<nSpace;I++)
2248 aux_entropy_residual += porosity_times_velocity[I]*grad_un[I];
2254 for(
int i=0;i<nDOF_test_element;i++)
2257 int eN_i=eN*nDOF_test_element+i;
2258 if (STABILIZATION_TYPE==2)
2260 int gi = offset_u+stride_u*u_l2g.data()[eN_i];
2261 double porosity_times_uni = porosity_dof.data()[gi]*u_dof_old.data()[gi];
2262 DENTROPY_uni = ENTROPY_TYPE == 0 ?
DENTROPY(porosity_times_uni,uL,uR) :
DENTROPY_LOG(porosity_times_uni,uL,uR);
2263 element_entropy_residual[i] += (DENTROPY_un - DENTROPY_uni)*aux_entropy_residual*u_test_dV[i];
2265 elementResidual_u[i] += porosity*(
u-un)*u_test_dV[i];
2269 for(
int j=0;j<nDOF_trial_element;j++)
2271 int j_nSpace = j*nSpace;
2272 int i_nSpace = i*nSpace;
2273 elementTransport[i][j] +=
2274 ck.AdvectionJacobian_weak(porosity_times_velocity,
2275 u_trial_ref.data()[k*nDOF_trial_element+j],&u_grad_test_dV[i_nSpace]);
2276 elementTransposeTransport[i][j] +=
2277 ck.AdvectionJacobian_weak(porosity_times_velocity,
2278 u_trial_ref.data()[k*nDOF_trial_element+i],&u_grad_test_dV[j_nSpace]);
2282 q_u.data()[eN_k] =
u;
2283 q_m.data()[eN_k] = porosity*
u;
2288 for(
int i=0;i<nDOF_test_element;i++)
2290 int eN_i=eN*nDOF_test_element+i;
2291 int gi = offset_u+stride_u*u_l2g.data()[eN_i];
2294 globalResidual.data()[gi] += elementResidual_u[i];
2296 if (STABILIZATION_TYPE==2)
2300 for (
int j=0;j<nDOF_trial_element;j++)
2302 int eN_i_j = eN_i*nDOF_trial_element+j;
2304 csrColumnOffsets_CellLoops.data()[eN_i_j]] += elementTransport[i][j];
2306 csrColumnOffsets_CellLoops.data()[eN_i_j]]
2307 += elementTransposeTransport[i][j];
2316 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
2318 double min_u_bc_local = 1E10, max_u_bc_local = -1E10;
2319 int ebN = exteriorElementBoundariesArray.data()[ebNE];
2320 int eN = elementBoundaryElementsArray.data()[ebN*2+0],
2321 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+0],
2322 eN_nDOF_trial_element = eN*nDOF_trial_element;
2323 double elementResidual_u[nDOF_test_element];
2324 for (
int i=0;i<nDOF_test_element;i++)
2325 elementResidual_u[i]=0.0;
2327 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
2329 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
2330 ebNE_kb_nSpace = ebNE_kb*nSpace,
2331 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
2332 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
2334 u_ext=0.0, bc_u_ext=0.0,
2335 porosity_times_velocity[nSpace],
2336 flux_ext=0.0, dflux_ext=0.0,
2337 fluxTransport[nDOF_trial_element],
2338 jac_ext[nSpace*nSpace],
2340 jacInv_ext[nSpace*nSpace],
2341 boundaryJac[nSpace*(nSpace-1)],
2342 metricTensor[(nSpace-1)*(nSpace-1)],
2343 metricTensorDetSqrt,
2345 u_test_dS[nDOF_test_element],
2346 normal[nSpace],x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,porosity_ext;
2348 ck.calculateMapping_elementBoundary(eN,
2354 mesh_trial_trace_ref.data(),
2355 mesh_grad_trial_trace_ref.data(),
2356 boundaryJac_ref.data(),
2362 metricTensorDetSqrt,
2366 ck.calculateMappingVelocity_elementBoundary(eN,
2370 mesh_velocity_dof.data(),
2372 mesh_trial_trace_ref.data(),
2373 xt_ext,yt_ext,zt_ext,
2378 dS = ((1.0-MOVING_DOMAIN)*metricTensorDetSqrt + MOVING_DOMAIN*integralScaling)*dS_ref.data()[kb];
2380 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);
2382 for (
int j=0;j<nDOF_trial_element;j++)
2383 u_test_dS[j] = u_test_trace_ref.data()[ebN_local_kb*nDOF_test_element+j]*dS;
2386 porosity_ext = ebqe_porosity_ext.data()[ebNE_kb];
2390 double mesh_velocity[3];
2391 mesh_velocity[0] = xt_ext;
2392 mesh_velocity[1] = yt_ext;
2393 mesh_velocity[2] = zt_ext;
2395 for (
int I=0;I<nSpace;I++)
2396 porosity_times_velocity[I] = porosity_ext*(ebqe_velocity_ext.data()[ebNE_kb_nSpace+I] - MOVING_DOMAIN*mesh_velocity[I]);
2401 for (
int I=0; I < nSpace; I++)
2402 flow += normal[I]*porosity_times_velocity[I];
2409 ebqe_u.data()[ebNE_kb] = u_ext;
2415 ebqe_u.data()[ebNE_kb] = isDOFBoundary_u.data()[ebNE_kb]*ebqe_bc_u_ext.data()[ebNE_kb]+(1-isDOFBoundary_u.data()[ebNE_kb])*u_ext;
2416 if (isDOFBoundary_u.data()[ebNE_kb] == 1)
2417 flux_ext = ebqe_bc_u_ext.data()[ebNE_kb]*flow;
2418 else if (isFluxBoundary_u.data()[ebNE_kb] == 1)
2419 flux_ext = ebqe_bc_flux_u_ext.data()[ebNE_kb];
2422 std::cout<<
"warning: VOF open boundary with no external trace, setting to zero for inflow"<<std::endl;
2427 for (
int j=0;j<nDOF_trial_element;j++)
2431 elementResidual_u[j] += flux_ext*u_test_dS[j];
2432 int ebN_local_kb_j=ebN_local_kb*nDOF_trial_element+j;
2433 fluxTransport[j] = dflux_ext*u_trial_trace_ref.data()[ebN_local_kb_j];
2438 for (
int i=0;i<nDOF_test_element;i++)
2440 int eN_i = eN*nDOF_test_element+i;
2441 for (
int j=0;j<nDOF_trial_element;j++)
2444 TransportMatrix[csrRowIndeces_CellLoops.data()[eN_i] + csrColumnOffsets_eb_CellLoops.data()[ebN_i_j]]
2445 += fluxTransport[j]*u_test_dS[i];
2447 += fluxTransport[i]*u_test_dS[j];
2451 min_u_bc_local = fmin(ebqe_u.data()[ebNE_kb], min_u_bc_local);
2452 max_u_bc_local = fmax(ebqe_u.data()[ebNE_kb], max_u_bc_local);
2455 for (
int i=0;i<nDOF_test_element;i++)
2457 int eN_i = eN*nDOF_test_element+i;
2458 int gi = offset_u+stride_u*u_l2g.data()[eN_i];
2459 globalResidual.data()[gi] += dt*elementResidual_u[i];
2461 min_u_bc[gi] = fmin(min_u_bc_local,min_u_bc[gi]);
2462 max_u_bc[gi] = fmax(max_u_bc_local,max_u_bc[gi]);
2472 for (
int i=0; i<numDOFs; i++)
2474 double etaMaxi, etaMini;
2475 if (STABILIZATION_TYPE==2)
2478 etaMaxi = fabs(
eta[i]);
2479 etaMini = fabs(
eta[i]);
2481 double porosity_times_solni = porosity_dof.data()[i]*u_dof_old.data()[i];
2483 double alpha_numerator = 0., alpha_denominator = 0.;
2484 for (
int offset=csrRowIndeces_DofLoops.data()[i]; offset<csrRowIndeces_DofLoops.data()[i+1]; offset++)
2486 int j = csrColumnOffsets_DofLoops.data()[offset];
2487 if (STABILIZATION_TYPE==2)
2490 etaMaxi = fmax(etaMaxi,fabs(
eta[j]));
2491 etaMini = fmin(etaMini,fabs(
eta[j]));
2493 double porosity_times_solnj = porosity_dof.data()[j]*u_dof_old.data()[j];
2494 alpha_numerator += porosity_times_solni - porosity_times_solnj;
2495 alpha_denominator += fabs(porosity_times_solni - porosity_times_solnj);
2499 if (STABILIZATION_TYPE==2)
2506 double alphai = alpha_numerator/(alpha_denominator+1E-15);
2507 quantDOFs[i] = alphai;
2518 for (
int i=0; i<numDOFs; i++)
2521 double solni = u_dof_old.data()[i];
2522 double porosityi = porosity_dof.data()[i];
2523 double ith_dissipative_term = 0;
2524 double ith_low_order_dissipative_term = 0;
2525 double ith_flux_term = 0;
2529 for (
int offset=csrRowIndeces_DofLoops.data()[i]; offset<csrRowIndeces_DofLoops.data()[i+1]; offset++)
2531 int j = csrColumnOffsets_DofLoops.data()[offset];
2532 double solnj = u_dof_old.data()[j];
2533 double porosityj = porosity_dof.data()[j];
2534 double dLowij, dLij, dEVij, dHij;
2540 double solij = 0.5*(porosityi*solni+porosityj*solnj);
2541 double Compij = cK*fmax(solij*(1.0-solij),0.0)/(fabs(porosityi*solni-porosityj*solnj)+1E-14);
2546 dLij = dLowij*fmax(
psi[i],
psi[j]);
2547 if (STABILIZATION_TYPE==2)
2551 dHij = fmin(dLowij,dEVij) * fmax(1.0-Compij,0.0);
2555 dHij = dLij * fmax(1.0-Compij,0.0);
2558 ith_dissipative_term += dHij*(solnj-solni);
2559 ith_low_order_dissipative_term += dLowij*(solnj-solni);
2561 dt_times_dH_minus_dL[ij] = dt*(dHij - dLowij);
2569 dt_times_dH_minus_dL[ij]=0;
2575 double mi = ML.data()[i];
2577 edge_based_cfl.data()[i] = 2.*fabs(dLii)/mi;
2578 uLow[i] = u_dof_old.data()[i] - dt/mi*(ith_flux_term
2580 - ith_low_order_dissipative_term);
2583 if (LUMPED_MASS_MATRIX==1)
2584 globalResidual.data()[i] = u_dof_old.data()[i] - dt/mi*(ith_flux_term
2586 - ith_dissipative_term);
2588 globalResidual.data()[i] += dt*(ith_flux_term - ith_dissipative_term);