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

« back to all changes in this revision

Viewing changes to cdfconvert.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 cdfconvert
 
2
  !!======================================================================
 
3
  !!                     ***  PROGRAM  cdfconvert  ***
 
4
  !!=====================================================================
 
5
  !!  ** Purpose : Convert a set of dimgfile (Clipper like)
 
6
  !!               to a set of CDF files (Drakkar like )
 
7
  !!
 
8
  !!  ** Method  : Read tag then open the respective T S 2D U V files to create
 
9
  !!              gridT, gridU and gridV files.
 
10
  !!              Requires  mesh_hgr.nc and mesh_zgr.nc  files
 
11
  !!
 
12
  !! History : 2.1  : 01/2007  : J.M. Molines : Original code
 
13
  !!           3.0  : 05/2011  : J.M. Molines : Doctor norm + Lic.
 
14
  !!----------------------------------------------------------------------
 
15
  !!----------------------------------------------------------------------
 
16
  !!   routines      : description
 
17
  !!  isdirect       : integer function which return the record length
 
18
  !!                   of the file in argument if a dimgfile, 0 else.
 
19
  !!                  
 
20
  !!----------------------------------------------------------------------
 
21
  USE cdfio 
 
22
  USE modcdfnames
 
23
  !!----------------------------------------------------------------------
 
24
  !! CDFTOOLS_3.0 , MEOM 2011
 
25
  !! $Id$
 
26
  !! Copyright (c) 2011, J.-M. Molines
 
27
  !! Software governed by the CeCILL licence (Licence/CDFTOOLSCeCILL.txt)
 
28
  !!----------------------------------------------------------------------
 
29
  IMPLICIT NONE
 
30
 
 
31
  INTEGER(KIND=4)                            :: ji, jj, jk      ! dummy loop index
 
32
  INTEGER(KIND=4)                            :: jt, jvar        ! dummy loop index
 
33
  INTEGER(KIND=4)                            :: narg, iargc     ! command line
 
34
  INTEGER(KIND=4)                            :: nvar            ! number of output variables
 
35
  INTEGER(KIND=4)                            :: npiglo, npjglo  ! size of the domain
 
36
  INTEGER(KIND=4)                            :: npk, npt        ! size of the domain
 
37
  INTEGER(KIND=4)                            :: irecl, ii, ndim ! dimg stuff variables
 
38
  INTEGER(KIND=4)                            :: numu=10         ! logical id for input dimg file
 
39
  INTEGER(KIND=4)                            :: numv=11         !      "             "
 
40
  INTEGER(KIND=4)                            :: numt=12         !      "             "
 
41
  INTEGER(KIND=4)                            :: nums=14         !      "             "
 
42
  INTEGER(KIND=4)                            :: num2d=15        !      "             "
 
43
  INTEGER(KIND=4)                            :: numssh=16       !      "             "
 
44
  INTEGER(KIND=4)                            :: numuu=17        !      "             "
 
45
  INTEGER(KIND=4)                            :: numvv=18        !      "             "
 
46
  INTEGER(KIND=4)                            :: ncout           ! ncid of output netcdf file
 
47
  INTEGER(KIND=4)                            :: ierr            ! error status
 
48
  INTEGER(KIND=4), DIMENSION(:), ALLOCATABLE :: ipk, id_varout  ! outpur variables levels and id's
 
49
 
 
50
  REAL(KIND=4)                               :: x1, y1          ! dimg header ( SW corner)
 
51
  REAL(KIND=4)                               :: dx, dy          ! dimg header ( x,y step)
 
52
  REAL(KIND=4)                               :: zspval          ! dimg header ( special value)
 
53
  REAL(KIND=4), DIMENSION(:,:),  ALLOCATABLE :: v2d, glam, gphi ! working arrays
 
54
  REAL(KIND=4), DIMENSION(:),    ALLOCATABLE :: zdep            ! depth
 
55
  REAL(KIND=4), DIMENSION(:),    ALLOCATABLE :: tim             ! time counter
 
56
 
 
57
  CHARACTER(LEN=256)                         :: cf_ufil         ! output gridU file
 
58
  CHARACTER(LEN=256)                         :: cf_vfil         ! output gridV file
 
59
  CHARACTER(LEN=256)                         :: cf_tfil         ! output gridT file
 
60
  CHARACTER(LEN=256)                         :: cf_bsfil        ! output BSF file
 
61
  CHARACTER(LEN=256)                         :: cf_dimgu        ! input dimg U file
 
62
  CHARACTER(LEN=256)                         :: cf_dimgv        ! input dimg V file
 
63
  CHARACTER(LEN=256)                         :: cf_dimgt        ! input dimg T file
 
64
  CHARACTER(LEN=256)                         :: cf_dimgs        ! input dimg S file
 
