// Compile with g++ -fopenmp flag in both CXXFLAGS & LDFLAGS

#include "libscl.h"
#include <omp.h>

using namespace std;
using namespace scl;

int main(int argc, char** argp, char** envp)
{

  // Get environment information
  INTEGER procs = omp_get_num_procs();
  INTEGER nthreads = omp_get_num_threads();
  INTEGER maxt = omp_get_max_threads();
  INTEGER inpar = omp_in_parallel(); 
  INTEGER dynamic = omp_get_dynamic(); 
  INTEGER nested = omp_get_nested();

  // Print environment information
  cout << '\n';
  cout << "Number of processors = " << procs << '\n';
  cout << "Number of threads = " << nthreads << '\n';
  cout << "Max threads = " <<  maxt  << '\n';
  cout << "Code block running in parallel? = " << inpar << '\n';
  cout << "Dynamic threads enabled? = " << dynamic << '\n';
  cout << "Nested parallelism supported? = " << nested << '\n';
  cout << '\n';

  INTEGER tid;
  string msg;

  #pragma omp parallel private(nthreads, tid, msg)
  {
    tid = omp_get_thread_num();
    msg = "Hello from thread =" + fmt('d',3,tid)() + "\n";
    cout << msg;
  
    if (tid == 0) {
      inpar = omp_in_parallel();
      msg = "\n";
      if (inpar) msg += "Code block running in parallel\n";
      else msg += "Code block running serial\n";
      nthreads = omp_get_num_threads();
      msg += "Number of threads =" + fmt('d',3,nthreads)();
      msg += "\n\n";
      cout << msg;
    }
  } 
  return 0;
}
