SubWorld.h
Go to the documentation of this file.
/*****************************************************************************
*
* Copyright (c) 2014-2018 by The University of Queensland
* http://www.uq.edu.au
*
* Primary Business: Queensland, Australia
* Licensed under the Apache License, version 2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Development until 2012 by Earth Systems Science Computational Center (ESSCC)
* Development 2012-2013 by School of Earth Sciences
* Development from 2014-2017 by Centre for Geoscience Computing (GeoComp)
* Development from 2019 by School of Earth and Environmental Sciences
**
*****************************************************************************/
#ifndef escript_SubWorld_H
#define escript_SubWorld_H
#include "AbstractDomain.h"
#include "AbstractReducer.h"
#include "EsysMPI.h"
namespace escript
{
class ESCRIPT_DLL_API SubWorld : public REFCOUNT_BASE_CLASS(SubWorld)
{
public:
SubWorld(JMPI& globalcom, JMPI& comm, JMPI& corr,
unsigned int subworldcount, unsigned int local_id,
bool manualimport);
~SubWorld();
void setDomain(Domain_ptr d);
Domain_ptr getDomain();
JMPI& getMPI();
JMPI& getCorrMPI();
void addJob(boost::python::object j); // add a Job to the current batch
char runJobs(std::string& errmsg); // run all jobs in the current batch
void clearJobs(); // remove all jobs in the current batch
void addVariable(std::string&, Reducer_ptr& red);
void removeVariable(std::string& name);
void clearVariable(std::string& name);
std::list<std::pair<std::string, bool> > getVarList();
std::list<std::pair<std::string, std::string> > getVarInfo();
size_t getNumVars();
bool localTransport(std::string& errmsg); // gather exported values from jobs
bool checkRemoteCompatibility(std::string& errmsg); // check to ensure values
// in all worlds are compatible
bool deliverImports(std::string& errmsg); // load imports into Job objects
bool amLeader(); // true if this proc is the leader for its world
DataTypes::real_t getScalarVariable(const std::string& name);
boost::python::object getLocalObjectVariable(const std::string& name);
void debug(); // print out current state information
bool synchVariableInfo(std::string& err);
bool synchVariableValues(std::string& err);
void resetInterest();
void copyVariable(const std::string& src, const std::string& dest);
void newRunJobs();
private:
JMPI everyone; // communicator linking all procs in all subworlds
JMPI swmpi; // communicator linking all procs in this subworld
JMPI corrmpi; // communicator linking corresponding procs in all subworlds
// eg: If this proc is the first in its domain, then corrmpi
// links to the other "first in its domain" processes.
// (So one in each SubWorld).
escript::Domain_ptr domain;
std::vector<boost::python::object> jobvec; // jobs in the current batch
unsigned int swcount; // number of subwords
unsigned int localid; // position of this subworld in that sequence
typedef std::map<std::string, Reducer_ptr> str2reduce;
typedef std::map<std::string, unsigned char> str2char;
str2reduce reducemap; // map: name ->reducer for that variable
str2char varstate; // using the state values from AbstractReducer.h
bool manualimports;
#ifdef ESYS_MPI
std::vector<unsigned char> globalvarinfo; // info about which worlds want which vars
// [vars on process0][vars on process 1][vars on ...]
typedef std::map<unsigned char, int> countmap;
typedef std::map<std::string, countmap> str2countmap;
str2countmap globalvarcounts;
bool globalinfoinvalid;
bool makeComm(MPI_Comm& sourcecom, JMPI& sub,std::vector<int>& members);
// a group with NEW nodes at the front and INT and OLDINT at the back
// NONE worlds get an empty communicator
bool makeGroupComm1(MPI_Comm& srccom, int vnum, char mystate, JMPI& com);
// reduce on the first group and copy from cop[0] to others in cop
bool makeGroupReduceGroups(MPI_Comm& srccom, int vnum, char mystate, JMPI& red, JMPI& cop, bool& incopy);
// A group with a single OLD or OLDINT at the front and all the INT worlds
// following it
bool makeGroupComm2(MPI_Comm& srccom, int vnum, char mystate, JMPI& com, bool& ingroup);
#endif
// change the various views of a variable's state
void setMyVarState(const std::string& vname, char state);
void setVarState(const std::string& vname, char state, int swid);
void setAllVarsState(const std::string& name, char state);
};
typedef boost::shared_ptr<SubWorld> SubWorld_ptr;
} // namespace escript
#endif
AbstractDomain.h
AbstractReducer.h
EsysMPI.h
MPI_Comm
int MPI_Comm
Definition: EsysMPI.h:44
REFCOUNT_BASE_CLASS
#define REFCOUNT_BASE_CLASS(x)
Definition: Pointers.h:31
escript::SubWorld
Definition: SubWorld.h:49
escript::SubWorld::varstate
str2char varstate
Definition: SubWorld.h:111
escript::SubWorld::swmpi
JMPI swmpi
Definition: SubWorld.h:96
escript::SubWorld::jobvec
std::vector< boost::python::object > jobvec
Definition: SubWorld.h:102
escript::SubWorld::manualimports
bool manualimports
Definition: SubWorld.h:113
escript::SubWorld::domain
escript::Domain_ptr domain
Definition: SubWorld.h:101
escript::SubWorld::reducemap
str2reduce reducemap
Definition: SubWorld.h:110
escript::SubWorld::corrmpi
JMPI corrmpi
Definition: SubWorld.h:97
escript::SubWorld::str2reduce
std::map< std::string, Reducer_ptr > str2reduce
Definition: SubWorld.h:108
escript::SubWorld::swcount
unsigned int swcount
Definition: SubWorld.h:105
escript::SubWorld::str2char
std::map< std::string, unsigned char > str2char
Definition: SubWorld.h:109
escript::SubWorld::localid
unsigned int localid
Definition: SubWorld.h:106
escript::SubWorld::everyone
JMPI everyone
Definition: SubWorld.h:95
ESCRIPT_DLL_API
#define ESCRIPT_DLL_API
Definition: escriptcore/src/system_dep.h:30
escript::DataTypes::real_t
double real_t
type of all real-valued scalars in escript
Definition: DataTypes.h:52
escript
Definition: AbstractContinuousDomain.cpp:23
escript::SubWorld_ptr
boost::shared_ptr< SubWorld > SubWorld_ptr
Definition: SubWorld.h:147
escript::Reducer_ptr
boost::shared_ptr< AbstractReducer > Reducer_ptr
Definition: AbstractReducer.h:119
escript::Domain_ptr
boost::shared_ptr< AbstractDomain > Domain_ptr
Definition: AbstractDomain.h:41
escript::JMPI
boost::shared_ptr< JMPI_ > JMPI
Definition: EsysMPI.h:74