65
  CHARACTER(LEN=256)                         :: cf_dimg2d       ! input dimg 2D file
 
66
  CHARACTER(LEN=256)                         :: cf_dimguu       ! input dimg U2 file
 
67
  CHARACTER(LEN=256)                         :: cf_dimgvv       ! input dimg V2 file
 
68
  CHARACTER(LEN=256)                         :: cf_dimgssh      ! input dimg SSH file
 
69
  CHARACTER(LEN=256)                         :: ctag            ! time tag
 
70
  CHARACTER(LEN=256)                         :: confcase        ! config-case
 
71
  CHARACTER(LEN=80 )                         :: cheader         ! comment in header of dimg file
 
72
  CHARACTER(LEN=4  )                         :: cver            ! dimg version
 
73
 
 
74
  TYPE(variable), DIMENSION(:),  ALLOCATABLE :: stypvar         ! output data structure
 
75
 
 
76
  LOGICAL                                    :: lexist          ! flag for existing file
 
77
  LOGICAL                                    :: lchk = .FALSE.  ! flag for missing files
 
78
  !!----------------------------------------------------------------------
 
79
 
 
80
  !!  Read command line
 
81
  narg= iargc()
 
82
  IF ( narg /= 2 ) THEN
 
83
     PRINT *,' usage : cdfconvert CLIPPER_tag CLIPPER_Confcase'
 
84
     PRINT *,'      '
 
85
     PRINT *,'     PURPOSE :'
 
86
     PRINT *,'       Convert dimg files (CLIPPER like) to netcdf (DRAKKAR like).'
 
87
     PRINT *,'      '
 
88
     PRINT *,'     ARGUMENTS :'
 
89
     PRINT *,'       CLIPPER_tag      : a string such as y2000m01d15 for time identification.' 
 
90
     PRINT *,'       CLIPPER_confcase : CONFIG-CASE of the files to be converted (eg ATL6-V6)'
 
91
     PRINT *,'      '
 
92
     PRINT *,'     REQUIRED FILES :'
 
93
     PRINT *,'        ',TRIM(cn_fhgr),' and ', TRIM(cn_fzgr)
 
94
     PRINT *,'      '
 
95
     PRINT *,'     OUTPUT : '
 
96
     PRINT *,'       netcdf file : gridT, gridU, gridV files'
 
97
     PRINT *,'         variables : same as in standard NEMO output'
 
98
     PRINT *,'      '
 
99
     PRINT *,'     SEE ALSO :'
 
100
     PRINT *,'       cdfflxconv, cdfsstconv, cdfstrconv'
 
101
     PRINT *,'      '
 
102
     STOP
 
103
  ENDIF
 
104
  !!
 
105
  CALL getarg (1, ctag)
 
106
  CALL getarg (2, confcase)
 
107
 
 
108
  lchk = lchk .OR. chkfile( cn_fhgr )
 
109
  lchk = lchk .OR. chkfile (cn_fzgr )
 
110
 
 
111
  !! Build dimg file names
 
112
  cf_dimgu   = TRIM(confcase)//'_U_'  //TRIM(ctag)//'.dimg' ; lchk = lchk .OR. chkfile(cf_dimgu )
 
113
  cf_dimgv   = TRIM(confcase)//'_V_'  //TRIM(ctag)//'.dimg' ; lchk = lchk .OR. chkfile(cf_dimgv )
 
114
  cf_dimgt   = TRIM(confcase)//'_T_'  //TRIM(ctag)//'.dimg' ; lchk = lchk .OR. chkfile(cf_dimgt )
 
115
  cf_dimgs   = TRIM(confcase)//'_S_'  //TRIM(ctag)//'.dimg' ; lchk = lchk .OR. chkfile(cf_dimgs )
 
116
  cf_dimg2d  = TRIM(confcase)//'_2D_' //TRIM(ctag)//'.dimg' ; lchk = lchk .OR. chkfile(cf_dimg2d)
 
117
  IF ( lchk ) STOP ! missing file
 
118
 
 
119
  cf_dimgssh = TRIM(confcase)//'_SSH_'//TRIM(ctag)//'.dimg'
 
120
  cf_dimguu  = TRIM(confcase)//'_UU_' //TRIM(ctag)//'.dimg'
 
121
  cf_dimgvv  = TRIM(confcase)//'_VV_' //TRIM(ctag)//'.dimg'
 
122
 
 
123
  cf_ufil    = TRIM(confcase)//'_'    //TRIM(ctag)//'_gridU.nc'
 
124
  cf_vfil    = TRIM(confcase)//'_'    //TRIM(ctag)//'_gridV.nc'
 
125
  cf_tfil    = TRIM(confcase)//'_'    //TRIM(ctag)//'_gridT.nc'
 
