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

#include <SpeciesModel_impl.h>

Collaboration diagram for SpeciesModel< 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
 

Public Member Functions

 Impl (const GeomFields &geomFields, const MeshList &meshes, const int nSpecies)
 
void init ()
 
SpeciesFieldsgetSpeciesFields (const int speciesId)
 
SpeciesVCMapgetVCMap (const int speciesId)
 
SpeciesBCMapgetBCMap (const int speciesId)
 
SpeciesBC< T > & getBC (const int id, const int speciesId)
 
SpeciesModelOptions< T > & getOptions ()
 
void updateTime ()
 
void initLinearization (LinearSystem &ls, const int &m)
 
void linearize (LinearSystem &ls, const int &m)
 
getMassFluxIntegral (const Mesh &mesh, const int faceGroupId, const int m)
 
getAverageMassFraction (const Mesh &mesh, const int m)
 
void advance (const int niter)
 
void printBCs ()
 
getMassFractionResidual (const int speciesId)
 

Private Attributes

const MeshList _meshes
 
const GeomFields_geomFields
 
vector< SpeciesFields * > _speciesFieldsVector
 
vector< SpeciesBCMap * > _bcMapVector
 
vector< SpeciesVCMap * > _vcMapVector
 
SpeciesModelOptions< T > _options
 
vector< MFRPtr * > _initialNormVector
 
int _niters
 
const int _nSpecies
 
SpeciesModelFields _speciesModelFields
 
vector< MFRPtr * > _currentResidual
 

Detailed Description

template<class T>
class SpeciesModel< T >::Impl

Definition at line 33 of file SpeciesModel_impl.h.

Member Typedef Documentation

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

Definition at line 41 of file SpeciesModel_impl.h.

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

Definition at line 36 of file SpeciesModel_impl.h.

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

Definition at line 40 of file SpeciesModel_impl.h.

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

Definition at line 39 of file SpeciesModel_impl.h.

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

Definition at line 37 of file SpeciesModel_impl.h.

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

Definition at line 38 of file SpeciesModel_impl.h.

Constructor & Destructor Documentation

template<class T>
SpeciesModel< T >::Impl::Impl ( const GeomFields geomFields,
const MeshList meshes,
const int  nSpecies 
)
inline

Definition at line 43 of file SpeciesModel_impl.h.

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

