IFEM 90A354
SIMImplicitLMM.h
Go to the documentation of this file.
1//==============================================================================
11//==============================================================================
12
13#ifndef SIM_IMPLICIT_LMM_H_
14#define SIM_IMPLICIT_LMM_H_
15
16#include "NonLinSIM.h"
17#include "SIMoutput.h"
18#include "SystemMatrix.h"
19#include "SIMenums.h"
20#include "TimeIntUtils.h"
21#include "TimeStep.h"
22
23class DataExporter;
24
25
26namespace TimeIntegration {
27
31template<class Solver>
33{
34public:
39 SIMImplicitLMM(Solver& solv, Method type, bool = false,
40 const std::string& solField = "") :
41 solver(solv), nSim(solver,loads), fieldName(solField)
42 {
43 if (type == AM2)
44 order = 2;
45 else if (type == AM3)
46 order = 3;
47 else if (type == AM4)
48 order = 4;
49 else
50 order = 1;
51
52 loads.resize(order, nullptr);
53
54 Solver::msgLevel = 1; // prints primary solution summary only
55 }
56
59 {
60 for (SystemVector* v : loads)
61 delete v;
62 }
63
65 const ProcessAdm& getProcessAdm() const { return solver.getProcessAdm(); }
66
69 {
70 const std::vector<std::vector<double>> AM_coefs =
71 {{1.0},
72 {0.5, 0.5},
73 {-1.0/12.0, 2.0/3.0, 5.0/12.0},
74 {1.0/24.0, -5.0/24, 19.0/24.0, 9.0/24.0},
75 {-19.0/720.0, 106.0/720.0, -264.0/720.0, 646.0/720.0, 251.0/720.0}};
76
77 const int c_order = hasICs ? order-1 : std::min(order-1, tp.step-1);
78 nSim.setCoefs(AM_coefs[c_order]);
79
80 nSim.initSol(2);
81 nSim.theSolutions()[0] = solver.getSolution();
82 nSim.theSolutions()[1] = solver.getSolution();
83 solver.setTimeScale(AM_coefs[c_order].back()*tp.time.dt);
84 if (nSim.solveStep(tp, SIM::DYNAMIC) != SIM::CONVERGED)
85 return false;
86
87 solver.getSolution() = nSim.getSolution(0);
88
89 solver.setMode(SIM::RHS_ONLY);
90 solver.setTimeScale(1.0);
91 if (!solver.assembleSystem(tp.time, Vectors(1, solver.getSolution()), false))
92 return false;
93
94 loads[0] = solver.getRHSvector(0, true);
95
96 return true;
97 }
98
101 {
102 // Evaluate fluxes for initial conditions.
103 if (tp.step == 1) {
104 hasICs = true;
105 for (int j = 2; j <= order && hasICs; ++j)
106 if (std::string fName = fieldName + std::to_string(j);
107 solver.hasIC(fName)) {
108 TimeDomain time(tp.time);
109 time.t = tp.time.t - j*tp.time.dt;
110 if (!solver.assembleSystem(time, Vectors(1, solver.getSolution(j-1))))
111 return false;
112
113 loads[j-2] = solver.getRHSvector(0, true);
114 }
115 else
116 hasICs = false;
117 }
118
119 delete loads.back();
120 for (int j = order-2; j >= 0; --j)
121 loads[j+1] = loads[j];
122
123 return solver.advanceStep(tp);
124 }
125
127 bool saveModel(char* fileName, int& geoBlk, int& nBlock)
128 {
129 return solver.saveModel(fileName, geoBlk, nBlock);
130 }
131
133 bool saveStep(const TimeStep& tp, int& nBlock)
134 {
135 return solver.saveStep(tp, nBlock);
136 }
137
140 {
141 solver.registerFields(exporter);
142 }
143
146 bool serialize(std::map<std::string,std::string>& data)
147 {
148 return solver.serialize(data);
149 }
150
153 bool deSerialize(const std::map<std::string,std::string>& data)
154 {
155 return solver.deSerialize(data);
156 }
157
158protected:
160 class LMMNonLinSIM : public NonLinSIM
161 {
162 public:
166 LMMNonLinSIM(SIMbase& sim, std::vector<SystemVector*>& load)
167 : NonLinSIM(sim), loads(load) {}
168
170 void setCoefs(const std::vector<double>& coef) { coefs = coef; }
171
172 protected:
178 bool assembleSystem(const TimeDomain& time, const Vectors& pSol,
179 bool newLHSmatrix = true, bool poorConvg = false)
180 {
181 if (!model.assembleSystem(time, pSol, newLHSmatrix, poorConvg))
182 return false;
183
184 for (size_t i = 0; i < coefs.size()-1; ++i)
185 model.addToRHSvector(0, *loads[coefs.size()-i-1], coefs[i]*time.dt);
186
187 return true;
188 }
189
190 private:
191 std::vector<SystemVector*>& loads;
192 std::vector<double> coefs;
193 };
194
195 Solver& solver;
197 std::vector<SystemVector*> loads;
198 int order;
199 const std::string fieldName;
200 bool hasICs = false;
201};
202
203}
204
205#endif
std::vector< Vector > Vectors
An array of real-valued vectors with algebraic operations.
Definition MatVec.h:37
Nonlinear solution driver for isogeometric FEM simulators.
Various enums for simulation scope.
Sub-class with functionality for result output to VTF and terminal.
General representation of system matrices and vectors.
Various helpers for time integration.
Class for encapsulation of general time stepping parameters.
Administer and write data using DataWriters.
Definition DataExporter.h:38
virtual void initSol(size_t nSol=1, size_t nDof=0)
Initializes the primary solution vectors.
Definition MultiStepSIM.C:83
SIMoutput & model
The isogeometric FE model.
Definition MultiStepSIM.h:204
Nonlinear quasi-static solution driver for isogeometric FEM simulators.
Definition NonLinSIM.h:28
virtual SIM::ConvStatus solveStep(TimeStep &param, SIM::SolutionMode mode=SIM::STATIC, double zero_tolerance=1.0e-8, std::streamsize outPrec=0)
Solves the nonlinear equations by Newton-Raphson iterations.
Definition NonLinSIM.C:208
Class for administration of MPI processes in IFEM library.
Definition ProcessAdm.h:33
Base class for NURBS-based FEM simulators.
Definition SIMbase.h:72
void addToRHSvector(size_t idx, const SystemVector &vec, double scale=1.0)
Adds a system vector to the given right-hand-side vector.
Definition SIMbase.C:1774
virtual bool assembleSystem(const TimeDomain &time, const Vectors &prevSol, bool newLHSmatrix=true, bool poorConvg=false)
Administers assembly of the linear equation system.
Definition SIMbase.C:1229
virtual Vectors & theSolutions()
Returns a reference to the solution vectors (for assignment).
Definition SIMsolution.h:70
virtual const Vector & getSolution(int ix=0) const
Returns a const reference to current solution vector.
Definition SIMsolution.h:73
Base class for representing a system vector on different formats.
Definition SystemMatrix.h:32
Specialized nonlinear solver for implicit LMM methods.
Definition SIMImplicitLMM.h:161
std::vector< SystemVector * > & loads
Reference to load vectors.
Definition SIMImplicitLMM.h:191
bool assembleSystem(const TimeDomain &time, const Vectors &pSol, bool newLHSmatrix=true, bool poorConvg=false)
Administers assembly of the linear equation system.
Definition SIMImplicitLMM.h:178
LMMNonLinSIM(SIMbase &sim, std::vector< SystemVector * > &load)
The constructor initializes default solution parameters.
Definition SIMImplicitLMM.h:166
void setCoefs(const std::vector< double > &coef)
Set scaling coefficients.
Definition SIMImplicitLMM.h:170
std::vector< double > coefs
Time integration coefficients.
Definition SIMImplicitLMM.h:192
Implicit multi-step time integration for SIM classes.
Definition SIMImplicitLMM.h:33
void registerFields(DataExporter &exporter)
Registers fields for output to a data exporter.
Definition SIMImplicitLMM.h:139
const ProcessAdm & getProcessAdm() const
Returns the parallel process administrator.
Definition SIMImplicitLMM.h:65
const std::string fieldName
Name of primary solution fields (for ICs)
Definition SIMImplicitLMM.h:199
int order
Order of method.
Definition SIMImplicitLMM.h:198
bool saveModel(char *fileName, int &geoBlk, int &nBlock)
Opens a new VTF-file and writes the model geometry to it.
Definition SIMImplicitLMM.h:127
bool serialize(std::map< std::string, std::string > &data)
Serialize internal state for restarting purposes.
Definition SIMImplicitLMM.h:146
std::vector< SystemVector * > loads
Unscaled load vectors.
Definition SIMImplicitLMM.h:197
Solver & solver
Reference to simulator.
Definition SIMImplicitLMM.h:195
SIMImplicitLMM(Solver &solv, Method type, bool=false, const std::string &solField="")
Constructor.
Definition SIMImplicitLMM.h:39
LMMNonLinSIM nSim
Nonlinear solver.
Definition SIMImplicitLMM.h:196
bool saveStep(const TimeStep &tp, int &nBlock)
Saves the converged results of a given time step to VTF file.
Definition SIMImplicitLMM.h:133
bool deSerialize(const std::map< std::string, std::string > &data)
Set internal state from a serialized state.
Definition SIMImplicitLMM.h:153
bool hasICs
If true, start with full order.
Definition SIMImplicitLMM.h:200
bool solveStep(TimeStep &tp)
Computes the solution for the current time step.
Definition SIMImplicitLMM.h:68
~SIMImplicitLMM()
Destructor frees up the load vectors.
Definition SIMImplicitLMM.h:58
bool advanceStep(TimeStep &tp)
Advances the time step one step forward.
Definition SIMImplicitLMM.h:100
Class for encapsulation of general time stepping parameters.
Definition TimeStep.h:31
int step
Time step counter.
Definition TimeStep.h:72
TimeDomain time
Time domain data.
Definition TimeStep.h:74
Utilities for time integration.
Definition BDF.h:21
Method
Enum defining various solution methods.
Definition TimeIntUtils.h:28
@ AM2
Second order Adams-Moulton, implicit.
Definition TimeIntUtils.h:44
@ AM4
Fourth order Adams-Moulton, implicit.
Definition TimeIntUtils.h:46
@ AM3
Third order Adams-Moulton, implicit.
Definition TimeIntUtils.h:45
Struct representing the time domain.
Definition TimeDomain.h:23
double dt
Current timestep (or load parameter) increment.
Definition TimeDomain.h:25
double t
Current time (or pseudo time, load parameter)
Definition TimeDomain.h:24