b2api
B2000++ API Reference Manual, VERSION 4.6
 
Loading...
Searching...
No Matches
b2domain.H
Go to the documentation of this file.
1//------------------------------------------------------------------------
2// b2domain.H --
3//
4//
5// written by Mathias Doreille
6// Thomas Blome <thomas.blome@dlr.de>
7//
8// Copyright (c) 2004-2012,2017 SMR Engineering & Development SA
9// 2502 Bienne, Switzerland
10//
11// Copyright (c) 2023 Deutsches Zentrum für Luft- und Raumfahrt (DLR) e.V.
12// Linder Höhe, 51147 Köln
13//
14// All Rights Reserved. Proprietary source code. The contents of
15// this file may not be disclosed to third parties, copied or
16// duplicated in any form, in whole or in part, without the prior
17// written permission of SMR.
18//------------------------------------------------------------------------
19
20#ifndef __B2DOMAIN_H__
21#define __B2DOMAIN_H__
22
23#include <complex>
24#include <functional>
25#include <string>
26#include <vector>
27
28#include "b2ppconfig.h"
29#include "model/b2element.H"
30#include "utils/b2csda.H"
31#include "utils/b2linear_algebra.H"
32#include "utils/b2object.H"
33
39namespace b2000 {
40
41class Model;
42class Case;
43class Node;
44class Element;
45
46template <typename T>
47class TypedElement;
48
70class Domain : public Object {
71public:
79 public:
80 virtual ~NodeIterator() {}
81
84 virtual Node* next() = 0;
85 };
86
89 public:
90 virtual ~ElementIterator() {}
91
94 virtual Element* next() = 0;
95 };
96
97 class NodeConnectivityIterator : public NodeIterator {
98 public:
99 virtual Node* next(std::vector<Element*>& connectivity) = 0;
100 };
101
108
109 /* A vector containing node-internal ID's of nodes
110 * connecting to the element.*/
111 std::vector<int> internal_node_id_list;
112 };
113
115 using node_iterator = std::unique_ptr<NodeIterator>;
116 using node_connectivity_iterator = std::unique_ptr<NodeConnectivityIterator>;
117 using element_iterator = std::unique_ptr<ElementIterator>;
118
121 virtual void set_model(Model& model) = 0;
122
125 virtual void set_case(Case& case_) = 0;
126
128 virtual void set_subcase_id(const int subcase_id_) = 0;
129
138 virtual size_t get_number_of_dof() const = 0;
139
141 virtual size_t get_number_of_elements() const = 0;
142
145 virtual size_t get_number_of_elements_and_subelements() const = 0;
146
148 virtual size_t get_number_of_nodes() const = 0;
149
154 virtual const std::vector<Element::VariableInfo> get_value_info() const = 0;
155
163 virtual b2linalg::SparseMatrixConnectivityType get_dof_connectivity_type() const = 0;
164
168 virtual bool have_temperature() const = 0;
169
179 virtual node_iterator get_node_iterator() = 0;
180
182 virtual node_connectivity_iterator get_node_connectivity_iterator();
183
191 template <typename T>
192 const T* get_node_local_referential(const Node& node) const {
193 return 0;
194 }
195
197 virtual const double* get_node_local_referential_double(const Node& node) const = 0;
198
200 virtual const b2000::csda<double>* get_node_local_referential_csda(const Node& node) const = 0;
201
209 virtual Node* get_node(const std::string& node_name);
210
218 virtual void get_slave_node(std::vector<std::pair<const Node*, const Node*>>& slave_node) = 0;
219
222 virtual element_iterator get_element_iterator() = 0;
223
231 virtual Element* get_element(const std::string& element_name);
232
249 const Node* node, std::vector<AdjacentElement>& adjacent_elements) {
251 std::pair<int, const Node* const*>(1, &node), adjacent_elements);
252 }
253
269 std::pair<int, const Node* const*> node_list,
270 std::vector<AdjacentElement>& adjacent_elements) = 0;
271
289 const Element* e, double dist, std::vector<Element*>& element_list) = 0;
294 virtual void set_dof(const b2linalg::Matrix<double, b2linalg::Mrectangle_constref>& dof) = 0;
295
296 void set_dof(const b2linalg::Vector<double, b2linalg::Vdense_constref>& dof) {
297 set_dof(b2linalg::Matrix<double, b2linalg::Mrectangle_constref>(dof));
298 }
299
302 virtual void set_dof(
303 const b2linalg::Matrix<b2000::csda<double>, b2linalg::Mrectangle_constref>& dof) = 0;
304
305 void set_dof(const b2linalg::Vector<b2000::csda<double>, b2linalg::Vdense_constref>& dof) {
306 if (dof.is_null()) {
307 set_dof(b2linalg::Matrix<b2000::csda<double>, b2linalg::Mrectangle_constref>::null);
308 } else {
309 set_dof(b2linalg::Matrix<b2000::csda<double>, b2linalg::Mrectangle_constref>(dof));
310 }
311 }
312
315 virtual void set_dof(
316 const b2linalg::Matrix<std::complex<double>, b2linalg::Mrectangle_constref>& dof) = 0;
317
318 void set_dof(const b2linalg::Vector<std::complex<double>, b2linalg::Vdense_constref>& dof) {
319 if (dof.is_null()) {
320 set_dof(b2linalg::Matrix<std::complex<double>, b2linalg::Mrectangle_constref>::null);
321 } else {
322 set_dof(b2linalg::Matrix<std::complex<double>, b2linalg::Mrectangle_constref>(dof));
323 }
324 }
325
328 virtual const b2linalg::Matrix<double, b2linalg::Mrectangle_constref>& get_dof(double) = 0;
329
330 virtual const b2linalg::Matrix<b2000::csda<double>, b2linalg::Mrectangle_constref>& get_dof(
331 b2000::csda<double>) = 0;
332
333 virtual const b2linalg::Matrix<std::complex<double>, b2linalg::Mrectangle_constref>& get_dof(
334 std::complex<double>) = 0;
335
336 virtual const std::pair<std::map<std::string, size_t>, b2linalg::Index>& get_dof_field() {
338 static std::pair<std::map<std::string, size_t>, b2linalg::Index> null;
339 return null;
340 }
341
360 virtual void save_state(const std::string& state_id) = 0;
361
366 virtual void load_state(const std::string& state_id) = 0;
367
379 virtual void save_field(
380 const std::string& name_id,
381 const b2linalg::Vector<double, b2linalg::Vdense_constref>& dof) = 0;
382
392 virtual void save_field(
393 const std::string& name_id,
394 const b2linalg::Vector<b2000::csda<double>, b2linalg::Vdense_constref>& dof) = 0;
395
405 virtual void save_field(
406 const std::string& name_id,
407 const b2linalg::Vector<std::complex<double>, b2linalg::Vdense_constref>& dof) = 0;
408
432 Domain& parent_domain, const Element& element,
433 b2linalg::Matrix<double>& parent_nodes_internal_coor) {
435 return nullptr;
436 }
437
454 Domain& parent_domain, const Node& node, b2linalg::Vector<double>& parent_internal_coor) {
456 return nullptr;
457 }
458
465 std::vector<std::reference_wrapper<Element>>& GetElementContainer() {
467 if (domain_element_container_.size() == 0) { FillElementContainer(); }
468 return domain_element_container_;
469 }
470
477 auto i = get_element_iterator();
478 for (Element* element = i->next(); element != 0; element = i->next()) {
479 domain_element_container_.push_back(std::ref(*element));
480 }
481 }
482
484 static type_t type;
485
486private:
487 // Container holding reference wrappers to all elements of this domain
488 std::vector<std::reference_wrapper<Element>> domain_element_container_{};
489};
490
491template <>
492inline const double* Domain::get_node_local_referential<double>(const Node& node) const {
494}
495
496template <>
497inline const b2000::csda<double>* Domain::get_node_local_referential<b2000::csda<double>>(
498 const Node& node) const {
499 return get_node_local_referential_csda(node);
500}
501
502} // namespace b2000
503
504#endif /* __B2DOMAIN_H__ */
#define THROW
Definition b2exception.H:198
Definition b2case.H:110
Definition b2domain.H:88
virtual Element * next()=0
Definition b2domain.H:78
virtual Node * next()=0
Definition b2domain.H:70
virtual void set_case(Case &case_)=0
virtual void save_state(const std::string &state_id)=0
virtual void save_field(const std::string &name_id, const b2linalg::Vector< b2000::csda< double >, b2linalg::Vdense_constref > &dof)=0
const T * get_node_local_referential(const Node &node) const
Definition b2domain.H:192
virtual void get_elements_of_same_type_near(const Element *e, double dist, std::vector< Element * > &element_list)=0
virtual Element * get_parent_element_and_nodes_mapping(Domain &parent_domain, const Element &element, b2linalg::Matrix< double > &parent_nodes_internal_coor)
Definition b2domain.H:431
virtual const double * get_node_local_referential_double(const Node &node) const =0
virtual void get_adjacent_elements(std::pair< int, const Node *const * > node_list, std::vector< AdjacentElement > &adjacent_elements)=0
virtual size_t get_number_of_dof() const =0
virtual void set_model(Model &model)=0
virtual size_t get_number_of_elements() const =0
virtual void get_adjacent_elements(const Node *node, std::vector< AdjacentElement > &adjacent_elements)
Definition b2domain.H:248
virtual element_iterator get_element_iterator()=0
virtual node_iterator get_node_iterator()=0
virtual bool have_temperature() const =0
virtual void save_field(const std::string &name_id, const b2linalg::Vector< double, b2linalg::Vdense_constref > &dof)=0
virtual size_t get_number_of_elements_and_subelements() const =0
virtual const std::vector< Element::VariableInfo > get_value_info() const =0
std::vector< std::reference_wrapper< Element > > & GetElementContainer()
Return private member domain_element_container_ holding all elements of this domain.
Definition b2domain.H:465
virtual const b2000::csda< double > * get_node_local_referential_csda(const Node &node) const =0
virtual void save_field(const std::string &name_id, const b2linalg::Vector< std::complex< double >, b2linalg::Vdense_constref > &dof)=0
virtual void get_slave_node(std::vector< std::pair< const Node *, const Node * > > &slave_node)=0
void FillElementContainer()
Fill domain_element_container_ with all elements of this domain.
Definition b2domain.H:476
virtual size_t get_number_of_nodes() const =0
virtual Element * get_parent_element_mapping(Domain &parent_domain, const Node &node, b2linalg::Vector< double > &parent_internal_coor)
Definition b2domain.H:453
virtual b2linalg::SparseMatrixConnectivityType get_dof_connectivity_type() const =0
virtual Node * get_node(const std::string &node_name)
Definition b2domain.C:20
virtual void load_state(const std::string &state_id)=0
virtual void set_subcase_id(const int subcase_id_)=0
virtual Element * get_element(const std::string &element_name)
Definition b2domain.C:29
Defines the complete interface for Element instances (C++ representations of Finite Elements).
Definition b2element.H:156
Definition b2model.H:69
Definition b2node.H:53
Definition b2object.H:340
Definition b2object.H:456
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
GenericException< UnimplementedError_name > UnimplementedError
Definition b2exception.H:314
Definition b2domain.H:105
Element * element
Definition b2domain.H:107