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

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

improvements/corrections of some *.pro headers

  • Property svn:keywords set to Id
File size: 11.6 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  IF file_test(file) EQ 0 THEN BEGIN
49    print, 'file '+file+' not found'
50    RETURN
51  ENDIF
52
53  cdfid = ncdf_open(file, WRITE = write)
54  finq = ncdf_inquire(cdfid)
55;
56  dimsz = lonarr(finq.ndims)
57  FOR did = 0, finq.ndims-1 DO BEGIN
58    ncdf_diminq, cdfid, did, name, size
59    dimsz[did] = size
60  ENDFOR
61;
62  FOR vid = 0, finq.nvars-1 DO BEGIN
63    vinq =  ncdf_varinq(cdfid, vid)
64    IF vinq.ndims GE 2 THEN BEGIN
65      vdimsz = dimsz[vinq.dim]
66      jpi = vdimsz[0]
67      jpj = vdimsz[1]
68      CASE vinq.ndims OF
69;------------------------------
70; 2D VAR
71;------------------------------
72        2:BEGIN
73; y periodicity (1)
74          CASE 1 OF
75            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
76              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1], offset = [1, jpj-1]
77              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1], offset = [1, jpj-3]
78              part2 = reverse(shift(part2, -1))
79              IF array_equal(part1, part2) NE 1 THEN BEGIN
80                print, vinq.name+' bad y periodicity (1)'
81                IF keyword_set(write) THEN $
82                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1], offset = [1, jpj-1]
83              ENDIF
84            END
85            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
86              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1], offset = [1, jpj-1]
87              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1], offset = [1, jpj-2]
88              part2 = reverse(part2)
89              IF array_equal(part1, part2) NE 1 THEN BEGIN
90                print, vinq.name+' bad y periodicity (1)'
91                IF keyword_set(write) THEN $
92                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1], offset = [1, jpj-1]
93              ENDIF
94            END
95            ELSE:print, vinq.name+' nothing to check'
96          ENDCASE
97; y periodicity (2)
98          CASE 1 OF
99            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
100              ncdf_varget, cdfid, vid, part1, count = [(jpi-1)/2-2+1, 1], offset = [(jpi-1)/2+2, jpj-2]
101              ncdf_varget, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1], offset = [          2, jpj-2]
102              part2 = reverse(part2)
103              IF array_equal(part1, part2) NE 1 THEN BEGIN
104                print, vinq.name+' bad y periodicity (2)'
105                IF keyword_set(write) THEN $
106                   ncdf_varput, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1], offset = [(jpi-1)/2+2, jpj-2]
107              ENDIF
108            END
109            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
110            END
111            ELSE:print, vinq.name+' nothing to check'
112          ENDCASE
113; x periodicity (1)
114          ncdf_varget, cdfid, vid, part1, count = [1, jpj], offset = [0, 0]
115          ncdf_varget, cdfid, vid, part2, count = [1, jpj], offset = [jpi-2, 0]
116          IF array_equal(part1, part2) NE 1 THEN BEGIN
117            print, vinq.name+' bad x periodicity (1)'
118            IF keyword_set(write) THEN $
119               ncdf_varput, cdfid, vid, part2, count = [1, jpj], offset = [0, 0]
120          ENDIF
121; x periodicity (2)
122          ncdf_varget, cdfid, vid, part1, count = [1, jpj], offset = [jpi-1, 0]
123          ncdf_varget, cdfid, vid, part2, count = [1, jpj], offset = [1, 0]
124          IF array_equal(part1, part2) NE 1 THEN BEGIN
125            print, vinq.name+' bad x periodicity (2)'
126            IF keyword_set(write) THEN $
127               ncdf_varput, cdfid, vid, part2, count = [1, jpj], offset = [jpi-1, 0]
128          ENDIF
129        END
130;------------------------------
131; 3D VAR
132;------------------------------
133        3:BEGIN
134          jpk = vdimsz[2]
135; y periodicity (1)
136          CASE 1 OF
137            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
138              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1, jpk], offset = [1, jpj-1, 0]
139              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1, jpk], offset = [1, jpj-3, 0]
140              IF jpk EQ 1 THEN part2 = reform(part2, jpi-2, 1, jpk, /over)
141              part2 = reverse(shift(part2, -1, 0, 0), 1)
142              IF array_equal(part1, part2) NE 1 THEN BEGIN
143                print, vinq.name+' bad y periodicity (1)'
144                IF keyword_set(write) THEN $
145                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1, jpk], offset = [1, jpj-1, 0]
146              ENDIF
147            END
148            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
149              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1, jpk], offset = [1, jpj-1, 0]
150              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1, jpk], offset = [1, jpj-2, 0]
151              IF jpk EQ 1 THEN part2 = reform(part2, jpi-2, 1, jpk, /over)
152              part2 = reverse(part2, 1)
153              IF array_equal(part1, part2) NE 1 THEN BEGIN
154                print, vinq.name+' bad y periodicity (1)'
155                IF keyword_set(write) THEN $
156                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1, jpk], offset = [1, jpj-1, 0]
157              ENDIF
158            END
159            ELSE:print, vinq.name+' nothing to check'
160          ENDCASE
161; y periodicity (2)
162          CASE 1 OF
163            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
164              ncdf_varget, cdfid, vid, part1, count = [(jpi-1)/2-2+1, 1, jpk], offset = [(jpi-1)/2+2, jpj-2, 0]
165              ncdf_varget, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1, jpk], offset = [          2, jpj-2, 0]
166              part2 = reverse(part2, 1)
167              IF array_equal(part1, part2) NE 1 THEN BEGIN
168                print, vinq.name+' bad y periodicity (2)'
169                IF keyword_set(write) THEN $
170                   ncdf_varput, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1, jpk], offset = [(jpi-1)/2+2, jpj-2, 0]
171              ENDIF
172            END
173            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
174            END
175            ELSE:print, vinq.name+' nothing to check'
176          ENDCASE
177; x periodicity (1)
178          ncdf_varget, cdfid, vid, part1, count = [1, jpj, jpk], offset = [0, 0, 0]
179          ncdf_varget, cdfid, vid, part2, count = [1, jpj, jpk], offset = [jpi-2, 0, 0]
180          IF array_equal(part1, part2) NE 1 THEN BEGIN
181            print, vinq.name+' bad x periodicity (1)'
182            IF keyword_set(write) THEN $
183               ncdf_varput, cdfid, vid, part2, count = [1, jpj, jpk], offset = [0, 0, 0]
184          ENDIF
185; x periodicity (2)
186          ncdf_varget, cdfid, vid, part1, count = [1, jpj, jpk], offset = [jpi-1, 0, 0]
187          ncdf_varget, cdfid, vid, part2, count = [1, jpj, jpk], offset = [1, 0, 0]
188          IF array_equal(part1, part2) NE 1 THEN BEGIN
189            print, vinq.name+' bad x periodicity (2)'
190            IF keyword_set(write) THEN $
191               ncdf_varput, cdfid, vid, part2, count = [1, jpj, jpk], offset = [jpi-1, 0, 0]
192          ENDIF
193        END
194;------------------------------
195; 4D VAR
196;------------------------------
197        4:BEGIN
198          jpk = vdimsz[2]
199          jpt = vdimsz[3]
200; y periodicity (1)
201          CASE 1 OF
202            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
203              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-1, 0, 0]
204              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-3, 0, 0]
205              IF jpt EQ 1 THEN part2 = reform(part2, jpi-2, 1, jpk, jpt, /over)
206              part2 = reverse(shift(part2, -1, 0, 0, 0), 1)
207              IF array_equal(part1, part2) NE 1 THEN BEGIN
208                print, vinq.name+' bad y periodicity (1)'
209                IF keyword_set(write) THEN $
210                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-1, 0, 0]
211              ENDIF
212            END
213            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
214              ncdf_varget, cdfid, vid, part1, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-1, 0, 0]
215              ncdf_varget, cdfid, vid, part2, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-2, 0, 0]
216              IF jpt EQ 1 THEN part2 = reform(part2, jpi-2, 1, jpk, jpt, /over)
217              part2 = reverse(part2, 1)
218              IF array_equal(part1, part2) NE 1 THEN BEGIN
219                print, vinq.name+' bad y periodicity (1)'
220                IF keyword_set(write) THEN $
221                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1, jpk, jpt], offset = [1, jpj-1, 0, 0]
222              ENDIF
223            END
224            ELSE:print, vinq.name+' nothing to check'
225          ENDCASE
226; y periodicity (2)
227          CASE 1 OF
228            array_equal([182, 149], vdimsz[0:1]):BEGIN ; ORCA2
229              ncdf_varget, cdfid, vid, part1, count = [(jpi-1)/2-2+1, 1, jpk, jpt], offset = [(jpi-1)/2+2, jpj-2, 0, 0]
230              ncdf_varget, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1, jpk, jpt], offset = [          2, jpj-2, 0, 0]
231              part2 = reverse(part2, 1)
232              IF array_equal(part1, part2) NE 1 THEN BEGIN
233                print, vinq.name+' bad y periodicity (2)'
234                IF keyword_set(write) THEN $
235                   ncdf_varput, cdfid, vid, part2, count = [(jpi-1)/2-2+1, 1, jpk, jpt], offset = [(jpi-1)/2+2, jpj-2, 0, 0]
236              ENDIF
237            END
238            array_equal([722, 511], vdimsz[0:1]):BEGIN ; ORCA05
239            END
240            ELSE:print, vinq.name+' nothing to check'
241          ENDCASE
242; x periodicity (1)
243          ncdf_varget, cdfid, vid, part1, count = [1, jpj, jpk, jpt], offset = [0, 0, 0, 0]
244          ncdf_varget, cdfid, vid, part2, count = [1, jpj, jpk, jpt], offset = [jpi-2, 0, 0, 0]
245          IF array_equal(part1, part2) NE 1 THEN BEGIN
246            print, vinq.name+' bad x periodicity (1)'
247            IF keyword_set(write) THEN $
248               ncdf_varput, cdfid, vid, part2, count = [1, jpj, jpk, jpt], offset = [0, 0, 0, 0]
249          ENDIF
250; x periodicity (2)
251          ncdf_varget, cdfid, vid, part1, count = [1, jpj, jpk, jpt], offset = [jpi-1, 0, 0, 0]
252          ncdf_varget, cdfid, vid, part2, count = [1, jpj, jpk, jpt], offset = [1, 0, 0, 0]
253          IF array_equal(part1, part2) NE 1 THEN BEGIN
254            print, vinq.name+' bad x periodicity (2)'
255            IF keyword_set(write) THEN $
256               ncdf_varput, cdfid, vid, part2, count = [1, jpj, jpk, jpt], offset = [jpi-1, 0, 0, 0]
257          ENDIF
258        END
259        ELSE:print, vinq.name+' nothing to check'
260      ENDCASE
261    ENDIF
262  ENDFOR
263
264  ncdf_close, cdfid
265
266  RETURN
267END
Note: See TracBrowser for help on using the repository browser.