315 xt::pyarray<double> &mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
316 xt::pyarray<double> &mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
317 xt::pyarray<double> &mesh_dof = args.
array<
double>(
"mesh_dof");
318 xt::pyarray<double> &mesh_velocity_dof = args.
array<
double>(
"mesh_velocity_dof");
319 double MOVING_DOMAIN = args.
scalar<
double>(
"MOVING_DOMAIN");
320 xt::pyarray<int> &mesh_l2g = args.
array<
int>(
"mesh_l2g");
321 xt::pyarray<double> &dV_ref = args.
array<
double>(
"dV_ref");
322 xt::pyarray<double> &u_trial_ref = args.
array<
double>(
"u_trial_ref");
323 xt::pyarray<double> &u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
324 xt::pyarray<double> &u_test_ref = args.
array<
double>(
"u_test_ref");
325 xt::pyarray<double> &u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
326 xt::pyarray<double> &mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
327 xt::pyarray<double> &mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
328 xt::pyarray<double> &dS_ref = args.
array<
double>(
"dS_ref");
329 xt::pyarray<double> &u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
330 xt::pyarray<double> &u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
331 xt::pyarray<double> &u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
332 xt::pyarray<double> &u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
333 xt::pyarray<double> &normal_ref = args.
array<
double>(
"normal_ref");
334 xt::pyarray<double> &boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
335 int nElements_global = args.
scalar<
int>(
"nElements_global");
336 xt::pyarray<double> &ebqe_penalty_ext = args.
array<
double>(
"ebqe_penalty_ext");
337 xt::pyarray<int> &elementMaterialTypes = args.
array<
int>(
"elementMaterialTypes");
338 xt::pyarray<int> &isSeepageFace = args.
array<
int>(
"isSeepageFace");
339 xt::pyarray<int> &a_rowptr = args.
array<
int>(
"a_rowptr");
340 xt::pyarray<int> &a_colind = args.
array<
int>(
"a_colind");
341 double rho = args.
scalar<
double>(
"rho");
342 double beta = args.
scalar<
double>(
"beta");
345 xt::pyarray<double> &q_rho = args.
array<
double>(
"q_rho");
346 xt::pyarray<double> &ebqe_rho = args.
array<
double>(
"ebqe_rho");
348 xt::pyarray<double> &gravity = args.
array<
double>(
"gravity");
349 xt::pyarray<double> &alpha = args.
array<
double>(
"alpha");
350 xt::pyarray<double> &
n = args.
array<
double>(
"n");
351 xt::pyarray<double> &thetaR = args.
array<
double>(
"thetaR");
352 xt::pyarray<double> &thetaSR = args.
array<
double>(
"thetaSR");
354 xt::pyarray<double> &KWs = args.
array<
double>(
"KWs");
355 double useMetrics = args.
scalar<
double>(
"useMetrics");
356 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
357 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
358 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
359 double sc_uref = args.
scalar<
double>(
"sc_uref");
360 double sc_alpha = args.
scalar<
double>(
"sc_alpha");
361 xt::pyarray<int> &u_l2g = args.
array<
int>(
"u_l2g");
362 xt::pyarray<double> &elementDiameter = args.
array<
double>(
"elementDiameter");
363 xt::pyarray<double> &u_dof = args.
array<
double>(
"u_dof");
364 xt::pyarray<double> &u_dof_old = args.
array<
double>(
"u_dof_old");
365 xt::pyarray<double> &velocity = args.
array<
double>(
"velocity");
366 xt::pyarray<double> &q_m = args.
array<
double>(
"q_m");
367 xt::pyarray<double> &q_theta = args.
array<
double>(
"q_theta");
368 xt::pyarray<double> &q_u = args.
array<
double>(
"q_u");
369 xt::pyarray<double> &q_dV = args.
array<
double>(
"q_dV");
370 xt::pyarray<double> &q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
371 xt::pyarray<double> &cfl = args.
array<
double>(
"cfl");
372 xt::pyarray<double> &q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
373 xt::pyarray<double> &q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
374 int offset_u = args.
scalar<
int>(
"offset_u");
375 int stride_u = args.
scalar<
int>(
"stride_u");
376 xt::pyarray<double> &globalResidual = args.
array<
double>(
"globalResidual");
377 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
378 xt::pyarray<int> &exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
379 xt::pyarray<int> &elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
380 xt::pyarray<int> &elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
381 xt::pyarray<double> &ebqe_velocity_ext = args.
array<
double>(
"ebqe_velocity_ext");
382 xt::pyarray<int> &isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
383 xt::pyarray<double> &ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
384 xt::pyarray<int> &isFluxBoundary_u = args.
array<
int>(
"isFluxBoundary_u");
385 xt::pyarray<double> &ebqe_bc_flux_ext = args.
array<
double>(
"ebqe_bc_flux_ext");
386 xt::pyarray<double> &ebqe_phi = args.
array<
double>(
"ebqe_phi");
387 double epsFact = args.
scalar<
double>(
"epsFact");
388 xt::pyarray<double> &ebqe_u = args.
array<
double>(
"ebqe_u");
389 xt::pyarray<double> &ebqe_theta = args.
array<
double>(
"ebqe_theta");
390 xt::pyarray<double> &ebqe_flux = args.
array<
double>(
"ebqe_flux");
394 double cE = args.
scalar<
double>(
"cE");
395 double cK = args.
scalar<
double>(
"cK");
397 double uL = args.
scalar<
double>(
"uL");
398 double uR = args.
scalar<
double>(
"uR");
400 int numDOFs = args.
scalar<
int>(
"numDOFs");
401 int NNZ = args.
scalar<
int>(
"NNZ");
402 xt::pyarray<int> &csrRowIndeces_DofLoops = args.
array<
int>(
"csrRowIndeces_DofLoops");
403 xt::pyarray<int> &csrColumnOffsets_DofLoops = args.
array<
int>(
"csrColumnOffsets_DofLoops");
404 xt::pyarray<int> &csrRowIndeces_CellLoops = args.
array<
int>(
"csrRowIndeces_CellLoops");
405 xt::pyarray<int> &csrColumnOffsets_CellLoops = args.
array<
int>(
"csrColumnOffsets_CellLoops");
406 xt::pyarray<int> &csrColumnOffsets_eb_CellLoops = args.
array<
int>(
"csrColumnOffsets_eb_CellLoops");
408 xt::pyarray<double> &Cx = args.
array<
double>(
"Cx");
409 xt::pyarray<double> &Cy = args.
array<
double>(
"Cy");
410 xt::pyarray<double> &Cz = args.
array<
double>(
"Cz");
411 xt::pyarray<double> &CTx = args.
array<
double>(
"CTx");
412 xt::pyarray<double> &CTy = args.
array<
double>(
"CTy");
413 xt::pyarray<double> &CTz = args.
array<
double>(
"CTz");
414 xt::pyarray<double> &ML = args.
array<
double>(
"ML");
415 xt::pyarray<double> &delta_x_ij = args.
array<
double>(
"delta_x_ij");
417 int LUMPED_MASS_MATRIX = args.
scalar<
int>(
"LUMPED_MASS_MATRIX");
419 int ENTROPY_TYPE = args.
scalar<
int>(
"ENTROPY_TYPE");
421 xt::pyarray<double> &dLow = args.
array<
double>(
"dLow");
422 xt::pyarray<double> &fluxMatrix = args.
array<
double>(
"fluxMatrix");
424 xt::pyarray<double> &quantDOFs = args.
array<
double>(
"quantDOFs");
426 assert(a_rowptr.data()[nSpace] ==
nnz);
427 assert(a_rowptr.data()[nSpace] == nSpace);
431 xt::pyarray<double> &anb_seepage_flux_n = args.
array<
double>(
"anb_seepage_flux_n");
433 xt::pyarray<double> &velocity_couple = args.
array<
double>(
"velocity_couple");
434 xt::pyarray<double> &ebqe_velocity_ext_couple = args.
array<
double>(
"ebqe_velocity_ext_couple");
440 double &anb_seepage_flux(args.
scalar<
double>(
"anb_seepage_flux"));
441 xt::pyarray<double> &q_velocity = args.
array<
double>(
"q_velocity");
442 anb_seepage_flux = 0.0;
453 for (
int eN = 0; eN < nElements_global; eN++) {
455 double elementResidual_u[nDOF_test_element];
456 for (
int i = 0; i < nDOF_test_element; i++) { elementResidual_u[i] = 0.0; }
458 for (
int k = 0; k < nQuadraturePoints_element; k++) {
460 int eN_k = eN * nQuadraturePoints_element + k, eN_k_nSpace = eN_k * nSpace, eN_nDOF_trial_element = eN * nDOF_trial_element;
461 double u = 0.0, grad_u[nSpace], grad_u_old[nSpace], m = 0.0, dm = 0.0,
f[nSpace],
df[nSpace], a[
nnz], da[
nnz], as[
nnz], m_t = 0.0, dm_t = 0.0, pdeResidual_u = 0.0, Lstar_u[nDOF_test_element], subgridError_u = 0.0, tau = 0.0, tau0 = 0.0, tau1 = 0.0, numDiff0 = 0.0, numDiff1 = 0.0, jac[nSpace * nSpace], jacDet, jacInv[nSpace * nSpace], u_grad_trial[nDOF_trial_element * nSpace], u_test_dV[nDOF_trial_element], u_grad_test_dV[nDOF_test_element * nSpace], dV, x, y,
z,
xt, yt, zt, G[nSpace * nSpace], G_dd_G, tr_G, norm_Rv;
465 ck.calculateMapping_element(eN, k, mesh_dof.data(), mesh_l2g.data(), mesh_trial_ref.data(), mesh_grad_trial_ref.data(), jac, jacDet, jacInv, x, y,
z);
466 ck.calculateMappingVelocity_element(eN, k, mesh_velocity_dof.data(), mesh_l2g.data(), mesh_trial_ref.data(),
xt, yt, zt);
468 dV = fabs(jacDet) * dV_ref.data()[k];
469 q_dV.data()[eN_k] = dV;
470 ck.calculateG(jacInv, G, G_dd_G, tr_G);
472 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k * nDOF_trial_element * nSpace], jacInv, u_grad_trial);
474 ck.valFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], &u_trial_ref.data()[k * nDOF_trial_element],
u);
476 ck.gradFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], u_grad_trial, grad_u);
485 for (
int j = 0; j < nDOF_trial_element; j++) {
486 u_test_dV[j] = u_test_ref.data()[k * nDOF_trial_element + j] * dV;
487 for (
int I = 0; I < nSpace; I++) {
488 u_grad_test_dV[j * nSpace + I] = u_grad_trial[j * nSpace + I] * dV;
494 double Kr, dKr, thetaW;
495 const double rho_local = q_rho.data()[eN_k];
496 const double rho_velocity = std::fabs(rho_local) > 1.0e-12 ? rho_local : rho;
497 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_local, beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
498 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz],
u, m, dm,
f,
df, a, da, as, Kr, dKr, thetaW);
499 q_theta.data()[eN_k] = thetaW;
502 for (
int I = 0; I < nSpace; ++I) {
503 q_velocity.data()[eN_k_nSpace + I] = grad_u[I];
506 double pressure_gradient[nSpace];
507 const double rho_ratio = rho_velocity / rho;
508 for (
int J=0; J<nSpace; ++J)
509 pressure_gradient[J] = grad_u[J] - rho_ratio * gravity.data()[J];
511 for (
int I=0; I<nSpace; ++I) {
513 for (
int ii = a_rowptr.data()[I]; ii < a_rowptr.data()[I+1]; ++ii) {
514 const int J = a_colind.data()[ii];
515 acc += (a[ii] / rho_velocity) * pressure_gradient[J];
517 velocity.data()[eN_k_nSpace + I] = -acc;
518 velocity_couple.data()[eN_k_nSpace + I] = -acc ;
523 ck.bdf(alphaBDF, q_m_betaBDF.data()[eN_k], m, dm, m_t, dm_t);
528 pdeResidual_u =
ck.Mass_strong(m_t) +
ck.Advection_strong(
df, grad_u);
530 for (
int i = 0; i < nDOF_test_element; i++) {
531 int i_nSpace = i * nSpace;
532 Lstar_u[i] =
ck.Advection_adjoint(
df, &u_grad_test_dV[i_nSpace]);
538 tau = useMetrics * tau1 + (1.0 - useMetrics) * tau0;
540 subgridError_u = -tau * pdeResidual_u;
550 for (
int i = 0; i < nDOF_test_element; i++) {
551 int eN_k_i = eN_k * nDOF_test_element + i, eN_k_i_nSpace = eN_k_i * nSpace, i_nSpace = i * nSpace;
553 elementResidual_u[i] +=
ck.Mass_weak(m_t, u_test_dV[i]) +
ck.Advection_weak(
f, &u_grad_test_dV[i_nSpace]) +
ck.Diffusion_weak(a_rowptr.data(), a_colind.data(), a, grad_u, &u_grad_test_dV[i_nSpace]) +
VMS *
ck.SubgridError(subgridError_u, Lstar_u[i]) +
VMS *
ck.NumericalDiffusion(q_numDiff_u_last[eN_k], grad_u, &u_grad_test_dV[i_nSpace]);
556 q_m.data()[eN_k] = m;
557 q_u.data()[eN_k] =
u;
562 for (
int i = 0; i < nDOF_test_element; i++) {
563 int eN_i = eN * nDOF_test_element + i;
565 globalResidual.data()[offset_u + stride_u * u_l2g.data()[eN_i]] += elementResidual_u[i];
574 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++) {
575 int ebN = exteriorElementBoundariesArray.data()[ebNE], eN = elementBoundaryElementsArray.data()[ebN * 2 + 0], ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN * 2 + 0], eN_nDOF_trial_element = eN * nDOF_trial_element;
576 double elementResidual_u[nDOF_test_element];
577 for (
int i = 0; i < nDOF_test_element; i++) { elementResidual_u[i] = 0.0; }
578 for (
int kb = 0; kb < nQuadraturePoints_elementBoundary; kb++) {
579 int ebNE_kb = ebNE * nQuadraturePoints_elementBoundary + kb, ebNE_kb_nSpace = ebNE_kb * nSpace, ebN_local_kb = ebN_local * nQuadraturePoints_elementBoundary + kb, ebN_local_kb_nSpace = ebN_local_kb * nSpace;
580 double u_ext = 0.0, grad_u_ext[nSpace], m_ext = 0.0, dm_ext = 0.0, f_ext[nSpace], df_ext[nSpace], a_ext[
nnz], da_ext[
nnz], as_ext[
nnz], flux_ext = 0.0,
582 bc_u_ext = 0.0, bc_grad_u_ext[nSpace], bc_m_ext = 0.0, bc_dm_ext = 0.0, bc_f_ext[nSpace], bc_df_ext[nSpace], bc_a_ext[
nnz], bc_da_ext[
nnz], bc_as_ext[
nnz], jac_ext[nSpace * nSpace], jacDet_ext, jacInv_ext[nSpace * nSpace], boundaryJac[nSpace * (nSpace - 1)], metricTensor[(nSpace - 1) * (nSpace - 1)], metricTensorDetSqrt, dS, u_test_dS[nDOF_test_element], u_grad_trial_trace[nDOF_trial_element * nSpace], normal[3], x_ext, y_ext, z_ext, xt_ext, yt_ext, zt_ext, integralScaling, G[nSpace * nSpace], G_dd_G, tr_G;
587 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,
588 normal_ref.data(), normal, x_ext, y_ext, z_ext);
589 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);
590 dS = ((1.0 - MOVING_DOMAIN) * metricTensorDetSqrt + MOVING_DOMAIN * integralScaling) * dS_ref.data()[kb];
593 ck.calculateG(jacInv_ext, G, G_dd_G, tr_G);
596 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace * nDOF_trial_element], jacInv_ext, u_grad_trial_trace);
598 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);
599 ck.gradFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], u_grad_trial_trace, grad_u_ext);
608 for (
int j = 0; j < nDOF_trial_element; j++) { u_test_dS[j] = u_test_trace_ref.data()[ebN_local_kb * nDOF_test_element + j] * dS; }
612 bc_u_ext = isDOFBoundary_u.data()[ebNE_kb] * ebqe_bc_u_ext.data()[ebNE_kb] + (1 - isDOFBoundary_u.data()[ebNE_kb]) * u_ext;
616 const double rho_ext = ebqe_rho.data()[ebNE_kb];
617 const double rho_velocity_ext = std::fabs(rho_ext) > 1.0e-12 ? rho_ext : rho;
618 double Kr, dKr, thetaW_ext, thetaW_bc;
619 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_ext, beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
620 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz], u_ext, m_ext, dm_ext, f_ext, df_ext, a_ext, da_ext, as_ext, Kr, dKr, thetaW_ext);
621 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_ext, beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
622 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz], bc_u_ext, bc_m_ext, bc_dm_ext, bc_f_ext, bc_df_ext, bc_a_ext, bc_da_ext, bc_as_ext, Kr, dKr, thetaW_bc);
623 ebqe_theta.data()[ebNE_kb] = thetaW_ext;
628 double ext_pressure_gradient[nSpace];
629 const double rho_ratio_ext = rho_velocity_ext / rho;
630 for (
int J=0; J<nSpace; ++J)
631 ext_pressure_gradient[J] = grad_u_ext[J] - rho_ratio_ext * gravity.data()[J];
633 for (
int I=0; I<nSpace; ++I) {
635 for (
int ii = a_rowptr.data()[I]; ii < a_rowptr.data()[I+1]; ++ii) {
636 const int J = a_colind.data()[ii];
637 acc += (a_ext[ii] / rho_velocity_ext) * ext_pressure_gradient[J];
639 ebqe_velocity_ext.data()[ebNE_kb_nSpace + I] = -acc;
640 ebqe_velocity_ext_couple.data()[ebNE_kb_nSpace + I] = -acc ;
648 isSeepageFace.data()[ebNE],
649 isDOFBoundary_u.data()[ebNE_kb], normal, bc_u_ext, a_ext, grad_u_ext, u_ext, f_ext,
650 ebqe_penalty_ext.data()[ebNE_kb],
652 ebqe_flux.data()[ebNE_kb] = flux_ext;
654 anb_seepage_flux =
seepagefluxcalculator(anb_seepage_flux, isSeepageFace.data()[ebNE], dS, flux_ext);
655 anb_seepage_flux_n.data()[0] = anb_seepage_flux;
656 ebqe_u.data()[ebNE_kb] = u_ext;
660 for (
int i = 0; i < nDOF_test_element; i++) {
661 elementResidual_u[i] +=
ck.ExteriorElementBoundaryFlux(flux_ext, u_test_dS[i]);
668 for (
int i = 0; i < nDOF_test_element; i++) {
669 int eN_i = eN * nDOF_test_element + i;
670 globalResidual.data()[offset_u + stride_u * u_l2g.data()[eN_i]] += elementResidual_u[i];
677 xt::pyarray<double> &mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
678 xt::pyarray<double> &mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
679 xt::pyarray<double> &mesh_dof = args.
array<
double>(
"mesh_dof");
680 xt::pyarray<double> &mesh_velocity_dof = args.
array<
double>(
"mesh_velocity_dof");
681 double MOVING_DOMAIN = args.
scalar<
double>(
"MOVING_DOMAIN");
682 xt::pyarray<int> &mesh_l2g = args.
array<
int>(
"mesh_l2g");
683 xt::pyarray<double> &dV_ref = args.
array<
double>(
"dV_ref");
684 xt::pyarray<double> &u_trial_ref = args.
array<
double>(
"u_trial_ref");
685 xt::pyarray<double> &u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
686 xt::pyarray<double> &u_test_ref = args.
array<
double>(
"u_test_ref");
687 xt::pyarray<double> &u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
688 xt::pyarray<double> &mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
689 xt::pyarray<double> &mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
690 xt::pyarray<double> &dS_ref = args.
array<
double>(
"dS_ref");
691 xt::pyarray<double> &u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
692 xt::pyarray<double> &u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
693 xt::pyarray<double> &u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
694 xt::pyarray<double> &u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
695 xt::pyarray<double> &normal_ref = args.
array<
double>(
"normal_ref");
696 xt::pyarray<double> &boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
697 int nElements_global = args.
scalar<
int>(
"nElements_global");
698 xt::pyarray<double> &ebqe_penalty_ext = args.
array<
double>(
"ebqe_penalty_ext");
699 xt::pyarray<int> &elementMaterialTypes = args.
array<
int>(
"elementMaterialTypes");
700 xt::pyarray<int> &isSeepageFace = args.
array<
int>(
"isSeepageFace");
701 xt::pyarray<int> &a_rowptr = args.
array<
int>(
"a_rowptr");
702 xt::pyarray<int> &a_colind = args.
array<
int>(
"a_colind");
703 double rho = args.
scalar<
double>(
"rho");
704 double beta = args.
scalar<
double>(
"beta");
707 xt::pyarray<double> &q_rho = args.
array<
double>(
"q_rho");
708 xt::pyarray<double> &ebqe_rho = args.
array<
double>(
"ebqe_rho");
711 xt::pyarray<double> &gravity = args.
array<
double>(
"gravity");
712 xt::pyarray<double> &alpha = args.
array<
double>(
"alpha");
713 xt::pyarray<double> &
n = args.
array<
double>(
"n");
714 xt::pyarray<double> &thetaR = args.
array<
double>(
"thetaR");
715 xt::pyarray<double> &thetaSR = args.
array<
double>(
"thetaSR");
717 xt::pyarray<double> &KWs = args.
array<
double>(
"KWs");
718 double useMetrics = args.
scalar<
double>(
"useMetrics");
719 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
720 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
721 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
724 xt::pyarray<int> &u_l2g = args.
array<
int>(
"u_l2g");
725 xt::pyarray<double> &elementDiameter = args.
array<
double>(
"elementDiameter");
726 xt::pyarray<double> &u_dof = args.
array<
double>(
"u_dof");
727 xt::pyarray<double> &velocity = args.
array<
double>(
"velocity");
728 xt::pyarray<double> &q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
729 xt::pyarray<double> &cfl = args.
array<
double>(
"cfl");
730 xt::pyarray<double> &q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
731 xt::pyarray<double> &q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
732 xt::pyarray<int> &csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
733 xt::pyarray<int> &csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
734 xt::pyarray<double> &globalJacobian = args.
array<
double>(
"globalJacobian");
735 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
736 xt::pyarray<int> &exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
737 xt::pyarray<int> &elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
738 xt::pyarray<int> &elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
739 xt::pyarray<double> &ebqe_velocity_ext = args.
array<
double>(
"ebqe_velocity_ext");
740 xt::pyarray<int> &isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
741 xt::pyarray<double> &ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
742 xt::pyarray<int> &isFluxBoundary_u = args.
array<
int>(
"isFluxBoundary_u");
743 xt::pyarray<double> &ebqe_bc_flux_ext = args.
array<
double>(
"ebqe_bc_flux_ext");
744 xt::pyarray<int> &csrColumnOffsets_eb_u_u = args.
array<
int>(
"csrColumnOffsets_eb_u_u");
745 int LUMPED_MASS_MATRIX = args.
scalar<
int>(
"LUMPED_MASS_MATRIX");
746 assert(a_rowptr.data()[nSpace] ==
nnz);
747 assert(a_rowptr.data()[nSpace] == nSpace);
753 for (
int eN = 0; eN < nElements_global; eN++) {
754 double elementJacobian_u_u[nDOF_test_element][nDOF_trial_element];
755 for (
int i = 0; i < nDOF_test_element; i++) {
756 for (
int j = 0; j < nDOF_trial_element; j++) { elementJacobian_u_u[i][j] = 0.0; }
758 for (
int k = 0; k < nQuadraturePoints_element; k++) {
759 int eN_k = eN * nQuadraturePoints_element + k,
760 eN_k_nSpace = eN_k * nSpace,
761 eN_nDOF_trial_element = eN * nDOF_trial_element;
764 double u = 0.0, grad_u[nSpace], m = 0.0, dm = 0.0,
f[nSpace],
df[nSpace], a[
nnz], da[
nnz], as[
nnz], m_t = 0.0, dm_t = 0.0, dpdeResidual_u_u[nDOF_trial_element], Lstar_u[nDOF_test_element], dsubgridError_u_u[nDOF_trial_element], tau = 0.0, tau0 = 0.0, tau1 = 0.0, jac[nSpace * nSpace], jacDet, jacInv[nSpace * nSpace], u_grad_trial[nDOF_trial_element * nSpace], dV, u_test_dV[nDOF_test_element], u_grad_test_dV[nDOF_test_element * nSpace], x, y,
z,
xt, yt, zt, G[nSpace * nSpace], G_dd_G, tr_G;
769 ck.calculateMapping_element(eN, k, mesh_dof.data(), mesh_l2g.data(), mesh_trial_ref.data(), mesh_grad_trial_ref.data(), jac, jacDet, jacInv, x, y,
z);
770 ck.calculateMappingVelocity_element(eN, k, mesh_velocity_dof.data(), mesh_l2g.data(), mesh_trial_ref.data(),
xt, yt, zt);
772 dV = fabs(jacDet) * dV_ref.data()[k];
773 ck.calculateG(jacInv, G, G_dd_G, tr_G);
775 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k * nDOF_trial_element * nSpace], jacInv, u_grad_trial);
777 ck.valFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], &u_trial_ref.data()[k * nDOF_trial_element],
u);
779 ck.gradFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], u_grad_trial, grad_u);
781 for (
int j = 0; j < nDOF_trial_element; j++) {
782 u_test_dV[j] = u_test_ref.data()[k * nDOF_trial_element + j] * dV;
783 for (
int I = 0; I < nSpace; I++) {
784 u_grad_test_dV[j * nSpace + I] = u_grad_trial[j * nSpace + I] * dV;
790 double Kr, dKr, thetaW;
793 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, q_rho.data()[eN_k], beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
794 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz],
u, m, dm,
f,
df, a, da, as, Kr, dKr, thetaW);
798 ck.bdf(alphaBDF, q_m_betaBDF.data()[eN_k], m, dm, m_t, dm_t);
803 for (
int i = 0; i < nDOF_test_element; i++) {
804 int i_nSpace = i * nSpace;
805 Lstar_u[i] =
ck.Advection_adjoint(
df, &u_grad_test_dV[i_nSpace]);
808 for (
int j = 0; j < nDOF_trial_element; j++) {
809 int j_nSpace = j * nSpace;
810 dpdeResidual_u_u[j] =
ck.MassJacobian_strong(dm_t, u_trial_ref[k * nDOF_trial_element + j]) +
ck.AdvectionJacobian_strong(
df, &u_grad_trial[j_nSpace]);
815 tau = useMetrics * tau1 + (1.0 - useMetrics) * tau0;
816 for (
int j = 0; j < nDOF_trial_element; j++) dsubgridError_u_u[j] = -tau * dpdeResidual_u_u[j];
817 for (
int i = 0; i < nDOF_test_element; i++) {
818 for (
int j = 0; j < nDOF_trial_element; j++) {
819 int j_nSpace = j * nSpace;
820 int i_nSpace = i * nSpace;
821 elementJacobian_u_u[i][j] +=
ck.MassJacobian_weak(dm_t, u_trial_ref.data()[k * nDOF_trial_element + j], u_test_dV[i]) +
ck.AdvectionJacobian_weak(
df, u_trial_ref.data()[k * nDOF_trial_element + j], &u_grad_test_dV[i_nSpace]) +
822 ck.DiffusionJacobian_weak(a_rowptr.data(), a_colind.data(), a, da, grad_u, &u_grad_test_dV[i_nSpace], 1.0, u_trial_ref.data()[k * nDOF_trial_element + j], &u_grad_trial[j_nSpace]) +
VMS *
ck.SubgridErrorJacobian(dsubgridError_u_u[j], Lstar_u[i]) +
VMS *
ck.NumericalDiffusionJacobian(q_numDiff_u_last[eN_k], &u_grad_trial[j_nSpace], &u_grad_test_dV[i_nSpace]);
829 for (
int i = 0; i < nDOF_test_element; i++) {
830 int eN_i = eN * nDOF_test_element + i;
831 for (
int j = 0; j < nDOF_trial_element; j++) {
832 int eN_i_j = eN_i * nDOF_trial_element + j;
833 globalJacobian.data()[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_u_u[eN_i_j]] += elementJacobian_u_u[i][j];
840 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++) {
841 int ebN = exteriorElementBoundariesArray.data()[ebNE];
842 int eN = elementBoundaryElementsArray.data()[ebN * 2 + 0], ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN * 2 + 0], eN_nDOF_trial_element = eN * nDOF_trial_element;
843 for (
int kb = 0; kb < nQuadraturePoints_elementBoundary; kb++) {
844 int ebNE_kb = ebNE * nQuadraturePoints_elementBoundary + kb, ebNE_kb_nSpace = ebNE_kb * nSpace, ebN_local_kb = ebN_local * nQuadraturePoints_elementBoundary + kb, ebN_local_kb_nSpace = ebN_local_kb * nSpace;
846 double u_ext = 0.0, grad_u_ext[nSpace], m_ext = 0.0, dm_ext = 0.0, f_ext[nSpace], df_ext[nSpace], a_ext[
nnz], da_ext[
nnz], as_ext[
nnz], dflux_u_u_ext = 0.0, bc_u_ext = 0.0,
848 bc_m_ext = 0.0, bc_dm_ext = 0.0, bc_f_ext[nSpace], bc_df_ext[nSpace], bc_a_ext[
nnz], bc_da_ext[
nnz], bc_as_ext[
nnz], fluxJacobian_u_u[nDOF_trial_element], jac_ext[nSpace * nSpace], jacDet_ext, jacInv_ext[nSpace * nSpace], boundaryJac[nSpace * (nSpace - 1)], metricTensor[(nSpace - 1) * (nSpace - 1)], metricTensorDetSqrt, dS, u_test_dS[nDOF_test_element], u_grad_trial_trace[nDOF_trial_element * nSpace], normal[3], x_ext, y_ext, z_ext, xt_ext, yt_ext, zt_ext, integralScaling, G[nSpace * nSpace], G_dd_G, tr_G;
852 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,
853 normal_ref.data(), normal, x_ext, y_ext, z_ext);
854 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);
855 dS = ((1.0 - MOVING_DOMAIN) * metricTensorDetSqrt + MOVING_DOMAIN * integralScaling) * dS_ref.data()[kb];
856 ck.calculateG(jacInv_ext, G, G_dd_G, tr_G);
859 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace * nDOF_trial_element], jacInv_ext, u_grad_trial_trace);
861 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);
862 ck.gradFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], u_grad_trial_trace, grad_u_ext);
864 for (
int j = 0; j < nDOF_trial_element; j++) { u_test_dS[j] = u_test_trace_ref.data()[ebN_local_kb * nDOF_test_element + j] * dS; }
868 bc_u_ext = isDOFBoundary_u.data()[ebNE_kb] * ebqe_bc_u_ext.data()[ebNE_kb] + (1 - isDOFBoundary_u.data()[ebNE_kb]) * u_ext;
872 double Kr, dKr, thetaW, thetaW_bc;
873 const double rho_ext = ebqe_rho.data()[ebNE_kb];
875 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_ext, beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
876 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz], u_ext, m_ext, dm_ext, f_ext, df_ext, a_ext, da_ext, as_ext, Kr, dKr, thetaW);
877 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_ext, beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
878 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz], bc_u_ext, bc_m_ext, bc_dm_ext, bc_f_ext, bc_df_ext, bc_a_ext, bc_da_ext, bc_as_ext, Kr, dKr, thetaW_bc);
882 for (
int j = 0; j < nDOF_trial_element; j++) {
883 exteriorNumericalFluxJacobian(a_rowptr.data(), a_colind.data(), isDOFBoundary_u.data()[ebNE_kb], normal, a_ext, da_ext, grad_u_ext, &u_grad_trial_trace[j * nSpace], df_ext, u_trial_trace_ref.data()[ebN_local_kb * nDOF_test_element + j],
884 ebqe_penalty_ext.data()[ebNE_kb],
885 fluxJacobian_u_u[j]);
890 for (
int i = 0; i < nDOF_test_element; i++) {
891 int eN_i = eN * nDOF_test_element + i;
892 for (
int j = 0; j < nDOF_trial_element; j++) {
894 globalJacobian.data()[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] += fluxJacobian_u_u[j] * u_test_dS[i];
1188 xt::pyarray<double> &globalJacobian = args.
array<
double>(
"globalJacobian");
1189 double Theta = args.
scalar<
double>(
"Theta");
1190 double Theta_h = args.
scalar<
double>(
"Theta_h");
1191 xt::pyarray<double> &bc_mask = args.
array<
double>(
"bc_mask");
1192 double dt = args.
scalar<
double>(
"dt");
1193 xt::pyarray<double> &mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1194 xt::pyarray<double> &mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1195 xt::pyarray<double> &mesh_dof = args.
array<
double>(
"mesh_dof");
1196 xt::pyarray<double> &mesh_velocity_dof = args.
array<
double>(
"mesh_velocity_dof");
1197 double MOVING_DOMAIN = args.
scalar<
double>(
"MOVING_DOMAIN");
1198 xt::pyarray<int> &mesh_l2g = args.
array<
int>(
"mesh_l2g");
1199 xt::pyarray<double> &dV_ref = args.
array<
double>(
"dV_ref");
1200 xt::pyarray<double> &u_trial_ref = args.
array<
double>(
"u_trial_ref");
1201 xt::pyarray<double> &u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1202 xt::pyarray<double> &u_test_ref = args.
array<
double>(
"u_test_ref");
1203 xt::pyarray<double> &u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1204 xt::pyarray<double> &mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1205 xt::pyarray<double> &mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1206 xt::pyarray<double> &dS_ref = args.
array<
double>(
"dS_ref");
1207 xt::pyarray<double> &u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1209 xt::pyarray<double> &u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1210 xt::pyarray<double> &u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1211 xt::pyarray<double> &u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1212 xt::pyarray<double> &normal_ref = args.
array<
double>(
"normal_ref");
1213 xt::pyarray<double> &boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1214 int nElements_global = args.
scalar<
int>(
"nElements_global");
1215 xt::pyarray<double> &ebqe_penalty_ext = args.
array<
double>(
"ebqe_penalty_ext");
1216 xt::pyarray<int> &elementMaterialTypes = args.
array<
int>(
"elementMaterialTypes");
1217 xt::pyarray<int> &isSeepageFace = args.
array<
int>(
"isSeepageFace");
1218 xt::pyarray<int> &a_rowptr = args.
array<
int>(
"a_rowptr");
1219 xt::pyarray<int> &a_colind = args.
array<
int>(
"a_colind");
1220 double rho = args.
scalar<
double>(
"rho");
1221 double beta = args.
scalar<
double>(
"beta");
1223 xt::pyarray<double> &q_rho = args.
array<
double>(
"q_rho");
1224 xt::pyarray<double> &ebqe_rho = args.
array<
double>(
"ebqe_rho");
1225 xt::pyarray<double> &gravity = args.
array<
double>(
"gravity");
1226 xt::pyarray<double> &alpha = args.
array<
double>(
"alpha");
1227 xt::pyarray<double> &
n = args.
array<
double>(
"n");
1228 xt::pyarray<double> &thetaR = args.
array<
double>(
"thetaR");
1229 xt::pyarray<double> &thetaSR = args.
array<
double>(
"thetaSR");
1231 xt::pyarray<double> &KWs = args.
array<
double>(
"KWs");
1232 double useMetrics = args.
scalar<
double>(
"useMetrics");
1233 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
1234 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
1235 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
1236 double sc_uref = args.
scalar<
double>(
"sc_uref");
1237 double sc_alpha = args.
scalar<
double>(
"sc_alpha");
1238 xt::pyarray<int> &u_l2g = args.
array<
int>(
"u_l2g");
1239 xt::pyarray<int> &r_l2g = args.
array<
int>(
"r_l2g");
1240 xt::pyarray<double> &elementDiameter = args.
array<
double>(
"elementDiameter");
1241 int degree_polynomial = args.
scalar<
int>(
"degree_polynomial");
1242 xt::pyarray<double> &u_dof = args.
array<
double>(
"u_dof");
1243 xt::pyarray<double> &u_dof_old = args.
array<
double>(
"u_dof_old");
1244 xt::pyarray<double> &velocity = args.
array<
double>(
"velocity");
1245 xt::pyarray<double> &q_m = args.
array<
double>(
"q_m");
1246 xt::pyarray<double> &q_theta = args.
array<
double>(
"q_theta");
1247 xt::pyarray<double> &q_u = args.
array<
double>(
"q_u");
1248 xt::pyarray<double> &q_dV = args.
array<
double>(
"q_dV");
1249 xt::pyarray<double> &q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
1250 xt::pyarray<double> &cfl = args.
array<
double>(
"cfl");
1251 xt::pyarray<double> &q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
1252 xt::pyarray<double> &q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
1253 int offset_u = args.
scalar<
int>(
"offset_u");
1254 int stride_u = args.
scalar<
int>(
"stride_u");
1255 xt::pyarray<double> &globalResidual = args.
array<
double>(
"globalResidual");
1256 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1257 xt::pyarray<int> &exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1258 xt::pyarray<int> &elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1259 xt::pyarray<int> &elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1260 xt::pyarray<double> &ebqe_velocity_ext = args.
array<
double>(
"ebqe_velocity_ext");
1261 xt::pyarray<int> &isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
1262 xt::pyarray<double> &ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
1263 xt::pyarray<int> &isFluxBoundary_u = args.
array<
int>(
"isFluxBoundary_u");
1264 xt::pyarray<double> &ebqe_bc_flux_ext = args.
array<
double>(
"ebqe_bc_flux_ext");
1265 xt::pyarray<double> &ebqe_phi = args.
array<
double>(
"ebqe_phi");
1266 double epsFact = args.
scalar<
double>(
"epsFact");
1267 xt::pyarray<double> &ebqe_u = args.
array<
double>(
"ebqe_u");
1268 xt::pyarray<double> &ebqe_theta = args.
array<
double>(
"ebqe_theta");
1269 xt::pyarray<double> &ebqe_flux = args.
array<
double>(
"ebqe_flux");
1271 double cE = args.
scalar<
double>(
"cE");
1272 double cK = args.
scalar<
double>(
"cK");
1274 double uL = args.
scalar<
double>(
"uL");
1275 double uR = args.
scalar<
double>(
"uR");
1277 int numDOFs = args.
scalar<
int>(
"numDOFs");
1278 int NNZ = args.
scalar<
int>(
"NNZ");
1279 xt::pyarray<int> &csrRowIndeces_DofLoops = args.
array<
int>(
"csrRowIndeces_DofLoops");
1280 xt::pyarray<int> &csrColumnOffsets_DofLoops = args.
array<
int>(
"csrColumnOffsets_DofLoops");
1281 xt::pyarray<int> &csrRowIndeces_CellLoops = args.
array<
int>(
"csrRowIndeces_CellLoops");
1282 xt::pyarray<int> &csrColumnOffsets_CellLoops = args.
array<
int>(
"csrColumnOffsets_CellLoops");
1283 xt::pyarray<int> &csrColumnOffsets_eb_CellLoops = args.
array<
int>(
"csrColumnOffsets_eb_CellLoops");
1285 xt::pyarray<double> &Cx = args.
array<
double>(
"Cx");
1286 xt::pyarray<double> &Cy = args.
array<
double>(
"Cy");
1287 xt::pyarray<double> &Cz = args.
array<
double>(
"Cz");
1288 xt::pyarray<double> &CTx = args.
array<
double>(
"CTx");
1289 xt::pyarray<double> &CTy = args.
array<
double>(
"CTy");
1290 xt::pyarray<double> &CTz = args.
array<
double>(
"CTz");
1291 xt::pyarray<double> &ML = args.
array<
double>(
"ML");
1292 xt::pyarray<double> &MC = args.
array<
double>(
"MC");
1294 xt::pyarray<double> &delta_x_ij = args.
array<
double>(
"delta_x_ij");
1296 int LUMPED_MASS_MATRIX = args.
scalar<
int>(
"LUMPED_MASS_MATRIX");
1299 int ENTROPY_TYPE = args.
scalar<
int>(
"ENTROPY_TYPE");
1301 xt::pyarray<double> &dLow = args.
array<
double>(
"dLow");
1302 xt::pyarray<double> &fluxMatrix = args.
array<
double>(
"fluxMatrix");
1303 xt::pyarray<double> &mDotLow = args.
array<
double>(
"mDotLow");
1304 xt::pyarray<double> &mLow = args.
array<
double>(
"mLow");
1305 xt::pyarray<double> &dt_times_fH_minus_fL = args.
array<
double>(
"dt_times_fH_minus_fL");
1306 xt::pyarray<double> &min_m_bc = args.
array<
double>(
"min_m_bc");
1307 xt::pyarray<double> &max_m_bc = args.
array<
double>(
"max_m_bc");
1309 xt::pyarray<double> &quantDOFs = args.
array<
double>(
"quantDOFs");
1310 xt::pyarray<double> &mn = args.
array<
double>(
"mn");
1311 xt::pyarray<double> &fluxCorrection = args.
array<
double>(
"fluxCorrection");
1312 xt::pyarray<double> &limited_solution = args.
array<
double>(
"limited_solution");
1313 xt::pyarray<int> &freeDOFMaterialTypes = args.
array<
int>(
"freeDOFMaterialTypes");
1315 xt::pyarray<double> &velocity_couple = args.
array<
double>(
"velocity_couple");
1316 xt::pyarray<double> &ebqe_velocity_ext_couple = args.
array<
double>(
"ebqe_velocity_ext_couple");
1320 xt::pyarray<double> &anb_seepage_flux_n = args.
array<
double>(
"anb_seepage_flux_n");
1321 xt::pyarray<double> &q_velocity = args.
array<
double>(
"q_velocity");
1322 double &anb_seepage_flux(args.
scalar<
double>(
"anb_seepage_flux"));
1323 anb_seepage_flux = 0.0;
1324 xt::pyarray<int> &csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
1325 xt::pyarray<int> &csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
1326 xt::pyarray<int> &csrColumnOffsets_eb_u_u = args.
array<
int>(
"csrColumnOffsets_eb_u_u");
1328 std::vector<double> Rpos(numDOFs, 0.0), Rneg(numDOFs, 0.0);
1329 std::vector<double> TransportMatrix(NNZ, 0.0),
1330 TransportMatrixConsistent(NNZ, 0.0),
1331 TransportMatrixn(NNZ, 0.0),
1332 TransportMatrixConsistentn(NNZ, 0.0);
1339 std::valarray<double> u_free_dof(numDOFs);
1340 std::valarray<double> u_free_dof_old(numDOFs);
1341 std::valarray<double> ML2(numDOFs);
1343 std::vector<double> rho_dof(numDOFs, 0.0);
1344 std::vector<double> ML_rho(numDOFs, 0.0);
1345 std::fill(velocity_couple.data(), velocity_couple.data() + velocity_couple.size(), 0.0);
1346 std::fill(ebqe_velocity_ext_couple.data(), ebqe_velocity_ext_couple.data() + ebqe_velocity_ext_couple.size(), 0.0);
1348 for (
int eN = 0; eN < nElements_global; eN++)
1349 for (
int j = 0; j < nDOF_trial_element; j++) {
1350 int eN_nDOF_trial_element = eN * nDOF_trial_element;
1351 u_free_dof[r_l2g.data()[eN_nDOF_trial_element + j]] = u_dof.data()[u_l2g.data()[eN_nDOF_trial_element + j]];
1352 u_free_dof_old[r_l2g.data()[eN_nDOF_trial_element + j]] = u_dof_old.data()[u_l2g.data()[eN_nDOF_trial_element + j]];
1354 for (
int i = 0; i < NNZ; i++) {
1355 TransportMatrix[i] = 0.;
1356 TransportMatrixConsistent[i] = 0.;
1357 TransportMatrixn[i] = 0.;
1358 TransportMatrixConsistentn[i] = 0.;
1363 for (
int eN = 0; eN < nElements_global; eN++) {
1364 const int eN_nDOF_trial_element = eN * nDOF_trial_element;
1365 for (
int k = 0; k < nQuadraturePoints_element; k++) {
1366 const int eN_k = eN * nQuadraturePoints_element + k;
1367 double jac[nSpace * nSpace], jacDet, jacInv[nSpace * nSpace], x, y,
z;
1368 ck.calculateMapping_element(eN, k, mesh_dof.data(), mesh_l2g.data(),
1369 mesh_trial_ref.data(), mesh_grad_trial_ref.data(),
1370 jac, jacDet, jacInv, x, y,
z);
1371 const double dV = fabs(jacDet) * dV_ref.data()[k];
1372 for (
int i = 0; i < nDOF_test_element; i++) {
1373 const int eN_i = eN * nDOF_test_element + i;
1374 const int free_gi = r_l2g.data()[eN_i];
1375 const double u_test_dV = u_test_ref.data()[k * nDOF_trial_element + i] * dV;
1376 rho_dof[free_gi] += q_rho.data()[eN_k] * u_test_dV;
1377 ML_rho[free_gi] += u_test_dV;
1381 for (
int i = 0; i < numDOFs; ++i) {
1382 if (ML_rho[i] > 0.0) rho_dof[i] /= ML_rho[i];
1383 else rho_dof[i] = rho;
1390 double psi[numDOFs], eta[numDOFs], global_entropy_residual[numDOFs], boundary_integral[numDOFs];
1391 for (
int i = 0; i < numDOFs; i++) {
1395 double solni = 1.0 * u_free_dof_old[i];
1397 global_entropy_residual[i] = 0.;
1399 boundary_integral[i] = 0.;
1412 for (
int eN = 0; eN < nElements_global; eN++) {
1413 const int eN_nDOF_trial_element = eN * nDOF_trial_element;
1414 const int eN_nDOF_mesh_trial_element = eN * nDOF_mesh_trial_element;
1416 double elementResidual_u[nDOF_test_element], element_entropy_residual[nDOF_test_element], Phi[nDOF_trial_element], Phi_n[nDOF_trial_element];
1417 double elementTransport[nDOF_test_element][nDOF_trial_element], elementTransportConsistent[nDOF_test_element][nDOF_trial_element];
1418 double elementTransportn[nDOF_test_element][nDOF_trial_element], elementTransportConsistentn[nDOF_test_element][nDOF_trial_element];
1419 for (
int j = 0; j < nDOF_trial_element; j++) {
1420 const int u_gj = u_l2g.data()[eN_nDOF_trial_element + j];
1421 const int free_gj = r_l2g.data()[eN_nDOF_trial_element + j];
1422 const int x_gj = mesh_l2g.data()[eN_nDOF_mesh_trial_element + j];
1423 const double rho_node_j = rho_dof[free_gj];
1424 Phi[j] = u_dof.data()[u_gj];
1425 Phi_n[j] = u_dof_old.data()[u_gj];
1426 for (
int I = 0; I < nSpace; I++) {
1428 Phi[j] -= (rho_node_j / rho) * mesh_dof.data()[x_gj * 3 + I] * gravity[I];
1429 Phi_n[j] -= (rho_node_j / rho) * mesh_dof.data()[x_gj * 3 + I] * gravity[I];
1432 for (
int i = 0; i < nDOF_test_element; i++) {
1433 elementResidual_u[i] = 0.0;
1434 element_entropy_residual[i] = 0.0;
1435 for (
int j = 0; j < nDOF_trial_element; j++) {
1436 elementTransport[i][j] = 0.0;
1437 elementTransportConsistent[i][j] = 0.0;
1438 elementTransportn[i][j] = 0.0;
1439 elementTransportConsistentn[i][j] = 0.0;
1443 for (
int k = 0; k < nQuadraturePoints_element; k++) {
1445 int eN_k = eN * nQuadraturePoints_element + k, eN_k_nSpace = eN_k * nSpace;
1448 aux_entropy_residual = 0.,
1449 DENTROPY_un, DENTROPY_uni,
1451 u = 0.0, un = 0.0, grad_phi[nSpace], grad_phi_n[nSpace], grad_u_velocity[nSpace], velocity_loc[nSpace], u_test_dV[nDOF_trial_element], u_grad_trial[nDOF_trial_element * nSpace], u_grad_test_dV[nDOF_test_element * nSpace],
1453 jac[nSpace * nSpace], jacDet, jacInv[nSpace * nSpace], dV, x, y,
z,
xt, yt, zt, m, dm,
f[nSpace],
df[nSpace], a[
nnz], da[
nnz], as[
nnz], mn, dmn, fn[nSpace], dfn[nSpace], an[
nnz], dan[
nnz], asn[
nnz];
1455 ck.calculateMapping_element(eN, k, mesh_dof.data(), mesh_l2g.data(), mesh_trial_ref.data(), mesh_grad_trial_ref.data(), jac, jacDet, jacInv, x, y,
z);
1456 ck.calculateMappingVelocity_element(eN, k, mesh_velocity_dof.data(), mesh_l2g.data(), mesh_trial_ref.data(),
xt, yt, zt);
1457 dV = fabs(jacDet) * dV_ref.data()[k];
1459 ck.valFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], &u_trial_ref.data()[k * nDOF_trial_element],
u);
1461 ck.valFromDOF(u_dof_old.data(), &u_l2g.data()[eN_nDOF_trial_element], &u_trial_ref.data()[k * nDOF_trial_element], un);
1463 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k * nDOF_trial_element * nSpace], jacInv, u_grad_trial);
1464 ck.gradFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], u_grad_trial, grad_u_velocity);
1472 for (
int I = 0; I < nSpace; I++) {
1474 grad_phi_n[I] = 0.0;
1476 for (
int j = 0; j < nDOF_trial_element; j++) {
1477 u_test_dV[j] = u_test_ref.data()[k * nDOF_trial_element + j] * dV;
1478 for (
int I = 0; I < nSpace; I++) {
1479 grad_phi_n[I] += Phi_n[j] * u_grad_trial[j * nSpace + I];
1480 grad_phi[I] += Phi[j] * u_grad_trial[j * nSpace + I];
1481 u_grad_test_dV[j * nSpace + I] = u_grad_trial[j * nSpace + I] * dV;
1487 double Kr, dKr, Krn, dKrn, thetaW, thetaWn;
1488 const double rho_local = q_rho.data()[eN_k];
1489 const double rho_velocity = std::fabs(rho_local) > 1.0e-12 ? rho_local : rho;
1491 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_local, beta, gravity.data(), alpha.data()[elementMaterialTypes[eN]],
n.data()[elementMaterialTypes[eN]], thetaR.data()[elementMaterialTypes[eN]], thetaSR.data()[elementMaterialTypes[eN]],
1492 &KWs.data()[elementMaterialTypes[eN] *
nnz], un, mn, dmn, fn, dfn, an, dan, asn, Krn, dKrn, thetaWn);
1493 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_local, beta, gravity.data(), alpha.data()[elementMaterialTypes[eN]],
n.data()[elementMaterialTypes[eN]], thetaR.data()[elementMaterialTypes[eN]], thetaSR.data()[elementMaterialTypes[eN]],
1494 &KWs.data()[elementMaterialTypes[eN] *
nnz],
u, m, dm,
f,
df, a, da, as, Kr, dKr, thetaW);
1495 q_theta.data()[eN_k] = thetaW;
1499 for (
int I = 0; I < nSpace; ++I) {
1500 q_velocity.data()[eN_k_nSpace + I] = grad_u_velocity[I];
1503 double pressure_gradient[nSpace];
1504 const double rho_ratio = rho_velocity / rho;
1505 for (
int J = 0; J < nSpace; ++J)
1506 pressure_gradient[J] = grad_u_velocity[J] - rho_ratio * gravity.data()[J];
1508 for (
int I = 0; I < nSpace; ++I) {
1510 for (
int ii = a_rowptr.data()[I]; ii < a_rowptr.data()[I+1]; ++ii) {
1511 const int J = a_colind.data()[ii];
1512 acc += (a[ii] / rho_velocity) * pressure_gradient[J];
1514 velocity.data()[eN_k_nSpace + I] = -acc;
1515 velocity_couple.data()[eN_k_nSpace + I] = -acc;
1520 double mesh_velocity[3];
1521 mesh_velocity[0] =
xt;
1522 mesh_velocity[1] = yt;
1523 mesh_velocity[2] = zt;
1525 for (
int I = 0; I < nSpace; I++) {
1526 f[I] -= MOVING_DOMAIN * m * mesh_velocity[I];
1527 velocity_loc[I] =
df[I] * (2.0 * dm * dm / (dm * dm + fmax(1.0e-16, dm * dm)));
1532 calculateCFL(elementDiameter.data()[eN] / degree_polynomial, velocity_loc, cfl.data()[eN_k]);
1538 for (
int I = 0; I < nSpace; I++) aux_entropy_residual += velocity_loc[I] * grad_phi_n[I];
1544 for (
int i = 0; i < nDOF_test_element; i++) {
1546 int eN_i = eN * nDOF_test_element + i;
1547 ML2[u_l2g.data()[eN_i]] += u_test_dV[i];
1550 int gi = offset_u + stride_u * u_l2g.data()[eN_i];
1551 double uni = u_dof_old.data()[gi];
1553 element_entropy_residual[i] += (DENTROPY_un - DENTROPY_uni) * aux_entropy_residual * u_test_dV[i];
1556 elementResidual_u[i] += m * u_test_dV[i];
1561 for (
int j = 0; j < nDOF_trial_element; j++) {
1562 int j_nSpace = j * nSpace;
1563 int i_nSpace = i * nSpace;
1564 elementTransport[i][j] +=
ck.SimpleDiffusionJacobian_weak(a_rowptr.data(), a_colind.data(), as, &u_grad_trial[j_nSpace], &u_grad_test_dV[i_nSpace]);
1565 elementTransportConsistent[i][j] +=
ck.SimpleDiffusionJacobian_weak(a_rowptr.data(), a_colind.data(), a, &u_grad_trial[j_nSpace], &u_grad_test_dV[i_nSpace]);
1566 elementTransportn[i][j] +=
ck.SimpleDiffusionJacobian_weak(a_rowptr.data(), a_colind.data(), asn, &u_grad_trial[j_nSpace], &u_grad_test_dV[i_nSpace]);
1567 elementTransportConsistentn[i][j] +=
ck.SimpleDiffusionJacobian_weak(a_rowptr.data(), a_colind.data(), an, &u_grad_trial[j_nSpace], &u_grad_test_dV[i_nSpace]);
1571 q_u.data()[eN_k] =
u;
1572 q_m.data()[eN_k] = m;
1577 for (
int i = 0; i < nDOF_test_element; i++) {
1578 int eN_i = eN * nDOF_test_element + i;
1579 int gi = offset_u + stride_u * r_l2g.data()[eN_i];
1582 global_entropy_residual[gi] += element_entropy_residual[i];
1584 for (
int j = 0; j < nDOF_trial_element; j++) {
1585 int eN_i_j = eN_i * nDOF_trial_element + j;
1586 TransportMatrix[csrRowIndeces_CellLoops.data()[eN_i] + csrColumnOffsets_CellLoops.data()[eN_i_j]] += elementTransport[i][j];
1587 TransportMatrixConsistent[csrRowIndeces_CellLoops.data()[eN_i] + csrColumnOffsets_CellLoops.data()[eN_i_j]] += elementTransportConsistent[i][j];
1588 TransportMatrixn[csrRowIndeces_CellLoops.data()[eN_i] + csrColumnOffsets_CellLoops.data()[eN_i_j]] += elementTransportn[i][j];
1589 TransportMatrixConsistentn[csrRowIndeces_CellLoops.data()[eN_i] + csrColumnOffsets_CellLoops.data()[eN_i_j]] += elementTransportConsistentn[i][j];
1600 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++) {
1601 int ebN = exteriorElementBoundariesArray.data()[ebNE], eN = elementBoundaryElementsArray.data()[ebN * 2 + 0], ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN * 2 + 0], eN_nDOF_trial_element = eN * nDOF_trial_element;
1602 double elementResidual_u[nDOF_test_element];
1603 for (
int i = 0; i < nDOF_test_element; i++) { elementResidual_u[i] = 0.0; }
1604 for (
int kb = 0; kb < nQuadraturePoints_elementBoundary; kb++) {
1605 int ebNE_kb = ebNE * nQuadraturePoints_elementBoundary + kb, ebNE_kb_nSpace = ebNE_kb * nSpace, ebN_local_kb = ebN_local * nQuadraturePoints_elementBoundary + kb, ebN_local_kb_nSpace = ebN_local_kb * nSpace;
1606 double u_ext = 0.0, un_ext, grad_u_ext[nSpace], m_ext = 0.0, dm_ext = 0.0, f_ext[nSpace], df_ext[nSpace], a_ext[
nnz], da_ext[
nnz], as_ext[
nnz],
1607 mn_ext = 0.0, dmn_ext = 0.0, fn_ext[nSpace], dfn_ext[nSpace], an_ext[
nnz], dan_ext[
nnz], asn_ext[
nnz], flux_ext = 0.0, bflux_ext = 0.0,
1609 bc_u_ext = 0.0, bc_grad_u_ext[nSpace], bc_m_ext = 0.0, bc_dm_ext = 0.0, bc_f_ext[nSpace], bc_df_ext[nSpace], bc_a_ext[
nnz], bc_da_ext[
nnz], bc_as_ext[
nnz], jac_ext[nSpace * nSpace], jacDet_ext, jacInv_ext[nSpace * nSpace], boundaryJac[nSpace * (nSpace - 1)], metricTensor[(nSpace - 1) * (nSpace - 1)], metricTensorDetSqrt, dS, u_test_dS[nDOF_test_element], u_grad_trial_trace[nDOF_trial_element * nSpace], normal[3], x_ext, y_ext, z_ext, xt_ext, yt_ext, zt_ext, integralScaling, G[nSpace * nSpace], G_dd_G, tr_G, fluxJacobian_u_u[nDOF_trial_element], bfluxJacobian_u_u[nDOF_trial_element], fluxJacobian_un_un[nDOF_trial_element];
1610 for (
int j = 0; j < nDOF_trial_element; j++) {
1611 fluxJacobian_u_u[j] = 0.0; bfluxJacobian_u_u[j] = 0.0; fluxJacobian_un_un[j] = 0.0;
1617 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,
1618 normal_ref.data(), normal, x_ext, y_ext, z_ext);
1619 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);
1620 dS = ((1.0 - MOVING_DOMAIN) * metricTensorDetSqrt + MOVING_DOMAIN * integralScaling) * dS_ref.data()[kb];
1623 ck.calculateG(jacInv_ext, G, G_dd_G, tr_G);
1626 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace * nDOF_trial_element], jacInv_ext, u_grad_trial_trace);
1628 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);
1629 ck.valFromDOF(u_dof_old.data(), &u_l2g.data()[eN_nDOF_trial_element], &u_trial_trace_ref.data()[ebN_local_kb * nDOF_test_element], un_ext);
1630 ck.gradFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], u_grad_trial_trace, grad_u_ext);
1640 for (
int j = 0; j < nDOF_trial_element; j++) { u_test_dS[j] = u_test_trace_ref.data()[ebN_local_kb * nDOF_test_element + j] * dS; }
1644 bc_u_ext = isDOFBoundary_u.data()[ebNE_kb] * ebqe_bc_u_ext.data()[ebNE_kb] + (1 - isDOFBoundary_u.data()[ebNE_kb]) * u_ext;
1648 double bc_Kr, bc_dKr,bc_Kr_ext, bc_dKr_ext, bc_Krn, bc_dKrn, thetaW_ext, thetaWn_ext, thetaW_bc_ext;
1649 const double rho_ext = ebqe_rho.data()[ebNE_kb];
1650 const double rho_velocity_ext = std::fabs(rho_ext) > 1.0e-12 ? rho_ext : rho;
1652 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_ext, beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
1653 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz], u_ext, m_ext, dm_ext, f_ext, df_ext, a_ext, da_ext, as_ext, bc_Kr, bc_dKr, thetaW_ext);
1654 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_ext, beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
1655 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz], un_ext, mn_ext, dmn_ext, fn_ext, dfn_ext, an_ext, dan_ext, asn_ext, bc_Krn, bc_dKrn, thetaWn_ext);
1656 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_ext, beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
1657 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz], bc_u_ext, bc_m_ext, bc_dm_ext, bc_f_ext, bc_df_ext, bc_a_ext, bc_da_ext, bc_as_ext, bc_Kr_ext,bc_dKr_ext, thetaW_bc_ext);
1658 ebqe_theta.data()[ebNE_kb] = thetaW_ext;
1671 double ext_pressure_gradient[nSpace];
1672 const double rho_ratio_ext = rho_velocity_ext / rho;
1673 for (
int J = 0; J < nSpace; ++J)
1674 ext_pressure_gradient[J] = grad_u_ext[J] - rho_ratio_ext * gravity.data()[J];
1676 for (
int I = 0; I < nSpace; ++I) {
1678 for (
int ii = a_rowptr.data()[I]; ii < a_rowptr.data()[I+1]; ++ii) {
1679 const int J = a_colind.data()[ii];
1680 acc += (a_ext[ii] / rho_velocity_ext) * ext_pressure_gradient[J];
1682 ebqe_velocity_ext.data()[ebNE_kb_nSpace + I] = -acc;
1683 ebqe_velocity_ext_couple.data()[ebNE_kb_nSpace + I] = -acc;
1690 bool useConsistentFlux=
false;
1691 if (useConsistentFlux) {
1693 isSeepageFace.data()[ebNE],
1694 isDOFBoundary_u.data()[ebNE_kb], normal, bc_u_ext, a_ext, grad_u_ext, u_ext, f_ext,
1695 ebqe_penalty_ext.data()[ebNE_kb],
1699 isSeepageFace.data()[ebNE],
1700 isDOFBoundary_u.data()[ebNE_kb], normal, bc_u_ext, a_ext, grad_u_ext, u_ext, f_ext,
1701 ebqe_penalty_ext.data()[ebNE_kb],
1702 flux_ext, bflux_ext);
1705 ebqe_flux.data()[ebNE_kb] = flux_ext;
1707 anb_seepage_flux =
seepagefluxcalculator(anb_seepage_flux, isSeepageFace.data()[ebNE], dS, flux_ext);
1708 anb_seepage_flux_n.data()[0] = anb_seepage_flux;
1709 ebqe_u.data()[ebNE_kb] = u_ext;
1715 if (isDOFBoundary_u.data()[ebNE_kb]) {
1716 double bc_u_dof = isSeepageFace.data()[ebNE] ? 0.0 : ebqe_bc_u_ext.data()[ebNE_kb];
1717 for (
int i = 0; i < nDOF_test_element; i++) {
1718 if (u_test_trace_ref.data()[ebN_local_kb * nDOF_test_element + i] <= 1.0e-12)
continue;
1719 int free_gi = r_l2g.data()[eN * nDOF_test_element + i], mat_gi = freeDOFMaterialTypes.data()[free_gi];
1720 double m_bc, dm_bc, f_bc[nSpace], df_bc[nSpace], a_bc[
nnz], da_bc[
nnz], as_bc[
nnz], Kr_bc, dKr_bc, thetaW_bc;
1721 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, rho_dof[free_gi], beta, gravity.data(), alpha.data()[mat_gi],
1722 n.data()[mat_gi], thetaR.data()[mat_gi], thetaSR.data()[mat_gi], &KWs.data()[mat_gi *
nnz], bc_u_dof,
1723 m_bc, dm_bc, f_bc, df_bc, a_bc, da_bc, as_bc, Kr_bc, dKr_bc, thetaW_bc);
1724 min_m_bc.data()[free_gi] = fmin(min_m_bc.data()[free_gi], m_bc);
1725 max_m_bc.data()[free_gi] = fmax(max_m_bc.data()[free_gi], m_bc);
1731 for (
int i = 0; i < nDOF_test_element; i++) {
1732 if (useConsistentFlux) {
1733 elementResidual_u[i] +=
ck.ExteriorElementBoundaryFlux(flux_ext, u_test_dS[i]);
1735 elementResidual_u[i] +=
ck.ExteriorElementBoundaryFlux(bflux_ext, u_test_dS[i]);
1738 for (
int j = 0; j < nDOF_trial_element; j++) {
1739 if (useConsistentFlux) {
1740 exteriorNumericalFluxJacobian(a_rowptr.data(), a_colind.data(), isDOFBoundary_u.data()[ebNE_kb], normal, a_ext, da_ext, grad_u_ext, &u_grad_trial_trace[j * nSpace], df_ext, u_trial_trace_ref.data()[ebN_local_kb * nDOF_test_element + j],
1741 ebqe_penalty_ext.data()[ebNE_kb],
1742 fluxJacobian_u_u[j]);
1744 exteriorNumericalFluxJacobian2(a_rowptr.data(), a_colind.data(), isDOFBoundary_u.data()[ebNE_kb], normal, as_ext, a_ext, da_ext, grad_u_ext, &u_grad_trial_trace[j * nSpace], df_ext, u_trial_trace_ref.data()[ebN_local_kb * nDOF_test_element + j],
1745 ebqe_penalty_ext.data()[ebNE_kb],
1746 fluxJacobian_u_u[j],bfluxJacobian_u_u[j]);
1756 for (
int i = 0; i < nDOF_test_element; i++) {
1757 int eN_i = eN * nDOF_test_element + i;
1758 for (
int j = 0; j < nDOF_trial_element; j++) {
1760 if (useConsistentFlux) {
1761 globalJacobian.data()[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] += fluxJacobian_u_u[j] * u_test_dS[i];
1763 globalJacobian.data()[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] += bfluxJacobian_u_u[j] * u_test_dS[i];
1764 TransportMatrix[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] += fluxJacobian_u_u[j] * u_test_dS[i];
1765 TransportMatrixConsistent[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] += fluxJacobian_u_u[j] * u_test_dS[i];
1766 TransportMatrixn[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] += fluxJacobian_un_un[j] * u_test_dS[i];
1767 TransportMatrixConsistentn[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] += fluxJacobian_un_un[j] * u_test_dS[i];
1772 for (
int i = 0; i < nDOF_test_element; i++) {
1773 int eN_i = eN * nDOF_test_element + i;
1774 globalResidual.data()[offset_u + stride_u * u_l2g.data()[eN_i]] += elementResidual_u[i];
1782 double cflux[numDOFs];
1783 for (
int i = 0; i < numDOFs; i++) {
1784 double gi[nSpace], Cij[nSpace], xi[nSpace], etaMaxi, etaMini;
1785 double solni = u_free_dof_old[i];
1786 for (
int I = 0; I < nSpace; I++) {
1787 solni -= (rho_dof[i] / rho) * gravity.data()[I] * mesh_dof.data()[i * 3 + I];
1792 etaMaxi = fabs(eta[i]);
1793 etaMini = fabs(eta[i]);
1796 for (
int I = 0; I < nSpace; I++) {
1798 xi[I] = mesh_dof.data()[i * 3 + I];
1801 double alpha_numerator_pos = 0., alpha_numerator_neg = 0., alpha_denominator_pos = 0., alpha_denominator_neg = 0.;
1802 for (
int offset = csrRowIndeces_DofLoops.data()[i]; offset < csrRowIndeces_DofLoops.data()[i + 1]; offset++) {
1803 int j = csrColumnOffsets_DofLoops.data()[offset];
1807 etaMaxi = fmax(etaMaxi, fabs(eta[j]));
1808 etaMini = fmin(etaMini, fabs(eta[j]));
1810 double solnj = u_free_dof_old[j];
1811 for (
int I = 0; I < nSpace; I++) {
1812 solnj -= (rho_dof[j] / rho) * gravity.data()[I] * mesh_dof.data()[j * 3 + I];
1823 for (
int I = 0; I < nSpace; I++) gi[I] += Cij[I] * solnj;
1826 double alpha_num = solni - solnj;
1827 if (alpha_num >= 0.) {
1828 alpha_numerator_pos += alpha_num;
1829 alpha_denominator_pos += alpha_num;
1831 alpha_numerator_neg += alpha_num;
1832 alpha_denominator_neg += fabs(alpha_num);
1840 for (
int I = 0; I < nSpace; I++) gi[I] /= ML.data()[i];
1844 global_entropy_residual[i] *= etaMini == etaMaxi ? 0. : 2 *
cE / (etaMaxi - etaMini);
1845 quantDOFs.data()[i] = fabs(global_entropy_residual[i]);
1849 double SumPos = 0., SumNeg = 0.;
1850 for (
int offset = csrRowIndeces_DofLoops.data()[i]; offset < csrRowIndeces_DofLoops.data()[i + 1]; offset++) {
1851 int j = csrColumnOffsets_DofLoops.data()[offset];
1854 for (
int I = 0; I < nSpace; I++) xj[I] = mesh_dof.data()[j * 3 + I];
1856 double gi_times_x = 0.;
1857 for (
int I = 0; I < nSpace; I++) {
1858 gi_times_x += gi[I] * delta_x_ij.data()[offset * 3 + I];
1861 SumPos += gi_times_x > 0 ? gi_times_x : 0;
1862 SumNeg += gi_times_x < 0 ? gi_times_x : 0;
1864 double sigmaPosi = fmin(1., (fabs(SumNeg) + 1E-15) / (SumPos + 1E-15));
1865 double sigmaNegi = fmin(1., (SumPos + 1E-15) / (fabs(SumNeg) + 1E-15));
1866 double alpha_numi = fabs(sigmaPosi * alpha_numerator_pos + sigmaNegi * alpha_numerator_neg);
1867 double alpha_deni = sigmaPosi * alpha_denominator_pos + sigmaNegi * alpha_denominator_neg;
1869 alpha_numi = fabs(alpha_numerator_pos + alpha_numerator_neg);
1870 alpha_deni = alpha_denominator_pos + alpha_denominator_neg;
1872 double alphai = alpha_numi / (alpha_deni + 1E-15);
1873 quantDOFs.data()[i] = alphai;
1882 for (
int i = 0; i < numDOFs; i++) {
1884 double sum_abs_dt_times_fH_minus_fL = 0.0, MLi = ML.data()[i];
1885 double Kr, dKr, Krn, dKrn;
1887 double ith_dissipative_term = 0;
1888 double ith_low_order_dissipative_term = 0;
1889 double ith_flux_term = 0;
1890 double ith_consistent_flux_term = 0;
1892 double m, dm,
f[nSpace],
df[nSpace], a[
nnz], da[
nnz], as[
nnz];
1893 double dmn, fn[nSpace], dfn[nSpace], an[
nnz], dan[
nnz], asn[
nnz];
1895 const double rho_i = rho_dof[i];
1901 const int mat_i = freeDOFMaterialTypes.data()[i];
1903 double thetaW_tmp = 0.0;
1905 for (
int offset = csrRowIndeces_DofLoops.data()[i]; offset < csrRowIndeces_DofLoops.data()[i + 1]; offset++) {
1906 int j = csrColumnOffsets_DofLoops.data()[offset];
1907 if (i == j) ii = ij;
1908 const double rho_j = rho_dof[j];
1909 const int mat_j = freeDOFMaterialTypes.data()[j];
1910 const double rho_edge = 0.5 * (rho_i + rho_j);
1911 double delta_phi = u_free_dof[j] - u_free_dof[i];
1912 double delta_phin = u_free_dof_old[j] - u_free_dof_old[i];
1916 for (
int I = 0; I < nSpace; I++) {
1917 const double delta_x = mesh_dof.data()[j * 3 + I] - mesh_dof.data()[i * 3 + I];
1918 const double hydrostatic_jump = (rho_edge / rho) * gravity.data()[I] * delta_x;
1919 delta_phi -= hydrostatic_jump;
1920 delta_phin -= hydrostatic_jump;
1922 double dLowij, dLij, dEVij, dHij, fH, fL, fA=0.0;
1923 double fL_CN =0.0, fA_CN=0.0 ;
1924 fH = -Theta * TransportMatrixConsistent[ij] * delta_phi - (1 - Theta) * TransportMatrixConsistentn[ij] * delta_phin;
1926 ith_consistent_flux_term += fH;
1930 if (-TransportMatrix[ij] * delta_phi <= 0.0) {
1932 alpha.data()[mat_i],
1933 n.data()[mat_i], thetaR.data()[mat_i], thetaSR.data()[mat_i], &KWs.data()[mat_i *
nnz], u_free_dof[i], m, dm,
f,
df, a, da, as, Kr, dKr, thetaW_tmp);
1934 fL = Theta * Kr * fmax(0.0, -TransportMatrix[ij]) * delta_phi;
1935 fL_CN = Theta_h * Kr * fmax(0.0, -TransportMatrix[ij]) * delta_phi;
1938 globalJacobian.data()[ij] -= Theta * Kr * fmax(0.0, -TransportMatrix[ij]);
1939 J_ii -= -Theta * Kr * fmax(0.0, -TransportMatrix[ij]) + Theta * dKr * fmax(0.0, -TransportMatrix[ij]) * delta_phi;
1941 ith_flux_term += fL;
1945 alpha.data()[mat_j],
1946 n.data()[mat_j], thetaR.data()[mat_j], thetaSR.data()[mat_j], &KWs.data()[mat_j *
nnz], u_free_dof[j], m, dm,
f,
df, a, da, as, Kr, dKr, thetaW_tmp);
1947 fL = Theta * Kr * fmax(0.0, -TransportMatrix[ij]) * delta_phi;
1948 fL_CN = Theta_h * Kr * fmax(0.0, -TransportMatrix[ij]) * delta_phi;
1951 globalJacobian.data()[ij] -= Theta * Kr * fmax(0.0, -TransportMatrix[ij]) + Theta * dKr * fmax(0.0, -TransportMatrix[ij]) * delta_phi;
1952 J_ii -= -Theta * Kr * fmax(0.0, -TransportMatrix[ij]);
1954 ith_flux_term += fL;
1957 if (-TransportMatrixn[ij] * delta_phin <= 0.0) {
1959 alpha.data()[mat_i],
1960 n.data()[mat_i], thetaR.data()[mat_i], thetaSR.data()[mat_i], &KWs.data()[mat_i *
nnz], u_free_dof_old[i], m, dm,
f,
df, a, da, as, Kr, dKr, thetaW_tmp);
1961 fL = (1 - Theta) * Kr * fmax(0.0, -TransportMatrixn[ij]) * delta_phin;
1962 fL_CN += (1 - Theta_h) * Kr * fmax(0.0, -TransportMatrixn[ij]) * delta_phin;
1963 ith_flux_term += fL;
1968 alpha.data()[mat_j],
1969 n.data()[mat_j], thetaR.data()[mat_j], thetaSR.data()[mat_j], &KWs.data()[mat_j *
nnz], u_free_dof_old[j], m, dm,
f,
df, a, da, as, Kr, dKr, thetaW_tmp);
1970 fL = (1 - Theta) * Kr * fmax(0.0, -TransportMatrixn[ij]) * delta_phin;
1971 fL_CN += (1 - Theta_h) * Kr * fmax(0.0, -TransportMatrixn[ij]) * delta_phin;
1972 ith_flux_term += fL;
1976 dt_times_fH_minus_fL.data()[ij] = dt * fA;
1980 mDotLow.data()[i] = ith_flux_term/MLi;
1981 cflux[i] = ith_consistent_flux_term;
1983 alpha.data()[mat_i],
1984 n.data()[mat_i], thetaR.data()[mat_i], thetaSR.data()[mat_i], &KWs.data()[mat_i *
nnz], u_free_dof[i], m, dm,
f,
df, a, da, as, Kr, dKr, thetaW_tmp);
1986 alpha.data()[mat_i],
1987 n.data()[mat_i], thetaR.data()[mat_i], thetaSR.data()[mat_i], &KWs.data()[mat_i *
nnz], u_free_dof_old[i], mn.data()[i], dmn, fn, dfn, an, dan, asn, Krn, dKrn, thetaW_tmp);
1989 globalResidual.data()[i] += bc_mask.data()[i] * (MLi * (m - mn.data()[i]) / dt - ith_flux_term);
1990 globalJacobian.data()[ii] += bc_mask.data()[i] * (MLi * dm / dt + J_ii) + (1.0 - bc_mask.data()[i]);
1994 for (
int i = 0; i < numDOFs; i++) {
1995 globalResidual.data()[i] += fluxCorrection.data()[i];
2051 double dt = args.
scalar<
double>(
"dt");
2052 xt::pyarray<double> &mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
2053 xt::pyarray<double> &mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
2054 xt::pyarray<double> &mesh_dof = args.
array<
double>(
"mesh_dof");
2055 xt::pyarray<double> &mesh_velocity_dof = args.
array<
double>(
"mesh_velocity_dof");
2056 double MOVING_DOMAIN = args.
scalar<
double>(
"MOVING_DOMAIN");
2057 xt::pyarray<int> &mesh_l2g = args.
array<
int>(
"mesh_l2g");
2058 xt::pyarray<double> &dV_ref = args.
array<
double>(
"dV_ref");
2059 xt::pyarray<double> &u_trial_ref = args.
array<
double>(
"u_trial_ref");
2060 xt::pyarray<double> &u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
2061 xt::pyarray<double> &u_test_ref = args.
array<
double>(
"u_test_ref");
2062 xt::pyarray<double> &u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
2064 xt::pyarray<double> &mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
2065 xt::pyarray<double> &mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
2066 xt::pyarray<double> &dS_ref = args.
array<
double>(
"dS_ref");
2067 xt::pyarray<double> &u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
2068 xt::pyarray<double> &u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
2069 xt::pyarray<double> &u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
2070 xt::pyarray<double> &u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
2071 xt::pyarray<double> &normal_ref = args.
array<
double>(
"normal_ref");
2072 xt::pyarray<double> &boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
2074 int nElements_global = args.
scalar<
int>(
"nElements_global");
2076 xt::pyarray<double> &ebqe_penalty_ext = args.
array<
double>(
"ebqe_penalty_ext");
2077 xt::pyarray<int> &elementMaterialTypes = args.
array<
int>(
"elementMaterialTypes");
2078 xt::pyarray<int> &isSeepageFace = args.
array<
int>(
"isSeepageFace");
2079 xt::pyarray<int> &a_rowptr = args.
array<
int>(
"a_rowptr");
2080 xt::pyarray<int> &a_colind = args.
array<
int>(
"a_colind");
2081 double rho = args.
scalar<
double>(
"rho");
2082 double beta = args.
scalar<
double>(
"beta");
2084 xt::pyarray<double> &q_rho = args.
array<
double>(
"q_rho");
2086 xt::pyarray<double> &gravity = args.
array<
double>(
"gravity");
2087 xt::pyarray<double> &alpha = args.
array<
double>(
"alpha");
2088 xt::pyarray<double> &
n = args.
array<
double>(
"n");
2089 xt::pyarray<double> &thetaR = args.
array<
double>(
"thetaR");
2090 xt::pyarray<double> &thetaSR = args.
array<
double>(
"thetaSR");
2092 xt::pyarray<double> &KWs = args.
array<
double>(
"KWs");
2094 double useMetrics = args.
scalar<
double>(
"useMetrics");
2095 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
2096 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
2097 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
2098 xt::pyarray<int> &u_l2g = args.
array<
int>(
"u_l2g");
2099 xt::pyarray<int> &r_l2g = args.
array<
int>(
"r_l2g");
2100 xt::pyarray<double> &elementDiameter = args.
array<
double>(
"elementDiameter");
2101 int degree_polynomial = args.
scalar<
int>(
"degree_polynomial");
2102 xt::pyarray<double> &u_dof = args.
array<
double>(
"u_dof");
2103 xt::pyarray<double> &velocity = args.
array<
double>(
"velocity");
2104 xt::pyarray<double> &q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
2105 xt::pyarray<double> &cfl = args.
array<
double>(
"cfl");
2106 xt::pyarray<double> &q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
2107 xt::pyarray<int> &csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
2108 xt::pyarray<int> &csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
2109 xt::pyarray<double> &globalJacobian = args.
array<
double>(
"globalJacobian");
2110 xt::pyarray<double> &delta_x_ij = args.
array<
double>(
"delta_x_ij");
2111 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
2112 xt::pyarray<int> &exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
2113 xt::pyarray<int> &elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
2114 xt::pyarray<int> &elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
2115 xt::pyarray<double> &ebqe_velocity_ext = args.
array<
double>(
"ebqe_velocity_ext");
2116 xt::pyarray<int> &isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
2117 xt::pyarray<double> &ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
2118 xt::pyarray<int> &isFluxBoundary_u = args.
array<
int>(
"isFluxBoundary_u");
2119 xt::pyarray<double> &ebqe_bc_flux_ext = args.
array<
double>(
"ebqe_bc_flux_ext");
2120 xt::pyarray<int> &csrColumnOffsets_eb_u_u = args.
array<
int>(
"csrColumnOffsets_eb_u_u");
2121 int LUMPED_MASS_MATRIX = args.
scalar<
int>(
"LUMPED_MASS_MATRIX");
2122 double Ct_sge = 4.0;
2126 for (
int eN = 0; eN < nElements_global; eN++) {
2127 double elementJacobian_u_u[nDOF_test_element][nDOF_trial_element];
2128 for (
int i = 0; i < nDOF_test_element; i++)
2129 for (
int j = 0; j < nDOF_trial_element; j++) { elementJacobian_u_u[i][j] = 0.0; }
2130 for (
int k = 0; k < nQuadraturePoints_element; k++) {
2131 int eN_k = eN * nQuadraturePoints_element + k,
2132 eN_k_nSpace = eN_k * nSpace,
2133 eN_nDOF_trial_element = eN * nDOF_trial_element;
2135 double u = 0.0, grad_u[nSpace], m = 0.0, dm = 0.0,
f[nSpace],
df[nSpace], a[
nnz], da[
nnz], as[
nnz], m_t = 0.0, dm_t = 0.0, dpdeResidual_u_u[nDOF_trial_element], Lstar_u[nDOF_test_element], dsubgridError_u_u[nDOF_trial_element], tau = 0.0, tau0 = 0.0, tau1 = 0.0, jac[nSpace * nSpace], jacDet, jacInv[nSpace * nSpace], u_grad_trial[nDOF_trial_element * nSpace], dV, u_test_dV[nDOF_test_element], u_grad_test_dV[nDOF_test_element * nSpace], x, y,
z,
xt, yt, zt,
2136 G[nSpace * nSpace], G_dd_G, tr_G;
2139 ck.calculateMapping_element(eN, k, mesh_dof.data(), mesh_l2g.data(), mesh_trial_ref.data(), mesh_grad_trial_ref.data(), jac, jacDet, jacInv, x, y,
z);
2140 ck.calculateMappingVelocity_element(eN, k, mesh_velocity_dof.data(), mesh_l2g.data(), mesh_trial_ref.data(),
xt, yt, zt);
2142 dV = fabs(jacDet) * dV_ref.data()[k];
2143 ck.calculateG(jacInv, G, G_dd_G, tr_G);
2145 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k * nDOF_trial_element * nSpace], jacInv, u_grad_trial);
2147 ck.valFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], &u_trial_ref.data()[k * nDOF_trial_element],
u);
2149 ck.gradFromDOF(u_dof.data(), &u_l2g.data()[eN_nDOF_trial_element], u_grad_trial, grad_u);
2151 for (
int j = 0; j < nDOF_trial_element; j++) {
2152 u_test_dV[j] = u_test_ref.data()[k * nDOF_trial_element + j] * dV;
2153 for (
int I = 0; I < nSpace; I++) {
2154 u_grad_test_dV[j * nSpace + I] = u_grad_trial[j * nSpace + I] * dV;
2160 double Kr, dKr, thetaW;
2162 evaluateCoefficients(a_rowptr.data(), a_colind.data(), rho, q_rho.data()[eN_k], beta, gravity.data(), alpha.data()[elementMaterialTypes.data()[eN]],
n.data()[elementMaterialTypes.data()[eN]], thetaR.data()[elementMaterialTypes.data()[eN]],
2163 thetaSR.data()[elementMaterialTypes.data()[eN]], &KWs.data()[elementMaterialTypes.data()[eN] *
nnz],
u, m, dm,
f,
df, a, da, as, Kr, dKr, thetaW);
2167 double mesh_velocity[3];
2168 mesh_velocity[0] =
xt;
2169 mesh_velocity[1] = yt;
2170 mesh_velocity[2] = zt;
2171 for (
int I = 0; I < nSpace; I++) {
2172 f[I] -= MOVING_DOMAIN * m * mesh_velocity[I];
2173 df[I] -= MOVING_DOMAIN * dm * mesh_velocity[I];
2181 q_m_betaBDF.data()[eN_k],
2187 for (
int i = 0; i < nDOF_test_element; i++) {
2188 int i_nSpace = i * nSpace;
2189 Lstar_u[i] =
ck.Advection_adjoint(
df, &u_grad_test_dV[i_nSpace]);
2192 for (
int j = 0; j < nDOF_trial_element; j++) {
2193 int j_nSpace = j * nSpace;
2194 dpdeResidual_u_u[j] =
ck.MassJacobian_strong(dm_t, u_trial_ref.data()[k * nDOF_trial_element + j]) +
ck.AdvectionJacobian_strong(
df, &u_grad_trial[j_nSpace]);
2200 tau = useMetrics * tau1 + (1.0 - useMetrics) * tau0;
2202 for (
int j = 0; j < nDOF_trial_element; j++) dsubgridError_u_u[j] = -tau * dpdeResidual_u_u[j];
2203 for (
int i = 0; i < nDOF_test_element; i++) {
2204 for (
int j = 0; j < nDOF_trial_element; j++) {
2205 if (LUMPED_MASS_MATRIX == 1) {
2206 if (i == j) elementJacobian_u_u[i][j] += u_test_dV[i];
2208 int j_nSpace = j * nSpace;
2209 int i_nSpace = i * nSpace;
2211 elementJacobian_u_u[i][j] +=
ck.MassJacobian_weak(dm_t, u_trial_ref.data()[k * nDOF_trial_element + j], u_test_dV[i]);
2219 for (
int i = 0; i < nDOF_test_element; i++) {
2220 int eN_i = eN * nDOF_test_element + i;
2221 int I = u_l2g.data()[eN_i];
2222 for (
int j = 0; j < nDOF_trial_element; j++) {
2223 int eN_i_j = eN_i * nDOF_trial_element + j;
2224 int J = u_l2g.data()[eN * nDOF_trial_element + j];
2226 delta_x_ij.data()[3 * (csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_u_u.data()[eN_i_j]) + 0] = mesh_dof.data()[I * 3 + 0] - mesh_dof.data()[J * 3 + 0];
2227 delta_x_ij.data()[3 * (csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_u_u.data()[eN_i_j]) + 1] = mesh_dof.data()[I * 3 + 1] - mesh_dof.data()[J * 3 + 1];
2228 delta_x_ij.data()[3 * (csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_u_u.data()[eN_i_j]) + 2] = mesh_dof.data()[I * 3 + 2] - mesh_dof.data()[J * 3 + 2];