140 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
141 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
142 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
143 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
144 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
145 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
146 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
147 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
148 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
149 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
150 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
151 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
152 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
153 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
154 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
155 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
156 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
157 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
158 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
159 int nElements_global = args.
scalar<
int>(
"nElements_global");
160 double useMetrics = args.
scalar<
double>(
"useMetrics");
161 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
162 double epsFact_redist = args.
scalar<
double>(
"epsFact_redist");
163 double backgroundDiffusionFactor = args.
scalar<
double>(
"backgroundDiffusionFactor");
164 double weakDirichletFactor = args.
scalar<
double>(
"weakDirichletFactor");
165 int freezeLevelSet = args.
scalar<
int>(
"freezeLevelSet");
166 int useTimeIntegration = args.
scalar<
int>(
"useTimeIntegration");
167 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
168 int lag_subgridError = args.
scalar<
int>(
"lag_subgridError");
169 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
170 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
171 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
172 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
173 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
174 xt::pyarray<double>& phi_dof = args.
array<
double>(
"phi_dof");
175 xt::pyarray<double>& phi_ls = args.
array<
double>(
"phi_ls");
176 xt::pyarray<double>& q_m = args.
array<
double>(
"q_m");
177 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
178 xt::pyarray<double>& q_n = args.
array<
double>(
"q_n");
179 xt::pyarray<double>& q_dH = args.
array<
double>(
"q_dH");
180 xt::pyarray<double>& u_weak_internal_bc_dofs = args.
array<
double>(
"u_weak_internal_bc_dofs");
181 xt::pyarray<double>& q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
182 xt::pyarray<double>& q_dH_last = args.
array<
double>(
"q_dH_last");
183 xt::pyarray<double>& q_cfl = args.
array<
double>(
"q_cfl");
184 xt::pyarray<double>& q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
185 xt::pyarray<double>& q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
186 xt::pyarray<int>& weakDirichletConditionFlags = args.
array<
int>(
"weakDirichletConditionFlags");
187 int offset_u = args.
scalar<
int>(
"offset_u");
188 int stride_u = args.
scalar<
int>(
"stride_u");
189 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
190 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
191 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
192 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
193 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
194 xt::pyarray<double>& ebqe_phi_ls_ext = args.
array<
double>(
"ebqe_phi_ls_ext");
195 xt::pyarray<int>& isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
196 xt::pyarray<double>& ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
197 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
198 xt::pyarray<double>& ebqe_n = args.
array<
double>(
"ebqe_n");
199 int ELLIPTIC_REDISTANCING = args.
scalar<
int>(
"ELLIPTIC_REDISTANCING");
200 double backgroundDissipationEllipticRedist = args.
scalar<
double>(
"backgroundDissipationEllipticRedist");
201 xt::pyarray<double>& lumped_qx = args.
array<
double>(
"lumped_qx");
202 xt::pyarray<double>& lumped_qy = args.
array<
double>(
"lumped_qy");
203 xt::pyarray<double>& lumped_qz = args.
array<
double>(
"lumped_qz");
204 double alpha = args.
scalar<
double>(
"alpha");
205 double circbc=0.0,circ=0.0;
209 std::cout<<
"stuff"<<
"\t"
211 <<epsFact_redist<<
"\t"
212 <<freezeLevelSet<<
"\t"
213 <<useTimeIntegration<<
"\t"
214 <<lag_shockCapturing<<
"\t"
215 <<lag_subgridError<<std::endl;
227 double timeIntegrationScale = 1.0;
228 if (useTimeIntegration == 0)
229 timeIntegrationScale = 0.0;
230 double lag_shockCapturingScale = 1.0;
231 if (lag_shockCapturing == 0)
232 lag_shockCapturingScale = 0.0;
233 for(
int eN=0;eN<nElements_global;eN++)
236 int dummy_l2g[nDOF_mesh_trial_element];
237 double elementResidual_u[nDOF_test_element],element_phi[nDOF_trial_element];
238 double epsilon_redist,h_phi, dir[nSpace], norm;
239 for (
int i=0;i<nDOF_test_element;i++)
241 int eN_i=eN*nDOF_trial_element+i;
242 elementResidual_u[i]=0.0;
243 element_phi[i] = phi_dof.data()[u_l2g.data()[eN_i]];
246 double element_nodes[nDOF_mesh_trial_element*3];
247 for (
int i=0;i<nDOF_mesh_trial_element;i++)
249 int eN_i=eN*nDOF_mesh_trial_element+i;
251 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
253 gf.
calculate(element_phi, element_nodes, x_ref.data(),
false);
265 for (
int k=0;k<nQuadraturePoints_element;k++)
269 int eN_k = eN*nQuadraturePoints_element+k,
270 eN_k_nSpace = eN_k*nSpace,
271 eN_nDOF_trial_element = eN*nDOF_trial_element;
272 double u=0.0,grad_u[nSpace],u0=0.0, grad_phi[nSpace],
280 Lstar_u[nDOF_test_element],
282 tau=0.0,tau0=0.0,tau1=0.0,
283 numDiff0=0.0,numDiff1=0.0,
287 jacInv[nSpace*nSpace],
288 u_grad_trial[nDOF_trial_element*nSpace],
289 u_test_dV[nDOF_trial_element],
290 u_grad_test_dV[nDOF_test_element*nSpace],
292 G[nSpace*nSpace],G_dd_G,tr_G;
293 ck.calculateMapping_element(eN,
297 mesh_trial_ref.data(),
298 mesh_grad_trial_ref.data(),
303 ck.calculateH_element(eN,
305 nodeDiametersArray.data(),
307 mesh_trial_ref.data(),
310 dV = fabs(jacDet)*dV_ref.data()[k];
311 ck.calculateG(jacInv,G,G_dd_G,tr_G);
314 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],jacInv,u_grad_trial);
316 ck.valFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_ref.data()[k*nDOF_trial_element],
u);
317 ck.valFromDOF(
gf.
exact.phi_dof_corrected,dummy_l2g,&u_trial_ref.data()[k*nDOF_trial_element],u0);
320 u0 = phi_ls.data()[eN_k];
336 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial,grad_u);
338 for (
int j=0;j<nDOF_trial_element;j++)
340 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
341 for (
int I=0;I<nSpace;I++)
343 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
359 epsilon_redist = epsFact_redist*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter.data()[eN]);
373 for (
int I=0; I < nSpace; I++)
376 dH_strong[I] = dH[I];
378 if (lag_subgridError > 0)
380 for (
int I=0; I < nSpace; I++)
382 dH_tau[I] = q_dH_last.data()[eN_k_nSpace+I];
385 if (lag_subgridError > 1)
387 for (
int I=0; I < nSpace; I++)
389 dH_strong[I] = q_dH_last.data()[eN_k_nSpace+I];
395 q_m.data()[eN_k] = m;
396 q_u.data()[eN_k] =
u;
397 for (
int I=0;I<nSpace;I++)
398 q_n.data()[eN_k_nSpace+I] = dir[I];
400 for (
int I=0;I<nSpace;I++)
402 int eN_k_nSpace_I = eN_k_nSpace+I;
403 q_dH.data()[eN_k_nSpace_I] = dH[I];
414 q_m_betaBDF.data()[eN_k],
421 m *= timeIntegrationScale; dm *= timeIntegrationScale; m_t *= timeIntegrationScale;
422 dm_t *= timeIntegrationScale;
424 std::cout<<
"alpha "<<alphaBDF<<
"\t"<<q_m_betaBDF.data()[eN_k]<<
"\t"<<m_t<<
'\t'<<m<<
'\t'<<alphaBDF*m<<std::endl;
430 pdeResidual_u =
ck.Mass_strong(m_t) +
431 ck.Hamiltonian_strong(dH_strong,grad_u) +
432 ck.Reaction_strong(
r);
434 std::cout<<
"dH_strong "<<dH_strong[0]<<
'\t'<<dH_strong[1]<<
'\t'<<dH_strong[2]<<std::endl;
437 for (
int i=0;i<nDOF_test_element;i++)
440 int i_nSpace=i*nSpace;
441 Lstar_u[i] =
ck.Hamiltonian_adjoint(dH_strong,&u_grad_test_dV[i_nSpace]);
454 tau = useMetrics*tau1+(1.0-useMetrics)*tau0;
459 subgridError_u = -tau*pdeResidual_u;
463 ck.calculateNumericalDiffusion(shockCapturingDiffusion,elementDiameter.data()[eN],pdeResidual_u,grad_u,numDiff0);
464 ck.calculateNumericalDiffusion(shockCapturingDiffusion,G,pdeResidual_u,grad_u,numDiff1);
466 q_numDiff_u.data()[eN_k] = useMetrics*numDiff1+(1.0-useMetrics)*numDiff0;
469 std::cout<<
"q_numDiff_u[eN_k] "<<q_numDiff_u.data()[eN_k]<<
" q_numDiff_u_last[eN_k] "<<q_numDiff_u_last.data()[eN_k]<<
" lag "<<lag_shockCapturingScale<<std::endl;
471 nu_sc = q_numDiff_u.data()[eN_k]*(1.0-lag_shockCapturingScale) + q_numDiff_u_last.data()[eN_k]*lag_shockCapturingScale;
476 double epsilon_background_diffusion = 2.0*epsFact_redist*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter.data()[eN]);
477 if (fabs(phi_ls.data()[eN_k]) > epsilon_background_diffusion)
478 nu_sc += backgroundDiffusionFactor*elementDiameter.data()[eN];
481 for(
int i=0;i<nDOF_test_element;i++)
483 int i_nSpace = i*nSpace;
484 double FREEZE=double(freezeLevelSet);
490 std::cout<<
"shock capturing input nu_sc "<<nu_sc<<
'\t'<<grad_u[0]<<
'\t'<<grad_u[1]<<
'\t'<<grad_u[1]<<
'\t'<<u_grad_test_dV[i_nSpace]<<std::endl;
494 circbc +=
ck.Reaction_weak(
gf.
D(epsilon_redist,u0)*(
u-u0), u_test_dV[i]);
495 elementResidual_u[i] +=
ck.Mass_weak(m_t,u_test_dV[i]) +
496 ck.Hamiltonian_weak(
H,u_test_dV[i]) +
497 ck.Reaction_weak(
r,u_test_dV[i]) +
498 (1.0-FREEZE)*(weakDirichletFactor/h_phi)*
ck.Reaction_weak(
gf.
D(epsilon_redist,u0)*(u0-
u),
500 ck.SubgridError(subgridError_u,Lstar_u[i]) +
501 ck.NumericalDiffusion(nu_sc,grad_u,&u_grad_test_dV[i_nSpace]);
503 std::cout<<
ck.Mass_weak(m_t,u_test_dV[i])<<
'\t'
504 <<
ck.Hamiltonian_weak(
H,u_test_dV[i]) <<
'\t'
505 <<
ck.Reaction_weak(
r,u_test_dV[i])<<
'\t'
506 <<
ck.SubgridError(subgridError_u,Lstar_u[i])<<
'\t'
507 <<
ck.NumericalDiffusion(nu_sc,grad_u,&u_grad_test_dV[i_nSpace])<<std::endl;
518 for (
int j = 0; j < nDOF_trial_element; j++)
520 const int eN_j = eN*nDOF_trial_element+j;
521 const int J = u_l2g.data()[eN_j];
523 if (fabs(u_weak_internal_bc_dofs.data()[J]) < epsilon_redist)
525 elementResidual_u[j] = (u_dof.data()[J]-u_weak_internal_bc_dofs.data()[J])*weakDirichletFactor*elementDiameter.data()[eN];
533 for(
int i=0;i<nDOF_test_element;i++)
535 int eN_i=eN*nDOF_test_element+i;
538 std::cout<<
"element residual i = "<<i<<
"\t"<<elementResidual_u[i]<<std::endl;
540 globalResidual.data()[offset_u+stride_u*u_l2g.data()[eN_i]]+=elementResidual_u[i];
549 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
551 int ebN = exteriorElementBoundariesArray.data()[ebNE],
552 eN = elementBoundaryElementsArray.data()[ebN*2+0],
553 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+0],
554 eN_nDOF_trial_element = eN*nDOF_trial_element;
555 double epsilon_redist, h_phi;
556 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
558 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
559 ebNE_kb_nSpace = ebNE_kb*nSpace,
560 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
561 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
564 jac_ext[nSpace*nSpace],
566 jacInv_ext[nSpace*nSpace],
567 boundaryJac[nSpace*(nSpace-1)],
568 metricTensor[(nSpace-1)*(nSpace-1)],
570 u_test_dS[nDOF_test_element],
571 u_grad_trial_trace[nDOF_trial_element*nSpace],
572 normal[nSpace],x_ext,y_ext,z_ext,
574 ck.calculateMapping_elementBoundary(eN,
580 mesh_trial_trace_ref.data(),
581 mesh_grad_trial_trace_ref.data(),
582 boundaryJac_ref.data(),
594 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,u_grad_trial_trace);
596 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);
597 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial_trace,grad_u_ext);
599 for (
int I=0;I<nSpace;I++)
600 norm += grad_u_ext[I]*grad_u_ext[I];
602 for (
int I=0;I<nSpace;I++)
603 dir[I] = grad_u_ext[I]/norm;
605 ebqe_u.data()[ebNE_kb] = u_ext;
606 for (
int I=0;I<nSpace;I++)
607 ebqe_n.data()[ebNE_kb_nSpace+I] = dir[I];
619 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
620 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
621 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
622 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
623 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
624 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
625 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
626 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
627 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
628 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
629 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
630 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
631 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
632 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
633 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
634 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
635 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
636 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
637 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
638 int nElements_global = args.
scalar<
int>(
"nElements_global");
639 double useMetrics = args.
scalar<
double>(
"useMetrics");
640 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
641 double epsFact_redist = args.
scalar<
double>(
"epsFact_redist");
642 double backgroundDiffusionFactor = args.
scalar<
double>(
"backgroundDiffusionFactor");
643 double weakDirichletFactor = args.
scalar<
double>(
"weakDirichletFactor");
644 int freezeLevelSet = args.
scalar<
int>(
"freezeLevelSet");
645 int useTimeIntegration = args.
scalar<
int>(
"useTimeIntegration");
646 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
647 int lag_subgridError = args.
scalar<
int>(
"lag_subgridError");
648 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
649 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
650 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
651 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
652 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
653 xt::pyarray<double>& phi_dof = args.
array<
double>(
"phi_dof");
654 xt::pyarray<double>& u_weak_internal_bc_dofs = args.
array<
double>(
"u_weak_internal_bc_dofs");
655 xt::pyarray<double>& phi_ls = args.
array<
double>(
"phi_ls");
656 xt::pyarray<double>& q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
657 xt::pyarray<double>& q_dH_last = args.
array<
double>(
"q_dH_last");
658 xt::pyarray<double>& q_cfl = args.
array<
double>(
"q_cfl");
659 xt::pyarray<double>& q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
660 xt::pyarray<double>& q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
661 xt::pyarray<int>& weakDirichletConditionFlags = args.
array<
int>(
"weakDirichletConditionFlags");
662 xt::pyarray<int>& csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
663 xt::pyarray<int>& csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
664 xt::pyarray<double>& globalJacobian = args.
array<
double>(
"globalJacobian");
665 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
666 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
667 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
668 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
669 xt::pyarray<double>& ebqe_phi_ls_ext = args.
array<
double>(
"ebqe_phi_ls_ext");
670 xt::pyarray<int>& isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
671 xt::pyarray<double>& ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
672 xt::pyarray<int>& csrColumnOffsets_eb_u_u = args.
array<
int>(
"csrColumnOffsets_eb_u_u");
673 int ELLIPTIC_REDISTANCING = args.
scalar<
int>(
"ELLIPTIC_REDISTANCING");
674 double backgroundDissipationEllipticRedist = args.
scalar<
double>(
"backgroundDissipationEllipticRedist");
675 double alpha = args.
scalar<
double>(
"alpha");
681 double timeIntegrationScale = 1.0;
682 if (useTimeIntegration == 0)
683 timeIntegrationScale = 0.0;
684 double lag_shockCapturingScale = 1.0;
685 if (lag_shockCapturing == 0)
686 lag_shockCapturingScale = 0.0;
687 for(
int eN=0;eN<nElements_global;eN++)
689 int dummy_l2g[nDOF_mesh_trial_element];
690 double elementJacobian_u_u[nDOF_test_element][nDOF_trial_element],element_phi[nDOF_trial_element];
691 double epsilon_redist,h_phi, dir[nSpace], norm;
692 for (
int i=0;i<nDOF_test_element;i++)
694 int eN_i=eN*nDOF_trial_element+i;
695 element_phi[i] = phi_dof.data()[u_l2g.data()[eN_i]];
697 for (
int j=0;j<nDOF_trial_element;j++)
699 elementJacobian_u_u[i][j]=0.0;
702 double element_nodes[nDOF_mesh_trial_element*3];
703 for (
int i=0;i<nDOF_mesh_trial_element;i++)
705 int eN_i=eN*nDOF_mesh_trial_element+i;
707 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
709 gf.
calculate(element_phi, element_nodes, x_ref.data(),
false);
710 for (
int k=0;k<nQuadraturePoints_element;k++)
713 int eN_k = eN*nQuadraturePoints_element+k,
714 eN_k_nSpace = eN_k*nSpace,
715 eN_nDOF_trial_element = eN*nDOF_trial_element;
722 m_t=0.0,dm_t=0.0,
r=0.0,
725 dpdeResidual_u_u[nDOF_trial_element],
726 Lstar_u[nDOF_test_element],
727 dsubgridError_u_u[nDOF_trial_element],
728 tau=0.0,tau0=0.0,tau1=0.0,
732 jacInv[nSpace*nSpace],
733 u_grad_trial[nDOF_trial_element*nSpace],
735 u_test_dV[nDOF_test_element],
736 u_grad_test_dV[nDOF_test_element*nSpace],
738 G[nSpace*nSpace],G_dd_G,tr_G;
742 ck.calculateMapping_element(eN,
746 mesh_trial_ref.data(),
747 mesh_grad_trial_ref.data(),
752 ck.calculateH_element(eN,
754 nodeDiametersArray.data(),
756 mesh_trial_ref.data(),
759 dV = fabs(jacDet)*dV_ref.data()[k];
760 ck.calculateG(jacInv,G,G_dd_G,tr_G);
762 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],jacInv,u_grad_trial);
764 ck.valFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_ref.data()[k*nDOF_trial_element],
u);
765 ck.valFromDOF(
gf.
exact.phi_dof_corrected,dummy_l2g,&u_trial_ref.data()[k*nDOF_trial_element],u0);
767 u0 = phi_ls.data()[eN_k];
782 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial,grad_u);
784 for (
int j=0;j<nDOF_trial_element;j++)
786 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
787 for (
int I=0;I<nSpace;I++)
789 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
804 epsilon_redist = epsFact_redist*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter.data()[eN]);
818 for (
int I=0; I < nSpace; I++)
821 dH_strong[I] = dH[I];
823 if (lag_subgridError > 0)
825 for (
int I=0; I < nSpace; I++)
827 dH_tau[I] = q_dH_last.data()[eN_k_nSpace+I];
830 if (lag_subgridError > 1)
832 for (
int I=0; I < nSpace; I++)
834 dH_strong[I] = q_dH_last.data()[eN_k_nSpace+I];
845 q_m_betaBDF.data()[eN_k],
851 m *= timeIntegrationScale; dm *= timeIntegrationScale; m_t *= timeIntegrationScale;
852 dm_t *= timeIntegrationScale;
858 for (
int i=0;i<nDOF_test_element;i++)
861 int i_nSpace=i*nSpace;
863 Lstar_u[i]=
ck.Hamiltonian_adjoint(dH_strong,&u_grad_test_dV[i_nSpace]);
867 for (
int j=0;j<nDOF_trial_element;j++)
871 int j_nSpace = j*nSpace;
872 dpdeResidual_u_u[j]=
ck.MassJacobian_strong(dm_t,u_trial_ref.data()[k*nDOF_trial_element+j]) +
873 ck.HamiltonianJacobian_strong(dH_strong,&u_grad_trial[j_nSpace]);
886 tau = useMetrics*tau1+(1.0-useMetrics)*tau0;
888 for (
int j=0;j<nDOF_trial_element;j++)
889 dsubgridError_u_u[j] = -tau*dpdeResidual_u_u[j];
891 nu_sc = q_numDiff_u.data()[eN_k]*(1.0-lag_shockCapturingScale) + q_numDiff_u_last.data()[eN_k]*lag_shockCapturingScale;
895 double epsilon_background_diffusion = 2.0*epsFact_redist*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter.data()[eN]);
896 if (fabs(phi_ls.data()[eN_k]) > epsilon_background_diffusion)
897 nu_sc += backgroundDiffusionFactor*elementDiameter.data()[eN];
898 for(
int i=0;i<nDOF_test_element;i++)
902 circ +=
ck.Reaction_weak(
gf.
D(epsilon_redist, phi_ls.data()[eN_k]), u_test_dV[i]);
903 for(
int j=0;j<nDOF_trial_element;j++)
907 int j_nSpace = j*nSpace;
908 int i_nSpace = i*nSpace;
909 double FREEZE=double(freezeLevelSet);
912 elementJacobian_u_u[i][j] +=
ck.MassJacobian_weak(dm_t,u_trial_ref.data()[k*nDOF_trial_element+j],u_test_dV[i]) +
913 ck.HamiltonianJacobian_weak(dH,&u_grad_trial[j_nSpace],u_test_dV[i]) +
914 (1.0-FREEZE)*(weakDirichletFactor/h_phi)*
ck.ReactionJacobian_weak(-
gf.
D(epsilon_redist,u0),
915 u_trial_ref.data()[k*nDOF_trial_element+j],
917 ck.SubgridErrorJacobian(dsubgridError_u_u[j],Lstar_u[i]) +
918 ck.NumericalDiffusionJacobian(nu_sc,&u_grad_trial[j_nSpace],&u_grad_test_dV[i_nSpace]);
930 for (
int j = 0; j < nDOF_trial_element; j++)
932 const int J = u_l2g.data()[eN*nDOF_trial_element+j];
933 if (fabs(u_weak_internal_bc_dofs.data()[J]) < epsilon_redist)
937 for (
int jj=0; jj < nDOF_trial_element; jj++)
938 elementJacobian_u_u[j][jj] = 0.0;
939 elementJacobian_u_u[j][j] = weakDirichletFactor*elementDiameter.data()[eN];
943 for (
int i=0;i<nDOF_test_element;i++)
945 int eN_i = eN*nDOF_test_element+i;
946 for (
int j=0;j<nDOF_trial_element;j++)
948 int eN_i_j = eN_i*nDOF_trial_element+j;
950 std::cout<<
"element jacobian i = "<<i<<
"\t"<<
"j = "<<j<<
"\t"<<elementJacobian_u_u[i][j]<<std::endl;
952 globalJacobian.data()[csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_u_u.data()[eN_i_j]] += elementJacobian_u_u[i][j];
1112 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1113 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1114 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1115 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1116 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
1117 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1118 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1119 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1120 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1121 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1122 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1123 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1124 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
1125 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1126 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1127 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1128 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1129 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
1130 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1131 int nElements_global = args.
scalar<
int>(
"nElements_global");
1132 double useMetrics = args.
scalar<
double>(
"useMetrics");
1133 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
1134 double epsFact_redist = args.
scalar<
double>(
"epsFact_redist");
1135 double backgroundDiffusionFactor = args.
scalar<
double>(
"backgroundDiffusionFactor");
1136 double weakDirichletFactor = args.
scalar<
double>(
"weakDirichletFactor");
1137 int freezeLevelSet = args.
scalar<
int>(
"freezeLevelSet");
1138 int useTimeIntegration = args.
scalar<
int>(
"useTimeIntegration");
1139 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
1140 int lag_subgridError = args.
scalar<
int>(
"lag_subgridError");
1141 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
1142 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1143 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1144 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
1145 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1146 xt::pyarray<double>& phi_dof = args.
array<
double>(
"phi_dof");
1147 xt::pyarray<double>& phi_ls = args.
array<
double>(
"phi_ls");
1148 xt::pyarray<double>& q_m = args.
array<
double>(
"q_m");
1149 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
1150 xt::pyarray<double>& q_n = args.
array<
double>(
"q_n");
1151 xt::pyarray<double>& q_dH = args.
array<
double>(
"q_dH");
1152 xt::pyarray<double>& u_weak_internal_bc_dofs = args.
array<
double>(
"u_weak_internal_bc_dofs");
1153 xt::pyarray<double>& q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
1154 xt::pyarray<double>& q_dH_last = args.
array<
double>(
"q_dH_last");
1155 xt::pyarray<double>& q_cfl = args.
array<
double>(
"q_cfl");
1156 xt::pyarray<double>& q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
1157 xt::pyarray<double>& q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
1158 xt::pyarray<int>& weakDirichletConditionFlags = args.
array<
int>(
"weakDirichletConditionFlags");
1159 int offset_u = args.
scalar<
int>(
"offset_u");
1160 int stride_u = args.
scalar<
int>(
"stride_u");
1161 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
1162 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1163 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1164 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1165 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1166 xt::pyarray<double>& ebqe_phi_ls_ext = args.
array<
double>(
"ebqe_phi_ls_ext");
1167 xt::pyarray<int>& isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
1168 xt::pyarray<double>& ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
1169 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
1170 xt::pyarray<double>& ebqe_n = args.
array<
double>(
"ebqe_n");
1171 int ELLIPTIC_REDISTANCING = args.
scalar<
int>(
"ELLIPTIC_REDISTANCING");
1172 double backgroundDissipationEllipticRedist = args.
scalar<
double>(
"backgroundDissipationEllipticRedist");
1173 xt::pyarray<double>& lumped_qx = args.
array<
double>(
"lumped_qx");
1174 xt::pyarray<double>& lumped_qy = args.
array<
double>(
"lumped_qy");
1175 xt::pyarray<double>& lumped_qz = args.
array<
double>(
"lumped_qz");
1176 double alpha = args.
scalar<
double>(
"alpha");
1188 for(
int eN=0;eN<nElements_global;eN++)
1191 double elementResidual_u[nDOF_test_element],element_phi[nDOF_trial_element];
1192 double epsilon_redist,h_phi, norm;
1193 for (
int i=0;i<nDOF_test_element;i++)
1195 int eN_i=eN*nDOF_trial_element+i;
1196 elementResidual_u[i]=0.0;
1197 element_phi[i] = phi_dof.data()[u_l2g.data()[eN_i]];
1199 double element_nodes[nDOF_mesh_trial_element*3];
1200 for (
int i=0;i<nDOF_mesh_trial_element;i++)
1202 int eN_i=eN*nDOF_mesh_trial_element+i;
1203 for(
int I=0;I<3;I++)
1204 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
1206 gf.
calculate(element_phi, element_nodes, x_ref.data(),
false);
1208 for (
int k=0;k<nQuadraturePoints_element;k++)
1212 int eN_k = eN*nQuadraturePoints_element+k,
1213 eN_k_nSpace = eN_k*nSpace,
1214 eN_nDOF_trial_element = eN*nDOF_trial_element;
1220 jac[nSpace*nSpace], jacDet, jacInv[nSpace*nSpace],
1221 u_grad_trial[nDOF_trial_element*nSpace],
1222 u_test_dV[nDOF_trial_element], u_grad_test_dV[nDOF_test_element*nSpace],
1223 dV,x,y,
z,G[nSpace*nSpace],G_dd_G,tr_G;
1224 ck.calculateMapping_element(eN,
1228 mesh_trial_ref.data(),
1229 mesh_grad_trial_ref.data(),
1234 ck.calculateH_element(eN,
1236 nodeDiametersArray.data(),
1238 mesh_trial_ref.data(),
1241 dV = fabs(jacDet)*dV_ref.data()[k];
1242 ck.calculateG(jacInv,G,G_dd_G,tr_G);
1244 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],
1248 ck.valFromDOF(u_dof.data(),
1249 &u_l2g.data()[eN_nDOF_trial_element],
1250 &u_trial_ref.data()[k*nDOF_trial_element],
1253 ck.gradFromDOF(u_dof.data(),
1254 &u_l2g.data()[eN_nDOF_trial_element],
1257 if (ELLIPTIC_REDISTANCING > 1)
1259 ck.valFromDOF(lumped_qx.data(),
1260 &u_l2g.data()[eN_nDOF_trial_element],
1261 &u_trial_ref.data()[k*nDOF_trial_element],
1263 ck.valFromDOF(lumped_qy.data(),
1264 &u_l2g.data()[eN_nDOF_trial_element],
1265 &u_trial_ref.data()[k*nDOF_trial_element],
1267 ck.valFromDOF(lumped_qz.data(),
1268 &u_l2g.data()[eN_nDOF_trial_element],
1269 &u_trial_ref.data()[k*nDOF_trial_element],
1277 for (
int j=0;j<nDOF_trial_element;j++)
1279 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
1280 for (
int I=0;I<nSpace;I++)
1281 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
1285 double norm_grad_u = 0.;
1286 for (
int I=0;I<nSpace;I++)
1287 norm_grad_u += grad_u[I]*grad_u[I];
1288 norm_grad_u = std::sqrt(norm_grad_u) + 1.0E-10;
1291 q_m.data()[eN_k] =
u;
1292 q_u.data()[eN_k] =
u;
1293 for (
int I=0;I<nSpace;I++)
1294 q_n.data()[eN_k_nSpace+I] = grad_u[I]/norm_grad_u;
1298 coeff = 1.0-1.0/norm_grad_u;
1300 coeff = 1.0+2*std::pow(norm_grad_u,2)-3*norm_grad_u;
1303 epsilon_redist = epsFact_redist*(useMetrics*h_phi
1304 +(1.0-useMetrics)*elementDiameter.data()[eN]);
1305 delta =
gf.
D(epsilon_redist,phi_ls.data()[eN_k]);
1308 double Si = -1.0+2.0*
gf.
H(epsilon_redist,phi_ls.data()[eN_k]);
1309 double residualEikonal = Si*(norm_grad_u-1.0);
1310 double backgroundDissipation = backgroundDissipationEllipticRedist*elementDiameter.data()[eN];
1313 for(
int i=0;i<nDOF_test_element;i++)
1315 int i_nSpace = i*nSpace;
1317 int gi = offset_u+stride_u*u_l2g.data()[eN*nDOF_test_element+i];
1319 if (ELLIPTIC_REDISTANCING > 1)
1321 elementResidual_u[i] +=
1322 residualEikonal*u_test_dV[i]
1323 +
ck.NumericalDiffusion(1.0+backgroundDissipation,
1325 &u_grad_test_dV[i_nSpace])
1326 -
ck.NumericalDiffusion(1.0,
1328 &u_grad_test_dV[i_nSpace])
1329 +alpha*(u_dof.data()[gi]-phi_dof.data()[gi])*delta*u_test_dV[i];
1333 elementResidual_u[i] +=
1334 residualEikonal*u_test_dV[i]
1335 +
ck.NumericalDiffusion(
coeff+backgroundDissipation,
1337 &u_grad_test_dV[i_nSpace])
1338 + alpha*(u_dof.data()[gi]-phi_dof.data()[gi])*delta*u_test_dV[i];
1345 for(
int i=0;i<nDOF_test_element;i++)
1347 int eN_i=eN*nDOF_test_element+i;
1348 globalResidual.data()[offset_u+stride_u*u_l2g.data()[eN_i]]+=elementResidual_u[i];
1354 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
1356 int ebN = exteriorElementBoundariesArray.data()[ebNE],
1357 eN = elementBoundaryElementsArray.data()[ebN*2+0],
1358 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+0],
1359 eN_nDOF_trial_element = eN*nDOF_trial_element;
1360 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
1362 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
1363 ebNE_kb_nSpace = ebNE_kb*nSpace,
1364 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
1365 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
1369 jac_ext[nSpace*nSpace],jacDet_ext,jacInv_ext[nSpace*nSpace],
1370 boundaryJac[nSpace*(nSpace-1)],
1371 metricTensor[(nSpace-1)*(nSpace-1)],metricTensorDetSqrt,
1372 u_grad_trial_trace[nDOF_trial_element*nSpace],
1373 normal[nSpace],x_ext,y_ext,z_ext,
1375 ck.calculateMapping_elementBoundary(eN,
1381 mesh_trial_trace_ref.data(),
1382 mesh_grad_trial_trace_ref.data(),
1383 boundaryJac_ref.data(),
1389 metricTensorDetSqrt,
1395 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],
1397 u_grad_trial_trace);
1399 ck.valFromDOF(u_dof.data(),
1400 &u_l2g.data()[eN_nDOF_trial_element],
1401 &u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],
1403 ck.gradFromDOF(u_dof.data(),
1404 &u_l2g.data()[eN_nDOF_trial_element],
1408 for (
int I=0;I<nSpace;I++)
1409 norm += grad_u_ext[I]*grad_u_ext[I];
1410 norm = sqrt(norm) + 1.0E-10;
1411 for (
int I=0;I<nSpace;I++)
1412 dir[I] = grad_u_ext[I]/norm;
1415 ebqe_u.data()[ebNE_kb] = u_ext;
1417 for (
int I=0;I<nSpace;I++)
1418 ebqe_n.data()[ebNE_kb_nSpace+I] = dir[I];
1426 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1427 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1428 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1429 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1430 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
1431 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1432 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1433 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1434 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1435 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1436 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1437 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1438 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
1439 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1440 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1441 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1442 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1443 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
1444 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1445 int nElements_global = args.
scalar<
int>(
"nElements_global");
1446 double useMetrics = args.
scalar<
double>(
"useMetrics");
1447 double alphaBDF = args.
scalar<
double>(
"alphaBDF");
1448 double epsFact_redist = args.
scalar<
double>(
"epsFact_redist");
1449 double backgroundDiffusionFactor = args.
scalar<
double>(
"backgroundDiffusionFactor");
1450 double weakDirichletFactor = args.
scalar<
double>(
"weakDirichletFactor");
1451 int freezeLevelSet = args.
scalar<
int>(
"freezeLevelSet");
1452 int useTimeIntegration = args.
scalar<
int>(
"useTimeIntegration");
1453 int lag_shockCapturing = args.
scalar<
int>(
"lag_shockCapturing");
1454 int lag_subgridError = args.
scalar<
int>(
"lag_subgridError");
1455 double shockCapturingDiffusion = args.
scalar<
double>(
"shockCapturingDiffusion");
1456 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1457 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1458 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
1459 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1460 xt::pyarray<double>& phi_dof = args.
array<
double>(
"phi_dof");
1461 xt::pyarray<double>& u_weak_internal_bc_dofs = args.
array<
double>(
"u_weak_internal_bc_dofs");
1462 xt::pyarray<double>& phi_ls = args.
array<
double>(
"phi_ls");
1463 xt::pyarray<double>& q_m_betaBDF = args.
array<
double>(
"q_m_betaBDF");
1464 xt::pyarray<double>& q_dH_last = args.
array<
double>(
"q_dH_last");
1465 xt::pyarray<double>& q_cfl = args.
array<
double>(
"q_cfl");
1466 xt::pyarray<double>& q_numDiff_u = args.
array<
double>(
"q_numDiff_u");
1467 xt::pyarray<double>& q_numDiff_u_last = args.
array<
double>(
"q_numDiff_u_last");
1468 xt::pyarray<int>& weakDirichletConditionFlags = args.
array<
int>(
"weakDirichletConditionFlags");
1469 xt::pyarray<int>& csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
1470 xt::pyarray<int>& csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
1471 xt::pyarray<double>& globalJacobian = args.
array<
double>(
"globalJacobian");
1472 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1473 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1474 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1475 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1476 xt::pyarray<double>& ebqe_phi_ls_ext = args.
array<
double>(
"ebqe_phi_ls_ext");
1477 xt::pyarray<int>& isDOFBoundary_u = args.
array<
int>(
"isDOFBoundary_u");
1478 xt::pyarray<double>& ebqe_bc_u_ext = args.
array<
double>(
"ebqe_bc_u_ext");
1479 xt::pyarray<int>& csrColumnOffsets_eb_u_u = args.
array<
int>(
"csrColumnOffsets_eb_u_u");
1480 int ELLIPTIC_REDISTANCING = args.
scalar<
int>(
"ELLIPTIC_REDISTANCING");
1481 double backgroundDissipationEllipticRedist = args.
scalar<
double>(
"backgroundDissipationEllipticRedist");
1482 double alpha = args.
scalar<
double>(
"alpha");
1487 for(
int eN=0;eN<nElements_global;eN++)
1489 double elementJacobian_u_u[nDOF_test_element][nDOF_trial_element],element_phi[nDOF_trial_element];
1490 double epsilon_redist,h_phi, norm;
1491 for (
int i=0;i<nDOF_test_element;i++)
1493 int eN_i=eN*nDOF_trial_element+i;
1494 element_phi[i] = phi_dof.data()[u_l2g.data()[eN_i]];
1495 for (
int j=0;j<nDOF_trial_element;j++)
1497 elementJacobian_u_u[i][j]=0.0;
1500 double element_nodes[nDOF_mesh_trial_element*3];
1501 for (
int i=0;i<nDOF_mesh_trial_element;i++)
1503 int eN_i=eN*nDOF_mesh_trial_element+i;
1504 for(
int I=0;I<3;I++)
1505 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
1507 gf.
calculate(element_phi, element_nodes, x_ref.data(),
false);
1508 for (
int k=0;k<nQuadraturePoints_element;k++)
1511 int eN_k = eN*nQuadraturePoints_element+k,
1512 eN_k_nSpace = eN_k*nSpace,
1513 eN_nDOF_trial_element = eN*nDOF_trial_element;
1517 coeff1, coeff2, delta,
1519 jac[nSpace*nSpace], jacDet, jacInv[nSpace*nSpace],
1520 u_grad_trial[nDOF_trial_element*nSpace],
1521 dV, u_test_dV[nDOF_test_element], u_grad_test_dV[nDOF_test_element*nSpace],
1522 x,y,
z,G[nSpace*nSpace],G_dd_G,tr_G;
1526 ck.calculateMapping_element(eN,
1530 mesh_trial_ref.data(),
1531 mesh_grad_trial_ref.data(),
1536 ck.calculateH_element(eN,
1538 nodeDiametersArray.data(),
1540 mesh_trial_ref.data(),
1543 dV = fabs(jacDet)*dV_ref.data()[k];
1544 ck.calculateG(jacInv,G,G_dd_G,tr_G);
1546 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],
1550 ck.gradFromDOF(u_dof.data(),
1551 &u_l2g.data()[eN_nDOF_trial_element],
1555 for (
int j=0;j<nDOF_trial_element;j++)
1557 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
1558 for (
int I=0;I<nSpace;I++)
1559 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
1563 double norm_grad_u = 0;
1564 for(
int I=0;I<nSpace;I++)
1565 norm_grad_u += grad_u[I]*grad_u[I];
1566 norm_grad_u = std::sqrt(norm_grad_u) + 1.0E-10;
1572 coeff2 = 1./std::pow(norm_grad_u,3);
1576 coeff1 = fmax(1.0E-10, 2*std::pow(norm_grad_u,2)-3*norm_grad_u);
1577 coeff2 = fmax(1.0E-10, 4.-3./norm_grad_u);
1581 epsilon_redist = epsFact_redist*(useMetrics*h_phi
1582 +(1.0-useMetrics)*elementDiameter.data()[eN]);
1583 delta =
gf.
D(epsilon_redist,phi_ls.data()[eN_k]);
1586 double Si = -1.0+2.0*
gf.
H(epsilon_redist,phi_ls.data()[eN_k]);
1588 for (
int I=0; I<nSpace;I++)
1589 dH[I] = Si*grad_u[I]/norm_grad_u;
1590 double backgroundDissipation = backgroundDissipationEllipticRedist*elementDiameter.data()[eN];
1593 for(
int i=0;i<nDOF_test_element;i++)
1595 int i_nSpace = i*nSpace;
1596 for(
int j=0;j<nDOF_trial_element;j++)
1598 int j_nSpace = j*nSpace;
1599 elementJacobian_u_u[i][j] +=
1600 ck.HamiltonianJacobian_weak(dH,&u_grad_trial[j_nSpace],u_test_dV[i])
1601 +
ck.NumericalDiffusionJacobian(1.0+backgroundDissipation,
1602 &u_grad_trial[j_nSpace],
1603 &u_grad_test_dV[i_nSpace])
1604 + (ELLIPTIC_REDISTANCING == 1 ? 1. : 0.)*
1605 (
ck.NumericalDiffusionJacobian(coeff1,
1606 &u_grad_trial[j_nSpace],
1607 &u_grad_test_dV[i_nSpace])
1609 ck.NumericalDiffusion(1.0,grad_u,&u_grad_trial[i_nSpace])*
1610 ck.NumericalDiffusion(1.0,grad_u,&u_grad_trial[j_nSpace]) )
1611 + (i == j ? alpha*delta*u_test_dV[i] : 0.);
1618 for (
int i=0;i<nDOF_test_element;i++)
1620 int eN_i = eN*nDOF_test_element+i;
1621 for (
int j=0;j<nDOF_trial_element;j++)
1623 int eN_i_j = eN_i*nDOF_trial_element+j;
1624 globalJacobian.data()[csrRowIndeces_u_u.data()[eN_i]
1625 + csrColumnOffsets_u_u.data()[eN_i_j]] += elementJacobian_u_u[i][j];
1633 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1634 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1635 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1636 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1637 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1638 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1639 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1640 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1641 int nElements_global = args.
scalar<
int>(
"nElements_global");
1642 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1643 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1644 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1645 int offset_u = args.
scalar<
int>(
"offset_u");
1646 int stride_u = args.
scalar<
int>(
"stride_u");
1647 int numDOFs = args.
scalar<
int>(
"numDOFs");
1648 xt::pyarray<double>& lumped_qx = args.
array<
double>(
"lumped_qx");
1649 xt::pyarray<double>& lumped_qy = args.
array<
double>(
"lumped_qy");
1650 xt::pyarray<double>& lumped_qz = args.
array<
double>(
"lumped_qz");
1652 for (
int i=0; i<numDOFs; i++)
1655 lumped_qx.data()[i]=0.;
1656 lumped_qy.data()[i]=0.;
1657 lumped_qz.data()[i]=0.;
1661 for(
int eN=0;eN<nElements_global;eN++)
1665 element_weighted_lumped_mass_matrix[nDOF_test_element],
1666 element_rhsx_normal_reconstruction[nDOF_test_element],
1667 element_rhsy_normal_reconstruction[nDOF_test_element],
1668 element_rhsz_normal_reconstruction[nDOF_test_element];
1669 for (
int i=0;i<nDOF_test_element;i++)
1671 element_weighted_lumped_mass_matrix[i]=0.0;
1672 element_rhsx_normal_reconstruction[i]=0.0;
1673 element_rhsy_normal_reconstruction[i]=0.0;
1674 element_rhsz_normal_reconstruction[i]=0.0;
1677 for (
int k=0;k<nQuadraturePoints_element;k++)
1680 int eN_k = eN*nQuadraturePoints_element+k,
1681 eN_k_nSpace = eN_k*nSpace,
1682 eN_nDOF_trial_element = eN*nDOF_trial_element;
1686 u_grad_trial[nDOF_trial_element*nSpace],
1687 u_test_dV[nDOF_trial_element],
1689 jac[nSpace*nSpace], jacDet, jacInv[nSpace*nSpace],
1692 ck.calculateMapping_element(eN,
1696 mesh_trial_ref.data(),
1697 mesh_grad_trial_ref.data(),
1702 dV = fabs(jacDet)*dV_ref.data()[k];
1703 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],
1706 ck.gradFromDOF(u_dof.data(),
1707 &u_l2g.data()[eN_nDOF_trial_element],u_grad_trial,
1710 for (
int j=0;j<nDOF_trial_element;j++)
1711 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
1713 double rhsx = grad_u[0];
1714 double rhsy = grad_u[1];
1719 double norm_grad_u = 0;
1720 for (
int I=0;I<nSpace; I++)
1721 norm_grad_u += grad_u[I]*grad_u[I];
1722 norm_grad_u = std::sqrt(norm_grad_u) + 1.0E-10;
1724 for(
int i=0;i<nDOF_test_element;i++)
1726 element_weighted_lumped_mass_matrix[i] += norm_grad_u*u_test_dV[i];
1727 element_rhsx_normal_reconstruction[i] += rhsx*u_test_dV[i];
1728 element_rhsy_normal_reconstruction[i] += rhsy*u_test_dV[i];
1729 element_rhsz_normal_reconstruction[i] += rhsz*u_test_dV[i];
1733 for(
int i=0;i<nDOF_test_element;i++)
1735 int eN_i=eN*nDOF_test_element+i;
1736 int gi = offset_u+stride_u*u_l2g.data()[eN_i];
1739 lumped_qx.data()[gi] += element_rhsx_normal_reconstruction[i];
1740 lumped_qy.data()[gi] += element_rhsy_normal_reconstruction[i];
1741 lumped_qz.data()[gi] += element_rhsz_normal_reconstruction[i];
1745 for (
int i=0; i<numDOFs; i++)
1749 lumped_qx.data()[i] /= weighted_mi;
1750 lumped_qy.data()[i] /= weighted_mi;
1751 lumped_qz.data()[i] /= weighted_mi;
1757 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1758 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1759 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1760 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1761 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1762 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1763 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1764 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1765 int nElements_global = args.
scalar<
int>(
"nElements_global");
1766 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1767 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1768 double degree_polynomial = args.
scalar<
double>(
"degree_polynomial");
1769 double epsFact_redist = args.
scalar<
double>(
"epsFact_redist");
1770 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1771 xt::pyarray<double>& u_exact = args.
array<
double>(
"u_exact");
1772 int offset_u = args.
scalar<
int>(
"offset_u");
1773 int stride_u = args.
scalar<
int>(
"stride_u)");
1774 double global_V = 0.;
1775 double global_V0 = 0.;
1776 double global_I_err = 0.0;
1777 double global_V_err = 0.0;
1778 double global_D_err = 0.0;
1782 for(
int eN=0;eN<nElements_global;eN++)
1786 elementResidual_u[nDOF_test_element];
1788 cell_mass_error = 0., cell_mass_exact = 0.,
1790 cell_V = 0., cell_V0 = 0.,
1794 for (
int k=0;k<nQuadraturePoints_element;k++)
1797 int eN_k = eN*nQuadraturePoints_element+k,
1798 eN_k_nSpace = eN_k*nSpace,
1799 eN_nDOF_trial_element = eN*nDOF_trial_element;
1802 u_grad_trial[nDOF_trial_element*nSpace],
1805 jac[nSpace*nSpace], jacDet, jacInv[nSpace*nSpace],
1808 ck.calculateMapping_element(eN,
1812 mesh_trial_ref.data(),
1813 mesh_grad_trial_ref.data(),
1818 dV = fabs(jacDet)*dV_ref.data()[k];
1820 ck.valFromDOF(u_dof.data(),
1821 &u_l2g.data()[eN_nDOF_trial_element],&u_trial_ref.data()[k*nDOF_trial_element],
1823 u = u_exact.data()[eN_k];
1825 ck.gradTrialFromRef(&u_grad_trial_ref.data()[k*nDOF_trial_element*nSpace],
1828 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial,grad_uh);
1830 double epsHeaviside = epsFact_redist*elementDiameter.data()[eN]/degree_polynomial;
1835 cell_I_err += fabs(Hu - Huh)*dV;
1839 double norm2_grad_uh = 0.;
1840 for (
int I=0; I<nSpace; I++)
1841 norm2_grad_uh += grad_uh[I]*grad_uh[I];
1842 cell_D_err += std::pow(std::sqrt(norm2_grad_uh) - 1, 2.)*dV;
1845 global_V0 += cell_V0;
1847 global_I_err += cell_I_err;
1848 global_D_err += cell_D_err;
1850 global_V_err = fabs(global_V0 - global_V)/global_V0;
1851 global_D_err *= 0.5;
1852 return std::tuple<double, double, double>(global_I_err, global_V_err, global_D_err);