|
suanPan
🧮 An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework
|
The Integrator class is basically a wrapper of the DomainBase class with regard to some status changing methods. More...
#include <Integrator.h>
Public Types | |
| enum class | Type { Implicit , Explicit } |
Public Member Functions | |
| Integrator (unsigned=0) | |
| void | set_domain (const std::weak_ptr< DomainBase > &) |
| shared_ptr< DomainBase > | get_domain () const |
| virtual int | initialize () |
| virtual Type | type () const |
| void | set_time_step_switch (bool) |
| bool | allow_to_change_time_step () const |
| void | set_matrix_assembled_switch () |
| bool | matrix_is_assembled () const |
| virtual bool | time_independent_matrix () const |
| int | process_load () |
| virtual int | process_constraint () |
| int | process_criterion () const |
| int | process_modifier () const |
| int | process_load_resistance () |
| virtual int | process_constraint_resistance () |
| void | record () const |
| virtual void | assemble_resistance () |
| virtual void | assemble_matrix () |
| virtual void | assemble_effective_matrix () |
| virtual vec | get_force_residual () |
| virtual vec | get_displacement_residual () |
| vec | get_auxiliary_residual () const |
| virtual sp_mat | get_reference_load () |
| virtual const vec & | get_trial_displacement () const |
| void | update_load () const |
| void | update_constraint () const |
| void | update_trial_load_factor (double) const |
| void | update_trial_load_factor (const vec &) const |
| virtual void | update_from_ninja () |
| void | update_trial_time (double) |
| virtual void | update_incre_time (double) |
| virtual int | update_trial_status (bool) |
| int | sync_status (bool) |
| virtual int | update_internal (const mat &) |
| mat | solve (const mat &) |
| mat | solve (const sp_mat &) |
| mat | solve (mat &&) |
| mat | solve (sp_mat &&) |
| virtual int | solve (mat &, const mat &) |
| virtual int | solve (mat &, const sp_mat &) |
| virtual int | solve (mat &, mat &&) |
| virtual int | solve (mat &, sp_mat &&) |
| void | erase_machine_error (vec &) const |
| void | stage_and_commit_status () |
| void | stage_status () const |
| virtual void | commit_status () |
| virtual void | clear_status () |
| virtual void | reset_status () |
| virtual vec | from_incre_velocity (const vec &, const uvec &) |
| virtual vec | from_incre_acceleration (const vec &, const uvec &) |
| virtual vec | from_total_velocity (const vec &, const uvec &) |
| virtual vec | from_total_acceleration (const vec &, const uvec &) |
| vec | from_incre_velocity (double, const uvec &) |
| vec | from_incre_acceleration (double, const uvec &) |
| vec | from_total_velocity (double, const uvec &) |
| vec | from_total_acceleration (double, const uvec &) |
Public Member Functions inherited from UniqueTag | |
| UniqueTag (const UniqueTag &)=delete | |
| UniqueTag (UniqueTag &&)=delete | |
| UniqueTag & | operator= (const UniqueTag &)=delete |
| UniqueTag & | operator= (UniqueTag &&)=delete |
| ~UniqueTag () override=default | |
| Tag (unsigned=0) | |
| Tag (const Tag &)=default | |
| Tag (Tag &&) noexcept=default | |
Public Member Functions inherited from Tag | |
| Tag (unsigned=0) | |
| Tag (const Tag &)=default | |
| Tag (Tag &&) noexcept=default | |
| Tag & | operator= (const Tag &)=delete |
| Tag & | operator= (Tag &&)=delete |
| virtual | ~Tag ()=default |
| void | set_tag (unsigned) const |
| unsigned | get_tag () const |
| void | enable () |
| void | disable () |
| void | guard () |
| void | unguard () |
| bool | is_active () const |
| bool | is_guarded () const |
| virtual void | print () |
Protected Member Functions | |
| virtual void | update_parameter (double) |
| virtual int | process_load_impl (bool) |
| virtual int | process_constraint_impl (bool) |
| virtual bool | has_corrector () const |
| virtual int | correct_trial_status () |
The Integrator class is basically a wrapper of the DomainBase class with regard to some status changing methods.
By default, the Step object calls DomainBase(Workshop) object to update displacement/resistance/stiffness independently. When it comes to dynamic analysis (time integration is involved), it is necessary to compute the equivalent load/stiffness by combining several quantities.
The Integrator object is acting like an agent between Workshop and Step, that can modify corresponding quantities to account for dynamic effect.
|
strong |
|
explicit |
| bool Integrator::allow_to_change_time_step | ( | ) | const |
Some time integration methods (multistep methods) require time step to be constant (for at least some consecutive steps). Call this method in solvers to determine whether it is allowed to change time step.
|
virtual |
Assemble the global effective matrix A in AX=B. For FEM applications, it is often a linear combination of stiffness, mass, damping and geometry matrices.
Reimplemented in BatheTwoStep, GeneralizedAlpha, GSSSS, LeeNewmark, LeeNewmarkFull, LeeNewmarkIterative, Newmark, OALTS, WilsonPenzienNewmark, and ExplicitIntegrator.
|
virtual |
Assemble global matrices such as stiffness, mass, damping and geometry matrices. This method should come with the companion method assemble_effective_matrix().
Reimplemented in LeeNewmarkIterative, NonviscousNewmark, ImplicitIntegrator, and ExplicitIntegrator.
|
virtual |
Reimplemented in GeneralizedAlphaExplicit, BatheTwoStep, GeneralizedAlpha, GSSSS, LeeNewmark, Newmark, NonviscousNewmark, OALTS, RayleighNewmark, WilsonPenzienNewmark, and ExplicitIntegrator.
|
virtual |
Reimplemented in LeeNewmarkBase, BatheExplicit, GERKN, BatheTwoStep, NonviscousNewmark, OALTS, and WilsonPenzienNewmark.
|
virtual |
Reimplemented in LeeNewmarkBase, BatheExplicit, GERKN, BatheTwoStep, NonviscousNewmark, OALTS, and WilsonPenzienNewmark.
|
protectedvirtual |
Correct the trial status. This method is called when the integrator has a corrector. It is used to correct the trial status after the computation. The default implementation does nothing and returns success. Override this method to implement the corrector.
Reimplemented in BatheExplicit, GeneralizedAlphaExplicit, GERKN, and GSSE.
| void Integrator::erase_machine_error | ( | vec & | ninja | ) | const |
Avoid machine error accumulation. The penalty method can apply homogeneous constraints approximately. The corresponding DoF shall be set to zero after solving the system.
|
virtual |
When external loads are applied, they can be applied in forms of displacement/velocity/acceleration. The time integration methods, by default, form effective stiffness matrices in displacement domain. That is, in AX=B, A is the effective stiffness matrix and X is the displacement increment. Thus, loads in velocity/acceleration must be converted to displacement. This cannot be done arbitrarily due to compatibility issues. This method takes acceleration increment and converts it to TOTAL displacement.
Reimplemented in GeneralizedAlphaExplicit, GERKN, GSSE, BatheTwoStep, GeneralizedAlpha, GSSSS, Newmark, OALTS, and ExplicitIntegrator.
A simplified version similar to from_incre_acceleration(const vec&, const uvec&). It assumes all DoFs share the same magnitude.
|
virtual |
When external loads are applied, they can be applied in forms of displacement/velocity/acceleration. The time integration methods, by default, form effective stiffness matrices in displacement domain. That is, in AX=B, A is the effective stiffness matrix and X is the displacement increment. Thus, loads in velocity/acceleration must be converted to displacement. This cannot be done arbitrarily due to compatibility issues. This method takes velocity increment and converts it to TOTAL displacement.
Reimplemented in BatheTwoStep, GeneralizedAlpha, GSSSS, Newmark, OALTS, and ExplicitIntegrator.
A simplified version similar to from_incre_velocity(const vec&, const uvec&). It assumes all DoFs share the same magnitude.
|
virtual |
Reimplemented in GeneralizedAlphaExplicit, GERKN, GSSE, BatheTwoStep, OALTS, and ExplicitIntegrator.
|
virtual |
Reimplemented in BatheTwoStep, and OALTS.
| vec Integrator::get_auxiliary_residual | ( | ) | const |
Assemble the global residual vector due to nonlinear constraints implemented via the multiplier method.
|
virtual |
Assemble the global residual vector in displacement-controlled solving schemes. Apart from the global resistance and external load vectors, the reference load vector shall also be considered.
Reimplemented in LeeNewmarkBase, GeneralizedAlphaExplicit, GeneralizedAlpha, and GSSSS.
| shared_ptr< DomainBase > Integrator::get_domain | ( | ) | const |
|
virtual |
Assemble the global residual vector in load-controlled solving schemes.
Reimplemented in LeeNewmarkBase, GeneralizedAlphaExplicit, GeneralizedAlpha, and GSSSS.
|
virtual |
Reimplemented in GeneralizedAlphaExplicit, GeneralizedAlpha, and GSSSS.
|
virtual |
Reimplemented in ExplicitIntegrator.
|
protectedvirtual |
Indicate whether the integrator has a corrector. Some time integration methods adopt predictor-corrector type scheme. The final committed state is different from the one used in computation. Override this method to indicate whether the integrator has a corrector. If it returns true, the correct_trial_status() method will be called thus has to be implemented.
Reimplemented in BatheExplicit, GeneralizedAlphaExplicit, GERKN, and GSSE.
|
virtual |
Reimplemented in LeeNewmark, LeeNewmarkBase, LeeNewmarkFull, LeeNewmarkIterative, NonviscousNewmark, and WilsonPenzienNewmark.
| bool Integrator::matrix_is_assembled | ( | ) | const |
|
virtual |
The main task of this method is to apply constraints (of various forms implemented in various methods). Combinations of different types need to be considered: 1) homogeneous, 2) inhomogeneous, 3) linear, 4) nonlinear. Combinations of different methods need to be considered: 1) penalty, 2) multiplier. On exit, the global stiffness matrix should be updated, the global residual vector should be updated.
Reimplemented in LeeNewmark, LeeNewmarkFull, LeeNewmarkIterative, and WilsonPenzienNewmark.
|
protectedvirtual |
Reimplemented in GeneralizedAlphaExplicit, GERKN, GSSE, GeneralizedAlpha, and GSSSS.
|
virtual |
This method is similar to process_constraint(), but it only updates the global residual vector. The global stiffness matrix is not touched as in some solving schemes, the global stiffness matrix is only assembled and factorised once at the beginning. Subsequent iterations do not assemble the global stiffness matrix again and reuse the factorised matrix. In this case, the factorised matrix cannot be modified.
Reimplemented in LeeNewmark, LeeNewmarkFull, and LeeNewmarkIterative.
| int Integrator::process_criterion | ( | ) | const |
| int Integrator::process_load | ( | ) |
|
protectedvirtual |
Reimplemented in GeneralizedAlphaExplicit, GERKN, GSSE, GeneralizedAlpha, and GSSSS.
| int Integrator::process_load_resistance | ( | ) |
| int Integrator::process_modifier | ( | ) | const |
| void Integrator::record | ( | ) | const |
|
virtual |
Reimplemented in LeeNewmarkBase, and WilsonPenzienNewmark.
| void Integrator::set_domain | ( | const std::weak_ptr< DomainBase > & | D | ) |
| void Integrator::set_matrix_assembled_switch | ( | ) |
| void Integrator::set_time_step_switch | ( | bool | T | ) |
| mat Integrator::solve | ( | const mat & | B | ) |
| mat Integrator::solve | ( | const sp_mat & | B | ) |
| mat Integrator::solve | ( | mat && | B | ) |
|
virtual |
Reimplemented in LeeNewmarkBase, WilsonPenzienNewmark, and ExplicitIntegrator.
|
virtual |
Reimplemented in LeeNewmarkBase, WilsonPenzienNewmark, and ExplicitIntegrator.
|
virtual |
Reimplemented in LeeNewmarkBase, WilsonPenzienNewmark, and ExplicitIntegrator.
|
virtual |
Reimplemented in LeeNewmarkBase, WilsonPenzienNewmark, and ExplicitIntegrator.
| mat Integrator::solve | ( | sp_mat && | B | ) |
| void Integrator::stage_and_commit_status | ( | ) |
| void Integrator::stage_status | ( | ) | const |
| int Integrator::sync_status | ( | bool | only_correct | ) |
When a new displacement increment is computed, it is added to global displacement vector. At this moment, nodal and elemental quantities are all computed from the previous displacement vector, directly committing the new results causes out-of-sync issue. Some algorithms use predictor-corrector type scheme, which means the converged quantities are different from the committed quantities. This method is in charge of syncing quantities between global and local quantities by updating nodal/elemental quantities using the committed quantities.
|
virtual |
Indicate whether the matrix is independent of time, that is, the system does not change with time. This helps to determine whether the matrix needs to be reassembled. For single-step methods, it is typically true. For multistep methods, it is typically false.
Reimplemented in BatheTwoStep, and OALTS.
|
inlinevirtual |
Reimplemented in ImplicitIntegrator, and ExplicitIntegrator.
| void Integrator::update_constraint | ( | ) | const |
|
virtual |
|
virtual |
|
virtual |
Some algorithms solve a system which differs from the original one. The size of the problem changes thus the computed increment contains additional internal quantities. This method updates internal quantities stored in those integrators.
Reimplemented in LeeNewmarkBase.
| void Integrator::update_load | ( | ) | const |
|
protectedvirtual |
When time step changes, some parameters may need to be updated.
Reimplemented in BatheExplicit, GeneralizedAlphaExplicit, GERKN, GSSE, Tchamwa, BatheTwoStep, GeneralizedAlpha, GSSSS, Newmark, NonviscousNewmark, and OALTS.
| void Integrator::update_trial_load_factor | ( | const vec & | lambda | ) | const |
| void Integrator::update_trial_load_factor | ( | double | lambda | ) | const |
|
virtual |
Reimplemented in BatheExplicit, GeneralizedAlphaExplicit, GERKN, GSSE, Tchamwa, BatheTwoStep, GeneralizedAlpha, GSSSS, Newmark, and OALTS.
| void Integrator::update_trial_time | ( | double | T | ) |