[cdftools] 183/228: JMM : add cdfvint in CDFTOOLS_3.O norm. Contribution from M.A Balmaseda

Alastair McKinstry mckinstry at moszumanska.debian.org
Fri Jun 12 08:21:47 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 0cdaac7b49ba83ac4ecd67ecf129451bb0aac985
Author: molines <molines at 1055176f-818a-41d9-83e1-73fbe5b947c5>
Date:   Sun Nov 4 00:28:38 2012 +0000

    JMM : add cdfvint in CDFTOOLS_3.O norm. Contribution from M.A Balmaseda
    
    
    git-svn-id: http://servforge.legi.grenoble-inp.fr/svn/CDFTOOLS/trunk@631 1055176f-818a-41d9-83e1-73fbe5b947c5
---
 Makefile    |   5 +-
 cdfvint.f90 | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 249 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 761e0f1..815cb12 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,7 @@ EXEC = cdfmoy cdfmoyt cdfstd  cdfmoy_weighted cdfmoy_freq cdfvT \
        cdfsigtrp cdftempvol-full\
        cdfpsi cdfmoc  cdfmocsig cdfmean \
        cdfheatc cdfzonalmean cdfhflx cdfwflx cdfbuoyflx\
-       cdfmxlheatc cdfmxlsaltc cdfmxlhcsc cdfvertmean\
+       cdfmxlheatc cdfmxlsaltc cdfmxlhcsc cdfvertmean cdfvint \
        cdfpendep cdfzonalsum cdficediags cdfzonalout\
        cdfprofile  cdfwhereij cdffindij cdfweight cdfmaxmoc cdfcensus cdfzoom cdfmax cdfprobe cdfinfo \
        cdf16bit cdfvita cdfvita-geo cdfconvert cdfflxconv cdfclip cdfsstconv cdfstrconv cdfbathy cdfvar \
@@ -247,6 +247,9 @@ cdfsum: cdfio.o  cdfsum.f90
 cdfvertmean: cdfio.o  modutils.o cdfvertmean.f90
 	$(F90) cdfvertmean.f90 -o $(BINDIR)/cdfvertmean cdfio.o modcdfnames.o modutils.o $(FFLAGS)
 
+cdfvint: cdfio.o  modutils.o cdfvint.f90
+	$(F90) cdfvint.f90 -o $(BINDIR)/cdfvint cdfio.o modcdfnames.o modutils.o $(FFLAGS)
+
 cdfheatc: cdfio.o modutils.o cdfheatc.f90
 	$(F90) cdfheatc.f90 -o $(BINDIR)/cdfheatc cdfio.o modcdfnames.o modutils.o $(FFLAGS)
 