45  :
46  _meshes(meshes),
47  _geomFields(geomFields),
48  _niters(0),
49  _nSpecies(nSpecies),
50  _speciesModelFields("speciesModel")
51  {
52 
53  const int numMeshes = _meshes.size();
54 
55  for (int m=0; m<_nSpecies; m++)
56  {
57  SpeciesVCMap *svcmap = new SpeciesVCMap();
58  _vcMapVector.push_back(svcmap);
59  SpeciesBCMap *sbcmap = new SpeciesBCMap();
60  _bcMapVector.push_back(sbcmap);
61  SpeciesFields *sFields = new SpeciesFields("species");
62  _speciesFieldsVector.push_back(sFields);
63  MFRPtr *iNorm = new MFRPtr();
64  _initialNormVector.push_back(iNorm);
65  MFRPtr *rCurrent = new MFRPtr();
66  _currentResidual.push_back(rCurrent);
67 
68  for (int n=0; n<numMeshes; n++)
69  {
70 
71  const Mesh& mesh = *_meshes[n];
72  SpeciesVC<T> *vc(new SpeciesVC<T>());
73  vc->vcType = "flow";
74  (*svcmap)[mesh.getID()] = vc;
75 
76  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
77  {
78  const FaceGroup& fg = *fgPtr;
79  SpeciesBC<T> *bc(new SpeciesBC<T>());
80 
81  (*sbcmap)[fg.id] = bc;
82 
83  if ((fg.groupType == "wall") ||
84  (fg.groupType == "symmetry"))
85  {
86  bc->bcType = "SpecifiedMassFlux";
87  }
88  else if ((fg.groupType == "velocity-inlet") ||
89  (fg.groupType == "pressure-outlet"))
90  {
91  bc->bcType = "SpecifiedMassFraction";
92  }
93  else
94  throw CException("SpeciesModel: unknown face group type "
95  + fg.groupType);
96  }
97  }
98  }
99  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
std::map< int, SpeciesVC< T > * > SpeciesVCMap
Definition: SpeciesModel.h:24
Definition: Mesh.h:28
Definition: Mesh.h:49
string groupType
Definition: Mesh.h:42
const GeomFields & _geomFields
const int id
Definition: Mesh.h:41
vector< SpeciesVCMap * > _vcMapVector
const MeshList _meshes
SpeciesModelFields _speciesModelFields
vector< SpeciesFields * > _speciesFieldsVector
vector< MFRPtr * > _currentResidual
shared_ptr< MultiFieldReduction > MFRPtr
vector< SpeciesBCMap * > _bcMapVector
int getID() const
Definition: Mesh.h:106
std::map< int, SpeciesBC< T > * > SpeciesBCMap
Definition: SpeciesModel.h:23
vector< MFRPtr * > _initialNormVector

Member Function Documentation

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

Definition at line 682 of file SpeciesModel_impl.h.

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

683  {
684  for(int n=0; n<niter; n++)
685  {
686  bool allConverged=true;
687  for (int m=0; m<_nSpecies; m++)
688  {
689  MFRPtr& iNorm = *_initialNormVector[m];
690  MFRPtr& rCurrent = *_currentResidual[m];
691 
692  LinearSystem ls;
693  initLinearization(ls, m);
694 
695  ls.initAssembly();
696 
697  linearize(ls, m);
698 
699  ls.initSolve();
700 
701  MFRPtr rNorm(_options.getLinearSolver().solve(ls));
702 
703  if (!iNorm) iNorm = rNorm;
704 
705  MFRPtr normRatio((*rNorm)/(*iNorm));
706 
707  cout << "Species Number: " << m << endl;
708  cout << _niters << ": " << *rNorm << endl;
709 
710  _options.getLinearSolver().cleanup();
711 
712  ls.postSolve();
713  ls.updateSolution();
714 
715  _niters++;
716 
717  rCurrent = rNorm;
718 
719  if (!(*rNorm < _options.absoluteTolerance ||
720  *normRatio < _options.relativeTolerance))
721  allConverged=false;
722  }
723  if (allConverged)
724  break;
725  }
726  }
void initAssembly()
void updateSolution()
void initSolve()
void linearize(LinearSystem &ls, const int &m)
vector< MFRPtr * > _currentResidual
shared_ptr< MultiFieldReduction > MFRPtr
void initLinearization(LinearSystem &ls, const int &m)
SpeciesModelOptions< T > _options
vector< MFRPtr * > _initialNormVector
template<class T>
T SpeciesModel< T >::Impl::getAverageMassFraction ( const Mesh mesh,
const int  m 
)
inline

Definition at line 665 of file SpeciesModel_impl.h.

References Mesh::getCells(), StorageSite::getSelfCount(), and SpeciesFields::massFraction.

666  {
667  SpeciesFields& sFields = *_speciesFieldsVector[m];
668  const StorageSite& cells = mesh.getCells();
669  const TArray& mFCell = dynamic_cast<const TArray&>(sFields.massFraction[cells]);
670  const TArray& cellVolume = dynamic_cast<const TArray&>(_geomFields.volume[cells]);
671  T totalVolume = 0.0;
672  T weightedMassFraction = 0.0;
673  for(int c=0; c<cells.getSelfCount(); c++)
674  {
675  totalVolume += cellVolume[c];
676  weightedMassFraction += mFCell[c]*cellVolume[c];
677  }
678  return weightedMassFraction/totalVolume;
679  }
int getSelfCount() const
Definition: StorageSite.h:40
const GeomFields & _geomFields
const StorageSite & getCells() const
Definition: Mesh.h:109
Field volume
Definition: GeomFields.h:26
vector< SpeciesFields * > _speciesFieldsVector
Field massFraction
Definition: SpeciesFields.h:16
template<class T>
SpeciesBC<T>& SpeciesModel< T >::Impl::getBC ( const int  id,
const int  speciesId 
)
inline

Definition at line 337 of file SpeciesModel_impl.h.

337 {return *(*_bcMapVector[speciesId])[id];}
vector< SpeciesBCMap * > _bcMapVector
template<class T>
SpeciesBCMap& SpeciesModel< T >::Impl::getBCMap ( const int  speciesId)
inline

Definition at line 335 of file SpeciesModel_impl.h.

335 {return *_bcMapVector[speciesId];}
vector< SpeciesBCMap * > _bcMapVector
template<class T>
T SpeciesModel< T >::Impl::getMassFluxIntegral ( const Mesh mesh,
const int  faceGroupId,
const int  m 
)
inline

Definition at line 623 of file SpeciesModel_impl.h.

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

624  {
625  SpeciesFields& sFields = *_speciesFieldsVector[m];
626 
627  T r(0.);
628  bool found = false;
629  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
630  {
631  const FaceGroup& fg = *fgPtr;
632  if (fg.id == faceGroupId)
633  {
634  const StorageSite& faces = fg.site;
635  const int nFaces = faces.getCount();
636  const TArray& massFlux =
637  dynamic_cast<const TArray&>(sFields.massFlux[faces]);
638  for(int f=0; f<nFaces; f++)
639  r += massFlux[f];
640  found=true;
641  }
642  }
643 
644  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
645  {
646  const FaceGroup& fg = *fgPtr;
647  if (fg.id == faceGroupId)
648  {
649  const StorageSite& faces = fg.site;
650  const int nFaces = faces.getCount();
651  const TArray& massFlux =
652  dynamic_cast<const TArray&>(sFields.massFlux[faces]);
653  for(int f=0; f<nFaces; f++)
654  r += massFlux[f];
655  found=true;
656  }
657  }
658 
659 
660  if (!found)
661  throw CException("getMassFluxIntegral: invalid faceGroupID");
662  return r;
663  }
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
vector< SpeciesFields * > _speciesFieldsVector
int getCount() const
Definition: StorageSite.h:39
const FaceGroupList & getInterfaceGroups() const
Definition: Mesh.h:190
StorageSite site
Definition: Mesh.h:40
template<class T>
T SpeciesModel< T >::Impl::getMassFractionResidual ( const int  speciesId)
inline

Definition at line 749 of file SpeciesModel_impl.h.

References ArrayBase::getData(), and SpeciesFields::massFraction.

750  {
751  MFRPtr& rCurrent = *_currentResidual[speciesId];
752  SpeciesFields& sFields = *_speciesFieldsVector[speciesId];
753  const Field& massFractionField = sFields.massFraction;
754  ArrayBase& residualArray = (*rCurrent)[massFractionField];
755  T *arrayData = (T*)(residualArray.getData());
756  const T residual = arrayData[0];
757  return residual;
758  }
Definition: Field.h:14
vector< SpeciesFields * > _speciesFieldsVector
virtual void * getData() const =0
vector< MFRPtr * > _currentResidual
shared_ptr< MultiFieldReduction > MFRPtr
Field massFraction
Definition: SpeciesFields.h:16
template<class T>
SpeciesModelOptions<T>& SpeciesModel< T >::Impl::getOptions ( )
inline

Definition at line 339 of file SpeciesModel_impl.h.

339 {return _options;}
SpeciesModelOptions< T > _options
template<class T>
SpeciesFields& SpeciesModel< T >::Impl::getSpeciesFields ( const int  speciesId)
inline

Definition at line 332 of file SpeciesModel_impl.h.

332 {return *_speciesFieldsVector[speciesId];}
vector< SpeciesFields * > _speciesFieldsVector
template<class T>
SpeciesVCMap& SpeciesModel< T >::Impl::getVCMap ( const int  speciesId)
inline

Definition at line 334 of file SpeciesModel_impl.h.

334 {return *_vcMapVector[speciesId];}
vector< SpeciesVCMap * > _vcMapVector
template<class T>
void SpeciesModel< T >::Impl::init ( )
inline

Definition at line 101 of file SpeciesModel_impl.h.

References Model::_meshes, Field::addArray(), SpeciesFields::convectionFlux, SpeciesFields::diffusivity, SpeciesFields::elecPotential, Mesh::getBoundaryFaceGroups(), Mesh::getCells(), StorageSite::getCount(), Mesh::getFaces(), Mesh::getID(), Mesh::getInterfaceGroups(), Mesh::getOtherMeshID(), Mesh::getParentMeshID(), Mesh::isDoubleShell(), SpeciesFields::massFlux, SpeciesFields::massFraction, SpeciesFields::massFractionElectricModel, SpeciesFields::massFractionN1, SpeciesFields::massFractionN2, SpeciesFields::one, FaceGroup::site, SpeciesFields::source, Field::syncLocal(), and SpeciesFields::zero.

102  {
103  const int numMeshes = _meshes.size();
104 
105  for (int m=0; m<_nSpecies; m++)
106  {
107  const SpeciesVCMap& svcmap = *_vcMapVector[m];
108  const SpeciesBCMap& sbcmap = *_bcMapVector[m];
109  SpeciesFields& sFields = *_speciesFieldsVector[m];
110  //MFRPtr& iNorm = *_initialNormVector[m];
111 
112  for (int n=0; n<numMeshes; n++)
113  {
114  const Mesh& mesh = *_meshes[n];
115 
116  const StorageSite& cells = mesh.getCells();
117  const StorageSite& allFaces = mesh.getFaces();
118 
119  typename SpeciesVCMap::const_iterator pos = svcmap.find(mesh.getID());
120  if (pos==svcmap.end())
121  {
122  throw CException("SpeciesModel: Error in VC Map");
123  }
124 
125  const SpeciesVC<T>& vc = *(pos->second);
126 
127 
128  //mass fraction
129 
130  shared_ptr<TArray> mFCell(new TArray(cells.getCount()));
131 
132  if (!mesh.isDoubleShell())
133  {
134  *mFCell = vc["initialMassFraction"];
135  }
136  else
137  {
138  // double shell mesh cells take on values of parents
139  typename SpeciesVCMap::const_iterator posParent = svcmap.find(mesh.getParentMeshID());
140  typename SpeciesVCMap::const_iterator posOther = svcmap.find(mesh.getOtherMeshID());
141  const SpeciesVC<T>& vcP = *(posParent->second);
142  const SpeciesVC<T>& vcO = *(posOther->second);
143 
144  const int NumberOfCells = cells.getCount();
145  for (int c=0; c<NumberOfCells; c++)
146  {
147  if ((c < NumberOfCells/4)||(c >= 3*NumberOfCells/4))
148  {
149  (*mFCell)[c] = vcP["initialMassFraction"];
150  }
151  else
152  {
153  (*mFCell)[c] = vcO["initialMassFraction"];
154  }
155  }
156  }
157  /*
158  //Initialize to exp for ln term testing in electric model
159  const VectorT3Array& cellCentroid =
160  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[cells]);
161 
162  for (int c=0; c<cells.getCount(); c++)
163  {
164  VectorT3 CellCent = cellCentroid[c];
165  (*mFCell)[c] = exp(pow(CellCent[0],2));
166  }*/
167 
168 
169  /*if (n==0)
170  {
171  *mFCell =_options["initialMassFraction0"];
172  }
173  else if (n==1)
174  {
175  *mFCell = _options["initialMassFraction1"];
176  }
177  else if (n==2)
178  {
179  *mFCell = _options["initialMassFraction2"];
180  }
181  else if (n==3)
182  {
183  *mFCell = _options["initialMassFraction3"];
184  }
185  else if (n==4)
186  {
187  *mFCell = _options["initialMassFraction4"];
188  }
189  else
190  {
191  *mFCell =_options["initialMassFraction0"];
192  }
193 
194  if (mesh.isDoubleShell())
195  {
196  char parentInitial[21];
197  char otherInitial[21];
198  sprintf(parentInitial, "initialMassFraction%d", mesh.getParentMeshID());
199  sprintf(otherInitial, "initialMassFraction%d", mesh.getOtherMeshID());
200 
201  for (int c=0; c<cells.getSelfCount(); c++)
202  {
203  if (c < cells.getSelfCount()/2)
204  {
205  (*mFCell)[c] = _options[parentInitial];
206  }
207  else
208  {
209  (*mFCell)[c] = _options[otherInitial];
210  }
211  }
212  }*/
213 
214 
215  //*mFCell = _options["initialMassFraction"];
216 
217  /* //Initialize to 1-D linear solution in x direction
218  const VectorT3Array& cellCentroid =
219  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[cells]);
220 
221  for (int c=0; c<cells.getCount(); c++)
222  {
223  VectorT3 CellCent = cellCentroid[c];
224  (*mFCell)[c] = -0.05*CellCent[0] + 0.5;
225  } */
226 
227  /*//Initialize to specialized concentrations (for now)
228  const VectorT3Array& cellCentroid =
229  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[cells]);
230 
231  for (int c=0; c<cells.getCount(); c++)
232  {
233  VectorT3 CellCent = cellCentroid[c];
234  if (n==0)
235  {
236  (*mFCell)[c] = 1000.0;
237  }
238  elseif (n==1)
239  {
240  (*mFCell)[c] = 0.0;
241 
242  (*mFCell)[c] = -0.05*CellCent[0] + 0.5;
243  }*/
244 
245  sFields.massFraction.addArray(cells,mFCell);
246 
247  if (_options.ButlerVolmer)
248  {
249  sFields.massFractionElectricModel.addArray(cells,dynamic_pointer_cast<ArrayBase>(mFCell->newCopy()));
250  }
251 
252  if (_options.transient)
253  {
254  sFields.massFractionN1.addArray(cells,
255  dynamic_pointer_cast<ArrayBase>(mFCell->newCopy()));
256  if (_options.timeDiscretizationOrder > 1)
257  sFields.massFractionN2.addArray(cells,
258  dynamic_pointer_cast<ArrayBase>(mFCell->newCopy()));
259 
260  }
261 
262  //diffusivity
263  shared_ptr<TArray> diffusivityCell(new TArray(cells.getCount()));
264  *diffusivityCell = vc["massDiffusivity"];
265  sFields.diffusivity.addArray(cells,diffusivityCell);
266 
267  //source
268  shared_ptr<TArray> sCell(new TArray(cells.getCount()));
269  *sCell = T(0.);
270  sFields.source.addArray(cells,sCell);
271 
272  //create a zero field
273  shared_ptr<TArray> zeroCell(new TArray(cells.getCount()));
274  *zeroCell = T(0.0);
275  sFields.zero.addArray(cells,zeroCell);
276 
277  //create a one field
278  shared_ptr<TArray> oneCell(new TArray(cells.getCount()));
279  *oneCell = T(1.0);
280  sFields.one.addArray(cells,oneCell);
281 
282  //initial temparature gradient array
283  shared_ptr<TGradArray> gradT(new TGradArray(cells.getCount()));
284  gradT->zero();
286 
287  //inital convection flux at faces
288  shared_ptr<TArray> convFlux(new TArray(allFaces.getCount()));
289  convFlux->zero();
290  sFields.convectionFlux.addArray(allFaces,convFlux);
291 
292  //mass flux at faces
293  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
294  {
295  const FaceGroup& fg = *fgPtr;
296  const StorageSite& faces = fg.site;
297 
298  shared_ptr<TArray> fluxFace(new TArray(faces.getCount()));
299 
300  fluxFace->zero();
301  sFields.massFlux.addArray(faces,fluxFace);
302 
303  }
304  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
305  {
306  const FaceGroup& fg = *fgPtr;
307  const StorageSite& faces = fg.site;
308 
309  shared_ptr<TArray> fluxFace(new TArray(faces.getCount()));
310 
311  fluxFace->zero();
312  sFields.massFlux.addArray(faces,fluxFace);
313 
314  }
315 
316  //electric potential (for coupling to ElectricModel)
317  // only needed once for each mesh (not depenedent on species)
318  if (m==0)
319  {
320  shared_ptr<TArray> ePotCell(new TArray(cells.getCount()));
321  ePotCell->zero();
322  sFields.elecPotential.addArray(cells,ePotCell);
323  }
324  }
325 
326  sFields.diffusivity.syncLocal();
327  //iNorm = MFRPtr();
328  }
329  _niters =0;
330  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
bool isDoubleShell() const
Definition: Mesh.h:324
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
std::map< int, SpeciesVC< T > * > SpeciesVCMap
Definition: SpeciesModel.h:24
Definition: Mesh.h:28
Field massFractionElectricModel
Definition: SpeciesFields.h:29
Definition: Mesh.h:49
Field massFractionN2
Definition: SpeciesFields.h:23
Field elecPotential
Definition: SpeciesFields.h:28
int getOtherMeshID() const
Definition: Mesh.h:327
vector< SpeciesVCMap * > _vcMapVector
const MeshList _meshes
const StorageSite & getFaces() const
Definition: Mesh.h:108
const StorageSite & getCells() const
Definition: Mesh.h:109
void addArray(const StorageSite &, shared_ptr< ArrayBase > a)
Definition: Field.cpp:72
int getParentMeshID() const
Definition: Mesh.h:326
Array< Gradient< T > > TGradArray
SpeciesModelFields _speciesModelFields
vector< SpeciesFields * > _speciesFieldsVector
Field massFractionN1
Definition: SpeciesFields.h:22
int getCount() const
Definition: StorageSite.h:39
const FaceGroupList & getInterfaceGroups() const
Definition: Mesh.h:190
Field convectionFlux
Definition: SpeciesFields.h:20
vector< SpeciesBCMap * > _bcMapVector
Field massFraction
Definition: SpeciesFields.h:16
SpeciesModelOptions< T > _options
void syncLocal()
Definition: Field.cpp:334
int getID() const
Definition: Mesh.h:106
std::map< int, SpeciesBC< T > * > SpeciesBCMap
Definition: SpeciesModel.h:23
StorageSite site
Definition: Mesh.h:40
template<class T>
void SpeciesModel< T >::Impl::initLinearization ( LinearSystem ls,
const int &  m 
)
inline

Definition at line 370 of file SpeciesModel_impl.h.

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

371  {
372  SpeciesFields& sFields = *_speciesFieldsVector[m];
373  const int numMeshes = _meshes.size();
374 
375  for (int n=0; n<numMeshes; n++)
376  {
377  const Mesh& mesh = *_meshes[n];
378 
379  const StorageSite& cells = mesh.getCells();
380  MultiField::ArrayIndex tIndex(&sFields.massFraction,&cells);
381 
382  ls.getX().addArray(tIndex,sFields.massFraction.getArrayPtr(cells));
383 
384  const CRConnectivity& cellCells = mesh.getCellCells();
385 
386  shared_ptr<Matrix> m(new CRMatrix<T,T,T>(cellCells));
387 
388  ls.getMatrix().addMatrix(tIndex,tIndex,m);
389 
390  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
391  {
392  const FaceGroup& fg = *fgPtr;
393  const StorageSite& faces = fg.site;
394 
395  MultiField::ArrayIndex fIndex(&sFields.massFlux,&faces);
396  ls.getX().addArray(fIndex,sFields.massFlux.getArrayPtr(faces));
397 
398  const CRConnectivity& faceCells = mesh.getFaceCells(faces);
399 
400  shared_ptr<Matrix> mft(new FluxJacobianMatrix<T,T>(faceCells));
401  ls.getMatrix().addMatrix(fIndex,tIndex,mft);
402 
403  shared_ptr<Matrix> mff(new DiagonalMatrix<T,T>(faces.getCount()));
404  ls.getMatrix().addMatrix(fIndex,fIndex,mff);
405  }
406 
407  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
408  {
409  const FaceGroup& fg = *fgPtr;
410  const StorageSite& faces = fg.site;
411 
412  MultiField::ArrayIndex fIndex(&sFields.massFlux,&faces);
413  ls.getX().addArray(fIndex,sFields.massFlux.getArrayPtr(faces));
414 
415  const CRConnectivity& faceCells = mesh.getFaceCells(faces);
416 
417  shared_ptr<Matrix> mft(new FluxJacobianMatrix<T,T>(faceCells));
418  ls.getMatrix().addMatrix(fIndex,tIndex,mft);
419 
420  shared_ptr<Matrix> mff(new DiagonalMatrix<T,T>(faces.getCount()));
421  ls.getMatrix().addMatrix(fIndex,fIndex,mff);
422  }
423 
424  }
425  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
Definition: Mesh.h:28
Definition: Mesh.h:49
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
const MeshList _meshes
const CRConnectivity & getCellCells() const
Definition: Mesh.cpp:480
const StorageSite & getCells() const
Definition: Mesh.h:109
const CRConnectivity & getFaceCells(const StorageSite &site) const
Definition: Mesh.cpp:388
void addMatrix(const Index &rowI, const Index &colI, shared_ptr< Matrix > m)
vector< SpeciesFields * > _speciesFieldsVector
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
Field massFraction
Definition: SpeciesFields.h:16
MultiFieldMatrix & getMatrix()
Definition: LinearSystem.h:37
StorageSite site
Definition: Mesh.h:40
template<class T>
void SpeciesModel< T >::Impl::linearize ( LinearSystem ls,
const int &  m 
)
inline

Definition at line 427 of file SpeciesModel_impl.h.

References Model::_meshes, BaseGenericBCS< X, Diag, OffDiag >::applyInterfaceBC(), SpeciesBC< T >::bcType, GradientModel< X >::compute(), SpeciesFields::convectionFlux, SpeciesFields::diffusivity, LinearizeInterfaceJump< X, Diag, OffDiag >::discretize(), LinearizeSpeciesInterface< X, Diag, OffDiag >::discretize(), SpeciesFields::elecPotential, LinearSystem::getB(), Mesh::getBoundaryFaceGroups(), StorageSite::getCount(), Mesh::getInterfaceGroups(), LinearSystem::getMatrix(), Mesh::getOtherMeshID(), Mesh::getParentMeshID(), FloatVarDict< T >::getVal(), LinearSystem::getX(), Field::hasArray(), FaceGroup::id, Mesh::isDoubleShell(), Linearizer::linearize(), SpeciesFields::massFlux, SpeciesFields::massFraction, SpeciesFields::massFractionElectricModel, SpeciesFields::massFractionN1, SpeciesFields::massFractionN2, SpeciesFields::one, FaceGroup::site, SpeciesFields::source, and SpeciesFields::zero.

428  {
429  const SpeciesVCMap& svcmap = *_vcMapVector[m];
430  const SpeciesBCMap& sbcmap = *_bcMapVector[m];
431  SpeciesFields& sFields = *_speciesFieldsVector[m];
432 
433  GradientModel<T> speciesGradientModel(_meshes,sFields.massFraction,
435  speciesGradientModel.compute();
436 
437  DiscrList discretizations;
438 
439  shared_ptr<Discretization>
442  sFields.massFraction,
443  sFields.diffusivity,
445  discretizations.push_back(dd);
446 
447  shared_ptr<Discretization>
450  sFields.massFraction,
451  sFields.convectionFlux,
452  sFields.zero,
454  _options.useCentralDifference));
455  discretizations.push_back(cd);
456 
457 
458  shared_ptr<Discretization>
460  (_meshes,
461  _geomFields,
462  sFields.massFraction,
463  sFields.source));
464  discretizations.push_back(sd);
465 
466  if (_options.transient)
467  {
468  shared_ptr<Discretization>
471  sFields.massFraction,
472  sFields.massFractionN1,
473  sFields.massFractionN2,
474  sFields.one,
475  _options["timeStep"]));
476 
477  discretizations.push_back(td);
478  }
479 
480  shared_ptr<Discretization>
482  (_meshes,_geomFields,sFields.massFraction));
483 
484  discretizations.push_back(ibm);
485 
486  Linearizer linearizer;
487 
488  linearizer.linearize(discretizations,_meshes,ls.getMatrix(),
489  ls.getX(), ls.getB());
490 
491  const int numMeshes = _meshes.size();
492 
493  /* linearize shell mesh */
494 
495  for (int n=0; n<numMeshes; n++)
496  {
497  const Mesh& mesh = *_meshes[n];
498  if (mesh.isDoubleShell())
499  {
500  const int parentMeshID = mesh.getParentMeshID();
501  const int otherMeshID = mesh.getOtherMeshID();
502  const Mesh& parentMesh = *_meshes[parentMeshID];
503  const Mesh& otherMesh = *_meshes[otherMeshID];
504 
505  if (_options.ButlerVolmer)
506  {
507  bool Cathode = false;
508  bool Anode = false;
509  if (n == _options["ButlerVolmerCathodeShellMeshID"])
510  {
511  Cathode = true;
512  }
513  else if (n == _options["ButlerVolmerAnodeShellMeshID"])
514  {
515  Anode = true;
516  }
517 
519  _options["ButlerVolmerRRConstant"],
520  _options["A_coeff"],
521  _options["B_coeff"],
522  _options["interfaceUnderRelax"],
523  Anode,
524  Cathode,
525  sFields.massFraction,
527  sFields.elecPotential);
528 
529  lbv.discretize(mesh, parentMesh, otherMesh, ls.getMatrix(), ls.getX(), ls.getB() );
530 
531  }
532  else
533  {
535  _options["B_coeff"],
536  sFields.massFraction);
537 
538  lsm.discretize(mesh, parentMesh, otherMesh, ls.getMatrix(), ls.getX(), ls.getB() );
539  }
540  }
541  }
542 
543  /* boundary and interface condition */
544 
545  for (int n=0; n<numMeshes; n++)
546  {
547  const Mesh& mesh = *_meshes[n];
548 
549  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
550  {
551  const FaceGroup& fg = *fgPtr;
552  const StorageSite& faces = fg.site;
553 
554  typename SpeciesBCMap::const_iterator pos = sbcmap.find(fg.id);
555  if (pos==sbcmap.end())
556  {
557  throw CException("SpeciesModel: Error in BC Map");
558  }
559 
560  const SpeciesBC<T>& bc = *(pos->second);
561 
562  GenericBCS<T,T,T> gbc(faces,mesh,
563  _geomFields,
564  sFields.massFraction,
565  sFields.massFlux,
566  ls.getMatrix(), ls.getX(), ls.getB());
567 
568  if (bc.bcType == "SpecifiedMassFraction")
569  {
571  bT(bc.getVal("specifiedMassFraction"),faces);
572  if (sFields.convectionFlux.hasArray(faces))
573  {
574  const TArray& convectingFlux =
575  dynamic_cast<const TArray&>
576  (sFields.convectionFlux[faces]);
577  const int nFaces = faces.getCount();
578 
579  for(int f=0; f<nFaces; f++)
580  {
581  if (convectingFlux[f] > 0.)
582  {
583  gbc.applyExtrapolationBC(f);
584  }
585  else
586  {
587  gbc.applyDirichletBC(f,bT[f]);
588  }
589  }
590  }
591  else
592  gbc.applyDirichletBC(bT);
593  }
594  else if (bc.bcType == "SpecifiedMassFlux")
595  {
596  const T specifiedFlux(bc["specifiedMassFlux"]);
597  gbc.applyNeumannBC(specifiedFlux);
598  }
599  else if ((bc.bcType == "Symmetry"))
600  {
601  T zeroFlux(NumTypeTraits<T>::getZero());
602  gbc.applyNeumannBC(zeroFlux);
603  }
604  else
605  throw CException(bc.bcType + " not implemented for SpeciesModel");
606  }
607 
608  foreach(const FaceGroupPtr fgPtr, mesh.getInterfaceGroups())
609  {
610  const FaceGroup& fg = *fgPtr;
611  const StorageSite& faces = fg.site;
612  GenericBCS<T,T,T> gbc(faces,mesh,
613  _geomFields,
614  sFields.massFraction,
615  sFields.massFlux,
616  ls.getMatrix(), ls.getX(), ls.getB());
617 
618  gbc.applyInterfaceBC();
619  }
620  }
621  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
bool isDoubleShell() const
Definition: Mesh.h:324
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
std::map< int, SpeciesVC< T > * > SpeciesVCMap
Definition: SpeciesModel.h:24
bool hasArray(const StorageSite &s) const
Definition: Field.cpp:37
Definition: Mesh.h:28
Field massFractionElectricModel
Definition: SpeciesFields.h:29
Definition: Mesh.h:49
string bcType
Definition: SpeciesBC.h:17
Field massFractionN2
Definition: SpeciesFields.h:23
FloatVal< T > getVal(const string varName) const
Definition: FloatVarDict.h:85
Field elecPotential
Definition: SpeciesFields.h:28
int getOtherMeshID() const
Definition: Mesh.h:327
const GeomFields & _geomFields
const int id
Definition: Mesh.h:41
vector< SpeciesVCMap * > _vcMapVector
vector< shared_ptr< Discretization > > DiscrList
const MeshList _meshes
void applyInterfaceBC(const int f) const
Definition: GenericBCS.h:325
int getParentMeshID() const
Definition: Mesh.h:326
SpeciesModelFields _speciesModelFields
vector< SpeciesFields * > _speciesFieldsVector
Field massFractionN1
Definition: SpeciesFields.h:22
int getCount() const
Definition: StorageSite.h:39
MultiField & getB()
Definition: LinearSystem.h:33
const FaceGroupList & getInterfaceGroups() const
Definition: Mesh.h:190
MultiField & getX()
Definition: LinearSystem.h:32
Field convectionFlux
Definition: SpeciesFields.h:20
vector< SpeciesBCMap * > _bcMapVector
Field massFraction
Definition: SpeciesFields.h:16
SpeciesModelOptions< T > _options
virtual void linearize(DiscrList &discretizations, const MeshList &meshes, MultiFieldMatrix &matrix, MultiField &x, MultiField &b)
Definition: Linearizer.cpp:17
MultiFieldMatrix & getMatrix()
Definition: LinearSystem.h:37
std::map< int, SpeciesBC< T > * > SpeciesBCMap
Definition: SpeciesModel.h:23
StorageSite site
Definition: Mesh.h:40
template<class T>
void SpeciesModel< T >::Impl::printBCs ( )
inline

