88 double* mesh_trial_ref,
89 double* mesh_grad_trial_ref,
94 double* u_grad_trial_ref,
96 double* u_grad_test_ref,
98 double* mesh_trial_trace_ref,
99 double* mesh_grad_trial_trace_ref,
101 double* u_trial_trace_ref,
102 double* u_grad_trial_trace_ref,
103 double* u_test_trace_ref,
104 double* u_grad_test_trace_ref,
106 double* boundaryJac_ref,
108 int nElements_global,
110 double epsFactHeaviside,
112 double epsFactDiffusion,
115 double* elementDiameter,
116 double* nodeDiametersArray,
119 double* q_normal_phi,
121 double* ebqe_normal_phi,
129 int offset_u,
int stride_u,
130 double* elementResidual_u,
131 int nExteriorElementBoundaries_global,
132 int* exteriorElementBoundariesArray,
133 int* elementBoundaryElementsArray,
134 int* elementBoundaryLocalElementBoundariesArray,
140 const double* phi_solid)
142 for (
int i=0;i<nDOF_test_element;i++)
144 elementResidual_u[i]=0.0;
146 double epsHeaviside,epsDirac,epsDiffusion,norm;
148 for (
int k=0;k<nQuadraturePoints_element;k++)
151 int eN_k = eN*nQuadraturePoints_element+k,
152 eN_k_nSpace = eN_k*nSpace;
154 double u=0.0,grad_u[nSpace],
158 jacInv[nSpace*nSpace],
159 u_grad_trial[nDOF_trial_element*nSpace],
160 u_test_dV[nDOF_trial_element],
161 u_grad_test_dV[nDOF_test_element*nSpace],
163 G[nSpace*nSpace],G_dd_G,tr_G,h_phi;
166 const double H_s =
gf_s.
H(0.0,phi_solid[eN_k]);
170 ck.calculateMapping_element(eN,
180 ck.calculateH_element(eN,
187 dV = fabs(jacDet)*dV_ref[k];
188 ck.calculateG(jacInv,G,G_dd_G,tr_G);
200 ck.gradTrialFromRef(&u_grad_trial_ref[k*nDOF_trial_element*nSpace],jacInv,u_grad_trial);
202 ck.valFromElementDOF(element_u,&u_trial_ref[k*nDOF_trial_element],
u);
204 ck.gradFromElementDOF(element_u,u_grad_trial,grad_u);
206 for (
int j=0;j<nDOF_trial_element;j++)
208 u_test_dV[j] = u_test_ref[k*nDOF_trial_element+j]*dV;
209 for (
int I=0;I<nSpace;I++)
211 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
220 epsHeaviside = epsFactHeaviside*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
221 epsDirac = epsFactDirac* (useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
222 epsDiffusion = epsFactDiffusion*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
235 for(
int i=0;i<nDOF_test_element;i++)
237 int eN_i = eN*nDOF_test_element+i;
240 int i_nSpace=i*nSpace;
242 elementResidual_u[i] += H_s*(
ck.Reaction_weak(
r,u_test_dV[i]) +
243 ck.NumericalDiffusion(epsDiffusion,grad_u,&u_grad_test_dV[i_nSpace]));
246 isActiveR[offset_u + stride_u*r_l2g[eN_i]] = 1.0;
247 isActiveDOF[u_l2g[eN_i]] = 1.0;
260 for (
int I=0;I<nSpace;I++)
261 norm += grad_u[I]*grad_u[I];
263 for(
int I=0;I<nSpace;I++)
264 q_n[eN_k_nSpace+I] = grad_u[I]/norm;
270 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
271 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
272 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
273 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
274 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
275 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
276 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
277 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
278 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
279 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
280 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
281 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
282 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
283 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
284 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
285 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
286 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
287 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
288 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
289 int nElements_global = args.
scalar<
int>(
"nElements_global");
290 double useMetrics = args.
scalar<
double>(
"useMetrics");
291 double epsFactHeaviside = args.
scalar<
double>(
"epsFactHeaviside");
292 double epsFactDirac = args.
scalar<
double>(
"epsFactDirac");
293 double epsFactDiffusion = args.
scalar<
double>(
"epsFactDiffusion");
294 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
295 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
296 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
297 xt::pyarray<double>& elementBoundaryDiameter = args.
array<
double>(
"elementBoundaryDiameter");
298 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
299 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
300 xt::pyarray<double>& phi_dof = args.
array<
double>(
"phi_dof");
301 xt::pyarray<double>& q_phi = args.
array<
double>(
"q_phi");
302 xt::pyarray<double>& q_normal_phi = args.
array<
double>(
"q_normal_phi");
303 xt::pyarray<double>& ebqe_phi = args.
array<
double>(
"ebqe_phi");
304 xt::pyarray<double>& ebqe_normal_phi = args.
array<
double>(
"ebqe_normal_phi");
305 xt::pyarray<double>& q_H = args.
array<
double>(
"q_H");
306 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
307 xt::pyarray<double>& q_n = args.
array<
double>(
"q_n");
308 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
309 xt::pyarray<double>& ebqe_n = args.
array<
double>(
"ebqe_n");
310 xt::pyarray<double>& q_r = args.
array<
double>(
"q_r");
311 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
312 int offset_u = args.
scalar<
int>(
"offset_u");
313 int stride_u = args.
scalar<
int>(
"stride_u");
314 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
315 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
316 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
317 xt::pyarray<int>& elementBoundariesArray = args.
array<
int>(
"elementBoundariesArray");
318 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
319 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
320 xt::pyarray<double>& ebqe_phi_s = args.
array<
double>(
"ebqe_phi_s");
321 double ghost_penalty_constant = args.
scalar<
double>(
"ghost_penalty_constant");
322 const xt::pyarray<double>& phi_solid = args.
array<
double>(
"phi_solid");
323 xt::pyarray<double>& phi_solid_nodes = args.
array<
double>(
"phi_solid_nodes");
324 bool useExact_s = args.
scalar<
int>(
"useExact_s");
325 xt::pyarray<double>& isActiveR = args.
array<
double>(
"isActiveR");
326 xt::pyarray<double>& isActiveDOF = args.
array<
double>(
"isActiveDOF");
327 xt::pyarray<int>& isActiveElement = args.
array<
int>(
"isActiveElement");
342 for(
int eN=0;eN<nElements_global;eN++)
345 double elementResidual_u[nDOF_test_element], element_u[nDOF_trial_element], element_phi[nDOF_trial_element], element_phi_s[nDOF_mesh_trial_element];
346 bool element_active=
false;
347 isActiveElement[eN]=0;
348 for (
int i=0;i<nDOF_test_element;i++)
350 int eN_i=eN*nDOF_test_element+i;
351 element_u[i] = u_dof.data()[u_l2g.data()[eN_i]];
352 element_phi[i] = phi_dof.data()[u_l2g.data()[eN_i]] + element_u[i];
353 element_phi_s[i] = phi_solid_nodes.data()[u_l2g.data()[eN_i]];
355 double element_nodes[nDOF_mesh_trial_element*3];
356 for (
int i=0;i<nDOF_mesh_trial_element;i++)
358 int eN_i=eN*nDOF_mesh_trial_element+i;
360 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
362 gf.
calculate(element_phi, element_nodes, x_ref.data(),
false);
363 int icase_s =
gf_s.
calculate(element_phi_s, element_nodes, x_ref.data(),
false);
367 isActiveElement[eN]=1;
369 for (
int ebN_element=0;ebN_element < nDOF_mesh_trial_element; ebN_element++)
371 const int ebN = elementBoundariesArray.data()[eN*nDOF_mesh_trial_element+ebN_element];
374 if (elementBoundaryElementsArray[ebN*2+1] != -1 && element_phi_s[(ebN_element+1)%nDOF_mesh_trial_element]*element_phi_s[(ebN_element+2)%nDOF_mesh_trial_element] <= 0.0)
377 if (elementBoundaryElementsArray[ebN*2 + 0] == eN)
382 else if (icase_s == 1)
385 isActiveElement[eN]=1;
388 mesh_grad_trial_ref.data(),
393 u_grad_trial_ref.data(),
395 u_grad_test_ref.data(),
396 mesh_trial_trace_ref.data(),
397 mesh_grad_trial_trace_ref.data(),
399 u_trial_trace_ref.data(),
400 u_grad_trial_trace_ref.data(),
401 u_test_trace_ref.data(),
402 u_grad_test_trace_ref.data(),
404 boundaryJac_ref.data(),
412 elementDiameter.data(),
413 nodeDiametersArray.data(),
418 ebqe_normal_phi.data(),
428 nExteriorElementBoundaries_global,
429 exteriorElementBoundariesArray.data(),
430 elementBoundaryElementsArray.data(),
431 elementBoundaryLocalElementBoundariesArray.data(),
441 for(
int i=0;i<nDOF_test_element;i++)
443 int eN_i=eN*nDOF_test_element+i;
445 globalResidual.data()[offset_u+stride_u*r_l2g.data()[eN_i]]+=elementResidual_u[i];
451 if(isActiveElement[elementBoundaryElementsArray[(*it)*2+0]] && isActiveElement[elementBoundaryElementsArray[(*it)*2+1]])
453 std::map<int,double> DW_Dn_jump;
454 double gamma_cutfem=ghost_penalty_constant,
455 h_cutfem=elementBoundaryDiameter.data()[*it];
456 int eN_nDOF_trial_element = elementBoundaryElementsArray.data()[(*it)*2+0]*nDOF_trial_element;
473 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
475 double Du_Dn_jump=0.0, dS;
476 for (
int eN_side=0;eN_side < 2; eN_side++)
479 eN = elementBoundaryElementsArray.data()[ebN*2+eN_side];
480 for (
int i=0;i<nDOF_test_element;i++)
482 DW_Dn_jump[r_l2g.data()[eN*nDOF_test_element+i]] = 0.0;
485 for (
int eN_side=0;eN_side < 2; eN_side++)
488 eN = elementBoundaryElementsArray[ebN*2+eN_side],
489 ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+eN_side],
490 eN_nDOF_trial_element = eN*nDOF_trial_element,
491 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
492 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
495 jac_int[nSpace*nSpace],
497 jacInv_int[nSpace*nSpace],
498 boundaryJac[nSpace*(nSpace-1)],
499 metricTensor[(nSpace-1)*(nSpace-1)],
501 u_test_dS[nDOF_test_element],
502 u_grad_trial_trace[nDOF_trial_element*nSpace],
503 u_grad_test_dS[nDOF_trial_element*nSpace],
504 normal[nSpace],x_int,y_int,z_int,xt_int,yt_int,zt_int,integralScaling,
505 G[nSpace*nSpace],G_dd_G,tr_G,h_phi,h_penalty,penalty;
506 for (
int I=0; I<nSpace;I++)
509 ck.calculateMapping_elementBoundary(eN,
515 mesh_trial_trace_ref.data(),
516 mesh_grad_trial_trace_ref.data(),
517 boundaryJac_ref.data(),
527 dS = metricTensorDetSqrt*dS_ref.data()[kb];
530 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_int,u_grad_trial_trace);
532 ck.valFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],&u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],u_int);
533 ck.gradFromDOF(u_dof.data(),&u_l2g.data()[eN_nDOF_trial_element],u_grad_trial_trace,grad_u_int);
534 for (
int I=0;I<nSpace;I++)
536 Du_Dn_jump += grad_u_int[I]*normal[I];
538 for (
int i=0;i<nDOF_test_element;i++)
540 int eN_i = eN*nDOF_test_element + i;
541 for (
int I=0;I<nSpace;I++)
542 DW_Dn_jump[r_l2g[eN_i]] += u_grad_trial_trace[i*nSpace+I]*normal[I];
545 for (std::map<int,double>::iterator W_it=DW_Dn_jump.begin(); W_it!=DW_Dn_jump.end(); ++W_it)
547 int i_global = W_it->first;
548 double DW_Dn_jump_i = W_it->second;
549 globalResidual.data()[offset_u+stride_u*i_global]+=gamma_cutfem*h_cutfem*Du_Dn_jump*DW_Dn_jump_i*dS;
565 for (
int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
567 int ebN = exteriorElementBoundariesArray.data()[ebNE],
568 eN = elementBoundaryElementsArray.data()[ebN*2+0],
569 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+0];
572 double element_u[nDOF_trial_element];
573 for (
int i=0;i<nDOF_test_element;i++)
575 int eN_i=eN*nDOF_test_element+i;
576 element_u[i] = u_dof.data()[u_l2g.data()[eN_i]];
578 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
580 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
581 ebNE_kb_nSpace = ebNE_kb*nSpace,
582 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
583 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
597 jac_ext[nSpace*nSpace],
599 jacInv_ext[nSpace*nSpace],
600 boundaryJac[nSpace*(nSpace-1)],
601 metricTensor[(nSpace-1)*(nSpace-1)],
605 u_grad_trial_trace[nDOF_trial_element*nSpace],
606 normal[nSpace],x_ext,y_ext,z_ext,
607 G[nSpace*nSpace],G_dd_G,tr_G,norm;
611 ck.calculateMapping_elementBoundary(eN,
617 mesh_trial_trace_ref.data(),
618 mesh_grad_trial_trace_ref.data(),
619 boundaryJac_ref.data(),
629 dS = metricTensorDetSqrt*dS_ref.data()[kb];
632 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
635 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,u_grad_trial_trace);
637 ck.valFromElementDOF(element_u,&u_trial_trace_ref.data()[ebN_local_kb*nDOF_test_element],u_ext);
638 ck.gradFromElementDOF(element_u,u_grad_trial_trace,grad_u_ext);
640 ebqe_u.data()[ebNE_kb] = u_ext;
642 for (
int I=0;I<nSpace;I++)
643 norm += grad_u_ext[I]*grad_u_ext[I];
645 for (
int I=0;I<nSpace;I++)
646 ebqe_n.data()[ebNE_kb_nSpace+I] = grad_u_ext[I]/norm;
652 double* mesh_trial_ref,
653 double* mesh_grad_trial_ref,
658 double* u_grad_trial_ref,
660 double* u_grad_test_ref,
662 double* mesh_trial_trace_ref,
663 double* mesh_grad_trial_trace_ref,
665 double* u_trial_trace_ref,
666 double* u_grad_trial_trace_ref,
667 double* u_test_trace_ref,
668 double* u_grad_test_trace_ref,
670 double* boundaryJac_ref,
672 int nElements_global,
674 double epsFactHeaviside,
676 double epsFactDiffusion,
678 double* elementDiameter,
679 double* nodeDiametersArray,
686 double* q_normal_phi,
689 double* elementJacobian_u_u,
691 const double* phi_solid,
694 for (
int i=0;i<nDOF_test_element;i++)
695 for (
int j=0;j<nDOF_trial_element;j++)
697 elementJacobian_u_u[i*nDOF_trial_element+j]=0.0;
699 double epsHeaviside,epsDirac,epsDiffusion;
700 for (
int k=0;k<nQuadraturePoints_element;k++)
702 int eN_k = eN*nQuadraturePoints_element+k,
703 eN_k_nSpace = eN_k*nSpace;
713 jacInv[nSpace*nSpace],
714 u_grad_trial[nDOF_trial_element*nSpace],
716 u_test_dV[nDOF_test_element],
717 u_grad_test_dV[nDOF_test_element*nSpace],
719 G[nSpace*nSpace],G_dd_G,tr_G,h_phi;
723 ck.calculateMapping_element(eN,
733 ck.calculateH_element(eN,
740 dV = fabs(jacDet)*dV_ref[k];
741 ck.calculateG(jacInv,G,G_dd_G,tr_G);
754 ck.gradTrialFromRef(&u_grad_trial_ref[k*nDOF_trial_element*nSpace],jacInv,u_grad_trial);
756 ck.valFromElementDOF(element_u,&u_trial_ref[k*nDOF_trial_element],
u);
758 ck.gradFromElementDOF(element_u,u_grad_trial,grad_u);
760 for (
int j=0;j<nDOF_trial_element;j++)
762 u_test_dV[j] = u_test_ref[k*nDOF_trial_element+j]*dV;
763 for (
int I=0;I<nSpace;I++)
765 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
771 epsHeaviside=epsFactHeaviside*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
772 epsDirac =epsFactDirac* (useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
773 epsDiffusion=epsFactDiffusion*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
775 const double H_s =
gf_s.
H(0.0, phi_solid[eN_k]);
784 for(
int i=0;i<nDOF_test_element;i++)
788 int i_nSpace=i*nSpace;
789 for(
int j=0;j<nDOF_trial_element;j++)
793 int j_nSpace = j*nSpace;
794 elementJacobian_u_u[i*nDOF_trial_element+j] +=
795 H_s*(
ck.ReactionJacobian_weak(dr,u_trial_ref[k*nDOF_trial_element+j],u_test_dV[i]) +
796 ck.NumericalDiffusionJacobian(epsDiffusion,&u_grad_trial[j_nSpace],&u_grad_test_dV[i_nSpace]));
805 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
806 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
807 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
808 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
809 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
810 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
811 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
812 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
813 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
814 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
815 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
816 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
817 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
818 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
819 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
820 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
821 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
822 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
823 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
824 int nElements_global = args.
scalar<
int>(
"nElements_global");
825 double useMetrics = args.
scalar<
double>(
"useMetrics");
826 double epsFactHeaviside = args.
scalar<
double>(
"epsFactHeaviside");
827 double epsFactDirac = args.
scalar<
double>(
"epsFactDirac");
828 double epsFactDiffusion = args.
scalar<
double>(
"epsFactDiffusion");
829 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
830 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
831 xt::pyarray<int>& elementBoundariesArray = args.
array<
int>(
"elementBoundariesArray");
832 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
833 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
834 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
835 xt::pyarray<double>& elementBoundaryDiameter = args.
array<
double>(
"elementBoundaryDiameter");
836 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
837 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
838 xt::pyarray<double>& phi_dof = args.
array<
double>(
"phi_dof");
839 xt::pyarray<double>& q_phi = args.
array<
double>(
"q_phi");
840 xt::pyarray<double>& q_normal_phi = args.
array<
double>(
"q_normal_phi");
841 xt::pyarray<double>& q_H = args.
array<
double>(
"q_H");
842 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
843 xt::pyarray<int>& csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
844 xt::pyarray<int>& csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
845 xt::pyarray<int>& csrColumnOffsets_eb_u_u = args.
array<
int>(
"csrColumnOffsets_eb_u_u");
846 xt::pyarray<double>& globalJacobian = args.
array<
double>(
"globalJacobian");
847 xt::pyarray<double>& ebqe_phi_s = args.
array<
double>(
"ebqe_phi_s");
848 const xt::pyarray<double>& phi_solid = args.
array<
double>(
"phi_solid");
849 double ghost_penalty_constant = args.
scalar<
double>(
"ghost_penalty_constant");
850 xt::pyarray<double>& phi_solid_nodes = args.
array<
double>(
"phi_solid_nodes");
851 bool useExact_s = args.
scalar<
int>(
"useExact_s");
852 xt::pyarray<double>& isActiveR = args.
array<
double>(
"isActiveR");
853 xt::pyarray<double>& isActiveDOF = args.
array<
double>(
"isActiveDOF");
854 xt::pyarray<int>& isActiveElement = args.
array<
int>(
"isActiveElement");
860 for(
int eN=0;eN<nElements_global;eN++)
862 double elementJacobian_u_u[nDOF_test_element*nDOF_trial_element],element_u[nDOF_trial_element],element_phi[nDOF_trial_element],element_phi_s[nDOF_mesh_trial_element];
863 for (
int j=0;j<nDOF_trial_element;j++)
865 int eN_j = eN*nDOF_trial_element+j;
866 element_u[j] = u_dof.data()[u_l2g.data()[eN_j]];
867 element_phi[j] = phi_dof.data()[u_l2g.data()[eN_j]] + element_u[j];
868 element_phi_s[j] = phi_solid_nodes.data()[u_l2g.data()[eN_j]];
870 double element_nodes[nDOF_mesh_trial_element*3];
871 for (
int i=0;i<nDOF_mesh_trial_element;i++)
873 int eN_i=eN*nDOF_mesh_trial_element+i;
875 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
877 gf.
calculate(element_phi, element_nodes, x_ref.data(),
false);
878 int icase_s =
gf_s.
calculate(element_phi_s, element_nodes, x_ref.data(),
false);
880 mesh_grad_trial_ref.data(),
885 u_grad_trial_ref.data(),
887 u_grad_test_ref.data(),
888 mesh_trial_trace_ref.data(),
889 mesh_grad_trial_trace_ref.data(),
891 u_trial_trace_ref.data(),
892 u_grad_trial_trace_ref.data(),
893 u_test_trace_ref.data(),
894 u_grad_test_trace_ref.data(),
896 boundaryJac_ref.data(),
903 elementDiameter.data(),
904 nodeDiametersArray.data(),
917 for (
int i=0;i<nDOF_test_element;i++)
919 int eN_i = eN*nDOF_test_element+i;
920 for (
int j=0;j<nDOF_trial_element;j++)
922 int eN_i_j = eN_i*nDOF_trial_element+j;
924 globalJacobian.data()[csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_u_u.data()[eN_i_j]] += elementJacobian_u_u[i*nDOF_trial_element+j];
931 std::map<int,double> DW_Dn_jump;
932 std::map<std::pair<int, int>,
int> u_u_nz;
933 double gamma_cutfem=ghost_penalty_constant,
934 h_cutfem=elementBoundaryDiameter.data()[*it];
935 int eN_nDOF_trial_element = elementBoundaryElementsArray.data()[(*it)*2+0]*nDOF_trial_element;
952 for (
int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
954 double Du_Dn_jump=0.0, dS;
955 for (
int eN_side=0;eN_side < 2; eN_side++)
958 eN = elementBoundaryElementsArray.data()[ebN*2+eN_side];
959 for (
int i=0;i<nDOF_test_element;i++)
961 DW_Dn_jump[r_l2g.data()[eN*nDOF_test_element+i]] = 0.0;
964 for (
int eN_side=0;eN_side < 2; eN_side++)
967 eN = elementBoundaryElementsArray.data()[ebN*2+eN_side],
968 ebN_local = elementBoundaryLocalElementBoundariesArray.data()[ebN*2+eN_side],
969 eN_nDOF_trial_element = eN*nDOF_trial_element,
970 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
971 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
974 jac_int[nSpace*nSpace],
976 jacInv_int[nSpace*nSpace],
977 boundaryJac[nSpace*(nSpace-1)],
978 metricTensor[(nSpace-1)*(nSpace-1)],
980 u_test_dS[nDOF_test_element],
981 u_grad_trial_trace[nDOF_trial_element*nSpace],
982 u_grad_test_dS[nDOF_trial_element*nSpace],
983 normal[nSpace],x_int,y_int,z_int,xt_int,yt_int,zt_int,integralScaling,
984 G[nSpace*nSpace],G_dd_G,tr_G,h_phi,h_penalty,penalty;
985 for (
int I=0; I<nSpace;I++)
989 ck.calculateMapping_elementBoundary(eN,
995 mesh_trial_trace_ref.data(),
996 mesh_grad_trial_trace_ref.data(),
997 boundaryJac_ref.data(),
1003 metricTensorDetSqrt,
1007 dS = metricTensorDetSqrt*dS_ref.data()[kb];
1010 ck.gradTrialFromRef(&u_grad_trial_trace_ref.data()[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_int,u_grad_trial_trace);
1011 for (
int i=0;i<nDOF_test_element;i++)
1013 int eN_i = eN*nDOF_test_element + i;
1014 for (
int I=0;I<nSpace;I++)
1015 DW_Dn_jump[r_l2g.data()[eN_i]] += u_grad_trial_trace[i*nSpace+I]*normal[I];
1018 for (
int eN_side=0;eN_side < 2; eN_side++)
1021 eN = elementBoundaryElementsArray.data()[ebN*2+eN_side];
1022 for (
int i=0;i<nDOF_test_element;i++)
1024 int eN_i = eN*nDOF_test_element+i;
1025 for (
int eN_side2=0;eN_side2 < 2; eN_side2++)
1027 int eN2 = elementBoundaryElementsArray.data()[ebN*2+eN_side2];
1028 for (
int j=0;j<nDOF_test_element;j++)
1030 int eN_i_j = eN_i*nDOF_test_element + j;
1031 int eN2_j = eN2*nDOF_test_element + j;
1035 i*nDOF_trial_element +
1037 std::pair<int,int> ij = std::make_pair(u_l2g.data()[eN_i], u_l2g.data()[eN2_j]);
1038 if (u_u_nz.count(ij))
1040 assert(u_u_nz[ij] == csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_eb_u_u.data()[ebN_i_j]);
1043 u_u_nz[ij] = csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_eb_u_u.data()[ebN_i_j];
1048 for (std::map<int,double>::iterator Wi_it=DW_Dn_jump.begin(); Wi_it!=DW_Dn_jump.end(); ++Wi_it)
1049 for (std::map<int,double>::iterator Wj_it=DW_Dn_jump.begin(); Wj_it!=DW_Dn_jump.end(); ++Wj_it)
1051 int i_global = Wi_it->first,
1052 j_global = Wj_it->first;
1053 double DW_Dn_jump_i = Wi_it->second,
1054 DW_Dn_jump_j = Wj_it->second;
1055 std::pair<int,int> ij = std::make_pair(i_global, j_global);
1056 globalJacobian.data()[u_u_nz.at(ij)] += gamma_cutfem*h_cutfem*DW_Dn_jump_j*DW_Dn_jump_i*dS;
1064 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1065 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1066 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1067 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1068 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1069 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1070 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1071 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1072 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1073 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1074 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1075 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
1076 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1077 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1078 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1079 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1080 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
1081 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1082 int nElements_global = args.
scalar<
int>(
"nElements_global");
1083 double useMetrics = args.
scalar<
double>(
"useMetrics");
1084 double epsFactHeaviside = args.
scalar<
double>(
"epsFactHeaviside");
1085 double epsFactDirac = args.
scalar<
double>(
"epsFactDirac");
1086 double epsFactDiffusion = args.
scalar<
double>(
"epsFactDiffusion");
1087 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1088 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
1089 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1090 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
1091 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1092 xt::pyarray<double>& q_phi = args.
array<
double>(
"q_phi");
1093 xt::pyarray<double>& q_normal_phi = args.
array<
double>(
"q_normal_phi");
1094 xt::pyarray<double>& ebqe_phi = args.
array<
double>(
"ebqe_phi");
1095 xt::pyarray<double>& ebqe_normal_phi = args.
array<
double>(
"ebqe_normal_phi");
1096 xt::pyarray<double>& q_H = args.
array<
double>(
"q_H");
1097 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
1098 xt::pyarray<double>& q_n = args.
array<
double>(
"q_n");
1099 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
1100 xt::pyarray<double>& ebqe_n = args.
array<
double>(
"ebqe_n");
1101 xt::pyarray<double>& q_r = args.
array<
double>(
"q_r");
1102 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
1103 int offset_u = args.
scalar<
int>(
"offset_u");
1104 int stride_u = args.
scalar<
int>(
"stride_u");
1105 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
1106 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1107 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1108 xt::pyarray<int>& elementBoundariesArray = args.
array<
int>(
"elementBoundariesArray");
1109 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1110 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1111 xt::pyarray<double>& ebqe_phi_s = args.
array<
double>(
"ebqe_phi_s");
1112 const xt::pyarray<double>& phi_solid = args.
array<
double>(
"phi_solid");
1113 xt::pyarray<double>& phi_solid_nodes = args.
array<
double>(
"phi_solid_nodes");
1114 bool useExact_s = args.
scalar<
int>(
"useExact_s");
1115 xt::pyarray<double>& isActiveR = args.
array<
double>(
"isActiveR");
1116 xt::pyarray<double>& isActiveDOF = args.
array<
double>(
"isActiveDOF");
1117 xt::pyarray<int>& isActiveElement = args.
array<
int>(
"isActiveElement");
1118 int maxIts = args.
scalar<
int>(
"maxIts");
1119 double atol = args.
scalar<
double>(
"atol");
1130 for(
int eN=0;eN<nElements_global;eN++)
1133 double element_u[nDOF_test_element],
1134 element_du[nDOF_test_element],
1135 elementResidual_u[nDOF_test_element],
1136 elementJacobian_u_u[nDOF_test_element*nDOF_trial_element],scale=1.0;
1137 PROTEUS_LAPACK_INTEGER elementPivots[nDOF_test_element],
1138 elementColPivots[nDOF_test_element];
1140 bool element_active=
true;
1141 for (
int i=0;i<nDOF_test_element;i++)
1146 mesh_grad_trial_ref.data(),
1151 u_grad_trial_ref.data(),
1153 u_grad_test_ref.data(),
1154 mesh_trial_trace_ref.data(),
1155 mesh_grad_trial_trace_ref.data(),
1157 u_trial_trace_ref.data(),
1158 u_grad_trial_trace_ref.data(),
1159 u_test_trace_ref.data(),
1160 u_grad_test_trace_ref.data(),
1162 boundaryJac_ref.data(),
1170 elementDiameter.data(),
1171 nodeDiametersArray.data(),
1174 q_normal_phi.data(),
1176 ebqe_normal_phi.data(),
1186 nExteriorElementBoundaries_global,
1187 exteriorElementBoundariesArray.data(),
1188 elementBoundaryElementsArray.data(),
1189 elementBoundaryLocalElementBoundariesArray.data(),
1198 for (
int i=0;i<nDOF_test_element;i++)
1200 resNorm += elementResidual_u[i];
1202 resNorm = fabs(resNorm);
1207 while (resNorm >= atol && its < maxIts)
1211 mesh_grad_trial_ref.data(),
1216 u_grad_trial_ref.data(),
1218 u_grad_test_ref.data(),
1219 mesh_trial_trace_ref.data(),
1220 mesh_grad_trial_trace_ref.data(),
1222 u_trial_trace_ref.data(),
1223 u_grad_trial_trace_ref.data(),
1224 u_test_trace_ref.data(),
1225 u_grad_test_trace_ref.data(),
1227 boundaryJac_ref.data(),
1234 elementDiameter.data(),
1235 nodeDiametersArray.data(),
1238 q_normal_phi.data(),
1241 elementJacobian_u_u,
1245 for (
int i=0;i<nDOF_test_element;i++)
1247 element_du[i] = -elementResidual_u[i];
1248 elementPivots[i] = ((PROTEUS_LAPACK_INTEGER)0);
1249 elementColPivots[i]=((PROTEUS_LAPACK_INTEGER)0);
1258 PROTEUS_LAPACK_INTEGER La_N=((PROTEUS_LAPACK_INTEGER)nDOF_test_element),
1261 elementJacobian_u_u,
1268 elementJacobian_u_u,
1274 double resNormNew = resNorm,lambda=1.0;
1276 while (resNormNew > 0.99*resNorm && lsIts < 100)
1279 for (
int i=0;i<nDOF_test_element;i++)
1281 element_u[i] += lambda*element_du[i];
1286 mesh_grad_trial_ref.data(),
1291 u_grad_trial_ref.data(),
1293 u_grad_test_ref.data(),
1294 mesh_trial_trace_ref.data(),
1295 mesh_grad_trial_trace_ref.data(),
1297 u_trial_trace_ref.data(),
1298 u_grad_trial_trace_ref.data(),
1299 u_test_trace_ref.data(),
1300 u_grad_test_trace_ref.data(),
1302 boundaryJac_ref.data(),
1310 elementDiameter.data(),
1311 nodeDiametersArray.data(),
1314 q_normal_phi.data(),
1316 ebqe_normal_phi.data(),
1326 nExteriorElementBoundaries_global,
1327 exteriorElementBoundariesArray.data(),
1328 elementBoundaryElementsArray.data(),
1329 elementBoundaryLocalElementBoundariesArray.data(),
1340 for (
int i=0;i<nDOF_test_element;i++)
1342 resNormNew += elementResidual_u[i];
1343 std::cout<<
"element_u["<<i<<
"] "<<element_u[i]<<std::endl;
1344 std::cout<<
"elementResidual_u["<<i<<
"] "<<elementResidual_u[i]<<std::endl;
1346 resNormNew = fabs(resNormNew);
1348 resNorm = resNormNew;
1349 std::cout<<
"INFO "<<INFO<<std::endl;
1350 std::cout<<
"resNorm["<<its<<
"] "<<resNorm<<std::endl;
1356 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1357 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1358 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1359 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1360 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1361 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1362 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1363 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1364 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1365 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1366 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1367 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
1368 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1369 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1370 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1371 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1372 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
1373 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1374 int nElements_global = args.
scalar<
int>(
"nElements_global");
1375 double useMetrics = args.
scalar<
double>(
"useMetrics");
1376 double epsFactHeaviside = args.
scalar<
double>(
"epsFactHeaviside");
1377 double epsFactDirac = args.
scalar<
double>(
"epsFactDirac");
1378 double epsFactDiffusion = args.
scalar<
double>(
"epsFactDiffusion");
1379 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1380 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
1381 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1382 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
1383 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1384 xt::pyarray<double>& q_phi = args.
array<
double>(
"q_phi");
1385 xt::pyarray<double>& q_normal_phi = args.
array<
double>(
"q_normal_phi");
1386 xt::pyarray<double>& ebqe_phi = args.
array<
double>(
"ebqe_phi");
1387 xt::pyarray<double>& ebqe_normal_phi = args.
array<
double>(
"ebqe_normal_phi");
1388 xt::pyarray<double>& q_H = args.
array<
double>(
"q_H");
1389 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
1390 xt::pyarray<double>& q_n = args.
array<
double>(
"q_n");
1391 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
1392 xt::pyarray<double>& ebqe_n = args.
array<
double>(
"ebqe_n");
1393 xt::pyarray<double>& q_r = args.
array<
double>(
"q_r");
1394 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
1395 int offset_u = args.
scalar<
int>(
"offset_u");
1396 int stride_u = args.
scalar<
int>(
"stride_u");
1397 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
1398 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1399 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1400 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1401 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1402 const xt::pyarray<double>& phi_solid = args.
array<
double>(
"phi_solid");
1403 xt::pyarray<double>& isActiveR = args.
array<
double>(
"isActiveR");
1404 xt::pyarray<double>& isActiveDOF = args.
array<
double>(
"isActiveDOF");
1405 xt::pyarray<int>& isActiveElement = args.
array<
int>(
"isActiveElement");
1406 int maxIts = args.
scalar<
int>(
"maxIts");
1407 double atol = args.
scalar<
double>(
"atol");
1408 for(
int eN=0;eN<nElements_global;eN++)
1411 double element_u[nDOF_test_element],elementConstant_u,
1412 elementResidual_u[nDOF_test_element],elementConstantResidual,
1413 elementJacobian_u_u[nDOF_test_element*nDOF_trial_element],elementConstantJacobian,resNorm;
1414 elementConstant_u=0.0;
1415 bool element_active=
true;
1416 for (
int i=0;i<nDOF_test_element;i++)
1418 element_u[i]=elementConstant_u;
1421 mesh_grad_trial_ref.data(),
1426 u_grad_trial_ref.data(),
1428 u_grad_test_ref.data(),
1429 mesh_trial_trace_ref.data(),
1430 mesh_grad_trial_trace_ref.data(),
1432 u_trial_trace_ref.data(),
1433 u_grad_trial_trace_ref.data(),
1434 u_test_trace_ref.data(),
1435 u_grad_test_trace_ref.data(),
1437 boundaryJac_ref.data(),
1445 elementDiameter.data(),
1446 nodeDiametersArray.data(),
1449 q_normal_phi.data(),
1451 ebqe_normal_phi.data(),
1461 nExteriorElementBoundaries_global,
1462 exteriorElementBoundariesArray.data(),
1463 elementBoundaryElementsArray.data(),
1464 elementBoundaryLocalElementBoundariesArray.data(),
1473 elementConstantResidual=0.0;
1474 for (
int i=0;i<nDOF_test_element;i++)
1476 elementConstantResidual += elementResidual_u[i];
1478 resNorm = fabs(elementConstantResidual);
1483 while (resNorm >= atol && its < maxIts)
1487 mesh_grad_trial_ref.data(),
1492 u_grad_trial_ref.data(),
1494 u_grad_test_ref.data(),
1495 mesh_trial_trace_ref.data(),
1496 mesh_grad_trial_trace_ref.data(),
1498 u_trial_trace_ref.data(),
1499 u_grad_trial_trace_ref.data(),
1500 u_test_trace_ref.data(),
1501 u_grad_test_trace_ref.data(),
1503 boundaryJac_ref.data(),
1510 elementDiameter.data(),
1511 nodeDiametersArray.data(),
1514 q_normal_phi.data(),
1517 elementJacobian_u_u,
1521 elementConstantJacobian=0.0;
1522 for (
int i=0;i<nDOF_test_element;i++)
1524 for (
int j=0;j<nDOF_test_element;j++)
1526 elementConstantJacobian += elementJacobian_u_u[i*nDOF_trial_element+j];
1529 std::cout<<
"elementConstantJacobian "<<elementConstantJacobian<<std::endl;
1531 elementConstant_u -= elementConstantResidual/(elementConstantJacobian+1.0e-8);
1532 for (
int i=0;i<nDOF_test_element;i++)
1534 element_u[i] = elementConstant_u;
1538 mesh_grad_trial_ref.data(),
1543 u_grad_trial_ref.data(),
1545 u_grad_test_ref.data(),
1546 mesh_trial_trace_ref.data(),
1547 mesh_grad_trial_trace_ref.data(),
1549 u_trial_trace_ref.data(),
1550 u_grad_trial_trace_ref.data(),
1551 u_test_trace_ref.data(),
1552 u_grad_test_trace_ref.data(),
1554 boundaryJac_ref.data(),
1562 elementDiameter.data(),
1563 nodeDiametersArray.data(),
1566 q_normal_phi.data(),
1568 ebqe_normal_phi.data(),
1578 nExteriorElementBoundaries_global,
1579 exteriorElementBoundariesArray.data(),
1580 elementBoundaryElementsArray.data(),
1581 elementBoundaryLocalElementBoundariesArray.data(),
1590 elementConstantResidual=0.0;
1591 for (
int i=0;i<nDOF_test_element;i++)
1593 elementConstantResidual += elementResidual_u[i];
1595 resNorm = fabs(elementConstantResidual);
1596 std::cout<<
"resNorm["<<its<<
"] "<<resNorm<<std::endl;
1603 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1604 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1605 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1606 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1607 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1608 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1609 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1610 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1611 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1612 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1613 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1614 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
1615 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1616 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1617 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1618 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1619 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
1620 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1621 int nElements_owned = args.
scalar<
int>(
"nElements_owned");
1622 double useMetrics = args.
scalar<
double>(
"useMetrics");
1623 double epsFactHeaviside = args.
scalar<
double>(
"epsFactHeaviside");
1624 double epsFactDirac = args.
scalar<
double>(
"epsFactDirac");
1625 double epsFactDiffusion = args.
scalar<
double>(
"epsFactDiffusion");
1626 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1627 xt::pyarray<int>& r_l2g = args.
array<
int>(
"r_l2g");
1628 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1629 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
1630 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1631 xt::pyarray<double>& q_phi = args.
array<
double>(
"q_phi");
1632 xt::pyarray<double>& q_normal_phi = args.
array<
double>(
"q_normal_phi");
1633 xt::pyarray<double>& ebqe_phi = args.
array<
double>(
"ebqe_phi");
1634 xt::pyarray<double>& ebqe_normal_phi = args.
array<
double>(
"ebqe_normal_phi");
1635 xt::pyarray<double>& q_H = args.
array<
double>(
"q_H");
1636 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
1637 xt::pyarray<double>& q_n = args.
array<
double>(
"q_n");
1638 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
1639 xt::pyarray<double>& ebqe_n = args.
array<
double>(
"ebqe_n");
1640 xt::pyarray<double>& q_r = args.
array<
double>(
"q_r");
1641 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
1642 int offset_u = args.
scalar<
int>(
"offset_u");
1643 int stride_u = args.
scalar<
int>(
"stride_u");
1644 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
1645 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1646 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1647 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1648 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1649 const xt::pyarray<double>& phi_solid = args.
array<
double>(
"phi_solid");
1650 xt::pyarray<double>& isActiveR = args.
array<
double>(
"isActiveR");
1651 xt::pyarray<double>& isActiveDOF = args.
array<
double>(
"isActiveDOF");
1652 xt::pyarray<int>& isActiveElement = args.
array<
int>(
"isActiveElement");
1653 int maxIts = args.
scalar<
int>(
"maxIts");
1654 double atol = args.
scalar<
double>(
"atol");
1655 double constant_u = args.
scalar<
double>(
"constant_u");
1656 double element_u[nDOF_test_element],
1657 elementResidual_u[nDOF_test_element],
1658 elementJacobian_u_u[nDOF_test_element*nDOF_trial_element];
1659 double constantResidual = 0.0;
1660 double constantJacobian = 0.0;
1661 for (
int i=0;i<nDOF_trial_element;i++)
1663 element_u[i]=constant_u;
1666 for(
int eN=0;eN<nElements_owned;eN++)
1668 bool element_active=
true;
1670 mesh_grad_trial_ref.data(),
1675 u_grad_trial_ref.data(),
1677 u_grad_test_ref.data(),
1678 mesh_trial_trace_ref.data(),
1679 mesh_grad_trial_trace_ref.data(),
1681 u_trial_trace_ref.data(),
1682 u_grad_trial_trace_ref.data(),
1683 u_test_trace_ref.data(),
1684 u_grad_test_trace_ref.data(),
1686 boundaryJac_ref.data(),
1694 elementDiameter.data(),
1695 nodeDiametersArray.data(),
1698 q_normal_phi.data(),
1700 ebqe_normal_phi.data(),
1710 nExteriorElementBoundaries_global,
1711 exteriorElementBoundariesArray.data(),
1712 elementBoundaryElementsArray.data(),
1713 elementBoundaryLocalElementBoundariesArray.data(),
1722 for (
int i=0;i<nDOF_test_element;i++)
1724 constantResidual += elementResidual_u[i];
1727 mesh_grad_trial_ref.data(),
1732 u_grad_trial_ref.data(),
1734 u_grad_test_ref.data(),
1735 mesh_trial_trace_ref.data(),
1736 mesh_grad_trial_trace_ref.data(),
1738 u_trial_trace_ref.data(),
1739 u_grad_trial_trace_ref.data(),
1740 u_test_trace_ref.data(),
1741 u_grad_test_trace_ref.data(),
1743 boundaryJac_ref.data(),
1750 elementDiameter.data(),
1751 nodeDiametersArray.data(),
1754 q_normal_phi.data(),
1757 elementJacobian_u_u,
1761 for (
int i=0;i<nDOF_test_element;i++)
1763 for (
int j=0;j<nDOF_test_element;j++)
1765 constantJacobian += elementJacobian_u_u[i*nDOF_trial_element+j];
1769 return std::tuple<double, double>(constantResidual, constantJacobian);
1775 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1776 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1777 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1778 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1779 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
1780 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1781 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1782 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1783 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1784 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1785 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1786 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1787 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
1788 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1789 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1790 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1791 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1792 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
1793 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1794 int nElements_owned = args.
scalar<
int>(
"nElements_owned");
1795 double useMetrics = args.
scalar<
double>(
"useMetrics");
1796 double epsFactHeaviside = args.
scalar<
double>(
"epsFactHeaviside");
1797 double epsFactDirac = args.
scalar<
double>(
"epsFactDirac");
1798 double epsFactDiffusion = args.
scalar<
double>(
"epsFactDiffusion");
1799 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
1800 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1801 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
1802 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
1803 xt::pyarray<double>& phi_dof = args.
array<
double>(
"phi_dof");
1804 xt::pyarray<double>& q_phi = args.
array<
double>(
"q_phi");
1805 xt::pyarray<double>& q_normal_phi = args.
array<
double>(
"q_normal_phi");
1806 xt::pyarray<double>& ebqe_phi = args.
array<
double>(
"ebqe_phi");
1807 xt::pyarray<double>& ebqe_normal_phi = args.
array<
double>(
"ebqe_normal_phi");
1808 xt::pyarray<double>& q_H = args.
array<
double>(
"q_H");
1809 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
1810 xt::pyarray<double>& q_n = args.
array<
double>(
"q_n");
1811 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
1812 xt::pyarray<double>& ebqe_n = args.
array<
double>(
"ebqe_n");
1813 xt::pyarray<double>& q_r = args.
array<
double>(
"q_r");
1814 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
1815 int offset_u = args.
scalar<
int>(
"offset_u");
1816 int stride_u = args.
scalar<
int>(
"stride_u");
1817 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
1818 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1819 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1820 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1821 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1822 const xt::pyarray<double>& phi_solid = args.
array<
double>(
"phi_solid");
1823 xt::pyarray<double>& phi_solid_nodes = args.
array<
double>(
"phi_solid_nodes");
1824 bool useExact_s = args.
scalar<
int>(
"useExact_s");
1825 double globalMass = 0.0;
1828 for(
int eN=0;eN<nElements_owned;eN++)
1830 double epsHeaviside;
1833 double element_phi[nDOF_trial_element],element_phi_s[nDOF_trial_element];
1834 for (
int i=0;i<nDOF_test_element;i++)
1836 int eN_i=eN*nDOF_test_element+i;
1837 element_phi[i] = phi_dof.data()[u_l2g.data()[eN_i]];
1838 element_phi_s[i] = phi_solid_nodes.data()[u_l2g.data()[eN_i]];
1840 double element_nodes[nDOF_mesh_trial_element*3];
1841 for (
int i=0;i<nDOF_mesh_trial_element;i++)
1843 int eN_i=eN*nDOF_mesh_trial_element+i;
1844 for(
int I=0;I<3;I++)
1845 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
1847 gf.
calculate(element_phi, element_nodes, x_ref.data(),
false);
1848 int icase_s =
gf_s.
calculate(element_phi_s, element_nodes, x_ref.data(),
false);
1849 for (
int k=0;k<nQuadraturePoints_element;k++)
1852 int eN_k = eN*nQuadraturePoints_element+k,
1853 eN_k_nSpace = eN_k*nSpace;
1856 double jac[nSpace*nSpace],
1858 jacInv[nSpace*nSpace],
1863 G[nSpace*nSpace],G_dd_G,tr_G,h_phi;
1869 ck.calculateMapping_element(eN,
1873 mesh_trial_ref.data(),
1874 mesh_grad_trial_ref.data(),
1879 ck.calculateH_element(eN,
1881 nodeDiametersArray.data(),
1883 mesh_trial_ref.data(),
1886 dV = fabs(jacDet)*dV_ref.data()[k];
1887 ck.calculateG(jacInv,G,G_dd_G,tr_G);
1896 epsHeaviside=epsFactHeaviside*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter.data()[eN]);
1897 globalMass +=
gf_s.
H(epsHeaviside,phi_solid.data()[eN_k])*q_porosity[eN_k]*
gf.
H(epsHeaviside,q_phi.data()[eN_k])*dV;
1906 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
1907 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
1908 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
1909 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
1910 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
1911 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
1912 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
1913 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
1914 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
1915 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
1916 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
1917 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
1918 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
1919 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
1920 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
1921 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
1922 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
1923 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
1924 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
1925 int nElements_global = args.
scalar<
int>(
"nElements_global");
1926 double useMetrics = args.
scalar<
double>(
"useMetrics");
1927 double epsFactHeaviside = args.
scalar<
double>(
"epsFactHeaviside");
1928 double epsFactDirac = args.
scalar<
double>(
"epsFactDirac");
1929 double epsFactDiffusion = args.
scalar<
double>(
"epsFactDiffusion");
1930 xt::pyarray<int>& phi_l2g = args.
array<
int>(
"phi_l2g");
1931 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
1932 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
1933 xt::pyarray<double>& phi_dof = args.
array<
double>(
"phi_dof");
1934 xt::pyarray<double>& q_phi = args.
array<
double>(
"q_phi");
1935 xt::pyarray<double>& q_normal_phi = args.
array<
double>(
"q_normal_phi");
1936 xt::pyarray<double>& ebqe_phi = args.
array<
double>(
"ebqe_phi");
1937 xt::pyarray<double>& ebqe_normal_phi = args.
array<
double>(
"ebqe_normal_phi");
1938 xt::pyarray<double>& q_H = args.
array<
double>(
"q_H");
1939 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
1940 xt::pyarray<double>& q_n = args.
array<
double>(
"q_n");
1941 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
1942 xt::pyarray<double>& ebqe_n = args.
array<
double>(
"ebqe_n");
1943 xt::pyarray<double>& q_r = args.
array<
double>(
"q_r");
1944 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
1945 int offset_u = args.
scalar<
int>(
"offset_u");
1946 int stride_u = args.
scalar<
int>(
"stride_u");
1947 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
1948 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
1949 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
1950 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
1951 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
1952 xt::pyarray<double>& H_dof = args.
array<
double>(
"H_dof");
1955 for(
int eN=0;eN<nElements_global;eN++)
1957 double epsHeaviside;
1960 double element_phi[nDOF_trial_element];
1961 for (
int i=0;i<nDOF_test_element;i++)
1963 int eN_i=eN*nDOF_test_element+i;
1964 element_phi[i] = phi_dof.data()[phi_l2g.data()[eN_i]];
1966 double element_nodes[nDOF_mesh_trial_element*3];
1967 for (
int i=0;i<nDOF_mesh_trial_element;i++)
1969 int eN_i=eN*nDOF_mesh_trial_element+i;
1970 for(
int I=0;I<3;I++)
1971 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
1973 gf.
calculate(element_phi, element_nodes, x_ref.data(),
false);
1975 for (
int k=0;k<nQuadraturePoints_element;k++)
1978 int eN_k = eN*nQuadraturePoints_element+k,
1979 eN_k_nSpace = eN_k*nSpace;
1982 double jac[nSpace*nSpace],
1984 jacInv[nSpace*nSpace],
1989 G[nSpace*nSpace],G_dd_G,tr_G,h_phi;
1994 ck.calculateMapping_element(eN,
1998 mesh_trial_ref.data(),
1999 mesh_grad_trial_ref.data(),
2004 ck.calculateH_element(eN,
2006 nodeDiametersArray.data(),
2008 mesh_trial_ref.data(),
2011 dV = fabs(jacDet)*dV_ref.data()[k];
2012 ck.calculateG(jacInv,G,G_dd_G,tr_G);
2023 epsHeaviside=epsFactHeaviside*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter.data()[eN]);
2024 q_H.data()[eN_k] =
gf.
H(epsHeaviside,q_phi.data()[eN_k]);
2027 for (
int i=0;i<nDOF_trial_element;i++)
2030 int eN_i = eN*nDOF_trial_element + i;
2031 int gi = phi_l2g.data()[eN_i];
2032 epsHeaviside = epsFactHeaviside*nodeDiametersArray.data()[mesh_l2g.data()[eN_i]];
2033 H_dof.data() [gi] =
gf_nodes.
H(epsHeaviside,phi_dof.data()[gi]);
2118 double* mesh_trial_ref,
2119 double* mesh_grad_trial_ref,
2123 double* u_trial_ref,
2124 double* u_grad_trial_ref,
2126 double* u_grad_test_ref,
2128 double* mesh_trial_trace_ref,
2129 double* mesh_grad_trial_trace_ref,
2131 double* u_trial_trace_ref,
2132 double* u_grad_trial_trace_ref,
2133 double* u_test_trace_ref,
2134 double* u_grad_test_trace_ref,
2136 double* boundaryJac_ref,
2138 int nElements_global,
2140 double epsFactHeaviside,
2141 double epsFactDirac,
2142 double epsFactDiffusion,
2144 double* elementDiameter,
2145 double* nodeDiametersArray,
2152 double* q_normal_phi,
2155 double* elementMassMatrix,
2156 double* elementLumpedMassMatrix,
2160 for (
int i=0;i<nDOF_test_element;i++)
2162 elementLumpedMassMatrix[i] = 0.0;
2163 for (
int j=0;j<nDOF_trial_element;j++)
2165 elementMassMatrix[i*nDOF_trial_element+j]=0.0;
2168 double epsHeaviside,epsDirac,epsDiffusion;
2169 for (
int k=0;k<nQuadraturePoints_element;k++)
2171 int eN_k = eN*nQuadraturePoints_element+k,
2172 eN_k_nSpace = eN_k*nSpace;
2181 jacInv[nSpace*nSpace],
2182 u_grad_trial[nDOF_trial_element*nSpace],
2184 u_test_dV[nDOF_test_element],
2185 u_grad_test_dV[nDOF_test_element*nSpace],
2187 G[nSpace*nSpace],G_dd_G,tr_G,h_phi;
2191 ck.calculateMapping_element(eN,
2196 mesh_grad_trial_ref,
2201 ck.calculateH_element(eN,
2208 dV = fabs(jacDet)*dV_ref[k];
2209 ck.calculateG(jacInv,G,G_dd_G,tr_G);
2222 ck.gradTrialFromRef(&u_grad_trial_ref[k*nDOF_trial_element*nSpace],jacInv,u_grad_trial);
2224 ck.valFromElementDOF(element_u,&u_trial_ref[k*nDOF_trial_element],
u);
2226 ck.gradFromElementDOF(element_u,u_grad_trial,grad_u);
2228 for (
int j=0;j<nDOF_trial_element;j++)
2230 u_test_dV[j] = u_test_ref[k*nDOF_trial_element+j]*dV;
2231 for (
int I=0;I<nSpace;I++)
2233 u_grad_test_dV[j*nSpace+I] = u_grad_trial[j*nSpace+I]*dV;
2239 epsHeaviside=epsFactHeaviside*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
2240 epsDirac =epsFactDirac* (useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
2241 epsDiffusion=epsFactDiffusion*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
2251 for(
int i=0;i<nDOF_test_element;i++)
2255 elementLumpedMassMatrix[i] += u_test_dV[i];
2256 for(
int j=0;j<nDOF_trial_element;j++)
2258 elementMassMatrix[i*nDOF_trial_element+j] += u_trial_ref[k*nDOF_trial_element+j]*u_test_dV[i];
2266 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
2267 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
2268 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
2269 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
2270 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
2271 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
2272 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
2273 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
2274 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
2275 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
2276 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
2277 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
2278 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
2279 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
2280 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
2281 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
2282 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
2283 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
2284 int nElements_global = args.
scalar<
int>(
"nElements_global");
2285 double useMetrics = args.
scalar<
double>(
"useMetrics");
2286 double epsFactHeaviside = args.
scalar<
double>(
"epsFactHeaviside");
2287 double epsFactDirac = args.
scalar<
double>(
"epsFactDirac");
2288 double epsFactDiffusion = args.
scalar<
double>(
"epsFactDiffusion");
2289 xt::pyarray<int>& u_l2g = args.
array<
int>(
"u_l2g");
2290 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
2291 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
2292 xt::pyarray<double>& u_dof = args.
array<
double>(
"u_dof");
2293 xt::pyarray<double>& q_phi = args.
array<
double>(
"q_phi");
2294 xt::pyarray<double>& q_normal_phi = args.
array<
double>(
"q_normal_phi");
2295 xt::pyarray<double>& q_H = args.
array<
double>(
"q_H");
2296 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
2297 xt::pyarray<int>& csrRowIndeces_u_u = args.
array<
int>(
"csrRowIndeces_u_u");
2298 xt::pyarray<int>& csrColumnOffsets_u_u = args.
array<
int>(
"csrColumnOffsets_u_u");
2299 xt::pyarray<double>& globalMassMatrix = args.
array<
double>(
"globalMassMatrix");
2300 xt::pyarray<double>& globalLumpedMassMatrix = args.
array<
double>(
"globalLumpedMassMatrix");
2304 for(
int eN=0;eN<nElements_global;eN++)
2306 double elementMassMatrix[nDOF_test_element*nDOF_trial_element],element_u[nDOF_trial_element], elementLumpedMassMatrix[nDOF_trial_element];
2307 for (
int j=0;j<nDOF_trial_element;j++)
2309 int eN_j = eN*nDOF_trial_element+j;
2310 element_u[j] = u_dof.data()[u_l2g.data()[eN_j]];
2313 mesh_grad_trial_ref.data(),
2318 u_grad_trial_ref.data(),
2320 u_grad_test_ref.data(),
2321 mesh_trial_trace_ref.data(),
2322 mesh_grad_trial_trace_ref.data(),
2324 u_trial_trace_ref.data(),
2325 u_grad_trial_trace_ref.data(),
2326 u_test_trace_ref.data(),
2327 u_grad_test_trace_ref.data(),
2329 boundaryJac_ref.data(),
2336 elementDiameter.data(),
2337 nodeDiametersArray.data(),
2340 q_normal_phi.data(),
2344 elementLumpedMassMatrix,
2350 for (
int i=0;i<nDOF_test_element;i++)
2352 int eN_i = eN*nDOF_test_element+i;
2353 int gi = u_l2g.data()[eN_i];
2354 globalLumpedMassMatrix.data()[gi] += elementLumpedMassMatrix[i];
2355 for (
int j=0;j<nDOF_trial_element;j++)
2357 int eN_i_j = eN_i*nDOF_trial_element+j;
2358 globalMassMatrix.data()[csrRowIndeces_u_u.data()[eN_i] + csrColumnOffsets_u_u.data()[eN_i_j]] +=
2359 elementMassMatrix[i*nDOF_trial_element+j];
2368 xt::pyarray<double>& mesh_trial_ref = args.
array<
double>(
"mesh_trial_ref");
2369 xt::pyarray<double>& mesh_grad_trial_ref = args.
array<
double>(
"mesh_grad_trial_ref");
2370 xt::pyarray<double>& mesh_dof = args.
array<
double>(
"mesh_dof");
2371 xt::pyarray<int>& mesh_l2g = args.
array<
int>(
"mesh_l2g");
2372 xt::pyarray<double>& x_ref = args.
array<
double>(
"x_ref");
2373 xt::pyarray<double>& dV_ref = args.
array<
double>(
"dV_ref");
2374 xt::pyarray<double>& u_trial_ref = args.
array<
double>(
"u_trial_ref");
2375 xt::pyarray<double>& u_grad_trial_ref = args.
array<
double>(
"u_grad_trial_ref");
2376 xt::pyarray<double>& u_test_ref = args.
array<
double>(
"u_test_ref");
2377 xt::pyarray<double>& u_grad_test_ref = args.
array<
double>(
"u_grad_test_ref");
2378 xt::pyarray<double>& mesh_trial_trace_ref = args.
array<
double>(
"mesh_trial_trace_ref");
2379 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.
array<
double>(
"mesh_grad_trial_trace_ref");
2380 xt::pyarray<double>& dS_ref = args.
array<
double>(
"dS_ref");
2381 xt::pyarray<double>& u_trial_trace_ref = args.
array<
double>(
"u_trial_trace_ref");
2382 xt::pyarray<double>& u_grad_trial_trace_ref = args.
array<
double>(
"u_grad_trial_trace_ref");
2383 xt::pyarray<double>& u_test_trace_ref = args.
array<
double>(
"u_test_trace_ref");
2384 xt::pyarray<double>& u_grad_test_trace_ref = args.
array<
double>(
"u_grad_test_trace_ref");
2385 xt::pyarray<double>& normal_ref = args.
array<
double>(
"normal_ref");
2386 xt::pyarray<double>& boundaryJac_ref = args.
array<
double>(
"boundaryJac_ref");
2387 int nElements_global = args.
scalar<
int>(
"nElements_global");
2388 double useMetrics = args.
scalar<
double>(
"useMetrics");
2389 double epsFactHeaviside = args.
scalar<
double>(
"epsFactHeaviside");
2390 double epsFactDirac = args.
scalar<
double>(
"epsFactDirac");
2391 double epsFactDiffusion = args.
scalar<
double>(
"epsFactDiffusion");
2392 xt::pyarray<int>& phi_l2g = args.
array<
int>(
"phi_l2g");
2393 xt::pyarray<double>& elementDiameter = args.
array<
double>(
"elementDiameter");
2394 xt::pyarray<double>& nodeDiametersArray = args.
array<
double>(
"nodeDiametersArray");
2395 xt::pyarray<double>& phi_dof = args.
array<
double>(
"phi_dof");
2396 xt::pyarray<double>& q_phi = args.
array<
double>(
"q_phi");
2397 xt::pyarray<double>& q_normal_phi = args.
array<
double>(
"q_normal_phi");
2398 xt::pyarray<double>& ebqe_phi = args.
array<
double>(
"ebqe_phi");
2399 xt::pyarray<double>& ebqe_normal_phi = args.
array<
double>(
"ebqe_normal_phi");
2400 xt::pyarray<double>& q_H = args.
array<
double>(
"q_H");
2401 xt::pyarray<double>& q_u = args.
array<
double>(
"q_u");
2402 xt::pyarray<double>& q_n = args.
array<
double>(
"q_n");
2403 xt::pyarray<double>& ebqe_u = args.
array<
double>(
"ebqe_u");
2404 xt::pyarray<double>& ebqe_n = args.
array<
double>(
"ebqe_n");
2405 xt::pyarray<double>& q_r = args.
array<
double>(
"q_r");
2406 xt::pyarray<double>& q_porosity = args.
array<
double>(
"q_porosity");
2407 int offset_u = args.
scalar<
int>(
"offset_u");
2408 int stride_u = args.
scalar<
int>(
"stride_u");
2409 xt::pyarray<double>& globalResidual = args.
array<
double>(
"globalResidual");
2410 int nExteriorElementBoundaries_global = args.
scalar<
int>(
"nExteriorElementBoundaries_global");
2411 xt::pyarray<int>& exteriorElementBoundariesArray = args.
array<
int>(
"exteriorElementBoundariesArray");
2412 xt::pyarray<int>& elementBoundaryElementsArray = args.
array<
int>(
"elementBoundaryElementsArray");
2413 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.
array<
int>(
"elementBoundaryLocalElementBoundariesArray");
2414 xt::pyarray<double>& rhs_mass_correction = args.
array<
double>(
"rhs_mass_correction");
2415 xt::pyarray<double>& lumped_L2p_vof_mass_correction = args.
array<
double>(
"lumped_L2p_vof_mass_correction");
2416 xt::pyarray<double>& lumped_mass_matrix = args.
array<
double>(
"lumped_mass_matrix");
2417 int numDOFs = args.
scalar<
int>(
"numDOFs");
2419 for(
int eN=0;eN<nElements_global;eN++)
2421 double element_rhs_mass_correction[nDOF_test_element];
2422 for (
int i=0;i<nDOF_test_element;i++)
2423 element_rhs_mass_correction[i] = 0.;
2424 double epsHeaviside;
2426 double element_phi[nDOF_trial_element];
2427 for (
int i=0;i<nDOF_test_element;i++)
2429 int eN_i=eN*nDOF_test_element+i;
2430 element_phi[i] = phi_dof.data()[phi_l2g.data()[eN_i]];
2432 double element_nodes[nDOF_mesh_trial_element*3];
2433 for (
int i=0;i<nDOF_mesh_trial_element;i++)
2435 int eN_i=eN*nDOF_mesh_trial_element+i;
2436 for(
int I=0;I<3;I++)
2437 element_nodes[i*3 + I] = mesh_dof.data()[mesh_l2g.data()[eN_i]*3 + I];
2439 gf.
calculate(element_phi, element_nodes, x_ref.data(),
false);
2440 for (
int k=0;k<nQuadraturePoints_element;k++)
2443 int eN_k = eN*nQuadraturePoints_element+k,
2444 eN_k_nSpace = eN_k*nSpace;
2447 double jac[nSpace*nSpace],
2449 jacInv[nSpace*nSpace],
2454 u_test_dV[nDOF_test_element],
2455 G[nSpace*nSpace],G_dd_G,tr_G,h_phi;
2458 ck.calculateMapping_element(eN,
2462 mesh_trial_ref.data(),
2463 mesh_grad_trial_ref.data(),
2468 ck.calculateH_element(eN,
2470 nodeDiametersArray.data(),
2472 mesh_trial_ref.data(),
2475 dV = fabs(jacDet)*dV_ref.data()[k];
2476 ck.calculateG(jacInv,G,G_dd_G,tr_G);
2479 for (
int j=0;j<nDOF_trial_element;j++)
2480 u_test_dV[j] = u_test_ref.data()[k*nDOF_trial_element+j]*dV;
2491 epsHeaviside=epsFactHeaviside*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter.data()[eN]);
2492 q_H.data()[eN_k] =
gf.
H(epsHeaviside,q_phi.data()[eN_k]);
2494 for (
int i=0;i<nDOF_trial_element;i++)
2495 element_rhs_mass_correction [i] += q_porosity.data()[eN_k]*q_H.data()[eN_k]*u_test_dV[i];
2498 for (
int i=0;i<nDOF_trial_element;i++)
2500 int eN_i = eN*nDOF_trial_element + i;
2501 int gi = phi_l2g.data()[eN_i];
2502 rhs_mass_correction.data()[gi] += element_rhs_mass_correction[i];
2506 for (
int i=0; i<numDOFs; i++)
2508 double mi = lumped_mass_matrix.data()[i];
2509 lumped_L2p_vof_mass_correction.data()[i] = 1./mi*rhs_mass_correction.data()[i];