126
  cf_bsfil   = TRIM(confcase)//'_'    //TRIM(ctag)//'_PSI.nc'
 
127
 
 
128
  ! open (and check ?? if they exists )
 
129
  irecl=isdirect(cf_dimgu ) ; OPEN( numu,  FILE=cf_dimgu,  FORM='UNFORMATTED', ACCESS='DIRECT', RECL=irecl )
 
130
  irecl=isdirect(cf_dimgv ) ; OPEN( numv,  FILE=cf_dimgv,  FORM='UNFORMATTED', ACCESS='DIRECT', RECL=irecl )
 
131
  irecl=isdirect(cf_dimgt ) ; OPEN( numt,  FILE=cf_dimgt,  FORM='UNFORMATTED', ACCESS='DIRECT', RECL=irecl )
 
132
  irecl=isdirect(cf_dimgs ) ; OPEN( nums,  FILE=cf_dimgs,  FORM='UNFORMATTED', ACCESS='DIRECT', RECL=irecl )
 
133
  irecl=isdirect(cf_dimg2d) ; OPEN( num2d, FILE=cf_dimg2d, FORM='UNFORMATTED', ACCESS='DIRECT', RECL=irecl )
 
134
  
 
135
  READ(numt,REC=1) cver, cheader, ii, npiglo, npjglo, npk, npt
 
136
 
 
137
  ALLOCATE (v2d(npiglo, npjglo), glam(npiglo,npjglo), gphi(npiglo,npjglo), zdep(npk), tim(npt) )
 
138
 
 
139
  READ(numt,REC=1) cver, cheader, ii, npiglo, npjglo, npk, npt, ndim, &
 
140
                   &      x1,y1,dx,dy,zspval, &
 
141
                   &    ( zdep(jk),jk=1,npk), &
 
142
                        ( tim(jt), jt=1,npt)
 
143
 
 
144
  ! transform Clipper days to drakkar seconds ...
 
145
  tim(:)=tim(:)*86400.
 
146
 
 
147
  !###############
 
148
  !# GRID T FILE #
 
149
  !###############
 
150
  ! Build gridT file with votemper, vosaline, sossheig, ... fluxes ...
 
151
  INQUIRE(FILE=cf_dimgssh, EXIST=lexist)
 
152
  IF ( lexist ) THEN
 
153
    irecl = isdirect(cf_dimgssh) 
 
154
    OPEN( numssh,FILE=cf_dimgssh, FORM='UNFORMATTED', ACCESS='DIRECT', RECL=irecl )
 
155
    nvar = 10 
 
156
  ELSE
 
157
    nvar = 9
 
158
  ENDIF
 
159
 
 
160
  ALLOCATE ( stypvar(nvar), ipk(nvar), id_varout(nvar) )
 
161
  jvar=1 
 
162
  ipk(jvar)                       = npk       
 
163
  stypvar(jvar)%cname             = cn_votemper
 
164
  stypvar(jvar)%cunits            = 'C'      
 
165
  stypvar(jvar)%rmissing_value    = 0.      
 
166
  stypvar(jvar)%valid_min         = -2.    
 
167
  stypvar(jvar)%valid_max         = 40.   
 
168
  stypvar(jvar)%clong_name        = 'Potential Temperature'
 
169
  stypvar(jvar)%cshort_name       = cn_votemper
 
170
  stypvar(jvar)%conline_operation = 'N/A'                
 
171
  stypvar(jvar)%caxis             = 'TZYX'              
 
172
  jvar=jvar+1
 
173
 
 
174
  ipk(jvar)                       = npk
 
175
  stypvar(jvar)%cname             = cn_vosaline
 
176
  stypvar(jvar)%cunits            = 'PSU'
 
177
  stypvar(jvar)%rmissing_value    = 0.
 
178
  stypvar(jvar)%valid_min         = 0.
 
179
  stypvar(jvar)%valid_max         = 45.
 
180
  stypvar(jvar)%clong_name        = 'Salinity'
 
181
  stypvar(jvar)%cshort_name       = cn_vosaline
 
182
  stypvar(jvar)%conline_operation = 'N/A'
 
183
  stypvar(jvar)%caxis             = 'TZYX'
 
184
  jvar=jvar+1
 
185
 
 
186
  IF ( lexist ) THEN
 
187
  ipk(jvar)                       = 1
 
188
  stypvar(jvar)%cname             = cn_sossheig
 
189
  stypvar(jvar)%cunits            = 'm'
 
190
  stypvar(jvar)%rmissing_value    = 0.
 
191
  stypvar(jvar)%valid_min         = -10.
 
192
  stypvar(jvar)%valid_max         = 10.
 
193
  stypvar(jvar)%clong_name        = 'Sea_Surface_height'
 
194
  stypvar(jvar)%cshort_name       = cn_sossheig
 
