2
!!======================================================================
3
!! *** PROGRAM cdfzoom ***
4
!!=====================================================================
5
!! ** Purpose : Extract a sub area of a cdf output file and print it
6
!! on the screen with an easy to read format.
8
!! ** Method : specify the variable name and file on the command line
10
!! History : --- : 1999 : A. de Miranda : Original code in bimgtools
11
!! History : 2.1 : 11/2004 : J.M. Molines : port to CDFTOOLS
12
!! 3.0 : 12/2010 : J.M. Molines : Doctor norm + Lic.
13
!!----------------------------------------------------------------------
16
!!----------------------------------------------------------------------
17
!! CDFTOOLS_3.0 , MEOM 2011
19
!! Copyright (c) 2010, J.-M. Molines
20
!! Software governed by the CeCILL licence (Licence/CDFTOOLSCeCILL.txt)
21
!!----------------------------------------------------------------------
24
INTEGER(KIND=4) :: ji, jj, jt ! dummy loop index
25
INTEGER(KIND=4) :: narg, iargc, ijarg ! browse line
26
INTEGER(KIND=4) :: ni, nj, nk, nt, ndim ! domain dimension
27
INTEGER(KIND=4) :: niz, njz, nkz ! size of zoom
28
INTEGER(KIND=4) :: iimin, iimax ! i-limits
29
INTEGER(KIND=4) :: ijmin, ijmax ! j-limits
30
INTEGER(KIND=4) :: ikmin, ikmax ! k-limits
31
INTEGER(KIND=4) :: itmin, itmax ! t-limit
32
INTEGER(KIND=4) :: ikext, ierr !
33
INTEGER(KIND=4) :: iipmin, iipmax !
34
INTEGER(KIND=4) :: ijpmin, ijpmax !
36
REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: v2d ! data array
37
REAL(KIND=4) :: fact ! scaling factor
39
CHARACTER(LEN=256) :: cldum ! summy character variable
40
CHARACTER(LEN=256) :: cf_in ! input file name
41
CHARACTER(LEN=256) :: cv_in='none' ! variable name
42
!!----------------------------------------------------------------------
47
PRINT *,' usage : cdfzoom -f file -zoom imin imax jmin jmax ...'
48
PRINT *,' ... -var cdfvar [-lev kmin kmax ] ...'
49
PRINT *,' ... [ -time tmin tmax ] [ -fact factor] '
51
PRINT *,' Display the numerical values of a zoomed area. By'
52
PRINT *,' default, all times and levels are shown. If the zoomed'
53
PRINT *,' area is degenerated to a single line, then the vertical'
54
PRINT *,' slab is displayed.'
56
PRINT *,' ARGUMENTS :'
57
PRINT *,' -f file : name of input file'
58
PRINT *,' -zoom imin imax jmin jmax : spatial window definition'
59
PRINT *,' -var cdfvar : cdf variable name to work with.'
62
PRINT *,' [-lev kmin kmax ] : vertical limits for display.'
63
PRINT *,' [-time tmin tmax ] : time limits for display.'
64
PRINT *,' [-fact factor ] : use a scaling factor for display.'
65
PRINT *,' Values are DIVIDED by factor'
67
PRINT *,' REQUIRED FILES :'
71
PRINT *,' display on standard output'
75
ikext = 1 ; ikmin = 1 ; ikmax = 1 ; itmin = 1 ; itmax = 1
80
DO WHILE (ijarg <= narg)
81
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1
84
CALL getarg(ijarg, cf_in) ; ijarg = ijarg + 1
86
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ikmin
87
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ikmax
89
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) itmin
90
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) itmax
92
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) fact
94
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) iimin
95
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) iimax
96
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ijmin
97
CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ijmax
99
CALL getarg(ijarg,cv_in) ; ijarg = ijarg + 1
101
PRINT *, TRIM(cldum),' : unknown option '
106
IF ( chkfile (cf_in) ) STOP ! missing file
108
ni=0 ; nj=0 ; nk=0 ; nt=0
109
niz = iimax - iimin + 1
110
njz = ijmax - ijmin + 1
111
nkz = ikmax - ikmin + 1
115
!working with vertical slab, either niz or njz must be 1
116
IF ( niz == 1 ) THEN ! y/z slab
117
ELSE IF ( njz == 1 ) THEN ! x/z slab
119
PRINT *, 'Either niz or njz must me one'
124
ni = getdim(cf_in, cn_x, cldum, ierr)
125
IF ( ierr == 1 ) THEN
126
ni = getdim(cf_in, 'lon', cldum, ierr)
127
IF ( ierr == 1 ) THEN
128
PRINT *,' No X or lon dim found ' ; STOP
132
nj = getdim(cf_in, cn_y, cldum, ierr)
133
IF ( ierr == 1 ) THEN
134
nj = getdim(cf_in, 'lat', cldum, ierr)
135
IF ( ierr == 1 ) THEN
136
PRINT *,' No y or lat dim found ' ; STOP
140
nk = getdim(cf_in, cn_z, cldum, ierr)
141
IF ( ierr == 1 ) THEN
142
nk = getdim(cf_in, 'z', cldum, ierr)
143
IF ( ierr == 1 ) THEN
144
nk = getdim(cf_in, 'lev', cldum, ierr)
145
IF ( ierr == 1 ) THEN
146
PRINT *,' No dep or z or lev dim found '
151
nt = getdim(cf_in, cn_t, cldum, ierr)
152
IF ( ierr == 1 ) THEN
153
nt = getdim(cf_in, 'step', cldum, ierr)
154
IF ( ierr == 1 ) THEN
155
PRINT *,' No time or step dim found '
159
IF ( itmax > nt ) THEN
160
PRINT *,' Not enough time steps in this file'
164
IF (nk == 0 ) THEN ; nk = 1 ; ikext = 1 ; ENDIF ! assume a 2D variable
165
IF (nt == 0 ) THEN ; nt = 1 ; ENDIF ! assume a 1 time frame file
168
ALLOCATE ( v2d(niz,njz) )
171
ALLOCATE( v2d(njz,nkz))
173
ALLOCATE( v2d(niz,nkz))
178
DO ! for exit statement
179
ndim = getvdim(cf_in, cv_in)+1 ! getvdim gives ndim-1 !
180
PRINT *,TRIM(cv_in), ndim, ikext
183
iipmin=iimin ; iipmax=iimax; ijpmin=ijmin; ijpmax=ijmax
185
CASE( 2 ) ! assume x,y variable
186
v2d(:,:) = getvar(cf_in, cv_in, 1, niz, njz, iimin, ijmin, ktime=jt)
188
CASE( 3 ) ! assume x,y,t variable
189
v2d(:,:) = getvar(cf_in, cv_in, 1, niz, njz, iimin, ijmin, ktime=jt)
191
CASE( 4 ) ! assume x,y,z,t variable
192
v2d(:,:) = getvar(cf_in, cv_in, ikext, niz, njz, iimin, ijmin, ktime=jt)
195
PRINT *,' Non mapable variables x-y :('
201
CASE( 4 ) ! assume x,y,z,t variable
203
iipmin=iimin ; iipmax=iimax; ijpmin=ikmin; ijpmax=ikmax
204
v2d(:,:) = getvarxz(cf_in, cv_in, ijmin, niz, nkz, iimin, ikmin, ktime=jt)
206
iipmin=ijmin ; iipmax=ijmax; ijpmin=ikmin; ijpmax=ikmax
207
v2d(:,:) = getvaryz(cf_in, cv_in, iimin, njz, nkz, ijmin, ikmin, ktime=jt)
211
PRINT *,' Non mapable variables x-z or y-z :('
218
PRINT *,'IMIN IMAX JMIN JMAX KMIN KMAX TIME', iimin,iimax,ijmin,ijmax,ikmin,ikmax, jt
219
PRINT 9001,' ',(ji,ji=iipmin,iipmax)
221
DO jj=ijpmax,ijpmin,-1
222
PRINT 9000,jj,' ',(v2d(ji-iipmin+1,jj-ijpmin+1)/fact,ji=iipmin,iipmax)
226
PRINT 9000,jj,' ',(v2d(ji-iipmin+1,jj-ijpmin+1)/fact,ji=iipmin,iipmax)
230
9000 FORMAT(i4,a,20f12.4)