v0.15.0
Loading...
Searching...
No Matches
BcManager.hpp
Go to the documentation of this file.
1/** \file BcManager.hpp
2 * \brief Manage boundary conditions set to the problem
3 * \ingroup bc_manager
4 *
5 */
6
7#ifndef __BCMANAGER_HPP__
8#define __BCMANAGER_HPP__
9
10#include "UnknownInterface.hpp"
11
12namespace MoFEM {
13
14template <CubitBC BC> struct BcMeshsetType {};
15template <CubitBC BC> struct BcScalarMeshsetType {};
16template <CubitBC BC> using BcTemperature = BcScalarMeshsetType<BC>;
17template <CubitBC BC> struct BcDisplacementMeshsetType {};
18template <CubitBC BC> struct BcForceMeshsetType {};
19template <CubitBC BC> struct BcFluxMeshsetType {};
20template <CubitBC BC> struct BcNormalDisplacementMeshsetType {};
21template <CubitBC BC> struct BcAnalyticalDisplacementMeshsetType {};
22template <CubitBC BC> struct BcAnalyticalTractionMeshsetType {};
23template <CubitBC BC> struct BcPressureMeshsetType {};
24
25/**
26 * \brief Simple interface for fast problem set-up
27 * \ingroup mofem_simple_interface
28 */
29struct BcManager : public UnknownInterface {
30
31 MoFEMErrorCode query_interface(boost::typeindex::type_index type_index,
32 UnknownInterface **iface) const;
33
34 BcManager(const MoFEM::Core &core);
35 virtual ~BcManager() = default;
36
37 /**
38 * @brief Data structure storing bc markers and atributes
39 *
40 */
41 struct BCs : boost::enable_shared_from_this<BCs> {
43 std::vector<double> bcAttributes;
44 std::vector<unsigned char> bcMarkers;
45
46 using DofsView = std::vector<boost::weak_ptr<NumeredDofEntity>>;
47 boost::shared_ptr<DofsView> dofsViewPtr;
48
49 boost::shared_ptr<DisplacementCubitBcData> dispBcPtr;
50 boost::shared_ptr<TemperatureCubitBcData> tempBcPtr;
51 boost::shared_ptr<HeatFluxCubitBcData> heatFluxBcPtr;
52 boost::shared_ptr<ForceCubitBcData> forceBcPtr;
53 boost::shared_ptr<PressureCubitBcData> pressureBcPtr;
54
55 /// \deprecated use getBcEntsPtr
56 DEPRECATED inline auto getBcEdgesPtr() {
57 return boost::shared_ptr<Range>(shared_from_this(), &bcEnts);
58 }
59
60 inline auto getBcEntsPtr() {
61 return boost::shared_ptr<Range>(shared_from_this(), &bcEnts);
62 }
63
64 inline auto getBcMarkersPtr() {
65 return boost::shared_ptr<std::vector<unsigned char>>(shared_from_this(),
66 &bcMarkers);
67 }
68 };
69
70 /**
71 * \brief get options
72 * @return error code
73 */
75
76 /**
77 * @brief Mark side DOFs
78 *
79 * @param problem_name
80 * @param block_name
81 * @param field_name
82 * @param lo
83 * @param hi
84 * @return MoFEMErrorCode
85 */
86 MoFEMErrorCode pushMarkSideDofs(const std::string problem_name,
87 const std::string block_name,
88 const std::string field_name, int bridge_dim,
89 int lo, int hi);
90
91 /**
92 * @brief Remove side DOFs
93 *
94 * @param problem_name
95 * @param block_name
96 * @param field_name
97 * @param lo
98 * @param hi
99 * @param is_distributed_mesh
100 * @return MoFEMErrorCode
101 */
102 MoFEMErrorCode removeSideDOFs(const std::string problem_name,
103 const std::string block_name,
104 const std::string field_name, int bridge_dim,
105 int lo, int hi,
106 bool is_distributed_mesh = true);
107
108 /**
109 * @brief Remove DOFs from problem
110 *
111 * @param problem_name
112 * @param block_name
113 * @param field_name
114 * @param lo lowest coefficient
115 * @param hi highest coefficient
116 * @param get_low_dim_ents get lower dimension entities
117 * @param is_distributed_mesh distributed mesh
118 * @return MoFEMErrorCode
119 */
120 MoFEMErrorCode removeBlockDOFsOnEntities(const std::string problem_name,
121 const std::string block_name,
122 const std::string field_name, int lo,
123 int hi, bool get_low_dim_ents = true,
124 bool is_distributed_mesh = true);
125
126 /**
127 * @brief Mark block DOFs
128 *
129 * @param problem_name
130 * @param block_name
131 * @param field_name
132 * @param lo lowest coefficient
133 * @param hi highest coefficient
134 * @param get_low_dim_ents get lower dimension entities
135 * field name
136 * @return MoFEMErrorCode
137 */
138 MoFEMErrorCode pushMarkDOFsOnEntities(const std::string problem_name,
139 const std::string block_name,
140 const std::string field_name, int lo,
141 int hi, bool get_low_dim_ents = true);
142
143 /**
144 * @brief Mark block DOFs
145 *
146 * @tparam BCSET
147 * @param problem_name
148 * @param field_name
149 * @param get_low_dim_ents
150 * @param is_distributed_mesh
151 * @param block_name_field_prefix
152 * @return MoFEMErrorCode
153 */
154 template <typename T>
155 MoFEMErrorCode removeBlockDOFsOnEntities(const std::string problem_name,
156 const std::string field_name,
157 bool get_low_dim_ents = true,
158 bool block_name_field_prefix = false,
159 bool is_distributed_mesh = true);
160
161 /**
162 * @brief Mark block DOFs
163 *
164 * @param problem_name
165 * @param field_name
166 * @param get_low_dim_ents get lower dimension entities
167 * @param block_name_field_prefix
168 * @return MoFEMErrorCode
169 */
170 template <typename T>
171 MoFEMErrorCode pushMarkDOFsOnEntities(const std::string problem_name,
172 const std::string field_name,
173 bool get_low_dim_ents = true,
174 bool block_name_field_prefix = false);
175
176 /**
177 * @brief Mark block DOFs
178 *
179 * @tparam BCSET
180 * @param problem_name
181 * @param field_name
182 * @param block_name
183 * @param get_low_dim_ents
184 * @param is_distributed_mesh
185 * @return MoFEMErrorCode
186 */
187 template <typename T>
188 MoFEMErrorCode removeBlockDOFsOnEntities(const std::string problem_name,
189 const std::string block_name,
190 const std::string field_name,
191 bool get_low_dim_ents = true,
192 bool is_distributed_mesh = true);
193
194 /**
195 * @brief Mark block DOFs
196 *
197 * @param problem_name
198 * @param field_name
199 * @param block_name
200 * @param get_low_dim_ents get lower dimension entities
201 * @return MoFEMErrorCode
202 */
203 template <typename T>
204 MoFEMErrorCode pushMarkDOFsOnEntities(const std::string problem_name,
205 const std::string block_name,
206 const std::string field_name,
207 bool get_low_dim_ents = true);
208
209 /**
210 * @brief Get bc data and remove element
211 *
212 * @param block_name
213 * @return boost::shared_ptr<BCs>
214 */
215 boost::shared_ptr<BCs> popMarkDOFsOnEntities(const std::string block_name);
216
217 /** \todo Add markers for standard BCs from cubit on Nodests and Sidesets used
218 * bu cubit for displacements, forces, etc. Also add function to add blockset
219 * by id and type.
220 */
221
222 using BcMapByBlockName = std::map<string, boost::shared_ptr<BCs>>;
223
224 using BcMarkerPtr = boost::shared_ptr<std::vector<char unsigned>>;
225 /**
226 * @brief Get the bc structure object
227 *
228 * @param block_name
229 * @return auto
230 */
231 inline auto getBcStructure(const std::string bc_id) {
232 return bcMapByBlockName.at(bc_id);
233 }
234
235 /**
236 * @brief Get the bc map
237 *
238 * @return auto
239 */
241
242 /**
243 * @brief Merge block ranges
244 *
245 * @param bc_regex_vec
246 * @return Range
247 */
248 Range getMergedBlocksRange(std::vector<std::regex> bc_regex_vec);
249
250 /**
251 * @brief Merge block ranges
252 *
253 * @param bc_names
254 * @return auto
255 */
256 inline auto getMergedBlocksRange(std::vector<string> bc_names) {
257 std::vector<std::regex> reg_vec(bc_names.size());
258 for (int i = 0; i != bc_names.size(); ++i) {
259 auto full_name = std::string("(.*)_") + bc_names[i] + std::string("(.*)");
260 reg_vec[i] = std::regex(full_name);
261 }
262 return getMergedBlocksRange(reg_vec);
263 }
264
265 /**
266 * @brief Get the Merged Boundary Marker object
267 *
268 * @param bc_regex_vec boundary name regex vector
269 * @return boundaryMarker
270 */
271 BcMarkerPtr getMergedBlocksMarker(std::vector<std::regex> bc_regex_vec);
272 /**
273 * @brief Get the Merged Boundary Marker object
274 *
275 * @param bc_names vector of boundary names
276 * @return boundaryMarker
277 */
278 inline auto getMergedBlocksMarker(std::vector<string> bc_names) {
279 std::vector<std::regex> reg_vec(bc_names.size());
280 for (int i = 0; i != bc_names.size(); ++i) {
281 auto full_name = std::string("(.*)_") + bc_names[i] + std::string("(.*)");
282 reg_vec[i] = std::regex(full_name);
283 }
284 return getMergedBlocksMarker(reg_vec);
285 }
286 /**
287 * @brief Get the Merged Blocks Marker object
288 *
289 * @param boundary_markers_ptr_vec vector of boundary markers to merge
290 * @return BcMarkerPtr
291 */
293 const std::vector<BcMarkerPtr> &boundary_markers_ptr_vec);
294
295 /**
296 * @brief check if given boundary condition name is in the map bc element
297 *
298 * @param bc element of the map
299 * @param reg bc regex
300 * @return auto
301 */
302 inline auto checkBlock(const std::pair<string, boost::shared_ptr<BCs>> &bc,
303 std::regex reg) {
304 return std::regex_match(bc.first, reg);
305 }
306 /**
307 * @brief check if given boundary condition name is in the map bc element
308 *
309 * @param bc element of the map
310 * @param name bc name
311 * @return auto
312 */
313 inline auto
314 checkBlock(const std::pair<std::string, boost::shared_ptr<BCs>> &bc,
315 std::string name) {
316 auto full_name = std::string("(.*)_") + name + std::string("(.*)");
317 return checkBlock(bc, std::regex(full_name));
318 }
319
320 /**
321 * @brief Get block IS
322 *
323 * @param block_prefix for hashmap
324 * @param block_name for hash map
325 * @param field_name for hash map and IS
326 * @param problem_name for IS
327 * @param lo
328 * @param hi
329 * @param is_expand is to extend
330 * @return SmartPetscObj<IS>
331 */
333 getBlockIS(const std::string block_prefix, const std::string block_name,
334 const std::string field_name, const std::string problem_name,
335 int lo, int hi, SmartPetscObj<IS> is_expand = SmartPetscObj<IS>());
336
337 /**
338 * @brief Get block IS
339 *
340 * @param problem_name
341 * @param block_name
342 * @param field_name
343 * @param lo
344 * @param hi
345 * @param is_expand is to extend
346 * @return SmartPetscObj<IS>
347 */
349 getBlockIS(const std::string problem_name, const std::string block_name,
350 const std::string field_name, int lo, int hi,
352
353 /**
354 * @brief Extract block name and block name form block id
355 *
356 * @param block_id
357 * @param prb_name
358 * @return std::pair<std::string, std::string>
359 */
360 static std::pair<std::string, std::string>
361 extractStringFromBlockId(const std::string block_id,
362 const std::string prb_name);
363
364private:
366
368};
369
370template <>
373 const std::string problem_name, const std::string field_name,
374 bool get_low_dim_ents, bool block_name_field_prefix,
375 bool is_distributed_mesh);
376
377template <>
380 const std::string problem_name, const std::string field_name,
381 bool get_low_dim_ents, bool block_name_field_prefix,
382 bool is_distributed_mesh);
383
384template <>
386 const std::string problem_name, const std::string field_name,
387 bool get_low_dim_ents, bool block_name_field_prefix,
388 bool is_distributed_mesh);
389
390template <>
393 const std::string problem_name, const std::string field_name,
394 bool get_low_dim_ents, bool block_name_field_prefix,
395 bool is_distributed_mesh);
396
397template <>
400 const std::string problem_name, const std::string block_name,
401 const std::string field_name, bool get_low_dim_ents,
402 bool is_distributed_mesh);
403
404template <>
407 const std::string problem_name, const std::string field_name,
408 bool get_low_dim_ents, bool block_name_field_prefix);
409
410template <>
412 const std::string problem_name, const std::string field_name,
413 bool get_low_dim_ents, bool block_name_field_prefix);
414
415template <>
417 const std::string problem_name, const std::string field_name,
418 bool get_low_dim_ents, bool block_name_field_prefix);
419
420template <>
423 const std::string problem_name, const std::string field_name,
424 bool get_low_dim_ents, bool block_name_field_prefix);
425
426template <>
428 const std::string problem_name, const std::string field_name,
429 const std::string block_name, bool get_low_dim_ents);
430
431template <>
433 const std::string problem_name, const std::string field_name,
434 bool get_low_dim_ents, bool block_name_field_prefix);
435
436template <>
438 const std::string problem_name, const std::string field_name,
439 bool get_low_dim_ents, bool block_name_field_prefix,
440 bool is_distributed_mesh);
441
442template <>
444 const std::string problem_name, const std::string field_name,
445 bool get_low_dim_ents, bool block_name_field_prefix);
446
447template <>
449 const std::string problem_name, const std::string field_name,
450 bool get_low_dim_ents, bool block_name_field_prefix,
451 bool is_distributed_mesh);
452
453template <>
455 const std::string problem_name, const std::string field_name,
456 bool get_low_dim_ents, bool block_name_field_prefix);
457
458template <>
460 const std::string problem_name, const std::string field_name,
461 bool get_low_dim_ents, bool block_name_field_prefix,
462 bool is_distributed_mesh);
463
464template <>
466 const std::string problem_name, const std::string field_name,
467 bool get_low_dim_ents, bool block_name_field_prefix);
468
469template <>
471 const std::string problem_name, const std::string field_name,
472 bool get_low_dim_ents, bool block_name_field_prefix);
473
474template <>
476 const std::string problem_name, const std::string field_name,
477 bool get_low_dim_ents, bool block_name_field_prefix);
478
479template <>
481 const std::string problem_name, const std::string field_name,
482 bool get_low_dim_ents, bool block_name_field_prefix,
483 bool is_distributed_mesh);
484
485template <>
488 const std::string problem_name, const std::string field_name,
489 bool get_low_dim_ents, bool block_name_field_prefix,
490 bool is_distributed_mesh);
491
492template <>
494 const std::string problem_name, const std::string field_name,
495 bool get_low_dim_ents, bool block_name_field_prefix,
496 bool is_distributed_mesh);
497
498template <>
501 const std::string problem_name, const std::string field_name,
502 bool get_low_dim_ents, bool block_name_field_prefix);
503
504template <>
507 const std::string problem_name, const std::string field_name,
508 bool get_low_dim_ents, bool block_name_field_prefix);
509
510template <>
513 const std::string problem_name, const std::string field_name,
514 bool get_low_dim_ents, bool block_name_field_prefix);
515
516template <>
518 const std::string problem_name, const std::string field_name,
519 bool get_low_dim_ents, bool block_name_field_prefix);
520
521template <>
524 const std::string problem_name, const std::string field_name,
525 bool get_low_dim_ents, bool block_name_field_prefix);
526
527} // namespace MoFEM
528
529#endif //__BCMANAGER_HPP__
530
531/**
532 * \defgroup bc_manager Manages boundary conditions
533 * \brief Implementation manages boundary conditions
534 *
535 * \ingroup mofem
536 **/
MoFEM interface.
#define DEPRECATED
Definition definitions.h:17
FTensor::Index< 'i', SPACE_DIM > i
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
constexpr auto field_name
Data structure storing bc markers and atributes.
Definition BcManager.hpp:41
boost::shared_ptr< ForceCubitBcData > forceBcPtr
Definition BcManager.hpp:52
boost::shared_ptr< HeatFluxCubitBcData > heatFluxBcPtr
Definition BcManager.hpp:51
boost::shared_ptr< DisplacementCubitBcData > dispBcPtr
Definition BcManager.hpp:49
std::vector< unsigned char > bcMarkers
Definition BcManager.hpp:44
std::vector< double > bcAttributes
Definition BcManager.hpp:43
boost::shared_ptr< PressureCubitBcData > pressureBcPtr
Definition BcManager.hpp:53
boost::shared_ptr< TemperatureCubitBcData > tempBcPtr
Definition BcManager.hpp:50
boost::shared_ptr< DofsView > dofsViewPtr
Definition BcManager.hpp:47
std::vector< boost::weak_ptr< NumeredDofEntity > > DofsView
Definition BcManager.hpp:46
DEPRECATED auto getBcEdgesPtr()
Definition BcManager.hpp:56
Simple interface for fast problem set-up.
Definition BcManager.hpp:29
Range getMergedBlocksRange(std::vector< std::regex > bc_regex_vec)
Merge block ranges.
auto checkBlock(const std::pair< string, boost::shared_ptr< BCs > > &bc, std::regex reg)
check if given boundary condition name is in the map bc element
MoFEMErrorCode removeBlockDOFsOnEntities(const std::string problem_name, const std::string field_name, bool get_low_dim_ents=true, bool block_name_field_prefix=false, bool is_distributed_mesh=true)
Mark block DOFs.
MoFEMErrorCode getOptions()
get options
Definition BcManager.cpp:65
BcMarkerPtr getMergedBlocksMarker(std::vector< std::regex > bc_regex_vec)
Get the Merged Boundary Marker object.
MoFEMErrorCode removeSideDOFs(const std::string problem_name, const std::string block_name, const std::string field_name, int bridge_dim, int lo, int hi, bool is_distributed_mesh=true)
Remove side DOFs.
static std::pair< std::string, std::string > extractStringFromBlockId(const std::string block_id, const std::string prb_name)
Extract block name and block name form block id.
MoFEMErrorCode pushMarkDOFsOnEntities(const std::string problem_name, const std::string block_name, const std::string field_name, bool get_low_dim_ents=true)
Mark block DOFs.
auto getMergedBlocksRange(std::vector< string > bc_names)
Merge block ranges.
auto getMergedBlocksMarker(std::vector< string > bc_names)
Get the Merged Boundary Marker object.
MoFEM::Core & cOre
BcMapByBlockName bcMapByBlockName
SmartPetscObj< IS > getBlockIS(const std::string block_prefix, const std::string block_name, const std::string field_name, const std::string problem_name, int lo, int hi, SmartPetscObj< IS > is_expand=SmartPetscObj< IS >())
Get block IS.
MoFEMErrorCode removeBlockDOFsOnEntities(const std::string problem_name, const std::string block_name, const std::string field_name, int lo, int hi, bool get_low_dim_ents=true, bool is_distributed_mesh=true)
Remove DOFs from problem.
Definition BcManager.cpp:72
virtual ~BcManager()=default
MoFEMErrorCode removeBlockDOFsOnEntities(const std::string problem_name, const std::string block_name, const std::string field_name, bool get_low_dim_ents=true, bool is_distributed_mesh=true)
Mark block DOFs.
BcManager(const MoFEM::Core &core)
Definition BcManager.cpp:41
MoFEMErrorCode pushMarkSideDofs(const std::string problem_name, const std::string block_name, const std::string field_name, int bridge_dim, int lo, int hi)
Mark side DOFs.
MoFEMErrorCode pushMarkDOFsOnEntities(const std::string problem_name, const std::string field_name, bool get_low_dim_ents=true, bool block_name_field_prefix=false)
Mark block DOFs.
boost::shared_ptr< std::vector< char unsigned > > BcMarkerPtr
auto getBcStructure(const std::string bc_id)
Get the bc structure object.
auto checkBlock(const std::pair< std::string, boost::shared_ptr< BCs > > &bc, std::string name)
check if given boundary condition name is in the map bc element
std::map< string, boost::shared_ptr< BCs > > BcMapByBlockName
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
Definition BcManager.cpp:34
BcMarkerPtr getMergedBlocksMarker(const std::vector< BcMarkerPtr > &boundary_markers_ptr_vec)
Get the Merged Blocks Marker object.
boost::shared_ptr< BCs > popMarkDOFsOnEntities(const std::string block_name)
Get bc data and remove element.
MoFEMErrorCode pushMarkDOFsOnEntities(const std::string problem_name, const std::string block_name, const std::string field_name, int lo, int hi, bool get_low_dim_ents=true)
Mark block DOFs.
BcMapByBlockName & getBcMapByBlockName()
Get the bc map.
Core (interface) class.
Definition Core.hpp:82
intrusive_ptr for managing petsc objects
base class for all interface classes