Definition at line 728 of file SpeciesModel_impl.h.

729  {
730  for (int m=0; m<_nSpecies; m++)
731  {
732  const SpeciesBCMap& sbcmap = *_bcMapVector[m];
733  cout << "Species Number :" << m << endl;
734 
735  for(typename SpeciesBCMap::const_iterator pos=sbcmap.begin();
736  pos!=sbcmap.end();
737  ++pos)
738  {
739  cout << "Face Group " << pos->first << ":" << endl;
740  cout << " bc type " << pos->second->bcType << endl;
741  foreach(typename SpeciesBC<T>::value_type& vp, *(pos->second))
742  {
743  cout << " " << vp.first << " " << vp.second.constant << endl;
744  }
745  }
746  }
747  }
vector< SpeciesBCMap * > _bcMapVector
std::map< int, SpeciesBC< T > * > SpeciesBCMap
Definition: SpeciesModel.h:23
template<class T>
void SpeciesModel< T >::Impl::updateTime ( )
inline

Definition at line 341 of file SpeciesModel_impl.h.

References Model::_meshes, Mesh::getCells(), SpeciesFields::massFraction, SpeciesFields::massFractionN1, and SpeciesFields::massFractionN2.

342  {
343  const int numMeshes = _meshes.size();
344 
345  for (int m=0; m<_nSpecies; m++)
346  {
347  SpeciesFields& sFields = *_speciesFieldsVector[m];
348 
349  for (int n=0; n<numMeshes; n++)
350  {
351  const Mesh& mesh = *_meshes[n];
352 
353  const StorageSite& cells = mesh.getCells();
354  TArray& mF =
355  dynamic_cast<TArray&>(sFields.massFraction[cells]);
356  TArray& mFN1 =
357  dynamic_cast<TArray&>(sFields.massFractionN1[cells]);
358 
359  if (_options.timeDiscretizationOrder > 1)
360  {
361  TArray& mFN2 =
362  dynamic_cast<TArray&>(sFields.massFractionN2[cells]);
363  mFN2 = mFN1;
364  }
365  mFN1 = mF;
366  }
367  }
368  }
Definition: Mesh.h:49
Field massFractionN2
Definition: SpeciesFields.h:23
const MeshList _meshes
const StorageSite & getCells() const
Definition: Mesh.h:109
vector< SpeciesFields * > _speciesFieldsVector
Field massFractionN1
Definition: SpeciesFields.h:22
Field massFraction
Definition: SpeciesFields.h:16
SpeciesModelOptions< T > _options