diff --git a/cdfvint.f90 b/cdfvint.f90
new file mode 100644
index 0000000..bccede6
--- /dev/null
+++ b/cdfvint.f90
@@ -0,0 +1,245 @@
+PROGRAM cdfvint
+   !!======================================================================
+   !!                     ***  PROGRAM  cdfvint  ***
+   !!=====================================================================
+   !!  ** Purpose : Compute vertically integrated temperature or salinity.
+   !!
+   !!  ** Method  : Compute the integral from top to bottom and save 
+   !!               cumulated values. For temperature, cumulated values are
+   !!               transformed to heat content (J.K.m^-2). For salinity
+   !!               they are saved as PSU.m
+   !!
+   !! History : 2.1  : 10/2012  : M.A. Balmaseda : Original code from cdfmxlhc
+   !!           3.0  : 11/2012  : J.M. Molines   : Doctor norm + Lic + ...
+   !!----------------------------------------------------------------------
+   USE cdfio
+   USE modcdfnames
+   !!----------------------------------------------------------------------
+   !! CDFTOOLS_3.0 , MEOM 2012
+   !! $Id$
+   !! Copyright (c) 2012, J.-M. Molines
+   !! Software governed by the CeCILL licence (Licence/CDFTOOLSCeCILL.txt)
+   !!----------------------------------------------------------------------
+   IMPLICIT NONE
+
+   INTEGER(KIND=4)                           :: jk, jt              ! dummy loop index
+   INTEGER(KIND=4)                           :: ierr, ij, iko       ! working integer
+   INTEGER(KIND=4)                           :: narg, iargc, ijarg  ! command line 
+   INTEGER(KIND=4)                           :: npiglo, npjglo      ! size of the domain
+   INTEGER(KIND=4)                           :: npk, npt            ! size of the domain
+   INTEGER(KIND=4)                           :: npko                ! size of the domain
+   INTEGER(KIND=4),             DIMENSION(1) :: ipk, id_varout      ! only one output variable
+   INTEGER(KIND=4)                           :: ncout 
+
+   REAL(KIND=4), PARAMETER                   :: pprho0 = 1020.     ! water density (kg/m3)
+   REAL(KIND=4), PARAMETER                   :: ppcp   = 4000.     ! calorific capacity (J/kg/m3)
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: e3t                 ! vertical metric
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: zt                  ! working input variable
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: tmask               ! npiglo x npjglo
+   REAL(KIND=4), DIMENSION(:),   ALLOCATABLE :: gdepw               ! depth
+   REAL(KIND=4), DIMENSION(:),   ALLOCATABLE :: gdepo               ! output depth 
+   REAL(KIND=4), DIMENSION(:),   ALLOCATABLE :: tim                 ! time counter
+   REAL(KIND=4), DIMENSION(:),   ALLOCATABLE :: e31d                ! vertical metrics in case of full step
+   REAL(KIND=4)                              :: rdep1, rdep2        ! depth counters
+   REAL(KIND=4)                              :: tol  = 1.0             ! tolerance 
+   REAL(KIND=4)                              :: sclf = 1.0            ! scale factor
+
+   REAL(KIND=8), DIMENSION(:,:), ALLOCATABLE :: dl_vint1, dl_vint2  ! verticall int quantity         
+
+   CHARACTER(LEN=256)                        :: cf_in, cf_out       ! input/output file
+   CHARACTER(LEN=256)                        :: cv_in, cv_out       ! variable name in and out
+   CHARACTER(LEN=256)                        :: cunits, clongname   ! variable attributes
+   CHARACTER(LEN=256)                        :: cldum               ! dummy string for command line browsing
+
+   LOGICAL                                   :: lfull =.FALSE.      ! flag for full step computation
+   LOGICAL                                   :: lgsop =.FALSE.      ! selected depths gsop intercomparison
+   LOGICAL                                   :: lchk  =.FALSE.      ! flag for missing files
+   LOGICAL                                   :: lout                ! check for output
+
+   TYPE(variable), DIMENSION(1)              :: stypvar             ! extension for attributes
+   !!----------------------------------------------------------------------
+   CALL ReadCdfNames()
+
+   narg= iargc()
+   IF ( narg == 0 ) THEN
+      PRINT *,' usage : cdfvint T-file [IN-var] [-GSOP] [-full] '
+      PRINT *,'      '
+      PRINT *,'     PURPOSE :'
+      PRINT *,'          Compute the vertical integral of the variable from top '
+      PRINT *,'       to bottom, and save the cumulated valued, level by level.'
+      PRINT *,'       For temperature (default var), the integral is transformed'
+      PRINT *,'       to Heat Content ( J.K. m^-2) hence for salinity, the integral'
+      PRINT *,'       represents PSU.m '
+      PRINT *,'      '
+      PRINT *,'     ARGUMENTS :'
+      PRINT *,'         T-file : gridT file holding either Temperature or salinity '
+      PRINT *,'        [IN-var ] : name of input variable to process. Default is '
+      PRINT *,'               ', TRIM(cn_votemper),'. Can also be ',TRIM(cn_vosaline)
+      PRINT *,'      '
+      PRINT *,'     OPTIONS :'
+      PRINT *,'        -GSOP : Use 7 GSOP standard level for the output '
+      PRINT *,'                Default is to take the model levels for the output'
+      PRINT *,'        -full : for full step computation ' 
+      PRINT *,'      '
+      PRINT *,'     REQUIRED FILES :'
+      PRINT *,'       ', TRIM(cn_fmsk),', ',TRIM(cn_fhgr),' and ', TRIM(cn_fzgr) 
+      PRINT *,'      '
+      PRINT *,'     OUTPUT : '
+      PRINT *,'       netcdf file :  VAR-name.nc'
+      PRINT *,'         variables :  either voheatc or vohsalt'
+      PRINT *,'      '
+      PRINT *,'     SEE ALSO :'
+      PRINT *,'        cdfvertmean, cdfheatc, cdfmxlhcsc and  cdfmxlheatc'
+      PRINT *,'      '
+      STOP
+   ENDIF
+
+   ! default values
+   cv_in = cn_votemper
+
+   ! browse command line
+   ijarg = 1   ; ij = 0
+   DO WHILE ( ijarg <= narg ) 
+      CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1
+      SELECT CASE ( cldum)
+      CASE ( '-GSOP' ) ; lgsop = .TRUE. 
+      CASE ( '-full' ) ; lfull = .TRUE. 
+      CASE DEFAULT     
+         ij = ij + 1
+         SELECT CASE ( ij)
+         CASE ( 1 ) ; cf_in = cldum
+         CASE ( 2 ) ; cv_in = cldum
+         CASE DEFAULT ; PRINT *, ' ERROR: Too many arguments ! ' ; STOP
+         END SELECT
+      END SELECT
+   END DO
+
+   ! Security check
+   lchk = chkfile ( cf_in   )
+   lchk = chkfile ( cn_fmsk ) .OR. lchk
+   lchk = chkfile ( cn_fhgr ) .OR. lchk
+   lchk = chkfile ( cn_fzgr ) .OR. lchk
+   IF ( lchk ) STOP ! missing files
+
+   ! Set output information according to variable name
+   IF ( cv_in == cn_votemper ) THEN
+      cv_out    = 'voheatc'
+      clongname = 'Heat Content per unit area'
+      cunits    = 'J Km^-2'
+      sclf      = pprho0*ppcp/1.e6
+   ELSEIF ( cv_in == cn_vosaline ) THEN
+      cv_out    = 'vohsalt'
+      clongname = 'Vertically Integrated Salinity'
+      cunits    = 'psu*m'
+      sclf      =1.
+   ELSE
+      PRINT *,'  ERROR: Variable ', TRIM(cv_in), ' not pre-defined ...'
+      PRINT *,'     Accepted variables are ', TRIM(cn_votemper),' and ',TRIM(cn_vosaline)
+      STOP
+   ENDIF
+
+   ! log information so far
+   cf_out = TRIM(cv_out)//'.nc'
+   PRINT *,' INPUT VARIABLE  : ' , TRIM(cv_in)
+   PRINT *,' OUTPUT VARIABLE : ' , TRIM(cv_out)
+   PRINT *,' OUTPUT FILE     : ' , TRIM(cf_out)
+
+   npiglo = getdim (cf_in, cn_x )
+   npjglo = getdim (cf_in, cn_y )
+   npk    = getdim (cf_in, cn_z )
+   npt    = getdim (cf_in, cn_t )
+
+   IF ( lgsop ) THEN ; PRINT *,' using GSOP depths' ; npko = 7
+                ELSE ; PRINT *,' using model depths'; npko = npk
+   ENDIF
+
+   PRINT *, ' NPIGLO = ', npiglo
+   PRINT *, ' NPJGLO = ', npjglo
+   PRINT *, ' NPK    = ', npk
+   PRINT *, ' NPKO   = ', npko
+   PRINT *, ' NPT    = ', npt
+
+   ! Allocate arrays
+   ALLOCATE ( tim(npt) )
+   ALLOCATE ( tmask(npiglo,npjglo) )
+   ALLOCATE ( zt(npiglo,npjglo)  )
+   ALLOCATE ( e3t(npiglo,npjglo) )
+   ALLOCATE ( e31d(npk)   )
+   ALLOCATE ( gdepw(npk), gdepo(npko) ) 
+
+   ALLOCATE ( dl_vint1(npiglo, npjglo), dl_vint2(npiglo,npjglo) )
+
+   ! prepare output variable
+   ipk(:)                       = npko
+   stypvar(1)%cname             = TRIM(cv_out)
+   stypvar(1)%cunits            = TRIM(cunits)
+   stypvar(1)%rmissing_value    = 0.
+   stypvar(1)%valid_min         = -1.e15
+   stypvar(1)%valid_max         =  1.e15
+   stypvar(1)%clong_name        = TRIM(clongname)
+   stypvar(1)%cshort_name       = TRIM(cv_out)
+   stypvar(1)%conline_operation = 'N/A'
+   stypvar(1)%caxis             = 'TZYX'
+
+   ! Initialize output file
+   gdepw(:) = getvare3(cn_fzgr, cn_gdepw, npk )
+   e31d(:)  = getvare3(cn_fzgr, cn_ve3t,  npk )
+
+   IF ( lgsop ) THEN
+      gdepo(:) = (/100.,300.,700.,1500.,3000.,4000.,6000./)
+   ELSE  
+      gdepo(1:npk-1) = gdepw(2:npk)
+      gdepo(npk)     = 6000.
+   ENDIF
+
+   PRINT*,'OUTPUT DEPTHS ARE : ',gdepo
+   ncout = create      (cf_out, 'none', npiglo, npjglo, npko, cdep=cn_vdepthw, ld_xycoo=.FALSE.)
+   ierr  = createvar   (ncout, stypvar, 1, ipk, id_varout )
+   ierr  = putheadervar(ncout, cf_in,   npiglo, npjglo, npko, pdep=gdepo,     ld_xycoo=.FALSE.)
+
+   tim   = getvar1d    (cf_in, cn_vtimec, npt     )
+   ierr  = putvar1d    (ncout, tim,       npt, 'T')
+
+   PRINT *, 'Output files initialised ...'
+
+   DO jt = 1, npt
+      dl_vint1(:,:) = 0.d0
+      iko  = 1
+      rdep1 = 0.0 ; rdep2 = 0.0
+      lout = .TRUE.
+      DO jk = 1, npk
+         IF ( lgsop ) lout = .FALSE.
+         rdep1          = rdep2
+         dl_vint2(:,:) = dl_vint1 (:,:)
+
+         tmask(:,:)= getvar(cn_fmsk, 'tmask', jk, npiglo, npjglo           )
+         zt(:,:)   = getvar(cf_in,   cv_in,   jk, npiglo, npjglo, ktime=jt )
+         IF ( lfull ) THEN ; e3t(:,:) = e31d(jk)
+                      ELSE ; e3t(:,:) = getvar(cn_fzgr, 'e3t_ps', jk, npiglo, npjglo, ldiom=.TRUE.)
+         ENDIF
+
+         rdep2 = rdep1 + e31d(jk)
+         dl_vint1(:,:) = dl_vint1(:,:)+ zt(:,:)*e3t(:,:)*tmask(:,:)*1.d0
+
+         IF ( rdep2 >= (gdepo(iko) - tol ) ) THEN
+            lout=.TRUE.
+            !modify vertical thickness for output
+            WHERE (e3t(:,:) >  gdepo(iko) - rdep1 ) e3t(:,:) = gdepo(iko)-rdep1
+            dl_vint2(:,:) = dl_vint2(:,:)+ zt(:,:)*e3t(:,:)*tmask(:,:)*1.d0
+         ENDIF
+
+         IF ( lout ) THEN
+            dl_vint2(:,:) = dl_vint2(:,:) * sclf
+            IF (jt == 1 ) THEN
+               PRINT *,'Output for level ',iko
+               PRINT *,'rdep1, rdep2, depo ',rdep1,rdep2,gdepo(iko) 
+            ENDIF
+            ierr = putvar(ncout, id_varout(1) ,REAL(dl_vint2), iko, npiglo, npjglo, ktime=jt)
+            iko = iko + 1
+         ENDIF
+      END DO  ! loop to next level
+   END DO  ! next time frame
+
+   ierr = closeout(ncout)
+
+END PROGRAM cdfvint

-- 
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