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 "SystemMatrix.h"
18 #include "SIMenums.h"
19 #include "TimeIntUtils.h"
20 #include "TimeStep.h"
21 
22 class DataExporter;
23 
24 
25 namespace TimeIntegration {
26 
30  template<class Solver>
32 {
33 public:
38  SIMImplicitLMM(Solver& solv, Method type, bool = false,
39  const std::string& solField = "") :
40  solver(solv), nSim(solver,loads), fieldName(solField)
41  {
42  if (type == AM2)
43  order = 2;
44  else if (type == AM3)
45  order = 3;
46  else if (type == AM4)
47  order = 4;
48  else
49  order = 1;
50 
51  loads.resize(order, nullptr);
52 
53  Solver::msgLevel = 1; // prints primary solution summary only
54  }
55 
58  {
59  for (SystemVector* v : loads)
60  delete v;
61  }
62 
64  const ProcessAdm& getProcessAdm() const { return solver.getProcessAdm(); }
65 
67  bool solveStep(TimeStep& tp)
68  {
69  const std::vector<std::vector<double>> AM_coefs =
70  {{1.0},
71  {0.5, 0.5},
72  {-1.0/12.0, 2.0/3.0, 5.0/12.0},
73  {1.0/24.0, -5.0/24, 19.0/24.0, 9.0/24.0},
74  {-19.0/720.0, 106.0/720.0, -264.0/720.0, 646.0/720.0, 251.0/720.0}};
75 
76  const int c_order = hasICs ? order-1 : std::min(order-1, tp.step-1);
77  nSim.setCoefs(AM_coefs[c_order]);
78 
79  nSim.initSol(2);
80  nSim.theSolutions()[0] = solver.getSolution();
81  nSim.theSolutions()[1] = solver.getSolution();
82  solver.setTimeScale(AM_coefs[c_order].back()*tp.time.dt);
83  if (nSim.solveStep(tp, SIM::DYNAMIC) != SIM::CONVERGED)
84  return false;
85 
86  solver.getSolution() = nSim.getSolution(0);
87 
88  solver.setMode(SIM::RHS_ONLY);
89  solver.setTimeScale(1.0);
90  if (!solver.assembleSystem(tp.time, Vectors(1, solver.getSolution()), false))
91  return false;
92 
93  loads[0] = solver.getRHSvector(0, true);
94 
95  return true;
96  }
97 
100  {
101  // Evaluate fluxes for initial conditions.
102  if (tp.step == 1) {
103  hasICs = true;
104  for (int j = 2; j <= order && hasICs; ++j)
105  if (std::string fName = fieldName + std::to_string(j);
106  solver.hasIC(fName)) {
107  TimeDomain time(tp.time);
108  time.t = tp.time.t - j*tp.time.dt;
109  if (!solver.assembleSystem(time, Vectors(1, solver.getSolution(j-1))))
110  return false;
111 
112  loads[j-2] = solver.getRHSvector(0, true);
113  }
114  else
115  hasICs = false;
116  }
117 
118  delete loads.back();
119  for (int j = order-2; j >= 0; --j)
120  loads[j+1] = loads[j];
121 
122  return solver.advanceStep(tp);
123  }
124 
126  bool saveModel(char* fileName, int& geoBlk, int& nBlock)
127  {
128  return solver.saveModel(fileName, geoBlk, nBlock);
129  }
130 
132  bool saveStep(const TimeStep& tp, int& nBlock)
133  {
134  return solver.saveStep(tp, nBlock);
135  }
136 
138  void registerFields(DataExporter& exporter)
139  {
140  solver.registerFields(exporter);
141  }
142 
145  bool serialize(std::map<std::string,std::string>& data)
146  {
147  return solver.serialize(data);
148  }
149 
152  bool deSerialize(const std::map<std::string,std::string>& data)
153  {
154  return solver.deSerialize(data);
155  }
156 
157 protected:
159  class LMMNonLinSIM : public NonLinSIM
160  {
161  public:
165  LMMNonLinSIM(SIMbase& sim, std::vector<SystemVector*>& load)
166  : NonLinSIM(sim), loads(load) {}
167 
169  void setCoefs(const std::vector<double>& coef) { coefs = coef; }
170 
171  protected:
177  bool assembleSystem(const TimeDomain& time, const Vectors& pSol,
178  bool newLHSmatrix = true, bool poorConvg = false)
179  {
180  if (!model.assembleSystem(time, pSol, newLHSmatrix, poorConvg))
181  return false;
182 
183  for (size_t i = 0; i < coefs.size()-1; ++i)
184  model.addToRHSvector(0, *loads[coefs.size()-i-1], coefs[i]*time.dt);
185 
186  return true;
187  }
188 
189  private:
190  std::vector<SystemVector*>& loads;
191  std::vector<double> coefs;
192  };
193 
194  Solver& solver;
196  std::vector<SystemVector*> loads;
197  int order;
198  const std::string fieldName;
199  bool hasICs = false;
200 };
201 
202 }
203 
204 #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.
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:210
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:1713
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:1168
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:160
std::vector< SystemVector * > & loads
Reference to load vectors.
Definition: SIMImplicitLMM.h:190
bool assembleSystem(const TimeDomain &time, const Vectors &pSol, bool newLHSmatrix=true, bool poorConvg=false)
Administers assembly of the linear equation system.
Definition: SIMImplicitLMM.h:177
LMMNonLinSIM(SIMbase &sim, std::vector< SystemVector * > &load)
The constructor initializes default solution parameters.
Definition: SIMImplicitLMM.h:165
void setCoefs(const std::vector< double > &coef)
Set scaling coefficients.
Definition: SIMImplicitLMM.h:169
std::vector< double > coefs
Time integration coefficients.
Definition: SIMImplicitLMM.h:191
Implicit multi-step time integration for SIM classes.
Definition: SIMImplicitLMM.h:32
void registerFields(DataExporter &exporter)
Registers fields for output to a data exporter.
Definition: SIMImplicitLMM.h:138
const std::string fieldName
Name of primary solution fields (for ICs)
Definition: SIMImplicitLMM.h:198
const ProcessAdm & getProcessAdm() const
Returns the parallel process administrator.
Definition: SIMImplicitLMM.h:64
int order
Order of method.
Definition: SIMImplicitLMM.h:197
bool saveModel(char *fileName, int &geoBlk, int &nBlock)
Opens a new VTF-file and writes the model geometry to it.
Definition: SIMImplicitLMM.h:126
bool serialize(std::map< std::string, std::string > &data)
Serialize internal state for restarting purposes.
Definition: SIMImplicitLMM.h:145
std::vector< SystemVector * > loads
Unscaled load vectors.
Definition: SIMImplicitLMM.h:196
Solver & solver
Reference to simulator.
Definition: SIMImplicitLMM.h:194
SIMImplicitLMM(Solver &solv, Method type, bool=false, const std::string &solField="")
Constructor.
Definition: SIMImplicitLMM.h:38
LMMNonLinSIM nSim
Nonlinear solver.
Definition: SIMImplicitLMM.h:195
bool saveStep(const TimeStep &tp, int &nBlock)
Saves the converged results of a given time step to VTF file.
Definition: SIMImplicitLMM.h:132
bool deSerialize(const std::map< std::string, std::string > &data)
Set internal state from a serialized state.
Definition: SIMImplicitLMM.h:152
bool hasICs
If true, start with full order.
Definition: SIMImplicitLMM.h:199
bool solveStep(TimeStep &tp)
Computes the solution for the current time step.
Definition: SIMImplicitLMM.h:67
~SIMImplicitLMM()
Destructor frees up the load vectors.
Definition: SIMImplicitLMM.h:57
bool advanceStep(TimeStep &tp)
Advances the time step one step forward.
Definition: SIMImplicitLMM.h:99
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