29#ifndef mx_AO_sim_turbAtmosphere_hpp
30#define mx_AO_sim_turbAtmosphere_hpp
42#include "../../math/constants.hpp"
52#include "wavefront.hpp"
55#define BREAD_CRUMB std::cout << "DEBUG: " << __FILE__ << " " << __LINE__ << "\n";
80template <
typename _aoSystemT,
class _verboseT = mx::verbose::d>
85 typedef _aoSystemT aoSystemT;
86 typedef _verboseT verboseT;
88 typedef typename aoSystemT::realT realT;
89 typedef Eigen::Array<realT, -1, -1> imageT;
307 uint32_t scrnLengthPixels();
309 uint32_t scrnLengthPixels( uint32_t n );
313 realT scrnLength( uint32_t n );
315 uint32_t maxShift( realT dt );
317 uint32_t maxShift( uint32_t n, realT dt );
332 int shift( improc::milkImage<realT> &phase, realT dt );
344template <
typename aoSystemT,
class verboseT>
350template <
typename aoSystemT,
class verboseT>
359template <
typename aoSystemT,
class verboseT>
369template <
typename aoSystemT,
class verboseT>
375template <
typename aoSystemT,
class verboseT>
385template <
typename aoSystemT,
class verboseT>
391template <
typename aoSystemT,
class verboseT>
401template <
typename aoSystemT,
class verboseT>
407template <
typename aoSystemT,
class verboseT>
417template <
typename aoSystemT,
class verboseT>
423template <
typename aoSystemT,
class verboseT>
433template <
typename aoSystemT,
class verboseT>
439template <
typename aoSystemT,
class verboseT>
449template <
typename aoSystemT,
class verboseT>
455template <
typename aoSystemT,
class verboseT>
465template <
typename aoSystemT,
class verboseT>
471template <
typename aoSystemT,
class verboseT>
482template <
typename aoSystemT,
class verboseT>
488template <
typename aoSystemT,
class verboseT>
499template <
typename aoSystemT,
class verboseT>
505template <
typename aoSystemT,
class verboseT>
513 size_t nLayers = scrnSz.size();
519 "Size of scrnSz vector does not match atmosphere." );
529 for(
size_t i = 0; i <
nLayers; ++i )
531 m_layers[i].setLayer(
this, i, scrnSz[i] );
543 for(
size_t i = 0; i <
nLayers; ++i )
554template <
typename aoSystemT,
class verboseT>
561 "atmosphere is not set (m_atm is nullptr)" );
564 size_t n =
m_aosys->atm.n_layers();
566 setLayers( std::vector<size_t>( n, scrnSz ) );
569template <
typename aoSystemT,
class verboseT>
575template <
typename aoSystemT,
class verboseT>
586template <
typename aoSystemT,
class verboseT>
592template <
typename aoSystemT,
class verboseT>
593uint32_t turbAtmosphere<aoSystemT, verboseT>::scrnLengthPixels()
598template <
typename aoSystemT,
class verboseT>
599uint32_t turbAtmosphere<aoSystemT, verboseT>::scrnLengthPixels( uint32_t n )
609template <
typename aoSystemT,
class verboseT>
610turbAtmosphere<aoSystemT, verboseT>::realT turbAtmosphere<aoSystemT, verboseT>::scrnLength()
615template <
typename aoSystemT,
class verboseT>
616turbAtmosphere<aoSystemT, verboseT>::realT turbAtmosphere<aoSystemT, verboseT>::scrnLength( uint32_t n )
621template <
typename aoSystemT,
class verboseT>
622uint32_t turbAtmosphere<aoSystemT, verboseT>::maxShift( realT dt )
627template <
typename aoSystemT,
class verboseT>
628uint32_t turbAtmosphere<aoSystemT, verboseT>::maxShift( uint32_t n, realT dt )
633template <
typename aoSystemT,
class verboseT>
644 for(
size_t i = 0; i <
m_layers.size(); ++i )
650 this->setChangePoint();
655 sigproc::psdFilter<realT, 2> filt;
657 for(
size_t i = 0; i <
m_layers.size(); ++i )
674 for(
size_t jj = 0; jj <
m_layers[i].m_scrnSz; ++jj )
676 for(
size_t ii = 0; ii <
m_layers[i].m_scrnSz; ++ii )
684 filt.psdSqrt(
m_layers[i].m_psd, dkx, dky );
696 for(
size_t i = 0; i <
m_layers.size(); ++i )
701 for(
size_t i = 0; i <
m_subHarms.size(); ++i )
715 for(
size_t i = 0; i <
m_layers.size(); ++i )
722 this->setChangePoint();
725template <
typename aoSystemT,
class verboseT>
726int turbAtmosphere<aoSystemT, verboseT>::shift( improc::milkImage<realT> &milkPhase, realT dt )
728 if( this->isChanged() )
735 if( phase.rows() != m_wfSz || phase.cols() != m_wfSz )
740 if( m_layers.size() > 1 )
743 #pragma omp parallel for
744 for(
size_t j = 0; j < m_layers.size(); ++j )
746 m_layers[j].shift( dt );
751 m_layers[0].shift( dt );
754 milkPhase.setWrite();
756 for(
size_t j = 0; j < m_layers.size(); ++j )
759 sqrt( m_aosys->atm.layer_Cn2( j ) ) * m_layers[j].m_shiftPhase.block( m_buffSz, m_buffSz, m_wfSz, m_wfSz );
766template <
typename aoSystemT,
class verboseT>
767int turbAtmosphere<aoSystemT, verboseT>::frames(
int f )
774template <
typename aoSystemT,
class verboseT>
775size_t turbAtmosphere<aoSystemT, verboseT>::frames()
780template <
typename aoSystemT,
class verboseT>
783 static_cast<void>( ps );
787template <
typename aoSystemT,
class verboseT>
800 shift( wf.
phase, m_nWf * m_timeStep );
803 wf.
phase *= *m_pupil;
805 realT pixVal = sqrt( m_aosys->Fg() ) * ( m_aosys->D() / m_wfSz );
A simple class to track member data changes.
A simple class to track member data changes.
Class to manage interactions with a FITS file.
error_t read(dataT *data)
Read the contents of the FITS file into an array.
error_t write(const dataT *im, int d1, int d2, int d3, fitsHeader< verboseT > *head)
Write the contents of a raw array to the FITS file.
Declares and defines a class to work with a FITS file.
Eigen::Map< Eigen::Array< scalarT, -1, -1 > > eigenMap
Definition of the eigenMap type, which is an alias for Eigen::Map<Array>.
@ sizeerr
A size was invalid or calculated incorrectly.
@ exception
An exception was thrown.
@ paramnotset
A parameter was not set.
@ invalidconfig
A config setting was invalid.
@ invalidarg
An argument was invalid.
randomT< realT, std::mt19937_64, std::normal_distribution< realT > > normDistT
Alias for a standard normal random variate.
std::string convertToString(const typeT &value, int precision=0)
Convert a numerical value to a string.
Declares and defines the Jinc and Jinc2 functions.
Interface to MILK::ImageStreamIO shared memory streams.
Declares and defines a class for filtering with PSDs.
Tools for working with PSDs.
Defines a random number type.
Utilities for working with strings.
realT m_timeStep
Length of each iteration, in seconds.
uint32_t nLayers()
Get the number of layers.
bool forceGen()
Get whether new screen generation is forced.
uint32_t buffSz()
Get the interpolation buffer size.
turbAtmosphere()
Default c'tor.
void shPreCalc(bool shp)
Set whether subharmonic modes are pre-calculated.
math::normDistT< realT > & normVar()
Get the random number generator.
std::vector< turbLayer< aoSystemT > > m_layers
Vector of turbulent layers.
uint32_t m_wfSz
Size of the wavefront in pixels.
bool retain()
Get whether memory for screen generation is retained.
std::string dataDir()
Get the data directory for saving phase screens.
turbLayer< aoSystemT > & layer(uint32_t n)
Get a layer.
uint32_t shLevel()
Get the subharmonic level.
aoSystemT * m_aosys
The AO system object containing all system parameters.
void outerSubHarmonics(bool osh)
Set whether outer subharmonics are included.
std::vector< turbSubHarmonic< turbAtmosphere > > m_subHarms
Sub-harmonic layers.
bool shPreCalc()
Get whether subharmonic modes are pre-calculated.
int m_nWf
Number of iterations which have occurred.
math::normDistT< realT > m_normVar
Normal random deviate generator. This seeded in the constructor.
bool outerSubHarmonics()
Get whether outer subharmonics are included.
uint32_t m_buffSz
Buffer to apply around wavefront for interpolation.
void aosys(aoSystemT *aos)
void shLevel(uint32_t shl)
int wfPS(realT ps)
dummy function for simulatedAOSystem. Does nothing.
void setup(uint32_t wfSz, uint32_t buffSz, aoSystemT *aosys, uint32_t shLevel)
Setup the overall atmosphere.
aoSystemT * aosys()
Get the pointer to an AO system object.
void dataDir(const std::string &dd)
Set the data directory for saving phase screens.
void setLayers(const std::vector< size_t > &scrnSz)
Setup the layers and prepare them for phase screen generation.
void forceGen(bool fg)
Set whether new screen generation is forced.
size_t m_frames
Length of the turbulence sequence.
imageT * m_pupil
A pointer to the pupil mask.
void retain(bool rtn)
Set whether memory for screen generation is retained.
void genLayers()
Generate all phase screens.
uint32_t wfSz()
Get the wavefront size.
Simulation of a single turbulent layer.
Structure containing the phase and amplitude of a wavefront.
realImageT amplitude
The wavefront amplitude.
realImageT phase
The wavefront phase.
Utilities for working with time.
Declaration and definition of a turbulence layer.
A class to manage low-frequency sub-harmonic phase screen generation in atmospheric turbulence.