130 void VTKsegments::writeVTK(
const std::string& vtkFilePrefix,std::map<std::pair<int,int>,std::pair<
size_t,std::set<int>>> &segIDmap)
const
132 const std::string quadFileName(vtkFilePrefix+
"_quadrature.vtk");
133 std::ofstream quadFile(quadFileName);
134 quadFile<<
"# vtk DataFile Version 3.0\n";
135 quadFile<<
"# Dislocation lines converted from MoDELib file\n";
137 quadFile<<
"DATASET UNSTRUCTURED_GRID\n";
140 for(
const auto& node :
nodes())
142 quadFile<<std::setprecision(15)<<std::scientific<<node.transpose()*
material.b_SI*1.0e10<<
"\n";
147 quadFile<<std::setprecision(15)<<std::scientific<<qp.r.transpose()*
material.b_SI*1.0e10<<
"\n";
151 std::map<std::pair<size_t,size_t>,std::set<size_t>> qPointMap;
155 const std::pair<size_t,size_t>
key(std::make_pair(qp.sourceID,qp.sinkID));
156 qPointMap[
key].insert(
q);
159 if(qPointMap.size()!=
segments().size())
161 std::cout<<
"qPointMap.size()="<<qPointMap.size()<<std::endl;
162 std::cout<<
"segments().size()="<<
segments().size()<<std::endl;
163 throw std::runtime_error(
"qPointMap.size()!=segments().size()");
166 quadFile<<
"\nCELLS "+std::to_string(qPointMap.size())+
" "+std::to_string(
quadraturePoints().size()+3*qPointMap.size())+
"\n";
167 for(
const auto& pair : qPointMap)
169 quadFile<<pair.second.size()+2<<
" "<<pair.first.first<<
" ";
170 for(
const auto&
q : pair.second)
172 quadFile<<
q+
nodes().size()<<
" ";
174 quadFile<<pair.first.second<<
"\n";
177 quadFile <<
"\nCELL_TYPES " + std::to_string(
segments().size()) +
"\n";
178 for (
const auto &pair : qPointMap)
180 quadFile << 4 <<
"\n";
183 quadFile <<
"VECTORS PK_force double\n";
184 for (
const auto &node :
nodes())
186 quadFile << std::setprecision(15) << std::scientific << Eigen::Matrix<double, 1, 3>::Zero() <<
"\n";
188 for (
const auto &outerPair : qPointMap)
190 for (
const auto &innerPair : outerPair.second)
193 quadFile << std::setprecision(15) << std::scientific << qp.pkForce.transpose() *
material.b_SI *
material.mu_SI * 10.0 / 160.21766208 <<
"\n";
197 quadFile <<
"\nTENSORS stress double\n";
199 for (
const auto &node :
nodes())
201 quadFile << std::setprecision(15) << Eigen::Matrix<double, 3, 3>::Zero() <<
"\n\n";
204 for (
const auto &outerPair : qPointMap)
206 for (
const auto &innerPair : outerPair.second)
209 quadFile << std::setprecision(15) << std::scientific << qp.stress *
material.mu_SI * 1
e-9 <<
"\n\n";
212 quadFile <<
"\nCELL_DATA " + std::to_string(qPointMap.size()) +
"\n";
213 quadFile <<
"SCALARS dislocation_index int\n";
214 quadFile <<
"LOOKUP_TABLE default\n";
215 for (
size_t k = 0;
k < qPointMap.size(); ++
k)
217 quadFile <<
k <<
"\n";
220 quadFile <<
"\nVECTORS burgers_vector_global double\n";
222 for (
const auto &pair : segIDmap)
225 const auto segID = pair.first;
226 const auto &seg(
segments().at(segID));
227 std::cout<<
"SegID: "<<segID.first<<
"-> "<<segID.second <<
"-> seg.b: "<<seg.b.transpose() *
material.b_SI * 1.0e10<<std::endl;
228 quadFile << seg.b.transpose() *
material.b_SI * 1.0e10 <<
"\n";
231 quadFile <<
"\nVECTORS burgers_vector_local double\n";
232 const auto G2C(
C2G.inverse());
233 std::cout<<
"C2G: "<<
C2G<<std::endl;
234 std::cout<<
"G2C: "<<G2C<<std::endl;
236 for (
const auto &pair : segIDmap)
239 const auto segID = pair.first;
240 const auto &seg(
segments().at(segID));
331 void VTKsegments::updateQuadraturePoints(
const std::string& vtkFilePrefix,
MatrixDim externalStress, std::map<std::pair<int,int>,std::pair<
size_t,std::set<int>>> &segIDmap )
389 const std::string vtkFileName(vtkFilePrefix+
".vtk");
390 std::ifstream vtkFile(vtkFileName);
391 std::map<std::pair<int,int>, std::pair<size_t,std::set<int>>> segIDmap;
394 readCAFile(vtkFilePrefix);
396 if(vtkFile.is_open())
399 std::vector<std::vector<size_t>> cells;
400 std::vector<VectorDim> rawBurgers;
404 std::vector<VectorDim> nAVector;
408 while (std::getline(vtkFile, line))
410 if(line.find(
"POINTS")!=std::string::npos)
412 const size_t firstSpace(line.find(
' '));
413 const size_t secondSpace(line.find(
' ',firstSpace+1));
415 if(secondSpace>firstSpace)
417 const size_t nodesSize(std::atoi(line.substr(firstSpace+1,secondSpace-firstSpace-1).c_str()));
419 std::cout<<
"Reading "<<nodesSize<<
" nodes"<<std::endl;
423 for(
size_t n=0;n<nodesSize;++n)
425 std::getline(vtkFile, line);
426 std::stringstream
ss(line);
433 throw std::runtime_error(
"Unable to extract number of nodes from line: "+line);
437 if(line.find(
"CELLS")!=std::string::npos)
439 const size_t firstSpace(line.find(
' '));
440 const size_t secondSpace(line.find(
' ',firstSpace+1));
442 if(secondSpace>firstSpace)
445 loopsSize=std::atoi(line.substr(firstSpace+1,secondSpace-firstSpace-1).c_str());
447 std::cout<<
"Reading "<<loopsSize<<
" cells"<<std::endl;
449 for(
int n=0;n<loopsSize;++n)
451 std::getline(vtkFile, line);
452 std::stringstream
ss(line);
453 cells.emplace_back();
464 cells.back().push_back(
temp);
470 throw std::runtime_error(
"Unable to extract number of loops from line: "+line);
475 if(line.find(
"burgers_vector_world")!=std::string::npos)
479 for(
int n=0;n<loopsSize;++n)
481 std::getline(vtkFile, line);
482 std::stringstream
ss(line);
489 if(rawBurgers.size()==cells.size())
492 for (
size_t k = 0;
k < cells.size(); ++
k)
494 const auto Burgers(rawBurgers[
k]);
495 VectorDim nA(VectorDim::Zero());
496 const VectorDim P0(
nodes()[0]);
499 for(
int n=0;n<cells[
k].size();++n)
501 const int n1(n<cells[
k].size()-1? n+1 : 0);
505 const size_t sourceID(cells[
k][n]);
506 const size_t sinkID(cells[
k][n1]);
507 const VectorDim &sourceP(
nodes()[sourceID]);
508 const VectorDim &sinkP(
nodes()[sinkID]);
511 const double linkNorm((sinkP-sourceP).norm());
514 nA+=0.5*(sourceP-P0).cross(sinkP-sourceP);
517 nAVector.push_back(nA.normalized());
519 for (
size_t n = 0; n < cells[
k].size() - 1; ++n)
521 const size_t sourceID(cells[
k][n]);
522 const size_t sinkID(cells[
k][n + 1]);
527 const VectorDim &sourceP(
nodes()[sourceID]);
528 const VectorDim &sinkP(
nodes()[sinkID]);
529 const std::pair<int,int> sourceSink=std::make_pair(sourceID,sinkID);
557 segIDmap[std::make_pair(sourceID,sinkID)].first=
k;
565 const VectorDim &sourceP(
nodes()[sinkID]);
566 const VectorDim &sinkP(
nodes()[sourceID]);
567 const std::pair<int,int> sourceSink=std::make_pair(sinkID,sourceID);
585 segIDmap[std::make_pair(sinkID,sourceID)].first=
k;
597 const double chordLength(seg.second.length);
598 const int sourceID=seg.first.first;
599 const int sinkID=seg.first.second;
600 const VectorDim sourceP=seg.second.P0;
601 const VectorDim sinkP=seg.second.P1;
602 const int qOrder = QuadratureDynamicType::lowerOrder(
quadPerLength * chordLength);
603 const MatrixNcoeffDim dofs((MatrixNcoeffDim() << sourceP.transpose(), sinkP.transpose()).finished());
605 for (
int q = 0;
q < qOrder; ++
q)
611 segIDmap[std::make_pair(sourceID,sinkID)].second.insert(
quadraturePoints().size() - 1);
616 std::cout <<
"segments().size()=" <<
segments().size() << std::endl;
617 std::cout <<
"quadraturePoints().size()=" <<
quadraturePoints().size() << std::endl;
621 std::cout <<
"rawBurgers.size()=" << rawBurgers.size() << std::endl;
622 std::cout <<
"cells.size()=" << cells.size() << std::endl;
623 throw std::runtime_error(
"rawBurgers.size() NOT EQUAL TO cells.size()");
629 std::cout<<
"Cannot open "<<vtkFileName<<std::endl;