v0.15.0
Loading...
Searching...
No Matches
MyTransport Struct Reference

Application of mix transport data structure. More...

Inheritance diagram for MyTransport:
[legend]
Collaboration diagram for MyTransport:
[legend]

Public Member Functions

 MyTransport (MoFEM::Interface &m_field)
 
MoFEMErrorCode getSource (EntityHandle ent, const double x, const double y, const double z, double &flux)
 set source term
 
MoFEMErrorCode getBcOnValues (const EntityHandle ent, const double x, const double y, const double z, double &value)
 
MoFEMErrorCode getBcOnFluxes (const EntityHandle ent, const double x, const double y, const double z, double &flux)
 essential (Neumann) boundary condition (set fluxes)
 
 MyTransport (MoFEM::Interface &m_field, BcFluxMap &bc_flux_map)
 
MoFEMErrorCode getSource (EntityHandle ent, const double x, const double y, const double z, double &flux)
 set source term
 
MoFEMErrorCode getBcOnValues (const EntityHandle ent, const double x, const double y, const double z, double &value)
 natural (Dirihlet) boundary conditions (set values)
 
MoFEMErrorCode getBcOnFluxes (const EntityHandle ent, const double x, const double y, const double z, double &flux)
 essential (Neumann) boundary condition (set fluxes)
 
MoFEMErrorCode addBoundaryElements (BitRefLevel &ref_level)
 set-up boundary conditions
 
MoFEMErrorCode refineMesh (MixTransportElement &ufe, const int nb_levels, const int order)
 Refine mesh.
 
MoFEMErrorCode squashBits ()
 Squash bits of entities.
 
MoFEMErrorCode updateMeshsetsFieldsAndElements (const int nb_levels)
 update meshsets with new entities after mesh refinement
 
- Public Member Functions inherited from MixTransport::MixTransportElement
 MixTransportElement (MoFEM::Interface &m_field)
 construction of this data structure
 
virtual ~MixTransportElement ()
 destructor
 
MoFEMErrorCode getDirichletBCIndices (IS *is)
 get dof indices where essential boundary conditions are applied
 
virtual MoFEMErrorCode getResistivity (const EntityHandle ent, const double x, const double y, const double z, MatrixDouble3by3 &inv_k)
 natural (Dirichlet) boundary conditions (set values)
 
virtual MoFEMErrorCode getBcOnValues (const EntityHandle ent, const int gg, const double x, const double y, const double z, double &value)
 evaluate natural (Dirichlet) boundary conditions
 
MoFEMErrorCode addFields (const std::string &values, const std::string &fluxes, const int order)
 Add fields to database.
 
MoFEMErrorCode addFiniteElements (const std::string &fluxes_name, const std::string &values_name)
 add finite elements
 
MoFEMErrorCode buildProblem (BitRefLevel &ref_level)
 Build problem.
 
MoFEMErrorCode postProc (const string out_file)
 Post process results.
 
MoFEMErrorCode createMatrices ()
 create matrices
 
MoFEMErrorCode solveLinearProblem ()
 solve problem
 
MoFEMErrorCode calculateResidual ()
 calculate residual
 
MoFEMErrorCode evaluateError ()
 Calculate error on elements.
 
MoFEMErrorCode destroyMatrices ()
 destroy matrices
 

Public Attributes

BcFluxMapbcFluxMap
 
EntityHandle lastEnt
 
double lastFlux
 
- Public Attributes inherited from MixTransport::MixTransportElement
MoFEM::InterfacemField
 
MyVolumeFE feVol
 Instance of volume element.
 
MyTriFE feTri
 Instance of surface element.
 
VectorDouble valuesAtGaussPts
 values at integration points on element
 
MatrixDouble valuesGradientAtGaussPts
 gradients at integration points on element
 
VectorDouble divergenceAtGaussPts
 divergence at integration points on element
 
MatrixDouble fluxesAtGaussPts
 fluxes at integration points on element
 
set< int > bcIndices
 
std::map< int, BlockDatasetOfBlocks
 maps block set id with appropriate BlockData
 
Vec D
 
Vec D0
 
Vec F
 
Mat Aij
 
map< double, EntityHandleerrorMap
 
double sumErrorFlux
 
double sumErrorDiv
 
double sumErrorJump
 

Detailed Description

Application of mix transport data structure.

define sources and other stuff

MixTransportElement is a class collecting functions, operators and data for mix implementation of transport element. See there to learn how elements are created or how operators look like.

