[163] | 1 | ;+ |
---|
[2] | 2 | ; |
---|
| 3 | ; compute transformation |
---|
| 4 | ; |
---|
[194] | 5 | ; @param FILE_NAME {in}{required}{type=string} |
---|
| 6 | ; |
---|
| 7 | ; @param NCDF_DB {in}{required}{type=string} |
---|
| 8 | ; <location>:<path> or just <path> |
---|
| 9 | ; |
---|
[174] | 10 | ; @param TODO {in} |
---|
[163] | 11 | ; |
---|
| 12 | ; input denflx = density flux |
---|
| 13 | ; |
---|
[194] | 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 | ; |
---|
[170] | 28 | ; @uses |
---|
| 29 | ; <pro>common</pro> |
---|
| 30 | ; <propost_it>com_eg</propost_it> |
---|
| 31 | ; |
---|
[163] | 32 | ; @history |
---|
[194] | 33 | ; - fplod 20100119T094532Z aedon.locean-ipsl.upmc.fr (Darwin) |
---|
[2] | 34 | ; |
---|
[194] | 35 | ; * check parameters |
---|
| 36 | ; |
---|
| 37 | ; - EG january 2001 (inspired from denflux.f) |
---|
| 38 | ; |
---|
[163] | 39 | ; @version |
---|
| 40 | ; $Id$ |
---|
| 41 | ; |
---|
| 42 | ;- |
---|
[165] | 43 | FUNCTION make_transfo, file_name, ncdf_db, todo $ |
---|
| 44 | , BOXZOOM=boxzoom $ |
---|
[168] | 45 | , TIME_1=time_1 $ |
---|
| 46 | , TIME_2=time_2 $ |
---|
| 47 | , ALL_DATA=all_data $ |
---|
[165] | 48 | , ZMTYP=zmtyp |
---|
[2] | 49 | ; |
---|
[169] | 50 | compile_opt idl2, strictarrsubs |
---|
| 51 | ; |
---|
[2] | 52 | @common |
---|
| 53 | @com_eg |
---|
| 54 | ; |
---|
[194] | 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 | |
---|
[2] | 94 | ; |
---|
| 95 | ; Read sst (C), sss (PSU), Q [W/m2], E-P [kg/m2/s]=[mm/s] |
---|
| 96 | ; |
---|
[165] | 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) |
---|
[2] | 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) |
---|
[205] | 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 |
---|
[2] | 114 | |
---|
| 115 | ; Compute potential density (sigma_0) |
---|
[203] | 116 | |
---|
[169] | 117 | rho0 = eos[sst, sss]-1000. |
---|
[205] | 118 | IF idxs[0] NE -1 THEN BEGIN |
---|
| 119 | rho0[idxt] = valmask |
---|
| 120 | ENDIF |
---|
[2] | 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 |
---|
[205] | 133 | IF sizef[0] EQ 3 THEN BEGIN |
---|
| 134 | jpt = sizef[3] |
---|
| 135 | ENDIF |
---|
[2] | 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 | |
---|
[203] | 163 | timwrk = fltarr(jpt) |
---|
[2] | 164 | |
---|
| 165 | trf_bin = fltarr(n_sig+1) |
---|
[203] | 166 | trf_bin[*] = 0. |
---|
[2] | 167 | ; |
---|
| 168 | ; Loop on 2D domain (and time as '*' dimension) |
---|
| 169 | ; |
---|
[203] | 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 |
---|
[2] | 174 | ; |
---|
| 175 | ; input fields |
---|
[169] | 176 | t = sst[ji, jj, *] |
---|
| 177 | s = sss[ji, jj, *] |
---|
| 178 | hf = hef[ji, jj, *] |
---|
| 179 | ep = emp[ji, jj, *] |
---|
[203] | 180 | sig = rho0[ji, jj, *] |
---|
[2] | 181 | |
---|
| 182 | ; compte alpha, beta, Cp |
---|
[169] | 183 | al = alpha[t, s, P] |
---|
| 184 | be = betar[t, s, P] |
---|
| 185 | Cp = Cpsw[t, s, P] |
---|
[2] | 186 | |
---|
| 187 | ; find density bin |
---|
| 188 | ib = ROUND((sig-sig_min)/dsig) |
---|
[203] | 189 | |
---|
[165] | 190 | ib = ib > 0 |
---|
[2] | 191 | ib = ib < n_sig |
---|
| 192 | |
---|
| 193 | ; compute area and integral of fluxes |
---|
| 194 | |
---|
[169] | 195 | dA = e1t[ji, jj]*e2t[ji, jj] |
---|
[2] | 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 |
---|
[203] | 201 | t_heat = t_heat + total(hf)*dt*dA*conv |
---|
[2] | 202 | ; conv = mm -> m and m3/s to Sv |
---|
| 203 | conv = 1.e-3*1.e-6 |
---|
[203] | 204 | t_wafl = t_wafl + total(ep)*dt*dA*conv |
---|
[2] | 205 | |
---|
[203] | 206 | ; tally number of point in each bin |
---|
[2] | 207 | |
---|
[203] | 208 | FOR jt = 0, (jpt-1) DO BEGIN |
---|
[169] | 209 | area[ib[jt], jt] = area[ib[jt], jt] + dA |
---|
| 210 | nval[ib[jt], jt] = nval[ib[jt], jt] + 1 |
---|
[203] | 211 | ENDFOR |
---|
[2] | 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 |
---|
[169] | 216 | fheat[ji, jj, *] = ( -al/Cp)*hf |
---|
| 217 | fwafl[ji, jj, *] = (1000.+sig)*be*s*ep*convwf |
---|
[2] | 218 | |
---|
| 219 | ; volume transport per density class (m3/s) |
---|
| 220 | ; period averaged density flux |
---|
[203] | 221 | FOR jt = 0, (jpt-1) DO BEGIN |
---|
[169] | 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 |
---|
[2] | 226 | fluxbar = fluxbar + (fht+fwf)*dt |
---|
| 227 | fluxsal = fluxsal + (fwf)*dt |
---|
[203] | 228 | ENDFOR |
---|
[2] | 229 | |
---|
[203] | 230 | ENDIF |
---|
[2] | 231 | ; end of loop on ji,jj |
---|
[203] | 232 | ENDFOR |
---|
| 233 | ENDFOR |
---|
[2] | 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 |
---|
[203] | 254 | ENDCASE |
---|
| 255 | |
---|
[2] | 256 | return, result |
---|
[203] | 257 | END |
---|