From 2974c734f0fcb86ff7bfdbffb34412d56995b181 Mon Sep 17 00:00:00 2001
From: Juan Escobar <escj@aero.obs-mip.fr>
Date: Thu, 24 May 2018 15:09:10 +0200
Subject: [PATCH] Juan 24/05/2018: COUPLING , move modified OASIS/MNH source to
 original/true MNH

---
 src/MNH/ground_paramn.f90 | 56 ++++++++++++++++++++++++++++-----
 src/MNH/ini_modeln.f90    | 10 ++++++
 src/MNH/mesonh.f90        | 65 +++++++++++++++++++++++++++++++++++++--
 3 files changed, 121 insertions(+), 10 deletions(-)

diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 0c180144e..a492a36b3 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -98,9 +98,10 @@ END MODULE MODI_GROUND_PARAM_n
 !      (P.Tulet )             01/11/03  externalisation of the surface chemistry!
 !!     (D.Gazen)              01/12/03  change emissions handling for surf. externalization
 !!     (J.escobar)            18/10/2012 missing USE MODI_COUPLING_SURF_ATM_n & MODI_DIAG_SURF_ATM_n
-!      (J.escobar)            2/2014 add Forefire coupling
-!!  06/2016     (G.Delautier) phasage surfex 8
+!      (J.escobar)            02/2014 add Forefire coupling
+!!     (G.Delautier)          06/2016 phasage surfex 8
 !!     (B.Vie)                2016 LIMA
+!!     (J.Pianezze)           08/2016 add send/recv oasis functions
 !!      (M.Leriche)            24/03/16 remove flag for chemical surface fluxes
 !!      (M.Leriche)           01/07/2017 Add DIAG chimical surface fluxes
 !!  01/2018      (G.Delautier) SURFEX 8.1
@@ -113,6 +114,16 @@ END MODULE MODI_GROUND_PARAM_n
 !*       0.     DECLARATIONS
 !               ------------
 !
+! 
+#ifdef CPLOASIS
+USE MODI_GET_HALO
+USE MODI_MNH_OASIS_RECV
+USE MODI_MNH_OASIS_SEND
+USE MODD_SFX_OASIS, ONLY : LOASIS
+USE MODD_DYN, ONLY : XSEGLEN
+#endif
+!
+USE MODD_LUNIT_n, ONLY: TLUOUT
 USE MODD_CST,        ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, XAVOGADRO
 USE MODD_PARAMETERS, ONLY : JPVEXT, XUNDEF
 USE MODD_DYN_n,      ONLY : XTSTEP
@@ -336,10 +347,12 @@ CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: YSV_SURF ! name of the scalar var
                                                         ! sent to SURFEX
 !                                                        
 REAL                              :: ZTIMEC
+INTEGER           :: ILUOUT         ! logical unit
 !
 !-------------------------------------------------------------------------------
 !
 !
+ILUOUT=TLUOUT%NLU
 IKB= 1+JPVEXT
 IKU=NKMAX + 2* JPVEXT
 IKE=IKU-JPVEXT
@@ -553,6 +566,22 @@ CALL RESHAPE_SURF(IDIM1D)
 ! call to have the cumulated time since beginning of simulation
 !
 CALL DATETIME_DISTANCE(TDTSEG,TDTCUR,ZTIMEC)
+
+#ifdef CPLOASIS
+IF (LOASIS) THEN
+  IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN
+    IF ( NINT(ZTIMEC-(XSEGLEN-XTSTEP)) .LT. 0 ) THEN
+      WRITE(ILUOUT,*) '----------------------------'
+      WRITE(ILUOUT,*) ' Reception des champs avec OASIS'
+      WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC)
+      CALL MNH_OASIS_RECV(CPROGRAM,IDIM1D,SIZE(XSW_BANDS),ZTIMEC+XTSTEP,XTSTEP,         &
+                        ZP_ZENITH,XSW_BANDS                                         ,         &
+                        ZP_TSRAD,ZP_DIR_ALB,ZP_SCA_ALB,ZP_EMIS,ZP_TSURF)
+      WRITE(ILUOUT,*) '----------------------------'
+    END IF
+  END IF
+END IF
+#endif
 !
 ! Call to surface schemes
 !                       
