Ejemplo n.º 1
0
int _PD_cksum_var_read(PDBfile *file, char *name, char *type,
		      syment *ep, void *vr)
   {int rv, ok;
    inti ni, len;
    intb bpi;
    unsigned char rdig[PD_CKSUM_LEN], cdig[PD_CKSUM_LEN];
    char *path;
            
    rv = TRUE;

/* if requested, check MD5 checksum for this var */
    if ((file->cksum.use & PD_MD5_RW) && (strstr(name, PD_MD5_DIR) == NULL)) 
       {len  = strlen(PD_MD5_DIR) + strlen(name) + strlen(PD_MD5_SUFFIX) + 2;
        path = CMAKE_N(char, len);

/* read checksum as /&md5/<varname> */
        snprintf(path, len, "%s%s", PD_MD5_DIR, name);
        
        if (PD_query_entry(file, path, NULL) == NULL)

/* if preferred form is not there check archaic form - /&md5/<varname>-md5 */
	   {snprintf(path, len, "%s%s%s", PD_MD5_DIR, name, PD_MD5_SUFFIX);
        
/* make sure &md5 var has been created */
	    if (PD_query_entry(file, path, NULL) == NULL)
	       PD_error("NO MD5 CHECKSUM AVAILABLE FOR THIS VARIABLE - _PD_CKSUM_VAR_READ",
			PD_READ);}
        else
           {ni  = _PD_comp_num(ep->dimensions);
            bpi = _PD_lookup_size(type, file->host_chart);
        
/* do checksum in local memory on vr just read */
            memset(cdig, 0, PD_CKSUM_LEN);
            PM_md5_checksum_array(vr, ni, bpi, cdig);
        
/* read previous checksum */
            PD_read(file, path, rdig);
        
            CFREE(path);
        
/* return -1 and set PD_error if MD5 mismatch */
	    ok = _PD_cksum_compare(cdig, rdig);
	    if (ok == FALSE)
	       {rv = -1;

/* NOTE: this must be treated as generic because of the PD_read above */
		PD_error("MD5 CHECKSUM OF VARIABLE FAILED - _PD_CKSUM_VAR_READ",
			 PD_GENERIC);};};};
Ejemplo n.º 2
0
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;
}