8#ifndef model_GlidePlaneNoiseBase_cpp
9#define model_GlidePlaneNoiseBase_cpp
26 return a*
k*sqrt(0.5*boost::math::cyl_bessel_k(2,
a*
k));
42 return a*
a*k2*0.5*boost::math::cyl_bessel_k(2,
a*
k);
54 return 15.*
a*
a*
a*
a/(8.*M_PI*pow(r2+
a*
a,7./2.));
60 return 0.3425*
W_Cai(r2,0.9038*
a) + 0.6575*
W_Cai(r2,0.5451*
a);
68 const Eigen::Matrix<double,2,2>& latticeBasis):
69 UniformPeriodicGrid<2>(gridSize_in.template segment<2>(0),gridSpacing_in.template segment<2>(0))
107#ifdef _MODEL_GLIDE_PLANE_NOISE_GENERATOR_
112 std::vector<COMPLEX*> okCorr;
117 std::fill(okCorr[n], okCorr[n]+
NK,
COMPLEX{0.0, 0.0});
120 const int J_MAX = (
NZ > 1) ?
NY : (
NY/2 + 1);
121 const int K_MAX = (
NZ > 1) ? (
NZ/2 + 1) : 1 ;
122 for(
int i=0;
i<
NX;
i++)
124 for(
int j=0;
j<J_MAX;
j++)
126 for(
int k=0;
k<K_MAX;
k++)
129 const int ind = J_MAX*K_MAX*
i +
j*K_MAX +
k;
145 const Eigen::Matrix<double,3,1> kv((Eigen::Matrix<double,3,1>()<<kx,ky,kz).finished());
146 const Eigen::Matrix<int,3,1> kvID((Eigen::Matrix<int,3,1>()<<
i,
j,
k).finished());
152 okCorr[n][ind]=sqrt(kCorr[n]);
162 std::default_random_engine& generator,
163 std::normal_distribution<REAL_SCALAR>& distribution)
const
166 std::vector<COMPLEX*> nkCorr;
171 std::fill(nkCorr[n], nkCorr[n]+
NK,
COMPLEX{0.0, 0.0});
174 for(
int ind=0;ind<
NK;++ind)
180 nkCorr[n][ind]=okCorr[n][ind]*
COMPLEX(Nk,Mk)/std::numbers::sqrt2;
195 std::vector<REAL_SCALAR*> rNoise;
205 fftw_plan nPlan = (
NZ>1 ? fftw_plan_dft_c2r_3d(
NX,
NY,
NZ,
reinterpret_cast<fftw_complex*
>(nkCorr[n]), rNoise[n], FFTW_ESTIMATE)
207 : fftw_plan_dft_c2r_2d(
NY,
NX,
reinterpret_cast<fftw_complex*
>(nkCorr[n]), rNoise[n], FFTW_ESTIMATE));
219 const auto t0= std::chrono::system_clock::now();
221#ifdef _MODEL_GLIDE_PLANE_NOISE_GENERATOR_
223 std::default_random_engine generator(
seed);
224 std::normal_distribution<REAL_SCALAR> distribution(0.0,1.0);
229 this->reserve(
NX*
NY);
231 for(
int i=0;
i<
NX;
i++)
233 for(
int j=0;
j<
NY;
j++)
236 Eigen::Matrix<REAL_SCALAR,1,N>
temp;
239 temp(n)=rNoise[n][ind];
255#ifdef _MODEL_GLIDE_PLANE_NOISE_GENERATOR_
257 std::normal_distribution<REAL_SCALAR> distribution(0.0,1.0);
263 std::vector<COMPLEX*> avgkCorr;
264 for(
int n=0; n<
N; ++n)
268 std::fill(avgkCorr[n], avgkCorr[n]+
NK,
COMPLEX{0.0, 0.0});
271 for(
int k=0;
k<reps;++
k)
273 unsigned int seed =
k+1;
274 std::default_random_engine generator(
seed);
276 const std::vector<COMPLEX*> nkCorr =
noisyKCorrelations(okCorr,generator,distribution);
279 for(
int ind=0;ind<
NK;++ind)
282 const COMPLEX I = nkCorr[n][ind]*std::conj(nkCorr[n][ind]);
283 avgkCorr[n][ind] +=
I /
static_cast<double>(reps);
289 std::vector<REAL_SCALAR*> avgrCorr(
realNoise(avgkCorr));
292 std::vector<std::vector<double>> avgrCorrFlat;
297 std::vector<double>
temp;
298 for(
int i=0;
i<
NX;
i++)
300 for(
int j=0;
j<
NY;
j++)
303 temp.push_back(avgrCorr[n][ind]);
306 avgrCorrFlat.push_back(
temp);
317#ifdef _MODEL_GLIDE_PLANE_NOISE_GENERATOR_
319 std::normal_distribution<REAL_SCALAR> distribution(0.0,1.0);
325 std::vector<std::vector<double>> rNoises;
327 for(
int k=0;
k<reps;++
k)
329 unsigned int seed =
k+1;
330 std::default_random_engine generator(
seed);
334 const std::vector<COMPLEX*> nkNoise =
noisyKCorrelations(okCorr,generator,distribution);
336 const std::vector<REAL_SCALAR*> nrNoise(
realNoise(nkNoise));
339 std::vector<double>
temp;
340 for(
int i=0;
i<
NX;
i++)
342 for(
int j=0;
j<
NY;
j++)
345 temp.push_back(nrNoise[n][ind]);
348 rNoises.push_back(
temp);
375 std::cout<<
"gridSize= "<<
gridSize.transpose()<<std::endl;
376 std::cout<<
"gridSpacing= "<<
gridSpacing.transpose()<<std::endl;
377 std::cout<<
"noiseAverage="<<ave*mat.mu_SI<<
" [Pa]"<<std::endl;
378 std::cout<<
"noiseVariance="<<var*std::pow(mat.mu_SI,2)<<
" [Pa^2]"<<std::endl;
size_t InstanceCount< Derived >::count
static std::string greenColor
static std::string greenBoldColor
static std::string defaultColor
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)
int storageIndex(const int &i, const int &j) const
void computeRealNoiseStatistics(const PolycrystallineMaterialBase &mat) const
NoiseTraitsBase::REAL_SCALAR REAL_SCALAR
NoiseTraitsBase::COMPLEX COMPLEX
std::vector< COMPLEX * > noisyKCorrelations(const std::vector< COMPLEX * > &okCorr, std::default_random_engine &generator, std::normal_distribution< REAL_SCALAR > &distribution) const
std::vector< std::vector< double > > sampleAverageNoise(const int &reps) const
NoiseTraits< N >::NoiseContainerType NoiseContainerType
const GridSpacingType gridLength
std::vector< std::vector< double > > averageNoiseCorrelation(const int &reps) const
static REAL_SCALAR Wk_Cai_squared(REAL_SCALAR kx, REAL_SCALAR ky, REAL_SCALAR kz, REAL_SCALAR a)
const NoiseContainerType & noiseVector() const
const GridSizeType gridSize
std::vector< REAL_SCALAR * > realNoise(const std::vector< COMPLEX * > &nkCorr) const
static REAL_SCALAR W_t_Cai(REAL_SCALAR r2, REAL_SCALAR a)
NoiseTraits< N >::NoiseType NoiseType
const Eigen::Matrix< double, 2, 2 > invTransposeLatticeBasis
const GridSpacingType gridSpacing
std::vector< COMPLEX * > originalKCorrelations() const
static REAL_SCALAR W_Cai(REAL_SCALAR r2, REAL_SCALAR a)
static REAL_SCALAR Wk_Cai(REAL_SCALAR kx, REAL_SCALAR ky, REAL_SCALAR kz, REAL_SCALAR a)
virtual std::array< COMPLEX, N > kCorrelations(const Eigen::Matrix< double, 3, 1 > &k, const Eigen::Matrix< int, 3, 1 > &kID) const
Eigen::Array< double, 3, 1 > GridSpacingType
Eigen::Array< int, 3, 1 > GridSizeType
static NoiseType squared(const NoiseType &m)
static const NoiseType & fromMatrix(const Eigen::Matrix< REAL_SCALAR, 1, N > &m)