Some methods in MixTransportElement are abstract, f.e. user need to implement own source therm.

MixTransportElement is a class collecting functions, operators and data for mix implementation of transport element. See there to learn how elements are created or how operators look like.

Some methods in MixTransportElement are abstract, f.e. user need to implement own source therm.

Definition at line 24 of file mix_transport.cpp.

Constructor & Destructor Documentation

◆ MyTransport() [1/2]

MyTransport::MyTransport ( MoFEM::Interface & m_field)
inline

Definition at line 26 of file mix_transport.cpp.

26: MixTransportElement(m_field){};
MixTransportElement(MoFEM::Interface &m_field)
construction of this data structure

◆ MyTransport() [2/2]

MyTransport::MyTransport ( MoFEM::Interface & m_field,
BcFluxMap & bc_flux_map )
inline

Definition at line 56 of file h_adaptive_transport.cpp.

57 : MixTransportElement(m_field), bcFluxMap(bc_flux_map), lastEnt(0),
58 lastFlux(0) {}

Member Function Documentation

◆ addBoundaryElements()

MoFEMErrorCode MyTransport::addBoundaryElements ( BitRefLevel & ref_level)
inline

set-up boundary conditions

Parameters
ref_levelmesh refinement level
Note
It is assumed that user would like to something non-standard with boundary conditions, have a own type of data structures to pass to functions calculating values and fluxes on boundary. For example BcFluxMap. That way this function is implemented here not in generic class MixTransportElement.
Returns
error code

Definition at line 132 of file h_adaptive_transport.cpp.

132 {
134 Range tets;
135 CHKERR mField.getInterface<BitRefManager>()->getEntitiesByTypeAndRefLevel(
136 ref_level, BitRefLevel().set(), MBTET, tets);
137 Skinner skin(&mField.get_moab());
138 Range skin_faces; // skin faces from 3d ents
139 CHKERR skin.find_skin(0, tets, false, skin_faces);
140 // note: what is essential (dirichlet) is natural (neumann) for mix-FE
141 // compared to classical FE
142 Range natural_bc;
144 mField, NODESET | TEMPERATURESET, it)) {
145 Range tris;
146 CHKERR it->getMeshsetIdEntitiesByDimension(mField.get_moab(), 2, tris,
147 true);
148 natural_bc.insert(tris.begin(), tris.end());
149 }
151 mField, SIDESET | HEATFLUXSET, it)) {
152 HeatFluxCubitBcData mydata;
153 CHKERR it->getBcDataStructure(mydata);
154 if (mydata.data.flag1 == 1) {
155 Range tris;
156 CHKERR it->getMeshsetIdEntitiesByDimension(mField.get_moab(), 2, tris,
157 true);
158 bcFluxMap[it->getMeshsetId()].eNts = tris;
159 bcFluxMap[it->getMeshsetId()].fLux = mydata.data.value1;
160 // cerr << bcFluxMap[it->getMeshsetId()].eNts << endl;
161 // cerr << bcFluxMap[it->getMeshsetId()].fLux << endl;
162 }
163 }
164 Range essential_bc = subtract(skin_faces, natural_bc);
165 Range bit_tris;
166 CHKERR mField.getInterface<BitRefManager>()->getEntitiesByTypeAndRefLevel(
167 ref_level, BitRefLevel().set(), MBTRI, bit_tris);
168 essential_bc = intersect(bit_tris, essential_bc);
169 natural_bc = intersect(bit_tris, natural_bc);
171 "MIX_BCFLUX");
173 "MIX_BCVALUE");
174 // CHKERR
175 // mField.add_ents_to_finite_element_by_type(skin_faces,MBTRI,"MIX_BCVALUE");
177 }
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ TEMPERATURESET
@ HEATFLUXSET
@ NODESET
@ SIDESET
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
virtual MoFEMErrorCode add_ents_to_finite_element_by_type(const EntityHandle entities, const EntityType type, const std::string name, const bool recursive=true)=0
add entities to finite element
#define _IT_CUBITMESHSETS_BY_BCDATA_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet in a moFEM field.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition Types.hpp:40
Managing BitRefLevels.
virtual moab::Interface & get_moab()=0
Definition of the heat flux bc data structure.
Definition BCData.hpp:423
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.

◆ getBcOnFluxes() [1/2]

