#include "xmlioserver_spl.hpp" #include "cxios.hpp" #include "client.hpp" #include #include "type.hpp" #include "context.hpp" #include "context_client.hpp" #include "oasis_cinterface.hpp" #include #include "timer.hpp" namespace xios { MPI_Comm CClient::intraComm ; MPI_Comm CClient::interComm ; int CClient::serverLeader ; bool CClient::is_MPI_Initialized ; void CClient::initialize(const string& codeId,MPI_Comm& localComm,MPI_Comm& returnComm) { int initialized ; MPI_Initialized(&initialized) ; if (initialized) is_MPI_Initialized=true ; else is_MPI_Initialized=false ; // don't use OASIS if (!CXios::usingOasis) { // localComm doesn't given if (localComm == MPI_COMM_NULL) { if (!is_MPI_Initialized) { int argc=0; char** argv=NULL; MPI_Init(&argc,&argv) ; } boost::hash hashString ; unsigned long hashClient=hashString(codeId) ; unsigned long hashServer=hashString(CXios::xiosCodeId) ; unsigned long* hashAll ; int rank ; int size ; int myColor ; int i,c ; MPI_Comm newComm ; MPI_Comm_size(CXios::globalComm,&size) ; MPI_Comm_rank(CXios::globalComm,&rank); hashAll=new unsigned long[size] ; MPI_Allgather(&hashClient,1,MPI_LONG,hashAll,1,MPI_LONG,CXios::globalComm) ; map colors ; map leaders ; for(i=0,c=0;iinitClient(contextComm,contextInterComm) ; } else { MPI_Comm contextInterComm ; MPI_Comm_dup(contextComm,&contextInterComm) ; context->initClient(contextComm,contextInterComm) ; context->initServer(contextComm,contextInterComm) ; } } void CClient::finalize(void) { int rank ; int msg=0 ; if (!CXios::isServer) { MPI_Comm_rank(intraComm,&rank) ; if (rank==0) { MPI_Send(&msg,1,MPI_INT,0,0,interComm) ; } } if (!is_MPI_Initialized) { if (CXios::usingOasis) oasis_finalize(); else MPI_Finalize() ; } info(20) << "Client side context is finalized"<