Memosa-FVM  0.2
VacancyModel< T >::Impl Class Reference

#include <VacancyModel_impl.h>

Collaboration diagram for VacancyModel< T >::Impl:

Public Types

typedef Array< T > TArray
 
typedef Vector< T, 3 > VectorT3
 
typedef Array< VectorT3VectorT3Array
 
typedef Gradient< T > TGradType
 
typedef Array< Gradient< T > > TGradArray
 
typedef CRMatrix< T, T, T > T_Matrix
 
typedef Array< Gradient
< VectorT3 > > 
VGradArray
 

Public Member Functions

 Impl (const GeomFields &geomFields, VacancyFields &vacancyFields, const MeshList &meshes)
 
void init ()
 
VacancyBCMapgetBCMap ()
 
VacancyVCMapgetVCMap ()
 
VacancyBC< T > & getBC (const int id)
 
VacancyModelOptions< T > & getOptions ()
 
void initLinearization (LinearSystem &ls)
 
void linearize (LinearSystem &ls)
 
getVacaFluxIntegral (const Mesh &mesh, const int faceGroupId)
 
void advance (const int niter)
 
void printBCs ()
 
void updateTime ()
 
void dumpMatrix (const string fileBase)
 
void computeIBFaceConcentration (const StorageSite &particles)
 
void computePlasticStrainRate ()
 

Private Attributes

const MeshList _meshes
 
const GeomFields_geomFields
 
VacancyFields_vacancyFields
 
VacancyBCMap _bcMap
 
VacancyVCMap _vcMap
 
VacancyModelOptions< T > _options
 
GradientModel< T > _concentrationGradientModel
 
GradientModel< VectorT3_fluxGradientModel
 
MFRPtr _initialNorm
 
int _niters
 

Detailed Description

template<class T>
class VacancyModel< T >::Impl

Definition at line 31 of file VacancyModel_impl.h.

Member Typedef Documentation

template<class T>
typedef CRMatrix<T,T,T> VacancyModel< T >::Impl::T_Matrix

Definition at line 39 of file VacancyModel_impl.h.

template<class T>
typedef Array<T> VacancyModel< T >::Impl::TArray

Definition at line 34 of file VacancyModel_impl.h.

template<class T>
typedef Array<Gradient<T> > VacancyModel< T >::Impl::TGradArray

Definition at line 38 of file VacancyModel_impl.h.

template<class T>
typedef Gradient<T> VacancyModel< T >::Impl::TGradType

Definition at line 37 of file VacancyModel_impl.h.

template<class T>
typedef Vector<T,3> VacancyModel< T >::Impl::VectorT3

Definition at line 35 of file VacancyModel_impl.h.

template<class T>
typedef Array<VectorT3> VacancyModel< T >::Impl::VectorT3Array

Definition at line 36 of file VacancyModel_impl.h.

template<class T>
typedef Array<Gradient<VectorT3> > VacancyModel< T >::Impl::VGradArray

Definition at line 40 of file VacancyModel_impl.h.

Constructor & Destructor Documentation

template<class T>
VacancyModel< T >::Impl::Impl ( const GeomFields geomFields,
VacancyFields vacancyFields,
const MeshList meshes 
)
inline

Definition at line 42 of file VacancyModel_impl.h.

References Model::_meshes, VacancyBC< T >::bcType, Mesh::getBoundaryFaceGroups(), Mesh::getID(), FaceGroup::groupType, FaceGroup::id, and VacancyVC< T >::vcType.