Member Data Documentation

template<class T>
vector<SpeciesBCMap*> SpeciesModel< T >::Impl::_bcMapVector
private

Definition at line 767 of file SpeciesModel_impl.h.

template<class T>
vector<MFRPtr*> SpeciesModel< T >::Impl::_currentResidual
private

Definition at line 780 of file SpeciesModel_impl.h.

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

Definition at line 763 of file SpeciesModel_impl.h.

template<class T>
vector<MFRPtr*> SpeciesModel< T >::Impl::_initialNormVector
private

Definition at line 773 of file SpeciesModel_impl.h.

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

Definition at line 762 of file SpeciesModel_impl.h.

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

Definition at line 774 of file SpeciesModel_impl.h.

template<class T>
const int SpeciesModel< T >::Impl::_nSpecies
private

Definition at line 775 of file SpeciesModel_impl.h.

template<class T>
SpeciesModelOptions<T> SpeciesModel< T >::Impl::_options
private

Definition at line 770 of file SpeciesModel_impl.h.

template<class T>
vector<SpeciesFields*> SpeciesModel< T >::Impl::_speciesFieldsVector
private

Definition at line 765 of file SpeciesModel_impl.h.

template<class T>
SpeciesModelFields SpeciesModel< T >::Impl::_speciesModelFields
private

Definition at line 777 of file SpeciesModel_impl.h.

template<class T>
vector<SpeciesVCMap*> SpeciesModel< T >::Impl::_vcMapVector
private

Definition at line 768 of file SpeciesModel_impl.h.


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