17 using namespace MoFEM;
20 static char help[] =
"-my_file input file"
21 "-my_order order of approximation"
22 "-nb_levels number of refinements levels"
67 const double z,
double &flux) {
83 const double y,
const double z,
double &value) {
99 const double y,
const double z,
double &flux) {
101 if (lastEnt == ent) {
105 for (BcFluxMap::iterator mit = bcFluxMap.begin(); mit != bcFluxMap.end();
107 Range &tris = mit->second.eNts;
108 if (tris.find(ent) != tris.end()) {
109 flux = mit->second.fLux;
134 Skinner skin(&mField.get_moab());
136 CHKERR skin.find_skin(0, tets,
false, skin_faces);
143 CHKERR it->getMeshsetIdEntitiesByDimension(mField.get_moab(), 2, tris,
145 natural_bc.insert(tris.begin(), tris.end());
150 CHKERR it->getBcDataStructure(mydata);
151 if (mydata.
data.flag1 == 1) {
153 CHKERR it->getMeshsetIdEntitiesByDimension(mField.get_moab(), 2, tris,
155 bcFluxMap[it->getMeshsetId()].eNts = tris;
156 bcFluxMap[it->getMeshsetId()].fLux = mydata.
data.value1;
161 Range essential_bc = subtract(skin_faces, natural_bc);
165 essential_bc = intersect(bit_tris, essential_bc);
166 natural_bc = intersect(bit_tris, natural_bc);
167 CHKERR mField.add_ents_to_finite_element_by_type(essential_bc, MBTRI,
169 CHKERR mField.add_ents_to_finite_element_by_type(natural_bc, MBTRI,
208 auto ref_ents_ptr = mField.get_ref_ents();
209 typedef RefEntity_multiIndex::index<
211 const RefEntsByComposite &ref_ents =
213 RefEntsByComposite::iterator rit, hi_rit;
214 rit = ref_ents.lower_bound(boost::make_tuple(MBVERTEX, MBEDGE));
215 hi_rit = ref_ents.upper_bound(boost::make_tuple(MBVERTEX, MBEDGE));
218 for (; rit != hi_rit; rit++) {
219 refined_edges.insert((*rit)->getParentEnt());
222 Range tets_to_refine;
223 const double max_error = ufe.
errorMap.rbegin()->first;
225 for (map<double, EntityHandle>::iterator mit = ufe.
errorMap.begin();
229 if (mit->first < 0.25 * max_error)
231 tets_to_refine.insert(mit->second);
233 Range tets_to_refine_edges;
234 CHKERR mField.get_moab().get_adjacencies(
235 tets_to_refine, 1,
false, tets_to_refine_edges, moab::Interface::UNION);
236 refined_edges.merge(tets_to_refine_edges);
237 CHKERR mField.getInterface(refine_ptr);
238 for (
int ll = 0; ll !=
nb_levels; ll++) {
242 edges = intersect(edges, refined_edges);
252 CHKERR updateMeshsetsFieldsAndElements(ll + 1);
257 CHKERR mField.get_moab().create_meshset(MESHSET_SET, ref_meshset);
265 CHKERR mField.get_moab().get_entities_by_type(ref_meshset, MBTET,
269 CHKERR mField.add_ents_to_field_by_type(ref_meshset, MBTET,
"FLUXES");
270 CHKERR mField.add_ents_to_field_by_type(ref_meshset, MBTET,
"VALUES");
271 CHKERR mField.set_field_order(0, MBTET,
"FLUXES",
order + 1);
272 CHKERR mField.set_field_order(0, MBTRI,
"FLUXES",
order + 1);
273 CHKERR mField.set_field_order(0, MBTET,
"VALUES",
order);
279 CHKERR mField.add_ents_to_finite_element_by_type(ref_tris, MBTRI,
286 CHKERR it->getAttributeDataStructure(temp_data);
287 setOfBlocks[it->getMeshsetId()].cOnductivity =
288 temp_data.
data.Conductivity;
289 setOfBlocks[it->getMeshsetId()].cApacity = temp_data.
data.HeatCapacity;
290 CHKERR mField.get_moab().get_entities_by_type(
291 it->meshset, MBTET, setOfBlocks[it->getMeshsetId()].tEts,
true);
292 setOfBlocks[it->getMeshsetId()].tEts =
293 intersect(ref_tets, setOfBlocks[it->getMeshsetId()].tEts);
294 CHKERR mField.add_ents_to_finite_element_by_type(
295 setOfBlocks[it->getMeshsetId()].tEts, MBTET,
"MIX");
298 CHKERR mField.get_moab().delete_entities(&ref_meshset, 1);
317 auto ref_ents_ptr = mField.get_ref_ents();
318 RefEntity_multiIndex::iterator mit = ref_ents_ptr->begin();
319 for (; mit != ref_ents_ptr->end(); mit++) {
320 if (mit->get()->getEntType() == MBENTITYSET)
323 if ((all_but_0 &
bit) ==
bit) {
324 *(
const_cast<RefEntity *
>(mit->get())->getBitRefLevelPtr()) =
327 *(
const_cast<RefEntity *
>(mit->get())->getBitRefLevelPtr()) =
347 ->updateMeshsetByEntitiesChildren(meshset, ref_level, meshset,
354 int main(
int argc,
char *argv[]) {
356 const string default_options =
"-ksp_type fgmres \n"
358 "-pc_factor_mat_solver_type mumps \n"
359 "-mat_mumps_icntl_20 0 \n"
362 string param_file =
"param_file.petsc";
363 if (!
static_cast<bool>(ifstream(param_file))) {
364 std::ofstream file(param_file.c_str(), std::ios::ate);
365 if (file.is_open()) {
366 file << default_options;
378 MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
381 PetscBool flg = PETSC_TRUE;
385 if (flg != PETSC_TRUE) {
387 "*** ERROR -my_file (MESH FILE NEEDED)");
403 PetscPrintf(PETSC_COMM_WORLD,
404 "Read meshsets add added meshsets for bc.cfg\n");
406 PetscPrintf(PETSC_COMM_WORLD,
"%s",
407 static_cast<std::ostringstream &
>(
408 std::ostringstream().seekp(0) << *it << endl)
426 if (flg != PETSC_TRUE) {
456 for (
int ll = 1; ll !=
nb_levels; ll++) {
470 static_cast<std::ostringstream &
>(std::ostringstream().seekp(0)