// Populates data transform information about a given variable into an ADIOS_VARTRANSFORM struct // Return NULL if failed ADIOS_VARTRANSFORM * adios_inq_var_transform(const ADIOS_FILE *fp, const ADIOS_VARINFO *varinfo){ // Get the global metadata ADIOS_TRANSINFO* tinfo = common_read_inq_transinfo(fp, varinfo); if (tinfo == NULL) return NULL; // Get the per-PG metadata common_read_inq_trans_blockinfo(fp, varinfo, tinfo); if (tinfo->orig_blockinfo == NULL || tinfo->transform_metadatas == NULL) return NULL; // Load all the metadata into the ADIOS_VARTRANSFORM datastructure ADIOS_VARTRANSFORM *vartransform = (ADIOS_VARTRANSFORM*) malloc(sizeof(ADIOS_VARTRANSFORM)); *vartransform = (ADIOS_VARTRANSFORM){ .varid = varinfo->varid, .sum_nblocks = varinfo->sum_nblocks, .transform_type = tinfo->transform_type, .should_free_transform_metadata = tinfo->should_free_transform_metadata, .transform_metadatas = tinfo->transform_metadatas }; // Transfer ownership of the transform_metadatas array to the new struct, then free the struct tinfo->transform_metadatas = NULL; common_read_free_transinfo(varinfo, tinfo); return vartransform; } #define MYFREE(p) {if (p){ free((void*)(p)); (p) = NULL; }} void adios_free_var_transform(ADIOS_VARTRANSFORM *vartransform) { if (vartransform->transform_metadatas) { if (vartransform->should_free_transform_metadata) { int i; for (i = 0; i < vartransform->sum_nblocks; i++) MYFREE(vartransform->transform_metadatas[i].content); } MYFREE(vartransform->transform_metadatas); } MYFREE(vartransform); } void adios_free_pg_intersections(ADIOS_PG_INTERSECTIONS **intersections){ ADIOS_PG_INTERSECTIONS * intsec = *intersections; int i = 0; for(i=0; i < intsec->npg; i++){ ADIOS_PG_INTERSECTION inter = intsec->intersections[i]; common_read_selection_delete(inter.pg_bounds_sel); common_read_selection_delete(inter.intersection_sel); } intsec->npg = 0; intsec->intersections = NULL; MYFREE(*intersections); }
adios_transform_read_request * adios_transform_generate_read_reqgroup(const ADIOS_VARINFO *raw_varinfo, const ADIOS_TRANSINFO* transinfo, const ADIOS_FILE *fp, const ADIOS_SELECTION *sel, int from_steps, int nsteps, const char *param, void *data) { // Declares adios_transform_read_request *new_readreq; int blockidx, timestep, timestep_blockidx; int start_blockidx, end_blockidx; enum ADIOS_FLAG swap_endianness = (fp->endianness == get_system_endianness()) ? adios_flag_no : adios_flag_yes; // In streaming mode, ignore the user's from_steps/nsteps arguments if (fp->is_streaming) { from_steps = 0; nsteps = 1; } // Precondition checking assert(is_transform_type_valid(transinfo->transform_type)); assert(from_steps >= 0 && from_steps + nsteps <= raw_varinfo->nsteps); if (sel->type != ADIOS_SELECTION_BOUNDINGBOX && sel->type != ADIOS_SELECTION_POINTS && sel->type != ADIOS_SELECTION_WRITEBLOCK) { adios_error(err_operation_not_supported, "Only bounding box, point , and writeblock selections are currently supported for reads on transformed variables."); } // Retrieve blockinfos, if they haven't been done retrieved if (!raw_varinfo->blockinfo) common_read_inq_var_blockinfo_raw(fp, (ADIOS_VARINFO*)raw_varinfo); if (!transinfo->orig_blockinfo) common_read_inq_trans_blockinfo(fp, raw_varinfo, (ADIOS_TRANSINFO*)transinfo); // Allocate a new, empty request group new_readreq = adios_transform_read_request_new(fp, raw_varinfo, transinfo, sel, from_steps, nsteps, param, data, swap_endianness); if (is_global_selection(sel)) { populate_read_request_for_global_selection(raw_varinfo, transinfo, sel, from_steps, nsteps, new_readreq); } else { populate_read_request_for_local_selection(raw_varinfo, transinfo, sel, from_steps, nsteps, new_readreq); } // If this read request does not intersect any PGs, then clear the new read request and return NULL if (new_readreq->num_pg_reqgroups == 0) { adios_transform_read_request_free(&new_readreq); new_readreq = NULL; } return new_readreq; }