[cdftools] 116/228: JMM : New tool : cdfscale usefull for scaling a variable in a file

Alastair McKinstry mckinstry at moszumanska.debian.org
Fri Jun 12 08:21:37 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 b54b2e25707a69b69bfe09106204554494c79fb7
Author: molines <molines at 1055176f-818a-41d9-83e1-73fbe5b947c5>
Date:   Sun Dec 11 10:19:56 2011 +0000

    JMM : New tool : cdfscale usefull for scaling a variable in a file
    
    
    git-svn-id: http://servforge.legi.grenoble-inp.fr/svn/CDFTOOLS/trunk@563 1055176f-818a-41d9-83e1-73fbe5b947c5
---
 Makefile     |   5 ++-
 cdfscale.f90 | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 124 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 37bc023..ac94a03 100644
--- a/Makefile
+++ b/Makefile
@@ -32,7 +32,7 @@ EXEC = cdfmoy cdfmoyt cdfstd  cdfmoy_weighted cdfmoy_freq cdfvT \
        cdf16bit cdfvita cdfvita-geo cdfconvert cdfflxconv cdfclip cdfsstconv cdfstrconv cdfbathy cdfvar \
        cdfcsp cdfcoloc cdfmltmask cdfstatcoord  cdfpolymask cdfsmooth cdfmkmask cdfdifmask\
        cdfkempemekeepe cdfbci cdfbti cdfnrjcomp cdfcofdis cdfsections cdfnorth_unfold cdfovide cdfmppini\
-       cdfpsi_level cdfhdy cdfhdy3d cdffracinv  cdfmaskdmp cdfnan cdfnamelist \
+       cdfpsi_level cdfhdy cdfhdy3d cdffracinv  cdfmaskdmp cdfnan cdfscale cdfnamelist \
        cdfisopsi cdf2matlab cdffixtime
 
 all: $(EXEC)
@@ -360,6 +360,9 @@ cdfcsp: cdfio.o cdfcsp.f90
 cdfnan: cdfio.o cdfnan.f90
 	$(F90)   cdfnan.f90  -o $(BINDIR)/cdfnan cdfio.o modcdfnames.o $(FFLAGS)
 
+cdfscale: cdfio.o cdfscale.f90
+	$(F90)   cdfscale.f90  -o $(BINDIR)/cdfscale cdfio.o modcdfnames.o $(FFLAGS)
+
 cdfnorth_unfold: cdfio.o cdfnorth_unfold.f90
 	$(F90)   cdfnorth_unfold.f90  -o $(BINDIR)/cdfnorth_unfold cdfio.o modcdfnames.o $(FFLAGS)
 
