From 8247c372ab165fa59d52603e8b97eee82c0837f5 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 7 Apr 2017 15:21:56 +0200
Subject: [PATCH] Philippe 07/04/2017: added new fields to TFIELDLIST + use
 IO_WRITE_FIELD for several fields (chosen form testcase 011_KW78CHEM)

---
 src/LIB/SURCOUCHE/src/mode_field.f90 | 37 +++++++++++++++++
 src/MNH/modd_ch_phn.f90              | 12 +++---
 src/MNH/write_lbn.f90                | 20 +++++-----
 src/MNH/write_lfin.f90               | 60 ++++++++++++++--------------
 4 files changed, 84 insertions(+), 45 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index f485d1f13..4eabb17f7 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -1150,6 +1150,32 @@ ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
 IDX = IDX+1
 !
 IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'PHC'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: PHC'
+TFIELDLIST(IDX)%CUNITS     = '1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'pH in cloud'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 3
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'PHR'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: PHR'
+TFIELDLIST(IDX)%CUNITS     = '1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'pH in rain'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 3
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'LSUM'
 TFIELDLIST(IDX)%CSTDNAME   = ''
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: LSUM'
@@ -2583,6 +2609,7 @@ USE MODD_GRID_n
 USE MODD_LSFIELD_n
 USE MODD_PARAM_n
 USE MODD_PAST_FIELD_n
+USE MODD_CH_PH_n
 USE MODD_PRECIP_n
 USE MODD_RADIATIONS_n
 USE MODD_REF_n
@@ -2723,6 +2750,11 @@ CALL FIND_FIELD_ID_FROM_MNHNAME('DUM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFR
 CALL FIND_FIELD_ID_FROM_MNHNAME('DVM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDVM
 CALL FIND_FIELD_ID_FROM_MNHNAME('DWM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDWM
 !
+! MODD_CH_PH_n variables
+!
+CALL FIND_FIELD_ID_FROM_MNHNAME('PHC',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPHC
+CALL FIND_FIELD_ID_FROM_MNHNAME('PHR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPHR
+!
 ! MODD_LSFIELD_n variables
 !
 CALL FIND_FIELD_ID_FROM_MNHNAME('LSUM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSUM
@@ -2953,6 +2985,11 @@ CALL FIND_FIELD_ID_FROM_MNHNAME('DUM',IID,IRESP); XDUM => TFIELDLIST(IID)%TFIELD
 CALL FIND_FIELD_ID_FROM_MNHNAME('DVM',IID,IRESP); XDVM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
 CALL FIND_FIELD_ID_FROM_MNHNAME('DWM',IID,IRESP); XDWM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
 !
+! MODD_CH_PH_n variables
+!
+CALL FIND_FIELD_ID_FROM_MNHNAME('PHC',IID,IRESP); XPHC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('PHR',IID,IRESP); XPHR => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+!
 ! MODD_LSFIELD_n variables
 !
 CALL FIND_FIELD_ID_FROM_MNHNAME('LSUM', IID,IRESP); XLSUM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
diff --git a/src/MNH/modd_ch_phn.f90 b/src/MNH/modd_ch_phn.f90
index f02801756..a120f5478 100644
--- a/src/MNH/modd_ch_phn.f90
+++ b/src/MNH/modd_ch_phn.f90
@@ -44,8 +44,8 @@ IMPLICIT NONE
 TYPE CH_PH_t
 !
 
-  REAL, POINTER, DIMENSION(:,:,:) :: XPHC ! cloud
-  REAL, POINTER, DIMENSION(:,:,:) :: XPHR ! rain
+!  REAL, POINTER, DIMENSION(:,:,:) :: XPHC ! cloud
+!  REAL, POINTER, DIMENSION(:,:,:) :: XPHR ! rain
   REAL, POINTER, DIMENSION(:,:,:) :: XACPRAQ ! sum of aqueous chemical species fall at the surface by rain
                                              ! in moles i / m2 (ratio with XACPRR for concentration
   REAL, POINTER, DIMENSION(:,:) :: XACPHR !  mean PH in accumulated surface rain
@@ -66,14 +66,14 @@ SUBROUTINE CH_PH_GOTO_MODEL(KFROM, KTO)
 INTEGER, INTENT(IN) :: KFROM, KTO
 !
 ! Save current state for allocated arrays
-CH_PH_MODEL(KFROM)%XPHC=>XPHC
-CH_PH_MODEL(KFROM)%XPHR=>XPHR
+!CH_PH_MODEL(KFROM)%XPHC=>XPHC !Done in FIELDLIST_GOTO_MODEL
+!CH_PH_MODEL(KFROM)%XPHR=>XPHR !Done in FIELDLIST_GOTO_MODEL
 CH_PH_MODEL(KFROM)%XACPHR=>XACPHR
 CH_PH_MODEL(KFROM)%XACPRAQ=>XACPRAQ
 !
 ! Current model is set to model KTO
-XPHC=>CH_PH_MODEL(KTO)%XPHC
-XPHR=>CH_PH_MODEL(KTO)%XPHR
+!XPHC=>CH_PH_MODEL(KTO)%XPHC !Done in FIELDLIST_GOTO_MODEL
+!XPHR=>CH_PH_MODEL(KTO)%XPHR !Done in FIELDLIST_GOTO_MODEL
 XACPHR=>CH_PH_MODEL(KTO)%XACPHR
 XACPRAQ=>CH_PH_MODEL(KTO)%XACPRAQ
 
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index 1bc762938..a589610a9 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -490,19 +490,19 @@ IF (NSV >=1) THEN
   !
   DO JSV = NSV_CHICBEG,NSV_CHICEND
     IF(NSIZELBXSV_ll /= 0) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
-      WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV,' (KG/KG)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBX",XLBXSVM(:,:,:,JSV),IRIMX,NSIZELBXSV_ll,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CLBTYPE    = 'LBX'
+      WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+      CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBXSV_ll,IRESP,XLBXSVM(:,:,:,JSV))
     END IF
 !
     IF(NSIZELBYSV_ll /= 0) THEN
-      YRECFM = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
-      WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV,' (KG/KG)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBY",XLBYSVM(:,:,:,JSV),IRIMY,NSIZELBYSV_ll,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CLBTYPE    = 'LBY'
+      WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+      CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBYSV_ll,IRESP,XLBYSVM(:,:,:,JSV))
     END IF
   END DO
   !
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 524fdaaa7..b706ce9d4 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -1020,48 +1020,50 @@ IF (NSV >=1) THEN
     !
     IF (LUSECHIC) THEN
       DO JSV = NSV_CHICBEG,NSV_CHICEND
-        YRECFM=TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))//'T'
-        WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (ppp)'
-        ILENCH=LEN(YCOMMENT)
-        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
-                    YCOMMENT,IRESP)
-        YCHNAMES(JSV-JSA)=YRECFM(1:LEN_TRIM(YRECFM)-1) ! without M
+        TZFIELD%CMNHNAME   = TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (ppp)'
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XSVT(:,:,:,JSV))
+        !
+        YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) ! without M
       END DO
     ENDIF
     IF (LUSECHAQ.AND.NRR>=3) THEN ! accumulated moles of aqueous species that fall at the surface (mol i/m2) 
-    DO JSV = NSV_CHACBEG+NSV_CHAC/2,NSV_CHACEND
-    YRECFM='ACPR_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-    ZWORK2D(:,:)  = XACPRAQ(:,:,JSV-NSV_CHACBEG-NSV_CHAC/2+1)
-    YCOMMENT    = 'X_Y_Accumulated moles of aqueous species at the surface (mol i/m2)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D,IGRID,ILENCH,YCOMMENT,IRESP)
-    END DO
+      TZFIELD%NDIMS = 2
+      DO JSV = NSV_CHACBEG+NSV_CHAC/2,NSV_CHACEND
+        TZFIELD%CMNHNAME   = 'ACPR_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CUNITS     = 'mol i m-2'
+        TZFIELD%CCOMMENT   = 'X_Y_Accumulated moles of aqueous species at the surface'
+        ZWORK2D(:,:)  = XACPRAQ(:,:,JSV-NSV_CHACBEG-NSV_CHAC/2+1)
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK2D)
+      END DO
+      TZFIELD%NDIMS = 3
     END IF
     IF (LUSECHAQ.AND.LCH_PH) THEN  ! pH values in cloud
-      YRECFM = 'PHC'
-      YCOMMENT='X_Y_Z_PHC'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XPHC,IGRID,ILENCH,YCOMMENT,IRESP)
+      CALL IO_WRITE_FIELD(TPFILE,'PHC',CLUOUT,IRESP,XPHC)
       IF (NRR>=3) THEN
-        YRECFM = 'PHR'
-        YCOMMENT='X_Y_Z_PHR'
-        ILENCH=LEN(YCOMMENT)
-        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XPHR,IGRID,ILENCH,YCOMMENT,IRESP)
+        CALL IO_WRITE_FIELD(TPFILE,'PHR',CLUOUT,IRESP,XPHR)
         ! compute mean pH in accumulated surface water
         !ZWORK2D(:,:) = 10**(-XCH_PHINIT)
         WHERE (XACPRR > 0.)
-        ZWORK2D(:,:) =  XACPHR(:,:) *1E3 / XACPRR(:,:) ! moles of H+ / l of water 
+          ZWORK2D(:,:) =  XACPHR(:,:) *1E3 / XACPRR(:,:) ! moles of H+ / l of water 
         ELSE WHERE
-        ZWORK2D(:,:) = XUNDEF
+          ZWORK2D(:,:) = XUNDEF
         END WHERE
         WHERE ((ZWORK2D(:,:) < 1E-1).AND.(ZWORK2D(:,:) > 1E-14))
-        ZWORK2D(:,:) = -ALOG10(ZWORK2D(:,:))           ! mean pH of surface water
+          ZWORK2D(:,:) = -LOG10(ZWORK2D(:,:))           ! mean pH of surface water
         END WHERE
-        YRECFM = 'MEANPHR'
-        YCOMMENT='X_Y_MEAN_PH'
-        ILENCH=LEN(YCOMMENT)
-        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D,IGRID,ILENCH,YCOMMENT,IRESP)        
+        TZFIELD%CMNHNAME   = 'MEANPHR'
+        TZFIELD%CSTDNAME   = ''
+        TZFIELD%CLONGNAME  = 'MesoNH: MEANPHR'
+        TZFIELD%CUNITS     = '1'
+        TZFIELD%CDIR       = 'XY'
+        TZFIELD%CCOMMENT   = 'X_Y_MEAN_PH'
+        TZFIELD%NGRID      = 1
+        TZFIELD%NTYPE      = TYPEREAL
+        TZFIELD%NDIMS      = 2
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK2D)
       ENDIF
     ENDIF
   ELSE IF (LCH_CONV_LINOX) THEN
-- 
GitLab