From c8619e13e385c4e6c07ca29e1396b6e72ff3565c Mon Sep 17 00:00:00 2001 From: Oliver Hahn Date: Wed, 13 Nov 2013 01:40:42 +0100 Subject: [PATCH] restored compatibility with old realspace transfer function scheme --- convolution_kernel.cc | 9 +++++--- densities.cc | 14 ++++++++---- random.cc | 53 +++++++++++++++++++++++-------------------- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/convolution_kernel.cc b/convolution_kernel.cc index 4ff6e22..5992902 100644 --- a/convolution_kernel.cc +++ b/convolution_kernel.cc @@ -490,7 +490,7 @@ namespace convolution{ return eval_split_recurse( tfr, xmid, dx, prevval, nsplit ); } -#define OLD_KERNEL_SAMPLING + #define OLD_KERNEL_SAMPLING template< typename real_t > void kernel_real_cached::precompute_kernel( transfer_function* ptf, tf_type type, const refinement_hierarchy& refh ) @@ -1095,7 +1095,9 @@ namespace convolution{ } } - /* LOGUSER("Averaging fine kernel to coarse kernel..."); + +#ifdef OLD_KERNEL_SAMPLING + LOGUSER("Averaging fine kernel to coarse kernel..."); //... copy averaged and convolved fine kernel to coarse kernel #pragma omp parallel for @@ -1132,7 +1134,8 @@ namespace convolution{ } - */ +#endif // OLD_KERNEL_SAMPLING + sprintf(cachefname,"temp_kernel_level%03d.tmp",ilevel); LOGUSER("Storing kernel in temp file \'%s\'.",cachefname); fp = fopen(cachefname,"w+"); diff --git a/densities.cc b/densities.cc index 6981e0e..e1b44a8 100644 --- a/densities.cc +++ b/densities.cc @@ -17,9 +17,11 @@ //TODO: this should be a larger number by default, just to maintain consistency with old default #define DEF_RAN_CUBE_SIZE 32 +double blend_sharpness = 0.333; + double Blend_Function( double k, double kmax ) { - double const eps = 0.333; + double const eps = blend_sharpness; // this is a global variable return -0.5*(tanh((fabs(k)-kmax)/eps)-1.0f); } @@ -427,6 +429,8 @@ void GenerateDensityHierarchy( config_file& cf, transfer_function *ptf, tf_type levelmin = cf.getValueSafe("setup","levelmin_TF",levelminPoisson); levelmax = cf.getValue("setup","levelmax"); kspaceTF = cf.getValueSafe("setup", "kspace_TF", false); + + blend_sharpness = cf.getValueSafe("setup","kspace_filter",0.333); unsigned nbase = 1<subtract_oct_mean(); convolution::perform( the_tf_kernel, reinterpret_cast (coarse->get_data_ptr()), shift ); - //coarse->subtract_mean(); - //coarse->upload_bnd_add( *delta.get_grid(levelmin+i-1) ); + coarse->subtract_mean(); + coarse->upload_bnd_add( *delta.get_grid(levelmin+i-1) ); //... clean up the_tf_kernel->deallocate(); @@ -729,10 +733,10 @@ void GenerateDensityHierarchy( config_file& cf, transfer_function *ptf, tf_type the_tf_kernel->deallocate(); - //coarse->subtract_mean(); + coarse->subtract_mean(); //... upload data to coarser grid - //coarse->upload_bnd_add( *delta.get_grid(levelmax-1) ); + coarse->upload_bnd_add( *delta.get_grid(levelmax-1) ); delete coarse; } diff --git a/random.cc b/random.cc index 86cd39c..4177afc 100644 --- a/random.cc +++ b/random.cc @@ -1563,7 +1563,8 @@ template< typename rng, typename T > void random_number_generator::compute_random_numbers( void ) { bool kavg = pcf_->getValueSafe("random","kaveraging",true); - bool rndsign = pcf_->getValueSafe("random","grafic_sign",false); + bool rndsign = pcf_->getValueSafe("random","grafic_sign",false); + bool brealspace_tf = !pcf_->getValue("setup","kspace_tf"); std::vector< rng* > randc(std::max(levelmax_,levelmin_seed_)+1,(rng*)NULL); @@ -1595,28 +1596,27 @@ void random_number_generator::compute_random_numbers( void ) //... seeds are given for a level finer than levelmin, obtain by averaging if( levelmin_seed_ > levelmin_ ) { - if( rngfnames_[levelmin_seed_].size() > 0 ) + if( rngfnames_[levelmin_seed_].size() > 0 ) randc[levelmin_seed_] = new rng( 1<= (int)levelmin_; --ilevel ){ - if( rngseeds_[ilevel-levelmin_] > 0 ) - LOGINFO("Warning: random seed for level %d will be ignored.\n" \ - " consistency requires that it is obtained by restriction from level %d", ilevel, levelmin_seed_ ); - - - if( ilevel >= levelmax_ ) - randc[ilevel] = new rng( *randc[ilevel+1], kavg ); - else - randc[ilevel] = new rng( *randc[ilevel+1], kavg ); - - if( ilevel+1 > levelmax_ ) - { - delete randc[ilevel+1]; - randc[ilevel+1] = NULL; - } - } + for( int ilevel = levelmin_seed_-1; ilevel >= (int)levelmin_; --ilevel ){ + if( rngseeds_[ilevel-levelmin_] > 0 ) + LOGINFO("Warning: random seed for level %d will be ignored.\n" \ + " consistency requires that it is obtained by restriction from level %d", ilevel, levelmin_seed_ ); + + if( brealspace_tf && ilevel < levelmax_ ) + randc[ilevel] = new rng( *randc[ilevel+1], false ); + else // do k-space averaging + randc[ilevel] = new rng( *randc[ilevel+1], kavg ); + + if( ilevel+1 > levelmax_ ) + { + delete randc[ilevel+1]; + randc[ilevel+1] = NULL; + } + } } @@ -1682,11 +1682,14 @@ void random_number_generator::compute_random_numbers( void ) delete randc[levelmax_]; randc[levelmax_] = NULL; - //... make sure that the coarse grid contains oct averages where it overlaps with a fine grid - //... this also ensures that constraints enforced on fine grids are carried to the coarser grids - //for( int ilevel=levelmax_; ilevel>levelmin_; --ilevel ) - // correct_avg( ilevel-1, ilevel ); - + //... make sure that the coarse grid contains oct averages where it overlaps with a fine grid + //... this also ensures that constraints enforced on fine grids are carried to the coarser grids + if( brealspace_tf ) + { + for( int ilevel=levelmax_; ilevel>levelmin_; --ilevel ) + correct_avg( ilevel-1, ilevel ); + } + //.. we do not have random numbers for a coarse level, generate them /*if( levelmax_rand_ >= (int)levelmin_ ) {