source: trunk/CALCULS/remplit.pro @ 2

Last change on this file since 2 was 2, checked in by opalod, 22 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 7.6 KB
Line 
1FUNCTION remplit, zinput, NAN = nan, NITE = nite, BASIQUE = basique, mask = mask, _extra = ex
2@common
3   tempsun = systime(1)         ; pour key_performance
4;+
5   ;;
6   ;; Extrapole zinout[jpi,jpj] sur les continents en utilisant les 4
7   ;; plus proches voisins masques oceaniquement et construit un nouveau
8;   masque
9   ;; contenant l'ancien masque oceanique PLUSles points extrapoles.
10   ;; Reitere le processus nite fois.
11   ;; C'est pas clair, essayez !
12   ;;
13   ;;
14;
15;    /Nan: to fill the point which have the value
16;    !values.f_nan. Whitout this keyword, these point are not filling
17;    and stays at !values.f_nan.
18;
19;
20
21
22
23;-
24; les points non remplis sont masques a valmask
25   z = zinput
26   if n_elements(key_gridtype) EQ 0 then key_gridtype = 'c'
27   if keyword_set(basique) then begin
28      oldkey_gridtype = key_gridtype
29      key_gridtype = 'c'
30   endif
31   IF n_elements(nite) EQ 0 THEN nite = 1
32   IF nite EQ 0 THEN return, zinput
33   if keyword_set(basique)  then begin
34      nx = (size(zinput))[1]
35      ny = (size(zinput))[2]
36      if NOT keyword_set(mask) then mmmask = basique ELSE mmmask = mask
37      if  key_gridtype eq 'e' then begin
38         case vargrid of
39            'T':glam = glamt[premierxt:dernierxt, premieryt:dernieryt]
40            'U':glam = glamu[premierxu:dernierxu, premieryu:dernieryu]
41         endcase
42      endif
43   ENDIF ELSE grille, mmmask, glam, gphi, gdep, nx, ny, nz, _extra = ex
44   if keyword_set(mask) then mmmask = mask
45;---------------------------------------------------------------
46   if (size(mmmask))[0] EQ 3 THEN BEGIN
47      if (size(mmmask))[3] EQ jpk THEN mmmask = mmmask[*, *, niveau-1] $
48      ELSE  mmmask = mmmask[*, *, nz-1]
49   ENDIF
50;
51   if n_elements(mmmask) EQ 1 then mmmask = replicate(1, nx, ny)
52   if keyword_set(nan) then begin
53      nanpoint = where(finite(z) EQ 0)
54      if nanpoint[0] NE -1 then begin
55         mmmask[nanpoint] = 0
56         z[nanpoint] = 0
57      endif
58   endif
59;---------------------------------------------------------------
60; on ajoute un cadre de zero a z, mask, e1, e2
61; comme ca apres on peut faire des shifts ds tous les sens sans se
62; soucier des bords du domaine!
63;---------------------------------------------------------------
64   tempdeux = systime(1)        ; pour key_performance =2
65   nx2 = nx+2
66   case key_gridtype of
67      'c':BEGIN
68         zero = fltarr(nx+2, ny+2)
69         zero[1:nx, 1:ny] = mmmask
70         mmmask = zero
71         zero = fltarr(nx+2, ny+2)
72         zero[1:nx, 1:ny] = z
73         if keyword_set(key_periodique) AND nx EQ jpi then begin
74            zero[0, 1:ny] = z[jpi-1, *]
75            zero[nx+1, 1:ny] = z[0, *]
76         endif
77         z = zero
78      END
79      'e':BEGIN
80         zero = fltarr(nx+2, ny+4)
81         zero[1:nx, 2:ny+1] = mmmask
82         mmmask = zero
83         zero = fltarr(nx+2, ny+4)
84         zero[1:nx, 2:ny+1] = z
85         if keyword_set(key_periodique) AND nx EQ jpi then begin
86            zero[0, 2:ny+1] = z[jpi-1, *]
87            zero[nx+1, 2:ny+1] = z[0, *]
88         endif
89         z = zero
90      END
91   endcase
92   IF testvar(var = key_performance) EQ 2 THEN $
93    print, 'temps remplit: on ajoute un cadre de zero ', systime(1)-tempdeux
94;---------------------------------------------------------------
95;---------------------------------------------------------------
96; iteration
97;---------------------------------------------------------------
98;---------------------------------------------------------------
99   FOR n = 1, nite DO BEGIN
100; on trouve les points cote
101      tempdeux = systime(1)     ; pour key_performance =2
102; les points du bord du cadre ne doivent pas etre dans la cote
103      case key_gridtype of
104         'c':BEGIN
105            mmmask[0, *] = 1
106            mmmask[nx+1, *] = 1
107            mmmask[*, 0] = 1
108            mmmask[*, ny+1] = 1
109            if keyword_set(key_periodique) AND nx EQ jpi then begin
110               mmmask[0,*] = mmmask[nx-2, *]
111               mmmask[nx+1,*] = mmmask[1, *]
112            endif
113         END
114         'e':BEGIN
115            mmmask[0, *] = 1
116            mmmask[nx+1, *] = 1
117            mmmask[*, 0:1] = 1
118            mmmask[*, ny+2:ny+3] = 1
119            if keyword_set(key_periodique) AND nx EQ jpi then begin
120               mmmask[0,*] = mmmask[nx-2, *]
121               mmmask[nx+1,*] = mmmask[1, *]
122            endif
123         END
124      endcase
125; liste des points terre restant
126      terre = where(mmmask EQ 0)
127      if terre[0] EQ -1 then GOTO, fini
128; les points du bord du cadre doivent maintenant etre dans la terre
129      case key_gridtype of
130         'c':BEGIN
131            mmmask[0, *] = 0
132            mmmask[nx+1, *] = 0
133            mmmask[*, 0] = 0
134            mmmask[*, ny+1] = 0
135         END
136         'e':BEGIN
137            mmmask[0, *] = 0
138            mmmask[nx+1, *] = 0
139            mmmask[*, 0:1] = 0
140            mmmask[*, ny+2:ny+3] = 0
141         END
142      endcase
143; liste des voisins mer
144      case key_gridtype of
145         'c':BEGIN
146            voisins = shift(mmmask,-1,0)+shift(mmmask,1,0)+shift(mmmask,0,-1)+shift(mmmask,0,1) $
147             +1./sqrt(2)*(shift(mmmask,-1,-1)+shift(mmmask,1,1)+shift(mmmask,1,-1)+shift(mmmask,-1,1))
148            cote = where(voisins[terre] GT 0)
149; liste des points cote
150            cote = terre[cote]
151            poids = voisins[cote]
152         END
153         'e':BEGIN
154            shifted = glam[0, 0] LT glam[0, 1]
155            oddeven = (terre/nx2+1-shifted) MOD 2
156            voisins = mmmask[terre+1]+mmmask[terre-1] $
157             +mmmask[2*nx2+terre]+mmmask[-2*nx2+terre] $
158             +sqrt(2)*(mmmask[terre-nx2+oddeven]+mmmask[terre+nx2+oddeven] $
159                       +mmmask[terre+(-nx2-1)+oddeven]+mmmask[terre+(nx2-1)+oddeven])
160            cote = where(voisins GT 0)
161            poids = voisins[cote]
162            cote = terre[cote]
163         END
164      endcase
165;
166      IF testvar(var = key_performance) EQ 2 THEN $
167       print, 'temps remplit: trouver la cote ', systime(1)-tempdeux
168;---------------------------------------------------------------
169; remplissage des points cote
170;---------------------------------------------------------------
171      tempdeux = systime(1)     ; pour key_performance =2
172; on masque z
173      z = z*mmmask
174;
175      case key_gridtype of
176         'c':BEGIN
177            zcote = z[1+cote]+z[-1+cote]+z[nx2+cote]+z[-nx2+cote] $
178             +1./sqrt(2)*(z[nx2+1+cote]+z[nx2-1+cote] $
179                          +z[-nx2+1+cote]+z[-nx2-1+cote])
180         END
181         'e':BEGIN
182            oddeven = (cote/nx2+1-shifted) MOD 2
183            zcote = z[1+cote]+z[-1+cote]+z[2*nx2+cote]+z[-2*nx2+cote] $
184             +sqrt(2)*(z[-nx2+oddeven+cote]+z[-nx2-1+oddeven+cote] $
185                       +z[nx2+oddeven+cote]+z[nx2-1+oddeven+cote])
186         END
187      endcase
188     
189      z[cote] = zcote/poids
190;---------------------------------------------------------------
191; IV) on reduit le masque
192;---------------------------------------------------------------
193      mmmask[cote] = 1
194;
195      IF testvar(var = key_performance) EQ 2 THEN $
196       print, 'temps remplit: une iteration ', systime(1)-tempdeux
197   ENDFOR
198fini:
199;
200; on masque les valeurs sur les terres restantes
201;
202   IF n_elements(valmask) EQ 0 then valmask = 1e20
203   z = z*mmmask+valmask*(1-mmmask)
204;---------------------------------------------------------------
205; on redecoupe le tableau pour retirer le cadre!
206;---------------------------------------------------------------
207   case key_gridtype of
208      'c':BEGIN
209         z = z[1:nx, 1:ny]
210      END
211      'e':BEGIN
212         z = z[1:nx, 2:ny+1]
213      END
214   endcase
215;
216   if keyword_set(basique) then key_gridtype = oldkey_gridtype
217;---------------------------------------------------------------
218   if keyword_set(key_performance) THEN print, 'temps remplit', systime(1)-tempsun
219   return, z
220END
221
Note: See TracBrowser for help on using the repository browser.