b2api
B2000++ API Reference Manual, VERSION 4.6
 
Loading...
Searching...
No Matches
b2newmark.H
1//------------------------------------------------------------------------
2// b2newmark.H --
3//
4//
5// written by Thomas Blome <thomas.blome@dlr.de>
6//
7// (c) 2023 Deutsches Zentrum für Luft- und Raumfahrt (DLR) e.V.
8// Linder Höhe, 51147 Köln
9//
10// All Rights Reserved. Proprietary source code. The contents of
11// this file may not be disclosed to third parties, copied or
12// duplicated in any form, in whole or in part, without the prior
13// written permission of SMR.
14//------------------------------------------------------------------------
15
16#ifndef B2NEWMARK_H_
17#define B2NEWMARK_H_
18
19#include "b2time_integrator.H"
20
21namespace b2000::solver {
22
30template <typename T>
32public:
34
35 virtual void SetAttribute(const Case& case__) override{/*TODO*/};
36
37 virtual void InitializeTimeIntegrator(
38 const b2linalg::Matrix<T, b2linalg::Mrectangle>& initial_dof, const double dt) override;
39
41 b2linalg::Matrix<T, b2linalg::Mrectangle>& dof,
42 const b2linalg::Matrix<T, b2linalg::Mrectangle>& dU) override;
43
44 virtual void UpdateFields(
45 b2linalg::Matrix<T, b2linalg::Mrectangle>& dof,
46 const b2linalg::Matrix<T, b2linalg::Mrectangle>& dU) override;
47
48 virtual TimeIntegrator<T>::EffectiveSymmetricSystem GetEffectiveElementSystem(
49 const b2linalg::Matrix<T, b2linalg::Mpacked>& k,
50 const b2linalg::Matrix<T, b2linalg::Mpacked>& d,
51 const b2linalg::Matrix<T, b2linalg::Mpacked>& m,
52 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
53 const b2linalg::Index& index) const override;
54
55 virtual TimeIntegrator<T>::EffectiveUnsymmetricSystem GetEffectiveElementSystem(
56 const b2linalg::Matrix<T, b2linalg::Mrectangle>& k,
57 const b2linalg::Matrix<T, b2linalg::Mrectangle>& d,
58 const b2linalg::Matrix<T, b2linalg::Mrectangle>& m,
59 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
60 const b2linalg::Index& index) const override;
61
62 static type_t type;
63
64private:
66 T beta{0.25};
67 T gamma{0.5};
68};
69
70template <typename T>
72 const b2linalg::Matrix<T, b2linalg::Mrectangle>& initial_dof, const double dt) {
73 this->dt = dt;
74
75 this->V_.resize(initial_dof.size1(), 1);
76 this->Z_.resize(initial_dof.size1(), 1);
77 this->dot_Z_.resize(initial_dof.size1(), 1);
78}
79
80template <typename T>
82 b2linalg::Matrix<T, b2linalg::Mrectangle>& dof,
83 const b2linalg::Matrix<T, b2linalg::Mrectangle>& dU) {
85 this->V_[0] = dof[0];
86 this->Z_[0] = dof[1];
87 this->dot_Z_[0] = dof[2];
88
90 UpdateFields(dof, dU);
91}
92
93template <typename T>
95 b2linalg::Matrix<T, b2linalg::Mrectangle>& dof,
96 const b2linalg::Matrix<T, b2linalg::Mrectangle>& dU) {
98 dof[1] = gamma / beta / this->dt * dU[0] + (1.0 - gamma / beta) * this->Z_[0];
99 dof[1] += (1.0 - gamma / 2.0 / beta) * this->dt * this->dot_Z_[0];
100
102 dof[2] = 1.0 / beta / this->dt / this->dt * dU[0]
103 - (1.0 - 2 * beta) / 2.0 / beta * this->dot_Z_[0];
104 dof[2] -= 1.0 / beta / this->dt * this->Z_[0];
105}
106
107template <typename T>
108inline TimeIntegrator<T>::EffectiveSymmetricSystem NewmarkIntegrator<T>::GetEffectiveElementSystem(
109 const b2linalg::Matrix<T, b2linalg::Mpacked>& k,
110 const b2linalg::Matrix<T, b2linalg::Mpacked>& d,
111 const b2linalg::Matrix<T, b2linalg::Mpacked>& m,
112 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
113 const b2linalg::Index& index) const {
114 b2linalg::Matrix<T, b2linalg::Mpacked> k_eff{m.size1(), m.is_upper()};
115 b2linalg::Vector<T, b2linalg::Vdense> f_eff_dyn{m.size1()};
116
117 k_eff = 1.0 / beta / this->dt / this->dt * m;
118 if (d.size1() != 0) { k_eff += gamma / beta / this->dt * d; }
119 k_eff += k;
120
122 b2linalg::Vector<T, b2linalg::Vdense> a{index.size()};
123 for (size_t i{}; i < index.size(); ++i) { a[i] = dof(index[i], 2); }
124
125 f_eff_dyn = m * a;
126
127 return std::make_pair(k_eff, f_eff_dyn);
128}
129
130template <typename T>
131inline TimeIntegrator<T>::EffectiveUnsymmetricSystem
133 const b2linalg::Matrix<T, b2linalg::Mrectangle>& k,
134 const b2linalg::Matrix<T, b2linalg::Mrectangle>& d,
135 const b2linalg::Matrix<T, b2linalg::Mrectangle>& m,
136 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
137 const b2linalg::Index& index) const {
138 b2linalg::Matrix<T, b2linalg::Mrectangle> k_eff{m.size1(), m.size2()};
139 b2linalg::Vector<T, b2linalg::Vdense> f_eff_dyn{m.size1()};
140
141 k_eff = 1.0 / beta / this->dt / this->dt * m;
142 if (d.size1() != 0) { k_eff += gamma / beta / this->dt * d; }
143 k_eff += k;
144
146 b2linalg::Vector<T, b2linalg::Vdense> a{index.size()};
147 for (size_t i{}; i < index.size(); ++i) { a[i] = dof(index[i], 2); }
148
149 f_eff_dyn = m * a;
150
151 return std::make_pair(k_eff, f_eff_dyn);
152}
153
154template <typename T>
156 "NewmarkIntegrator", type_name<T>(), StringList(), module, &TimeIntegrator<T>::type);
157
158} // namespace b2000::solver
159
160#endif // B2NEWMARK_H_
Definition b2case.H:110
Definition b2object.H:415
Definition b2util.H:54
One-step (and direct) method, either implicit or explicit. Scheme parameters determine stability and ...
Definition b2newmark.H:31
virtual void SetAttribute(const Case &case__) override
Definition b2newmark.H:35
virtual void InitializeFieldsForThisTimeStep(b2linalg::Matrix< T, b2linalg::Mrectangle > &dof, const b2linalg::Matrix< T, b2linalg::Mrectangle > &dU) override
Update velocities and (possibly) also accelerations after each time step. This method will also save ...
Definition b2newmark.H:81
virtual void InitializeTimeIntegrator(const b2linalg::Matrix< T, b2linalg::Mrectangle > &initial_dof, const double dt) override
Initialize the time integrator with the model to act on the initial condition, the initial point in t...
Definition b2newmark.H:71
virtual void UpdateFields(b2linalg::Matrix< T, b2linalg::Mrectangle > &dof, const b2linalg::Matrix< T, b2linalg::Mrectangle > &dU) override
Update velocities and (possibly) also accelerations after each global iteration.
Definition b2newmark.H:94
virtual TimeIntegrator< T >::EffectiveSymmetricSystem GetEffectiveElementSystem(const b2linalg::Matrix< T, b2linalg::Mpacked > &k, const b2linalg::Matrix< T, b2linalg::Mpacked > &d, const b2linalg::Matrix< T, b2linalg::Mpacked > &m, const b2linalg::Matrix< T, b2linalg::Mrectangle_constref > &dof, const b2linalg::Index &index) const override
Calculates the element effective system based on the concrete time integrator.
Definition b2newmark.H:108
Interface definition for performing time steps.
Definition b2time_integrator.H:32
double dt
Step size.
Definition b2time_integrator.H:132