46 _geomFields(geomFields),
47 _vacancyFields(vacancyFields),
48 _concentrationGradientModel(
_meshes,_vacancyFields.concentration,
49 _vacancyFields.concentrationGradient,_geomFields),
51 _vacancyFields.concentrationGradientVector,
52 _vacancyFields.plasticStrain,_geomFields),
56 const int numMeshes =
_meshes.size();
57 for (
int n=0; n<numMeshes; n++)
62 _vcMap[mesh.
getID()] = vc;
74 bc->
bcType =
"SpecifiedVacaFlux";
76 else if ((fg.
groupType ==
"velocity-inlet") ||
79 bc->
bcType =
"SpecifiedConcentration";
82 throw CException(
"VacancyModel: unknown face group type "
90 const int numMeshes =
_meshes.size();
91 for (
int n=0; n<numMeshes; n++)
100 *tCell = _options[
"initialConcentration"];
101 _vacancyFields.concentration.addArray(cells,tCell);
103 if(_options.transient)
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()));
112 *condCell = vc[
"vacancyDiffusioncoefficient"];
113 _vacancyFields.diffusioncoefficient.addArray(cells,condCell);
118 _vacancyFields.source.addArray(cells,sCell);
123 _vacancyFields.zero.addArray(cells,zeroCell);
128 _vacancyFields.one.addArray(cells,oneCell);
132 *cp = vc[
"density"] * vc[
"specificVaca"];
133 _vacancyFields.specificVaca.addArray(cells, cp);
138 _vacancyFields.concentrationGradient.addArray(cells,gradT);
143 _vacancyFields.concentrationGradientVector.addArray(cells,vGrad);
148 plasticStrainField->zero();
149 _vacancyFields.plasticStrain.addArray(cells,plasticStrainField);
157 _vacancyFields.convectionFlux.addArray(allFaces,convFlux);
168 _vacancyFields.vacaFlux.addArray(faces,fluxFace);
179 _vacancyFields.vacaFlux.addArray(faces,fluxFace);
185 _vacancyFields.diffusioncoefficient.syncLocal();
199 const int numMeshes =
_meshes.size();
200 for (
int n=0; n<numMeshes; n++)
207 ls.
getX().
addArray(tIndex,_vacancyFields.concentration.getArrayPtr(cells));
221 ls.
getX().
addArray(fIndex,_vacancyFields.vacaFlux.getArrayPtr(faces));
238 ls.
getX().
addArray(fIndex,_vacancyFields.vacaFlux.getArrayPtr(faces));
254 _concentrationGradientModel.compute();
259 shared_ptr<Discretization>
262 _vacancyFields.concentration,
263 _vacancyFields.diffusioncoefficient,
264 _vacancyFields.concentrationGradient));
265 discretizations.push_back(dd);
267 shared_ptr<Discretization>
270 _vacancyFields.concentration,
271 _vacancyFields.convectionFlux,
273 _vacancyFields.concentrationGradient,
274 _options.useCentralDifference));
275 discretizations.push_back(cd);
278 shared_ptr<Discretization>
282 _vacancyFields.concentration,
283 _vacancyFields.source));
284 discretizations.push_back(sd);
286 if (_options.transient)
288 shared_ptr<Discretization>
291 _vacancyFields.concentration,
292 _vacancyFields.concentrationN1,
293 _vacancyFields.concentrationN2,
294 _vacancyFields.specificVaca,
295 _options[
"timeStep"]));
296 discretizations.push_back(td);
299 shared_ptr<Discretization>
301 (
_meshes,_geomFields,_vacancyFields.concentration));
303 discretizations.push_back(ibm);
311 const int numMeshes =
_meshes.size();
312 for (
int n=0; n<numMeshes; n++)
326 _vacancyFields.concentration,
327 _vacancyFields.vacaFlux,
330 if (bc.
bcType ==
"SpecifiedConcentration")
333 bT(bc.
getVal(
"specifiedConcentration"),faces);
334 if (_vacancyFields.convectionFlux.hasArray(faces))
336 const TArray& convectingFlux =
337 dynamic_cast<const TArray&
>
338 (_vacancyFields.convectionFlux[faces]);
339 const int nFaces = faces.
getCount();
341 for(
int f=0; f<nFaces; f++)
343 if (convectingFlux[f] > 0.)
345 gbc.applyExtrapolationBC(f);
349 gbc.applyDirichletBC(f,bT[f]);
354 gbc.applyDirichletBC(bT);
356 else if (bc.
bcType ==
"SpecifiedVacaFlux")
359 bVacaFlux(bc.
getVal(
"specifiedVacaFlux"),faces);
361 const int nFaces = faces.
getCount();
363 for(
int f=0; f<nFaces; f++)
365 gbc.applyNeumannBC(f, bVacaFlux[f]);
368 else if (bc.
bcType ==
"Symmetry")
371 gbc.applyNeumannBC(zeroFlux);
373 else if (bc.
bcType ==
"Convective")
377 const int nFaces = faces.
getCount();
378 for(
int f=0; f<nFaces; f++)
379 gbc.applyConvectionBC(f, hCoeff[f], Xinf[f]);
391 _vacancyFields.concentration,
392 _vacancyFields.vacaFlux,
407 if (fg.
id == faceGroupId)
410 const int nFaces = faces.
getCount();
412 dynamic_cast<const TArray&
>(_vacancyFields.vacaFlux[faces]);
413 for(
int f=0; f<nFaces; f++)
419 throw CException(
"getVacaFluxIntegral: invalid faceGroupID");
426 for(
int n=0; n<niter; n++)
429 initLinearization(ls);
437 MFRPtr rNorm(_options.getLinearSolver().solve(ls));
439 if (!_initialNorm) _initialNorm = rNorm;
441 MFRPtr normRatio((*rNorm)/(*_initialNorm));
443 cout << _niters <<
": " << *rNorm << endl;
446 _options.getLinearSolver().cleanup();
452 if (*rNorm < _options.absoluteTolerance ||
453 *normRatio < _options.relativeTolerance)
460 foreach(
typename VacancyBCMap::value_type& pos, _bcMap)
462 cout <<
"Face Group " << pos.first <<
":" << endl;
463 cout <<
" bc type " << pos.second->bcType << endl;
466 cout <<
" " << vp.first <<
" " << vp.second.constant << endl;
474 const int numMeshes =
_meshes.size();
475 for (
int n=0; n<numMeshes; n++) {
482 dynamic_cast<TArray&
>(_vacancyFields.concentration[cells]);
484 dynamic_cast<TArray&
>(_vacancyFields.concentrationN1[cells]);
486 if (_options.timeDiscretizationOrder > 1)
489 dynamic_cast<TArray&
>(_vacancyFields.concentrationN2[cells]);
490 concentrationN2 = concentrationN1;
492 concentrationN1 = concentration;
497 #if !(defined(USING_ATYPE_TANGENT) || defined(USING_ATYPE_PC))
502 initLinearization(ls);
512 for (
unsigned int id = 0;
id <
_meshes.size();
id++ ){
532 int nCoeffs = nCells;
534 for(
int i=0; i<nCells; i++)
535 for(
int jp=row[i]; jp<row[i+1]; jp++)
537 const int j = col[jp];
538 if (j<nCells) nCoeffs++;
542 string matFileName = fileBase +
"_mesh" + ss.str() +
".mat";
545 FILE *matFile = fopen(matFileName.c_str(),
"wb");
547 fprintf(matFile,
"%%%%MatrixMarket matrix coordinate real general\n");
548 fprintf(matFile,
"%d %d %d\n", nCells,nCells,nCoeffs);
550 for(
int i=0; i<nCells; i++)
552 fprintf(matFile,
"%d %d %lf\n", i+1, i+1, tDiag[i]);
553 for(
int jp=row[i]; jp<row[i+1]; jp++)
555 const int j = col[jp];
557 fprintf(matFile,
"%d %d %lf\n", i+1, j+1, tCoeff[jp]);
563 string rhsFileName = fileBase +
".rhs";
564 FILE *rhsFile = fopen(rhsFileName.c_str(),
"wb");
566 for(
int i=0; i<nCells; i++)
567 fprintf(rhsFile,
"%lf\n",-rCell[i]);
580 dynamic_cast<const TArray&
>(_vacancyFields.concentration[particles]);
582 const int numMeshes =
_meshes.size();
583 for (
int n=0; n<numMeshes; n++)
592 dynamic_cast<const IMatrix&
>
593 (*_geomFields._interpolationMatrices[key1]);
597 dynamic_cast<const IMatrix&
>
598 (*_geomFields._interpolationMatrices[key2]);
603 dynamic_cast<const TArray&
>(_vacancyFields.concentration[cells]);
608 mIC.multiplyAndAdd(*ibT,cT);
609 mIP.multiplyAndAdd(*ibT,pT);
610 _vacancyFields.concentration.addArray(ibFaces,ibT);
621 const int numMeshes =
_meshes.size();
623 _concentrationGradientModel.compute();
625 for (
int n=0; n<numMeshes; n++)
631 const TGradArray& cGrad =
dynamic_cast<const TGradArray&
> (_vacancyFields.concentrationGradient[cells]);
632 for (
int c=0; c<nCells; c++)
634 for (
int k=0; k<3; k++)
635 cGradVector[c][k] = cGrad[c][k];
639 _fluxGradientModel.compute();
642 for (
int n=0; n<numMeshes; n++)
648 const TArray& diffCoeff =
dynamic_cast<const TArray&
> (_vacancyFields.diffusioncoefficient[cells]);
649 for(
int c=0; c<nCells; c++)
653 const T df(diffCoeff[c]);
655 for (
int i=0;i<3;i++)
657 psTemp[i][j] = 0.5 * df * (ps[i][j]+ps[j][i]);
687 _impl(new
Impl(geomFields,vacancyFields,meshes))
710 _impl->computePlasticStrainRate();
742 _impl->advance(niter);
749 _impl->computeIBFaceConcentration(particles);
752 #if !(defined(USING_ATYPE_TANGENT) || defined(USING_ATYPE_PC))
758 _impl->dumpMatrix(fileBase);
766 return _impl->getVacaFluxIntegral(mesh, faceGroupId);
void linearize(LinearSystem &ls)
void advance(const int niter)
void computeIBFaceConcentration(const StorageSite &particles)
const FaceGroupList & getBoundaryFaceGroups() const
const Array< int > & getCol() const
const Array< int > & getRow() const
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
shared_ptr< FaceGroup > FaceGroupPtr
void dumpMatrix(const string fileBase)
const StorageSite & getIBFaces() const
VacancyModelOptions< T > & getOptions()
T getVacaFluxIntegral(const Mesh &mesh, const int faceGroupId)
void initLinearization(LinearSystem &ls)
virtual void computePlasticStrainRate()
Array< Gradient< T > > TGradArray
void dumpMatrix(const string fileBase)
T getVacaFluxIntegral(const Mesh &mesh, const int faceGroupId)
VacancyBC< T > & getBC(const int id)
Array< Diag > & getDiag()
Array< Gradient< VectorT3 > > VGradArray
const GeomFields & _geomFields
CRMatrix< T, T, T > T_Matrix
virtual const CRConnectivity & getConnectivity() const
FloatVal< T > getVal(const string varName) const
Array< Vector< double, 3 > > VectorT3Array
Array< OffDiag > & getOffDiag()
GradientModel< VectorT3 > _fluxGradientModel
VacancyModel(const GeomFields &geomFields, VacancyFields &vacancyFields, const MeshList &meshes)
pair< const Field *, const StorageSite * > ArrayIndex
VacancyBCMap & getBCMap()
void advance(const int niter)
vector< shared_ptr< Discretization > > DiscrList
Array< VectorT3 > VectorT3Array
const StorageSite & getFaces() const
const CRConnectivity & getCellCells() const
VacancyFields & _vacancyFields
const StorageSite & getCells() const
void applyInterfaceBC(const int f) const
std::map< int, VacancyVC< T > * > VacancyVCMap
VacancyBCMap & getBCMap()
int getCountLevel1() const
GradientModel< T > _concentrationGradientModel
void computeIBFaceConcentration(const StorageSite &particles)
const CRConnectivity & getFaceCells(const StorageSite &site) const
Impl(const GeomFields &geomFields, VacancyFields &vacancyFields, const MeshList &meshes)
void addMatrix(const Index &rowI, const Index &colI, shared_ptr< Matrix > m)
VacancyBC< T > & getBC(const int id)
std::map< int, VacancyBC< T > * > VacancyBCMap
VacancyModelOptions< T > _options
shared_ptr< MultiFieldReduction > MFRPtr
void addArray(const ArrayIndex &aIndex, shared_ptr< ArrayBase > a)
const FaceGroupList & getInterfaceGroups() const
VacancyVCMap & getVCMap()
void computePlasticStrainRate()
VacancyModelOptions< T > & getOptions()
virtual void linearize(DiscrList &discretizations, const MeshList &meshes, MultiFieldMatrix &matrix, MultiField &x, MultiField &b)
pair< const StorageSite *, const StorageSite * > SSPair
MultiFieldMatrix & getMatrix()
vector< Mesh * > MeshList
VacancyVCMap & getVCMap()