Testing entities cache. Entities cache is data abstraction enabling user to pass data between operators, finite elements, and problems, in convenient way.
It can be used to store indices, or history variables, and any other data, which I can not imagine at that moment of time, and how to make use of it depends on user creativity and imagination.
static char help[] =
"...\n\n";
};
if (type == MBVERTEX)
if (auto e_ptr = field_ents[0]) {
MOFEM_LOG(
"SYNC", Sev::inform) <<
"Set " << e_ptr->getEntTypeName() <<
" "
if (auto cast_ptr = boost::dynamic_pointer_cast<MyStorage>(ptr))
MOFEM_LOG(
"SYNC", Sev::noisy) <<
"Cast works";
else
} else {
"Pointer to stored data is expected to be set");
}
if (
auto ptr = e_ptr->getSharedStoragePtr<
MyStorage>()) {
<< data.
getIndices() <<
" : " << ptr->globalIndices;
} else {
"Pointer to stored data is expected to be set");
}
} else {
"Pointer to entity should be set by finite element");
}
}
static std::vector<SharedVecInt>
};
if (auto e_ptr = field_ents[0]) {
<< "Test " << e_ptr->getEntTypeName() << " " << side;
if (
auto ptr = e_ptr->getSharedStoragePtr<
MyStorage>()) {
<< data.
getIndices() <<
" : " << ptr->globalIndices;
auto diff = data.
getIndices() - ptr->globalIndices;
auto dot = inner_prod(diff, diff);
if (dot > 0)
} else {
"Pointer to stored data is expected to be set");
}
} else {
"Pointer to entity should be set by finite element");
}
}
};
if (nb_dofs) {
std::vector<double>
v(nb_dofs, 1);
CHKERR VecSetValues<EssentialBcStorage>(
V, data, &
v[0], ADD_VALUES);
}
}
private:
};
};
int main(
int argc,
char *argv[]) {
try {
moab::Core moab_core;
moab::Interface &moab = moab_core;
DMType dm_name = "DMMOFEM";
{
auto dm = simple_interface->
getDM();
auto domain_fe = boost::make_shared<VolEle>(m_field);
domain_fe->getRuleHook =
VolRule();
auto get_skin = [&]() {
CHKERR m_field.
get_moab().get_entities_by_dimension(0, 3, ents,
true);
CHKERR skin.find_skin(0, ents,
false, skin_ents);
ParallelComm *pcomm =
CHKERR pcomm->filter_pstatus(skin_ents,
PSTATUS_SHARED | PSTATUS_MULTISHARED,
PSTATUS_NOT, -1, &proc_skin);
for (auto d : {0, 1, 2})
moab::Interface::UNION);
return proc_skin;
};
auto get_mark_skin_dofs = [&](
Range &&skin) {
auto marker_ptr = boost::make_shared<std::vector<unsigned char>>();
ProblemsManager::OR, skin,
*marker_ptr);
return marker_ptr;
};
auto mark_dofs = get_mark_skin_dofs(get_skin());
domain_fe->getOpPtrVector().push_back(
new OpVolumeSet(
"FIELD"));
domain_fe->getOpPtrVector().push_back(
new OpVolumeTest(
"FIELD"));
domain_fe->getOpPtrVector().push_back(
new OpSetBc(
"FIELD",
true, mark_dofs));
domain_fe->getOpPtrVector().push_back(
new OpUnSetBc(
"FIELD"));
domain_fe);
CHKERR VecGhostUpdateBegin(
v, ADD_VALUES, SCATTER_REVERSE);
CHKERR VecGhostUpdateEnd(
v, ADD_VALUES, SCATTER_REVERSE);
CHKERR VecGhostUpdateBegin(
v, INSERT_VALUES, SCATTER_FORWARD);
CHKERR VecGhostUpdateEnd(
v, INSERT_VALUES, SCATTER_FORWARD);
INSERT_VALUES, SCATTER_REVERSE);
double *array;
auto loc_idx = dof->getPetscLocalDofIdx();
if (dof->getFieldData() != array[loc_idx])
"Data inconsistency");
if ((*mark_dofs)[loc_idx]) {
if (array[loc_idx] != 0)
"Dof assembled, but it should be not");
} else {
if (array[loc_idx] == 0)
"Dof not assembled, but it should be");
}
}
}
}
return 0;
}
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#define MYPCOMM_INDEX
default communicator number PCOMM
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_ATOM_TEST_INVALID
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMMoFEMGetProblemPtr(DM dm, const MoFEM::Problem **problem_ptr)
Get pointer to problem data structure.
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
PetscErrorCode DMCreateGlobalVector_MoFEM(DM dm, Vec *g)
DMShellSetCreateGlobalVector.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
const double v
phase velocity of light in medium (cm/ns)
const FTensor::Tensor2< T, Dim, Dim > Vec
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
UBlasVector< int > VectorInt
implementation of Data Operators for Forces and Sources
constexpr auto field_name
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
const VectorFieldEntities & getFieldEntities() const
get field entities
const VectorInt & getIndices() const
Get global indices of dofs on entity.
default operator for TRI element
@ OPROW
operator doWork function is executed on FE rows
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.
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.
MoFEMErrorCode getOptions()
get options
MoFEMErrorCode getDM(DM *dm)
Get DM.
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name)
Load mesh file.
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
const std::string getProblemName() const
Get the Problem Name.
const std::string getDomainFEName() const
Get the Domain FE Name.
intrusive_ptr for managing petsc objects
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.
Volume finite element base.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
Operator set cache stored data, in this example, global indices, but it can be any structure.
boost::shared_ptr< MyStorage > SharedVecInt
static std::vector< SharedVecInt > entsIndices
This is global static storage.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
Test if cached data can be accessed, and check consistency of data.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
int operator()(int, int, int) const