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

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