v0.13.0
Classes | Typedefs | Functions | Variables
test_cache_on_entities.cpp File Reference
#include <MoFEM.hpp>

Go to the source code of this file.

Classes

struct  MyStorage
 
struct  OpVolumeSet
 Operator set cache stored data, in this example, global indices, but it can be any structure. More...
 
struct  OpVolumeTest
 Test if cached data can be accessed, and check consistency of data. More...
 
struct  OpVolumeAssemble
 
struct  VolRule
 Set integration rule. More...
 

Typedefs

using VolEle = VolumeElementForcesAndSourcesCore
 
using VolOp = VolEle::UserDataOperator
 
using FaceEle = FaceElementForcesAndSourcesCore
 
using FaceOp = FaceEle::UserDataOperator
 

Functions

int main (int argc, char *argv[])
 

Variables

static char help [] = "...\n\n"
 

Typedef Documentation

◆ FaceEle

Definition at line 36 of file test_cache_on_entities.cpp.

◆ FaceOp

Definition at line 37 of file test_cache_on_entities.cpp.

◆ VolEle

Examples
EshelbianPlasticity.cpp.

Definition at line 34 of file test_cache_on_entities.cpp.

◆ VolOp

Function Documentation

◆ main()

int main ( int  argc,
char *  argv[] 
)
Examples
test_cache_on_entities.cpp.

Definition at line 179 of file test_cache_on_entities.cpp.

