v0.9.2
Classes | Public Types | Public Member Functions | Public Attributes | Private Attributes | List of all members
PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT > Struct Template Reference

#include <users_modules/basic_finite_elements/src/PostProcOnRefMesh.hpp>

Inheritance diagram for PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >:
[legend]
Collaboration diagram for PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >:
[legend]

Classes

struct  OpHdivFunctions
 

Public Types

typedef PostProcTemplateOnRefineMesh< VOLUME_ELEMENT > T
 
typedef PostProcCommonOnRefMesh::CommonDataForVolume CommonData
 

Public Member Functions

 PostProcTemplateVolumeOnRefinedMesh (MoFEM::Interface &m_field, bool ten_nodes_post_proc_tets=true, int nb_ref_levels=-1)
 
int getRule (int order)
 
virtual PostProcCommonOnRefMesh::CommonDatagetCommonData ()
 
MoFEMErrorCode generateReferenceElementMesh ()
 Generate reference mesh on single element. More...
 
MoFEMErrorCode setGaussPts (int order)
 Set integration points. More...
 
MoFEMErrorCode clearOperators ()
 Clear operators list. More...
 
MoFEMErrorCode preProcess ()
 
MoFEMErrorCode postProcess ()
 
MoFEMErrorCode addHdivFunctionsPostProc (const std::string field_name)
 Add operator to post-process Hdiv field. More...
 
- Public Member Functions inherited from PostProcTemplateOnRefineMesh< VOLUME_ELEMENT >
 PostProcTemplateOnRefineMesh (MoFEM::Interface &m_field)
 
virtual ~PostProcTemplateOnRefineMesh ()
 
MoFEMErrorCode addFieldValuesPostProc (const std::string field_name, Vec v=PETSC_NULL)
 Add operator to post-process L2, H1, Hdiv, Hcurl field value. More...
 
MoFEMErrorCode addFieldValuesPostProc (const std::string field_name, const std::string tag_name, Vec v=PETSC_NULL)
 Add operator to post-process L2 or H1 field value. More...
 
MoFEMErrorCode addFieldValuesGradientPostProc (const std::string field_name, Vec v=PETSC_NULL)
 Add operator to post-process L2 or H1 field gradient. More...
 
MoFEMErrorCode addFieldValuesGradientPostProc (const std::string field_name, const std::string tag_name, Vec v=PETSC_NULL)
 Add operator to post-process L2 or H1 field gradient. More...
 
MoFEMErrorCode writeFile (const std::string file_name)
 wrote results in (MOAB) format, use "file_name.h5m" More...
 

Public Attributes

bool tenNodesPostProcTets
 
int nbOfRefLevels
 
CommonData commonData
 
- Public Attributes inherited from PostProcTemplateOnRefineMesh< VOLUME_ELEMENT >
moab::Core coreMesh
 
moab::Interface & postProcMesh
 
std::vector< EntityHandlemapGaussPts
 

Private Attributes

std::vector< MatrixDouble > levelShapeFunctions
 
std::vector< MatrixDouble > levelGaussPtsOnRefMesh
 
std::vector< ublas::matrix< int > > levelRefTets
 

Detailed Description

template<class VOLUME_ELEMENT>
struct PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >

Definition at line 248 of file PostProcOnRefMesh.hpp.

Member Typedef Documentation

◆ CommonData

template<class VOLUME_ELEMENT>
typedef PostProcCommonOnRefMesh::CommonDataForVolume PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::CommonData

Definition at line 264 of file PostProcOnRefMesh.hpp.

◆ T

template<class VOLUME_ELEMENT>
typedef PostProcTemplateOnRefineMesh<VOLUME_ELEMENT> PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::T

Definition at line 251 of file PostProcOnRefMesh.hpp.

Constructor & Destructor Documentation

◆ PostProcTemplateVolumeOnRefinedMesh()

template<class VOLUME_ELEMENT>
PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::PostProcTemplateVolumeOnRefinedMesh ( MoFEM::Interface m_field,
bool  ten_nodes_post_proc_tets = true,
int  nb_ref_levels = -1 
)

Member Function Documentation

◆ addHdivFunctionsPostProc()

template<class VOLUME_ELEMENT>
MoFEMErrorCode PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::addHdivFunctionsPostProc ( const std::string  field_name)