195
  stypvar(jvar)%conline_operation = 'N/A'
 
196
  stypvar(jvar)%caxis             = 'TYX'
 
197
  jvar=jvar+1
 
198
  ENDIF
 
199
 
 
200
  ipk(jvar)                       = 1
 
201
  stypvar(jvar)%cname             = cn_somxl010         ! rec 12 of dimg file 2D
 
202
  stypvar(jvar)%cunits            = 'm'
 
203
  stypvar(jvar)%rmissing_value    = 0.
 
204
  stypvar(jvar)%valid_min         = 0.
 
205
  stypvar(jvar)%valid_max         = 7000.
 
206
  stypvar(jvar)%clong_name        = 'Mixed_Layer_Depth_on_0.01_rho_crit'
 
207
  stypvar(jvar)%cshort_name       = cn_somxl010
 
208
  stypvar(jvar)%conline_operation = 'N/A'
 
209
  stypvar(jvar)%caxis             = 'TYX'
 
210
  jvar=jvar+1
 
211
 
 
212
  ipk(jvar)                       = 1
 
213
  stypvar(jvar)%cname             = 'sohefldo'         ! rec 4 of dimg file 2D
 
214
  stypvar(jvar)%cunits            = 'W/m2'
 
215
  stypvar(jvar)%rmissing_value    = 0.
 
216
  stypvar(jvar)%valid_min         = -1000.
 
217
  stypvar(jvar)%valid_max         = 1000.
 
218
  stypvar(jvar)%clong_name        = 'Net_Downward_Heat_Flux'
 
219
  stypvar(jvar)%cshort_name       = 'sohefldo'
 
220
  stypvar(jvar)%conline_operation = 'N/A'
 
221
  stypvar(jvar)%caxis             = 'TYX'
 
222
  jvar=jvar+1
 
223
 
 
224
  ipk(jvar)                       = 1
 
225
  stypvar(jvar)%cname             = cn_soshfldo         ! rec 8 of dimg file 2D (qsr)
 
226
  stypvar(jvar)%cunits            = 'W/m2'
 
227
  stypvar(jvar)%rmissing_value    = 0.
 
228
  stypvar(jvar)%valid_min         = -1000.
 
229
  stypvar(jvar)%valid_max         = 1000.
 
230
  stypvar(jvar)%clong_name        = 'Short_Wave_Radiation'
 
231
  stypvar(jvar)%cshort_name       = cn_soshfldo
 
232
  stypvar(jvar)%conline_operation = 'N/A'
 
233
  stypvar(jvar)%caxis             = 'TYX'
 
234
  jvar=jvar+1
 
235
 
 
236
  ipk(jvar)                       = 1
 
237
  stypvar(jvar)%cname             = cn_sowaflup       ! rec 5 of dimg file 2D (emp)
 
238
  stypvar(jvar)%cunits            = 'kg/m2/s'         ! conversion required from CLIPPER /86400.
 
239
  stypvar(jvar)%rmissing_value    = 0.
 
240
  stypvar(jvar)%valid_min         = -1000.
 
241
  stypvar(jvar)%valid_max         = 1000.
 
242
  stypvar(jvar)%clong_name        = 'Net_Upward_Water_Flux'
 
243
  stypvar(jvar)%cshort_name       = cn_sowaflup
 
244
  stypvar(jvar)%conline_operation = 'N/A'
 
245
  stypvar(jvar)%caxis             = 'TYX'
 
246
  jvar=jvar+1
 
247
 
 
248
  ipk(jvar)                       = 1
 
249
  stypvar(jvar)%cname             = 'sowafldp'       ! rec 10 of dimg file 2D (erp)
 
250
  stypvar(jvar)%cunits            = 'kg/m2/s'         ! conversion required from CLIPPER /jvar.
 
251
  stypvar(jvar)%rmissing_value    = 0.
 
252
  stypvar(jvar)%valid_min         = -1000.
 
253
  stypvar(jvar)%valid_max         = 1000.
 
254
  stypvar(jvar)%clong_name        = 'Surface_Water_Flux:Damping'
 
255
  stypvar(jvar)%cshort_name       = 'sowafldp'
 
256
  stypvar(jvar)%conline_operation = 'N/A'
 
257
  stypvar(jvar)%caxis             = 'TYX'
 
258
  jvar=jvar+1
 
259
 
 
260
  ipk(jvar)                       = 1
 
261
  stypvar(jvar)%cname             = cn_soicecov         ! rec 13 of dimg file 2D (erp)
 
262
  stypvar(jvar)%cunits            = '%'         
 
263
  stypvar(jvar)%rmissing_value    = 0.
 
264
  stypvar(jvar)%valid_min         = 0.
 
265
  stypvar(jvar)%valid_max         = 1.
 
266
  stypvar(jvar)%clong_name        = 'Ice Cover'
 