@@ -568,7 +597,20 @@ CALL COUPLING_SURF_ATM_n(YSURF_CUR,'MESONH', 'E',ZTIMEC,
                ZP_PET_A_COEF, ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF,                    &
                'OK'                                                                           )
 !
-
+#ifdef CPLOASIS
+IF (LOASIS) THEN
+  IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN
+    IF (NINT(ZTIMEC-(XSEGLEN-XTSTEP)) .LT. 0) THEN
+      WRITE(ILUOUT,*) '----------------------------'
+      WRITE(ILUOUT,*) ' Envoi des champs avec OASIS'
+      WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC)
+      CALL MNH_OASIS_SEND(CPROGRAM,IDIM1D,ZTIMEC+XTSTEP,XTSTEP)
+      WRITE(ILUOUT,*) '----------------------------'
+    END IF
+  END IF
+END IF
+#endif
+!
 IF (CPROGRAM=='DIAG  ' .OR. LDIAG_IN_RUN) THEN
   CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH')
   CALL  MNHGET_SURF_PARAM_n(PRN=ZP_RN,PH=ZP_H,PLE=ZP_LE,PGFLUX=ZP_GFLUX, &
@@ -637,10 +679,10 @@ END IF
 !* conversion from chemistry flux (molec/m2/s) to (ppp.m.s-1)
 !
 IF (LUSECHEM) THEN
-  DO JSV=NSV_CHEMBEG,NSV_CHEMEND
-    PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) 
-    IF ((LCHEMDIAG).AND.(CPROGRAM == 'DIAG  ')) XCHFLX(:,:,JSV) = PSFSV(:,:,JSV)
-  END DO
+   DO JSV=NSV_CHEMBEG,NSV_CHEMEND
+      PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB))
+      IF ((LCHEMDIAG).AND.(CPROGRAM == 'DIAG  ')) XCHFLX(:,:,JSV) = PSFSV(:,:,JSV)    
+   END DO
 ELSE
   PSFSV(:,:,NSV_CHEMBEG:NSV_CHEMEND) = 0.
 END IF
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index dbe00b678..c16588e4a 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -265,6 +265,7 @@ END MODULE MODI_INI_MODEL_n
 !!                   J.Escobar : 01/06/2016 : correct check limit of NRIM versus local subdomain size IDIM
 !!                   06/2016     (G.Delautier) phasage surfex 8
 !!                   Modification    01/2016  (JP Pinty) Add LIMA
+!!                   Aug.  2016 (J.Pianezze) Add SFX_OASIS_READ_NAM function from SurfEx
 !!                   M.Leriche 2016 Chemistry
 !!                   10/2016 M.Mazoyer New KHKO output fields
 !!                      10/2016 (C.Lac) Add max values
@@ -281,6 +282,11 @@ END MODULE MODI_INI_MODEL_n
 !
 !*       0.    DECLARATIONS
 !              ------------
+!
+#ifdef CPLOASIS
+  USE MODI_SFX_OASIS_READ_NAM
+#endif
+!
 USE MODE_ll
 USE MODD_ARGSLIST_ll, ONLY : LIST_ll
 USE MODE_IO_ll
