47 _geomFields(geomFields),
48 _fractureFields(fractureFields),
49 _phasefieldGradientModel(
_meshes,_fractureFields.phasefieldvalue,
50 _fractureFields.phasefieldGradient,_geomFields),
54 const int numMeshes =
_meshes.size();
55 for (
int n=0; n<numMeshes; n++)
60 _vcMap[mesh.
getID()] = vc;
72 bc->
bcType =
"SpecifiedPhaseFieldFlux";
74 else if ((fg.
groupType ==
"velocity-inlet") ||
77 bc->
bcType =
"SpecifiedPhaseFieldValue";
80 throw CException(
"FractureModel: unknown face group type "
88 const int numMeshes =
_meshes.size();
89 for (
int n=0; n<numMeshes; n++)
98 *tCell = _options[
"initialPhaseFieldValue"];
99 _fractureFields.phasefieldvalue.addArray(cells,tCell);
101 if(_options.transient)
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()));
110 *condCell = vc[
"fractureConductivity"];
111 _fractureFields.conductivity.addArray(cells,condCell);
115 *sCell = vc[
"fractureSource"];
117 _fractureFields.source.addArray(cells,sCell);
121 *scoefCell = vc[
"fractureSourceCoef"];
123 _fractureFields.sourcecoef.addArray(cells,scoefCell);
128 _fractureFields.zero.addArray(cells,zeroCell);
133 _fractureFields.one.addArray(cells,oneCell);
143 _fractureFields.phasefieldGradient.addArray(cells,gradT);
161 _fractureFields.phasefieldFlux.addArray(faces,fluxFace);
172 _fractureFields.phasefieldFlux.addArray(faces,fluxFace);
178 _fractureFields.conductivity.syncLocal();
192 const int numMeshes =
_meshes.size();
193 for (
int n=0; n<numMeshes; n++)
200 ls.
getX().
addArray(tIndex,_fractureFields.phasefieldvalue.getArrayPtr(cells));
214 ls.
getX().
addArray(fIndex,_fractureFields.phasefieldFlux.getArrayPtr(faces));
231 ls.
getX().
addArray(fIndex,_fractureFields.phasefieldFlux.getArrayPtr(faces));
247 _phasefieldGradientModel.compute();
251 shared_ptr<Discretization>
254 _fractureFields.phasefieldvalue,
255 _fractureFields.conductivity,
256 _fractureFields.phasefieldGradient));
257 discretizations.push_back(dd);
269 shared_ptr<Discretization>
273 _fractureFields.phasefieldvalue,
274 _fractureFields.source,
275 _fractureFields.sourcecoef));
276 discretizations.push_back(scfd);
278 if (_options.transient)
280 shared_ptr<Discretization>
283 _fractureFields.phasefieldvalue,
284 _fractureFields.phasefieldvalueN1,
285 _fractureFields.phasefieldvalueN2,
287 _options[
"timeStep"]));
288 discretizations.push_back(td);
302 const int numMeshes =
_meshes.size();
303 for (
int n=0; n<numMeshes; n++)
317 _fractureFields.phasefieldvalue,
318 _fractureFields.phasefieldFlux,
321 if (bc.
bcType ==
"SpecifiedPhaseFieldValue")
324 bT(bc.
getVal(
"specifiedPhaseFieldValue"),faces);
325 gbc.applyDirichletBC(bT);
327 else if (bc.
bcType ==
"SpecifiedPhaseFieldFlux")
330 bPhaseFieldFlux(bc.
getVal(
"specifiedPhaseFieldFlux"),faces);
332 const int nFaces = faces.
getCount();
334 for(
int f=0; f<nFaces; f++)
336 gbc.applyNeumannBC(f, bPhaseFieldFlux[f]);
339 else if (bc.
bcType ==
"Symmetry")
342 gbc.applyNeumannBC(zeroFlux);
354 _fractureFields.phasefieldvalue,
355 _fractureFields.phasefieldFlux,
389 for(
int n=0; n<niter; n++)
392 initLinearization(ls);
400 MFRPtr rNorm(_options.getLinearSolver().solve(ls));
402 if (!_initialNorm) _initialNorm = rNorm;
404 MFRPtr normRatio((*rNorm)/(*_initialNorm));
406 cout << _niters <<
": " << *rNorm << endl;
409 _options.getLinearSolver().cleanup();
415 if (*rNorm < _options.absoluteTolerance ||
416 *normRatio < _options.relativeTolerance)
423 foreach(
typename FractureBCMap::value_type& pos, _bcMap)
425 cout <<
"Face Group " << pos.first <<
":" << endl;
426 cout <<
" bc type " << pos.second->bcType << endl;
429 cout <<
" " << vp.first <<
" " << vp.second.constant << endl;
437 const int numMeshes =
_meshes.size();
438 for (
int n=0; n<numMeshes; n++) {
445 dynamic_cast<TArray&
>(_fractureFields.phasefieldvalue[cells]);
446 TArray& phasefieldvalueN1 =
447 dynamic_cast<TArray&
>(_fractureFields.phasefieldvalueN1[cells]);
449 if (_options.timeDiscretizationOrder > 1)
451 TArray& phasefieldvalueN2 =
452 dynamic_cast<TArray&
>(_fractureFields.phasefieldvalueN2[cells]);
453 phasefieldvalueN2 = phasefieldvalueN1;
455 phasefieldvalueN1 = phasefieldvalue;
598 _impl(new
Impl(geomFields,fractureFields,meshes))
645 _impl->advance(niter);
void linearize(LinearSystem &ls)
FractureModel(const GeomFields &geomFields, FractureFields &fractureFields, const MeshList &meshes)
const FaceGroupList & getBoundaryFaceGroups() const
Impl(const GeomFields &geomFields, FractureFields &fractureFields, const MeshList &meshes)
shared_ptr< FaceGroup > FaceGroupPtr
FractureFields & _fractureFields
FractureVCMap & getVCMap()
FractureBCMap & getBCMap()
std::map< int, FractureBC< T > * > FractureBCMap
FractureModelOptions< T > & getOptions()
const GeomFields & _geomFields
FractureModelOptions< T > _options
Array< VectorT3 > VectorT3Array
FloatVal< T > getVal(const string varName) const
GradientModel< T > _phasefieldGradientModel
pair< const Field *, const StorageSite * > ArrayIndex
vector< shared_ptr< Discretization > > DiscrList
const CRConnectivity & getCellCells() const
const StorageSite & getCells() const
void advance(const int niter)
void applyInterfaceBC(const int f) const
FractureBCMap & getBCMap()
int getCountLevel1() const
Array< Gradient< T > > TGradArray
const CRConnectivity & getFaceCells(const StorageSite &site) const
void addMatrix(const Index &rowI, const Index &colI, shared_ptr< Matrix > m)
FractureVCMap & getVCMap()
std::map< int, FractureVC< T > * > FractureVCMap
FractureModelOptions< T > & getOptions()
void initLinearization(LinearSystem &ls)
shared_ptr< MultiFieldReduction > MFRPtr
void addArray(const ArrayIndex &aIndex, shared_ptr< ArrayBase > a)
CRMatrix< T, T, T > T_Matrix
const FaceGroupList & getInterfaceGroups() const
FractureBC< T > & getBC(const int id)
FractureBC< T > & getBC(const int id)
void advance(const int niter)
virtual void linearize(DiscrList &discretizations, const MeshList &meshes, MultiFieldMatrix &matrix, MultiField &x, MultiField &b)
MultiFieldMatrix & getMatrix()
vector< Mesh * > MeshList
SquareTensor< T, 3 > DiagTensorT3