source: TI02-CSML/trunk/csml/csmllibs/netCDFWriter.py @ 2495

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/csml/csmllibs/netCDFWriter.py@2495
Revision 2495, 4.5 KB checked in by domlowe, 13 years ago (diff)

various changes/fixes etc related to getting supporting subsetting by index

Line 
1import cdms,MV
2import csml
3import sys
4
5class NCwriter(object):
6    #This provides a simplified wrapper to CDMS to write a CF compliant NetCDF
7    def __init__(self, fileName):
8        #initiates a new NetCDF file
9        self.nc=cdms.open(fileName,'w')
10   
11    def setGlobalAttributes(self, **kwargs):
12        #sets global attributes
13        pass
14   
15    def addAxis(self,axisName, data,isLon=None,isLat=None,isTime=None,**kwargs):
16        # Now create the axis
17        dataarray=MV.array(data)
18        ax=cdms.createAxis(dataarray)
19        ax.id = axisName
20        if not hasattr(self,'axes'):
21            self.axes=[]
22        if isLon is not None:
23            ax.designateLongitude()
24        elif isLat is not None:
25            ax.designateLatitude()
26        elif isTime is not None:
27            ax.designateTime()
28        for key in kwargs:
29            setattr(ax, key,kwargs[key])
30        self.axes.append(ax)
31        pass
32   
33    def addVariable(self,data, variableName,axesList, fillvalue,  **kwargs):       
34        #creates a new variable containing data with named attributes from **kwargs
35        dataarray=MV.array(data)
36        dataarray.id=variableName
37        dataarray.name=variableName
38        for key in kwargs:
39            setattr(dataarray, key,kwargs[key])
40        axisCount=0
41       
42        #depending on whether time is modelled in the underlying data as a dimension or not the shapes may not match
43        if len(dataarray.shape) < len(axesList): 
44            newaxesList=[]
45            for a in axesList:
46                if a != 'time':
47                    newaxesList.append(a)
48            axesList=newaxesList
49        if hasattr(self, 'axes'):
50            for axis in axesList:
51                for ax in self.axes:
52                    if ax.id == axis:
53                        dataarray.setAxis(axisCount,ax)                       
54                        axisCount = axisCount +1
55        setattr(dataarray, 'missing_value' ,fillvalue)
56        self.nc.write(dataarray)
57
58    def genWriteVar(self,varid, ordinates, times, caltype, axisorder, unitlist, fulldata, fillvalue, **kwargs):
59        #**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.     
60        axesdone=[]
61        floatTimes=[]
62        #determine base units for times:
63        tOne=csml.csmllibs.csmltime.getCDtime(times[0])
64        tbase=csml.csmllibs.csmltime.getBaseUnits(tOne)
65       
66        for time in times:
67            time=csml.csmllibs.csmltime.getCDtime(time).torel(tbase)
68            floatTimes.append(time.value)
69        self.addAxis('time',floatTimes,isTime=1,units=tbase,calendar=caltype)
70   
71        axesdone.append('time')
72        if ordinates is not None:
73            for ord in enumerate(ordinates):
74                vals=[]
75                lon,lat=None,None
76                if ord[1].coordAxisLabel.CONTENT=='time':
77                    continue
78                else:
79                    for val in ord[1].coordAxisValues.coordinateList.CONTENT.split():
80                        if val != ' ':
81                            vals.append(eval(val)) 
82                if ord[1].coordAxisLabel.CONTENT=='longitude':
83                    lon=1
84                    name='longitude'
85                elif ord[1].coordAxisLabel.CONTENT=='latitude':
86                    lat=1
87                    name='latitude'
88                else:
89                    name=ord[1].coordAxisLabel.CONTENT
90                for ax in enumerate(axisorder):
91                    if ax[1]==name:
92                        position=ax[0]
93                axesdone.append(name)
94                self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[position])#to do, units attribute for CF compliance
95       
96        if kwargs is not None:   
97            for kw in kwargs:
98                lon,lat=None,None
99                if kw=='longitude':
100                    lon=1
101                elif kw == 'latitude':
102                    lat=1
103                name = kw
104                for ax in enumerate(axisorder):
105                    if ax[1]==name:
106                        position=ax[0]
107                vals=(kwargs[kw],)
108                self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[position])
109                axesdone.append(name)       
110               
111        self.addVariable(fulldata,varid, axisorder, fillvalue, units=unitlist[-1] ) #to do, units attribute for CF compliance
112       
113    def closeFinishedFile(self):
114        #returns finished (hopefully) NetCDF file
115        self.nc.close()
Note: See TracBrowser for help on using the repository browser.