source: tags/ORCHIDEE_OL/Utilitaire/Regrid_restart/restart_interpol.py @ 6

Last change on this file since 6 was 6, checked in by orchidee, 14 years ago

import first tag equivalent to CVS orchidee_1_9_5 + OOL_1_9_5

File size: 7.4 KB
Line 
1#!/usr/bin/env cdat
2# -*- coding: iso-8859-15 -*-
3
4import cdms, cdutil, genutil, os, sys, getopt
5from cdms import MV
6from dataproc.utils import cdat
7from regrid import Regridder
8
9from Numeric import ones
10
11def usage():
12    """Display usage information."""
13   
14    man = """
15    This script will get 2 SECHIBA or STOMATE restarts for ORCHIDEE code and will
16    produce a regridded restart with the grid of the first restart (and other non gridded variables)
17    and the values of the second one.
18   
19Usage :
20    prompt> restart_interpol.py restart_outgrid.nc restart_invalues.nc'
21        This script regrids values in file 2 (namely restart_invlaues.nc) with
22        grid in restart_outgrid.nc.
23
24Examples :
25    > restart_interpol.py CF_CM1414A_20001231_sechiba_rest.nc CF_CM5PIRC11_29901231_sechiba_rest.nc
26    > restart_interpol.py CF_CM1414A_20001231_stomate_rest.nc CF_CM5PIRC11_29901231_stomate_rest.nc
27    > restart_interpol.py CF_CM5PIRC8_26601231_sechiba_rest.nc CF_OOL-CTRLPI-1_9_5_SPIN_v2ORC_43_01001231_sechiba_rest.nc
28    """
29    print man
30
31options = [
32    "help",
33    "version" ]
34
35# Extract arguments from the command line
36try:
37    myopts, myargs = getopt.getopt(sys.argv[1:], 'Vh', longopts = options)
38except getopt.GetoptError:
39    print 'getopt error'
40    usage()
41    sys.exit(1)
42
43variable=""
44if (len(myargs) < 2):
45    print 'I need at least 2 files.'
46    usage()
47    sys.exit(1)
48else:
49    file = myargs[:]
50    lf = len(file)
51    for i in range(2):
52        if (os.path.exists(file[i])==False):
53            print 'file number ',i+1,' : ',file[i],\
54                  ' doesn''t exist !' 
55            sys.exit(1)
56
57f1=cdms.open( file[0],'r')
58f2=cdms.open( file[1],'r')
59listv=f1.listvariables()
60listv2=f2.listvariables()
61#listv.sort()
62#listv2.sort()
63print listv
64print listv2
65
66
67f3=cdms.open( "regrid_"+file[1],'w')
68
69onet=None
70
71missing_value = 1e+20
72
73for var in listv:
74    print var
75    if (var in ["nav_lon","nav_lat","nav_lev","time_steps","time",
76                "lat","bounds_lat","lon","bounds_lon","lev","day_counter",
77                "dt_days", "routingcounter", "veget_year", "date" ]):
78        var1=f1(var)
79        f3.write(var1)
80
81        print "remplacé."
82        continue
83       
84    var1=f1(var)
85    try:
86        var2=f2(var)
87    except:
88        f3.write(var1)
89        print "remplacé."
90        continue
91
92#    var2.info()
93    if (len(var1.shape) > 3):
94       var_1=f1(var, squeeze=1)
95       tmp=cdms.createVariable(var1)
96       var_2=f2(var, squeeze=1)
97#       print var1.id,var
98
99#        if (var1.id == 'day_counter'):
100#            var1[0,0,0,0]=var_2
101#            continue
102       
103#       print tmp.shape,var_2,type(var_2)
104#       axlist2=var_2.getAxisList()
105#       print tmp.shape,var_2,len(axlist2)
106#       if (len(axlist2) > 0 ):
107
108       if (len(var_2)!=1) :
109           if (len(var_2.shape) > 2):
110#               print tmp.shape, var_2.shape,var2.shape
111               if ( len(tmp.getAxis(0)) == 1 ):
112#                   print tmp.getAxis(0),var2.getAxis(0)
113
114                   if ( len(var_2.getAxis(0)) > 0 ):
115#                       print var_2.getAxis(0)[:]
116                       shift=( var_2.getAxis(0)[0] > 0 )
117                       outgrid=var_1[0,:,:].getGrid()
118                       ingrid=var_2[0,:,:].getGrid()
119                       regridfunc = Regridder(ingrid, outgrid)
120                       sumpft=var_1[0,:,:]*0.
121                       for fpft in var_2.getAxis(0):
122                           if ( shift ):
123                               pft=int(fpft) - int(var_2.getAxis(0)[0])
124                           else:
125                               pft=int(fpft)
126                               
127#                           print pft
128                           tmp_ = tmp[0,pft,:,:]
129                           v2 = var_2[pft,:,:]
130                           v1 = var_1[pft,:,:]
131 #                           mask_undef = MV.where(v2 > missing_value, 1, 0)
132#                            v2_mask=MV.masked_array(v2, mask_undef)
133#                            varmax2=max(max(abs(v2_mask)))
134#                            v2=v2_mask/varmax2
135                           tmp__ = regridfunc(v2)
136#                            tmp[0,pft,:,:]=tmp__*varmax2                           
137                           tmp[0,pft,:,:]=tmp__
138                           if (var in ["veget_max","veget"]):
139                               sumpft[:,:]=sumpft[:,:]+tmp__
140
141                       if (var in ["veget_max"]):
142                           # On veut :
143                           #somm(tmp[0,pft,:,:])+frac_nobio=1
144                           vegnorm=1-frac_nobio
145                           veget_max=tmp[0,:,:,:]
146                           for fpft in var_2.getAxis(0):
147                               if ( shift ):
148                                   pft=int(fpft) - int(var_2.getAxis(0)[0])
149                               else:
150                                   pft=int(fpft)
151                               veget_max[pft,:,:]=MV.where(sumpft[:,:] == 0., 0., veget_max[pft,:,:] * vegnorm / sumpft[:,:])
152                               tmp[0,pft,:,:]= veget_max[pft,:,:]
153                               
154                       if (var in ["veget"]):
155                           for fpft in var_2.getAxis(0):
156                               if ( shift ):
157                                   pft=int(fpft) - int(var_2.getAxis(0)[0])
158                               else:
159                                   pft=int(fpft)
160                                   
161                               tmp[0,pft,:,:]= MV.where(tmp[0,pft,:,:] > veget_max[pft,:,:], veget_max[pft,:,:], tmp[0,pft,:,:])
162
163                   else:
164                       tmp[0,0,:,:]=var_2.regrid( var_1.getGrid() )
165               else:
166                   print "Erreur ! "
167                   print tmp.getAxis(0),var2.getAxis(0)
168#                   print var1.getAxisList()
169                   
170                   if ( len(var_2.getAxis(0)) > 0 ):
171#                       print var_2.getAxis(0)[:]
172                       shift=( var_2.getAxis(0)[0] > 0 )
173                       for fpft in var_2.getAxis(0):
174                           if ( shift ):
175                               pft=int(fpft) - int(var_2.getAxis(0)[0])
176                           else:
177                               pft=int(fpft)
178                               
179#                           print pft
180                           tmp_ = tmp[0,pft,:,:]
181                           v2 = var_2[pft,:,:]
182                           v1 = var_1[0,pft,:,:]
183#                           mask_undef = MV.where(v2 > missing_value, 1, 0)
184#                           v2_mask=MV.masked_array(v2, mask_undef)
185#                           varmax2=max(abs(v2_mask))
186#                           v2=v2_mask/varmax2
187                           tmp__ = v2.regrid( v1.getGrid() )
188#                           tmp[0,pft,:,:]=tmp__*varmax2
189                           tmp[0,pft,:,:]=tmp__
190                           
191           else:
192               tmp[0,0,:,:]=var_2.regrid( var_1.getGrid() )
193               if (var in ["frac_nobio"]):
194                   frac_nobio=tmp[0,0,:,:]
195       else:
196           tmp[0,0,0,0]=var_2
197
198       var1=tmp
199
200       #       var1.info()
201       t=var1.getTime()
202       print 'len of t:',t
203       if t is not None:
204           if len(t)!=1:
205               raise 'Error too much time'
206       if onet is None:
207           onet=t.clone()
208       else:
209           if t[0]!=onet[0]:
210               raise 'different time'
211
212       f3.write(var1)
213    else:
214        print "impossible ?"
215#        var2=f2(var)
216#        f3.write(var2)
Note: See TracBrowser for help on using the repository browser.