[cdftools] 129/228: JMM : add -mbathy option to cdfmkmask in order to build mask.nc from mbathy

Alastair McKinstry mckinstry at moszumanska.debian.org
Fri Jun 12 08:21:39 UTC 2015


This is an automated email from the git hooks/post-receive script.

mckinstry pushed a commit to branch master
in repository cdftools.

commit 23ab41a6f7ad89d0cd406ebdf7653aaeb30658dc
Author: molines <molines at 1055176f-818a-41d9-83e1-73fbe5b947c5>
Date:   Wed Jan 25 13:40:51 2012 +0000

    JMM : add -mbathy option to cdfmkmask in order to build mask.nc from mbathy
    
    
    git-svn-id: http://servforge.legi.grenoble-inp.fr/svn/CDFTOOLS/trunk@577 1055176f-818a-41d9-83e1-73fbe5b947c5
---
 cdfmkmask.f90 | 633 ++++++++++++++++++++++++++++++----------------------------
 1 file changed, 333 insertions(+), 300 deletions(-)

diff --git a/cdfmkmask.f90 b/cdfmkmask.f90
index e4db41c..2f7872d 100644
--- a/cdfmkmask.f90
+++ b/cdfmkmask.f90
@@ -1,302 +1,335 @@
 PROGRAM cdfmkmask