diff --git a/cdfscale.f90 b/cdfscale.f90
new file mode 100644
index 0000000..0893e85
--- /dev/null
+++ b/cdfscale.f90
@@ -0,0 +1,120 @@
+PROGRAM cdfscale
+  !!======================================================================
+  !!                     ***  PROGRAM  cdfscale  ***
+  !!=====================================================================
+  !!  ** Purpose : Replace a variable in the file by its value x scale
+  !!               given in argument
+  !!
+  !! History : 3.0  : 12/2011  : J.M. Molines : Original code
+  !!----------------------------------------------------------------------
+  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)                               :: jk, jvar, jt           ! dummy loop index
+  INTEGER(KIND=4)                               :: ivar                   ! index of working variable
+  INTEGER(KIND=4)                               :: ierr                   ! working integer
+  INTEGER(KIND=4)                               :: narg, iargc            ! browse line
+  INTEGER(KIND=4)                               :: ncid                   ! ncid of input file for rewrite
+  INTEGER(KIND=4)                               :: npiglo, npjglo         ! size of the domain
+  INTEGER(KIND=4)                               :: npk, npt               ! size of the domain
+  INTEGER(KIND=4)                               :: nvars                  ! Number of variables in a file
+  INTEGER(KIND=4), DIMENSION(:),    ALLOCATABLE :: ipk                    ! arrays of vertical level for each var
+  INTEGER(KIND=4), DIMENSION(:),    ALLOCATABLE :: id_var                 ! arrays of var id
+
+  REAL(KIND=4)                                  :: vscale                 ! spval, replace value
+  REAL(KIND=4), DIMENSION(:,:),     ALLOCATABLE :: tab                    ! Arrays for data
+
+  CHARACTER(LEN=256)                            :: cldum                  ! dummy string for getarg
+  CHARACTER(LEN=256)                            :: cf_inout               ! file name
+  CHARACTER(LEN=256)                            :: cunits, clname, csname ! attributes
+  CHARACTER(LEN=256)                            :: cv_inout               ! variable name
+  CHARACTER(LEN=256), DIMENSION(:), ALLOCATABLE :: cv_names               ! array of var name
+
+  TYPE(variable), DIMENSION(:),     ALLOCATABLE :: stypvar                ! type for attributes
+
+  !!----------------------------------------------------------------------
+  CALL ReadCdfNames()
+
+  narg= iargc()
+  IF ( narg == 0 ) THEN
+     PRINT *,' usage : cdfscale INOUT-file IN-var scale '
+     PRINT *,'      '
+     PRINT *,'     PURPOSE :'
+     PRINT *,'       Replace IN-var in INOUT-file by its values x scale.'
+     PRINT *,'      '
+     PRINT *,'     ARGUMENTS :'
+     PRINT *,'       INOUT-file : netcdf input file (!overwritten!).'
+     PRINT *,'       IN-var : netcdf variable to be scaled.'
+     PRINT *,'       scale : Scale value to be used (multiplication factor).'
+     PRINT *,'      '
+     PRINT *,'     OUTPUT : '
+     PRINT *,'       netcdf file : input file is rewritten ' 
+     PRINT *,'         variables : same name as input.' 
+     STOP
+  ENDIF
+
+  CALL getarg(1, cf_inout) 
+  CALL getarg(2, cv_inout) 
+  CALL getarg(3, cldum)  ; READ(cldum,*) vscale
+
+  IF ( chkfile (cf_inout) )  STOP ! missing file
+
+  npiglo = getdim (cf_inout, cn_x              )
+  npjglo = getdim (cf_inout, cn_y              )
+  npk    = getdim (cf_inout, cn_z, kstatus=ierr)
+
+  IF (ierr /= 0 ) THEN
+     npk   = getdim (cf_inout,'z',kstatus=ierr)
+     IF (ierr /= 0 ) THEN
+        PRINT *, 'ASSUME NO VERTICAL DIMENSIONS !'
+        npk=0
+     ENDIF
+  ENDIF
+  ncid   = ncopen ( cf_inout       )
+  npt    = getdim ( cf_inout, cn_t )
+
+  PRINT *, 'npiglo=', npiglo
+  PRINT *, 'npjglo=', npjglo
+  PRINT *, 'npk   =', npk
+  PRINT *, 'npt   =', npt
+
+  ALLOCATE( tab(npiglo,npjglo) )
+
+  nvars = getnvar(cf_inout)
+
+  ALLOCATE (cv_names(nvars), id_var(nvars),ipk(nvars), stypvar(nvars))
+
+  cv_names(:) = getvarname(cf_inout,nvars,stypvar)
+  ipk(:)      = getipk(cf_inout,nvars)
+  id_var(:)   = getvarid(cf_inout,nvars)
+
+  ! look for cv_inout in the list of variables
+  DO jvar = 1, nvars
+    IF ( cv_inout == cv_names(jvar) ) THEN
+      ivar = jvar
+    ENDIF
+  ENDDO
+  PRINT *,' Working with ',TRIM(cv_inout),' variable number ', ivar
+  PRINT *,'    IPK   : ', ipk(ivar)
+  PRINT *,'    scale : ', vscale
+
+
+  ! work only for ivar
+  DO jt=1,npt
+    DO jk = 1, ipk(ivar) 
+      tab(:,:) = getvar(cf_inout, cv_names(ivar), jk, npiglo, npjglo, ktime=jt )
+      tab(:,:) = tab(:,:) * vscale
+      ierr = putvar(ncid, id_var(ivar), tab, jk, npiglo, npjglo, ktime=jt)
+    ENDDO
+  END DO
+
+  ierr = closeout(ncid)
+
+END PROGRAM cdfscale

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