mirror of
https://github.com/cosmo-sims/MUSIC.git
synced 2024-09-19 17:03:46 +02:00
wip commit, memory optimization
This commit is contained in:
parent
33d784a137
commit
437e77f74f
6 changed files with 364 additions and 341 deletions
|
@ -298,9 +298,15 @@ public:
|
|||
}
|
||||
else
|
||||
{
|
||||
if( prefh_->get_margin() < 0 ){
|
||||
cparam_.nx = 2 * prefh_->size(ilevel, 0);
|
||||
cparam_.ny = 2 * prefh_->size(ilevel, 1);
|
||||
cparam_.nz = 2 * prefh_->size(ilevel, 2);
|
||||
}else{
|
||||
cparam_.nx = prefh_->size(ilevel, 0) + 2*prefh_->get_margin();
|
||||
cparam_.ny = prefh_->size(ilevel, 1) + 2*prefh_->get_margin();
|
||||
cparam_.nz = prefh_->size(ilevel, 2) + 2*prefh_->get_margin();
|
||||
}
|
||||
|
||||
cparam_.lx = (double)cparam_.nx / (double)(1 << ilevel) * boxlength_;
|
||||
cparam_.ly = (double)cparam_.ny / (double)(1 << ilevel) * boxlength_;
|
||||
|
|
|
@ -632,12 +632,22 @@ void GenerateDensityHierarchy(config_file &cf, transfer_function *ptf, tf_type t
|
|||
LOGUSER(" size =(%5d,%5d,%5d)", refh.size(levelmin + i, 0),
|
||||
refh.size(levelmin + i, 1), refh.size(levelmin + i, 2));
|
||||
|
||||
if( refh.get_margin() > 0 )
|
||||
fine = new PaddedDensitySubGrid<real_t>(refh.offset(levelmin + i, 0),
|
||||
refh.offset(levelmin + i, 1),
|
||||
refh.offset(levelmin + i, 2),
|
||||
refh.size(levelmin + i, 0),
|
||||
refh.size(levelmin + i, 1),
|
||||
refh.size(levelmin + i, 2),
|
||||
refh.get_margin(), refh.get_margin(), refh.get_margin() );
|
||||
else
|
||||
fine = new PaddedDensitySubGrid<real_t>(refh.offset(levelmin + i, 0),
|
||||
refh.offset(levelmin + i, 1),
|
||||
refh.offset(levelmin + i, 2),
|
||||
refh.size(levelmin + i, 0),
|
||||
refh.size(levelmin + i, 1),
|
||||
refh.size(levelmin + i, 2));
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// load white noise for patch
|
||||
|
|
|
@ -230,7 +230,7 @@ void store_grid_structure( config_file& cf, const refinement_hierarchy& rh )
|
|||
for( int j=0; j<3; ++j )
|
||||
{
|
||||
sprintf(str1,"offset(%d,%d)",i,j);
|
||||
sprintf(str2,"%d",rh.offset(i,j));
|
||||
sprintf(str2,"%ld",rh.offset(i,j));
|
||||
cf.insertValue("setup",str1,str2);
|
||||
|
||||
sprintf(str1,"size(%d,%d)",i,j);
|
||||
|
|
33
src/mesh.hh
33
src/mesh.hh
|
@ -1207,17 +1207,6 @@ class refinement_hierarchy
|
|||
std::vector<index3_t> absoffsets_;
|
||||
std::vector<index3_t> len_;
|
||||
|
||||
// std::vector<unsigned>
|
||||
// ox_, //!< relative x-coordinates of grid origins (in coarser grid cells)
|
||||
// oy_, //!< relative y-coordinates of grid origins (in coarser grid cells)
|
||||
// oz_, //!< relative z-coordinates of grid origins (in coarser grid cells)
|
||||
// oax_, //!< absolute x-coordinates of grid origins (in fine grid cells)
|
||||
// oay_, //!< absolute y-coordinates of grid origins (in fine grid cells)
|
||||
// oaz_, //!< absolute z-coordinates of grid origins (in fine grid cells)
|
||||
// nx_, //!< x-extent of grids (in fine grid cells)
|
||||
// ny_, //!< y-extent of grids (in fine grid cells)
|
||||
// nz_; //!< z-extent of grids (in fine grid cells)
|
||||
|
||||
unsigned
|
||||
levelmin_, //!< minimum grid level for Poisson solver
|
||||
levelmax_, //!< maximum grid level for all operations
|
||||
|
@ -1225,16 +1214,14 @@ class refinement_hierarchy
|
|||
padding_, //!< padding in number of coarse cells between refinement levels
|
||||
blocking_factor_;
|
||||
|
||||
int margin_; //!< number of cells used for additional padding for convolutions with isolated boundaries (-1 = double padding)
|
||||
|
||||
config_file &cf_; //!< reference to config_file
|
||||
|
||||
bool align_top_, //!< bool whether to align all grids with coarsest grid cells
|
||||
preserve_dims_, //!< bool whether to preserve user-specified grid dimensions
|
||||
equal_extent_; //!< bool whether the simulation code requires squared refinement regions (e.g. RAMSES)
|
||||
|
||||
// double
|
||||
// x0ref_[3], //!< coordinates of refinement region origin (in [0..1[)
|
||||
// lxref_[3]; //!< extent of refinement region (int [0..1[)
|
||||
|
||||
vec3_t x0ref_; //!< coordinates of refinement region origin (in [0..1[)
|
||||
vec3_t lxref_; //!< extent of refinement region (int [0..1[)
|
||||
|
||||
|
@ -1264,6 +1251,7 @@ public:
|
|||
preserve_dims_ = cf_.getValueSafe<bool>("setup", "preserve_dims", false);
|
||||
equal_extent_ = cf_.getValueSafe<bool>("setup", "force_equal_extent", false);
|
||||
blocking_factor_ = cf.getValueSafe<unsigned>("setup", "blocking_factor", 0);
|
||||
margin_ = cf.getValueSafe<int>("setup","convolution_margin",32);
|
||||
|
||||
bool bnoshift = cf_.getValueSafe<bool>("setup", "no_shift", false);
|
||||
bool force_shift = cf_.getValueSafe<bool>("setup", "force_shift", false);
|
||||
|
@ -1290,13 +1278,7 @@ public:
|
|||
if (levelmin_ == levelmax_)
|
||||
{
|
||||
x0ref_ = { 0.0, 0.0, 0.0 };
|
||||
// x0ref_[0] = 0.0;
|
||||
// x0ref_[1] = 0.0;
|
||||
// x0ref_[2] = 0.0;
|
||||
|
||||
lxref_[0] = 1.0;
|
||||
lxref_[1] = 1.0;
|
||||
lxref_[2] = 1.0;
|
||||
lxref_ = { 1.0, 1.0, 1.0 };
|
||||
}
|
||||
|
||||
unsigned ncoarse = 1 << levelmin_;
|
||||
|
@ -1658,6 +1640,7 @@ public:
|
|||
offsets_ = o.offsets_;
|
||||
absoffsets_ = o.absoffsets_;
|
||||
len_ = o.len_;
|
||||
margin_ = o.margin_;
|
||||
// ox_ = o.ox_;
|
||||
// oy_ = o.oy_;
|
||||
// oz_ = o.oz_;
|
||||
|
@ -1776,6 +1759,12 @@ public:
|
|||
return xshift_[idim];
|
||||
}
|
||||
|
||||
//! get the margin reserved for isolated convolutions (-1=double pad)
|
||||
int get_margin() const
|
||||
{
|
||||
return margin_;
|
||||
}
|
||||
|
||||
//! get the total shift of the coordinate system in box coordinates
|
||||
const double *get_coord_shift(void) const
|
||||
{
|
||||
|
|
|
@ -1697,12 +1697,26 @@ void random_number_generator<rng, T>::compute_random_numbers(void)
|
|||
|
||||
int lfac = 1 << (ilevel - levelmin_poisson);
|
||||
|
||||
lx[0] = 2 * prefh_->size(ilevel, 0);
|
||||
lx[1] = 2 * prefh_->size(ilevel, 1);
|
||||
lx[2] = 2 * prefh_->size(ilevel, 2);
|
||||
x0[0] = prefh_->offset_abs(ilevel, 0) - lfac * shift[0] - lx[0] / 4;
|
||||
x0[1] = prefh_->offset_abs(ilevel, 1) - lfac * shift[1] - lx[1] / 4;
|
||||
x0[2] = prefh_->offset_abs(ilevel, 2) - lfac * shift[2] - lx[2] / 4;
|
||||
int margin[3];
|
||||
if (prefh_->get_margin()>0){
|
||||
margin[0] = prefh_->get_margin();
|
||||
margin[1] = prefh_->get_margin();
|
||||
margin[2] = prefh_->get_margin();
|
||||
}else{
|
||||
margin[0] = prefh_->size(ilevel, 0)/2;
|
||||
margin[1] = prefh_->size(ilevel, 1)/2;
|
||||
margin[2] = prefh_->size(ilevel, 2)/2;
|
||||
}
|
||||
|
||||
lx[0] = prefh_->size(ilevel, 0) + 2*margin[0];
|
||||
lx[1] = prefh_->size(ilevel, 1) + 2*margin[1];
|
||||
lx[2] = prefh_->size(ilevel, 2) + 2*margin[2];
|
||||
x0[0] = prefh_->offset_abs(ilevel, 0) - lfac * shift[0] - margin[0];//lx[0] / 4;
|
||||
x0[1] = prefh_->offset_abs(ilevel, 1) - lfac * shift[1] - margin[1];//lx[1] / 4;
|
||||
x0[2] = prefh_->offset_abs(ilevel, 2) - lfac * shift[2] - margin[2];//lx[2] / 4;
|
||||
|
||||
LOGINFO("margin=%ld",prefh_->get_margin());
|
||||
LOGINFO("x0=(%ld,%ld,%ld) lx=(%ld,%ld,%ld)",x0[0],x0[1],x0[2],lx[0],lx[1],lx[2]);
|
||||
|
||||
if (randc[ilevel] == NULL)
|
||||
randc[ilevel] = new rng(*randc[ilevel - 1], ran_cube_size_, rngseeds_[ilevel], kavg, ilevel == levelmin_ + 1, x0, lx);
|
||||
|
@ -1812,7 +1826,7 @@ void random_number_generator<rng, T>::store_rnd(int ilevel, rng *prng)
|
|||
char fname[128];
|
||||
sprintf(fname, "grafic_wnoise_%04d.bin", ilevel);
|
||||
|
||||
LOGUSER("Storing white noise field for grafic in file \'%s\'...", fname);
|
||||
LOGINFO("Storing white noise field for grafic in file \'%s\'...", fname);
|
||||
LOGDEBUG("(%d,%d,%d) -- (%d,%d,%d) -- lfac = %d", nx, ny, nz, i0, j0, k0, lfac);
|
||||
|
||||
std::ofstream ofs(fname, std::ios::binary | std::ios::trunc);
|
||||
|
@ -1884,12 +1898,23 @@ void random_number_generator<rng, T>::store_rnd(int ilevel, rng *prng)
|
|||
int nx, ny, nz;
|
||||
int i0, j0, k0;
|
||||
|
||||
nx = 2 * prefh_->size(ilevel, 0);
|
||||
ny = 2 * prefh_->size(ilevel, 1);
|
||||
nz = 2 * prefh_->size(ilevel, 2);
|
||||
i0 = prefh_->offset_abs(ilevel, 0) - lfac * shift[0] - nx / 4;
|
||||
j0 = prefh_->offset_abs(ilevel, 1) - lfac * shift[1] - ny / 4; // was nx/4
|
||||
k0 = prefh_->offset_abs(ilevel, 2) - lfac * shift[2] - nz / 4; // was nx/4
|
||||
int margin[3];
|
||||
if (prefh_->get_margin()>0){
|
||||
margin[0] = prefh_->get_margin();
|
||||
margin[1] = prefh_->get_margin();
|
||||
margin[2] = prefh_->get_margin();
|
||||
}else{
|
||||
margin[0] = prefh_->size(ilevel, 0)/2;
|
||||
margin[1] = prefh_->size(ilevel, 1)/2;
|
||||
margin[2] = prefh_->size(ilevel, 2)/2;
|
||||
}
|
||||
|
||||
nx = prefh_->size(ilevel, 0) + 2*margin[0];
|
||||
ny = prefh_->size(ilevel, 1) + 2*margin[1];
|
||||
nz = prefh_->size(ilevel, 2) + 2*margin[2];
|
||||
i0 = prefh_->offset_abs(ilevel, 0) - lfac * shift[0] - margin[0]; //nx / 4;
|
||||
j0 = prefh_->offset_abs(ilevel, 1) - lfac * shift[1] - margin[1]; //ny / 4; // was nx/4
|
||||
k0 = prefh_->offset_abs(ilevel, 2) - lfac * shift[2] - margin[2]; //nz / 4; // was nx/4
|
||||
|
||||
char fname[128];
|
||||
sprintf(fname, "wnoise_%04d.bin", ilevel);
|
||||
|
@ -1930,12 +1955,22 @@ void random_number_generator<rng, T>::store_rnd(int ilevel, rng *prng)
|
|||
}
|
||||
else
|
||||
{
|
||||
nx = 2 * prefh_->size(ilevel, 0);
|
||||
ny = 2 * prefh_->size(ilevel, 1);
|
||||
nz = 2 * prefh_->size(ilevel, 2);
|
||||
i0 = prefh_->offset_abs(ilevel, 0) - lfac * shift[0] - nx / 4;
|
||||
j0 = prefh_->offset_abs(ilevel, 1) - lfac * shift[1] - ny / 4; // was nx/4
|
||||
k0 = prefh_->offset_abs(ilevel, 2) - lfac * shift[2] - nz / 4; // was nx/4
|
||||
int margin[3];
|
||||
if (prefh_->get_margin()>0){
|
||||
margin[0] = prefh_->get_margin();
|
||||
margin[1] = prefh_->get_margin();
|
||||
margin[2] = prefh_->get_margin();
|
||||
}else{
|
||||
margin[0] = prefh_->size(ilevel, 0)/2;
|
||||
margin[1] = prefh_->size(ilevel, 1)/2;
|
||||
margin[2] = prefh_->size(ilevel, 2)/2;
|
||||
}
|
||||
nx = prefh_->size(ilevel, 0) + 2*margin[0];
|
||||
ny = prefh_->size(ilevel, 1) + 2*margin[1];
|
||||
nz = prefh_->size(ilevel, 2) + 2*margin[2];
|
||||
i0 = prefh_->offset_abs(ilevel, 0) - lfac * shift[0] - margin[0];//nx / 4;
|
||||
j0 = prefh_->offset_abs(ilevel, 1) - lfac * shift[1] - margin[1];//ny / 4; // was nx/4
|
||||
k0 = prefh_->offset_abs(ilevel, 2) - lfac * shift[2] - margin[2];//nz / 4; // was nx/4
|
||||
}
|
||||
|
||||
mem_cache_[ilevel - levelmin_] = new std::vector<T>(nx * ny * nz, 0.0);
|
||||
|
|
|
@ -31,19 +31,19 @@
|
|||
#include "mg_operators.hh"
|
||||
#include "constraints.hh"
|
||||
|
||||
|
||||
class RNG_plugin{
|
||||
class RNG_plugin
|
||||
{
|
||||
protected:
|
||||
config_file *pcf_; //!< pointer to config_file from which to read parameters
|
||||
public:
|
||||
explicit RNG_plugin(config_file &cf)
|
||||
: pcf_(&cf)
|
||||
{ }
|
||||
{
|
||||
}
|
||||
virtual ~RNG_plugin() {}
|
||||
virtual bool is_multiscale() const = 0;
|
||||
};
|
||||
|
||||
|
||||
struct RNG_plugin_creator
|
||||
{
|
||||
virtual RNG_plugin *create(config_file &cf) const = 0;
|
||||
|
@ -74,7 +74,6 @@ struct RNG_plugin_creator_concrete : public RNG_plugin_creator
|
|||
typedef RNG_plugin RNG_instance;
|
||||
RNG_plugin *select_RNG_plugin(config_file &cf);
|
||||
|
||||
|
||||
/*!
|
||||
* @brief encapsulates all things random number generator related
|
||||
*/
|
||||
|
@ -88,7 +87,6 @@ public:
|
|||
ncubes_; //!< number of random number cubes to cover the full mesh
|
||||
long baseseed_; //!< base seed from which cube seeds are computed
|
||||
|
||||
|
||||
protected:
|
||||
//! vector of 3D meshes (the random number cubes) with random numbers
|
||||
std::vector<Meshvar<T> *> rnums_;
|
||||
|
@ -99,7 +97,6 @@ protected:
|
|||
typedef std::map<size_t, size_t>::iterator cubemap_iterator;
|
||||
|
||||
protected:
|
||||
|
||||
//! register a cube with the hash map
|
||||
void register_cube(int i, int j, int k);
|
||||
|
||||
|
@ -166,7 +163,8 @@ protected:
|
|||
register_cube(ii, jj, kk);
|
||||
}
|
||||
|
||||
#pragma omp parallel for reduction(+:sum)
|
||||
#pragma omp parallel for reduction(+ \
|
||||
: sum)
|
||||
for (int i = 0; i < (int)ncubes_; ++i)
|
||||
for (int j = 0; j < (int)ncubes_; ++j)
|
||||
for (int k = 0; k < (int)ncubes_; ++k)
|
||||
|
@ -189,7 +187,6 @@ protected:
|
|||
void print_allocated(void);
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
random_numbers(unsigned res, unsigned cubesize, long baseseed, int *x0, int *lx);
|
||||
|
||||
|
@ -200,11 +197,9 @@ public:
|
|||
//! constructor
|
||||
random_numbers(unsigned res, unsigned cubesize, long baseseed, bool zeromean = true);
|
||||
|
||||
|
||||
//! constructor to read white noise from file
|
||||
random_numbers(unsigned res, std::string randfname, bool rndsign);
|
||||
|
||||
|
||||
//! copy constructor for averaged field (not copying) hence explicit!
|
||||
explicit random_numbers(/*const*/ random_numbers<T> &rc, bool kdegrade = true);
|
||||
|
||||
|
@ -238,7 +233,6 @@ public:
|
|||
{
|
||||
LOGERR("Attempting to copy data from non-existing RND cube %d,%d,%d @ %d,%d,%d", ic, jc, kc, i, j, k);
|
||||
throw std::runtime_error("attempting to copy data from non-existing RND cube");
|
||||
|
||||
}
|
||||
|
||||
size_t cubeidx = it->second;
|
||||
|
@ -267,11 +261,8 @@ public:
|
|||
rnums_[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*!
|
||||
* @brief encapsulates all things for multi-scale white noise generation
|
||||
*/
|
||||
|
@ -295,9 +286,7 @@ protected:
|
|||
|
||||
unsigned ran_cube_size_;
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
//! checks if the specified string is numeric
|
||||
bool is_number(const std::string &s);
|
||||
|
||||
|
@ -313,9 +302,7 @@ protected:
|
|||
//! store the white noise fields in memory or on disk
|
||||
void store_rnd(int ilevel, rng *prng);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
random_number_generator(config_file &cf, refinement_hierarchy &refh, transfer_function *ptf = NULL);
|
||||
|
||||
|
@ -341,7 +328,6 @@ public:
|
|||
{
|
||||
LOGERR("White noise file \'%s\'was not found.", fname);
|
||||
throw std::runtime_error("A white noise file was not found. This is an internal inconsistency and bad.");
|
||||
|
||||
}
|
||||
|
||||
int nx, ny, nz;
|
||||
|
@ -356,7 +342,6 @@ public:
|
|||
{
|
||||
std::cerr << "CHECKPOINT" << std::endl;
|
||||
|
||||
|
||||
int ox = nx / 4, oy = ny / 4, oz = nz / 4;
|
||||
std::vector<T> slice(ny * nz, 0.0);
|
||||
|
||||
|
@ -364,8 +349,10 @@ public:
|
|||
{
|
||||
ifs.read(reinterpret_cast<char *>(&slice[0]), ny * nz * sizeof(T));
|
||||
|
||||
if( i<ox ) continue;
|
||||
if( i>=3*ox ) break;
|
||||
if (i < ox)
|
||||
continue;
|
||||
if (i >= 3 * ox)
|
||||
break;
|
||||
|
||||
#pragma omp parallel for
|
||||
for (int j = oy; j < 3 * oy; ++j)
|
||||
|
@ -381,7 +368,9 @@ public:
|
|||
nx, ny, nz, A.size(0), A.size(1), A.size(2));
|
||||
throw std::runtime_error("White noise file is not aligned with array. This is an internal inconsistency and bad.");
|
||||
}
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
for (int i = 0; i < nx; ++i)
|
||||
{
|
||||
|
@ -392,7 +381,6 @@ public:
|
|||
for (int j = 0; j < ny; ++j)
|
||||
for (int k = 0; k < nz; ++k)
|
||||
A(i, j, k) = slice[j * nz + k];
|
||||
|
||||
}
|
||||
|
||||
ifs.close();
|
||||
|
@ -422,16 +410,11 @@ public:
|
|||
std::vector<T>().swap(*mem_cache_[ilevel - levelmin_]);
|
||||
delete mem_cache_[ilevel - levelmin_];
|
||||
mem_cache_[ilevel - levelmin_] = NULL;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
typedef random_numbers<real_t> rand_nums;
|
||||
typedef random_number_generator<rand_nums, real_t> rand_gen;
|
||||
|
||||
|
||||
#endif //__RANDOM_HH
|
||||
|
||||
|
|
Loading…
Reference in a new issue