-  !!======================================================================
-  !!                     ***  PROGRAM  cdfmkmask  ***
-  !!=====================================================================
-  !!  ** Purpose : Build mask file from a salinity output
-  !!
-  !!  ** Method  : Read vosaline and set tmask to 1 where sal is not 0
-  !!               then umask, vmask and fmask are deduced from tmask
-  !!               REM: the result may be locally different for fmask than
-  !!                   fmask produced online as there are computed on line
-  !!               merged with cdfmkmask-zone by adding a zoom option. When
-  !!               used with -zoom option, the mask is 0 outside the zoom
-  !!               area.
-  !!
-  !! History : 2.1  : 11/2005  : J.M. Molines : Original code
-  !!           3.0  : 01/2011  : J.M. Molines : Doctor norm + Lic.
-  !! Modified : 3.0 : 08/2011  : P.   Mathiot : Add zoomij, zoombat, zoomvar and time option
-  !!----------------------------------------------------------------------
-  USE cdfio
-  USE modcdfnames
-  !!----------------------------------------------------------------------
-  !! CDFTOOLS_3.0 , MEOM 2011
-  !! $Id$
-  !! Copyright (c) 2011, J.-M. Molines
-  !! Software governed by the CeCILL licence (Licence/CDFTOOLSCeCILL.txt)
-  !!----------------------------------------------------------------------
-  IMPLICIT NONE
-
-  INTEGER(KIND=4)                           :: ji, jj, jk, jt           ! dummy loop index
-  INTEGER(KIND=4)                           :: ierr                     ! working integer
-  INTEGER(KIND=4)                           :: narg, iargc, ijarg       ! 
-  INTEGER(KIND=4)                           :: npiglo, npjglo, npk, nt  ! size of the domain
-  INTEGER(KIND=4)                           :: iimin, iimax             ! limit in i
-  INTEGER(KIND=4)                           :: ijmin, ijmax             ! limit in j
-  INTEGER(KIND=4)                           :: ncout                    ! ncid of output file
-  INTEGER(KIND=4), DIMENSION(4)             :: ipk, id_varout           ! outptut variables : number of levels,
-
-  REAL(KIND=4)                              :: rlonmin, rlonmax         ! limit in longitude
-  REAL(KIND=4)                              :: rlatmin, rlatmax         ! limit in latitude
-  REAL(KIND=4)                              :: rbatmin, rbatmax         ! limit in latitude
-  REAL(KIND=4)                              :: rvarmin, rvarmax         ! limit in variable
-  REAL(KIND=4), DIMENSION(:)  , ALLOCATABLE :: tim                      ! time counter
-  REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: tmask, zmask             ! 2D mask at current level
-  REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: rlon, rlat               ! latitude and longitude
-  REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: rbat                     ! bathymetry 
-
-  CHARACTER(LEN=256)                        :: cf_tfil                  ! file name
-  CHARACTER(LEN=256)                        :: cf_out = 'mask_sal.nc'   ! output file
-  CHARACTER(LEN=256)                        :: cv_mask                  ! variable name
-  CHARACTER(LEN=256)                        :: cldum                    ! dummy string
-
-  TYPE (variable), DIMENSION(4)             :: stypvar                  ! output attribute
- 
-  LOGICAL                                   :: lzoom    = .false.       ! zoom flag lat/lon
-  LOGICAL                                   :: lzoomij  = .false.       ! zoom flag i/j
-  LOGICAL                                   :: lzoombat = .false.       ! zoom flag bat
-  LOGICAL                                   :: lzoomvar = .false.       ! zoom flag var
-  LOGICAL                                   :: ltime    = .false.       ! time flag    
-  !!----------------------------------------------------------------------
-  CALL ReadCdfNames()
-
-  narg = iargc()
-  IF ( narg == 0 ) THEN
-     PRINT *,' usage : cdfmkmask T-file [-zoom lonmin lonmax latmin latmax] ...'
-     PRINT *,'                   ... [-zoomij iimin iimax ijmin ijmax] ...'
-     PRINT *,'                   ... [-zoombat bathymin bathymax]  ...'
-     PRINT *,'                   ... [-o OUT-file ]'
-     PRINT *,'      '
-     PRINT *,'     PURPOSE :'
-     PRINT *,'       Build a mask file from vosaline array read from the input file.' 
-     PRINT *,'       It assumes that land salinity values are set to 0.'
-     PRINT *,'      '
-     PRINT *,'     ARGUMENTS :'
-     PRINT *,'       T-file : netcdf file with salinity.' 
-     PRINT *,'                if T-file = -maskfile, we assume a reference file named ',TRIM(cn_fmsk)
-     PRINT *,'                with tmask variable.' 
-     PRINT *,'      '
-     PRINT *,'     OPTIONS :'
-     PRINT *,'       [-zoom lonmin lonmax latmin latmax] : geographical windows used to'
-     PRINT *,'                        limit the area where the mask is builded. Outside'
-     PRINT *,'                        this area, the mask is set to 0.'
-     PRINT *,'       [-zoomij iimin iimax ijmin ijmax] : model grid windows used to'
-     PRINT *,'                        limit the area where the mask is builded. Outside'
-     PRINT *,'                        this area, the mask is set to 0.'
-     PRINT *,'       [-zoombat bathymin bathymax] : depth windows used to'
-     PRINT *,'                        limit the area where the mask is builded. Outside'
-     PRINT *,'                        this area, the mask is set to 0.' 
-     PRINT *,'                        Need mesh_zgr.nc'
-     PRINT *,'       [-zoomvar varname varmin varmax] : range of varname used to'
-     PRINT *,'                        limit the area where the mask is builded. Outside'
-     PRINT *,'                        this area, the mask is set to 0.'
-     PRINT *,'       [-time ] : If further time step is available'
-     PRINT *,'                        a mask for each time step is done'
-     PRINT *,'       [-o OUT-file ] : output file name to be used in place of standard'
-     PRINT *,'                        name [ ',TRIM(cf_out),' ]'
-     PRINT *,'      '
-     PRINT *,'     REQUIRED FILES :'
-     PRINT *,'       If option -zoombat is used, file ', TRIM(cn_fzgr),' is required.'
-     PRINT *,'       If option T-file is -maskfile then ', TRIM(cn_fmsk), ' is required.'
-     PRINT *,'      '
-     PRINT *,'     OUTPUT : '
-     PRINT *,'       netcdf file : ', TRIM(cf_out), ' or OUT-file.'
-     PRINT *,'         variables : tmask, umask, vmask, fmask'
-     PRINT *,'                fmask can differ from standard fmask because it does not'
-     PRINT *,'                reflect the slip/noslip lateral condition.'
-     STOP
-  ENDIF
-
-  ijarg = 1
-  CALL getarg (ijarg, cf_tfil) ; ijarg = ijarg + 1
-
-  DO WHILE ( ijarg <= narg ) 
-    CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1
-    SELECT CASE ( cldum )
-    !
-    CASE ( '-zoom' )  ! read a zoom lat/lon area
-       lzoom = .true.
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rlonmin
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rlonmax
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rlatmin
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rlatmax
-    !
-    CASE ( '-zoomij' )  ! read a zoom i/j area
-       lzoomij = .true.
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) iimin
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) iimax
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ijmin
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ijmax
-    !
-    CASE ( '-zoombat' )  ! read a zoom bathy area 
-       lzoombat = .true.
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rbatmin
-       CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rbatmax
-    !
-    CASE ( '-zoomvar' ) ! read a zoom variable area
-       lzoomvar = .true.
-       CALL getarg (ijarg, cv_mask) ; ijarg = ijarg + 1 ;
-       CALL getarg (ijarg, cldum)   ; ijarg = ijarg + 1 ; READ(cldum,*) rvarmin 
-       CALL getarg (ijarg, cldum)   ; ijarg = ijarg + 1 ; READ(cldum,*) rvarmax 
-    CASE ( '-time' )  ! create a mask for each time step of the file
-       ltime=.true.
-    CASE ( '-o'    )  ! change output file name
-       CALL getarg (ijarg, cf_out) ; ijarg = ijarg + 1
-    !
-    CASE DEFAULT
-        PRINT *, 'ERROR : unknown option :', TRIM(cldum)
-        STOP
-    END SELECT
-  ENDDO
-
-  IF ( lzoom .AND. lzoomij ) PRINT *, 'WARNING 2 spatial condition for mask'
-  
-  IF (.NOT. lzoomvar) cv_mask = cn_vosaline
-  IF (TRIM(cf_tfil)=='-maskfile') THEN
-     cv_mask = 'tmask'
-     cf_tfil = cn_fmsk
-     cn_z    = 'z'
-  END IF    
-
-  IF ( chkfile(cf_tfil) ) STOP ! missing file
-
-  npiglo = getdim (cf_tfil,cn_x)
-  npjglo = getdim (cf_tfil,cn_y)
-  npk    = getdim (cf_tfil,cn_z)
-  nt     = getdim (cf_tfil,cn_t)
-
-  PRINT *,' npiglo = ', npiglo
-  PRINT *,' npjglo = ', npjglo
-  PRINT *,' npk    = ', npk
-  PRINT *,' nt     = ', nt 
-  
-  IF ( nt == 0 ) THEN
-    PRINT *,' nt is forced to 1'
-    nt = 1
-  ENDIF
-  
-  IF ((nt > 1) .AND. (.NOT. ltime)) THEN 
-     PRINT *, "WARNING nt > 1"
-     PRINT *, "we used only the first time step"
-     nt=1
-  END IF
-
-
-  ipk(1:4)                       = npk
-  stypvar(1)%cname               = 'tmask'
-  stypvar(2)%cname               = 'umask'
-  stypvar(3)%cname               = 'vmask'
-  stypvar(4)%cname               = 'fmask'
-
-  stypvar(1:4)%cunits            = '1/0'
-  stypvar(1:4)%rmissing_value    = 9999.
-  stypvar(1:4)%valid_min         = 0.
-  stypvar(1:4)%valid_max         = 1.
-
-  stypvar(1)%clong_name          = 'tmask'
-  stypvar(2)%clong_name          = 'umask'
-  stypvar(3)%clong_name          = 'vmask'
-  stypvar(4)%clong_name          = 'fmask'
-
-  stypvar(1)%cshort_name         = 'tmask'
-  stypvar(2)%cshort_name         = 'umask'
-  stypvar(3)%cshort_name         = 'vmask'
-  stypvar(4)%cshort_name         = 'fmask'
-
-  stypvar(1:4)%conline_operation = 'N/A'
-  stypvar(1:4)%caxis             = 'TZYX'
-  stypvar(1:4)%cprecision        = 'i2'
-
-  ncout = create      (cf_out, cf_tfil,  npiglo, npjglo, npk)
-  ierr  = createvar   (ncout,    stypvar, 4,      ipk,    id_varout )
-  ierr  = putheadervar(ncout,    cf_tfil,  npiglo, npjglo, npk)
-
-  !! Allocate only usefull variable and read only usefull variable
-  ALLOCATE (tmask(npiglo,npjglo), zmask(npiglo,npjglo), tim(nt))
-
-  IF ( lzoom ) THEN
-    ALLOCATE (rlon(npiglo,npjglo), rlat(npiglo,npjglo))
-    rlon(:,:) = getvar(cf_tfil, cn_vlon2d, 1, npiglo, npjglo)
-    rlat(:,:) = getvar(cf_tfil, cn_vlat2d, 1, npiglo, npjglo)
-  ENDIF
-
-  IF ( lzoombat ) THEN
-     ALLOCATE ( rbat  (npiglo,npjglo) )
-     rbat(:,:)= getvar(cn_fzgr, cn_hdepw,  1 ,npiglo, npjglo)
-  END IF
-
-  !! Now compute the mask 
-  DO jt=1, nt
-    IF (MOD(jt,10)==0) PRINT *,jt,'/',nt,' ...'
-  DO jk=1, npk
-     ! tmask
-      tmask(:,:) = getvar(cf_tfil, cv_mask,  jk, npiglo, npjglo, ktime=jt)
-      
-      IF ( lzoomvar ) THEN
-	    zmask=tmask
-	    WHERE ((tmask .GE. rvarmin) .AND. (tmask .LE. rvarmax)) zmask = 1
-	    WHERE ((tmask .LT. rvarmin) .OR.  (tmask .GT. rvarmax)) zmask = 0
-	    tmask=zmask
-      ELSE
-        WHERE (tmask > 0 ) tmask = 1
-        WHERE (tmask <=0 ) tmask = 0
-      ENDIF
-
-     IF ( lzoom ) THEN
-        IF (rlonmax > rlonmin) THEN
-           WHERE (rlon > rlonmax ) tmask = 0
-           WHERE (rlon < rlonmin ) tmask = 0
-        ELSE
-           WHERE (rlon < rlonmin .AND. rlon > rlonmax ) tmask = 0
-        END IF
-
-        WHERE (rlat > rlatmax ) tmask = 0
-        WHERE (rlat < rlatmin ) tmask = 0
-     ENDIF
-
-     IF ( lzoomij ) THEN
-        tmask(1:iimin-1,:     ) = 0   ! West
-        tmask(iimax+1:npiglo,:) = 0   ! East
-        tmask(:,ijmax+1:npjglo) = 0   ! North
-        tmask(:,1:ijmin-1     ) = 0   ! South
-     ENDIF
-
-     IF ( lzoombat ) THEN
-        WHERE (rbat < rbatmin .OR. rbat > rbatmax) tmask = 0
-     ENDIF
-
-      ierr       = putvar(ncout, id_varout(1), tmask, jk ,npiglo, npjglo, ktime=jt)
-     ! umask
-     zmask = 0.
-     DO ji=1,npiglo-1
-       DO jj=1,npjglo
-        zmask(ji,jj) = tmask(ji,jj)*tmask(ji+1,jj)
-       END DO
-     END DO
-      ierr       = putvar(ncout, id_varout(2), zmask, jk ,npiglo, npjglo, ktime=jt)
-    ! vmask
-     zmask=0.
-     DO ji=1,npiglo
-       DO jj=1,npjglo-1
-        zmask(ji,jj) = tmask(ji,jj)*tmask(ji,jj+1)
-       END DO
-     END DO
-      ierr       = putvar(ncout, id_varout(3), zmask, jk, npiglo, npjglo, ktime=jt)
-     !fmask
-     zmask=0.
-     DO ji=1,npiglo-1
-       DO jj=1,npjglo-1
-        zmask(ji,jj) = tmask(ji,jj)*tmask(ji,jj+1)*tmask(ji+1,jj)*tmask(ji+1,jj+1)
-       END DO
-     END DO
-      ierr       = putvar(ncout, id_varout(4), zmask, jk, npiglo, npjglo, ktime=jt)
-  END DO  ! loop to next level
-  END DO
-
-  tim(:) = 0.
-  ierr   = putvar1d(ncout, tim, nt,'T')
-  ierr   = closeout(ncout              )
-
-  PRINT *,''
-  PRINT *,'Mask file ',TRIM(cf_out),' has been created' 
- 
+   !!======================================================================
+   !!                     ***  PROGRAM  cdfmkmask  ***
+   !!=====================================================================
+   !!  ** Purpose : Build mask file from a salinity output
+   !!
+   !!  ** Method  : Read vosaline and set tmask to 1 where sal is not 0
+   !!               then umask, vmask and fmask are deduced from tmask
+   !!               REM: the result may be locally different for fmask than
+   !!                   fmask produced online as there are computed on line
+   !!               merged with cdfmkmask-zone by adding a zoom option. When
+   !!               used with -zoom option, the mask is 0 outside the zoom
+   !!               area.
+   !!
+   !! History : 2.1  : 11/2005  : J.M. Molines : Original code
+   !!           3.0  : 01/2011  : J.M. Molines : Doctor norm + Lic.
+   !! Modified : 3.0 : 08/2011  : P.   Mathiot : Add zoomij, zoombat, zoomvar and time option
+   !!----------------------------------------------------------------------
+   USE cdfio
+   USE modcdfnames
+   !!----------------------------------------------------------------------
+   !! CDFTOOLS_3.0 , MEOM 2011
+   !! $Id$
+   !! Copyright (c) 2011, J.-M. Molines
+   !! Software governed by the CeCILL licence (Licence/CDFTOOLSCeCILL.txt)
+   !!----------------------------------------------------------------------
+   IMPLICIT NONE
+
+   INTEGER(KIND=4)                           :: ji, jj, jk, jt           ! dummy loop index
+   INTEGER(KIND=4)                           :: ierr                     ! working integer
+   INTEGER(KIND=4)                           :: narg, iargc, ijarg       ! 
+   INTEGER(KIND=4)                           :: npiglo, npjglo, npk, nt  ! size of the domain
+   INTEGER(KIND=4)                           :: iimin, iimax             ! limit in i
+   INTEGER(KIND=4)                           :: ijmin, ijmax             ! limit in j
+   INTEGER(KIND=4)                           :: ncout                    ! ncid of output file
+   INTEGER(KIND=4), DIMENSION(4)             :: ipk, id_varout           ! outptut variables : number of levels,
+   INTEGER(KIND=4), DIMENSION(:,:), ALLOCATABLE :: mbathy                ! bathymetry  in levels
+
+   REAL(KIND=4)                              :: rlonmin, rlonmax         ! limit in longitude
+   REAL(KIND=4)                              :: rlatmin, rlatmax         ! limit in latitude
+   REAL(KIND=4)                              :: rbatmin, rbatmax         ! limit in latitude
+   REAL(KIND=4)                              :: rvarmin, rvarmax         ! limit in variable
+   REAL(KIND=4), DIMENSION(:)  , ALLOCATABLE :: tim                      ! time counter
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: tmask, zmask             ! 2D mask at current level
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: rlon, rlat               ! latitude and longitude
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: rbat                     ! bathymetry 
+
+   CHARACTER(LEN=256)                        :: cf_tfil                  ! file name
+   CHARACTER(LEN=256)                        :: cf_out = 'mask_sal.nc'   ! output file
+   CHARACTER(LEN=256)                        :: cv_mask                  ! variable name
+   CHARACTER(LEN=256)                        :: cldum                    ! dummy string
+
+   TYPE (variable), DIMENSION(4)             :: stypvar                  ! output attribute
+
+   LOGICAL                                   :: lzoom    = .false.       ! zoom flag lat/lon
+   LOGICAL                                   :: lzoomij  = .false.       ! zoom flag i/j
+   LOGICAL                                   :: lzoombat = .false.       ! zoom flag bat
+   LOGICAL                                   :: lzoomvar = .false.       ! zoom flag var
+   LOGICAL                                   :: ltime    = .false.       ! time flag    
+   LOGICAL                                   :: lmbathy  = .false.       ! mbathy flag    
+   !!----------------------------------------------------------------------
+   CALL ReadCdfNames()
+
+   narg = iargc()
+   IF ( narg == 0 ) THEN
+      PRINT *,' usage : cdfmkmask T-file [-zoom lonmin lonmax latmin latmax] ...'
+      PRINT *,'                   ... [-zoomij iimin iimax ijmin ijmax] ...'
+      PRINT *,'                   ... [-zoombat bathymin bathymax]  ...'
+      PRINT *,'                   ... [-o OUT-file ]'
+      PRINT *,'      '
+      PRINT *,'     PURPOSE :'
+      PRINT *,'       Build a mask file from vosaline array read from the input file.' 
+      PRINT *,'       It assumes that land salinity values are set to 0.'
+      PRINT *,'      '
+      PRINT *,'     ARGUMENTS :'
+      PRINT *,'       T-file : netcdf file with salinity.' 
+      PRINT *,'                if T-file = -maskfile, we assume a reference file named ',TRIM(cn_fmsk)
+      PRINT *,'                with tmask variable.' 
+      PRINT *,'                if T-file = -mbathy, we assume a reference file named '
+      PRINT *,'                bathylevel.nc with mbathy variable, giving the number of '
+      PRINT *,'                levels in the ocean.' 
+      PRINT *,'      '
+      PRINT *,'     OPTIONS :'
+      PRINT *,'       [-zoom lonmin lonmax latmin latmax] : geographical windows used to'
+      PRINT *,'                        limit the area where the mask is builded. Outside'
+      PRINT *,'                        this area, the mask is set to 0.'
+      PRINT *,'       [-zoomij iimin iimax ijmin ijmax] : model grid windows used to'
+      PRINT *,'                        limit the area where the mask is builded. Outside'
+      PRINT *,'                        this area, the mask is set to 0.'
+      PRINT *,'       [-zoombat bathymin bathymax] : depth windows used to'
+      PRINT *,'                        limit the area where the mask is builded. Outside'
+      PRINT *,'                        this area, the mask is set to 0.' 
+      PRINT *,'                        Need mesh_zgr.nc'
+      PRINT *,'       [-zoomvar varname varmin varmax] : range of varname used to'
+      PRINT *,'                        limit the area where the mask is builded. Outside'
+      PRINT *,'                        this area, the mask is set to 0.'
+      PRINT *,'       [-time ] : If further time step is available'
+      PRINT *,'                        a mask for each time step is done'
+      PRINT *,'       [-o OUT-file ] : output file name to be used in place of standard'
+      PRINT *,'                        name [ ',TRIM(cf_out),' ]'
+      PRINT *,'      '
+      PRINT *,'     REQUIRED FILES :'
+      PRINT *,'       If option -zoombat is used, file ', TRIM(cn_fzgr),' is required.'
+      PRINT *,'       If option T-file is -maskfile then ', TRIM(cn_fmsk), ' is required.'
+      PRINT *,'       If option T-file is -mbathy then bathylevel.nc and ', TRIM(cn_fzgr) 
+      PRINT *,'        are required.'
+      PRINT *,'      '
+      PRINT *,'     OUTPUT : '
+      PRINT *,'       netcdf file : ', TRIM(cf_out), ' or OUT-file.'
+      PRINT *,'         variables : tmask, umask, vmask, fmask'
+      PRINT *,'                fmask can differ from standard fmask because it does not'
+      PRINT *,'                reflect the slip/noslip lateral condition.'
+      STOP
+   ENDIF
+
+   ijarg = 1
+   CALL getarg (ijarg, cf_tfil) ; ijarg = ijarg + 1
+
+   DO WHILE ( ijarg <= narg ) 
+      CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1
+      SELECT CASE ( cldum )
+         !
+      CASE ( '-zoom' )  ! read a zoom lat/lon area
+         lzoom = .true.
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rlonmin
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rlonmax
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rlatmin
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rlatmax
+         !
+      CASE ( '-zoomij' )  ! read a zoom i/j area
+         lzoomij = .true.
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) iimin
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) iimax
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ijmin
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) ijmax
+         !
+      CASE ( '-zoombat' )  ! read a zoom bathy area 
+         lzoombat = .true.
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rbatmin
+         CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1 ; READ(cldum,*) rbatmax
+         !
+      CASE ( '-zoomvar' ) ! read a zoom variable area
+         lzoomvar = .true.
+         CALL getarg (ijarg, cv_mask) ; ijarg = ijarg + 1 ;
+         CALL getarg (ijarg, cldum)   ; ijarg = ijarg + 1 ; READ(cldum,*) rvarmin 
+         CALL getarg (ijarg, cldum)   ; ijarg = ijarg + 1 ; READ(cldum,*) rvarmax 
+      CASE ( '-time' )  ! create a mask for each time step of the file
+         ltime=.true.
+      CASE ( '-o'    )  ! change output file name
+         CALL getarg (ijarg, cf_out) ; ijarg = ijarg + 1
+         !
+      CASE DEFAULT
+         PRINT *, 'ERROR : unknown option :', TRIM(cldum)
+         STOP
+      END SELECT
+   ENDDO
+
+   IF ( lzoom .AND. lzoomij ) PRINT *, 'WARNING 2 spatial condition for mask'
+
+   IF (.NOT. lzoomvar) cv_mask = cn_vosaline
+   IF (TRIM(cf_tfil)=='-maskfile') THEN
+      cv_mask = 'tmask'
+      cf_tfil = cn_fmsk
+      cn_z    = 'z'
+   END IF
+
+   IF (TRIM(cf_tfil)=='-mbathy') THEN
+      cv_mask = 'mbathy'
+      cf_tfil = 'bathylevel.nc'
+      cn_z    = 'z'
+      lmbathy = .TRUE.
+      IF ( chkfile(cn_fzgr) ) STOP ! missing file
+   END IF
+
+   IF ( chkfile(cf_tfil) ) STOP ! missing file
+
+   npiglo = getdim (cf_tfil,cn_x)
+   npjglo = getdim (cf_tfil,cn_y)
+   IF ( lmbathy ) THEN
+      npk  = getdim (cn_fzgr,cn_z)
+   ELSE
+      npk  = getdim (cf_tfil,cn_z)
+   ENDIF
+   nt     = getdim (cf_tfil,cn_t)
+
+   PRINT *,' npiglo = ', npiglo
+   PRINT *,' npjglo = ', npjglo
+   PRINT *,' npk    = ', npk
+   PRINT *,' nt     = ', nt 
+
+   IF ( nt == 0 ) THEN
+      PRINT *,' nt is forced to 1'
+      nt = 1
+   ENDIF
+
+   IF ((nt > 1) .AND. (.NOT. ltime)) THEN 
+      PRINT *, "WARNING nt > 1"
+      PRINT *, "we used only the first time step"
+      nt=1
+   END IF
+
+
+   ipk(1:4)                       = npk
+   stypvar(1)%cname               = 'tmask'
+   stypvar(2)%cname               = 'umask'
+   stypvar(3)%cname               = 'vmask'
+   stypvar(4)%cname               = 'fmask'
+
+   stypvar(1:4)%cunits            = '1/0'
+   stypvar(1:4)%rmissing_value    = 9999.
+   stypvar(1:4)%valid_min         = 0.
+   stypvar(1:4)%valid_max         = 1.
+
+   stypvar(1)%clong_name          = 'tmask'
+   stypvar(2)%clong_name          = 'umask'
+   stypvar(3)%clong_name          = 'vmask'
+   stypvar(4)%clong_name          = 'fmask'
+
+   stypvar(1)%cshort_name         = 'tmask'
+   stypvar(2)%cshort_name         = 'umask'
+   stypvar(3)%cshort_name         = 'vmask'
+   stypvar(4)%cshort_name         = 'fmask'
+
+   stypvar(1:4)%conline_operation = 'N/A'
+   stypvar(1:4)%caxis             = 'TZYX'
+   stypvar(1:4)%cprecision        = 'i2'
+
+   ncout = create      (cf_out, cf_tfil,  npiglo, npjglo, npk)
+   ierr  = createvar   (ncout,    stypvar, 4,      ipk,    id_varout )
+   ierr  = putheadervar(ncout,    cf_tfil,  npiglo, npjglo, npk)
+
+   !! Allocate only usefull variable and read only usefull variable
+   ALLOCATE (tmask(npiglo,npjglo), zmask(npiglo,npjglo), tim(nt))
+
+   IF ( lmbathy ) THEN
+      ALLOCATE (mbathy(npiglo,npjglo))
+   ENDIF
+
+   IF ( lzoom ) THEN
+      ALLOCATE (rlon(npiglo,npjglo), rlat(npiglo,npjglo))
+      rlon(:,:) = getvar(cf_tfil, cn_vlon2d, 1, npiglo, npjglo)
+      rlat(:,:) = getvar(cf_tfil, cn_vlat2d, 1, npiglo, npjglo)
+   ENDIF
+
+   IF ( lzoombat ) THEN
+      IF ( chkfile(cn_fzgr) ) STOP ! missing file
+      ALLOCATE ( rbat  (npiglo,npjglo) )
+      rbat(:,:)= getvar(cn_fzgr, cn_hdepw,  1 ,npiglo, npjglo)
+   END IF
+
+   IF ( lmbathy ) THEN
+      mbathy(:,:) = getvar(cf_tfil, cv_mask, 1, npiglo, npjglo)
+   ENDIF
+
+   !! Now compute the mask 
+   DO jt=1, nt
+      IF (MOD(jt,10)==0) PRINT *,jt,'/',nt,' ...'
+      DO jk=1, npk
+         ! tmask
+         IF ( lmbathy ) THEN
+            tmask(:,:) = 1.
+            WHERE (mbathy < jk ) tmask = 0.
+         ELSE
+            tmask(:,:) = getvar(cf_tfil, cv_mask,  jk, npiglo, npjglo, ktime=jt)
+         ENDIF
+
+         IF ( lzoomvar ) THEN
+            zmask=tmask
+            WHERE ((tmask .GE. rvarmin) .AND. (tmask .LE. rvarmax)) zmask = 1
+            WHERE ((tmask .LT. rvarmin) .OR.  (tmask .GT. rvarmax)) zmask = 0
+            tmask=zmask
+         ELSE
+            WHERE (tmask > 0 ) tmask = 1
+            WHERE (tmask <=0 ) tmask = 0
+         ENDIF
+
+         IF ( lzoom ) THEN
+            IF (rlonmax > rlonmin) THEN
+               WHERE (rlon > rlonmax ) tmask = 0
+               WHERE (rlon < rlonmin ) tmask = 0
+            ELSE
+               WHERE (rlon < rlonmin .AND. rlon > rlonmax ) tmask = 0
+            END IF
+
+            WHERE (rlat > rlatmax ) tmask = 0
+            WHERE (rlat < rlatmin ) tmask = 0
+         ENDIF
+
+         IF ( lzoomij ) THEN
+            tmask(1:iimin-1,:     ) = 0   ! West
+            tmask(iimax+1:npiglo,:) = 0   ! East
+            tmask(:,ijmax+1:npjglo) = 0   ! North
+            tmask(:,1:ijmin-1     ) = 0   ! South
+         ENDIF
+
+         IF ( lzoombat ) THEN
+            WHERE (rbat < rbatmin .OR. rbat > rbatmax) tmask = 0
+         ENDIF
+
+         ierr       = putvar(ncout, id_varout(1), tmask, jk ,npiglo, npjglo, ktime=jt)
+         ! umask
+         zmask = 0.
+         DO ji=1,npiglo-1
+            DO jj=1,npjglo
+               zmask(ji,jj) = tmask(ji,jj)*tmask(ji+1,jj)
+            END DO
+         END DO
+         ierr       = putvar(ncout, id_varout(2), zmask, jk ,npiglo, npjglo, ktime=jt)
+         ! vmask
+         zmask=0.
+         DO ji=1,npiglo
+            DO jj=1,npjglo-1
+               zmask(ji,jj) = tmask(ji,jj)*tmask(ji,jj+1)
+            END DO
+         END DO
+         ierr       = putvar(ncout, id_varout(3), zmask, jk, npiglo, npjglo, ktime=jt)
+         !fmask
+         zmask=0.
+         DO ji=1,npiglo-1
+            DO jj=1,npjglo-1
+               zmask(ji,jj) = tmask(ji,jj)*tmask(ji,jj+1)*tmask(ji+1,jj)*tmask(ji+1,jj+1)
+            END DO
+         END DO
+         ierr       = putvar(ncout, id_varout(4), zmask, jk, npiglo, npjglo, ktime=jt)
+      END DO  ! loop to next level
+   END DO
+
+   tim(:) = 0.
+   ierr   = putvar1d(ncout, tim, nt,'T')
+   ierr   = closeout(ncout              )
+
+   PRINT *,''
+   PRINT *,'Mask file ',TRIM(cf_out),' has been created' 
+
 END PROGRAM cdfmkmask

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/cdftools.git



More information about the debian-science-commits mailing list