Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
DefectiveCrystalConfigIO.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_DefectiveCrystalConfigIO_cpp_
9#define model_DefectiveCrystalConfigIO_cpp_
10
11#include <type_traits>
12#include <vector>
13#include <map>
14#include <chrono>
15#include <iostream> // std::cout
16#include <fstream> // std::ifstream
17#include <cfloat> // std::ifstream
29
30//#include <DislocationNetwork.h>
31//#include <PeriodicLoopIO.h>
32
33#include <TerminalColors.h>
35
36
37namespace model
38{
39
40
41template <int dim>
43{
44
45 // node map
46 for(size_t k=0;k<loopNodes().size();++k)
47 {
48 loopNodeMap().insert(std::make_pair(loopNodes()[k].sID,k));
49 }
50
51 // node map
52 for(size_t k=0;k<nodes().size();++k)
53 {
54 nodeMap().emplace(nodes()[k].sID,k);
55 }
56
57 // loop map
58 for(size_t k=0;k<loops().size();++k)
59 {
60 loopMap().emplace(loops()[k].sID,k);
61 }
62}
63
64
65
66//template <int dim>
67//DefectiveCrystalConfigIO<dim>::DefectiveCrystalConfigIO(const std::string& folderName,const std::string& suffix) :
69//{
70//
71//}
72
73template <int dim>
75/* init */ DefectiveCrystalBaseIO(folderName,"evl")
76{
77}
78
79template <int dim>
81{
82 nodes().clear();
83 loops().clear();
84 loopLinks().clear();
85 loopNodes().clear();
86 sphericalInclusions().clear();
87 ellipsoidalInclusions().clear();
88 polyhedronInclusions().clear();
91 nodeMap().clear();
92 loopNodeMap().clear();
93 loopMap().clear();
94 displacementMatrix().setZero(0,2*dim);
96}
97
98
99template <int dim>
100const std::vector<DislocationNodeIO<dim>>& DefectiveCrystalConfigIO<dim>::nodes() const
101{
102 return *this;
103}
104
105template <int dim>
106std::vector<DislocationNodeIO<dim>>& DefectiveCrystalConfigIO<dim>::nodes()
107{
108 return *this;
109}
110
111template <int dim>
112const std::vector<DislocationLoopNodeIO<dim>>& DefectiveCrystalConfigIO<dim>::loopNodes() const
113{
114 return *this;
115}
116
117template <int dim>
118std::vector<DislocationLoopNodeIO<dim>>& DefectiveCrystalConfigIO<dim>::loopNodes()
119{
120 return *this;
121}
122
123template <int dim>
124const std::vector<DislocationLoopIO<dim>>& DefectiveCrystalConfigIO<dim>::loops() const
125{
126 return *this;
127}
128
129template <int dim>
130std::vector<DislocationLoopIO<dim>>& DefectiveCrystalConfigIO<dim>::loops()
131{
132 return *this;
133}
134
135template <int dim>
137{
138 const auto loopIter(loopMap().find(loopID));
139 if(loopIter!=loopMap().end())
140 {
141 return loops()[loopIter->second];
142 }
143 else
144 {
145 throw std::runtime_error("loopID not found");
146 return loops()[0];
147 }
148}
149
150template <int dim>
151const std::vector<DislocationLoopLinkIO<dim>>& DefectiveCrystalConfigIO<dim>::loopLinks() const
152{
153 return *this;
154}
155
156template <int dim>
157std::vector<DislocationLoopLinkIO<dim>>& DefectiveCrystalConfigIO<dim>::loopLinks()
158{
159 return *this;
160}
161
162template <int dim>
163const std::vector<SphericalInclusionIO<dim>>& DefectiveCrystalConfigIO<dim>::sphericalInclusions() const
164{
165 return *this;
166}
167
168template <int dim>
169std::vector<SphericalInclusionIO<dim>>& DefectiveCrystalConfigIO<dim>::sphericalInclusions()
170{
171 return *this;
172}
173
174template <int dim>
175const std::vector<EllipsoidalInclusionIO<dim>>& DefectiveCrystalConfigIO<dim>::ellipsoidalInclusions() const
176{
177 return *this;
178}
179
180template <int dim>
181std::vector<EllipsoidalInclusionIO<dim>>& DefectiveCrystalConfigIO<dim>::ellipsoidalInclusions()
182{
183 return *this;
184}
185
186template <int dim>
187const std::vector<PolyhedronInclusionIO<dim> >& DefectiveCrystalConfigIO<dim>::polyhedronInclusions() const
188{
189 return *this;
190}
191
192template <int dim>
193std::vector<PolyhedronInclusionIO<dim> >& DefectiveCrystalConfigIO<dim>::polyhedronInclusions()
194{
195 return *this;
196}
197
198
199template <int dim>
200const std::vector<PolyhedronInclusionNodeIO<dim> >& DefectiveCrystalConfigIO<dim>::polyhedronInclusionNodes() const
201{
202 return *this;
203}
204
205template <int dim>
206std::vector<PolyhedronInclusionNodeIO<dim> >& DefectiveCrystalConfigIO<dim>::polyhedronInclusionNodes()
207{
208 return *this;
209}
210
211
212template <int dim>
213const std::vector<PolyhedronInclusionEdgeIO>& DefectiveCrystalConfigIO<dim>::polyhedronInclusionEdges() const
214{
215 return *this;
216}
217
218
219template <int dim>
220std::vector<PolyhedronInclusionEdgeIO>& DefectiveCrystalConfigIO<dim>::polyhedronInclusionEdges()
221{
222 return *this;
223}
224
225
226
227
228template <int dim>
229const std::map<size_t,const size_t>& DefectiveCrystalConfigIO<dim>::nodeMap() const
230{
231 return _nodeMap;
232}
233
234template <int dim>
235std::map<size_t,const size_t>& DefectiveCrystalConfigIO<dim>::nodeMap()
236{
237 return _nodeMap;
238}
239
240template <int dim>
241const std::map<size_t,const size_t>& DefectiveCrystalConfigIO<dim>::loopNodeMap() const
242{
243 return _loopNodeMap;
244}
245
246template <int dim>
247std::map<size_t,const size_t>& DefectiveCrystalConfigIO<dim>::loopNodeMap()
248{
249 return _loopNodeMap;
250}
251
252template <int dim>
253const std::map<size_t, const size_t>& DefectiveCrystalConfigIO<dim>::loopMap() const
254{
255 return _loopMap;
256}
257
258template <int dim>
259std::map<size_t, const size_t>& DefectiveCrystalConfigIO<dim>::loopMap()
260{
261 return _loopMap;
262}
263
264template <int dim>
265const typename DefectiveCrystalConfigIO<dim>::CDMatrixType& DefectiveCrystalConfigIO<dim>::cdMatrix() const
266{
267 return _cdMatrix;
268}
269
270
271template <int dim>
272typename DefectiveCrystalConfigIO<dim>::CDMatrixType& DefectiveCrystalConfigIO<dim>::cdMatrix()
273{
274 return _cdMatrix;
275}
276
277template <int dim>
278const typename DefectiveCrystalConfigIO<dim>::DispMatrixType& DefectiveCrystalConfigIO<dim>::displacementMatrix() const
279{
280 return _dispMatrix;
281}
282
283template <int dim>
284typename DefectiveCrystalConfigIO<dim>::DispMatrixType& DefectiveCrystalConfigIO<dim>::displacementMatrix()
285{
286 return _dispMatrix;
287}
288
289
290
291
292 template <int dim>
294 {
295 std::map<std::pair<size_t,size_t>,DislocationSegmentIO<dim> > temp;
296
297 for(const auto& link : loopLinks())
298 {
299
300
301 const auto loopIter=loopMap().find(link.loopID);
302 assert(loopIter!=loopMap().end());
303
304 const auto loopSourceIter(loopNodeMap().find(link.sourceID));
305 assert(loopSourceIter!=loopNodeMap().end());
306
307 const auto loopSinkIter(loopNodeMap().find(link.sinkID));
308 assert(loopSinkIter!=loopNodeMap().end());
309
310
311 // const bool arePeriodicBoundaryNodes((loopSourceIter->second->P-loopSinkIter->second->P).norm()<FLT_EPSILON
312 // && loopSourceIter->second->edgeID>=0
313 // && loopSinkIter->second->edgeID>=0
314 // && loopSourceIter->second->loopID==loopSinkIter->second->loopID);
315
316 if(link.hasNetworkLink)
317 {
318 const auto& loopNodeSource(loopNodes()[loopSourceIter->second]);
319 const auto& loopNodeSink(loopNodes()[ loopSinkIter->second]);
320 const auto& loop(loops()[loopIter->second]);
321
322 const size_t sourceID(std::min(loopNodeSource.networkNodeID,loopNodeSink.networkNodeID));
323 const size_t sinkID(std::max(loopNodeSource.networkNodeID,loopNodeSink.networkNodeID));
324 const auto key=std::make_pair(sourceID,sinkID);
325
326 const auto insertPair=temp.insert(std::make_pair(key,DislocationSegmentIO<dim>(sourceID,sinkID)));
327 const auto& iter=insertPair.first;
328 const bool& success=insertPair.second;
329
330 // std::cout<<" Segment "<<sourceID<<"=>"<<sinkID;
331
332 if(success)
333 {
334 // std::cout<<" Adding link "<<link.sourceID<<"=>"<<link.sinkID<<" with normal "<<loopIter->second->N.transpose()<<"and burgres "<<loopIter->second->B.transpose();
335 iter->second.n=loop.N;
336 // std::cout<<" After adding Normal is "<<iter->second.n.transpose();
337
338 }
339 else
340 {
341 // std::cout<<" Adding link "<<link.sourceID<<"=>"<<link.sinkID<<" with normal "<<loopIter->second->N.transpose()<<"and burgres "<<loopIter->second->B.transpose();
342
343 if(iter->second.n.cross(loop.N).norm()>FLT_EPSILON)
344 {
345 iter->second.n.setZero();
346 }
347
348 // std::cout<<" After adding Normal is "<<iter->second.n.transpose();
349
350 }
351
352 // if(link.sourceID<link.sinkID)
353 if(loopNodeSource.networkNodeID<loopNodeSink.networkNodeID)
354 {
355 iter->second.b+=loop.B;
356 // std::cout<<" Burgers vector "<<iter->second.b.transpose()<<std::endl;
357 }
358 else
359 {
360 iter->second.b-=loop.B;
361 // std::cout<<" Burgers vector "<<iter->second.b.transpose()<<std::endl;
362
363 }
364
365 if(iter->second.meshLocation==-1)
366 {
367 iter->second.meshLocation=link.meshLocation;
368 }
369 else
370 {
371 assert(iter->second.meshLocation==link.meshLocation);
372 }
373
374 iter->second.grainIDs.insert(loop.grainID);
375 }
376 }
377
378 return temp;
379 }
380
381
382 template <int dim>
383 void DefectiveCrystalConfigIO<dim>::write(const size_t& runID,const bool& outputBinary)
384 {
385 if(outputBinary)
386 {
387 writeBin(runID);
388 }
389 else
390 {
391 writeTxt(runID);
392 }
393 }
394
395 template <int dim>
397 {
398 const auto t0=std::chrono::system_clock::now();
399 const std::string filename(this->getTxtFilename(runID));
400 std::ofstream file(filename.c_str(), std::ios::out | std::ios::binary);
401 if(file.is_open())
402 {
403 std::cout<<"Writing "<<filename<<std::flush;
404 writeTxtStream(file);
405 file.close();
406 std::cout<<magentaColor<<" ["<<(std::chrono::duration<double>(std::chrono::system_clock::now()-t0)).count()<<" sec]"<<defaultColor<<std::endl;
407 }
408 else
409 {
410 throw std::runtime_error("Cannot open file"+filename);
411// std::cout<<"CANNOT OPEN "<<filename<<std::endl;
412// assert(false && "CANNOT OPEN FILE.");
413 }
414 }
415
416
417 template <int dim>
419 {
420
421 // Write header
422 file<<nodes().size()<<"\n";
423 file<<loops().size()<<"\n";
424 file<<loopLinks().size()<<"\n";
425 file<<loopNodes().size()<<"\n";
426 file<<sphericalInclusions().size()<<"\n";
427 file<<ellipsoidalInclusions().size()<<"\n";
428 file<<polyhedronInclusions().size()<<"\n";
429 file<<polyhedronInclusionNodes().size()<<"\n";
430 file<<polyhedronInclusionEdges().size()<<"\n";
431 file<<displacementMatrix().rows()<<"\n";
432 file<<cdMatrix().rows()<<"\n";
433
434 // Write Nodes
435 for(const auto& node : nodes())
436 {
437 file<<node<<"\n";
438 }
439 // Write Loops
440 for(const auto& loop : loops())
441 {
442 file<<loop<<"\n";
443 }
444
445 // Write Edges
446 for(const auto& link : loopLinks())
447 {
448 file<<link<<"\n";
449 }
450
451 // Write LoopNodes
452 for(const auto& loopNode : loopNodes())
453 {
454 file<<loopNode<<"\n";
455 }
456
457 // Eshelby inclusions
458 for(const auto& ei : sphericalInclusions())
459 {
460 file<<ei<<"\n";
461 }
462
463 // EllipsoidalInclusions
464 for(const auto& ei : ellipsoidalInclusions())
465 {
466 file<<ei<<"\n";
467 }
468
469 // polyhedronInclusions
470 for(const auto& pi : polyhedronInclusions())
471 {
472 file<<pi<<"\n";
473 }
474
475 // polyhedronInclusionsNodes
476 for(const auto& pin : polyhedronInclusionNodes())
477 {
478 file<<pin<<"\n";
479 }
480
481 // polyhedronInclusionsEdges
482 for(const auto& pie : polyhedronInclusionEdges())
483 {
484 file<<pie<<"\n";
485 }
486
487 if(displacementMatrix().size())
488 {
489 file<<displacementMatrix()<<"\n";
490 }
491
492 if(cdMatrix().size())
493 {
494 file<<cdMatrix()<<"\n";
495 }
496
497 }
498
499 template <int dim>
501 {
502 const auto t0=std::chrono::system_clock::now();
503 const std::string filename(this->getBinFilename(runID));
504 std::ofstream file(filename.c_str(), std::ios::out | std::ios::binary);
505 if(file.is_open())
506 {
507 std::cout<<"Writing "<<filename<<std::flush;
508
509 // Write header
510 const size_t nV(nodes().size());
511 const size_t nL(loops().size());
512 const size_t nE(loopLinks().size());
513 const size_t nLN(loopNodes().size());
514 const size_t nEI(sphericalInclusions().size());
515 const size_t nELI(ellipsoidalInclusions().size());
516 const size_t nPI(polyhedronInclusions().size());
517 const size_t nPIn(polyhedronInclusionNodes().size());
518 const size_t nPIe(polyhedronInclusionEdges().size());
519 const size_t nDIS(displacementMatrix().rows());
520 const size_t nCD(cdMatrix().rows());
521
522
523 binWrite(file,nV);
524 binWrite(file,nL);
525 binWrite(file,nE);
526 binWrite(file,nLN);
527 binWrite(file,nEI);
528 binWrite(file,nELI);
529 binWrite(file,nPI);
530 binWrite(file,nPIn);
531 binWrite(file,nPIe);
532 binWrite(file,nDIS);
533 binWrite(file,nCD);
534
535
536 // Write Nodes
537 for(const auto& node : nodes())
538 {
539 binWrite(file,node);
540 }
541
542 // Write Loops
543 for(const auto& loop : loops())
544 {
545 binWrite(file,loop);
546 }
547
548 // Write Edges
549 for(const auto& link : loopLinks())
550 {
551 binWrite(file,link);
552 }
553
554 // Write LoopNodes
555 for(const auto& loopNode : loopNodes())
556 {
557 binWrite(file,loopNode);
558 }
559
560 // Write SphericalInclusions
561 for(const auto& ei : sphericalInclusions())
562 {
563 binWrite(file,ei);
564 }
565
566 // Write EllipsoidalInclusions
567 for(const auto& ei : ellipsoidalInclusions())
568 {
569 binWrite(file,ei);
570 }
571
572 // polyhedronInclusions
573 for(const auto& pi : polyhedronInclusions())
574 {
575 binWrite(file,pi);
576 }
577
578 // polyhedronInclusionsNodes
579 for(const auto& pin : polyhedronInclusionNodes())
580 {
581 binWrite(file,pin);
582 }
583
584 // polyhedronInclusionsEdges
585 for(const auto& pie : polyhedronInclusionEdges())
586 {
587 binWrite(file,pie);
588 }
589
590
591 if(displacementMatrix().rows()>0)
592 {
593 throw std::runtime_error("Binary output of FEM displacement is disabled");
594 }
595
596 if(cdMatrix().rows()>0)
597 {
598 throw std::runtime_error("Binary output of CD disabled");
599 }
600
601 file.close();
602 std::cout<<magentaColor<<" ["<<(std::chrono::duration<double>(std::chrono::system_clock::now()-t0)).count()<<" sec]"<<defaultColor<<std::endl;
603
604 }
605 else
606 {
607 std::cout<<"CANNOT OPEN "<<filename<<std::endl;
608 assert(false && "CANNOT OPEN FILE.");
609 }
610 }
611
612 template <int dim>
613 void DefectiveCrystalConfigIO<dim>::read(const size_t& runID)
614 {
615
616 if(isBinGood(runID))
617 {
618 readBin(runID);
619 }
620 else
621 {
622 if(isTxtGood(runID))
623 {
624 readTxt(runID);
625 }
626 else
627 {
628 throw std::runtime_error("No file evl_"+std::to_string(runID));
629// std::cout<<"COULD NOT FIND INPUT FILEs config/evl_"<<runID<<".bin or config/evl_"<<runID<<".txt"<<std::endl;
630// assert(0 && "COULD NOT FIND INPUT FILEs.");
631 }
632 }
633 }
634
635 template <int dim>
637 {
638
639 clear();
640
641 const std::string filename(this->getBinFilename(runID));
642
643 std::ifstream infile (filename.c_str(), std::ios::in|std::ios::binary);
644 if(infile.is_open())
645 {
646 const auto t0=std::chrono::system_clock::now();
647 std::cout<<"reading "<<filename<<std::flush;
648
649 // Read header
650 size_t sizeV;
651 infile.read (reinterpret_cast<char*>(&sizeV), 1*sizeof(sizeV));
652 size_t sizeL;
653 infile.read (reinterpret_cast<char*>(&sizeL), 1*sizeof(sizeL));
654 size_t sizeE;
655 infile.read (reinterpret_cast<char*>(&sizeE), 1*sizeof(sizeE));
656 size_t sizeLN;
657 infile.read (reinterpret_cast<char*>(&sizeLN), 1*sizeof(sizeLN));
658 size_t sizeEI;
659 infile.read (reinterpret_cast<char*>(&sizeEI), 1*sizeof(sizeEI));
660 size_t sizeELI;
661 infile.read (reinterpret_cast<char*>(&sizeELI), sizeof(sizeELI));
662 size_t sizePI;
663 infile.read (reinterpret_cast<char*>(&sizePI), 1*sizeof(sizePI));
664 size_t sizePIn;
665 infile.read (reinterpret_cast<char*>(&sizePIn), 1*sizeof(sizePIn));
666 size_t sizePIe;
667 infile.read (reinterpret_cast<char*>(&sizePIe), 1*sizeof(sizePIe));
668 size_t sizeDISP;
669 infile.read (reinterpret_cast<char*>(&sizeDISP), sizeof(sizeDISP));
670 size_t sizeCD;
671 infile.read (reinterpret_cast<char*>(&sizeCD), 1*sizeof(sizeCD));
672
673 // Read vertices
674 nodes().resize(sizeV);
675 infile.read (reinterpret_cast<char*>(nodes().data()),nodes().size()*sizeof(DislocationNodeIO<dim>));
676 // Read loops
677 loops().resize(sizeL);
678 infile.read (reinterpret_cast<char*>(loops().data()),loops().size()*sizeof(DislocationLoopIO<dim>));
679 // Read links
680 loopLinks().resize(sizeE);
681 infile.read (reinterpret_cast<char*>(loopLinks().data()),loopLinks().size()*sizeof(DislocationLoopLinkIO<dim>));
682 // Read loopNodes
683 loopNodes().resize(sizeLN);
684 infile.read (reinterpret_cast<char*>(loopNodes().data()),loopNodes().size()*sizeof(DislocationLoopNodeIO<dim>));
685 // Read Eshlby Inclusions
686 sphericalInclusions().resize(sizeEI);
687 infile.read (reinterpret_cast<char*>(sphericalInclusions().data()),sphericalInclusions().size()*sizeof(SphericalInclusionIO<dim>));
688 ellipsoidalInclusions().resize(sizeELI);
689 infile.read (reinterpret_cast<char*>(ellipsoidalInclusions().data()),ellipsoidalInclusions().size()*sizeof(EllipsoidalInclusionIO<dim>));
690 polyhedronInclusions().resize(sizePI);
691 infile.read (reinterpret_cast<char*>(polyhedronInclusions().data()),polyhedronInclusions().size()*sizeof(PolyhedronInclusionIO<dim>));
692 polyhedronInclusionNodes().resize(sizePIn);
693 infile.read (reinterpret_cast<char*>(polyhedronInclusionNodes().data()),polyhedronInclusionNodes().size()*sizeof(PolyhedronInclusionNodeIO<dim>));
694 polyhedronInclusionEdges().resize(sizePIe);
695 infile.read (reinterpret_cast<char*>(polyhedronInclusionEdges().data()),polyhedronInclusionEdges().size()*sizeof(PolyhedronInclusionEdgeIO));
696
697 if(sizeDISP>0)
698 {
699 throw std::runtime_error("Binary reading of FEM displacement is disabled");
700 }
701
702 if(sizeCD>0)
703 {
704 throw std::runtime_error("Binary reading of CD disabled");
705 }
706
707 infile.close();
708 finalize();
709 std::cout<<" ["<<(std::chrono::duration<double>(std::chrono::system_clock::now()-t0)).count()<<" sec]"<<std::endl;
710
711 print();
712 }
713 else
714 {
715 throw std::runtime_error("Cannot open file"+filename);
716//
717// std::cout<<"CANNOT OPEN "<<filename<<std::endl;
718// assert(false && "CANNOT OPEN FILE.");
719 }
720
721 }
722
723
724 template <int dim>
726 {
727
728 const std::string filename(this->getTxtFilename(runID));
729
730 std::ifstream infile (filename.c_str(), std::ios::in);
731 if(infile.is_open())
732 {
733 const auto t0=std::chrono::system_clock::now();
734 std::cout<<"reading "<<filename<<std::flush;
736 infile.close();
737 std::cout<<" ["<<(std::chrono::duration<double>(std::chrono::system_clock::now()-t0)).count()<<" sec]"<<std::endl;
738
739 print();
740 }
741 else
742 {
743 throw std::runtime_error("Cannot open file"+filename);
744//
745// std::cout<<"CANNOT OPEN "<<filename<<std::endl;
746// assert(false && "CANNOT OPEN FILE.");
747 }
748
749 }
750
751template <int dim>
753{
754 std::cout<<" "<<nodes().size()<<" nodes "<<std::endl;
755 std::cout<<" "<<loops().size()<<" loops "<<std::endl;
756 std::cout<<" "<<loopLinks().size()<<" loopLinks "<<std::endl;
757 std::cout<<" "<<loopNodes().size()<<" loopNodes "<<std::endl;
758 std::cout<<" "<<sphericalInclusions().size()<<" SphericalInclusions "<<std::endl;
759 std::cout<<" "<<ellipsoidalInclusions().size()<<" EllipsoidalInclusions "<<std::endl;
760 std::cout<<" "<<polyhedronInclusions().size()<<" polyhedronInclusions "<<std::endl;
761 std::cout<<" "<<polyhedronInclusionNodes().size()<<" polyhedronInclusionNodes "<<std::endl;
762 std::cout<<" "<<polyhedronInclusionEdges().size()<<" polyhedronInclusionEdges "<<std::endl;
763 std::cout<<" "<<displacementMatrix().rows()<<"x"<<displacementMatrix().cols()<<" displacement values "<<std::endl;
764 std::cout<<" "<<cdMatrix().rows()<<"x"<<cdMatrix().cols()<<" clusterDynamics values "<<std::endl;
765
766}
767
768 template <int dim>
770 {
771
772 clear();
773 size_t sizeV;
774 size_t sizeL;
775 size_t sizeE;
776 size_t sizeLN;
777 size_t sizeEI;
778 size_t sizeELI;
779 size_t sizePI;
780 size_t sizePIn;
781 size_t sizePIe;
782 size_t sizeDISP;
783 size_t sizeCD;
784
785
786 std::string line;
787 std::stringstream ss;
788
789
790 std::getline(infile, line);
791 ss<<line;
792 ss >> sizeV;
793 ss.str("");
794 ss.clear();
795
796 std::getline(infile, line);
797 ss<<line;
798 ss >> sizeL;
799 ss.str("");
800 ss.clear();
801
802 std::getline(infile, line);
803 ss<<line;
804 ss >> sizeE;
805 ss.str("");
806 ss.clear();
807
808 std::getline(infile, line);
809 ss<<line;
810 ss >> sizeLN;
811 ss.str("");
812 ss.clear();
813
814 std::getline(infile, line);
815 ss<<line;
816 ss >> sizeEI;
817 ss.str("");
818 ss.clear();
819
820 std::getline(infile, line);
821 ss<<line;
822 ss >> sizeELI;
823 ss.str("");
824 ss.clear();
825
826 std::getline(infile, line);
827 ss<<line;
828 ss >> sizePI;
829 ss.str("");
830 ss.clear();
831
832 std::getline(infile, line);
833 ss<<line;
834 ss >> sizePIn;
835 ss.str("");
836 ss.clear();
837
838 std::getline(infile, line);
839 ss<<line;
840 ss >> sizePIe;
841 ss.str("");
842 ss.clear();
843
844 std::getline(infile, line);
845 ss<<line;
846 ss >> sizeDISP;
847 ss.str("");
848 ss.clear();
849
850 std::getline(infile, line);
851 ss<<line;
852 ss >> sizeCD;
853 ss.str("");
854 ss.clear();
855
856 for(size_t k=0; k<sizeV; ++k)
857 {
858 std::getline(infile, line);
859 ss<<line;
860 nodes().emplace_back(ss);
861 ss.str("");
862 ss.clear();
863 }
864
865 for(size_t k=0; k<sizeL; ++k)
866 {
867 std::getline(infile, line);
868 ss<<line;
869 loops().emplace_back(ss);
870 ss.str("");
871 ss.clear();
872 }
873
874 for(size_t k=0; k<sizeE; ++k)
875 {
876 std::getline(infile, line);
877 ss<<line;
878 loopLinks().emplace_back(ss);
879 ss.str("");
880 ss.clear();
881 }
882
883 for(size_t k=0; k<sizeLN; ++k)
884 {
885 std::getline(infile, line);
886 ss<<line;
887 loopNodes().emplace_back(ss);
888 ss.str("");
889 ss.clear();
890 }
891
892 for(size_t k=0; k<sizeEI; ++k)
893 {
894 std::getline(infile, line);
895 ss<<line;
896 sphericalInclusions().emplace_back(ss);
897 ss.str("");
898 ss.clear();
899 }
900
901 for(size_t k=0; k<sizeELI; ++k)
902 {
903 std::getline(infile, line);
904 ss<<line;
905 ellipsoidalInclusions().emplace_back(ss);
906 ss.str("");
907 ss.clear();
908 }
909
910 for(size_t k=0; k<sizePI; ++k)
911 {
912 std::getline(infile, line);
913 ss<<line;
914 polyhedronInclusions().emplace_back(ss);
915 ss.str("");
916 ss.clear();
917 }
918
919 for(size_t k=0; k<sizePIn; ++k)
920 {
921 std::getline(infile, line);
922 ss<<line;
923 polyhedronInclusionNodes().emplace_back(ss);
924 ss.str("");
925 ss.clear();
926 }
927
928 for(size_t k=0; k<sizePIe; ++k)
929 {
930 std::getline(infile, line);
931 ss<<line;
932 polyhedronInclusionEdges().emplace_back(ss);
933 ss.str("");
934 ss.clear();
935 }
936
937 displacementMatrix().setZero(sizeDISP,2*dim);
938 for(size_t i=0; i<sizeDISP; ++i)
939 {
940 std::getline(infile, line);
941 ss<<line;
942 for(int j=0;j<2*dim;++j)
943 {
944 ss >> displacementMatrix()(i,j);
945 }
946 ss.str("");
947 ss.clear();
948 }
949
951 for(size_t i=0; i<sizeCD; ++i)
952 {
953 std::getline(infile, line);
954 ss<<line;
956 {
957 ss >> cdMatrix()(i,j);
958 }
959 ss.str("");
960 ss.clear();
961 }
962
963 finalize();
964 }
965
966
967
968 template <int dim>
969 void DefectiveCrystalConfigIO<dim>::bin2txt(const size_t& runID,const bool& writeSegments)
970 {
971 readBin(runID);
972 writeTxt(runID);
973 if(writeSegments)
974 { // std::map<std::pair<size_t,size_t>,DislocationSegmentIO<dim>>
975 const std::string segmentsFilename(getTxtSegmentFilename(runID));
976 const auto segmts(segments());
977 std::ofstream segFile(segmentsFilename.c_str());
978 for(const auto& seg : segmts)
979 {
980 segFile<<seg.second<<"\n";
981 }
982 }
983 }
984
985template <int dim>
986std::map<size_t,std::vector<size_t>> DefectiveCrystalConfigIO<dim>::loopNodeSequence() const
987{
988
989 std::map<size_t,std::vector<size_t>> temp;
990
991 std::map<size_t,std::map<size_t,size_t>> loopLinkMap;
992 for(const auto& link : loopLinks())
993 {
994 loopLinkMap[link.loopID].emplace(link.sourceID,link.sinkID);
995 }
996
997
998 for(const auto& pair : loopLinkMap)
999 {
1000 if(pair.second.size())
1001 {
1002 size_t sourceID(pair.second.begin()->first);
1003 size_t sinkID(pair.second.begin()->second);
1004 for(size_t k=0;k<pair.second.size();++k)
1005 {
1006
1007 temp[pair.first].push_back(sourceID);
1008
1009 const auto mapIter(pair.second.find(sinkID));
1010 if(mapIter==pair.second.end())
1011 {
1012 throw std::runtime_error("Could not create loopNodeSequence");
1013 }
1014
1015 sourceID=mapIter->first;
1016 sinkID=mapIter->second;
1017 }
1018
1019 if(sourceID!=temp[pair.first].front())
1020 {
1021 throw std::runtime_error("loopNodeSequence is not a loop");
1022 }
1023
1024 }
1025 }
1026
1027 return temp;
1028}
1029
1030
1031 template class DefectiveCrystalConfigIO<3>;
1032
1033}
1034#endif
const DispMatrixType & displacementMatrix() const
const std::vector< SphericalInclusionIO< dim > > & sphericalInclusions() const
std::map< size_t, std::vector< size_t > > loopNodeSequence() const
const std::vector< DislocationLoopLinkIO< dim > > & loopLinks() const
const std::vector< DislocationLoopIO< dim > > & loops() const
const std::vector< PolyhedronInclusionIO< dim > > & polyhedronInclusions() const
const std::vector< DislocationNodeIO< dim > > & nodes() const
std::map< std::pair< size_t, size_t >, DislocationSegmentIO< dim > > segments() const
const std::map< size_t, const size_t > & loopMap() const
void write(const size_t &runID, const bool &outputBinary)
const std::map< size_t, const size_t > & loopNodeMap() const
DefectiveCrystalConfigIO(const std::string &folderName="config")
const std::vector< EllipsoidalInclusionIO< dim > > & ellipsoidalInclusions() const
const std::vector< PolyhedronInclusionNodeIO< dim > > & polyhedronInclusionNodes() const
const std::map< size_t, const size_t > & nodeMap() const
void bin2txt(const size_t &runID, const bool &writeSegments)
const DislocationLoopIO< dim > & loop(const size_t &loopID) const
const std::vector< PolyhedronInclusionEdgeIO > & polyhedronInclusionEdges() const
const std::vector< DislocationLoopNodeIO< dim > > & loopNodes() const
size_t InstanceCount< Derived >::count
static std::string magentaColor
static std::string defaultColor
bool isBinGood(const size_t &frameID)
static void binWrite(std::ofstream &of, const T &o)
bool isTxtGood(const size_t &frameID)
std::string getTxtSegmentFilename(const size_t &runID)
DefectiveCrystalBaseIO(const std::string &outFolderName_in, const std::string &fileNamePrefix_in, const std::string &outFolderSuffix_in="")
std::string getBinFilename(const size_t &runID)
std::string getTxtFilename(const size_t &runID)
int end[2]
char infile
int j
REAL t0
newsubseg ss[0]
int k
enum insertvertexresult success
int i
newbad key
vertex temp