8#ifndef model_DefectiveCrystalConfigIO_cpp_
9#define model_DefectiveCrystalConfigIO_cpp_
138 const auto loopIter(
loopMap().find(loopID));
141 return loops()[loopIter->second];
145 throw std::runtime_error(
"loopID not found");
301 const auto loopIter=
loopMap().find(link.loopID);
304 const auto loopSourceIter(
loopNodeMap().find(link.sourceID));
307 const auto loopSinkIter(
loopNodeMap().find(link.sinkID));
316 if(link.hasNetworkLink)
318 const auto& loopNodeSource(
loopNodes()[loopSourceIter->second]);
319 const auto& loopNodeSink(
loopNodes()[ loopSinkIter->second]);
320 const auto&
loop(
loops()[loopIter->second]);
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);
327 const auto& iter=insertPair.first;
328 const bool&
success=insertPair.second;
335 iter->second.n=
loop.N;
343 if(iter->second.n.cross(
loop.N).norm()>FLT_EPSILON)
345 iter->second.n.setZero();
353 if(loopNodeSource.networkNodeID<loopNodeSink.networkNodeID)
355 iter->second.b+=
loop.B;
360 iter->second.b-=
loop.B;
365 if(iter->second.meshLocation==-1)
367 iter->second.meshLocation=link.meshLocation;
371 assert(iter->second.meshLocation==link.meshLocation);
374 iter->second.grainIDs.insert(
loop.grainID);
398 const auto t0=std::chrono::system_clock::now();
400 std::ofstream file(filename.c_str(), std::ios::out | std::ios::binary);
403 std::cout<<
"Writing "<<filename<<std::flush;
410 throw std::runtime_error(
"Cannot open file"+filename);
422 file<<
nodes().size()<<
"\n";
423 file<<
loops().size()<<
"\n";
435 for(
const auto& node :
nodes())
454 file<<loopNode<<
"\n";
502 const auto t0=std::chrono::system_clock::now();
504 std::ofstream file(filename.c_str(), std::ios::out | std::ios::binary);
507 std::cout<<
"Writing "<<filename<<std::flush;
510 const size_t nV(
nodes().size());
511 const size_t nL(
loops().size());
520 const size_t nCD(
cdMatrix().rows());
537 for(
const auto& node :
nodes())
593 throw std::runtime_error(
"Binary output of FEM displacement is disabled");
598 throw std::runtime_error(
"Binary output of CD disabled");
607 std::cout<<
"CANNOT OPEN "<<filename<<std::endl;
608 assert(
false &&
"CANNOT OPEN FILE.");
628 throw std::runtime_error(
"No file evl_"+std::to_string(runID));
643 std::ifstream
infile (filename.c_str(), std::ios::in|std::ios::binary);
646 const auto t0=std::chrono::system_clock::now();
647 std::cout<<
"reading "<<filename<<std::flush;
651 infile.read (
reinterpret_cast<char*
>(&sizeV), 1*
sizeof(sizeV));
653 infile.read (
reinterpret_cast<char*
>(&sizeL), 1*
sizeof(sizeL));
655 infile.read (
reinterpret_cast<char*
>(&sizeE), 1*
sizeof(sizeE));
657 infile.read (
reinterpret_cast<char*
>(&sizeLN), 1*
sizeof(sizeLN));
659 infile.read (
reinterpret_cast<char*
>(&sizeEI), 1*
sizeof(sizeEI));
661 infile.read (
reinterpret_cast<char*
>(&sizeELI),
sizeof(sizeELI));
663 infile.read (
reinterpret_cast<char*
>(&sizePI), 1*
sizeof(sizePI));
665 infile.read (
reinterpret_cast<char*
>(&sizePIn), 1*
sizeof(sizePIn));
667 infile.read (
reinterpret_cast<char*
>(&sizePIe), 1*
sizeof(sizePIe));
669 infile.read (
reinterpret_cast<char*
>(&sizeDISP),
sizeof(sizeDISP));
671 infile.read (
reinterpret_cast<char*
>(&sizeCD), 1*
sizeof(sizeCD));
674 nodes().resize(sizeV);
677 loops().resize(sizeL);
699 throw std::runtime_error(
"Binary reading of FEM displacement is disabled");
704 throw std::runtime_error(
"Binary reading of CD disabled");
709 std::cout<<
" ["<<(std::chrono::duration<double>(std::chrono::system_clock::now()-
t0)).
count()<<
" sec]"<<std::endl;
715 throw std::runtime_error(
"Cannot open file"+filename);
730 std::ifstream
infile (filename.c_str(), std::ios::in);
733 const auto t0=std::chrono::system_clock::now();
734 std::cout<<
"reading "<<filename<<std::flush;
737 std::cout<<
" ["<<(std::chrono::duration<double>(std::chrono::system_clock::now()-
t0)).
count()<<
" sec]"<<std::endl;
743 throw std::runtime_error(
"Cannot open file"+filename);
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;
764 std::cout<<
" "<<
cdMatrix().rows()<<
"x"<<
cdMatrix().cols()<<
" clusterDynamics values "<<std::endl;
787 std::stringstream
ss;
790 std::getline(
infile, line);
796 std::getline(
infile, line);
802 std::getline(
infile, line);
808 std::getline(
infile, line);
814 std::getline(
infile, line);
820 std::getline(
infile, line);
826 std::getline(
infile, line);
832 std::getline(
infile, line);
838 std::getline(
infile, line);
844 std::getline(
infile, line);
850 std::getline(
infile, line);
856 for(
size_t k=0;
k<sizeV; ++
k)
858 std::getline(
infile, line);
865 for(
size_t k=0;
k<sizeL; ++
k)
867 std::getline(
infile, line);
874 for(
size_t k=0;
k<sizeE; ++
k)
876 std::getline(
infile, line);
883 for(
size_t k=0;
k<sizeLN; ++
k)
885 std::getline(
infile, line);
892 for(
size_t k=0;
k<sizeEI; ++
k)
894 std::getline(
infile, line);
901 for(
size_t k=0;
k<sizeELI; ++
k)
903 std::getline(
infile, line);
910 for(
size_t k=0;
k<sizePI; ++
k)
912 std::getline(
infile, line);
919 for(
size_t k=0;
k<sizePIn; ++
k)
921 std::getline(
infile, line);
928 for(
size_t k=0;
k<sizePIe; ++
k)
930 std::getline(
infile, line);
938 for(
size_t i=0;
i<sizeDISP; ++
i)
940 std::getline(
infile, line);
942 for(
int j=0;
j<2*dim;++
j)
951 for(
size_t i=0;
i<sizeCD; ++
i)
953 std::getline(
infile, line);
977 std::ofstream segFile(segmentsFilename.c_str());
978 for(
const auto& seg : segmts)
980 segFile<<seg.second<<
"\n";
989 std::map<size_t,std::vector<size_t>>
temp;
991 std::map<size_t,std::map<size_t,size_t>> loopLinkMap;
994 loopLinkMap[link.loopID].emplace(link.sourceID,link.sinkID);
998 for(
const auto& pair : loopLinkMap)
1000 if(pair.second.size())
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)
1007 temp[pair.first].push_back(sourceID);
1009 const auto mapIter(pair.second.find(sinkID));
1010 if(mapIter==pair.second.end())
1012 throw std::runtime_error(
"Could not create loopNodeSequence");
1015 sourceID=mapIter->first;
1016 sinkID=mapIter->second;
1019 if(sourceID!=
temp[pair.first].front())
1021 throw std::runtime_error(
"loopNodeSequence is not a loop");
void writeBin(const size_t &runID)
void writeTxt(const size_t &runID)
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 read(const size_t &runID)
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")
void readTxt(const size_t &runID)
const std::vector< EllipsoidalInclusionIO< dim > > & ellipsoidalInclusions() const
const std::vector< PolyhedronInclusionNodeIO< dim > > & polyhedronInclusionNodes() const
void readBin(const size_t &runID)
const CDMatrixType & cdMatrix() 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
void writeTxtStream(std::ostream &file)
void readTxtStream(std::istream &infile)
size_t InstanceCount< Derived >::count
static std::string magentaColor
static std::string defaultColor
static constexpr int mSize
static constexpr int iSize
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)
enum insertvertexresult success