1
0
Fork 0
mirror of https://github.com/cosmo-sims/monofonIC.git synced 2024-09-19 17:03:45 +02:00

grafic2 can also use SPT now, minor cleanup

This commit is contained in:
Oliver Hahn 2019-08-08 16:03:30 +02:00
parent a4a40aae4b
commit d7063e824f
4 changed files with 45 additions and 40 deletions

View file

@ -2,7 +2,7 @@
GridRes = 64 GridRes = 64
BoxLength = 100 BoxLength = 100
zstart = 49.0 zstart = 49.0
LPTorder = 3 LPTorder = 2
SymplecticPT = no SymplecticPT = no
DoFixing = no DoFixing = no
BCClattice = no BCClattice = no
@ -15,12 +15,13 @@ fname_hdf5 = output_sch.hdf5
fbase_analysis = output fbase_analysis = output
#format = gadget2 #format = gadget2
#filename = ics_gadget.dat #filename = ics_gadget.dat
format = generic #format = generic
filename = debug.hdf5 #filename = debug.hdf5
generic_out_eulerian = yes #generic_out_eulerian = yes
#format = grafic2 format = grafic2
#filename = ics_ramses filename = ics_ramses
grafic_use_SPT = yes
[random] [random]
generator = NGENIC generator = NGENIC
@ -37,5 +38,5 @@ sigma_8 = 0.811
nspec = 0.961 nspec = 0.961
[sch] [sch]
hbar = 0.5 hbar = 5.0 #0.5
dt = 1.0 dt = 1.0

View file

