[cdftools] 191/228: JMM : add cdfbotpressure.f90

Alastair McKinstry mckinstry at moszumanska.debian.org
Fri Jun 12 08:21:48 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 a563e9a2fc973dacccdd4a521bcf2bac7a32909d
Author: molines <molines at 1055176f-818a-41d9-83e1-73fbe5b947c5>
Date:   Wed Jan 16 16:55:23 2013 +0000

    JMM : add cdfbotpressure.f90
    
    
    git-svn-id: http://servforge.legi.grenoble-inp.fr/svn/CDFTOOLS/trunk@639 1055176f-818a-41d9-83e1-73fbe5b947c5
---
 Makefile           |   5 +-
 cdfbotpressure.f90 | 206 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 210 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 815cb12..f7e42d3 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,7 @@ EXEC = cdfmoy cdfmoyt cdfstd  cdfmoy_weighted cdfmoy_freq cdfvT \
        cdfmoyuvwt \
        cdfeke cdfrmsssh cdfstdevw cdfstdevts cdflinreg cdfimprovechk\
        cdfstats \
-       cdfbn2 cdfrichardson cdfsig0 cdfsigi cdfsiginsitu cdfbottomsig cdfspice\
+       cdfbn2 cdfrichardson cdfsig0 cdfsigi cdfsiginsitu cdfbottomsig cdfbotpressure cdfspice\
        cdfbottom cdfets cdfokubo-w cdfcurl cdfw cdfgeo-uv cdfmxl \
        cdfrhoproj  cdfzisot cdfsigintegr cdfpvor \
        cdfmhst cdfvhst cdfvtrp cdftransport cdfvFWov \
@@ -123,6 +123,9 @@ cdfsiginsitu: cdfio.o  eos.o  cdfsiginsitu.f90
 cdfbottomsig: cdfio.o  eos.o  cdfbottomsig.f90
 	$(F90) cdfbottomsig.f90 -o $(BINDIR)/cdfbottomsig cdfio.o eos.o modcdfnames.o $(FFLAGS)
 
+cdfbotpressure: cdfio.o  eos.o modutils.o  cdfbotpressure.f90
+	$(F90) cdfbotpressure.f90 -o $(BINDIR)/cdfbotpressure cdfio.o eos.o modcdfnames.o modutils.o $(FFLAGS)
+
 cdfbottom: cdfio.o    cdfbottom.f90
 	$(F90) cdfbottom.f90 -o $(BINDIR)/cdfbottom cdfio.o  modcdfnames.o $(FFLAGS)
 
