21                                                                     {
   24 
   25  if (
auto fe_method_ptr = 
fePtr.lock()) {
 
   26 
   29    const auto problem_name = fe_method_ptr->problemPtr->getName();
   30 
   31    for (auto bc : bc_mng->getBcMapByBlockName()) {
   32      if (auto disp_bc = bc.second->dispBcPtr) {
   33 
   34        auto &bc_id = bc.first;
   35 
   36        auto regex_str = (boost::format("%s_(.*)") % problem_name).str();
   37        if (std::regex_match(bc_id, std::regex(regex_str))) {
   38 
   41 
   45          };
   46          const auto nb_field_coeffs = get_field_coeffs(
field_name);
 
   47 
   49              << "Apply EssentialPreProc<DisplacementCubitBcData>: "
   50              << problem_name << 
"_" << 
field_name << 
"_" << block_name;
 
   51 
   55 
   56          if (auto ext_disp_bc =
   57                  dynamic_cast<DisplacementCubitBcDataWithRotation const *>(
   58                      disp_bc.get())) {
   59            for (
int a = 0; 
a != 3; ++
a)
 
   60              t_off(
a) = ext_disp_bc->rotOffset[
a];
 
   61          }
   62 
   63          auto scale_value = [&](
const double &
c) {
 
   66              val *= s->getScale(fe_method_ptr->ts_t);
   67            }
   68            return val;
   69          };
   70 
   71          if (disp_bc->data.flag1 == 1)
   72            t_vals(0) = scale_value(-disp_bc->data.value1);
   73          if (disp_bc->data.flag2 == 1)
   74            t_vals(1) = scale_value(-disp_bc->data.value2);
   75          if (disp_bc->data.flag3 == 1)
   76            t_vals(2) = scale_value(-disp_bc->data.value3);
   77          if (disp_bc->data.flag4 == 1)
   78            t_angles(0) = scale_value(-disp_bc->data.value4);
   79          if (disp_bc->data.flag5 == 1)
   80            t_angles(1) = scale_value(-disp_bc->data.value5);
   81          if (disp_bc->data.flag6 == 1)
   82            t_angles(2) = scale_value(-disp_bc->data.value6);
   83 
   84          int coeff;
   85          std::array<std::vector<double>, 3> coords;
   86          int idx;
   87 
   88          const bool is_rotation =
   89              disp_bc->data.flag4 || disp_bc->data.flag5 || disp_bc->data.flag6;
   90 
   91          auto lambda = [&](boost::shared_ptr<FieldEntity> field_entity_ptr) {
 
   93 
   94            auto v = t_vals(coeff);
 
   95            if (is_rotation) {
   97                  coords[0][idx], coords[1][idx], coords[2][idx]);
   99                  t_angles, t_coords, t_off)(coeff);
  100            }
  102              v += coords[coeff][idx];
 
  103            }
  104 
  105            field_entity_ptr->getEntFieldData()[coeff] = 
v;
 
  106            ++idx;
  107 
  109          };
  110 
  111          auto zero_lambda =
  112              [&](boost::shared_ptr<FieldEntity> field_entity_ptr) {
  114                auto size = field_entity_ptr->getEntFieldData().size();
  115                for (
int i = coeff; 
i < size; 
i += nb_field_coeffs)
 
  116                  field_entity_ptr->getEntFieldData()[
i] = 0;
 
  118              };
  119 
  120          auto verts = bc.second->bcEnts.subset_by_type(MBVERTEX);
  121          auto not_verts = subtract(bc.second->bcEnts, verts);
  122 
  124            for (auto d : {0, 1, 2})
  125              coords[d].resize(verts.size());
  127                                                &*coords[1].begin(),
  128                                                &*coords[2].begin());
  129          }
  130 
  131          if (disp_bc->data.flag1 || disp_bc->data.flag5 ||
  132              disp_bc->data.flag6) {
  133            idx = 0;
  134            coeff = 0;
  137                                             ¬_verts);
  138          }
  139          if (disp_bc->data.flag2 || disp_bc->data.flag4 ||
  140              disp_bc->data.flag6) {
  141            idx = 0;
  142            coeff = 1;
  143            if (nb_field_coeffs > 1) {
  146                                               ¬_verts);
  147            }
  148          }
  149          if (disp_bc->data.flag3 || disp_bc->data.flag4 ||
  150              disp_bc->data.flag5 || is_rotation) {
  151            idx = 0;
  152            coeff = 2;
  153            if (nb_field_coeffs > 2) {
  156                                               ¬_verts);
  157            }
  158          }
  159        }
  160      }
  161    }
  162 
  163  } else {
  165            "Can not lock shared pointer");
  166  }
  167 
  169}
#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.
virtual const Field * get_field_structure(const std::string &name, enum MoFEMTypes bh=MF_EXIST) const =0
get field structure
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
const double v
phase velocity of light in medium (cm/ns)
constexpr auto field_name
static std::pair< std::string, std::string > extractStringFromBlockId(const std::string block_id, const std::string prb_name)
Extract block name and block name from block id.
virtual moab::Interface & get_moab()=0
static FTensor::Tensor1< double, 3 > GetRotDisp(const FTensor::Tensor1< double, 3 > &angles, FTensor::Tensor1< double, 3 > coordinates, FTensor::Tensor1< double, 3 > offset=FTensor::Tensor1< double, 3 >{ 0., 0., 0.})
Calculates the rotated displacement given the rotation angles, coordinates, and an optional offset.
FieldCoefficientsNumber getNbOfCoeffs() const
Get number of field coefficients per DOF.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.