@ -244,6 +244,16 @@ public:
return *this; return *this;
} }
Grid_FFT<data_t>& apply_negative_Laplacian( void ){
this->FourierTransformForward();
this->apply_function_k_dep([&](auto x, auto k) {
real_t kmod2 = k.norm_squared();
return x*kmod2;
});
this->zero_DC_mode();
return *this;
}
Grid_FFT<data_t>& apply_InverseLaplacian( void ){ Grid_FFT<data_t>& apply_InverseLaplacian( void ){
this->FourierTransformForward(); this->FourierTransformForward();
this->apply_function_k_dep([&](auto x, auto k) { this->apply_function_k_dep([&](auto x, auto k) {

View file

@ -274,10 +274,6 @@ int Run( ConfigFile& the_config )
//====================================================================== //======================================================================
// initialise psi = exp(i Phi(1)/hbar) // initialise psi = exp(i Phi(1)/hbar)
//====================================================================== //======================================================================
//real_t hbar= the_config.GetValueSafe<real_t>("sch", "hbar", 0.000001);
//real_t dt = the_config.GetValueSafe<real_t>("sch", "dt", 1.0);
phi.FourierTransformBackward(); phi.FourierTransformBackward();
real_t std_phi1 = phi.std(); real_t std_phi1 = phi.std();
@ -322,7 +318,6 @@ int Run( ConfigFile& the_config )
return pp; return pp;
}, psi); }, psi);
// the_output_plugin->write_grid_data( rho, cosmo_species::dm, fluid_component::density );
the_output_plugin->write_grid_data( rho, this_species, fluid_component::density ); the_output_plugin->write_grid_data( rho, this_species, fluid_component::density );
//====================================================================== //======================================================================
@ -343,13 +338,10 @@ int Run( ConfigFile& the_config )
}, psi, grad_psi, rho); }, psi, grad_psi, rho);
fluid_component fc = (idim==0)? fluid_component::vx : ((idim==1)? fluid_component::vy : fluid_component::vz ); fluid_component fc = (idim==0)? fluid_component::vx : ((idim==1)? fluid_component::vy : fluid_component::vz );
//the_output_plugin->write_grid_data( tmp, cosmo_species::dm, fc );
the_output_plugin->write_grid_data( tmp, this_species, fc ); the_output_plugin->write_grid_data( tmp, this_species, fc );
} }
} }
// if( the_output_plugin->write_species_as( cosmo_species::dm ) == output_type::particles
// || the_output_plugin->write_species_as( cosmo_species::dm ) == output_type::field_lagrangian ){
if( the_output_plugin->write_species_as( this_species ) == output_type::particles if( the_output_plugin->write_species_as( this_species ) == output_type::particles
|| the_output_plugin->write_species_as( this_species ) == output_type::field_lagrangian ) || the_output_plugin->write_species_as( this_species ) == output_type::field_lagrangian )
{ {
@ -360,7 +352,6 @@ int Run( ConfigFile& the_config )
particle_container particles; particle_container particles;
// if output plugin wants particles, then we need to store them, along with their IDs // if output plugin wants particles, then we need to store them, along with their IDs
//if( the_output_plugin->write_species_as( cosmo_species::dm ) == output_type::particles ){
if( the_output_plugin->write_species_as( this_species ) == output_type::particles ) if( the_output_plugin->write_species_as( this_species ) == output_type::particles )
{ {
// if particles occupy a bcc lattice, then there are 2 x N^3 of them... // if particles occupy a bcc lattice, then there are 2 x N^3 of them...
@ -408,7 +399,6 @@ int Run( ConfigFile& the_config )
tmp.FourierTransformBackward(); tmp.FourierTransformBackward();
// if we write particle data, store particle data in particle structure // if we write particle data, store particle data in particle structure
// if( the_output_plugin->write_species_as( cosmo_species::dm ) == output_type::particles ){
if( the_output_plugin->write_species_as( this_species ) == output_type::particles ) if( the_output_plugin->write_species_as( this_species ) == output_type::particles )
{ {
for( size_t i=0,ipcount=0; i<tmp.size(0); ++i ){ for( size_t i=0,ipcount=0; i<tmp.size(0); ++i ){
@ -438,7 +428,6 @@ int Run( ConfigFile& the_config )
else if( the_output_plugin->write_species_as( this_species ) == output_type::field_lagrangian ) else if( the_output_plugin->write_species_as( this_species ) == output_type::field_lagrangian )
{ {
fluid_component fc = (idim==0)? fluid_component::dx : ((idim==1)? fluid_component::dy : fluid_component::dz ); fluid_component fc = (idim==0)? fluid_component::dx : ((idim==1)? fluid_component::dy : fluid_component::dz );
// the_output_plugin->write_grid_data( tmp, cosmo_species::dm, fc );
the_output_plugin->write_grid_data( tmp, this_species, fc ); the_output_plugin->write_grid_data( tmp, this_species, fc );
} }
} }
@ -471,7 +460,6 @@ int Run( ConfigFile& the_config )
tmp.FourierTransformBackward(); tmp.FourierTransformBackward();
// if we write particle data, store particle data in particle structure // if we write particle data, store particle data in particle structure
// if( the_output_plugin->write_species_as( cosmo_species::dm ) == output_type::particles ){
if( the_output_plugin->write_species_as( this_species ) == output_type::particles ){ if( the_output_plugin->write_species_as( this_species ) == output_type::particles ){
for( size_t i=0,ipcount=0; i<tmp.size(0); ++i ){ for( size_t i=0,ipcount=0; i<tmp.size(0); ++i ){
for( size_t j=0; j<tmp.size(1); ++j){ for( size_t j=0; j<tmp.size(1); ++j){
@ -493,32 +481,26 @@ int Run( ConfigFile& the_config )
} }
} }
}// otherwise write out the grid data directly to the output plugin }// otherwise write out the grid data directly to the output plugin
// else if( the_output_plugin->write_species_as( cosmo_species::dm ) == output_type::field_lagrangian )
else if( the_output_plugin->write_species_as( this_species ) == output_type::field_lagrangian ) else if( the_output_plugin->write_species_as( this_species ) == output_type::field_lagrangian )
{ {
fluid_component fc = (idim==0)? fluid_component::vx : ((idim==1)? fluid_component::vy : fluid_component::vz ); fluid_component fc = (idim==0)? fluid_component::vx : ((idim==1)? fluid_component::vy : fluid_component::vz );
// the_output_plugin->write_grid_data( tmp, cosmo_species::dm, fc );
the_output_plugin->write_grid_data( tmp, this_species, fc ); the_output_plugin->write_grid_data( tmp, this_species, fc );
} }
} }
// if( the_output_plugin->write_species_as( cosmo_species::dm ) == output_type::particles )
// {
// the_output_plugin->write_particle_data( particles, cosmo_species::dm );
// }
if( the_output_plugin->write_species_as( this_species ) == output_type::particles ) if( the_output_plugin->write_species_as( this_species ) == output_type::particles )
{ {
the_output_plugin->write_particle_data( particles, this_species ); the_output_plugin->write_particle_data( particles, this_species );
} }
// if( the_output_plugin->write_species_as_grid( cosmo_species::baryon ) ) if( the_output_plugin->write_species_as( this_species ) == output_type::field_lagrangian )
// { {
// phi.FourierTransformForward(); // use density simply from 1st order SPT
// phi.apply_Laplacian(); phi.FourierTransformForward();
// phi.FourierTransformBackward(); phi.apply_negative_Laplacian();
// the_output_plugin->write_grid_data( phi, cosmo_species::baryon, fluid_component::density ); phi.FourierTransformBackward();
// } the_output_plugin->write_grid_data( phi, this_species, fluid_component::density );
}
} }
} }

