suanPan
🧮 An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework
Loading...
Searching...
No Matches
ConditionalModifier.h
Go to the documentation of this file.
1/*******************************************************************************
2 * Copyright (C) 2017-2026 Theodore Chang
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 ******************************************************************************/
94#ifndef CONDITIONALMODIFIER_H
95#define CONDITIONALMODIFIER_H
96
97#include <Domain/DomainBase.h>
98#include <Domain/Node.h>
101#include <set>
102
104 const unsigned amplitude_tag;
105
106 bool initialized = false;
107
109
110 // indicate which DOF components of the target nodes/elements shall be found
111 // the modifier itself will apply itself to those active components
112 const std::vector<Node::DOF> dof_component;
113
114protected:
115 unsigned start_step{1u}, end_step{static_cast<unsigned>(-1)};
116
117 // indicate the order of DOF components
118 // used to validate of the problem is compatible
119 // the target nodes must have the exact order of DoFs
120 // it can be empty such that the order check is not performed
121 const std::vector<Node::DOF> dof_order;
122
124
125 [[nodiscard]] double get_amplitude(const shared_ptr<DomainBase>&) const;
126
132 [[nodiscard]] const std::vector<Node::DOF>& get_dof_component() const;
133
134 [[nodiscard]] bool validate_node(const shared_ptr<DomainBase>&) const;
135 [[nodiscard]] bool validate_element(const shared_ptr<DomainBase>&) const;
136
137 [[nodiscard]] uvec collect_node_dof(const shared_ptr<DomainBase>&) const;
138
139public:
141 unsigned, // tag
142 unsigned, // amplitude tag
143 std::vector<Node::DOF>&&, // dof order
144 std::vector<Node::DOF>&& // dof component (unordered)
145 );
146
147 virtual int initialize(const shared_ptr<DomainBase>&);
148
156 virtual int process(const shared_ptr<DomainBase>&) = 0;
165 virtual int process_resistance(const shared_ptr<DomainBase>&);
166
173 virtual void stage(const shared_ptr<DomainBase>&) {}
174
181 [[nodiscard]] std::set<uword> get_involving_nodes(const shared_ptr<DomainBase>&) const;
182
183 [[nodiscard]] const uvec& get_node_dof() const;
184
185 void deinitialize();
186 [[nodiscard]] bool is_initialized() const;
187
188 void set_start_step(unsigned);
189 [[nodiscard]] unsigned get_start_step() const;
190
191 void set_end_step(unsigned);
192 [[nodiscard]] unsigned get_end_step() const;
193
202 [[nodiscard]] virtual bool is_connected() const { return false; }
203
207 [[nodiscard]] bool validate_step(const shared_ptr<DomainBase>&) const;
208
209 // some may manage state
210 virtual void update_status(const vec&) {}
211 virtual void clear_status() {}
212 virtual void commit_status() {}
213 virtual void reset_status() {}
214};
215
217 const uvec groups;
218
219protected:
220 [[nodiscard]] uvec update_object_tag(const shared_ptr<DomainBase>&) const;
221
222public:
223 explicit GroupModifier(uvec&&);
224};
225
226std::vector<Node::DOF> parse_dof(std::string_view);
227
228#endif
229
Abstract base for node/element-scoped, step-conditional modifiers (constraints and loads).
Definition ConditionalModifier.h:103
virtual int process(const shared_ptr< DomainBase > &)=0
Process and update both stiffness and resistance.
double get_amplitude(const shared_ptr< DomainBase > &) const
Definition ConditionalModifier.cpp:75
unsigned get_end_step() const
Definition ConditionalModifier.cpp:133
virtual int initialize(const shared_ptr< DomainBase > &)
Definition ConditionalModifier.cpp:85
virtual void update_status(const vec &)
Definition ConditionalModifier.h:210
void deinitialize()
Definition ConditionalModifier.cpp:120
uvec target_element
Definition ConditionalModifier.h:123
void set_end_step(unsigned)
Definition ConditionalModifier.cpp:131
std::set< uword > get_involving_nodes(const shared_ptr< DomainBase > &) const
Return a set of all nodes involved.
Definition ConditionalModifier.cpp:104
bool validate_element(const shared_ptr< DomainBase > &) const
Definition ConditionalModifier.cpp:40
uvec target_node
Definition ConditionalModifier.h:123
bool is_initialized() const
Definition ConditionalModifier.cpp:122
uvec collect_node_dof(const shared_ptr< DomainBase > &) const
Definition ConditionalModifier.cpp:55
const std::vector< Node::DOF > dof_order
Definition ConditionalModifier.h:121
virtual void stage(const shared_ptr< DomainBase > &)
Some algorithms need to manually modify some variables after solving.
Definition ConditionalModifier.h:173
virtual void commit_status()
Definition ConditionalModifier.h:212
void set_start_step(unsigned)
Definition ConditionalModifier.cpp:124
virtual void clear_status()
Definition ConditionalModifier.h:211
bool validate_step(const shared_ptr< DomainBase > &) const
Validate itself against the current active step to see if itself needs to be applied.
Definition ConditionalModifier.cpp:135
const std::vector< Node::DOF > & get_dof_component() const
Return the DoF components, falls back to the DoF order.
Definition ConditionalModifier.cpp:77
const uvec & get_node_dof() const
Definition ConditionalModifier.cpp:118
virtual void reset_status()
Definition ConditionalModifier.h:213
virtual int process_resistance(const shared_ptr< DomainBase > &)
Process and update resistance.
Definition ConditionalModifier.cpp:102
unsigned get_start_step() const
Definition ConditionalModifier.cpp:129
uvec target_dof
Definition ConditionalModifier.h:123
bool validate_node(const shared_ptr< DomainBase > &) const
Definition ConditionalModifier.cpp:25
virtual bool is_connected() const
Indicate if this modifier can be deemed as an element that needs to account for connectivity.
Definition ConditionalModifier.h:202
unsigned end_step
Definition ConditionalModifier.h:115
unsigned start_step
Definition ConditionalModifier.h:115
Definition ConditionalModifier.h:216
uvec update_object_tag(const shared_ptr< DomainBase > &) const
Definition ConditionalModifier.cpp:143
Definition ResourceHolder.h:32
Label objects that cannot be copied.
Definition Tag.h:88
std::vector< Node::DOF > parse_dof(std::string_view)
Definition ConditionalModifier.cpp:145