8#ifndef model_MDStackingFaultNoise_cpp
9#define model_MDStackingFaultNoise_cpp
17 const std::string&
tag,
18 const std::string& correlationFile_in,
22 const Eigen::Matrix<double,2,2>& latticeBasis
30 if(originalDimensions(2)!=1)
32 throw std::runtime_error(
"vtk stacking fault correlationFile 'DIMENSIONS' should have 3rd component == 1.");
35 const int originalNX = originalDimensions(0);
36 const int originalNY = originalDimensions(1);
37 const int originalNZ = originalDimensions(2);
38 const int originalNR = originalNX*originalNY*originalNZ;
41 eNormFactor = (this->
NR!=originalNR ?
static_cast<double>(this->
NR)/
static_cast<double>(originalNR) : 1.0);
48 std::fill(Rr_original, Rr_original+originalNR,
REAL_SCALAR{0.0});
54 for (
int i = 0;
i < originalNR; ++
i)
57 Rr_original[
i] /= (unitconvert*unitconvert);
65 if(this->NR == originalNR)
73 int start_y = (this->
NY - originalNY) / 2;
74 int start_x = (this->
NX - originalNX) / 2;
76 for (
int i = 0;
i < originalNY; ++
i)
78 for (
int j = 0;
j < originalNX; ++
j)
80 Rr[(start_y +
i) * this->
NX + (start_x +
j)] = Rr_original[
i * originalNX +
j];
84 fftw_free(Rr_original);
92 fftw_plan plan_R_r2c = fftw_plan_dft_r2c_2d(this->
NY, this->
NX, Rr,
reinterpret_cast<fftw_complex*
>(
Rk), FFTW_ESTIMATE);
93 fftw_execute(plan_R_r2c);
96 fftw_destroy_plan(plan_R_r2c);
114 std::deque<VectorDimD> basis1;
115 std::deque<VectorDimD> basis2;
116 std::ifstream vtkFile(fileName_vtk);
118 if (!vtkFile.is_open()) {
119 throw std::runtime_error(
"Error opening stacking fault VTK correlation file!");
123 while (std::getline(vtkFile, line))
125 if(line.find(
"VECTORS")!=std::string::npos)
127 std::getline(vtkFile, line);
128 std::stringstream
ss(line);
135 basis1.push_back(vec);
142 basis2.push_back(vec);
148 Eigen::Matrix<double,2,2> nonOrthoBasisMatrix;
150 nonOrthoBasisMatrix.block<2,1>(0,0) = basis1.front();
152 nonOrthoBasisMatrix.block<2,1>(0,1) = basis2.front();
155 return nonOrthoBasisMatrix;
160 std::cout <<
"Reading stacking fault correlation" << std::endl;
164 if (!vtkFile.is_open())
166 throw std::runtime_error(
"Error opening stacking fault VTK correlation file!");
170 while (std::getline(vtkFile, line))
173 if (line.find(
"POINT_DATA") != std::string::npos)
175 const size_t numOfHeaders = 2;
177 const size_t firstSpace(line.find(
' '));
178 const size_t numOfPoints = std::atoi(line.substr(firstSpace+1).c_str());
180 for (
size_t n = 0; n < numOfPoints + numOfHeaders; ++n)
182 std::getline(vtkFile, line);
184 if (n < numOfHeaders)
186 const int ind = n - numOfHeaders;
190 throw std::runtime_error(
"Index out of bounds while populating the original correlation array.");
195 double value = std::stod(line);
199 catch(
const std::invalid_argument&
e)
201 std::cerr <<
"Invalid correlation data in line: " << line << std::endl;
203 catch(
const std::out_of_range&
e)
205 std::cerr <<
"Out of range correlation value in line: " << line << std::endl;
215 FILE *InFile=fopen(fname,
"r");
219 fprintf(stderr,
"Can't open stacking fault correlation VTK file %s\n",fname);
226 fgets(line, 200, InFile);
230 fscanf(InFile,
"%s %d %d %d\n", line, &(NXX), &(NYY), &(NZZ));
GlidePlaneNoiseBase(const std::string &tag_in, const int &seed_in, const NoiseTraitsBase::GridSizeType &gridSize_in, const NoiseTraitsBase::GridSpacingType &gridSpacing_SI_in, const Eigen::Matrix< double, 2, 2 > &latticeBasis)
const GridSizeType gridSize
const GridSpacingType gridSpacing
Eigen::Matrix< double, 2, 2 > nonOrthogonalBasisReader(const std::string &fileName_vtk) const
MDStackingFaultNoise(const PolycrystallineMaterialBase &mat, const std::string &tag, const std::string &correlationFile_in, const int &seed, const GridSizeType &gridSize, const GridSpacingType &gridSpacing, const Eigen::Matrix< double, 2, 2 > &latticeBasis)
NoiseTraits< 1 >::REAL_SCALAR REAL_SCALAR
NoiseTraits< 1 >::GridSizeType GridSizeType
NoiseTraits< 1 >::COMPLEX COMPLEX
const std::string correlationFile
NoiseTraitsBase::GridSpacingType GridSpacingType
REAL_SCALAR fftScaleFactor
std::array< COMPLEX, 1 > kCorrelations(const Eigen::Matrix< double, 3, 1 > &kv, const Eigen::Matrix< int, 3, 1 > &index) const override
void StackingFaultCorrelationReader(const std::string &fileName_vtk, REAL_SCALAR *Rr, const int &NR)
GridSizeType readVTKfileDimension(const char *fname)
fprintf(outfile, "# Generated by")