179  {
180 
181  // initialize petsc
182  MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
183 
184  try {
185 
186  // Create MoAB database
187  moab::Core moab_core;
188  moab::Interface &moab = moab_core;
189 
190  // Create MoFEM database and link it to MoAB
191  MoFEM::Core mofem_core(moab);
192  MoFEM::Interface &m_field = mofem_core;
193 
194  // Register DM Manager
195  DMType dm_name = "DMMOFEM";
196  CHKERR DMRegister_MoFEM(dm_name);
197 
198  // Simple interface
199  Simple *simple_interface;
200  CHKERR m_field.getInterface(simple_interface);
201  {
202  // get options from command line
203  CHKERR simple_interface->getOptions();
204  // load mesh file
205  CHKERR simple_interface->loadFile();
206  // add fields
207  CHKERR simple_interface->addDomainField("FIELD", H1,
209  // set fields order
210  CHKERR simple_interface->setFieldOrder("FIELD", 4);
211  // setup problem
212  CHKERR simple_interface->setUp();
213 
214  // get dm
215  auto dm = simple_interface->getDM();
216  // create elements
217  auto domain_fe = boost::make_shared<VolEle>(m_field);
218  // set integration rule
219  domain_fe->getRuleHook = VolRule();
220 
221  auto get_skin = [&]() {
222  Range ents;
223  CHKERR m_field.get_moab().get_entities_by_dimension(0, 3, ents, true);
224  Skinner skin(&m_field.get_moab());
225  Range skin_ents;
226  CHKERR skin.find_skin(0, ents, false, skin_ents);
227  // filter not owned entities, those are not on boundary
228  ParallelComm *pcomm =
229  ParallelComm::get_pcomm(&m_field.get_moab(), MYPCOMM_INDEX);
230  Range proc_skin;
231  CHKERR pcomm->filter_pstatus(skin_ents,
232  PSTATUS_SHARED | PSTATUS_MULTISHARED,
233  PSTATUS_NOT, -1, &proc_skin);
234  Range adj;
235  for (auto d : {0, 1, 2})
236  CHKERR m_field.get_moab().get_adjacencies(proc_skin, d, false, adj,
237  moab::Interface::UNION);
238  // proc_skin.merge(adj);
239  return proc_skin;
240  };
241 
242  auto get_mark_skin_dofs = [&](Range &&skin) {
243  auto problem_manager = m_field.getInterface<ProblemsManager>();
244  auto marker_ptr = boost::make_shared<std::vector<unsigned char>>();
245  problem_manager->markDofs(simple_interface->getProblemName(), ROW, skin,
246  *marker_ptr);
247  return marker_ptr;
248  };
249 
252  auto mark_dofs = get_mark_skin_dofs(get_skin());
253 
254  // set operator to the volume elements
255  domain_fe->getOpPtrVector().push_back(new OpVolumeSet("FIELD"));
256  domain_fe->getOpPtrVector().push_back(new OpVolumeTest("FIELD"));
257 
258  domain_fe->getOpPtrVector().push_back(
259  new OpSetBc("FIELD", true, mark_dofs));
260  domain_fe->getOpPtrVector().push_back(new OpVolumeAssemble("FIELD", v));
261  domain_fe->getOpPtrVector().push_back(new OpUnSetBc("FIELD"));
262 
263  // make integration in volume (here real calculations starts)
264  CHKERR DMoFEMLoopFiniteElements(dm, simple_interface->getDomainFEName(),
265  domain_fe);
266  OpVolumeSet::entsIndices.clear();
267 
268  MOFEM_LOG_SYNCHRONISE(m_field.get_comm());
269  CHKERR VecAssemblyBegin(v);
270  CHKERR VecAssemblyEnd(v);
271  CHKERR VecGhostUpdateBegin(v, ADD_VALUES, SCATTER_REVERSE);
272  CHKERR VecGhostUpdateEnd(v, ADD_VALUES, SCATTER_REVERSE);
273  CHKERR VecGhostUpdateBegin(v, INSERT_VALUES, SCATTER_FORWARD);
274  CHKERR VecGhostUpdateEnd(v, INSERT_VALUES, SCATTER_FORWARD);
275 
276  CHKERR DMoFEMMeshToLocalVector(simple_interface->getDM(), v,
277  INSERT_VALUES, SCATTER_REVERSE);
278 
279  // CHKERR VecView(v,PETSC_VIEWER_STDOUT_WORLD);
280 
281  const MoFEM::Problem *problem_ptr;
282  CHKERR DMMoFEMGetProblemPtr(dm, &problem_ptr);
283 
284  double *array;
285  CHKERR VecGetArray(v, &array);
286  for (auto dof : *(problem_ptr->getNumeredRowDofsPtr())) {
287  auto loc_idx = dof->getPetscLocalDofIdx();
288 
289  if (dof->getFieldData() != array[loc_idx])
290  SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
291  "Data inconsistency");
292 
293  if ((*mark_dofs)[loc_idx]) {
294  if (array[loc_idx] != 0)
295  SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
296  "Dof assembled, but it should be not");
297  } else {
298  if (array[loc_idx] == 0)
299  SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
300  "Dof not assembled, but it should be");
301  }
302  }
303 
304  CHKERR VecRestoreArray(v, &array);
305  }
306  }
307  CATCH_ERRORS;
308 
309  // finish work cleaning memory, getting statistics, etc.
311 
312  return 0;
313 }
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
Definition: LogManager.hpp:348
@ ROW
Definition: definitions.h:136
#define CATCH_ERRORS
Catch errors.
Definition: definitions.h:385
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition: definitions.h:73
@ H1
continuous field
Definition: definitions.h:98
#define MYPCOMM_INDEX
default communicator number PCOMM
Definition: definitions.h:228
@ MOFEM_ATOM_TEST_INVALID
Definition: definitions.h:53
#define CHKERR
Inline error check.
Definition: definitions.h:548
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
Definition: DMMMoFEM.cpp:481
PetscErrorCode DMMoFEMGetProblemPtr(DM dm, const MoFEM::Problem **problem_ptr)
Get pointer to problem data structure.
Definition: DMMMoFEM.cpp:384
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
Definition: DMMMoFEM.cpp:59
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
Definition: DMMMoFEM.cpp:544
PetscErrorCode DMCreateGlobalVector_MoFEM(DM dm, Vec *g)
DMShellSetCreateGlobalVector.
Definition: DMMMoFEM.cpp:1105
double v
phase velocity of light in medium (cm/ns)
const Tensor1_Expr< const dTensor0< T, Dim, i >, typename promote< T, double >::V, Dim, i > d(const Tensor0< T * > &a, const Index< i, Dim > index, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
Definition: dTensor0.hpp:27
CoreTmp< 0 > Core
Definition: Core.hpp:1096
DeprecatedCoreInterface Interface
Definition: Interface.hpp:1965
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
Core (interface) class.
Definition: Core.hpp:92
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition: Core.cpp:85
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition: Core.cpp:125
Deprecated interface functions.
Set indices on entities on finite element.
keeps basic data about problem
auto & getNumeredRowDofsPtr() const
get access to numeredRowDofsPtr storing DOFs on rows
Problem manager is used to build and partition problems.
MoFEMErrorCode markDofs(const std::string problem_name, RowColData rc, const enum MarkOP op, const Range ents, std::vector< unsigned char > &marker) const
Create vector with marked indices.
Simple interface for fast problem set-up.
Definition: Simple.hpp:33
MoFEMErrorCode addDomainField(const std::string &name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on domain.
Definition: Simple.cpp:293
MoFEMErrorCode getOptions()
get options
Definition: Simple.cpp:216
MoFEMErrorCode getDM(DM *dm)
Get DM.
Definition: Simple.cpp:715
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name)
Load mesh file.
Definition: Simple.cpp:230
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
Definition: Simple.cpp:508
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
Definition: Simple.cpp:668
const std::string getProblemName() const
Get the Problem Name.
Definition: Simple.hpp:340
const std::string getDomainFEName() const
Get the Domain FE Name.
Definition: Simple.hpp:319
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.
Operator set cache stored data, in this example, global indices, but it can be any structure.
static std::vector< SharedVecInt > entsIndices
This is global static storage.
Test if cached data can be accessed, and check consistency of data.
Set integration rule.
static char help[]

Variable Documentation

◆ help

char help[] = "...\n\n"
static
Examples
test_cache_on_entities.cpp.

Definition at line 32 of file test_cache_on_entities.cpp.