#ifndef Hadrons_DilutedNoise_hpp_ #define Hadrons_DilutedNoise_hpp_ #include BEGIN_HADRONS_NAMESPACE /****************************************************************************** * Abstract container for diluted noise * ******************************************************************************/ template class DilutedNoise { public: typedef typename FImpl::FermionField FermionField; public: // constructor/destructor DilutedNoise(GridCartesian *g); DilutedNoise(GridCartesian *g, const unsigned int nNoise); virtual ~DilutedNoise(void) = default; // access std::vector & getNoise(void); const std::vector & getNoise(void) const; const FermionField & operator[](const unsigned int i) const; FermionField & operator[](const unsigned int i); void resize(const unsigned int nNoise); unsigned int size(void) const; GridCartesian *getGrid(void) const; // generate noise (pure virtual) virtual void generateNoise(GridParallelRNG &rng) = 0; private: std::vector noise_; GridCartesian *grid_; unsigned int nNoise_; }; template class TimeDilutedSpinColorDiagonalNoise: public DilutedNoise { public: typedef typename FImpl::FermionField FermionField; public: // constructor/destructor TimeDilutedSpinColorDiagonalNoise(GridCartesian *g); virtual ~TimeDilutedSpinColorDiagonalNoise(void) = default; // generate noise virtual void generateNoise(GridParallelRNG &rng); private: unsigned int nt_; }; /****************************************************************************** * DilutedNoise template implementation * ******************************************************************************/ template DilutedNoise::DilutedNoise(GridCartesian *g) : grid_(g) {} template DilutedNoise::DilutedNoise(GridCartesian *g, const unsigned int nNoise) : DilutedNoise(g) { resize(nNoise); } template std::vector::FermionField> & DilutedNoise:: getNoise(void) { return noise_; } template const std::vector::FermionField> & DilutedNoise:: getNoise(void) const { return noise_; } template const typename DilutedNoise::FermionField & DilutedNoise::operator[](const unsigned int i) const { return noise_[i]; } template typename DilutedNoise::FermionField & DilutedNoise::operator[](const unsigned int i) { return noise_[i]; } template void DilutedNoise::resize(const unsigned int nNoise) { nNoise_ = nNoise; noise_.resize(nNoise, grid_); } template unsigned int DilutedNoise::size(void) const { return noise_.size(); } template GridCartesian * DilutedNoise::getGrid(void) const { return grid_; } /****************************************************************************** * TimeDilutedSpinColorDiagonalNoise template implementation * ******************************************************************************/ template TimeDilutedSpinColorDiagonalNoise:: TimeDilutedSpinColorDiagonalNoise(GridCartesian *g) : DilutedNoise(g) { nt_ = this->getGrid()->GlobalDimensions().back(); this->resize(nt_*Ns*FImpl::Dimension); } template void TimeDilutedSpinColorDiagonalNoise::generateNoise(GridParallelRNG &rng) { typedef decltype(peekColour((*this)[0], 0)) SpinField; auto &noise = *this; auto g = this->getGrid(); auto nd = g->GlobalDimensions().size(); auto nc = FImpl::Dimension; Complex shift(1., 1.); Lattice> tLat(g); LatticeComplex eta(g), etaCut(g); SpinField etas(g); unsigned int i = 0; LatticeCoordinate(tLat, nd - 1); bernoulli(rng, eta); eta = (2.*eta - shift)*(1./::sqrt(2.)); for (unsigned int t = 0; t < nt_; ++t) { etaCut = where((tLat == t), eta, 0.*eta); for (unsigned int s = 0; s < Ns; ++s) { etas = zero; pokeSpin(etas, etaCut, s); for (unsigned int c = 0; c < nc; ++c) { noise[i] = zero; pokeColour(noise[i], etas, c); i++; } } } } END_HADRONS_NAMESPACE #endif // Hadrons_DilutedNoise_hpp_