MoFEMErrorCode MyTransport::getBcOnFluxes ( const EntityHandle ent,
const double x,
const double y,
const double z,
double & flux )
inlinevirtual

essential (Neumann) boundary condition (set fluxes)

Parameters
enthandle to finite element entity
xcoord
ycoord
zcoord
fluxreference to flux which is set by function
Returns
[description]

Reimplemented from MixTransport::MixTransportElement.

Definition at line 43 of file mix_transport.cpp.

44 {
46 flux = 0;
48 }
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...

◆ getBcOnFluxes() [2/2]

MoFEMErrorCode MyTransport::getBcOnFluxes ( const EntityHandle ent,
const double x,
const double y,
const double z,
double & flux )
inlinevirtual

essential (Neumann) boundary condition (set fluxes)

Parameters
enthandle to finite element entity
xcoord
ycoord
zcoord
fluxreference to flux which is set by function
Returns
[description]

Reimplemented from MixTransport::MixTransportElement.

Definition at line 101 of file h_adaptive_transport.cpp.

102 {
104 if (lastEnt == ent) {
105 flux = lastFlux;
106 } else {
107 flux = 0;
108 for (BcFluxMap::iterator mit = bcFluxMap.begin(); mit != bcFluxMap.end();
109 mit++) {
110 Range &tris = mit->second.eNts;
111 if (tris.find(ent) != tris.end()) {
112 flux = mit->second.fLux;
113 }
114 }
115 lastEnt = ent;
116 lastFlux = flux;
117 }
119 }

◆ getBcOnValues() [1/2]

MoFEMErrorCode MyTransport::getBcOnValues ( const EntityHandle ent,
const double x,
const double y,
const double z,
double & value )
inline

Definition at line 36 of file mix_transport.cpp.

37 {
39 value = 1;
41 }

◆ getBcOnValues() [2/2]

MoFEMErrorCode MyTransport::getBcOnValues ( const EntityHandle ent,
const double x,
const double y,
const double z,
double & value )
inline

natural (Dirihlet) boundary conditions (set values)

Parameters
enthandle to finite element entity
xcoord
ycoord
zcoord
valuereference to value set by function
Returns
error code

Definition at line 85 of file h_adaptive_transport.cpp.

86 {
88 value = 0;
90 }

◆ getSource() [1/2]

MoFEMErrorCode MyTransport::getSource ( EntityHandle ent,
const double x,
const double y,
const double z,
double & flux )
inlinevirtual

set source term

Parameters
enthandle to entity on which function is evaluated
xcoord
ycoord
zcoord
fluxreference to source term set by function
Returns
error code

Reimplemented from MixTransport::MixTransportElement.

Definition at line 28 of file mix_transport.cpp.

29 {
31 // double d = std::sqrt(x*x+y*y+z*z);
32 flux = 1; //-pow(d,5./4.);
34 }

◆ getSource() [2/2]

MoFEMErrorCode MyTransport::getSource ( EntityHandle ent,
const double x,
const double y,
const double z,
double & flux )
inlinevirtual

set source term

Parameters
enthandle to entity on which function is evaluated
xcoord
ycoord
zcoord
fluxreference to source term set by function
Returns
error code

Reimplemented from MixTransport::MixTransportElement.

Definition at line 69 of file h_adaptive_transport.cpp.

70 {
72 flux = 0;
74 }

◆ refineMesh()

MoFEMErrorCode MyTransport::refineMesh ( MixTransportElement & ufe,
const int nb_levels,
const int order )
inline

Refine mesh.

Parameters
ufegeneral data structure
nb_levelsnumber of refinement levels
orderset order of approximation
Returns
errpr code

Refinement of could result in distorted mesh, for example, imagine when you have two levels of non-uniform refinement. Some tetrahedra on the mesh at first refinement instance are only refined by splitting subset of edges on it. Then refined child tetrahedra usually will have worse quality than quality of parent element. Refining such element in subsequent mesh refinement, potentially will deteriorate elements quality even worse. To prevent that adding new refinement level, recreate whole hierarchy of meshes.

Note on subsequent improvement could include refinement of tetrahedra from different levels, including initial mesh. So refinement two could split elements created during refinement one and also split elements from an initial mesh.

That adding the new refinement level creates refinement hierarchy of meshes from a scratch, not adding to existing one.

Entities from previous hierarchy are used in that process, but bit levels on those entities are squashed.

Definition at line 206 of file h_adaptive_transport.cpp.

