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
RevLine 
[197]1;+
[232]2;
[197]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
[226]11;
[197]12; @keyword WRITE {default=0}{type=scalar: 0 or 1}
13; Define to 1 to write the good periodicity in the file.
[226]14; By default print only message of periodicity errors
[197]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)
[226]41;
[197]42; @version
43; $Id$
44;-
[231]45;
[197]46PRO checkperio, file, WRITE = write
[238]47;
48  compile_opt idl2, strictarrsubs
49;
[226]50  IF file_test(file) EQ 0 THEN BEGIN
[236]51    ras = report( 'file '+file+' not found')
[197]52    RETURN
53  ENDIF
54
55  cdfid = ncdf_open(file, WRITE = write)
56  finq = ncdf_inquire(cdfid)
57;
58  dimsz = lonarr(finq.ndims)
[226]59  FOR did = 0, finq.ndims-1 DO BEGIN
[197]60    ncdf_diminq, cdfid, did, name, size
61    dimsz[did] = size
62  ENDFOR
63;
[226]64  FOR vid = 0, finq.nvars-1 DO BEGIN
[197]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;------------------------------
[226]74        2:BEGIN
[197]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))
[226]81              IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]82                ras = report( vinq.name+' bad y periodicity (1)')
[197]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)
[226]91              IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]92                ras = report( vinq.name+' bad y periodicity (1)')
[197]93                IF keyword_set(write) THEN $
94                   ncdf_varput, cdfid, vid, part2, count = [jpi-2, 1], offset = [1, jpj-1]
95              ENDIF
96            END
[236]97            ELSE:ras = report( vinq.name+' nothing to check')
[197]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)
[226]105              IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]106                ras = report( vinq.name+' bad y periodicity (2)')
[197]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
[236]113            ELSE:ras = report( vinq.name+' nothing to check')
[197]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]
[226]118          IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]119            ras = report( vinq.name+' bad x periodicity (1)')
[197]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]
[226]126          IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]127            ras = report( vinq.name+' bad x periodicity (2)')
[197]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;------------------------------
[226]135        3:BEGIN
[197]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)
[226]144              IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]145                ras = report( vinq.name+' bad y periodicity (1)')
[197]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)
[226]155              IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]156                ras = report( vinq.name+' bad y periodicity (1)')
[197]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
[236]161            ELSE:ras = report( vinq.name+' nothing to check')
[197]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)
[226]169              IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]170                ras = report( vinq.name+' bad y periodicity (2)')
[197]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
[236]177            ELSE:ras = report( vinq.name+' nothing to check')
[197]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]
[226]182          IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]183            ras = report( vinq.name+' bad x periodicity (1)')
[197]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]
[226]190          IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]191            ras = report( vinq.name+' bad x periodicity (2)')
[197]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;------------------------------
[226]199        4:BEGIN
[197]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)
[226]209              IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]210                ras = report( vinq.name+' bad y periodicity (1)')
[197]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)
[226]220              IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]221                ras = report( vinq.name+' bad y periodicity (1)')
[197]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
[236]226            ELSE:ras = report( vinq.name+' nothing to check')
[197]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)
[226]234              IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]235                ras = report( vinq.name+' bad y periodicity (2)')
[197]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
[236]242            ELSE:ras = report( vinq.name+' nothing to check')
[197]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]
[226]247          IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]248            ras = report( vinq.name+' bad x periodicity (1)')
[197]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]
[226]255          IF array_equal(part1, part2) NE 1 THEN BEGIN
[236]256            ras = report( vinq.name+' bad x periodicity (2)')
[197]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
[236]261        ELSE:ras = report( vinq.name+' nothing to check')
[197]262      ENDCASE
[226]263    ENDIF
[197]264  ENDFOR
265
266  ncdf_close, cdfid
267
268  RETURN
269END
Note: See TracBrowser for help on using the repository browser.