@@ -2068,6 +2074,10 @@ IF (CSURF=='EXTE' .AND. (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ')) THEN
   END IF
   !
   CALL GOTO_SURFEX(KMI)
+#ifdef CPLOASIS
+  CALL SFX_OASIS_READ_NAM(CPROGRAM,XTSTEP)
+  WRITE(*,*) 'SFX-OASIS: READ NAM_SFX_SEA_CPL OK'
+#endif
   !* initialization of surface
   CALL INIT_GROUND_PARAM_n ('ALL',SIZE(CSV),CSV,ZCO2,                             &
                             XZENITH,XAZIM,XSW_BANDS,XLW_BANDS,ZDIR_ALB,ZSCA_ALB,  &
diff --git a/src/MNH/mesonh.f90 b/src/MNH/mesonh.f90
index 46cd7c3d8..6234bbf8c 100644
--- a/src/MNH/mesonh.f90
+++ b/src/MNH/mesonh.f90
@@ -69,17 +69,24 @@
 !!      J.Stein                     08/04/99  general case of the sequential form
 !!      V. Masson                   15/03/99  MASDEV number and PROGRAM name
 !!      J.P. Chaboureau             15/03/04  loop limited to 100000 iterations
-!!                                           remplaced by infinite loop
+!!                                            remplaced by infinite loop
 !!      J.Escobar                 19/03/2008  rename INIT to INIT_MNH --> grib problem
 !!      J.Escobar                  6/11/2014  remove test on LCHECK otherwise never call MPPDB_INIT
-!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
-!!  06/2016     (G.Delautier) phasage surfex 8
+!!      J.Escobar                 15/09/2015  WENO5 & JPHEXT <> 1
+!!      G.Delautier                  06/2016  phasage surfex 8
+!!      J. Pianezze               01/08/2016  add sfxoasis coupling functions
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
 !               ------------
 !
+#ifdef CPLOASIS
+  USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD, IP
+  USE MODD_DYN_n, ONLY : XTSTEP
+  USE MODD_SFX_OASIS, ONLY : LOASIS, LOASIS_GRID
+#endif
+!
 USE MODD_CONF
 USE MODD_NESTING
 USE MODD_CONF_n
@@ -97,6 +104,13 @@ USE MODI_VERSION
 USE MODI_INIT_MNH
 USE MODD_MNH_SURFEX_n
 !
+#ifdef CPLOASIS
+  USE MODI_SFX_OASIS_INIT
+  USE MODI_MNH_OASIS_GRID
+  USE MODI_MNH_OASIS_DEFINE
+  USE MODI_SFX_OASIS_END
+#endif
+!
 USE MODE_MPPDB
 !
 IMPLICIT NONE 
@@ -109,14 +123,27 @@ LOGICAL       :: GEXIT                        ! flag for the end of the
                                               ! temporal loop       
 INTEGER       :: IINFO_ll                     ! return code of // routines
 !
+#ifdef CPLOASIS
+  CHARACTER(LEN=28)  :: CNAMELIST
+  LOGICAL            :: L_MASTER
+#endif
+!
 !-------------------------------------------------------------------------------
 !
 !*       1.    INITIALIZATION
 !              --------------
 ! Switch to model 1 variables
+#ifndef CPLOASIS
 CALL MPPDB_INIT()
+#endif
+!
 CALL GOTO_MODEL(1,ONOFIELDLIST=.TRUE.)
 !
+#ifdef CPLOASIS
+  CNAMELIST='EXSEG1.nam'
+  CALL SFX_OASIS_INIT(CNAMELIST, NMNH_COMM_WORLD)
+#endif
+!
 CALL INITIO_ll()
 !
 CALL VERSION
@@ -127,6 +154,33 @@ CALL INIT_MNH
 !
 GEXIT=.FALSE.
 !
+!
+!*         1.1   INITIALIZATION GRID OASIS
+!                -------------------------
+!
+!
+#ifdef CPLOASIS
+IF(IP==1) THEN
+  L_MASTER=.TRUE.
+ELSE
+  L_MASTER=.FALSE.
+END IF
+!
+IF (LOASIS_GRID) THEN
+  CALL MNH_OASIS_GRID(L_MASTER,NMNH_COMM_WORLD)
+ENDIF
+#endif
+!
+!
+!*         1.2   INITIALIZATION PARTITION OASIS
+!                ------------------------------
+!
+#ifdef CPLOASIS
+IF (LOASIS) THEN
+  CALL MNH_OASIS_DEFINE(CPROGRAM,IP)
+END IF
+#endif
+!
 !-------------------------------------------------------------------------------
 !
 !*       2.    TEMPORAL LOOP 
@@ -170,6 +224,11 @@ IF (LCHECK) THEN
   CALL MPPDB_BARRIER()
 ELSE
   CALL END_PARA_ll(IINFO_ll)
+#ifdef CPLOASIS
+IF (LOASIS) THEN
+  CALL SFX_OASIS_END
+END IF
+#endif
 END IF
 !
 !
-- 
GitLab