source: TI02-CSML/branches/csml-cdms2/csmllibs/netCDFWriter.py @ 3627

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/branches/csml-cdms2/csmllibs/netCDFWriter.py@3627
Revision 3627, 5.7 KB checked in by spascoe, 12 years ago (diff)

This branch contains CSML converted to use cdat_lite-5.

  • convertcdms was run on the source
  • the MA.set_print_limit call was changed to the numpy equivilent
  • The tests were changed to account for the existence of numpy scalar types.

All tests, except the two known to fail, pass on i686 ubuntu.

Line 
1# Adapted for numpy/ma/cdms2 by convertcdms.py
2import cdms2 as cdms,MV2 as MV
3import numpy.oldnumeric as Numeric
4import csml
5import sys
6
7class NCwriter(object):
8    '''This provides a simplified wrapper to CDMS to write a CF compliant NetCDF'''
9    def __init__(self, fileName):
10        #initiates a new NetCDF file
11        self.nc=cdms.open(fileName,'w')
12   
13    def setGlobalAttributes(self, **kwargs):
14        #sets global attributes
15        pass
16   
17    def addAxis(self,axisName, data,isLon=None,isLat=None,isTime=None,**kwargs):
18        #first ensure tuple does not contains a list
19        if type(data[0]) is list:
20            newdata=tuple(data[0])
21            data=newdata
22           
23        # Now create the axis   
24        dataarray=MV.array(data)
25        ax=cdms.createAxis(dataarray)
26        ax.id = axisName
27        if not hasattr(self,'axes'):
28            self.axes=[]
29        if isLon is not None:
30            ax.designateLongitude()
31            setattr(ax, 'standard_name', 'longitude')
32        elif isLat is not None:
33            ax.designateLatitude()
34            setattr(ax, 'standard_name', 'latitude')
35        elif isTime is not None:
36            ax.designateTime()
37            setattr(ax, 'standard_name', 'time')
38        for key in kwargs:
39            setattr(ax, key,kwargs[key])
40        self.axes.append(ax)
41       
42   
43    def getAxis(self, axID):
44        for axis in self.axes:
45            if axis.id == axID:
46                return axis
47   
48   
49   
50    def addTimeVariable(self,timeval): 
51        dataarray=MV.array(timeval)
52        #dataarray.id='time'
53        #dataarray.name ='time'
54        ax=self.getAxis('time')
55        dataarray.setAxis(0,ax)           
56        self.nc.write(dataarray)
57       
58       
59    def addVariable(self,data, variableName,axesList, fillvalue, stdname=None, **kwargs):       
60        #creates a new variable containing data with named attributes from **kwargs       
61        dataarray=MV.array(data)     
62        dataarray.id=variableName
63        dataarray.name=variableName
64        for key in kwargs:
65            setattr(dataarray, key,kwargs[key])
66        axisCount=0
67     
68        #depending on whether time is modelled in the underlying data as a dimension or not the shapes may not match
69        if len(dataarray.shape) < len(axesList): 
70            #take time out and create a separate variable
71            newaxesList=[]
72            for a in axesList:
73                if a != 'time':
74                    newaxesList.append(a)
75            axesList=newaxesList
76        if hasattr(self, 'axes'):   
77            for axis in axesList:
78                for ax in self.axes:
79                    if ax.id == axis:
80                        dataarray.setAxis(axisCount,ax)                       
81                        axisCount = axisCount +1     
82        #missing_value deprecated but in common use;
83        #setattr(dataarray, 'missing_value' ,fillvalue)
84        setattr(dataarray, '_FillValue' ,fillvalue)
85        if stdname:
86            setattr(dataarray, 'standard_name' ,stdname)
87        self.nc.write(dataarray)
88
89    def genWriteVar(self,varid, ordinates, times, caltype, axisorder, unitlist, stdname, fulldata, fillvalue, **kwargs):
90
91        #**kwargs may contain additional axes not contained in a GridCoordinatesTable - e.g latitude, longitude may be stored in other attribute not in the rectified grid.     
92        axesdone=[]
93        floatTimes=[]
94        #determine base units for times:
95        tOne=csml.csmllibs.csmltime.getCDtime(times[0])
96        tbase=csml.csmllibs.csmltime.getBaseUnits(tOne)
97        for time in times:
98            time=csml.csmllibs.csmltime.getCDtime(time).torel(tbase)
99            floatTimes.append(time.value)
100        self.addAxis('time',floatTimes,isTime=1,units=tbase,calendar=caltype)
101 
102        axesdone.append('time')
103        if ordinates is not None:
104            for ord in enumerate(ordinates):
105                vals=[]
106                lon,lat=None,None
107                if ord[1].coordAxisLabel.CONTENT=='time':
108                    continue
109                else:
110                    for val in ord[1].coordAxisValues.coordinateList.CONTENT.split():
111                        if val != ' ':
112                            vals.append(eval(val)) 
113                if ord[1].coordAxisLabel.CONTENT=='longitude':
114                    lon=1
115                    name='longitude'
116                elif ord[1].coordAxisLabel.CONTENT=='latitude':
117                    lat=1
118                    name='latitude'
119                else:
120                    name=ord[1].coordAxisLabel.CONTENT
121                for ax in enumerate(axisorder):
122                    if ax[1]==name:
123                        position=ax[0]
124                axesdone.append(name)
125                self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[position])#to do, units attribute for CF compliance
126       
127        if kwargs is not None:   
128            for kw in kwargs:
129                lon,lat=None,None
130                if kw=='longitude':
131                    lon=1
132                elif kw == 'latitude':
133                    lat=1
134                name = kw
135                for ax in enumerate(axisorder):
136                    if ax[1]==name:
137                        position=ax[0]
138                vals=(kwargs[kw],)
139                self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[position])
140                axesdone.append(name)       
141        self.addVariable(fulldata,varid, axisorder, fillvalue, units=unitlist[-1], stdname=stdname ) 
142
143        #for ax in self.axes: #don't think this is needed!
144            #if ax.id =='time':
145                #if self.nc.variables.has_key('time') is False:
146                    #self.addTimeVariable(floatTimes)
147       
148       
149    def closeFinishedFile(self):
150        #returns finished (hopefully) NetCDF file
151        self.nc.close()
Note: See TracBrowser for help on using the repository browser.