2019-05-07 01:05:16 +02:00
|
|
|
#include <cmath>
|
|
|
|
#include <complex>
|
|
|
|
#include <iostream>
|
|
|
|
#include <fstream>
|
|
|
|
#include <thread>
|
|
|
|
|
2019-05-22 22:25:27 +02:00
|
|
|
#if defined(_OPENMP)
|
|
|
|
#include <omp.h>
|
|
|
|
#endif
|
|
|
|
|
2019-05-07 01:05:16 +02:00
|
|
|
#include <general.hh>
|
2019-05-24 10:23:49 +02:00
|
|
|
#include <ic_generator.hh>
|
2019-05-07 01:05:16 +02:00
|
|
|
|
|
|
|
|
2019-05-19 12:05:04 +02:00
|
|
|
// initialise with "default" values
|
2019-05-07 01:05:16 +02:00
|
|
|
namespace CONFIG{
|
|
|
|
int MPI_thread_support = -1;
|
|
|
|
int MPI_task_rank = 0;
|
|
|
|
int MPI_task_size = 1;
|
|
|
|
bool MPI_ok = false;
|
|
|
|
bool MPI_threads_ok = false;
|
|
|
|
bool FFTW_threads_ok = false;
|
2019-05-22 22:25:27 +02:00
|
|
|
int num_threads = 1;
|
2019-05-15 05:30:47 +02:00
|
|
|
}
|
2019-05-07 01:05:16 +02:00
|
|
|
|
2019-05-22 22:25:27 +02:00
|
|
|
|
2019-05-24 08:13:58 +02:00
|
|
|
#include "system_stat.hh"
|
|
|
|
|
2019-05-22 22:25:27 +02:00
|
|
|
int main( int argc, char** argv )
|
|
|
|
{
|
|
|
|
csoca::Logger::SetLevel(csoca::LogLevel::Info);
|
|
|
|
// csoca::Logger::SetLevel(csoca::LogLevel::Debug);
|
2019-05-12 18:48:01 +02:00
|
|
|
|
2019-05-22 22:25:27 +02:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// initialise MPI
|
|
|
|
//------------------------------------------------------------------------------
|
2019-05-24 08:13:58 +02:00
|
|
|
|
2019-05-22 22:25:27 +02:00
|
|
|
#if defined(USE_MPI)
|
|
|
|
MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &CONFIG::MPI_thread_support);
|
|
|
|
CONFIG::MPI_threads_ok = CONFIG::MPI_thread_support >= MPI_THREAD_FUNNELED;
|
|
|
|
MPI_Comm_rank(MPI_COMM_WORLD, &CONFIG::MPI_task_rank);
|
|
|
|
MPI_Comm_size(MPI_COMM_WORLD, &CONFIG::MPI_task_size);
|
|
|
|
CONFIG::MPI_ok = true;
|
2019-05-12 18:48:01 +02:00
|
|
|
|
2019-05-22 22:25:27 +02:00
|
|
|
// set up lower logging levels for other tasks
|
|
|
|
if( CONFIG::MPI_task_rank!=0 )
|
|
|
|
{
|
|
|
|
csoca::Logger::SetLevel(csoca::LogLevel::Error);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2019-05-24 08:13:58 +02:00
|
|
|
csoca::ilog << "-----------------------------------------------------------------------------" << std::endl
|
|
|
|
<< ">> FastLPT v0.1 >>" << std::endl
|
|
|
|
<< "-----------------------------------------------------------------------------" << std::endl;
|
|
|
|
|
|
|
|
|
2019-05-22 22:25:27 +02:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Parse command line options
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
if (argc != 2)
|
|
|
|
{
|
|
|
|
// print_region_generator_plugins();
|
|
|
|
print_TransferFunction_plugins();
|
|
|
|
print_RNG_plugins();
|
|
|
|
print_output_plugins();
|
|
|
|
|
|
|
|
csoca::elog << "In order to run, you need to specify a parameter file!" << std::endl;
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
// open the configuration file
|
|
|
|
ConfigFile the_config(argv[1]);
|
2019-05-21 22:27:45 +02:00
|
|
|
|
2019-05-22 22:25:27 +02:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Set up FFTW
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#if defined(USE_FFTW_THREADS)
|
|
|
|
#if defined(USE_MPI)
|
|
|
|
if (CONFIG::MPI_threads_ok)
|
|
|
|
CONFIG::FFTW_threads_ok = FFTW_API(init_threads)();
|
|
|
|
#else
|
|
|
|
CONFIG::FFTW_threads_ok = FFTW_API(init_threads)();
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(USE_MPI)
|
|
|
|
FFTW_API(mpi_init)();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
CONFIG::num_threads = the_config.GetValueSafe<unsigned>("execution", "NumThreads",std::thread::hardware_concurrency());
|
|
|
|
|
|
|
|
#if defined(USE_FFTW_THREADS)
|
|
|
|
if (CONFIG::FFTW_threads_ok)
|
|
|
|
FFTW_API(plan_with_nthreads)(CONFIG::num_threads);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Set up OpenMP
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#if defined(_OPENMP)
|
|
|
|
omp_set_num_threads(CONFIG::num_threads);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Write code configuration to screen
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
#if defined(USE_MPI)
|
2019-05-24 08:13:58 +02:00
|
|
|
csoca::ilog << std::setw(40) << std::left << "MPI is enabled" << " : " << "yes (" << CONFIG::MPI_task_size << " tasks)" << std::endl;
|
2019-05-22 22:25:27 +02:00
|
|
|
#else
|
2019-05-24 08:13:58 +02:00
|
|
|
csoca::ilog << std::setw(40) << std::left << "MPI is enabled" << " : " << "no" << std::endl;
|
2019-05-22 22:25:27 +02:00
|
|
|
#endif
|
2019-05-24 08:13:58 +02:00
|
|
|
csoca::ilog << std::setw(40) << std::left << "MPI supports multi-threading" << " : " << (CONFIG::MPI_threads_ok? "yes" : "no") << std::endl;
|
|
|
|
csoca::ilog << std::setw(40) << std::left << "Available HW threads / task" << " : " << std::thread::hardware_concurrency() << " (" << CONFIG::num_threads << " used)" << std::endl;
|
|
|
|
csoca::ilog << std::setw(40) << std::left << "FFTW supports multi-threading" << " : " << (CONFIG::FFTW_threads_ok? "yes" : "no") << std::endl;
|
|
|
|
csoca::ilog << std::setw(40) << std::left << "FFTW mode" << " : ";
|
2019-05-22 22:25:27 +02:00
|
|
|
#if defined(FFTW_MODE_PATIENT)
|
2019-05-24 08:13:58 +02:00
|
|
|
csoca::ilog << "FFTW_PATIENT" << std::endl;
|
2019-05-22 22:25:27 +02:00
|
|
|
#elif defined(FFTW_MODE_MEASURE)
|
2019-05-24 08:13:58 +02:00
|
|
|
csoca::ilog << "FFTW_MEASURE" << std::endl;
|
2019-05-22 22:25:27 +02:00
|
|
|
#else
|
2019-05-24 08:13:58 +02:00
|
|
|
csoca::ilog << "FFTW_ESTIMATE" << std::endl;
|
2019-05-22 22:25:27 +02:00
|
|
|
#endif
|
2019-05-24 08:13:58 +02:00
|
|
|
|
|
|
|
SystemStat::Memory mem;
|
|
|
|
|
|
|
|
unsigned availpmem = mem.get_AvailMem()/1024/1024;
|
|
|
|
unsigned usedpmem = mem.get_UsedMem()/1024/1024;
|
|
|
|
unsigned maxpmem = availpmem, minpmem = availpmem;
|
|
|
|
unsigned maxupmem = usedpmem, minupmem = usedpmem;
|
2019-05-22 22:25:27 +02:00
|
|
|
|
2019-05-24 08:13:58 +02:00
|
|
|
#if defined(USE_MPI)
|
2019-05-24 10:33:10 +02:00
|
|
|
unsigned temp = 0;
|
|
|
|
MPI_Allreduce(&minpmem,&temp,1,MPI_UNSIGNED,MPI_MIN,MPI_COMM_WORLD); minpmem = temp;
|
|
|
|
MPI_Allreduce(&maxpmem,&temp,1,MPI_UNSIGNED,MPI_MAX,MPI_COMM_WORLD); maxpmem = temp;
|
|
|
|
MPI_Allreduce(&minupmem,&temp,1,MPI_UNSIGNED,MPI_MIN,MPI_COMM_WORLD); minupmem = temp;
|
|
|
|
MPI_Allreduce(&maxupmem,&temp,1,MPI_UNSIGNED,MPI_MAX,MPI_COMM_WORLD); maxupmem = temp;
|
2019-05-24 08:13:58 +02:00
|
|
|
#endif
|
|
|
|
csoca::ilog << std::setw(40) << std::left << "Total system memory (phys)" << " : " << mem.get_TotalMem()/1024/1024 << " Mb" << std::endl;
|
|
|
|
csoca::ilog << std::setw(40) << std::left << "Used system memory (phys)" << " : " << "Max: " << maxupmem << " Mb, Min: " << minupmem << " Mb" << std::endl;
|
|
|
|
csoca::ilog << std::setw(40) << std::left << "Available system memory (phys)" << " : " << "Max: " << maxpmem << " Mb, Min: " << minpmem << " Mb" << std::endl;
|
2019-05-22 22:25:27 +02:00
|
|
|
|
2019-05-24 08:13:58 +02:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
// Initialise plug-ins
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
try
|
|
|
|
{
|
2019-05-24 10:23:49 +02:00
|
|
|
ic_generator::Initialise( the_config );
|
2019-05-24 08:13:58 +02:00
|
|
|
}catch(...){
|
|
|
|
csoca::elog << "Problem during initialisation. See error(s) above. Exiting..." << std::endl;
|
|
|
|
#if defined(USE_MPI)
|
|
|
|
MPI_Finalize();
|
|
|
|
#endif
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2019-05-22 22:25:27 +02:00
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
// do the job...
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
2019-05-24 10:23:49 +02:00
|
|
|
ic_generator::Run( the_config );
|
2019-05-22 22:25:27 +02:00
|
|
|
///////////////////////////////////////////////////////////////////////
|
2019-05-07 01:05:16 +02:00
|
|
|
|
|
|
|
#if defined(USE_MPI)
|
|
|
|
MPI_Barrier(MPI_COMM_WORLD);
|
|
|
|
MPI_Finalize();
|
|
|
|
#endif
|
|
|
|
|
2019-05-23 14:53:11 +02:00
|
|
|
csoca::ilog << "Done." << std::endl;
|
|
|
|
|
2019-05-07 01:05:16 +02:00
|
|
|
return 0;
|
|
|
|
}
|