16 const std::string&
tag,
17 const std::string& correlationFile_xz,
18 const std::string& correlationFile_yz,
22 const Eigen::Matrix<double,2,2>& latticeBasis,
23 const double& a_Cai_in
32 if((originalDimensions_xz-originalDimensions_yz).
matrix().squaredNorm()>0)
34 throw std::runtime_error(
"correlationFile_xz and correlationFile_yz have different grid sizes.");
37 if(originalDimensions_xz(2)!=1 || originalDimensions_yz(2)!=1)
39 throw std::runtime_error(
"vtk solid solution correlationFiles 'DIMENSIONS' should have 3rd component == 1.");
42 const int originalNX = originalDimensions_xz(0);
43 const int originalNY = originalDimensions_xz(1);
44 const int originalNZ = originalDimensions_xz(2);
45 const int originalNR = originalNX*originalNY*originalNZ;
48 eNormFactor = (this->
NR!=originalNR ?
static_cast<double>(this->
NR)/
static_cast<double>(originalNR) : 1.0);
55 std::fill(Rr_xz_original, Rr_xz_original+originalNR,
REAL_SCALAR{0.0});
56 std::fill(Rr_yz_original, Rr_yz_original+originalNR,
REAL_SCALAR{0.0});
63 for (
int i = 0;
i < originalNR; ++
i)
65 Rr_xz_original[
i] /= (mat.mu_SI*mat.mu_SI);
66 Rr_yz_original[
i] /= (mat.mu_SI*mat.mu_SI);
76 if(this->NR == originalNR)
79 Rr_xz = Rr_xz_original;
80 Rr_yz = Rr_yz_original;
85 int start_y = (this->
NY - originalNY) / 2;
86 int start_x = (this->
NX - originalNX) / 2;
88 for (
int i = 0;
i < originalNY; ++
i)
90 for (
int j = 0;
j < originalNX; ++
j)
92 Rr_xz[(start_y +
i) * this->
NX + (start_x +
j)] = Rr_xz_original[
i * originalNX +
j];
93 Rr_yz[(start_y +
i) * this->
NX + (start_x +
j)] = Rr_yz_original[
i * originalNX +
j];
97 fftw_free(Rr_xz_original);
98 fftw_free(Rr_yz_original);
108 fftw_plan plan_R_xz_r2c = fftw_plan_dft_r2c_2d(this->
NY, this->
NX, Rr_xz,
reinterpret_cast<fftw_complex*
>(
Rk_xz), FFTW_ESTIMATE);
109 fftw_plan plan_R_yz_r2c = fftw_plan_dft_r2c_2d(this->
NY, this->
NX, Rr_yz,
reinterpret_cast<fftw_complex*
>(
Rk_yz), FFTW_ESTIMATE);
112 fftw_execute(plan_R_xz_r2c);
113 fftw_execute(plan_R_yz_r2c);
116 fftw_destroy_plan(plan_R_xz_r2c);
117 fftw_destroy_plan(plan_R_yz_r2c);
146 std::cout <<
"Reading solid solution correlation" << std::endl;
148 std::ifstream vtkFile(correlationFile);
150 if (!vtkFile.is_open())
152 throw std::runtime_error(
"Error opening solid solution VTK correlation file!");
156 while (std::getline(vtkFile, line))
159 if(line.find(
"POINT_DATA")!=std::string::npos)
161 const size_t numOfHeaders = 2;
163 const size_t firstSpace(line.find(
' '));
164 const size_t numOfPoints = std::atoi(line.substr(firstSpace+1).c_str());
166 for(
size_t n=0; n<numOfPoints+numOfHeaders; ++n)
168 std::getline(vtkFile, line);
172 const int ind = n-numOfHeaders;
176 throw std::runtime_error(
"Index out of bounds while populating the original correlation array.");
181 double value = std::stod(line);
184 catch(
const std::invalid_argument&
e)
186 std::cerr <<
"Invalid correlation data in line: " << line << std::endl;
188 catch(
const std::out_of_range&
e)
190 std::cerr <<
"Out of range correlation value in line: " << line << std::endl;
200 FILE *InFile=fopen(fname,
"r");
204 fprintf(stderr,
"Can't open solid solution correlation VTK file %s\n",fname);
211 fgets(line, 200, InFile);
215 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)
MDSolidSolutionNoise(const PolycrystallineMaterialBase &mat, const std::string &tag, const std::string &correlationFile_xz, const std::string &correlationFile_yz, const int &seed, const GridSizeType &gridSize, const GridSpacingType &gridSpacing, const Eigen::Matrix< double, 2, 2 > &latticeBasis, const double &a_Cai_in)