[cdftools] 119/228: JD+JMM : first commit of Julie's tool in CDFTOOLS 3.0 -- cleaning of native NF90 calls required --
Alastair McKinstry
mckinstry at moszumanska.debian.org
Fri Jun 12 08:21:38 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 712bbc19e526f239aa74e25a2370ebfef9d90965
Author: molines <molines at 1055176f-818a-41d9-83e1-73fbe5b947c5>
Date: Thu Dec 29 12:23:36 2011 +0000
JD+JMM : first commit of Julie's tool in CDFTOOLS 3.0 -- cleaning of native NF90 calls required --
git-svn-id: http://servforge.legi.grenoble-inp.fr/svn/CDFTOOLS/trunk@566 1055176f-818a-41d9-83e1-73fbe5b947c5
---
Makefile | 3 +
cdfvFWov.f90 | 261 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 264 insertions(+)
diff --git a/Makefile b/Makefile
index ac94a03..11f5a9a 100644
--- a/Makefile
+++ b/Makefile
@@ -187,6 +187,9 @@ cdfpsi_level: cdfio.o cdfpsi_level.f90
cdftransport: cdfio.o modutils.o cdftransport.f90
$(F90) cdftransport.f90 -o $(BINDIR)/cdftransport cdfio.o modcdfnames.o modutils.o $(FFLAGS)
+cdfvFWov: cdfio.o modutils.o cdfvFWov.f90
+ $(F90) cdfvFWov.f90 -o $(BINDIR)/cdfvFWov cdfio.o modcdfnames.o modutils.o $(FFLAGS)
+
cdfsigtrp: cdfio.o eos.o modutils.o cdfsigtrp.f90
$(F90) cdfsigtrp.f90 -o $(BINDIR)/cdfsigtrp cdfio.o eos.o modcdfnames.o modutils.o $(FFLAGS)
diff --git a/cdfvFWov.f90 b/cdfvFWov.f90
new file mode 100644
index 0000000..a85a359
--- /dev/null
+++ b/cdfvFWov.f90
@@ -0,0 +1,261 @@
+PROGRAM cdfvFWov
+ !!-------------------------------------------------------------------
+ !!======================================================================
+ !! *** PROGRAM cdfvFWov ***
+ !!=====================================================================
+ !! ** Purpose : from a section calculate net freshwater transport and its
+ !! overturning component
+ !! section is assumed to be 2 j lines (j and j+1)
+ !!
+ !! ** Method : compute salinity at v point
+ !! compute zonal mean of salinity-vpt and v velocity
+ !! compute total freshwater transport and overturning component
+ !!
+ !! History : 2.1 : 12/2011 : J. Deshayes : Original code
+ !! 3.0 : 12/2011 : J.M. Molines : Port to 3.0
+ !!----------------------------------------------------------------------
+ USE cdfio
+ USE modcdfnames
+ USE netcdf ! to be eliminated
+ !!----------------------------------------------------------------------
+ !! 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) :: varid_time, varid_net, varid_tot, varid_ov
+ INTEGER(KIND=4) :: dimid_time
+ INTEGER(KIND=4) :: ncin, ncout
+
+ INTEGER(KIND=4) :: narg, iargc
+ INTEGER(KIND=4) :: npt, npiglo, npjglo, npk
+ INTEGER(KIND=4) :: ji, jk, jt
+ INTEGER(KIND=4) :: istatus
+
+ REAL(KIND=4), DIMENSION (:,:), ALLOCATABLE :: rmasks, rmaskn, rmaskv
+ REAL(KIND=4), DIMENSION (:,:), ALLOCATABLE :: zsaln, zsals
+ REAL(KIND=4), DIMENSION (:,:), ALLOCATABLE :: zsalv, zvitv
+ REAL(KIND=4), DIMENSION (:,:), ALLOCATABLE :: zFWv
+
+ REAL(KIND=8), DIMENSION (:,:), ALLOCATABLE :: de3v
+ REAL(KIND=8), DIMENSION (:,:), ALLOCATABLE :: de1v
+ REAL(KIND=8), DIMENSION (:), ALLOCATABLE :: dnetvFW, dtotvFW
+ REAL(KIND=8), DIMENSION (:), ALLOCATABLE :: dovFW, dtime
+ REAL(KIND=8), DIMENSION (1) :: dnetv, dnetFW
+ REAL(KIND=8), DIMENSION (1) :: darea, dareak
+ REAL(KIND=8), DIMENSION (1) :: dzonalv, dzonalFW
+ REAL(KIND=8) :: dztrp, dcellarea
+ REAL(KIND=8), PARAMETER :: dp_rsal=35.d0 ! reference salinity for freshwater calculation
+
+ CHARACTER(LEN=256) :: cf_vfil
+ CHARACTER(LEN=256) :: cf_sfil
+ CHARACTER(LEN=256) :: cf_zgr
+ CHARACTER(LEN=256) :: cf_hgr
+ CHARACTER(LEN=256) :: cf_mask
+ CHARACTER(LEN=256) :: cf_out = 'vFWov.nc'
+ CHARACTER(LEN=256) :: cv_netvFW = 'netvFW'
+ CHARACTER(LEN=256) :: cv_totvFW = 'totvFW'
+ CHARACTER(LEN=256) :: cv_ovFW = 'ovFW'
+
+ TYPE (variable), DIMENSION(4) :: stypvar
+
+ LOGICAL :: lchk = .FALSE.
+ !!----------------------------------------------------------------------
+ CALL ReadCdfNames()
+
+ !! Read command line
+ narg= iargc()
+ IF ( narg == 0 ) THEN
+ PRINT *,' usage : cdfvFWov V-secfile S-secfile ZGR-secfile HGR-secfile MSK-secfile'
+ PRINT *,' PURPOSE :'
+ PRINT *,' Compute the fresh water transport and its overturning component through'
+ PRINT *,' a section specified by the input files (data and metrics).'
+ PRINT *,' '
+ PRINT *,' ARGUMENTS :'
+ PRINT *,' All arguments are ''section file'', which are assumed to be files with'
+ PRINT *,' 2 zonal lines of data ( j and j+1). '
+ PRINT *,' V_secfile : meridional velocity section file.'
+ PRINT *,' S_secfile : salinity section file.'
+ PRINT *,' ZGR_secfile : mesh_zgr section file '
+ PRINT *,' HGR_secfile : mesh_hgr section file '
+ PRINT *,' MSK_secfile : mask section file '
+ PRINT *,' '
+ PRINT *,' REQUIRED FILES :'
+ PRINT *,' none'
+ PRINT *,' '
+ PRINT *,' OUTPUT : '
+ PRINT *,' netcdf file : ', TRIM(cf_out)
+ PRINT *,' variables : ',TRIM(cv_netvFW),', ',TRIM(cv_totvFW),', ',TRIM(cv_ovFW)
+ STOP
+ ENDIF
+
+ !! get arguments
+ CALL getarg (1, cf_vfil)
+ CALL getarg (2, cf_sfil)
+ CALL getarg (3, cf_zgr )
+ CALL getarg (4, cf_hgr )
+ CALL getarg (5, cf_mask)
+
+ lchk = lchk .OR. chkfile ( cf_vfil )
+ lchk = lchk .OR. chkfile ( cf_sfil )
+ lchk = lchk .OR. chkfile ( cf_zgr )
+ lchk = lchk .OR. chkfile ( cf_hgr )
+ lchk = lchk .OR. chkfile ( cf_mask )
+
+ IF ( lchk ) STOP ! missing files
+
+ !! get dimensions of input file containing data
+ npiglo = getdim(cf_vfil, cn_x)
+ npjglo = getdim(cf_vfil, cn_y)
+ npk = getdim(cf_vfil, cn_z)
+ npt = getdim(cf_vfil, cn_t)
+
+ PRINT *, 'npiglo =', npiglo
+ PRINT *, 'npjglo =', npjglo
+ PRINT *, 'npk =', npk
+ PRINT *, 'npt =', npt
+
+ IF ( npjglo /= 2 ) THEN
+ PRINT *,' ERROR : This program works with section files.'
+ PRINT *,' all data should have j dimension equal to 2 '
+ STOP
+ ENDIF
+
+ ALLOCATE( dnetvFW(npt), dtotvFW(npt), dovFW(npt), dtime(npt) )
+ ALLOCATE( de1v(npiglo,npjglo), de3v(npiglo,npk))
+ ALLOCATE( zFWv(npiglo,npk), zvitv(npiglo,npk) )
+ ALLOCATE( zsals(npiglo,npk), zsaln(npiglo,npk), zsalv(npiglo,npk) )
+ ALLOCATE( rmasks(npiglo,npk), rmaskn(npiglo,npk), rmaskv(npiglo,npk))
+
+ !! load data
+ dtime = getvar1d(cf_vfil, cn_vtimec, npt)
+
+ !! define output variables
+ stypvar%rmissing_value = 0.
+ stypvar%valid_min = -1000.
+ stypvar%valid_max = 1000.
+ stypvar%conline_operation = 'N/A'
+ stypvar%caxis = 'T'
+ stypvar%scale_factor = 1.
+ stypvar%add_offset = 0.
+ stypvar%savelog10 = 0.
+
+ stypvar(1)%cname = TRIM(cv_netvFW )
+ stypvar(2)%cname = TRIM(cv_totvFW )
+ stypvar(3)%cname = TRIM(cv_ovFW )
+
+ stypvar(1)%cunits ='Sv'
+ stypvar(2)%cunits ='Sv'
+ stypvar(3)%cunits ='Sv'
+
+ stypvar(1)%clong_name = 'Net_VFW'
+ stypvar(2)%clong_name = 'Total_VFW'
+ stypvar(3)%clong_name = 'Overturning_VFW'
+
+ stypvar(1)%cshort_name = TRIM(cv_netvFW )
+ stypvar(2)%cshort_name = TRIM(cv_totvFW )
+ stypvar(3)%cshort_name = TRIM(cv_ovFW )
+
+
+ !! load scale factors
+ rmasks(:,:) = getvarxz(cf_mask, 'tmask', kj=1, kpi=npiglo, kpz=npk, kimin=1, kkmin=1)
+ rmaskn(:,:) = getvarxz(cf_mask, 'tmask', kj=2, kpi=npiglo, kpz=npk, kimin=1, kkmin=1)
+ rmaskv(:,:) = getvarxz(cf_mask, 'vmask', kj=1, kpi=npiglo, kpz=npk, kimin=1, kkmin=1)
+ de1v(:,:) = getvar (cf_hgr, cn_ve1v, klev=1, kpi=npiglo, kpj=npjglo, kimin=1, kjmin=1)
+ de3v(:,:) = getvarxz(cf_zgr, 'e3v', kj=1, kpi=npiglo, kpz=npk, kimin=1, kkmin=1)
+
+ WHERE ( rmasks /= 0. ) rmasks = 1.
+ WHERE ( rmaskn /= 0. ) rmaskn = 1.
+ WHERE ( rmaskv /= 0. ) rmaskv = 1.
+
+ !! do calculation for each time step
+ DO jt=1,npt
+ PRINT *,'jt =',jt
+ ! reset cumulative arrays to 0
+ zFWv(:,:) = 0.e0
+ dnetv = 0.d0 ; dnetFW = 0.d0
+ darea = 0.d0
+ dnetvFW(jt) = 0.d0 ; dtotvFW(jt) = 0.d0 ; dovFW(jt) = 0.d0
+
+ zvitv(:,:)= getvarxz(cf_vfil, cn_vomecrty, kj=1, kpi=npiglo, kpz=npk, kimin=1, kkmin=1, ktime=jt)
+ zsals(:,:)= getvarxz(cf_sfil, cn_vosaline, kj=1, kpi=npiglo, kpz=npk, kimin=1, kkmin=1, ktime=jt)
+ zsaln(:,:)= getvarxz(cf_sfil, cn_vosaline, kj=2, kpi=npiglo, kpz=npk, kimin=1, kkmin=1, ktime=jt)
+
+ DO jk = 1, npk
+ DO ji = 1, npiglo
+ IF ( rmasks(ji,jk) + rmaskn(ji,jk) /= 0 ) THEN
+ zFWv(ji,jk) = ( dp_rsal - ( zsals(ji,jk) * rmasks(ji,jk) + zsaln(ji,jk) * rmaskn(ji,jk) ) &
+ & / ( rmasks(ji,jk) + rmaskn(ji,jk) ) ) / dp_rsal ! freshwater at Vpoint
+ ENDIF
+ dcellarea = de1v(ji,1) * de3v(ji,jk) * rmaskv(ji,jk)
+ dztrp = zvitv(ji,jk) * dcellarea
+ dnetvFW(jt) = dnetvFW(jt) + zFWv(ji,jk) * dztrp /1.d6 ! net freshwater transport in Sv
+ dnetv = dnetv + dztrp
+ dnetFW = dnetFW + zFWv(ji,jk) * dcellarea
+ darea = darea + dcellarea
+ END DO !ji
+ END DO !jk
+
+ PRINT *,'total mass transport across section =', dnetv / 1.d6,' Sv'
+
+ dnetv = dnetv / darea ! mean velocity across section
+ dnetFW = dnetFW / darea ! mean freshwater along section
+ PRINT *,'mean salinity along section =', dp_rsal - dnetFW * dp_rsal,' psu'
+
+ DO jk = 1, npk
+ dzonalv = 0.d0
+ dzonalFW = 0.d0
+ dareak = 0.d0
+ DO ji = 1, npiglo
+ dcellarea = de1v(ji,1) * de3v(ji,jk) * rmaskv(ji,jk)
+ dzonalv = dzonalv + ( zvitv(ji,jk) - dnetv ) * dcellarea
+ dzonalFW = dzonalFW + ( zFWv(ji,jk) - dnetFW ) * dcellarea
+ dareak = dareak + dcellarea
+
+ dtotvFW(jt) = dtotvFW(jt) + ( zvitv(ji,jk) - dnetv(1) ) * zFWv(ji,jk) * dcellarea /1.d6
+ END DO !ji
+
+ IF ( dareak(1) > 0 ) THEN
+ ! overturning freshwater transport in Sv
+ dovFW(jt) = dovFW(jt) + dzonalv(1) * dzonalFW(1) / dareak(1) /1.d6
+ ENDIF
+ END DO !jk
+
+ PRINT *,'netvFW = ', dnetvFW(jt), ' Sv'
+ PRINT *,'totvFW = ', dtotvFW(jt), ' Sv'
+ PRINT *,'ovFW = ', dovFW(jt), ' Sv'
+
+ END DO !jt
+
+ !! create output file
+ istatus = NF90_CREATE(cf_out, NF90_CLOBBER, ncout)
+ istatus = NF90_DEF_DIM(ncout, cn_vtimec, NF90_UNLIMITED, dimid_time)
+ istatus = NF90_OPEN(cf_vfil, NF90_NOWRITE, ncin)
+ istatus = NF90_DEF_VAR(ncout, cn_vtimec, NF90_FLOAT, (/dimid_time/), varid_time)
+ istatus = copyatt(cn_vtimec, varid_time, ncin, ncout)
+ istatus = closeout(ncin)
+ istatus = NF90_DEF_VAR(ncout, 'netvFW', NF90_FLOAT, (/dimid_time/), varid_net)
+ istatus = NF90_PUT_ATT(ncout, varid_net, 'units', 'Sv')
+ istatus = NF90_PUT_ATT(ncout, varid_net, 'long_name', 'Net transport of freshwater across section')
+ istatus = NF90_PUT_ATT(ncout, varid_net, 'comment', 'Reference salinity 35.0, transport is positive northward')
+ istatus = NF90_DEF_VAR(ncout, 'totvFW', NF90_FLOAT, (/dimid_time/), varid_tot)
+ istatus = NF90_PUT_ATT(ncout, varid_tot, 'units', 'Sv')
+ istatus = NF90_PUT_ATT(ncout, varid_tot, 'long_name', 'Transport of freshwater across section when net mass transport equals 0')
+ istatus = NF90_PUT_ATT(ncout, varid_tot, 'comment', 'Reference salinity 35.0, transport is positive northward')
+ istatus = NF90_DEF_VAR(ncout, 'ovFW', NF90_FLOAT, (/dimid_time/), varid_ov)
+ istatus = NF90_PUT_ATT(ncout, varid_ov, 'units', 'Sv')
+ istatus = NF90_PUT_ATT(ncout, varid_ov, 'long_name', 'Overturning component of freshwater transport across section')
+ istatus = NF90_PUT_ATT(ncout, varid_ov, 'comment', 'Reference salinity 35.0, transport is positive northward')
+ istatus = NF90_ENDDEF(ncout)
+
+ istatus = NF90_PUT_VAR(ncout, varid_time, dtime)
+ istatus = NF90_PUT_VAR(ncout, varid_net, dnetvFW)
+ istatus = NF90_PUT_VAR(ncout, varid_tot, dtotvFW)
+ istatus = NF90_PUT_VAR(ncout, varid_ov, dovFW)
+
+ IF ( istatus /= NF90_NOERR ) PRINT *, NF90_STRERROR(istatus)
+ istatus = closeout(ncout)
+
+END PROGRAM cdfvFWov
--
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