Import Geant4 10.4.0 source tree

This commit is contained in:
Gabriele Cosmo
2017-12-08 12:52:30 +01:00
parent 98e455a940
commit fc6af9e721
2166 changed files with 276760 additions and 100873 deletions
@@ -4,17 +4,12 @@
#ifndef tools_mpi_wrmpi
#define tools_mpi_wrmpi
#ifdef TOOLS_USE_NATIVE_MPI
#include <mpi.h>
#else
#include "dummy_mpi.h"
#endif
#include "wait_buffer"
#include <tools/impi>
#include <tools/vdata>
#include <tools/realloc>
#include <tools/mnmx>
#include <ostream>
#ifdef TOOLS_MEM
#include <tools/mem>
@@ -53,6 +48,36 @@ protected:
return s_v;
}
public: //inlib::mpi::impi
virtual bool pack(char a_val) {
tools::uint32 sz = tools::uint32(sizeof(char));
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
if(::MPI_Pack(&a_val,1,MPI_CHAR,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Pack(char) failed." << std::endl;
return false;
}
m_pos += sz;
return true;
}
virtual bool pack(short a_val) {
tools::uint32 sz = tools::uint32(sizeof(short));
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
if(::MPI_Pack(&a_val,1,MPI_SHORT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Pack(short) failed." << std::endl;
return false;
}
m_pos += sz;
return true;
}
virtual bool pack(int a_val) {
tools::uint32 sz = tools::uint32(sizeof(int));
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
if(::MPI_Pack(&a_val,1,MPI_INT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Pack(int) failed." << std::endl;
return false;
}
m_pos += sz;
return true;
}
virtual bool pack(unsigned int a_val) {
tools::uint32 sz = tools::uint32(sizeof(unsigned int));
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
@@ -83,6 +108,16 @@ public: //inlib::mpi::impi
m_pos += sz;
return true;
}
virtual bool pack(float a_val) {
tools::uint32 sz = tools::uint32(sizeof(float));
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
if(::MPI_Pack(&a_val,1,MPI_FLOAT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Pack(float) failed." << std::endl;
return false;
}
m_pos += sz;
return true;
}
virtual bool pack(double a_val) {
tools::uint32 sz = tools::uint32(sizeof(double));
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
@@ -197,6 +232,30 @@ public: //inlib::mpi::impi
return true;
}
public: //inlib::mpi::impi
virtual bool unpack(char& a_val) {
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_CHAR,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Unpack(char) failed." << std::endl;
a_val = 0;
return false;
}
return true;
}
virtual bool unpack(short& a_val) {
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_SHORT,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Unpack(short) failed." << std::endl;
a_val = 0;
return false;
}
return true;
}
virtual bool unpack(int& a_val) {
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_INT,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Unpack(int) failed." << std::endl;
a_val = 0;
return false;
}
return true;
}
virtual bool unpack(unsigned int& a_val) {
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_UNSIGNED,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Unpack(unsigned int) failed." << std::endl;
@@ -221,6 +280,14 @@ public: //inlib::mpi::impi
}
return true;
}
virtual bool unpack(float& a_val) {
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_FLOAT,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Unpack(float) failed." << std::endl;
a_val = 0;
return false;
}
return true;
}
virtual bool unpack(double& a_val) {
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_DOUBLE,m_comm)!=MPI_SUCCESS) {
m_out << "tools::mpi::wrmpi : MPI_Unpack(double) failed." << std::endl;
@@ -330,6 +397,28 @@ public: //inlib::mpi::impi
}
return true;
}
virtual bool wait_buffer(int a_rank,int a_src,int a_tag,int& a_probe_src,bool a_verbose = false) {
int buffer_size = 0;
char* _buffer = 0;
if (!mpi::wait_buffer(m_out,a_rank,a_src,a_tag,m_comm,buffer_size,_buffer,a_probe_src,a_verbose)) {
m_out << "tools::mpi::wrmpi::wait_buffer : failed for rank " << a_rank << " and source " << a_src <<"." << std::endl;
return false;
}
// we take ownership of buffer :
delete [] m_buffer;
m_size = buffer_size;
m_buffer = _buffer;
m_max = m_buffer+m_size;
m_pos = m_buffer;
m_ipos = 0; //IMPORTANT
return true;
}
virtual bool wait_buffer(int a_rank,int a_tag,int& a_probe_src,bool a_verbose = false) {
return wait_buffer(a_rank,MPI_ANY_SOURCE,a_tag,a_probe_src,a_verbose);
}
public:
wrmpi(std::ostream& a_out,const MPI_Comm& a_comm,tools::uint32 a_size = 128) // we expect a_size!=0
:m_out(a_out)