Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
StressStraight.cpp
Go to the documentation of this file.
1/* This file is part of MoDELib, the Mechanics Of Defects Evolution Library.
2 *
3 *
4 * MoDELib is distributed without any warranty under the
5 * GNU General Public License (GPL) v2 <http://www.gnu.org/licenses/>.
6 */
7
8#ifndef model_StressStraight_cpp_
9#define model_StressStraight_cpp_
10
11#ifndef _MODEL_NON_SINGULAR_DD_
12#define _MODEL_NON_SINGULAR_DD_ 1
13#endif
14
15#include <cfloat>
17
18namespace model
19{
20
21 template <int dim,typename Scalar>
22 typename StressStraight<dim,Scalar>::MatrixDim StressStraight<dim,Scalar>::nonSymmStress_kernel(const VectorDim& r) const
23 {
24 #if _MODEL_NON_SINGULAR_DD_ == 0
25 /* Devincre, B., & Condat, M. (1992). Model validation of a 3D
26 * simulation of dislocation dynamics: Discretization and line tension
27 * effects. Acta Metallurgica Et Materialia, 40(10), 2629–2637.
28 */
29
30 static_assert(0,"THERE IS NO CONSISTENT REGULARIZATION OF THIS EXPRESSION. USE _MODEL_NON_SINGULAR_DD_=1");
31
32 // const Scalar L(r.dot(t));
33 // const Scalar R(r.norm()+DislocationFieldBase<dim>::a);
34 // const VectorDim rho(r-L*t); // distance vector to the line
35 // const VectorDim Y((L+R)*t+rho); // = R*t + r
36 // // Y2=R^2+R^2+2R*(r*t)=2R*(R+L)
42 //
43 //
45 // const Scalar f1(1.0/(R*(R+L))); // =2/Y2=2/(2R*(R+L))
46 //
48 //// const Scalar f1(2.0/Y2);
49 // const Scalar f2(material.C1*f1);
50 // const Scalar bDotYcrosst(b.dot(Y.cross(t)));
51 // const Scalar f3(bDotYcrosst*f1*f1);
52 // const Scalar f4(0.5*f1*bDotYcrosst);
53 // const Scalar f5(f4*f1*L/R);
54 // // const Scalar f5(0.5*f3*L/R);
55 //
56 // return f2*b.cross(Y)*t.transpose()
57 // /* */ -f1*b.cross(t)*Y.transpose()
58 // /* */ -f3*rho*Y.transpose()
59 // /* */ -f4*(MatrixDim::Identity()+t*t.transpose())
60 // /* */ -f5*Y*Y.transpose();
61
62 // const Scalar R(r.norm());
63 const Scalar Ra(sqrt(r.squaredNorm()+DislocationFieldBase<dim>::a2));
64 const VectorDim Y(r+Ra*t);
65 const Scalar Yt(Y.dot(t));
66 // const Scalar Yta(Yt+DislocationFieldBase<dim>::a);
67 const Scalar Yta(sqrt(Yt*Yt+DislocationFieldBase<dim>::a2));
68 const Scalar Y2(Y.squaredNorm()+DislocationFieldBase<dim>::a2);
69 const Scalar bYt(b.cross(Y).dot(t));
70
71
72// const Scalar f1(2.0/Y2);
73// const Scalar f1(EwaldLength>FLT_EPSILON? 2.0*erfc(Ra/EwaldLength)/Y2 : 2.0/Y2);
74 const Scalar f1(EwaldLength>FLT_EPSILON? 2.0*erfc(Y2/EwaldLength/EwaldLength)/Y2 : 2.0/Y2);
75
76
77 return f1*material.C1*t*(b.cross(Y)).transpose()
78 /* */-f1*Y*bCt.transpose()
79 /* */-f1*bYt/Yta*t*r.transpose()
80 /* */-0.5*f1*bYt*MatrixDim::Identity()
81 /* */-f1*bYt*(R+Yt)/Ra/Y2*r*r.transpose()
82 /* */-0.5*f1*bYt*R/Yta*t*t.transpose();
83
84
85 #elif _MODEL_NON_SINGULAR_DD_ == 1 /* Cai's non-singular theory */
86
87 // const double Ra2=r.squaredNorm()+DislocationFieldBase<dim>::a2;
88 // const double Ra=sqrt(Ra2);
89 // const double Ra3=std::pow(Ra,3);
90 // const double rdt=r.dot(t);
91 // const double rdt2=std::pow(rdt,2);
92 // const double A1=-(rdt*(3.0*Ra2-rdt2))/(std::pow(Ra2-rdt2,2)*Ra3);
93 // const double A2=1.0/Ra3-rdt*A1;
94 // const double A6=-rdt/((Ra2-rdt2)*Ra);
95 // const double A3=-rdt/Ra3+A6+rdt2*A1;
96 // const double A4=A6+DislocationFieldBase<dim>::a2*A1;
97 // const double A5=-material.C1*A6-0.5*DislocationFieldBase<dim>::a2*material.C1*A1;
98 // const double A7=material.nu/Ra-rdt*A6-0.5*DislocationFieldBase<dim>::a2*material.C1*A2;
99 //
100 // const double rbt(r.cross(b).dot(t));
101 //
102 // return 0.5*rbt*A1*r*r.transpose()
103 // /* */ + rbt*A2*t*r.transpose()
104 // /* */ +0.5*rbt*A3*t*t.transpose()
105 // /* */ +0.5*rbt*A4*MatrixDim::Identity()
106 // /* */ +A5*r.cross(b)*t.transpose()
107 // /* */ +A6*t.cross(b)*r.transpose()
108 // /* */ +A7*t.cross(b)*t.transpose();
109
110 const Scalar Ra2=r.squaredNorm()+DislocationFieldBase<dim>::a2;
111 const Scalar Ra(sqrt(Ra2));
112 const VectorDim Ya(r+Ra*t);
113 const Scalar Yat(Ya.dot(t));
114 const Scalar Ya2a2(Ya.squaredNorm()+DislocationFieldBase<dim>::a2);
115 const VectorDim bYa(b.cross(Ya));
116 const Scalar bYat(bYa.dot(t));
117
118
119// const Scalar f1(2.0/Ya2a2);
120// const Scalar f1(EwaldLength>FLT_EPSILON? 2.0*erfc(Ra/EwaldLength)/Ya2a2 : 2.0/Ya2a2);
121 const Scalar f1(EwaldLength>FLT_EPSILON? 2.0*erfc(Ya2a2/EwaldLength/EwaldLength)/Ya2a2 : 2.0/Ya2a2);
122
123
124 return f1*material.C1*(1.0+DislocationFieldBase<dim>::a2/Ya2a2)*t*bYa.transpose()
125 /* */+f1*material.C1*0.5*DislocationFieldBase<dim>::a2/Ra2*t*b.cross(r).transpose()
126 /* */-f1*Ya*bCt.transpose()
127 /* */-f1*bYat/Yat*t*r.transpose()
128 /* */-0.5*f1*bYat*(1.0+2.0*DislocationFieldBase<dim>::a2/Ya2a2+DislocationFieldBase<dim>::a2/Ra2)*MatrixDim::Identity()
129 /* */-f1*bYat*(Ra+Yat)/Ra/Ya2a2*r*r.transpose()
130 /* */-0.5*f1*bYat*Ra/Yat*t*t.transpose();
131
132 #elif _MODEL_NON_SINGULAR_DD_ == 2 /* Lazar's non-singular theory */
133 static_assert(0,"NOT IMPLEMENTED. USE _MODEL_NON_SINGULAR_DD_=1");
134 #else
135 #error Unsupported choice of field regularization
136 #endif
137 }
138
139 template <int dim,typename Scalar>
140 typename StressStraight<dim,Scalar>::VectorDim StressStraight<dim,Scalar>::displacement_kernel(const VectorDim& r) const
141 {
142 const Scalar Ra(sqrt(r.squaredNorm()+DislocationFieldBase<dim>::a2));
143 const VectorDim Ya(r+Ra*t);
144 const Scalar Yat(Ya.dot(t));
145 return -(2.0-0.5/material.C1+(2.0-1.0/material.C1)*log(Yat)-DislocationFieldBase<dim>::a2/Ra/Yat)/8.0/M_PI*bCt
146 /* */ +bCt.dot(r)/Yat/Ra/material.C1/8.0/M_PI*Ya;
147 }
148
149 template <int dim,typename Scalar>
151 const double& EwaldLength_in) :
152 /* init list */ material(material_in),
153 /* init list */ P0(_P0),
154 /* init list */ P1(_P1),
155 /* init list */ b(_b),
156 /* init list */ chord(P1-P0),
157 /* init list */ length(chord.norm()),
158 /* init list */ t(chord/length),
159 /* init */ EwaldLength(EwaldLength_in),
160 /* init list */ bCt(b.cross(t))
161 {
165
166 }
167
168 template <int dim,typename Scalar>
170 {
171 return length>FLT_EPSILON? nonSymmStress_kernel(P1-x)-nonSymmStress_kernel(P0-x) : MatrixDim::Zero().eval();
172 }
173
174 template <int dim,typename Scalar>
176 {
177 const MatrixDim temp = nonSymmStress(x);
178 return material.C2*(temp+temp.transpose());
179 }
180
181 template <int dim,typename Scalar>
183 {
186 return displacement_kernel(P1-x)-displacement_kernel(P0-x);
187 }
188
189// template <int dim,typename Scalar>
190// typename StressStraight<dim,Scalar>::ConcentrationMatrixType StressStraight<dim,Scalar>::concentrationMatrices(const VectorDim& x, const size_t& grainID, const VectorDim& sourceDir, const VectorDim& sinkDir, const ClusterDynamicsParameters<dim>& icp) const
191// {
192// const auto& Dinv(icp.invD.at(grainID));
193// const auto& Ddet(icp.detD.at(grainID));
194// ConcentrationMatrixType M(ConcentrationMatrixType::Zero());
195// if(length>FLT_EPSILON)
196// {
197// Eigen::Array<double,mSize,1> a(Eigen::Array<double,mSize,1>::Zero());
198// Eigen::Array<double,mSize,1> b(Eigen::Array<double,mSize,1>::Zero());
199// Eigen::Array<double,mSize,1> c(Eigen::Array<double,mSize,1>::Zero());
200// for(size_t k=0; k<mSize; k++)
201// {
202// a(k) = chord.dot( Dinv[k]*chord );
203// b(k) =-2.0*(x-P0).dot( Dinv[k]*chord );
204// c(k) = (x-P0).dot( Dinv[k]*(x-P0) )+ DislocationFieldBase<dim>::a2/pow(Ddet(k),1.0/3.0);
205// }
206// const Eigen::Array<double,mSize,1> ba(b/a);
207// const Eigen::Array<double,mSize,1> ca(c/a);
208// const Eigen::Array<double,mSize,1> sqbca(sqrt(1.0+ba+ca));
209// const Eigen::Array<double,mSize,1> sqca(sqrt(ca));
210// const Eigen::Array<double,mSize,1> logTerm(log((2.0*sqbca+2.0+ba)/(2.0*sqca+ba)));
211// const double bxtSource(bCt.dot(sourceDir));
212// const double bxtSink (bCt.dot(sinkDir));
213// const Eigen::Array<double,mSize,1> I0((1.0+0.5*ba)*logTerm-sqbca+sqca);
214// const Eigen::Array<double,mSize,1> I1( -0.5*ba*logTerm+sqbca-sqca);
215// M.col(0)=bxtSource*length/(4.0*M_PI)*(I0/sqrt(a*Ddet)).matrix();
216// M.col(1)=bxtSink* length/(4.0*M_PI)*(I1/sqrt(a*Ddet)).matrix();
217// }
218// return M;
219// }
220//
221// template <int dim,typename Scalar>
222// typename StressStraight<dim,Scalar>::ConcentrationVectorType StressStraight<dim,Scalar>::clusterConcentration(const VectorDim& x, const size_t& grainID, const VectorDim& sourceDir, const Eigen::Array<double,1,mSize>& sourceVScalar, const VectorDim& sinkDir, const Eigen::Array<double,1,mSize>& sinkVScalar, const ClusterDynamicsParameters<dim>& icp) const
223// {
224// ConcentrationVectorType temp(ConcentrationVectorType::Zero());
225// const ConcentrationMatrixType cM(concentrationMatrices(x, grainID, sourceDir, sinkDir, icp));
226// for(int k=0; k<mSize; k++)
227// {
228// temp(k)=cM.row(k)*(Eigen::Matrix<double,2,1>()<<sourceVScalar(k),sinkVScalar(k)).finished();
229// }
230// return temp;
231// }
232
233 template class StressStraight<3,double>;
234
235}
236#endif
237
Eigen::Matrix< Scalar, dim, dim > MatrixDim
MatrixDim stress(const VectorDim &x) const
VectorDim displacement(const VectorDim &x) const
StressStraight(const PolycrystallineMaterialBase &material_in, const VectorDim &_P0, const VectorDim &_P1, const VectorDim &_b, const double &EwaldLength_in)
MatrixDim nonSymmStress(const VectorDim &x) const
const PolycrystallineMaterialBase & material
const VectorDim chord
Eigen::Matrix< double, dim, 1 > VectorDim
final point of the source segment t
x
Definition int_R.m:12
static double a2
Dislocation core size squared.
vertex temp