Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
TransmitSegment.h
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
9#ifndef model_TRANSMITSEGMENT_H
10#define model_TRANSMITSEGMENT_H
11
12#include <math.h> // isfinite
13#include <float.h>
14#include <list>
15#include <stdlib.h> // rand()
16#include <ctime>
17#include <time.h>
18#include <iterator>
19#include <vector>
20#include <set>
21#include <map>
22#include <memory> // unique_ptr
23#include <tuple>
24#include <DislocationSharedObjects.h>
25#include <GrainBoundary.h>
26#include <Grain.h>
27#include <Material.h>
28#include <LatticeModule.h>
29
30
31namespace model
32{
33
34 template <typename DislocationSegmentType>
36 {
37
38 static constexpr int dim=DislocationSegmentType::dim;
39 typedef typename DislocationSegmentType::VectorDim VectorDim;
41 typedef typename DislocationSegmentType::NodeType NodeType;
42 typedef std::map<double,std::pair<SlipSystem,const GrainBoundary<dim>* const>> MapType;
43
44// DislocationSharedObjects<dim> shared;
45 const size_t sourceID;
46 const size_t sinkID;
52 std::unique_ptr<LatticeVectorType> transmitBurgers;
53 std::unique_ptr<LatticeVectorType> transmitMidpoint;
54
55// std::unique_ptr<LatticeVectorType> residualBurgers;
56
57 /**********************************************************************/
58 TransmitSegment(const DislocationSegmentType& ds) :
59 /* init list */ sourceID(ds.source->sID),
60 /* init list */ sinkID(ds.sink->sID),
61 /* init list */ originalBurgers(ds.flow),
62// /* init list */ grain(ds.grain),
63 /* init list */ isValidTransmission(false),
64 /* init list */ transmitSourceP(ds.source->get_P()),
65 /* init list */ transmitSinkP(ds.sink->get_P())
66// /* init list */ transmitMidpoint(ds.source->get_L())
67// /* init list */ transmitBurgers(ds.flow),
68// /* init list */ residualBurgers(transmitBurgers)
69 {
70
71 const double alpha=0.5;
72 const VectorDim& b1=ds.Burgers;
73
74 const VectorDim chord(ds.sink->get_P()-ds.source->get_P());
75 // const double chorNorm=chord.norm();
76
77 MapType slipSystemMap;
78
79 // Nucleation into other grains
80 for(const auto& gb : ds.grainBoundarySet)
81 {
82
83 //const size_t otherGrainID=(gb->grainBndID.first==ds.grain.grainID)? gb->grainBndID.second : gb->grainBndID.first;
84 std::deque<int> gbIDdeq;
85 gbIDdeq.push_back(gb->grainBndID.first);
86 gbIDdeq.push_back(gb->grainBndID.second);
87
88 for(const int& otherGrainID : gbIDdeq)
89 {
90 for(const auto& slipSystem : gb->grain(otherGrainID).slipSystems())
91 {
92 // const std::pair<LatticeVectorType,LatticeVectorType>& primitiveVectors(gb->latticePlane(ds.grain.grainID).n.primitiveVectors);
93 if(fabs(slipSystem.n.cartesian().dot(chord))<FLT_EPSILON) // slip system contains chord
94 {
95 const VectorDim pkForce=(ds.midPointStress()*slipSystem.s.cartesian()).cross(-chord.normalized());
96
97 if(pkForce.dot(gb->latticePlane(otherGrainID).unitNormal)<0.0) // PK force points inside the grain
98 {
99 const VectorDim b2=slipSystem.s.cartesian();
100
101 const double theta=acos(gb->rotationAxis().normalized().dot(chord.normalized()));
102
103 assert(theta>FLT_EPSILON && "PARALLEL DISLOCATION AND GB-DISLOCATION");
104
105 const double R=0.5*(gb->grainBoundaryType().dislocationSpacing/sin(theta));
106
107 const double tau2= (pkForce-pkForce.dot(slipSystem.n.cartesian())*slipSystem.n.cartesian()).norm();
108
109
110 const double deltaE = alpha*(2.0*R*(b1+b2).squaredNorm()+M_PI*R*b2.squaredNorm()-2.0*R*b1.squaredNorm()); // elastic energy change using line tension
111 const double deltaEgb=0.0;
112 const double work = tau2*0.5*M_PI*R*R*b2.norm(); // work done in loop expansion
113
114 std::cout<<"deltaE="<<deltaE<<std::endl;
115 std::cout<<"work="<<work<<std::endl;
116
117
118 slipSystemMap.emplace(deltaE+deltaEgb-work,std::make_pair(slipSystem,gb));
119 }
120 }
121 }
122 }
123 }
124
125 if(slipSystemMap.size())
126 {
127 if(slipSystemMap.begin()->first<0.0)
128// if(true)
129 {
130 const GrainBoundary<dim>* const gb=slipSystemMap.begin()->second.second;
131 const size_t otherGrainID=(gb->grainBndID.first==ds.grain.grainID)? gb->grainBndID.second : gb->grainBndID.first;
133 transmitGrain=&(gb->grain(otherGrainID));
134 transmitBurgers.reset(new LatticeVectorType(slipSystemMap.begin()->second.first.s));
135 transmitSourceP=gb->latticePlane(otherGrainID).snapToLattice(transmitSourceP).cartesian();
136 transmitSinkP=gb->latticePlane(otherGrainID).snapToLattice(transmitSinkP).cartesian();
137
138 LatticeVectorType P1(transmitGrain->snapToLattice(ds.source->get_P()));
139// std::cout<<"Here 0.25"<<std::endl;
140// std::cout<<"ds.source->get_P()="<<std::setprecision(15)<<std::scientific<<ds.source->get_P().transpose()<<std::endl;
141// std::cout<<"P1="<<std::setprecision(15)<<std::scientific<<P1.cartesian().transpose()<<std::endl;
142
143// LatticeVectorType P2(ds.source->get_P(),transmitGrain->covBasis(),transmitGrain->contraBasis());
144// std::cout<<"Here 0.5"<<std::endl;
145
146 LatticePlane snapPlane(P1,(slipSystemMap.begin()->second).first.n);
147
148
149
150 VectorDim midD=0.5*(transmitSourceP+transmitSinkP)-chord.cross(slipSystemMap.begin()->second.first.n.cartesian()).normalized()*10.0;
151 auto temp=DislocationSharedObjects<dim>::mesh.searchWithGuess(midD,ds.source->includingSimplex());
152
153 if(temp.second->region->regionID!=otherGrainID)
154 {
155 midD=0.5*(transmitSourceP+transmitSinkP)+chord.cross(slipSystemMap.begin()->second.first.n.cartesian()).normalized()*10.0;
156 }
157
158 temp=DislocationSharedObjects<dim>::mesh.searchWithGuess(midD,ds.source->includingSimplex());
159 assert(temp.first);
160
161 transmitMidpoint.reset(new LatticeVectorType(snapPlane.snapToLattice(midD)));
162
163 transmitSourceP=transmitGrain->snapToLattice(transmitSourceP).cartesian();
164 transmitSinkP=transmitGrain->snapToLattice(transmitSinkP).cartesian();
165
166 }
167
168
169 }
170
171 }
172
173 };
174
175} // namespace model
176#endif
177
178
179
const std::pair< int, int > & grainBndID
const Grain< dim > & grain(const size_t &k) const
double SplineSegment< dim, corder >::alpha
DislocationSegmentType::NodeType NodeType
const Grain< dim > * transmitGrain
TransmitSegment(const DislocationSegmentType &ds)
LatticeVector< DislocationSegmentType::dim > LatticeVectorType
std::map< double, std::pair< SlipSystem, const GrainBoundary< dim > *const > > MapType
std::unique_ptr< LatticeVectorType > transmitBurgers
DislocationSegmentType::VectorDim VectorDim
const LatticeVectorType originalBurgers
static constexpr int dim
std::unique_ptr< LatticeVectorType > transmitMidpoint
vertex temp