elasticity_upscale.hpp
Go to the documentation of this file.
1 //==============================================================================
11 //==============================================================================
12 #ifndef ELASTICITY_UPSCALE_HPP_
13 #define ELASTICITY_UPSCALE_HPP_
14 
15 #include <dune/common/fmatrix.hh>
16 #include <opm/core/utility/parameters/ParameterGroup.hpp>
17 #include <dune/grid/common/mcmgmapper.hh>
18 #include <dune/geometry/quadraturerules.hh>
19 #include <dune/istl/ilu.hh>
20 #include <dune/istl/solvers.hh>
21 #include <dune/istl/preconditioners.hh>
22 #include <dune/grid/CpGrid.hpp>
24 
33 #include <opm/elasticity/mpc.hh>
39 
40 #include <opm/parser/eclipse/Parser/Parser.hpp>
41 #include <opm/parser/eclipse/Deck/Deck.hpp>
42 
43 namespace Opm {
44 namespace Elasticity {
45 
47 enum Solver {
50 };
51 
53  AMG,
58 };
59 
67 };
68 
70 enum Smoother {
75 };
76 
77 struct LinSolParams {
80 
82  int restart;
83 
85  int maxit;
86 
88  double tol;
89 
91  bool symmetric;
92 
94  bool uzawa;
95 
97  int steps[2];
98 
101 
103  int zcells;
104 
106  bool report;
107 
110 
113 
116 
119  void parse(Opm::parameter::ParameterGroup& param)
120  {
121  std::string solver = param.getDefault<std::string>("linsolver_type","iterative");
122  if (solver == "iterative")
123  type = ITERATIVE;
124  else
125  type = DIRECT;
126  restart = param.getDefault<int>("linsolver_restart", 1000);
127  tol = param.getDefault<double>("ltol",1.e-8);
128  maxit = param.getDefault<int>("linsolver_maxit", 10000);
129  steps[0] = param.getDefault<int>("linsolver_presteps", 2);
130  steps[1] = param.getDefault<int>("linsolver_poststeps", 2);
131  coarsen_target = param.getDefault<int>("linsolver_coarsen", 5000);
132  symmetric = param.getDefault<bool>("linsolver_symmetric", true);
133  report = param.getDefault<bool>("linsolver_report", false);
134  solver = param.getDefault<std::string>("linsolver_pre","");
135 
136  if (solver == "") // set default based on aspect ratio heuristic
137  solver="heuristic";
138 
139  if (solver == "schwarz")
140  pre = SCHWARZ;
141  else if (solver == "fastamg")
142  pre = FASTAMG;
143  else if (solver == "twolevel")
144  pre = TWOLEVEL;
145  else if (solver == "heuristic")
146  pre = UNDETERMINED;
147  else
148  pre = AMG;
149 
150  solver = param.getDefault<std::string>("linsolver_mortarpre","schur");
151  if (solver == "simple")
152  mortarpre = SIMPLE;
153  else if (solver == "amg")
154  mortarpre = SCHURAMG;
155  else if (solver == "schwarz")
156  mortarpre = SCHURSCHWARZ;
157  else if (solver == "twolevel")
158  mortarpre = SCHURTWOLEVEL;
159  else
160  mortarpre = SCHUR;
161 
162  uzawa = param.getDefault<bool>("linsolver_uzawa", false);
163  zcells = param.getDefault<int>("linsolver_zcells", 2);
164 
165  solver = param.getDefault<std::string>("linsolver_smoother","ssor");
166  if (solver == "schwarz")
167  smoother = SMOOTH_SCHWARZ;
168  else if (solver == "ilu")
169  smoother = SMOOTH_ILU;
170  else if (solver == "jacobi")
171  smoother = SMOOTH_JACOBI;
172  else {
173  if (solver != "ssor")
174  std::cerr << "WARNING: Invalid smoother specified, falling back to SSOR" << std::endl;
175  smoother = SMOOTH_SSOR;
176  }
177 
178  if (symmetric)
179  steps[1] = steps[0];
180  }
181 };
182 
184  template<class GridType, class PC>
186 {
187  public:
189  static const int dim = GridType::dimension;
190 
192  typedef typename GridType::LeafGridView::ctype ctype;
193 
195  typedef Dune::FieldVector<double,dim> NodeValue;
196 
198  typedef typename GridType::LeafGridView::template Codim<1>::Geometry::GlobalCoordinate GlobalCoordinate;
199 
201  typedef typename GridType::LeafGridView::IndexSet LeafIndexSet;
202 
204  typedef typename GridType::LeafGridView::template Codim<0>::Iterator LeafIterator;
205 
207  typedef typename PC::type PCType;
208 
210  typedef std::shared_ptr<typename PC::type> PCPtr;
211 
214 
216  Vector u[6];
218  Vector b[6];
219 
221  std::vector<double> volumeFractions;
223  bool bySat;
224 
226  double upscaledRho;
227 
235  ElasticityUpscale(const GridType& gv_, ctype tol_, ctype Escale_,
236  const std::string& file, const std::string& rocklist,
237  bool verbose_)
238  : A(gv_), gv(gv_), tol(tol_), Escale(Escale_), E(gv_), verbose(verbose_),
239  color(gv_)
240  {
241  if (rocklist.empty())
242  loadMaterialsFromGrid(file);
243  else
244  loadMaterialsFromRocklist(file,rocklist);
245  }
246 
250  void findBoundaries(double* min, double* max);
251 
256  void addMPC(Direction dir, int slave,
257  const BoundaryGrid::Vertex& m);
258 
262  void periodicBCs(const double* min, const double* max);
263 
271  void periodicBCsMortar(const double* min,
272  const double* max, int n1, int n2,
273  int p1, int p2);
274 
278  void fixCorners(const double* min, const double* max);
279 
283  void assemble(int loadcase, bool matrix);
284 
289  template <int comp>
290  void averageStress(Dune::FieldVector<ctype,comp>& sigma,
291  const Vector& u, int loadcase);
292 
295  void solve(int loadcase);
296 
298  void setupSolvers(const LinSolParams& params);
299 
300  private:
302  typedef typename GridType::LeafGridView::template Codim<dim>::Iterator LeafVertexIterator;
303 
305  const GridType& gv;
306 
308  ctype tol;
309 
311  ctype Escale;
312 
314  ctype Emin;
315 
320  bool isOnPlane(Direction plane, GlobalCoordinate coord, ctype value);
321 
327  bool isOnLine(Direction dir, GlobalCoordinate coord, ctype x, ctype y);
328 
332  bool isOnPoint(GlobalCoordinate coord, GlobalCoordinate point);
333 
335  std::vector< std::shared_ptr<Material> > materials;
336 
341  std::vector<BoundaryGrid::Vertex> extractFace(Direction dir, ctype coord);
342 
344  enum SIDE {
345  LEFT,
346  RIGHT
347  };
348 
355  BoundaryGrid extractMasterFace(Direction dir, ctype coord,
356  SIDE side=LEFT, bool dc=false);
357 
361  void determineSideFaces(const double* min, const double* max);
362 
368  void periodicPlane(Direction plane, Direction dir,
369  const std::vector<BoundaryGrid::Vertex>& slave,
370  const BoundaryGrid& master);
371 
376  void fixPoint(Direction dir, GlobalCoordinate coord,
377  const NodeValue& value = NodeValue(0));
378 
384  void fixLine(Direction dir, ctype x, ctype y,
385  const NodeValue& value = NodeValue(0));
386 
388  typedef std::map<int,BoundaryGrid::Vertex> SlaveGrid;
389 
398  int addBBlockMortar(const BoundaryGrid& b1,
399  const BoundaryGrid& interface, int dir,
400  int n1, int n2, int colofs);
401 
410  void assembleBBlockMortar(const BoundaryGrid& b1,
411  const BoundaryGrid& interface, int dir,
412  int n1, int n2, int colofs, double alpha=1.0);
413 
416  void loadMaterialsFromGrid(const std::string& file);
417 
421  void loadMaterialsFromRocklist(const std::string& file,
422  const std::string& rocklist);
423 
425  std::vector<BoundaryGrid> master;
426 
428  std::vector< std::vector<BoundaryGrid::Vertex> > slave;
429 
431  AdjacencyPattern Bpatt;
432  Matrix B;
433 
434  Matrix P;
435 
437  typedef std::shared_ptr<Dune::InverseOperator<Vector, Vector> > SolverPtr;
438  std::vector<SolverPtr> tsolver;
439 
441  std::shared_ptr<Operator> op;
442 
444  typedef MortarBlockEvaluator<Dune::Preconditioner<Vector, Vector> > SchurPreconditioner;
445 
447  typedef MortarBlockEvaluator<Dune::InverseOperator<Vector, Vector> > SchurEvaluator;
448 
450  std::shared_ptr<SchurEvaluator> op2;
451 
453  std::vector<PCPtr> upre;
454 
456  typedef Dune::InverseOperator2Preconditioner<LUSolver,
457  Dune::SolverCategory::sequential> SeqLU;
459  std::shared_ptr<SeqLU> lpre;
460  std::shared_ptr<LUSolver> lprep;
461 
463  typedef std::shared_ptr< MortarSchurPre<PCType> > MortarAmgPtr;
464  std::vector<MortarAmgPtr> tmpre;
465 
467  std::shared_ptr<MortarEvaluator> meval;
468 
470  Elasticity<GridType> E;
471 
473  bool verbose;
474 
477 };
478 
479 }} // namespace Opm, Elasticity
480 
482 
483 #endif
MultiplierPreconditioner mortarpre
Preconditioner for mortar block.
Definition: elasticity_upscale.hpp:115
Schur based linear operator for a Mortar block.
diagonal approximation of A
Definition: elasticity_upscale.hpp:62
Definition: elasticity_upscale.hpp:74
Class handling finite element assembly.
Definition: asmhandler.hpp:29
schur + primary preconditioner
Definition: elasticity_upscale.hpp:63
Generate a coloring of a mesh suitable for threaded assembly. The mesh is assumed structured...
Definition: meshcolorizer.hpp:26
Definition: elasticity_upscale.hpp:48
Definition: elasticity_upscale.hpp:56
Vector u[6]
The solution vectors.
Definition: elasticity_upscale.hpp:216
GridType::LeafGridView::IndexSet LeafIndexSet
A set of indices.
Definition: elasticity_upscale.hpp:201
Definition: applier.hpp:18
int zcells
Number of cells in z to collapse in each cell.
Definition: elasticity_upscale.hpp:103
Smoother
Smoother used in the AMG.
Definition: elasticity_upscale.hpp:70
bool uzawa
Use a Uzawa approach.
Definition: elasticity_upscale.hpp:94
Definition: elasticity_upscale.hpp:77
std::vector< std::set< int > > AdjacencyPattern
For storing matrix adjacency/sparsity patterns.
Definition: matrixops.hpp:26
Elasticity helper class.
PC::type PCType
Our preconditioner type.
Definition: elasticity_upscale.hpp:207
schur + twolevel
Definition: elasticity_upscale.hpp:66
bool report
Give a report at end of solution phase.
Definition: elasticity_upscale.hpp:106
schur + amg
Definition: elasticity_upscale.hpp:64
int steps[2]
The number of pre/post steps in the AMG.
Definition: elasticity_upscale.hpp:97
ASMHandler< GridType > A
The linear operator.
Definition: elasticity_upscale.hpp:213
Definition: elasticity_upscale.hpp:72
MultiplierPreconditioner
An enumeration of the available preconditioners for multiplier block.
Definition: elasticity_upscale.hpp:61
Material properties.
void solve(int loadcase)
Solve Au = b for u.
bool symmetric
Use MINRES instead of GMRES (and thus symmetric preconditioning)
Definition: elasticity_upscale.hpp:91
Mortar helper class.
Elasticity upscale class - template implementations.
void periodicBCs(const double *min, const double *max)
Establish periodic boundaries using the MPC approach.
A class describing a 2D vertex.
Definition: boundarygrid.hh:57
Dune::BCRSMatrix< Dune::FieldMatrix< double, 1, 1 > > Matrix
A sparse matrix holding our operator.
Definition: matrixops.hpp:23
void addMPC(Direction dir, int slave, const BoundaryGrid::Vertex &m)
Add a MPC equation.
int maxit
Max number of iterations.
Definition: elasticity_upscale.hpp:85
void periodicBCsMortar(const double *min, const double *max, int n1, int n2, int p1, int p2)
Establish periodic boundaries using the mortar approach.
Helper class with some matrix operations.
Dune::FieldVector< double, dim > NodeValue
A vectorial node value.
Definition: elasticity_upscale.hpp:195
min[0]
Definition: elasticity_upscale_impl.hpp:144
Uzawa scheme helper class.
The main driver class.
Definition: elasticity_upscale.hpp:185
Definition: elasticity_upscale.hpp:57
Logging helper utilities.
GridType::LeafGridView::template Codim< 0 >::Iterator LeafIterator
An iterator over grid cells.
Definition: elasticity_upscale.hpp:204
void averageStress(Dune::FieldVector< ctype, comp > &sigma, const Vector &u, int loadcase)
Calculate the average stress vector for the given loadcase.
Mesh colorizer class.
Class handling finite element assembly.
void parse(Opm::parameter::ParameterGroup &param)
Parse command line parameters.
Definition: elasticity_upscale.hpp:119
GridType::LeafGridView::ctype ctype
A basic number.
Definition: elasticity_upscale.hpp:192
Definition: elasticity_upscale.hpp:71
Representation of multi-point constraint (MPC) equations.
Definition: elasticity_upscale.hpp:49
Direction
An enum for specification of global coordinate directions.
Definition: mpc.hh:24
void assemble(int loadcase, bool matrix)
Assemble (optionally) stiffness matrix A and load vector.
void findBoundaries(double *min, double *max)
Find boundary coordinates.
double upscaledRho
Upscaled density.
Definition: elasticity_upscale.hpp:226
bool bySat
Are volume fractions grouped by SATNUM?
Definition: elasticity_upscale.hpp:223
Solver type
The linear solver to employ.
Definition: elasticity_upscale.hpp:79
Preconditioner
Definition: elasticity_upscale.hpp:52
Definition: elasticity_upscale.hpp:54
Linear operator for a Mortar block.
void fixCorners(const double *min, const double *max)
Fix corner nodes.
Classes for shape functions. Loosely based on code in dune-grid-howto.
Dune::BlockVector< Dune::FieldVector< double, 1 > > Vector
A vector holding our RHS.
Definition: matrixops.hpp:29
Preconditioners for elasticity upscaling.
GridType::LeafGridView::template Codim< 1 >::Geometry::GlobalCoordinate GlobalCoordinate
A global coordinate.
Definition: elasticity_upscale.hpp:198
Definition: elasticity_upscale.hpp:53
ElasticityUpscale(const GridType &gv_, ctype tol_, ctype Escale_, const std::string &file, const std::string &rocklist, bool verbose_)
Main constructor.
Definition: elasticity_upscale.hpp:235
static const int dim
Dimension of our grid.
Definition: elasticity_upscale.hpp:189
Smoother smoother
Smoother type used in the AMG.
Definition: elasticity_upscale.hpp:109
Preconditioner pre
Preconditioner for elasticity block.
Definition: elasticity_upscale.hpp:112
std::vector< double > volumeFractions
Vector holding the volume fractions for materials (grouped by SATNUM)
Definition: elasticity_upscale.hpp:221
Definition: elasticity_upscale.hpp:73
Vector b[6]
The load vectors.
Definition: elasticity_upscale.hpp:218
Definition: elasticity_upscale.hpp:55
int coarsen_target
Coarsening target in the AMG.
Definition: elasticity_upscale.hpp:100
Solver
An enumeration of available linear solver classes.
Definition: elasticity_upscale.hpp:47
Class describing 2D quadrilateral grids.
int restart
Number of iterations in GMRES before restart.
Definition: elasticity_upscale.hpp:82
schur + schwarz+lu
Definition: elasticity_upscale.hpp:65
double tol
The tolerance for the iterative linear solver.
Definition: elasticity_upscale.hpp:88
void setupSolvers(const LinSolParams &params)
std::shared_ptr< typename PC::type > PCPtr
A pointer to our preconditioner.
Definition: elasticity_upscale.hpp:210