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) {
 
  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;
 
  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 DOF values on entity.
const VectorInt & getIndices() const
Get global indices of degrees of freedom 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.
Vec & snes_f
Reference to residual vector.
Mat & snes_B
Reference to 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()()
Main operator function executed for each loop iteration.
virtual MoFEMErrorCode lHs()
MoFEMErrorCode addPressure(int ms_id)
virtual MoFEMErrorCode calcTraction()
virtual MoFEMErrorCode rHs()
boost::ptr_vector< MethodForForceScaling > methodsOp
MoFEMErrorCode preProcess()
Pre-processing function executed at loop initialization.
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)