[2] | 1 | ;------------------------------------------------------------ |
---|
| 2 | ;------------------------------------------------------------ |
---|
| 3 | ;------------------------------------------------------------ |
---|
| 4 | ;+ |
---|
| 5 | ; NAME:hdyn |
---|
| 6 | ; |
---|
| 7 | ; PURPOSE:calcule la hauteur dynamique par rapport a un etat de |
---|
| 8 | ; reference pour une profondeur de reference. Cf les mots cles pour |
---|
| 9 | ; les differentes possibilites. |
---|
| 10 | ; Par defaut l''etat de reference est |
---|
| 11 | ; rho=1020 et la profondeur de reference est gdepw[ka] avec ka le |
---|
| 12 | ; premier niveau W directement au dessus de 1000 m. |
---|
| 13 | ; |
---|
| 14 | ; CATEGORY: calculs de post-traitement |
---|
| 15 | ; |
---|
| 16 | ; CALLING SEQUENCE:res=hdyn(sn,tn) |
---|
| 17 | ; |
---|
| 18 | ; INPUTS:sn et tn sont des tableaux de meme taille representant la |
---|
| 19 | ; salinite et la temperature. |
---|
| 20 | ; |
---|
| 21 | ; KEYWORD PARAMETERS: |
---|
| 22 | ; |
---|
| 23 | ; GILL: activer cette cle si on veut faire le calcul de la |
---|
| 24 | ; hauteur dynamique comme ds le GILL page 215 cad par rapport a |
---|
| 25 | ; un etat de reference qui varie en profondeur et qui est |
---|
| 26 | ; determine par une temperature de reference tref a 0 degre et |
---|
| 27 | ; une salinite de reference sref a 35psu |
---|
| 28 | ; |
---|
| 29 | ; LEVEL: C''est le niveau de reference a prendre. Ce niveau est |
---|
| 30 | ; definit tel que gdepw[level] est la profondeur de reference |
---|
| 31 | ; |
---|
| 32 | ; SREF: donner une valeur a ce mot cle pour changer la salinite |
---|
| 33 | ; de reference utiliser ds le calcul lorsque GILL est active. |
---|
| 34 | ; |
---|
| 35 | ; TREF: donner une valeur a ce mot cle pour changer la temperature |
---|
| 36 | ; de reference utiliser ds le calcul lorsque GILL est active. |
---|
| 37 | ; |
---|
| 38 | ; PROFREF: donner a ce mot cle une profondeur qui sera prise comme |
---|
| 39 | ; la profondeur de reference (ds ce cas LEVEL n'' a aucun |
---|
| 40 | ; effet). le calcul sera alors effectue jusqu''a cette |
---|
| 41 | ; profondeur en effectuant une interpolation entre le dernier |
---|
| 42 | ; niveau W au dessus de PROFREF et PROFREF. |
---|
| 43 | ; |
---|
| 44 | ; SURFACE_LEVEL: C''est le niveau auquel on veut calculer la |
---|
| 45 | ; hauteur dynamique. Par defaut c''est le niveau 0. |
---|
| 46 | ; |
---|
| 47 | ; OUTPUTS:un tableau de la meme taille que sn et tn representant la |
---|
| 48 | ; hauteur dynamique calculee a partir d''une profondeur de reference |
---|
| 49 | ; et par rapport a un etat de reference. |
---|
| 50 | ; |
---|
| 51 | ; COMMON BLOCKS: |
---|
| 52 | ; common.pro |
---|
| 53 | ; |
---|
| 54 | ; SIDE EFFECTS: |
---|
| 55 | ; les points pour lesquels on nje peut calcule la hauteur dynamique |
---|
| 56 | ; (dont la batymetrie est moins profonde que la profondeur de |
---|
| 57 | ; reference) sont mis a la valeur !values.f_nan |
---|
| 58 | ; |
---|
| 59 | ; RESTRICTIONS:approximation: la pression en decibars est egale a la |
---|
| 60 | ; profondeur en metres (la pression augmente de 1bar tous les 10m) |
---|
| 61 | ; |
---|
| 62 | ; EXAMPLE: |
---|
| 63 | ; |
---|
| 64 | ; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr) |
---|
| 65 | ; |
---|
| 66 | ;- |
---|
| 67 | ;------------------------------------------------------------ |
---|
| 68 | ;------------------------------------------------------------ |
---|
| 69 | ;------------------------------------------------------------ |
---|
| 70 | FUNCTION hdyn, tabsn, tabtn, TREF = tref, SREF = sref, PROFREF = profref, LEVEL = level, GILL = gill, SURFACE_LEVEL = surface_level |
---|
[114] | 71 | ; |
---|
| 72 | compile_opt idl2, strictarrsubs |
---|
| 73 | ; |
---|
[2] | 74 | tempsun = systime(1) ; pour key_performance |
---|
| 75 | @common |
---|
| 76 | |
---|
| 77 | if NOT keyword_set(surface_level) then surface_level = 0 |
---|
| 78 | ; utile si GILL est active |
---|
| 79 | if NOT keyword_set(tref) then tref = 0. |
---|
| 80 | if NOT keyword_set(sref) then sref = 35. |
---|
| 81 | ; on determine si besoin est la profondeur de reference et le niveau |
---|
| 82 | ; W situe directement au dessus. |
---|
| 83 | if keyword_set(profref) then begin |
---|
| 84 | rien = where(gdepw LE profref, level) |
---|
| 85 | level = level-1 |
---|
| 86 | za = gdepw[level] |
---|
| 87 | ENDIF ELSE BEGIN |
---|
| 88 | if NOT keyword_set(level) then BEGIN |
---|
| 89 | rien = where(gdepw LE 1000., level) |
---|
| 90 | level = level-1 |
---|
| 91 | ENDIF |
---|
| 92 | profref = gdepw[level] |
---|
| 93 | za = profref |
---|
| 94 | ENDELSE |
---|
| 95 | tailles = size(tabsn) |
---|
| 96 | taillet = size(tabtn) |
---|
| 97 | if total(tailles[0:tailles[0]] NE taillet[0:taillet[0]]) NE 0 then $ |
---|
| 98 | return, report('Les tableaux sn et tn doivent avoir la meme taille') |
---|
| 99 | if tailles[3] NE jpk then return, report('La dim verticale des tableaux sn et tn doit etre egalre a jpk') |
---|
| 100 | nx = nxt |
---|
| 101 | ny = nyt |
---|
| 102 | case (size(tabsn))[0] OF |
---|
| 103 | 3:BEGIN |
---|
| 104 | case 1 of |
---|
| 105 | tailles[1] eq jpi and tailles[2] eq jpj: BEGIN |
---|
[25] | 106 | sn = tabsn[firstxt:lastxt, firstyt:lastyt, *] |
---|
| 107 | tn = tabtn[firstxt:lastxt, firstyt:lastyt, *] |
---|
[2] | 108 | end |
---|
| 109 | tailles[1] eq nx and tailles[2] eq ny:BEGIN |
---|
| 110 | sn = tabsn |
---|
| 111 | tn = tabtn |
---|
| 112 | end |
---|
| 113 | else:return, report('Probleme d''adequation entre les tailles du domaine et de la boite.') |
---|
| 114 | ENDCASE |
---|
| 115 | if keyword_set(gill) then $ |
---|
| 116 | rhonref = rhon(replicate(sref,nx, ny, jpk),replicate(tref,nx, ny, jpk), /insitu) $ |
---|
| 117 | ELSE rhonref = 1020. |
---|
| 118 | vol=(rhonref-rhon(sn,tn, /insitu))/rhonref |
---|
| 119 | e33d = replicate(1, nx*ny)#e3t |
---|
| 120 | e33d = reform(e33d, nx, ny, jpk, /over) |
---|
[25] | 121 | terre = where(tmask[firstxt:lastxt, firstyt:lastyt, *] EQ 0) |
---|
[2] | 122 | if terre[0] NE -1 then vol[terre] = !values.f_nan |
---|
| 123 | case level of |
---|
| 124 | 0:hdyn =100.*(profref-gdepw[0])*vol[*, *, 0] |
---|
| 125 | 1:hdyn =100.*(vol*e33d)[*, *, 0]+(profref-gdepw[1])*vol[*, *, 1] |
---|
| 126 | ELSE:hdyn =100.*total( (vol*e33d)[*, *, surface_level: level-1], 3) $ |
---|
| 127 | +(profref-gdepw[level])*vol[*, *, level] |
---|
| 128 | endcase |
---|
| 129 | END |
---|
| 130 | 4:BEGIN |
---|
| 131 | case 1 of |
---|
| 132 | tailles[1] eq jpi and tailles[2] eq jpj AND tailles[4] EQ jpt: BEGIN |
---|
[25] | 133 | sn = tabsn[firstxt:lastxt, firstyt:lastyt, *, *] |
---|
| 134 | tn = tabtn[firstxt:lastxt, firstyt:lastyt, *, *] |
---|
[2] | 135 | end |
---|
| 136 | tailles[1] eq nx and tailles[2] eq ny AND tailles[4] EQ jpt:BEGIN |
---|
| 137 | sn = tabsn |
---|
| 138 | tn = tabtn |
---|
| 139 | end |
---|
| 140 | else:return, report('Probleme d''adequation entre les tailles du domaine et de la boite.') |
---|
| 141 | endcase |
---|
| 142 | if keyword_set(gill) then $ |
---|
| 143 | rhonref = rhon(replicate(sref,nx, ny, jpk, jpt),replicate(tref,nx, ny, jpk, jpt), /insitu) $ |
---|
| 144 | ELSE rhonref = 1020. |
---|
| 145 | vol=(rhonref-rhon(sn,tn, /insitu))/rhonref |
---|
| 146 | e33d = replicate(1, nx*ny)#e3t |
---|
| 147 | e33d = e33d[*]#replicate(1, jpt) |
---|
| 148 | e33d = reform(e33d, nx, ny, jpk, jpt, /over) |
---|
[25] | 149 | mask = tmask[firstxt:lastxt, firstyt:lastyt, *] |
---|
[2] | 150 | mask = mask[*]#replicate(1, jpt) |
---|
| 151 | terre = where(mask EQ 0) |
---|
| 152 | if terre[0] NE -1 then vol[terre] = !values.f_nan |
---|
| 153 | case level of |
---|
| 154 | 0:hdyn =100.*(profref-gdepw[0])*vol[*, *, 0, *] |
---|
| 155 | 1:hdyn =100.*(vol*e33d)[*, *, 0, *]+(profref-gdepw[1])*vol[*, *, 1, *] |
---|
| 156 | ELSE:hdyn =100.*total( (vol*e33d)[*, *, surface_level: level-1, *], 3) $ |
---|
| 157 | +(profref-gdepw[level])*vol[*, *, level, *] |
---|
| 158 | endcase |
---|
| 159 | END |
---|
| 160 | ELSE: return, report('cas non code') |
---|
| 161 | ENDCASE |
---|
| 162 | varunit = 'cm' |
---|
| 163 | varname = 'Dynamic Height (href='+strtrim(round(profref), 1)+'m)' |
---|
| 164 | IF keyword_set(key_performance) THEN print, 'temps hdyn', systime(1)-tempsun |
---|
| 165 | |
---|
| 166 | return, hdyn |
---|
| 167 | end |
---|