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