267
  stypvar(jvar)%cshort_name       = cn_soicecov
 
268
  stypvar(jvar)%conline_operation = 'N/A'
 
269
  stypvar(jvar)%caxis             = 'TYX'
 
270
  jvar=jvar+1
 
271
 
 
272
  ipk(jvar)                       = 1
 
273
  stypvar(jvar)%cname             = 'sohefldp'         ! rec 9 of dimg file 2D (erp)
 
274
  stypvar(jvar)%cunits            = 'W/m2'         
 
275
  stypvar(jvar)%rmissing_value    = 0.
 
276
  stypvar(jvar)%valid_min         = -10.
 
277
  stypvar(jvar)%valid_max         = 10.
 
278
  stypvar(jvar)%clong_name        = 'Surface Heat Flux: Damping'
 
279
  stypvar(jvar)%cshort_name       = 'sohefldp'
 
280
  stypvar(jvar)%conline_operation = 'N/A'
 
281
  stypvar(jvar)%caxis             = 'TYX'
 
282
 
 
283
  glam = getvar  (cn_fhgr, cn_glamt, 1, npiglo, npjglo)
 
284
  gphi = getvar  (cn_fhgr, cn_gphit, 1, npiglo, npjglo)
 
285
  zdep = getvare3(cn_fzgr, cn_gdept, npk              )
 
286
 
 
287
  ncout = create      (cf_tfil, 'none',  npiglo, npjglo, npk, cdep=cn_vdeptht                       )
 
288
  ierr  = createvar   (ncout,   stypvar, nvar,   ipk,    id_varout                                  )
 
289
  ierr  = putheadervar(ncout,   'none',  npiglo, npjglo, npk, pnavlon=glam, pnavlat=gphi, pdep=zdep )
 
290
 
 
291
  jvar=1
 
292
  ! T
 
293
  DO jk=1, npk
 
294
   READ(numt,REC=jk+1) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
295
   ierr = putvar(ncout, id_varout(jvar), v2d, jk, npiglo, npjglo)
 
296
  END DO
 
297
  jvar  = jvar+1
 
298
  PRINT *, 'Done for T'
 
299
 
 
300
  ! S
 
301
  DO jk=1, npk
 
302
   READ(nums,REC=jk+1) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
303
   ierr = putvar(ncout, id_varout(jvar), v2d, jk, npiglo, npjglo)
 
304
  END DO
 
305
  jvar  = jvar+1
 
306
  PRINT *, 'Done for S'
 
307
 
 
308
  IF ( lexist ) THEN
 
309
  ! SSH
 
310
  READ(numssh,REC=2) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
311
  ierr = putvar(ncout, id_varout(jvar), v2d, 1, npiglo, npjglo)
 
312
  jvar = jvar+1
 
313
  PRINT *, 'Done for SSH'
 
314
  ENDIF
 
315
 
 
316
  ! MXL
 
317
  READ(num2d,REC=12) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
318
  ierr = putvar(ncout, id_varout(jvar), v2d, 1, npiglo, npjglo)
 
319
  jvar = jvar+1
 
320
  PRINT *, 'Done for MXL'
 
321
 
 
322
  ! QNET
 
323
  READ(num2d,REC=4 ) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
324
  ierr = putvar(ncout, id_varout(jvar), v2d, 1, npiglo, npjglo)
 
325
  jvar = jvar+1
 
326
  PRINT *, 'Done for QNET'
 
327
 
 
328
  ! QSR
 
329
  READ(num2d,REC=8)  (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
330
  ierr = putvar(ncout, id_varout(jvar), v2d, 1, npiglo, npjglo)
 
331
  jvar = jvar+1
 
332
  PRINT *, 'Done for QSR'
 
333
 
 
334
  ! EMP
 
335
  READ(num2d,REC=5)  (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
336
  v2d  = v2d/86400. ! to change units
 
337
  ierr = putvar(ncout, id_varout(jvar), v2d, 1, npiglo, npjglo)
 
338
  jvar = jvar+1
 
339
  PRINT *, 'Done for EMP'
 
340
 
 
341
  ! ERP
 
342
  READ(num2d,REC=10) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
343
  v2d  = v2d/86400. ! to change units
 
344
  ierr = putvar(ncout, id_varout(jvar), v2d, 1, npiglo, npjglo)
 
345
  jvar = jvar+1
 
346
  PRINT *, 'Done for ERP'
 
347
 
 
348
  ! FREEZE
 
349
  READ(num2d,REC=13) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
350
  ierr = putvar(ncout, id_varout(jvar), v2d, 1, npiglo, npjglo)
 
351
  jvar = jvar+1
 
352
  PRINT *, 'Done for FREEZE'
 
353
 
 
354
  ! QRP
 
355
  READ(num2d,REC=9)  (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
356
  ierr = putvar(ncout, id_varout(jvar), v2d, 1, npiglo, npjglo)
 
357
  jvar = jvar+1
 
358
  PRINT *, 'Done for QRP'
 
359
 
 
360
  ierr = putvar1d(ncout, tim, npt, 'T')
 
361
  ierr = closeout(ncout)
 
362
  DEALLOCATE ( stypvar, ipk, id_varout )
 
363
 
 
364
 
 
365
  !###############
 
366
  !# GRID U FILE #
 
367
  !###############
 
368
  ! Build gridU file with vozocrtx, sozotaux
 
369
  INQUIRE(FILE=cf_dimguu, EXIST=lexist)
 
370
  IF ( lexist ) THEN
 
371
    irecl = isdirect(cf_dimguu)
 
372
    OPEN( numuu, FILE=cf_dimguu, FORM='UNFORMATTED', ACCESS='DIRECT', RECL=irecl )
 
373
    nvar=3 
 
374
  ELSE
 
375
    nvar=2
 
376
  ENDIF
 
377
 
 
378
  ALLOCATE ( stypvar(nvar), ipk(nvar), id_varout(nvar) )
 
379
  
 
380
  jvar = 1
 
381
  ipk(jvar)                       = npk
 
382
  stypvar(jvar)%cname             = cn_vozocrtx
 
383
  stypvar(jvar)%cunits            = 'm/s'
 
384
  stypvar(jvar)%rmissing_value    = 0.
 
385
  stypvar(jvar)%valid_min         = 0.
 
386
  stypvar(jvar)%valid_max         = 20.
 
387
  stypvar(jvar)%clong_name        = 'Zonal Velocity '
 
388
  stypvar(jvar)%cshort_name       = cn_vozocrtx
 
389
  stypvar(jvar)%conline_operation = 'N/A'
 
390
  stypvar(jvar)%caxis             = 'TZYX'
 
391
  jvar = jvar+1
 
392
 
 
393
  ipk(jvar)                       =  1
 
394
  stypvar(jvar)%cname             = 'sozotaux'
 
395
  stypvar(jvar)%cunits            = 'N/m2'
 
396
  stypvar(jvar)%rmissing_value    = 0.
 
397
  stypvar(jvar)%valid_min         = 0.
 
398
  stypvar(jvar)%valid_max         = 20.
 
399
  stypvar(jvar)%clong_name        = 'Zonal Wind Stress'
 
400
  stypvar(jvar)%cshort_name       = 'sozotaux'
 
401
  stypvar(jvar)%conline_operation = 'N/A'
 
402
  stypvar(jvar)%caxis             = 'TYX'
 
403
  jvar = jvar+1
 
404
 
 
405
  IF ( lexist ) THEN
 
406
  ipk(jvar)      = npk
 
407
  stypvar(jvar)%cname             = TRIM(cn_vozocrtx)//'_sqd'
 
408
  stypvar(jvar)%cunits            = 'm2/s2'
 
409
  stypvar(jvar)%rmissing_value    = 0.
 
410
  stypvar(jvar)%valid_min         = 0.
 
411
  stypvar(jvar)%valid_max         = 100.
 
412
  stypvar(jvar)%clong_name        = 'MS_Zonal_Velocity'
 
413
  stypvar(jvar)%cshort_name       = TRIM(cn_vozocrtx)//'_sqd'
 
414
  stypvar(jvar)%conline_operation = 'N/A'
 
415
  stypvar(jvar)%caxis             = 'TZYX'
 
416
  ENDIF
 
417
 
 
418
  glam = getvar  (cn_fhgr, cn_glamu, 1, npiglo, npjglo)
 
419
  gphi = getvar  (cn_fhgr, cn_gphiu, 1, npiglo, npjglo)
 
420
  zdep = getvare3(cn_fzgr, cn_gdept, npk              )
 
421
 
 
422
  ncout = create      (cf_ufil, 'none',  npiglo, npjglo, npk, cdep=cn_vdepthu                       )
 
423
  ierr  = createvar   (ncout,   stypvar, nvar,   ipk,    id_varout                                  )
 
424
  ierr  = putheadervar(ncout,   'none',  npiglo, npjglo, npk, pnavlon=glam, pnavlat=gphi, pdep=zdep )
 
425
 
 
426
  jvar=1
 
427
  DO jk=1, npk
 
428
   READ(numu,REC=jk+1) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
429
   ierr = putvar(ncout, id_varout(jvar), v2d, jk, npiglo, npjglo)
 
430
  END DO
 
431
  jvar  = jvar+1
 
432
  PRINT *, 'Done for U'
 
433
 
 
434
  READ(num2d, REC=2 ) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
435
  ierr = putvar(ncout, id_varout(jvar), v2d, 1,  npiglo, npjglo)
 
436
  jvar = jvar+1
 
437
  PRINT *, 'Done for TAUX'
 
438
 
 
439
  IF ( lexist ) THEN
 
440
  DO jk=1, npk
 
441
   READ(numuu,REC=jk+1) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
442
   ierr = putvar(ncout, id_varout(jvar), v2d, jk,  npiglo, npjglo)
 
443
  END DO
 
444
  PRINT *, 'Done for UU'
 
445
  ENDIF
 
446
 
 
447
  ierr = putvar1d(ncout, tim, npt, 'T')
 
448
  ierr = closeout(ncout               )
 
449
 
 
450
  DEALLOCATE ( stypvar, ipk, id_varout )
 
451
 
 
452
  !###############
 
453
  !# GRID V FILE #
 
454
  !###############
 
455
  ! Build gridV file with vomecrty, sometauy
 
456
  INQUIRE(FILE=cf_dimgvv, EXIST=lexist)
 
457
  IF ( lexist ) THEN
 
458
    irecl = isdirect(cf_dimgvv)
 
459
    OPEN( numvv, FILE=cf_dimgvv, FORM='UNFORMATTED', ACCESS='DIRECT', RECL=irecl )
 
460
    nvar=3 
 
461
  ELSE
 
462
    nvar=2
 
463
  ENDIF
 
464
  ALLOCATE ( stypvar(nvar), ipk(nvar), id_varout(nvar) )
 
465
 
 
466
  jvar=1
 
467
  ipk(jvar)                       = npk
 
468
  stypvar(jvar)%cname             = cn_vomecrty
 
469
  stypvar(jvar)%cunits            = 'm/s'
 
470
  stypvar(jvar)%rmissing_value    = 0.
 
471
  stypvar(jvar)%valid_min         = 0.
 
472
  stypvar(jvar)%valid_max         = 20.
 
473
  stypvar(jvar)%clong_name        = 'Meridinal  Velocity '
 
474
  stypvar(jvar)%cshort_name       = cn_vomecrty
 
475
  stypvar(jvar)%conline_operation = 'N/A'
 
476
  stypvar(jvar)%caxis             = 'TZYX'
 
477
  jvar = jvar+1
 
478
 
 
479
  ipk(jvar)                       = 1
 
480
  stypvar(jvar)%cname             = 'sometauy'
 
481
  stypvar(jvar)%cunits            = 'N/m2'
 
482
  stypvar(jvar)%rmissing_value    = 0.
 
483
  stypvar(jvar)%valid_min         = 0.
 
484
  stypvar(jvar)%valid_max         = 20.
 
485
  stypvar(jvar)%clong_name        = 'Meridional Wind Stress'
 
486
  stypvar(jvar)%cshort_name       = 'sometauy'
 
487
  stypvar(jvar)%conline_operation = 'N/A'
 
488
  stypvar(jvar)%caxis             = 'TYX'
 
489
  jvar=jvar+1
 
490
 
 
491
  IF ( lexist ) THEN
 
492
  ipk(jvar)                       = npk
 
493
  stypvar(jvar)%cname             = TRIM(cn_vomecrty)//'_sqd'
 
494
  stypvar(jvar)%cunits            = 'm2/s2'
 
495
  stypvar(jvar)%rmissing_value    = 0.
 
496
  stypvar(jvar)%valid_min         = 0.
 
497
  stypvar(jvar)%valid_max         = 100.
 
498
  stypvar(jvar)%clong_name        = 'MS_Meridional_Velocity'
 
499
  stypvar(jvar)%cshort_name       = TRIM(cn_vomecrty)//'_sqd'
 
500
  stypvar(jvar)%conline_operation = 'N/A'
 
501
  stypvar(jvar)%caxis             = 'TZYX'
 
502
  ENDIF
 
503
 
 
504
 
 
505
  glam = getvar  (cn_fhgr, cn_glamv, 1,  npiglo, npjglo)
 
506
  gphi = getvar  (cn_fhgr, cn_gphiv, 1,  npiglo, npjglo)
 
507
  zdep = getvare3(cn_fzgr, cn_gdept, npk               )
 
508
  
 
509
  ncout = create      (cf_vfil, 'none',  npiglo, npjglo, npk, cdep=cn_vdepthv                       )
 
510
  ierr  = createvar   (ncout,   stypvar, nvar,   ipk,    id_varout                                  )
 
511
  ierr  = putheadervar(ncout,   'none',  npiglo, npjglo, npk, pnavlon=glam, pnavlat=gphi, pdep=zdep )
 
512
 
 
513
  jvar = 1
 
514
  DO jk=1, npk
 
515
   READ(numv,REC=jk+1)  (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
516
   ierr = putvar (ncout, id_varout(jvar), v2d, jk, npiglo, npjglo)
 
517
  END DO
 
518
  jvar  = jvar+1
 
519
  PRINT *, 'Done for V'
 
520
 
 
521
  READ(num2d, REC=3) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
522
  ierr = putvar(ncout, id_varout(jvar), v2d, 1, npiglo, npjglo)
 
523
  jvar = jvar+1
 
524
  PRINT *, 'Done for TAUY'
 
525
 
 
526
  IF ( lexist ) THEN
 
527
  DO jk=1, npk
 
528
   READ(numvv,REC=jk+1) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
529
   ierr = putvar(ncout, id_varout(jvar), v2d, jk,  npiglo, npjglo)
 
530
  END DO
 
531
  PRINT *, 'Done for VV'
 
532
  ENDIF
 
533
 
 
534
  ierr = putvar1d(ncout, tim, npt, 'T')
 
535
  ierr = closeout(ncout               )
 
536
 
 
537
  DEALLOCATE ( stypvar, ipk, id_varout )
 
538
 
 
539
  !###############
 
540
  !# PSI FILE #
 
541
  !###############
 
542
  ! Build PSI file with sobarstf
 
543
  nvar=1  
 
544
  ALLOCATE ( stypvar(nvar), ipk(nvar), id_varout(nvar) )
 
545
  ipk(1)                       = 1
 
546
  stypvar(1)%cname             = 'sobarstf'
 
547
  stypvar(1)%cunits            = 'm3/s'
 
548
  stypvar(1)%rmissing_value    = 0.
 
549
  stypvar(1)%valid_min         = -3.e8
 
550
  stypvar(1)%valid_max         = 3.e8
 
551
  stypvar(1)%clong_name        = 'Barotropic_Stream_Function'
 
552
  stypvar(1)%cshort_name       = 'sobarstf'
 
553
  stypvar(1)%conline_operation = 'N/A'
 
554
  stypvar(1)%caxis             = 'TYX'
 
555
 
 
556
  glam = getvar  (cn_fhgr, cn_glamf, 1, npiglo, npjglo)
 
557
  gphi = getvar  (cn_fhgr, cn_gphif, 1, npiglo, npjglo)
 
558
  zdep = getvare3(cn_fzgr, cn_gdept, 1                )
 
559
  
 
560
  ncout = create      (cf_bsfil, 'none',  npiglo, npjglo, 1, cdep=cn_vdepthu                       )
 
561
  ierr  = createvar   (ncout,    stypvar, nvar,   ipk,    id_varout                                )
 
562
  ierr  = putheadervar(ncout,    'none',  npiglo, npjglo, 1, pnavlon=glam, pnavlat=gphi, pdep=zdep )
 
563
 
 
564
  jvar = 1
 
565
  READ(num2d,REC=7) (( v2d(ji,jj), ji=1, npiglo), jj=1,npjglo)
 
566
  ierr = putvar(ncout, id_varout(jvar),v2d, 1, npiglo, npjglo)
 
567
  PRINT *, 'Done for PSI'
 
568
 
 
569
  ierr = putvar1d(ncout, tim, npt, 'T')
 
570
  ierr = closeout(ncout               )
 
571
 
 
572
  DEALLOCATE ( stypvar, ipk, id_varout )
 
573
 
 
574
CONTAINS
 
575
 
 
576
    INTEGER(KIND=4) FUNCTION isdirect(cdname)
 
577
    !!---------------------------------------------------------------------
 
578
    !!                  ***  FUNCTION isdirect  ***
 
579
    !!
 
580
    !! ** Purpose :  This integer function returns the record length if cdname 
 
581
    !!               is a valid dimg file, it returns 0 either.
 
582
    !!
 
583
    !! ** Method  :  Open the file and look for the key characters (@!01) for
 
584
    !!               identification.
 
585
    !!----------------------------------------------------------------------
 
586
    CHARACTER(LEN=*), INTENT(in) :: cdname
 
587
 
 
588
    ! --
 
589
    INTEGER(KIND=4)              :: irecl
 
590
    INTEGER(KIND=4)              :: inum = 100
 
591
 
 
592
    CHARACTER(LEN=4)             :: clver
 
593
    CHARACTER(LEN=80)            :: clheader
 
594
    !!----------------------------------------------------------------------
 
595
 
 
596
!
 
597
      OPEN(inum,FILE=cdname, FORM = 'UNFORMATTED', ACCESS = 'DIRECT', RECL = 88)
 
598
      READ(inum,REC=1) clver ,clheader, irecl
 
599
      CLOSE(inum)
 
600
!
 
601
      IF (clver ==  '@!01' ) THEN
 
602
         isdirect = irecl
 
603
      ELSE
 
604
         isdirect = 0
 
605
      END IF
 
606
!
 
607
      END FUNCTION isdirect
 
608
END PROGRAM cdfconvert