View file

@ -36,6 +36,7 @@ protected:
bool bhavebaryons_; bool bhavebaryons_;
std::vector<float> data_buf_; std::vector<float> data_buf_;
std::string dirname_; std::string dirname_;
bool bUseSPT_;
public: public:
//! constructor //! constructor
@ -54,10 +55,11 @@ public:
omegaL = cf_.GetValue<double>("cosmology", "Omega_L"); omegaL = cf_.GetValue<double>("cosmology", "Omega_L");
uint32_t ngrid = cf_.GetValue<int>("setup", "GridRes"); uint32_t ngrid = cf_.GetValue<int>("setup", "GridRes");
bUseSPT_ = cf_.GetValueSafe<bool>("output", "grafic_use_SPT", false);
levelmin_ = uint32_t(std::log2(double(ngrid)) + 1e-6); levelmin_ = uint32_t(std::log2(double(ngrid)) + 1e-6);
if( std::abs( std::pow( 2.0, levelmin_ )-double(ngrid) ) > 1e-4 ){ if (std::abs(std::pow(2.0, levelmin_) - double(ngrid)) > 1e-4)
{
csoca::elog << interface_name_ << " plugin requires setup/GridRes to be power of 2!" << std::endl; csoca::elog << interface_name_ << " plugin requires setup/GridRes to be power of 2!" << std::endl;
abort(); abort();
} }
@ -93,8 +95,10 @@ public:
} }
} }
output_type write_species_as(const cosmo_species &s) const { output_type write_species_as(const cosmo_species &s) const
if( s == cosmo_species::baryon ) return output_type::field_eulerian; {
if (s == cosmo_species::baryon && !bUseSPT_)
return output_type::field_eulerian;
return output_type::field_lagrangian; return output_type::field_lagrangian;
} }
@ -158,8 +162,16 @@ std::string grafic2_output_plugin::get_file_name(const cosmo_species &s, const f
void grafic2_output_plugin::write_grid_data(const Grid_FFT<real_t> &g, const cosmo_species &s, const fluid_component &c) void grafic2_output_plugin::write_grid_data(const Grid_FFT<real_t> &g, const cosmo_species &s, const fluid_component &c)
{ {
// ignore certain components
if (s == cosmo_species::dm && c == fluid_component::density)
return;
if (s == cosmo_species::baryon && (c == fluid_component::dx || c == fluid_component::dy || c == fluid_component::dz))
return;
// get file name based on species and fluid component type
std::string file_name = this->get_file_name(s, c); std::string file_name = this->get_file_name(s, c);
// serialize parallel write
for (int write_rank = 0; write_rank < CONFIG::MPI_task_size; ++write_rank) for (int write_rank = 0; write_rank < CONFIG::MPI_task_size; ++write_rank)
{ {
if (write_rank == CONFIG::MPI_task_rank) if (write_rank == CONFIG::MPI_task_rank)