44  :
45  _meshes(meshes),
46  _geomFields(geomFields),
47  _vacancyFields(vacancyFields),
53  _initialNorm(),
54  _niters(0)
55  {
56  const int numMeshes = _meshes.size();
57  for (int n=0; n<numMeshes; n++)
58  {
59  const Mesh& mesh = *_meshes[n];
60  VacancyVC<T> *vc(new VacancyVC<T>());
61  vc->vcType = "flow";
62  _vcMap[mesh.getID()] = vc;
63 
64  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
65  {
66  const FaceGroup& fg = *fgPtr;
67  VacancyBC<T> *bc(new VacancyBC<T>());
68 
69  _bcMap[fg.id] = bc;
70 
71  if ((fg.groupType == "wall") ||
72  (fg.groupType == "symmetry"))
73  {
74  bc->bcType = "SpecifiedVacaFlux";
75  }
76  else if ((fg.groupType == "velocity-inlet") ||
77  (fg.groupType == "pressure-outlet"))
78  {
79  bc->bcType = "SpecifiedConcentration";
80  }
81  else
82  throw CException("VacancyModel: unknown face group type "
83  + fg.groupType);
84  }
85  }
86  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
Definition: Mesh.h:28
Definition: Mesh.h:49
Field plasticStrain
Definition: VacancyFields.h:19
const GeomFields & _geomFields
Field concentration
Definition: VacancyFields.h:16
string groupType
Definition: Mesh.h:42
GradientModel< VectorT3 > _fluxGradientModel
const int id
Definition: Mesh.h:41
Field concentrationGradient
Definition: VacancyFields.h:22
VacancyFields & _vacancyFields
GradientModel< T > _concentrationGradientModel
const MeshList _meshes
Field concentrationGradientVector
Definition: VacancyFields.h:23
int getID() const
Definition: Mesh.h:106

Member Function Documentation

template<class T>
void VacancyModel< T >::Impl::advance ( const int  niter)
inline

Definition at line 424 of file VacancyModel_impl.h.

References LinearSystem::initAssembly(), LinearSystem::initSolve(), LinearSystem::postSolve(), and LinearSystem::updateSolution().

425  {
426  for(int n=0; n<niter; n++)
427  {
428  LinearSystem ls;
429  initLinearization(ls);
430 
431  ls.initAssembly();
432 
433  linearize(ls);
434 
435  ls.initSolve();
436 
437  MFRPtr rNorm(_options.getLinearSolver().solve(ls));
438 
439  if (!_initialNorm) _initialNorm = rNorm;
440 
441  MFRPtr normRatio((*rNorm)/(*_initialNorm));
442 
443  cout << _niters << ": " << *rNorm << endl;
444 
445 
446  _options.getLinearSolver().cleanup();
447 
448  ls.postSolve();
449  ls.updateSolution();
450 
451  _niters++;
452  if (*rNorm < _options.absoluteTolerance ||
453  *normRatio < _options.relativeTolerance)
454  break;
455  }
456  }
void linearize(LinearSystem &ls)
void initAssembly()
void initLinearization(LinearSystem &ls)
void updateSolution()
void initSolve()
VacancyModelOptions< T > _options
shared_ptr< MultiFieldReduction > MFRPtr
template<class T>
void VacancyModel< T >::Impl::computeIBFaceConcentration ( const StorageSite particles)
inline

Definition at line 575 of file VacancyModel_impl.h.

References Model::_meshes, Mesh::getCells(), StorageSite::getCount(), Mesh::getIBFaces(), Mesh::isShell(), and Array< T >::zero().

576  {
577  typedef CRMatrixTranspose<T,T,T> IMatrix;
578 
579  const TArray& pT =
580  dynamic_cast<const TArray&>(_vacancyFields.concentration[particles]);
581 
582  const int numMeshes = _meshes.size();
583  for (int n=0; n<numMeshes; n++)
584  {
585  const Mesh& mesh = *_meshes[n];
586  if (!mesh.isShell() && mesh.getIBFaces().getCount() > 0){
587  const StorageSite& cells = mesh.getCells();
588  const StorageSite& ibFaces = mesh.getIBFaces();
589 
590  GeomFields::SSPair key1(&ibFaces,&cells);
591  const IMatrix& mIC =
592  dynamic_cast<const IMatrix&>
594 
595  GeomFields::SSPair key2(&ibFaces,&particles);
596  const IMatrix& mIP =
597  dynamic_cast<const IMatrix&>
599 
600  shared_ptr<TArray> ibT(new TArray(ibFaces.getCount()));
601 
602  const TArray& cT =
603  dynamic_cast<const TArray&>(_vacancyFields.concentration[cells]);
604 
605 
606  ibT->zero();
607 
608  mIC.multiplyAndAdd(*ibT,cT);
609  mIP.multiplyAndAdd(*ibT,pT);
611  }
612  }
613 
614  }
const StorageSite & getIBFaces() const
Definition: Mesh.h:111
Definition: Mesh.h:49
const GeomFields & _geomFields
Field concentration
Definition: VacancyFields.h:16
map< SSPair, shared_ptr< Matrix > > _interpolationMatrices
Definition: GeomFields.h:50
VacancyFields & _vacancyFields
const StorageSite & getCells() const
Definition: Mesh.h:109
void addArray(const StorageSite &, shared_ptr< ArrayBase > a)
Definition: Field.cpp:72
const MeshList _meshes
bool isShell() const
Definition: Mesh.h:323
int getCount() const
Definition: StorageSite.h:39
pair< const StorageSite *, const StorageSite * > SSPair
Definition: GeomFields.h:48
template<class T>
void VacancyModel< T >::Impl::computePlasticStrainRate ( )
inline

Definition at line 619 of file VacancyModel_impl.h.

References Model::_meshes, Mesh::getCells(), and StorageSite::getCountLevel1().

620  {
621  const int numMeshes = _meshes.size();
622 
624 
625  for (int n=0; n<numMeshes; n++)
626  {
627  const Mesh& mesh = *_meshes[n];
628  const StorageSite& cells = mesh.getCells();
629  const int nCells = cells.getCountLevel1();
630  VectorT3Array& cGradVector = dynamic_cast<VectorT3Array&> (_vacancyFields.concentrationGradientVector[cells]);
631  const TGradArray& cGrad = dynamic_cast<const TGradArray&> (_vacancyFields.concentrationGradient[cells]);
632  for (int c=0; c<nCells; c++)
633  {
634  for (int k=0; k<3; k++)
635  cGradVector[c][k] = cGrad[c][k];
636  }
637  }
638 
639  _fluxGradientModel.compute();
640 
641 
642  for (int n=0; n<numMeshes; n++)
643  {
644  const Mesh& mesh = *_meshes[n];
645  const StorageSite& cells = mesh.getCells();
646  const int nCells = cells.getCountLevel1();
647  VGradArray& plasticStrainCell = dynamic_cast<VGradArray&>(_vacancyFields.plasticStrain[cells]);
648  const TArray& diffCoeff = dynamic_cast<const TArray&> (_vacancyFields.diffusioncoefficient[cells]);
649  for(int c=0; c<nCells; c++)
650  {
651  Gradient<VectorT3>& ps = plasticStrainCell[c];
652 
653  const T df(diffCoeff[c]);
654  Gradient<VectorT3> psTemp;
655  for (int i=0;i<3;i++)
656  for(int j=0;j<3;j++)
657  psTemp[i][j] = 0.5 * df * (ps[i][j]+ps[j][i]);
658  ps = psTemp;
659  }
660  }
661  }
Array< Gradient< T > > TGradArray
Definition: Mesh.h:49
Field plasticStrain
Definition: VacancyFields.h:19
Array< Gradient< VectorT3 > > VGradArray
Field diffusioncoefficient
Definition: VacancyFields.h:24
GradientModel< VectorT3 > _fluxGradientModel
Field concentrationGradient
Definition: VacancyFields.h:22
VacancyFields & _vacancyFields
const StorageSite & getCells() const
Definition: Mesh.h:109
int getCountLevel1() const
Definition: StorageSite.h:72
GradientModel< T > _concentrationGradientModel
const MeshList _meshes
Field concentrationGradientVector
Definition: VacancyFields.h:23
template<class T>
void VacancyModel< T >::Impl::dumpMatrix ( const string  fileBase)
inline

Definition at line 499 of file VacancyModel_impl.h.

References Model::_meshes, LinearSystem::getB(), Mesh::getCells(), CRConnectivity::getCol(), CRMatrix< T_Diag, T_OffDiag, X >::getConnectivity(), CRMatrix< T_Diag, T_OffDiag, X >::getDiag(), LinearSystem::getMatrix(), MultiFieldMatrix::getMatrix(), CRMatrix< T_Diag, T_OffDiag, X >::getOffDiag(), CRConnectivity::getRow(), StorageSite::getSelfCount(), LinearSystem::initAssembly(), and LinearSystem::initSolve().

500  {
501  LinearSystem ls;
502  initLinearization(ls);
503 
504  ls.initAssembly();
505 
506  linearize(ls);
507 
508  ls.initSolve();
509 
510  MultiFieldMatrix& matrix = ls.getMatrix();
511  MultiField& b = ls.getB();
512 for ( unsigned int id = 0; id < _meshes.size(); id++ ){
513  const Mesh& mesh = *_meshes[id];
514  const StorageSite& cells = mesh.getCells();
515 
517 
518  T_Matrix& tMatrix =
519  dynamic_cast<T_Matrix&>(matrix.getMatrix(tIndex,tIndex));
520 
521  TArray& tDiag = tMatrix.getDiag();
522  TArray& tCoeff = tMatrix.getOffDiag();
523 
524  TArray& rCell = dynamic_cast<TArray&>(b[tIndex]);
525 
526  const CRConnectivity& cr = tMatrix.getConnectivity();
527 
528  const Array<int>& row = cr.getRow();
529  const Array<int>& col = cr.getCol();
530 
531  const int nCells = cells.getSelfCount();
532  int nCoeffs = nCells;
533 
534  for(int i=0; i<nCells; i++)
535  for(int jp=row[i]; jp<row[i+1]; jp++)
536  {
537  const int j = col[jp];
538  if (j<nCells) nCoeffs++;
539  }
540  stringstream ss;
541  ss << id;
542  string matFileName = fileBase + "_mesh" + ss.str() + ".mat";
543 
544 
545  FILE *matFile = fopen(matFileName.c_str(),"wb");
546 
547  fprintf(matFile,"%%%%MatrixMarket matrix coordinate real general\n");
548  fprintf(matFile,"%d %d %d\n", nCells,nCells,nCoeffs);
549 
550  for(int i=0; i<nCells; i++)
551  {
552  fprintf(matFile,"%d %d %lf\n", i+1, i+1, tDiag[i]);
553  for(int jp=row[i]; jp<row[i+1]; jp++)
554  {
555  const int j = col[jp];
556  if (j<nCells)
557  fprintf(matFile,"%d %d %lf\n", i+1, j+1, tCoeff[jp]);
558  }
559  }
560 
561  fclose(matFile);
562 
563  string rhsFileName = fileBase + ".rhs";
564  FILE *rhsFile = fopen(rhsFileName.c_str(),"wb");
565 
566  for(int i=0; i<nCells; i++)
567  fprintf(rhsFile,"%lf\n",-rCell[i]);
568 
569  fclose(rhsFile);
570 
571  }
572 }
void linearize(LinearSystem &ls)
const Array< int > & getCol() const
const Array< int > & getRow() const
void initAssembly()
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
int getSelfCount() const
Definition: StorageSite.h:40
void initLinearization(LinearSystem &ls)
Definition: Mesh.h:49
CRMatrix< T, T, T > T_Matrix
Field concentration
Definition: VacancyFields.h:16
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
void initSolve()
VacancyFields & _vacancyFields
const StorageSite & getCells() const
Definition: Mesh.h:109
const MeshList _meshes
MultiField & getB()
Definition: LinearSystem.h:33
MultiFieldMatrix & getMatrix()
Definition: LinearSystem.h:37
template<class T>
VacancyBC<T>& VacancyModel< T >::Impl::getBC ( const int  id)
inline

Definition at line 193 of file VacancyModel_impl.h.

193 {return *_bcMap[id];}
template<class T>
VacancyBCMap& VacancyModel< T >::Impl::getBCMap ( )
inline

Definition at line 190 of file VacancyModel_impl.h.

190 {return _bcMap;}
template<class T>
VacancyModelOptions<T>& VacancyModel< T >::Impl::getOptions ( )
inline

Definition at line 195 of file VacancyModel_impl.h.

195 {return _options;}
VacancyModelOptions< T > _options
template<class T>
T VacancyModel< T >::Impl::getVacaFluxIntegral ( const Mesh mesh,
const int  faceGroupId 
)
inline

Definition at line 400 of file VacancyModel_impl.h.

References Mesh::getBoundaryFaceGroups(), StorageSite::getCount(), FaceGroup::id, and FaceGroup::site.

401  {
402  T r(0.);
403  bool found = false;
404  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
405  {
406  const FaceGroup& fg = *fgPtr;
407  if (fg.id == faceGroupId)
408  {
409  const StorageSite& faces = fg.site;
410  const int nFaces = faces.getCount();
411  const TArray& vacaFlux =
412  dynamic_cast<const TArray&>(_vacancyFields.vacaFlux[faces]);
413  for(int f=0; f<nFaces; f++)
414  r += vacaFlux[f];
415  found=true;
416  }
417  }
418  if (!found)
419  throw CException("getVacaFluxIntegral: invalid faceGroupID");
420  return r;
421  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
Definition: Mesh.h:28
const int id
Definition: Mesh.h:41
VacancyFields & _vacancyFields
int getCount() const
Definition: StorageSite.h:39
StorageSite site
Definition: Mesh.h:40
template<class T>
VacancyVCMap& VacancyModel< T >::Impl::getVCMap ( )
inline

Definition at line 191 of file VacancyModel_impl.h.

191 {return _vcMap;}
template<class T>
void VacancyModel< T >::Impl::init ( )
inline

Definition at line 88 of file VacancyModel_impl.h.

References Model::_meshes, Mesh::getBoundaryFaceGroups(), Mesh::getCells(), StorageSite::getCount(), StorageSite::getCountLevel1(), Mesh::getFaces(), Mesh::getID(), Mesh::getInterfaceGroups(), and FaceGroup::site.

89  {
90  const int numMeshes = _meshes.size();
91  for (int n=0; n<numMeshes; n++)
92  {
93  const Mesh& mesh = *_meshes[n];
94 
95  const StorageSite& cells = mesh.getCells();
96  const VacancyVC<T>& vc = *_vcMap[mesh.getID()];
97 
98  //concentration
99  shared_ptr<TArray> tCell(new TArray(cells.getCountLevel1()));
100  *tCell = _options["initialConcentration"];
102 
103  if(_options.transient)
104  {
105  _vacancyFields.concentrationN1.addArray(cells, dynamic_pointer_cast<ArrayBase>(tCell->newCopy()));
106  if (_options.timeDiscretizationOrder > 1)
107  _vacancyFields.concentrationN2.addArray(cells, dynamic_pointer_cast<ArrayBase>(tCell->newCopy()));
108  }
109 
110  //diffusioncoefficient
111  shared_ptr<TArray> condCell(new TArray(cells.getCountLevel1()));
112  *condCell = vc["vacancyDiffusioncoefficient"];
114 
115  //source
116  shared_ptr<TArray> sCell(new TArray(cells.getCountLevel1()));
117  *sCell = T(0.);
118  _vacancyFields.source.addArray(cells,sCell);
119 
120  //create a zero field
121  shared_ptr<TArray> zeroCell(new TArray(cells.getCountLevel1()));
122  *zeroCell = T(0.0);
123  _vacancyFields.zero.addArray(cells,zeroCell);
124 
125  //create a one field
126  shared_ptr<TArray> oneCell(new TArray(cells.getCountLevel1()));
127  *oneCell = T(1.0);
128  _vacancyFields.one.addArray(cells,oneCell);
129 
130  //create specific vaca field rho*Cp
131  shared_ptr<TArray> cp(new TArray(cells.getCount()));
132  *cp = vc["density"] * vc["specificVaca"];
134 
135  //initial temparature gradient array
136  shared_ptr<TGradArray> gradT(new TGradArray(cells.getCountLevel1()));
137  gradT->zero();
139 
140 
141  shared_ptr<VectorT3Array> vGrad(new VectorT3Array(cells.getCountLevel1()));
142  vGrad->zero();
144 
145 
146 
147  shared_ptr<VGradArray> plasticStrainField(new VGradArray(cells.getCountLevel1()));
148  plasticStrainField->zero();
149  _vacancyFields.plasticStrain.addArray(cells,plasticStrainField);
150 
151 
152  //inital convection flux at faces
153 
154  const StorageSite& allFaces = mesh.getFaces();
155  shared_ptr<TArray> convFlux(new TArray(allFaces.getCount()));
156  convFlux->zero();
157  _vacancyFields.convectionFlux.addArray(allFaces,convFlux);
158 
159  //vaca flux at faces
160  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
161  {
162  const FaceGroup& fg = *fgPtr;
163  const StorageSite& faces = fg.site;
164 
165  shared_ptr<TArray> fluxFace(new TArray(faces.getCount()));
166 
167  fluxFace->zero();
168  _vacancyFields.vacaFlux.addArray(faces,fluxFace);
169 
170  }
171  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
172  {
173  const FaceGroup& fg = *fgPtr;
174  const StorageSite& faces = fg.site;
175 
176  shared_ptr<TArray> fluxFace(new TArray(faces.getCount()));
177 
178  fluxFace->zero();
179  _vacancyFields.vacaFlux.addArray(faces,fluxFace);
180 
181  }
182 
183 
184  }
186  _niters =0;
187  _initialNorm = MFRPtr();
188  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
Array< Gradient< T > > TGradArray
Definition: Mesh.h:28
Field convectionFlux
Definition: VacancyFields.h:26
Definition: Mesh.h:49
Field plasticStrain
Definition: VacancyFields.h:19
Array< Gradient< VectorT3 > > VGradArray
Field diffusioncoefficient
Definition: VacancyFields.h:24
Field concentration
Definition: VacancyFields.h:16
Field concentrationN1
Definition: VacancyFields.h:17
Array< VectorT3 > VectorT3Array
Field concentrationGradient
Definition: VacancyFields.h:22
const StorageSite & getFaces() const
Definition: Mesh.h:108
VacancyFields & _vacancyFields
const StorageSite & getCells() const
Definition: Mesh.h:109
int getCountLevel1() const
Definition: StorageSite.h:72
void addArray(const StorageSite &, shared_ptr< ArrayBase > a)
Definition: Field.cpp:72
const MeshList _meshes
Field concentrationGradientVector
Definition: VacancyFields.h:23
int getCount() const
Definition: StorageSite.h:39
Field specificVaca
Definition: VacancyFields.h:20
Field concentrationN2
Definition: VacancyFields.h:18
VacancyModelOptions< T > _options
shared_ptr< MultiFieldReduction > MFRPtr
const FaceGroupList & getInterfaceGroups() const
Definition: Mesh.h:190
void syncLocal()
Definition: Field.cpp:334
int getID() const
Definition: Mesh.h:106
StorageSite site
Definition: Mesh.h:40
template<class T>
void VacancyModel< T >::Impl::initLinearization ( LinearSystem ls)
inline

Definition at line 197 of file VacancyModel_impl.h.

References Model::_meshes, MultiField::addArray(), MultiFieldMatrix::addMatrix(), Mesh::getBoundaryFaceGroups(), Mesh::getCellCells(), Mesh::getCells(), StorageSite::getCount(), Mesh::getFaceCells(), Mesh::getInterfaceGroups(), LinearSystem::getMatrix(), LinearSystem::getX(), and FaceGroup::site.

198  {
199  const int numMeshes = _meshes.size();
200  for (int n=0; n<numMeshes; n++)
201  {
202  const Mesh& mesh = *_meshes[n];
203 
204  const StorageSite& cells = mesh.getCells();
206 
208 
209  const CRConnectivity& cellCells = mesh.getCellCells();
210 
211  shared_ptr<Matrix> m(new CRMatrix<T,T,T>(cellCells));
212 
213  ls.getMatrix().addMatrix(tIndex,tIndex,m);
214 
215  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
216  {
217  const FaceGroup& fg = *fgPtr;
218  const StorageSite& faces = fg.site;
219 
221  ls.getX().addArray(fIndex,_vacancyFields.vacaFlux.getArrayPtr(faces));
222 
223  const CRConnectivity& faceCells = mesh.getFaceCells(faces);
224 
225  shared_ptr<Matrix> mft(new FluxJacobianMatrix<T,T>(faceCells));
226  ls.getMatrix().addMatrix(fIndex,tIndex,mft);
227 
228  shared_ptr<Matrix> mff(new DiagonalMatrix<T,T>(faces.getCount()));
229  ls.getMatrix().addMatrix(fIndex,fIndex,mff);
230  }
231 
232  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
233  {
234  const FaceGroup& fg = *fgPtr;
235  const StorageSite& faces = fg.site;
236 
238  ls.getX().addArray(fIndex,_vacancyFields.vacaFlux.getArrayPtr(faces));
239 
240  const CRConnectivity& faceCells = mesh.getFaceCells(faces);
241 
242  shared_ptr<Matrix> mft(new FluxJacobianMatrix<T,T>(faceCells));
243  ls.getMatrix().addMatrix(fIndex,tIndex,mft);
244 
245  shared_ptr<Matrix> mff(new DiagonalMatrix<T,T>(faces.getCount()));
246  ls.getMatrix().addMatrix(fIndex,fIndex,mff);
247  }
248 
249  }
250  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
Definition: Mesh.h:28
Definition: Mesh.h:49
Field concentration
Definition: VacancyFields.h:16
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
const CRConnectivity & getCellCells() const
Definition: Mesh.cpp:480
VacancyFields & _vacancyFields
const StorageSite & getCells() const
Definition: Mesh.h:109
const CRConnectivity & getFaceCells(const StorageSite &site) const
Definition: Mesh.cpp:388
const MeshList _meshes
void addMatrix(const Index &rowI, const Index &colI, shared_ptr< Matrix > m)
int getCount() const
Definition: StorageSite.h:39
void addArray(const ArrayIndex &aIndex, shared_ptr< ArrayBase > a)
Definition: MultiField.cpp:270
const FaceGroupList & getInterfaceGroups() const
Definition: Mesh.h:190
MultiField & getX()
Definition: LinearSystem.h:32
shared_ptr< ArrayBase > getArrayPtr(const StorageSite &)
Definition: Field.cpp:63
MultiFieldMatrix & getMatrix()
Definition: LinearSystem.h:37
StorageSite site
Definition: Mesh.h:40
template<class T>
void VacancyModel< T >::Impl::linearize ( LinearSystem ls)
inline

Definition at line 252 of file VacancyModel_impl.h.

References Model::_meshes, BaseGenericBCS< X, Diag, OffDiag >::applyInterfaceBC(), VacancyBC< T >::bcType, LinearSystem::getB(), Mesh::getBoundaryFaceGroups(), StorageSite::getCount(), Mesh::getInterfaceGroups(), LinearSystem::getMatrix(), FloatVarDict< T >::getVal(), LinearSystem::getX(), FaceGroup::id, Linearizer::linearize(), and FaceGroup::site.

253  {
255 
256 
257  DiscrList discretizations;
258 
259  shared_ptr<Discretization>
265  discretizations.push_back(dd);
266 
267  shared_ptr<Discretization>
274  _options.useCentralDifference));
275  discretizations.push_back(cd);
276 
277 
278  shared_ptr<Discretization>
280  (_meshes,
281  _geomFields,
284  discretizations.push_back(sd);
285 
286  if (_options.transient)
287  {
288  shared_ptr<Discretization>
290  (_meshes, _geomFields,
295  _options["timeStep"]));
296  discretizations.push_back(td);
297  }
298 
299  shared_ptr<Discretization>
302 
303  discretizations.push_back(ibm);
304 
305 
306  Linearizer linearizer;
307 
308  linearizer.linearize(discretizations,_meshes,ls.getMatrix(),
309  ls.getX(), ls.getB());
310 
311  const int numMeshes = _meshes.size();
312  for (int n=0; n<numMeshes; n++)
313  {
314  const Mesh& mesh = *_meshes[n];
315 
316  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
317  {
318  const FaceGroup& fg = *fgPtr;
319  const StorageSite& faces = fg.site;
320 
321  const VacancyBC<T>& bc = *_bcMap[fg.id];
322 
323 
324  GenericBCS<T,T,T> gbc(faces,mesh,
325  _geomFields,
328  ls.getMatrix(), ls.getX(), ls.getB());
329 
330  if (bc.bcType == "SpecifiedConcentration")
331  {
333  bT(bc.getVal("specifiedConcentration"),faces);
335  {
336  const TArray& convectingFlux =
337  dynamic_cast<const TArray&>
339  const int nFaces = faces.getCount();
340 
341  for(int f=0; f<nFaces; f++)
342  {
343  if (convectingFlux[f] > 0.)
344  {
345  gbc.applyExtrapolationBC(f);
346  }
347  else
348  {
349  gbc.applyDirichletBC(f,bT[f]);
350  }
351  }
352  }
353  else
354  gbc.applyDirichletBC(bT);
355  }
356  else if (bc.bcType == "SpecifiedVacaFlux")
357  {
359  bVacaFlux(bc.getVal("specifiedVacaFlux"),faces);
360 
361  const int nFaces = faces.getCount();
362 
363  for(int f=0; f<nFaces; f++)
364  {
365  gbc.applyNeumannBC(f, bVacaFlux[f]);
366  }
367  }
368  else if (bc.bcType == "Symmetry")
369  {
370  T zeroFlux(NumTypeTraits<T>::getZero());
371  gbc.applyNeumannBC(zeroFlux);
372  }
373  else if (bc.bcType == "Convective")
374  {
375  FloatValEvaluator<T> hCoeff(bc.getVal("convectiveCoefficient"), faces);
376  FloatValEvaluator<T> Xinf(bc.getVal("farFieldConcentration"), faces);
377  const int nFaces = faces.getCount();
378  for(int f=0; f<nFaces; f++)
379  gbc.applyConvectionBC(f, hCoeff[f], Xinf[f]);
380  }
381  else
382  throw CException(bc.bcType + " not implemented for VacancyModel");
383  }
384 
385  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
386  {
387  const FaceGroup& fg = *fgPtr;
388  const StorageSite& faces = fg.site;
389  GenericBCS<T,T,T> gbc(faces,mesh,
390  _geomFields,
393  ls.getMatrix(), ls.getX(), ls.getB());
394 
395  gbc.applyInterfaceBC();
396  }
397  }
398  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
bool hasArray(const StorageSite &s) const
Definition: Field.cpp:37
Definition: Mesh.h:28
Field convectionFlux
Definition: VacancyFields.h:26
Definition: Mesh.h:49
string bcType
Definition: VacancyBC.h:18
const GeomFields & _geomFields
Field diffusioncoefficient
Definition: VacancyFields.h:24
Field concentration
Definition: VacancyFields.h:16
FloatVal< T > getVal(const string varName) const
Definition: FloatVarDict.h:85
const int id
Definition: Mesh.h:41
Field concentrationN1
Definition: VacancyFields.h:17
vector< shared_ptr< Discretization > > DiscrList
Field concentrationGradient
Definition: VacancyFields.h:22
VacancyFields & _vacancyFields
void applyInterfaceBC(const int f) const
Definition: GenericBCS.h:325
GradientModel< T > _concentrationGradientModel
const MeshList _meshes
int getCount() const
Definition: StorageSite.h:39
Field specificVaca
Definition: VacancyFields.h:20
Field concentrationN2
Definition: VacancyFields.h:18
MultiField & getB()
Definition: LinearSystem.h:33
VacancyModelOptions< T > _options
const FaceGroupList & getInterfaceGroups() const
Definition: Mesh.h:190
MultiField & getX()
Definition: LinearSystem.h:32
virtual void linearize(DiscrList &discretizations, const MeshList &meshes, MultiFieldMatrix &matrix, MultiField &x, MultiField &b)
Definition: Linearizer.cpp:17
MultiFieldMatrix & getMatrix()
Definition: LinearSystem.h:37
StorageSite site
Definition: Mesh.h:40
template<class T>
void VacancyModel< T >::Impl::printBCs ( )
inline

Definition at line 458 of file VacancyModel_impl.h.

459  {
460  foreach(typename VacancyBCMap::value_type& pos, _bcMap)
461  {
462  cout << "Face Group " << pos.first << ":" << endl;
463  cout << " bc type " << pos.second->bcType << endl;
464  foreach(typename VacancyBC<T>::value_type& vp, *pos.second)
465  {
466  cout << " " << vp.first << " " << vp.second.constant << endl;
467  }
468  }
469  }
template<class T>
void VacancyModel< T >::Impl::updateTime ( )
inline

Definition at line 472 of file VacancyModel_impl.h.

References Model::_meshes, Mesh::getCells(), and StorageSite::getCountLevel1().

473  {
474  const int numMeshes = _meshes.size();
475  for (int n=0; n<numMeshes; n++) {
476 
477  const Mesh& mesh = *_meshes[n];
478  const StorageSite& cells = mesh.getCells();
479  const int nCells = cells.getCountLevel1();
480 
481  TArray& concentration =
482  dynamic_cast<TArray&>(_vacancyFields.concentration[cells]);
483  TArray& concentrationN1 =
484  dynamic_cast<TArray&>(_vacancyFields.concentrationN1[cells]);
485 
486  if (_options.timeDiscretizationOrder > 1)
487  {
488  TArray& concentrationN2 =
489  dynamic_cast<TArray&>(_vacancyFields.concentrationN2[cells]);
490  concentrationN2 = concentrationN1;
491  }
492  concentrationN1 = concentration;
493  }
494  }
Definition: Mesh.h:49
Field concentration
Definition: VacancyFields.h:16
Field concentrationN1
Definition: VacancyFields.h:17
VacancyFields & _vacancyFields
const StorageSite & getCells() const
Definition: Mesh.h:109
int getCountLevel1() const
Definition: StorageSite.h:72
const MeshList _meshes
Field concentrationN2
Definition: VacancyFields.h:18
VacancyModelOptions< T > _options

Member Data Documentation

template<class T>
VacancyBCMap VacancyModel< T >::Impl::_bcMap
private

Definition at line 672 of file VacancyModel_impl.h.

template<class T>
GradientModel<T> VacancyModel< T >::Impl::_concentrationGradientModel
private

Definition at line 675 of file VacancyModel_impl.h.

template<class T>
GradientModel<VectorT3> VacancyModel< T >::Impl::_fluxGradientModel
private

Definition at line 676 of file VacancyModel_impl.h.

template<class T>
const GeomFields& VacancyModel< T >::Impl::_geomFields
private

Definition at line 669 of file VacancyModel_impl.h.

template<class T>
MFRPtr VacancyModel< T >::Impl::_initialNorm
private

Definition at line 678 of file VacancyModel_impl.h.

template<class T>
const MeshList VacancyModel< T >::Impl::_meshes
private

Definition at line 668 of file VacancyModel_impl.h.

template<class T>
int VacancyModel< T >::Impl::_niters
private

Definition at line 679 of file VacancyModel_impl.h.

template<class T>
VacancyModelOptions<T> VacancyModel< T >::Impl::_options
private

Definition at line 674 of file VacancyModel_impl.h.

template<class T>
VacancyFields& VacancyModel< T >::Impl::_vacancyFields
private

Definition at line 670 of file VacancyModel_impl.h.

template<class T>
VacancyVCMap VacancyModel< T >::Impl::_vcMap
private

Definition at line 673 of file VacancyModel_impl.h.


The documentation for this class was generated from the following file: