~ubuntu-branches/ubuntu/vivid/cdftools/vivid

« back to all changes in this revision

Viewing changes to cdfzoom.f90

  • Committer: Package Import Robot
  • Author(s): Alastair McKinstry
  • Date: 2013-11-14 19:04:43 UTC
  • Revision ID: package-import@ubuntu.com-20131114190443-ymhovvnzvr5kd02l
Tags: upstream-3.0
ImportĀ upstreamĀ versionĀ 3.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
PROGRAM cdfzoom
 
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.
 
7
  !!
 
8
  !!  ** Method  : specify the variable name and file on the command line
 
9
  !!
 
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
  !!----------------------------------------------------------------------
 
14
  USE cdfio
 
15
  USE modcdfnames
 
16
  !!----------------------------------------------------------------------
 
17
  !! CDFTOOLS_3.0 , MEOM 2011
 
18
  !! $Id$
 
19
  !! Copyright (c) 2010, J.-M. Molines
 
20
  !! Software governed by the CeCILL licence (Licence/CDFTOOLSCeCILL.txt)
 
21
  !!----------------------------------------------------------------------
 
22
  IMPLICIT NONE
 
23
  !
 
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         !
 
35
  !
 
36
  REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: v2d                    ! data array
 
37
  REAL(KIND=4)                              :: fact                   ! scaling factor
 
38
  !
 
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
  !!----------------------------------------------------------------------
 
43
  CALL ReadCdfNames()
 
44
 
 
45
  narg = iargc()
 
46
  IF ( narg == 0 ) THEN
 
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] '
 
50
     PRINT *,'     PURPOSE :'
 
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.'
 
55
     PRINT *,'      '
 
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.'
 
60
     PRINT *,'      '
 
61
     PRINT *,'     OPTIONS :'
 
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'
 
66
     PRINT *,'      '
 
67
     PRINT *,'     REQUIRED FILES :'
 
68
     PRINT *,'        none'
 
69
     PRINT *,'      '
 
70
     PRINT *,'     OUTPUT : '
 
71
     PRINT *,'       display on standard output'
 
72
     STOP
 
73
  ENDIF
 
74
  !
 
75
  ikext = 1 ; ikmin = 1 ; ikmax = 1 ; itmin = 1 ; itmax = 1
 
76
  fact  = 1
 
77
 
 
78
  ijarg  = 1
 
79
  ! Read command line
 
80
  DO  WHILE (ijarg <=  narg)
 
81
     CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1
 
82
     SELECT CASE ( cldum )
 
83
     CASE ( '-f' )
 
84
        CALL getarg(ijarg, cf_in) ; ijarg = ijarg + 1
 
85
     CASE ( '-lev' )
 
86
        CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ikmin
 
87
        CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ikmax
 
88
     CASE ( '-time' )
 
89
        CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) itmin
 
90
        CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) itmax
 
91
     CASE ( '-fact' )
 
92
        CALL getarg(ijarg,cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) fact
 
93
     CASE ( '-zoom' )
 
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
 
98
     CASE ( '-var' )
 
99
        CALL getarg(ijarg,cv_in) ; ijarg = ijarg + 1
 
100
     CASE DEFAULT
 
101
        PRINT *, TRIM(cldum),' : unknown option '
 
102
        STOP
 
103
     END SELECT
 
104
  END DO
 
105
 
 
106
  IF ( chkfile (cf_in) ) STOP ! missing file
 
107
  !
 
108
  ni=0 ; nj=0 ; nk=0 ; nt=0 
 
109
  niz  = iimax - iimin + 1
 
110
  njz  = ijmax - ijmin + 1
 
111
  nkz  = ikmax - ikmin + 1
 
112
  ikext= ikmin
 
113
 
 
114
  IF ( nkz > 1 ) THEN
 
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
 
118
     ELSE
 
119
        PRINT *, 'Either niz or njz must me  one'
 
120
        STOP
 
121
     ENDIF
 
122
  ENDIF
 
123
 
 
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
 
129
     ENDIF
 
130
  ENDIF
 
131
 
 
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
 
137
     ENDIF
 
138
  ENDIF
 
139
 
 
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 ' 
 
147
        ENDIF
 
148
     ENDIF
 
149
  ENDIF
 