207 {
208 MeshRefinement *refine_ptr;
210 // get refined edges having child vertex
211 auto ref_ents_ptr = mField.get_ref_ents();
212 typedef RefEntity_multiIndex::index<
213 Composite_EntType_and_ParentEntType_mi_tag>::type RefEntsByComposite;
214 const RefEntsByComposite &ref_ents =
216 RefEntsByComposite::iterator rit, hi_rit;
217 rit = ref_ents.lower_bound(boost::make_tuple(MBVERTEX, MBEDGE));
218 hi_rit = ref_ents.upper_bound(boost::make_tuple(MBVERTEX, MBEDGE));
219 Range refined_edges;
220 // thist loop is over vertices which parent is edge
221 for (; rit != hi_rit; rit++) {
222 refined_edges.insert((*rit)->getParentEnt()); // get parent edge
223 }
224 // get tets which has large error
225 Range tets_to_refine;
226 const double max_error = ufe.errorMap.rbegin()->first;
227 // int size = ((double)5/6)*ufe.errorMap.size();
228 for (map<double, EntityHandle>::iterator mit = ufe.errorMap.begin();
229 mit != ufe.errorMap.end(); mit++) {
230 // cerr << mit->first << " " << mit->second << endl;
231 // if((size--)>0) continue;
232 if (mit->first < 0.25 * max_error)
233 continue;
234 tets_to_refine.insert(mit->second);
235 }
236 Range tets_to_refine_edges;
237 CHKERR mField.get_moab().get_adjacencies(
238 tets_to_refine, 1, false, tets_to_refine_edges, moab::Interface::UNION);
239 refined_edges.merge(tets_to_refine_edges);
240 CHKERR mField.getInterface(refine_ptr);
241 for (int ll = 0; ll != nb_levels; ll++) {
242 Range edges;
243 CHKERR mField.getInterface<BitRefManager>()->getEntitiesByTypeAndRefLevel(
244 BitRefLevel().set(ll), BitRefLevel().set(), MBEDGE, edges);
245 edges = intersect(edges, refined_edges);
246 // add edges to refine at current level edges (some of the where refined
247 // before)
249 edges, BitRefLevel().set(ll + 1));
250 // get tets at current level
251 Range tets;
252 CHKERR mField.getInterface<BitRefManager>()->getEntitiesByTypeAndRefLevel(
253 BitRefLevel().set(ll), BitRefLevel().set(), MBTET, tets);
254 CHKERR refine_ptr->refineTets(tets, BitRefLevel().set(ll + 1));
256 }
257
258 // update fields and elements
259 EntityHandle ref_meshset;
260 CHKERR mField.get_moab().create_meshset(MESHSET_SET, ref_meshset);
261 {
262 // cerr << BitRefLevel().set(nb_levels) << endl;
263 CHKERR mField.getInterface<BitRefManager>()->getEntitiesByTypeAndRefLevel(
264 BitRefLevel().set(nb_levels), BitRefLevel().set(), MBTET,
265 ref_meshset);
266
267 Range ref_tets;
268 CHKERR mField.get_moab().get_entities_by_type(ref_meshset, MBTET,
269 ref_tets);
270
271 // add entities to field
272 CHKERR mField.add_ents_to_field_by_type(ref_meshset, MBTET, "FLUXES");
273 CHKERR mField.add_ents_to_field_by_type(ref_meshset, MBTET, "VALUES");
274 CHKERR mField.set_field_order(0, MBTET, "FLUXES", order + 1);
275 CHKERR mField.set_field_order(0, MBTRI, "FLUXES", order + 1);
276 CHKERR mField.set_field_order(0, MBTET, "VALUES", order);
277
278 // add entities to skeleton
279 Range ref_tris;
280 CHKERR mField.getInterface<BitRefManager>()->getEntitiesByTypeAndRefLevel(
281 BitRefLevel().set(nb_levels), BitRefLevel().set(), MBTRI, ref_tris);
283 "MIX_SKELETON");
284
285 // add entities to finite elements
288 Mat_Thermal temp_data;
289 CHKERR it->getAttributeDataStructure(temp_data);
290 setOfBlocks[it->getMeshsetId()].cOnductivity =
291 temp_data.data.Conductivity;
292 setOfBlocks[it->getMeshsetId()].cApacity = temp_data.data.HeatCapacity;
293 CHKERR mField.get_moab().get_entities_by_type(
294 it->meshset, MBTET, setOfBlocks[it->getMeshsetId()].tEts, true);
295 setOfBlocks[it->getMeshsetId()].tEts =
296 intersect(ref_tets, setOfBlocks[it->getMeshsetId()].tEts);
298 setOfBlocks[it->getMeshsetId()].tEts, MBTET, "MIX");
299 }
300 }
301 CHKERR mField.get_moab().delete_entities(&ref_meshset, 1);
303 }
@ MAT_THERMALSET
block name is "MAT_THERMAL"
@ BLOCKSET
constexpr int order
virtual const RefEntity_multiIndex * get_ref_ents() const =0
Get the ref ents object.
virtual MoFEMErrorCode set_field_order(const EntityHandle meshset, const EntityType type, const std::string &name, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)=0
Set order approximation of the entities in the field.
virtual MoFEMErrorCode add_ents_to_field_by_type(const Range &ents, const EntityType type, const std::string &name, int verb=DEFAULT_VERBOSITY)=0
Add entities to field meshset.
constexpr int nb_levels
Definition level_set.cpp:58
std::map< int, BlockData > setOfBlocks
maps block set id with appropriate BlockData
Thermal material data structure.
Mesh refinement interface.
MoFEMErrorCode refineTets(const EntityHandle meshset, const BitRefLevel &bit, int verb=QUIET, const bool debug=false)
refine TET in the meshset
MoFEMErrorCode addVerticesInTheMiddleOfEdges(const EntityHandle meshset, const BitRefLevel &bit, const bool recursive=false, int verb=QUIET, EntityHandle start_v=0)
make vertices in the middle of edges in meshset and add them to refinement levels defined by bit
MoFEMErrorCode updateMeshsetsFieldsAndElements(const int nb_levels)
update meshsets with new entities after mesh refinement

