source: trunk/procs/macros/make_transfo.pro

Last change on this file was 205, checked in by pinsard, 14 years ago

homegenize THEN BEGIN ... ENDIF

  • Property svn:keywords set to Id
File size: 6.4 KB
Line 
1;+
2;
3; compute transformation
4;
5; @param FILE_NAME {in}{required}{type=string}
6;
7; @param NCDF_DB {in}{required}{type=string}
8; <location>:<path> or just <path>
9;
10; @param TODO {in}
11;
12; input denflx = density flux
13;
14; @keyword BOXZOOM
15;
16; @keyword TIME_1
17;
18; @keyword TIME_2
19;
20; @keyword ALL_DATA
21;
22; @keyword ZMTYP
23;
24; @returns
25; structure
26; -1 in case of error
27;
28; @uses
29; <pro>common</pro>
30; <propost_it>com_eg</propost_it>
31;
32; @history
33; - fplod 20100119T094532Z aedon.locean-ipsl.upmc.fr (Darwin)
34;
35;   * check parameters
36;
37; - EG january 2001 (inspired from denflux.f)
38;
39; @version
40; $Id$
41;
42;-
43FUNCTION make_transfo, file_name, ncdf_db, todo $
44         , BOXZOOM=boxzoom $
45         , TIME_1=time_1 $
46         , TIME_2=time_2 $
47         , ALL_DATA=all_data $
48         , ZMTYP=zmtyp
49;
50  compile_opt idl2, strictarrsubs
51;
52@common
53@com_eg
54;
55 usage='result=make_transfo(file_name, ncdf_db, todo ' $
56         + ', BOXZOOM=boxzoom ' $
57         + ', TIME_1=time_1 ' $
58         + ', TIME_2=time_2 ' $
59         + ', ALL_DATA=all_data ' $
60         + ', ZMTYP=zmtyp)'
61
62 nparam = N_PARAMS()
63 IF (nparam LT 3) THEN BEGIN
64    ras = report(['Incorrect number of arguments.' $
65          + '!C' $
66          + 'Usage : ' + usage])
67    return, -1
68 ENDIF
69
70 arg_type = size(file_name,/type)
71 IF (arg_type NE 7) THEN BEGIN
72   ras = report(['Incorrect arg type file_name' $
73          + '!C' $
74          + 'Usage : ' + usage])
75   return, -1
76 ENDIF
77
78 arg_type = size(ncdf_db,/type)
79 IF (arg_type NE 7) THEN BEGIN
80   ras = report(['Incorrect arg type ncdf_db' $
81          + '!C' $
82          + 'Usage : ' + usage])
83   return, -1
84 ENDIF
85
86 arg_type = size(todo,/type)
87 IF (arg_type NE 7) THEN BEGIN
88   ras = report(['Incorrect arg type todo' $
89          + '!C' $
90          + 'Usage : ' + usage])
91   return, -1
92 ENDIF
93
94;
95; Read sst (C), sss (PSU), Q [W/m2], E-P [kg/m2/s]=[mm/s]
96;
97   sst = nc_read(file_name,'sosstsst', ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data)
98   sss = nc_read(file_name,'sosaline', ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data)
99   hef = nc_read(file_name,'sohefldo', ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data)
100   emp = nc_read(file_name,'sowaflup', ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data)
101   sst = sst.data
102   sss = sss.data
103   hef = hef.data
104   emp = emp.data
105
106   idxt=where(sst eq valmask)
107   idxs=where(sss eq valmask)
108   IF idxt[0] NE -1 THEN BEGIN
109    sst[idxt]=0.
110   ENDIF
111   IF idxs[0] NE -1 THEN BEGIN
112    sss[idxs]=0.
113   ENDIF
114
115; Compute potential density (sigma_0)
116
117   rho0 = eos[sst, sss]-1000.
118   IF idxs[0] NE -1 THEN BEGIN
119    rho0[idxt] = valmask
120   ENDIF
121
122; Define density grid
123
124   n_sig = (sig_max - sig_min)/sig_del + 1
125   z_sig = sig_min+findgen(n_sig)*sig_del
126
127; other inits
128
129   sizef = size(sst)
130   jpi = sizef[1]
131   jpj = sizef[2]
132   jpt = 1
133   IF sizef[0] EQ 3 THEN BEGIN
134    jpt = sizef[3]
135   ENDIF
136
137   dt = 1./float(jpt)            ; integration delta time
138   drho = sig_del          ; delta rho
139   dsig = sig_del
140   P = 0.                        ; pressure = 0 (potential density)
141
142   t_area = 0.
143   t_heat = 0.
144   t_wafl = 0.
145   fluxbar = 0.
146   fluxsal = 0.
147
148; Output arrays
149
150   fheat = fltarr(jpi, jpj, jpt)
151   fwafl = fltarr(jpi, jpj, jpt)
152   dia = fltarr(n_sig+1)
153   diawf = fltarr(n_sig+1)
154   diat = fltarr( n_sig+1, jpt)
155   diawft = fltarr(n_sig+1, jpt)
156   hist = fltarr(n_sig+1, jpt)
157   histwf = fltarr(n_sig+1, jpt)
158   area = fltarr(n_sig+1, jpt)
159   nval = lonarr(n_sig+1, jpt)
160
161; Work arrays
162
163   timwrk = fltarr(jpt)
164
165   trf_bin = fltarr(n_sig+1)
166   trf_bin[*] = 0.
167;
168;  Loop on 2D domain (and time as '*' dimension)
169;
170   FOR ji = 0, (jpi-1) DO BEGIN
171      FOR jj = 0, (jpj-1) DO BEGIN
172
173         IF rho0[ji, jj, 0] NE valmask THEN BEGIN
174;
175;        input fields
176            t = sst[ji, jj, *]
177            s = sss[ji, jj, *]
178            hf = hef[ji, jj, *]
179            ep = emp[ji, jj, *]
180            sig = rho0[ji, jj, *]
181
182;        compte alpha, beta, Cp
183            al = alpha[t, s, P]
184            be = betar[t, s, P]
185            Cp = Cpsw[t, s, P]
186
187;        find density bin
188            ib = ROUND((sig-sig_min)/dsig)
189
190            ib = ib > 0
191            ib = ib < n_sig
192
193;        compute area and integral of fluxes
194
195            dA = e1t[ji, jj]*e2t[ji, jj]
196        ; conv = m2 -> 1.e6 km2
197            conv = 1.e-6*1.e-6
198            t_area = t_area + dA*conv
199        ; conv = W -> PW
200            conv = 1.e-15
201            t_heat = t_heat + total(hf)*dt*dA*conv
202        ; conv = mm -> m and m3/s to Sv
203            conv = 1.e-3*1.e-6
204            t_wafl = t_wafl + total(ep)*dt*dA*conv
205
206;        tally number of point in each bin
207
208            FOR jt = 0, (jpt-1) DO BEGIN
209               area[ib[jt], jt] = area[ib[jt], jt] + dA
210               nval[ib[jt], jt] = nval[ib[jt], jt] + 1
211            ENDFOR
212
213;        sum heat and fresh water fluxes as mass fluxes in kg/m2/s (all units SI)
214;        convwf : kg/m2/s=mm/s -> m/s
215            convwf = 1.e-3
216            fheat[ji, jj, *] = ( -al/Cp)*hf
217            fwafl[ji, jj, *] = (1000.+sig)*be*s*ep*convwf
218
219;        volume transport per density class (m3/s)
220;        period averaged density flux
221            FOR jt = 0, (jpt-1) DO BEGIN
222               fht = fheat[ji, jj, jt]*dA
223               fwf = fwafl[ji, jj, jt]*dA
224               hist[ib[jt], jt] = hist[ib[jt], jt] + (fht+fwf)/drho
225               histwf[ib[jt], jt] = histwf[ib[jt], jt] + fwf/drho
226               fluxbar = fluxbar + (fht+fwf)*dt
227               fluxsal = fluxsal + (fwf)*dt
228            ENDFOR
229
230         ENDIF
231;     end of loop on ji,jj
232      ENDFOR
233   ENDFOR
234
235
236   print, ' '
237   print, ' ----------------------------------------------------------------'
238   print, '                    Transformation statitics'
239   print, ' ----------------------------------------------------------------'
240   print, '   Net heat flux in ocean               (PW)  : ', t_heat
241   print, '   Net water flux in ocean              (Sv)  : ', t_wafl
242   print, '   Period averaged density flux       (kg/s)  : ', fluxbar
243   print, '      - heat flux contribution        (kg/s)  : ', fluxbar-fluxsal
244   print, '      - fresh water flux contribution (kg/s)  : ', fluxsal
245   print, '   Integral area (glob.=357.208)  (10^6 km2)  : ', t_area
246   print, ' '
247
248; output
249
250   CASE todo OF ;
251      'denflx': result = (fheat+fwafl)           ; density flux
252      'denflw': result = (fwafl)                 ; fresh water density flux
253      ELSE: result = -1
254   ENDCASE
255
256   return, result
257END
Note: See TracBrowser for help on using the repository browser.