source: trunk/SRC/ToBeReviewed/LECTURE/read_ncdf_varget.pro @ 134

Last change on this file since 134 was 134, checked in by navarro, 18 years ago

change *.pro file properties (del eof-style, del executable, set keywords Id

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 23.6 KB
Line 
1; le format netcdf et IDL nous permet d''aller lire uniquement la partie de
2; tableau qui nous interesse.
3;
4;  attention, qd il y a un shift il faut faire attention a ce que
5;  l''on fait et en particulier arriver a positionner la boite
6;  specifiee par firstx:lastx par rapport au tableau contenu dans
7;  le fichier NetCdf.
8;  pour s''y reperer voici un petit dessin
9;
10;  dans le repere 0:jpi, avec le zoom definit par firstx:lastx
11;
12;        0      j      key-1  key          i              jpi-1
13;        |......|........|     |-----------|----------------|
14;
15;  si on veut savoir comment c''etait avant le shift:
16;
17;        0       i-key     jpi-key-1 jpi-key  jpi-key+j   jpi-1
18;        |--------|--------------|      |........|..........|
19;
20; avant que l''on ajuste au zoom definit par ixminmesh,ixmaxmesh c''etait:
21;
22;   0   ixmin    i-key     jpi-key-1  jpi-key  jpi-key+j   jpi-1     jpidta
23;              +ixmin        +ixmin  +ixmin     +ixmin     +ixmin
24;   |,,,,|--------|--------------|      |........|..........|,,,,,,,,,,,|
25;
26;  apres il suffit de remplacer i et j par firstx ou lastx qd on
27;  ne fait pas de stride.
28;
29;  When using stride, things are getting more complicated....
30;
31;  1) when must replace firstx by firstx*key_stride[0] and
32;  lastx by lastx*key_stride[0]
33;  2) we must use jpitotal instead of jpi
34;  3) finding the position of the offset in the right side part is
35;  tricky. look at this illustration of stride = 4 ...
36;        0      j      key-1 key          i              jpi-1
37;        +...+..|+...+...+  |--+---+---+|--+---+---+---+-|
38;
39;        0       i-key        jpi-key-1 jpi-key jpi-key+j jpi-1
40;        |--+---+---+|--+---+---+---+-|  +...+..|+...+...+
41;  in the ........ part, it is easy the first point is number 0 but in
42;  the --------- part the first point is number 3... Ihe position of
43;  the first point in the is given by:
44;         (key_stride[0]-1)-((key-1) MOD key_stride[0])
45;  4) last point...by default, the number of element read by IDL when
46;  using stride is given by n_elements/stride. However, we must read:
47;     (n_elements+stride-1)/stride or (n_elements-1)/key_stride+1
48;  for example: for n_elements between 10 and 12, with a stride of 3,
49;  we must read 4 points instead of 3...:  +--+--+--+--
50;  This problem as an easy solution by using the keyword count with
51;  the appropiate value!
52;
53   ixmin = ixminmesh-ixmindta
54   iymin = iyminmesh-iymindta
55   izmin = izminmesh-izmindta
56   jpitotal = long(ixmaxmesh-ixminmesh+1)
57   key = long(key_shift MOD jpitotal)
58   if key LT 0 then key = key+jpitotal
59;
60case 1 OF
61;......................................................................
62;......................................................................
63   varcontient.ndims eq 2:BEGIN ;xy array
64;......................................................................
65;......................................................................
66      case 1 OF
67;,,,,,,,,,,,,,,,,,,,,,,,,
68         keyword_set(key_shift) EQ 0 AND total(key_stride) EQ 3:BEGIN
69; on ne shift pas et il n''y a pas de stride
70;,,,,,,,,,,,,,,,,,,,,,,,,
71            ncdf_varget,cdfid,name,res,offset=[firstx+ixmin,firsty+iymin] $
72             ,count=[nx,ny], _extra = ex
73         END
74;,,,,,,,,,,,,,,,,,,,,,,,,
75         keyword_set(key_shift) EQ 0 AND total(key_stride) NE 3:BEGIN
76; on ne shift pas mais il y a un stride
77;,,,,,,,,,,,,,,,,,,,,,,,,
78            ncdf_varget,cdfid,name,res,offset=[firstx*key_stride[0]+ixmin $
79                                               ,firsty*key_stride[1]+iymin] $
80             ,count=[nx,ny], stride = key_stride[0:1], _extra = ex
81         END
82;,,,,,,,,,,,,,,,,,,,,,,,,
83         keyword_set(key_shift) NE 0 AND total(key_stride) EQ 3:BEGIN
84; on shift mais il n''y a pas de stride
85;,,,,,,,,,,,,,,,,,,,,,,,,
86            case 1 of
87; --------- part, we can directly extract the array in one piece
88               firstx GE key:BEGIN
89                  ncdf_varget,cdfid,name,res,offset=[ixmin-key+firstx $
90                                                     ,firsty+iymin] $
91                   ,count=[nx,ny], _extra = ex
92               END
93; ......... part, we can directly extract the array in one piece
94               lastx LE key-1:BEGIN
95                  ncdf_varget,cdfid,name,res,offset=[jpi-key+ixmin+firstx $
96                                                     ,firsty+iymin] $
97                   ,count=[nx,ny], _extra = ex
98               END
99               ELSE:BEGIN  ; we have to extract the array in 2 pieces... 
100; ......... part, first part...
101                  ncdf_varget,cdfid,name,tab1,offset=[jpi-key+ixmin+firstx $
102                                                      ,firsty+iymin] $
103                   ,count=[key-1-firstx+1,ny], _extra = ex
104; --------- part, second part...
105                  ncdf_varget,cdfid,name,tab2,offset=[ixmin,firsty+iymin] $
106                   ,count=[lastx-key+1,ny], _extra = ex
107                  res = [temporary(tab1), temporary(tab2)]
108               END
109            ENDCASE
110         END
111;,,,,,,,,,,,,,,,,,,,,,,,,
112         keyword_set(key_shift) NE 0 AND total(key_stride) NE 3:BEGIN
113; on shift et il y a un stride
114;,,,,,,,,,,,,,,,,,,,,,,,,
115            case 1 OF           ; case sur la facon de fire le champ
116; --------- part, we can directly extract the array in one piece
117               firstx*key_stride[0] GE key:BEGIN
118                  ncdf_varget,cdfid,name,res,offset=[ixmin $
119                                                     +(key_stride[0]-1)-((key-1) MOD key_stride[0]) $
120                                                     +(firstx-((key-1)/key_stride[0]+1))*key_stride[0] $
121                                                     ,firsty*key_stride[1]+iymin] $
122                   ,count=[nx,ny], stride = key_stride[0:1], _extra = ex
123                END
124; ......... part, we can directly extract the array in one piece
125               lastx*key_stride[0] LE key-1:BEGIN
126                  ncdf_varget,cdfid,name,res,offset=[jpitotal-key+ixmin+firstx*key_stride[0] $
127                                                     ,firsty*key_stride[1]+iymin] $
128                   ,count=[nx,ny], stride = key_stride[0:1], _extra = ex
129               END
130               ELSE:BEGIN ; we have to extract the array in 2 pieces...
131; ......... part, first part...
132                  ncdf_varget,cdfid,name,tab1,offset=[jpitotal-key+ixmin+firstx*key_stride[0] $
133                                                      ,firsty*key_stride[1]+iymin] $
134                   ,count=[(key-firstx*key_stride[0]-1)/key_stride[0]+1,ny] $
135                    , stride = key_stride[0:1], _extra = ex
136; --------- part, second part...
137                  ncdf_varget,cdfid,name,tab2,offset=[ixmin $
138                                                      +(key_stride[0]-1)-((key-1) MOD key_stride[0]) $
139                                                      , firsty*key_stride[1]+iymin] $
140                   ,count=[nx-(key-firstx*key_stride[0]-1)/key_stride[0]-1,ny] $
141                    , stride = key_stride[0:1], _extra = ex
142; in one unique array...
143                  res = [temporary(tab1), temporary(tab2)]
144               END
145            ENDCASE             ; case sur la facon de fire le champ
146         END
147      ENDCASE                   ; differentes possibilites de key_shift et key_performance
148   END
149;......................................................................
150;......................................................................
151   varcontient.ndims eq 3 AND (where(varcontient.dim EQ contient.recdim))[0] EQ -1:BEGIN ;xyz array
152;......................................................................
153;......................................................................
154      case 1 of
155;,,,,,,,,,,,,,,,,,,,,,,,,
156         keyword_set(key_shift) EQ 0 AND total(key_stride) EQ 3:BEGIN
157; on ne shift pas et il n''y a pas de stride
158;,,,,,,,,,,,,,,,,,,,,,,,,
159            ncdf_varget,cdfid,name,res,offset=[firstx+ixmin,firsty+iymin,firstz+izmin] $
160             ,count=[nx,ny,nz], _extra = ex
161         END
162;,,,,,,,,,,,,,,,,,,,,,,,,
163         keyword_set(key_shift) EQ 0 AND total(key_stride) NE 3:BEGIN
164; on ne shift pas mais il y a un stride
165;,,,,,,,,,,,,,,,,,,,,,,,,
166            ncdf_varget,cdfid,name,res,offset=[firstx*key_stride[0]+ixmin $
167                                               ,firsty*key_stride[1]+iymin $
168                                               ,firstz*key_stride[2]+izmin] $
169             ,count=[nx,ny,nz], stride = key_stride, _extra = ex
170         END
171;,,,,,,,,,,,,,,,,,,,,,,,,
172         keyword_set(key_shift) NE 0 AND total(key_stride) EQ 3:BEGIN
173; on shift mais il n''y a pas de stride
174;,,,,,,,,,,,,,,,,,,,,,,,,
175            case 1 of
176               firstx GE key:BEGIN ; on peut tout couper d''un coup
177                  ncdf_varget,cdfid,name,res,offset=[ixmin-key+firstx $
178                                                     ,firsty+iymin $
179                                                     ,firstz+izmin] $
180                   ,count=[nx,ny,nz], _extra = ex
181               END
182               lastx LE key-1:BEGIN ; on peut tout couper d''un coup
183                  ncdf_varget,cdfid,name,res,offset=[jpi-key+ixmin+firstx $
184                                                     ,firsty+iymin $
185                                                     ,firstz+izmin] $
186                   ,count=[nx,ny,nz], _extra = ex
187               END
188               ELSE:BEGIN       ; Le tableau est separe en 2 morceaux...
189                  ncdf_varget,cdfid,name,tab1,offset=[jpi-key+ixmin+firstx $
190                                                      ,firsty+iymin $
191                                                      ,firstz+izmin] $
192                   ,count=[key-1-firstx+1,ny,nz], _extra = ex
193                  ncdf_varget,cdfid,name,tab2,offset=[ixmin $
194                                                      ,firsty+iymin $
195                                                      ,firstz+izmin] $
196                   ,count=[lastx-key+1,ny,nz], _extra = ex
197                  res = [temporary(tab1), temporary(tab2)]
198               END
199            ENDCASE
200         END
201;,,,,,,,,,,,,,,,,,,,,,,,,
202         keyword_set(key_shift) NE 0 AND total(key_stride) NE 3:BEGIN
203; on shift et il y a un stride
204;,,,,,,,,,,,,,,,,,,,,,,,,
205            case 1 OF           ; case sur la facon de fire le champ
206               firstx*key_stride[0] GE key:BEGIN ; on peut tout couper d''un coup
207                  ncdf_varget,cdfid,name,res,offset=[ixmin $
208                                                     +(key_stride[0]-1)-((key-1) MOD key_stride[0]) $
209                                                     +(firstx-((key-1)/key_stride[0]+1))*key_stride[0] $
210                                                     ,firsty*key_stride[1]+iymin $
211                                                     ,firstz*key_stride[2]+izmin] $
212                   ,count=[nx,ny,nz], stride = key_stride, _extra = ex
213               END
214               lastx*key_stride[0] LE key-1:BEGIN ; on peut tout couper d''un coup
215                  ncdf_varget,cdfid,name,res,offset=[jpitotal-key+ixmin+firstx*key_stride[0] $
216                                                     ,firsty*key_stride[1]+iymin $
217                                                     ,firstz*key_stride[2]+izmin] $
218                   ,count=[nx,ny,nz], stride = key_stride, _extra = ex
219               END
220               ELSE:BEGIN       ; le tableau est separe en 2 morceaux...
221                  ncdf_varget,cdfid,name,tab1,offset=[jpitotal-key+ixmin+firstx*key_stride[0] $
222                                                      ,firsty*key_stride[1]+iymin $
223                                                      ,firstz*key_stride[2]+izmin] $
224                   ,count=[(key-firstx*key_stride[0]-1)/key_stride[0]+1,ny,nz] $
225                    , stride = key_stride, _extra = ex
226; 2eme bout...
227                  ncdf_varget,cdfid,name,tab2,offset=[ixmin $
228                                                      +(key_stride[0]-1)-((key-1) MOD key_stride[0]) $
229                                                      ,firsty*key_stride[1]+iymin $
230                                                      ,firstz*key_stride[2]+izmin] $
231                   ,count=[nx-(key-firstx*key_stride[0]-1)/key_stride[0]-1,ny,nz] $
232                    , stride = key_stride, _extra = ex
233; on recolle le tout
234                  res = [temporary(tab1), temporary(tab2)]
235               END
236            ENDCASE             ; case sur la facon de fire le champ
237         END
238      ENDCASE                   ; differentes possibilites de key_shift et key_performance
239   END
240;......................................................................
241;......................................................................
242   varcontient.ndims eq 3 AND (where(varcontient.dim EQ contient.recdim))[0] NE -1:BEGIN ;xyt array
243;......................................................................
244;......................................................................
245      case 1 of
246;,,,,,,,,,,,,,,,,,,,,,,,,
247         keyword_set(key_shift) EQ 0 AND total(key_stride) EQ 3:BEGIN
248; on ne shift pas et il n''y a pas de stride
249;,,,,,,,,,,,,,,,,,,,,,,,,
250            ncdf_varget,cdfid,name,res,offset=[firstx+ixmin $
251                                               ,firsty+iymin $
252                                               ,firsttps] $
253             ,count=[nx,ny,jpt], _extra = ex
254         END
255;,,,,,,,,,,,,,,,,,,,,,,,,
256         keyword_set(key_shift) EQ 0 AND total(key_stride) NE 3:BEGIN
257; on ne shift pas mais il y a un stride
258;,,,,,,,,,,,,,,,,,,,,,,,,
259            ncdf_varget,cdfid,name,res,offset=[firstx*key_stride[0]+ixmin $
260                                               ,firsty*key_stride[1]+iymin $
261                                               ,firsttps] $
262             ,count=[nx,ny,jpt], stride = [key_stride[0:1], 1], _extra = ex
263         END
264;,,,,,,,,,,,,,,,,,,,,,,,,
265         keyword_set(key_shift) NE 0 AND total(key_stride) EQ 3:BEGIN
266; on shift mais il n''y a pas de stride
267;,,,,,,,,,,,,,,,,,,,,,,,,
268            case 1 of
269; --------- part, we can directly extract the array in one piece
270               firstx GE key:BEGIN ; on peut tout couper d''un coup
271                  ncdf_varget,cdfid,name,res,offset=[ixmin-key+firstx $
272                                                     ,firsty+iymin $
273                                                     ,firsttps] $
274                   ,count=[nx,ny,jpt], _extra = ex
275               END
276; ......... part, we can directly extract the array in one piece
277               lastx LE key-1:BEGIN ; on peut tout couper d''un coup
278                  ncdf_varget,cdfid,name,res,offset=[jpi-key+ixmin+firstx $
279                                                     ,firsty+iymin $
280                                                     ,firsttps] $
281                   ,count=[nx,ny,jpt], _extra = ex
282               END
283               ELSE:BEGIN       ; Le tableau est separe en 2 morceaux...
284; ......... part, first part...
285                  ncdf_varget,cdfid,name,tab1,offset=[jpi-key+ixmin+firstx $
286                                                      ,firsty+iymin $
287                                                      ,firsttps] $
288                   ,count=[key-1-firstx+1,ny,jpt], _extra = ex
289; --------- part, second part...
290                  ncdf_varget,cdfid,name,tab2,offset=[ixmin $
291                                                      ,firsty+iymin $
292                                                      ,firsttps] $
293                   ,count=[lastx-key+1,ny,jpt], _extra = ex
294                  res = [temporary(tab1), temporary(tab2)]
295               END
296            ENDCASE
297         END
298;,,,,,,,,,,,,,,,,,,,,,,,,
299         keyword_set(key_shift) NE 0 AND total(key_stride) NE 3:BEGIN
300; on shift et il y a un stride
301;,,,,,,,,,,,,,,,,,,,,,,,,
302; --------- part, we can directly extract the array in one piece
303            case 1 OF           ; case sur la facon de fire le champ
304               firstx*key_stride[0] GE key:BEGIN
305                  ncdf_varget,cdfid,name,res,offset=[ixmin $
306                                                     +(key_stride[0]-1)-((key-1) MOD key_stride[0]) $
307                                                     +( firstx-((key-1)/key_stride[0]+1) )*key_stride[0] $
308                                                     ,firsty*key_stride[1]+iymin $
309                                                     ,firsttps] $
310                   ,count=[nx,ny,jpt], stride = [key_stride[0:1], 1], _extra = ex
311               END
312; ......... part, we can directly extract the array in one piece
313               lastx*key_stride[0] LE key-1:BEGIN
314                  ncdf_varget,cdfid,name,res,offset=[jpitotal-key+ixmin+firstx*key_stride[0] $
315                                                     ,firsty*key_stride[1]+iymin $
316                                                     ,firsttps] $
317                   ,count=[nx,ny,jpt], stride = [key_stride[0:1], 1], _extra = ex
318               END
319               ELSE:BEGIN     
320; ......... part, first part...
321                  ncdf_varget,cdfid,name,tab1,offset=[jpitotal-key+ixmin+firstx*key_stride[0] $
322                                                      ,firsty*key_stride[1]+iymin $
323                                                      ,firsttps] $
324                   ,count=[(key-firstx*key_stride[0]-1)/key_stride[0]+1,ny,jpt] $
325                    , stride = [key_stride[0:1], 1], _extra = ex
326; --------- part, second part...
327                  ncdf_varget,cdfid,name,tab2,offset=[ixmin $
328                                                      +(key_stride[0]-1)-((key-1) MOD key_stride[0]) $
329                                                      , firsty*key_stride[1]+iymin $
330                                                      ,firsttps] $
331                   ,count=[nx-(key-firstx*key_stride[0]-1)/key_stride[0]-1,ny,jpt] $
332                    , stride = [key_stride[0:1], 1], _extra = ex
333; on recolle le tout
334                  res = [temporary(tab1), temporary(tab2)]
335               END
336            ENDCASE             ; case sur la facon de fire le champ
337         END
338      endcase
339   END
340;......................................................................
341;......................................................................
342   varcontient.ndims eq 4:BEGIN ;xyzt array
343;......................................................................
344;......................................................................
345      case 1 of
346;,,,,,,,,,,,,,,,,,,,,,,,,
347         keyword_set(key_shift) EQ 0 AND total(key_stride) EQ 3:BEGIN
348; on ne shift pas et il n''y a pas de stride
349;,,,,,,,,,,,,,,,,,,,,,,,,
350            ncdf_varget,cdfid,name,res,offset=[firstx+ixmin $
351                                               ,firsty+iymin $
352                                                      ,firstz+izmin $
353                                               ,firsttps] $
354             ,count=[nx,ny,nz,jpt], _extra = ex
355         END
356;,,,,,,,,,,,,,,,,,,,,,,,,
357         keyword_set(key_shift) EQ 0 AND total(key_stride) NE 3:BEGIN
358; on ne shift pas mais il y a un stride
359;,,,,,,,,,,,,,,,,,,,,,,,,
360            ncdf_varget,cdfid,name,res,offset=[firstx*key_stride[0]+ixmin $
361                                               ,firsty*key_stride[1]+iymin $
362                                               ,firstz*key_stride[2]+izmin $
363                                               ,firsttps] $
364             ,count=[nx,ny,nz,jpt], stride = [key_stride, 1], _extra = ex
365         END
366;,,,,,,,,,,,,,,,,,,,,,,,,
367         keyword_set(key_shift) NE 0 AND total(key_stride) EQ 3:BEGIN
368; on shift mais il n''y a pas de stride
369;,,,,,,,,,,,,,,,,,,,,,,,,
370            case 1 of
371               firstx GE key:BEGIN ; on peut tout couper d''un coup
372                  ncdf_varget,cdfid,name,res,offset=[ixmin-key+firstx $
373                                                     ,firsty+iymin $
374                                                     ,firstz+izmin $
375                                                     ,firsttps] $
376                   ,count=[nx,ny,nz,jpt], _extra = ex
377               END
378               lastx LE key-1:BEGIN ; on peut tout couper d''un coup
379                  ncdf_varget,cdfid,name,res,offset=[jpi-key+ixmin+firstx $
380                                                     ,firsty+iymin $
381                                                     ,firstz+izmin $
382                                                     ,firsttps] $
383                   ,count=[nx,ny,nz,jpt], _extra = ex
384               END
385               ELSE:BEGIN       ; Le tableau est separe en 2 morceaux...
386                  ncdf_varget,cdfid,name,tab1,offset=[jpi-key+ixmin+firstx $
387                                                      ,firsty+iymin $
388                                                      ,firstz+izmin $
389                                                      ,firsttps] $
390                   ,count=[key-1-firstx+1,ny,nz,jpt], _extra = ex
391                  ncdf_varget,cdfid,name,tab2,offset=[ixmin $
392                                                      ,firsty+iymin $
393                                                      ,firstz+izmin $
394                                                      ,firsttps] $
395                   ,count=[lastx-key+1,ny,nz,jpt], _extra = ex
396                  res = [temporary(tab1), temporary(tab2)]
397               END
398            ENDCASE
399         END
400;,,,,,,,,,,,,,,,,,,,,,,,,
401         keyword_set(key_shift) NE 0 AND total(key_stride) NE 3:BEGIN
402; on shift et il y a un stride
403;,,,,,,,,,,,,,,,,,,,,,,,,
404            case 1 OF           ; case sur la facon de fire le champ
405               firstx*key_stride[0] GE key:BEGIN ; on peut tout coupe d''un coup
406                  ncdf_varget,cdfid,name,res,offset=[ixmin $
407                                                     +(key_stride[0]-1)-((key-1) MOD key_stride[0]) $
408                                                     +(firstx-((key-1)/key_stride[0]+1))*key_stride[0] $
409                                                     ,firsty*key_stride[1]+iymin $
410                                                     ,firstz*key_stride[2]+izmin $
411                                                     ,firsttps] $
412                   ,count=[nx,ny,nz,jpt], stride = [key_stride, 1], _extra = ex
413               END
414               lastx*key_stride[0] LE key-1:BEGIN ; on peut tout coupe d''un coup
415                  ncdf_varget,cdfid,name,res,offset=[jpitotal-key+ixmin+firstx*key_stride[0] $
416                                                     ,firsty*key_stride[1]+iymin $
417                                                     ,firstz*key_stride[2]+izmin $
418                                                     ,firsttps] $
419                   ,count=[nx,ny,nz,jpt], stride = [key_stride, 1], _extra = ex
420               END
421               ELSE:BEGIN       ; le tableau est separe en 2 morceaux...
422                  ncdf_varget,cdfid,name,tab1,offset=[jpitotal-key+ixmin+firstx*key_stride[0] $
423                                                      ,firsty*key_stride[1]+iymin $
424                                                     ,firstz*key_stride[2]+izmin $
425                                                      ,firsttps] $
426                   ,count=[(key-firstx*key_stride[0]-1)/key_stride[0]+1,ny,nz,jpt] $
427                   , stride = [key_stride, 1], _extra = ex
428; 2eme bout...
429                  ncdf_varget,cdfid,name,tab2,offset=[ixmin $
430                                                      +(key_stride[0]-1)-((key-1) MOD key_stride[0]) $
431                                                      , firsty*key_stride[1]+iymin $
432                                                      , firstz*key_stride[2]+izmin $
433                                                      , firsttps] $
434                   ,count=[nx-(key-firstx*key_stride[0]-1)/key_stride[0]-1,ny,nz,jpt] $
435                   , stride = [key_stride, 1], _extra = ex
436; on recolle le tout
437                  res = [temporary(tab1), temporary(tab2)]
438               END
439            ENDCASE             ; case sur la facon de fire le champ
440         END
441      endcase
442   END
443endcase
Note: See TracBrowser for help on using the repository browser.