Add operator to post-process Hdiv field.

Definition at line 565 of file PostProcOnRefMesh.hpp.

565  {
567  T::getOpPtrVector().push_back(
568  new OpHdivFunctions(T::postProcMesh, T::mapGaussPts, field_name));
570  }
moab::Interface & postProcMesh
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:507
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:514
std::vector< EntityHandle > mapGaussPts

◆ clearOperators()

template<class VOLUME_ELEMENT>
MoFEMErrorCode PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::clearOperators ( )

Clear operators list.

Clear operators list, user can use the same mesh instance to post-process different problem or the same problem with different set of post-processed fields.

Definition at line 511 of file PostProcOnRefMesh.hpp.

511  {
513  T::getOpPtrVector().clear();
515  }
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:507
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:514

◆ generateReferenceElementMesh()

template<class VOLUME_ELEMENT>
MoFEMErrorCode PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::generateReferenceElementMesh ( )

Generate reference mesh on single element.

Each element is subdivided on smaller elements, i.e. a reference mesh on single element is created. Nodes of such reference mesh are used as integration points at which field values are calculated and to each node a "moab" tag is attached to store those values.

Definition at line 281 of file PostProcOnRefMesh.hpp.

281  {
283 
284  auto get_nb_of_ref_levels_from_options = [this] {
285  if (nbOfRefLevels == -1) {
286  int max_level = 0;
287  PetscBool flg = PETSC_TRUE;
288  PetscOptionsGetInt(PETSC_NULL, PETSC_NULL,
289  "-my_max_post_proc_ref_level", &max_level, &flg);
290  return max_level;
291  } else {
292  return nbOfRefLevels;
293  }
294  return 0;
295  };
296  const int max_level = get_nb_of_ref_levels_from_options();
297 
298  moab::Core core_ref;
299  moab::Interface &moab_ref = core_ref;
300 
301  auto create_reference_element = [&moab_ref]() {
303  const double base_coords[] = {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
304  EntityHandle nodes[4];
305  for (int nn = 0; nn < 4; nn++) {
306  CHKERR moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
307  }
308  EntityHandle tet;
309  CHKERR moab_ref.create_element(MBTET, nodes, 4, tet);
311  };
312 
313  MoFEM::Core m_core_ref(moab_ref, PETSC_COMM_SELF, -2);
314  MoFEM::Interface &m_field_ref = m_core_ref;
315 
316  auto refine_ref_tetrahedron = [this, &m_field_ref, max_level]() {
318  // seed ref mofem database by setting bit ref level to reference
319  // tetrahedron
320  CHKERR m_field_ref.getInterface<BitRefManager>()->setBitRefLevelByDim(
321  0, 3, BitRefLevel().set(0));
322  for (int ll = 0; ll != max_level; ++ll) {
323  PetscPrintf(T::mField.get_comm(), "Refine Level %d\n", ll);
324  Range edges;
325  CHKERR m_field_ref.getInterface<BitRefManager>()
326  ->getEntitiesByTypeAndRefLevel(BitRefLevel().set(ll),
327  BitRefLevel().set(), MBEDGE, edges);
328  Range tets;
329  CHKERR m_field_ref.getInterface<BitRefManager>()
330  ->getEntitiesByTypeAndRefLevel(BitRefLevel().set(ll),
331  BitRefLevel(ll).set(), MBTET, tets);
332  // refine mesh
333  MeshRefinement *m_ref;
334  CHKERR m_field_ref.getInterface(m_ref);
335  CHKERR m_ref->add_vertices_in_the_middle_of_edges(
336  edges, BitRefLevel().set(ll + 1));
337  CHKERR m_ref->refine_TET(tets, BitRefLevel().set(ll + 1));
338  }
340  };
341 
342  auto get_ref_gauss_pts_and_shape_functions = [this, max_level, &moab_ref,
343  &m_field_ref]() {
345  for (int ll = 0; ll != max_level + 1; ++ll) {
346  Range tets;
347  CHKERR m_field_ref.getInterface<BitRefManager>()
348  ->getEntitiesByTypeAndRefLevel(BitRefLevel().set(ll),
349  BitRefLevel().set(ll), MBTET, tets);
350  if (tenNodesPostProcTets) {
351  EntityHandle meshset;
352  CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
353  CHKERR moab_ref.add_entities(meshset, tets);
354  CHKERR moab_ref.convert_entities(meshset, true, false, false);
355  CHKERR moab_ref.delete_entities(&meshset, 1);
356  }
357  Range elem_nodes;
358  CHKERR moab_ref.get_connectivity(tets, elem_nodes, false);
359 
360  auto &gauss_pts = levelGaussPtsOnRefMesh[ll];
361  gauss_pts.resize(elem_nodes.size(), 4, false);
362  std::map<EntityHandle, int> little_map;
363  Range::iterator nit = elem_nodes.begin();
364  for (int gg = 0; nit != elem_nodes.end(); nit++, gg++) {
365  CHKERR moab_ref.get_coords(&*nit, 1, &gauss_pts(gg, 0));
366  little_map[*nit] = gg;
367  }
368  gauss_pts = trans(gauss_pts);
369 
370  auto &ref_tets = levelRefTets[ll];
371  Range::iterator tit = tets.begin();
372  for (int tt = 0; tit != tets.end(); ++tit, ++tt) {
373  const EntityHandle *conn;
374  int num_nodes;
375  CHKERR moab_ref.get_connectivity(*tit, conn, num_nodes, false);
376  if (tt == 0) {
377  // Ref tets has number of rows equal to number of tets on element,
378  // columns are number of gauss points
379  ref_tets.resize(tets.size(), num_nodes);
380  }
381  for (int nn = 0; nn != num_nodes; ++nn) {
382  ref_tets(tt, nn) = little_map[conn[nn]];
383  }
384  }
385 
386  auto &shape_functions = levelShapeFunctions[ll];
387  shape_functions.resize(elem_nodes.size(), 4);
388  CHKERR ShapeMBTET(&*shape_functions.data().begin(), &gauss_pts(0, 0),
389  &gauss_pts(1, 0), &gauss_pts(2, 0),
390  elem_nodes.size());
391  }
393  };
394 
395  levelRefTets.resize(max_level + 1);
396  levelGaussPtsOnRefMesh.resize(max_level + 1);
397  levelShapeFunctions.resize(max_level + 1);
398 
399  CHKERR create_reference_element();
400  CHKERR refine_ref_tetrahedron();
401  CHKERR get_ref_gauss_pts_and_shape_functions();
402 
404  }
Deprecated interface functions.
PetscErrorCode ShapeMBTET(double *N, const double *G_X, const double *G_Y, const double *G_Z, int DIM)
calculate shape functions
Definition: fem_tools.c:318
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:483
Core (interface) class.
Definition: Core.hpp:50
std::vector< ublas::matrix< int > > levelRefTets
bool tenNodesPostProcTets
MoFEMErrorCode getInterface(const MOFEMuuid &uuid, IFACE *&iface) const
Get interface by uuid and return reference to pointer of interface.
int nbOfRefLevels
std::vector< MatrixDouble > levelShapeFunctions
std::vector< MatrixDouble > levelGaussPtsOnRefMesh
#define CHKERR
Inline error check.
Definition: definitions.h:602
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition: Types.hpp:50
DeprecatedCoreInterface Interface
Definition: Interface.hpp:1879
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:413

◆ getCommonData()

template<class VOLUME_ELEMENT>
virtual PostProcCommonOnRefMesh::CommonData& PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::getCommonData ( )
virtual

Reimplemented from PostProcTemplateOnRefineMesh< VOLUME_ELEMENT >.

Definition at line 269 of file PostProcOnRefMesh.hpp.

269  {
270  return commonData;
271  }
CommonData commonData

◆ getRule()

template<class VOLUME_ELEMENT>
int PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::getRule ( int  order)

Definition at line 264 of file PostProcOnRefMesh.hpp.

264 { return -1; };

◆ postProcess()

template<class VOLUME_ELEMENT>
MoFEMErrorCode PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::postProcess ( )

Definition at line 529 of file PostProcOnRefMesh.hpp.

529  {
531 
533  ParallelComm *pcomm =
534  ParallelComm::get_pcomm(&T::mField.get_moab(), MYPCOMM_INDEX);
535  ParallelComm *pcomm_post_proc_mesh =
536  ParallelComm::get_pcomm(&moab, MYPCOMM_INDEX);
537  if (pcomm_post_proc_mesh == NULL) {
538  pcomm_post_proc_mesh = new ParallelComm(&moab, T::mField.get_comm());
539  }
540 
541  Range edges;
542  CHKERR T::postProcMesh.get_entities_by_type(0, MBEDGE, edges, false);
543  CHKERR T::postProcMesh.delete_entities(edges);
544  Range tris;
545  CHKERR T::postProcMesh.get_entities_by_type(0, MBTRI, tris, false);
546  CHKERR T::postProcMesh.delete_entities(tris);
547 
548  Range tets;
549  CHKERR T::postProcMesh.get_entities_by_type(0, MBTET, tets, false);
550 
551  int rank = pcomm->rank();
552  Range::iterator tit = tets.begin();
553  for (; tit != tets.end(); tit++) {
554  CHKERR T::postProcMesh.tag_set_data(pcomm_post_proc_mesh->part_tag(),
555  &*tit, 1, &rank);
556  }
557 
558  CHKERR pcomm_post_proc_mesh->resolve_shared_ents(0);
559 
561  }
moab::Interface & postProcMesh
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:507
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:514
moab::Core coreMesh
#define CHKERR
Inline error check.
Definition: definitions.h:602
#define MYPCOMM_INDEX
default communicator number PCOMM
Definition: definitions.h:291
DeprecatedCoreInterface Interface
Definition: Interface.hpp:1879

◆ preProcess()

template<class VOLUME_ELEMENT>
MoFEMErrorCode PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::preProcess ( )

Definition at line 517 of file PostProcOnRefMesh.hpp.

517  {
520  ParallelComm *pcomm_post_proc_mesh =
521  ParallelComm::get_pcomm(&moab, MYPCOMM_INDEX);
522  if (pcomm_post_proc_mesh != NULL)
523  delete pcomm_post_proc_mesh;
524 
525  CHKERR T::postProcMesh.delete_mesh();
527  }
moab::Interface & postProcMesh
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:507
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:514
moab::Core coreMesh
#define CHKERR
Inline error check.
Definition: definitions.h:602
#define MYPCOMM_INDEX
default communicator number PCOMM
Definition: definitions.h:291
DeprecatedCoreInterface Interface
Definition: Interface.hpp:1879

◆ setGaussPts()

template<class VOLUME_ELEMENT>
MoFEMErrorCode PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::setGaussPts ( int  order)

Set integration points.

If reference mesh is generated on single elements. This function maps reference coordinates into physical coordinates and create element on post-processing mesh.

Definition at line 413 of file PostProcOnRefMesh.hpp.

413  {
415 
416  auto get_element_max_dofs_order = [this]() {
417  int max_order = 0;
418  auto &dofs_multi_index = *this->dataPtr;
419  for (auto &dof : dofs_multi_index) {
420  const int dof_order = dof->getDofOrder();
421  max_order = (max_order < dof_order) ? dof_order : max_order;
422  };
423  return max_order;
424  };
425 
426  const int dof_max_order = get_element_max_dofs_order();
427  size_t level = (dof_max_order > 0) ? (dof_max_order - 1) / 2 : 0;
428  if (level > (levelGaussPtsOnRefMesh.size() - 1))
429  level = levelGaussPtsOnRefMesh.size() - 1;
430 
431  auto &level_ref_gauss_pts = levelGaussPtsOnRefMesh[level];
432  auto &level_ref_tets = levelRefTets[level];
433  auto &shape_functions = levelShapeFunctions[level];
434  T::gaussPts.resize(level_ref_gauss_pts.size1(), level_ref_gauss_pts.size2(),
435  false);
436  noalias(T::gaussPts) = level_ref_gauss_pts;
437 
438  ReadUtilIface *iface;
439  CHKERR T::postProcMesh.query_interface(iface);
440 
441  const int num_nodes = level_ref_gauss_pts.size2();
442  std::vector<double *> arrays;
443  EntityHandle startv;
444  CHKERR iface->get_node_coords(3, num_nodes, 0, startv, arrays);
445  T::mapGaussPts.resize(level_ref_gauss_pts.size2());
446  for (int gg = 0; gg != num_nodes; ++gg)
447  T::mapGaussPts[gg] = startv + gg;
448 
449  Tag th;
450  int def_in_the_loop = -1;
451  CHKERR T::postProcMesh.tag_get_handle("NB_IN_THE_LOOP", 1, MB_TYPE_INTEGER,
452  th, MB_TAG_CREAT | MB_TAG_SPARSE,
453  &def_in_the_loop);
454 
455  commonData.tEts.clear();
456  const int num_el = level_ref_tets.size1();
457  const int num_nodes_on_ele = level_ref_tets.size2();
458  EntityHandle starte;
459  EntityHandle *conn;
460  CHKERR iface->get_element_connect(num_el, num_nodes_on_ele, MBTET, 0,
461  starte, conn);
462  for (unsigned int tt = 0; tt != level_ref_tets.size1(); ++tt) {
463  for (int nn = 0; nn != num_nodes_on_ele; ++nn)
464  conn[num_nodes_on_ele * tt + nn] =
465  T::mapGaussPts[level_ref_tets(tt, nn)];
466  }
467  CHKERR iface->update_adjacencies(starte, num_el, num_nodes_on_ele, conn);
468  commonData.tEts = Range(starte, starte + num_el - 1);
469  CHKERR T::postProcMesh.tag_clear_data(th, commonData.tEts,
470  &(T::nInTheLoop));
471 
472  EntityHandle fe_ent = T::numeredEntFiniteElementPtr->getEnt();
473  T::coords.resize(12, false);
474  {
475  const EntityHandle *conn;
476  int num_nodes;
477  T::mField.get_moab().get_connectivity(fe_ent, conn, num_nodes, true);
478  CHKERR T::mField.get_moab().get_coords(conn, num_nodes, &T::coords[0]);
479  }
480 
483  &*shape_functions.data().begin());
485  arrays[0], arrays[1], arrays[2]);
486  const double *t_coords_ele_x = &T::coords[0];
487  const double *t_coords_ele_y = &T::coords[1];
488  const double *t_coords_ele_z = &T::coords[2];
489  for (int gg = 0; gg != num_nodes; ++gg) {
491  t_coords_ele_x, t_coords_ele_y, t_coords_ele_z);
492  t_coords(i) = 0;
493  for (int nn = 0; nn != 4; ++nn) {
494  t_coords(i) += t_n * t_ele_coords(i);
495  ++t_ele_coords;
496  ++t_n;
497  }
498  ++t_coords;
499  }
500 
502  }
CommonData commonData
Range tEts
moab::Interface & postProcMesh
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:483
std::vector< ublas::matrix< int > > levelRefTets
std::vector< MatrixDouble > levelShapeFunctions
std::vector< MatrixDouble > levelGaussPtsOnRefMesh
#define CHKERR
Inline error check.
Definition: definitions.h:602
std::vector< EntityHandle > mapGaussPts
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:413
FTensor::Index< 'i', 2 > i
[Common data]
Definition: ContactOps.hpp:26