150
 
 
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 ' 
 
156
     ENDIF
 
157
  ENDIF
 
158
 
 
159
  IF ( itmax > nt ) THEN 
 
160
     PRINT *,' Not enough time steps in this file' 
 
161
     STOP
 
162
  ENDIF
 
163
 
 
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
 
166
 
 
167
  IF ( nkz == 1 ) THEN 
 
168
     ALLOCATE ( v2d(niz,njz) )
 
169
  ELSE  
 
170
     IF ( niz == 1 ) THEN
 
171
        ALLOCATE( v2d(njz,nkz))
 
172
     ELSE
 
173
        ALLOCATE( v2d(niz,nkz))
 
174
     ENDIF
 
175
  ENDIF
 
176
 
 
177
  DO jt = itmin, itmax
 
178
     DO   ! for exit statement
 
179
        ndim = getvdim(cf_in, cv_in)+1   ! getvdim gives ndim-1 !
 
180
        PRINT *,TRIM(cv_in), ndim, ikext
 
181
        SELECT CASE (nkz)
 
182
        CASE (1)
 
183
           iipmin=iimin ; iipmax=iimax; ijpmin=ijmin; ijpmax=ijmax
 
184
           SELECT CASE (ndim)
 
185
           CASE( 2 )  ! assume x,y variable
 
186
              v2d(:,:) = getvar(cf_in, cv_in, 1,     niz, njz, iimin, ijmin, ktime=jt)
 
187
              EXIT
 
188
           CASE( 3 )  ! assume x,y,t variable
 
189
              v2d(:,:) = getvar(cf_in, cv_in, 1,     niz, njz, iimin, ijmin, ktime=jt)
 
190
              EXIT
 
191
           CASE( 4 )  ! assume x,y,z,t variable
 
192
              v2d(:,:) = getvar(cf_in, cv_in, ikext, niz, njz, iimin, ijmin, ktime=jt)
 
193
              EXIT
 
194
           CASE DEFAULT
 
195
              PRINT *,' Non mapable variables x-y :('
 
196
              cv_in='none'
 
197
           END SELECT
 
198
 
 
199
        CASE DEFAULT
 
200
           SELECT CASE (ndim)
 
201
           CASE( 4 )  ! assume x,y,z,t variable
 
202
              IF ( njz == 1 ) THEN
 
203
                 iipmin=iimin ; iipmax=iimax; ijpmin=ikmin; ijpmax=ikmax
 
204
                 v2d(:,:) = getvarxz(cf_in, cv_in, ijmin, niz, nkz, iimin, ikmin, ktime=jt)
 
205
              ELSE
 
206
                 iipmin=ijmin ; iipmax=ijmax; ijpmin=ikmin; ijpmax=ikmax
 
207
                 v2d(:,:) = getvaryz(cf_in, cv_in, iimin, njz, nkz, ijmin, ikmin, ktime=jt)
 
208
              ENDIF
 
209
              EXIT
 
210
           CASE DEFAULT
 
211
              PRINT *,' Non mapable variables x-z or y-z :('
 
212
              cv_in='none'
 
213
           END SELECT
 
214
 
 
215
        END SELECT ! nkz
 
216
     ENDDO
 
217
 
 
218
     PRINT *,'IMIN IMAX JMIN JMAX KMIN KMAX TIME', iimin,iimax,ijmin,ijmax,ikmin,ikmax, jt
 
219
     PRINT 9001,'      ',(ji,ji=iipmin,iipmax)
 
220
     IF (nkz == 1 ) THEN
 
221
        DO jj=ijpmax,ijpmin,-1
 
222
           PRINT 9000,jj,'  ',(v2d(ji-iipmin+1,jj-ijpmin+1)/fact,ji=iipmin,iipmax)
 
223
        END DO
 
224
     ELSE
 
225
        DO jj=ijpmin,ijpmax
 
226
           PRINT 9000,jj,'  ',(v2d(ji-iipmin+1,jj-ijpmin+1)/fact,ji=iipmin,iipmax)
 
227
        END DO
 
228
     ENDIF
 
229
  ENDDO
 
230
9000 FORMAT(i4,a,20f12.4)
 
231
9001 FORMAT(a,20i12)
 
232
 
 
233
END PROGRAM cdfzoom