◆ squashBits()

MoFEMErrorCode MyTransport::squashBits ( )
inline

Squash bits of entities.

Information about hierarchy of meshsets is lost, but entities are not deleted from the mesh. After squash entities bits, new hierarchy can be created.

Returns
error code

Definition at line 313 of file h_adaptive_transport.cpp.

313 {
315 BitRefLevel all_but_0;
316 all_but_0.set(0);
317 all_but_0.flip();
318 BitRefLevel garbage_bit;
319 garbage_bit.set(BITREFLEVEL_SIZE - 1); // Garbage level
320 auto ref_ents_ptr = mField.get_ref_ents();
321 RefEntity_multiIndex::iterator mit = ref_ents_ptr->begin();
322 for (; mit != ref_ents_ptr->end(); mit++) {
323 if (mit->get()->getEntType() == MBENTITYSET)
324 continue;
325 BitRefLevel bit = mit->get()->getBitRefLevel();
326 if ((all_but_0 & bit) == bit) {
327 *(const_cast<RefEntity *>(mit->get())->getBitRefLevelPtr()) =
328 garbage_bit;
329 } else {
330 *(const_cast<RefEntity *>(mit->get())->getBitRefLevelPtr()) =
331 BitRefLevel().set(0);
332 }
333 }
335 }
#define BITREFLEVEL_SIZE
max number of refinements
auto bit
set bit
Struct keeps handle to refined handle.

◆ updateMeshsetsFieldsAndElements()

MoFEMErrorCode MyTransport::updateMeshsetsFieldsAndElements ( const int nb_levels)
inline

update meshsets with new entities after mesh refinement

Parameters
nb_levelsnb_levels
orderappropriate order
Returns
error code

Definition at line 343 of file h_adaptive_transport.cpp.

343 {
344 BitRefLevel ref_level;
346 ref_level.set(nb_levels);
348 EntityHandle meshset = it->meshset;
350 ->updateMeshsetByEntitiesChildren(meshset, ref_level, meshset,
351 MBMAXTYPE, true);
352 }
354 }
#define _IT_CUBITMESHSETS_FOR_LOOP_(MESHSET_MANAGER, IT)
Iterator that loops over all the Cubit MeshSets in a moFEM field.

Member Data Documentation

◆ bcFluxMap

BcFluxMap& MyTransport::bcFluxMap

Definition at line 52 of file h_adaptive_transport.cpp.

◆ lastEnt

EntityHandle MyTransport::lastEnt

Definition at line 53 of file h_adaptive_transport.cpp.

◆ lastFlux

double MyTransport::lastFlux

Definition at line 54 of file h_adaptive_transport.cpp.


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