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";
};
entsIndices.clear();
if (auto e_ptr = field_ents[0]) {
entsIndices.push_back(boost::make_shared<MyStorage>(data.
getIndices()));
e_ptr->getWeakStoragePtr() = entsIndices.back();
MOFEM_LOG(
"SYNC", Sev::inform) <<
"Set " << e_ptr->getEntTypeName() <<
" "
<< side << " : " << entsIndices.size();
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");
}
}
using SharedVecInt = boost::shared_ptr<MyStorage>;
static std::vector<SharedVecInt>
entsIndices;
};
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);
}
}
private:
};
int operator()(int, int, int) const { return 1; }
};
int main(
int argc,
char *argv[]) {
try {
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);
moab::Interface::UNION);
return proc_skin;
};
auto get_mark_skin_dofs = [&](
Range &&skin) {
auto marker_ptr = boost::make_shared<std::vector<unsigned char>>();
*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;
}