#ifndef SETTINGS_HPP_ #define SETTINGS_HPP_ #ifndef HAVE_MPI #error You need MPI in order to compile VMG::MPI::Settings #endif #include #include #include "comm/mpi/datatypes_global.hpp" #include "comm/mpi/datatypes_local.hpp" #include "comm/mpi/key.hpp" namespace VMG { class TempGrid; namespace MPI { class DatatypesGlobal; class Settings { public: Settings(); ~Settings(); void ComputeSettings(Multigrid& sol, Multigrid& rhs, MPI_Comm& comm); Grid& FinerGrid(const Grid& grid); Grid& CoarserGrid(const Grid& grid); MPI_Comm CommunicatorGlobal(const Grid& grid) const; MPI_Comm CommunicatorLocal(const Grid& grid) const; MPI_Datatype& Datatype(const Index& begin, const Index& end, const Index& size_local, const Index& size_global, const int& level); VMG::MPI::DatatypesGlobal& DatatypesGlobal(const Grid& grid_old, const Grid& grid_new, const int& direction); VMG::MPI::DatatypesLocal& DatatypesLocal(const Grid& grid); private: Index GlobalDims(MPI_Comm comm, Index pos); void AddDatatypeGlobal(const Grid& grid_old, const Grid& grid_new, const int& direction); void CreateGlobalCommunicator(MPI_Comm& comm_global, const Grid* grid_1, const Grid* grid_2=NULL, const Grid* grid_3=NULL); void CreateLocalCommunicator(MPI_Comm& comm_global, const Grid& grid); std::map communicators_global; std::map communicators_local; std::set communicators_local_unique; std::map finer_grids, coarser_grids; std::map datatypes; std::map datatypes_global; std::map datatypes_local; }; } } #endif /* SETTINGS_HPP_ */