source: trunk/procs/ajoutvectz.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: 9.1 KB
Line 
1;+
2;
3; surimprimme des vecteur sur un champ trace par <pro>pltz</pro>
4;
5; @categories
6; Graphics
7;
8; @param VECTEUR {in}{required}{type=structure}
9; une structure a 2 elements contenant les 2 matrices U
10;       et V des valeurs de la composante horizontale et verticale du
11;       champ de vecteurs a tracer.
12;
13;       par ex:
14;       vecteur={matriceu:lec('unsurface'),matricev:lec('vnsurface')}
15;       rq:le nom des elements de vecteur n''a aucune importance.
16;       vecteur={u:lec('unsurface'),v:lec('vnsurface')} convient aussi
17;
18; @keyword UNVECTSUR
19; un scalaire n ou un tableau a 2 elements [n1,n2].
20;
21; Dans le premier cas, on tracera un vecteur sur n suivant les
22; x et les y.
23; Dans le second cas on tracera un vecteur sur n1 suivant x
24; et un vecteur sur n2 suivant y
25;
26; Rq: pour tracer tous les vecteurs suivant y et 1 sur 2 suivant
27; x mettre unvectsur=[2,1]
28;
29; @keyword VECTMIN
30; norme minimun des vecteurs a tracer
31;
32; @keyword VECTMAX
33; norme minimun des vecteurs a tracer
34;
35; @keyword VECTMIN
36;
37; @keyword VECTMAX
38;
39; @keyword _EXTRA
40;
41; @keyword TYPE
42;
43; @examples
44;
45; IDL> vecteur={matriceu:lec('unsurface'),matricev:lec('vnsurface')}
46; IDL> ajoutvectz, vecteur, $
47;    , UNVECTSUR=unvectsur $
48;    , VECTMIN=vectmin $
49;    , VECTMAX=vectmax $
50;    , _EXTRA=extra $
51;    , TYPE = type $
52;    , BOITE = boite
53;
54; @uses
55; <pro>common<pro>
56; <pro>litchamp<pro>
57;
58; @todo
59;
60; fix pb in param vecteur description with idldoc. It seems that {...}
61; have side effects
62;
63; in example current pb with lec('vnsurface')
64;
65; IDL> vecteur={matriceu:lec('unsurface'),matricev:lec('vnsurface')}
66; % L.145 /usr/lodyc/incas/fplod/SAXO_DIR_ws/SRC/Obsolete/lec.pro rev. 378:
67; % le nom du champ doit commencer par VO ou SO
68;
69; @history
70; - fplod 20091209T094630Z aedon.locean-ipsl.upmc.fr (Darwin)
71;
72;   * check parameters
73;   * remove vectlegend parameter (unused)
74;
75; - Eric Guilyardi (ericg\@lodyc.jussieu.fr) Sebastien Masson (smassom\@lodyc.jussieu.fr)
76;
77;   * 26/9/00 (on board R/V Marion Dufresne)
78;
79; @version
80; $Id$
81;
82;-
83PRO ajoutvectz, vecteur $
84    , UNVECTSUR=unvectsur $
85    , VECTMIN=vectmin $
86    , VECTMAX=vectmax $
87    , _EXTRA=extra $
88    , TYPE = type $
89    , BOITE = boite
90;
91  compile_opt idl2, strictarrsubs
92;
93@common
94;
95  tempsun = systime(1)         ; pour key_performance
96;
97; Return to caller if errors
98 ON_ERROR, 2
99;
100 usage='ajoutvectz, vecteur ' $
101    + ', UNVECTSUR=unvectsur' $
102    + ', VECTMIN=vectmin' $
103    + ', VECTMAX=vectmax' $
104    + ', _EXTRA=extra' $
105    + ', TYPE = type' $
106    + ', BOITE = boite'
107;
108 nparam = N_PARAMS()
109 IF (nparam LT 2) THEN BEGIN
110    ras = report(['Incorrect number of arguments.' $
111          + '!C' $
112          + 'Usage : ' + usage])
113    stop
114 ENDIF
115 arg_type = size(vecteur,/type)
116 IF (arg_type NE 8) THEN BEGIN
117   ras = report(['Incorrect arg type vecteur' $
118          + '!C' $
119          + 'Usage : ' + usage])
120    stop
121 ENDIF
122
123
124;----------------------------------------------------------------------------
125;
126   u = litchamp(vecteur.(0))
127   grilleu = litchamp(vecteur.(0), /grid)
128   vargrid = grilleu
129   boitesave = boite
130   u = checkfield(u, 'pltz', TYPE = type, BOITE = boite, /NOQUESTION, /VECTEUR)
131   boite = boitesave
132
133   w = litchamp(vecteur.(1))
134   grillew = litchamp(vecteur.(1), /grid)
135   vargrid = grillew
136   w = checkfield(w, 'pltz', TYPE = type, BOITE = boite, /NOQUESTION, /VECTEUR)
137
138;------------------------------------------------------------
139; on recupere les eventuelles info sur les champs
140;------------------------------------------------------------
141   CASE type OF
142      'yz': IF grilleu EQ '' THEN BEGIN
143             grilleu = 'V'
144            ENDIF
145      'xz': IF grilleu EQ '' THEN BEGIN
146             grilleu = 'U'
147            ENDIF
148      ELSE: IF grilleu EQ '' THEN BEGIN
149             grilleu = 'V'
150            ENDIF
151   ENDCASE
152   IF grillew EQ '' THEN BEGIN
153    grillew = 'W'
154   ENDIF
155
156   IF grilleu EQ 'T' AND grillew EQ 'T' THEN BEGIN
157    interpolle = 0
158   ENDIF ELSE BEGIN
159    interpolle = 1
160   ENDELSE
161
162;------------------------------------------------------------
163; on trouve les points que u et v ont en communs
164;------------------------------------------------------------
165   if interpolle THEN BEGIN
166      CASE type OF
167         'yz': indicehx = (lindgen(jpj))[firstyv:firstyv+nyv-1]
168         'xz': indicehx = (lindgen(jpi))[firstxu:firstxu+nxu-1]
169      ENDCASE
170      CASE type OF
171         'yz': indicehw = (lindgen(jpj))[firstyt:firstyt+nyt-1]
172         'xz': indicehw = (lindgen(jpi))[firstxt:firstxt+nxt-1]
173      ENDCASE
174
175      indicex = inter(indicehx, indicehw)
176
177      indicezh = (lindgen(jpk))[firstzt:firstzt+nzt-1]
178      indicezw = (lindgen(jpk))[firstzw:firstzw+nzw-1]
179
180      indicez = inter(indicezh, indicezw)
181
182      nx = n_elements(indicex)
183      nz = n_elements(indicez)
184
185      CASE type OF
186      'yz': BEGIN & nxh = nyv & firsth = firstyv & END
187      'xz': BEGIN & nxh = nxu & firsth = firstxu & END
188      ENDCASE
189
190;------------------------------------------------------------
191; extraction de u et v sur le domaine qui convient
192;------------------------------------------------------------
193      if nxh NE nx THEN BEGIN
194       if indicex[0] EQ firsth THEN BEGIN
195        u = u[0:nx-1, *]
196       ENDIF ELSE BEGIN
197        u = u[1: nx, *]
198       ENDELSE
199      ENDIF
200      IF nxt NE nx THEN BEGIN
201       if indicex[0] EQ firstxt THEN BEGIN
202        w = w[0:nx-1, *]
203       ENDIF ELSE BEGIN
204        w = w[1: nx, *]
205       ENDELSE
206      ENDIF
207      IF nzt NE nz THEN BEGIN
208       if indicez[0] EQ firstzt THEN BEGIN
209        u = u[*, 0:nz-1]
210       ENDIF ELSE BEGIN
211        u = u[*, 1: nz]
212       ENDELSE
213      ENDIF
214      IF nzw NE nz THEN BEGIN
215       if indicez[0] EQ firstzw THEN BEGIN
216        w = w[*, 0:nz-1]
217       ENDIF ELSE BEGIN
218        w = w[*, 1: nz]
219       ENDELSE
220      ENDIF
221;------------------------------------------------------------------
222; on reform u et w pour s'assurer qu'aucune dimension n'a ete ecrasee
223;------------------------------------------------------------------
224      if nz EQ 1 THEN BEGIN
225         u = reform(u, nx, nz)
226         w = reform(w, nx, nz)
227      endif
228;------------------------------------------------------------------
229; construction de u et w aux pts T
230;-----------------------------------------------------------
231
232      terre = where(u GE valmask/10.)
233      IF terre[0] NE -1 THEN BEGIN
234       u[terre] = !VALUES.F_NAN
235      ENDIF
236      terre = where(w GE valmask/10.)
237      IF terre[0] NE -1 THEN BEGIN
238       w[terre] = !VALUES.F_NAN
239      ENDIF
240
241      a=u[0,*]
242      u=(u+shift(u,1,0))/2.
243      u[0,*]=a
244
245      a=w[*,0]
246      w=(w+shift(w,0,1))/2.
247      w[*,0] = a
248
249      vargrid='T'
250
251   ENDIF
252;-----------------------------------------------------------
253; tracer qu'un vecteur sur
254;-----------------------------------------------------------
255   if keyword_set(unvectsur) THEN BEGIN
256; indx est un vecteur contenant les numero des colonnes a selectionner
257; indz est un vecteur contenant les numero des lignes a selectionner
258      if n_elements(unvectsur) EQ 1 THEN BEGIN
259         indx = where((lindgen(nx) MOD unvectsur[0]) eq 0)
260         indz = where((lindgen(nz) MOD unvectsur[0]) eq 0)
261      ENDIF ELSE BEGIN
262         indx = where((lindgen(nx) MOD unvectsur[0]) eq 0)
263         indz = where((lindgen(nz) MOD unvectsur[1]) eq 0)
264      ENDELSE
265; a partir de indx et indz on va construire un tableau d''indices 2d
266; qui donnera les indices des points intersections des colonnes
267; specifiee par indx
268      indicereduit = indx#replicate(1,n_elements(indz))+nx*replicate(1,n_elements(indx))#indz
269; on reduit les tableaux qui vont etre passes a vecteur.
270      u = u[indicereduit]
271      w = w[indicereduit]
272;
273   endif
274;-----------------------------------------------------------
275; trace des vecteurs
276;----------------------------------------------------------
277
278   CASE type OF
279      'yz': xgrid = gphit[(firstxt+lastxt)/2, indicex[0]:indicex[nx-1]]
280      'xz': xgrid = glamt[indicex[0]:indicex[nx-1], (firstyt+lastyt)/2]
281   ENDCASE
282
283   x0 = xgrid[*]#replicate(1, nz)
284   y0 = replicate(1, nx)#gdept[indicez[0]:indicez[nz-1]]
285
286
287;   print, !x.range, !y.range
288;   print, '  Min/Max Hvect', min(u(where (u LE valmask/10.))), max(u(where (u LE valmask/10.)))
289;   print, '  Min/Max Zvect', min(w(where (w LE valmask/10.))), max(w(where (w LE valmask/10.)))
290
291   norme = sqrt(max(u(where (u LE valmask/10.)))^2+max(w(where (w LE valmask/10.)))^2)
292
293;   modif du rapport d'aspect
294
295   deltax = (!p.position[2]-!p.position[0])
296   deltaz = (!p.position[3]-!p.position[1])
297   rph = petitfeuille/grandfeuille*(  key_portrait)+1.*(1-key_portrait)
298   rpz = grandfeuille/petitfeuille*(1-key_portrait)+key_portrait
299
300   CASE !d.name OF
301      'PS': scale = grandfeuille*deltax/(ABS(!x.range[1]-!x.range[0]))*.4
302      ELSE: scale = grandfeuille*deltax/(ABS(!x.range[1]-!x.range[0]))*.4
303   ENDCASE
304
305
306;   print, ABS(!x.range[1]-!x.range[0]), ABS(!y.range[1]-!y.range[0])
307;   print, deltax, deltaz
308;   print, scale
309
310   x1 = x0+u*rph*ABS(!x.range[1]-!x.range[0])/deltax*scale
311   y1 = y0-w*rpz*ABS(!y.range[1]-!y.range[0])/deltaz*scale
312
313   arrow, x0, y0, x1, y1, /data, thick = 1.5, hthick = 1.5, hsize = !D.X_SIZE / 400
314;hsize = !D.X_SIZE / 500 or -0.4
315
316
317sortie:
318   if keyword_set(key_performance) NE 0 THEN BEGIN
319    print, 'temps ajoutvectz', systime(1)-tempsun
320   ENDIF
321
322END
Note: See TracBrowser for help on using the repository browser.