static size_t SAC4SNetAllocSize(void *data) { int dims, num_elems = 1; dims = SACARGgetDim(data); for (int i = 0; i < dims; i++) { num_elems *= SACARGgetShape(data, i); } return num_elems * sizeOfType(SACARGgetBasetype(data)); }
static void SAC4SNetMPIPackFun(void *sacdata, void *buf) { int *shape; void *contents = NULL; SACarg *data = sacdata; int type, dims, num_elems = 1; type = SACARGgetBasetype(data); dims = SACARGgetDim(data); shape = SNetMemAlloc(dims * sizeof(int)); for (int i = 0; i < dims; i++) { shape[i] = SACARGgetShape(data, i); num_elems *= SACARGgetShape(data, i); } SNetDistribPack(&type, buf, MPI_INT, 1); SNetDistribPack(&dims, buf, MPI_INT, 1); SNetDistribPack(shape, buf, MPI_INT, dims); SNetMemFree(shape); switch (type) { case SACint: contents = SACARGconvertToIntArray(SACARGnewReference(data)); break; case SACdbl: contents = SACARGconvertToDoubleArray(SACARGnewReference(data)); break; case SACflt: contents = SACARGconvertToFloatArray(SACARGnewReference(data)); break; default: Error( "Unsupported basetype in pack function."); break; } SNetDistribPack(contents, buf, SAC4SNetBasetypeToMPIType(type), num_elems); SNetMemFree(contents); }
static void SAC4SNetDataSerialise( FILE *file, void *ptr) { int i, dim; SACarg *ret, *arg = (SACarg*)ptr; char *basetype_str; int btype; btype = SACARGgetBasetype( arg); if( btype <= MaxTNum()) { basetype_str = SNetMemAlloc( (strlen( t_descr[ btype]) + 1) * sizeof( char)); strcpy( basetype_str, t_descr[ btype]); } else { basetype_str = SNetMemAlloc( (strlen( "(UDT)") + 1) * sizeof( char)); strcpy( basetype_str, "(UDT)"); } if( arg != NULL) { dim = SACARGgetDim( arg); fprintf( file, "\n%s %s %d ", IDSTRINGPRE, basetype_str, dim); for( i=0; i<dim; i++) { fprintf( file, "%d ",SACARGgetShape( arg, i)); } fprintf(file, " %s\n", IDSTRINGSUF); /* create a stub hive for the SAC calls */ SAC_AttachHive(SAC_AllocHive(1, 2, NULL, NULL)); switch( SACARGgetBasetype( arg)) { case T_int: SAC4SNetFibreIO__PrintIntArray2( &ret, SACARGconvertFromVoidPointer( SACTYPE_StdIO_File, file), SACARGnewReference( arg)); break; case T_float: SAC4SNetFibreIO__PrintFloatArray2( &ret, SACARGconvertFromVoidPointer( SACTYPE_StdIO_File, file), SACARGnewReference( arg)); break; case T_double: SAC4SNetFibreIO__PrintDoubleArray2( &ret, SACARGconvertFromVoidPointer( SACTYPE_StdIO_File, file), SACARGnewReference( arg)); break; default: fprintf( file, "## UNSERIALISABLE BASETYPE (%d) ##\n", btype); break; } /* release the stub hive */ SAC_ReleaseHive(SAC_DetachHive()); } SNetMemFree( basetype_str); }