def initForceFile(self, conc, fpath, species = None): """ Initialize a forcing file. This method opens the NetCDF file in read/write mode, copies the dimensions, copies I/O Api attributes over, and any other common initialization that should be applied to all files Keyword Arguments: conc:*DataFile* Concentration file to use as a template fpath:*string* Path (dir and name) of the forcing file to initialize species:*string[]* List of species to create Returns: NetCDFFile Writable NetCDF File """ if not isinstance(conc, DataFile) or conc is None: raise ValueError("Concentration file must be a DataFile") # Make sure the concentration file is open conc.open() # Debug c=bc() # fpath should not exist if os.path.exists(fpath): # TEMP, remove os.remove(fpath) Forcing.debug("Deleted %s!"%(fpath)) #raise IOError("%s already exists."%fpath) #print "Opening %s for writing"%fpath force = DataFile(fpath, mode='w', open=True) # Exceptions, so we don't needlessly create huge forcing files exceptions={'LAY': self.nk_f} Forcing.copyDims(conc, force, exceptions=exceptions) Forcing.copyIoapiProps(conc, force) if species is None: species = self.species # First, check the sample concentration file vs the concentration file try: #var = conc.variables['TFLAG'].getValue() var = conc.variables['TFLAG'] except IOError as e: # Pointless try loop for now, but I'll add to it later if needed. raise if var.shape[0] != self.nt: #print "conc.shape = %s, sample.shape = %s"%(str(var.shape), str((self.nt, self.nk, self.nj, self.ni))) raise BadSampleConcException("Input file's dimensions (time steps) not not match those of the sample concentration file! Cannot continue.") # Create the variables we'll be writing to #print "Initializing %s"%fpath for s in species: try: var = force.createVariable(s, 'f', ('TSTEP', 'LAY', 'ROW', 'COL')) z=np.zeros((self.nt,self.nk_f,self.nj,self.ni), dtype=np.float32) var[:,:,:,:] = z #Forcing.debug("Created zero variable %s in %s"%(s, force.basename)) except (IOError, ValueError) as ex: print "%sWriting error %s%s when trying to create variable %s (%sTSTEP=%d, LAY=%d, ROW=%d, COL=%d%s)=%s%s%s in today's file.\n"%(c.red, type(ex), c.clear, s, c.blue, self.nt, self.nk_f, self.nj, self.ni, c.clear, c.orange, str(z.shape), c.clear), ex print "Current variable names: %s\n"%(" ".join(map(str, force.variables.keys()))) # Copy over TFLAG vsrc = conc.variables['TFLAG'][:] force.createVariable('TFLAG', 'i', ('TSTEP', 'VAR', 'DATE-TIME')) vdest = force.variables['TFLAG'] try: vdest[:]=vsrc[:] except (IOError, ValueError) as ex: print "%sWriting error %s%s when trying to write TFLAG variable"%(c.red, type(ex), c.clear) print "%sshape(vsrc)=%s, shape(vdest)=%s%s"%(c.cyan, str(vsrc.shape), str(vdest.shape), c.clear) raise ## Fix geocode data ## http://svn.asilika.com/svn/school/GEOG%205804%20-%20Introduction%20to%20GIS/Project/webservice/fixIoapiProjection.py ## fixIoapiSpatialInfo # Sync the file before sending it off force.sync() # Close the files conc.close() force.close() # From now on, force will be read and written to, so change the mode force.mode='a' return force