Member Data Documentation

◆ commonData

template<class VOLUME_ELEMENT>
CommonData PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::commonData

Definition at line 267 of file PostProcOnRefMesh.hpp.

◆ levelGaussPtsOnRefMesh

template<class VOLUME_ELEMENT>
std::vector<MatrixDouble> PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::levelGaussPtsOnRefMesh
private

Definition at line 633 of file PostProcOnRefMesh.hpp.

◆ levelRefTets

template<class VOLUME_ELEMENT>
std::vector<ublas::matrix<int> > PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::levelRefTets
private

Definition at line 634 of file PostProcOnRefMesh.hpp.

◆ levelShapeFunctions

template<class VOLUME_ELEMENT>
std::vector<MatrixDouble> PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::levelShapeFunctions
private

Definition at line 632 of file PostProcOnRefMesh.hpp.

◆ nbOfRefLevels

template<class VOLUME_ELEMENT>
int PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::nbOfRefLevels

Definition at line 254 of file PostProcOnRefMesh.hpp.

◆ tenNodesPostProcTets

template<class VOLUME_ELEMENT>
bool PostProcTemplateVolumeOnRefinedMesh< VOLUME_ELEMENT >::tenNodesPostProcTets

Definition at line 253 of file PostProcOnRefMesh.hpp.


The documentation for this struct was generated from the following file: