From 030e3c19acf0c332ba058cc9e464f8d3ce8166b5 Mon Sep 17 00:00:00 2001
From: Don Morton <Don.Morton@borealscicomp.com>
Date: Tue, 11 Apr 2017 02:03:19 +0000
Subject: [PATCH] Incremental backup for branch fp9.3.1-20161214-nc4

---
 flexpart_code/fpmetbinary_mod.F90 | 383 +++++++++++++++++++++++++++++-
 1 file changed, 374 insertions(+), 9 deletions(-)

diff --git a/flexpart_code/fpmetbinary_mod.F90 b/flexpart_code/fpmetbinary_mod.F90
index b2a7c48b..9fdf11d6 100644
--- a/flexpart_code/fpmetbinary_mod.F90
+++ b/flexpart_code/fpmetbinary_mod.F90
@@ -303,12 +303,18 @@ CONTAINS
                                                   ! Should be 1 or 2 
 
 
+        ! Helper functions (in this module)
+        !INTEGER :: logical2integer
+        !LOGICAL :: integer2logical
+
+        INTEGER :: temp_integer   ! temporary value
         INTEGER :: ncret          ! Return value from NetCDF calls
         INTEGER :: ncvarid          ! NetCDF variable ID
 
         INTEGER :: nxmax_dimid, nymax_dimid, nzmax_dimid, nuvzmax_dimid, nwzmax_dimid, &
 &                  maxspec_dimid, numclass_dimid, maxnests_dimid, nxmaxn_dimid, nymaxn_dimid, &
-&                  zero_to_nzmax_dimid, zero_to_maxnests_dimid, polemap_dimid
+&                  zero_to_nzmax_dimid, zero_to_maxnests_dimid, polemap_dimid, &
+&                  nconvlevmax_dimid, na_dimid
 
 
         INTEGER, DIMENSION(1) :: dim1dids    ! Dimension IDs for 1D arrays
@@ -326,7 +332,7 @@ CONTAINS
 &                                       maxspec_dimname, numclass_dimname,&
 &                                       maxnests_dimname, nxmaxn_dimname, nymaxn_dimname, &
 &                                       zero_to_nzmax_dimname, zero_to_maxnests_dimname, &
-&                                       polemap_dimname
+&                                       polemap_dimname, nconvlevmax_dimname, na_dimname
 
         ! These are temporary variables, used in the LOAD option, for 
         ! comparing against the current values in FLEXPART of nxmax, nymax, ...
@@ -366,13 +372,24 @@ CONTAINS
             call handle_nf90_err(ncret)
             ncret = nf90_def_dim(ncid, 'numclass', numclass, numclass_dimid)
             call handle_nf90_err(ncret)
+
+            ! There are a handful of variables indexed from 0 to n, rather than 0 to n-1,
+            ! so these dimensions handle that.  What a pain.
             ncret = nf90_def_dim(ncid, 'zero_to_nzmax', nzmax+1, zero_to_nzmax_dimid)
             call handle_nf90_err(ncret)
             ncret = nf90_def_dim(ncid, 'zero_to_maxnests', maxnests+1, zero_to_maxnests_dimid)
             call handle_nf90_err(ncret)
+
+            ! This is for a couple of small arrays that store polar stereographic stuff
             ncret = nf90_def_dim(ncid, 'polemap_dim', 9, polemap_dimid)
             call handle_nf90_err(ncret)
 
+            ! These two values come from conv_mod
+            ncret = nf90_def_dim(ncid, 'nconvlevmax_dim', nconvlevmax, nconvlevmax_dimid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_def_dim(ncid, 'na_dim', na, na_dimid)
+            call handle_nf90_err(ncret)
+
             ! Scalar values
             WRITE(iounit) nx, ny, nxmin1, nymin1, nxfield
             WRITE(iounit) nuvz, nwz, nz, nmixz, nlev_ec
@@ -1871,20 +1888,21 @@ CONTAINS
 
 
 
-
+            ! xglobal, sglobal, nglobal are LOGICAL vars, and need to be converted
+            ! to INTEGER for NetCDF storage
             ncret = nf90_def_var(ncid, 'xglobal', NF90_INT, ncvarid)
             call handle_nf90_err(ncret)
-            ncret = nf90_put_var(ncid, ncvarid, xglobal)
+            ncret = nf90_put_var(ncid, ncvarid, logical2integer(xglobal))
             call handle_nf90_err(ncret)
 
             ncret = nf90_def_var(ncid, 'sglobal', NF90_INT, ncvarid)
             call handle_nf90_err(ncret)
-            ncret = nf90_put_var(ncid, ncvarid, sglobal)
+            ncret = nf90_put_var(ncid, ncvarid, logical2integer(sglobal))
             call handle_nf90_err(ncret)
 
             ncret = nf90_def_var(ncid, 'nglobal', NF90_INT, ncvarid)
             call handle_nf90_err(ncret)
-            ncret = nf90_put_var(ncid, ncvarid, nglobal)
+            ncret = nf90_put_var(ncid, ncvarid, logical2integer(nglobal))
             call handle_nf90_err(ncret)
 
             ncret = nf90_def_var(ncid, 'switchnorthg', NF90_FLOAT, ncvarid)
@@ -1924,6 +1942,192 @@ CONTAINS
             WRITE(iounit) psconv, tt2conv, td2conv
             WRITE(iounit) nconvlev, nconvtop
 
+
+            dim1dids = (/nconvlevmax_dimid/)
+
+            ncret = nf90_def_var(ncid, 'pconv', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                pconv(:))
+
+            ncret = nf90_def_var(ncid, 'dpr', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                dpr(:))
+
+            ncret = nf90_def_var(ncid, 'pconv_hpa', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                pconv_hpa(:))
+
+            ncret = nf90_def_var(ncid, 'ft', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                ft(:))
+
+            ncret = nf90_def_var(ncid, 'fq', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                fq(:))
+
+            ncret = nf90_def_var(ncid, 'sub', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                sub(:))
+
+            dim1dids = (/na_dimid/)
+
+            ncret = nf90_def_var(ncid, 'phconv', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                phconv(:))
+
+            ncret = nf90_def_var(ncid, 'phconv_hpa', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                phconv_hpa(:))
+
+            ncret = nf90_def_var(ncid, 'tconv', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                tconv(:))
+
+            ncret = nf90_def_var(ncid, 'qconv', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                qconv(:))
+
+            ncret = nf90_def_var(ncid, 'qsconv', NF90_FLOAT, &
+&                                       dim1dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                qsconv(:))
+
+            ! New dimensions
+            dim2dids = (/nconvlevmax_dimid, nconvlevmax_dimid/)
+
+            ncret = nf90_def_var(ncid, 'fmass', NF90_FLOAT, &
+&                                       dim2dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                fmass(:,:))
+
+            ncret = nf90_def_var(ncid, 'fmassfrac', NF90_FLOAT, &
+&                                       dim2dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                fmassfrac(:,:))
+
+
+            ! New dimensions
+            dim2dids = (/nxmax_dimid, nymax_dimid/)
+
+            ncret = nf90_def_var(ncid, 'cbaseflux', NF90_FLOAT, &
+&                                       dim2dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                cbaseflux(0:nxmax-1,0:nymax-1))
+
+            ! New dimensions
+            dim3dids = (/nxmaxn_dimid, nymaxn_dimid, maxnests_dimid/)
+
+            ncret = nf90_def_var(ncid, 'cbasefluxn', NF90_FLOAT, &
+&                                       dim3dids, ncvarid)
+            ncret = nf90_def_var_deflate(ncid, ncvarid,   &
+&                                        shuffle=0,     &
+&                                        deflate=1,     &
+&                                        deflate_level=DEF_LEVEL)
+            ncret = nf90_put_var(ncid, ncvarid, &
+&                                cbasefluxn(0:nxmaxn-1,0:nymaxn-1,1:maxnests))
+
+
+            ! Scalars
+            ncret = nf90_def_var(ncid, 'psconv', NF90_FLOAT, ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_put_var(ncid, ncvarid, psconv)
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_def_var(ncid, 'tt2conv', NF90_FLOAT, ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_put_var(ncid, ncvarid, tt2conv)
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_def_var(ncid, 'td2conv', NF90_FLOAT, ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_put_var(ncid, ncvarid, td2conv)
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_def_var(ncid, 'nconvlev', NF90_INT, ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_put_var(ncid, ncvarid, nconvlev)
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_def_var(ncid, 'nconvtop', NF90_INT, ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_put_var(ncid, ncvarid, nconvtop)
+            call handle_nf90_err(ncret)
+
+            PRINT *, 'SUM(pconv): ', SUM(pconv)
+            PRINT *, 'SUM(qconv): ', SUM(qconv)
+            PRINT *, 'SUM(fmassfrac): ', SUM(fmassfrac)
+            PRINT *, 'SUM(cbasefluxn): ', SUM(cbasefluxn)
+            PRINT *, 'tt2conv: ', tt2conv
+            PRINT *, 'nconvlev: ', nconvlev
+
+
+
         ELSE IF (op == 'LOAD') THEN 
 
             ! Read the preprocessed format version string and insure it
@@ -2843,20 +3047,25 @@ CONTAINS
             ncret = nf90_get_var(ncid, ncvarid, northpolemap(:))
             call handle_nf90_err(ncret)
 
+            ! xglobal, sglobal, nglobal are LOGICAL vars, and need to be converted
+            ! to INTEGER for NetCDF storage
             ncret = nf90_inq_varid(ncid, 'xglobal', ncvarid)
             call handle_nf90_err(ncret)
-            ncret = nf90_get_var(ncid, ncvarid, xglobal)
+            ncret = nf90_get_var(ncid, ncvarid, temp_integer)
             call handle_nf90_err(ncret)
+            xglobal = integer2logical(temp_integer)
 
             ncret = nf90_inq_varid(ncid, 'sglobal', ncvarid)
             call handle_nf90_err(ncret)
-            ncret = nf90_get_var(ncid, ncvarid, sglobal)
+            ncret = nf90_get_var(ncid, ncvarid, temp_integer)
             call handle_nf90_err(ncret)
+            sglobal = integer2logical(temp_integer)
 
             ncret = nf90_inq_varid(ncid, 'nglobal', ncvarid)
             call handle_nf90_err(ncret)
-            ncret = nf90_get_var(ncid, ncvarid, nglobal)
+            ncret = nf90_get_var(ncid, ncvarid, temp_integer)
             call handle_nf90_err(ncret)
+            nglobal = integer2logical(temp_integer)
 
             ncret = nf90_inq_varid(ncid, 'switchnorthg', ncvarid)
             call handle_nf90_err(ncret)
@@ -2897,6 +3106,124 @@ CONTAINS
             READ(iounit) psconv, tt2conv, td2conv
             READ(iounit) nconvlev, nconvtop
 
+            ncret = nf90_inq_varid(ncid, 'pconv', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, pconv(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'dpr', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, dpr(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'pconv_hpa', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, pconv_hpa(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'ft', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, ft(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'fq', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, fq(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'sub', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, sub(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'phconv', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, phconv(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'phconv_hpa', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, phconv_hpa(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'tconv', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, tconv(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'qconv', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, qconv(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'qsconv', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, qsconv(:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'fmass', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, fmass(:,:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'fmassfrac', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, fmassfrac(:,:))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'cbaseflux', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, cbaseflux(0:nxmax-1,0:nymax-1))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'cbasefluxn', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, cbasefluxn(0:nxmaxn-1,0:nymaxn-1,1:maxnests))
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'psconv', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, psconv)
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'tt2conv', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, tt2conv)
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'td2conv', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, td2conv)
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'nconvlev', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, nconvlev)
+            call handle_nf90_err(ncret)
+
+            ncret = nf90_inq_varid(ncid, 'nconvtop', ncvarid)
+            call handle_nf90_err(ncret)
+            ncret = nf90_get_var(ncid, ncvarid, nconvtop)
+            call handle_nf90_err(ncret)
+
+
+
+
+            PRINT *, 'SUM(pconv): ', SUM(pconv)
+            PRINT *, 'SUM(qconv): ', SUM(qconv)
+            PRINT *, 'SUM(fmassfrac): ', SUM(fmassfrac)
+            PRINT *, 'SUM(cbasefluxn): ', SUM(cbasefluxn)
+            PRINT *, 'tt2conv: ', tt2conv
+            PRINT *, 'nconvlev: ', nconvlev
+
+
+
+
+
+
+
+
+
         ELSE
             STOP 'fpio(): Illegal operation' 
             
@@ -2964,6 +3291,44 @@ CONTAINS
     end subroutine handle_nf90_err
 
 
+    INTEGER FUNCTION logical2integer(logical_value)
+        IMPLICIT NONE
+
+        ! Auxiliary function to convert logical values to
+        ! integers.  THIS DOES NO TYPE CHECKING!!!
+
+
+        LOGICAL, INTENT(IN) :: logical_value
+
+        IF (logical_value .EQV. .TRUE.) THEN
+            logical2integer = 1
+        ELSE
+            logical2integer = 0
+        ENDIF
+
+        RETURN
+
+    END FUNCTION logical2integer
+
+
+    LOGICAL FUNCTION integer2logical(integer_value)
+        IMPLICIT NONE
+
+        ! Auxiliary function to convert integer values to
+        ! logical.  THIS DOES NO TYPE CHECKING!!!
+
+
+        INTEGER, INTENT(IN) :: integer_value
+
+        IF (integer_value .EQ. 0) THEN
+            integer2logical = .FALSE.
+        ELSE
+            integer2logical = .TRUE.
+        ENDIF
+
+        RETURN
+
+    END FUNCTION integer2logical
 
 
 END MODULE fpmetbinary_mod
-- 
GitLab