14#ifndef model_ClusterDynamicsParameters_cpp_
15#define model_ClusterDynamicsParameters_cpp_
29 G0(true?
TextFileParser(ddBase.
poly.materialFile).readScalar<double>(
"doseRate_dpaPerSec",true)*(ddBase.
poly.b_SI/ddBase.
poly.cs_SI) : 0.0),
78 double vacancySum(0.0);
79 double interstitialSum(0.0);
92 if(fabs(vacancySum-1.0)>FLT_EPSILON)
97 if(fabs(interstitialSum-1.0)>FLT_EPSILON)
105 const auto key=pair.first;
106 std::cout<<
"find the interaction between "<<
key.first<<
" - "<<
key.second<<
" and parameter: "<<pair.second<<std::endl;
109 std::cout<<
"first-order interaction matrix (in 1/s) is: "<<std::endl;
110 std::cout<<
R1*ddBase.poly.cs_SI/ddBase.poly.b_SI<<std::endl;
114 std::cout<<
"second-order interaction matrix (in 1/s) for "<<
static_cast<int>(
msVector(
k))<<
"-species is: "<<std::endl;
115 std::cout<<
R2[
k]*ddBase.poly.cs_SI/ddBase.poly.b_SI<<std::endl;
122 std::map<std::pair<int,int>,
double> tempMap;
125 const int key0= matrix_in(
k,0)<0?
static_cast<int>(matrix_in(
k,0)-
msVector(0)):
static_cast<int>(matrix_in(
k,0)-
msVector(0)-1);
126 const int key1= matrix_in(
k,1)<0?
static_cast<int>(matrix_in(
k,1)-
msVector(0)):
static_cast<int>(matrix_in(
k,1)-
msVector(0)-1);
129 throw std::runtime_error(
"Please keep the reaction map orders, key0<=key1.");
131 const std::pair<int,int>
key(key0,key1);
132 tempMap.insert(std::pair<std::pair<int,int>,
double>(
key,matrix_in(
k,2)));
152 if(iIndex-vIndex!=1 &&
msVector.matrix().squaredNorm()>0)
154 throw std::runtime_error(
"intersitital Index must be after vacancy Index.");
157 Eigen::Array<double,1,mSize> aveD(Eigen::Array<double,1,mSize>::Zero());
160 aveD(
k)=pow(
detD.begin()->second(
k),1.0/3.0);
163 Eigen::Array<double,1,mSize> rn(Eigen::Array<double,1,mSize>::Zero());
168 rn(
k)=pow(3.0*this->
omega/4.0/M_PI,1.0/3.0);
176 Eigen::Array<double,1,mSize>
alpha(Eigen::Array<double,1,mSize>::Zero());
179 for(
int k=0;
k<vIndex;
k++)
181 auto it=
reactionMap.find(std::pair<int,int>(
k+1,vIndex));
193 auto it=
reactionMap.find(std::pair<int,int>(iIndex,
k-1));
202 Eigen::Matrix<double,mSize,mSize> tempR1(Eigen::Matrix<double,mSize,mSize>::Zero());
212 tempR1(vIndex,
k-1) +=
alpha(
k-1);
214 else if(
k>=iIndex &&
k<
mSize-1)
217 tempR1(iIndex,
k+1) +=
alpha(
k+1);
229 Eigen::Array<double,1,mSize> aveD(Eigen::Array<double,1,mSize>::Zero());
232 aveD(
k)=pow(
detD.begin()->second(
k),1.0/3.0);
235 Eigen::Array<double,1,mSize> rn(Eigen::Array<double,1,mSize>::Zero());
240 rn(
k)=pow(3.0*this->
omega/4.0/M_PI,1.0/3.0);
248 std::vector<Eigen::Matrix<double,mSize,mSize>> tempR2;
249 Eigen::Matrix<double,mSize,mSize> R2sum(Eigen::Matrix<double,mSize,mSize>::Zero());
250 double maxCoeff(0.0);
254 Eigen::Matrix<double,mSize,mSize> tempR2_k(Eigen::Matrix<double,mSize,mSize>::Zero());
257 const auto key=pair.first;
259 if(
int(
k)==
key.first ||
int(
k)==
key.second)
271 tempR2_k(
key.first ,
key.second) -= pair.second*4.0*M_PI*(rn(
key.first)+rn(
key.second))*(aveD(
key.first)+aveD(
key.second))/
omega;
272 tempR2_k(
key.second ,
key.first) -= pair.second*4.0*M_PI*(rn(
key.first)+rn(
key.second))*(aveD(
key.first)+aveD(
key.second))/
omega;
276 const double same= (
key.first==
key.second) ? 0.5 : 1.0;
287 tempR2_k(
key.first ,
key.second) += same*pair.second*4.0*M_PI*(rn(
key.first)+rn(
key.second))*(aveD(
key.first)+aveD(
key.second))/
omega;
288 tempR2_k(
key.second ,
key.first) += same*pair.second*4.0*M_PI*(rn(
key.first)+rn(
key.second))*(aveD(
key.first)+aveD(
key.second))/
omega;
292 tempR2.push_back(tempR2_k);
293 const double maxCoeffLocal(std::max(std::abs(tempR2.back().maxCoeff()),std::abs(tempR2.back().minCoeff())));
295 if((tempR2.back()-tempR2.back().transpose()).norm()/maxCoeffLocal>FLT_EPSILON)
297 throw std::runtime_error(
"ClusterDynamicsParameters: R2_"+std::to_string(
k)+
" is not symmetric.");
299 maxCoeff=std::max(maxCoeff,maxCoeffLocal);
303 if(R2sum.norm()/maxCoeff>FLT_EPSILON)
315 Eigen::Array<double,1,
iSize/2>
temp(Eigen::Array<double,1,iSize/2>::Zero());
316 const Eigen::Matrix<double,dim,dim> lat(grains.begin()->second->latticeBasis);
321 temp(
k) = (localBurgers.col(
k)).norm();
324 std::cout<<
"immobileSpeciesBurgersMagnitude: "<<
temp<<std::endl;
332 std::map<size_t,std::vector<Eigen::Matrix<double,dim,dim>>>
temp;
334 for(
const auto& grainPair : grains)
336 auto grainIter(
temp.emplace(grainPair.first,std::vector<Eigen::Matrix<double,dim,dim>>()));
340 Eigen::Matrix<double,dim,dim> Dlocal;
349 const Eigen::Matrix<double,dim,dim> Dglobal(grainPair.second->C2G*Dlocal*grainPair.second->C2G.transpose());
350 grainIter.first->second.emplace_back(Dglobal);
352 if( fabs(Dglobal.eigenvalues().imag()(0)*Dglobal.eigenvalues().imag()(1)*Dglobal.eigenvalues().imag()(2)) > FLT_EPSILON)
354 throw std::runtime_error(
"Diffusion tensor does not have proper eigen values.");
356 std::cout<<
greenColor<<
" Diffusion coefficient for "<<
k<<
":\n"<<Dglobal<<std::endl;
367 std::vector<Eigen::Matrix<double,dim,dim>>
temp;
371 Eigen::Matrix<double,dim,dim> Dlocal;
376 temp.emplace_back(Dlocal);
385 std::map<size_t,std::vector<Eigen::Matrix<double,dim,dim>>>
temp;
386 for(
const auto& pair :
D)
388 auto mapIter(
temp.emplace(pair.first,std::vector<Eigen::Matrix<double,dim,dim>>()));
389 for(
const auto& d : pair.second)
391 mapIter.first->second.push_back(d.inverse());
400 std::map<size_t,Eigen::Array<double,mSize,1>>
temp;
401 for(
const auto& pair :
D)
403 auto mapIter(
temp.emplace(pair.first,Eigen::Array<double,mSize,1>()));
406 mapIter.first->second(
k)=pair.second[
k].determinant();
415 const Eigen::Array<double,1,
iSize/2> initDen = initloopSinks_SI.template block<1,
iSize/2>(0,0)*b_SI*b_SI*b_SI;
417 const Eigen::Array<double,1,
iSize/2> initRad = initloopSinks_SI.template block<1,
iSize/2>(0,
iSize/2);
419 Eigen::Array<double,1,iSize>
temp;
420 temp<< initDen,initRad;
447 const double bxtNorm2(bxt.squaredNorm());
448 if(bxtNorm2>FLT_EPSILON)
450 const double fc(fPK.dot(bxt));
455 return Eigen::Array<double,1,ClusterDynamicsParameters<dim>::mSize>::Zero();
468 return 1.0/(1.0+exp(-(n - n0)/
w));
475 return pow(n*
omega/sqrt(8),1.0/3.0);
486 Eigen::Array<double,1,ClusterDynamicsParameters<dim>::iSize/2>
ClusterDynamicsParameters<dim>::sigmoidalVectorInterpolation(
const Eigen::Array<double,1,iSize/2>& CI,
const Eigen::Array<double,1,iSize/2>&
N,
const Eigen::Array<double,1,iSize/2>& lowValue,
const Eigen::Array<double,1,iSize/2>& highValue)
const
488 const Eigen::Array<double,1,
iSize/2> n = CI/
N/
omega;
496 const Eigen::Array<double,1,
iSize/2> n = CI/
N/
omega;
504 const Eigen::Array<double,1,
iSize/2> n = CI/
N/
omega;
505 const Eigen::Array<double,1,
iSize/2> LoopS = 2.0*M_PI*
rloop(n)*
N;
506 const Eigen::Array<double,1,
iSize/2> PyrS =
a_bp*4.0*M_PI*
rpyr(n)*
N;
512 Eigen::Array<double,dim,dim>
ClusterDynamicsParameters<dim>::sigmoidalMatrixInterpolation(
const Eigen::Array<double,1,iSize/2>& CI,
const Eigen::Array<double,1,iSize/2>&
N,
const Eigen::Array<double,dim,dim>& lowValue,
const Eigen::Array<double,dim,dim>& highValue,
const int&
index)
const
514 const Eigen::Array<double,1,
iSize/2> n = CI/
N/
omega;
520 Eigen::Array<double,1,ClusterDynamicsParameters<dim>::iSize/2>
ClusterDynamicsParameters<dim>::sigmoidalPlotVectorInterpolation(
const Eigen::Array<double,1,iSize/2>& CI,
const Eigen::Array<double,1,iSize/2>&
N,
const Eigen::Array<double,1,iSize/2>& lowValue,
const Eigen::Array<double,1,iSize/2>& highValue)
const
522 const Eigen::Array<double,1,
iSize/2> n = CI/
N/
omega;
530 const Eigen::Array<double,1,
iSize/2> n = CI/
N/
omega;
the R vector(source to field) R
final point of the source segment t
static std::string redBoldColor
auto eval(const std::shared_ptr< T > &t)
double SplineSegment< dim, corder >::alpha
static std::string greenColor
static std::string defaultColor
const Eigen::Array< double, 1, mSize > otherSinks
Eigen::Array< double, 1, mSize > dislocationMobileConcentration(const VectorDim &b, const VectorDim &t, const VectorDim &fPK, const MatrixDim &stress) const
const Eigen::Array< double, 1, iSize/2 > nmax
static constexpr int mSize
const Eigen::Array< double, 1, iSize/2 > n_min
ClusterDynamicsParameters(const DefectiveCrystalBase< dim > &ddBase)
Eigen::Array< double, 1, iSize/2 > clusterRadius(const Eigen::Array< double, 1, iSize/2 > &CI, const Eigen::Array< double, 1, iSize/2 > &N) const
const Eigen::Array< double, 2, mSize > discreteDislocationBias
Eigen::Array< double, 1, iSize/2 > getImmobileSpeciesBurgersMagnitude(const GrainContainerType &grains) const
const double discretizationFactor
Eigen::Array< double, 1, mSize > equilibriumMobileConcentration(const double &stressTrace) const
const Eigen::Array< double, 1, iSize/2 > nmin
const std::vector< Eigen::Matrix< double, mSize, mSize > > R2
const Eigen::Array< double, 1, mSize > msRelRelaxVol
const std::map< std::pair< int, int >, double > reactionMap
const Eigen::Matrix< double, mSize, dim *(dim+1)/2 > msD0
Eigen::Matrix< double, dim, 1 > VectorDim
const Eigen::Matrix< double, mSize, 1 > G
const Eigen::Array< double, 1, iSize/2 > immobileSpeciesRelRelaxVol
Eigen::Array< double, 1, iSize/2 > sigmoid(const Eigen::Array< double, 1, iSize/2 > &n) const
std::map< size_t, std::vector< Eigen::Matrix< double, dim, dim > > > getInvD() const
std::map< std::pair< int, int >, double > getMap(const Eigen::Array< double, mSize *(mSize+1)/2, 3 > matrix_in) const
const Eigen::Matrix< double, mSize, mSize > R1
const std::map< size_t, std::vector< Eigen::Matrix< double, dim, dim > > > D
Eigen::Matrix< double, dim, dim > MatrixDim
const Eigen::Array< double, 1, mSize > Eb
const Eigen::Matrix< double, dim, iSize/2 > immobileSpeciesBurgers
Eigen::Array< double, 1, iSize > getInitLoopSinks(const Eigen::Array< double, 1, iSize > initloopSinks_SI, const double b_SI) const
Eigen::Array< double, 1, iSize/2 > rpyr(const Eigen::Array< double, 1, iSize/2 > &n) const
Polycrystal< dim >::GrainContainerType GrainContainerType
Eigen::Array< double, 1, iSize/2 > sigmoidalPlotVectorInterpolation(const Eigen::Array< double, 1, iSize/2 > &CI, const Eigen::Array< double, 1, iSize/2 > &N, const Eigen::Array< double, 1, iSize/2 > &lowValue, const Eigen::Array< double, 1, iSize/2 > &highValue) const
const Eigen::Array< double, 1, iSize/2 > dislocationSinks
Eigen::Matrix< double, mSize, mSize > getR1() const
const Eigen::Array< double, 1, mSize > msEf
const Eigen::Matrix< double, mSize, dim *(dim+1)/2 > msEm
static constexpr int iSize
const bool computeReactions
Eigen::Array< double, 1, mSize > boundaryMobileConcentration(const double &stressTrace, const double &normalTraction) const
std::map< size_t, Eigen::Array< double, mSize, 1 > > getDetD() const
const Eigen::Matrix< double, mSize, mSize > R1cd
const std::map< size_t, std::vector< Eigen::Matrix< double, dim, dim > > > invD
Eigen::Array< double, 1, iSize/2 > clusterDensity(const Eigen::Array< double, 1, iSize/2 > &CI, const Eigen::Array< double, 1, iSize/2 > &N) const
const double msSurvivingEfficiency
const double minimumLoopSize
Eigen::Array< double, dim, dim > sigmoidalMatrixInterpolation(const Eigen::Array< double, 1, iSize/2 > &CI, const Eigen::Array< double, 1, iSize/2 > &N, const Eigen::Array< double, dim, dim > &lowValue, const Eigen::Array< double, dim, dim > &highValue, const int &index) const
const double discretizationTime
const std::map< size_t, Eigen::Array< double, mSize, 1 > > detD
std::vector< Eigen::Matrix< double, dim, dim > > getDlocal() const
const Eigen::Array< double, 1, iSize/2 > immobileSpeciesVector
Eigen::Array< double, 1, iSize/2 > rloop(const Eigen::Array< double, 1, iSize/2 > &n) const
const Eigen::Array< double, 1, mSize > msVector
const Eigen::Array< double, 1, iSize/2 > immobileBias
std::vector< Eigen::Matrix< double, mSize, mSize > > getR2() const
Eigen::Array< double, 1, iSize/2 > clusterPlotRadius(const Eigen::Array< double, 1, iSize/2 > &CI, const Eigen::Array< double, 1, iSize/2 > &N) const
const Eigen::Matrix< double, 1, mSize > msCascadeFractions
std::map< size_t, std::vector< Eigen::Matrix< double, dim, dim > > > getD(const GrainContainerType &grains) const
Eigen::Array< double, 1, iSize/2 > sigmoidalVectorInterpolation(const Eigen::Array< double, 1, iSize/2 > &CI, const Eigen::Array< double, 1, iSize/2 > &N, const Eigen::Array< double, 1, iSize/2 > &lowValue, const Eigen::Array< double, 1, iSize/2 > &highValue) const
const Eigen::Array< double, 1, iSize > initLoopSinks
const Eigen::Array< double, 1, iSize/2 > immobileSpeciesBurgersMagnitude
Eigen::MatrixXd matrix(const Form &form)