Warning, /include/Geant4/tools/histo/hd2mpi is written in an unsupported language. File is not indexed.
0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003
0004 #ifndef tools_histo_hd2mpi
0005 #define tools_histo_hd2mpi
0006
0007 // code to MPI_Pack, MPI_Unpack histos without having to include mpi.h.
0008
0009 #include "../impi"
0010
0011 #include "histo_data"
0012
0013 #include "../forit"
0014
0015 namespace tools {
0016 namespace histo {
0017
0018 /////////////////////////////////////////////////////////////////////////////
0019 /// hist_data to mpi ////////////////////////////////////////////////////////
0020 /////////////////////////////////////////////////////////////////////////////
0021
0022 inline bool axis_dui_pack(impi& a_mpi,const axis<double,unsigned int>& a_axis) {
0023 //typedef double TC;
0024 //typedef unsigned int TO;
0025 //typedef unsigned int bn_t;
0026 if(!a_mpi.pack(a_axis.m_offset)) return false; //TO
0027 if(!a_mpi.pack(a_axis.m_number_of_bins)) return false; //bn_t
0028 if(!a_mpi.pack(a_axis.m_minimum_value)) return false; //TC
0029 if(!a_mpi.pack(a_axis.m_maximum_value)) return false; //TC
0030 if(!a_mpi.bpack(a_axis.m_fixed)) return false;
0031 if(!a_mpi.pack(a_axis.m_bin_width)) return false; //TC
0032 if(!a_mpi.vpack(a_axis.m_edges)) return false; //TC
0033 return true;
0034 }
0035
0036 inline bool histo_data_duiuid_pack(impi& a_mpi,const histo_data<double,unsigned int,unsigned int,double>& a_hd) {
0037 //typedef double TC;
0038 //typedef unsigned int TO;
0039 //typedef unsigned int TN;
0040 //typedef double TW;
0041 //typedef unsigned int dim_t;
0042 typedef unsigned int num_t;
0043
0044 if(!a_mpi.spack(a_hd.m_title)) return false;
0045 if(!a_mpi.pack(a_hd.m_dimension)) return false; //dim_t
0046 if(!a_mpi.pack(a_hd.m_bin_number)) return false; //TO
0047 if(!a_mpi.vpack(a_hd.m_bin_entries)) return false; //TN
0048 if(!a_mpi.vpack(a_hd.m_bin_Sw)) return false; //TW
0049 if(!a_mpi.vpack(a_hd.m_bin_Sw2)) return false; //TW
0050
0051 {for(unsigned int ibin=0;ibin<a_hd.m_bin_number;ibin++) {
0052 if(!a_mpi.vpack(a_hd.m_bin_Sxw[ibin])) return false;
0053 }}
0054 {for(unsigned int ibin=0;ibin<a_hd.m_bin_number;ibin++) {
0055 if(!a_mpi.vpack(a_hd.m_bin_Sx2w[ibin])) return false;
0056 }}
0057
0058 // Axes :
0059 {for(unsigned int iaxis=0;iaxis<a_hd.m_dimension;iaxis++) {
0060 if(!axis_dui_pack(a_mpi,a_hd.m_axes[iaxis])) return false;
0061 }}
0062
0063 // etc :
0064 if(!a_mpi.vpack(a_hd.m_in_range_plane_Sxyw)) return false; //TC
0065
0066 // Annotations :
0067 {if(!a_mpi.pack((num_t)a_hd.m_annotations.size())) return false; //num_t
0068 tools_mforcit(std::string,std::string,a_hd.m_annotations,it) {
0069 if(!a_mpi.spack((*it).first)) return false;
0070 if(!a_mpi.spack((*it).second)) return false;
0071 }}
0072
0073 // fast getters :
0074 if(!a_mpi.pack(a_hd.m_all_entries)) return false; //TN
0075 if(!a_mpi.pack(a_hd.m_in_range_entries)) return false; //TN
0076 if(!a_mpi.pack(a_hd.m_in_range_Sw)) return false; //TW
0077 if(!a_mpi.pack(a_hd.m_in_range_Sw2)) return false; //TW
0078 if(!a_mpi.vpack(a_hd.m_in_range_Sxw)) return false; //TC
0079 if(!a_mpi.vpack(a_hd.m_in_range_Sx2w)) return false; //TC
0080
0081 return true;
0082 }
0083
0084 /////////////////////////////////////////////////////////////////////////////
0085 /// mpi to hist_data ////////////////////////////////////////////////////////
0086 /////////////////////////////////////////////////////////////////////////////
0087
0088 inline bool axis_dui_unpack(impi& a_mpi,axis<double,unsigned int>& a_axis) {
0089 //typedef double TC;
0090 //typedef unsigned int TO;
0091 //typedef unsigned int bn_t;
0092
0093 if(!a_mpi.unpack(a_axis.m_offset)) return false; //TO
0094 if(!a_mpi.unpack(a_axis.m_number_of_bins)) return false; //bn_t
0095 if(!a_mpi.unpack(a_axis.m_minimum_value)) return false; //TC
0096 if(!a_mpi.unpack(a_axis.m_maximum_value)) return false; //TC
0097 if(!a_mpi.bunpack(a_axis.m_fixed)) return false;
0098 if(!a_mpi.unpack(a_axis.m_bin_width)) return false; //TC
0099 if(!a_mpi.vunpack(a_axis.m_edges)) return false; //TC
0100
0101 return true;
0102 }
0103
0104 inline bool histo_data_duiuid_unpack(impi& a_mpi,histo_data<double,unsigned int,unsigned int,double>& a_hd) {
0105 //typedef double TC;
0106 //typedef unsigned int TO;
0107 //typedef unsigned int TN;
0108 //typedef double TW;
0109 //typedef unsigned int dim_t;
0110 typedef unsigned int num_t;
0111
0112 if(!a_mpi.sunpack(a_hd.m_title)) return false;
0113 if(!a_mpi.unpack(a_hd.m_dimension)) return false; //dim_t
0114 if(!a_mpi.unpack(a_hd.m_bin_number)) return false; //TO
0115 if(!a_mpi.vunpack(a_hd.m_bin_entries)) return false; //TN
0116 if(!a_mpi.vunpack(a_hd.m_bin_Sw)) return false; //TW
0117 if(!a_mpi.vunpack(a_hd.m_bin_Sw2)) return false; //TW
0118
0119 {a_hd.m_bin_Sxw.resize(a_hd.m_bin_number);
0120 for(unsigned int ibin=0;ibin<a_hd.m_bin_number;ibin++) {
0121 if(!a_mpi.vunpack(a_hd.m_bin_Sxw[ibin])) return false;
0122 }}
0123 {a_hd.m_bin_Sx2w.resize(a_hd.m_bin_number);
0124 for(unsigned int ibin=0;ibin<a_hd.m_bin_number;ibin++) {
0125 if(!a_mpi.vunpack(a_hd.m_bin_Sx2w[ibin])) return false;
0126 }}
0127
0128 // Axes :
0129 {a_hd.m_axes.resize(a_hd.m_dimension);
0130 for(unsigned int iaxis=0;iaxis<a_hd.m_dimension;iaxis++) {
0131 if(!axis_dui_unpack(a_mpi,a_hd.m_axes[iaxis])) return false;
0132 }}
0133
0134 // etc :
0135 if(!a_mpi.vunpack(a_hd.m_in_range_plane_Sxyw)) return false; //TC
0136
0137 // Annotations :
0138 {a_hd.m_annotations.clear();
0139 num_t num;
0140 if(!a_mpi.unpack(num)) return false;
0141 for(unsigned int index=0;index<num;index++) {
0142 std::string k,v;
0143 if(!a_mpi.sunpack(k)) return false;
0144 if(!a_mpi.sunpack(v)) return false;
0145 a_hd.m_annotations[k] = v;
0146 }}
0147
0148 // fast getters :
0149 if(!a_mpi.unpack(a_hd.m_all_entries)) return false; //TN
0150 if(!a_mpi.unpack(a_hd.m_in_range_entries)) return false; //TN
0151 if(!a_mpi.unpack(a_hd.m_in_range_Sw)) return false; //TW
0152 if(!a_mpi.unpack(a_hd.m_in_range_Sw2)) return false; //TW
0153 if(!a_mpi.vunpack(a_hd.m_in_range_Sxw)) return false; //TC
0154 if(!a_mpi.vunpack(a_hd.m_in_range_Sx2w)) return false; //TC
0155
0156 return true;
0157 }
0158
0159 }}
0160
0161 #include "profile_data"
0162
0163 namespace tools {
0164 namespace histo {
0165
0166 /////////////////////////////////////////////////////////////////////////////
0167 /// profile_data to C struct ////////////////////////////////////////////////
0168 /////////////////////////////////////////////////////////////////////////////
0169
0170 inline bool profile_data_duiuidd_pack(impi& a_mpi,const profile_data<double,unsigned int,unsigned int,double,double>& a_pd) {
0171
0172 if(!histo_data_duiuid_pack(a_mpi,a_pd)) return false;
0173
0174 //typedef double TV;
0175
0176 if(!a_mpi.bpack(a_pd.m_is_profile)) return false;
0177 if(!a_mpi.vpack(a_pd.m_bin_Svw)) return false; //TV
0178 if(!a_mpi.vpack(a_pd.m_bin_Sv2w)) return false; //TV
0179 if(!a_mpi.bpack(a_pd.m_cut_v)) return false;
0180 if(!a_mpi.pack(a_pd.m_min_v)) return false; //TV
0181 if(!a_mpi.pack(a_pd.m_max_v)) return false; //TV
0182
0183 return true;
0184 }
0185
0186 /////////////////////////////////////////////////////////////////////////////
0187 /// mpi to profile_data /////////////////////////////////////////////////////
0188 /////////////////////////////////////////////////////////////////////////////
0189
0190 inline bool profile_data_duiuidd_unpack(impi& a_mpi,profile_data<double,unsigned int,unsigned int,double,double>& a_pd) {
0191
0192 if(!histo_data_duiuid_unpack(a_mpi,a_pd)) return false;
0193
0194 //typedef double TV;
0195
0196 if(!a_mpi.bunpack(a_pd.m_is_profile)) return false;
0197 if(!a_mpi.vunpack(a_pd.m_bin_Svw)) return false; //TV
0198 if(!a_mpi.vunpack(a_pd.m_bin_Sv2w)) return false; //TV
0199 if(!a_mpi.bunpack(a_pd.m_cut_v)) return false;
0200 if(!a_mpi.unpack(a_pd.m_min_v)) return false; //TV
0201 if(!a_mpi.unpack(a_pd.m_max_v)) return false; //TV
0202
0203 return true;
0204 }
0205
0206 }}
0207
0208 #endif