Memosa-FVM  0.2
FractureModel_impl.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #include "Mesh.h"
6 #include <sstream>
7 
8 #include "NumType.h"
9 #include "Array.h"
10 #include "Field.h"
11 #include "CRConnectivity.h"
12 #include "LinearSystem.h"
13 //#include "FieldSet.h"
14 #include "StorageSite.h"
15 #include "MultiFieldMatrix.h"
16 #include "CRMatrix.h"
17 #include "FluxJacobianMatrix.h"
18 #include "DiagonalMatrix.h"
19 #include "GenericBCS.h"
20 #include "Vector.h"
22 //#include "ConvectionDiscretization.h"
23 #include "AMG.h"
24 #include "Linearizer.h"
25 #include "GradientModel.h"
26 //#include "GenericIBDiscretization.h"
29 #include "SquareTensor.h"
30 
31 template<class T>
33 {
34 public:
35  typedef Array<T> TArray;
42 
43  Impl(const GeomFields& geomFields,
44  FractureFields& fractureFields,
45  const MeshList& meshes) :
46  _meshes(meshes),
47  _geomFields(geomFields),
48  _fractureFields(fractureFields),
49  _phasefieldGradientModel(_meshes,_fractureFields.phasefieldvalue,
50  _fractureFields.phasefieldGradient,_geomFields),
51  _initialNorm(),
52  _niters(0)
53  {
54  const int numMeshes = _meshes.size();
55  for (int n=0; n<numMeshes; n++)
56  {
57  const Mesh& mesh = *_meshes[n];
58  FractureVC<T> *vc(new FractureVC<T>());
59  vc->vcType = "flow";
60  _vcMap[mesh.getID()] = vc;
61 
62  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
63  {
64  const FaceGroup& fg = *fgPtr;
65  FractureBC<T> *bc(new FractureBC<T>());
66 
67  _bcMap[fg.id] = bc;
68 
69  if ((fg.groupType == "wall") ||
70  (fg.groupType == "symmetry"))
71  {
72  bc->bcType = "SpecifiedPhaseFieldFlux";
73  }
74  else if ((fg.groupType == "velocity-inlet") ||
75  (fg.groupType == "pressure-outlet"))
76  {
77  bc->bcType = "SpecifiedPhaseFieldValue";
78  }
79  else
80  throw CException("FractureModel: unknown face group type "
81  + fg.groupType);
82  }
83  }
84  }
85 
86  void init()
87  {
88  const int numMeshes = _meshes.size();
89  for (int n=0; n<numMeshes; n++)
90  {
91  const Mesh& mesh = *_meshes[n];
92 
93  const StorageSite& cells = mesh.getCells();
94  const FractureVC<T>& vc = *_vcMap[mesh.getID()];
95 
96  //phasefieldvalue
97  shared_ptr<TArray> tCell(new TArray(cells.getCountLevel1()));
98  *tCell = _options["initialPhaseFieldValue"];
99  _fractureFields.phasefieldvalue.addArray(cells,tCell);
100 
101  if(_options.transient)
102  {
103  _fractureFields.phasefieldvalueN1.addArray(cells, dynamic_pointer_cast<ArrayBase>(tCell->newCopy()));
104  if (_options.timeDiscretizationOrder > 1)
105  _fractureFields.phasefieldvalueN2.addArray(cells, dynamic_pointer_cast<ArrayBase>(tCell->newCopy()));
106  }
107 
108  //conductivity
109  shared_ptr<TArray> condCell(new TArray(cells.getCountLevel1()));
110  *condCell = vc["fractureConductivity"];
111  _fractureFields.conductivity.addArray(cells,condCell);
112 
113  //source
114  shared_ptr<TArray> sCell(new TArray(cells.getCountLevel1()));
115  *sCell = vc["fractureSource"];
116  //*sCell =T(0.0);
117  _fractureFields.source.addArray(cells,sCell);
118 
119  //source coef
120  shared_ptr<TArray> scoefCell(new TArray(cells.getCountLevel1()));
121  *scoefCell = vc["fractureSourceCoef"];
122  //*scoefCell=T(0.0);
123  _fractureFields.sourcecoef.addArray(cells,scoefCell);
124 
125  //create a zero field
126  shared_ptr<TArray> zeroCell(new TArray(cells.getCountLevel1()));
127  *zeroCell = T(0.0);
128  _fractureFields.zero.addArray(cells,zeroCell);
129 
130  //create a one field
131  shared_ptr<TArray> oneCell(new TArray(cells.getCountLevel1()));
132  *oneCell = T(1.0);
133  _fractureFields.one.addArray(cells,oneCell);
134 
135  //create specific heat field rho*Cp
136  //shared_ptr<TArray> cp(new TArray(cells.getCount()));
137  //*cp = vc["density"] * vc["specificHeat"];
138  //_thermalFields.specificHeat.addArray(cells, cp);
139 
140  //initial phasefieldvalue gradient array
141  shared_ptr<TGradArray> gradT(new TGradArray(cells.getCountLevel1()));
142  gradT->zero();
143  _fractureFields.phasefieldGradient.addArray(cells,gradT);
144 
145  //inital convection flux at faces
146 
147  //const StorageSite& allFaces = mesh.getFaces();
148  //shared_ptr<TArray> convFlux(new TArray(allFaces.getCount()));
149  //convFlux->zero();
150  //_thermalFields.convectionFlux.addArray(allFaces,convFlux);
151 
152  //phasefield flux at faces
153  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
154  {
155  const FaceGroup& fg = *fgPtr;
156  const StorageSite& faces = fg.site;
157 
158  shared_ptr<TArray> fluxFace(new TArray(faces.getCount()));
159 
160  fluxFace->zero();
161  _fractureFields.phasefieldFlux.addArray(faces,fluxFace);
162 
163  }
164  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
165  {
166  const FaceGroup& fg = *fgPtr;
167  const StorageSite& faces = fg.site;
168 
169  shared_ptr<TArray> fluxFace(new TArray(faces.getCount()));
170 
171  fluxFace->zero();
172  _fractureFields.phasefieldFlux.addArray(faces,fluxFace);
173 
174  }
175 
176 
177  }
178  _fractureFields.conductivity.syncLocal();
179  _niters =0;
180  _initialNorm = MFRPtr();
181  }
182 
183  FractureBCMap& getBCMap() {return _bcMap;}
184  FractureVCMap& getVCMap() {return _vcMap;}
185 
186  FractureBC<T>& getBC(const int id) {return *_bcMap[id];}
187 
188  FractureModelOptions<T>& getOptions() {return _options;}
189 
191  {
192  const int numMeshes = _meshes.size();
193  for (int n=0; n<numMeshes; n++)
194  {
195  const Mesh& mesh = *_meshes[n];
196 
197  const StorageSite& cells = mesh.getCells();
198  MultiField::ArrayIndex tIndex(&_fractureFields.phasefieldvalue,&cells);
199 
200  ls.getX().addArray(tIndex,_fractureFields.phasefieldvalue.getArrayPtr(cells));
201 
202  const CRConnectivity& cellCells = mesh.getCellCells();
203 
204  shared_ptr<Matrix> m(new CRMatrix<T,T,T>(cellCells));
205 
206  ls.getMatrix().addMatrix(tIndex,tIndex,m);
207 
208  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
209  {
210  const FaceGroup& fg = *fgPtr;
211  const StorageSite& faces = fg.site;
212 
213  MultiField::ArrayIndex fIndex(&_fractureFields.phasefieldFlux,&faces);
214  ls.getX().addArray(fIndex,_fractureFields.phasefieldFlux.getArrayPtr(faces));
215 
216  const CRConnectivity& faceCells = mesh.getFaceCells(faces);
217 
218  shared_ptr<Matrix> mft(new FluxJacobianMatrix<T,T>(faceCells));
219  ls.getMatrix().addMatrix(fIndex,tIndex,mft);
220 
221  shared_ptr<Matrix> mff(new DiagonalMatrix<T,T>(faces.getCount()));
222  ls.getMatrix().addMatrix(fIndex,fIndex,mff);
223  }
224 
225  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
226  {
227  const FaceGroup& fg = *fgPtr;
228  const StorageSite& faces = fg.site;
229 
230  MultiField::ArrayIndex fIndex(&_fractureFields.phasefieldFlux,&faces);
231  ls.getX().addArray(fIndex,_fractureFields.phasefieldFlux.getArrayPtr(faces));
232 
233  const CRConnectivity& faceCells = mesh.getFaceCells(faces);
234 
235  shared_ptr<Matrix> mft(new FluxJacobianMatrix<T,T>(faceCells));
236  ls.getMatrix().addMatrix(fIndex,tIndex,mft);
237 
238  shared_ptr<Matrix> mff(new DiagonalMatrix<T,T>(faces.getCount()));
239  ls.getMatrix().addMatrix(fIndex,fIndex,mff);
240  }
241 
242  }
243  }
244 
246  {
247  _phasefieldGradientModel.compute();
248 
249  DiscrList discretizations;
250 
251  shared_ptr<Discretization>
253  (_meshes,_geomFields,
254  _fractureFields.phasefieldvalue,
255  _fractureFields.conductivity,
256  _fractureFields.phasefieldGradient));
257  discretizations.push_back(dd);
258 
259  //shared_ptr<Discretization>
260  // cd(new ConvectionDiscretization<T,T,T>
261  //(_meshes,_geomFields,
262  // _fractureFields.phasefieldvalue,
263  // _fractureFields.phasefieldFlux,
264  // _fractureFields.zero,
265  // _fractureFields.phasefieldGradient,
266  // _options.useCentralDifference));
267  //discretizations.push_back(cd);
268 
269  shared_ptr<Discretization>
271  (_meshes,
272  _geomFields,
273  _fractureFields.phasefieldvalue,
274  _fractureFields.source,
275  _fractureFields.sourcecoef));
276  discretizations.push_back(scfd);
277 
278  if (_options.transient)
279  {
280  shared_ptr<Discretization>
282  (_meshes, _geomFields,
283  _fractureFields.phasefieldvalue,
284  _fractureFields.phasefieldvalueN1,
285  _fractureFields.phasefieldvalueN2,
286  _fractureFields.one,
287  _options["timeStep"]));
288  discretizations.push_back(td);
289  }
290 
291  //shared_ptr<Discretization>
292  // ibm(new GenericIBDiscretization<T,T,T>
293  // (_meshes,_geomFields,_thermalFields.temperature));
294  //discretizations.push_back(ibm);
295 
296 
297  Linearizer linearizer;
298 
299  linearizer.linearize(discretizations,_meshes,ls.getMatrix(),
300  ls.getX(), ls.getB());
301 
302  const int numMeshes = _meshes.size();
303  for (int n=0; n<numMeshes; n++)
304  {
305  const Mesh& mesh = *_meshes[n];
306 
307  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
308  {
309  const FaceGroup& fg = *fgPtr;
310  const StorageSite& faces = fg.site;
311 
312  const FractureBC<T>& bc = *_bcMap[fg.id];
313 
314 
315  GenericBCS<T,T,T> gbc(faces,mesh,
316  _geomFields,
317  _fractureFields.phasefieldvalue,
318  _fractureFields.phasefieldFlux,
319  ls.getMatrix(), ls.getX(), ls.getB());
320 
321  if (bc.bcType == "SpecifiedPhaseFieldValue")
322  {
324  bT(bc.getVal("specifiedPhaseFieldValue"),faces);
325  gbc.applyDirichletBC(bT);
326  }
327  else if (bc.bcType == "SpecifiedPhaseFieldFlux")
328  {
330  bPhaseFieldFlux(bc.getVal("specifiedPhaseFieldFlux"),faces);
331 
332  const int nFaces = faces.getCount();
333 
334  for(int f=0; f<nFaces; f++)
335  {
336  gbc.applyNeumannBC(f, bPhaseFieldFlux[f]);
337  }
338  }
339  else if (bc.bcType == "Symmetry")
340  {
341  T zeroFlux(NumTypeTraits<T>::getZero());
342  gbc.applyNeumannBC(zeroFlux);
343  }
344  else
345  throw CException(bc.bcType + " not implemented for FractureModel");
346  }
347 
348  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
349  {
350  const FaceGroup& fg = *fgPtr;
351  const StorageSite& faces = fg.site;
352  GenericBCS<T,T,T> gbc(faces,mesh,
353  _geomFields,
354  _fractureFields.phasefieldvalue,
355  _fractureFields.phasefieldFlux,
356  ls.getMatrix(), ls.getX(), ls.getB());
357 
358  gbc.applyInterfaceBC();
359  }
360  }
361  }
362 
363  /* T getHeatFluxIntegral(const Mesh& mesh, const int faceGroupId)
364  {
365  T r(0.);
366  bool found = false;
367  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
368  {
369  const FaceGroup& fg = *fgPtr;
370  if (fg.id == faceGroupId)
371  {
372  const StorageSite& faces = fg.site;
373  const int nFaces = faces.getCount();
374  const TArray& heatFlux =
375  dynamic_cast<const TArray&>(_thermalFields.heatFlux[faces]);
376  for(int f=0; f<nFaces; f++)
377  r += heatFlux[f];
378  found=true;
379  }
380  }
381  if (!found)
382  throw CException("getHeatFluxIntegral: invalid faceGroupID");
383  return r;
384  } */
385 
386 
387  void advance(const int niter)
388  {
389  for(int n=0; n<niter; n++)
390  {
391  LinearSystem ls;
392  initLinearization(ls);
393 
394  ls.initAssembly();
395 
396  linearize(ls);
397 
398  ls.initSolve();
399 
400  MFRPtr rNorm(_options.getLinearSolver().solve(ls));
401 
402  if (!_initialNorm) _initialNorm = rNorm;
403 
404  MFRPtr normRatio((*rNorm)/(*_initialNorm));
405 
406  cout << _niters << ": " << *rNorm << endl;
407 
408 
409  _options.getLinearSolver().cleanup();
410 
411  ls.postSolve();
412  ls.updateSolution();
413 
414  _niters++;
415  if (*rNorm < _options.absoluteTolerance ||
416  *normRatio < _options.relativeTolerance)
417  break;
418  }
419  }
420 
421  void printBCs()
422  {
423  foreach(typename FractureBCMap::value_type& pos, _bcMap)
424  {
425  cout << "Face Group " << pos.first << ":" << endl;
426  cout << " bc type " << pos.second->bcType << endl;
427  foreach(typename FractureBC<T>::value_type& vp, *pos.second)
428  {
429  cout << " " << vp.first << " " << vp.second.constant << endl;
430  }
431  }
432  }
433 
434 
435  void updateTime()
436  {
437  const int numMeshes = _meshes.size();
438  for (int n=0; n<numMeshes; n++) {
439 
440  const Mesh& mesh = *_meshes[n];
441  const StorageSite& cells = mesh.getCells();
442  const int nCells = cells.getCountLevel1();
443 
444  TArray& phasefieldvalue =
445  dynamic_cast<TArray&>(_fractureFields.phasefieldvalue[cells]);
446  TArray& phasefieldvalueN1 =
447  dynamic_cast<TArray&>(_fractureFields.phasefieldvalueN1[cells]);
448 
449  if (_options.timeDiscretizationOrder > 1)
450  {
451  TArray& phasefieldvalueN2 =
452  dynamic_cast<TArray&>(_fractureFields.phasefieldvalueN2[cells]);
453  phasefieldvalueN2 = phasefieldvalueN1;
454  }
455  phasefieldvalueN1 = phasefieldvalue;
456  }
457  }
458 
459 /*
460 #if !(defined(USING_ATYPE_TANGENT) || defined(USING_ATYPE_PC))
461 
462  void dumpMatrix(const string fileBase)
463  {
464  LinearSystem ls;
465  initLinearization(ls);
466 
467  ls.initAssembly();
468 
469  linearize(ls);
470 
471  ls.initSolve();
472 
473  MultiFieldMatrix& matrix = ls.getMatrix();
474  MultiField& b = ls.getB();
475 for ( unsigned int id = 0; id < _meshes.size(); id++ ){
476  const Mesh& mesh = *_meshes[id];
477  const StorageSite& cells = mesh.getCells();
478 
479  MultiField::ArrayIndex tIndex(&_thermalFields.temperature,&cells);
480 
481  T_Matrix& tMatrix =
482  dynamic_cast<T_Matrix&>(matrix.getMatrix(tIndex,tIndex));
483 
484  TArray& tDiag = tMatrix.getDiag();
485  TArray& tCoeff = tMatrix.getOffDiag();
486 
487  TArray& rCell = dynamic_cast<TArray&>(b[tIndex]);
488 
489  const CRConnectivity& cr = tMatrix.getConnectivity();
490 
491  const Array<int>& row = cr.getRow();
492  const Array<int>& col = cr.getCol();
493 
494  const int nCells = cells.getSelfCount();
495  int nCoeffs = nCells;
496 
497  for(int i=0; i<nCells; i++)
498  for(int jp=row[i]; jp<row[i+1]; jp++)
499  {
500  const int j = col[jp];
501  if (j<nCells) nCoeffs++;
502  }
503  stringstream ss;
504  ss << id;
505  string matFileName = fileBase + "_mesh" + ss.str() + ".mat";
506 
507 
508  FILE *matFile = fopen(matFileName.c_str(),"wb");
509 
510  fprintf(matFile,"%%%%MatrixMarket matrix coordinate real general\n");
511  fprintf(matFile,"%d %d %d\n", nCells,nCells,nCoeffs);
512 
513  for(int i=0; i<nCells; i++)
514  {
515  fprintf(matFile,"%d %d %lf\n", i+1, i+1, tDiag[i]);
516  for(int jp=row[i]; jp<row[i+1]; jp++)
517  {
518  const int j = col[jp];
519  if (j<nCells)
520  fprintf(matFile,"%d %d %lf\n", i+1, j+1, tCoeff[jp]);
521  }
522  }
523 
524  fclose(matFile);
525 
526  string rhsFileName = fileBase + ".rhs";
527  FILE *rhsFile = fopen(rhsFileName.c_str(),"wb");
528 
529  for(int i=0; i<nCells; i++)
530  fprintf(rhsFile,"%lf\n",-rCell[i]);
531 
532  fclose(rhsFile);
533 
534  }
535 }
536 #endif
537 
538  void computeIBFaceTemperature(const StorageSite& particles)
539  {
540  typedef CRMatrixTranspose<T,T,T> IMatrix;
541 
542  const TArray& pT =
543  dynamic_cast<const TArray&>(_thermalFields.temperature[particles]);
544 
545  const int numMeshes = _meshes.size();
546  for (int n=0; n<numMeshes; n++)
547  {
548  const Mesh& mesh = *_meshes[n];
549  if (!mesh.isShell() && mesh.getIBFaces().getCount() > 0){
550  const StorageSite& cells = mesh.getCells();
551  const StorageSite& ibFaces = mesh.getIBFaces();
552 
553  GeomFields::SSPair key1(&ibFaces,&cells);
554  const IMatrix& mIC =
555  dynamic_cast<const IMatrix&>
556  (*_geomFields._interpolationMatrices[key1]);
557 
558  GeomFields::SSPair key2(&ibFaces,&particles);
559  const IMatrix& mIP =
560  dynamic_cast<const IMatrix&>
561  (*_geomFields._interpolationMatrices[key2]);
562 
563  shared_ptr<TArray> ibT(new TArray(ibFaces.getCount()));
564 
565  const TArray& cT =
566  dynamic_cast<const TArray&>(_thermalFields.temperature[cells]);
567 
568 
569  ibT->zero();
570 
571  mIC.multiplyAndAdd(*ibT,cT);
572  mIP.multiplyAndAdd(*ibT,pT);
573  _thermalFields.temperature.addArray(ibFaces,ibT);
574  }
575  }
576 
577  } */
578 
579 private:
583 
588 
590  int _niters;
591 };
592 
593 template<class T>
595  FractureFields& fractureFields,
596  const MeshList& meshes) :
597  Model(meshes),
598  _impl(new Impl(geomFields,fractureFields,meshes))
599 {
600  logCtor();
601 }
602 
603 
604 template<class T>
606 {
607  logDtor();
608 }
609 
610 template<class T>
611 void
613 {
614  _impl->init();
615 }
616 
617 template<class T>
619 FractureModel<T>::getBCMap() {return _impl->getBCMap();}
620 
621 template<class T>
623 FractureModel<T>::getVCMap() {return _impl->getVCMap();}
624 
625 template<class T>
627 FractureModel<T>::getBC(const int id) {return _impl->getBC(id);}
628 
629 template<class T>
631 FractureModel<T>::getOptions() {return _impl->getOptions();}
632 
633 
634 template<class T>
635 void
637 {
638  _impl->printBCs();
639 }
640 
641 template<class T>
642 void
644 {
645  _impl->advance(niter);
646 }
647 
648 /*
649 template<class T>
650 void
651 FractureModel<T>::computeIBFaceTemperature(const StorageSite& particles)
652 {
653  _impl->computeIBFaceTemperature(particles);
654 }
655 
656 #if !(defined(USING_ATYPE_TANGENT) || defined(USING_ATYPE_PC))
657 
658 template<class T>
659 void
660 ThermalModel<T>::dumpMatrix(const string fileBase)
661 {
662  _impl->dumpMatrix(fileBase);
663 }
664 #endif
665 
666 template<class T>
667 T
668 ThermalModel<T>::getHeatFluxIntegral(const Mesh& mesh, const int faceGroupId)
669 {
670  return _impl->getHeatFluxIntegral(mesh, faceGroupId);
671 } */
672 
673 template<class T>
674 void
676 {
677  _impl->updateTime();
678 }
void linearize(LinearSystem &ls)
FractureModel(const GeomFields &geomFields, FractureFields &fractureFields, const MeshList &meshes)
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
Impl(const GeomFields &geomFields, FractureFields &fractureFields, const MeshList &meshes)
void initAssembly()
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
FractureFields & _fractureFields
Vector< T, 3 > VectorT3
FractureVCMap & getVCMap()
FractureBCMap & getBCMap()
Definition: Mesh.h:28
std::map< int, FractureBC< T > * > FractureBCMap
Definition: FractureModel.h:23
FractureModelOptions< T > & getOptions()
const GeomFields & _geomFields
Definition: Mesh.h:49
FractureModelOptions< T > _options
Array< VectorT3 > VectorT3Array
#define logCtor()
Definition: RLogInterface.h:26
string groupType
Definition: Mesh.h:42
FloatVal< T > getVal(const string varName) const
Definition: FloatVarDict.h:85
GradientModel< T > _phasefieldGradientModel
virtual ~FractureModel()
const int id
Definition: Mesh.h:41
void updateSolution()
string vcType
Definition: FractureBC.h:31
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
void initSolve()
vector< shared_ptr< Discretization > > DiscrList
const MeshList _meshes
Definition: Model.h:29
const CRConnectivity & getCellCells() const
Definition: Mesh.cpp:480
Definition: Model.h:13
const StorageSite & getCells() const
Definition: Mesh.h:109
void advance(const int niter)
void applyInterfaceBC(const int f) const
Definition: GenericBCS.h:325
#define logDtor()
Definition: RLogInterface.h:33
FractureBCMap & getBCMap()
string bcType
Definition: FractureBC.h:18
int getCountLevel1() const
Definition: StorageSite.h:72
Array< Gradient< T > > TGradArray
const CRConnectivity & getFaceCells(const StorageSite &site) const
Definition: Mesh.cpp:388
Definition: Array.h:14
void addMatrix(const Index &rowI, const Index &colI, shared_ptr< Matrix > m)
FractureVCMap & getVCMap()
std::map< int, FractureVC< T > * > FractureVCMap
Definition: FractureModel.h:24
FractureModelOptions< T > & getOptions()
int getCount() const
Definition: StorageSite.h:39
MultiField & getB()
Definition: LinearSystem.h:33
void initLinearization(LinearSystem &ls)
virtual void init()
shared_ptr< MultiFieldReduction > MFRPtr
void addArray(const ArrayIndex &aIndex, shared_ptr< ArrayBase > a)
Definition: MultiField.cpp:270
CRMatrix< T, T, T > T_Matrix
const FaceGroupList & getInterfaceGroups() const
Definition: Mesh.h:190
MultiField & getX()
Definition: LinearSystem.h:32
FractureBC< T > & getBC(const int id)
FractureBC< T > & getBC(const int id)
void advance(const int niter)
int getID() const
Definition: Mesh.h:106
virtual void linearize(DiscrList &discretizations, const MeshList &meshes, MultiFieldMatrix &matrix, MultiField &x, MultiField &b)
Definition: Linearizer.cpp:17
MultiFieldMatrix & getMatrix()
Definition: LinearSystem.h:37
vector< Mesh * > MeshList
Definition: Mesh.h:439
StorageSite site
Definition: Mesh.h:40
SquareTensor< T, 3 > DiagTensorT3