Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
DissociateSegment.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_DissociateSegment_H
10#define model_DissociateSegment_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 <DislocationSharedObjects.h>
23#include <GrainBoundary.h>
24#include <Grain.h>
25#include <Material.h>
26#include <LatticeModule.h>
27
28
29namespace model
30{
31
32 template <typename DislocationSegmentType>
34 {
35
36 static constexpr int dim=DislocationSegmentType::dim;
37 static constexpr double dissociateDistance=5.0;
38
39 typedef typename DislocationSegmentType::VectorDim VectorDim;
41
42 const size_t sourceID;
43 const size_t sinkID;
49
50 /**********************************************************************/
51 DissociateSegment(const DislocationSegmentType& ds) :
52 /* init list */ sourceID(ds.source->sID),
53 /* init list */ sinkID(ds.sink->sID),
54 /* init list */ grain(ds.grain),
55 /* init list */ isValidDissociation(false),
56 /* init list */ dissociateMidpoint(ds.source->get_L()),
57 /* init list */ dissociateBurgers(ds.flow),
58 /* init list */ residualBurgers(dissociateBurgers)
59 {
60
61 assert(ds.grainBoundarySet.size() && "grainBoundarySet has zero size.");
62
63 const VectorDim chord(ds.sink->get_P()-ds.source->get_P());
64 // const double chorNorm=chord.norm();
65
66 std::map<double,std::pair<LatticeVectorType,const GrainBoundary<dim>* const>> primitiveMap;
67
68
69 for(const auto& gb : ds.grainBoundarySet)
70 {
71 const std::pair<LatticeVectorType,LatticeVectorType>& primitiveVectors(gb->latticePlane(ds.grain.grainID).n.primitiveVectors);
72
73 primitiveMap.emplace(ds.Burgers.dot(primitiveVectors.first.cartesian())+primitiveVectors.first.cartesian().squaredNorm(),std::make_pair(primitiveVectors.first,gb));
74 primitiveMap.emplace(ds.Burgers.dot(-primitiveVectors.first.cartesian())+primitiveVectors.first.cartesian().squaredNorm(),std::make_pair(primitiveVectors.first*-1,gb));
75 primitiveMap.emplace(ds.Burgers.dot(primitiveVectors.second.cartesian())+primitiveVectors.second.cartesian().squaredNorm(),std::make_pair(primitiveVectors.second,gb));
76 primitiveMap.emplace(ds.Burgers.dot(-primitiveVectors.second.cartesian())+primitiveVectors.second.cartesian().squaredNorm(),std::make_pair(primitiveVectors.second*-1,gb));
77
78 }
79
80
81 dissociateBurgers=primitiveMap.begin()->second.first;
83
84
85 if(primitiveMap.begin()->first<0.0 && residualBurgers.squaredNorm()>0)
86 {
88 VectorDim dir=chord.cross(primitiveMap.begin()->second.second->latticePlane(ds.grain.grainID).n.cartesian()).normalized();
89 const VectorDim pkForce=(ds.midPointStress()*dissociateBurgers.cartesian()).cross(-chord);
90 if(dir.dot(pkForce)<0.0)
91 {
92 dir*=-1.0;
93 }
94 dissociateMidpoint=primitiveMap.begin()->second.second->latticePlane(ds.grain.grainID).snapToLattice(0.5*(ds.source->get_P()+ds.sink->get_P())+dir*dissociateDistance);
95 }
96
97 }
98
99 };
100
101} // namespace model
102#endif
103
104
105
static constexpr int dim
LatticeVectorType dissociateMidpoint
static constexpr double dissociateDistance
DissociateSegment(const DislocationSegmentType &ds)
LatticeVector< DislocationSegmentType::dim > LatticeVectorType
DislocationSegmentType::VectorDim VectorDim
LatticeVectorType residualBurgers
LatticeVectorType dissociateBurgers
const Grain< dim > & grain