Skip to content
Snippets Groups Projects
Select Git revision
  • d1fabcaae6fc493407697be54f6b3d6e4698d76d
  • develop default protected
  • feature/gmsh-reader
  • origin/stage/bouguettaia
  • feature/kinetic-schemes
  • feature/reconstruction
  • feature/local-dt-fsi
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • feature/serraille
  • feature/variational-hydro
  • feature/composite-scheme
  • hyperplastic
  • feature/polynomials
  • feature/gks
  • feature/implicit-solver-o2
  • feature/coupling_module
  • feature/implicit-solver
  • feature/merge-local-dt-fsi
  • master protected
  • feature/escobar-smoother
  • v0.5.0 protected
  • v0.4.1 protected
  • v0.4.0 protected
  • v0.3.0 protected
  • v0.2.0 protected
  • v0.1.0 protected
  • Kidder
  • v0.0.4 protected
  • v0.0.3 protected
  • v0.0.2 protected
  • v0 protected
  • v0.0.1 protected
33 results

PugsUtils.cpp

Blame
  • Messenger.cpp 1.44 KiB
    #include <Messenger.hpp>
    #include <PastisOStream.hpp>
    
    #include <pastis_config.hpp>
    
    #ifdef PASTIS_HAS_MPI
    #include <mpi.h>
    #endif // PASTIS_HAS_MPI
    
    Messenger* Messenger::m_instance = nullptr;
    
    void Messenger::create(int& argc, char* argv[])
    {
      if (Messenger::m_instance == nullptr) {
        Messenger::m_instance = new Messenger(argc, argv);
      } else {
        std::cerr << "Messenger already created\n";
        std::exit(1);
      }
    }
    
    void Messenger::destroy()
    {
      // One allows multiple destruction to handle unexpected code exit
      if (Messenger::m_instance != nullptr) {
        delete Messenger::m_instance;
        Messenger::m_instance = nullptr;
      }
    }
    
    Messenger::
    Messenger(int& argc, char* argv[])
    {
    #ifdef PASTIS_HAS_MPI
      MPI_Init(&argc, &argv);
      MPI_Comm_rank(MPI_COMM_WORLD, &m_rank);
      MPI_Comm_size(MPI_COMM_WORLD, &m_size);
    
      if (m_rank != 0) {
        pout.setOutput(null_stream);
        perr.setOutput(null_stream);
      }
    #endif // PASTIS_HAS_MPI
    }
    
    Messenger::
    ~Messenger()
    {
    #ifdef PASTIS_HAS_MPI
      MPI_Finalize();
    #endif // PASTIS_HAS_MPI
    }
    
    
    void Messenger::barrier() const
    {
    #ifdef PASTIS_HAS_MPI
      MPI_Barrier(MPI_COMM_WORLD);
    #endif // PASTIS_HAS_MPI
    }
    
    Array<int> Messenger::
    _broadcast(Array<int>& array, int root_rank) const
    {
      int size = array.size();
      MPI_Bcast(&size, 1,  MPI_INT, root_rank, MPI_COMM_WORLD);
      if (commRank() != root_rank) {
        array = Array<int>(size);
      }
      MPI_Bcast(&(array[0]), array.size(), MPI_INT, root_rank, MPI_COMM_WORLD);
      return array;
    }