9#include <MethodForForceScaling.hpp>
16 double *N_face,
double *N_edge[],
17 double *
t,
double *t_edge[],
18 double *t_face,
double *traction,
int gg);
20 int order,
int *order_edge,
double *
N,
double *N_face,
double *N_edge[],
21 double *diffN,
double *diffN_face,
double *diffN_edge[],
double *
t,
22 double *t_edge[],
double *t_face,
double *dofs_x,
double *dofs_x_edge[],
23 double *dofs_x_face,
double *idofs_x,
double *idofs_x_edge[],
24 double *idofs_x_face,
double *Fext,
double *Fext_egde[],
double *Fext_face,
25 double *iFext,
double *iFext_egde[],
double *iFext_face,
int g_dim,
28 double eps,
int order,
int *order_edge,
double *
N,
double *N_face,
29 double *N_edge[],
double *diffN,
double *diffN_face,
double *diffN_edge[],
30 double *
t,
double *t_edge[],
double *t_face,
double *dofs_x,
31 double *dofs_x_edge[],
double *dofs_x_face,
double *KExt_hh,
32 double *KExt_egdeh[3],
double *KExt_faceh,
int g_dim,
const double *g_w);
34 double eps,
int order,
int *order_edge,
double *
N,
double *N_face,
35 double *N_edge[],
double *diffN,
double *diffN_face,
double *diffN_edge[],
36 double *
t,
double *t_edge[],
double *t_face,
double *dofs_x,
37 double *dofs_x_edge[],
double *dofs_x_face,
double *Khext_edge[3],
38 double *KExt_edgeegde[3][3],
double *KExt_faceedge[3],
int g_dim,
42 double *N_face,
double *N_edge[],
double *diffN,
43 double *diffN_face,
double *diffN_edge[],
double *
t,
44 double *t_edge[],
double *t_face,
double *dofs_x,
45 double *dofs_x_edge[],
double *dofs_x_face,
46 double *KExt_hface,
double *KExt_egdeface[3],
47 double *KExt_faceface,
int g_dim,
const double *g_w);
50 double circumcenter[3],
double *xi,
double *
eta,
53 double circumcenter[3],
double *xi,
double *
eta);
74 "it should be 9 dofs on vertices but is %ld of field < %s >",
77 myPtr->N = &*data.
getN().data().begin();
78 myPtr->diffN = &*data.
getDiffN().data().begin();
81 myPtr->dofs_x = &*myPtr->dOfs_x.data().begin();
82 myPtr->dOfs_x_indices.resize(data.
getIndices().size());
83 ublas::noalias(myPtr->dOfs_x_indices) = data.
getIndices();
84 myPtr->dofs_x_indices = &*myPtr->dOfs_x_indices.data().begin();
87 myPtr->order_edge[side] = data.
getOrder();
88 myPtr->N_edge[side] = &*data.
getN().data().begin();
89 myPtr->diffN_edge[side] = &*data.
getDiffN().data().begin();
90 myPtr->dOfs_x_edge.resize(3);
91 myPtr->dOfs_x_edge[side].resize(data.
getFieldData().size());
92 myPtr->dofs_x_edge[side] = &*myPtr->dOfs_x_edge[side].data().begin();
93 myPtr->dOfs_x_edge_indices.resize(3);
94 myPtr->dOfs_x_edge_indices[side].resize(data.
getIndices().size());
95 ublas::noalias(myPtr->dOfs_x_edge_indices[side]) = data.
getIndices();
96 myPtr->dofs_x_edge_indices[side] =
97 &*myPtr->dOfs_x_edge_indices[side].data().begin();
100 myPtr->order_face = data.
getOrder();
101 myPtr->N_face = &*data.
getN().data().begin();
102 myPtr->diffN_face = &*data.
getDiffN().data().begin();
104 ublas::noalias(myPtr->dOfs_x_face) = data.
getFieldData();
105 myPtr->dofs_x_face = &*myPtr->dOfs_x_face.data().begin();
106 myPtr->dOfs_x_face_indices.resize(data.
getIndices().size());
107 ublas::noalias(myPtr->dOfs_x_face_indices) = data.
getIndices();
108 myPtr->dofs_x_face_indices = &*myPtr->dOfs_x_face_indices.data().begin();
111 SETERRQ(PETSC_COMM_SELF, 1,
"unknown entity type");
125 "it should be 9 dofs on vertices but is %ld",
128 if (data.
getN().size2() != 3) {
130 "it should 3 shape functions for 3 nodes");
132 myPtr->N = &*data.
getN().data().begin();
133 myPtr->diffN = &*data.
getDiffN().data().begin();
134 myPtr->dOfs_X_indices.resize(data.
getIndices().size());
135 ublas::noalias(myPtr->dOfs_X_indices) = data.
getIndices();
136 myPtr->dofs_X_indices = &*myPtr->dOfs_X_indices.data().begin();
139 myPtr->dofs_X = &*myPtr->dOfs_X.data().begin();
142 myPtr->order_edge_material[side] = data.
getOrder();
143 myPtr->dOfs_X_edge.resize(3);
144 myPtr->dOfs_X_edge[side].resize(data.
getFieldData().size());
145 ublas::noalias(myPtr->dOfs_X_edge[side]) = data.
getFieldData();
146 myPtr->dofs_X_edge[side] = &*myPtr->dOfs_X_edge[side].data().begin();
149 myPtr->order_face_material = data.
getOrder();
151 ublas::noalias(myPtr->dOfs_X_face) = data.
getFieldData();
152 myPtr->dofs_X_face = &*myPtr->dOfs_X_face.data().begin();
155 SETERRQ(PETSC_COMM_SELF, 1,
"unknown entity type");
163 double *scale_rhs, std::string spatial_field_name,
164 std::string mat_field_name)
166 sCaleRhs(scale_rhs), typeOfForces(CONSERVATIVE),
eps(1e-8), uSeF(false) {
178 getOpPtrVector().push_back(new AuxMethodMaterial(
179 mat_field_name, this, ForcesAndSourcesCore::UserDataOperator::OPROW));
182 spatial_field_name,
this, ForcesAndSourcesCore::UserDataOperator::OPROW));
188 auto &dataH1 = *dataOnElement[
H1];
191 fExtFace.resize(dataH1.dataOnEntities[MBTRI][0].getFieldData().size());
193 for (
int ee = 0; ee < 3; ee++) {
194 int nb_edge_dofs = dOfs_x_edge_indices[ee].size();
195 if (nb_edge_dofs > 0) {
196 fExtEdge[ee].resize(nb_edge_dofs);
197 Fext_edge[ee] = &*fExtEdge[ee].data().begin();
199 Fext_edge[ee] = NULL;
203 switch (typeOfForces) {
206 order_face, order_edge,
207 N, N_face, N_edge, diffN, diffN_face, diffN_edge,
209 dofs_x, dofs_x_edge, dofs_x_face,
211 &*fExtNode.data().begin(), Fext_edge, &*fExtFace.data().begin(),
213 gaussPts.size2(), &gaussPts(2, 0));
215 case NONCONSERVATIVE:
216 for (
int ee = 0; ee < 3; ee++) {
217 dOfs_X_edge.resize(3);
218 unsigned int s = dOfs_X_edge[ee].size();
219 dOfs_X_edge[ee].resize(dOfs_x_edge[ee].size(),
true);
220 for (; s < dOfs_X_edge[ee].size(); s++) {
221 dOfs_X_edge[ee][s] = 0;
223 dofs_X_edge[ee] = &*dOfs_X_edge[ee].data().begin();
225 unsigned int s = dOfs_X_face.size();
226 dOfs_X_face.resize(dOfs_x_face.size(),
true);
227 for (; s < dOfs_X_face.size(); s++) {
230 dofs_X_face = &*dOfs_X_face.data().begin();
233 order_face, order_edge,
234 N, N_face, N_edge, diffN, diffN_face, diffN_edge,
236 dofs_X, dofs_X_edge, dofs_X_face,
238 &*fExtNode.data().begin(), Fext_edge, &*fExtFace.data().begin(),
240 gaussPts.size2(), &gaussPts(2, 0));
250 if (dOfs_x_face_indices.size() > 0) {
252 &*fExtFace.data().begin(), ADD_VALUES);
254 for (
int ee = 0; ee < 3; ee++) {
255 if (dOfs_x_edge_indices[ee].size() > 0) {
257 dofs_x_edge_indices[ee], Fext_edge[ee], ADD_VALUES);
267 if (typeOfForces == NONCONSERVATIVE) {
271 auto &dataH1 = *dataOnElement[
H1];
276 cblas_daxpy(3, -1, &coords.data()[0], 1, center, 1);
277 double r = cblas_dnrm2(3, center, 1);
279 kExtNodeNode.resize(9, 9);
280 kExtEdgeNode.resize(3);
281 for (
int ee = 0; ee < 3; ee++) {
282 kExtEdgeNode[ee].resize(dOfs_x_edge_indices[ee].size(), 9);
283 Kext_edge_node[ee] = &*kExtEdgeNode[ee].data().begin();
285 kExtFaceNode.resize(dOfs_x_face_indices.size(), 9);
287 r *
eps, order_face, order_edge,
N, N_face, N_edge, diffN, diffN_face,
288 diffN_edge, t_loc, NULL, NULL, dofs_x, dofs_x_edge, dofs_x_face,
289 &*kExtNodeNode.data().begin(), Kext_edge_node,
290 &*kExtFaceNode.data().begin(), gaussPts.size2(), &gaussPts(2, 0));
293 &*kExtNodeNode.data().begin(), ADD_VALUES);
295 dofs_x_indices, &*kExtFaceNode.data().begin(),
298 for (
int ee = 0; ee < 3; ee++) {
301 dofs_x_edge_indices[ee], 9, dofs_x_indices,
302 Kext_edge_node[ee], ADD_VALUES);
305 kExtNodeFace.resize(9, dOfs_x_face_indices.size());
306 kExtEdgeFace.resize(3);
307 for (
int ee = 0; ee < 3; ee++) {
308 kExtEdgeFace[ee].resize(
309 dOfs_x_edge_indices[ee].size(),
310 dataH1.dataOnEntities[MBTRI][0].getIndices().size());
311 Kext_edge_face[ee] = &*kExtEdgeFace[ee].data().begin();
313 kExtFaceFace.resize(dOfs_x_face_indices.size(), dOfs_x_face_indices.size());
315 r *
eps, order_face, order_edge,
N, N_face, N_edge, diffN, diffN_face,
316 diffN_edge, t_loc, NULL, NULL, dofs_x, dofs_x_edge, dofs_x_face,
317 &*kExtNodeFace.data().begin(), Kext_edge_face,
318 &*kExtFaceFace.data().begin(), gaussPts.size2(), &gaussPts(2, 0));
322 dofs_x_face_indices, &*kExtNodeFace.data().begin(),
325 kExtFaceFace.size2(), dofs_x_face_indices,
326 &*kExtFaceFace.data().begin(), ADD_VALUES);
327 for (
int ee = 0; ee < 3; ee++) {
330 dofs_x_edge_indices[ee], kExtFaceFace.size2(),
331 dofs_x_face_indices, Kext_edge_face[ee], ADD_VALUES);
334 kExtFaceEdge.resize(3);
335 kExtNodeEdge.resize(3);
336 kExtEdgeEdge.resize(3, 3);
337 for (
int ee = 0; ee < 3; ee++) {
338 if (dOfs_x_edge_indices[ee].size() !=
339 (
unsigned int)(3 *
NBEDGE_H1(order_edge[ee]))) {
340 SETERRQ(PETSC_COMM_SELF, 1,
"data inconsistency");
342 kExtFaceEdge[ee].resize(dOfs_x_face_indices.size(),
343 dOfs_x_edge_indices[ee].size());
344 kExtNodeEdge[ee].resize(9, dOfs_x_edge_indices[ee].size());
345 Kext_node_edge[ee] = &*kExtNodeEdge[ee].data().begin();
346 Kext_face_edge[ee] = &*kExtFaceEdge[ee].data().begin();
347 for (
int EE = 0; EE < 3; EE++) {
348 kExtEdgeEdge(EE, ee).resize(dOfs_x_edge_indices[EE].size(),
349 dOfs_x_edge_indices[ee].size());
350 Kext_edge_edge[EE][ee] = &*kExtEdgeEdge(EE, ee).data().begin();
354 r *
eps, order_face, order_edge,
N, N_face, N_edge, diffN, diffN_face,
355 diffN_edge, t_loc, NULL, NULL, dofs_x, dofs_x_edge, dofs_x_face,
356 Kext_node_edge, Kext_edge_edge, Kext_face_edge, gaussPts.size2(),
358 for (
int ee = 0; ee < 3; ee++) {
360 kExtFaceEdge[ee].size2(), dofs_x_edge_indices[ee],
361 &*kExtFaceEdge[ee].data().begin(), ADD_VALUES);
363 dofs_x_edge_indices[ee],
364 &*kExtNodeEdge[ee].data().begin(), ADD_VALUES);
365 for (
int EE = 0; EE < 3; EE++) {
367 dofs_x_edge_indices[EE], kExtEdgeEdge(EE, ee).size2(),
368 dofs_x_edge_indices[ee], Kext_edge_edge[EE][ee],
379 double s1[3], s2[3], normal[3], q[9];
381 double nrm2_normal = cblas_dnrm2(3, normal, 1);
382 cblas_dscal(3, 1. / nrm2_normal, normal, 1);
383 cblas_dcopy(3, s1, 1, &q[0], 1);
384 cblas_dcopy(3, s2, 1, &q[3], 1);
385 cblas_dcopy(3, normal, 1, &q[6], 1);
388 info =
lapack_dgesv(3, 3, q, 3, ipiv, &*t_glob_nodal.data().begin(), 3);
391 "error solve dgesv info = %d", info);
399 EntityHandle ent = numeredEntFiniteElementPtr->getEnt();
400 map<int, bCPressure>::iterator mip = mapPressure.begin();
402 tLoc[0] = tLoc[1] = tLoc[2] = 0;
403 for (; mip != mapPressure.end(); mip++) {
404 if (mip->second.tRis.find(ent) != mip->second.tRis.end()) {
405 tLoc[2] -= mip->second.data.data.value1;
408 tLocNodal.resize(3, 3);
409 for (
int nn = 0; nn < 3; nn++) {
410 for (
int dd = 0; dd < 3; dd++) {
411 tLocNodal(nn, dd) = tLoc[dd];
415 map<int, bCForce>::iterator mif = mapForce.begin();
416 for (; mif != mapForce.end(); mif++) {
417 if (mif->second.tRis.find(ent) != mif->second.tRis.end()) {
419 tGlob[0] = mif->second.data.data.value3;
420 tGlob[1] = mif->second.data.data.value4;
421 tGlob[2] = mif->second.data.data.value5;
422 tGlob *= mif->second.data.data.value1;
423 tGlobNodal.resize(3, 3);
424 for (
int nn = 0; nn < 3; nn++) {
425 for (
int dd = 0; dd < 3; dd++) {
426 tGlobNodal(nn, dd) = tGlob[dd];
429 CHKERR reBaseToFaceLoocalCoordSystem(tGlobNodal);
430 tLocNodal += tGlobNodal;
434 VectorDouble
scale(1, 1);
436 tLocNodal *=
scale[0];
438 t_loc = &*tLocNodal.data().begin();
447 "Surface Pressure (complex for lazy)",
"none");
448 PetscBool is_conservative = PETSC_TRUE;
449 CHKERR PetscOptionsBool(
"-is_conservative_force",
"is conservative force",
"",
450 PETSC_TRUE, &is_conservative, PETSC_NULLPTR);
451 if (is_conservative == PETSC_FALSE) {
452 typeOfForces = NONCONSERVATIVE;
466 dofs_X = &*coords.data().begin();
467 for (
int ee = 0; ee < 3; ee++) {
468 dofs_X_edge[ee] = NULL;
469 idofs_X_edge[ee] = NULL;
470 order_edge_material[ee] = 0;
474 order_face_material = 0;
476 dofs_x = &*coords.data().begin();
478 for (
int ee = 0; ee < 3; ee++) {
481 diffN_edge[ee] = NULL;
482 dofs_x_edge[ee] = NULL;
483 idofs_x_edge[ee] = NULL;
492 CHKERR FaceElementForcesAndSourcesCore::operator()();
497 case CTX_SNESSETFUNCTION: {
498 tLocNodal *= *sCaleRhs;
503 case CTX_SNESSETJACOBIAN: {
504 tLocNodal *= *sCaleLhs;
524 cubit_meshset_ptr->
meshset, MBTRI, mapForce[ms_id].tRis,
true);
540 cubit_meshset_ptr->
meshset, MBTRI, mapPressure[ms_id].tRis,
true);
546 std::string material_field_name)
548 spatial_field_name, material_field_name),
551 double def_scale = 1.;
554 "_LoadFactor_Scale_", 1, MB_TYPE_DOUBLE,
thScale,
555 MB_TAG_CREAT | MB_TAG_EXCL | MB_TAG_MESH, &def_scale);
556 if (
rval == MB_ALREADY_ALLOCATED) {
558 (
const void **)&
sCale);
566 (
const void **)&
sCale);
576 double *scale_rhs, std::string spatial_field_name,
577 std::string material_field_name)
578 : mField(m_field), feSpatial(m_field, _Aij,
_F, scale_lhs, scale_rhs,
579 spatial_field_name, material_field_name),
580 spatialField(spatial_field_name), materialField(material_field_name) {}
586 double *N_face,
double *N_edge[],
587 double *
t,
double *t_edge[],
588 double *t_face,
double *traction,
int gg) {
591 for (dd = 0; dd < 3; dd++)
592 traction[dd] = cblas_ddot(3, &
N[gg * 3], 1, &
t[dd], 3);
593 if (t_face != NULL) {
595 if (nb_dofs_face > 0) {
596 for (dd = 0; dd < 3; dd++)
597 traction[dd] += cblas_ddot(nb_dofs_face, &N_face[gg * nb_dofs_face], 1,
601 if (t_edge != NULL) {
603 for (; ee < 3; ee++) {
604 if (t_edge[ee] == NULL)
606 int nb_dofs_edge =
NBEDGE_H1(order_edge[ee]);
607 if (nb_dofs_edge > 0) {
608 for (dd = 0; dd < 3; dd++) {
610 cblas_ddot(nb_dofs_edge, &(N_edge[ee][gg * nb_dofs_edge]), 1,
611 &(t_edge[ee][dd]), 3);
619 int order,
int *order_edge,
double *
N,
double *N_face,
double *N_edge[],
620 double *diffN,
double *diffN_face,
double *diffN_edge[],
double *
t,
621 double *t_edge[],
double *t_face,
double *dofs_x,
double *dofs_x_edge[],
622 double *dofs_x_face,
double *idofs_x,
double *idofs_x_edge[],
623 double *idofs_x_face,
double *Fext,
double *Fext_edge[],
double *Fext_face,
624 double *iFext,
double *iFext_edge[],
double *iFext_face,
int g_dim,
629 bzero(Fext, 9 *
sizeof(
double));
631 bzero(iFext, 9 *
sizeof(
double));
633 for (; ee < 3; ee++) {
634 int nb_dofs_edge =
NBEDGE_H1(order_edge[ee]);
635 if (nb_dofs_edge == 0)
637 if (Fext_edge != NULL)
638 bzero(Fext_edge[ee], 3 * nb_dofs_edge *
sizeof(
double));
639 if (iFext_edge != NULL)
640 bzero(iFext_edge[ee], 3 * nb_dofs_edge *
sizeof(
double));
643 if (nb_dofs_face != 0) {
644 if (Fext_face != NULL)
645 bzero(Fext_face, 3 * nb_dofs_face *
sizeof(
double));
646 if (iFext_face != NULL)
647 bzero(iFext_face, 3 * nb_dofs_face *
sizeof(
double));
650 for (; gg < g_dim; gg++) {
651 double traction[3] = {0, 0, 0};
653 t_edge, t_face, traction, gg);
658 order, order_edge,
order, order_edge, diffN, diffN_face, diffN_edge,
659 dofs_x, dofs_x_edge, dofs_x_face, idofs_x, idofs_x_edge, idofs_x_face,
660 xnormal, xs1, xs2, gg);
662 double normal_real[3], s1_real[3], s2_real[3];
663 double normal_imag[3], s1_imag[3], s2_imag[3];
664 for (dd = 0; dd < 3; dd++) {
665 normal_real[dd] = 0.5 * xnormal[dd].
r;
666 normal_imag[dd] = 0.5 * xnormal[dd].
i;
667 s1_real[dd] = 0.5 * xs1[dd].
r;
668 s1_imag[dd] = 0.5 * xs1[dd].
i;
669 s2_real[dd] = 0.5 * xs2[dd].
r;
670 s2_imag[dd] = 0.5 * xs2[dd].
i;
673 for (; nn < 3; nn++) {
675 for (dd = 0; dd < 3; dd++) {
680 g_w[gg] *
N[3 * gg + nn] * normal_real[dd] * traction[2];
682 g_w[gg] *
N[3 * gg + nn] * s1_real[dd] * traction[0];
684 g_w[gg] *
N[3 * gg + nn] * s2_real[dd] * traction[1];
687 for (dd = 0; dd < 3; dd++) {
688 iFext[3 * nn + dd] +=
689 g_w[gg] *
N[3 * gg + nn] * normal_imag[dd] * traction[2];
690 iFext[3 * nn + dd] +=
691 g_w[gg] *
N[3 * gg + nn] * s1_imag[dd] * traction[0];
692 iFext[3 * nn + dd] +=
693 g_w[gg] *
N[3 * gg + nn] * s2_imag[dd] * traction[1];
697 for (; ee < 3; ee++) {
698 int nb_dofs_edge =
NBEDGE_H1(order_edge[ee]);
699 if (nb_dofs_edge == 0)
702 for (; nn < nb_dofs_edge; nn++) {
703 if (Fext_edge != NULL)
704 for (dd = 0; dd < 3; dd++) {
705 Fext_edge[ee][3 * nn + dd] += g_w[gg] *
706 N_edge[ee][gg * nb_dofs_edge + nn] *
707 normal_real[dd] * traction[2];
708 Fext_edge[ee][3 * nn + dd] += g_w[gg] *
709 N_edge[ee][gg * nb_dofs_edge + nn] *
710 s1_real[dd] * traction[0];
711 Fext_edge[ee][3 * nn + dd] += g_w[gg] *
712 N_edge[ee][gg * nb_dofs_edge + nn] *
713 s2_real[dd] * traction[1];
715 if (iFext_edge != NULL) {
716 for (dd = 0; dd < 3; dd++) {
717 iFext_edge[ee][3 * nn + dd] += g_w[gg] *
718 N_edge[ee][gg * nb_dofs_edge + nn] *
719 normal_imag[dd] * traction[2];
720 iFext_edge[ee][3 * nn + dd] += g_w[gg] *
721 N_edge[ee][gg * nb_dofs_edge + nn] *
722 s1_imag[dd] * traction[0];
723 iFext_edge[ee][3 * nn + dd] += g_w[gg] *
724 N_edge[ee][gg * nb_dofs_edge + nn] *
725 s2_imag[dd] * traction[1];
730 if (nb_dofs_face != 0) {
732 for (; nn < nb_dofs_face; nn++) {
733 if (Fext_face != NULL)
734 for (dd = 0; dd < 3; dd++) {
735 Fext_face[3 * nn + dd] += g_w[gg] * N_face[gg * nb_dofs_face + nn] *
736 normal_real[dd] * traction[2];
737 Fext_face[3 * nn + dd] += g_w[gg] * N_face[gg * nb_dofs_face + nn] *
738 s1_real[dd] * traction[0];
739 Fext_face[3 * nn + dd] += g_w[gg] * N_face[gg * nb_dofs_face + nn] *
740 s2_real[dd] * traction[1];
742 if (iFext_face != NULL)
743 for (dd = 0; dd < 3; dd++) {
744 iFext_face[3 * nn + dd] += g_w[gg] *
745 N_face[gg * nb_dofs_face + nn] *
746 normal_imag[dd] * traction[2];
747 iFext_face[3 * nn + dd] += g_w[gg] *
748 N_face[gg * nb_dofs_face + nn] *
749 s1_imag[dd] * traction[0];
750 iFext_face[3 * nn + dd] += g_w[gg] *
751 N_face[gg * nb_dofs_face + nn] *
752 s2_imag[dd] * traction[1];
760 double eps,
int order,
int *order_edge,
double *
N,
double *N_face,
761 double *N_edge[],
double *diffN,
double *diffN_face,
double *diffN_edge[],
762 double *
t,
double *t_edge[],
double *t_face,
double *dofs_x,
763 double *dofs_x_edge[],
double *dofs_x_face,
double *KExt_hh,
764 double *KExt_edgeh[],
double *KExt_faceh,
int g_dim,
const double *g_w) {
766 int gg, dd, ii, nn, ee;
767 bzero(KExt_hh, 9 * 9 *
sizeof(
double));
768 if (KExt_edgeh != NULL) {
769 for (ee = 0; ee < 3; ee++) {
770 int nb_dofs_edge =
NBEDGE_H1(order_edge[ee]);
771 bzero(KExt_edgeh[ee], 9 * 3 * nb_dofs_edge *
sizeof(
double));
775 if (KExt_faceh != NULL) {
776 bzero(KExt_faceh, 9 * 3 * nb_dofs_face *
sizeof(
double));
778 for (gg = 0; gg < g_dim; gg++) {
779 double traction[3] = {0, 0, 0};
781 t_edge, t_face, traction, gg);
785 for (ii = 0; ii < 9; ii++) {
786 bzero(idofs_x, 9 *
sizeof(
double));
789 order, order_edge, diffN, diffN_face,
790 diffN_edge, dofs_x, dofs_x_edge, dofs_x_face,
791 idofs_x, NULL, NULL, xnormal, xs1, xs2, gg);
793 double normal_imag[3], s1_imag[3], s2_imag[3];
794 for (dd = 0; dd < 3; dd++) {
795 normal_imag[dd] = 0.5 * xnormal[dd].
i /
eps;
796 s1_imag[dd] = 0.5 * xs1[dd].
i /
eps;
797 s2_imag[dd] = 0.5 * xs2[dd].
i /
eps;
800 for (; nn < 3; nn++) {
801 for (dd = 0; dd < 3; dd++) {
802 KExt_hh[ii + 9 * 3 * nn + 9 * dd] +=
803 g_w[gg] *
N[3 * gg + nn] * normal_imag[dd] * traction[2];
804 KExt_hh[ii + 9 * 3 * nn + 9 * dd] +=
805 g_w[gg] *
N[3 * gg + nn] * s1_imag[dd] * traction[0];
806 KExt_hh[ii + 9 * 3 * nn + 9 * dd] +=
807 g_w[gg] *
N[3 * gg + nn] * s2_imag[dd] * traction[1];
810 if (KExt_edgeh != NULL) {
811 for (ee = 0; ee < 3; ee++) {
812 int nb_dofs_edge =
NBEDGE_H1(order_edge[ee]);
813 for (nn = 0; nn < nb_dofs_edge; nn++) {
814 for (dd = 0; dd < 3; dd++) {
815 KExt_edgeh[ee][ii + 9 * 3 * nn + 9 * dd] +=
816 g_w[gg] * N_edge[ee][nb_dofs_edge * gg + nn] *
817 normal_imag[dd] * traction[2];
818 KExt_edgeh[ee][ii + 9 * 3 * nn + 9 * dd] +=
819 g_w[gg] * N_edge[ee][nb_dofs_edge * gg + nn] * s1_imag[dd] *
821 KExt_edgeh[ee][ii + 9 * 3 * nn + 9 * dd] +=
822 g_w[gg] * N_edge[ee][nb_dofs_edge * gg + nn] * s2_imag[dd] *
828 if (KExt_faceh != NULL) {
829 for (nn = 0; nn < nb_dofs_face; nn++) {
830 for (dd = 0; dd < 3; dd++) {
831 KExt_faceh[ii + 3 * 9 * nn + 9 * dd] +=
832 g_w[gg] * N_face[nb_dofs_face * gg + nn] * normal_imag[dd] *
834 KExt_faceh[ii + 3 * 9 * nn + 9 * dd] +=
835 g_w[gg] * N_face[nb_dofs_face * gg + nn] * s1_imag[dd] *
837 KExt_faceh[ii + 3 * 9 * nn + 9 * dd] +=
838 g_w[gg] * N_face[nb_dofs_face * gg + nn] * s2_imag[dd] *
848 double eps,
int order,
int *order_edge,
double *
N,
double *N_face,
849 double *N_edge[],
double *diffN,
double *diffN_face,
double *diffN_edge[],
850 double *
t,
double *t_edge[],
double *t_face,
double *dofs_x,
851 double *dofs_x_edge[],
double *dofs_x_face,
double *KExt_hedge[3],
852 double *KExt_edgeedge[3][3],
double *KExt_faceedge[3],
int g_dim,
855 int gg, dd, ii, nn, ee, EE;
857 for (EE = 0; EE < 3; EE++) {
858 int nb_dofs_edge_EE =
NBEDGE_H1(order_edge[EE]);
859 bzero(KExt_hedge[EE], 9 * 3 * nb_dofs_edge_EE *
sizeof(
double));
860 if (KExt_edgeedge != NULL) {
861 for (ee = 0; ee < 3; ee++) {
862 int nb_dofs_edge =
NBEDGE_H1(order_edge[ee]);
863 bzero(KExt_edgeedge[EE][ee],
864 3 * nb_dofs_edge_EE * 3 * nb_dofs_edge *
sizeof(
double));
867 if (KExt_faceedge != NULL) {
868 bzero(KExt_faceedge[EE],
869 3 * nb_dofs_edge_EE * 3 * nb_dofs_face *
sizeof(
double));
872 for (gg = 0; gg < g_dim; gg++) {
873 double traction[3] = {0, 0, 0};
875 t_edge, t_face, traction, gg);
876 for (EE = 0; EE < 3; EE++) {
877 int nb_dofs_edge_EE =
NBEDGE_H1(order_edge[EE]);
878 double *idofs_x_edge[3] = {NULL, NULL, NULL};
879 double idofs_x_edge_EE[3 * nb_dofs_edge_EE];
880 idofs_x_edge[EE] = idofs_x_edge_EE;
881 for (ii = 0; ii < 3 * nb_dofs_edge_EE; ii++) {
882 bzero(idofs_x_edge_EE, 3 * nb_dofs_edge_EE *
sizeof(
double));
883 idofs_x_edge_EE[ii] =
eps;
886 order, order_edge, diffN, diffN_face,
887 diffN_edge, dofs_x, dofs_x_edge, dofs_x_face,
888 NULL, idofs_x_edge, NULL, xnormal, xs1, xs2,
891 double normal_imag[3], s1_imag[3], s2_imag[3];
892 for (dd = 0; dd < 3; dd++) {
893 normal_imag[dd] = 0.5 * xnormal[dd].
i /
eps;
894 s1_imag[dd] = 0.5 * xs1[dd].
i /
eps;
895 s2_imag[dd] = 0.5 * xs2[dd].
i /
eps;
897 for (nn = 0; nn < 3; nn++) {
898 for (dd = 0; dd < 3; dd++) {
899 KExt_hedge[EE][ii + 3 * nb_dofs_edge_EE * 3 * nn +
900 3 * nb_dofs_edge_EE * dd] +=
901 g_w[gg] *
N[3 * gg + nn] * normal_imag[dd] * traction[2];
902 KExt_hedge[EE][ii + 3 * nb_dofs_edge_EE * 3 * nn +
903 3 * nb_dofs_edge_EE * dd] +=
904 g_w[gg] *
N[3 * gg + nn] * s1_imag[dd] * traction[0];
905 KExt_hedge[EE][ii + 3 * nb_dofs_edge_EE * 3 * nn +
906 3 * nb_dofs_edge_EE * dd] +=
907 g_w[gg] *
N[3 * gg + nn] * s2_imag[dd] * traction[1];
910 if (KExt_edgeedge != NULL) {
911 for (ee = 0; ee < 3; ee++) {
912 int nb_dofs_edge =
NBEDGE_H1(order_edge[ee]);
913 for (nn = 0; nn < nb_dofs_edge; nn++) {
914 for (dd = 0; dd < 3; dd++) {
915 KExt_edgeedge[EE][ee][ii + 3 * nb_dofs_edge_EE * 3 * nn +
916 3 * nb_dofs_edge_EE * dd] +=
917 g_w[gg] * N_edge[ee][nb_dofs_edge * gg + nn] *
918 normal_imag[dd] * traction[2];
919 KExt_edgeedge[EE][ee][ii + 3 * nb_dofs_edge_EE * 3 * nn +
920 3 * nb_dofs_edge_EE * dd] +=
921 g_w[gg] * N_edge[ee][nb_dofs_edge * gg + nn] * s1_imag[dd] *
923 KExt_edgeedge[EE][ee][ii + 3 * nb_dofs_edge_EE * 3 * nn +
924 3 * nb_dofs_edge_EE * dd] +=
925 g_w[gg] * N_edge[ee][nb_dofs_edge * gg + nn] * s2_imag[dd] *
931 if (KExt_faceedge != NULL) {
932 for (nn = 0; nn < nb_dofs_face; nn++) {
933 for (dd = 0; dd < 3; dd++) {
934 KExt_faceedge[EE][ii + 3 * nb_dofs_edge_EE * 3 * nn +
935 3 * nb_dofs_edge_EE * dd] +=
936 g_w[gg] * N_face[nb_dofs_face * gg + nn] * normal_imag[dd] *
938 KExt_faceedge[EE][ii + 3 * nb_dofs_edge_EE * 3 * nn +
939 3 * nb_dofs_edge_EE * dd] +=
940 g_w[gg] * N_face[nb_dofs_face * gg + nn] * s1_imag[dd] *
942 KExt_faceedge[EE][ii + 3 * nb_dofs_edge_EE * 3 * nn +
943 3 * nb_dofs_edge_EE * dd] +=
944 g_w[gg] * N_face[nb_dofs_face * gg + nn] * s2_imag[dd] *
956 double *N_face,
double *N_edge[],
double *diffN,
957 double *diffN_face,
double *diffN_edge[],
double *
t,
958 double *t_edge[],
double *t_face,
double *dofs_x,
959 double *dofs_x_edge[],
double *dofs_x_face,
960 double *KExt_hface,
double *KExt_edgeface[3],
961 double *KExt_faceface,
int g_dim,
const double *g_w) {
963 int gg, dd, ii, nn, ee;
965 bzero(KExt_hface, 9 * 3 * nb_dofs_face *
sizeof(
double));
966 if (KExt_edgeface != NULL) {
967 for (ee = 0; ee < 3; ee++) {
968 int nb_dofs_edge =
NBEDGE_H1(order_edge[ee]);
969 bzero(KExt_edgeface[ee],
970 3 * nb_dofs_face * 3 * nb_dofs_edge *
sizeof(
double));
973 if (KExt_faceface != NULL) {
974 bzero(KExt_faceface, 3 * nb_dofs_face * 3 * nb_dofs_face *
sizeof(
double));
976 for (gg = 0; gg < g_dim; gg++) {
977 double traction[3] = {0, 0, 0};
979 t_edge, t_face, traction, gg);
980 double idofs_x_face[3 * nb_dofs_face];
981 for (ii = 0; ii < 3 * nb_dofs_face; ii++) {
982 bzero(idofs_x_face, 3 * nb_dofs_face *
sizeof(
double));
983 idofs_x_face[ii] =
eps;
987 order, order_edge, diffN, diffN_face, diffN_edge, dofs_x, dofs_x_edge,
988 dofs_x_face, NULL, NULL, idofs_x_face, xnormal, xs1, xs2, gg);
990 double normal_imag[3], s1_imag[3], s2_imag[3];
991 for (dd = 0; dd < 3; dd++) {
992 normal_imag[dd] = 0.5 * xnormal[dd].
i /
eps;
993 s1_imag[dd] = 0.5 * xs1[dd].
i /
eps;
994 s2_imag[dd] = 0.5 * xs2[dd].
i /
eps;
996 for (nn = 0; nn < 3; nn++) {
997 for (dd = 0; dd < 3; dd++) {
998 KExt_hface[ii + 3 * nb_dofs_face * 3 * nn + 3 * nb_dofs_face * dd] +=
999 g_w[gg] *
N[3 * gg + nn] * normal_imag[dd] * traction[2];
1000 KExt_hface[ii + 3 * nb_dofs_face * 3 * nn + 3 * nb_dofs_face * dd] +=
1001 g_w[gg] *
N[3 * gg + nn] * s1_imag[dd] * traction[0];
1002 KExt_hface[ii + 3 * nb_dofs_face * 3 * nn + 3 * nb_dofs_face * dd] +=
1003 g_w[gg] *
N[3 * gg + nn] * s2_imag[dd] * traction[1];
1006 if (KExt_edgeface != NULL) {
1007 for (ee = 0; ee < 3; ee++) {
1008 int nb_dofs_edge =
NBEDGE_H1(order_edge[ee]);
1009 for (nn = 0; nn < nb_dofs_edge; nn++) {
1010 for (dd = 0; dd < 3; dd++) {
1011 KExt_edgeface[ee][ii + 3 * nb_dofs_face * 3 * nn +
1012 3 * nb_dofs_face * dd] +=
1013 g_w[gg] * N_edge[ee][nb_dofs_edge * gg + nn] *
1014 normal_imag[dd] * traction[2];
1015 KExt_edgeface[ee][ii + 3 * nb_dofs_face * 3 * nn +
1016 3 * nb_dofs_face * dd] +=
1017 g_w[gg] * N_edge[ee][nb_dofs_edge * gg + nn] * s1_imag[dd] *
1019 KExt_edgeface[ee][ii + 3 * nb_dofs_face * 3 * nn +
1020 3 * nb_dofs_face * dd] +=
1021 g_w[gg] * N_edge[ee][nb_dofs_edge * gg + nn] * s2_imag[dd] *
1027 if (KExt_faceface != NULL) {
1028 for (nn = 0; nn < nb_dofs_face; nn++) {
1029 for (dd = 0; dd < 3; dd++) {
1030 KExt_faceface[ii + 3 * nb_dofs_face * 3 * nn +
1031 3 * nb_dofs_face * dd] +=
1032 g_w[gg] * N_face[nb_dofs_face * gg + nn] * normal_imag[dd] *
1034 KExt_faceface[ii + 3 * nb_dofs_face * 3 * nn +
1035 3 * nb_dofs_face * dd] +=
1036 g_w[gg] * N_face[nb_dofs_face * gg + nn] * s1_imag[dd] *
1038 KExt_faceface[ii + 3 * nb_dofs_face * 3 * nn +
1039 3 * nb_dofs_face * dd] +=
1040 g_w[gg] * N_face[nb_dofs_face * gg + nn] * s2_imag[dd] *
ForcesAndSourcesCore::UserDataOperator UserDataOperator
MoFEMErrorCode Fext_h_hierarchical(int order, int *order_edge, double *N, double *N_face, double *N_edge[], double *diffN, double *diffN_face, double *diffN_edge[], double *t, double *t_edge[], double *t_face, double *dofs_x, double *dofs_x_edge[], double *dofs_x_face, double *idofs_x, double *idofs_x_edge[], double *idofs_x_face, double *Fext, double *Fext_egde[], double *Fext_face, double *iFext, double *iFext_egde[], double *iFext_face, int g_dim, const double *g_w)
MoFEMErrorCode KExt_hh_hierarchical(double eps, int order, int *order_edge, double *N, double *N_face, double *N_edge[], double *diffN, double *diffN_face, double *diffN_edge[], double *t, double *t_edge[], double *t_face, double *dofs_x, double *dofs_x_edge[], double *dofs_x_face, double *KExt_hh, double *KExt_egdeh[3], double *KExt_faceh, int g_dim, const double *g_w)
void tricircumcenter3d_tp(double a[3], double b[3], double c[3], double circumcenter[3], double *xi, double *eta)
MoFEMErrorCode Traction_hierarchical(int order, int *order_edge, double *N, double *N_face, double *N_edge[], double *t, double *t_edge[], double *t_face, double *traction, int gg)
MoFEMErrorCode KExt_hh_hierarchical_edge(double eps, int order, int *order_edge, double *N, double *N_face, double *N_edge[], double *diffN, double *diffN_face, double *diffN_edge[], double *t, double *t_edge[], double *t_face, double *dofs_x, double *dofs_x_edge[], double *dofs_x_face, double *Khext_edge[3], double *KExt_edgeegde[3][3], double *KExt_faceedge[3], int g_dim, const double *g_w)
MoFEMErrorCode KExt_hh_hierarchical_face(double eps, int order, int *order_edge, double *N, double *N_face, double *N_edge[], double *diffN, double *diffN_face, double *diffN_edge[], double *t, double *t_edge[], double *t_face, double *dofs_x, double *dofs_x_edge[], double *dofs_x_face, double *KExt_hface, double *KExt_egdeface[3], double *KExt_faceface, int g_dim, const double *g_w)
void tetcircumcenter_tp(double a[3], double b[3], double c[3], double d[3], double circumcenter[3], double *xi, double *eta, double *zeta)
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
virtual bool check_field(const std::string &name) const =0
check if field is in database
MoFEMErrorCode getCubitMeshsetPtr(const int ms_id, const CubitBCType cubit_bc_type, const CubitMeshSets **cubit_meshset_ptr) const
get cubit meshset
#define NBEDGE_H1(P)
Number of base function on edge for H1 space.
#define NBFACETRI_H1(P)
Number of base function on triangle for H1 space.
const double c
speed of light (cm/ns)
static __CLPK_integer lapack_dgesv(__CLPK_integer n, __CLPK_integer nrhs, __CLPK_doublereal *a, __CLPK_integer lda, __CLPK_integer *ipiv, __CLPK_doublereal *b, __CLPK_integer ldb)
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
MoFEMErrorCode MatSetValues(Mat M, const EntitiesFieldData::EntData &row_data, const EntitiesFieldData::EntData &col_data, const double *ptr, InsertMode iora)
Assemble PETSc matrix.
MoFEMErrorCode VecSetValues(Vec V, const EntitiesFieldData::EntData &data, const double *ptr, InsertMode iora)
Assemble PETSc vector.
double zeta
Viscous hardening.
constexpr double t
plate stiffness
constexpr auto field_name
static MoFEMErrorCode applyScale(const FEMethod *fe, boost::ptr_vector< MethodForForceScaling > &methods_op, VectorDouble &nf)
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
this struct keeps basic methods for moab meshset about material and boundary conditions
MoFEMErrorCode getBcDataStructure(CUBIT_BC_DATA_TYPE &data) const
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
ApproximationOrder getOrder() const
get approximation order
MatrixDouble & getDiffN(const FieldApproximationBase base)
get derivatives of base functions
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
const VectorDouble & getFieldData() const
get dofs values
const VectorInt & getIndices() const
Get global indices of dofs on entity.
std::string meshPositionsFieldName
boost::ptr_deque< UserDataOperator > & getOpPtrVector()
Use to push back operator for row operator.
Interface for managing meshsets containing materials and boundary conditions.
Mat & snes_B
preconditioner of jacobian matrix
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
AuxMethodMaterial(const string &field_name, MyTriangleSpatialFE *my_ptr, const char type)
AuxMethodSpatial(const string &field_name, MyTriangleSpatialFE *my_ptr, const char type)
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
MoFEMErrorCode reBaseToFaceLoocalCoordSystem(MatrixDouble &t_glob_nodal)
MoFEMErrorCode operator()()
function is run for every finite element
virtual MoFEMErrorCode lHs()
MoFEMErrorCode addPressure(int ms_id)
virtual MoFEMErrorCode calcTraction()
virtual MoFEMErrorCode rHs()
boost::ptr_vector< MethodForForceScaling > methodsOp
MoFEMErrorCode preProcess()
function is run at the beginning of loop
MyTriangleSpatialFE(MoFEM::Interface &_mField, Mat _Aij, Vec &_F, double *scale_lhs, double *scale_rhs, std::string spatial_field_name="SPATIAL_POSITION", std::string mat_field_name="MESH_NODE_POSITIONS")
MoFEMErrorCode addForce(int ms_id)
MyTriangleSpatialFE feSpatial
const std::string spatialField
NeumannForcesSurfaceComplexForLazy(MoFEM::Interface &m_field, Mat _Aij, Vec _F, double *scale_lhs, double *scale_rhs, std::string spatial_field_name="SPATIAL_POSITION", std::string material_field_name="MESH_NODE_POSITIONS")
const std::string materialField
MoFEM::Interface & mField
void tricircumcenter3d_tp(a, b, c, circumcenter, double *xi, double *eta)