source: trunk/SRC/Grid/checkperio.pro @ 287

Last change on this file since 287 was 238, checked in by pinsard, 17 years ago

improvements/corrections of some *.pro headers

  • Property svn:keywords set to Id
File size: 11.8 KB
Line 
1;+
2;
3; @file_comments
4; check ORCA2 and ORCA05 periodicity (east-west and noth fold) for files related to the T GRID ONLY
5;
6; @categories
7; Grid
8;
9; @param file {in}{required}{type=scalar string}
10; A string giving the name of the NetCdf file
11;
12; @keyword WRITE {default=0}{type=scalar: 0 or 1}
13; Define to 1 to write the good periodicity in the file.
14; By default print only message of periodicity errors
15;
16; @restrictions
17; Works only for grid T points
18; if the WRITE keyword is activated, we need the writing access on the file!
19;
20; @examples
21;    IDL> checkperio, '/Users/smasson/OPA/modipsl/bin/runoff_1m_nomask.nc'
22;    checkperio, '/Users/smasson/OPA/modipsl/bin/runoff_1m_nomask.nc'
23;    nav_lon bad y periodicity (1)
24;    nav_lon bad y periodicity (2)
25;    nav_lon bad x periodicity (1)
26;    nav_lon bad x periodicity (2)
27;    nav_lat bad y periodicity (1)
28;    nav_lat bad y periodicity (2)
29;    nav_lat bad x periodicity (1)
30;    nav_lat bad x periodicity (2)
31;    socoefr bad y periodicity (1)
32;    socoefr bad x periodicity (1)
33;    socoefr bad x periodicity (2)
34;    sorunoff bad x periodicity (1)
35;    sorunoff bad x periodicity (2)
36;    IDL> checkperio, '/Users/smasson/OPA/modipsl/bin/runoff_1m_nomask.nc', /WRITE
37;    IDL> checkperio, '/Users/smasson/OPA/modipsl/bin/runoff_1m_nomask.nc'
38;
39; @history
40; October 2006: Sebastien Masson (smasson\@locean-ipsl.upmc.fr)
41;
42; @version
43; $Id$
44;-
45;
46PRO checkperio, file, WRITE = write
47;
48  compile_opt idl2, strictarrsubs
49;
50  IF file_test(file) EQ 0 THEN BEGIN
51    ras = report( 'file '+file+' not found')
52    RETURN
53  ENDIF
54
55  cdfid = ncdf_open(file, WRITE = write)
56  finq = ncdf_inquire(cdfid)
57;
58  dimsz = lonarr(finq.ndims)
59  FOR did = 0, finq.ndims-1 DO BEGIN
60    ncdf_diminq, cdfid, did, name, size
61    dimsz[did] = size
62  ENDFOR
63;
64  FOR vid = 0, finq.nvars-1 DO BEGIN
65    vinq =  ncdf_varinq(cdfid, vid)
66    IF vinq.ndims GE 2 THEN BEGIN
67      vdimsz = dimsz[vinq.dim]
68      jpi = vdimsz[0]
69      jpj = vdimsz[1]
70      CASE vinq.ndims OF
71;------------------------------
72; 2D VAR
73;------------------------------
74        2:BEGIN
75; y periodicity (1)
76          CASE 1 OF
77            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
78              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1], offset = [1, jpj-1]
79              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1], offset = [1, jpj-3]
80              part2 = reverse(shift(part2, -1))
81              IF array_equal(part1, part2) NE 1 THEN BEGIN
82                ras = report( vinq.name+' bad y periodicity (1)')
83                IF keyword_set(write) THEN $
84                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1], offset = [1, jpj-1]
85              ENDIF
86            END
87            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
88              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1], offset = [1, jpj-1]
89              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1], offset = [1, jpj-2]
90              part2 = reverse(part2)
91              IF array_equal(part1, part2) NE 1 THEN BEGIN
92                ras = report( vinq.name+' bad y periodicity (1)')
93                IF keyword_set(write) THEN $
94                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1], offset = [1, jpj-1]
95              ENDIF
96            END
97            ELSE:ras = report( vinq.name+' nothing to check')
98          ENDCASE
99; y periodicity (2)
100          CASE 1 OF
101            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
102              ncdf_varget, cdfid, vid, part1, count = [(jpi-1)/2-2+1, 1], offset = [(jpi-1)/2+2, jpj-2]
103              ncdf_varget, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1], offset = [          2, jpj-2]
104              part2 = reverse(part2)
105              IF array_equal(part1, part2) NE 1 THEN BEGIN
106                ras = report( vinq.name+' bad y periodicity (2)')
107                IF keyword_set(write) THEN $
108                   ncdf_varput, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1], offset = [(jpi-1)/2+2, jpj-2]
109              ENDIF
110            END
111            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
112            END
113            ELSE:ras = report( vinq.name+' nothing to check')
114          ENDCASE
115; x periodicity (1)
116          ncdf_varget, cdfid, vid, part1, count = [1, jpj], offset = [0, 0]
117          ncdf_varget, cdfid, vid, part2, count = [1, jpj], offset = [jpi-2, 0]
118          IF array_equal(part1, part2) NE 1 THEN BEGIN
119            ras = report( vinq.name+' bad x periodicity (1)')
120            IF keyword_set(write) THEN $
121               ncdf_varput, cdfid, vid, part2, count = [1, jpj], offset = [0, 0]
122          ENDIF
123; x periodicity (2)
124          ncdf_varget, cdfid, vid, part1, count = [1, jpj], offset = [jpi-1, 0]
125          ncdf_varget, cdfid, vid, part2, count = [1, jpj], offset = [1, 0]
126          IF array_equal(part1, part2) NE 1 THEN BEGIN
127            ras = report( vinq.name+' bad x periodicity (2)')
128            IF keyword_set(write) THEN $
129               ncdf_varput, cdfid, vid, part2, count = [1, jpj], offset = [jpi-1, 0]
130          ENDIF
131        END
132;------------------------------
133; 3D VAR
134;------------------------------
135        3:BEGIN
136          jpk = vdimsz[2]
137; y periodicity (1)
138          CASE 1 OF
139            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
140              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1, jpk], offset = [1, jpj-1, 0]
141              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1, jpk], offset = [1, jpj-3, 0]
142              IF jpk EQ 1 THEN part2 = reform(part2, jpi-2, 1, jpk, /over)
143              part2 = reverse(shift(part2, -1, 0, 0), 1)
144              IF array_equal(part1, part2) NE 1 THEN BEGIN
145                ras = report( vinq.name+' bad y periodicity (1)')
146                IF keyword_set(write) THEN $
147                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1, jpk], offset = [1, jpj-1, 0]
148              ENDIF
149            END
150            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
151              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1, jpk], offset = [1, jpj-1, 0]
152              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1, jpk], offset = [1, jpj-2, 0]
153              IF jpk EQ 1 THEN part2 = reform(part2, jpi-2, 1, jpk, /over)
154              part2 = reverse(part2, 1)
155              IF array_equal(part1, part2) NE 1 THEN BEGIN
156                ras = report( vinq.name+' bad y periodicity (1)')
157                IF keyword_set(write) THEN $
158                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1, jpk], offset = [1, jpj-1, 0]
159              ENDIF
160            END
161            ELSE:ras = report( vinq.name+' nothing to check')
162          ENDCASE
163; y periodicity (2)
164          CASE 1 OF
165            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
166              ncdf_varget, cdfid, vid, part1, count = [(jpi-1)/2-2+1, 1, jpk], offset = [(jpi-1)/2+2, jpj-2, 0]
167              ncdf_varget, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1, jpk], offset = [          2, jpj-2, 0]
168              part2 = reverse(part2, 1)
169              IF array_equal(part1, part2) NE 1 THEN BEGIN
170                ras = report( vinq.name+' bad y periodicity (2)')
171                IF keyword_set(write) THEN $
172                   ncdf_varput, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1, jpk], offset = [(jpi-1)/2+2, jpj-2, 0]
173              ENDIF
174            END
175            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
176            END
177            ELSE:ras = report( vinq.name+' nothing to check')
178          ENDCASE
179; x periodicity (1)
180          ncdf_varget, cdfid, vid, part1, count = [1, jpj, jpk], offset = [0, 0, 0]
181          ncdf_varget, cdfid, vid, part2, count = [1, jpj, jpk], offset = [jpi-2, 0, 0]
182          IF array_equal(part1, part2) NE 1 THEN BEGIN
183            ras = report( vinq.name+' bad x periodicity (1)')
184            IF keyword_set(write) THEN $
185               ncdf_varput, cdfid, vid, part2, count = [1, jpj, jpk], offset = [0, 0, 0]
186          ENDIF
187; x periodicity (2)
188          ncdf_varget, cdfid, vid, part1, count = [1, jpj, jpk], offset = [jpi-1, 0, 0]
189          ncdf_varget, cdfid, vid, part2, count = [1, jpj, jpk], offset = [1, 0, 0]
190          IF array_equal(part1, part2) NE 1 THEN BEGIN
191            ras = report( vinq.name+' bad x periodicity (2)')
192            IF keyword_set(write) THEN $
193               ncdf_varput, cdfid, vid, part2, count = [1, jpj, jpk], offset = [jpi-1, 0, 0]
194          ENDIF
195        END
196;------------------------------
197; 4D VAR
198;------------------------------
199        4:BEGIN
200          jpk = vdimsz[2]
201          jpt = vdimsz[3]
202; y periodicity (1)
203          CASE 1 OF
204            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
205              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-1, 0, 0]
206              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-3, 0, 0]
207              IF jpt EQ 1 THEN part2 = reform(part2, jpi-2, 1, jpk, jpt, /over)
208              part2 = reverse(shift(part2, -1, 0, 0, 0), 1)
209              IF array_equal(part1, part2) NE 1 THEN BEGIN
210                ras = report( vinq.name+' bad y periodicity (1)')
211                IF keyword_set(write) THEN $
212                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-1, 0, 0]
213              ENDIF
214            END
215            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
216              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-1, 0, 0]
217              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-2, 0, 0]
218              IF jpt EQ 1 THEN part2 = reform(part2, jpi-2, 1, jpk, jpt, /over)
219              part2 = reverse(part2, 1)
220              IF array_equal(part1, part2) NE 1 THEN BEGIN
221                ras = report( vinq.name+' bad y periodicity (1)')
222                IF keyword_set(write) THEN $
223                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-1, 0, 0]
224              ENDIF
225            END
226            ELSE:ras = report( vinq.name+' nothing to check')
227          ENDCASE
228; y periodicity (2)
229          CASE 1 OF
230            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
231              ncdf_varget, cdfid, vid, part1, count = [(jpi-1)/2-2+1, 1, jpk, jpt], offset = [(jpi-1)/2+2, jpj-2, 0, 0]
232              ncdf_varget, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1, jpk, jpt], offset = [          2, jpj-2, 0, 0]
233              part2 = reverse(part2, 1)
234              IF array_equal(part1, part2) NE 1 THEN BEGIN
235                ras = report( vinq.name+' bad y periodicity (2)')
236                IF keyword_set(write) THEN $
237                   ncdf_varput, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1, jpk, jpt], offset = [(jpi-1)/2+2, jpj-2, 0, 0]
238              ENDIF
239            END
240            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
241            END
242            ELSE:ras = report( vinq.name+' nothing to check')
243          ENDCASE
244; x periodicity (1)
245          ncdf_varget, cdfid, vid, part1, count = [1, jpj, jpk, jpt], offset = [0, 0, 0, 0]
246          ncdf_varget, cdfid, vid, part2, count = [1, jpj, jpk, jpt], offset = [jpi-2, 0, 0, 0]
247          IF array_equal(part1, part2) NE 1 THEN BEGIN
248            ras = report( vinq.name+' bad x periodicity (1)')
249            IF keyword_set(write) THEN $
250               ncdf_varput, cdfid, vid, part2, count = [1, jpj, jpk, jpt], offset = [0, 0, 0, 0]
251          ENDIF
252; x periodicity (2)
253          ncdf_varget, cdfid, vid, part1, count = [1, jpj, jpk, jpt], offset = [jpi-1, 0, 0, 0]
254          ncdf_varget, cdfid, vid, part2, count = [1, jpj, jpk, jpt], offset = [1, 0, 0, 0]
255          IF array_equal(part1, part2) NE 1 THEN BEGIN
256            ras = report( vinq.name+' bad x periodicity (2)')
257            IF keyword_set(write) THEN $
258               ncdf_varput, cdfid, vid, part2, count = [1, jpj, jpk, jpt], offset = [jpi-1, 0, 0, 0]
259          ENDIF
260        END
261        ELSE:ras = report( vinq.name+' nothing to check')
262      ENDCASE
263    ENDIF
264  ENDFOR
265
266  ncdf_close, cdfid
267
268  RETURN
269END
Note: See TracBrowser for help on using the repository browser.