static int write_var(PDBfile *lpdsf, char *name, double *tp, double **dp, int sz) {int i, szd; long ind[3]; double *vdata; char svname[MAXLINE], title[MAXLINE]; static int lcount = 0; PA_gs.n_variables++; ind[0] = 0L; ind[2] = 1L; /* write out the string header for this variable * header format : * <var-name>|<num-times>|<time-array-name> */ snprintf(title, MAXLINE, "src%d", lcount); snprintf(svname, MAXLINE, "%s|%d|st%d", name, sz, lcount); ind[1] = strlen(svname); PD_write_alt(lpdsf, title, "char", svname, 1, ind); /* write out the data arrays one at a time */ szd = SC_MEM_GET_N(double, *dp); for (i = 0; i < sz; i++) {snprintf(svname, MAXLINE, "%s:%d", title, i); vdata = dp[i]; ind[1] = szd - 1; PD_write_alt(lpdsf, svname, "double", vdata, 1, ind);}; /* now write out the time array */ snprintf(title, MAXLINE, "st%d", lcount); ind[1] = sz - 1; PD_write_alt(lpdsf, title, "double", tp, 1, ind); /* increment the variable counter */ lcount++; return(TRUE);}
static void write_test_10_data(PDBfile *strm) {long ind[6]; /* write scalars into the file */ if (PD_write(strm, "qs", "long_double", &qs_w) == 0) error(1, STDOUT, "QS WRITE FAILED - WRITE_TEST_10_DATA\n"); /* write primitive arrays into the file */ ind[0] = 0L; ind[1] = N_FLOAT - 1; ind[2] = 1L; if (PD_write_alt(strm, "qa", "long_double", qa_w, 1, ind) == 0) error(1, STDOUT, "DA WRITE FAILED - WRITE_TEST_10_DATA\n"); return;}
int main(int argc, char** argv) { if(argc < 4) { fprintf(stderr, "Useage: %s <input file> <output file> <t stride>\n", argv[0]); return 1; } int tstride; if(sscanf(argv[3], "%d", &tstride) != 1) { fprintf(stderr, "\tERROR: t stride must be an integer\n"); return 1; } // Open input file PDBfile *in; if((in = PD_open(argv[1], "r")) == NULL) { fprintf(stderr, "\tERROR: Could not open input file '%s'\n", argv[1]); return 1; } // Open output file PDBfile *out; if((out = PD_open(argv[2], "w")) == NULL) { fprintf(stderr, "\tERROR: Could not open output file '%s'\n", argv[2]); return 1; } // Get list of variables int nvars; char **var_names = PD_ls(in, NULL, NULL, &nvars); if((var_names == (char**) NULL) || (nvars < 1)) { fprintf(stderr, "\tERROR: No variables\n"); return 1; } // Go through the variables char *varname; for(int var=0;var<nvars;var++) { varname = var_names[var]; syment *ep; // PDB query types dimdes* dims; // Query size of the variable if((ep = PD_query_entry(in, varname, NULL)) == (syment*) NULL) { fprintf(stderr, "\tError querying variable %s\n", varname); return 1; } dims = PD_entry_dimensions(ep); int nd = 0; // Count number of dimensions int varsize = 1; // Number of elements long inds[12]; while(dims != (dimdes*) NULL) { long min, max; min = dims->index_min; max = dims->index_max; if(nd > 3) { fprintf(stderr, "\tERROR: Can't handle variable '%s': more than 4D\n", varname); return 2; } inds[3*nd] = min; inds[3*nd + 1] = max; inds[3*nd + 2] = 1L; varsize *= max - min + 1; nd++; dims = dims->next; } // Get variable type char *typ; typ = PD_entry_type(ep); if((strcmp(varname, "t_array") == 0) && (nd == 1)) { float *fdata = new float[varsize]; // Read the data from the PDB file inds[2] = tstride; int nread; if( (nread = PD_read_as_alt(in, varname, "float", fdata, inds)) == 0) { fprintf(stderr, "\tWARNING: Could not read t_array. Ignoring\n"); delete[] fdata; continue; } inds[0] = 0L; inds[1] = nread-1; inds[2] = 1L; if(PD_write_alt(out, varname, "float", fdata, 1, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write '%s'. Ignoring\n", varname); } delete[] fdata; }else if(nd == 4) { // Reducing time resolution if(strcasecmp(typ, "integer") == 0) { int *idata = new int[varsize]; // Read the data from the PDB file inds[2] = tstride; int nread; if( (nread = PD_read_as_alt(in, varname, "integer", idata, inds)) == 0) { fprintf(stderr, "\tWARNING: Could not read '%s'. Ignoring\n", varname); delete[] idata; continue; } if( nread % (varsize / (inds[1] - inds[0] + 1)) != 0 ) { fprintf(stderr, "ERROR: Accounting error: (%ld, %ld), %d, %d\n", inds[0], inds[1], varsize, nread); delete[] idata; continue; } nread = nread / (varsize / (inds[1] - inds[0] + 1)); inds[0] = 0L; inds[1] = nread - 1; inds[2] = 1L; if(PD_write_alt(out, varname, "integer", idata, 4, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write '%s'. Ignoring\n", varname); } delete[] idata; }else if( (strcasecmp(typ, "float") == 0) || (strcasecmp(typ, "double") == 0) ) { // Convert doubles to floats float *fdata = new float[varsize]; // Read the data from the PDB file inds[2] = tstride; int nread; if( (nread = PD_read_as_alt(in, varname, "float", fdata, inds)) == 0) { fprintf(stderr, "\tWARNING: Could not read '%s'. Ignoring\n", varname); delete[] fdata; continue; } if( nread % (varsize / (inds[1] - inds[0] + 1)) != 0 ) { fprintf(stderr, "ERROR: Accounting error: (%ld, %ld), %d, %d\n", inds[0], inds[1], varsize, nread); delete[] fdata; continue; } nread = nread / (varsize / (inds[1] - inds[0] + 1)); inds[0] = 0L; inds[1] = nread - 1; inds[2] = 1L; if(PD_write_alt(out, varname, "float", fdata, 4, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write '%s'. Ignoring\n", varname); } delete[] fdata; }else { fprintf(stderr, "\tWARNING: '%s' has unrecognised type '%s'. Ignoring\n", varname, typ); } }else { // Just copy the data across if(strcasecmp(typ, "integer") == 0) { int *idata = new int[varsize]; // Read the data from the PDB file if (PD_read_as(in, varname, "integer", idata) == 0) { fprintf(stderr, "\t\tWARNING: Could not read variable. Ignoring\n"); delete[] idata; continue; } if(PD_write_alt(out, varname, "integer", idata, nd, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write variable '%s'\n", varname); } delete[] idata; }else if( (strcasecmp(typ, "float") == 0) || (strcasecmp(typ, "double") == 0) ) { // Convert doubles to floats float *fdata = new float[varsize]; // Read the data from the PDB file if (PD_read_as(in, varname, "float", fdata) == 0) { fprintf(stderr, "\tWARNING: Could not read variable '%s'. Ignoring\n", varname); delete[] fdata; continue; } if(PD_write_alt(out, varname, "float", fdata, nd, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write variable '%s'\n", varname); } delete[] fdata; }else { fprintf(stderr, "WARNING: '%s' has unrecognised type '%s'. Ignoring\n", varname, typ); } } } PD_close(in); PD_close(out); return 0; }