10 #define NumberOfBcastArrays 3    12 enum PoPs_Bcast_mode { PoPs_Bcast_mode_count, PoPs_Bcast_mode_pack, PoPs_Bcast_mode_unpack };
    14 typedef struct PoPs_Bcast_info {
    15     enum PoPs_Bcast_mode mode;
    16     int int_count, char_count, double_count;
    34     int description[NumberOfBcastArrays]; 
    35     PoPs_Bcast_info info = { PoPs_Bcast_mode_count, 0, 0, 0, NULL, NULL, NULL };
    37     if( ( status = MPI_Errhandler_set( comm, MPI_ERRORS_RETURN ) ) != 0 ) 
return( status );
    41     if( ( status = 
MPI_Comm_rank( comm, &myRank ) ) != 0 ) 
return( status );
    43     if( myRank == bossRank ) {
    44         info.mode = PoPs_Bcast_mode_count;
    45         if( ( status = PoPs_Bcast3( smr, comm, &info, unitsRoot, popsRoot ) ) != 0 ) 
return( status );
    46         description[0] = info.int_count;
    47         description[1] = info.char_count;
    48         description[2] = info.double_count;
    49         if( ( info.int_array = (
int *) 
smr_malloc2( smr, info.int_count * 
sizeof( 
int ), 1, 
"info.int_array" ) ) == NULL ) 
goto err;
    50         if( ( info.char_array = (
char *) 
smr_malloc2( smr, info.char_count * 
sizeof( 
char ), 1, 
"info.char_array" ) ) == NULL ) 
goto err;
    51         if( ( info.double_array = (
double *) 
smr_malloc2( smr, info.double_count * 
sizeof( 
double ), 1, 
"info.double_array" ) ) == NULL ) 
goto err;
    53         info.mode = PoPs_Bcast_mode_pack;
    56         info.double_count = 0;
    57         if( ( status = PoPs_Bcast3( smr, comm, &info, unitsRoot, popsRoot ) ) != 0 ) 
return( status );
    58         if( info.int_count != description[0] ) {
    62         if( info.char_count != description[1] ) {
    66         if( info.double_count != description[2] ) {
    72     if( ( status = MPI_Bcast( description, NumberOfBcastArrays, MPI_INT, bossRank, comm ) ) != 0 ) 
goto err;
    74     if( myRank != bossRank ) {
    75         if( ( info.int_array = (
int *) 
smr_malloc2( smr, description[0] * 
sizeof( 
int ), 1, 
"info.int_array (2)" ) ) == NULL ) 
goto err;
    76         if( ( info.char_array = (
char *) 
smr_malloc2( smr, description[1] * 
sizeof( 
char ), 1, 
"info.char_array (2)" ) ) == NULL ) 
goto err;
    77         if( ( info.double_array = (
double *) 
smr_malloc2( smr, description[2] * 
sizeof( 
double ), 1, 
"info.double_array (2)" ) ) == NULL ) 
goto err;
    79     if( ( status = MPI_Bcast( info.int_array, description[0], MPI_INT, bossRank, comm ) ) != 0 ) 
goto err;
    80     if( ( status = MPI_Bcast( info.char_array, description[1], 
MPI_CHAR, bossRank, comm ) ) != 0 ) 
goto err;
    81     if( ( status = MPI_Bcast( info.double_array, description[2], 
MPI_DOUBLE, bossRank, comm ) ) != 0 ) 
goto err;
    83     if( myRank != bossRank ) {
    84         info.mode = PoPs_Bcast_mode_unpack;
    85         if( ( status = PoPs_Bcast3( smr, comm, &info, unitsRoot, popsRoot ) ) != 0 ) 
goto err;
    88     if( info.int_array != NULL ) 
smr_freeMemory( (
void **) &(info.int_array) );
    89     if( info.char_array != NULL ) 
smr_freeMemory( (
void **) &(info.char_array) );
    90     if( info.double_array != NULL ) 
smr_freeMemory( (
void **) &(info.double_array) );
    95     if( info.int_array != NULL ) 
smr_freeMemory( (
void **) &(info.int_array) );
    96     if( info.char_array != NULL ) 
smr_freeMemory( (
void **) &(info.char_array) );
    97     if( info.double_array != NULL ) 
smr_freeMemory( (
void **) &(info.double_array) );
   111     if( ( status = PoPs_Bcast_int( smr, info, &(unitsRoot->
numberOfUnits) ) ) != 0 ) 
return( status );
   113     if( info->mode == PoPs_Bcast_mode_unpack ) {
   116         if( ( unitsRoot->
unsorted = (
char const **) 
smr_malloc2( smr, unitsRoot->
allocated * 
sizeof( 
char const ** ), 1, 
"unitsRoot->unsorted" ) ) == NULL ) 
return( -1 );
   118     for( i = 0; i < numberOfUnits; i++ ) {
   119         if( ( status = PoPs_Bcast_charAllocate( smr, info, (
char **) &(unitsRoot->
unsorted[i]) ) ) != 0 ) 
return( status );
   120         if( info->mode == PoPs_Bcast_mode_unpack ) unitsRoot->
numberOfUnits++;
   123     if( ( status = PoPs_Bcast_int( smr, info, &(popsRoot->
numberOfParticles) ) ) != 0 ) 
return( status );
   125     if( info->mode == PoPs_Bcast_mode_unpack ) {
   132         if( ( status = PoPs_Bcast_PoPs( smr, info, i, popsRoot ) ) != 0 ) 
return( status );
   144     if( info->mode != PoPs_Bcast_mode_unpack ) 
return( PoPs_Bcast_PoPs2( smr, info, popsRoot->
pops[index] ) );
   145     if( ( status = PoPs_Bcast_PoPs2( smr, info, &pop ) ) != 0 ) 
return( status );
   155     if( ( status = PoPs_Bcast_int( smr, info, &(pop->
index) ) ) != 0 ) 
return( status );
   156     if( ( status = PoPs_Bcast_int( smr, info, &(pop->
properIndex) ) ) != 0 ) 
return( status );
   157     if( ( status = PoPs_Bcast_int( smr, info, &(pop->
aliasIndex) ) ) != 0 ) 
return( status );   
   158     if( ( status = PoPs_Bcast_int( smr, info, (
int *) &(pop->
genre) ) ) != 0 ) 
return( status );
   160     if( ( status = PoPs_Bcast_int( smr, info, &(pop->
Z) ) ) != 0 ) 
return( status );
   161     if( ( status = PoPs_Bcast_int( smr, info, &(pop->
A) ) ) != 0 ) 
return( status );
   162     if( ( status = PoPs_Bcast_int( smr, info, &(pop->
l) ) ) != 0 ) 
return( status );
   163     if( ( status = PoPs_Bcast_double( smr, info, &(pop->
mass) ) ) != 0 ) 
return( status );
   165     if( info->mode == PoPs_Bcast_mode_pack ) {
   171     if( ( status = PoPs_Bcast_int( smr, info, &n ) ) != 0 ) 
return( status );
   172     if( ( status = PoPs_Bcast_charAllocate( smr, info, (
char **) &(pop->
name) ) ) != 0 ) 
return( status );
   174     if( info->mode == PoPs_Bcast_mode_unpack ) {
   190     if( info->mode == PoPs_Bcast_mode_unpack ) {
   200     if( info->mode == PoPs_Bcast_mode_pack ) {
   201         info->int_array[info->int_count] = *value; }
   202     else if( info->mode == PoPs_Bcast_mode_unpack ) {
   203         *value = info->int_array[info->int_count];
   213     int i, n = 0, status;
   215     if( info->mode != PoPs_Bcast_mode_unpack ) {
   216         n = (int) strlen( *value ) + 1;
   217         if( ( status = PoPs_Bcast_int( smr, info, &n ) ) != 0 ) 
return( status );
   218         if( info->mode == PoPs_Bcast_mode_pack ) {
   219             for( i = 0; i < 
n; i++ ) info->char_array[info->char_count + i] = (*value)[i];
   222         if( ( status = PoPs_Bcast_int( smr, info, &n ) ) != 0 ) 
return( status  );
   223         if( ( *value = (
char *) 
smr_malloc2( smr, n * 
sizeof( 
char ), 0, 
"*value" ) ) == NULL ) 
return( -1 );
   224         for( i = 0; i < 
n; i++ ) (*value)[i] = info->char_array[info->char_count + i];
   226     info->char_count += 
n;
   235     if( info->mode == PoPs_Bcast_mode_pack ) {
   236         info->double_array[info->double_count] = *value; }
   237     else if( info->mode == PoPs_Bcast_mode_unpack ) {
   238         *value = info->double_array[info->double_count];
   240     info->double_count++;
 
static int numberOfParticles
 
int PoPs_Bcast2(statusMessageReporting *smr, MPI_Comm comm, int bossRank, unitsDB *unitsRoot, PoPs *popsRoot)
 
#define smr_setReportError2(smr, libraryID, code, fmt,...)
 
int MPI_Comm_rank(MPI_Comm, int *)
 
#define smr_malloc2(smr, size, zero, forItem)
 
PoP * PoPs_copyAddParticleIfNeeded(statusMessageReporting *smr, PoP *pop)
 
char const  * unitsDB_stringFromIndex(statusMessageReporting *smr, int index)
 
void * smr_freeMemory(void **p)
 
int unitsDB_index(statusMessageReporting *smr, char const *unit)
 
void * MPI_Comm
to pass hd2mpi //////////////////////////////////////////// 
 
int PoPs_releasePrivate(statusMessageReporting *smr)