diff --git a/cdfbotpressure.f90 b/cdfbotpressure.f90
new file mode 100644
index 0000000..4a50025
--- /dev/null
+++ b/cdfbotpressure.f90
@@ -0,0 +1,206 @@
+PROGRAM cdfbotpressure
+   !!======================================================================
+   !!                     ***  PROGRAM  cdfbotpressure  ***
+   !!=====================================================================
+   !!  ** Purpose : Compute bottom pressure from insitu density
+   !!
+   !!  ** Method  : Vertical integral of rho g dz
+   !!               eventually takes into account the SSH, and full step
+   !!
+   !! History : 3.0  : 01/2013  : J.M. Molines   : Original code from cdfvint
+   !!----------------------------------------------------------------------
+   USE cdfio
+   USE eos
+   USE modcdfnames
+   USE modutils
+   !!----------------------------------------------------------------------
+   !! 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),             DIMENSION(1) :: ipk, id_varout      ! only one output variable
+   INTEGER(KIND=4)                           :: ncout 
+
+   REAL(KIND=4), PARAMETER                   :: pp_grav = 9.81      ! Gravity
+   REAL(KIND=4), PARAMETER                   :: pp_rau0 = 1035.e0   ! Reference density (as in NEMO)
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: e3t                 ! vertical metric
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: hdept               ! vertical metric
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: zt                  ! Temperature
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: zs                  ! Salinity
+   REAL(KIND=4), DIMENSION(:,:), ALLOCATABLE :: tmask               ! npiglo x npjglo
+   REAL(KIND=4), DIMENSION(:),   ALLOCATABLE :: gdepw               ! depth
+   REAL(KIND=4), DIMENSION(:),   ALLOCATABLE :: tim                 ! time counter
+   REAL(KIND=4), DIMENSION(:),   ALLOCATABLE :: e31d                ! vertical metrics in case of full step
+
+   REAL(KIND=8), DIMENSION(:,:), ALLOCATABLE :: dl_psurf            ! Surface pressure
+   REAL(KIND=8), DIMENSION(:,:), ALLOCATABLE :: dl_bpres            ! Bottom pressure
+   REAL(KIND=8), DIMENSION(:,:), ALLOCATABLE :: dl_sigi             ! insitu density
+
+   CHARACTER(LEN=256)                        :: cf_in, cf_out       ! input/output file
+   CHARACTER(LEN=256)                        :: cldum               ! dummy string for command line browsing
+   CHARACTER(LEN=256)                        :: cglobal            ! Global attribute
+
+   LOGICAL                                   :: lfull =.FALSE.      ! flag for full step computation
+   LOGICAL                                   :: lssh  =.FALSE.      ! Use ssh and cst surf. density in the bot pressure
+   LOGICAL                                   :: lssh2 =.FALSE.      ! Use ssh and variable surf.density in the bot pressure
+   LOGICAL                                   :: lchk  =.FALSE.      ! flag for missing files
+
+   TYPE(variable), DIMENSION(1)              :: stypvar             ! extension for attributes
+   !!----------------------------------------------------------------------
+   CALL ReadCdfNames()
+
+   narg= iargc()
+   IF ( narg == 0 ) THEN
+      PRINT *,' usage : cdfbotpressure T-file [-full] [-ssh] [-ssh2 ] '
+      PRINT *,'      '
+      PRINT *,'     PURPOSE :'
+      PRINT *,'          Compute the vertical bottom pressure (pa) from in situ density'
+      PRINT *,'      '
+      PRINT *,'     ARGUMENTS :'
+      PRINT *,'         T-file : gridT file holding either Temperature and  salinity '
+      PRINT *,'      '
+      PRINT *,'     OPTIONS :'
+      PRINT *,'        -full : for full step computation ' 
+      PRINT *,'        -ssh  : Also take SSH into account in the computation'
+      PRINT *,'                In this case, use rau0=',pp_rau0,' kg/m3 for '
+      PRINT *,'                surface density (as in NEMO)'
+      PRINT *,'                If you want to use 2d surface density from '
+      PRINT *,'                the model, use option -ssh2'
+      PRINT *,'        -ssh2 : as option -ssh but surface density is taken from '
+      PRINT *,'                the model instead of a constant'
+      PRINT *,'      '
+      PRINT *,'     REQUIRED FILES :'
+      PRINT *,'       ', TRIM(cn_fmsk),' and ', TRIM(cn_fzgr) 
+      PRINT *,'      '
+      PRINT *,'     OUTPUT : '
+      PRINT *,'       netcdf file :  botpressure.nc'
+      PRINT *,'         variables :  sobotpres'
+      PRINT *,'      '
+      PRINT *,'     SEE ALSO :'
+      PRINT *,'        cdfvint'
+      PRINT *,'      '
+      STOP
+   ENDIF
+
+   ! browse command line
+   ijarg = 1   ; ij = 0
+   DO WHILE ( ijarg <= narg ) 
+      CALL getarg (ijarg, cldum) ; ijarg = ijarg + 1
+      SELECT CASE ( cldum)
+      CASE ( '-ssh'  ) ; lssh  = .TRUE. 
+      CASE ( '-ssh2' ) ; lssh2 = .TRUE. 
+      CASE ( '-full' ) ; lfull = .TRUE. 
+      CASE DEFAULT     
+         ij = ij + 1
+         SELECT CASE ( ij)
+         CASE ( 1 ) ; cf_in = cldum
+         CASE DEFAULT ; PRINT *, ' ERROR: Too many arguments ! ' ; STOP
+         END SELECT
+      END SELECT
+   END DO
+   CALL SetGlobalAtt(cglobal)
+
+   ! Security check
+   lchk = chkfile ( cf_in   )
+   lchk = chkfile ( cn_fmsk ) .OR. lchk
+   lchk = chkfile ( cn_fzgr ) .OR. lchk
+   IF ( lchk ) STOP ! missing files
+
+   ! log information so far
+   cf_out = 'botpressure.nc'
+
+   npiglo = getdim (cf_in, cn_x )
+   npjglo = getdim (cf_in, cn_y )
+   npk    = getdim (cf_in, cn_z )
+   npt    = getdim (cf_in, cn_t )
+
+   PRINT *, ' NPIGLO = ', npiglo
+   PRINT *, ' NPJGLO = ', npjglo
+   PRINT *, ' NPK    = ', npk
+   PRINT *, ' NPT    = ', npt
+
+   ! Allocate arrays
+   ALLOCATE ( tim(npt) )
+   ALLOCATE ( tmask(npiglo,npjglo) )
+   ALLOCATE ( zt(npiglo,npjglo)  )
+   ALLOCATE ( zs(npiglo,npjglo)  )
+   ALLOCATE ( e3t(npiglo,npjglo) )
+   ALLOCATE ( hdept(npiglo,npjglo) )
+   ALLOCATE ( e31d(npk)   )
+   ALLOCATE ( gdepw(npk)) 
+
+   ALLOCATE ( dl_bpres(npiglo, npjglo))
+   ALLOCATE ( dl_psurf(npiglo, npjglo))
+   ALLOCATE ( dl_sigi(npiglo, npjglo))
+
+   ! prepare output variable
+   ipk(:)                       = 1
+   stypvar(1)%cname             = 'sobotpres'
+   stypvar(1)%cunits            = 'Pascal'
+   stypvar(1)%rmissing_value    = 0.
+   stypvar(1)%valid_min         = 0
+   stypvar(1)%valid_max         =  1.e15
+   stypvar(1)%clong_name        = 'Bottom Pressure'
+   stypvar(1)%cshort_name       = 'sobotpres'
+   stypvar(1)%conline_operation = 'N/A'
+   stypvar(1)%caxis             = 'TYX'
+
+   ! Initialize output file
+   gdepw(:) = getvare3(cn_fzgr, cn_gdepw, npk )
+   e31d(:)  = getvare3(cn_fzgr, cn_ve3t,  npk )
+
+   ncout = create      (cf_out, cf_in, npiglo, npjglo, 1                    )
+   ierr  = createvar   (ncout, stypvar, 1, ipk, id_varout, cdglobal=cglobal )
+   ierr  = putheadervar(ncout, cf_in,   npiglo, npjglo, 1                   )
+
+   tim   = getvar1d    (cf_in, cn_vtimec, npt     )
+   ierr  = putvar1d    (ncout, tim,       npt, 'T')
+
+   PRINT *, 'Output files initialised ...'
+
+   DO jt = 1, npt
+      IF ( lssh ) THEN
+        zt(:,:)       = getvar(cf_in, cn_sossheig, 1, npiglo, npjglo           )
+        dl_psurf(:,:) = pp_grav * pp_rau0 * zt(:,:)
+      ELSE IF ( lssh2 ) THEN 
+         zt(:,:)    = getvar(cf_in,   cn_votemper, 1, npiglo, npjglo, ktime=jt )
+         zs(:,:)    = getvar(cf_in,   cn_vosaline, 1, npiglo, npjglo, ktime=jt )
+     
+         dl_sigi(:,:) = 1000. + sigmai(zt, zs, 0., npiglo, npjglo)
+
+         !  CAUTION : hdept is used for reading SSH in the next line 
+         hdept(:,:)   = getvar(cf_in, cn_sossheig, 1, npiglo, npjglo           )
+        dl_psurf(:,:) = pp_grav * dl_sigi * hdept(:,:)
+      ELSE
+        dl_psurf(:,:)=0.d0
+      ENDIF
+
+      dl_bpres(:,:) = dl_psurf(:,:)
+
+      DO jk = 1, npk
+         tmask(:,:) = getvar(cn_fmsk, 'tmask',      jk, npiglo, npjglo           )
+         hdept(:,:) = getvar(cn_fzgr, cn_hdept,     jk, npiglo, npjglo           )
+         zt(:,:)    = getvar(cf_in,   cn_votemper,  jk, npiglo, npjglo, ktime=jt )
+         zs(:,:)    = getvar(cf_in,   cn_vosaline,  jk, npiglo, npjglo, ktime=jt )
+     
+         dl_sigi(:,:) = 1000. + sigmai(zt, zs, hdept, npiglo, npjglo)
+         IF ( lfull ) THEN ; e3t(:,:) = e31d(jk)
+                      ELSE ; e3t(:,:) = getvar(cn_fzgr, 'e3t_ps', jk, npiglo, npjglo, ldiom=.TRUE.)
+         ENDIF
+         dl_bpres(:,:) = dl_bpres(:,:) + dl_sigi(:,:) * e3t(:,:) * pp_grav * 1.d0 * tmask(:,:) 
+
+      END DO  ! loop to next level
+         ierr = putvar(ncout, id_varout(1) ,REAL(dl_bpres), 1, npiglo, npjglo, ktime=jt)
+   END DO  ! next time frame
+
+   ierr = closeout(ncout)
+
+END PROGRAM cdfbotpressure

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