/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: Hadrons/DilutedNoise.hpp Copyright (C) 2015-2018 Author: Antonin Portelli Author: Vera Guelpers This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ #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_; }; template class FullVolumeSpinColorDiagonalNoise: public DilutedNoise { public: typedef typename FImpl::FermionField FermionField; public: // constructor/destructor FullVolumeSpinColorDiagonalNoise(GridCartesian *g, unsigned int n_src); virtual ~FullVolumeSpinColorDiagonalNoise(void) = default; // generate noise virtual void generateNoise(GridParallelRNG &rng); private: unsigned int nSrc_; }; /****************************************************************************** * 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().size(); 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++; } } } } /****************************************************************************** * FullVolumeSpinColorDiagonalNoise template implementation * ******************************************************************************/ template FullVolumeSpinColorDiagonalNoise:: FullVolumeSpinColorDiagonalNoise(GridCartesian *g, unsigned int nSrc) : DilutedNoise(g, nSrc*Ns*FImpl::Dimension), nSrc_(nSrc) {} template void FullVolumeSpinColorDiagonalNoise::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.); LatticeComplex eta(g); SpinField etas(g); unsigned int i = 0; bernoulli(rng, eta); eta = (2.*eta - shift)*(1./::sqrt(2.)); for (unsigned int n = 0; n < nSrc_; ++n) { for (unsigned int s = 0; s < Ns; ++s) { etas = Zero(); pokeSpin(etas, eta, 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_