diff --git a/src/ARCH_SRC/CPL_WAVE/MNH/ground_paramn.f90 b/src/ARCH_SRC/CPL_WAVE/MNH/ground_paramn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..ca327d15c990c80396369f5ad0d79a2c43afeb91 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/MNH/ground_paramn.f90 @@ -0,0 +1,921 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 soil 2006/10/27 16:02:47 +!----------------------------------------------------------------- +! ########## +MODULE MODI_GROUND_PARAM_n +! ########## +! +INTERFACE +! + SUBROUTINE GROUND_PARAM_n( PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, & + PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD ) +! +!* surface fluxes +! -------------- +! +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor (m/s*kg/kg) +REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) + ! flux of chemical var. (ppp.m/s) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) +! +!* Radiative parameters +! -------------------- +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) +REAL, DIMENSION(:,:), INTENT(OUT) :: PEMIS ! surface emissivity (-) +REAL, DIMENSION(:,:), INTENT(OUT) :: PTSRAD ! surface radiative temperature (K) +! +END SUBROUTINE GROUND_PARAM_n +! +END INTERFACE +! +END MODULE MODI_GROUND_PARAM_n +! +! ###################################################################### + SUBROUTINE GROUND_PARAM_n( PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, & + PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD ) +! ####################################################################### +! +! +!!**** *GROUND_PARAM* +!! +!! PURPOSE +!! ------- +! Monitor to call the externalized surface +! +!!** METHOD +!! ------ +! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! Noilhan and Planton (1989) +!! +!! AUTHOR +!! ------ +!! S. Belair * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/03/95 +!! (J.Stein) 25/10/95 add the rain flux computation at the ground +!! and the lbc +!! (J.Stein) 15/11/95 include the strong slopes cases +!! (J.Stein) 06/02/96 bug correction for the precipitation flux writing +!! (J.Stein) 20/05/96 set the right IGRID value for the rain rate +!! (J.Viviand) 04/02/97 add cold and convective precipitation rate +!! (J.Stein) 22/06/97 use the absolute pressure +!! (V.Masson) 09/07/97 add directional z0 computations and RESA correction +!! (V.Masson) 13/02/98 merge the ISBA and TSZ0 routines, +!! rename the routine as a monitor, called by PHYS_PARAMn +!! add the town parameterization +!! recomputes z0 where snow is. +!! pack and unpack of 2D fields into 1D fields +!! (V.Masson) 04/01/00 removes the TSZ0 case +! (F.Solmon/V.Masson) adapatation for patch approach +! modification of internal subroutine pack/ allocation in function +! of patch indices +! calling of isba for each defined patch +! averaging of patch fluxes to get nat fluxes +! (P. Tulet/G.Guenais) 04/02/01 separation of vegetatives class +! for friction velocity and +! aerodynamical resistance +! (S Donnier) 09/12/02 add specific humidity at 2m for diagnostic +! (V.Masson) 01/03/03 externalisation of the surface schemes! +! (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) 02/2014 add Forefire coupling +!! (G.Delautier) 06/2016 phasage surfex 8 +!! (J.Pianezze) 08/2016 add send/recv oasis functions +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +#ifdef CPLOASIS +USE MODD_IO_SURF_MNH, ONLY : NLUOUT +USE MODI_GET_HALO +USE MODI_MNH_OASIS_RECV +USE MODI_MNH_OASIS_SEND +USE MODD_DYN, ONLY : XSEGLEN +#endif +! +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 +USE MODD_CH_MNHC_n, ONLY : LCH_SURFACE_FLUX +USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET +USE MODD_METRICS_n, ONLY : XDXX, XDYY, XDZZ +USE MODD_DIM_n, ONLY : NKMAX +USE MODD_GRID_n, ONLY : XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & + XCOSSLOPE, XSINSLOPE, XZS +USE MODD_REF_n, ONLY : XRHODREF +USE MODD_CONF_n, ONLY : NRR +USE MODD_PARAM_n, ONLY : CDCONV,CCLOUD, CRAD +USE MODD_PRECIP_n, ONLY : XINPRC, XINPRR, XINPRS, XINPRG, XINPRH +USE MODD_DEEP_CONVECTION_n, ONLY : XPRCONV, XPRSCONV +USE MODD_CONF, ONLY : LCARTESIAN, CPROGRAM +USE MODD_TIME_n, ONLY : TDTCUR +USE MODD_RADIATIONS_n, ONLY : XFLALWD, XCCO2, XTSIDER, & + XSW_BANDS, XDIRSRFSWD, XSCAFLASWD, & + XZENITH, XAZIM, XAER +USE MODD_NSV +USE MODD_GRID, ONLY : XLON0, XRPK, XBETA +USE MODD_PARAM_ICE, ONLY : LSEDIC +USE MODD_PARAM_C2R2, ONLY : LSEDC +USE MODD_DIAG_IN_RUN +USE MODD_DUST, ONLY : LDUST, CDUSTNAMES +USE MODD_SALT, ONLY : LSALT, CSALTNAMES +USE MODD_CH_AEROSOL +USE MODD_CSTS_DUST +USE MODD_CSTS_SALT +! +USE MODI_NORMAL_INTERPOL +USE MODI_ROTATE_WIND +USE MODI_SHUMAN +USE MODI_MNHGET_SURF_PARAM_n +USE MODI_COUPLING_SURF_ATM_n +USE MODI_DIAG_SURF_ATM_n +USE MODD_MNH_SURFEX_n +! +USE MODE_ll +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +#ifdef MNH_FOREFIRE +!** MODULES FOR FOREFIRE **! +USE MODD_FOREFIRE +USE MODD_FOREFIRE_n +USE MODI_COUPLING_FOREFIRE_n +#endif +! +USE MODD_TIME_n +USE MODD_TIME +USE MODI_TEMPORAL_DIST +! +IMPLICIT NONE +! +! +! +!* 0.1 declarations of arguments +! +!* surface fluxes +! -------------- +! +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor (m/s*kg/kg) +REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) + ! flux of chemical var. (ppp.m/s) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) +! +!* Radiative parameters +! -------------------- +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) +REAL, DIMENSION(:,:), INTENT(OUT) :: PEMIS ! surface emissivity (-) +REAL, DIMENSION(:,:), INTENT(OUT) :: PTSRAD ! surface radiative temperature (K) +! +! +!------------------------------------------------------------------------------- +! +! +! +!* 0.2 declarations of local variables +! ------------------------------- +! +! +!* Atmospheric variables +! --------------------- +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV ! vapor mixing ratio +! +! suffix 'A' stands for atmospheric variable at first model level +! +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZZREF ! Forcing height +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTA ! Temperature +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRVA ! vapor mixing ratio +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZQA ! humidity (kg/m3) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZPA ! Pressure +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZPS ! Pressure +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZEXNA ! Exner function +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZEXNS ! Exner function +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTHA ! potential temperature +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRAIN ! liquid precipitation (kg/m2/s) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSNOW ! solid precipitation (kg/m2/s) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTSUN ! solar time (s since midnight) +! +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZUA ! u component of the wind +! ! parallel to the orography +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZVA ! v component of the wind +! ! parallel to the orography +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZU ! zonal wind +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZV ! meridian wind +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZWIND ! wind parallel to the orography +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRHOA ! air density +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZDIR ! wind direction (rad from N clockwise) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFU ! zonal momentum flux +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFV ! meridian momentum flux +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZCO2 ! CO2 concentration (kg/kg) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZALFA ! angle between the wind +! ! and the x axis +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),1):: ZU2D ! u and v component of the +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),1):: ZV2D ! wind at mass point +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTH ! Turbulent flux of heat +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTQ ! Turbulent flux of water +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFCO2 ! Turbulent flux of CO2 +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NSV):: ZSFTS! Turbulent flux of scalar + +! +!* Dimensions +! ---------- +! +INTEGER :: IIB ! physical boundary +INTEGER :: IIE ! physical boundary +INTEGER :: IJB ! physical boundary +INTEGER :: IJE ! physical boundary +INTEGER :: IKB ! physical boundary +INTEGER :: IKE ! physical boundary +INTEGER :: IKU ! vertical array sizes +! +INTEGER :: JLAYER ! loop counter +INTEGER :: JSV ! loop counter +INTEGER :: JI,JJ,JK ! loop index +! +INTEGER :: IDIM1 ! X physical dimension +INTEGER :: IDIM2 ! Y physical dimension +INTEGER :: IDIM1D! total physical dimension +INTEGER :: IKRAD +! +!* Arrays put in 1D vectors +! ------------------------ +! +REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSUN ! solar time +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZENITH ! zenithal angle +REAL, DIMENSION(:), ALLOCATABLE :: ZP_AZIM ! azimuthal angle +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZREF ! forcing height +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZS ! orography +REAL, DIMENSION(:), ALLOCATABLE :: ZP_U ! zonal wind +REAL, DIMENSION(:), ALLOCATABLE :: ZP_V ! meridian wind +REAL, DIMENSION(:), ALLOCATABLE :: ZP_QA ! air humidity (kg/m3) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_TA ! air temperature +REAL, DIMENSION(:), ALLOCATABLE :: ZP_RHOA ! air density +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SV ! scalar at first atmospheric level +REAL, DIMENSION(:), ALLOCATABLE :: ZP_CO2 ! air CO2 concentration +REAL, DIMENSION(:), ALLOCATABLE :: ZP_RAIN ! liquid precipitation +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SNOW ! solid precipitation +REAL, DIMENSION(:), ALLOCATABLE :: ZP_LW ! incoming longwave +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_SW ! direct incoming shortwave +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_SW ! diffuse incoming shortwave +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PS ! surface pressure +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PA ! pressure at first atmospheric level + +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTQ ! water vapor flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTH ! potential temperature flux +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SFTS ! scalar flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFCO2 ! CO2 flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFU ! zonal momentum flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFV ! meridian momentum flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSRAD ! radiative surface temperature +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_ALB ! direct albedo +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_ALB ! diffuse albedo +REAL, DIMENSION(:), ALLOCATABLE :: ZP_EMIS ! emissivity + +REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSURF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_Z0 +REAL, DIMENSION(:), ALLOCATABLE :: ZP_Z0H +REAL, DIMENSION(:), ALLOCATABLE :: ZP_QSURF + +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEW_A_COEF ! coefficients for +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEW_B_COEF ! implicit coupling +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PET_A_COEF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEQ_A_COEF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PET_B_COEF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEQ_B_COEF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_RN ! net radiation (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_H ! sensible heat flux (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_LE ! latent heat flux (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_GFLUX ! ground flux (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_T2M ! Air temperature at 2 meters (K) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_Q2M ! Air humidity at 2 meters (kg/kg) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_HU2M ! Air relative humidity at 2 meters (-) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZON10M ! zonal Wind at 10 meters (m/s) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_MER10M ! meridian Wind at 10 meters (m/s) +TYPE(LIST_ll), POINTER :: TZFIELDSURF_ll ! list of fields to exchange +INTEGER :: IINFO_ll ! return code of parallel routine +! +REAL :: ZTIMEC +! +!------------------------------------------------------------------------------- +! +! +IKB= 1+JPVEXT +IKU=NKMAX + 2* JPVEXT +IKE=IKU-JPVEXT +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +! +PSFTH = XUNDEF +PSFRV = XUNDEF +PSFSV = XUNDEF +PSFCO2 = XUNDEF +PSFU = XUNDEF +PSFV = XUNDEF +PDIR_ALB = XUNDEF +PSCA_ALB = XUNDEF +PEMIS = XUNDEF +PTSRAD = XUNDEF +! +! +!------------------------------------------------------------------------------- +! +!* 1. CONVERSION OF THE ATMOSPHERIC VARIABLES +! --------------------------------------- +! +! 1.1 water vapor +! ----------- + +! +ALLOCATE(ZRV(SIZE(PSFTH,1),SIZE(PSFTH,2),IKU)) +! +IF(NRR>0) THEN + ZRV(:,:,:)=XRT(:,:,:,1) +ELSE + ZRV(:,:,:)=0. +END IF +! +! 1.2 Horizontal wind direction (rad from N clockwise) +! ------------------------- +! +ZU2D(:,:,:)=MXF(XUT(:,:,IKB:IKB)) +ZV2D(:,:,:)=MYF(XVT(:,:,IKB:IKB)) +! +!* angle between Y axis and wind (rad., clockwise) +! +ZALFA = 0. +WHERE(ZU2D(:,:,1)/=0. .OR. ZV2D(:,:,1)/=0.) + ZALFA(:,:)=ATAN2(ZU2D(:,:,1),ZV2D(:,:,1)) +END WHERE +WHERE(ZALFA(:,:)<0.) ZALFA(:,:) = ZALFA(:,:) + 2. * XPI +! +!* angle between North and wind (rad., clockwise) +! +IF (.NOT. LCARTESIAN) THEN + ZDIR = ( (XRPK*(XLON(:,:)-XLON0)) - XBETA ) * XPI/180. + ZALFA +ELSE + ZDIR = - XBETA * XPI/180. + ZALFA +END IF +! +! +! 1.3 Rotate the wind +! --------------- +! +CALL ROTATE_WIND(XUT,XVT,XWT, & + XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & + XCOSSLOPE,XSINSLOPE, & + XDXX,XDYY,XDZZ, & + ZUA,ZVA ) + +! +! 1.4 zonal and meridian components of the wind parallel to the slope +! --------------------------------------------------------------- +! +ZWIND(:,:) = SQRT( ZUA**2 + ZVA**2 ) +! +ZU(:,:) = ZWIND(:,:) * SIN(ZDIR) +ZV(:,:) = ZWIND(:,:) * COS(ZDIR) +! +! 1.5 Horizontal interpolation the thermodynamic fields +! ------------------------------------------------- +! +CALL NORMAL_INTERPOL(XTHT,ZRV,XPABST, & + XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & + XCOSSLOPE,XSINSLOPE, & + XDXX,XDYY,XDZZ, & + ZTHA,ZRVA,ZEXNA ) +! +DEALLOCATE(ZRV) +! +! +! 1.6 Pressure and Exner function +! --------------------------- +! +! +ZPA(:,:) = XP00 * ZEXNA(:,:) **(XCPD/XRD) +! +ZEXNS(:,:) = 0.5 * ( (XPABST(:,:,IKB-1)/XP00)**(XRD/XCPD) & + +(XPABST(:,:,IKB )/XP00)**(XRD/XCPD) & + ) +ZPS(:,:) = XP00 * ZEXNS(:,:) **(XCPD/XRD) +! +! 1.7 humidity in kg/m3 from the mixing ratio +! --------------------------------------- +! +! +ZQA(:,:) = ZRVA(:,:) * XRHODREF(:,:,IKB) +! +! +! 1.8 Temperature from the potential temperature +! ------------------------------------------ +! +! +ZTA(:,:) = ZTHA(:,:) * ZEXNA(:,:) +! +! +! 1.9 Air density +! ----------- +! +ZRHOA(:,:) = ZPA(:,:)/(XRD * ZTA(:,:) * ((1. + (XRD/XRV)*ZRVA(:,:))/ & + (1. + ZRVA(:,:)))) +! +! +! 1.10 Precipitations +! -------------- +! +ZRAIN=0. +ZSNOW=0. +IF (NRR>2 .AND. SIZE(XINPRR)>0 ) THEN + IF ((CCLOUD(1:3) == 'ICE' .AND. LSEDIC) .OR. & + ((CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') .AND. LSEDC)) THEN + ZRAIN = ZRAIN + XINPRR * XRHOLW + XINPRC * XRHOLW + ELSE + ZRAIN = ZRAIN + XINPRR * XRHOLW + END IF +END IF +IF (CDCONV == 'KAFR') THEN + ZRAIN = ZRAIN + (XPRCONV - XPRSCONV) * XRHOLW + ZSNOW = ZSNOW + XPRSCONV * XRHOLW +END IF +IF( NRR >= 5 .AND. SIZE(XINPRS)>0 ) ZSNOW = ZSNOW + XINPRS * XRHOLW +IF( NRR >= 6 .AND. SIZE(XINPRG)>0 ) ZSNOW = ZSNOW + XINPRG * XRHOLW +IF( NRR >= 7 .AND. SIZE(XINPRH)>0 ) ZSNOW = ZSNOW + XINPRH * XRHOLW +! +! +! 1.11 Solar time +! ---------- +! +IF (.NOT. LCARTESIAN) THEN + ZTSUN(:,:) = MOD(TDTCUR%TIME -XTSIDER*3600. +XLON(:,:)*240., XDAY) +ELSE + ZTSUN(:,:) = MOD(TDTCUR%TIME -XTSIDER*3600. +XLON0 *240., XDAY) +END IF +! +! 1.12 Forcing level +! ------------- +! +ZZREF(:,:) = 0.5*( XZZ(:,:,IKB+1)-XZZ(:,:,IKB) )*XDIRCOSZW(:,:) +! +! +! 1.13 CO2 concentration (kg/m3) +! ----------------- +! +ZCO2(:,:) = XCCO2 * XRHODREF(:,:,IKB) +! +!------------------------------------------------------------------------------- +! +!* 2. Call to surface monitor with 2D variables +! ----------------------------------------- +! +! +! initial values: +! +IDIM1 = IIE-IIB+1 +IDIM2 = IJE-IJB+1 +IDIM1D = IDIM1*IDIM2 +! +! +! Transform 2D input fields into 1D: +! +CALL RESHAPE_SURF(IDIM1D) +! +! call to have the cumulated time since beginning of simulation +! +CALL TEMPORAL_DIST(TDTCUR%TDATE%YEAR,TDTCUR%TDATE%MONTH, & + TDTCUR%TDATE%DAY, TDTCUR%TIME, & + TDTSEG%TDATE%YEAR,TDTSEG%TDATE%MONTH, & + TDTSEG%TDATE%DAY, TDTSEG%TIME, & + ZTIMEC) +! +#ifdef CPLOASIS +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(NLUOUT,*) '----------------------------' + WRITE(NLUOUT,*) ' Reception des champs avec OASIS' + WRITE(NLUOUT,*) '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(NLUOUT,*) '----------------------------' + END IF +ENDIF +#endif +! +! Call to surface schemes +! +CALL COUPLING_SURF_ATM_n(YSURF_CUR,'MESONH', 'E',ZTIMEC, & + XTSTEP, TDTCUR%TDATE%YEAR, TDTCUR%TDATE%MONTH, TDTCUR%TDATE%DAY, TDTCUR%TIME, & + IDIM1D,NSV,SIZE(XSW_BANDS), & + ZP_TSUN, ZP_ZENITH,ZP_ZENITH, ZP_AZIM, & + ZP_ZREF, ZP_ZREF, ZP_ZS, ZP_U, ZP_V, ZP_QA, ZP_TA, ZP_RHOA, ZP_SV, ZP_CO2, CSV,& + ZP_RAIN, ZP_SNOW, ZP_LW, ZP_DIR_SW, ZP_SCA_SW, XSW_BANDS, ZP_PS, ZP_PA, & + ZP_SFTQ, ZP_SFTH, ZP_SFTS, ZP_SFCO2, ZP_SFU, ZP_SFV, & + ZP_TSRAD, ZP_DIR_ALB, ZP_SCA_ALB, ZP_EMIS, ZP_TSURF, ZP_Z0, ZP_Z0H, ZP_QSURF, & + ZP_PEW_A_COEF, ZP_PEW_B_COEF, & + ZP_PET_A_COEF, ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF, & + 'OK' ) +! +#ifdef CPLOASIS +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(NLUOUT,*) '----------------------------' + WRITE(NLUOUT,*) ' Envoi des champs avec OASIS' + WRITE(NLUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC) + CALL MNH_OASIS_SEND(CPROGRAM,IDIM1D,ZTIMEC+XTSTEP,XTSTEP) + WRITE(NLUOUT,*) '----------------------------' + END IF +END IF +#endif +! +IF (CPROGRAM=='DIAG ' .OR. LDIAG_IN_RUN) THEN + CALL DIAG_SURF_ATM_n(YSURF_CUR%IM%DGEI, YSURF_CUR%FM%DGF, YSURF_CUR%DGL, YSURF_CUR%IM%DGI, & + YSURF_CUR%SM%DGS, YSURF_CUR%DGU, YSURF_CUR%TM%DGT, YSURF_CUR%WM%DGW, & + YSURF_CUR%U, YSURF_CUR%USS,'MESONH') + CALL MNHGET_SURF_PARAM_n(PRN=ZP_RN,PH=ZP_H,PLE=ZP_LE,PGFLUX=ZP_GFLUX, & + PT2M=ZP_T2M,PQ2M=ZP_Q2M,PHU2M=ZP_HU2M, & + PZON10M=ZP_ZON10M,PMER10M=ZP_MER10M ) +END IF +! +! Transform 1D output fields into 2D: +! +CALL UNSHAPE_SURF(IDIM1,IDIM2) +#ifdef MNH_FOREFIRE +!------------------------! +! COUPLING WITH FOREFIRE ! +!------------------------! + +IF ( LFOREFIRE ) THEN + CALL FOREFIRE_DUMP_FIELDS_n(XUT, XVT, XWT, XSVT& + , XTHT, XRT(:,:,:,1), XPABST, XTKET& + , IDIM1+2, IDIM2+2, NKMAX+2) +END IF + +IF ( FFCOUPLING ) THEN + + CALL SEND_GROUND_WIND_n(XUT, XVT, IKB, IINFO_ll) + + CALL FOREFIRE_RECEIVE_PARAL_n() + + CALL COUPLING_FOREFIRE_n(XTSTEP, ZSFTH, ZSFTQ, ZSFTS) + + CALL FOREFIRE_SEND_PARAL_n(IINFO_ll) + +END IF + +FF_TIME = FF_TIME + XTSTEP +#endif +! +! Friction of components along slope axes (U: largest local slope axis, V: zero slope axis) +! +! +PSFU(:,:) = 0. +PSFV(:,:) = 0. +! +WHERE (ZSFU(:,:)/=XUNDEF .AND. ZWIND(:,:)>0.) + PSFU(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZUA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB) + PSFV(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZVA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB) +END WHERE +! +!* conversion from H (W/m2) to w'Theta' +! +PSFTH(:,:) = ZSFTH(:,:) / XCPD / XRHODREF(:,:,IKB) +! +! +!* conversion from water flux (kg/m2/s) to w'rv' +! +PSFRV(:,:) = ZSFTQ(:,:) / XRHODREF(:,:,IKB) +! +! +!* conversion from scalar flux (kg/m2/s) to w'rsv' +! +IF(NSV .GT. 0) THEN + DO JSV=1,NSV + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) / XRHODREF(:,:,IKB) + END DO +END IF +! +!* conversion from chemistry flux (molec/m2/s) to (ppp.m.s-1) +! +IF (LCH_SURFACE_FLUX) THEN + DO JSV=NSV_CHEMBEG,NSV_CHEMEND + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) + END DO +ELSE + PSFSV(:,:,NSV_CHEMBEG:NSV_CHEMEND) = 0. +END IF +! +!* conversion from dust flux (kg/m2/s) to (ppp.m.s-1) +! +IF (LDUST) THEN + DO JSV=NSV_DSTBEG,NSV_DSTEND + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_DUST * XRHODREF(:,:,IKB)) + END DO +ELSE + PSFSV(:,:,NSV_DSTBEG:NSV_DSTEND) = 0. +END IF +! +!* conversion from sea salt flux (kg/m2/s) to (ppp.m.s-1) +! +IF (LSALT) THEN + DO JSV=NSV_SLTBEG,NSV_SLTEND + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_SALT * XRHODREF(:,:,IKB)) + END DO +ELSE + PSFSV(:,:,NSV_SLTBEG:NSV_SLTEND) = 0. +END IF +! +!* conversion from aerosol flux (molec/m2/s) to (ppp.m.s-1) +! +IF (LORILAM) THEN + DO JSV=NSV_AERBEG,NSV_AEREND + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) + END DO +ELSE + PSFSV(:,:,NSV_AERBEG:NSV_AEREND) = 0. +END IF +! +!* conversion from CO2 flux (kg/m2/s) to w'CO2' +! +PSFCO2(:,:) = ZSFCO2(:,:) / XRHODREF(:,:,IKB) +! +! +!* Diagnostics +! ----------- +! +! +IF (LDIAG_IN_RUN) THEN + ! + XCURRENT_LW (:,:) = XFLALWD(:,:) + XCURRENT_SW (:,:) = SUM(XDIRSRFSWD(:,:,:)+XSCAFLASWD(:,:,:),DIM=3) + XCURRENT_SFCO2(:,:) = ZSFCO2(:,:) + XCURRENT_DSTAOD(:,:)=0.0 + IF (CRAD=='ECMW') THEN + DO JK=IKB,IKE + IKRAD = JK - 1 + DO JJ=IJB,IJE + DO JI=IIB,IIE + XCURRENT_DSTAOD(JI,JJ)=XCURRENT_DSTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,3) + ENDDO + ENDDO + ENDDO + END IF +! + NULLIFY(TZFIELDSURF_ll) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_RN ) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_H ) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_LE ) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_GFLUX ) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_SW ) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_LW ) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_T2M ) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_Q2M ) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_HU2M ) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_ZON10M) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_MER10M) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_DSTAOD) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_SFCO2 ) + + CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELDSURF_ll) +END IF +! +!================================================================================== +! +CONTAINS +! +!================================================================================== +! +SUBROUTINE RESHAPE_SURF(KDIM1D) +! +INTEGER, INTENT(IN) :: KDIM1D +INTEGER, DIMENSION(1) :: ISHAPE_1 +! +ISHAPE_1 = (/KDIM1D/) +! +ALLOCATE(ZP_TSUN (KDIM1D)) +ALLOCATE(ZP_ZENITH (KDIM1D)) +ALLOCATE(ZP_AZIM (KDIM1D)) +ALLOCATE(ZP_ZREF (KDIM1D)) +ALLOCATE(ZP_ZS (KDIM1D)) +ALLOCATE(ZP_U (KDIM1D)) +ALLOCATE(ZP_V (KDIM1D)) +ALLOCATE(ZP_QA (KDIM1D)) +ALLOCATE(ZP_TA (KDIM1D)) +ALLOCATE(ZP_RHOA (KDIM1D)) +ALLOCATE(ZP_SV (KDIM1D,NSV)) +ALLOCATE(ZP_CO2 (KDIM1D)) +ALLOCATE(ZP_RAIN (KDIM1D)) +ALLOCATE(ZP_SNOW (KDIM1D)) +ALLOCATE(ZP_LW (KDIM1D)) +ALLOCATE(ZP_DIR_SW (KDIM1D,SIZE(XDIRSRFSWD,3))) +ALLOCATE(ZP_SCA_SW (KDIM1D,SIZE(XSCAFLASWD,3))) +ALLOCATE(ZP_PS (KDIM1D)) +ALLOCATE(ZP_PA (KDIM1D)) + +ALLOCATE(ZP_SFTQ (KDIM1D)) +ALLOCATE(ZP_SFTH (KDIM1D)) +ALLOCATE(ZP_SFU (KDIM1D)) +ALLOCATE(ZP_SFV (KDIM1D)) +ALLOCATE(ZP_SFTS (KDIM1D,NSV)) +ALLOCATE(ZP_SFCO2 (KDIM1D)) +ALLOCATE(ZP_TSRAD (KDIM1D)) +ALLOCATE(ZP_DIR_ALB (KDIM1D,SIZE(PDIR_ALB,3))) +ALLOCATE(ZP_SCA_ALB (KDIM1D,SIZE(PSCA_ALB,3))) +ALLOCATE(ZP_EMIS (KDIM1D)) +ALLOCATE(ZP_TSURF (KDIM1D)) +ALLOCATE(ZP_Z0 (KDIM1D)) +ALLOCATE(ZP_Z0H (KDIM1D)) +ALLOCATE(ZP_QSURF (KDIM1D)) +ALLOCATE(ZP_RN (KDIM1D)) +ALLOCATE(ZP_H (KDIM1D)) +ALLOCATE(ZP_LE (KDIM1D)) +ALLOCATE(ZP_GFLUX (KDIM1D)) +ALLOCATE(ZP_T2M (KDIM1D)) +ALLOCATE(ZP_Q2M (KDIM1D)) +ALLOCATE(ZP_HU2M (KDIM1D)) +ALLOCATE(ZP_ZON10M (KDIM1D)) +ALLOCATE(ZP_MER10M (KDIM1D)) + +!* explicit coupling only +ALLOCATE(ZP_PEW_A_COEF (KDIM1D)) +ALLOCATE(ZP_PEW_B_COEF (KDIM1D)) +ALLOCATE(ZP_PET_A_COEF (KDIM1D)) +ALLOCATE(ZP_PEQ_A_COEF (KDIM1D)) +ALLOCATE(ZP_PET_B_COEF (KDIM1D)) +ALLOCATE(ZP_PEQ_B_COEF (KDIM1D)) + +ZP_TSUN(:) = RESHAPE(ZTSUN(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_TA(:) = RESHAPE(ZTA(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_QA(:) = RESHAPE(ZQA(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_RHOA(:) = RESHAPE(ZRHOA(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_U(:) = RESHAPE(ZU(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_V(:) = RESHAPE(ZV(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_PS(:) = RESHAPE(ZPS(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_PA(:) = RESHAPE(ZPA(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_ZS(:) = RESHAPE(XZS(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_CO2(:) = RESHAPE(ZCO2(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_SNOW(:) = RESHAPE(ZSNOW(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_RAIN(:) = RESHAPE(ZRAIN(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_ZREF(:) = RESHAPE(ZZREF(IIB:IIE,IJB:IJE), ISHAPE_1) + +DO JLAYER=1,NSV + ZP_SV(:,JLAYER) = RESHAPE(XSVT(IIB:IIE,IJB:IJE,IKB,JLAYER), ISHAPE_1) +END DO +! +!chemical conversion : from part/part to molec./m3 +DO JLAYER=NSV_CHEMBEG,NSV_CHEMEND + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:) / XMD +END DO +DO JLAYER=NSV_AERBEG,NSV_AEREND + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:) / XMD +END DO +!dust conversion : from part/part to kg/m3 +DO JLAYER=NSV_DSTBEG,NSV_DSTEND + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XMOLARWEIGHT_DUST* ZP_RHOA(:) / XMD +END DO +!sea salt conversion : from part/part to kg/m3 +DO JLAYER=NSV_SLTBEG,NSV_SLTEND + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XMOLARWEIGHT_SALT* ZP_RHOA(:) / XMD +END DO +! +ZP_ZENITH(:) = RESHAPE(XZENITH(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_AZIM (:) = RESHAPE(XAZIM (IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_LW(:) = RESHAPE(XFLALWD(IIB:IIE,IJB:IJE), ISHAPE_1) +DO JLAYER=1,SIZE(XDIRSRFSWD,3) + ZP_DIR_SW(:,JLAYER) = RESHAPE(XDIRSRFSWD(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) + ZP_SCA_SW(:,JLAYER) = RESHAPE(XSCAFLASWD(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) +END DO +! +ZP_PEW_A_COEF = 0. +ZP_PEW_B_COEF = 0. +ZP_PET_A_COEF = 0. +ZP_PEQ_A_COEF = 0. +ZP_PET_B_COEF = 0. +ZP_PEQ_B_COEF = 0. +! +END SUBROUTINE RESHAPE_SURF +!================================================i================================= +SUBROUTINE UNSHAPE_SURF(KDIM1,KDIM2) +! +INTEGER, INTENT(IN) :: KDIM1, KDIM2 +INTEGER, DIMENSION(2) :: ISHAPE_2 +! +ISHAPE_2 = (/KDIM1,KDIM2/) +! +! Arguments in call to surface: +! +ZSFTH = XUNDEF +ZSFTQ = XUNDEF +IF (NSV>0) ZSFTS = XUNDEF +ZSFCO2 = XUNDEF +ZSFU = XUNDEF +ZSFV = XUNDEF +! +ZSFTH (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH(:), ISHAPE_2) +ZSFTQ (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ(:), ISHAPE_2) +DO JLAYER=1,SIZE(PSFSV,3) + ZSFTS (IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SFTS(:,JLAYER), ISHAPE_2) +END DO +ZSFCO2 (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFCO2(:), ISHAPE_2) +ZSFU (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFU(:), ISHAPE_2) +ZSFV (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFV(:), ISHAPE_2) +PEMIS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_EMIS(:), ISHAPE_2) +PTSRAD (IIB:IIE,IJB:IJE) = RESHAPE(ZP_TSRAD(:), ISHAPE_2) +! +IF (LDIAG_IN_RUN) THEN + XCURRENT_RN (IIB:IIE,IJB:IJE) = RESHAPE(ZP_RN(:), ISHAPE_2) + XCURRENT_H (IIB:IIE,IJB:IJE) = RESHAPE(ZP_H (:), ISHAPE_2) + XCURRENT_LE (IIB:IIE,IJB:IJE) = RESHAPE(ZP_LE(:), ISHAPE_2) + XCURRENT_GFLUX (IIB:IIE,IJB:IJE) = RESHAPE(ZP_GFLUX(:), ISHAPE_2) + XCURRENT_T2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_T2M(:), ISHAPE_2) + XCURRENT_Q2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_Q2M(:), ISHAPE_2) + XCURRENT_HU2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_HU2M(:), ISHAPE_2) + XCURRENT_ZON10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZON10M(:), ISHAPE_2) + XCURRENT_MER10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_MER10M(:), ISHAPE_2) +ENDIF +! +DO JLAYER=1,SIZE(PDIR_ALB,3) + PDIR_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_DIR_ALB(:,JLAYER), ISHAPE_2) + PSCA_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SCA_ALB(:,JLAYER), ISHAPE_2) +END DO +! +DEALLOCATE(ZP_TSUN ) +DEALLOCATE(ZP_ZENITH ) +DEALLOCATE(ZP_AZIM ) +DEALLOCATE(ZP_ZREF ) +DEALLOCATE(ZP_ZS ) +DEALLOCATE(ZP_U ) +DEALLOCATE(ZP_V ) +DEALLOCATE(ZP_QA ) +DEALLOCATE(ZP_TA ) +DEALLOCATE(ZP_RHOA ) +DEALLOCATE(ZP_SV ) +DEALLOCATE(ZP_CO2 ) +DEALLOCATE(ZP_RAIN ) +DEALLOCATE(ZP_SNOW ) +DEALLOCATE(ZP_LW ) +DEALLOCATE(ZP_DIR_SW ) +DEALLOCATE(ZP_SCA_SW ) +DEALLOCATE(ZP_PS ) +DEALLOCATE(ZP_PA ) + +DEALLOCATE(ZP_SFTQ ) +DEALLOCATE(ZP_SFTH ) +DEALLOCATE(ZP_SFTS ) +DEALLOCATE(ZP_SFCO2 ) +DEALLOCATE(ZP_SFU ) +DEALLOCATE(ZP_SFV ) +DEALLOCATE(ZP_TSRAD ) +DEALLOCATE(ZP_DIR_ALB ) +DEALLOCATE(ZP_SCA_ALB ) +DEALLOCATE(ZP_EMIS ) +DEALLOCATE(ZP_RN ) +DEALLOCATE(ZP_H ) +DEALLOCATE(ZP_LE ) +DEALLOCATE(ZP_GFLUX ) +DEALLOCATE(ZP_T2M ) +DEALLOCATE(ZP_Q2M ) +DEALLOCATE(ZP_HU2M ) +DEALLOCATE(ZP_ZON10M ) +DEALLOCATE(ZP_MER10M ) + +DEALLOCATE(ZP_PEW_A_COEF ) +DEALLOCATE(ZP_PEW_B_COEF ) +DEALLOCATE(ZP_PET_A_COEF ) +DEALLOCATE(ZP_PEQ_A_COEF ) +DEALLOCATE(ZP_PET_B_COEF ) +DEALLOCATE(ZP_PEQ_B_COEF ) +! +END SUBROUTINE UNSHAPE_SURF +!================================================================================== +! +END SUBROUTINE GROUND_PARAM_n diff --git a/src/ARCH_SRC/CPL_WAVE/MNH/ini_modeln.f90 b/src/ARCH_SRC/CPL_WAVE/MNH/ini_modeln.f90 new file mode 100644 index 0000000000000000000000000000000000000000..488502ea3522b5de75249cd979d8aef5b658d078 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/MNH/ini_modeln.f90 @@ -0,0 +1,2144 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! $Source$ $Revision$ $Date$ +!----------------------------------------------------------------- +! ####################### + MODULE MODI_INI_MODEL_n +! ####################### +! +INTERFACE +! + SUBROUTINE INI_MODEL_n(KMI,HLUOUT,HINIFILE,HINIFILEPGD) +! + INTEGER, INTENT(IN) :: KMI ! Model index + CHARACTER (LEN=*), INTENT(IN) :: HLUOUT ! name for output-listing + ! of nested models + CHARACTER (LEN=28), INTENT(IN) :: HINIFILE ! name of + CHARACTER (LEN=28), INTENT(IN) :: HINIFILEPGD +! +END SUBROUTINE INI_MODEL_n +! +END INTERFACE +! +END MODULE MODI_INI_MODEL_n +! ###################################################### + SUBROUTINE INI_MODEL_n(KMI,HLUOUT,HINIFILE,HINIFILEPGD) +! ###################################################### +! +!!**** *INI_MODEL_n* - routine to initialize the nested model _n +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to initialize the variables +! of the nested model _n. +! +!!** METHOD +!! ------ +!! The initialization of the model _n is performed as follows : +!! - Memory for arrays are then allocated : +!! * If turbulence kinetic energy variable is not needed +!! (CTURB='NONE'), XTKET, XTKEM and XTKES are zero-size arrays. +!! * If dissipation of TKE variable is not needed +!! (CTURBLEN /='KEPS'), XEPST, XEPSM and XREPSS are zero-size arrays. +!! * Memory for mixing ratio arrays is allocated according to the +!! value of logicals LUSERn (the number NRR of moist variables is deduced). +!! * The latitude (XLAT), longitude (XLON) and map factor (XMAP) +!! arrays are zero-size arrays if Cartesian geometry (LCARTESIAN=.TRUE.) +!! * Memory for reference state without orography ( XRHODREFZ and +!! XTHVREFZ) is only allocated in INI_MODEL1 +!! * The horizontal Coriolis parameters (XCORIOX and XCORIOY) arrays +!! are zero-size arrays if thinshell approximation (LTHINSHELL=.TRUE.) +!! * The Curvature coefficients (XCURVX and XCURVY) arrays +!! are zero-size arrays if Cartesian geometry (LCARTESIAN=.TRUE.) +!! * Memory for the Jacobian (ZJ) local array is allocated +!! (This variable is computed in SET_GRID and used in SET_REF). +!! - The spatial and temporal grid variables are initialized by SET_GRID. +!! - The metric coefficients are computed by METRICS (they are using in +!! the SET-REF call). +!! - The prognostic variables and are read in initial +!! LFIFM file (in READ_FIELD) +!! - The reference state variables are initialized by SET_REF. +!! - The temporal indexes of the outputs are computed by SET_OUTPUT_TIMES +!! - The large scale sources are computed in case of coupling case by +!! INI_CPL. +!! - The initialization of the parameters needed for the dynamics +!! of the model n is realized in INI_DYNAMICS. +!! - Then the initial file (DESFM+LFIFM files) is closed by FMCLOS. +!! - The initialization of the parameters needed for the ECMWF radiation +!! code is realized in INI_RADIATIONS. +!! - The contents of the scalar variables are overwritten by +!! the chemistry initialization subroutine CH_INIT_FIELDn when +!! the flags LUSECHEM and LCH_INIT_FIELD are set to TRUE. +!! This allows easy initialization of the chemical fields at a +!! restart of the model. +!! +!! EXTERNAL +!! -------- +!! FMLOOK : to retrieve a logical unit number associated with a file +!! FMREAD : to read a LFIFM file +!! FMFREE : to release a logical unit number +!! SET_DIM : to initialize dimensions +!! SET_GRID : to initialize grid +!! METRICS : to compute metric coefficients +!! READ_FIELD : to initialize field +!! FMCLOS : to close a FM-file +!! SET_REF : to initialize reference state for anelastic approximation +!! INI_DYNAMICS: to initialize parameters for the dynamics +!! INI_TKE_EPS : to initialize the TKE +!! SET_DIRCOS : to compute the director cosinus of the orography +!! INI_RADIATIONS : to initialize radiation computations +!! CH_INIT_CCS: to initialize the chemical core system +!! CH_INIT_FIELDn: to (re)initialize the scalar variables +!! INI_DEEP_CONVECTION : to initialize the deep convection scheme +!! CLEANLIST_ll : deaalocate a list +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_PARAMETERS : contains declaration of parameter variables +!! JPHEXT : Horizontal external points number +!! JPVEXT : Vertical external points number +!! +!! Module MODD_MODD_DYN : contains declaration of parameters +!! for the dynamics +!! Module MODD_CONF : contains declaration of configuration variables +!! for all models +!! NMODEL : Number of nested models +!! NVERB : Level of informations on output-listing +!! 0 for minimum prints +!! 5 for intermediate level of prints +!! 10 for maximum prints +!! +!! Module MODD_REF : contains declaration of reference state +!! variables for all models +!! Module MODD_FIELD_n : contains declaration of prognostic fields +!! Module MODD_LSFIELD_n : contains declaration of Larger Scale fields +!! Module MODD_GRID_n : contains declaration of spatial grid variables +!! Module MODD_TIME_n : contains declaration of temporal grid variables +!! Module MODD_REF_n : contains declaration of reference state +!! variables +!! Module MODD_CURVCOR_n : contains declaration of curvature and Coriolis +!! variables +!! Module MODD_BUDGET : contains declarations of the budget parameters +!! Module MODD_RADIATIONS_n:contains declaration of the variables of the +!! radiation interface scheme +!! Module MODD_STAND_ATM : contains declaration of the 5 standard +!! atmospheres used for the ECMWF-radiation code +!! Module MODD_FRC : contains declaration of the control variables +!! and of the forcing fields +!! Module MODD_CH_MNHC_n : contains the control parameters for chemistry +!! Module MODD_DEEP_CONVECTION_n: contains declaration of the variables of +!! the deep convection scheme +!! +!! +!! +!! +!! Module MODN_CONF_n : contains declaration of namelist NAM_CONFn and +!! uses module MODD_CONF_n (configuration variables) +!! Module MODN_LUNIT_n : contains declaration of namelist NAM_LUNITn and +!! uses module MODD_LUNIT_n (Logical units) +!! Module MODN_DYN_n : contains declaration of namelist NAM_DYNn and +!! uses module MODD_DYN_n (control of dynamics) +!! Module MODN_PARAM_n : contains declaration of namelist NAM_PARAMn and +!! uses module MODD_PARAM_n (control of physical +!! parameterization) +!! Module MODN_LBC_n : contains declaration of namelist NAM_LBCn and +!! uses module MODD_LBC_n (lateral boundaries) +!! Module MODN_TURB_n : contains declaration of namelist NAM_TURBn and +!! uses module MODD_TURB_n (turbulence scheme) +!! Module MODN_PARAM_RAD_n: contains declaration of namelist NAM_PARAM_RADn +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (routine INI_MODEL_n) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/06/94 +!! Modification 17/10/94 (Stein) For LCORIO +!! Modification 20/10/94 (Stein) For SET_GRID and NAMOUTN +!! Modification 26/10/94 (Stein) Modifications of the namelist names +!! Modification 10/11/94 (Lafore) allocatation of tke fields +!! Modification 22/11/94 (Stein) change the READ_FIELDS call ( add +!! pressure function +!! Modification 06/12/94 (Stein) add the LS fields +!! 12/12/94 (Stein) rename END_INI in INI_DYNAMICS +!! Modification 09/01/95 (Stein) add the turbulence scheme +!! Modification Jan 19, 1995 (J. Cuxart) add the TKE initialization +!! Jan 23, 1995 (J. Stein ) remove the condition +!! LTHINSHELL=T LCARTESIAN=T => stop +!! Modification Feb 16, 1995 (I.Mallet) add the METRICS call and +!! change the SET_REF call (add +!! the lineic mass) +!! Modification Mar 10, 1995 (I. Mallet) add the COUPLING initialization +!! June 29,1995 (Ph. Hereil, J. Stein) add the budget init. +!! Modification Sept. 1, 1995 (S. Belair) Reading of the surface variables +!! and parameters for ISBA (i.e., add a +!! CALL READ_GR_FIELD) +!! Modification 18/08/95 (J.P.Lafore) time step change case +!! 25/09/95 (J. Cuxart and J.Stein) add LES variables +!! and the diachronic file initialization +!! Modification Sept 20,1995 (Lafore) coupling for the dry mass Md +!! Modification Sept. 12, 1995 (J.-P. Pinty) add the initialization of +!! the ECMWF radiation code +!! Modification Sept. 13, 1995 (J.-P. Pinty) control the allocation of the +!! arrays of MODD_GR_FIELD_n +!! Modification Nove. 17, 1995 (J.Stein) control of the control !! +!! March 01, 1996 (J. Stein) add the cloud fraction +!! April 03, 1996 (J. Stein) unify the ISBA and TSZ0 cases +!! Modification 13/12/95 (M. Georgelin) add the forcing variables in +!! the call read_field, and their +!! allocation. +!! Mai 23, 1996 (J. Stein) allocate XSEA in the TSZ0 case +!! June 11, 1996 (V. Masson) add XSILT and XLAKE of +!! MODD_GR_FIELD_n +!! August 7, 1996 (K. Suhre) add (re)initialization of +!! chemistry +!! Octo. 11, 1996 (J. Stein ) add XSRCT and XSRCM +!! October 8, 1996 (J. Cuxart, E. Sanchez) Moist LES diagnostics +!! and control on TKE initialization. +!! Modification 19/12/96 (J.-P. Pinty) add the ice parameterization and +!! the precipitation fields +!! Modification 11/01/97 (J.-P. Pinty) add the deep convection +!! Nov. 1, 1996 (V. Masson) Read the vertical grid kind +!! Nov. 20, 1996 (V. Masson) control of convection calling time +!! July 16, 1996 (J.P.Lafore) update of EXSEG file reading +!! Oct. 08, 1996 (J.P.Lafore, V.Masson) +!! MY_NAME and DAD_NAME reading and check +!! Oct. 30, 1996 (J.P.Lafore) resolution ratio reading for nesting +!! and Bikhardt interpolation coef. initialization +!! Nov. 22, 1996 (J.P.Lafore) allocation of LS sources for nesting +!! Feb. 26, 1997 (J.P.Lafore) allocation of "surfacic" LS fields +!! March 10, 1997 (J.P.Lafore) forcing only for model 1 +!! June 22, 1997 (J. Stein) add the absolute pressure +!! July 09, 1997 (V. Masson) add directional z0 and SSO +!! Aug. 18, 1997 (V. Masson) consistency between storage +!! type and CCONF +!! Dec. 22, 1997 (J. Stein) add the LS field spawning +!! Jan. 24, 1998 (P.Bechtold) change MODD_FRC and MODD_DEEP_CONVECTION +!! Dec. 24, 1997 (V.Masson) directional z0 parameters +!! Aug. 13, 1998 (V. Ducrocq P Jabouille) // +!! Mai. 26, 1998 (J. Stein) remove NXEND,NYEND +!! Feb. 1, 1999 (J. Stein) compute the Bikhardt +!! interpolation coeff. before the call to set_grid +!! April 5, 1999 (V. Ducrocq) change the DXRATIO_ALL init. +!! April 12, 1999 (J. Stein) cleaning + INI_SPAWN_LS +!! Apr. 7, 1999 (P Jabouille) store the metric coefficients +!! in modd_metrics_n +!! Jui. 15,1999 (P Jabouille) split the routines in two parts +!! Jan. 04,2000 (V. Masson) removes the TSZ0 case +!! Apr. 15,2000 (P Jabouille) parallelization of grid nesting +!! Aug. 20,2000 (J Stein ) tranpose XBFY +!! Jui 01,2000 (F.solmon ) adapatation for patch approach +!! Jun. 15,2000 (J.-P. Pinty) add C2R2 initialization +!! Nov. 15,2000 (V.Masson) use of ini_modeln in prep_real_case +!! Nov. 15,2000 (V.Masson) call of LES routines +!! Nov. 15,2000 (V.Masson) aircraft and balloon initialization routines +!! Jan. 22,2001 (D.Gazen) update_nsv set NSV_* var. for current model +!! Mar. 04,2002 (V.Ducrocq) initialization to temporal series +!! Mar. 15,2002 (F.Solmon) modification of ini_radiation interface +!! Nov. 29,2002 (JP Pinty) add C3R5, ICE2, ICE4, ELEC +!! Jan. 2004 (V.Masson) externalization of surface +!! May 2006 Remove KEPS +!! Apr. 2010 (M. Leriche) add pH for aqueous phase chemistry +!! Jul. 2010 (M. Leriche) add Ice phase chemistry +!! Oct. 2010 (J.Escobar) check if local domain not to small for NRIMX NRIMY +!! Nov. 2010 (J.Escobar) PGI BUG , add SIZE(CSV) to init_ground routine +!! Nov. 2009 (C. Barthe) add call to INI_ELEC_n +!! Mar. 2010 (M. Chong) add small ions +!! Apr. 2011 (M. Chong) correction of RESTART (ELEC) +!! June 2011 (B.Aouizerats) Prognostic aerosols +!! June 2011 (P.Aumond) Drag of the vegetation +!! + Mean fields +!! July 2013 (Bosseur & Filippi) Adds Forefire +!! P. Tulet Nov 2014 accumulated moles of aqueous species that fall at the surface +!! JAn. 2015 (F. Brosse) bug in allocate XACPRAQ +!! Dec 2014 (C.Lac) : For reproducibility START/RESTA +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! V. Masson Feb 2015 replaces, for aerosols, cover fractions by sea, town, bare soil fractions +!! J.Escobar : 19/04/2016 : Pb IOZ/NETCDF , missing OPARALLELIO=.FALSE. for PGD files +!! Jun. 2016 (G.Delautier) phasage surfex 8 +!! Aug. 2016 (J.Pianezze) Add SFX_OASIS_READ_NAM function from SurfEx +!--------------------------------------------------------------------------------- +! +!* 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 +USE MODE_FM +USE MODE_FMREAD +USE MODE_TYPE_ZDIFFU +! +USE MODD_NSV +USE MODD_PARAMETERS +USE MODD_CST +USE MODD_CONF +USE MODD_DUST +USE MODD_DYN +USE MODD_DYNZD +USE MODD_FRC +USE MODD_REF +USE MODD_SERIES, ONLY: LSERIES +USE MODD_TIME +USE MODD_TURB_CLOUD, ONLY: NMODEL_CLOUD, CTURBLEN_CLOUD,XCEI +USE MODD_NESTING +USE MODD_PASPOL +USE MODD_DRAGTREE +USE MODD_METRICS_n +USE MODD_DYN_n +USE MODD_DYNZD_n +USE MODD_FIELD_n +USE MODD_PAST_FIELD_n +USE MODD_MEAN_FIELD_n +USE MODD_MEAN_FIELD +USE MODD_ADV_n +USE MODD_LSFIELD_n +USE MODD_GRID_n +USE MODD_GRID, ONLY: XLONORI,XLATORI +USE MODD_TIME_n +USE MODD_REF_n +USE MODD_FRC_n +USE MODD_CURVCOR_n +USE MODD_DIM_n +USE MODD_BUDGET +USE MODD_RADIATIONS_n +USE MODD_SHADOWS_n +USE MODD_PARAM_RAD_n, ONLY : CLW, CAER, CAOP +USE MODD_VAR_ll, ONLY : IP +! +USE MODD_STAND_ATM, ONLY : XSTROATM, XSMLSATM, XSMLWATM, XSPOSATM, XSPOWATM +USE MODD_CH_MNHC_n, ONLY : LUSECHEM, LUSECHAQ, LUSECHIC, LCH_INIT_FIELD, & + CCHEM_INPUT_FILE, LCH_CONV_LINOX, & + XCH_TUV_DOBNEW, LCH_PH +USE MODD_CH_PH_n +USE MODD_CH_AEROSOL, ONLY : LORILAM +USE MODD_CH_AERO_n, ONLY : XSOLORG,XMI +USE MODD_PARAM_KAFR_n +USE MODD_PARAM_MFSHALL_n +USE MODD_DEEP_CONVECTION_n +USE MODD_OUT_n +USE MODD_BIKHARDT_n +USE MODD_NUDGING_n, ONLY : LNUDGING +USE MODD_DIAG_FLAG, ONLY : LCHEMDIAG +USE MODD_CLOUD_MF_n +USE MODD_NSV +! +USE MODD_ELEC_n, ONLY : XCION_POS_FW, XCION_NEG_FW + +USE MODD_LUNIT_n +USE MODD_CONF_n +USE MODD_GET_n +USE MODD_TURB_n +USE MODD_CTURB +USE MODD_LBC_n +USE MODD_PASPOL_n +! +! +USE MODI_GATHER_ll +USE MODI_INI_BUDGET +USE MODI_INI_SW_SETUP +USE MODI_SET_GRID +USE MODI_METRICS +USE MODI_UPDATE_METRICS +USE MODI_READ_FIELD +USE MODI_SET_REF +USE MODI_INI_DYNAMICS +USE MODI_INI_TKE_EPS +USE MODI_SET_DIRCOS +USE MODI_INI_CPL +USE MODI_INI_RADIATIONS +USE MODI_INI_RADIATIONS_ECMWF +USE MODI_CH_INIT_FIELD_n +USE MODI_INI_DEEP_CONVECTION +USE MODI_INI_BIKHARDT_n +USE MODI_INI_ONE_WAY_n +USE MODI_GET_SIZEX_LB +USE MODI_GET_SIZEY_LB +USE MODI_INI_SPAWN_LS_n +USE MODI_INI_AIRCRAFT_BALLOON +USE MODI_UPDATE_NSV +USE MODI_INI_ELEC_n +USE MODI_INI_MICRO_n +USE MODI_INI_LG +USE MODI_SURF_SOLAR_GEOM +USE MODI_SUNPOS_n +USE MODI_INI_SURF_RAD +USE MODI_MNHGET_SURF_PARAM_n +USE MODI_MNHREAD_ZS_DUMMY_n +USE MODI_INIT_GROUND_PARAM_n +USE MODI_INI_AIRCRAFT_BALLOON +USE MODI_INI_SURFSTATION_n +USE MODI_INI_POSPROFILER_n +USE MODI_CH_INIT_JVALUES +USE MODI_CH_AER_MOD_INIT +! +USE MODD_PARAM_n +USE MODE_MODELN_HANDLER +USE MODE_SPLITTINGZ_ll , ONLY : GET_DIM_EXTZ_ll + +USE MODI_TEMPORAL_DIST + +USE MODI_INI_AEROSET1 +USE MODI_INI_AEROSET2 +USE MODI_INI_AEROSET3 +USE MODI_INI_AEROSET4 +USE MODI_INI_AEROSET5 +USE MODI_INI_AEROSET6 +! +#ifdef MNH_FOREFIRE +USE MODD_FOREFIRE +USE MODD_FOREFIRE_n +USE MODI_INIT_FOREFIRE_n +#endif +USE MODI_INI_LES_N +USE MODD_MNH_SURFEX_n +USE MODI_INI_SERIES_N +! Eddy fluxes ! Ajout PP +USE MODD_DEF_EDDY_FLUX_n ! for VT and WT fluxes +USE MODD_DEF_EDDYUV_FLUX_n ! FOR UV +USE MODD_LATZ_EDFLX +USE MODD_ADVFRC_n +USE MODD_RELFRC_n +USE MODD_2D_FRC +! +USE MODE_MPPDB +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +INTEGER, INTENT(IN) :: KMI ! Model Index + +CHARACTER (LEN=*), INTENT(IN) :: HLUOUT ! name for output-listing + ! of nested models +CHARACTER (LEN=28), INTENT(IN) :: HINIFILE ! name of + ! the initial file +CHARACTER (LEN=28), INTENT(IN) :: HINIFILEPGD +! +!* 0.2 declarations of local variables +! +INTEGER :: JSV ! Loop index +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: ININAR ! File management variable +INTEGER :: IMASDEV ! version of MESOHN in the input file +INTEGER :: ILUOUT ! Logical unit number of output-listing +CHARACTER(LEN=2) :: YDIR ! Type of the data field in LFIFM file +INTEGER :: IGRID ! C-grid indicator in LFIFM file +INTEGER :: ILENCH ! Length of comment string in LFIFM file +CHARACTER (LEN=100) :: YCOMMENT!comment string in LFIFM file +CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file +INTEGER :: IIU ! Upper dimension in x direction (local) +INTEGER :: IJU ! Upper dimension in y direction (local) +INTEGER :: IIU_ll ! Upper dimension in x direction (global) +INTEGER :: IJU_ll ! Upper dimension in y direction (global) +INTEGER :: IKU ! Upper dimension in z direction +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ ! Jacobian +LOGICAL :: GINIDCONV ! logical switch for the deep convection + ! initialization +LOGICAL :: GINIRAD ! logical switch for the radiation + ! initialization +! +! +TYPE(LIST_ll), POINTER :: TZINITHALO2D_ll ! pointer for the list of 2D fields + ! which must be communicated in INIT +TYPE(LIST_ll), POINTER :: TZINITHALO3D_ll ! pointer for the list of 3D fields + ! which must be communicated in INIT +! +INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU ! dimensions of the +INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2 ! West-east LB arrays +INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV ! dimensions of the +INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2 ! North-south LB arrays +INTEGER :: IINFO_ll ! Return code of //routines +INTEGER :: IIY,IJY +INTEGER :: IIU_B,IJU_B +INTEGER :: IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZCO2 ! CO2 concentration near the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSEA ! sea fraction +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTOWN ! town fraction +REAL, DIMENSION(:,:), ALLOCATABLE :: ZBARE ! bare soil fraction +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR_ALB ! direct albedo +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSCA_ALB ! diffuse albedo +REAL, DIMENSION(:,:), ALLOCATABLE :: ZEMIS ! emissivity +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTSRAD ! surface temperature +!------------------------------------------ +! Dummy pointers needed to correct an ifort Bug +REAL, DIMENSION(:), POINTER :: DPTR_XZHAT +REAL, DIMENSION(:), POINTER :: DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4 +REAL, DIMENSION(:), POINTER :: DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4 +REAL, DIMENSION(:), POINTER :: DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4 +REAL, DIMENSION(:), POINTER :: DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4 +CHARACTER(LEN=4), DIMENSION(:), POINTER :: DPTR_CLBCX,DPTR_CLBCY +INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_NKLIN_LBXV,DPTR_NKLIN_LBYV +INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_NKLIN_LBXM,DPTR_NKLIN_LBYM +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXU,DPTR_XCOEFLIN_LBYU +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXV,DPTR_XCOEFLIN_LBYV +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXW,DPTR_XCOEFLIN_LBYW +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXM,DPTR_XCOEFLIN_LBYM +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXWM,DPTR_XLBYWM,DPTR_XLBXTHM,DPTR_XLBYTHM +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXTKEM,DPTR_XLBYTKEM +REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXSVM,DPTR_XLBYSVM +REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRM,DPTR_XLBYRM +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XZZ +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM +REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS +! +!------------------------------------------------------------------------------- +! +!* 0. PROLOGUE +! -------- +! +NULLIFY(TZINITHALO2D_ll) +NULLIFY(TZINITHALO3D_ll) +! +!* 1. RETRIEVE LOGICAL UNIT NUMBER +! ---------------------------- +! +CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP) +CLUOUT = HLUOUT +CINIFILE=HINIFILE +CINIFILEPGD=HINIFILEPGD +! +CALL FMREAD(HINIFILE,'MASDEV',HLUOUT,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP) +!------------------------------------------------------------------------------- +! +!* 2. END OF READING +! -------------- +!* 2.1 Read number of forcing fields +! +IF (LFORCING) THEN ! Retrieve the number of time-dependent forcings. + YRECFM='FRC' + YDIR='--' + CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,NFRC,IGRID,ILENCH,YCOMMENT,IRESP) + IF ( (IRESP /= 0) .OR. (NFRC <=0) ) THEN + WRITE(ILUOUT,'(A/A)') & + "INI_MODEL_n ERROR: you want to read forcing variables from FMfile", & + " but no fields have been found by FMREAD" +!callabortstop + CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) + CALL ABORT + STOP 1 + END IF +END IF +! +! Modif PP for time evolving adv forcing + IF ( L2D_ADV_FRC ) THEN ! Retrieve the number of time-dependent forcings. + WRITE(ILUOUT,FMT=*) "INI_MODEL_n ENTER ADV_FORCING" + YRECFM='NADVFRC1' + YDIR='--' + CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,NADVFRC,IGRID,ILENCH,YCOMMENT,IRESP) + IF ( (IRESP /= 0) .OR. (NADVFRC <=0) ) THEN + WRITE(ILUOUT,'(A/A)') & + "INI_MODELn ERROR: you want to read forcing ADV variables from FMfile", & + " but no fields have been found by FMREAD" + !callabortstop + CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) + CALL ABORT + STOP 1 + END IF + WRITE(ILUOUT,*) 'NADVFRC = ', NADVFRC +END IF +! +IF ( L2D_REL_FRC ) THEN ! Retrieve the number of time-dependent forcings. + WRITE(ILUOUT,FMT=*) "INI_MODEL_n ENTER REL_FORCING" + YRECFM='NRELFRC1' + YDIR='--' + CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,NRELFRC,IGRID,ILENCH,YCOMMENT,IRESP) + IF ( (IRESP /= 0) .OR. (NRELFRC <=0) ) THEN + WRITE(ILUOUT,'(A/A)') & + "INI_MODELn ERROR: you want to read forcing REL variables from FMfile", & + " but no fields have been found by FMREAD" + !callabortstop + CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) + CALL ABORT + STOP 1 + END IF + WRITE(ILUOUT,*) 'NRELFRC = ', NRELFRC +END IF +!* 2.2 Checks the position of vertical absorbing layer +! +IKU=NKMAX+2*JPVEXT +! +YRECFM = 'ZHAT' +ALLOCATE(XZHAT(IKU)) + YDIR='--' +CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XZHAT,IGRID,ILENCH,YCOMMENT,IRESP) +IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN + WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR: you want to use vertical relaxation" + WRITE(ILUOUT,FMT=*) " but bottom of layer XALZBOT(",XALZBOT,")" + WRITE(ILUOUT,FMT=*) " is upper than model top (",XZHAT(IKU),")" +!callabortstop + CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) + CALL ABORT + STOP +END IF +IF (LVE_RELAX) THEN + IF (XALZBOT>=XZHAT(IKU-4) ) THEN + WRITE(ILUOUT,FMT=*) "INI_MODEL_n WARNING: you want to use vertical relaxation" + WRITE(ILUOUT,FMT=*) " but the layer defined by XALZBOT(",XALZBOT,")" + WRITE(ILUOUT,FMT=*) " contains less than 5 model levels" + END IF +END IF +DEALLOCATE(XZHAT) +! +!* 2.3 Compute sizes of arrays of the extended sub-domain +! +CALL GET_DIM_EXT_ll('B',IIU,IJU) +IIU_ll=NIMAX_ll + 2 * JPHEXT +IJU_ll=NJMAX_ll + 2 * JPHEXT +! initialize NIMAX and NJMAX for not updated versions regarding the parallelism +! spawning,... +CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX) +! +NRR=0 +NRRL=0 +NRRI=0 +IF (CGETRVT /= 'SKIP' ) THEN + NRR = NRR+1 +END IF +IF (CGETRCT /= 'SKIP' ) THEN + NRR = NRR+1 + NRRL = NRRL+1 +END IF +IF (CGETRRT /= 'SKIP' ) THEN + NRR = NRR+1 + NRRL = NRRL+1 +END IF +IF (CGETRIT /= 'SKIP' ) THEN + NRR = NRR+1 + NRRI = NRRI+1 +END IF +IF (CGETRST /= 'SKIP' ) THEN + NRR = NRR+1 + NRRI = NRRI+1 +END IF +IF (CGETRGT /= 'SKIP' ) THEN + NRR = NRR+1 + NRRI = NRRI+1 +END IF +IF (CGETRHT /= 'SKIP' ) THEN + NRR = NRR+1 + NRRI = NRRI+1 +END IF +IF (NVERB >= 5) THEN + WRITE (UNIT=ILUOUT,FMT='("THERE ARE ",I2," WATER VARIABLES")') NRR + WRITE (UNIT=ILUOUT,FMT='("THERE ARE ",I2," LIQUID VARIABLES")') NRRL + WRITE (UNIT=ILUOUT,FMT='("THERE ARE ",I2," SOLID VARIABLES")') NRRI +END IF +! +!* 2.3 Update NSV and floating indices for the current model +! +! +CALL UPDATE_NSV(KMI) +! +!------------------------------------------------------------------------------- +! +!* 3. ALLOCATE MEMORY +! ----------------- +! +!* 3.1 Module MODD_FIELD_n +! +IF (LMEAN_FIELD) THEN +! + MEAN_COUNT = 0 +! + ALLOCATE(XUM_MEAN(IIU,IJU,IKU)) ; XUM_MEAN = 0.0 + ALLOCATE(XVM_MEAN(IIU,IJU,IKU)) ; XVM_MEAN = 0.0 + ALLOCATE(XWM_MEAN(IIU,IJU,IKU)) ; XWM_MEAN = 0.0 + ALLOCATE(XTHM_MEAN(IIU,IJU,IKU)) ; XTHM_MEAN = 0.0 + ALLOCATE(XTEMPM_MEAN(IIU,IJU,IKU)) ; XTEMPM_MEAN = 0.0 + ALLOCATE(XTKEM_MEAN(IIU,IJU,IKU)) ; XTKEM_MEAN = 0.0 + ALLOCATE(XPABSM_MEAN(IIU,IJU,IKU)) ; XPABSM_MEAN = 0.0 +! + ALLOCATE(XU2_MEAN(IIU,IJU,IKU)) ; XU2_MEAN = 0.0 + ALLOCATE(XV2_MEAN(IIU,IJU,IKU)) ; XV2_MEAN = 0.0 + ALLOCATE(XW2_MEAN(IIU,IJU,IKU)) ; XW2_MEAN = 0.0 + ALLOCATE(XTH2_MEAN(IIU,IJU,IKU)) ; XTH2_MEAN = 0.0 + ALLOCATE(XTEMP2_MEAN(IIU,IJU,IKU)) ; XTEMP2_MEAN = 0.0 + ALLOCATE(XPABS2_MEAN(IIU,IJU,IKU)) ; XPABS2_MEAN = 0.0 +! +END IF +! +IF (CUVW_ADV_SCHEME(1:3)=='CEN') THEN + ALLOCATE(XUM(IIU,IJU,IKU)) + ALLOCATE(XVM(IIU,IJU,IKU)) + ALLOCATE(XWM(IIU,IJU,IKU)) + ALLOCATE(XDUM(IIU,IJU,IKU)) + ALLOCATE(XDVM(IIU,IJU,IKU)) + ALLOCATE(XDWM(IIU,IJU,IKU)) + IF (CCONF == 'START') THEN + XUM = 0.0 + XVM = 0.0 + XWM = 0.0 + XDUM = 0.0 + XDVM = 0.0 + XDWM = 0.0 + END IF +END IF +! +ALLOCATE(XUT(IIU,IJU,IKU)) ; XUT = 0.0 +ALLOCATE(XVT(IIU,IJU,IKU)) ; XVT = 0.0 +ALLOCATE(XWT(IIU,IJU,IKU)) ; XWT = 0.0 +ALLOCATE(XTHT(IIU,IJU,IKU)) ; XTHT = 0.0 +ALLOCATE(XRUS(IIU,IJU,IKU)) ; XRUS = 0.0 +ALLOCATE(XRVS(IIU,IJU,IKU)) ; XRVS = 0.0 +ALLOCATE(XRWS(IIU,IJU,IKU)) ; XRWS = 0.0 +ALLOCATE(XRUS_PRES(IIU,IJU,IKU)); XRUS_PRES = 0.0 +ALLOCATE(XRVS_PRES(IIU,IJU,IKU)); XRVS_PRES = 0.0 +ALLOCATE(XRWS_PRES(IIU,IJU,IKU)); XRWS_PRES = 0.0 +ALLOCATE(XRTHS(IIU,IJU,IKU)) ; XRTHS = 0.0 +ALLOCATE(XRTHS_CLD(IIU,IJU,IKU)); XRTHS_CLD = 0.0 +IF (CTURB /= 'NONE') THEN + ALLOCATE(XTKET(IIU,IJU,IKU)) + ALLOCATE(XRTKES(IIU,IJU,IKU)) + ALLOCATE(XRTKEMS(IIU,IJU,IKU)); XRTKEMS = 0.0 + ALLOCATE(XWTHVMF(IIU,IJU,IKU)) + ALLOCATE(XDYP(IIU,IJU,IKU)) + ALLOCATE(XTHP(IIU,IJU,IKU)) + ALLOCATE(XTR(IIU,IJU,IKU)) + ALLOCATE(XDISS(IIU,IJU,IKU)) + ALLOCATE(XLEM(IIU,IJU,IKU)) + XTKEMIN=XKEMIN +ELSE + ALLOCATE(XTKET(0,0,0)) + ALLOCATE(XRTKES(0,0,0)) + ALLOCATE(XWTHVMF(0,0,0)) + ALLOCATE(XDYP(0,0,0)) + ALLOCATE(XTHP(0,0,0)) + ALLOCATE(XTR(0,0,0)) + ALLOCATE(XDISS(0,0,0)) + ALLOCATE(XLEM(0,0,0)) +END IF +IF (CTOM == 'TM06') THEN + ALLOCATE(XBL_DEPTH(IIU,IJU)) +ELSE + ALLOCATE(XBL_DEPTH(0,0)) +END IF +IF (LRMC01) THEN + ALLOCATE(XSBL_DEPTH(IIU,IJU)) +ELSE + ALLOCATE(XSBL_DEPTH(0,0)) +END IF +! +ALLOCATE(XPABSM(IIU,IJU,IKU)) ; XPABSM = 0.0 +ALLOCATE(XPABST(IIU,IJU,IKU)) ; XPABST = 0.0 +! +ALLOCATE(XRT(IIU,IJU,IKU,NRR)) ; XRT = 0.0 +ALLOCATE(XRRS(IIU,IJU,IKU,NRR)) ; XRRS = 0.0 +ALLOCATE(XRRS_CLD(IIU,IJU,IKU,NRR)); XRRS_CLD = 0.0 +! +IF (CTURB /= 'NONE' .AND. NRR>1) THEN + ALLOCATE(XSRCT(IIU,IJU,IKU)) + ALLOCATE(XSIGS(IIU,IJU,IKU)) +ELSE + ALLOCATE(XSRCT(0,0,0)) + ALLOCATE(XSIGS(0,0,0)) +END IF +! +IF (NRR>1) THEN + ALLOCATE(XCLDFR(IIU,IJU,IKU)) +ELSE + ALLOCATE(XCLDFR(0,0,0)) +END IF +! +ALLOCATE(XSVT(IIU,IJU,IKU,NSV)) ; XSVT = 0. +ALLOCATE(XRSVS(IIU,IJU,IKU,NSV)); XRSVS = 0. +ALLOCATE(XRSVS_CLD(IIU,IJU,IKU,NSV)); XRSVS_CLD = 0.0 +! +IF (LPASPOL) THEN + ALLOCATE( XATC(IIU,IJU,IKU,NSV_PP) ) + XATC = 0. + ELSE + ALLOCATE( XATC(0,0,0,0)) + XATC = 0. +END IF +! +!* 3.2 Module MODD_GRID_n and MODD_METRICS_n +! +IF (LCARTESIAN) THEN + ALLOCATE(XLON(0,0)) + ALLOCATE(XLAT(0,0)) + ALLOCATE(XMAP(0,0)) +ELSE + ALLOCATE(XLON(IIU,IJU)) + ALLOCATE(XLAT(IIU,IJU)) + ALLOCATE(XMAP(IIU,IJU)) +END IF +ALLOCATE(XXHAT(IIU)) +ALLOCATE(XDXHAT(IIU)) +ALLOCATE(XYHAT(IJU)) +ALLOCATE(XDYHAT(IJU)) +ALLOCATE(XZS(IIU,IJU)) +ALLOCATE(XZSMT(IIU,IJU)) +ALLOCATE(XZZ(IIU,IJU,IKU)) +ALLOCATE(XZHAT(IKU)) +ALLOCATE(XDIRCOSZW(IIU,IJU)) +ALLOCATE(XDIRCOSXW(IIU,IJU)) +ALLOCATE(XDIRCOSYW(IIU,IJU)) +ALLOCATE(XCOSSLOPE(IIU,IJU)) +ALLOCATE(XSINSLOPE(IIU,IJU)) +! +ALLOCATE(XDXX(IIU,IJU,IKU)) +ALLOCATE(XDYY(IIU,IJU,IKU)) +ALLOCATE(XDZX(IIU,IJU,IKU)) +ALLOCATE(XDZY(IIU,IJU,IKU)) +ALLOCATE(XDZZ(IIU,IJU,IKU)) +! +!* 3.3 Modules MODD_REF and MODD_REF_n +! +IF (KMI == 1) THEN + ALLOCATE(XRHODREFZ(IKU),XTHVREFZ(IKU)) +END IF +ALLOCATE(XRHODREF(IIU,IJU,IKU)) +ALLOCATE(XTHVREF(IIU,IJU,IKU)) +ALLOCATE(XEXNREF(IIU,IJU,IKU)) +ALLOCATE(XRHODJ(IIU,IJU,IKU)) +IF (CEQNSYS=='DUR' .AND. LUSERV) THEN + ALLOCATE(XRVREF(IIU,IJU,IKU)) +ELSE + ALLOCATE(XRVREF(0,0,0)) +END IF +! +!* 3.4 Module MODD_CURVCOR_n +! +IF (LTHINSHELL) THEN + ALLOCATE(XCORIOX(0,0)) + ALLOCATE(XCORIOY(0,0)) +ELSE + ALLOCATE(XCORIOX(IIU,IJU)) + ALLOCATE(XCORIOY(IIU,IJU)) +END IF + ALLOCATE(XCORIOZ(IIU,IJU)) +IF (LCARTESIAN) THEN + ALLOCATE(XCURVX(0,0)) + ALLOCATE(XCURVY(0,0)) +ELSE + ALLOCATE(XCURVX(IIU,IJU)) + ALLOCATE(XCURVY(IIU,IJU)) +END IF +! +!* 3.5 Module MODD_DYN_n +! +CALL GET_DIM_EXT_ll('Y',IIY,IJY) +IF (L2D) THEN + ALLOCATE(XBFY(IIY,IJY,IKU)) +ELSE + ALLOCATE(XBFY(IJY,IIY,IKU)) ! transposition needed by the optimisition of the + ! FFT solver +END IF +CALL GET_DIM_EXT_ll('B',IIU_B,IJU_B) +ALLOCATE(XBFB(IIU_B,IJU_B,IKU)) +CALL GET_DIM_EXTZ_ll('SXP2_YP1_Z',IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll) +ALLOCATE(XBF_SXP2_YP1_Z(IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll)) +ALLOCATE(XAF(IKU),XCF(IKU)) +ALLOCATE(XTRIGSX(3*IIU_ll)) +ALLOCATE(XTRIGSY(3*IJU_ll)) +ALLOCATE(XRHOM(IKU)) +ALLOCATE(XALK(IKU)) +ALLOCATE(XALKW(IKU)) +ALLOCATE(XALKBAS(IKU)) +ALLOCATE(XALKWBAS(IKU)) +! +IF ( LHORELAX_UVWTH .OR. LHORELAX_RV .OR. & + LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI .OR. LHORELAX_RS .OR. & + LHORELAX_RG .OR. LHORELAX_RH .OR. LHORELAX_TKE .OR. & + ANY(LHORELAX_SV) ) THEN + ALLOCATE(XKURELAX(IIU,IJU)) + ALLOCATE(XKVRELAX(IIU,IJU)) + ALLOCATE(XKWRELAX(IIU,IJU)) + ALLOCATE(LMASK_RELAX(IIU,IJU)) +ELSE + ALLOCATE(XKURELAX(0,0)) + ALLOCATE(XKVRELAX(0,0)) + ALLOCATE(XKWRELAX(0,0)) + ALLOCATE(LMASK_RELAX(0,0)) +END IF +! +! Additional fields for truly horizontal diffusion (Module MODD_DYNZD$n) +IF (LZDIFFU) THEN + CALL INIT_TYPE_ZDIFFU_HALO2(XZDIFFU_HALO2) +ELSE + CALL INIT_TYPE_ZDIFFU_HALO2(XZDIFFU_HALO2,0) +ENDIF +! +!* 3.6 Larger Scale variables (Module MODD_LSFIELD$n) +! +! +! upper relaxation part +! +ALLOCATE(XLSUM(IIU,IJU,IKU)) ; XLSUM = 0.0 +ALLOCATE(XLSVM(IIU,IJU,IKU)) ; XLSVM = 0.0 +ALLOCATE(XLSWM(IIU,IJU,IKU)) ; XLSWM = 0.0 +ALLOCATE(XLSTHM(IIU,IJU,IKU)) ; XLSTHM = 0.0 +IF ( NRR > 0 ) THEN + ALLOCATE(XLSRVM(IIU,IJU,IKU)) ; XLSRVM = 0.0 +ELSE + ALLOCATE(XLSRVM(0,0,0)) +END IF +! +! lbc part +! +IF ( L1D) THEN ! 1D case +! + NSIZELBX_ll=0 + NSIZELBXU_ll=0 + NSIZELBY_ll=0 + NSIZELBYV_ll=0 + NSIZELBXTKE_ll=0 + NSIZELBXR_ll=0 + NSIZELBXSV_ll=0 + NSIZELBYTKE_ll=0 + NSIZELBYR_ll=0 + NSIZELBYSV_ll=0 + ALLOCATE(XLBXUM(0,0,0)) + ALLOCATE(XLBYUM(0,0,0)) + ALLOCATE(XLBXVM(0,0,0)) + ALLOCATE(XLBYVM(0,0,0)) + ALLOCATE(XLBXWM(0,0,0)) + ALLOCATE(XLBYWM(0,0,0)) + ALLOCATE(XLBXTHM(0,0,0)) + ALLOCATE(XLBYTHM(0,0,0)) + ALLOCATE(XLBXTKEM(0,0,0)) + ALLOCATE(XLBYTKEM(0,0,0)) + ALLOCATE(XLBXRM(0,0,0,0)) + ALLOCATE(XLBYRM(0,0,0,0)) + ALLOCATE(XLBXSVM(0,0,0,0)) + ALLOCATE(XLBYSVM(0,0,0,0)) +! +ELSEIF( L2D ) THEN ! 2D case +! + NSIZELBY_ll=0 + NSIZELBYV_ll=0 + NSIZELBYTKE_ll=0 + NSIZELBYR_ll=0 + NSIZELBYSV_ll=0 + ALLOCATE(XLBYUM(0,0,0)) + ALLOCATE(XLBYVM(0,0,0)) + ALLOCATE(XLBYWM(0,0,0)) + ALLOCATE(XLBYTHM(0,0,0)) + ALLOCATE(XLBYTKEM(0,0,0)) + ALLOCATE(XLBYRM(0,0,0,0)) + ALLOCATE(XLBYSVM(0,0,0,0)) +! + CALL GET_SIZEX_LB(HLUOUT,NIMAX_ll,NJMAX_ll,NRIMX, & + IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & + IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) +! + IF ( LHORELAX_UVWTH ) THEN + NSIZELBX_ll=2*NRIMX+2*JPHEXT + NSIZELBXU_ll=2*NRIMX+2*JPHEXT + ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,IKU)) + ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,IKU)) + ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,IKU)) + ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,IKU)) + ELSE + NSIZELBX_ll=2*JPHEXT ! 2 + NSIZELBXU_ll=2*(JPHEXT+1) ! 4 + ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,IKU)) + ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,IKU)) + ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,IKU)) + ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,IKU)) + END IF +! + IF (CTURB /= 'NONE') THEN + IF ( LHORELAX_TKE) THEN + NSIZELBXTKE_ll=2* NRIMX+2*JPHEXT + ALLOCATE(XLBXTKEM(IISIZEXF,IJSIZEXF,IKU)) + ELSE + NSIZELBXTKE_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXTKEM(IISIZEX2,IJSIZEX2,IKU)) + END IF + ELSE + NSIZELBXTKE_ll=0 + ALLOCATE(XLBXTKEM(0,0,0)) + END IF + ! + IF ( NRR > 0 ) THEN + IF (LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & + .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & + ) THEN + NSIZELBXR_ll=2* NRIMX+2*JPHEXT + ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,IKU,NRR)) + ELSE + NSIZELBXR_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,IKU,NRR)) + ENDIF + ELSE + NSIZELBXR_ll=0 + ALLOCATE(XLBXRM(0,0,0,0)) + END IF + ! + IF ( NSV > 0 ) THEN + IF ( ANY( LHORELAX_SV(:)) ) THEN + NSIZELBXSV_ll=2* NRIMX+2*JPHEXT + ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,IKU,NSV)) + ELSE + NSIZELBXSV_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,IKU,NSV)) + END IF + ELSE + NSIZELBXSV_ll=0 + ALLOCATE(XLBXSVM(0,0,0,0)) + END IF +! +ELSE ! 3D case +! +! + CALL GET_SIZEX_LB(HLUOUT,NIMAX_ll,NJMAX_ll,NRIMX, & + IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & + IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) + CALL GET_SIZEY_LB(HLUOUT,NIMAX_ll,NJMAX_ll,NRIMY, & + IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, & + IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2) +! +! check if local domain not to small for NRIMX NRIMY +! + IF ( CLBCX(1) /= 'CYCL' ) THEN + IF ( NRIMX+2*JPHEXT .GE. IIU ) THEN + WRITE(*,'(A,I8,A/A,2I8,/A)') "Processor=", IP-1, & + " :: INI_MODEL_n ERROR: ( NRIMX+2*JPHEXT >= IIU ) ", & + " Local domain to small for relaxation NRIMX+2*JPHEXT,IIU ", & + NRIMX+2*JPHEXT,IIU ,& + " change relaxation parameters or number of processors " + !callabortstop + CALL ABORT + STOP + END IF + END IF + IF ( CLBCY(1) /= 'CYCL' ) THEN + IF ( NRIMY+2*JPHEXT .GE. IJU ) THEN + WRITE(*,'(A,I8,A/A,2I8,/A)') "Processor=", IP-1, & + " :: INI_MODEL_n ERROR: ( NRIMY+2*JPHEXT >= IJU ) ", & + " Local domain to small for relaxation NRIMY+2*JPHEXT,IJU ", & + NRIMY+2*JPHEXT,IJU ,& + " change relaxation parameters or number of processors " + !callabortstop + CALL ABORT + STOP + END IF + END IF +IF ( LHORELAX_UVWTH ) THEN + NSIZELBX_ll=2*NRIMX+2*JPHEXT + NSIZELBXU_ll=2*NRIMX+2*JPHEXT + NSIZELBY_ll=2*NRIMY+2*JPHEXT + NSIZELBYV_ll=2*NRIMY+2*JPHEXT + ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,IKU)) + ALLOCATE(XLBYUM(IISIZEYF,IJSIZEYF,IKU)) + ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,IKU)) + ALLOCATE(XLBYVM(IISIZEYFV,IJSIZEYFV,IKU)) + ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,IKU)) + ALLOCATE(XLBYWM(IISIZEYF,IJSIZEYF,IKU)) + ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,IKU)) + ALLOCATE(XLBYTHM(IISIZEYF,IJSIZEYF,IKU)) + ELSE + NSIZELBX_ll=2*JPHEXT ! 2 + NSIZELBXU_ll=2*(JPHEXT+1) ! 4 + NSIZELBY_ll=2*JPHEXT ! 2 + NSIZELBYV_ll=2*(JPHEXT+1) ! 4 + ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,IKU)) + ALLOCATE(XLBYUM(IISIZEY2,IJSIZEY2,IKU)) + ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,IKU)) + ALLOCATE(XLBYVM(IISIZEY4,IJSIZEY4,IKU)) + ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,IKU)) + ALLOCATE(XLBYWM(IISIZEY2,IJSIZEY2,IKU)) + ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,IKU)) + ALLOCATE(XLBYTHM(IISIZEY2,IJSIZEY2,IKU)) + END IF + ! + IF (CTURB /= 'NONE') THEN + IF ( LHORELAX_TKE) THEN + NSIZELBXTKE_ll=2*NRIMX+2*JPHEXT + NSIZELBYTKE_ll=2*NRIMY+2*JPHEXT + ALLOCATE(XLBXTKEM(IISIZEXF,IJSIZEXF,IKU)) + ALLOCATE(XLBYTKEM(IISIZEYF,IJSIZEYF,IKU)) + ELSE + NSIZELBXTKE_ll=2*JPHEXT ! 2 + NSIZELBYTKE_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXTKEM(IISIZEX2,IJSIZEX2,IKU)) + ALLOCATE(XLBYTKEM(IISIZEY2,IJSIZEY2,IKU)) + END IF + ELSE + NSIZELBXTKE_ll=0 + NSIZELBYTKE_ll=0 + ALLOCATE(XLBXTKEM(0,0,0)) + ALLOCATE(XLBYTKEM(0,0,0)) + END IF + ! + IF ( NRR > 0 ) THEN + IF (LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & + .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & + ) THEN + NSIZELBXR_ll=2*NRIMX+2*JPHEXT + NSIZELBYR_ll=2*NRIMY+2*JPHEXT + ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,IKU,NRR)) + ALLOCATE(XLBYRM(IISIZEYF,IJSIZEYF,IKU,NRR)) + ELSE + NSIZELBXR_ll=2*JPHEXT ! 2 + NSIZELBYR_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,IKU,NRR)) + ALLOCATE(XLBYRM(IISIZEY2,IJSIZEY2,IKU,NRR)) + ENDIF + ELSE + NSIZELBXR_ll=0 + NSIZELBYR_ll=0 + ALLOCATE(XLBXRM(0,0,0,0)) + ALLOCATE(XLBYRM(0,0,0,0)) + END IF + ! + IF ( NSV > 0 ) THEN + IF ( ANY( LHORELAX_SV(:)) ) THEN + NSIZELBXSV_ll=2*NRIMX+2*JPHEXT + NSIZELBYSV_ll=2*NRIMY+2*JPHEXT + ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,IKU,NSV)) + ALLOCATE(XLBYSVM(IISIZEYF,IJSIZEYF,IKU,NSV)) + ELSE + NSIZELBXSV_ll=2*JPHEXT ! 2 + NSIZELBYSV_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,IKU,NSV)) + ALLOCATE(XLBYSVM(IISIZEY2,IJSIZEY2,IKU,NSV)) + END IF + ELSE + NSIZELBXSV_ll=0 + NSIZELBYSV_ll=0 + ALLOCATE(XLBXSVM(0,0,0,0)) + ALLOCATE(XLBYSVM(0,0,0,0)) + END IF +END IF ! END OF THE IF STRUCTURE ON THE MODEL DIMENSION +! +! +IF ( KMI > 1 ) THEN + ! it has been assumed that the THeta field used the largest rim area compared + ! to the others prognostic variables, if it is not the case, you must change + ! these lines + ALLOCATE(XCOEFLIN_LBXM(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3))) + ALLOCATE( NKLIN_LBXM(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3))) + ALLOCATE(XCOEFLIN_LBYM(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3))) + ALLOCATE( NKLIN_LBYM(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3))) + ALLOCATE(XCOEFLIN_LBXU(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3))) + ALLOCATE( NKLIN_LBXU(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3))) + ALLOCATE(XCOEFLIN_LBYU(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3))) + ALLOCATE( NKLIN_LBYU(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3))) + ALLOCATE(XCOEFLIN_LBXV(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3))) + ALLOCATE( NKLIN_LBXV(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3))) + ALLOCATE(XCOEFLIN_LBYV(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3))) + ALLOCATE( NKLIN_LBYV(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3))) + ALLOCATE(XCOEFLIN_LBXW(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3))) + ALLOCATE( NKLIN_LBXW(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3))) + ALLOCATE(XCOEFLIN_LBYW(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3))) + ALLOCATE( NKLIN_LBYW(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3))) +END IF +! +! allocation of the LS fields for vertical relaxation and numerical diffusion +IF( .NOT. LSTEADYLS ) THEN +! + ALLOCATE(XLSUS(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) + ALLOCATE(XLSVS(SIZE(XLSVM,1),SIZE(XLSVM,2),SIZE(XLSVM,3))) + ALLOCATE(XLSWS(SIZE(XLSWM,1),SIZE(XLSWM,2),SIZE(XLSWM,3))) + ALLOCATE(XLSTHS(SIZE(XLSTHM,1),SIZE(XLSTHM,2),SIZE(XLSTHM,3))) + ALLOCATE(XLSRVS(SIZE(XLSRVM,1),SIZE(XLSRVM,2),SIZE(XLSRVM,3))) +! +ELSE +! + ALLOCATE(XLSUS(0,0,0)) + ALLOCATE(XLSVS(0,0,0)) + ALLOCATE(XLSWS(0,0,0)) + ALLOCATE(XLSTHS(0,0,0)) + ALLOCATE(XLSRVS(0,0,0)) +! +END IF +! allocation of the LB fields for horizontal relaxation and Lateral Boundaries +IF( .NOT. ( LSTEADYLS .AND. KMI==1 ) ) THEN +! + ALLOCATE(XLBXTKES(SIZE(XLBXTKEM,1),SIZE(XLBXTKEM,2),SIZE(XLBXTKEM,3))) + ALLOCATE(XLBYTKES(SIZE(XLBYTKEM,1),SIZE(XLBYTKEM,2),SIZE(XLBYTKEM,3))) + ALLOCATE(XLBXUS(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3))) + ALLOCATE(XLBYUS(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3))) + ALLOCATE(XLBXVS(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3))) + ALLOCATE(XLBYVS(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3))) + ALLOCATE(XLBXWS(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3))) + ALLOCATE(XLBYWS(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3))) + ALLOCATE(XLBXTHS(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3))) + ALLOCATE(XLBYTHS(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3))) + ALLOCATE(XLBXRS(SIZE(XLBXRM,1),SIZE(XLBXRM,2),SIZE(XLBXRM,3),SIZE(XLBXRM,4))) + ALLOCATE(XLBYRS(SIZE(XLBYRM,1),SIZE(XLBYRM,2),SIZE(XLBYRM,3),SIZE(XLBYRM,4))) + ALLOCATE(XLBXSVS(SIZE(XLBXSVM,1),SIZE(XLBXSVM,2),SIZE(XLBXSVM,3),SIZE(XLBXSVM,4))) + ALLOCATE(XLBYSVS(SIZE(XLBYSVM,1),SIZE(XLBYSVM,2),SIZE(XLBYSVM,3),SIZE(XLBYSVM,4))) +! +ELSE +! + ALLOCATE(XLBXTKES(0,0,0)) + ALLOCATE(XLBYTKES(0,0,0)) + ALLOCATE(XLBXUS(0,0,0)) + ALLOCATE(XLBYUS(0,0,0)) + ALLOCATE(XLBXVS(0,0,0)) + ALLOCATE(XLBYVS(0,0,0)) + ALLOCATE(XLBXWS(0,0,0)) + ALLOCATE(XLBYWS(0,0,0)) + ALLOCATE(XLBXTHS(0,0,0)) + ALLOCATE(XLBYTHS(0,0,0)) + ALLOCATE(XLBXRS(0,0,0,0)) + ALLOCATE(XLBYRS(0,0,0,0)) + ALLOCATE(XLBXSVS(0,0,0,0)) + ALLOCATE(XLBYSVS(0,0,0,0)) +! +END IF +! +! +!* 3.7 Module MODD_RADIATIONS_n (except XOZON and XAER) +! +! +NSWB_MNH = 6 +ALLOCATE(XSW_BANDS (NSWB_MNH)) +ALLOCATE(XZENITH (IIU,IJU)) +ALLOCATE(XAZIM (IIU,IJU)) +ALLOCATE(XALBUV (IIU,IJU)) +ALLOCATE(XDIRSRFSWD(IIU,IJU,NSWB_MNH)) +ALLOCATE(XSCAFLASWD(IIU,IJU,NSWB_MNH)) +ALLOCATE(XFLALWD (IIU,IJU)) +! +IF (CRAD /= 'NONE') THEN + ALLOCATE(XSLOPANG(IIU,IJU)) + ALLOCATE(XSLOPAZI(IIU,IJU)) + ALLOCATE(XDTHRAD(IIU,IJU,IKU)) + ALLOCATE(XDIRFLASWD(IIU,IJU,NSWB_MNH)) + ALLOCATE(XDIR_ALB(IIU,IJU,NSWB_MNH)) + ALLOCATE(XSCA_ALB(IIU,IJU,NSWB_MNH)) + ALLOCATE(XEMIS (IIU,IJU)) + ALLOCATE(XTSRAD (IIU,IJU)) ; XTSRAD = 0.0 + ALLOCATE(XSEA (IIU,IJU)) + ALLOCATE(XZS_XY (IIU,IJU)) + ALLOCATE(NCLEARCOL_TM1(IIU,IJU)) + ALLOCATE(XSWU(IIU,IJU,IKU)) + ALLOCATE(XSWD(IIU,IJU,IKU)) + ALLOCATE(XLWU(IIU,IJU,IKU)) + ALLOCATE(XLWD(IIU,IJU,IKU)) + ALLOCATE(XDTHRADSW(IIU,IJU,IKU)) + ALLOCATE(XDTHRADLW(IIU,IJU,IKU)) + ALLOCATE(XRADEFF(IIU,IJU,IKU)) +ELSE + ALLOCATE(XSLOPANG(0,0)) + ALLOCATE(XSLOPAZI(0,0)) + ALLOCATE(XDTHRAD(0,0,0)) + ALLOCATE(XDIRFLASWD(0,0,0)) + ALLOCATE(XDIR_ALB(0,0,0)) + ALLOCATE(XSCA_ALB(0,0,0)) + ALLOCATE(XEMIS (0,0)) + ALLOCATE(XTSRAD (0,0)) + ALLOCATE(XSEA (0,0)) + ALLOCATE(XZS_XY (0,0)) + ALLOCATE(NCLEARCOL_TM1(0,0)) + ALLOCATE(XSWU(0,0,0)) + ALLOCATE(XSWD(0,0,0)) + ALLOCATE(XLWU(0,0,0)) + ALLOCATE(XLWD(0,0,0)) + ALLOCATE(XDTHRADSW(0,0,0)) + ALLOCATE(XDTHRADLW(0,0,0)) + ALLOCATE(XRADEFF(0,0,0)) +END IF + +IF (CRAD == 'ECMW') THEN + ALLOCATE(XSTROATM(31,6)) + ALLOCATE(XSMLSATM(31,6)) + ALLOCATE(XSMLWATM(31,6)) + ALLOCATE(XSPOSATM(31,6)) + ALLOCATE(XSPOWATM(31,6)) + ALLOCATE(XSTATM(31,6)) +ELSE + ALLOCATE(XSTROATM(0,0)) + ALLOCATE(XSMLSATM(0,0)) + ALLOCATE(XSMLWATM(0,0)) + ALLOCATE(XSPOSATM(0,0)) + ALLOCATE(XSPOWATM(0,0)) + ALLOCATE(XSTATM(0,0)) +END IF +! +!* 3.8 Module MODD_DEEP_CONVECTION_n +! +IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN + ALLOCATE(NCOUNTCONV(IIU,IJU)) + ALLOCATE(XDTHCONV(IIU,IJU,IKU)) + ALLOCATE(XDRVCONV(IIU,IJU,IKU)) + ALLOCATE(XDRCCONV(IIU,IJU,IKU)) + ALLOCATE(XDRICONV(IIU,IJU,IKU)) + ALLOCATE(XPRCONV(IIU,IJU)) + ALLOCATE(XPACCONV(IIU,IJU)) + ALLOCATE(XPRSCONV(IIU,IJU)) + ! diagnostics + IF (LCH_CONV_LINOX) THEN + ALLOCATE(XIC_RATE(IIU,IJU)) + ALLOCATE(XCG_RATE(IIU,IJU)) + ALLOCATE(XIC_TOTAL_NUMBER(IIU,IJU)) + ALLOCATE(XCG_TOTAL_NUMBER(IIU,IJU)) + ELSE + ALLOCATE(XIC_RATE(0,0)) + ALLOCATE(XCG_RATE(0,0)) + ALLOCATE(XIC_TOTAL_NUMBER(0,0)) + ALLOCATE(XCG_TOTAL_NUMBER(0,0)) + END IF + IF ( LDIAGCONV ) THEN + ALLOCATE(XUMFCONV(IIU,IJU,IKU)) + ALLOCATE(XDMFCONV(IIU,IJU,IKU)) + ALLOCATE(XPRLFLXCONV(IIU,IJU,IKU)) + ALLOCATE(XPRSFLXCONV(IIU,IJU,IKU)) + ALLOCATE(XCAPE(IIU,IJU)) + ALLOCATE(NCLTOPCONV(IIU,IJU)) + ALLOCATE(NCLBASCONV(IIU,IJU)) + ELSE + ALLOCATE(XUMFCONV(0,0,0)) + ALLOCATE(XDMFCONV(0,0,0)) + ALLOCATE(XPRLFLXCONV(0,0,0)) + ALLOCATE(XPRSFLXCONV(0,0,0)) + ALLOCATE(XCAPE(0,0)) + ALLOCATE(NCLTOPCONV(0,0)) + ALLOCATE(NCLBASCONV(0,0)) + END IF +ELSE + ALLOCATE(XPRCONV(0,0)) + ALLOCATE(XPACCONV(0,0)) + ALLOCATE(XPRSCONV(0,0)) +END IF +! +IF ((CDCONV == 'KAFR' .OR. CSCONV == 'KAFR') & + .AND. LSUBG_COND .AND. LSIG_CONV) THEN + ALLOCATE(XMFCONV(IIU,IJU,IKU)) +ELSE + ALLOCATE(XMFCONV(0,0,0)) +ENDIF +! +IF ((CDCONV == 'KAFR' .OR. CSCONV == 'KAFR') & + .AND. LCHTRANS .AND. NSV > 0 ) THEN + ALLOCATE(XDSVCONV(IIU,IJU,IKU,NSV)) +ELSE + ALLOCATE(XDSVCONV(0,0,0,0)) +END IF +! +ALLOCATE(XCF_MF(IIU,IJU,IKU)) ; XCF_MF=0.0 +ALLOCATE(XRC_MF(IIU,IJU,IKU)) ; XRC_MF=0.0 +ALLOCATE(XRI_MF(IIU,IJU,IKU)) ; XRI_MF=0.0 +! +!* 3.9 Local variables +! +ALLOCATE(ZJ(IIU,IJU,IKU)) +! +!* 3.10 Forcing variables (Module MODD_FRC) +! +IF (KMI == 1) THEN + IF ( LFORCING ) THEN + ALLOCATE(TDTFRC(NFRC)) + ALLOCATE(XUFRC(IKU,NFRC)) + ALLOCATE(XVFRC(IKU,NFRC)) + ALLOCATE(XWFRC(IKU,NFRC)) + ALLOCATE(XTHFRC(IKU,NFRC)) + ALLOCATE(XRVFRC(IKU,NFRC)) + ALLOCATE(XTENDTHFRC(IKU,NFRC)) + ALLOCATE(XTENDRVFRC(IKU,NFRC)) + ALLOCATE(XGXTHFRC(IKU,NFRC)) + ALLOCATE(XGYTHFRC(IKU,NFRC)) + ALLOCATE(XPGROUNDFRC(NFRC)) + ELSE + ALLOCATE(TDTFRC(0)) + ALLOCATE(XUFRC(0,0)) + ALLOCATE(XVFRC(0,0)) + ALLOCATE(XWFRC(0,0)) + ALLOCATE(XTHFRC(0,0)) + ALLOCATE(XRVFRC(0,0)) + ALLOCATE(XTENDTHFRC(0,0)) + ALLOCATE(XTENDRVFRC(0,0)) + ALLOCATE(XGXTHFRC(0,0)) + ALLOCATE(XGYTHFRC(0,0)) + ALLOCATE(XPGROUNDFRC(0)) + END IF + IF ( LFORCING ) THEN + ALLOCATE(XWTFRC(IIU,IJU,IKU)) + ALLOCATE(XUFRC_PAST(IIU,IJU,IKU)) ; XUFRC_PAST = XUNDEF + ALLOCATE(XVFRC_PAST(IIU,IJU,IKU)) ; XVFRC_PAST = XUNDEF + ELSE + ALLOCATE(XWTFRC(0,0,0)) + ALLOCATE(XUFRC_PAST(0,0,0)) + ALLOCATE(XVFRC_PAST(0,0,0)) + END IF +END IF +! ---------------------------------------------------------------------- +! +IF (L2D_ADV_FRC) THEN + WRITE(ILUOUT,*) 'L2D_ADV_FRC IS SET TO', L2D_ADV_FRC + WRITE(ILUOUT,*) 'ADV FRC WILL BE SET' + ALLOCATE(TDTADVFRC(NADVFRC)) + ALLOCATE(XDTHFRC(IIU,IJU,IKU,NADVFRC)) ; XDTHFRC=0. + ALLOCATE(XDRVFRC(IIU,IJU,IKU,NADVFRC)) ; XDRVFRC=0. +ELSE + ALLOCATE(TDTADVFRC(0)) + ALLOCATE(XDTHFRC(0,0,0,0)) + ALLOCATE(XDRVFRC(0,0,0,0)) +ENDIF + +IF (L2D_REL_FRC) THEN + WRITE(ILUOUT,*) 'L2D_REL_FRC IS SET TO', L2D_REL_FRC + WRITE(ILUOUT,*) 'REL FRC WILL BE SET' + ALLOCATE(TDTRELFRC(NRELFRC)) + ALLOCATE(XTHREL(IIU,IJU,IKU,NRELFRC)) ; XTHREL=0. + ALLOCATE(XRVREL(IIU,IJU,IKU,NRELFRC)) ; XRVREL=0. +ELSE + ALLOCATE(TDTRELFRC(0)) + ALLOCATE(XTHREL(0,0,0,0)) + ALLOCATE(XRVREL(0,0,0,0)) +ENDIF +! +!* 4.11 BIS: Eddy fluxes allocation +! +IF ( LTH_FLX ) THEN + ALLOCATE(XVTH_FLUX_M(IIU,IJU,IKU)) ; XVTH_FLUX_M = 0. + ALLOCATE(XWTH_FLUX_M(IIU,IJU,IKU)) ; XWTH_FLUX_M = 0. + IF (KMI /= 1) THEN + ALLOCATE(XRTHS_EDDY_FLUX(IIU,IJU,IKU)) + XRTHS_EDDY_FLUX = 0. + ENDIF +ELSE + ALLOCATE(XVTH_FLUX_M(0,0,0)) ; XVTH_FLUX_M = 0. + ALLOCATE(XWTH_FLUX_M(0,0,0)) ; XWTH_FLUX_M = 0. +END IF +! +IF ( LUV_FLX) THEN + ALLOCATE(XVU_FLUX_M(IIU,IJU,IKU)) ; XVU_FLUX_M = 0. + IF (KMI /= 1) THEN + ALLOCATE(XRVS_EDDY_FLUX(IIU,IJU,IKU)) + XRVS_EDDY_FLUX = 0. + ENDIF +ELSE + ALLOCATE(XVU_FLUX_M(0,0,0)) ; XVU_FLUX_M = 0. +END IF +! +!* 3.11 Module MODD_ICE_CONC_n +! +IF ( (CCLOUD == 'ICE3'.OR.CCLOUD == 'ICE4') .AND. & + (CPROGRAM == 'DIAG '.OR.CPROGRAM == 'MESONH')) THEN + ALLOCATE(XCIT(IIU,IJU,IKU)) +ELSE + ALLOCATE(XCIT(0,0,0)) +END IF +! +!* 3.12 Module MODD_TURB_CLOUD +! +IF (.NOT.(ALLOCATED(XCEI))) ALLOCATE(XCEI(0,0,0)) +IF (KMI == NMODEL_CLOUD .AND. CTURBLEN_CLOUD/='NONE' ) THEN + DEALLOCATE(XCEI) + ALLOCATE(XCEI(IIU,IJU,IKU)) +ENDIF +! +!* 3.13 Module MODD_CH_PH_n +! +IF (LUSECHAQ.AND.(CPROGRAM == 'DIAG '.OR.CPROGRAM == 'MESONH')) THEN + IF (LCH_PH) THEN + ALLOCATE(XPHC(IIU,IJU,IKU)) + IF (NRRL==2) THEN + ALLOCATE(XPHR(IIU,IJU,IKU)) + ENDIF + ENDIF + ALLOCATE(XACPRAQ(IIU,IJU,NSV_CHAC/2)) + XACPRAQ(:,:,:) = 0. +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 4. INITIALIZE BUDGET VARIABLES +! --------------------------- +! +IF ( CBUTYPE /= "NONE" .AND. NBUMOD == KMI ) THEN + CALL INI_BUDGET(ILUOUT, HLUOUT,XTSTEP,NSV,NRR, & + LNUMDIFU,LNUMDIFTH,LNUMDIFSV, & + LHORELAX_UVWTH,LHORELAX_RV, LHORELAX_RC,LHORELAX_RR, & + LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, LHORELAX_RH,LHORELAX_TKE, & + LHORELAX_SV,LVE_RELAX,LCHTRANS,LNUDGING,LDRAGTREE, & + CRAD,CDCONV,CSCONV,CTURB,CTURBDIM,CCLOUD ) +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 5. INITIALIZE INTERPOLATION COEFFICIENTS +! +CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI) +! +!------------------------------------------------------------------------------- +! +!* 6. INITIALIZE GRIDS AND METRIC COEFFICIENTS +! ---------------------------------------- +! +CALL SET_GRID(KMI,HINIFILE,HLUOUT,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll, & + XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, & + XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, & + NXOR_ALL(KMI),NYOR_ALL(KMI),NXEND_ALL(KMI),NYEND_ALL(KMI), & + NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & + CLBCX,CLBCY, & + XTSTEP,XSEGLEN, & + XLONORI,XLATORI,XLON,XLAT, & + XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP, & + XZS,XZZ,XZHAT,LSLEVE,XLEN1,XLEN2,XZSMT, & + ZJ, & + TDTMOD,TDTCUR,NSTOP,NOUT_TIMES,NOUT_NUMB) +! +CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) +! +!* update halos of metric coefficients +! +! +CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) +! +! +CALL SET_DIRCOS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,TZINITHALO2D_ll, & + XDIRCOSXW,XDIRCOSYW,XDIRCOSZW,XCOSSLOPE,XSINSLOPE ) +! +! grid nesting initializations +IF ( KMI == 1 ) THEN + XTSTEP_MODEL1=XTSTEP +END IF +! +NDT_2_WAY(KMI)=4 +! +!------------------------------------------------------------------------------- +! +!* 7. INITIALIZE DATA FOR JVALUES AND AEROSOLS +! +IF ( LUSECHEM .OR. LCHEMDIAG ) THEN + IF ((KMI==1).AND.(CPROGRAM == "MESONH".OR.CPROGRAM == "DIAG ")) & + CALL CH_INIT_JVALUES(TDTCUR%TDATE%DAY, TDTCUR%TDATE%MONTH, & + TDTCUR%TDATE%YEAR, ILUOUT, XCH_TUV_DOBNEW) +! + IF (LORILAM) THEN + CALL CH_AER_MOD_INIT + ELSE + IF (.NOT.(ASSOCIATED(XSOLORG))) ALLOCATE(XSOLORG(0,0,0,0)) + IF (.NOT.(ASSOCIATED(XMI))) ALLOCATE(XMI(0,0,0,0)) + ENDIF +ELSE + IF (.NOT.(ASSOCIATED(XMI))) ALLOCATE(XMI(0,0,0,0)) + IF (.NOT.(ASSOCIATED(XSOLORG))) ALLOCATE(XSOLORG(0,0,0,0)) +END IF +! +!------------------------------------------------------------------------------- +! +!* 8. INITIALIZE THE PROGNOSTIC FIELDS +! -------------------------------- +! +CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before read_field::XUT",PRECISION) +CALL READ_FIELD(HINIFILE,HLUOUT,IMASDEV, IIU,IJU,IKU,XTSTEP, & + CGETTKET,CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETCIT, & + CGETRST,CGETRGT,CGETRHT,CGETSVT,CGETSRCT,CGETSIGS,CGETCLDFR, & + CGETBL_DEPTH,CGETSBL_DEPTH,CGETPHC,CGETPHR,CUVW_ADV_SCHEME, & + NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll, & + NSIZELBXTKE_ll,NSIZELBYTKE_ll, & + NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & + XUM,XVM,XWM,XDUM,XDVM,XDWM, & + XUT,XVT,XWT,XTHT,XPABST,XPABSM,XTKET,XRTKEMS, & + XRT,XSVT,XCIT,XDRYMASST, & + XSIGS,XSRCT,XCLDFR,XBL_DEPTH,XSBL_DEPTH,XWTHVMF,XPHC,XPHR, & + XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM, & + XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM, & + XLBXRM,XLBXSVM, & + XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM, & + XLBYRM,XLBYSVM, & + NFRC,TDTFRC,XUFRC,XVFRC,XWFRC,XTHFRC,XRVFRC, & + XTENDTHFRC,XTENDRVFRC,XGXTHFRC,XGYTHFRC, & + XPGROUNDFRC, XATC, & + NADVFRC,TDTADVFRC,XDTHFRC,XDRVFRC, & + NRELFRC,TDTRELFRC,XTHREL,XRVREL, & + XVTH_FLUX_M,XWTH_FLUX_M,XVU_FLUX_M, & + XRUS_PRES,XRVS_PRES,XRWS_PRES,XRTHS_CLD,XRRS_CLD,XRSVS_CLD ) +! +!------------------------------------------------------------------------------- +! +! +!* 9. INITIALIZE REFERENCE STATE +! --------------------------- +! +! +CALL SET_REF(KMI,HINIFILE,HLUOUT, & + XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY, & + XREFMASS,XMASS_O_PHI0,XLINMASS, & + XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ ) +! +!------------------------------------------------------------------------------- +! +!* 10.1 INITIALIZE THE TURBULENCE VARIABLES +! ----------------------------------- +! +IF ((CTURB == 'TKEL').AND.(CCONF=='START')) THEN + CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before ini_tke_eps::XUT",PRECISION) + CALL INI_TKE_EPS(CGETTKET,XTHVREF,XZZ, & + XUT,XVT,XTHT, & + XTKET,TZINITHALO3D_ll ) + CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-after ini_tke_eps::XUT",PRECISION) +END IF +! +! +!* 10.2 INITIALIZE THE LES VARIABLES +! ---------------------------- +! +CALL INI_LES_n +! +!------------------------------------------------------------------------------- +! +!* 11. INITIALIZE THE SOURCE OF TOTAL DRY MASS Md +! ------------------------------------------ +! +IF((KMI==1).AND.LSTEADYLS) THEN + XDRYMASSS = 0. +END IF +! +!------------------------------------------------------------------------------- +! +!* 12. INITIALIZE THE MICROPHYSICS +! ---------------------------- +! +IF (CELEC == 'NONE') THEN + CALL INI_MICRO_n(ILUOUT) +! +!------------------------------------------------------------------------------- +! +!* 13. INITIALIZE THE ATMOSPHERIC ELECTRICITY +! -------------------------------------- +! +ELSE + CALL INI_ELEC_n(ILUOUT, CELEC, CCLOUD, HLUOUT, CINIFILE, & + XTSTEP, XZZ, & + XDXX, XDYY, XDZZ, XDZX, XDZY ) +! + WRITE (UNIT=ILUOUT,& + FMT='(/,"ELECTRIC VARIABLES ARE BETWEEN INDEX",I2," AND ",I2)')& + NSV_ELECBEG, NSV_ELECEND +! + IF( CGETSVT(NSV_ELECBEG)=='INIT' ) THEN + XSVT(:,:,:,NSV_ELECBEG) = XCION_POS_FW(:,:,:) ! Nb/kg + XSVT(:,:,:,NSV_ELECEND) = XCION_NEG_FW(:,:,:) +! + XSVT(:,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + ELSE ! Convert elec_variables per m3 into elec_variables per kg of air + DO JSV = NSV_ELECBEG, NSV_ELECEND + XSVT(:,:,:,JSV) = XSVT(:,:,:,JSV) / XRHODREF(:,:,:) + ENDDO + END IF +END IF +! +!------------------------------------------------------------------------------- +! +!* 14. INITIALIZE THE LARGE SCALE SOURCES +! ---------------------------------- +! +IF ((KMI==1).AND.(.NOT. LSTEADYLS)) THEN + CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before ini_cpl::XUT",PRECISION) + CALL INI_CPL(HLUOUT,NSTOP,XTSTEP,LSTEADYLS,CCONF, & + CGETTKET, & + CGETRVT,CGETRCT,CGETRRT,CGETRIT, & + CGETRST,CGETRGT,CGETRHT,CGETSVT,LCH_INIT_FIELD, & + NSV,NIMAX_ll,NJMAX_ll, & + NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll, & + NSIZELBXTKE_ll,NSIZELBYTKE_ll, & + NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & + XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XDRYMASST, & + XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & + XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & + XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XDRYMASSS, & + XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & + XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS ) + CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-after ini_cpl::XUT",PRECISION) +END IF +! +IF ( KMI > 1) THEN + ! Use dummy pointers to correct an ifort BUG + DPTR_XBMX1=>XBMX1 + DPTR_XBMX2=>XBMX2 + DPTR_XBMX3=>XBMX3 + DPTR_XBMX4=>XBMX4 + DPTR_XBMY1=>XBMY1 + DPTR_XBMY2=>XBMY2 + DPTR_XBMY3=>XBMY3 + DPTR_XBMY4=>XBMY4 + DPTR_XBFX1=>XBFX1 + DPTR_XBFX2=>XBFX2 + DPTR_XBFX3=>XBFX3 + DPTR_XBFX4=>XBFX4 + DPTR_XBFY1=>XBFY1 + DPTR_XBFY2=>XBFY2 + DPTR_XBFY3=>XBFY3 + DPTR_XBFY4=>XBFY4 + DPTR_CLBCX=>CLBCX + DPTR_CLBCY=>CLBCY + ! + DPTR_XZZ=>XZZ + DPTR_XZHAT=>XZHAT + DPTR_XLSUM=>XLSUM + DPTR_XLSVM=>XLSVM + DPTR_XLSWM=>XLSWM + DPTR_XLSTHM=>XLSTHM + DPTR_XLSRVM=>XLSRVM + DPTR_XLSUS=>XLSUS + DPTR_XLSVS=>XLSVS + DPTR_XLSWS=>XLSWS + DPTR_XLSTHS=>XLSTHS + DPTR_XLSRVS=>XLSRVS + ! + DPTR_NKLIN_LBXU=>NKLIN_LBXU + DPTR_XCOEFLIN_LBXU=>XCOEFLIN_LBXU + DPTR_NKLIN_LBYU=>NKLIN_LBYU + DPTR_XCOEFLIN_LBYU=>XCOEFLIN_LBYU + DPTR_NKLIN_LBXV=>NKLIN_LBXV + DPTR_XCOEFLIN_LBXV=>XCOEFLIN_LBXV + DPTR_NKLIN_LBYV=>NKLIN_LBYV + DPTR_XCOEFLIN_LBYV=>XCOEFLIN_LBYV + DPTR_NKLIN_LBXW=>NKLIN_LBXW + DPTR_XCOEFLIN_LBXW=>XCOEFLIN_LBXW + DPTR_NKLIN_LBYW=>NKLIN_LBYW + DPTR_XCOEFLIN_LBYW=>XCOEFLIN_LBYW + DPTR_NKLIN_LBXM=>NKLIN_LBXM + DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM + DPTR_NKLIN_LBYM=>NKLIN_LBYM + DPTR_XCOEFLIN_LBYM=>XCOEFLIN_LBYM + ! + CALL INI_SPAWN_LS_n(NDAD(KMI),XTSTEP,KMI, & + DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & + DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & + NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & + DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT, & + LSLEVE,XLEN1,XLEN2, & + DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM, & + DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS, & + DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & + DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & + DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & + DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM ) + ! + DPTR_XLBXUM=>XLBXUM + DPTR_XLBYUM=>XLBYUM + DPTR_XLBXVM=>XLBXVM + DPTR_XLBYVM=>XLBYVM + DPTR_XLBXWM=>XLBXWM + DPTR_XLBYWM=>XLBYWM + DPTR_XLBXTHM=>XLBXTHM + DPTR_XLBYTHM=>XLBYTHM + DPTR_XLBXTKEM=>XLBXTKEM + DPTR_XLBYTKEM=>XLBYTKEM + DPTR_XLBXRM=>XLBXRM + DPTR_XLBYRM=>XLBYRM + DPTR_XLBXSVM=>XLBXSVM + DPTR_XLBYSVM=>XLBYSVM + CALL INI_ONE_WAY_n(NDAD(KMI),CLUOUT,XTSTEP,KMI,1, & + DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & + DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & + NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),NDTRATIO(KMI), & + DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY, & + DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & + DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & + DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & + DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM, & + CCLOUD, LUSECHAQ, LUSECHIC, & + DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM, & + DPTR_XLBXTHM,DPTR_XLBYTHM, & + DPTR_XLBXTKEM,DPTR_XLBYTKEM, & + DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM ) +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 15. INITIALIZE THE SCALAR VARIABLES +! ------------------------------- +! +IF (LLG .AND. LINIT_LG .AND. CPROGRAM=='MESONH') & + CALL INI_LG(XXHAT,XYHAT,XZZ,XSVT,XLBXSVM,XLBYSVM) + +! +!* 16. BUILT THE GENERIC OUTPUT NAME +! ---------------------------- +! +WRITE(COUTFILE,'(A,".",I1,".",A)') CEXP,KMI,TRIM(ADJUSTL(CSEG)) +WRITE(CFMDIAC, '(A,".",I1,".",A)') CEXP,KMI,TRIM(ADJUSTL(CSEG))//'.000' +IF (CPROGRAM=='MESONH') THEN + IF ( NDAD(KMI) == 1) CDAD_NAME(KMI) = CEXP//'.1.'//CSEG + IF ( NDAD(KMI) == 2) CDAD_NAME(KMI) = CEXP//'.2.'//CSEG + IF ( NDAD(KMI) == 3) CDAD_NAME(KMI) = CEXP//'.3.'//CSEG + IF ( NDAD(KMI) == 4) CDAD_NAME(KMI) = CEXP//'.4.'//CSEG + IF ( NDAD(KMI) == 5) CDAD_NAME(KMI) = CEXP//'.5.'//CSEG + IF ( NDAD(KMI) == 6) CDAD_NAME(KMI) = CEXP//'.6.'//CSEG + IF ( NDAD(KMI) == 7) CDAD_NAME(KMI) = CEXP//'.7.'//CSEG + IF ( NDAD(KMI) == 8) CDAD_NAME(KMI) = CEXP//'.8.'//CSEG +END IF +! +!------------------------------------------------------------------------------- +! +!* 17. INITIALIZE THE PARAMETERS FOR THE DYNAMICS +! ------------------------------------------ +! +CALL INI_DYNAMICS(HLUOUT,XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT, & + XZHAT,CLBCX,CLBCY,XTSTEP, & + LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV, & + LHORELAX_RC,LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, & + LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV, & + LHORELAX_SVC2R2,LHORELAX_SVC1R3,LHORELAX_SVELEC,LHORELAX_SVLG, & + LHORELAX_SVCHEM,LHORELAX_SVAER,LHORELAX_SVDST,LHORELAX_SVSLT, & + LHORELAX_SVPP,LHORELAX_SVCS,LHORELAX_SVCHIC, & +#ifdef MNH_FOREFIRE + LHORELAX_SVFF, & +#endif + XRIMKMAX,NRIMX,NRIMY, & + XALKTOP,XALKGRD,XALZBOT,XALZBAS, & + XT4DIFU,XT4DIFTH,XT4DIFSV, & + XCORIOX,XCORIOY,XCORIOZ,XCURVX,XCURVY, & + XDXHATM,XDYHATM,XRHOM,XAF,XBFY,XCF,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY,& + XALK,XALKW,NALBOT,XALKBAS,XALKWBAS,NALBAS, & + LMASK_RELAX,XKURELAX,XKVRELAX,XKWRELAX, & + XDK2U,XDK4U,XDK2TH,XDK4TH,XDK2SV,XDK4SV, & + LZDIFFU,XZDIFFU_HALO2, & + XBFB,XBF_SXP2_YP1_Z ) +! +!------------------------------------------------------------------------------- +! +!* 18. SURFACE FIELDS +! -------------- +! +!* 18.1 Radiative setup +! --------------- +! +IF (CRAD /= 'NONE') THEN + IF (CGETRAD =='INIT') THEN + GINIRAD =.TRUE. + ELSE + GINIRAD =.FALSE. + END IF + CALL INI_RADIATIONS(HINIFILE,HLUOUT,GINIRAD,TDTCUR,TDTEXP,XZZ, & + XDXX, XDYY, & + XSINDEL,XCOSDEL,XTSIDER,XCORSOL, & + XSLOPANG,XSLOPAZI, & + XDTHRAD,XDIRFLASWD,XSCAFLASWD, & + XFLALWD,XDIRSRFSWD,NCLEARCOL_TM1, & + XZENITH,XAZIM, & + TDTRAD_FULL,TDTRAD_CLONLY, & + TZINITHALO2D_ll, & + XRADEFF,XSWU,XSWD,XLWU, & + XLWD,XDTHRADSW,XDTHRADLW ) + ! + IF (GINIRAD) CALL SUNPOS_n(XZENITH,PAZIMSOL=XAZIM) + CALL SURF_SOLAR_GEOM (XZS, XZS_XY) + ! + ALLOCATE(XXHAT_ll (IIU_ll)) + ALLOCATE(XYHAT_ll (IJU_ll)) + ALLOCATE(XZS_ll (IIU_ll,IJU_ll)) + ALLOCATE(XZS_XY_ll (IIU_ll,IJU_ll)) + ! + CALL GATHERALL_FIELD_ll('XY',XZS,XZS_ll,IRESP) + CALL GATHERALL_FIELD_ll('XY',XZS_XY,XZS_XY_ll,IRESP) + CALL GATHERALL_FIELD_ll('XX',XXHAT,XXHAT_ll,IRESP) + CALL GATHERALL_FIELD_ll('YY',XYHAT,XYHAT_ll,IRESP) + XZS_MAX_ll=MAXVAL(XZS_ll) +ELSE + XAZIM = XPI + XZENITH = XPI/2. + XDIRSRFSWD = 0. + XSCAFLASWD = 0. + XFLALWD = 300. ! W/m2 + XTSIDER = 0. +END IF +! +! +CALL INI_SW_SETUP (CRAD,NSWB_MNH,XSW_BANDS) +! +! +! 18.1.1 Special initialisation for CO2 content +! CO2 (molar mass=44) horizontally and vertically homogeneous at 360 ppm +! +XCCO2 = 360.0E-06 * 44.0E-03 / XMD +! +! +!* 18.2 Externalized surface fields +! --------------------------- +! +ALLOCATE(ZCO2(IIU,IJU)) +ZCO2(:,:) = XCCO2 +! + +ALLOCATE(ZDIR_ALB(IIU,IJU,NSWB_MNH)) +ALLOCATE(ZSCA_ALB(IIU,IJU,NSWB_MNH)) +ALLOCATE(ZEMIS (IIU,IJU)) +ALLOCATE(ZTSRAD (IIU,IJU)) +! +IF (IMASDEV>=46) THEN + CALL FMREAD(HINIFILE,'SURF',HLUOUT,'--',CSURF,IGRID,ILENCH,YCOMMENT,IRESP) +ELSE + CSURF = "EXTE" +END IF +! +! +IF (CSURF=='EXTE' .AND. (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG ')) THEN + ! ouverture du fichier PGD + IF ( LEN_TRIM(CINIFILEPGD) > 0 ) THEN + CALL FMOPEN_ll(CINIFILEPGD,'READ',HLUOUT,0,2,NVERB,ININAR,IRESP,OPARALLELIO=.FALSE.) + IF (IRESP/=0) THEN + WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD + WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNITn" + !callabortstop + CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF + ELSE + ! case after a spawning + CINIFILEPGD = HINIFILE + END IF + ! + CALL GOTO_SURFEX(KMI) + !* initialization of surface + ! + ! +#ifdef CPLOASIS + CALL SFX_OASIS_READ_NAM(CPROGRAM,XTSTEP) + WRITE(*,*) 'SFX-OASIS: READ NAM_SFX_SEA_CPL OK' +#endif + ! + CALL INIT_GROUND_PARAM_n ('ALL',SIZE(CSV),CSV,ZCO2, & + XZENITH,XAZIM,XSW_BANDS,ZDIR_ALB,ZSCA_ALB, & + ZEMIS,ZTSRAD ) + ! + IF (SIZE(XEMIS)>0) THEN + XDIR_ALB = ZDIR_ALB + XSCA_ALB = ZSCA_ALB + XEMIS = ZEMIS + XTSRAD = ZTSRAD + CALL MNHGET_SURF_PARAM_n (PSEA=XSEA) + END IF +ELSE + !* fields not physically necessary, but must be initialized + IF (SIZE(XEMIS)>0) THEN + XDIR_ALB = 0. + XSCA_ALB = 0. + XEMIS = 1. + XTSRAD = XTT + XSEA = 1. + END IF +END IF +IF (CSURF=='EXTE' .AND. (CPROGRAM=='SPAWN ')) THEN + ! ouverture du fichier PGD + CALL FMOPEN_ll(CINIFILEPGD,'READ',HLUOUT,0,2,NVERB,ININAR,IRESP,OPARALLELIO=.FALSE.) + IF (IRESP/=0) THEN + WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD + WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNIT2_SPA" + !callabortstop + CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF +ENDIF +! + !* special case after spawning in prep_real_case +IF (CSURF=='EXRM' .AND. CPROGRAM=='REAL ') CSURF = 'EXTE' +! +DEALLOCATE(ZDIR_ALB) +DEALLOCATE(ZSCA_ALB) +DEALLOCATE(ZEMIS ) +DEALLOCATE(ZTSRAD ) +! +DEALLOCATE(ZCO2) +! +! +!* in a RESTART case, reads surface radiative quantities in the MESONH file +! +IF (CRAD == 'ECMW' .AND. CGETRAD=='READ') THEN + CALL INI_SURF_RAD(HINIFILE, CLUOUT, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD) +END IF +! +! +!* 18.3 Mesonh fields +! ------------- +! +IF (CPROGRAM/='REAL ') CALL MNHREAD_ZS_DUMMY_n(CINIFILEPGD) +! +!------------------------------------------------------------------------------- +! +!* 19. INITIALIZE THE PARAMETERS FOR THE PHYSICS +! ----------------------------------------- +! +IF (CRAD == 'ECMW') THEN +! +!* get cover mask for aerosols +! + IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG ') THEN + ALLOCATE(ZSEA(IIU,IJU)) + ALLOCATE(ZTOWN(IIU,IJU)) + ALLOCATE(ZBARE(IIU,IJU)) + IF (CSURF=='EXTE') THEN + CALL GOTO_SURFEX(KMI) + CALL MNHGET_SURF_PARAM_n(PSEA=ZSEA,PTOWN=ZTOWN,PBARE=ZBARE) + ELSE + ZSEA (:,:) = 1. + ZTOWN(:,:) = 0. + ZBARE(:,:) = 0. + END IF +! + CALL INI_RADIATIONS_ECMWF (HINIFILE,HLUOUT, & + XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP, & + CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB,CAER,NAER,NSTATM, & + XSTATM,ZSEA,ZTOWN,ZBARE,XOZON, XAER,XDST_WL, LSUBG_COND ) +! + DEALLOCATE(ZSEA,ZTOWN,ZBARE) + ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4))) + XAER_CLIM(:,:,:,:) =XAER(:,:,:,:) +! + END IF +ELSE + ALLOCATE (XOZON(0,0,0)) + ALLOCATE (XAER(0,0,0,0)) + ALLOCATE (XDST_WL(0,0,0,0)) + ALLOCATE (XAER_CLIM(0,0,0,0)) +END IF +! +! +! +IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN + IF (CGETCONV=='INIT') THEN + GINIDCONV=.TRUE. + ELSE + GINIDCONV=.FALSE. + END IF +! +! commensurability between convection calling time and time step +! + XDTCONV=XTSTEP*REAL( INT( (MIN(XDTCONV,1800.)+1.E-10)/XTSTEP ) ) + XDTCONV=MAX( XDTCONV, XTSTEP ) + IF (NVERB>=10) THEN + WRITE(ILUOUT,*) 'XDTCONV has been set to : ',XDTCONV + END IF + CALL INI_DEEP_CONVECTION (HINIFILE,HLUOUT,GINIDCONV,TDTCUR, & + NCOUNTCONV,XDTHCONV,XDRVCONV,XDRCCONV, & + XDRICONV,XPRCONV,XPRSCONV,XPACCONV, & + XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,& + XCAPE,NCLTOPCONV,NCLBASCONV, & + TDTDCONV, CGETSVCONV, XDSVCONV, & + LCH_CONV_LINOX, XIC_RATE, XCG_RATE, & + XIC_TOTAL_NUMBER, XCG_TOTAL_NUMBER ) + +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 19. ALLOCATION OF THE TEMPORAL SERIES +! --------------------------------- +! +IF (LSERIES .AND. CPROGRAM/='DIAG ') CALL INI_SERIES_n +! +!------------------------------------------------------------------------------- +! +! +!* 20. (re)initialize scalar variables +! ------------------------------- +! +! +IF ( LUSECHEM .OR. LCHEMDIAG ) THEN + IF (CPROGRAM=='MESONH'.AND.CCONF=='RESTA') LCH_INIT_FIELD =.FALSE. + IF (CPROGRAM=='MESONH'.OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='IDEAL ') & + CALL CH_INIT_FIELD_n(KMI, ILUOUT, NVERB) +END IF +! +!------------------------------------------------------------------------------- +! +!* 22. UPDATE HALO +! ----------- +! +! +CALL UPDATE_HALO_ll(TZINITHALO3D_ll,IINFO_ll) +CALL UPDATE_HALO_ll(TZINITHALO2D_ll,IINFO_ll) +CALL CLEANLIST_ll(TZINITHALO3D_ll) +CALL CLEANLIST_ll(TZINITHALO2D_ll) +! +! +!------------------------------------------------------------------------------- +! +!* 23. DEALLOCATION +! ------------- +! +DEALLOCATE(ZJ) +! +DEALLOCATE(XSTROATM) +DEALLOCATE(XSMLSATM) +DEALLOCATE(XSMLWATM) +DEALLOCATE(XSPOSATM) +DEALLOCATE(XSPOWATM) +! +!------------------------------------------------------------------------------- +! +!* 24. BALLOON and AIRCRAFT initializations +! ------------------------------------ +! +CALL INI_AIRCRAFT_BALLOON(HINIFILE,CLUOUT,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, & + IKU,CTURB=="TKEL" , & + XLATORI, XLONORI ) +! +!------------------------------------------------------------------------------- +! +!* 25. STATION initializations +! ----------------------- +! +CALL INI_SURFSTATION_n(CLUOUT,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, & + CTURB=="TKEL" , & + XLATORI, XLONORI ) +! +!------------------------------------------------------------------------------- +! +!* 26. PROFILER initializations +! ------------------------ +! +CALL INI_POSPROFILER_n(CLUOUT,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, & + CTURB=="TKEL", & + XLATORI, XLONORI ) +! +!------------------------------------------------------------------------------- +! +!* 28. Prognostic aerosols +! ------------------------ +! +CALL INI_AEROSET1 +CALL INI_AEROSET2 +CALL INI_AEROSET3 +CALL INI_AEROSET4 +CALL INI_AEROSET5 +CALL INI_AEROSET6 +#ifdef MNH_FOREFIRE +! +!------------------------------------------------------------------------------- +! +!* 29. FOREFIRE initializations +! ------------------------ +! + +! Coupling with ForeFire if resolution is low enough +!--------------------------------------------------- +IF ( LFOREFIRE .AND. 0.5*(XXHAT(2)-XXHAT(1)+XYHAT(2)-XYHAT(1)) < COUPLINGRES ) THEN + FFCOUPLING = .TRUE. +ELSE + FFCOUPLING = .FALSE. +ENDIF + +! Initializing the ForeFire variables +!------------------------------------ +IF ( LFOREFIRE ) THEN + CALL INIT_FOREFIRE_n(KMI, ILUOUT, IP & + , TDTCUR%TDATE%YEAR, TDTCUR%TDATE%MONTH, TDTCUR%TDATE%DAY, TDTCUR%TIME, XTSTEP) +END IF +#endif + +END SUBROUTINE INI_MODEL_n + diff --git a/src/ARCH_SRC/CPL_WAVE/MNH/mesonh.f90 b/src/ARCH_SRC/CPL_WAVE/MNH/mesonh.f90 new file mode 100644 index 0000000000000000000000000000000000000000..10e7f11bc0fe263618d4c8e3fe7985d0da5876a1 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/MNH/mesonh.f90 @@ -0,0 +1,238 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +!----------------------------------------------------------------- +! ############## + PROGRAM MESONH +! ############## +! +!!**** *MESONH * -general monitor of the model +!! +!! PURPOSE +!! ------- +!! +!! This program is the general monitor of the model. Firstly, it calls the +!! subroutine INIT, which performs the sequential initialization of the +!! nested models. Then, the program calls the temporal loops of all the +!! models, by calling a recursive function which make the temporal nesting +!! of the different nested models. +!! +!!** METHOD +!! ------ +!! +!! The initialization is a sequentially performed together with the +!! temporal loop of all the nested models. The spatial nesting can be +!! performed in an arbitrary way, the only constrainst is for the first model +!! which must contain all the others. For the moment, only 8 models can be +!! runned at the time and the imbriquation level can also go to this upper +!! value. +!! +!! +!! +!! EXTERNAL +!! -------- +!! +!! subroutine INIT : performs the sequential initialization of the nested +!! models +!! subroutine MODEL: choose the right MODELn to be called +!! +!! subroutine KID_MODEL: recursive function which calls the kid models +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! MODD_CONF: NMODEL, NMASDEV, CPROGRAM +!! MODD_CONF_n: CSTORAGE_TYPE +!! +!! +!! REFERENCE +!! --------- +!! +!! NONE +!! +!! AUTHOR +!! ------ +!! +!! J. STEIN * METEO-FRANCE * +!! +!! MODIFICATIONS +!! ------------- +!! +!! Original 20/10/94 +!! J.Stein 08/12/94 clean the code and add the modules +!! J.Stein and P.Jabouille 30/04/96 add the storage_type +!! J.P.Lafore 11/07/96 multi-tasking introduction for nesting +!! J.P.Lafore 01/08/96 events implementation +!! J.P.Lafore 17/11/97 events modification for two-way nesting +!! J.Stein 08/07/98 sequential form for the nesting +!! 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 +!! 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 +!! G.Delautier 06/2016 phasage surfex 8 +!! J. Pianezze 01/08/2016 add sfxoasis coupling functions +!------------------------------------------------------------------------------- +! +!* 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_GRID +#endif +! +USE MODD_CONF +USE MODD_NESTING +USE MODD_CONF_n +! +USE MODI_MODEL_n +USE MODI_KID_MODEL +! +USE MODE_ll +USE MODE_IO_ll +USE MODE_MODELN_HANDLER +! +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 +! +!* 0.1 declarations of local variables +! +INTEGER :: JMODEL ! loop index +INTEGER :: ITEMP_MODEL1 ! loop increment +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) +! +#ifdef CPLOASIS + CNAMELIST='EXSEG1.nam' + CALL SFX_OASIS_INIT(CNAMELIST, NMNH_COMM_WORLD) +#endif +! +CALL INITIO_ll() +! +CALL VERSION +CPROGRAM='MESONH' +! +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 + CALL MNH_OASIS_DEFINE(CPROGRAM,IP) +#endif +! +!------------------------------------------------------------------------------- +! +!* 2. TEMPORAL LOOP +! ------------- +! +DO JMODEL=1,NMODEL + CALL GO_TOMODEL_ll(JMODEL,IINFO_ll) + CALL GOTO_MODEL(JMODEL) + CSTORAGE_TYPE='TT' + CALL MODEL_n(1,GEXIT) +END DO +! +IF(GEXIT) THEN + !callabortstop + CALL ABORT + STOP +ENDIF +! +ITEMP_MODEL1=1 +DO + ITEMP_MODEL1=ITEMP_MODEL1+1 + ! + CALL GO_TOMODEL_ll(1,IINFO_ll) + CALL GOTO_MODEL(1) + CALL MODEL_n(ITEMP_MODEL1,GEXIT) + ! + CALL KID_MODEL(1,ITEMP_MODEL1,GEXIT) + ! + IF(GEXIT) EXIT + ! +END DO +! +!------------------------------------------------------------------------------- +! +!* 3. FINALIZE THE PARALLEL SESSION +! ----------------------------- +! +IF (LCHECK) THEN + CALL MPPDB_BARRIER() +ELSE + CALL END_PARA_ll(IINFO_ll) +#ifdef CPLOASIS + CALL SFX_OASIS_END +#endif +END IF +! +! +CALL SURFEX_DEALLO_LIST +! +!------------------------------------------------------------------------------- +! +!callabortstop +!CALL ABORT +STOP +! +END PROGRAM MESONH diff --git a/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_define.F90 b/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_define.F90 new file mode 100755 index 0000000000000000000000000000000000000000..a5e6f3bf4bd4cae27f7ee169e077acf122d76e16 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_define.F90 @@ -0,0 +1,148 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ########## +MODULE MODI_MNH_OASIS_DEFINE +! ########## +! +INTERFACE +! + SUBROUTINE MNH_OASIS_DEFINE(HPROGRAM,IP) +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes + INTEGER, INTENT(IN) :: IP ! nb current proc. +! + END SUBROUTINE MNH_OASIS_DEFINE +! +END INTERFACE +! +END MODULE MODI_MNH_OASIS_DEFINE +! +! #################################################################### +SUBROUTINE MNH_OASIS_DEFINE(HPROGRAM,IP) +! #################################################################### +! +! +!!**** *MNH_OASIS_DEFINE* +!! +!! PURPOSE +!! ------- +!! Define the mpi partition for OASIS coupling +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! J. Pianezze *LPO* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/2014 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +#ifdef CPLOASIS +USE MODI_SFX_OASIS_DEFINE +USE MODD_DIM_n, ONLY : NIMAX, NJMAX, NIMAX_ll, NJMAX_ll +USE MOD_OASIS +USE MODD_MNH_SURFEX_n +#endif +! +USE MODE_ll +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes +INTEGER, INTENT(IN) :: IP ! nb current proc. +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +#ifdef CPLOASIS +INTEGER, DIMENSION(:), ALLOCATABLE :: IPARAL +INTEGER, DIMENSION(:), ALLOCATABLE :: ISEG_SIZE +INTEGER, DIMENSION(:), ALLOCATABLE :: ISEG_OFFSET +! +INTEGER :: JI, JSEG +INTEGER :: ISEGMENT, INPAR, INPTS +INTEGER :: IIOR, IJOR +#endif +! +!------------------------------------------------------------------------------- +#ifdef CPLOASIS +!------------------------------------------------------------------------------- +! +CALL GET_OR_ll('B',IIOR,IJOR) +! +!* 1. Define ORANGE parallel partitions: +! ---------------------------------- +! +! Number of segments for this proc +! +ISEGMENT=NJMAX +! +INPAR=2+2*ISEGMENT +! +! Local offset and extent for this proc +! +ALLOCATE(ISEG_SIZE (ISEGMENT)) +ALLOCATE(ISEG_OFFSET(ISEGMENT)) +ALLOCATE(IPARAL(INPAR)) +! +! OASIS orange partition +! +IPARAL(CLIM_STRATEGY) = CLIM_ORANGE +! +! Number of proc segments for OASIS +! +IPARAL(2) = ISEGMENT +! +! Local offset and extent for OASIS +! +JI=2 +INPTS=0 +DO JSEG=1,ISEGMENT + JI=JI+1 + IPARAL(JI) = (IIOR - 1) + NIMAX_ll*(IJOR -1) + NIMAX_ll*(JSEG-1) + JI=JI+1 + IPARAL(JI) = NIMAX +ENDDO +! +INPTS=NIMAX*NJMAX +! +DEALLOCATE(ISEG_SIZE ) +DEALLOCATE(ISEG_OFFSET) +! +! +!* 2. Put definitions for exchange of coupling fields : +! ------------------------------------------------- +! +CALL SFX_OASIS_DEFINE(YSURF_CUR%IM%I, YSURF_CUR%U, & + HPROGRAM,INPTS, IPARAL ) +! +DEALLOCATE(IPARAL) +! +!------------------------------------------------------------------------------- +#endif +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE MNH_OASIS_DEFINE diff --git a/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_grid.F90 b/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_grid.F90 new file mode 100755 index 0000000000000000000000000000000000000000..1695eddadce4275e1f5e1113e8a247b837678290 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_grid.F90 @@ -0,0 +1,339 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ########## +MODULE MODI_MNH_OASIS_GRID +! ########## +! +INTERFACE +! + SUBROUTINE MNH_OASIS_GRID(OD_MASTER,KD_LCOMM) +! + LOGICAL, INTENT(IN) :: OD_MASTER ! MASTER process or not + INTEGER, INTENT(IN) :: KD_LCOMM ! Model local communicator +! + END SUBROUTINE MNH_OASIS_GRID +! +END INTERFACE +! +END MODULE MODI_MNH_OASIS_GRID +! +! #################################################################### +SUBROUTINE MNH_OASIS_GRID(OD_MASTER,KD_LCOMM) +! #################################################################### +! +! +!!**** *MNH_OASIS_GRID* +!! +!! PURPOSE +!! ------- +!! Define the grids for OASIS coupling +!! The grids definition for the hydrological coupling part has to be coded +!! (cf. sfx_oasis_prep.F90). +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! J. Pianezze *LOPS* +!! +!! MODIFICATIONS +!! ------------- +!! Original 08/2016 +!------------------------------------------------------------------------------- +! +!* 0. Declarations +! ------------ +! +! +#ifdef CPLOASIS +USE MOD_OASIS +#endif +! +USE MODD_PARAMETERS, ONLY : XUNDEF +USE MODD_IO_SURF_MNH, ONLY : NHALO, NLUOUT +USE MODD_CST, ONLY : XPI, XRADIUS +USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll, NIMAX, NJMAX +USE MODD_PARAMETERS, ONLY : JPHEXT +USE MODD_GRID_n, ONLY : XLAT, XLON +USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD +USE MODD_SFX_OASIS +USE MODD_MNH_SURFEX_n +USE MODD_MPIF +! +USE MODI_GET_FRAC_N +! +USE MODE_GATHER_ll +USE MODE_ll +! +!* 0.1 Declarations of argument +! ------------------------------------------------ +LOGICAL, INTENT(IN) :: OD_MASTER ! MASTER process or not +INTEGER, INTENT(IN) :: KD_LCOMM ! Model local communicator +! +!* 0.2 Declaration of local parameters +! ------------------------------------------------ +! +INTEGER, PARAMETER :: INC = 4 ! Number of grid-cell corners +! +CHARACTER(LEN=4), PARAMETER :: YSFX_LAND = 'slan' +CHARACTER(LEN=4), PARAMETER :: YSFX_LAKE = 'slak' +CHARACTER(LEN=4), PARAMETER :: YSFX_SEA = 'ssea' +! +!* 0.2 Declaration of local variables +! ------------------------------------------------ +INTEGER :: JI, JJ ! loop index +INTEGER :: IIU, IJU, ILU +INTEGER :: IIU_ll, IJU_ll +INTEGER :: IERROR +! +REAL :: ZPHI, ZRADEG +REAL :: ZXBOX, ZYBOX +! +REAL, DIMENSION(NIMAX_ll,NJMAX_ll,INC) :: ZCLON, ZCLAT +REAL, DIMENSION(NIMAX_ll,NJMAX_ll) :: ZAREA +REAL, DIMENSION(NIMAX_ll,NJMAX_ll) :: ZDX, ZDY +REAL, ALLOCATABLE, DIMENSION(:,:) :: ZSEA, ZWATER +REAL, ALLOCATABLE, DIMENSION(:,:) :: ZTOWN, ZNATURE +! +REAL, ALLOCATABLE, DIMENSION(:) :: ZWATER1D +REAL, ALLOCATABLE, DIMENSION(:) :: ZNATURE1D +REAL, ALLOCATABLE, DIMENSION(:) :: ZTOWN1D +REAL, ALLOCATABLE, DIMENSION(:) :: ZSEA1D +! +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZLAT_GLOBAL, ZLON_GLOBAL +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZSEA_GLOBAL, ZWATER_GLOBAL +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZTOWN_GLOBAL, ZNATURE_GLOBAL +! +INTEGER, DIMENSION(NIMAX_ll,NJMAX_ll) :: ZMASK_LAND +INTEGER, DIMENSION(NIMAX_ll,NJMAX_ll) :: ZMASK_LAKE +INTEGER, DIMENSION(NIMAX_ll,NJMAX_ll) :: ZMASK_SEA +! +!------------------------------------------------------------------------------- +! +!* 1. Initialize : +! ------------ +! +CALL GET_DIM_EXT_ll('B',IIU,IJU) +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +! +IIU_ll=NIMAX_ll+2*JPHEXT +IJU_ll=NJMAX_ll+2*JPHEXT +ILU = (IIE-IIB+1+2*NHALO)*(IJE-IJB+1+2*NHALO) +! +ALLOCATE(ZLAT_GLOBAL(IIU_ll,IJU_ll,1)) +ALLOCATE(ZLON_GLOBAL(IIU_ll,IJU_ll,1)) +! +ALLOCATE(ZSEA_GLOBAL (IIU_ll,IJU_ll,1)) +ALLOCATE(ZWATER_GLOBAL (IIU_ll,IJU_ll,1)) +ALLOCATE(ZNATURE_GLOBAL(IIU_ll,IJU_ll,1)) +ALLOCATE(ZTOWN_GLOBAL (IIU_ll,IJU_ll,1)) +! +ALLOCATE(ZSEA (IIU,IJU)) +ALLOCATE(ZWATER (IIU,IJU)) +ALLOCATE(ZNATURE (IIU,IJU)) +ALLOCATE(ZTOWN (IIU,IJU)) +! +ALLOCATE(ZSEA1D ( ILU )) +ALLOCATE(ZWATER1D ( ILU )) +ALLOCATE(ZNATURE1D ( ILU )) +ALLOCATE(ZTOWN1D ( ILU )) +! +!------------------------------------------------------------------------------- +! +!* 2. Get grid definition : +! --------------------- +! +! +!* 2.1 Get lat/lon : +! ------------- +CALL GATHER_XYFIELD(XLON,ZLON_GLOBAL(:,:,1),1,NMNH_COMM_WORLD) +CALL GATHER_XYFIELD(XLAT,ZLAT_GLOBAL(:,:,1),1,NMNH_COMM_WORLD) +! +!* 2.2 Get corners : +! ------------- +ZXBOX=ZLON_GLOBAL(2,2,1)-ZLON_GLOBAL(2,1,1) +ZCLON(:,:,1)=ZLON_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1)+ZXBOX/2. +ZCLON(:,:,2)=ZLON_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1)-ZXBOX/2. +ZCLON(:,:,3)=ZLON_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1)-ZXBOX/2. +ZCLON(:,:,4)=ZLON_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1)+ZXBOX/2. +! +ZYBOX=ZLAT_GLOBAL(2,2,1)-ZLAT_GLOBAL(1,2,1) +ZCLAT(:,:,1)=ZLAT_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1)+ZYBOX/2. +ZCLAT(:,:,2)=ZLAT_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1)+ZYBOX/2. +ZCLAT(:,:,3)=ZLAT_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1)-ZYBOX/2. +ZCLAT(:,:,4)=ZLAT_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1)-ZYBOX/2. +! +! +!* 2.3 Compute area : +! ------------- +! Radian to degree +ZRADEG = XPI/180.0 +! +DO JJ=1,NJMAX_ll + DO JI =1,NIMAX_ll + ZPHI = ZLAT_GLOBAL(JI+1,JJ+1,1) +! + ZDX(JI,JJ)=XRADIUS*COS(ZPHI*ZRADEG)*(ZLON_GLOBAL(JI+1,JJ+1,1)-ZLON_GLOBAL(JI,JJ+1,1))*ZRADEG + ZDY(JI,JJ)=XRADIUS*(ZLAT_GLOBAL(JI+1,JJ+1,1)-ZLAT_GLOBAL(JI+1,JJ,1))*ZRADEG +! + ENDDO +ENDDO +! +ZAREA(:,:)=ZDY(:,:)*ZDX(:,:) +! +!------------------------------------------------------------------------------- +! +!* 3. Compute masks +! ------------- +! +CALL GET_FRAC_n(YSURF_CUR%U,'MESONH',ILU,ZSEA1D,ZWATER1D,ZNATURE1D,ZTOWN1D) +CALL REMOVE_HALO(ZSEA1D,ZSEA) +CALL REMOVE_HALO(ZWATER1D,ZWATER) +CALL REMOVE_HALO(ZNATURE1D,ZNATURE) +CALL REMOVE_HALO(ZTOWN1D,ZTOWN) +! +CALL GATHER_XYFIELD(ZSEA,ZSEA_GLOBAL(:,:,1),1,NMNH_COMM_WORLD) +CALL GATHER_XYFIELD(ZWATER,ZWATER_GLOBAL(:,:,1),1,NMNH_COMM_WORLD) +CALL GATHER_XYFIELD(ZNATURE,ZNATURE_GLOBAL(:,:,1),1,NMNH_COMM_WORLD) +CALL GATHER_XYFIELD(ZTOWN,ZTOWN_GLOBAL(:,:,1),1,NMNH_COMM_WORLD) +! +!* 3.1 Mask for Land surface : +! ----------------------- +ZMASK_LAND(:,:)=1 +DO JJ=1,NJMAX_ll + DO JI=1,NIMAX_ll + IF ( (ZNATURE_GLOBAL(JI+1,JJ+1,1)+ZTOWN_GLOBAL(JI+1,JJ+1,1)) /= 0 ) ZMASK_LAND(JI,JJ)=0 + ENDDO +ENDDO +! +!* 3.2 Mask for Lake surface : +! ----------------------- +ZMASK_LAKE(:,:)=1 +DO JJ=1,NJMAX_ll + DO JI=1,NIMAX_ll + IF ( ZWATER_GLOBAL(JI+1,JJ+1,1) /= 0 ) ZMASK_LAKE(JI,JJ)=0 + ENDDO +ENDDO +! +!* 3.3 Mask for sea/water/wave surface : +! --------------------------------- +ZMASK_SEA(:,:)=1 +DO JJ=1,NJMAX_ll + DO JI=1,NIMAX_ll + IF ( ZSEA_GLOBAL(JI+1,JJ+1,1) /= 0 ) ZMASK_SEA(JI,JJ)=0 + ENDDO ! XSEA=0: land, XSEA=1: sea, XSEA=2: sea-ice +ENDDO +! +CALL MPI_BARRIER(KD_LCOMM, IERROR) +! +!------------------------------------------------------------------------------- +! +!* 4. Write grid definition : +! ----------------------- +! +! +IF (OD_MASTER) THEN +! + CALL OASIS_START_GRIDS_WRITING(IERROR) +! +!* 4.1 Grid definition for Land surface : +! ---------------------------------- +! + IF (LCPL_LAND) THEN + CALL OASIS_WRITE_GRID (YSFX_LAND, NIMAX_ll, NJMAX_ll, & + ZLON_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1), & + ZLAT_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1) ) + CALL OASIS_WRITE_CORNER(YSFX_LAND, NIMAX_ll, NJMAX_ll, INC, ZCLON, ZCLAT) + CALL OASIS_WRITE_AREA(YSFX_LAND, NIMAX_ll, NJMAX_ll, ZAREA) + CALL OASIS_WRITE_MASK(YSFX_LAND, NIMAX_ll, NJMAX_ll, ZMASK_LAND) + ENDIF +! +!* 4.2 Grid definition for lake surface : +! ---------------------------------- +! + IF (LCPL_LAKE) THEN + CALL OASIS_WRITE_GRID (YSFX_LAKE, NIMAX_ll, NJMAX_ll, & + ZLON_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1), & + ZLAT_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1) ) + CALL OASIS_WRITE_CORNER(YSFX_LAKE, NIMAX_ll, NJMAX_ll, INC, ZCLON, ZCLAT) + CALL OASIS_WRITE_AREA(YSFX_LAKE, NIMAX_ll, NJMAX_ll, ZAREA) + CALL OASIS_WRITE_MASK(YSFX_LAKE, NIMAX_ll, NJMAX_ll, ZMASK_LAKE) + ENDIF +! +! +!* 4.3 Grid definition for sea/water : +! ------------------------------- + IF (LCPL_SEA .OR. LCPL_WAVE) THEN + CALL OASIS_WRITE_GRID (YSFX_SEA, NIMAX_ll, NJMAX_ll, & + ZLON_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1), & + ZLAT_GLOBAL(2:NIMAX_ll+1,2:NJMAX_ll+1,1) ) + CALL OASIS_WRITE_CORNER(YSFX_SEA, NIMAX_ll, NJMAX_ll, INC, ZCLON, ZCLAT) + CALL OASIS_WRITE_AREA(YSFX_SEA, NIMAX_ll, NJMAX_ll, ZAREA) + CALL OASIS_WRITE_MASK(YSFX_SEA, NIMAX_ll, NJMAX_ll, ZMASK_SEA) + ENDIF +! +!------------------------------------------------------------------------------- +! +!* 5. Terminate grid definition : +! ----------------------- + CALL OASIS_TERMINATE_GRIDS_WRITING() +! +ENDIF +! +DEALLOCATE(ZLAT_GLOBAL) +DEALLOCATE(ZLON_GLOBAL) +! +DEALLOCATE(ZSEA_GLOBAL) +DEALLOCATE(ZWATER_GLOBAL) +DEALLOCATE(ZNATURE_GLOBAL) +DEALLOCATE(ZTOWN_GLOBAL) +! +DEALLOCATE(ZSEA) +DEALLOCATE(ZWATER) +DEALLOCATE(ZNATURE) +DEALLOCATE(ZTOWN) +! +DEALLOCATE(ZSEA1D) +DEALLOCATE(ZWATER1D) +DEALLOCATE(ZNATURE1D) +DEALLOCATE(ZTOWN1D) +! +CALL MPI_BARRIER(KD_LCOMM, IERROR) +! +!============================================================================== +! +CONTAINS +! +SUBROUTINE REMOVE_HALO(PFIELD,POUT) +! +REAL, DIMENSION(:), INTENT(IN) :: PFIELD +REAL, DIMENSION(:,:), INTENT(OUT) :: POUT +! +INTEGER :: JI, JJ +! +POUT=XUNDEF +! +DO JJ=IJB,IJE + DO JI=IIB,IIE + POUT(JI,JJ) = PFIELD( JI-IIB+1 + NHALO + (JJ-IJB+NHALO)*(IIE-IIB+1+2*NHALO)) + END DO +END DO +! +END SUBROUTINE REMOVE_HALO +! +END SUBROUTINE MNH_OASIS_GRID +!!====================================================================== diff --git a/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_recv.F90 b/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_recv.F90 new file mode 100755 index 0000000000000000000000000000000000000000..0f70e127eb9dd55af4bc0f4bf0eb0320236f8dd4 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_recv.F90 @@ -0,0 +1,252 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ########## +MODULE MODI_MNH_OASIS_RECV +! ########## +! +INTERFACE +! + SUBROUTINE MNH_OASIS_RECV(HPROGRAM,KI,KSW,PTIMEC,PTSTEP_SURF, & + PZENITH,PSW_BANDS, & + PTSRAD,PDIR_ALB,PSCA_ALB,PEMIS,PTSURF) +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes +! + INTEGER, INTENT(IN) :: KI ! number of points on this proc + INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands + REAL, INTENT(IN) :: PTIMEC ! Cumulated run time step (s) + REAL, INTENT(IN) :: PTSTEP_SURF ! Surfex time step +! + REAL, DIMENSION(:), INTENT(IN) :: PZENITH ! zenithal angle (radian from the vertical) + REAL, DIMENSION(:), INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m) +! + REAL, DIMENSION(:), INTENT(OUT) :: PTSRAD ! radiative temperature (K) + REAL, DIMENSION(:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) + REAL, DIMENSION(:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) + REAL, DIMENSION(:), INTENT(OUT) :: PEMIS ! emissivity (-) + REAL, DIMENSION(:), INTENT(OUT) :: PTSURF ! surface effective temperature (K) +! + END SUBROUTINE MNH_OASIS_RECV +! +END INTERFACE +! +END MODULE MODI_MNH_OASIS_RECV +! +! #################################################################### +SUBROUTINE MNH_OASIS_RECV (HPROGRAM,KI,KSW,PTIMEC,PTSTEP_SURF, & + PZENITH,PSW_BANDS, & + PTSRAD,PDIR_ALB,PSCA_ALB,PEMIS,PTSURF ) +!############################################# +! +!!**** *MNH_OASIS_RECV* +!! +!! PURPOSE +!! ------- +!! Meso-NH driver that receive coupling fields from oasis +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! J. Pianezze *LPO* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/2014 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODN_SFX_OASIS, ONLY : XTSTEP_CPL_LAND, & + XTSTEP_CPL_SEA, & + XTSTEP_CPL_WAVE, & + LWATER +! +USE MODD_SFX_OASIS, ONLY : LCPL_LAND, & + LCPL_GW,LCPL_FLOOD,& + LCPL_SEA, & + LCPL_SEAICE, & + LCPL_WAVE +! +USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_MNH_SURFEX_n +! +USE MODI_GET_LUOUT +USE MODI_GOTO_SURFEX +USE MODI_SFX_OASIS_RECV +USE MODI_PUT_SFX_LAND +USE MODI_PUT_SFX_SEA +USE MODI_PUT_SFX_WAVE +USE MODI_UPDATE_ESM_SURF_ATM_n +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes +! +INTEGER, INTENT(IN) :: KI ! number of points on this proc +INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands +REAL, INTENT(IN) :: PTIMEC ! Cumulated run time step (s) +REAL, INTENT(IN) :: PTSTEP_SURF ! Surfex time step +! +REAL, DIMENSION(:), INTENT(IN) :: PZENITH ! zenithal angle (radian from the vertical) +REAL, DIMENSION(:), INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m) +! +REAL, DIMENSION(:), INTENT(OUT) :: PTSRAD ! radiative temperature (K) +REAL, DIMENSION(:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) +REAL, DIMENSION(:), INTENT(OUT) :: PEMIS ! emissivity (-) +REAL, DIMENSION(:), INTENT(OUT) :: PTSURF ! surface effective temperature (K) +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +REAL, DIMENSION(KI) :: ZLAND_WTD ! Land water table depth (m) +REAL, DIMENSION(KI) :: ZLAND_FWTD ! Land grid-cell fraction of water table rise (-) +REAL, DIMENSION(KI) :: ZLAND_FFLOOD ! Land Floodplains fraction (-) +REAL, DIMENSION(KI) :: ZLAND_PIFLOOD ! Land Potential flood infiltration(kg/m2/s) +REAL, DIMENSION(KI) :: ZSEA_SST ! Sea surface temperature (K) +REAL, DIMENSION(KI) :: ZSEA_UCU ! Sea u-current stress (Pa) +REAL, DIMENSION(KI) :: ZSEA_VCU ! Sea v-current stress (Pa) +REAL, DIMENSION(KI) :: ZSEAICE_SIT ! Sea-ice Temperature (K) +REAL, DIMENSION(KI) :: ZSEAICE_CVR ! Sea-ice cover (-) +REAL, DIMENSION(KI) :: ZSEAICE_ALB ! Sea-ice albedo (-) +REAL, DIMENSION(KI) :: ZWAVE_CHA ! Charnock coefficient (-) +REAL, DIMENSION(KI) :: ZWAVE_UCU ! u-current velocity (m/s) +REAL, DIMENSION(KI) :: ZWAVE_VCU ! v-current velocity (m/s) +REAL, DIMENSION(KI) :: ZWAVE_HS ! Significant wave height (m) +REAL, DIMENSION(KI) :: ZWAVE_TP ! Peak period (s) +! +INTEGER :: ILUOUT +REAL :: ZTIME_CPL +! +LOGICAL :: GRECV_LAND +LOGICAL :: GRECV_FLOOD +LOGICAL :: GRECV_SEA +LOGICAL :: GRECV_WAVE +! +CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +!------------------------------------------------------------------------------- +! +!* 1. init coupling fields: +! ---------------------------------- +! +ZTIME_CPL = PTIMEC-PTSTEP_SURF +! +GRECV_LAND =(LCPL_LAND .AND. MOD(ZTIME_CPL,XTSTEP_CPL_LAND)==0.0) +GRECV_SEA =(LCPL_SEA .AND. MOD(ZTIME_CPL,XTSTEP_CPL_SEA )==0.0) +GRECV_WAVE =(LCPL_WAVE .AND. MOD(ZTIME_CPL,XTSTEP_CPL_WAVE)==0.0) +! +IF(GRECV_LAND)THEN + ZLAND_WTD (:) = XUNDEF + ZLAND_FWTD (:) = XUNDEF + ZLAND_FFLOOD (:) = XUNDEF + ZLAND_PIFLOOD(:) = XUNDEF +ENDIF +! +IF(GRECV_SEA)THEN + ZSEA_SST (:) = XUNDEF + ZSEA_UCU (:) = XUNDEF + ZSEA_VCU (:) = XUNDEF + ZSEAICE_SIT(:) = XUNDEF + ZSEAICE_CVR(:) = XUNDEF + ZSEAICE_ALB(:) = XUNDEF +ENDIF +! +IF(GRECV_WAVE)THEN + ZWAVE_CHA(:) = XUNDEF + ZWAVE_UCU(:) = XUNDEF + ZWAVE_VCU(:) = XUNDEF + ZWAVE_HS(:) = XUNDEF + ZWAVE_TP(:) = XUNDEF +ENDIF +! +! +!* 2. Receive fields to other models proc by proc: +! -------------------------------------------- +! +CALL SFX_OASIS_RECV(HPROGRAM,KI,KSW,ZTIME_CPL, & + GRECV_LAND, GRECV_SEA, GRECV_WAVE, & + ZLAND_WTD (:),ZLAND_FWTD (:), & + ZLAND_FFLOOD (:),ZLAND_PIFLOOD(:), & + ZSEA_SST (:),ZSEA_UCU (:), & + ZSEA_VCU (:),ZSEAICE_SIT (:), & + ZSEAICE_CVR (:),ZSEAICE_ALB (:), & + ZWAVE_CHA (:),ZWAVE_UCU (:), & + ZWAVE_VCU (:),ZWAVE_HS (:), & + ZWAVE_TP (:) ) +! +! +!* 3. Put definitions for exchange of coupling fields : +! ------------------------------------------------- +! +!------------------------------------------------------------------------------- +! Put variable over land tile +!------------------------------------------------------------------------------- +! +IF(GRECV_LAND)THEN + CALL PUT_SFX_LAND(YSURF_CUR%IM%I, YSURF_CUR%U, & + ILUOUT,LCPL_GW,LCPL_FLOOD, & + ZLAND_WTD (:),ZLAND_FWTD (:), & + ZLAND_FFLOOD(:),ZLAND_PIFLOOD(:) ) +ENDIF +! +!------------------------------------------------------------------------------- +! Put variable over sea and/or water tile +!------------------------------------------------------------------------------- +! +IF(GRECV_SEA)THEN + CALL PUT_SFX_SEA(YSURF_CUR%SM%S, YSURF_CUR%U, YSURF_CUR%WM%W, & + ILUOUT,LCPL_SEAICE,LWATER, & + ZSEA_SST (:),ZSEA_UCU (:), & + ZSEA_VCU (:),ZSEAICE_SIT(:), & + ZSEAICE_CVR(:),ZSEAICE_ALB(:) ) +ENDIF +! +!------------------------------------------------------------------------------- +! Put variable over sea and/or water tile for waves +!------------------------------------------------------------------------------- +! +IF(GRECV_WAVE)THEN + CALL PUT_SFX_WAVE(YSURF_CUR%SM%S, YSURF_CUR%U, & + ILUOUT,ZWAVE_CHA(:),ZWAVE_UCU(:), & + ZWAVE_VCU(:),ZWAVE_HS(:),ZWAVE_TP(:) ) +ENDIF +! +!------------------------------------------------------------------------------- +! Update radiative properties at time t+1 for radiative scheme +!------------------------------------------------------------------------------- +! +GRECV_FLOOD=(GRECV_LAND.AND.LCPL_FLOOD) +! +IF(GRECV_SEA.OR.GRECV_FLOOD)THEN + CALL UPDATE_ESM_SURF_ATM_n(YSURF_CUR%FM%F, YSURF_CUR%IM%I, YSURF_CUR%SM%S, & + YSURF_CUR%U, YSURF_CUR%WM%W, & + HPROGRAM, KI, KSW, PZENITH(:), PSW_BANDS, & + PTSRAD(:), PDIR_ALB(:,:), & + PSCA_ALB(:,:), PEMIS(:), & + PTSURF(:) ) +ENDIF +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE MNH_OASIS_RECV diff --git a/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_send.F90 b/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_send.F90 new file mode 100755 index 0000000000000000000000000000000000000000..7483ea0107c5f778c1717133b3be7248aab8f35e --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/MNH/mnh_oasis_send.F90 @@ -0,0 +1,263 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ########## +MODULE MODI_MNH_OASIS_SEND +! ########## +! +INTERFACE +! + SUBROUTINE MNH_OASIS_SEND(HPROGRAM,KI,PTIMEC,PSTEP_SURF) +! + CHARACTER(LEN=*), INTENT(IN) :: HPROGRAM + INTEGER, INTENT(IN) :: KI ! number of points + REAL, INTENT(IN) :: PTIMEC ! Cumulated run time step (s) + REAL, INTENT(IN) :: PSTEP_SURF ! Model time step (s) +! + END SUBROUTINE MNH_OASIS_SEND +! +END INTERFACE +! +END MODULE MODI_MNH_OASIS_SEND +! +! #################################################################### +SUBROUTINE MNH_OASIS_SEND(HPROGRAM,KI,PTIMEC,PSTEP_SURF) +! #################################################################### +! +!!**** *MNH_OASIS_SEND* +!! +!! PURPOSE +!! ------- +!! Meso-NH driver to send coupling fields +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! J. Pianezze *LPO* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/2014 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +USE MODN_SFX_OASIS, ONLY : XTSTEP_CPL_LAND, & + XTSTEP_CPL_LAKE, & + XTSTEP_CPL_SEA , & + XTSTEP_CPL_WAVE, & + LWATER +! +USE MODD_SFX_OASIS, ONLY : LCPL_LAND,LCPL_GW, & + LCPL_FLOOD,LCPL_CALVING, & + LCPL_LAKE, & + LCPL_SEA,LCPL_SEAICE, & + LCPL_WAVE +! +USE MODD_MNH_SURFEX_n +! +USE MODI_GOTO_SURFEX +USE MODI_GET_SFX_LAND +USE MODI_GET_SFX_LAKE +USE MODI_GET_SFX_SEA +USE MODI_GET_SFX_WAVE +! +USE MODI_GET_LUOUT +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +CHARACTER(LEN=*), INTENT(IN) :: HPROGRAM +INTEGER, INTENT(IN) :: KI ! number of points +REAL, INTENT(IN) :: PTIMEC ! Cumulated run time step (s) +REAL, INTENT(IN) :: PSTEP_SURF ! Model time step (s) +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +REAL, DIMENSION(KI) :: ZLAND_RUNOFF ! Cumulated Surface runoff (kg/m2) +REAL, DIMENSION(KI) :: ZLAND_DRAIN ! Cumulated Deep drainage (kg/m2) +REAL, DIMENSION(KI) :: ZLAND_CALVING ! Cumulated Calving flux (kg/m2) +REAL, DIMENSION(KI) :: ZLAND_RECHARGE ! Cumulated Recharge to groundwater (kg/m2) +REAL, DIMENSION(KI) :: ZLAND_WATFLD ! Cumulated net freshwater rate (kg/m2) +! +REAL, DIMENSION(KI) :: ZLAKE_EVAP ! Cumulated Evaporation (kg/m2) +REAL, DIMENSION(KI) :: ZLAKE_RAIN ! Cumulated Rainfall rate (kg/m2) +REAL, DIMENSION(KI) :: ZLAKE_SNOW ! Cumulated Snowfall rate (kg/m2) +REAL, DIMENSION(KI) :: ZLAKE_WATF ! Cumulated net freshwater rate (kg/m2) +! +REAL, DIMENSION(KI) :: ZSEA_FWSU ! Cumulated zonal wind stress (Pa.s) +REAL, DIMENSION(KI) :: ZSEA_FWSV ! Cumulated meridian wind stress (Pa.s) +REAL, DIMENSION(KI) :: ZSEA_HEAT ! Cumulated Non solar net heat flux (J/m2) +REAL, DIMENSION(KI) :: ZSEA_SNET ! Cumulated Solar net heat flux (J/m2) +REAL, DIMENSION(KI) :: ZSEA_WIND ! Cumulated 10m wind speed (m) +REAL, DIMENSION(KI) :: ZSEA_FWSM ! Cumulated wind stress (Pa.s) +REAL, DIMENSION(KI) :: ZSEA_EVAP ! Cumulated Evaporation (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_RAIN ! Cumulated Rainfall rate (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_SNOW ! Cumulated Snowfall rate (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_EVPR ! Cumulated Evap-Precip rate (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_WATF ! Cumulated net freshwater rate (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_PRES ! Cumulated Surface pressure (Pa.s) +! +REAL, DIMENSION(KI) :: ZSEAICE_HEAT ! Cumulated Sea-ice non solar net heat flux (J/m2) +REAL, DIMENSION(KI) :: ZSEAICE_SNET ! Cumulated Sea-ice solar net heat flux (J/m2) +REAL, DIMENSION(KI) :: ZSEAICE_EVAP ! Cumulated Sea-ice sublimation (kg/m2) +! +REAL, DIMENSION(KI) :: ZWAVE_U10 ! 10m u-wind speed (m/s) +REAL, DIMENSION(KI) :: ZWAVE_V10 ! 10m v-wind speed (m/s) +! +INTEGER :: IDATE ! current coupling time step (s) +INTEGER :: ILUOUT +INTEGER :: INKPROMA +! +LOGICAL :: GSEND_LAND +LOGICAL :: GSEND_LAKE +LOGICAL :: GSEND_SEA +LOGICAL :: GSEND_WAVE +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +!* 1. Initialize proc by proc : +! ------------------------- +! +CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +IDATE = INT(PTIMEC-PSTEP_SURF) +! +GSEND_LAND =(LCPL_LAND .AND. MOD(PTIMEC,XTSTEP_CPL_LAND)==0.0) +GSEND_LAKE =(LCPL_LAKE .AND. MOD(PTIMEC,XTSTEP_CPL_LAKE)==0.0) +GSEND_SEA =(LCPL_SEA .AND. MOD(PTIMEC,XTSTEP_CPL_SEA) ==0.0) +GSEND_WAVE =(LCPL_WAVE .AND. MOD(PTIMEC,XTSTEP_CPL_WAVE)==0.0) +! +!------------------------------------------------------------------------------- +! +IF(GSEND_LAND)THEN + ZLAND_RUNOFF (:) = XUNDEF + ZLAND_DRAIN (:) = XUNDEF + ZLAND_CALVING (:) = XUNDEF + ZLAND_RECHARGE(:) = XUNDEF + ZLAND_WATFLD (:) = XUNDEF +ENDIF +! +IF(GSEND_LAKE)THEN + ZLAKE_EVAP (:) = XUNDEF + ZLAKE_RAIN (:) = XUNDEF + ZLAKE_SNOW (:) = XUNDEF + ZSEA_WATF (:) = XUNDEF +ENDIF +! +IF(GSEND_SEA)THEN + ZSEA_FWSU (:) = XUNDEF + ZSEA_FWSV (:) = XUNDEF + ZSEA_HEAT (:) = XUNDEF + ZSEA_SNET (:) = XUNDEF + ZSEA_WIND (:) = XUNDEF + ZSEA_FWSM (:) = XUNDEF + ZSEA_EVAP (:) = XUNDEF + ZSEA_RAIN (:) = XUNDEF + ZSEA_SNOW (:) = XUNDEF + ZSEA_EVPR (:) = XUNDEF + ZSEA_WATF (:) = XUNDEF + ZSEA_PRES (:) = XUNDEF + ! + ZSEAICE_HEAT (:) = XUNDEF + ZSEAICE_SNET (:) = XUNDEF + ZSEAICE_EVAP (:) = XUNDEF +ENDIF +! +IF(GSEND_WAVE)THEN + ZWAVE_U10 (:) = XUNDEF + ZWAVE_V10 (:) = XUNDEF +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. get local fields : +! ------------------ +! +IF(GSEND_LAND)THEN +! +! * Get river output fields +! + CALL GET_SFX_LAND(YSURF_CUR%IM%I,YSURF_CUR%U, & + LCPL_GW,LCPL_FLOOD,LCPL_CALVING, & + ZLAND_RUNOFF (:),ZLAND_DRAIN (:), & + ZLAND_CALVING(:),ZLAND_RECHARGE(:), & + ZLAND_WATFLD (:) ) +! +ENDIF +! +IF(GSEND_LAKE)THEN +! +! * Get output fields +! + CALL GET_SFX_LAKE(YSURF_CUR%FM%F,YSURF_CUR%U, & + ZLAKE_EVAP(:),ZLAKE_RAIN(:), & + ZLAKE_SNOW(:),ZLAKE_WATF(:) ) +! +ENDIF +! +IF(GSEND_SEA)THEN +! +! * Get sea output fields +! + CALL GET_SFX_SEA(YSURF_CUR%SM%S, YSURF_CUR%U, YSURF_CUR%WM%W, & + LCPL_SEAICE, LWATER, & + ZSEA_FWSU (:),ZSEA_FWSV (:),ZSEA_HEAT (:),& + ZSEA_SNET (:),ZSEA_WIND (:),ZSEA_FWSM (:),& + ZSEA_EVAP (:),ZSEA_RAIN (:),ZSEA_SNOW (:),& + ZSEA_EVPR (:),ZSEA_WATF (:),ZSEA_PRES (:),& + ZSEAICE_HEAT(:),ZSEAICE_SNET(:),ZSEAICE_EVAP(:) ) +! +ENDIF +! +IF(GSEND_WAVE)THEN +! +! * Get wave output fields +! + CALL GET_SFX_WAVE(YSURF_CUR%U, YSURF_CUR%SM%DGS, & + ZWAVE_U10(:), ZWAVE_V10(:) ) +! +ENDIF +! +! +!------------------------------------------------------------------------------- +! +!* 3. Send fields to OASIS proc by proc: +! ---------------------------------- +! +CALL SFX_OASIS_SEND(ILUOUT,KI,IDATE,GSEND_LAND,GSEND_LAKE,GSEND_SEA,GSEND_WAVE, & + ZLAND_RUNOFF,ZLAND_DRAIN,ZLAND_CALVING,ZLAND_RECHARGE, & + ZLAND_WATFLD, & + ZLAKE_EVAP,ZLAKE_RAIN,ZLAKE_SNOW,ZLAKE_WATF, & + ZSEA_FWSU,ZSEA_FWSV,ZSEA_HEAT,ZSEA_SNET,ZSEA_WIND, & + ZSEA_FWSM,ZSEA_EVAP,ZSEA_RAIN,ZSEA_SNOW, & + ZSEA_EVPR,ZSEA_WATF, & + ZSEA_PRES,ZSEAICE_HEAT,ZSEAICE_SNET,ZSEAICE_EVAP, & + ZWAVE_U10, ZWAVE_V10 ) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE MNH_OASIS_SEND diff --git a/src/ARCH_SRC/CPL_WAVE/SURCOUCHE/mode_init_ll.f90 b/src/ARCH_SRC/CPL_WAVE/SURCOUCHE/mode_init_ll.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a06b15757c13235756f943d27b73d1166c8d7f10 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURCOUCHE/mode_init_ll.f90 @@ -0,0 +1,822 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for CVS information +!----------------------------------------------------------------- +! $Source$ +! $Name$ +! $Revision$ +! $Date$ +!----------------------------------------------------------------- +!----------------------------------------------------------------- + +#ifdef MNH_MPI_DOUBLE_PRECISION +#define MNH_MPI_REAL MPI_DOUBLE_PRECISION +#define MNH_MPI_2REAL MPI_2DOUBLE_PRECISION +#else +#define MNH_MPI_REAL MPI_REAL +#define MNH_MPI_2REAL MPI_2REAL +#endif + +! ################### + MODULE MODE_INIT_ll +! ################### +!! +!! Purpose +!! ------- +! +! The purpose of this module is the implementation of the initialisation +! of parallel data structure +! +!! Routines Of The User Interface +!! ------------------------------ +! +! SUBROUTINES : SET_SPLITTING_ll, SET_LBX_ll, SET_LBY_ll +! SET_DIM_ll, SET_JP_ll, SET_XRATIO_ll, SET_YRATIO_ll +! SET_DAD_ll, SET_XOR_ll, SET_XEND_ll, SET_YOR_ll, +! SET_YEND_ll, SET_DAD0_ll, +! +! INI_PARA_ll, END_PARA_ll +! +!! Implicit Arguments +!! ------------------ +! +!! Reference +!! --------- +! +! User Interface for Meso-NH parallel package +! Ph. Kloos, L. Giraud, R. Guivarch, D. Lugato +! +!! Authors +!! ------- +! +! R. Guivarch * CERFACS - ENSEEIHT * +! Ph. Kloos * CERFACS - CNRM * +! N. Gicquel * CERFACS - CNRM * +! +!! Modifications +!! ------------- +! +! Original May 19, 1998 +! Juan 19/08/2005: distinction Halo NORD/SUD & EST/WEST +! M.Moge 05/02/2015: extended HALO (halo size + 1) +! +!------------------------------------------------------------------------------- +! + USE MODD_MPIF +! + IMPLICIT NONE +! +! INCLUDE 'mpif.h' +! + CONTAINS +! +! ####################################### + SUBROUTINE SET_SPLITTING_ll(HSPLITTING) +! ####################################### +! +!!**** *SET_SPLITTING_ll* - +! +!! Purpose +!! ------- +! Set the variable YSPLITTING with HSPLITTING +! +!------------------------------------------------------------------------------- +! + USE MODD_VAR_ll, ONLY : YSPLITTING +! + IMPLICIT NONE +! + CHARACTER(LEN=*) :: HSPLITTING +! +!------------------------------------------------------------------------------- +! + YSPLITTING = HSPLITTING +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_SPLITTING_ll +! +! ################################ + SUBROUTINE SET_LBX_ll(KLBX, KMI) +! ################################ +! +!!**** *SET_LBX_ll *- +! +!! Purpose +!! ------- +! Set the variable CLBCX(KMI,:) with KLBX +! +!------------------------------------------------------------------------------- +! + USE MODD_PARAMETERS_ll, ONLY : JPMODELMAX + USE MODD_DIM_ll, ONLY : CLBCX +! + IMPLICIT NONE +! + CHARACTER(LEN=*) :: KLBX + INTEGER :: KMI +! +!------------------------------------------------------------------------------- +! + IF (KMI.LE.JPMODELMAX) THEN + CLBCX(KMI, :) = KLBX + ENDIF +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_LBX_ll +! +! ################################ + SUBROUTINE SET_LBY_ll(KLBY, KMI) +! ################################ +! +!!**** *SET_LBY_ll *- +! +!! Purpose +!! ------- +! Set the variable CLBCY(KMI,:) with KLBY +! +!------------------------------------------------------------------------------- +! + USE MODD_PARAMETERS_ll, ONLY : JPMODELMAX + USE MODD_DIM_ll, ONLY : CLBCY +! + IMPLICIT NONE +! + CHARACTER(LEN=*) :: KLBY + INTEGER :: KMI +! +!------------------------------------------------------------------------------- +! + IF (KMI.LE.JPMODELMAX) THEN + CLBCY(KMI, :) = KLBY + ENDIF +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_LBY_ll +! +! ################################# + SUBROUTINE SET_DIM_ll(KX, KY, KZ) +! ################################# +! +!!**** *SET_DIM_ll *- +! +!! Purpose +!! ------- +! Set the variable CLBCY(KMI,:) with KLBY +! +!------------------------------------------------------------------------------- +! + USE MODD_DIM_ll, ONLY : NIMAX_ll, NJMAX_ll, NKMAX_ll +! + IMPLICIT NONE +! + INTEGER :: KX,KY,KZ +! +!------------------------------------------------------------------------------- +! + NIMAX_ll = KX + NJMAX_ll = KY + NKMAX_ll = KZ +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_DIM_ll +! +! ##################################################### + SUBROUTINE SET_JP_ll(KMODELMAX, KHEXT, KVEXT, KPHALO) +! ##################################################### +! +!!**** *SET_JP_ll *- +! +!! Purpose +!! ------- +! Set the halo variables and alloacte arrays of MODD_DIM_ll +! +!------------------------------------------------------------------------------- +! + USE MODD_PARAMETERS_ll, ONLY : JPMODELMAX, JPHEXT, JPVEXT + USE MODD_DIM_ll, ONLY : NDXRATIO_ALL, NDYRATIO_ALL, & + NXOR_ALL, NYOR_ALL, NXEND_ALL, NYEND_ALL, & + NDAD, CLBCX, CLBCY + USE MODD_VAR_ll, ONLY : JPHALO +! + IMPLICIT NONE +! + INTEGER :: KMODELMAX, KHEXT, KVEXT, KPHALO +! +!------------------------------------------------------------------------------- +! + JPMODELMAX = KMODELMAX + JPHEXT = KHEXT + JPVEXT = KVEXT + JPHALO = KPHALO +! +! Allocate arrays declared in MODD_DIM_ll +! + IF ( ALLOCATED(NDXRATIO_ALL) ) DEALLOCATE(NDXRATIO_ALL) + IF ( ALLOCATED(NDYRATIO_ALL) ) DEALLOCATE(NDYRATIO_ALL) + IF ( ALLOCATED(NXOR_ALL) ) DEALLOCATE(NXOR_ALL) + IF ( ALLOCATED(NYOR_ALL) ) DEALLOCATE(NYOR_ALL) + IF ( ALLOCATED(NXEND_ALL) ) DEALLOCATE(NXEND_ALL) + IF ( ALLOCATED(NYEND_ALL) ) DEALLOCATE(NYEND_ALL) + IF ( ALLOCATED(NDAD) ) DEALLOCATE(NDAD) + IF ( ALLOCATED(CLBCX) ) DEALLOCATE(CLBCX) + IF ( ALLOCATED(CLBCY) ) DEALLOCATE(CLBCY) + ALLOCATE(NDXRATIO_ALL(JPMODELMAX), NDYRATIO_ALL(JPMODELMAX)) + ALLOCATE(NXOR_ALL(JPMODELMAX), NYOR_ALL(JPMODELMAX)) + ALLOCATE(NXEND_ALL(JPMODELMAX), NYEND_ALL(JPMODELMAX)) + ALLOCATE(NDAD(JPMODELMAX)) + ALLOCATE(CLBCX(JPMODELMAX, 2), CLBCY(JPMODELMAX, 2)) +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_JP_ll +! +! ###################################### + SUBROUTINE SET_XRATIO_ll(KXRATIO, KMI) +! ###################################### +! +!!**** *SET_XRATIO_ll *- +! +!! Purpose +!! ------- +! Set the variable NDXRATIO_ALL(KMI) with KXRATIO +! +!------------------------------------------------------------------------------- +! + USE MODD_DIM_ll, ONLY : NDXRATIO_ALL +! + IMPLICIT NONE +! + INTEGER :: KXRATIO, KMI +! +!------------------------------------------------------------------------------- +! + NDXRATIO_ALL(KMI) = KXRATIO +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_XRATIO_ll +! +! ###################################### + SUBROUTINE SET_YRATIO_ll(KYRATIO, KMI) +! ###################################### +! +!!**** *SET_YRATIO_ll *- +! +!! Purpose +!! ------- +! Set the variable NDYRATIO_ALL(KMI) with KYRATIO +! +!------------------------------------------------------------------------------- +! + USE MODD_DIM_ll, ONLY : NDYRATIO_ALL +! + IMPLICIT NONE +! + INTEGER :: KYRATIO, KMI +! +!------------------------------------------------------------------------------- +! + NDYRATIO_ALL(KMI) = KYRATIO +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_YRATIO_ll +! +! ################################ + SUBROUTINE SET_DAD_ll(KDAD, KMI) +! ################################ +! +!!**** *SET_DAD_ll* - +! +!! Purpose +!! ------- +! Set the variable NDAD(KMI) with KDAD +! +!------------------------------------------------------------------------------- +! + USE MODD_DIM_ll, ONLY : NDAD +! + IMPLICIT NONE +! + INTEGER :: KDAD, KMI +! +!------------------------------------------------------------------------------- +! + NDAD(KMI) = KDAD +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_DAD_ll +! +! ################################ + SUBROUTINE SET_XOR_ll(KXOR, KMI) +! ################################ +! +!!**** *SET_XOR_ll* - +! +!! Purpose +!! ------- +! Set the variable NXOR_ALL(KMI) with KXOR +! +!------------------------------------------------------------------------------- +! + USE MODD_DIM_ll, ONLY : NXOR_ALL +! + IMPLICIT NONE +! + INTEGER :: KXOR, KMI +! +!------------------------------------------------------------------------------- +! + NXOR_ALL(KMI) = KXOR +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_XOR_ll +! +! ################################## + SUBROUTINE SET_XEND_ll(KXEND, KMI) +! ################################## +! +!!**** *SET_XEND_ll* - +! +!! Purpose +!! ------- +! Set the variable NXEND_ALL(KMI) with KXEND +! +!------------------------------------------------------------------------------- +! + USE MODD_DIM_ll, ONLY : NXEND_ALL +! + IMPLICIT NONE +! + INTEGER :: KXEND, KMI +! +!------------------------------------------------------------------------------- +! + NXEND_ALL(KMI) = KXEND +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_XEND_ll +! +! ################################ + SUBROUTINE SET_YOR_ll(KYOR, KMI) +! ################################ +! +!!**** *SET_YOR_ll* - +! +!! Purpose +!! ------- +! Set the variable NYOR_ALL(KMI) with KYOR +! +!------------------------------------------------------------------------------- +! + USE MODD_DIM_ll, ONLY : NYOR_ALL +! + IMPLICIT NONE +! + INTEGER :: KYOR, KMI +! +!------------------------------------------------------------------------------- +! + NYOR_ALL(KMI) = KYOR +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_YOR_ll +! +! ################################## + SUBROUTINE SET_YEND_ll(KYEND, KMI) +! ################################## +! +!!**** *SET_YEND_ll* - +! +!! Purpose +!! ------- +! Set the variable NYEND_ALL(KMI) with KYEND +! +!------------------------------------------------------------------------------- +! + USE MODD_DIM_ll, ONLY : NYEND_ALL +! + IMPLICIT NONE +! + INTEGER :: KYEND, KMI +! +!------------------------------------------------------------------------------- +! + NYEND_ALL(KMI) = KYEND +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE SET_YEND_ll +! +! ######################## + SUBROUTINE SET_DAD0_ll() +! ######################## +! +!!**** *SET_DAD0_ll* - +! +!! Purpose +!! ------- +! fill the array NDAD with 0 +! +!------------------------------------------------------------------------------- +! + USE MODD_DIM_ll, ONLY : NDAD +! + IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! + NDAD(:) = 0 +! + END SUBROUTINE SET_DAD0_ll +! +! ################################ + SUBROUTINE INI_PARA_ll(KINFO_ll) + ! ################################ + ! + !!**** *INI_PARA_ll* - routine to initialize the parallel variables + !! + !! Purpose + !! ------- + ! the purpose of the routine is to fill the structured type variables + ! TCRRT_PROCONF and TCRRT_COMDATA + ! + !!** Method + !! ------ + !! + !! External + !! -------- + ! Module MODE_SPLITTING_ll + ! SPLIT2 + ! + ! Module MODE_CONSTRUCT_ll + ! INI_PZ, INI_EZ, INI_BOUNDARIES, INI_TRANS, + ! CONSTRUCT_HALO1, CONSTRUCT_HALO2, CONSTRUCT_HALO2_EXTENDED, + ! CONSTRUCT_TRANS, CONSTRUCT_1DX, CONSTRUCT_1DY, + ! COMPUTE_HALO_MAX, COMPUTE_TRANS_MAX + ! + ! Module MODE_NEST_ll + ! INI_CHILD + ! + !! Implicit Arguments + !! ------------------ + ! Module MODD_DIM_ll + ! JPHEXT - Horizontal External points number + ! NDXRATIO_ALL, NDYRATIO_ALL, NXOR_ALL, NYOR_ALL, + ! NXEND_ALL, NYEND_ALL,... + ! + ! Module MODD_PARALLEL + ! TCRRT_PROCONF - Current configuration for current model + ! TCRRT_COMDATA - Current communication data structure for current model + ! and local processor + ! + ! Reference + !! --------- + ! + !! AUTHOR + !! ------ + ! R. Guivarch + ! + !! MODIFICATIONS + !! ------------- + ! Original 01/05/98 + ! R. Guivarch 01/01/98 Grid-Nesting + ! R. Guivarch 29/11/99 x and y splitting -> YSPLITTING + ! + !------------------------------------------------------------------------------- + ! + !* 0. DECLARATIONS + ! + USE MODD_DIM_ll + USE MODD_PARAMETERS_ll + USE MODD_STRUCTURE_ll + USE MODD_VAR_ll + ! + USE MODE_SPLITTING_ll, ONLY : SPLIT2 + ! + USE MODE_CONSTRUCT_ll, ONLY : INI_PZ, INI_EZ, INI_BOUNDARIES, INI_TRANS, & + CONSTRUCT_HALO1, CONSTRUCT_HALO2, CONSTRUCT_HALO_EXTENDED, & + CONSTRUCT_TRANS, CONSTRUCT_1DX, CONSTRUCT_1DY, & + COMPUTE_HALO_MAX, COMPUTE_TRANS_MAX + ! + USE MODE_NEST_ll, ONLY : INI_CHILD + ! + !JUANZ + USE MODE_MNH_WORLD , ONLY : INIT_NMNH_COMM_WORLD + !JUANZ + IMPLICIT NONE + ! + !* 0.1 declarations of arguments + ! + INTEGER, INTENT(OUT) :: KINFO_ll + ! + !* 0.2 declarations of local variables + ! + + INTEGER ,PARAMETER :: MPI_BUFFER_SIZE = 140000000 + CHARACTER,SAVE,ALLOCATABLE,DIMENSION(:) :: MPI_BUFFER + !JUAN + LOGICAL,SAVE :: GFIRSTCALL = .TRUE. + !JUAN + + + TYPE(ZONE_ll), ALLOCATABLE, DIMENSION(:) :: TZDZP ! intermediate zone + ! + TYPE(MODELSPLITTING_ll), POINTER :: TZSPLIT + TYPE(PROCONF_ll), POINTER :: TZPROCONF + INTEGER :: JMODEL + + LOGICAL :: GISINIT + !JUANZ + INTEGER :: myrank_key,new_rank,new_size + INTEGER :: COLOR = 1 + !JUANZ + ! + !------------------------------------------------------------------------------- + ! + !* 1. INITIALIZE MPI : + ! -------------- + ! + KINFO_ll = 0 + CALL MPI_INITIALIZED(GISINIT, KINFO_ll) + IF (.NOT. GISINIT) THEN + !CALL MPI_INIT(KINFO_ll) + !JUANZ create new/remapped communicator if need + CALL INIT_NMNH_COMM_WORLD(KINFO_ll) + END IF + ! + CALL MPI_COMM_RANK(NMNH_COMM_WORLD, IP, KINFO_ll) + ! + CALL MPI_COMM_SIZE(NMNH_COMM_WORLD, NPROC, KINFO_ll) + ! + CALL MPI_COMM_DUP(NMNH_COMM_WORLD, NHALO_COM, KINFO_ll) + ! + CALL MPI_COMM_DUP(NMNH_COMM_WORLD, NHALO2_COM, KINFO_ll) + ! + CALL MPI_COMM_DUP(NMNH_COMM_WORLD, NTRANS_COM, KINFO_ll) + ! + CALL MPI_COMM_DUP(NMNH_COMM_WORLD, NGRID_COM, KINFO_ll) + ! + IP = IP + 1 + ! + MPI_PRECISION = MNH_MPI_REAL + MPI_2PRECISION = MNH_MPI_2REAL + ! + !------------------------------------------------------------------------------- + ! + !* 2. SET OUTPUT FILE : + ! --------------- + + ! CALL OPEN_ll(UNIT=NIOUNIT,FILE=YOUTPUTFILE,ACTION='write',form& + ! &='FORMATTED',MODE=SPECIFIC,IOSTAT=IRESP) + ! + !------------------------------------------------------------------------------- + ! + !* 3. ALLOCATION : + ! ---------- + ! + + IF (GFIRSTCALL) THEN + ALLOCATE(MPI_BUFFER(MPI_BUFFER_SIZE)) + CALL MPI_BUFFER_ATTACH(MPI_BUFFER,MPI_BUFFER_SIZE,KINFO_ll) + GFIRSTCALL = .FALSE. + ENDIF + + + ALLOCATE(TZDZP(NPROC)) + ! + ALLOCATE(TCRRT_PROCONF) + CALL ALLOC(TCRRT_COMDATA) + ALLOCATE(TCRRT_PROCONF%TSPLITS_B(NPROC)) + ALLOCATE(TCRRT_PROCONF%TSPLITS_X(NPROC)) + ALLOCATE(TCRRT_PROCONF%TSPLITS_Y(NPROC)) + ALLOCATE(TCRRT_PROCONF%TBOUND(NPROC)) + NULLIFY(TCRRT_PROCONF%TPARENT) + NULLIFY(TCRRT_COMDATA%TPARENT) + NULLIFY(TCRRT_PROCONF%TCHILDREN) + NULLIFY(TCRRT_COMDATA%TCHILDREN) + ! + !------------------------------------------------------------------------------- + ! + !* 4. SPLITTING OF THE DOMAIN : + ! ----------------------- + ! + DIMX = NIMAX_ll + 2*JPHEXT + DIMY = NJMAX_ll + 2*JPHEXT + DIMZ = NKMAX_ll + 2*JPVEXT + ! + TCRRT_PROCONF%NUMBER = 1 + ! + CALL SPLIT2(NIMAX_ll,NJMAX_ll,NKMAX_ll,NPROC,TZDZP,YSPLITTING) + ! + !------------------------------------------------------------------------------- + ! + !* 5. INITIALIZATION OF TCRRT_PROCONF : + ! ------------------------------- + ! + CALL INI_PZ(TCRRT_PROCONF,TZDZP) + ! + CALL INI_BOUNDARIES(TCRRT_PROCONF) + ! + CALL INI_EZ(TCRRT_PROCONF) + ! + CALL INI_TRANS(TCRRT_PROCONF) + ! + !------------------------------------------------------------------------------- + ! + !* 6. INITIALIZATION OF TCRRT_COMDATA : + ! ------------------------------- + ! + !* 6.1 Model Number + ! + TCRRT_COMDATA%NUMBER = 1 + ! + !* 6.2 Pointer from TCRRT_COMDATA to TCRRT_PROCONF for 2Way splitting + ! + TCRRT_COMDATA%TSPLIT_B => TCRRT_PROCONF%TSPLITS_B(IP) + + TZSPLIT => TCRRT_COMDATA%TSPLIT_B + ! + ! + !* 6.3 Pointer from TCRRT_COMDATA to TCRRT_PROCONF + ! for x-slices splitting + TCRRT_COMDATA%TSPLIT_X => TCRRT_PROCONF%TSPLITS_X(IP) + ! + TZSPLIT => TCRRT_COMDATA%TSPLIT_X + ! + ! + !* 6.4 Pointer from TCRRT_COMDATA to TCRRT_PROCONF + ! for y-slices splitting + ! + TCRRT_COMDATA%TSPLIT_Y => TCRRT_PROCONF%TSPLITS_Y(IP) + ! + TZSPLIT => TCRRT_COMDATA%TSPLIT_Y + ! + ! + !* 6.5 Construction of HALO1 communication data + ! + CALL CONSTRUCT_HALO1(TCRRT_COMDATA, TCRRT_PROCONF) + CALL CONSTRUCT_HALO2(TCRRT_COMDATA, TCRRT_PROCONF) + CALL CONSTRUCT_HALO_EXTENDED(TCRRT_COMDATA, TCRRT_PROCONF, JPHEXT+1) + ! + ! + !* 6.6 Construction of 1D communication data + ! + ALLOCATE(TCRRT_COMDATA%HALO1DX) + ALLOCATE(TCRRT_COMDATA%HALO1DX%NSEND_WEST(NPROC)) + ALLOCATE(TCRRT_COMDATA%HALO1DX%NSEND_EAST(NPROC)) + CALL CONSTRUCT_1DX(TCRRT_COMDATA, TCRRT_PROCONF) + ! + ALLOCATE(TCRRT_COMDATA%HALO1DY) + ALLOCATE(TCRRT_COMDATA%HALO1DY%NSEND_SOUTH(NPROC)) + ALLOCATE(TCRRT_COMDATA%HALO1DY%NSEND_NORTH(NPROC)) + CALL CONSTRUCT_1DY(TCRRT_COMDATA, TCRRT_PROCONF) + ! + ! + !* 6.7 Construction of Transposition communication data + ! + CALL CONSTRUCT_TRANS(TCRRT_COMDATA, TCRRT_PROCONF) + ! + ! + !------------------------------------------------------------------------------- + ! + ! 7. GRID NESTING : + ! ------------ + ! + NULLIFY(TCRRT_PROCONF%TCHILDREN) + NULLIFY(TCRRT_COMDATA%TCHILDREN) + NULLIFY(TCRRT_COMDATA%TP2C_DATA) + ! + DO JMODEL = 1, JPMODELMAX + ! + IF( NDAD(JMODEL) .EQ. TCRRT_PROCONF%NUMBER ) THEN + CALL INI_CHILD(TCRRT_PROCONF, TCRRT_COMDATA, JMODEL) + ENDIF + ! + ENDDO + ! + !------------------------------------------------------------------------------- + ! + TZPROCONF => TCRRT_PROCONF + ! + CALL COMPUTE_TRANS_MAX(NBUFFERSIZE_3D, TCRRT_COMDATA) + NCOMBUFFSIZE1 = NBUFFERSIZE_3D + !JUAN NCOMBUFFSIZE1 = 10000000 + + ! + CALL COMPUTE_HALO_MAX(NMAXSIZEHALO, TCRRT_COMDATA) + ! + !NAG4.0 boom avec le 50 lorsqu'on active les scalaires + ! NBUFFERSIZE_2D = 50*NMAXSIZEHALO + NBUFFERSIZE_2D = 150*NMAXSIZEHALO + !NAG4.0 + NCOMBUFFSIZE2 = NBUFFERSIZE_2D + ! + DEALLOCATE(TZDZP) + ! + !------------------------------------------------------------------------------- + ! + END SUBROUTINE INI_PARA_ll +! +! ################################## + SUBROUTINE END_PARA_ll( KINFO_ll ) +! ################################## +! +!!**** *END_PARA_ll* - routine to finalize the parallel session +! +!! Purpose +!! ------- +! the purpose of the routine is to end the parallel session +! +!!** Method +!! ------ +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_DIM_ll +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/06/98 +! R. Guivarch 15/09/99 deallocation of grid-nesting arrays +! J. Pianezze 01/11/2014 - add CPLOASIS cpp key +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_DIM_ll +! USE MODD_STRUCTURE_ll +! USE MODD_VAR_ll, ONLY : NIOUNIT, YOUTPUTFILE + USE MODD_IO_ll, ONLY : ISP +! +#ifdef MNH_GA +USE MODE_GA +#endif +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + INTEGER, INTENT(OUT) :: KINFO_ll + +! +!* 0.2 declarations of local variables +! +!------------------------------------------------------------------------------- +! +!* 1. CALL TO MPI_FINALIZE +! +! CALL CLOSE_ll(YOUTPUTFILE) + +#ifdef MNH_GA + if (.not. GFIRST_GA ) then + call ga_sync() + IF (ISP .EQ. 1) THEN + call ga_print_stats() + call ga_summarize(0) + END IF + call ga_sync() + gstatus_ga = ga_destroy(g_a) + CALL ga_terminate() + endif +#endif +! +#ifndef CPLOASIS + CALL MPI_FINALIZE(KINFO_ll) +#endif +! +!------------------------------------------------------------------------------- +! +!* 2. DEALLOCATION +! + DEALLOCATE(NDXRATIO_ALL, NDYRATIO_ALL) + DEALLOCATE(NXOR_ALL, NYOR_ALL) + DEALLOCATE(NXEND_ALL, NYEND_ALL) + DEALLOCATE(NDAD) + DEALLOCATE(CLBCX, CLBCY) +! +END SUBROUTINE END_PARA_ll +! +END MODULE MODE_INIT_ll diff --git a/src/ARCH_SRC/CPL_WAVE/SURCOUCHE/mode_io.f90 b/src/ARCH_SRC/CPL_WAVE/SURCOUCHE/mode_io.f90 new file mode 100644 index 0000000000000000000000000000000000000000..e56a4b5758803654ffaa72008ecd19ae0cc820d0 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURCOUCHE/mode_io.f90 @@ -0,0 +1,954 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for CVS information +!----------------------------------------------------------------- +! $Source$ +! $Name$ +! $Revision$ +! $Date$ +!----------------------------------------------------------------- +!----------------------------------------------------------------- +!! Authors +!! ------- +! +! D. Gazen +! Juan 19/08/2005: bug argument optinonel ACCESS --> YACCESS +! Juan 22/05/2008: bug mode SPECIFIC in OPEN_ll +! Juan 05/11/2009: allow JPMAX_UNIT=48 open files +! J.Escobar 18/10/10 bug with PGI compiler on ADJUSTL +! Philippe 04/02/2016: bug with DELIM='NONE' and GCC 5.2/5.3 +! D.Gazen : avril 2016 change error message +! J. Pianezze 01/08/2016 add CPLOASIS cpp key +! +MODULE MODE_IO_ll + + USE MODD_ERRCODES + USE MODE_FD_ll + USE MODD_MPIF + !JUANZ + USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD + !JUANZ + + IMPLICIT NONE + + PRIVATE + + !INCLUDE 'mpif.h' + + INTEGER, PARAMETER :: JPFNULL = 9 !! /dev/null fortran unit + INTEGER, PARAMETER :: JPRESERVED_UNIT = 11 + INTEGER, PARAMETER :: JPMAX_UNIT_NUMBER = JPRESERVED_UNIT+300 + ! + LOGICAL,SAVE :: GALLOC(JPRESERVED_UNIT:JPMAX_UNIT_NUMBER) = .FALSE. + ! + CHARACTER(LEN=*),PARAMETER :: CFILENULL="/dev/null" + ! + !! Provisoire + CHARACTER(LEN=*),PARAMETER :: GLOBAL='GLOBAL' + CHARACTER(LEN=*),PARAMETER :: SPECIFIC='SPECIFIC' + !! + LOGICAL,SAVE :: GCONFIO = .FALSE. ! Turn TRUE when SET_CONFIO_ll is called. + + !! Provisoire + PUBLIC IONEWFLU,UPCASE,INITIO_ll,OPEN_ll,CLOSE_ll,FLUSH_ll,GLOBAL,SPECIFIC + PUBLIC SET_CONFIO_ll,GCONFIO + !JUANZ + PUBLIC io_file,io_rank + !JUANZ + +CONTAINS + + FUNCTION IONEWFLU() + + INTEGER :: IONEWFLU + + INTEGER :: JI + INTEGER :: IOS + LOGICAL :: GEXISTS, GOPENED, GFOUND + + GFOUND = .FALSE. + + DO JI=JPRESERVED_UNIT, JPMAX_UNIT_NUMBER + IF (GALLOC(JI)) CYCLE + INQUIRE(UNIT=JI, EXIST=GEXISTS, OPENED=GOPENED, IOSTAT=IOS) + IF (GEXISTS .AND. .NOT. GOPENED .AND. IOS == 0) THEN + IONEWFLU = JI + GFOUND = .TRUE. + GALLOC(JI) = .TRUE. + EXIT + END IF + END DO + + IF (.NOT. GFOUND) IONEWFLU = NOSLOTLEFT + + END FUNCTION IONEWFLU + + SUBROUTINE IOFREEFLU(KOFLU) + + INTEGER :: KOFLU + + IF ((KOFLU .GE. JPRESERVED_UNIT) .AND. (KOFLU .LE. JPMAX_UNIT_NUMBER )) THEN + GALLOC(KOFLU) = .FALSE. + ELSE + print*,"mode_io.f90: IOFREEFLU BAD IUNIT=",KOFLU + STOP "mode_io.f90: IOFREEFLU BAD IUNIT" + END IF + + END SUBROUTINE IOFREEFLU + + FUNCTION UPCASE(HSTRING) + CHARACTER(LEN=*) :: HSTRING + CHARACTER(LEN=LEN(HSTRING)) :: UPCASE + + INTEGER :: JC + INTEGER, PARAMETER :: IAMIN = IACHAR("a") + INTEGER, PARAMETER :: IAMAJ = IACHAR("A") + + DO JC=1,LEN(HSTRING) + IF (HSTRING(JC:JC) >= "a" .AND. HSTRING(JC:JC) <= "z") THEN + UPCASE(JC:JC) = ACHAR(IACHAR(HSTRING(JC:JC)) - IAMIN + IAMAJ) + ELSE + UPCASE(JC:JC) = HSTRING(JC:JC) + END IF + END DO + + END FUNCTION UPCASE + + SUBROUTINE SET_CONFIO_ll(OIOCDF4, OFORCELFIOUT, OFORCELFIREAD) + USE MODD_IO_ll, ONLY : LIOCDF4, LLFIOUT, LLFIREAD + LOGICAL, INTENT(IN) :: OIOCDF4 + LOGICAL, INTENT(IN), OPTIONAL :: OFORCELFIOUT, OFORCELFIREAD + + LOGICAL :: GFORCELFIOUT, GFORCELFIREAD + + IF (GCONFIO) THEN + PRINT *, 'SET_CONFIO_ll already called (ignoring this call).' + ELSE + IF (PRESENT(OFORCELFIOUT)) THEN + GFORCELFIOUT = OFORCELFIOUT + ELSE + GFORCELFIOUT = .FALSE. + END IF + IF (PRESENT(OFORCELFIREAD)) THEN + GFORCELFIREAD = OFORCELFIREAD + ELSE + GFORCELFIREAD = .FALSE. + END IF + +#if defined(MNH_IOCDF4) + !PRINT *, 'SET_CONFIO_ll : sources compiled WITH IOCDF4 support.' + LIOCDF4 = OIOCDF4 + LLFIOUT = (.NOT. OIOCDF4 .OR. GFORCELFIOUT) + LLFIREAD = GFORCELFIREAD +#else + !PRINT *, 'SET_CONFIO_ll : sources compiled WITHOUT IOCDF4 support.' + LIOCDF4 = .FALSE. + LLFIOUT = .TRUE. + LLFIREAD = .TRUE. +#endif + GCONFIO = .TRUE. + END IF + + END SUBROUTINE SET_CONFIO_ll + + SUBROUTINE INITIO_ll() + USE MODE_MNH_WORLD , ONLY : INIT_NMNH_COMM_WORLD + USE MODD_IO_ll + IMPLICIT NONE + + INTEGER :: IERR, IOS + LOGICAL :: GISINIT + + ISTDERR = 0 + +#ifndef CPLOASIS + CALL MPI_INITIALIZED(GISINIT, IERR) + IF (.NOT. GISINIT) THEN + !CALL MPI_INIT(IERR) + CALL INIT_NMNH_COMM_WORLD(IERR) + if (IERR .NE.0) STOP "mode_io.f90::INITIO_ll() MPI_INIT ---> PROBLEME WITH REMAPPING NMNH_COMM_WORLD " + END IF + !! Now MPI is initialized for sure +#endif + + CALL INITFD() + + !! Default number for Processor I/O + ISIOP = 1 + + !! Get number of allocated processors + CALL MPI_COMM_SIZE(NMNH_COMM_WORLD, ISNPROC,IERR) + IF (ISNPROC==1) GSMONOPROC = .TRUE. + + !! Store proc number + CALL MPI_COMM_RANK(NMNH_COMM_WORLD, ISP, IERR) + ISP = ISP + 1 + + !! Open /dev/null for GLOBAL mode +#if defined(DEV_NULL) + OPEN(UNIT=JPFNULL,FILE=CFILENULL ,ACTION='WRITE',IOSTAT=IOS) +#else + OPEN(UNIT=JPFNULL,STATUS='SCRATCH',ACTION='WRITE',IOSTAT=IOS) +#endif + IF (IOS > 0) THEN + WRITE(ISTDERR,*) 'Error OPENING /dev/null...' + CALL MPI_ABORT(NMNH_COMM_WORLD, IOS, IERR) + END IF + + !! Init STDOUT and PIPE + IF (ISP == ISIOP) THEN + ISTDOUT = 6 + ELSE + ISTDOUT = JPFNULL + END IF + + END SUBROUTINE INITIO_ll + + SUBROUTINE OPEN_ll(UNIT, & + FILE, & + MODE, & + LFIPAR, & + COMM, & + STATUS, & + ACCESS, & + IOSTAT, & + FORM, & + RECL, & + BLANK, & + POSITION,& + ACTION, & + DELIM, & + PAD, & + KNB_PROCIO,& + KMELEV,& + OPARALLELIO) +#if defined(MNH_IOCDF4) + USE MODD_NETCDF + USE MODE_NETCDF +#endif + USE MODD_IO_ll + INTEGER, INTENT(OUT) :: UNIT !! Different from fortran OPEN + CHARACTER(len=*),INTENT(IN), OPTIONAL :: FILE + CHARACTER(len=*),INTENT(IN), OPTIONAL :: MODE + TYPE(LFIPARAM), POINTER, OPTIONAL :: LFIPAR + CHARACTER(len=*),INTENT(IN), OPTIONAL :: STATUS + CHARACTER(len=*),INTENT(IN), OPTIONAL :: ACCESS + INTEGER, INTENT(OUT) :: IOSTAT + CHARACTER(len=*),INTENT(IN), OPTIONAL :: FORM + INTEGER, INTENT(IN), OPTIONAL :: RECL + CHARACTER(len=*),INTENT(IN), OPTIONAL :: BLANK + CHARACTER(len=*),INTENT(IN), OPTIONAL :: POSITION + CHARACTER(len=*),INTENT(IN) :: ACTION + CHARACTER(len=*),INTENT(IN), OPTIONAL :: DELIM + CHARACTER(len=*),INTENT(IN), OPTIONAL :: PAD + INTEGER, INTENT(IN), OPTIONAL :: COMM + !JUANZ + INTEGER, INTENT(IN), OPTIONAL :: KNB_PROCIO + INTEGER(KIND=LFI_INT), INTENT(IN), OPTIONAL :: KMELEV + LOGICAL, INTENT(IN), OPTIONAL :: OPARALLELIO + !JUANZ + ! + ! local var + ! + !JUANZ + CHARACTER(len=5) :: cfile + INTEGER :: ifile, irank_procio + TYPE(FD_ll), POINTER :: TZFD_IOZ + CHARACTER(len=128) :: YFILE_IOZ + INTEGER(KIND=LFI_INT) :: IRESOU,IMELEV,INPRAR + INTEGER(KIND=LFI_INT) :: INUMBR8,ININAR8 + LOGICAL(KIND=LFI_INT) :: GNAMFI8,GFATER8,GSTATS8 + !JUANZ + +#if defined(MNH_SX5) || defined(MNH_SP4) || defined(NAGf95) || defined(MNH_LINUX) + CHARACTER(len=20) :: YSTATUS + CHARACTER(len=20) :: YACCESS + CHARACTER(len=20) :: YFORM + INTEGER :: YRECL + INTEGER ,PARAMETER :: RECL_DEF = 10000 + CHARACTER(len=20) :: YBLANK + CHARACTER(len=20) :: YPOSITION + CHARACTER(len=20) :: YDELIM + CHARACTER(len=20) :: YPAD + !JUAN +#endif + CHARACTER(len=20) :: YACTION + CHARACTER(len=20) :: YMODE + INTEGER :: IOS,IERR + INTEGER(KIND=IDCDF_KIND) :: IOSCDF + INTEGER :: ICOMM + INTEGER :: ICMPRES + TYPE(FD_ll), POINTER :: TZFD, TZFDTEMP + ! didier + LOGICAL :: GEXISTS,GOPENED + INTEGER :: IUNIT + ! didier + !JUAN SX5 : probleme function retournant un pointer + TYPE(FD_ll), POINTER :: TZJUAN + LOGICAL :: GPARALLELIO + + IF ( PRESENT(OPARALLELIO) ) THEN + GPARALLELIO = OPARALLELIO + ELSE !par defaut on active les IO paralleles en Z si possible + GPARALLELIO = .TRUE. + ENDIF + +#ifdef MNH_VPP + !! BUG Fuji avec RECL non fourni en argument de MYOPEN + INTEGER :: IRECSIZE + IF (PRESENT(RECL)) THEN + IRECSIZE = RECL + ELSE + IRECSIZE = 2147483647 ! Default value for FUJI RECL + END IF +#endif + + IOS = 0 + IF (PRESENT(COMM)) THEN + ICOMM = COMM + ELSE + ICOMM = NMNH_COMM_WORLD ! Default communicator + END IF + + IF (PRESENT(MODE)) THEN + YMODE = MODE + YMODE = UPCASE(TRIM(ADJUSTL(YMODE))) + ELSE + YMODE = 'GLOBAL' ! Default Mode + END IF + + YACTION = ACTION + YACTION = UPCASE(TRIM(ADJUSTL(YACTION))) + IF (YACTION /= "READ" .AND. YACTION /= "WRITE") THEN + IOSTAT = 99 + UNIT = -1 + WRITE(ISTDERR,*) 'Erreur OPEN_ll : ACTION=',YACTION,' non supportee' + RETURN + END IF + + IF (.NOT. ANY(YMODE == (/'GLOBAL ','SPECIFIC ','DISTRIBUTED' , 'IO_ZSPLIT '/))) THEN + IOSTAT = 99 + UNIT = -1 + WRITE(ISTDERR,*) 'OPEN_ll error : MODE UNKNOWN' + RETURN + END IF + + !JUAN SX5 : probleme function retournant un pointer + !IF (.NOT. ASSOCIATED(GETFD(FILE))) THEN + TZJUAN=>GETFD(FILE) + IF (.NOT. ASSOCIATED(TZJUAN)) THEN + !JUAN SX5 : probleme function retournant un pointer + !! File is not already opened : GOOD + !! Add a new FD element + TZFD=>NEWFD() + ELSE + !! Error : File already opened + IOSTAT = 99 + UNIT = -1 + WRITE(ISTDERR,*) 'OPEN_ll error : File', FILE, 'already opened' + RETURN + END IF + +!!$ CALL MPI_ALLREDUCE(ILOCALERR, IGLOBALERR, 1, MPI_INTEGER, MPI_BOR,& +!!$ & ICOMM, IERR) +!!$ IF (IGLOBALERR /= NOERROR) THEN +!!$ IOSTAT = GLOBALERR +!!$ UNIT = -1 +!!$ RETURN +!!$ END IF + + + + TZFD%NAME = FILE + TZFD%MODE = YMODE + NULLIFY(TZFD%PARAM) + +#if defined(MNH_SX5) || defined(MNH_SP4) || defined(NAGf95) || defined(MNH_LINUX) + !JUAN + IF (PRESENT(STATUS)) THEN + YSTATUS=STATUS + ELSE + YSTATUS='UNKNOWN' + ENDIF + IF (PRESENT(ACCESS)) THEN + YACCESS=ACCESS + ELSE + YACCESS='SEQUENTIAL' + ENDIF + IF (PRESENT(FORM)) THEN + YFORM=FORM + ELSE + YFORM='FORMATTED' + ENDIF + IF (PRESENT(RECL)) THEN + YRECL=RECL + ELSE + YRECL=RECL_DEF + ENDIF + IF (PRESENT(BLANK)) THEN + YBLANK=BLANK + ELSE + YBLANK='NULL' + ENDIF + IF (PRESENT(POSITION)) THEN + YPOSITION=POSITION + ELSE + YPOSITION='ASIS' + ENDIF + IF (PRESENT(DELIM)) THEN + YDELIM=DELIM + ELSE + YDELIM='NONE' + ENDIF + IF (PRESENT(PAD)) THEN + YPAD=PAD + ELSE + YPAD='YES' + ENDIF +#endif + + SELECT CASE(YMODE) + + CASE('GLOBAL') + IF (YACTION == 'READ') THEN + TZFD%OWNER = ISP + ELSE + TZFD%OWNER = ISIOP + END IF + + IF (ISP == TZFD%OWNER) THEN + !! I/O processor case + + TZFD%FLU = IONEWFLU() +#ifdef MNH_VPP + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME),& + STATUS=STATUS, & + ACCESS=ACCESS, & + IOSTAT=IOS, & + FORM=FORM, & + RECL=IRECSIZE, & + BLANK=BLANK, & + POSITION=POSITION, & + ACTION=YACTION, & + DELIM=DELIM, & + PAD=PAD) + +#else +#if defined(MNH_SX5) || defined(MNH_SP4) || defined(NAGf95) || defined(MNH_LINUX) + !JUAN : 31/03/2000 modif pour acces direct + IF (YACCESS=='DIRECT') THEN + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME),& + STATUS=YSTATUS, & + ACCESS=YACCESS, & + IOSTAT=IOS, & + FORM=YFORM, & + RECL=YRECL, & + ACTION=YACTION) + ELSE + IF (YFORM=="FORMATTED") THEN + IF (ACTION=='READ') THEN + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME),& + STATUS=YSTATUS, & + ACCESS=YACCESS, & + IOSTAT=IOS, & + FORM=YFORM, & + RECL=YRECL, & + BLANK=YBLANK, & + POSITION=YPOSITION, & + ACTION=YACTION, & + !DELIM=YDELIM, & !Philippe: commented because bug with GCC 5.X + PAD=YPAD) + ELSE + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME),& + STATUS=YSTATUS, & + ACCESS=YACCESS, & + IOSTAT=IOS, & + FORM=YFORM, & + RECL=YRECL, & + BLANK=YBLANK, & + POSITION=YPOSITION, & + ACTION=YACTION, & + DELIM=YDELIM, & + PAD=YPAD) + ENDIF + ELSE + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME),& + STATUS=YSTATUS, & + ACCESS=YACCESS, & + IOSTAT=IOS, & + FORM=YFORM, & + RECL=YRECL, & + POSITION=YPOSITION, & + ACTION=YACTION) + ENDIF + ENDIF + + + !print*,' OPEN_ll' + !print*,' OPEN(UNIT=',TZFD%FLU + !print*,' FILE=',TRIM(TZFD%NAME) + !print*,' STATUS=',YSTATUS + !print*,' ACCESS=',YACCESS + !print*,' IOSTAT=',IOS + !print*,' FORM=',YFORM + !print*,' RECL=',YRECL + !print*,' BLANK=',YBLANK + !print*,' POSITION=',YPOSITION + !print*,' ACTION=',YACTION + !print*,' DELIM=',YDELIM + !print*,' PAD=',YPAD +#else + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME),& + STATUS=STATUS, & + ACCESS=ACCESS, & + IOSTAT=IOS, & + FORM=FORM, & + RECL=RECL, & + BLANK=BLANK, & + POSITION=POSITION, & + ACTION=YACTION, & + DELIM=DELIM, & + PAD=PAD) +#endif + +#endif + + ELSE + !! NON I/O processors case + IOS = 0 + TZFD%FLU = JPFNULL + END IF + + CASE('SPECIFIC') + TZFD%OWNER = ISP + TZFD%FLU = IONEWFLU() + +#ifdef MNH_VPP + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME)//SUFFIX(".P"), & + STATUS=STATUS, & + ACCESS=ACCESS, & + IOSTAT=IOS, & + FORM=FORM, & + RECL=IRECSIZE, & + BLANK=BLANK, & + POSITION=POSITION, & + ACTION=YACTION, & + DELIM=DELIM, & + PAD=PAD) + +#else +#if defined(MNH_SX5) || defined(MNH_SP4) || defined(NAGf95) || defined(MNH_LINUX) + IF (ACCESS=='DIRECT') THEN + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME)//SUFFIX(".P"), & + STATUS=YSTATUS, & + ACCESS=YACCESS, & + IOSTAT=IOS, & + FORM=YFORM, & + RECL=YRECL, & + ACTION=YACTION) + ELSE + IF (ACTION=='READ') THEN + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME)//SUFFIX(".P"), & + STATUS=YSTATUS, & + ACCESS=YACCESS, & + IOSTAT=IOS, & + FORM=YFORM, & + RECL=YRECL, & + BLANK=YBLANK, & + POSITION=YPOSITION, & + ACTION=YACTION, & + !DELIM=YDELIM, & !Philippe: commented because bug with GCC 5.X + PAD=YPAD) + ELSE + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME)//SUFFIX(".P"), & + STATUS=YSTATUS, & + ACCESS=YACCESS, & + IOSTAT=IOS, & + FORM=YFORM, & + RECL=YRECL, & + BLANK=YBLANK, & + POSITION=YPOSITION, & + ACTION=YACTION, & + DELIM=YDELIM, & + PAD=YPAD) + ENDIF + ENDIF +#else + OPEN(UNIT=TZFD%FLU, & + FILE=TRIM(TZFD%NAME)//SUFFIX(".P"), & + STATUS=STATUS, & + ACCESS=ACCESS, & + IOSTAT=IOS, & + FORM=FORM, & + RECL=RECL, & + BLANK=BLANK, & + POSITION=POSITION, & + ACTION=YACTION, & + DELIM=DELIM, & + PAD=PAD) +#endif + +#endif + + CASE('DISTRIBUTED') + TZFD%OWNER = ISIOP + IF (.NOT. PRESENT(LFIPAR)) THEN + PRINT *,"ERROR OPEN_ll : LFI non present" + RETURN + END IF + TZFD%PARAM=>LFIPAR + + IF (ISP == TZFD%OWNER) THEN + TZFD%FLU = IONEWFLU() + ELSE + !! NON I/O processors case + IOS = 0 + TZFD%FLU = -1 + END IF + + CASE('IO_ZSPLIT') + + TZFD%OWNER = ISIOP + TZFD%NAME = TRIM(FILE)//".lfi" + IF (PRESENT(KNB_PROCIO)) THEN + TZFD%NB_PROCIO = KNB_PROCIO + ELSE + TZFD%NB_PROCIO = 1 + ENDIF + IF( .NOT. GPARALLELIO ) THEN + TZFD%NB_PROCIO = 1 + ENDIF + TZFD%COMM = NMNH_COMM_WORLD + TZFD%PARAM =>LFIPAR +#if defined(MNH_IOCDF4) + IF (ISP == TZFD%OWNER .AND. (.NOT. LIOCDF4 .OR. (YACTION=='WRITE' .AND. LLFIOUT) & + & .OR. (YACTION=='READ' .AND. LLFIREAD))) THEN +#else + IF (ISP == TZFD%OWNER) THEN +#endif + TZFD%FLU = IONEWFLU() + ELSE + !! NON I/O processors OR NetCDF read case + IOS = 0 + TZFD%FLU = -1 + END IF + IF (TZFD%NB_PROCIO .GT. 1 ) THEN + DO ifile=0,TZFD%NB_PROCIO-1 + irank_procio = 1 + io_rank(ifile,ISNPROC,TZFD%NB_PROCIO) + write(cfile ,'(".Z",i3.3)') ifile+1 + YFILE_IOZ = TRIM(FILE)//cfile//".lfi" + TZFD_IOZ =>NEWFD() + TZFD_IOZ%NAME = YFILE_IOZ + TZFD_IOZ%MODE = 'IO_ZSPLIT' + TZFD_IOZ%OWNER = irank_procio + TZFD_IOZ%COMM = NMNH_COMM_WORLD + TZFD_IOZ%NB_PROCIO = TZFD%NB_PROCIO + TZFD_IOZ%FLU = -1 + TZFD_IOZ%PARAM =>LFIPAR + + IF ( irank_procio .EQ. ISP ) THEN +#if defined(MNH_IOCDF4) + IF (LIOCDF4) THEN + IF (YACTION == 'READ' .AND. .NOT. LLFIREAD) THEN + ! Open NetCDF File for reading + TZFD_IOZ%CDF => NEWIOCDF() + IOSCDF = NF_OPEN(TRIM(FILE)//cfile//".nc4", NF_NOWRITE, TZFD_IOZ%CDF%NCID) + IF (IOSCDF /= NF_NOERR) THEN + PRINT *, 'Error in opening (NF_OPEN) ', TRIM(FILE)//cfile//'.nc4', ' : ', NF_STRERROR(IOS) + STOP + ELSE + IOS = 0 + END IF + PRINT *, 'NF_OPEN(IO_ZSPLIT): ',TRIM(FILE)//cfile//'.nc4' + END IF + + IF (YACTION == 'WRITE') THEN + ! YACTION == 'WRITE' + ! Create NetCDF File for writing + TZFD_IOZ%CDF => NEWIOCDF() + IOSCDF = NF_CREATE(TRIM(FILE)//cfile//".nc4", & + &IOR(NF_CLOBBER,NF_NETCDF4), TZFD_IOZ%CDF%NCID) + IF (IOSCDF /= NF_NOERR) THEN + PRINT *, 'Error in opening (NF_CREATE) ', TRIM(FILE)//cfile//'.nc4', ' : ', NF_STRERROR(IOS) + STOP + ELSE + IOS = 0 + END IF + PRINT *, 'NF_CREATE(IO_ZSPLIT): ',TRIM(FILE)//cfile//'.nc4' + END IF + END IF +#endif + IF (.NOT. LIOCDF4 .OR. (YACTION=='WRITE' .AND. LLFIOUT)& + & .OR. (YACTION=='READ' .AND. LLFIREAD)) THEN + ! LFI case + ! Open LFI File for reading + !this proc must write on this file open it ... + TZFD_IOZ%FLU = IONEWFLU() + !! LFI-File case + IRESOU = 0 + GNAMFI8 = .TRUE. + GFATER8 = .TRUE. + GSTATS8 = .FALSE. + IF (PRESENT(KMELEV)) THEN + IMELEV = KMELEV + ELSE + IMELEV = 0 + ENDIF + INPRAR = 49 + ! + ! JUAN open lfi file temporary modif + ! + INUMBR8 = TZFD_IOZ%FLU + CALL LFIOUV(IRESOU, & + INUMBR8, & + GNAMFI8, & + TZFD_IOZ%NAME, & + "UNKNOWN", & + GFATER8, & + GSTATS8, & + IMELEV, & + INPRAR, & + ININAR8) + !KNINAR = ININAR8 + END IF + ENDIF + ENDDO + END IF + + + END SELECT + + ! Recherche d'un communicateur a reutiliser + ! TZFD is the first element + + TZFD%COMM = ICOMM +!!$ TZFD%COMM = MPI_COMM_NULL + +!!$ TZFDTEMP=>TZFD%NEXT +!!$ DO WHILE(ASSOCIATED(TZFDTEMP)) +!!$ CALL MPI_COMM_COMPARE(ICOMM,TZFDTEMP%COMM,ICMPRES,IERR) +!!$ IF (ICMPRES == MPI_CONGRUENT) THEN +!!$ TZFD%COMM = TZFDTEMP%COMM +!!$ EXIT +!!$ END IF +!!$ TZFDTEMP=>TZFDTEMP%NEXT +!!$ END DO +!!$ +!!$ IF (TZFD%COMM == MPI_COMM_NULL) THEN +!!$ ! Pas de communicateur equivalent -> on duplique +!!$ ! +!!$ CALL MPI_COMM_DUP(ICOMM, TZFD%COMM, IERR) +!!$ ! WRITE(ISTDOUT,*) 'FILE = ',TZFD%NAME,', comm ',TZFD%COMM& +!!$ ! & , ' cree par duplication de comm ', ICOMM +!!$ END IF + + IOSTAT = IOS + UNIT = TZFD%FLU + + CONTAINS + FUNCTION SUFFIX(HEXT) + + CHARACTER(len=*) :: HEXT + CHARACTER(len=LEN(HEXT)+3) :: SUFFIX + + WRITE(SUFFIX,'(A,i3.3)') TRIM(HEXT), ISP + + END FUNCTION SUFFIX + + END SUBROUTINE OPEN_ll + + SUBROUTINE CLOSE_ll(HFILE,IOSTAT,STATUS,OPARALLELIO) + USE MODD_IO_ll +#if defined(MNH_IOCDF4) + USE MODE_NETCDF +#endif + CHARACTER(LEN=*), INTENT(IN) :: HFILE + INTEGER, INTENT(OUT), OPTIONAL :: IOSTAT + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: STATUS + LOGICAL, INTENT(IN), OPTIONAL :: OPARALLELIO + + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: OLDCOMM + + INTEGER :: IERR, IGLOBALERR, IRESP + + CHARACTER(LEN=100) :: STATUSL + !JUANZ + CHARACTER(len=5) :: yfile + INTEGER :: ifile, irank_procio,ilen + TYPE(FD_ll), POINTER :: TZFD_IOZ + CHARACTER(len=128) :: YFILE_IOZ + INTEGER(KIND=LFI_INT) :: IRESP8,INUM8 + CHARACTER(LEN=7) :: YSTATU + LOGICAL :: GPARALLELIO + + IF ( PRESENT(OPARALLELIO) ) THEN + GPARALLELIO = OPARALLELIO + ELSE !par defaut on active les IO paralleles en Z si possible + GPARALLELIO = .TRUE. + ENDIF + !JUANZ + + TZFD=>GETFD(HFILE) + + IF (.NOT. ASSOCIATED(TZFD)) THEN + WRITE(ISTDOUT,*) 'Erreur CLOSE_ll : Fichier : ', HFILE, ' non& + & present...' + IF (PRESENT(IOSTAT)) IOSTAT = BADVALUE + RETURN + END IF + + IRESP = 0 + IGLOBALERR = 0 + IF (PRESENT(STATUS)) THEN + STATUSL = STATUS + ELSE + STATUSL = "KEEP" + ENDIF + + SELECT CASE(TZFD%MODE) + CASE('GLOBAL','SPECIFIC') + IF (TZFD%OWNER == ISP) THEN + CLOSE(UNIT=TZFD%FLU, IOSTAT=IRESP,STATUS=STATUSL) + CALL IOFREEFLU(TZFD%FLU) + END IF + CALL MPI_ALLREDUCE(IRESP,IGLOBALERR,1,MPI_INTEGER,MPI_BOR,TZFD& + & %COMM,IERR) + CASE('DISTRIBUTED') + ! nothing to close with FM-Files + + CASE('IO_ZSPLIT') + ! + ! close LFI file in the different PROC + ! + IF( .NOT. GPARALLELIO ) THEN + TZFD%NB_PROCIO = 1 + ENDIF + IF (TZFD%NB_PROCIO .GT. 1 ) THEN + DO ifile=0,TZFD%NB_PROCIO-1 + irank_procio = 1 + io_rank(ifile,ISNPROC,TZFD%NB_PROCIO) + write(yfile ,'(".Z",i3.3)') ifile+1 + ilen = len_trim(TZFD%NAME) + YFILE_IOZ = TRIM(TZFD%NAME(1:ilen-4))//yfile//".lfi" + TZFD_IOZ => GETFD(YFILE_IOZ) + IF (ISP == TZFD_IOZ%OWNER) THEN + IF (TZFD_IOZ%FLU > 0) THEN + INUM8=TZFD_IOZ%FLU + CALL LFIFER(IRESP8,INUM8,YSTATU) + CALL IOFREEFLU(TZFD_IOZ%FLU) + IRESP = IRESP8 + END IF + IF (ASSOCIATED(TZFD_IOZ%CDF)) CALL CLEANIOCDF(TZFD_IOZ%CDF) + END IF + END DO + END IF + END SELECT + + OLDCOMM = TZFD%COMM !! Recopie dans var. temporaire + + CALL DELFD(TZFD) + +!!$ IF (IRESP == IGLOBALERR) THEN +!!$ +!!$ ! liberation du communicateur +!!$ ! +!!$ TZFD=>GETFD(OLDCOMM) +!!$ +!!$ IF (.NOT. ASSOCIATED(TZFD)) THEN +!!$ CALL MPI_COMM_FREE(OLDCOMM, IERR) +!!$ END IF +!!$ END IF + + IF (PRESENT(IOSTAT)) IOSTAT = IGLOBALERR + + END SUBROUTINE CLOSE_ll + + SUBROUTINE FLUSH_ll(HFILE,IRESP) +#if defined(NAGf95) + USE F90_UNIX +#endif + USE MODD_IO_ll + CHARACTER(LEN=*), INTENT(IN) :: HFILE + INTEGER, INTENT(OUT), OPTIONAL :: IRESP + + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IUNIT + + IRESP=0 + TZFD=>GETFD(HFILE) + IF (.NOT. ASSOCIATED(TZFD)) THEN + WRITE(ISTDOUT,*) 'Error in FLUSH_ll : file ',TRIM(HFILE),& + &' not present !' + IF (PRESENT(IRESP)) IRESP = BADVALUE + RETURN + END IF + + IUNIT=TZFD%FLU + IF (TZFD%OWNER == ISP .AND. TZFD%MODE /= 'DISTRIBUTED') THEN +#if defined(MNH_SP4) + CALL FLUSH(IUNIT) +#else + CALL FLUSH(IUNIT) +#endif + END IF + + END SUBROUTINE FLUSH_ll + + FUNCTION io_file(k,nb_proc_io) + ! + ! return the file number where to write the K level of data + ! + IMPLICIT NONE + INTEGER(kind=MNH_MPI_RANK_KIND) :: k,nb_proc_io + INTEGER(kind=MNH_MPI_RANK_KIND) :: io_file + + io_file = MOD ((k-1) , nb_proc_io ) + + END FUNCTION io_file + + FUNCTION io_rank(ifile,nb_proc,nb_proc_io,offset_rank) + ! + ! return the proc number which must write the 'ifile' file + ! + IMPLICIT NONE + INTEGER(kind=MNH_MPI_RANK_KIND) :: ifile,nb_proc,nb_proc_io + INTEGER(kind=MNH_MPI_RANK_KIND),OPTIONAL :: offset_rank + + INTEGER(kind=MNH_MPI_RANK_KIND) :: io_rank + + INTEGER(kind=MNH_MPI_RANK_KIND) :: ipas,irest + + ipas = nb_proc / nb_proc_io + irest = MOD ( nb_proc , nb_proc_io ) + + IF (ipas /= 0 ) THEN + io_rank=ipas * ifile + MIN(ifile , irest ) + ELSE + io_rank=MOD(ifile , nb_proc ) + ENDIF + + ! + ! optional rank to shift for read test + ! + IF (PRESENT(offset_rank)) THEN + IF ( offset_rank .GT.0 ) io_rank=MOD(io_rank+offset_rank,nb_proc) + IF ( offset_rank .LT.0 ) io_rank=MOD(nb_proc-io_rank+offset_rank,nb_proc) + ENDIF + + END FUNCTION io_rank + + +END MODULE MODE_IO_ll diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/coare30_flux.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/coare30_flux.F90 new file mode 100644 index 0000000000000000000000000000000000000000..e1cdf085020a7e18097e273c9b301d74cb2d73b3 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/coare30_flux.F90 @@ -0,0 +1,541 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE COARE30_FLUX (S, & + PZ0SEA,PTA,PEXNA,PRHOA,PSST,PEXNS,PQA, & + PVMOD,PZREF,PUREF,PPS,PQSAT,PSFTH,PSFTQ,PUSTAR,PCD,PCDN,PCH,PCE,PRI,& + PRESA,PRAIN,PZ0HSEA,PHS,PTP) +! ####################################################################### +! +! +!!**** *COARE25_FLUX* +!! +!! PURPOSE +!! ------- +! Calculate the surface fluxes of heat, moisture, and momentum over +! sea surface with bulk algorithm COARE3.0. +! +!!** METHOD +!! ------ +! transfer coefficients were obtained using a dataset which combined COARE +! data with those from three other ETL field experiments, and reanalysis of +! the HEXMAX data (DeCosmos et al. 1996). +! ITERMAX=3 +! Take account of the surface gravity waves on the velocity roughness and +! hence the momentum transfer coefficient +! NGRVWAVES=0 no gravity waves action (Charnock) !default value +! NGRVWAVES=1 wave age parameterization of Oost et al. 2002 +! NGRVWAVES=2 model of Taylor and Yelland 2001 +! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Fairall et al (2003), J. of Climate, vol. 16, 571-591 +!! Fairall et al (1996), JGR, 3747-3764 +!! Gosnell et al (1995), JGR, 437-442 +!! Fairall et al (1996), JGR, 1295-1308 +!! +!! AUTHOR +!! ------ +!! C. Lebeaupin *Météo-France* (adapted from C. Fairall's code) +!! +!! MODIFICATIONS +!! ------------- +!! Original 1/06/2006 +!! B. Decharme 06/2009 limitation of Ri +!! B. Decharme 09/2012 Bug in Ri calculation and limitation of Ri in surface_ri.F90 +!! B. Decharme 06/2013 bug in z0 (output) computation +!! M.N. Bouin 03/2014 possibility of wave parameters from external source +!! C. Lebeaupin 03/2014 bug if PTA=PSST and PEXNA=PEXNS: set a minimum value +!! add abort if no convergence +!! C. Lebeaupin 06/2014 itermax=10 for low wind conditions (ZVMOD<=1) +!! J. Pianezze 11/2014 add coupling wave parameters +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! +USE MODD_CSTS, ONLY : XKARMAN, XG, XSTEFAN, XRD, XRV, XPI, & + XLVTT, XCL, XCPD, XCPV, XRHOLW, XTT, & + XP00 +USE MODD_SURF_ATM, ONLY : XVZ0CM +! +USE MODD_SFX_OASIS, ONLY : LCPL_WAVE +USE MODD_SURF_PAR, ONLY : XUNDEF, XSURF_EPSILON +USE MODD_WATER_PAR +! +USE MODI_SURFACE_RI +USE MODI_WIND_THRESHOLD +USE MODE_COARE30_PSI +! +USE MODE_THERMOS +! +! +USE MODI_ABOR1_SFX +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +! +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +! +REAL, DIMENSION(:), INTENT(IN) :: PTA ! air temperature at atm. level (K) +REAL, DIMENSION(:), INTENT(IN) :: PQA ! air humidity at atm. level (kg/kg) +REAL, DIMENSION(:), INTENT(IN) :: PEXNA ! Exner function at atm. level +REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density at atm. level +REAL, DIMENSION(:), INTENT(IN) :: PVMOD ! module of wind at atm. wind level (m/s) +REAL, DIMENSION(:), INTENT(IN) :: PZREF ! atm. level for temp. and humidity (m) +REAL, DIMENSION(:), INTENT(IN) :: PUREF ! atm. level for wind (m) +REAL, DIMENSION(:), INTENT(IN) :: PSST ! Sea Surface Temperature (K) +REAL, DIMENSION(:), INTENT(IN) :: PEXNS ! Exner function at sea surface +REAL, DIMENSION(:), INTENT(IN) :: PPS ! air pressure at sea surface (Pa) +REAL, DIMENSION(:), INTENT(IN) :: PRAIN !precipitation rate (kg/s/m2) +REAL, DIMENSION(:), INTENT(IN) :: PHS ! wave significant height +REAL, DIMENSION(:), INTENT(IN) :: PTP ! wave peak period +! +REAL, DIMENSION(:), INTENT(INOUT) :: PZ0SEA! roughness length over the ocean +! +! surface fluxes : latent heat, sensible heat, friction fluxes +REAL, DIMENSION(:), INTENT(OUT) :: PSFTH ! heat flux (W/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSFTQ ! water flux (kg/m2/s) +REAL, DIMENSION(:), INTENT(OUT) :: PUSTAR! friction velocity (m/s) +! +! diagnostics +REAL, DIMENSION(:), INTENT(OUT) :: PQSAT ! humidity at saturation +REAL, DIMENSION(:), INTENT(OUT) :: PCD ! heat drag coefficient +REAL, DIMENSION(:), INTENT(OUT) :: PCDN ! momentum drag coefficient +REAL, DIMENSION(:), INTENT(OUT) :: PCH ! neutral momentum drag coefficient +REAL, DIMENSION(:), INTENT(OUT) :: PCE !transfer coef. for latent heat flux +REAL, DIMENSION(:), INTENT(OUT) :: PRI ! Richardson number +REAL, DIMENSION(:), INTENT(OUT) :: PRESA ! aerodynamical resistance +REAL, DIMENSION(:), INTENT(OUT) :: PZ0HSEA ! heat roughness length +! +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PTA)) :: ZVMOD ! wind intensity +REAL, DIMENSION(SIZE(PTA)) :: ZPA ! Pressure at atm. level +REAL, DIMENSION(SIZE(PTA)) :: ZTA ! Temperature at atm. level +REAL, DIMENSION(SIZE(PTA)) :: ZQASAT ! specific humidity at saturation at atm. level (kg/kg) +! +REAL, DIMENSION(SIZE(PTA)) :: ZO ! rougness length ref +REAL, DIMENSION(SIZE(PTA)) :: ZWG ! gustiness factor (m/s) +! +REAL, DIMENSION(SIZE(PTA)) :: ZDU,ZDT,ZDQ,ZDUWG !differences +! +REAL, DIMENSION(SIZE(PTA)) :: ZUSR !velocity scaling parameter "ustar" (m/s) = friction velocity +REAL, DIMENSION(SIZE(PTA)) :: ZTSR !temperature sacling parameter "tstar" (degC) +REAL, DIMENSION(SIZE(PTA)) :: ZQSR !humidity scaling parameter "qstar" (kg/kg) +! +REAL, DIMENSION(SIZE(PTA)) :: ZU10,ZT10 !vertical profils (10-m height) +REAL, DIMENSION(SIZE(PTA)) :: ZVISA !kinematic viscosity of dry air +REAL, DIMENSION(SIZE(PTA)) :: ZO10,ZOT10 !roughness length at 10m +REAL, DIMENSION(SIZE(PTA)) :: ZCD,ZCT,ZCC +REAL, DIMENSION(SIZE(PTA)) :: ZCD10,ZCT10 !transfer coef. at 10m +REAL, DIMENSION(SIZE(PTA)) :: ZRIBU,ZRIBCU +REAL, DIMENSION(SIZE(PTA)) :: ZETU,ZL10 +! +REAL, DIMENSION(SIZE(PTA)) :: ZCHARN !Charnock number depends on wind module +REAL, DIMENSION(SIZE(PTA)) :: ZTWAVE,ZHWAVE,ZCWAVE,ZLWAVE !to compute gravity waves' impact +! +REAL, DIMENSION(SIZE(PTA)) :: ZZL,ZZTL!,ZZQL !Obukhovs stability + !param. z/l for u,T,q +REAL, DIMENSION(SIZE(PTA)) :: ZRR +REAL, DIMENSION(SIZE(PTA)) :: ZOT,ZOQ !rougness length ref +REAL, DIMENSION(SIZE(PTA)) :: ZPUZ,ZPTZ,ZPQZ !PHI funct. for u,T,q +! +REAL, DIMENSION(SIZE(PTA)) :: ZBF !constants to compute gustiness factor +! +REAL, DIMENSION(SIZE(PTA)) :: ZTAU !momentum flux (W/m2) +REAL, DIMENSION(SIZE(PTA)) :: ZHF !sensible heat flux (W/m2) +REAL, DIMENSION(SIZE(PTA)) :: ZEF !latent heat flux (W/m2) +REAL, DIMENSION(SIZE(PTA)) :: ZWBAR !diag for webb correction but not used here after +REAL, DIMENSION(SIZE(PTA)) :: ZTAUR !momentum flux due to rain (W/m2) +REAL, DIMENSION(SIZE(PTA)) :: ZRF !sensible heat flux due to rain (W/m2) +REAL, DIMENSION(SIZE(PTA)) :: ZCHN,ZCEN !neutral coef. for heat and vapor +! +REAL, DIMENSION(SIZE(PTA)) :: ZLV !latent heat constant +! +REAL, DIMENSION(SIZE(PTA)) :: ZTAC,ZDQSDT,ZDTMP,ZDWAT,ZALFAC ! for precipitation impact +REAL, DIMENSION(SIZE(PTA)) :: ZXLR ! vaporisation heat at a given temperature +REAL, DIMENSION(SIZE(PTA)) :: ZCPLW ! specific heat for water at a given temperature +! +REAL, DIMENSION(SIZE(PTA)) :: ZUSTAR2 ! square of friction velocity +! +REAL, DIMENSION(SIZE(PTA)) :: ZDIRCOSZW! orography slope cosine (=1 on water!) +REAL, DIMENSION(SIZE(PTA)) :: ZAC ! Aerodynamical conductance +! +! +INTEGER, DIMENSION(SIZE(PTA)) :: ITERMAX ! maximum number of iterations +! +REAL :: ZRVSRDM1,ZRDSRV,ZR2 ! thermodynamic constants +REAL :: ZBETAGUST !gustiness factor +REAL :: ZZBL !atm. boundary layer depth (m) +REAL :: ZVISW !m2/s kinematic viscosity of water +REAL :: ZS !height of rougness length ref +REAL :: ZCH10 !transfer coef. at 10m +! +INTEGER :: J, JLOOP !loop indice +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +! 1. Initializations +! --------------- +! +! 1.1 Constants and parameters +! +IF (LHOOK) CALL DR_HOOK('COARE30_FLUX',0,ZHOOK_HANDLE) +! +ZRVSRDM1 = XRV/XRD-1. ! 0.607766 +ZRDSRV = XRD/XRV ! 0.62198 +ZR2 = 1.-ZRDSRV ! pas utilisé dans cette routine +ZBETAGUST = 1.2 ! value based on TOGA-COARE experiment +ZZBL = 600. ! Set a default value for boundary layer depth +ZS = 10. ! Standard heigth =10m +ZCH10 = 0.00115 +! +ZVISW = 1.E-6 +! +! 1.2 Array initialization by undefined values +! +PSFTH (:)=XUNDEF +PSFTQ (:)=XUNDEF +PUSTAR(:)=XUNDEF +! +PCD(:) = XUNDEF +PCDN(:) = XUNDEF +PCH(:) = XUNDEF +PCE(:) =XUNDEF +PRI(:) = XUNDEF +! +PRESA(:)=XUNDEF +! +!------------------------------------------------------------------------------- +! 2. INITIAL GUESS FOR THE ITERATIVE METHOD +! ------------------------------------- +! +! 2.0 Temperature +! +! Set a non-zero value for the temperature gradient +! +WHERE((PTA(:)*PEXNS(:)/PEXNA(:)-PSST(:))==0.) + ZTA(:)=PTA(:)-1E-3 +ELSEWHERE + ZTA(:)=PTA(:) +ENDWHERE + +! 2.1 Wind and humidity +! +! Sea surface specific humidity +! +PQSAT(:)=QSAT_SEAWATER(PSST(:),PPS(:)) +! +! Set a minimum value to wind +! +ZVMOD(:) = WIND_THRESHOLD(PVMOD(:),PUREF(:)) +! +! Specific humidity at saturation at the atm. level +! +ZPA(:) = XP00* (PEXNA(:)**(XCPD/XRD)) +ZQASAT(:) = QSAT(ZTA(:),ZPA(:)) +! +! +ZO(:) = 0.0001 +ZWG(:) = 0. +IF (S%LPWG) ZWG(:) = 0.5 +! +ZCHARN(:) = 0.011 +! +DO J=1,SIZE(PTA) + ! + ! 2.2 initial guess + ! + ZDU(J) = ZVMOD(J) !wind speed difference with surface current(=0) (m/s) + !initial guess for gustiness factor + ZDT(J) = -(ZTA(J)/PEXNA(J)) + (PSST(J)/PEXNS(J)) !potential temperature difference + ZDQ(J) = PQSAT(J)-PQA(J) !specific humidity difference + ! + ZDUWG(J) = SQRT(ZDU(J)**2+ZWG(J)**2) !wind speed difference including gustiness ZWG + ! + ! 2.3 initialization of neutral coefficients + ! + ZU10(J) = ZDUWG(J)*LOG(ZS/ZO(J))/LOG(PUREF(J)/ZO(J)) + ZUSR(J) = 0.035*ZU10(J) + ZVISA(J) = 1.326E-5*(1.+6.542E-3*(ZTA(J)-XTT)+& + 8.301E-6*(ZTA(J)-XTT)**2-4.84E-9*(ZTA(J)-XTT)**3) !Andrea (1989) CRREL Rep. 89-11 + ! + ZO10(J) = ZCHARN(J)*ZUSR(J)*ZUSR(J)/XG+0.11*ZVISA(J)/ZUSR(J) + ZCD(J) = (XKARMAN/LOG(PUREF(J)/ZO10(J)))**2 !drag coefficient + ZCD10(J)= (XKARMAN/LOG(ZS/ZO10(J)))**2 + ZCT10(J)= ZCH10/SQRT(ZCD10(J)) + ZOT10(J)= ZS/EXP(XKARMAN/ZCT10(J)) + ! + !------------------------------------------------------------------------------- + ! Grachev and Fairall (JAM, 1997) + ZCT(J) = XKARMAN/LOG(PZREF(J)/ZOT10(J)) !temperature transfer coefficient + ZCC(J) = XKARMAN*ZCT(J)/ZCD(J) !z/L vs Rib linear coef. + ! + ZRIBCU(J) = -PUREF(J)/(ZZBL*0.004*ZBETAGUST**3) !saturation or plateau Rib + !ZRIBU(J) =-XG*PUREF(J)*(ZDT(J)+ZRVSRDM1*(ZTA(J)-XTT)*ZDQ)/& + ! &((ZTA(J)-XTT)*ZDUWG(J)**2) + ZRIBU(J) = -XG*PUREF(J)*(ZDT(J)+ZRVSRDM1*ZTA(J)*ZDQ(J))/& + (ZTA(J)*ZDUWG(J)**2) + ! + IF (ZRIBU(J)<0.) THEN + ZETU(J) = ZCC(J)*ZRIBU(J)/(1.+ZRIBU(J)/ZRIBCU(J)) !Unstable G and F + ELSE + ZETU(J) = ZCC(J)*ZRIBU(J)/(1.+27./9.*ZRIBU(J)/ZCC(J))!Stable + ENDIF + ! + ZL10(J) = PUREF(J)/ZETU(J) !MO length + ! +ENDDO +! +! First guess M-O stability dependent scaling params. (u*,T*,q*) to estimate ZO and z/L (ZZL) +ZUSR(:) = ZDUWG(:)*XKARMAN/(LOG(PUREF(:)/ZO10(:))-PSIFCTU(PUREF(:)/ZL10(:))) +ZTSR(:) = -ZDT(:)*XKARMAN/(LOG(PZREF(:)/ZOT10(:))-PSIFCTT(PZREF(:)/ZL10(:))) +ZQSR(:) = -ZDQ(:)*XKARMAN/(LOG(PZREF(:)/ZOT10(:))-PSIFCTT(PZREF(:)/ZL10(:))) +! +IF (LCPL_WAVE .AND. .NOT. (ANY(S%XCHARN==0.0)) ) THEN + ZCHARN(:) = S%XCHARN(:) +ELSE + ZCHARN(:) = 0.011 +END IF +! +ZZL(:) = 0.0 +! +DO J=1,SIZE(PTA) + ! + IF (ZETU(J)>50.) THEN + ITERMAX(J) = 1 + ELSE + ITERMAX(J) = 3 !number of iterations + ENDIF + IF (ZVMOD(J)<=1.) THEN + ITERMAX(J) = 10 + ENDIF + ! + IF (.NOT.LCPL_WAVE) THEN + !then modify Charnork for high wind speeds Chris Fairall's data + IF (ZDUWG(J)>10.) ZCHARN(J) = 0.011 + (0.018-0.011)*(ZDUWG(J)-10.)/(18-10) + IF (ZDUWG(J)>18.) ZCHARN(J) = 0.018 + END IF + ! + ! 3. ITERATIVE LOOP TO COMPUTE USR, TSR, QSR + ! ------------------------------------------- + ! + IF (S%LWAVEWIND .AND. .NOT. LCPL_WAVE) THEN + ZHWAVE(J) = 0.018*PVMOD(J)*PVMOD(J)*(1.+0.015*PVMOD(J)) + ZTWAVE(J) = 0.729*PVMOD(J) + ELSE + ZHWAVE(J) = PHS(J) + ZTWAVE(J) = PTP(J) + ! to avoid the nullity of HS and TP + IF (ZHWAVE(J) .EQ. 0.0) ZHWAVE(J) = 0.018*PVMOD(J)*PVMOD(J)*(1.+0.015*PVMOD(J)) + IF (ZTWAVE(J) .EQ. 0.0) ZTWAVE(J) = 0.729*PVMOD(J) + ENDIF +! + ZCWAVE(J) = XG*ZTWAVE(J)/(2.*XPI) + ZLWAVE(J) = ZTWAVE(J)*ZCWAVE(J) + ! +ENDDO +! + +! +DO JLOOP=1,MAXVAL(ITERMAX) ! begin of iterative loop + ! + DO J=1,SIZE(PTA) + ! + IF (JLOOP.GT.ITERMAX(J)) CYCLE + ! + IF (S%NGRVWAVES==0) THEN + ZO(J) = ZCHARN(J)*ZUSR(J)*ZUSR(J)/XG + 0.11*ZVISA(J)/ZUSR(J) !Smith 1988 + ELSE IF (S%NGRVWAVES==1) THEN + ZO(J) = (50./(2.*XPI))*ZLWAVE(J)*(ZUSR(J)/ZCWAVE(J))**4.5 & + + 0.11*ZVISA(J)/ZUSR(J) !Oost et al. 2002 + ELSE IF (S%NGRVWAVES==2) THEN + ZO(J) = 1200.*ZHWAVE(J)*(ZHWAVE(J)/ZLWAVE(J))**4.5 & + + 0.11*ZVISA(J)/ZUSR(J) !Taulor and Yelland 2001 + ENDIF + ! + ZRR(J) = ZO(J)*ZUSR(J)/ZVISA(J) + ZOQ(J) = MIN(1.15E-4 , 5.5E-5/ZRR(J)**0.6) + ZOT(J) = ZOQ(J) + ! + ZZL(J) = XKARMAN * XG * PUREF(J) * & + ( ZTSR(J)*(1.+ZRVSRDM1*PQA(J)) + ZRVSRDM1*ZTA(J)*ZQSR(J) ) / & + ( ZTA(J)*ZUSR(J)*ZUSR(J)*(1.+ZRVSRDM1*PQA(J)) ) + ZZTL(J)= ZZL(J)*PZREF(J)/PUREF(J) ! for T +! ZZQL(J)=ZZL(J)*PZREF(J)/PUREF(J) ! for Q + ENDDO + ! + ZPUZ(:) = PSIFCTU(ZZL(:)) + ZPTZ(:) = PSIFCTT(ZZTL(:)) + ! + DO J=1,SIZE(PTA) + ! + ! ZPQZ(J)=PSIFCTT(ZZQL(J)) + ZPQZ(J) = ZPTZ(J) + ! + ! 3.1 scale parameters + ! + ZUSR(J) = ZDUWG(J)*XKARMAN/(LOG(PUREF(J)/ZO(J)) -ZPUZ(J)) + ZTSR(J) = -ZDT(J) *XKARMAN/(LOG(PZREF(J)/ZOT(J))-ZPTZ(J)) + ZQSR(J) = -ZDQ(J) *XKARMAN/(LOG(PZREF(J)/ZOQ(J))-ZPQZ(J)) + ! + ! 3.2 Gustiness factor (ZWG) + ! + IF(S%LPWG) THEN + ZBF(J) = -XG/ZTA(J)*ZUSR(J)*(ZTSR(J)+ZRVSRDM1*ZTA(J)*ZQSR(J)) + IF (ZBF(J)>0.) THEN + ZWG(J) = ZBETAGUST*(ZBF(J)*ZZBL)**(1./3.) + ELSE + ZWG(J) = 0.2 + ENDIF + ENDIF + ZDUWG(J) = SQRT(ZVMOD(J)**2 + ZWG(J)**2) + ! + ENDDO + ! +ENDDO +!------------------------------------------------------------------------------- +! +! 4. COMPUTE transfer coefficients PCD, PCH, ZCE and SURFACE FLUXES +! -------------------------------------------------------------- +! +ZTAU(:) = XUNDEF +ZHF(:) = XUNDEF +ZEF(:) = XUNDEF +! +ZWBAR(:) = 0. +ZTAUR(:) = 0. +ZRF(:) = 0. +! +DO J=1,SIZE(PTA) + ! + ! + ! 4. transfert coefficients PCD, PCH and PCE + ! and neutral PCDN, ZCHN, ZCEN + ! + PCD(J) = (ZUSR(J)/ZDUWG(J))**2. + PCH(J) = ZUSR(J)*ZTSR(J)/(ZDUWG(J)*(ZTA(J)*PEXNS(J)/PEXNA(J)-PSST(J))) + PCE(J) = ZUSR(J)*ZQSR(J)/(ZDUWG(J)*(PQA(J)-PQSAT(J))) + ! + PCDN(J) = (XKARMAN/LOG(ZS/ZO(J)))**2. + ZCHN(J) = (XKARMAN/LOG(ZS/ZO(J)))*(XKARMAN/LOG(ZS/ZOT(J))) + ZCEN(J) = (XKARMAN/LOG(ZS/ZO(J)))*(XKARMAN/LOG(ZS/ZOQ(J))) + ! + ZLV(J) = XLVTT + (XCPV-XCL)*(PSST(J)-XTT) + ! + ! 4. 2 surface fluxes + ! + IF (ABS(PCDN(J))>1.E-2) THEN !!!! secure COARE3.0 CODE + write(*,*) 'pb PCDN in COARE30: ',PCDN(J) + write(*,*) 'point: ',J,"/",SIZE(PTA) + write(*,*) 'roughness: ', ZO(J) + write(*,*) 'ustar: ',ZUSR(J) + write(*,*) 'wind: ',ZDUWG(J) + CALL ABOR1_SFX('COARE30: PCDN too large -> no convergence') + ELSE + ZTSR(J) = -ZTSR(J) + ZQSR(J) = -ZQSR(J) + ZTAU(J) = -PRHOA(J)*ZUSR(J)*ZUSR(J)*ZVMOD(J)/ZDUWG(J) + ZHF(J) = PRHOA(J)*XCPD*ZUSR(J)*ZTSR(J) + ZEF(J) = PRHOA(J)*ZLV(J)*ZUSR(J)*ZQSR(J) + ! + ! 4.3 Contributions to surface fluxes due to rainfall + ! + ! SB: a priori, le facteur ZRDSRV=XRD/XRV est introduit pour + ! adapter la formule de Clausius-Clapeyron (pour l'air + ! sec) au cas humide. + IF (S%LPRECIP) THEN + ! + ! heat surface fluxes + ! + ZTAC(J) = ZTA(J)-XTT + ! + ZXLR(J) = XLVTT + (XCPV-XCL)* ZTAC(J) ! latent heat of rain vaporization + ZDQSDT(J)= ZQASAT(J) * ZXLR(J) / (XRD*ZTA(J)**2) ! Clausius-Clapeyron relation + ZDTMP(J) = (1.0 + 3.309e-3*ZTAC(J) -1.44e-6*ZTAC(J)*ZTAC(J)) * & !heat diffusivity + 0.02411 / (PRHOA(J)*XCPD) + ! + ZDWAT(J) = 2.11e-5 * (XP00/ZPA(J)) * (ZTA(J)/XTT)**1.94 ! water vapour diffusivity from eq (13.3) + ! ! of Pruppacher and Klett (1978) + ZALFAC(J)= 1.0 / (1.0 + & ! Eq.11 in GoF95 + ZRDSRV*ZDQSDT(J)*ZXLR(J)*ZDWAT(J)/(ZDTMP(J)*XCPD)) ! ZALFAC=wet-bulb factor (sans dim) + ZCPLW(J) = 4224.8482 + ZTAC(J) * & + ( -4.707 + ZTAC(J) * & + (0.08499 + ZTAC(J) * & + (1.2826e-3 + ZTAC(J) * & + (4.7884e-5 - 2.0027e-6* ZTAC(J))))) ! specific heat + ! + ZRF(J) = PRAIN(J) * ZCPLW(J) * ZALFAC(J) * & !Eq.12 in GoF95 !SIGNE? + (PSST(J) - ZTA(J) + (PQSAT(J)-PQA(J))*ZXLR(J)/XCPD ) + ! + ! Momentum flux due to rainfall + ! + ZTAUR(J)=-0.85*(PRAIN(J) *ZVMOD(J)) !pp3752 in FBR96 + ! + ENDIF + ! + ! 4.4 Webb correction to latent heat flux + ! + ZWBAR(J)=- (1./ZRDSRV)*ZUSR(J)*ZQSR(J) / (1.0+(1./ZRDSRV)*PQA(J)) & + - ZUSR(J)*ZTSR(J)/ZTA(J) ! Eq.21*rhoa in FBR96 + ! + ! 4.5 friction velocity which contains correction du to rain + ! + ZUSTAR2(J)= - (ZTAU(J) + ZTAUR(J)) / PRHOA(J) + PUSTAR(J) = SQRT(ZUSTAR2(J)) + ! + ! 4.6 Total surface fluxes + ! + PSFTH (J) = ZHF(J) + ZRF(J) + PSFTQ (J) = ZEF(J) / ZLV(J) + ! + ENDIF +ENDDO +!------------------------------------------------------------------------------- +! +! 5. FINAL STEP : TOTAL SURFACE FLUXES AND DERIVED DIAGNOSTICS +! ----------- +! 5.1 Richardson number +! +! +ZDIRCOSZW(:) = 1. + CALL SURFACE_RI(PSST,PQSAT,PEXNS,PEXNA,ZTA,ZQASAT,& + PZREF,PUREF,ZDIRCOSZW,PVMOD,PRI ) +! +! 5.2 Aerodynamical conductance and resistance +! +ZAC(:) = PCH(:)*ZVMOD(:) +PRESA(:) = 1. / MAX(ZAC(:),XSURF_EPSILON) +! +! 5.3 Z0 and Z0H over sea +! +PZ0SEA(:) = MAX(MIN(ZO(:),0.05),10E-6) +! +PZ0HSEA(:) = PZ0SEA(:) +! +IF (LHOOK) CALL DR_HOOK('COARE30_FLUX',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE COARE30_FLUX diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/coare30_seaflux.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/coare30_seaflux.F90 new file mode 100644 index 0000000000000000000000000000000000000000..2241194321f710371ea128caafa038fa06dceae8 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/coare30_seaflux.F90 @@ -0,0 +1,270 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE COARE30_SEAFLUX (S, & + PMASK,KSIZE_WATER,KSIZE_ICE, & + PTA,PEXNA,PRHOA,PSST,PEXNS,PQA, & + PRAIN,PSNOW,PVMOD,PZREF,PUREF,PPS, & + PQSAT,PSFTH,PSFTQ,PUSTAR, & + PCD,PCDN,PCH,PCE,PRI,PRESA,PZ0HSEA,PHS,PTP) +! ################################################################## +! +! +!!**** *COARE30_SEAFLUX* +!! +!! PURPOSE +!! ------- +! +! Calculate the sea surface fluxes with modified bulk algorithm COARE: +! +! Calculates the surface fluxes of heat, moisture, and momentum over +! sea surface with the simplified COARE 3.0 bulk algorithm from Fairall et al +! 2003 +! +! based on water_flux computation for sea ice +! +!!** METHOD +!! ------ +! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! C. Lebeaupin *Météo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/03/2005 +!! B. Decharme 04/2013 : Pack only input variables +!! S. Senesi 01/2014 : When handling sea ice cover, compute open sea flux, +!! and only where ice cover < 1. +!! M.N. Bouin 03/2014 possibility of wave parameters from external source +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +! +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +USE MODI_ICE_SEA_FLUX +USE MODI_COARE30_FLUX +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +! +REAL, DIMENSION(:), INTENT(IN) :: PMASK ! Either a mask positive for open sea, or a seaice fraction +INTEGER , INTENT(IN) :: KSIZE_WATER ! number of points with some sea water +INTEGER , INTENT(IN) :: KSIZE_ICE ! number of points with some sea ice +! +REAL, DIMENSION(:), INTENT(IN) :: PTA ! air temperature at atm. level (K) +REAL, DIMENSION(:), INTENT(IN) :: PQA ! air humidity at atm. level (kg/kg) +REAL, DIMENSION(:), INTENT(IN) :: PEXNA ! Exner function at atm. level +REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density at atm. level +REAL, DIMENSION(:), INTENT(IN) :: PVMOD ! module of wind at atm. wind level (m/s) +REAL, DIMENSION(:), INTENT(IN) :: PZREF ! atm. level for temp. and humidity (m) +REAL, DIMENSION(:), INTENT(IN) :: PUREF ! atm. level for wind (m) +REAL, DIMENSION(:), INTENT(IN) :: PSST ! Sea Surface Temperature (K) +REAL, DIMENSION(:), INTENT(IN) :: PHS ! wave significant height +REAL, DIMENSION(:), INTENT(IN) :: PTP ! Wave peak period +REAL, DIMENSION(:), INTENT(IN) :: PEXNS ! Exner function at sea surface +REAL, DIMENSION(:), INTENT(IN) :: PPS ! air pressure at sea surface (Pa) +REAL, DIMENSION(:), INTENT(IN) :: PRAIN ! precipitation rate (kg/s/m2) +REAL, DIMENSION(:), INTENT(IN) :: PSNOW ! snow rate (kg/s/m2) +! +! surface fluxes : latent heat, sensible heat, friction fluxes +REAL, DIMENSION(:), INTENT(OUT) :: PSFTH ! heat flux (W/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSFTQ ! water flux (kg/m2/s) +REAL, DIMENSION(:), INTENT(OUT) :: PUSTAR! friction velocity (m/s) +! +! diagnostics +REAL, DIMENSION(:), INTENT(OUT) :: PQSAT ! humidity at saturation +REAL, DIMENSION(:), INTENT(OUT) :: PCD ! heat drag coefficient +REAL, DIMENSION(:), INTENT(OUT) :: PCDN ! momentum drag coefficient +REAL, DIMENSION(:), INTENT(OUT) :: PCH ! neutral momentum drag coefficient +REAL, DIMENSION(:), INTENT(OUT) :: PCE !transfer coef. for latent heat flux +REAL, DIMENSION(:), INTENT(OUT) :: PRI ! Richardson number +REAL, DIMENSION(:), INTENT(OUT) :: PRESA ! aerodynamical resistance +REAL, DIMENSION(:), INTENT(OUT) :: PZ0HSEA ! heat roughness length +! +!* 0.2 declarations of local variables +! +INTEGER, DIMENSION(KSIZE_WATER) :: IR_WATER +INTEGER, DIMENSION(KSIZE_ICE) :: IR_ICE +INTEGER :: J1,J2,JJ +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +! 1. Create Masks for ice and water sea +! ------------------------------------ +IF (LHOOK) CALL DR_HOOK('MODI_COARE30_SEAFLUX:COARE30_SEAFLUX',0,ZHOOK_HANDLE) +! +IR_WATER(:)=0 +IR_ICE(:)=0 +J1=0 +J2=0 +! +IF (S%LHANDLE_SIC) THEN + ! Must compute open sea fluxes even over fully ice-covered sea, which may melt partly + DO JJ=1,SIZE(PSST(:)) + IR_WATER(JJ)= JJ + END DO + ! Do not compute on sea-ice (done in coupling_iceflux) +ELSE + ! PMASK = XSST -XTTS + DO JJ=1,SIZE(PSST(:)) + IF (PMASK(JJ) >=0.0 ) THEN + J1 = J1 + 1 + IR_WATER(J1)= JJ + ELSE + J2 = J2 + 1 + IR_ICE(J2)= JJ + ENDIF + END DO +ENDIF +! +!------------------------------------------------------------------------------- +! +! 2. water sea : call to COARE30_FLUX +! ------------------------------------------------ +! +IF (KSIZE_WATER > 0 ) CALL TREAT_SURF(IR_WATER,'W') +! +!------------------------------------------------------------------------------- +! +! 3. sea ice : call to ICE_SEA_FLUX +! ------------------------------------ +! +IF ( (KSIZE_ICE > 0 ) .AND. (.NOT. S%LHANDLE_SIC) ) CALL TREAT_SURF(IR_ICE,'I') +! +! +IF (LHOOK) CALL DR_HOOK('MODI_COARE30_SEAFLUX:COARE30_SEAFLUX',1,ZHOOK_HANDLE) +!------------------------------------------------------------------------------- +! +CONTAINS +! +SUBROUTINE TREAT_SURF(KMASK,YTYPE) +! +INTEGER, INTENT(IN), DIMENSION(:) :: KMASK + CHARACTER(LEN=1), INTENT(IN) :: YTYPE +! +REAL, DIMENSION(SIZE(KMASK)) :: ZW_TA ! air temperature at atm. level (K) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_QA ! air humidity at atm. level (kg/kg) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_EXNA ! Exner function at atm. level +REAL, DIMENSION(SIZE(KMASK)) :: ZW_RHOA ! air density at atm. level +REAL, DIMENSION(SIZE(KMASK)) :: ZW_VMOD ! module of wind at atm. wind level (m/s) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_ZREF ! atm. level for temp. and humidity (m) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_UREF ! atm. level for wind (m) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_SST ! Sea Surface Temperature (K) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_HS ! wave significant height +REAL, DIMENSION(SIZE(KMASK)) :: ZW_TP ! wave peak period +REAL, DIMENSION(SIZE(KMASK)) :: ZW_EXNS ! Exner function at sea surface +REAL, DIMENSION(SIZE(KMASK)) :: ZW_PS ! air pressure at sea surface (Pa) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_RAIN !precipitation rate (kg/s/m2) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_SNOW !snow rate (kg/s/m2) +! +REAL, DIMENSION(SIZE(KMASK)) :: ZW_Z0SEA! roughness length over the ocean +! +! surface fluxes : latent heat, sensible heat, friction fluxes +REAL, DIMENSION(SIZE(KMASK)) :: ZW_SFTH ! heat flux (W/m2) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_SFTQ ! water flux (kg/m2/s) +REAL, DIMENSION(SIZE(KMASK)) :: ZW_USTAR! friction velocity (m/s) +! +! diagnostics +REAL, DIMENSION(SIZE(KMASK)) :: ZW_QSAT ! humidity at saturation +REAL, DIMENSION(SIZE(KMASK)) :: ZW_CD ! heat drag coefficient +REAL, DIMENSION(SIZE(KMASK)) :: ZW_CDN ! momentum drag coefficient +REAL, DIMENSION(SIZE(KMASK)) :: ZW_CH ! neutral momentum drag coefficient +REAL, DIMENSION(SIZE(KMASK)) :: ZW_CE !transfer coef. for latent heat flux +REAL, DIMENSION(SIZE(KMASK)) :: ZW_RI ! Richardson number +REAL, DIMENSION(SIZE(KMASK)) :: ZW_RESA ! aerodynamical resistance +REAL, DIMENSION(SIZE(KMASK)) :: ZW_Z0HSEA ! heat roughness length +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('COARE30_SEAFLUX:TREAT_SURF',0,ZHOOK_HANDLE) +! +DO JJ=1, SIZE(KMASK) + ZW_TA(JJ) = PTA(KMASK(JJ)) + ZW_QA(JJ) = PQA(KMASK(JJ)) + ZW_EXNA(JJ) = PEXNA(KMASK(JJ)) + ZW_RHOA(JJ) = PRHOA(KMASK(JJ)) + ZW_VMOD(JJ) = PVMOD(KMASK(JJ)) + ZW_ZREF(JJ) = PZREF(KMASK(JJ)) + ZW_UREF(JJ) = PUREF(KMASK(JJ)) + ZW_SST(JJ) = PSST(KMASK(JJ)) + ZW_TP(JJ) = PTP(KMASK(JJ)) + ZW_HS(JJ) = PHS(KMASK(JJ)) + ZW_EXNS(JJ) = PEXNS(KMASK(JJ)) + ZW_PS(JJ) = PPS(KMASK(JJ)) + ZW_RAIN(JJ) = PRAIN(KMASK(JJ)) + ZW_SNOW(JJ) = PSNOW(KMASK(JJ)) + ZW_Z0SEA(JJ)= S%XZ0(KMASK(JJ)) +ENDDO +! +ZW_SFTH(:) = XUNDEF +ZW_SFTQ(:) = XUNDEF +ZW_USTAR(:) = XUNDEF +ZW_QSAT(:) = XUNDEF +ZW_CD(:) = XUNDEF +ZW_CDN(:) = XUNDEF +ZW_CH(:) = XUNDEF +ZW_CE(:) = XUNDEF +ZW_RI(:) = XUNDEF +ZW_RESA(:) = XUNDEF +ZW_Z0HSEA(:) = XUNDEF +! +IF (YTYPE=='W') THEN + ! + CALL COARE30_FLUX(S, & + ZW_Z0SEA,ZW_TA,ZW_EXNA,ZW_RHOA,ZW_SST,ZW_EXNS,& + ZW_QA,ZW_VMOD,ZW_ZREF,ZW_UREF,ZW_PS,ZW_QSAT,ZW_SFTH,ZW_SFTQ,ZW_USTAR,& + ZW_CD,ZW_CDN,ZW_CH,ZW_CE,ZW_RI,ZW_RESA,ZW_RAIN,ZW_Z0HSEA,ZW_HS,ZW_TP) + ! +ELSEIF ( (YTYPE=='I') .AND. (.NOT. S%LHANDLE_SIC)) THEN + ! + CALL ICE_SEA_FLUX(ZW_Z0SEA,ZW_TA,ZW_EXNA,ZW_RHOA,ZW_SST,ZW_EXNS,ZW_QA,ZW_RAIN,ZW_SNOW, & + ZW_VMOD,ZW_ZREF,ZW_UREF,ZW_PS,ZW_QSAT,ZW_SFTH,ZW_SFTQ,ZW_USTAR,ZW_CD, & + ZW_CDN,ZW_CH,ZW_RI,ZW_RESA,ZW_Z0HSEA) + ! +ENDIF +! +DO JJ=1, SIZE(KMASK) + S%XZ0(KMASK(JJ)) = ZW_Z0SEA(JJ) + PSFTH(KMASK(JJ)) = ZW_SFTH(JJ) + PSFTQ(KMASK(JJ)) = ZW_SFTQ(JJ) + PUSTAR(KMASK(JJ)) = ZW_USTAR(JJ) + PQSAT(KMASK(JJ)) = ZW_QSAT(JJ) + PCD(KMASK(JJ)) = ZW_CD(JJ) + PCDN(KMASK(JJ)) = ZW_CDN(JJ) + PCH(KMASK(JJ)) = ZW_CH(JJ) + PCE(KMASK(JJ)) = ZW_CE(JJ) + PRI(KMASK(JJ)) = ZW_RI(JJ) + PRESA(KMASK(JJ)) = ZW_RESA(JJ) + PZ0HSEA(KMASK(JJ)) = ZW_Z0HSEA(JJ) +END DO +IF (LHOOK) CALL DR_HOOK('COARE30_SEAFLUX:TREAT_SURF',1,ZHOOK_HANDLE) +! +END SUBROUTINE TREAT_SURF +! +END SUBROUTINE COARE30_SEAFLUX diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/coupling_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/coupling_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..40fc1d1905ff83fcc55ed7d9059127a6f2c7bfea --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/coupling_seafluxn.F90 @@ -0,0 +1,782 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ############################################################################### +SUBROUTINE COUPLING_SEAFLUX_n (SM, DST, SLT, & + HPROGRAM, HCOUPLING, PTIMEC, & + PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, & + PAZIM, PZREF, PUREF, PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV, & + PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, & + PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, & + PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, & + PPEW_A_COEF, PPEW_B_COEF, & + PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, & + HTEST ) +! ############################################################################### +! +!!**** *COUPLING_SEAFLUX_n * - Driver of the WATER_FLUX scheme for sea +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! Modified 01/2006 : sea flux parameterization. +!! Modified 09/2006 : P. Tulet Introduce Sea salt aerosol Emission/Deposition +!! Modified 03/2009 : B. Decharme SST could change during a run => ALB and EMIS +!! Modified 05/2009 : V. Masson : implicitation of momentum fluxes +!! Modified 09/2009 : B. Decharme Radiative properties at time t+1 +!! Modified 01/2010 : B. Decharme Add XTTS +!! Modified 09/2012 : B. Decharme New wind implicitation +!! Modified 10/2012 : P. Le Moigne CMO1D update +!! Modified 04/2013 : P. Le Moigne Wind implicitation and SST update displaced +!! Modified 04/2013 : B. Decharme new coupling variables +!! Modified 01/2014 : S. Senesi : handle sea-ice cover, sea-ice model interface, +!! and apply to Gelato +!! Modified 01/2014 : S. Belamari Remove MODE_THERMOS and XLVTT +!! Modified 05/2014 : S. Belamari New ECUME : Include salinity & atm. pressure impact +!! Modified 01/2015 : R. Séférian interactive ocaen surface albedo +!! Modified 03/2014 : M.N. Bouin possibility of wave parameters from external source +!! Modified 11/2014 : J. Pianezze : add currents for wave coupling +!! +!!--------------------------------------------------------------------- +! +! +! +USE MODD_SURFEX_n, ONLY : SEAFLUX_MODEL_t +! +USE MODD_DST_n, ONLY : DST_t +USE MODD_SLT_n, ONLY : SLT_t +! +USE MODD_REPROD_OPER, ONLY : CIMPLICIT_WIND +! +USE MODD_CSTS, ONLY : XRD, XCPD, XP00, XTT, XTTS, XTTSI, XDAY +USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_SFX_OASIS, ONLY : LCPL_WAVE, LCPL_SEA, LCPL_SEAICE +USE MODD_WATER_PAR, ONLY : XEMISWAT, XEMISWATICE +! +USE MODD_WATER_PAR, ONLY : XALBSEAICE +! +! +USE MODI_WATER_FLUX +USE MODI_MR98 +USE MODI_ECUME_SEAFLUX +USE MODI_COARE30_SEAFLUX +USE MODI_ADD_FORECAST_TO_DATE_SURF +USE MODI_MOD1D_n +USE MODI_DIAG_INLINE_SEAFLUX_n +USE MODI_CH_AER_DEP +USE MODI_CH_DEP_WATER +USE MODI_DSLT_DEP +USE MODI_SST_UPDATE +USE MODI_INTERPOL_SST_MTH +USE MODI_UPDATE_RAD_SEA +! +USE MODE_DSLT_SURF +USE MODD_DST_SURF +USE MODD_SLT_SURF +! +USE MODD_OCEAN_GRID, ONLY : NOCKMIN +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +USE MODI_ABOR1_SFX +! +USE MODI_COUPLING_ICEFLUX_n +USE MODI_SEAICE_GELATO1D_n +! +USE MODI_COUPLING_SLT_n +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +TYPE(SEAFLUX_MODEL_t), INTENT(INOUT) :: SM +TYPE(DST_t), INTENT(INOUT) :: DST +TYPE(SLT_t), INTENT(INOUT) :: SLT +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes + CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING ! type of coupling + ! 'E' : explicit + ! 'I' : implicit +REAL, INTENT(IN) :: PTIMEC ! current duration since start of the run (s) +INTEGER, INTENT(IN) :: KYEAR ! current year (UTC) +INTEGER, INTENT(IN) :: KMONTH ! current month (UTC) +INTEGER, INTENT(IN) :: KDAY ! current day (UTC) +REAL, INTENT(IN) :: PTIME ! current time since midnight (UTC, s) +INTEGER, INTENT(IN) :: KI ! number of points +INTEGER, INTENT(IN) :: KSV ! number of scalars +INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands +REAL, DIMENSION(KI), INTENT(IN) :: PTSUN ! solar time (s from midnight) +REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s) +REAL, DIMENSION(KI), INTENT(IN) :: PZREF ! height of T,q forcing (m) +REAL, DIMENSION(KI), INTENT(IN) :: PUREF ! height of wind forcing (m) +! +REAL, DIMENSION(KI), INTENT(IN) :: PTA ! air temperature forcing (K) +REAL, DIMENSION(KI), INTENT(IN) :: PQA ! air humidity forcing (kg/m3) +REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density (kg/m3) +REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV ! scalar variables +! ! chemistry: first char. in HSV: '#' (molecule/m3) +! ! + CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV ! name of all scalar variables +REAL, DIMENSION(KI), INTENT(IN) :: PU ! zonal wind (m/s) +REAL, DIMENSION(KI), INTENT(IN) :: PV ! meridian wind (m/s) +REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.) +! ! (W/m2) +REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.) +! ! (W/m2) +REAL, DIMENSION(KSW),INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m) +REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! zenithal angle at t (radian from the vertical) +REAL, DIMENSION(KI), INTENT(IN) :: PZENITH2 ! zenithal angle at t+1(radian from the vertical) +REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! azimuthal angle (radian from North, clockwise) +REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.) +! ! (W/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) +REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) +REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s) +! +REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH ! flux of heat (W/m2) +REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ ! flux of water vapor (kg/m2/s) +REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa) +REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa) +REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2 ! flux of CO2 (m/s*kg_CO2/kg_air) +REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS ! flux of scalar var. (kg/m2/s) +! +REAL, DIMENSION(KI), INTENT(OUT) :: PTRAD ! radiative temperature (K) +REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB! direct albedo for each spectral band (-) +REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB! diffuse albedo for each spectral band (-) +REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity (-) +! +REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K) +REAL, DIMENSION(KI), INTENT(OUT) :: PZ0 ! roughness length for momentum (m) +REAL, DIMENSION(KI), INTENT(OUT) :: PZ0H ! roughness length for heat (m) +REAL, DIMENSION(KI), INTENT(OUT) :: PQSURF ! specific humidity at surface (kg/kg) +! +REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients (m2s/kg) +REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I' (m/s) +REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF +REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF +REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF +REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF + CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK' +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(KI,KSW) :: ZDIR_ALB ! Direct albedo at time t +REAL, DIMENSION(KI,KSW) :: ZSCA_ALB ! Diffuse albedo at time t +! +REAL, DIMENSION(KI) :: ZEXNA ! Exner function at forcing level +REAL, DIMENSION(KI) :: ZEXNS ! Exner function at surface level +REAL, DIMENSION(KI) :: ZU ! zonal wind +REAL, DIMENSION(KI) :: ZV ! meridian wind +REAL, DIMENSION(KI) :: ZWIND ! Wind +REAL, DIMENSION(KI) :: ZCD ! Drag coefficient on open sea +REAL, DIMENSION(KI) :: ZCD_ICE ! " " on seaice +REAL, DIMENSION(KI) :: ZCDN ! Neutral Drag coefficient on open sea +REAL, DIMENSION(KI) :: ZCDN_ICE ! " " on seaice +REAL, DIMENSION(KI) :: ZCH ! Heat transfer coefficient on open sea +REAL, DIMENSION(KI) :: ZCH_ICE ! " " on seaice +REAL, DIMENSION(KI) :: ZCE ! Vaporization heat transfer coefficient on open sea +REAL, DIMENSION(KI) :: ZCE_ICE ! " " on seaice +REAL, DIMENSION(KI) :: ZRI ! Richardson number on open sea +REAL, DIMENSION(KI) :: ZRI_ICE ! " " on seaice +REAL, DIMENSION(KI) :: ZRESA_SEA ! aerodynamical resistance on open sea +REAL, DIMENSION(KI) :: ZRESA_SEA_ICE ! " " on seaice +REAL, DIMENSION(KI) :: ZUSTAR ! friction velocity (m/s) on open sea +REAL, DIMENSION(KI) :: ZUSTAR_ICE ! " " on seaice +REAL, DIMENSION(KI) :: ZZ0 ! roughness length over open sea +REAL, DIMENSION(KI) :: ZZ0_ICE ! roughness length over seaice +REAL, DIMENSION(KI) :: ZZ0H ! heat roughness length over open sea +REAL, DIMENSION(KI) :: ZZ0H_ICE ! heat roughness length over seaice +REAL, DIMENSION(KI) :: ZZ0W ! Work array for Z0 and Z0H computation +REAL, DIMENSION(KI) :: ZQSAT ! humidity at saturation on open sea +REAL, DIMENSION(KI) :: ZQSAT_ICE ! " " on seaice +! +REAL, DIMENSION(KI) :: ZSFTH ! Heat flux for open sea (and for sea-ice points if merged) +REAL, DIMENSION(KI) :: ZSFTQ ! Water vapor flux on open sea (and for sea-ice points if merged) +REAL, DIMENSION(KI) :: ZSFU ! zonal momentum flux on open sea (and for sea-ice points if merged)(Pa) +REAL, DIMENSION(KI) :: ZSFV ! meridional momentum flux on open sea (and for sea-ice points if merged)(Pa) +! +REAL, DIMENSION(KI) :: ZSFTH_ICE ! Heat flux on sea ice +REAL, DIMENSION(KI) :: ZSFTQ_ICE ! Sea-ice sublimation flux +REAL, DIMENSION(KI) :: ZSFU_ICE ! zonal momentum flux on seaice (Pa) +REAL, DIMENSION(KI) :: ZSFV_ICE ! meridional momentum flux on seaice (Pa) + +REAL, DIMENSION(KI) :: ZHU ! Near surface relative humidity +REAL, DIMENSION(KI) :: ZQA ! specific humidity (kg/kg) +REAL, DIMENSION(KI) :: ZEMIS ! Emissivity at time t +REAL, DIMENSION(KI) :: ZTRAD ! Radiative temperature at time t +! +REAL, DIMENSION(KI) :: ZSST ! XSST corrected for anomalously low values (which actually are sea-ice temp) +REAL, DIMENSION(KI) :: ZMASK ! A mask for diagnosing where seaice exists (or, for coupling_iceflux, may appear) +! +REAL :: ZCONVERTFACM0_SLT, ZCONVERTFACM0_DST +REAL :: ZCONVERTFACM3_SLT, ZCONVERTFACM3_DST +REAL :: ZCONVERTFACM6_SLT, ZCONVERTFACM6_DST +! +INTEGER :: ISIZE_WATER ! number of points with some sea water +INTEGER :: ISIZE_ICE ! number of points with some sea ice +! +INTEGER :: ISWB ! number of shortwave spectral bands +INTEGER :: JSWB ! loop counter on shortwave spectral bands +INTEGER :: ISLT ! number of sea salt variable +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!------------------------------------------------------------------------------------- +! Preliminaries: +!------------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_N',0,ZHOOK_HANDLE) +IF (HTEST/='OK') THEN + CALL ABOR1_SFX('COUPLING_SEAFLUXN: FATAL ERROR DURING ARGUMENT TRANSFER') +END IF +!------------------------------------------------------------------------------------- +! +ZEXNA (:) = XUNDEF +ZEXNS (:) = XUNDEF +ZU (:) = XUNDEF +ZV (:) = XUNDEF +ZWIND (:) = XUNDEF +ZSFTQ (:) = XUNDEF +ZSFTH (:) = XUNDEF +ZCD (:) = XUNDEF +ZCDN (:) = XUNDEF +ZCH (:) = XUNDEF +ZCE (:) = XUNDEF +ZRI (:) = XUNDEF +ZHU (:) = XUNDEF +ZRESA_SEA(:) = XUNDEF +ZUSTAR (:) = XUNDEF +ZZ0 (:) = XUNDEF +ZZ0H (:) = XUNDEF +ZQSAT (:) = XUNDEF +! +ZSFTQ_ICE(:) = XUNDEF +ZSFTH_ICE(:) = XUNDEF +ZCD_ICE (:) = XUNDEF +ZCDN_ICE (:) = XUNDEF +ZCH_ICE (:) = XUNDEF +ZCE_ICE (:) = XUNDEF +ZRI_ICE (:) = XUNDEF +ZRESA_SEA_ICE= XUNDEF +ZUSTAR_ICE(:) = XUNDEF +ZZ0_ICE (:) = XUNDEF +ZZ0H_ICE (:) = XUNDEF +ZQSAT_ICE(:) = XUNDEF +! +ZEMIS (:) = XUNDEF +ZTRAD (:) = XUNDEF +ZDIR_ALB (:,:) = XUNDEF +ZSCA_ALB (:,:) = XUNDEF +! +!------------------------------------------------------------------------------------- +! +ZEXNS(:) = (PPS(:)/XP00)**(XRD/XCPD) +ZEXNA(:) = (PPA(:)/XP00)**(XRD/XCPD) +! +IF(LCPL_SEA .OR. LCPL_WAVE)THEN + !Sea currents are taken into account + ZU(:)=PU(:)-SM%S%XUMER(:) + ZV(:)=PV(:)-SM%S%XVMER(:) +ELSE + ZU(:)=PU(:) + ZV(:)=PV(:) +ENDIF +! +ZWIND(:) = SQRT(ZU(:)**2+ZV(:)**2) +! +PSFTS(:,:) = 0. +! +ZHU = 1. +! +ZQA(:) = PQA(:) / PRHOA(:) +! +! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +! Time evolution +! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +! +SM%S%TTIME%TIME = SM%S%TTIME%TIME + PTSTEP + CALL ADD_FORECAST_TO_DATE_SURF(SM%S%TTIME%TDATE%YEAR,SM%S%TTIME%TDATE%MONTH,SM%S%TTIME%TDATE%DAY,SM%S%TTIME%TIME) +! +!-------------------------------------------------------------------------------------- +! Fluxes over water according to Charnock formulae +!-------------------------------------------------------------------------------------- +! +IF (SM%S%LHANDLE_SIC) THEN + ! Flux for sea are computed everywhere + ISIZE_WATER = SIZE(ZMASK) + ! Ensure freezing SST values where XSST actually has very low (sea-ice) values (old habits) + ZSST(:)=MAX(SM%S%XSST(:), XTTSI) + ! Flux over sea-ice will not be computed by next calls, but by coupling_iceflux. Hence : + ISIZE_ICE = 0 + ! Flux over sea-ice will be computed by coupling_iceflux anywhere sea-ice could form in one + ! time-step (incl. under forcing). ZMASK value is set to 1. on these points + ZMASK(:)=0. + WHERE ( SM%S%XSIC(:) > 0. ) ZMASK(:)=1. + ! To be large, assume that seaice may form where SST is < 10C + WHERE ( SM%S%XSST(:) - XTTS <= 10. ) ZMASK(:)=1. + IF (SM%S%LINTERPOL_SIC) WHERE (SM%S%XFSIC(:) > 0. ) ZMASK(:)=1. + IF (SM%S%LINTERPOL_SIT) WHERE (SM%S%XFSIT(:) > 0. ) ZMASK(:)=1. +ELSE + ZSST (:) = SM%S%XSST(:) + ZMASK(:) = SM%S%XSST(:) - XTTS + ISIZE_WATER = COUNT(ZMASK(:)>=0.) + ISIZE_ICE = SIZE(SM%S%XSST) - ISIZE_WATER +ENDIF +! +SELECT CASE (SM%S%CSEA_FLUX) + CASE ('DIRECT') + CALL WATER_FLUX(SM%S%XZ0, & + PTA, ZEXNA, PRHOA, ZSST, ZEXNS, ZQA, PRAIN, & + PSNOW, XTTS, & + ZWIND, PZREF, PUREF, & + PPS, SM%S%LHANDLE_SIC, ZQSAT, & + ZSFTH, ZSFTQ, ZUSTAR, & + ZCD, ZCDN, ZCH, ZRI, ZRESA_SEA, ZZ0H ) + CASE ('ITERAT') + CALL MR98 (SM%S%XZ0, & + PTA, ZEXNA, PRHOA, SM%S%XSST, ZEXNS, ZQA, & + XTTS, & + ZWIND, PZREF, PUREF, & + PPS, ZQSAT, & + ZSFTH, ZSFTQ, ZUSTAR, & + ZCD, ZCDN, ZCH, ZRI, ZRESA_SEA, ZZ0H ) + CASE ('ECUME ','ECUME6') + CALL ECUME_SEAFLUX(SM%S%XZ0, ZMASK, ISIZE_WATER, ISIZE_ICE, & + PTA, ZEXNA ,PRHOA, ZSST, SM%S%XSSS, ZEXNS, ZQA, & + PRAIN, PSNOW, & + ZWIND, PZREF, PUREF, PPS, PPA, & + SM%S%XICHCE, SM%S%LPRECIP, SM%S%LPWEBB, SM%S%LPWG, SM%S%NZ0, & + SM%S%LHANDLE_SIC, ZQSAT, ZSFTH, ZSFTQ, ZUSTAR, & + ZCD, ZCDN, ZCH, ZCE, ZRI, ZRESA_SEA, ZZ0H, & + SM%S%LPERTFLUX, SM%S%XPERTFLUX, SM%S%CSEA_FLUX ) + CASE ('COARE3') + CALL COARE30_SEAFLUX(SM%S, & + ZMASK, ISIZE_WATER, ISIZE_ICE, & + PTA, ZEXNA ,PRHOA, ZSST, ZEXNS, ZQA, PRAIN, & + PSNOW, & + ZWIND, PZREF, PUREF, & + PPS, ZQSAT, & + ZSFTH, ZSFTQ, ZUSTAR, & + ZCD, ZCDN, ZCH, ZCE, ZRI, ZRESA_SEA, ZZ0H, & + SM%S%XHS, SM%S%XTP ) +END SELECT +! +!------------------------------------------------------------------------------------- +!radiative properties at time t +!------------------------------------------------------------------------------------- +! +ISWB = SIZE(PSW_BANDS) +! +DO JSWB=1,ISWB + ZDIR_ALB(:,JSWB) = SM%S%XDIR_ALB(:) + ZSCA_ALB(:,JSWB) = SM%S%XSCA_ALB(:) +END DO +! +IF (SM%S%LHANDLE_SIC) THEN + ZEMIS(:) = (1 - SM%S%XSIC(:)) * XEMISWAT + SM%S%XSIC(:) * XEMISWATICE + ZTRAD(:) = (((1 - SM%S%XSIC(:)) * XEMISWAT * SM%S%XSST (:)**4 + & + SM%S%XSIC(:) * XEMISWATICE * SM%S%XTICE(:)**4)/ & + ZEMIS(:)) ** 0.25 +ELSE + ZTRAD(:) = SM%S%XSST (:) + ZEMIS(:) = SM%S%XEMIS(:) +END IF +! +!------------------------------------------------------------------------------------- +!Specific fields for seaice model (when using earth system model or embedded +!seaice scheme) +!------------------------------------------------------------------------------------- +! +IF(LCPL_SEAICE.OR.SM%S%LHANDLE_SIC)THEN + CALL COUPLING_ICEFLUX_n(KI, PTA, ZEXNA, PRHOA, SM%S%XTICE, ZEXNS, & + ZQA, PRAIN, PSNOW, ZWIND, PZREF, PUREF, & + PPS, SM%S%XSST, XTTS, ZSFTH_ICE, ZSFTQ_ICE, & + SM%S%LHANDLE_SIC, ZMASK, ZQSAT_ICE, ZZ0_ICE, & + ZUSTAR_ICE, ZCD_ICE, ZCDN_ICE, ZCH_ICE, & + ZRI_ICE, ZRESA_SEA_ICE, ZZ0H_ICE ) +ENDIF +! +IF (SM%S%LHANDLE_SIC) CALL COMPLEMENT_EACH_OTHER_FLUX +! +!------------------------------------------------------------------------------------- +! Momentum fluxes over sea or sea-ice +!------------------------------------------------------------------------------------- +! + CALL SEA_MOMENTUM_FLUXES(ZCD, ZSFU, ZSFV) +! +! Momentum fluxes over sea-ice if embedded seaice scheme is used +! +IF (SM%S%LHANDLE_SIC) CALL SEA_MOMENTUM_FLUXES(ZCD_ICE, ZSFU_ICE, ZSFV_ICE) +! +! CO2 flux +! +PSFCO2(:) = 0.0 +! +!IF(LCPL_SEA.AND.CSEACO2=='NONE')THEN +! PSFCO2(:) = XSEACO2(:) +!ELSEIF(CSEACO2=='CST ')THEN +! PSFCO2 = E * deltapCO2 +! According to Wanninkhof (medium hypothesis) : +! E = 1.13.10^-3 * WIND^2 CO2mol.m-2.yr-1.uatm-1 +! = 1.13.10^-3 * WIND^2 * Mco2.10^-3 * (1/365*24*3600) +! deltapCO2 = -8.7 uatm (Table 1 half hypothesis) +PSFCO2(:) = - ZWIND(:)**2 * 1.13E-3 * 8.7 * 44.E-3 / ( 365*24*3600 ) +!ENDIF +! +!------------------------------------------------------------------------------------- +! Scalar fluxes: +!------------------------------------------------------------------------------------- +! +IF (SM%CHS%SVS%NBEQ>0) THEN + IF (SM%CHS%CCH_DRY_DEP == "WES89") THEN + + CALL CH_DEP_WATER (ZRESA_SEA, ZUSTAR, PTA, ZTRAD, & + PSV(:,SM%CHS%SVS%NSV_CHSBEG:SM%CHS%SVS%NSV_CHSEND), & + SM%CHS%SVS%CSV(SM%CHS%SVS%NSV_CHSBEG:SM%CHS%SVS%NSV_CHSEND), & + SM%CHS%XDEP(:,1:SM%CHS%SVS%NBEQ) ) + + PSFTS(:,SM%CHS%SVS%NSV_CHSBEG:SM%CHS%SVS%NSV_CHSEND) = - PSV(:,SM%CHS%SVS%NSV_CHSBEG:SM%CHS%SVS%NSV_CHSEND) & + * SM%CHS%XDEP(:,1:SM%CHS%SVS%NBEQ) + IF (SM%CHS%SVS%NAEREQ > 0 ) THEN + CALL CH_AER_DEP(PSV(:,SM%CHS%SVS%NSV_AERBEG:SM%CHS%SVS%NSV_AEREND),& + PSFTS(:,SM%CHS%SVS%NSV_AERBEG:SM%CHS%SVS%NSV_AEREND),& + ZUSTAR,ZRESA_SEA,PTA,PRHOA) + END IF + + ELSE + PSFTS(:,SM%CHS%SVS%NSV_CHSBEG:SM%CHS%SVS%NSV_CHSEND) =0. + IF (SM%CHS%SVS%NSV_AEREND.GT.SM%CHS%SVS%NSV_AERBEG) PSFTS(:,SM%CHS%SVS%NSV_AERBEG:SM%CHS%SVS%NSV_AEREND) =0. + ENDIF +ENDIF +! +IF (SM%CHS%SVS%NSLTEQ>0) THEN + ISLT = SM%CHS%SVS%NSV_SLTEND - SM%CHS%SVS%NSV_SLTBEG + 1 + + CALL COUPLING_SLT_n(SLT, & + SIZE(ZUSTAR,1), & !I [nbr] number of sea point + ISLT, & !I [nbr] number of sea salt variables + ZWIND, & !I [m/s] wind velocity + PSFTS(:,SM%CHS%SVS%NSV_SLTBEG:SM%CHS%SVS%NSV_SLTEND) ) +ENDIF +! +IF (SM%CHS%SVS%NDSTEQ>0) THEN + CALL DSLT_DEP(PSV(:,SM%CHS%SVS%NSV_DSTBEG:SM%CHS%SVS%NSV_DSTEND), PSFTS(:,SM%CHS%SVS%NSV_DSTBEG:SM%CHS%SVS%NSV_DSTEND), & + ZUSTAR, ZRESA_SEA, PTA, PRHOA, DST%XEMISSIG_DST, DST%XEMISRADIUS_DST, & + JPMODE_DST, XDENSITY_DST, XMOLARWEIGHT_DST, ZCONVERTFACM0_DST, & + ZCONVERTFACM6_DST, ZCONVERTFACM3_DST, LVARSIG_DST, LRGFIX_DST, & + CVERMOD ) + + CALL MASSFLUX2MOMENTFLUX( & + PSFTS(:,SM%CHS%SVS%NSV_DSTBEG:SM%CHS%SVS%NSV_DSTEND), & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments + PRHOA, & !I [kg/m3] air density + DST%XEMISRADIUS_DST, &!I [um] emitted radius for the modes (max 3) + DST%XEMISSIG_DST, &!I [-] emitted sigma for the different modes (max 3) + NDSTMDE, & + ZCONVERTFACM0_DST, & + ZCONVERTFACM6_DST, & + ZCONVERTFACM3_DST, & + LVARSIG_DST, LRGFIX_DST ) +ENDIF + + +IF (SM%CHS%SVS%NSLTEQ>0) THEN + CALL DSLT_DEP(PSV(:,SM%CHS%SVS%NSV_SLTBEG:SM%CHS%SVS%NSV_SLTEND), PSFTS(:,SM%CHS%SVS%NSV_SLTBEG:SM%CHS%SVS%NSV_SLTEND), & + ZUSTAR, ZRESA_SEA, PTA, PRHOA, SLT%XEMISSIG_SLT, SLT%XEMISRADIUS_SLT, & + JPMODE_SLT, XDENSITY_SLT, XMOLARWEIGHT_SLT, ZCONVERTFACM0_SLT, & + ZCONVERTFACM6_SLT, ZCONVERTFACM3_SLT, LVARSIG_SLT, LRGFIX_SLT, & + CVERMOD ) + + CALL MASSFLUX2MOMENTFLUX( & + PSFTS(:,SM%CHS%SVS%NSV_SLTBEG:SM%CHS%SVS%NSV_SLTEND), & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments + PRHOA, & !I [kg/m3] air density + SLT%XEMISRADIUS_SLT, &!I [um] emitted radius for the modes (max 3) + SLT%XEMISSIG_SLT, &!I [-] emitted sigma for the different modes (max 3) + NSLTMDE, & + ZCONVERTFACM0_SLT, & + ZCONVERTFACM6_SLT, & + ZCONVERTFACM3_SLT, & + LVARSIG_SLT, LRGFIX_SLT ) +ENDIF +! +!------------------------------------------------------------------------------- +! Inline diagnostics at time t for SST and TRAD +!------------------------------------------------------------------------------- +! + CALL DIAG_INLINE_SEAFLUX_n(SM%DGS, SM%DGSI, SM%S, & + PTSTEP, PTA, ZQA, PPA, PPS, PRHOA, PU, & + PV, PZREF, PUREF, ZCD, ZCDN, ZCH, ZCE, ZRI, ZHU, & + ZZ0H, ZQSAT, ZSFTH, ZSFTQ, ZSFU, ZSFV, & + PDIR_SW, PSCA_SW, PLW, ZDIR_ALB, ZSCA_ALB, & + ZEMIS, ZTRAD, PRAIN, PSNOW, & + ZCD_ICE, ZCDN_ICE, ZCH_ICE, ZCE_ICE, ZRI_ICE, & + ZZ0_ICE, ZZ0H_ICE, ZQSAT_ICE, ZSFTH_ICE, ZSFTQ_ICE, & + ZSFU_ICE, ZSFV_ICE) +! +!------------------------------------------------------------------------------- +! A kind of "average_flux" +!------------------------------------------------------------------------------- +! +IF (SM%S%LHANDLE_SIC) THEN + PSFTH (:) = ZSFTH (:) * ( 1 - SM%S%XSIC (:)) + ZSFTH_ICE(:) * SM%S%XSIC(:) + PSFTQ (:) = ZSFTQ (:) * ( 1 - SM%S%XSIC (:)) + ZSFTQ_ICE(:) * SM%S%XSIC(:) + PSFU (:) = ZSFU (:) * ( 1 - SM%S%XSIC (:)) + ZSFU_ICE(:) * SM%S%XSIC(:) + PSFV (:) = ZSFV (:) * ( 1 - SM%S%XSIC (:)) + ZSFV_ICE(:) * SM%S%XSIC(:) +ELSE + PSFTH (:) = ZSFTH (:) + PSFTQ (:) = ZSFTQ (:) + PSFU (:) = ZSFU (:) + PSFV (:) = ZSFV (:) +ENDIF +! +!------------------------------------------------------------------------------- +! IMPOSED SSS OR INTERPOLATED SSS AT TIME t+1 +!------------------------------------------------------------------------------- +! +! Daily update Sea surface salinity from monthly data +! +IF (SM%S%LINTERPOL_SSS .AND. MOD(SM%S%TTIME%TIME,XDAY) == 0.) THEN + CALL INTERPOL_SST_MTH(SM%S, & + SM%S%TTIME%TDATE%YEAR,SM%S%TTIME%TDATE%MONTH,SM%S%TTIME%TDATE%DAY,'S',SM%S%XSSS) + IF (ANY(SM%S%XSSS(:)<0.0)) THEN + CALL ABOR1_SFX('COUPLING_SEAFLUX_N: XSSS should be >=0') + ENDIF +ENDIF +! +!------------------------------------------------------------------------------- +! SEA-ICE coupling at time t+1 +!------------------------------------------------------------------------------- +! +IF (SM%S%LHANDLE_SIC) THEN + IF (SM%S%LINTERPOL_SIC) THEN + IF ((MOD(SM%S%TTIME%TIME,XDAY) == 0.) .OR. (PTIMEC <= PTSTEP )) THEN + ! Daily update Sea Ice Cover constraint from monthly data + CALL INTERPOL_SST_MTH(SM%S, & + SM%S%TTIME%TDATE%YEAR,SM%S%TTIME%TDATE%MONTH,SM%S%TTIME%TDATE%DAY,'C',SM%S%XFSIC) + IF (ANY(SM%S%XFSIC(:)>1.0).OR.ANY(SM%S%XFSIC(:)<0.0)) THEN + CALL ABOR1_SFX('COUPLING_SEAFLUX_N: FSIC should be >=0 and <=1') + ENDIF + ENDIF + ENDIF + IF (SM%S%LINTERPOL_SIT) THEN + IF ((MOD(SM%S%TTIME%TIME,XDAY) == 0.) .OR. (PTIMEC <= PTSTEP )) THEN + ! Daily update Sea Ice Thickness constraint from monthly data + CALL INTERPOL_SST_MTH(SM%S, & + SM%S%TTIME%TDATE%YEAR,SM%S%TTIME%TDATE%MONTH,SM%S%TTIME%TDATE%DAY,'H',SM%S%XFSIT) + IF (ANY(SM%S%XFSIT(:)<0.0)) THEN + CALL ABOR1_SFX('COUPLING_SEAFLUX_N: XFSIT should be >=0') + ENDIF + ENDIF + ENDIF + IF (SM%S%CSEAICE_SCHEME=='GELATO') THEN + CALL SEAICE_GELATO1D_n(SM%S, & + HPROGRAM,PTIMEC, PTSTEP, SM%S%TGLT, SM%S%XSST, SM%S%XSSS, & + SM%S%XFSIC, SM%S%XFSIT, SM%S%XSIC, SM%S%XTICE, SM%S%XICE_ALB) + ENDIF + ! Update of cell-averaged albedo, emissivity and radiative + ! temperature is done later +ENDIF +! +!------------------------------------------------------------------------------- +! OCEANIC COUPLING, IMPOSED SST OR INTERPOLATED SST AT TIME t+1 +!------------------------------------------------------------------------------- +! +IF (SM%O%LMERCATOR) THEN + ! + ! Update SST reference profile for relaxation purpose + IF (SM%DTS%LSST_DATA) THEN + CALL SST_UPDATE(SM%DTS, SM%S, & + SM%OR%XSEAT_REL(:,NOCKMIN+1), SM%S%TTIME) + ! + ! Convert to degree C for ocean model + SM%OR%XSEAT_REL(:,NOCKMIN+1) = SM%OR%XSEAT_REL(:,NOCKMIN+1) - XTT + ENDIF + ! + CALL MOD1D_n(SM%DGO, SM%O, SM%OR, SM%SG, SM%S, & + HPROGRAM,PTIME,ZEMIS(:),ZDIR_ALB(:,1:KSW),ZSCA_ALB(:,1:KSW),& + PLW(:),PSCA_SW(:,1:KSW),PDIR_SW(:,1:KSW),PSFTH(:), & + PSFTQ(:),PSFU(:),PSFV(:),PRAIN(:),SM%S%XSST(:)) + ! +ELSEIF(SM%DTS%LSST_DATA)THEN + ! + ! Imposed SST + ! + CALL SST_UPDATE(SM%DTS, SM%S, & + SM%S%XSST, SM%S%TTIME) + ! +ELSEIF (SM%S%LINTERPOL_SST.AND.MOD(SM%S%TTIME%TIME,XDAY) == 0.) THEN + ! + ! Imposed monthly SST + ! + CALL INTERPOL_SST_MTH(SM%S, & + SM%S%TTIME%TDATE%YEAR,SM%S%TTIME%TDATE%MONTH,SM%S%TTIME%TDATE%DAY,'T',SM%S%XSST) + ! +ENDIF +! +!------------------------------------------------------------------------------- +!Physical properties see by the atmosphere in order to close the energy budget +!between surfex and the atmosphere. All variables should be at t+1 but very +!difficult to do. Maybe it will be done later. However, Ts is at time t+1 +!------------------------------------------------------------------------------- +! +IF (SM%S%LHANDLE_SIC) THEN + IF (SM%S%CSEAICE_SCHEME/='GELATO') THEN + SM%S%XTICE=SM%S%XSST + SM%S%XSIC=SM%S%XFSIC + SM%S%XICE_ALB=XALBSEAICE + ENDIF + PTSURF (:) = SM%S%XSST (:) * ( 1 - SM%S%XSIC (:)) + SM%S%XTICE(:) * SM%S%XSIC(:) + PQSURF (:) = ZQSAT (:) * ( 1 - SM%S%XSIC (:)) + ZQSAT_ICE(:) * SM%S%XSIC(:) + ZZ0W (:) = ( 1 - SM%S%XSIC(:) ) * 1.0/(LOG(PUREF(:)/ZZ0(:)) **2) + & + SM%S%XSIC(:) * 1.0/(LOG(PUREF(:)/ZZ0_ICE(:))**2) + PZ0 (:) = PUREF (:) * EXP ( - SQRT ( 1./ ZZ0W(:) )) + ZZ0W (:) = ( 1 - SM%S%XSIC(:) ) * 1.0/(LOG(PZREF(:)/ZZ0H(:)) **2) + & + SM%S%XSIC(:) * 1.0/(LOG(PZREF(:)/ZZ0H_ICE(:))**2) + PZ0H (:) = PZREF (:) * EXP ( - SQRT ( 1./ ZZ0W(:) )) +ELSE + PTSURF (:) = SM%S%XSST (:) + PQSURF (:) = ZQSAT (:) + PZ0 (:) = SM%S%XZ0 (:) + PZ0H (:) = ZZ0H (:) +ENDIF +! +!------------------------------------------------------------------------------- +!Radiative properties at time t+1 (see by the atmosphere) in order to close +!the energy budget between surfex and the atmosphere +!------------------------------------------------------------------------------- +! + CALL UPDATE_RAD_SEA(SM%S%CSEA_ALB,SM%S%XSST,PZENITH2,XTTS,SM%S%XEMIS, & + SM%S%XDIR_ALB,SM%S%XSCA_ALB,PDIR_ALB,PSCA_ALB,& + PEMIS,PTRAD,SM%S%LHANDLE_SIC,SM%S%XTICE,SM%S%XSIC, & + SM%S%XICE_ALB,PU,PV) +! +!======================================================================================= +! +IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_N',1,ZHOOK_HANDLE) +! +!======================================================================================= +! + CONTAINS +! +SUBROUTINE SEA_MOMENTUM_FLUXES(PCD, PSFU, PSFV) +! +IMPLICIT NONE +! +REAL, DIMENSION(KI), INTENT(IN) :: PCD ! Drag coefficient (on open sea or seaice) +REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa) +REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa) +! +REAL, DIMENSION(KI) :: ZUSTAR2 ! square of friction velocity (m2/s2) +REAL, DIMENSION(KI) :: ZWORK ! Work array +! +REAL, DIMENSION(KI) :: ZPEW_A_COEF +REAL, DIMENSION(KI) :: ZPEW_B_COEF +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_N: SEA_MOMENTUM_FLUXES',0,ZHOOK_HANDLE) +! +IF( (LCPL_SEA .OR. LCPL_WAVE) .AND. HCOUPLING .EQ. 'E')THEN + ZPEW_A_COEF(:)=0.0 + ZPEW_B_COEF(:)=ZWIND(:) +ELSE + ZPEW_A_COEF(:)=PPEW_A_COEF(:) + ZPEW_B_COEF(:)=PPEW_B_COEF(:) +ENDIF +! +ZWORK (:) = XUNDEF +ZUSTAR2(:) = XUNDEF +! +IF(CIMPLICIT_WIND=='OLD')THEN +! old implicitation (m2/s2) + ZUSTAR2(:) = (PCD(:)*ZWIND(:)*ZPEW_B_COEF(:)) / & + (1.0-PRHOA(:)*PCD(:)*ZWIND(:)*ZPEW_A_COEF(:)) +ELSE +! new implicitation (m2/s2) + ZUSTAR2(:) = (PCD(:)*ZWIND(:)*(2.*ZPEW_B_COEF(:)-ZWIND(:))) /& + (1.0-2.0*PRHOA(:)*PCD(:)*ZWIND(:)*ZPEW_A_COEF(:)) +! + ZWORK(:) = PRHOA(:)*ZPEW_A_COEF(:)*ZUSTAR2(:) + ZPEW_B_COEF(:) + ZWORK(:) = MAX(ZWORK(:),0.) +! + WHERE(ZPEW_A_COEF(:)/= 0.) + ZUSTAR2(:) = MAX( ( ZWORK(:) - ZPEW_B_COEF(:) ) / (PRHOA(:)*ZPEW_A_COEF(:)), 0.) + ENDWHERE +! +ENDIF +! +PSFU = 0. +PSFV = 0. +WHERE (ZWIND(:)>0.) + PSFU(:) = - PRHOA(:) * ZUSTAR2(:) * ZU(:) / ZWIND(:) + PSFV(:) = - PRHOA(:) * ZUSTAR2(:) * ZV(:) / ZWIND(:) +END WHERE +! +IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_N: SEA_MOMENTUM_FLUXES',1,ZHOOK_HANDLE) +! +END SUBROUTINE SEA_MOMENTUM_FLUXES +! +!======================================================================================= +! +SUBROUTINE COMPLEMENT_EACH_OTHER_FLUX +! +! Provide dummy fluxes on places with no open-sea or no sea-ice +! Allows a smooth computing of CLS parameters in all cases while avoiding +! having to pack arrays (in routines PARAM_CLS and CLS_TQ) +! +IMPLICIT NONE +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_N: COMPLEMENT_EACH_OTHER_FLUX',0,ZHOOK_HANDLE) +! + WHERE (SM%S%XSIC(:) == 1.) + ZSFTH=ZSFTH_ICE + ZSFTQ=ZSFTQ_ICE + ZSFU=ZSFU_ICE + ZSFV=ZSFV_ICE + ZQSAT=ZQSAT_ICE + ZCD=ZCD_ICE + ZCDN=ZCDN_ICE + ZCH=ZCH_ICE + ZCE=ZCE_ICE + ZRI=ZRI_ICE + ZZ0H=ZZ0H_ICE + END WHERE + WHERE (SM%S%XSIC(:) == 0.) + ZSFTH_ICE=ZSFTH + ZSFTQ_ICE=ZSFTQ + ZSFU_ICE=ZSFU + ZSFV_ICE=ZSFV + ZQSAT_ICE=ZQSAT + ZCD_ICE=ZCD + ZCDN_ICE=ZCDN + ZCH_ICE=ZCH + ZCE_ICE=ZCE + ZRI_ICE=ZRI + ZZ0H_ICE=ZZ0H + END WHERE +! +IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_N: COMPLEMENT_EACH_OTHER_FLUX',1,ZHOOK_HANDLE) +! +END SUBROUTINE COMPLEMENT_EACH_OTHER_FLUX +! +!======================================================================================= +! +END SUBROUTINE COUPLING_SEAFLUX_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/dealloc_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/dealloc_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..609ecc7a89fb7d3787f68e5397f3abc8bc0c1c8d --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/dealloc_seafluxn.F90 @@ -0,0 +1,115 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ################################################################################# +SUBROUTINE DEALLOC_SEAFLUX_n (CHS, SG, S) +! ################################################################################# +! +!!**** *DEALLOC_SEAFLUX_n * - Deallocate all arrays +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! S. Belamari 03/2014 other _SEA_ variables +!! S. Senesi 09/2013 introduce sea-ice-cover ans sea-surface salinity +!! Modified 11/2014 : J. Pianezze : deallocation of wave parameters +!!------------------------------------------------------------------------- +! +! +! +! +USE MODD_CH_SEAFLUX_n, ONLY : CH_SEAFLUX_t +USE MODD_SEAFLUX_GRID_n, ONLY : SEAFLUX_GRID_t +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! +USE MODI_GLTOOLS_DEALLOC +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +!* 0.2 declarations of local variables +! +! +TYPE(CH_SEAFLUX_t), INTENT(INOUT) :: CHS +TYPE(SEAFLUX_GRID_t), INTENT(INOUT) :: SG +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('DEALLOC_SEAFLUX_N',0,ZHOOK_HANDLE) +! +IF (ASSOCIATED(S%LCOVER )) DEALLOCATE(S%LCOVER ) +IF (ASSOCIATED(S%XCOVER )) DEALLOCATE(S%XCOVER ) +IF (ASSOCIATED(S%XZS )) DEALLOCATE(S%XZS ) +IF (ASSOCIATED(S%XSST )) DEALLOCATE(S%XSST ) +IF (ASSOCIATED(S%XSSS )) DEALLOCATE(S%XSSS ) +IF (ASSOCIATED(S%XSIC )) DEALLOCATE(S%XSIC ) +IF (ASSOCIATED(S%XFSIC )) DEALLOCATE(S%XFSIC ) +IF (ASSOCIATED(S%XFSIT )) DEALLOCATE(S%XFSIT ) +IF (ASSOCIATED(S%XTP )) DEALLOCATE(S%XTP ) +IF (ASSOCIATED(S%XHS )) DEALLOCATE(S%XHS ) +IF (ASSOCIATED(S%XZ0 )) DEALLOCATE(S%XZ0 ) +IF (ASSOCIATED(S%XZ0H )) DEALLOCATE(S%XZ0H ) +IF (ASSOCIATED(S%XSEABATHY)) DEALLOCATE(S%XSEABATHY) +IF (ASSOCIATED(S%XEMIS )) DEALLOCATE(S%XEMIS ) +IF (ASSOCIATED(S%XDIR_ALB)) DEALLOCATE(S%XDIR_ALB) +IF (ASSOCIATED(S%XSCA_ALB)) DEALLOCATE(S%XSCA_ALB) +! +!------------------------------------------------------------------------------------- +! +IF (ASSOCIATED(SG%XGRID_PAR )) DEALLOCATE(SG%XGRID_PAR ) +IF (ASSOCIATED(SG%XLAT )) DEALLOCATE(SG%XLAT ) +IF (ASSOCIATED(SG%XLON )) DEALLOCATE(SG%XLON ) +IF (ASSOCIATED(SG%XMESH_SIZE)) DEALLOCATE(SG%XMESH_SIZE) +! +!------------------------------------------------------------------------------------- +! +IF(ASSOCIATED(CHS%XDEP)) DEALLOCATE(CHS%XDEP) +IF(ASSOCIATED(CHS%CCH_NAMES)) DEALLOCATE(CHS%CCH_NAMES) +IF(ASSOCIATED(CHS%SVS%CSV)) DEALLOCATE(CHS%SVS%CSV) +! +!------------------------------------------------------------------------------------- +! +IF(ASSOCIATED(S%XCPL_SEA_WIND)) DEALLOCATE(S%XCPL_SEA_WIND) +IF(ASSOCIATED(S%XCPL_SEA_FWSU)) DEALLOCATE(S%XCPL_SEA_FWSU) +IF(ASSOCIATED(S%XCPL_SEA_FWSV)) DEALLOCATE(S%XCPL_SEA_FWSV) +IF(ASSOCIATED(S%XCPL_SEA_SNET)) DEALLOCATE(S%XCPL_SEA_SNET) +IF(ASSOCIATED(S%XCPL_SEA_HEAT)) DEALLOCATE(S%XCPL_SEA_HEAT) +IF(ASSOCIATED(S%XCPL_SEA_EVAP)) DEALLOCATE(S%XCPL_SEA_EVAP) +IF(ASSOCIATED(S%XCPL_SEA_RAIN)) DEALLOCATE(S%XCPL_SEA_RAIN) +IF(ASSOCIATED(S%XCPL_SEA_SNOW)) DEALLOCATE(S%XCPL_SEA_SNOW) +IF(ASSOCIATED(S%XCPL_SEA_EVPR)) DEALLOCATE(S%XCPL_SEA_EVPR) +! +!------------------------------------------------------------------------------------- +! +IF (ASSOCIATED(S%TGLT%bat) .AND. S%CSEAICE_SCHEME=='GELATO' ) CALL GLTOOLS_DEALLOC(S%TGLT) +! +IF (LHOOK) CALL DR_HOOK('DEALLOC_SEAFLUX_N',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------------- +! +END SUBROUTINE DEALLOC_SEAFLUX_n + + diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/default_prep_seaflux.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/default_prep_seaflux.F90 new file mode 100644 index 0000000000000000000000000000000000000000..8d898603107898a66832c87b6daf164fb628d3e2 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/default_prep_seaflux.F90 @@ -0,0 +1,106 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE DEFAULT_PREP_SEAFLUX +! ########################### +! +!!**** *DEFAULT_PREP_SEAFLUX* - routine to set default values for the configuration for SEAFLUX field preparation +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S. Malardel *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/2003 +!! 01/2008 C. Lebeaupin Brossier ! initialization of oceanic var. +!! ! from MERCATOR analyses types +!! 07/2012 P. Le Moigne ! CMO1D phasing +!! 01/2014 S. Senesi ! introduce fractional seaice and sea-ice model +!! 03/2014 S. Belamari ! initialize sea surface salinity +!! 03/2014 M.N. Bouin ! possibility of wave parameters +!! ! from external source +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PREP_SEAFLUX, ONLY : CFILE_SEAFLX, CTYPE_SEAFLX, CFILEPGD_SEAFLX, CTYPEPGD, XSST_UNIF,& + XSSS_UNIF, XSIC_UNIF, CFILEWAVE_SEAFLX, CTYPEWAVE +! +USE MODN_PREP_SEAFLUX, ONLY : LSEA_SBL, CSEAICE_SCHEME, LOCEAN_MERCATOR, LOCEAN_CURRENT, & + XTIME_REL, LCUR_REL, LTS_REL, & + LZERO_FLUX, LCORR_FLUX, XCORFLX, LDIAPYC + +USE MODD_SURF_PAR, ONLY : XUNDEF +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +!------------------------------------------------------------------------------- +! + +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +IF (LHOOK) CALL DR_HOOK('DEFAULT_PREP_SEAFLUX',0,ZHOOK_HANDLE) +CFILE_SEAFLX = ' ' +CTYPE_SEAFLX = 'GRIB ' +! +CFILEWAVE_SEAFLX = ' ' +CTYPEWAVE = ' ' +! +CFILEPGD_SEAFLX = ' ' +CTYPEPGD = ' ' +! +XSST_UNIF = XUNDEF +XSSS_UNIF = XUNDEF +XSIC_UNIF = XUNDEF +! +LSEA_SBL = .FALSE. +CSEAICE_SCHEME='NONE ' +LOCEAN_MERCATOR = .FALSE. +LOCEAN_CURRENT = .FALSE. +! +XTIME_REL = 25920000. +XCORFLX = 0. +LCUR_REL = .FALSE. +LTS_REL = .FALSE. +LZERO_FLUX = .FALSE. +LCORR_FLUX = .FALSE. +LDIAPYC = .FALSE. +! +IF (LHOOK) CALL DR_HOOK('DEFAULT_PREP_SEAFLUX',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE DEFAULT_PREP_SEAFLUX diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/default_seaflux.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/default_seaflux.F90 new file mode 100644 index 0000000000000000000000000000000000000000..b951b0d33bbccb161fc975516f6d103c1be56780 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/default_seaflux.F90 @@ -0,0 +1,112 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE DEFAULT_SEAFLUX(PTSTEP,POUT_TSTEP,HSEA_ALB,HSEA_FLUX, & + OPWG, OPRECIP, OPWEBB, KZ0, KGRVWAVES,& + OPROGSST, KTIME_COUPLING,POCEAN_TSTEP,& + PICHCE, HINTERPOL_SST, HINTERPOL_SSS, & + OWAVEWIND ) +! ######################################################################## +! +!!**** *DEFAULT_SEAFLUX* - routine to set default values for the configuration for SEAFLUX scheme +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! Modified 01/2006 : sea flux parameterization. +!! S. Belamari 03/2014 : add KZ0 (to choose PZ0SEA formulation) +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +REAL, INTENT(OUT) :: PTSTEP ! time step for run +REAL, INTENT(OUT) :: POUT_TSTEP ! time step for writing +CHARACTER(LEN=6), INTENT(OUT) :: HSEA_FLUX ! type of sea scheme +CHARACTER(LEN=4), INTENT(OUT) :: HSEA_ALB ! type of sea albedo +LOGICAL, INTENT(OUT) :: OPWG ! gustiness impact +LOGICAL, INTENT(OUT) :: OPRECIP ! precipitation correction +LOGICAL, INTENT(OUT) :: OPWEBB ! Webb correction +INTEGER, INTENT(OUT) :: KZ0 ! PZ0SEA formulation +INTEGER, INTENT(OUT) :: KGRVWAVES ! Wave gravity in roughness length +LOGICAL, INTENT(OUT) :: OPROGSST !two-way +INTEGER, INTENT(OUT) :: KTIME_COUPLING!coupling frequency +REAL, INTENT(OUT) :: PICHCE !CE coef calculation for ECUME +REAL, INTENT(OUT) :: POCEAN_TSTEP !ocean 1D model time-step +CHARACTER(LEN=6), INTENT(OUT) :: HINTERPOL_SST ! Quadratic interpolation of monthly SST +CHARACTER(LEN=6), INTENT(OUT) :: HINTERPOL_SSS ! Quadratic interpolation of monthly SSS +LOGICAL, INTENT(OUT) :: OWAVEWIND ! wave parameters from wind only +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('DEFAULT_SEAFLUX',0,ZHOOK_HANDLE) +! +PTSTEP = XUNDEF +POUT_TSTEP = XUNDEF +! +HSEA_FLUX = "ECUME " +HSEA_ALB = "TA96" +! +OPWG = .FALSE. +OPRECIP = .FALSE. +OPWEBB = .FALSE. +OWAVEWIND = .TRUE. +! +KZ0 = 0 +KGRVWAVES = 0 +! +OPROGSST = .FALSE. +KTIME_COUPLING = 300 +POCEAN_TSTEP = 300. +! +PICHCE = 0.0 +! +HINTERPOL_SST = "NONE" +HINTERPOL_SSS = "NONE" +! +IF (LHOOK) CALL DR_HOOK('DEFAULT_SEAFLUX',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE DEFAULT_SEAFLUX diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/diag_cpl_esm_sea.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/diag_cpl_esm_sea.F90 new file mode 100644 index 0000000000000000000000000000000000000000..1a86c2f31c401a4b7974884acb645ce4f0bfaafd --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/diag_cpl_esm_sea.F90 @@ -0,0 +1,176 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE DIAG_CPL_ESM_SEA (S, & + PTSTEP,PZON10M,PMER10M,PSFU,PSFV, & + PSWD,PSWU,PGFLUX,PSFTQ,PRAIN,PSNOW, & + PLW,PPS,PTICE,PSFTH_ICE,PSFTQ_ICE, & + PDIR_SW,PSCA_SW,PSWU_ICE,PLWU_ICE, & + OSIC ) +! ################################################################### +! +!!**** *DIAG_CPL_ESM_SEA * - Computes diagnostics over sea for +!! Earth system model coupling or embedded seaice scheme +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! B. Decharme +!! +!! MODIFICATIONS +!! ------------- +!! Original 08/2009 +!! S.Senesi 01/2014 Adapt to embedded seaice scheme (SWU and LWU +!! for seaice are provided as inputs) +!! A.Voldoire 04/2015 Add LCPL_SEAICE test +!! Modified 11/2014 : J. Pianezze : Add surface pressure coupling parameter +!!------------------------------------------------------------------ +! +! +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! +USE MODD_CSTS, ONLY : XSTEFAN, XLSTT +USE MODD_WATER_PAR, ONLY : XEMISWATICE +! +USE MODD_SFX_OASIS, ONLY : LCPL_SEAICE +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +! +REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step +REAL, DIMENSION(:), INTENT(IN) :: PZON10M ! zonal wind +REAL, DIMENSION(:), INTENT(IN) :: PMER10M ! meridian wind +REAL, DIMENSION(:), INTENT(IN) :: PSFU ! zonal wind stress +REAL, DIMENSION(:), INTENT(IN) :: PSFV ! meridian wind stress +REAL, DIMENSION(:), INTENT(IN) :: PSWD ! total incoming short wave radiation +REAL, DIMENSION(:), INTENT(IN) :: PSWU ! total upward short wave radiation +REAL, DIMENSION(:), INTENT(IN) :: PGFLUX ! storage flux +REAL, DIMENSION(:), INTENT(IN) :: PSFTQ ! water flux +REAL, DIMENSION(:), INTENT(IN) :: PRAIN ! Rainfall +REAL, DIMENSION(:), INTENT(IN) :: PSNOW ! Snowfall +REAL, DIMENSION(:), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.) +REAL, DIMENSION(:), INTENT(IN) :: PPS ! Surface pressure +REAL, DIMENSION(:), INTENT(IN) :: PSFTH_ICE ! heat flux (W/m2) +REAL, DIMENSION(:), INTENT(IN) :: PSFTQ_ICE ! water flux (kg/m2/s) +REAL, DIMENSION(:), INTENT(IN) :: PTICE ! Ice Surface Temperature +REAL, DIMENSION(:,:),INTENT(IN):: PDIR_SW ! direct solar radiation (on horizontal surf.) +REAL, DIMENSION(:,:),INTENT(IN):: PSCA_SW ! diffuse solar radiation (on horizontal surf.) +REAL, DIMENSION(:), INTENT(IN) :: PSWU_ICE ! upward short wave radiation on seaice +REAL, DIMENSION(:), INTENT(IN) :: PLWU_ICE ! upward long wave radiation on seaice +LOGICAL, INTENT(IN) :: OSIC +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(S%XICE_ALB)) :: ZSWU, ZTICE4 +! +INTEGER :: ISWB ! number of SW bands +INTEGER :: JSWB ! loop counter on number of SW bands +INTEGER :: INI ! number of points +INTEGER :: JI ! loop counter on number of points +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('DIAG_CPL_ESM_SEA',0,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------------- +! Total or free-ice sea flux +!------------------------------------------------------------------------------------- +! +!* 10m wind speed (m) +! +S%XCPL_SEA_WIND(:) = S%XCPL_SEA_WIND(:) + PTSTEP * SQRT(PZON10M(:)**2+PMER10M(:)**2) +! +!* wind stress (Pa.s) +! +S%XCPL_SEA_FWSU(:) = S%XCPL_SEA_FWSU(:) + PTSTEP * PSFU(:) +S%XCPL_SEA_FWSV(:) = S%XCPL_SEA_FWSV(:) + PTSTEP * PSFV(:) +S%XCPL_SEA_FWSM(:) = S%XCPL_SEA_FWSM(:) + PTSTEP * SQRT(PSFU(:)**2+PSFV(:)**2) +! +!* Solar net heat flux (J/m2) +! +S%XCPL_SEA_SNET(:) = S%XCPL_SEA_SNET(:) + PTSTEP * (PSWD(:) - PSWU(:)) +! +!* Non solar heat flux (J/m2) +! +S%XCPL_SEA_HEAT(:) = S%XCPL_SEA_HEAT(:) + PTSTEP * (PGFLUX(:) + PSWU(:) - PSWD(:)) +! +!* Evaporation (kg/m2) +! +S%XCPL_SEA_EVAP(:) = S%XCPL_SEA_EVAP(:) + PTSTEP * PSFTQ(:) +! +!* Precip (kg/m2) +! +S%XCPL_SEA_RAIN(:) = S%XCPL_SEA_RAIN(:) + PTSTEP * PRAIN(:) +S%XCPL_SEA_SNOW(:) = S%XCPL_SEA_SNOW(:) + PTSTEP * PSNOW(:) +! +!* Evaporation - Precip (kg/m2) +! +S%XCPL_SEA_EVPR(:) = S%XCPL_SEA_EVPR(:) + S%XCPL_SEA_EVAP(:) - S%XCPL_SEA_RAIN(:) - S%XCPL_SEA_SNOW(:) +! +!* Cumulated surface pressure (Pa.s) +! +S%XCPL_SEA_PRES(:) = S%XCPL_SEA_PRES(:) + PTSTEP * PPS(:) +! +!------------------------------------------------------------------------------------- +! Ice flux +!------------------------------------------------------------------------------------- +IF (LCPL_SEAICE.OR.OSIC) THEN +! + INI = SIZE(PDIR_SW,1) + ISWB = SIZE(PDIR_SW,2) +! +!* Solar net heat flux (J/m2) +! + IF (OSIC) THEN + ZSWU(:)=PSWU_ICE(:) + ELSE + ZSWU(:)=0.0 + DO JSWB=1,ISWB + DO JI=1,INI + ZSWU(JI) = ZSWU(JI) + (PDIR_SW(JI,JSWB)+PSCA_SW(JI,JSWB)) * S%XICE_ALB(JI) + ENDDO + ENDDO + ENDIF +! + S%XCPL_SEAICE_SNET(:) = S%XCPL_SEAICE_SNET(:) + PTSTEP * (PSWD(:) - ZSWU(:)) +! +!* Non solar heat flux (J/m2) +! + IF (OSIC) THEN + S%XCPL_SEAICE_HEAT(:) = S%XCPL_SEAICE_HEAT(:) + PTSTEP * & + ( PLW(:) - PLWU_ICE(:) - PSFTH_ICE(:) - XLSTT*PSFTQ_ICE(:) ) + ELSE + ZTICE4(:)=PTICE(:)**4 + S%XCPL_SEAICE_HEAT(:) = S%XCPL_SEAICE_HEAT(:) + PTSTEP * ( XEMISWATICE*(PLW(:)-XSTEFAN*ZTICE4(:)) & + - PSFTH_ICE(:) - XLSTT*PSFTQ_ICE(:) ) + ENDIF +! +!* Sublimation (kg/m2) +! + S%XCPL_SEAICE_EVAP(:) = S%XCPL_SEAICE_EVAP(:) + PTSTEP * PSFTQ_ICE(:) +! +ENDIF +! +IF (LHOOK) CALL DR_HOOK('DIAG_CPL_ESM_SEA',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------------- +! +END SUBROUTINE DIAG_CPL_ESM_SEA diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/diag_inline_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/diag_inline_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..fb5cc3c34b54a0fd62e3bb0bb47bb9cd47d3b190 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/diag_inline_seafluxn.F90 @@ -0,0 +1,337 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### +SUBROUTINE DIAG_INLINE_SEAFLUX_n (DGS, DGSI, S, & + PTSTEP, PTA, PQA, & + PPA, PPS, PRHOA, PZONA, & + PMERA, PHT, PHW, PCD, PCDN, PCH, PCE, PRI, PHU, & + PZ0H, PQSAT, PSFTH, PSFTQ, PSFZON, PSFMER, & + PDIR_SW, PSCA_SW, PLW, PDIR_ALB, PSCA_ALB, & + PEMIS, PTRAD, PRAIN, PSNOW, & + PCD_ICE, PCDN_ICE, PCH_ICE, PCE_ICE, PRI_ICE, & + PZ0_ICE, PZ0H_ICE, PQSAT_ICE, PSFTH_ICE, PSFTQ_ICE, & + PSFZON_ICE, PSFMER_ICE ) + +! ##################################################################################### +! +!!**** *DIAG_INLINE_SEAFLUX_n * - computes diagnostics during SEAFLUX time-step +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! Modified 01/2006 : sea flux parameterization. +!! B. Decharme 08/2009 : Diag for Earth System Model Coupling +!! S. Riette 06/2009 CLS_2M becomes CLS_TQ, CLS_TQ and CLS_WIND have one +!! more argument (height of diagnostic) +!! B. Decharme 04/2013 : Add EVAP and SUBL diag +!! S. Senesi 01/2014 ! introduce fractional seaice and sea-ice model +!! J. Pianezze 08/2016 : Add surface pressure coupling parameter +!!------------------------------------------------------------------ +! + +! +! +! +USE MODD_DIAG_SEAFLUX_n, ONLY : DIAG_SEAFLUX_t +USE MODD_DIAG_SEAICE_n, ONLY : DIAG_SEAICE_t +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! +USE MODD_CSTS, ONLY : XTTS +USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_SFX_OASIS, ONLY : LCPL_SEA +! +USE MODD_TYPES_GLT, ONLY : T_GLT +USE MODD_GLT_PARAM , ONLY : GELATO_DIM=>NX +USE MODE_GLT_STATS , ONLY : GLT_AVHICEM, GLT_AVHSNWM +USE MODI_PARAM_CLS +USE MODI_CLS_TQ +USE MODI_CLS_WIND +USE MODI_DIAG_SURF_BUDGET_SEA +USE MODI_DIAG_SURF_BUDGETC_SEA +USE MODI_DIAG_CPL_ESM_SEA +! +USE MODI_SEAFLUX_ALBEDO +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +TYPE(DIAG_SEAFLUX_t), INTENT(INOUT) :: DGS +TYPE(DIAG_SEAICE_t), INTENT(INOUT) :: DGSI +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +! +REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s) +REAL, DIMENSION(:), INTENT(IN) :: PTA ! atmospheric temperature +REAL, DIMENSION(:), INTENT(IN) :: PQA ! atmospheric specific humidity +REAL, DIMENSION(:), INTENT(IN) :: PPA ! atmospheric level pressure +REAL, DIMENSION(:), INTENT(IN) :: PPS ! surface pressure +REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density +REAL, DIMENSION(:), INTENT(IN) :: PZONA ! zonal wind +REAL, DIMENSION(:), INTENT(IN) :: PMERA ! meridian wind +REAL, DIMENSION(:), INTENT(IN) :: PHT ! atmospheric level height +REAL, DIMENSION(:), INTENT(IN) :: PHW ! atmospheric level height for wind +REAL, DIMENSION(:), INTENT(IN) :: PCD ! drag coefficient for momentum +REAL, DIMENSION(:), INTENT(IN) :: PCDN ! neutral drag coefficient +REAL, DIMENSION(:), INTENT(IN) :: PCH ! drag coefficient for heat +REAL, DIMENSION(:), INTENT(IN) :: PCE ! drag coefficient for vapor +REAL, DIMENSION(:), INTENT(IN) :: PRI ! Richardson number +REAL, DIMENSION(:), INTENT(IN) :: PHU ! near-surface humidity +REAL, DIMENSION(:), INTENT(IN) :: PZ0H ! roughness length for heat +REAL, DIMENSION(:), INTENT(IN) :: PQSAT ! humidity at saturation +REAL, DIMENSION(:), INTENT(IN) :: PSFZON ! zonal friction +REAL, DIMENSION(:), INTENT(IN) :: PSFMER ! meridian friction +REAL, DIMENSION(:), INTENT(IN) :: PSFTH ! heat flux (W/m2) +REAL, DIMENSION(:), INTENT(IN) :: PSFTQ ! water flux (kg/m2/s) +REAL, DIMENSION(:,:),INTENT(IN):: PDIR_SW ! direct solar radiation (on horizontal surf.) +! ! (W/m2) +REAL, DIMENSION(:,:),INTENT(IN):: PSCA_SW ! diffuse solar radiation (on horizontal surf.) +! ! (W/m2) +REAL, DIMENSION(:), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.) +REAL, DIMENSION(:), INTENT(IN) :: PTRAD ! radiative temperature (K) +REAL, DIMENSION(:,:),INTENT(IN):: PDIR_ALB ! direct albedo for each spectral band (-) +REAL, DIMENSION(:,:),INTENT(IN):: PSCA_ALB ! diffuse albedo for each spectral band (-) +REAL, DIMENSION(:), INTENT(IN) :: PEMIS ! emissivity (-) +! +REAL, DIMENSION(:), INTENT(IN) :: PRAIN ! Rainfall (kg/m2/s) +REAL, DIMENSION(:), INTENT(IN) :: PSNOW ! Snowfall (kg/m2/s) +! +REAL, DIMENSION(:), INTENT(IN) :: PCD_ICE ! drag coefficient for momentum +REAL, DIMENSION(:), INTENT(IN) :: PCDN_ICE ! neutral drag coefficient +REAL, DIMENSION(:), INTENT(IN) :: PCH_ICE ! drag coefficient for heat +REAL, DIMENSION(:), INTENT(IN) :: PCE_ICE ! drag coefficient for vapor +REAL, DIMENSION(:), INTENT(IN) :: PRI_ICE ! Richardson number +REAL, DIMENSION(:), INTENT(IN) :: PZ0_ICE ! roughness length for momentum +REAL, DIMENSION(:), INTENT(IN) :: PZ0H_ICE ! roughness length for heat +REAL, DIMENSION(:), INTENT(IN) :: PQSAT_ICE ! humidity at saturation +REAL, DIMENSION(:), INTENT(IN) :: PSFTH_ICE ! heat flux (W/m2) +REAL, DIMENSION(:), INTENT(IN) :: PSFTQ_ICE ! water flux (kg/m2/s) +REAL, DIMENSION(:), INTENT(IN) :: PSFZON_ICE ! zonal friction +REAL, DIMENSION(:), INTENT(IN) :: PSFMER_ICE ! meridian friction +! +!* 0.2 declarations of local variables +! +LOGICAL :: GSIC +REAL, DIMENSION(SIZE(PTA)) :: ZZ0W +REAL, DIMENSION(SIZE(PTA)) :: ZH +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!------------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('DIAG_INLINE_SEAFLUX_N',0,ZHOOK_HANDLE) +! +! * Mean surface temperature need to couple with AGCM +! +IF (S%LHANDLE_SIC) THEN + DGS%XTS (:) = (1 - S%XSIC(:)) * S%XSST(:) + S%XSIC(:) * S%XTICE(:) + DGS%XTSRAD(:) = PTRAD(:) +ELSE + DGS%XTS (:) = S%XSST (:) + DGS%XTSRAD(:) = PTRAD(:) +ENDIF +! +IF (.NOT. S%LSBL) THEN +! + IF (DGS%N2M==1) THEN + CALL PARAM_CLS(PTA, S%XSST, PQA, PPA, PRHOA, PZONA, PMERA, PHT, PHW, & + PSFTH, PSFTQ, PSFZON, PSFMER, & + DGS%XT2M, DGS%XQ2M, DGS%XHU2M, DGS%XZON10M, DGS%XMER10M ) + IF (S%LHANDLE_SIC) THEN + CALL PARAM_CLS(PTA, S%XTICE, PQA, PPA, PRHOA, PZONA, PMERA, PHT, PHW, & + PSFTH_ICE, PSFTQ_ICE, PSFZON_ICE, PSFMER_ICE, & + DGS%XT2M_ICE, DGS%XQ2M_ICE, DGS%XHU2M_ICE, DGS%XZON10M_ICE, DGS%XMER10M_ICE ) + ENDIF + ELSE IF (DGS%N2M==2) THEN + ZH(:)=2. + CALL CLS_TQ(PTA, PQA, PPA, PPS, PHT, & + PCD, PCH, PRI, & + S%XSST, PHU, PZ0H, ZH, & + DGS%XT2M, DGS%XQ2M, DGS%XHU2M) + ZH(:)=10. + CALL CLS_WIND(PZONA, PMERA, PHW, & + PCD, PCDN, PRI, ZH, & + DGS%XZON10M, DGS%XMER10M) + IF (S%LHANDLE_SIC) THEN + ZH(:)=2. + CALL CLS_TQ(PTA, PQA, PPA, PPS, PHT, & + PCD_ICE, PCH_ICE, PRI_ICE, & + S%XTICE, PHU, PZ0H_ICE, ZH, & + DGS%XT2M_ICE, DGS%XQ2M_ICE, DGS%XHU2M_ICE) + ZH(:)=10. + CALL CLS_WIND(PZONA, PMERA, PHW, & + PCD_ICE, PCDN_ICE, PRI_ICE, ZH, & + DGS%XZON10M_ICE, DGS%XMER10M_ICE ) + ENDIF + END IF +! + IF (DGS%N2M>=1) THEN + IF (S%LHANDLE_SIC) THEN + ! + DGS%XT2M = DGS%XT2M * (1 - S%XSIC) + DGS%XT2M_ICE * S%XSIC + DGS%XQ2M = DGS%XQ2M * (1 - S%XSIC) + DGS%XQ2M_ICE * S%XSIC + DGS%XHU2M = DGS%XHU2M * (1 - S%XSIC) + DGS%XHU2M_ICE * S%XSIC + ! + DGS%XZON10M(:) = DGS%XZON10M(:) * (1 - S%XSIC(:)) + DGS%XZON10M_ICE(:) * S%XSIC(:) + DGS%XMER10M(:) = DGS%XMER10M(:) * (1 - S%XSIC(:)) + DGS%XMER10M_ICE(:) * S%XSIC(:) + DGS%XWIND10M_ICE(:) = SQRT(DGS%XZON10M_ICE(:)**2+DGS%XMER10M_ICE(:)**2) + ! + DGS%XRI = PRI * (1 - S%XSIC) + PRI_ICE * S%XSIC + DGS%XRI_ICE=PRI_ICE + ELSE + DGS%XRI =PRI + ENDIF + ! + DGS%XT2M_MIN(:) = MIN(DGS%XT2M_MIN(:),DGS%XT2M(:)) + DGS%XT2M_MAX(:) = MAX(DGS%XT2M_MAX(:),DGS%XT2M(:)) + ! + DGS%XHU2M_MIN(:) = MIN(DGS%XHU2M_MIN(:),DGS%XHU2M(:)) + DGS%XHU2M_MAX(:) = MAX(DGS%XHU2M_MAX(:),DGS%XHU2M(:)) + ! + DGS%XWIND10M(:) = SQRT(DGS%XZON10M(:)**2+DGS%XMER10M(:)**2) + DGS%XWIND10M_MAX(:) = MAX(DGS%XWIND10M_MAX(:),DGS%XWIND10M(:)) + ! + ENDIF +! +ELSE + IF (DGS%N2M>=1) THEN + DGS%XT2M = XUNDEF + DGS%XQ2M = XUNDEF + DGS%XHU2M = XUNDEF + DGS%XZON10M = XUNDEF + DGS%XMER10M = XUNDEF + DGS%XRI = PRI + ENDIF +ENDIF +! +IF (DGS%LSURF_BUDGET.OR.DGS%LSURF_BUDGETC) THEN +! + CALL SEAFLUX_ALBEDO(PDIR_SW,PSCA_SW,PDIR_ALB,PSCA_ALB,DGS%XALBT) +! + CALL DIAG_SURF_BUDGET_SEA (XTTS, S%XSST, PRHOA, PSFTH, PSFTH_ICE, & + PSFTQ, PSFTQ_ICE, & + PDIR_SW, PSCA_SW, PLW, PDIR_ALB, & + PSCA_ALB,S%XICE_ALB, PEMIS, PTRAD, & + PSFZON, PSFZON_ICE, PSFMER, & + PSFMER_ICE, S%LHANDLE_SIC, S%XSIC, S%XTICE, & + DGS%XRN, DGS%XH, DGS%XLE, DGS%XLE_ICE, DGS%XGFLUX, & + DGS%XSWD, DGS%XSWU, DGS%XSWBD, DGS%XSWBU, DGS%XLWD, DGS%XLWU, & + DGS%XFMU, DGS%XFMV, DGS%XEVAP, DGS%XSUBL, & + DGS%XRN_ICE, DGS%XH_ICE, DGS%XGFLUX_ICE, & + DGS%XSWU_ICE, DGS%XSWBU_ICE, DGS%XLWU_ICE, & + DGS%XFMU_ICE, DGS%XFMV_ICE ) +! +END IF +! +IF(DGS%LSURF_BUDGETC)THEN + CALL DIAG_SURF_BUDGETC_SEA(DGS, & + PTSTEP, DGS%XRN, DGS%XH, DGS%XLE, DGS%XLE_ICE, DGS%XGFLUX, & + DGS%XSWD, DGS%XSWU, DGS%XLWD, DGS%XLWU, DGS%XFMU, DGS%XFMV, & + DGS%XEVAP, DGS%XSUBL, S%LHANDLE_SIC, & + DGS%XRN_ICE, DGS%XH_ICE, DGS%XGFLUX_ICE, & + DGS%XSWU_ICE, DGS%XLWU_ICE, DGS%XFMU_ICE, DGS%XFMV_ICE) +ENDIF +! +IF (DGS%LCOEF) THEN + IF (S%LHANDLE_SIC) THEN + ! + !* Transfer coefficients + ! + DGS%XCD = (1 - S%XSIC) * PCD + S%XSIC * PCD_ICE + DGS%XCH = (1 - S%XSIC) * PCH + S%XSIC * PCH_ICE + DGS%XCE = (1 - S%XSIC) * PCE + S%XSIC * PCE_ICE + ! + !* Roughness lengths + ! + ZZ0W = ( 1 - S%XSIC ) * 1.0/(LOG(PHW/S%XZ0) **2) + & + S%XSIC * 1.0/(LOG(PHW/PZ0_ICE)**2) + DGS%XZ0 = PHW * EXP ( - SQRT ( 1./ ZZ0W )) + ZZ0W = ( 1 - S%XSIC ) * 1.0/(LOG(PHW/PZ0H) **2) + & + S%XSIC * 1.0/(LOG(PHW/PZ0H_ICE)**2) + DGS%XZ0H = PHW * EXP ( - SQRT ( 1./ ZZ0W )) + + DGS%XCD_ICE = PCD_ICE + DGS%XCH_ICE = PCH_ICE + DGS%XZ0_ICE = PZ0_ICE + DGS%XZ0H_ICE = PZ0H_ICE + ! + ELSE + ! + !* Transfer coefficients + ! + DGS%XCD = PCD + DGS%XCH = PCH + DGS%XCE = PCE + ! + !* Roughness lengths + ! + DGS%XZ0 = S%XZ0 + DGS%XZ0H = PZ0H + ENDIF + ! +ENDIF +! +IF (DGS%LSURF_VARS) THEN + ! + !* Humidity at saturation + ! + IF (S%LHANDLE_SIC) THEN + DGS%XQS = (1 - S%XSIC) * PQSAT + S%XSIC * PQSAT_ICE + DGS%XQS_ICE = PQSAT_ICE + ELSE + DGS%XQS = PQSAT + ENDIF +ENDIF +! +! Diags from embedded Seaice model +! CALL DIAG_INLINE_SEAICE() : simply : +! +IF (DGSI%LDIAG_SEAICE) THEN + IF (TRIM(S%CSEAICE_SCHEME) == 'GELATO') THEN + GELATO_DIM=SIZE(PTA) + DGSI%XSIT = RESHAPE(glt_avhicem(S%TGLT%dom,S%TGLT%sit),(/GELATO_DIM/)) + DGSI%XSND = RESHAPE(glt_avhsnwm(S%TGLT%dom,S%TGLT%sit),(/GELATO_DIM/)) + DGSI%XMLT = S%TGLT%oce_all(:,1)%tml + ELSE + ! Placeholder for an alternate seaice scheme + ENDIF +ENDIF +! +! Diags for Earth System Model coupling or for embedded Seaice model +! (we are actually using XCPL_.. variables for feeding the seaice model) +! +GSIC=(S%LHANDLE_SIC.AND.(S%CSEAICE_SCHEME /= 'NONE ')) +! +IF (LCPL_SEA.OR.GSIC) THEN +! + CALL DIAG_CPL_ESM_SEA(S, & + PTSTEP,DGS%XZON10M,DGS%XMER10M,DGS%XFMU,DGS%XFMV, & + DGS%XSWD,DGS%XSWU,DGS%XGFLUX,PSFTQ,PRAIN, & + PSNOW,PLW,PPS,S%XTICE,PSFTH_ICE, & + PSFTQ_ICE,PDIR_SW,PSCA_SW, & + DGS%XSWU_ICE,DGS%XLWU_ICE,GSIC ) +! +ENDIF +IF (LHOOK) CALL DR_HOOK('DIAG_INLINE_SEAFLUX_N',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------------- +! +END SUBROUTINE DIAG_INLINE_SEAFLUX_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/diag_seaflux_initn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/diag_seaflux_initn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..f822e8e2a95261fb6d641288ec793601fbd12f14 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/diag_seaflux_initn.F90 @@ -0,0 +1,545 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE DIAG_SEAFLUX_INIT_n (& + DGO, DGS, DGSI, DGU, S, & + HPROGRAM,KLU,KSW) +! ##################### +! +!!**** *DIAG_SEAFLUX_INIT_n* - routine to initialize SEAFLUX diagnostic variables +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! Modified 01/2006 : sea flux parameterization. +!! Modified 08/2009 : cumulative sea flux +!! B. decharme 04/2013 : Add EVAP and SUBL diag +!! S.Senesi 01/2014 : introduce fractional seaice +!! Modified 11/2014 : J. Pianezze : Add surface pressure coupling parameter +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +! +USE MODD_DIAG_OCEAN_n, ONLY : DIAG_OCEAN_t +USE MODD_DIAG_SEAFLUX_n, ONLY : DIAG_SEAFLUX_t +USE MODD_DIAG_SEAICE_n, ONLY : DIAG_SEAICE_t +USE MODD_DIAG_SURF_ATM_n, ONLY : DIAG_SURF_ATM_t +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! +! +! +#ifdef SFX_OL +USE MODN_IO_OFFLINE, ONLY : LRESTART +#endif +USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_SFX_OASIS, ONLY : LCPL_SEA,LCPL_SEAICE + +! +! +! +! +USE MODI_READ_SURF +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +! +! +TYPE(DIAG_OCEAN_t), INTENT(INOUT) :: DGO +TYPE(DIAG_SEAFLUX_t), INTENT(INOUT) :: DGS +TYPE(DIAG_SEAICE_t), INTENT(INOUT) :: DGSI +TYPE(DIAG_SURF_ATM_t), INTENT(INOUT) :: DGU +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +! +INTEGER, INTENT(IN) :: KLU ! size of arrays +INTEGER, INTENT(IN) :: KSW ! number of SW spectral bands + CHARACTER(LEN=6), INTENT(IN):: HPROGRAM ! program calling +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: IVERSION +INTEGER :: IRESP ! IRESP : return-code if a problem appears + CHARACTER(LEN=12) :: YREC ! Name of the article to be read +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +!* surface energy budget +! +IF (LHOOK) CALL DR_HOOK('DIAG_SEAFLUX_INIT_N',0,ZHOOK_HANDLE) +ALLOCATE(DGS%XTS (KLU)) +ALLOCATE(DGS%XTSRAD(KLU)) +DGS%XTS = XUNDEF +DGS%XTSRAD = XUNDEF +! +IF (DGS%LSURF_BUDGET.OR.DGS%LSURF_BUDGETC) THEN + ALLOCATE(DGS%XRN (KLU)) + ALLOCATE(DGS%XRN_ICE (KLU)) + ALLOCATE(DGS%XH (KLU)) + ALLOCATE(DGS%XH_ICE (KLU)) + ALLOCATE(DGS%XLE (KLU)) + ALLOCATE(DGS%XLE_ICE (KLU)) + ALLOCATE(DGS%XGFLUX (KLU)) + ALLOCATE(DGS%XGFLUX_ICE(KLU)) + ALLOCATE(DGS%XEVAP (KLU)) + ALLOCATE(DGS%XSUBL (KLU)) + ALLOCATE(DGS%XSWD (KLU)) + ALLOCATE(DGS%XSWU (KLU)) + ALLOCATE(DGS%XSWU_ICE(KLU)) + ALLOCATE(DGS%XLWD (KLU)) + ALLOCATE(DGS%XLWU (KLU)) + ALLOCATE(DGS%XLWU_ICE(KLU)) + ALLOCATE(DGS%XSWBD (KLU,KSW)) + ALLOCATE(DGS%XSWBU (KLU,KSW)) + ALLOCATE(DGS%XSWBU_ICE(KLU,KSW)) + ALLOCATE(DGS%XFMU (KLU)) + ALLOCATE(DGS%XFMU_ICE(KLU)) + ALLOCATE(DGS%XFMV (KLU)) + ALLOCATE(DGS%XFMV_ICE(KLU)) + ALLOCATE(DGS%XALBT (KLU)) + ! + DGS%XRN = XUNDEF + DGS%XRN_ICE = XUNDEF + DGS%XH = XUNDEF + DGS%XH_ICE = XUNDEF + DGS%XLE = XUNDEF + DGS%XLE_ICE = XUNDEF + DGS%XGFLUX = XUNDEF + DGS%XGFLUX_ICE=XUNDEF + DGS%XEVAP = XUNDEF + DGS%XSUBL = XUNDEF + DGS%XSWD = XUNDEF + DGS%XSWU = XUNDEF + DGS%XSWU_ICE = XUNDEF + DGS%XLWD = XUNDEF + DGS%XLWU = XUNDEF + DGS%XLWU_ICE = XUNDEF + DGS%XSWBD = XUNDEF + DGS%XSWBU = XUNDEF + DGS%XSWBU_ICE= XUNDEF + DGS%XFMU = XUNDEF + DGS%XFMU_ICE = XUNDEF + DGS%XFMV = XUNDEF + DGS%XFMV_ICE = XUNDEF + DGS%XALBT = XUNDEF + ! +ELSE + ALLOCATE(DGS%XRN (0)) + ALLOCATE(DGS%XRN_ICE (0)) + ALLOCATE(DGS%XH (0)) + ALLOCATE(DGS%XH_ICE (0)) + ALLOCATE(DGS%XLE (0)) + ALLOCATE(DGS%XLE_ICE (0)) + ALLOCATE(DGS%XGFLUX (0)) + ALLOCATE(DGS%XGFLUX_ICE(0)) + ALLOCATE(DGS%XEVAP (0)) + ALLOCATE(DGS%XSUBL (0)) + ALLOCATE(DGS%XSWD (0)) + ALLOCATE(DGS%XSWU (0)) + ALLOCATE(DGS%XSWU_ICE(0)) + ALLOCATE(DGS%XLWD (0)) + ALLOCATE(DGS%XLWU (0)) + ALLOCATE(DGS%XLWU_ICE(0)) + ALLOCATE(DGS%XSWBD (0,0)) + ALLOCATE(DGS%XSWBU (0,0)) + ALLOCATE(DGS%XSWBU_ICE(0,0)) + ALLOCATE(DGS%XFMU (0)) + ALLOCATE(DGS%XFMU_ICE(0)) + ALLOCATE(DGS%XFMV (0)) + ALLOCATE(DGS%XFMV_ICE(0)) + ALLOCATE(DGS%XALBT (0)) +ENDIF +! +!* cumulative surface energy budget +! +#ifdef SFX_OL +IF (DGS%LSURF_BUDGETC .OR. (LRESTART .AND. .NOT.DGS%LRESET_BUDGETC)) THEN +#else +IF (DGS%LSURF_BUDGETC .OR. .NOT.DGS%LRESET_BUDGETC) THEN +#endif +! + ALLOCATE(DGS%XRNC (KLU)) + ALLOCATE(DGS%XRNC_ICE(KLU)) + ALLOCATE(DGS%XHC (KLU)) + ALLOCATE(DGS%XHC_ICE (KLU)) + ALLOCATE(DGS%XLEC (KLU)) + ALLOCATE(DGS%XLEC_ICE(KLU)) + ALLOCATE(DGS%XGFLUXC (KLU)) + ALLOCATE(DGS%XGFLUXC_ICE(KLU)) + ALLOCATE(DGS%XEVAPC (KLU)) + ALLOCATE(DGS%XSUBLC (KLU)) + ALLOCATE(DGS%XSWDC (KLU)) + ALLOCATE(DGS%XSWUC (KLU)) + ALLOCATE(DGS%XSWUC_ICE(KLU)) + ALLOCATE(DGS%XLWDC (KLU)) + ALLOCATE(DGS%XLWUC (KLU)) + ALLOCATE(DGS%XLWUC_ICE(KLU)) + ALLOCATE(DGS%XFMUC (KLU)) + ALLOCATE(DGS%XFMUC_ICE(KLU)) + ALLOCATE(DGS%XFMVC (KLU)) + ALLOCATE(DGS%XFMVC_ICE(KLU)) +! + IF (.NOT. DGU%LREAD_BUDGETC) THEN + DGS%XRNC = 0.0 + DGS%XRNC_ICE =0.0 + DGS%XHC = 0.0 + DGS%XHC_ICE =0.0 + DGS%XLEC = 0.0 + DGS%XLEC_ICE= 0.0 + DGS%XGFLUXC = 0.0 + DGS%XGFLUXC_ICE=0.0 + DGS%XEVAPC = 0.0 + DGS%XSUBLC = 0.0 + DGS%XSWDC = 0.0 + DGS%XSWUC = 0.0 + DGS%XSWUC_ICE=0.0 + DGS%XLWDC = 0.0 + DGS%XLWUC = 0.0 + DGS%XLWUC_ICE=0.0 + DGS%XFMUC = 0.0 + DGS%XFMUC_ICE=0.0 + DGS%XFMVC = 0.0 + DGS%XFMVC_ICE=0.0 + ELSEIF (DGU%LREAD_BUDGETC.AND.DGS%LRESET_BUDGETC) THEN + DGS%XRNC = 0.0 + DGS%XRNC_ICE= 0.0 + DGS%XHC = 0.0 + DGS%XHC_ICE = 0.0 + DGS%XLEC = 0.0 + DGS%XLEC_ICE= 0.0 + DGS%XGFLUXC = 0.0 + DGS%XGFLUXC_ICE=0.0 + DGS%XEVAPC = 0.0 + DGS%XSUBLC = 0.0 + DGS%XSWDC = 0.0 + DGS%XSWUC = 0.0 + DGS%XSWUC_ICE=0.0 + DGS%XLWDC = 0.0 + DGS%XLWUC = 0.0 + DGS%XLWUC_ICE=0.0 + DGS%XFMUC = 0.0 + DGS%XFMUC_ICE=0.0 + DGS%XFMVC = 0.0 + DGS%XFMVC_ICE=0.0 + ELSE + CALL READ_SURF(& + HPROGRAM,'VERSION',IVERSION,IRESP) + YREC='RNC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XRNC,IRESP) + YREC='HC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XHC ,IRESP) + YREC='LEC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XLEC,IRESP) + YREC='LEIC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XLEC_ICE,IRESP) + YREC='GFLUXC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XGFLUXC ,IRESP) + YREC='SWDC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XSWDC,IRESP) + YREC='SWUC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XSWUC,IRESP) + YREC='LWDC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XLWDC,IRESP) + YREC='LWUC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XLWUC,IRESP) + YREC='FMUC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XFMUC,IRESP) + YREC='FMVC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XFMVC,IRESP) + IF (IVERSION<8)THEN + DGS%XEVAPC = 0.0 + DGS%XSUBLC = 0.0 + ELSE + ! + YREC='EVAPC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XEVAPC,IRESP) + YREC='SUBLC_SEA' + CALL READ_SURF(& + HPROGRAM,YREC,DGS%XSUBLC,IRESP) + ENDIF + DGS%XRNC_ICE = 0.0 + DGS%XHC_ICE = 0.0 + DGS%XGFLUXC_ICE = 0.0 + DGS%XSWUC_ICE = 0.0 + DGS%XLWUC_ICE = 0.0 + DGS%XFMUC_ICE = 0.0 + DGS%XFMVC_ICE = 0.0 + ENDIF +ELSE + ALLOCATE(DGS%XRNC (0)) + ALLOCATE(DGS%XRNC_ICE(0)) + ALLOCATE(DGS%XHC (0)) + ALLOCATE(DGS%XHC_ICE (0)) + ALLOCATE(DGS%XLEC (0)) + ALLOCATE(DGS%XLEC_ICE(0)) + ALLOCATE(DGS%XGFLUXC (0)) + ALLOCATE(DGS%XGFLUXC_ICE(0)) + ALLOCATE(DGS%XEVAPC (0)) + ALLOCATE(DGS%XSUBLC (0)) + ALLOCATE(DGS%XSWDC (0)) + ALLOCATE(DGS%XSWUC (0)) + ALLOCATE(DGS%XSWUC_ICE(0)) + ALLOCATE(DGS%XLWDC (0)) + ALLOCATE(DGS%XLWUC (0)) + ALLOCATE(DGS%XLWUC_ICE(0)) + ALLOCATE(DGS%XFMUC (0)) + ALLOCATE(DGS%XFMUC_ICE(0)) + ALLOCATE(DGS%XFMVC (0)) + ALLOCATE(DGS%XFMVC_ICE(0)) +ENDIF +! +!* parameters at 2m +! +IF (DGS%N2M>=1) THEN + ALLOCATE(DGS%XRI (KLU)) + ALLOCATE(DGS%XRI_ICE (KLU)) + ALLOCATE(DGS%XT2M (KLU)) + ALLOCATE(DGS%XT2M_ICE (KLU)) + ALLOCATE(DGS%XT2M_MIN (KLU)) + ALLOCATE(DGS%XT2M_MAX (KLU)) + ALLOCATE(DGS%XQ2M (KLU)) + ALLOCATE(DGS%XQ2M_ICE (KLU)) + ALLOCATE(DGS%XHU2M (KLU)) + ALLOCATE(DGS%XHU2M_ICE(KLU)) + ALLOCATE(DGS%XHU2M_MIN(KLU)) + ALLOCATE(DGS%XHU2M_MAX(KLU)) + ALLOCATE(DGS%XZON10M (KLU)) + ALLOCATE(DGS%XZON10M_ICE(KLU)) + ALLOCATE(DGS%XMER10M (KLU)) + ALLOCATE(DGS%XMER10M_ICE(KLU)) + ALLOCATE(DGS%XWIND10M (KLU)) + ALLOCATE(DGS%XWIND10M_ICE(KLU)) + ALLOCATE(DGS%XWIND10M_MAX(KLU)) + ! + DGS%XRI = XUNDEF + DGS%XRI_ICE = XUNDEF + DGS%XT2M = XUNDEF + DGS%XT2M_ICE = XUNDEF + DGS%XT2M_MIN = XUNDEF + DGS%XT2M_MAX = 0.0 + DGS%XQ2M = XUNDEF + DGS%XQ2M_ICE = XUNDEF + DGS%XHU2M = XUNDEF + DGS%XHU2M_ICE= XUNDEF + DGS%XHU2M_MIN= XUNDEF + DGS%XHU2M_MAX=-XUNDEF + DGS%XZON10M = XUNDEF + DGS%XZON10M_ICE=XUNDEF + DGS%XMER10M = XUNDEF + DGS%XMER10M_ICE=XUNDEF + DGS%XWIND10M = XUNDEF + DGS%XWIND10M_ICE=XUNDEF + DGS%XWIND10M_MAX = 0.0 +ELSE + ALLOCATE(DGS%XRI (0)) + ALLOCATE(DGS%XRI_ICE (0)) + ALLOCATE(DGS%XT2M (0)) + ALLOCATE(DGS%XT2M_ICE (0)) + ALLOCATE(DGS%XT2M_MIN (0)) + ALLOCATE(DGS%XT2M_MAX (0)) + ALLOCATE(DGS%XQ2M (0)) + ALLOCATE(DGS%XQ2M_ICE (0)) + ALLOCATE(DGS%XHU2M (0)) + ALLOCATE(DGS%XHU2M_ICE(0)) + ALLOCATE(DGS%XHU2M_MIN(0)) + ALLOCATE(DGS%XHU2M_MAX(0)) + ALLOCATE(DGS%XZON10M (0)) + ALLOCATE(DGS%XZON10M_ICE(0)) + ALLOCATE(DGS%XMER10M (0)) + ALLOCATE(DGS%XMER10M_ICE(0)) + ALLOCATE(DGS%XWIND10M (0)) + ALLOCATE(DGS%XWIND10M_ICE(0)) + ALLOCATE(DGS%XWIND10M_MAX(0)) +END IF +! +!* transfer coefficients +! +IF (DGS%LCOEF) THEN + ALLOCATE(DGS%XCD (KLU)) + ALLOCATE(DGS%XCD_ICE (KLU)) + ALLOCATE(DGS%XCH (KLU)) + ALLOCATE(DGS%XCH_ICE (KLU)) + ALLOCATE(DGS%XCE (KLU)) + ALLOCATE(DGS%XZ0 (KLU)) + ALLOCATE(DGS%XZ0_ICE (KLU)) + ALLOCATE(DGS%XZ0H (KLU)) + ALLOCATE(DGS%XZ0H_ICE(KLU)) + ! + DGS%XCD = XUNDEF + DGS%XCD_ICE = XUNDEF + DGS%XCH = XUNDEF + DGS%XCH_ICE = XUNDEF + DGS%XCE = XUNDEF + DGS%XZ0 = XUNDEF + DGS%XZ0_ICE = XUNDEF + DGS%XZ0H = XUNDEF + DGS%XZ0H_ICE = XUNDEF +ELSE + ALLOCATE(DGS%XCD (0)) + ALLOCATE(DGS%XCD_ICE (0)) + ALLOCATE(DGS%XCH (0)) + ALLOCATE(DGS%XCH_ICE (0)) + ALLOCATE(DGS%XCE (0)) + ALLOCATE(DGS%XZ0 (0)) + ALLOCATE(DGS%XZ0_ICE (0)) + ALLOCATE(DGS%XZ0H (0)) + ALLOCATE(DGS%XZ0H_ICE(0)) +END IF +! +! +!* surface humidity +! +IF (DGS%LSURF_VARS) THEN + ALLOCATE(DGS%XQS (KLU)) + ALLOCATE(DGS%XQS_ICE (KLU)) + ! + DGS%XQS = XUNDEF + DGS%XQS_ICE = XUNDEF +ELSE + ALLOCATE(DGS%XQS (0)) + ALLOCATE(DGS%XQS_ICE (0)) +END IF +! +!* ocean diag +! +IF (DGO%LDIAG_OCEAN) THEN + ALLOCATE(DGO%XTOCMOY (KLU)) + ALLOCATE(DGO%XSOCMOY (KLU)) + ALLOCATE(DGO%XUOCMOY (KLU)) + ALLOCATE(DGO%XVOCMOY (KLU)) + ALLOCATE(DGO%XDOCMOY (KLU)) + ! + DGO%XTOCMOY(:)=XUNDEF + DGO%XSOCMOY(:)=XUNDEF + DGO%XUOCMOY(:)=XUNDEF + DGO%XVOCMOY(:)=XUNDEF + DGO%XDOCMOY(:)=XUNDEF +ELSE + ALLOCATE(DGO%XTOCMOY (0)) + ALLOCATE(DGO%XSOCMOY (0)) + ALLOCATE(DGO%XUOCMOY (0)) + ALLOCATE(DGO%XVOCMOY (0)) + ALLOCATE(DGO%XDOCMOY (0)) +ENDIF +! +!* Seaice model diagnostics init +! +IF (DGSI%LDIAG_SEAICE) THEN + ALLOCATE(DGSI%XSIT(KLU)) + DGSI%XSIT=XUNDEF + ALLOCATE(DGSI%XSND(KLU)) + DGSI%XSND=XUNDEF + ALLOCATE(DGSI%XMLT(KLU)) + DGSI%XMLT=XUNDEF +ELSE + ALLOCATE(DGSI%XSIT (0)) + ALLOCATE(DGSI%XSND (0)) + ALLOCATE(DGSI%XMLT (0)) +ENDIF +! +!* Earth system model coupling variables +! +IF(LCPL_SEA.OR.S%LHANDLE_SIC)THEN +! + ALLOCATE(S%XCPL_SEA_WIND(KLU)) + ALLOCATE(S%XCPL_SEA_FWSU(KLU)) + ALLOCATE(S%XCPL_SEA_FWSV(KLU)) + ALLOCATE(S%XCPL_SEA_SNET(KLU)) + ALLOCATE(S%XCPL_SEA_HEAT(KLU)) + ALLOCATE(S%XCPL_SEA_EVAP(KLU)) + ALLOCATE(S%XCPL_SEA_RAIN(KLU)) + ALLOCATE(S%XCPL_SEA_SNOW(KLU)) + ALLOCATE(S%XCPL_SEA_EVPR(KLU)) + ALLOCATE(S%XCPL_SEA_FWSM(KLU)) + ALLOCATE(S%XCPL_SEA_PRES(KLU)) + S%XCPL_SEA_WIND(:) = 0.0 + S%XCPL_SEA_FWSU(:) = 0.0 + S%XCPL_SEA_FWSV(:) = 0.0 + S%XCPL_SEA_SNET(:) = 0.0 + S%XCPL_SEA_HEAT(:) = 0.0 + S%XCPL_SEA_EVAP(:) = 0.0 + S%XCPL_SEA_RAIN(:) = 0.0 + S%XCPL_SEA_SNOW(:) = 0.0 + S%XCPL_SEA_EVPR(:) = 0.0 + S%XCPL_SEA_FWSM(:) = 0.0 + S%XCPL_SEA_PRES(:) = 0.0 +! +ELSE + ALLOCATE(S%XCPL_SEA_WIND(0)) + ALLOCATE(S%XCPL_SEA_FWSU(0)) + ALLOCATE(S%XCPL_SEA_FWSV(0)) + ALLOCATE(S%XCPL_SEA_SNET(0)) + ALLOCATE(S%XCPL_SEA_HEAT(0)) + ALLOCATE(S%XCPL_SEA_EVAP(0)) + ALLOCATE(S%XCPL_SEA_RAIN(0)) + ALLOCATE(S%XCPL_SEA_SNOW(0)) + ALLOCATE(S%XCPL_SEA_EVPR(0)) + ALLOCATE(S%XCPL_SEA_FWSM(0)) + ALLOCATE(S%XCPL_SEA_PRES(0)) +ENDIF +! +IF(LCPL_SEAICE.OR.S%LHANDLE_SIC)THEN + ALLOCATE(S%XCPL_SEAICE_SNET(KLU)) + ALLOCATE(S%XCPL_SEAICE_HEAT(KLU)) + ALLOCATE(S%XCPL_SEAICE_EVAP(KLU)) + S%XCPL_SEAICE_SNET(:) = 0.0 + S%XCPL_SEAICE_HEAT(:) = 0.0 + S%XCPL_SEAICE_EVAP(:) = 0.0 +ELSE + ALLOCATE(S%XCPL_SEAICE_SNET(0)) + ALLOCATE(S%XCPL_SEAICE_HEAT(0)) + ALLOCATE(S%XCPL_SEAICE_EVAP(0)) +ENDIF +! +IF (LHOOK) CALL DR_HOOK('DIAG_SEAFLUX_INIT_N',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE DIAG_SEAFLUX_INIT_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/get_sfx_sea.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/get_sfx_sea.F90 new file mode 100755 index 0000000000000000000000000000000000000000..5c653346b9527c0c71410722908778377eaa4c48 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/get_sfx_sea.F90 @@ -0,0 +1,255 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE GET_SFX_SEA (S, U, W, & + OCPL_SEAICE,OWATER, & + PSEA_FWSU,PSEA_FWSV,PSEA_HEAT,PSEA_SNET, & + PSEA_WIND,PSEA_FWSM,PSEA_EVAP,PSEA_RAIN, & + PSEA_SNOW,PSEA_EVPR,PSEA_WATF,PSEA_PRES, & + PSEAICE_HEAT,PSEAICE_SNET,PSEAICE_EVAP ) +! ############################################################################ +! +!!**** *GET_SFX_SEA* - routine to get some variables from surfex to +! a oceanic general circulation model +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/2013 +!! Modified 11/2014 : J. Pianezze - Add surface pressure coupling parameter +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +USE MODD_WATFLUX_n, ONLY : WATFLUX_t +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +! +! +! +USE MODI_UNPACK_SAME_RANK +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +TYPE(WATFLUX_t), INTENT(INOUT) :: W +! +LOGICAL, INTENT(IN) :: OCPL_SEAICE ! sea-ice / ocean key +LOGICAL, INTENT(IN) :: OWATER ! water included in sea smask +! +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_FWSU ! Cumulated zonal wind stress (Pa.s) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_FWSV ! Cumulated meridian wind stress (Pa.s) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_HEAT ! Cumulated Non solar net heat flux (J/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_SNET ! Cumulated Solar net heat flux (J/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_WIND ! Cumulated 10m wind speed (m) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_FWSM ! Cumulated wind stress (Pa.s) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_EVAP ! Cumulated Evaporation (kg/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_RAIN ! Cumulated Rainfall rate (kg/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_SNOW ! Cumulated Snowfall rate (kg/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_EVPR ! Cumulated Evap-Precip (kg/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_WATF ! Cumulated Net water flux (kg/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSEA_PRES ! Cumulated Surface pressure (Pa.s) +! +REAL, DIMENSION(:), INTENT(OUT) :: PSEAICE_HEAT ! Cumulated Sea-ice non solar net heat flux (J/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSEAICE_SNET ! Cumulated Sea-ice solar net heat flux (J/m2) +REAL, DIMENSION(:), INTENT(OUT) :: PSEAICE_EVAP ! Cumulated Sea-ice sublimation (kg/m2) +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZWIND +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZFWSU +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZFWSV +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZSNET +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZHEAT +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZEVAP +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZRAIN +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZSNOW +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZEVPR +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZFWSM +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZPRES +! +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZSNET_ICE +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZHEAT_ICE +REAL, DIMENSION(SIZE(PSEA_HEAT)) :: ZEVAP_ICE +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('GET_SFX_SEA',0,ZHOOK_HANDLE) +!------------------------------------------------------------------------------- +! +!* 1.0 Initialization +! -------------- +! +PSEA_FWSU (:) = XUNDEF +PSEA_FWSV (:) = XUNDEF +PSEA_HEAT (:) = XUNDEF +PSEA_SNET (:) = XUNDEF +PSEA_WIND (:) = XUNDEF +PSEA_FWSM (:) = XUNDEF +PSEA_EVAP (:) = XUNDEF +PSEA_RAIN (:) = XUNDEF +PSEA_SNOW (:) = XUNDEF +PSEA_EVPR (:) = XUNDEF +PSEA_WATF (:) = XUNDEF +PSEA_PRES (:) = XUNDEF +! +PSEAICE_HEAT (:) = XUNDEF +PSEAICE_SNET (:) = XUNDEF +PSEAICE_EVAP (:) = XUNDEF +! +ZFWSU (:) = XUNDEF +ZFWSV (:) = XUNDEF +ZHEAT (:) = XUNDEF +ZSNET (:) = XUNDEF +ZWIND (:) = XUNDEF +ZFWSM (:) = XUNDEF +ZEVAP (:) = XUNDEF +ZRAIN (:) = XUNDEF +ZSNOW (:) = XUNDEF +ZEVPR (:) = XUNDEF +! +ZHEAT_ICE (:) = XUNDEF +ZSNET_ICE (:) = XUNDEF +ZEVAP_ICE (:) = XUNDEF +! +!* 2.0 Get variable over sea +! --------------------- +! +IF(U%NSIZE_SEA>0)THEN +! + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_WIND(:),PSEA_WIND(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_FWSU(:),PSEA_FWSU(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_FWSV(:),PSEA_FWSV(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_SNET(:),PSEA_SNET(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_HEAT(:),PSEA_HEAT(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_EVAP(:),PSEA_EVAP(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_RAIN(:),PSEA_RAIN(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_SNOW(:),PSEA_SNOW(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_EVPR(:),PSEA_EVPR(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_FWSM(:),PSEA_FWSM(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEA_PRES(:),PSEA_PRES(:),XUNDEF) + S%XCPL_SEA_WIND(:) = 0.0 + S%XCPL_SEA_EVAP(:) = 0.0 + S%XCPL_SEA_HEAT(:) = 0.0 + S%XCPL_SEA_SNET(:) = 0.0 + S%XCPL_SEA_FWSU(:) = 0.0 + S%XCPL_SEA_FWSV(:) = 0.0 + S%XCPL_SEA_RAIN(:) = 0.0 + S%XCPL_SEA_SNOW(:) = 0.0 + S%XCPL_SEA_EVPR(:) = 0.0 + S%XCPL_SEA_FWSM(:) = 0.0 + S%XCPL_SEA_PRES(:) = 0.0 +! + IF (OCPL_SEAICE) THEN + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEAICE_SNET(:),PSEAICE_SNET(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEAICE_HEAT(:),PSEAICE_HEAT(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),S%XCPL_SEAICE_EVAP(:),PSEAICE_EVAP(:),XUNDEF) + S%XCPL_SEAICE_SNET(:) = 0.0 + S%XCPL_SEAICE_EVAP(:) = 0.0 + S%XCPL_SEAICE_HEAT(:) = 0.0 + ENDIF +! +ENDIF +! +!* 3.0 Get variable over water without Flake +! ------------------------------------- +! +IF (OWATER.AND.U%NSIZE_WATER>0) THEN +! + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATER_WIND(:),ZWIND(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATER_FWSU(:),ZFWSU(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATER_FWSV(:),ZFWSV(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATER_SNET(:),ZSNET(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATER_HEAT(:),ZHEAT(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATER_EVAP(:),ZEVAP(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATER_RAIN(:),ZRAIN(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATER_SNOW(:),ZSNOW(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATER_FWSM(:),ZFWSM(:),XUNDEF) +! + WHERE(U%XWATER(:)>0.0) + PSEA_WIND(:) = (U%XSEA(:)*PSEA_WIND(:)+U%XWATER(:)*ZWIND(:))/(U%XSEA(:)+U%XWATER(:)) + PSEA_FWSU(:) = (U%XSEA(:)*PSEA_FWSU(:)+U%XWATER(:)*ZFWSU(:))/(U%XSEA(:)+U%XWATER(:)) + PSEA_FWSV(:) = (U%XSEA(:)*PSEA_FWSV(:)+U%XWATER(:)*ZFWSV(:))/(U%XSEA(:)+U%XWATER(:)) + PSEA_SNET(:) = (U%XSEA(:)*PSEA_SNET(:)+U%XWATER(:)*ZSNET(:))/(U%XSEA(:)+U%XWATER(:)) + PSEA_HEAT(:) = (U%XSEA(:)*PSEA_HEAT(:)+U%XWATER(:)*ZHEAT(:))/(U%XSEA(:)+U%XWATER(:)) + PSEA_EVAP(:) = (U%XSEA(:)*PSEA_EVAP(:)+U%XWATER(:)*ZEVAP(:))/(U%XSEA(:)+U%XWATER(:)) + PSEA_RAIN(:) = (U%XSEA(:)*PSEA_RAIN(:)+U%XWATER(:)*ZRAIN(:))/(U%XSEA(:)+U%XWATER(:)) + PSEA_SNOW(:) = (U%XSEA(:)*PSEA_SNOW(:)+U%XWATER(:)*ZSNOW(:))/(U%XSEA(:)+U%XWATER(:)) + PSEA_FWSM(:) = (U%XSEA(:)*PSEA_FWSM(:)+U%XWATER(:)*ZFWSM(:))/(U%XSEA(:)+U%XWATER(:)) + ENDWHERE +! + W%XCPL_WATER_WIND(:) = 0.0 + W%XCPL_WATER_EVAP(:) = 0.0 + W%XCPL_WATER_HEAT(:) = 0.0 + W%XCPL_WATER_SNET(:) = 0.0 + W%XCPL_WATER_FWSU(:) = 0.0 + W%XCPL_WATER_FWSV(:) = 0.0 + W%XCPL_WATER_RAIN(:) = 0.0 + W%XCPL_WATER_SNOW(:) = 0.0 + W%XCPL_WATER_FWSM(:) = 0.0 +! + IF (OCPL_SEAICE) THEN + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATERICE_SNET(:),ZSNET_ICE(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATERICE_HEAT(:),ZHEAT_ICE(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_WATER(:),W%XCPL_WATERICE_EVAP(:),ZEVAP_ICE(:),XUNDEF) + WHERE(U%XWATER(:)>0.0) + PSEAICE_SNET(:) = (U%XSEA(:)*PSEAICE_SNET(:)+U%XWATER(:)*ZSNET_ICE(:))/(U%XSEA(:)+U%XWATER(:)) + PSEAICE_HEAT(:) = (U%XSEA(:)*PSEAICE_HEAT(:)+U%XWATER(:)*ZHEAT_ICE(:))/(U%XSEA(:)+U%XWATER(:)) + PSEAICE_EVAP(:) = (U%XSEA(:)*PSEAICE_EVAP(:)+U%XWATER(:)*ZEVAP_ICE(:))/(U%XSEA(:)+U%XWATER(:)) + ENDWHERE + W%XCPL_WATERICE_SNET(:) = 0.0 + W%XCPL_WATERICE_EVAP(:) = 0.0 + W%XCPL_WATERICE_HEAT(:) = 0.0 + ENDIF +! +ENDIF +! +!* 4.0 Net water flux +! ----------------------- +! +IF(U%NSIZE_SEA>0)THEN +! + PSEA_WATF(:) = PSEA_RAIN(:) + PSEA_SNOW(:) - PSEA_EVAP(:) +! +ENDIF +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('GET_SFX_SEA',1,ZHOOK_HANDLE) +!------------------------------------------------------------------------------- +! +END SUBROUTINE GET_SFX_SEA diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/get_sfx_wave.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/get_sfx_wave.F90 new file mode 100755 index 0000000000000000000000000000000000000000..17a47d0069608495b6ea753955c0780598420638 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/get_sfx_wave.F90 @@ -0,0 +1,92 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE GET_SFX_WAVE(U, DGS, & + PWAVE_U10,PWAVE_V10) +! ############################################################################ +! +!!**** *GET_SFX_WAVE* - routine to get some variables from surfex to +! a wave model +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! J. Pianezze *LPO* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/2014 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +USE MODD_DIAG_SEAFLUX_n, ONLY : DIAG_SEAFLUX_t +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +USE MODI_UNPACK_SAME_RANK +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +! +!* 0.1 Declarations of arguments +! ------------------------- +! +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +TYPE(DIAG_SEAFLUX_t), INTENT(INOUT) :: DGS +! +REAL, DIMENSION(:), INTENT(OUT) :: PWAVE_U10 ! 10 meter u-wind (m/s) +REAL, DIMENSION(:), INTENT(OUT) :: PWAVE_V10 ! 10 meter v-wind (m/s) +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('GET_SFX_WAVE',0,ZHOOK_HANDLE) +!------------------------------------------------------------------------------- +! +!* 1.0 Initialization +! -------------- +! +PWAVE_U10(:) = XUNDEF +PWAVE_V10(:) = XUNDEF +! +!* 2.0 Get variable over wave +! ---------------------- +! +IF(U%NSIZE_SEA>0)THEN +! + CALL UNPACK_SAME_RANK(U%NR_SEA(:),DGS%XZON10M(:),PWAVE_U10(:),XUNDEF) + CALL UNPACK_SAME_RANK(U%NR_SEA(:),DGS%XMER10M(:),PWAVE_V10(:),XUNDEF) +! +ENDIF +! +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('GET_SFX_WAVE',1,ZHOOK_HANDLE) +!------------------------------------------------------------------------------- +! +END SUBROUTINE GET_SFX_WAVE diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/get_sfxcpln.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/get_sfxcpln.F90 new file mode 100644 index 0000000000000000000000000000000000000000..e0df0a92ed94d2f62d2a59dd5aa4d3c90db97ff9 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/get_sfxcpln.F90 @@ -0,0 +1,228 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE GET_SFXCPL_n (I, S, U, W, & + HPROGRAM,KI,PRUI,PWIND,PFWSU,PFWSV,PSNET, & + PHEAT,PEVAP,PRAIN,PSNOW,PEVPR,PICEFLUX, & + PFWSM,PPS,PHEAT_ICE,PEVAP_ICE,PSNET_ICE) +! ################################################################### +! +!!**** *GETSFXCPL_n* - routine to get some variables from surfex into +! ocean and/or a river routing model when the coupler +! is not in SURFEX but in ARPEGE. +! +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! This routine will be suppress soon. +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 08/2009 +!! Modified 11/2014 : J. Pianezze - Add surface pressure coupling parameter +!---------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +! +! +USE MODD_ISBA_n, ONLY : ISBA_t +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +USE MODD_WATFLUX_n, ONLY : WATFLUX_t +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +USE MODN_SFX_OASIS, ONLY : LWATER +USE MODD_SFX_OASIS, ONLY : LCPL_LAND, LCPL_CALVING, LCPL_GW, & + LCPL_FLOOD, LCPL_SEA, LCPL_SEAICE +! +USE MODI_GET_SFX_SEA +USE MODI_GET_SFX_LAND +USE MODI_ABOR1_SFX +USE MODI_GET_LUOUT +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +USE MODI_GET_1D_MASK +! +USE MODI_GET_FRAC_n +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +TYPE(ISBA_t), INTENT(INOUT) :: I +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +TYPE(WATFLUX_t), INTENT(INOUT) :: W +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM +INTEGER, INTENT(IN) :: KI ! number of points +! +REAL, DIMENSION(KI), INTENT(OUT) :: PRUI +REAL, DIMENSION(KI), INTENT(OUT) :: PWIND +REAL, DIMENSION(KI), INTENT(OUT) :: PFWSU +REAL, DIMENSION(KI), INTENT(OUT) :: PFWSV +REAL, DIMENSION(KI), INTENT(OUT) :: PSNET +REAL, DIMENSION(KI), INTENT(OUT) :: PHEAT +REAL, DIMENSION(KI), INTENT(OUT) :: PEVAP +REAL, DIMENSION(KI), INTENT(OUT) :: PRAIN +REAL, DIMENSION(KI), INTENT(OUT) :: PSNOW +REAL, DIMENSION(KI), INTENT(OUT) :: PEVPR +REAL, DIMENSION(KI), INTENT(OUT) :: PICEFLUX +REAL, DIMENSION(KI), INTENT(OUT) :: PFWSM +REAL, DIMENSION(KI), INTENT(OUT) :: PPS +REAL, DIMENSION(KI), INTENT(OUT) :: PHEAT_ICE +REAL, DIMENSION(KI), INTENT(OUT) :: PEVAP_ICE +REAL, DIMENSION(KI), INTENT(OUT) :: PSNET_ICE +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +REAL, DIMENSION(KI) :: ZRUNOFF ! Cumulated Surface runoff (kg/m2) +REAL, DIMENSION(KI) :: ZDRAIN ! Cumulated Deep drainage (kg/m2) +REAL, DIMENSION(KI) :: ZCALVING ! Cumulated Calving flux (kg/m2) +REAL, DIMENSION(KI) :: ZRECHARGE ! Cumulated Recharge to groundwater (kg/m2) +REAL, DIMENSION(KI) :: ZSRCFLOOD ! Cumulated flood freshwater flux (kg/m2) +! +REAL, DIMENSION(KI) :: ZSEA_FWSU ! Cumulated zonal wind stress (Pa.s) +REAL, DIMENSION(KI) :: ZSEA_FWSV ! Cumulated meridian wind stress (Pa.s) +REAL, DIMENSION(KI) :: ZSEA_HEAT ! Cumulated Non solar net heat flux (J/m2) +REAL, DIMENSION(KI) :: ZSEA_SNET ! Cumulated Solar net heat flux (J/m2) +REAL, DIMENSION(KI) :: ZSEA_WIND ! Cumulated 10m wind speed (m) +REAL, DIMENSION(KI) :: ZSEA_FWSM ! Cumulated wind stress (Pa.s) +REAL, DIMENSION(KI) :: ZSEA_EVAP ! Cumulated Evaporation (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_RAIN ! Cumulated Rainfall rate (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_SNOW ! Cumulated Snowfall rate (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_EVPR ! Cumulated Evap-Precp. rate (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_WATF ! Cumulated freshwater flux (kg/m2) +REAL, DIMENSION(KI) :: ZSEA_PRES ! Cumulated Surface pressure (Pa.s) +! +REAL, DIMENSION(KI) :: ZSEAICE_HEAT ! Cumulated Sea-ice non solar net heat flux (J/m2) +REAL, DIMENSION(KI) :: ZSEAICE_SNET ! Cumulated Sea-ice solar net heat flux (J/m2) +REAL, DIMENSION(KI) :: ZSEAICE_EVAP ! Cumulated Sea-ice sublimation (kg/m2) +! +INTEGER :: ILU, ILUOUT +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('GET_SFXCPL_N',0,ZHOOK_HANDLE) +! +CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +!------------------------------------------------------------------------------- +! Global argument +! +IF(KI/=U%NSIZE_FULL)THEN + WRITE(ILUOUT,*) 'size of field expected by the coupling :', KI + WRITE(ILUOUT,*) 'size of field in SURFEX :', U%NSIZE_FULL + CALL ABOR1_SFX('GET_SFXCPL_N: VECTOR SIZE NOT CORRECT FOR COUPLING') +ENDIF +! +!------------------------------------------------------------------------------- +! Get variable over nature tile +! +IF(LCPL_LAND)THEN +! +! * Init land output fields +! + ZRUNOFF (:) = XUNDEF + ZDRAIN (:) = XUNDEF + ZCALVING (:) = XUNDEF + ZRECHARGE(:) = XUNDEF + ZSRCFLOOD(:) = XUNDEF +! +! * Get land output fields +! + CALL GET_SFX_LAND(I, U, & + LCPL_GW,LCPL_FLOOD,LCPL_CALVING, & + ZRUNOFF,ZDRAIN,ZCALVING,ZRECHARGE, & + ZSRCFLOOD ) +! +! * Assign land output fields +! + PRUI (:) = ZRUNOFF (:)+ZDRAIN(:) + PICEFLUX(:) = ZCALVING(:) +! +ENDIF +! +!------------------------------------------------------------------------------- +! Get variable over sea and water tiles and for ice +! +IF(LCPL_SEA)THEN +! +! * Init sea output fields +! + ZSEA_FWSU (:) = XUNDEF + ZSEA_FWSV (:) = XUNDEF + ZSEA_HEAT (:) = XUNDEF + ZSEA_SNET (:) = XUNDEF + ZSEA_WIND (:) = XUNDEF + ZSEA_FWSM (:) = XUNDEF + ZSEA_EVAP (:) = XUNDEF + ZSEA_RAIN (:) = XUNDEF + ZSEA_SNOW (:) = XUNDEF + ZSEA_WATF (:) = XUNDEF + ZSEA_PRES (:) = XUNDEF +! + ZSEAICE_HEAT (:) = XUNDEF + ZSEAICE_SNET (:) = XUNDEF + ZSEAICE_EVAP (:) = XUNDEF +! +! * Get sea output fields +! + CALL GET_SFX_SEA(S, U, W, & + LCPL_SEAICE,LWATER, & + ZSEA_FWSU,ZSEA_FWSV,ZSEA_HEAT,ZSEA_SNET, & + ZSEA_WIND,ZSEA_FWSM,ZSEA_EVAP,ZSEA_RAIN, & + ZSEA_SNOW,ZSEA_EVPR,ZSEA_WATF,ZSEA_PRES, & + ZSEAICE_HEAT,ZSEAICE_SNET,ZSEAICE_EVAP ) +! +! * Assign sea output fields +! + PFWSU (:) = ZSEA_FWSU (:) + PFWSV (:) = ZSEA_FWSV (:) + PSNET (:) = ZSEA_SNET (:) + PHEAT (:) = ZSEA_HEAT (:) + PEVAP (:) = ZSEA_EVAP (:) + PRAIN (:) = ZSEA_RAIN (:) + PSNOW (:) = ZSEA_SNOW (:) + PFWSM (:) = ZSEA_FWSM (:) + PHEAT_ICE (:) = ZSEAICE_HEAT (:) + PEVAP_ICE (:) = ZSEAICE_EVAP (:) + PSNET_ICE (:) = ZSEAICE_SNET (:) +! +ENDIF +! +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('GET_SFXCPL_N',1,ZHOOK_HANDLE) +! +END SUBROUTINE GET_SFXCPL_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/init_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/init_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..a00b0930af3d5e22c26570598ff2211bbf71a45f --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/init_seafluxn.F90 @@ -0,0 +1,460 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ############################################################# + SUBROUTINE INIT_SEAFLUX_n (DTCO, DGU, UG, U, SM,GCP, & + HPROGRAM,HINIT, & + KI,KSV,KSW, & + HSV,PCO2,PRHOA, & + PZENITH,PAZIM,PSW_BANDS,PDIR_ALB,PSCA_ALB, & + PEMIS,PTSRAD,PTSURF, & + KYEAR, KMONTH,KDAY, PTIME, & + HATMFILE,HATMFILETYPE, & + HTEST ) +! ############################################################# +! +!!**** *INIT_SEAFLUX_n* - routine to initialize SEAFLUX +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2003 +!! Modified 01/2006 : sea flux parameterization. +!! 01/2008 : coupling with 1D ocean +!! B. Decharme 08/2009 : specific treatment for sea/ice in the Earth System Model +!! B. Decharme 07/2011 : read pgd+prep +!! B. Decharme 04/2013 : new coupling variables +!! S. Senesi 01/2014 : introduce sea-ice model +!! S. Belamari 03/2014 : add NZ0 (to choose PZ0SEA formulation) +!! R. Séférian 01/2015 : introduce interactive ocean surface albedo +!! M.N. Bouin 03/2014 : possibility of wave parameters +!! ! from external source +!! J. Pianezze 11/2014 : add wave coupling flag for wave parameters +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODD_SURFEX_n, ONLY : SEAFLUX_MODEL_t +! +USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t +USE MODD_DIAG_SURF_ATM_n, ONLY : DIAG_SURF_ATM_t +USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +USE MODD_GRID_CONF_PROJ, ONLY : GRID_CONF_PROJ_t +! +USE MODD_SFX_OASIS, ONLY : LCPL_WAVE,LCPL_SEA,LCPL_SEAICE +! +USE MODD_READ_NAMELIST, ONLY : LNAM_READ +USE MODD_CSTS, ONLY : XTTS +USE MODD_SNOW_PAR, ONLY : XZ0HSN +USE MODD_SURF_PAR, ONLY : XUNDEF, NUNDEF +USE MODD_CHS_AEROSOL, ONLY: LVARSIGI, LVARSIGJ +USE MODD_DST_SURF, ONLY: LVARSIG_DST, NDSTMDE, NDST_MDEBEG, LRGFIX_DST +USE MODD_SLT_SURF, ONLY: LVARSIG_SLT, NSLTMDE, NSLT_MDEBEG, LRGFIX_SLT +! +USE MODI_INIT_IO_SURF_n +USE MODI_DEFAULT_CH_DEP +! +USE MODI_DEFAULT_SEAFLUX +USE MODI_DEFAULT_DIAG_SEAFLUX +USE MODI_READ_DEFAULT_SEAFLUX_n +USE MODI_READ_SEAFLUX_CONF_n +USE MODI_READ_SEAFLUX_n +! +USE MODI_READ_OCEAN_n +! +USE MODI_DEFAULT_SEAICE +USE MODI_READ_SEAICE_n +! +USE MODI_READ_PGD_SEAFLUX_n +USE MODI_DIAG_SEAFLUX_INIT_n +USE MODI_END_IO_SURF_n +USE MODI_GET_LUOUT +USE MODI_READ_SURF +USE MODI_READ_SEAFLUX_DATE +USE MODI_READ_NAM_PREP_SEAFLUX_n +USE MODI_INIT_CHEMICAL_n +USE MODI_PREP_CTRL_SEAFLUX +USE MODI_UPDATE_RAD_SEA +USE MODI_READ_SEAFLUX_SBL_n +USE MODI_ABOR1_SFX +! +USE MODI_SET_SURFEX_FILEIN +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO +TYPE(DIAG_SURF_ATM_t), INTENT(INOUT) :: DGU +TYPE(SURF_ATM_GRID_t), INTENT(INOUT) :: UG +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +TYPE(GRID_CONF_PROJ_t),INTENT(INOUT) :: GCP +TYPE(SEAFLUX_MODEL_t), INTENT(INOUT) :: SM +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes + CHARACTER(LEN=3), INTENT(IN) :: HINIT ! choice of fields to initialize +INTEGER, INTENT(IN) :: KI ! number of points +INTEGER, INTENT(IN) :: KSV ! number of scalars +INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands + CHARACTER(LEN=6), DIMENSION(KSV), INTENT(IN) :: HSV ! name of all scalar variables +REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration (kg/m3) +REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density +REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! solar zenithal angle +REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! solar azimuthal angle (rad from N, clock) +REAL, DIMENSION(KSW), INTENT(IN) :: PSW_BANDS ! middle wavelength of each band +REAL, DIMENSION(KI,KSW),INTENT(OUT) :: PDIR_ALB ! direct albedo for each band +REAL, DIMENSION(KI,KSW),INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each band +REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity +REAL, DIMENSION(KI), INTENT(OUT) :: PTSRAD ! radiative temperature +REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K) +INTEGER, INTENT(IN) :: KYEAR ! current year (UTC) +INTEGER, INTENT(IN) :: KMONTH ! current month (UTC) +INTEGER, INTENT(IN) :: KDAY ! current day (UTC) +REAL, INTENT(IN) :: PTIME ! current time since + ! midnight (UTC, s) +! + CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! atmospheric file name + CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! atmospheric file type + CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK' +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: ILU ! sizes of SEAFLUX arrays +INTEGER :: ILUOUT ! unit of output listing file +INTEGER :: IRESP ! return code +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +! Initialisation for IO +! +IF (LHOOK) CALL DR_HOOK('INIT_SEAFLUX_N',0,ZHOOK_HANDLE) + CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +IF (HTEST/='OK') THEN + CALL ABOR1_SFX('INIT_SEAFLUXN: FATAL ERROR DURING ARGUMENT TRANSFER') +END IF +! +! +! Others litlle things +! +PDIR_ALB = XUNDEF +PSCA_ALB = XUNDEF +PEMIS = XUNDEF +PTSRAD = XUNDEF +PTSURF = XUNDEF +! +SM%O%LMERCATOR = .FALSE. +SM%O%LCURRENT = .FALSE. +! +IF (LNAM_READ) THEN + ! + !* 0. Defaults + ! -------- + ! + ! 0.1. Hard defaults + ! + + CALL DEFAULT_SEAFLUX(SM%S%XTSTEP,SM%S%XOUT_TSTEP,SM%S%CSEA_ALB,SM%S%CSEA_FLUX,SM%S%LPWG, & + SM%S%LPRECIP,SM%S%LPWEBB,SM%S%NZ0,SM%S%NGRVWAVES,SM%O%LPROGSST, & + SM%O%NTIME_COUPLING,SM%O%XOCEAN_TSTEP,SM%S%XICHCE,SM%S%CINTERPOL_SST,& + SM%S%CINTERPOL_SSS,SM%S%LWAVEWIND ) + CALL DEFAULT_SEAICE(HPROGRAM, & + SM%S%CINTERPOL_SIC,SM%S%CINTERPOL_SIT, SM%S%XFREEZING_SST, & + SM%S%XSEAICE_TSTEP, SM%S%XSIC_EFOLDING_TIME, & + SM%S%XSIT_EFOLDING_TIME, SM%S%XCD_ICE_CST, SM%S%XSI_FLX_DRV) + ! + CALL DEFAULT_CH_DEP(SM%CHS%CCH_DRY_DEP) + ! + CALL DEFAULT_DIAG_SEAFLUX(SM%DGS%N2M,SM%DGS%LSURF_BUDGET,SM%DGS%L2M_MIN_ZS,& + SM%DGS%LRAD_BUDGET,SM%DGS%LCOEF,SM%DGS%LSURF_VARS,& + SM%DGO%LDIAG_OCEAN,SM%DGSI%LDIAG_SEAICE,SM%DGS%LSURF_BUDGETC,& + SM%DGS%LRESET_BUDGETC,SM%DGS%XDIAG_TSTEP ) + +ENDIF +! +! +! 0.2. Defaults from file header +! + CALL READ_DEFAULT_SEAFLUX_n(SM%CHS, SM%DGO, SM%DGS, SM%DGSI, SM%O, SM%S, & + HPROGRAM) +! +!* 1.1 Reading of configuration: +! ------------------------- +! + CALL READ_SEAFLUX_CONF_n(SM%CHS, SM%DGO, SM%DGS, SM%DGSI, SM%O, SM%S, & + HPROGRAM) +! +SM%S%LINTERPOL_SST=.FALSE. +SM%S%LINTERPOL_SSS=.FALSE. +SM%S%LINTERPOL_SIC=.FALSE. +SM%S%LINTERPOL_SIT=.FALSE. +IF(LCPL_SEA)THEN + IF(SM%DGS%N2M<1)THEN + CALL ABOR1_SFX('INIT_SEAFLUX_n: N2M must be set >0 in case of LCPL_SEA') + ENDIF +! No STT / SSS interpolation in Earth System Model + SM%S%CINTERPOL_SST='NONE ' + SM%S%CINTERPOL_SSS='NONE ' + SM%S%CINTERPOL_SIC='NONE ' + SM%S%CINTERPOL_SIT='NONE ' +ELSE + IF(TRIM(SM%S%CINTERPOL_SST)/='NONE')THEN + SM%S%LINTERPOL_SST=.TRUE. + ENDIF + IF(TRIM(SM%S%CINTERPOL_SSS)/='NONE')THEN + SM%S%LINTERPOL_SSS=.TRUE. + ENDIF + IF(TRIM(SM%S%CINTERPOL_SIC)/='NONE')THEN + SM%S%LINTERPOL_SIC=.TRUE. + ENDIF + IF(TRIM(SM%S%CINTERPOL_SIT)/='NONE')THEN + SM%S%LINTERPOL_SIT=.TRUE. + ENDIF +ENDIF +! +!* 1. Cover fields and grid: +! --------------------- +!* date +! +SELECT CASE (HINIT) +! + CASE ('PGD') +! + SM%S%TTIME%TDATE%YEAR = NUNDEF + SM%S%TTIME%TDATE%MONTH= NUNDEF + SM%S%TTIME%TDATE%DAY = NUNDEF + SM%S%TTIME%TIME = XUNDEF +! + CASE ('PRE') +! + CALL PREP_CTRL_SEAFLUX(SM%DGS%N2M,SM%DGS%LSURF_BUDGET,SM%DGS%L2M_MIN_ZS,& + SM%DGS%LRAD_BUDGET,SM%DGS%LCOEF,SM%DGS%LSURF_VARS,& + SM%DGO%LDIAG_OCEAN,SM%DGSI%LDIAG_SEAICE,ILUOUT,SM%DGS%LSURF_BUDGETC ) + IF (LNAM_READ) CALL READ_NAM_PREP_SEAFLUX_n(HPROGRAM) + CALL READ_SEAFLUX_DATE(SM%O, & + HPROGRAM,HINIT,ILUOUT,HATMFILE,HATMFILETYPE,KYEAR,KMONTH,KDAY,PTIME,SM%S%TTIME) +! + CASE DEFAULT +! + CALL INIT_IO_SURF_n(DTCO, DGU, U, & + HPROGRAM,'SEA ','SEAFLX','READ ') + CALL READ_SURF(& + HPROGRAM,'DTCUR',SM%S%TTIME,IRESP) + CALL END_IO_SURF_n(HPROGRAM) +! +END SELECT +! +!----------------------------------------------------------------------------------------------------- +! READ PGD FILE +!----------------------------------------------------------------------------------------------------- +! +! Initialisation for IO +! + CALL SET_SURFEX_FILEIN(HPROGRAM,'PGD ') ! change input file name to pgd name + CALL INIT_IO_SURF_n(DTCO, DGU, U, & + HPROGRAM,'SEA ','SEAFLX','READ ') +! +! Reading of the fields +! + CALL READ_PGD_SEAFLUX_n(DTCO, SM%DTS, SM%SG, SM%S, U,GCP, & + HPROGRAM) +! + CALL END_IO_SURF_n(HPROGRAM) + CALL SET_SURFEX_FILEIN(HPROGRAM,'PREP') ! restore input file name +!------------------------------------------------------------------------------- +! +!* if only physiographic fields are to be initialized, stop here. +! +IF (HINIT/='ALL' .AND. HINIT/='SOD') THEN + IF (LHOOK) CALL DR_HOOK('INIT_SEAFLUX_N',1,ZHOOK_HANDLE) + RETURN +END IF +! +!------------------------------------------------------------------------------- +! +! Initialisation for IO +! + CALL INIT_IO_SURF_n(DTCO, DGU, U, & + HPROGRAM,'SEA ','SEAFLX','READ ') +! +!* 2. Prognostic fields: +! ---------------- +! +IF(SM%S%LINTERPOL_SST.OR.SM%S%LINTERPOL_SSS.OR.SM%S%LINTERPOL_SIC.OR.SM%S%LINTERPOL_SIT)THEN +! Initialize current Month for SST interpolation + SM%S%TZTIME%TDATE%YEAR = SM%S%TTIME%TDATE%YEAR + SM%S%TZTIME%TDATE%MONTH = SM%S%TTIME%TDATE%MONTH + SM%S%TZTIME%TDATE%DAY = SM%S%TTIME%TDATE%DAY + SM%S%TZTIME%TIME = SM%S%TTIME%TIME +ENDIF +! + CALL READ_SEAFLUX_n(DTCO, SM%SG, SM%S, U, & + HPROGRAM,ILUOUT) +! +IF (HINIT/='ALL') THEN + CALL END_IO_SURF_n(HPROGRAM) + IF (LHOOK) CALL DR_HOOK('INIT_SEAFLUX_N',1,ZHOOK_HANDLE) + RETURN +END IF +!------------------------------------------------------------------------------- +! +!* 2.1 Ocean fields: +! ------------- +! + CALL READ_OCEAN_n(DTCO, SM%O, SM%OR, U, & + HPROGRAM) +! +!------------------------------------------------------------------------------- +! +ILU = SIZE(SM%S%XCOVER,1) +! +ALLOCATE(SM%S%XSST_INI (ILU)) +SM%S%XSST_INI(:) = SM%S%XSST(:) +! +ALLOCATE(SM%S%XZ0H(ILU)) +WHERE (SM%S%XSST(:)>=XTTS) + SM%S%XZ0H(:) = SM%S%XZ0(:) +ELSEWHERE + SM%S%XZ0H(:) = XZ0HSN +ENDWHERE +! +!------------------------------------------------------------------------------- +! +!* 3. Specific fields when using earth system model or sea-ice scheme +! (Sea current and Sea-ice temperature) +! ----------------------------------------------------------------- +! +IF(LCPL_SEA .OR. SM%S%LHANDLE_SIC .OR. LCPL_WAVE)THEN + ALLOCATE(SM%S%XUMER (ILU)) + ALLOCATE(SM%S%XVMER (ILU)) + SM%S%XUMER (:)=0 + SM%S%XVMER (:)=0 +! +ELSE + ALLOCATE(SM%S%XUMER (0)) + ALLOCATE(SM%S%XVMER (0)) +ENDIF +! +IF(LCPL_WAVE) THEN + ALLOCATE(SM%S%XCHARN (ILU)) + SM%S%XCHARN (:)=0.011 +ELSE + ALLOCATE(SM%S%XCHARN (0)) +ENDIF +! +IF(LCPL_SEAICE.OR.SM%S%LHANDLE_SIC)THEN + ALLOCATE(SM%S%XTICE (ILU)) + ALLOCATE(SM%S%XICE_ALB(ILU)) + SM%S%XTICE (:)=XUNDEF + SM%S%XICE_ALB(:)=XUNDEF +ELSE + ALLOCATE(SM%S%XTICE (0)) + ALLOCATE(SM%S%XICE_ALB(0)) +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 4. Seaice prognostic variables and forcings : +! + CALL READ_SEAICE_n(& + SM%SG, SM%S, & + HPROGRAM,ILU,ILUOUT) +! +!------------------------------------------------------------------------------- +! +!* 5. Albedo, emissivity and temperature fields on the mix (open sea + sea ice) +! ----------------------------------------------------------------- +! +ALLOCATE(SM%S%XEMIS (ILU)) +SM%S%XEMIS = 0.0 +! + CALL UPDATE_RAD_SEA(SM%S%CSEA_ALB,SM%S%XSST,PZENITH,XTTS,SM%S%XEMIS,SM%S%XDIR_ALB,& + SM%S%XSCA_ALB,PDIR_ALB,PSCA_ALB,PEMIS,PTSRAD, & + SM%S%LHANDLE_SIC,SM%S%XTICE,SM%S%XSIC,SM%S%XICE_ALB ) +! +IF (SM%S%LHANDLE_SIC) THEN + PTSURF(:) = SM%S%XSST(:) * ( 1 - SM%S%XSIC(:)) + SM%S%XTICE(:) * SM%S%XSIC(:) +ELSE + PTSURF(:) = SM%S%XSST(:) +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 6. SBL air fields: +! -------------- +! + CALL READ_SEAFLUX_SBL_n(DTCO, SM%S, SM%SSB, U, & + HPROGRAM) +! +!------------------------------------------------------------------------------- +! +!* 7. Chemistry /dust +! --------- +! + CALL INIT_CHEMICAL_n(ILUOUT, KSV, HSV, SM%CHS%SVS, & + SM%CHS%CCH_NAMES, SM%CHS%CAER_NAMES, & + HDSTNAMES=SM%CHS%CDSTNAMES, HSLTNAMES=SM%CHS%CSLTNAMES ) +! +!* deposition scheme +! +IF (SM%CHS%SVS%NBEQ>0 .AND. SM%CHS%CCH_DRY_DEP=='WES89') THEN + ALLOCATE(SM%CHS%XDEP(ILU,SM%CHS%SVS%NBEQ)) +ELSE + ALLOCATE(SM%CHS%XDEP(0,0)) +END IF +! +!------------------------------------------------------------------------------- +! +!* 8. diagnostics initialization +! -------------------------- +! +IF(.NOT.(SM%S%LHANDLE_SIC.OR.LCPL_SEAICE))THEN + SM%DGSI%LDIAG_SEAICE=.FALSE. +ENDIF +! + CALL DIAG_SEAFLUX_INIT_n(& + SM%DGO, SM%DGS, SM%DGSI, DGU, SM%S, & + HPROGRAM,ILU,KSW) +! +!------------------------------------------------------------------------------- +! +! End of IO +! + CALL END_IO_SURF_n(HPROGRAM) +IF (LHOOK) CALL DR_HOOK('INIT_SEAFLUX_N',1,ZHOOK_HANDLE) +! +! +END SUBROUTINE INIT_SEAFLUX_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/modd_prep_seaflux.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/modd_prep_seaflux.F90 new file mode 100644 index 0000000000000000000000000000000000000000..9b034aea44417479d0b9acab8451416043729f9b --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/modd_prep_seaflux.F90 @@ -0,0 +1,57 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ################ + MODULE MODD_PREP_SEAFLUX +! ################ +! +!!**** *MODD_PREP_SEAFLUX - declaration for field interpolations +!! +!! PURPOSE +!! ------- +! Declaration of surface parameters +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! S.Malardel *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/03 +!! Modified 09/2013 : S. Senesi : introduce variables for sea-ice model +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +SAVE +!-------------------------------------------------------------------------- +! +CHARACTER(LEN=28) :: CFILE_SEAFLX ! input file name +CHARACTER(LEN=6) :: CTYPE_SEAFLX ! input file type +CHARACTER(LEN=28) :: CFILEWAVE_SEAFLX ! input file name wave parameters +CHARACTER(LEN=6) :: CTYPEWAVE ! file type for wave parameters +CHARACTER(LEN=28) :: CFILEPGD_SEAFLX ! input file name +CHARACTER(LEN=6) :: CTYPEPGD ! input file type +! +REAL :: XSST_UNIF ! uniform prescribed SST +REAL :: XSSS_UNIF ! uniform prescribed SSS +REAL :: XSIC_UNIF ! uniform prescribed Seaice cover +! +!-------------------------------------------------------------------------- +! +END MODULE MODD_PREP_SEAFLUX + + diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/modd_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/modd_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..e91b7404cb4fc1ab4b4ae115ecf1607e8533d261 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/modd_seafluxn.F90 @@ -0,0 +1,250 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ################# + MODULE MODD_SEAFLUX_n +! ################# +! +!!**** *MODD_SEAFLUX_n - declaration of surface parameters for an inland water surface +!! +!! PURPOSE +!! ------- +! Declaration of surface parameters +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! S. Senesi 01/2014 adapt to fractional seaice, and to seaice scheme +!! S. Belamari 03/2014 Include NZ0 +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!! Modified 11/2014 : J. Pianezze ! add surface pressure, evap-rain and charnock coefficient +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_TYPE_DATE_SURF +! +USE MODD_TYPES_GLT, ONLY : T_GLT +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE + +TYPE SEAFLUX_t +! +! General surface: +! + REAL, POINTER, DIMENSION(:) :: XZS ! orography + REAL, POINTER, DIMENSION(:,:) :: XCOVER ! fraction of each ecosystem (-) + LOGICAL, POINTER, DIMENSION(:):: LCOVER ! GCOVER(i)=T --> ith cover field is not 0. + LOGICAL :: LSBL ! T: SBL scheme between sea and atm. forcing level +! ! F: no atmospheric layers below forcing level + LOGICAL :: LHANDLE_SIC ! T: we do weight seaice and open sea fluxes + CHARACTER(LEN=6) :: CSEAICE_SCHEME! Name of the seaice scheme + REAL, POINTER, DIMENSION(:) :: XSEABATHY ! bathymetry +! + LOGICAL :: LINTERPOL_SST ! Interpolation of monthly SST + CHARACTER(LEN=6) :: CINTERPOL_SST ! Interpolation method of monthly SST + LOGICAL :: LINTERPOL_SSS ! Interpolation of monthly SSS + CHARACTER(LEN=6) :: CINTERPOL_SSS ! Interpolation method of monthly SSS + LOGICAL :: LINTERPOL_SIC ! Interpolation of monthly SIC + CHARACTER(LEN=6) :: CINTERPOL_SIC ! Interpolation method of monthly SIC + LOGICAL :: LINTERPOL_SIT ! Interpolation of monthly SIT + CHARACTER(LEN=6) :: CINTERPOL_SIT ! Interpolation method of monthly SIT + REAL :: XFREEZING_SST ! Value marking frozen sea in SST data + REAL :: XSIC_EFOLDING_TIME ! For damping of SIC (days) + REAL :: XSIT_EFOLDING_TIME ! For damping of SIT (days) + REAL :: XSEAICE_TSTEP ! Sea ice model time step + REAL :: XCD_ICE_CST ! Turbulent exchange coefficient for seaice + REAL :: XSI_FLX_DRV ! Derivative of fluxes on seaice w.r.t to the temperature (W m-2 K-1) + +! +! Type of formulation for the fluxes +! + CHARACTER(LEN=6) :: CSEA_FLUX ! type of flux computation + CHARACTER(LEN=4) :: CSEA_ALB ! type of albedo + LOGICAL :: LPWG ! flag for gust + LOGICAL :: LPRECIP ! flag for precip correction + LOGICAL :: LPWEBB ! flag for Webb correction + INTEGER :: NZ0 ! set to 0,1 or 2 according to Z0 formulation + ! 0= ARPEGE / 1= Smith (1988) / 2= Direct + INTEGER :: NGRVWAVES ! set to 0,1 or 2 according to the + ! gravity waves model used in coare30_flux + LOGICAL :: LWAVEWIND ! wave parameters computed from wind only + REAL :: XICHCE ! CE coef calculation for ECUME + LOGICAL :: LPERTFLUX ! flag for stochastic flux perturbation +! +! Sea/Ocean: +! + REAL, POINTER, DIMENSION(:) :: XSST ! sea surface temperature + REAL, POINTER, DIMENSION(:) :: XSSS ! sea surface salinity + REAL, POINTER, DIMENSION(:) :: XHS ! significant wave height + REAL, POINTER, DIMENSION(:) :: XTP ! wave peak period + REAL, POINTER, DIMENSION(:) :: XTICE ! sea ice temperature + REAL, POINTER, DIMENSION(:) :: XSIC ! sea ice concentration ( constraint for seaice scheme ) + REAL, POINTER, DIMENSION(:) :: XSST_INI! initial sea surface temperature + REAL, POINTER, DIMENSION(:) :: XZ0 ! roughness length + REAL, POINTER, DIMENSION(:) :: XZ0H ! roughness length for heat + REAL, POINTER, DIMENSION(:) :: XEMIS ! emissivity + REAL, POINTER, DIMENSION(:) :: XDIR_ALB! direct albedo + REAL, POINTER, DIMENSION(:) :: XSCA_ALB! diffuse albedo + REAL, POINTER, DIMENSION(:) :: XICE_ALB! sea-ice albedo from seaice model (ESM or embedded) + REAL, POINTER, DIMENSION(:) :: XUMER ! U component of sea current (for ESM coupling) + REAL, POINTER, DIMENSION(:) :: XVMER ! V component of sea current (for ESM coupling) +! + REAL, POINTER, DIMENSION(:,:) :: XSST_MTH! monthly sea surface temperature (precedent, current and next) + REAL, POINTER, DIMENSION(:,:) :: XSSS_MTH! monthly sea surface salinity (precedent, current and next) + REAL, POINTER, DIMENSION(:,:) :: XSIC_MTH! monthly sea ice cover (precedent, current and next) + REAL, POINTER, DIMENSION(:,:) :: XSIT_MTH! monthly sea ice thickness (precedent, current and next) + REAL, POINTER, DIMENSION(:) :: XFSIC ! nudging (or forcing) sea ice cover + REAL, POINTER, DIMENSION(:) :: XFSIT ! nudging sea ice thickness +! + REAL, POINTER, DIMENSION(:) :: XCHARN ! Charnock coefficient (for ESM coupling) +! + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_WIND ! 10m wind speed for ESM coupling + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_FWSU ! zonal wind stress for ESM coupling + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_FWSV ! meridian wind stress for ESM coupling + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_SNET ! Solar net heat flux + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_HEAT ! Non solar net heat flux + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_EVAP ! Evaporation for ESM coupling + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_RAIN ! Rainfall for ESM coupling + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_EVPR ! Evaporatrion - Rainfall for ESM coupling + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_SNOW ! Snowfall for ESM coupling + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_FWSM ! wind stress for ESM coupling + REAL, POINTER, DIMENSION(:) :: XCPL_SEA_PRES ! Surface pressure for ESM coupling +! + REAL, POINTER, DIMENSION(:) :: XCPL_SEAICE_SNET ! Solar net heat flux for ESM coupling + REAL, POINTER, DIMENSION(:) :: XCPL_SEAICE_HEAT ! Non solar net heat flux + REAL, POINTER, DIMENSION(:) :: XCPL_SEAICE_EVAP ! Ice sublimation for ESM coupling +! + REAL, POINTER, DIMENSION(:) :: XPERTFLUX ! Stochastic flux perturbation pattern +! +! Sea-ice : +! + TYPE(T_GLT) :: TGLT ! Sea-ice state , diagnostics and auxilliaries + ! for the case of embedded Gelato Seaice model +! +! Date: +! + TYPE (DATE_TIME) :: TTIME ! current date and time + TYPE (DATE_TIME) :: TZTIME + LOGICAL :: LTZTIME_DONE + INTEGER :: JSX +! +! Time-step: +! + REAL :: XTSTEP ! time step +! + REAL :: XOUT_TSTEP ! output writing time step +! +! +! +END TYPE SEAFLUX_t + + + +CONTAINS + +! + + + + +SUBROUTINE SEAFLUX_INIT(YSEAFLUX) +TYPE(SEAFLUX_t), INTENT(INOUT) :: YSEAFLUX +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK("MODD_SEAFLUX_N:SEAFLUX_INIT",0,ZHOOK_HANDLE) + NULLIFY(YSEAFLUX%XZS) + NULLIFY(YSEAFLUX%XCOVER) + NULLIFY(YSEAFLUX%LCOVER) + NULLIFY(YSEAFLUX%XSEABATHY) + NULLIFY(YSEAFLUX%XSST) + NULLIFY(YSEAFLUX%XSSS) + NULLIFY(YSEAFLUX%XSIC) + NULLIFY(YSEAFLUX%XHS) + NULLIFY(YSEAFLUX%XTP) + NULLIFY(YSEAFLUX%XTICE) + NULLIFY(YSEAFLUX%XSST_INI) + NULLIFY(YSEAFLUX%XZ0) + NULLIFY(YSEAFLUX%XZ0H) + NULLIFY(YSEAFLUX%XEMIS) + NULLIFY(YSEAFLUX%XDIR_ALB) + NULLIFY(YSEAFLUX%XSCA_ALB) + NULLIFY(YSEAFLUX%XICE_ALB) + NULLIFY(YSEAFLUX%XUMER) + NULLIFY(YSEAFLUX%XVMER) + NULLIFY(YSEAFLUX%XCHARN) + NULLIFY(YSEAFLUX%XSST_MTH) + NULLIFY(YSEAFLUX%XSSS_MTH) + NULLIFY(YSEAFLUX%XSIC_MTH) + NULLIFY(YSEAFLUX%XSIT_MTH) + NULLIFY(YSEAFLUX%XFSIC) + NULLIFY(YSEAFLUX%XFSIT) + NULLIFY(YSEAFLUX%XCPL_SEA_WIND) + NULLIFY(YSEAFLUX%XCPL_SEA_FWSU) + NULLIFY(YSEAFLUX%XCPL_SEA_FWSV) + NULLIFY(YSEAFLUX%XCPL_SEA_SNET) + NULLIFY(YSEAFLUX%XCPL_SEA_HEAT) + NULLIFY(YSEAFLUX%XCPL_SEA_EVAP) + NULLIFY(YSEAFLUX%XCPL_SEA_RAIN) + NULLIFY(YSEAFLUX%XCPL_SEA_EVPR) + NULLIFY(YSEAFLUX%XCPL_SEA_SNOW) + NULLIFY(YSEAFLUX%XCPL_SEA_FWSM) + NULLIFY(YSEAFLUX%XCPL_SEA_PRES) + NULLIFY(YSEAFLUX%XCPL_SEAICE_SNET) + NULLIFY(YSEAFLUX%XCPL_SEAICE_HEAT) + NULLIFY(YSEAFLUX%XCPL_SEAICE_EVAP) + NULLIFY(YSEAFLUX%XPERTFLUX) +YSEAFLUX%LSBL=.FALSE. +YSEAFLUX%LHANDLE_SIC=.FALSE. +YSEAFLUX%CSEAICE_SCHEME='NONE ' +YSEAFLUX%LINTERPOL_SST=.FALSE. +YSEAFLUX%CINTERPOL_SST=' ' +YSEAFLUX%LINTERPOL_SSS=.FALSE. +YSEAFLUX%CINTERPOL_SSS=' ' +YSEAFLUX%LINTERPOL_SIC=.FALSE. +YSEAFLUX%CINTERPOL_SIC=' ' +YSEAFLUX%LINTERPOL_SIT=.FALSE. +YSEAFLUX%CINTERPOL_SIT=' ' +YSEAFLUX%XFREEZING_SST=-1.8 +YSEAFLUX%XSIC_EFOLDING_TIME=0. ! means : no damping +YSEAFLUX%XSIT_EFOLDING_TIME=0. ! means : no damping +YSEAFLUX%XSEAICE_TSTEP=XUNDEF +YSEAFLUX%XCD_ICE_CST=0. +YSEAFLUX%XSI_FLX_DRV=-20. +YSEAFLUX%CSEA_FLUX=' ' +YSEAFLUX%CSEA_ALB=' ' +YSEAFLUX%LPWG=.FALSE. +YSEAFLUX%LPRECIP=.FALSE. +YSEAFLUX%LPWEBB=.FALSE. +YSEAFLUX%NZ0=0 +YSEAFLUX%NGRVWAVES=0 +YSEAFLUX%LWAVEWIND=.TRUE. +YSEAFLUX%XICHCE=0. +YSEAFLUX%LPERTFLUX=.FALSE. +YSEAFLUX%JSX=0 +YSEAFLUX%LTZTIME_DONE = .FALSE. +YSEAFLUX%XTSTEP=0. +YSEAFLUX%XOUT_TSTEP=0. +IF (LHOOK) CALL DR_HOOK("MODD_SEAFLUX_N:SEAFLUX_INIT",1,ZHOOK_HANDLE) +END SUBROUTINE SEAFLUX_INIT + + +END MODULE MODD_SEAFLUX_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/modd_sfx_oasis.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/modd_sfx_oasis.F90 new file mode 100755 index 0000000000000000000000000000000000000000..71fc9d50c9a9953da06a7adefe4da31b16a4a9b8 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/modd_sfx_oasis.F90 @@ -0,0 +1,152 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +!############### +MODULE MODD_SFX_OASIS +!############### +! +!!**** *MODD_SFX_OASIS - declaration of variable for SFX-OASIS coupling +!! +!! PURPOSE +!! ------- +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/13 +!! Modified 11/2014 : J. Pianezze - add wave coupling and creation of OASIS grids +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +! * Surfex - Oasis coupling general key : +! +!------------------------------------------------------------------------------- +! +LOGICAL :: LOASIS = .FALSE. ! To use oasis coupler or not +LOGICAL :: LOASIS_GRID = .FALSE. ! To define oasis grids, areas and masks during simulation +REAL :: XRUNTIME = 0.0 ! Total simulated time in oasis namcouple (s) +! +!------------------------------------------------------------------------------- +! +! * Land surface variables for Surfex - Oasis coupling +! +!------------------------------------------------------------------------------- +! +LOGICAL :: LCPL_LAND = .FALSE. ! Fields to/from surfex land area +LOGICAL :: LCPL_CALVING = .FALSE. ! Calving flux from surfex land area +LOGICAL :: LCPL_GW = .FALSE. ! Fields to/from surfex land area to/from groundwater scheme +LOGICAL :: LCPL_FLOOD = .FALSE. ! Fields to/from surfex land area to/from floodplains scheme +! +! Output variables +! +INTEGER :: NRUNOFF_ID ! Surface runoff id +INTEGER :: NDRAIN_ID ! Drainage id +INTEGER :: NCALVING_ID ! Calving flux id +INTEGER :: NRECHARGE_ID ! Groundwater recharge id +INTEGER :: NSRCFLOOD_ID ! Floodplains freshwater flux id +! +! Input variables +! +INTEGER :: NWTD_ID ! water table depth id +INTEGER :: NFWTD_ID ! grid-cell fraction of water table rise id +INTEGER :: NFFLOOD_ID ! Floodplains fraction id +INTEGER :: NPIFLOOD_ID ! Potential flood infiltration id +! +!------------------------------------------------------------------------------- +! +! * Lake variables for Surfex - Oasis coupling +! +!------------------------------------------------------------------------------- +! +LOGICAL :: LCPL_LAKE = .FALSE. ! Fields to/from surfex lake area +! +! Output variables +! +INTEGER :: NLAKE_EVAP_ID ! Evaporation id +INTEGER :: NLAKE_RAIN_ID ! Rainfall id +INTEGER :: NLAKE_SNOW_ID ! Snowfall id +INTEGER :: NLAKE_WATF_ID ! Freshwater id +! +!------------------------------------------------------------------------------- +! +! * Sea variables for Surfex - Oasis coupling +! +!------------------------------------------------------------------------------- +! +LOGICAL :: LCPL_SEA = .FALSE. ! Fields to/from surfex sea/water area +LOGICAL :: LCPL_SEAICE = .FALSE. ! Fields to/from surfex sea-ice area (e.g. GELATO 3D, ...) +! +! Sea Output variables +! +INTEGER :: NSEA_FWSU_ID ! zonal wind stress id +INTEGER :: NSEA_FWSV_ID ! meridian wind stress id +INTEGER :: NSEA_HEAT_ID ! Non solar net heat flux id +INTEGER :: NSEA_SNET_ID ! Solar net heat flux id +INTEGER :: NSEA_WIND_ID ! 10m wind speed id +INTEGER :: NSEA_FWSM_ID ! wind stress id +INTEGER :: NSEA_EVAP_ID ! Evaporation id +INTEGER :: NSEA_RAIN_ID ! Rainfall id +INTEGER :: NSEA_SNOW_ID ! Snowfall id +INTEGER :: NSEA_EVPR_ID ! Evap.-Precip. id +INTEGER :: NSEA_WATF_ID ! Freshwater id +INTEGER :: NSEA_PRES_ID ! Surface pressure id +! +! Sea-ice Output variables +! +INTEGER :: NSEAICE_HEAT_ID ! Sea-ice non solar net heat flux id +INTEGER :: NSEAICE_SNET_ID ! Sea-ice solar net heat flux id +INTEGER :: NSEAICE_EVAP_ID ! Sea-ice sublimation id +! +! Sea Input variables +! +INTEGER :: NSEA_SST_ID ! Sea surface temperature id +INTEGER :: NSEA_UCU_ID ! Sea u-current stress id +INTEGER :: NSEA_VCU_ID ! Sea v-current stress id +! +! Sea-ice Input variables +! +INTEGER :: NSEAICE_SIT_ID ! Sea-ice Temperature id +INTEGER :: NSEAICE_CVR_ID ! Sea-ice cover id +INTEGER :: NSEAICE_ALB_ID ! Sea-ice albedo id +! +!------------------------------------------------------------------------------- +! +! * Wave variables for Surfex - Oasis coupling +! +!------------------------------------------------------------------------------- +! +LOGICAL :: LCPL_WAVE = .FALSE. ! Fields to/from surfex wave area +! +! Wave Output variables +! +INTEGER :: NWAVE_U10_ID ! 10m u-wind speed id +INTEGER :: NWAVE_V10_ID ! 10m v-wind speed id +! +! Wave Input variables +! +INTEGER :: NWAVE_CHA_ID ! Charnock coefficient id +INTEGER :: NWAVE_UCU_ID ! Wave u-current velocity id +INTEGER :: NWAVE_VCU_ID ! Wave v-current velocity id +INTEGER :: NWAVE_HS_ID ! Significant wave height id +INTEGER :: NWAVE_TP_ID ! Peak period id +! +!------------------------------------------------------------------------------- +! +END MODULE MODD_SFX_OASIS diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/mode_read_netcdf_mercator.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/mode_read_netcdf_mercator.F90 new file mode 100644 index 0000000000000000000000000000000000000000..5fb4c686ff587c7e29476013c8a9175d74e8f250 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/mode_read_netcdf_mercator.F90 @@ -0,0 +1,1455 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +!! +!! Modified 09/2013 : S. Senesi : adapt READ_NETCDF_SST to read 2D fields other than SST +!! +MODULE MODE_READ_NETCDF_MERCATOR +!!!============================================================================= +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!! ! + correction of 2 bugs +!------------------------------------------------------------------------------- +! +! +USE MODI_ABOR1_SFX +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +CONTAINS +!------------------------------------------------------------------- +!------------------------------------------------------------------- +! #################### + SUBROUTINE HANDLE_ERR_MER(status,line) +! #################### +IMPLICIT NONE +INTEGER, INTENT(IN) :: status + CHARACTER(LEN=80), INTENT(IN) :: line +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +include 'netcdf.inc' +! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:HANDLE_ERR_MER',0,ZHOOK_HANDLE) +IF (status /= NF_NOERR) THEN + CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: HANDLE_ERR_MER') +END IF +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:HANDLE_ERR_MER',1,ZHOOK_HANDLE) +END SUBROUTINE HANDLE_ERR_MER +!------------------------------------------------------------------- +!------------------------------------------------------------------- +! #################### + SUBROUTINE GET1DCDF(KCDF_ID,IDVAR,PMISSVALUE,PVALU1D) +! #################### +! +IMPLICIT NONE +! +INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant +INTEGER,INTENT(IN) :: IDVAR !variable to read identifiant +REAL, INTENT(OUT) :: PMISSVALUE !undefined value +REAL,DIMENSION(:),INTENT(OUT) :: PVALU1D !value array +! +integer :: status +character(len=80) :: HACTION +integer,save :: NDIMS=1 +integer :: KVARTYPE +integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM +integer :: JLOOP +integer :: NGATTS +character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME +REAL,DIMENSION(:),ALLOCATABLE :: ZVALU1D !value array +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +include 'netcdf.inc' +! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET1DCDF',0,ZHOOK_HANDLE) +PMISSVALUE=-9999.9 +ALLOCATE(NVARDIMID (NDIMS)) +ALLOCATE(NVARDIMLEN(NDIMS)) +ALLOCATE(NVARDIMNAM(NDIMS)) +NVARDIMID (:)=0 +NVARDIMLEN(:)=0 +NVARDIMNAM(:)=' ' +! +HACTION='get variable type' +status=nf_inq_vartype(KCDF_ID,IDVAR,KVARTYPE) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'variable type = ',KVARTYPE +! +HACTION='get variable dimensions name' +status=nf_inq_dimname(KCDF_ID,IDVAR,NVARDIMNAM(NDIMS)) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +! +HACTION='get variable dimensions length' +status=nf_inq_dimlen(KCDF_ID,IDVAR,NVARDIMLEN(NDIMS)) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'variable dimension ',NDIMS,' named ',NVARDIMNAM(NDIMS),& +! &'has a length of',NVARDIMLEN(NDIMS) +!! +HACTION='get attributs' +status=nf_inq_varnatts(KCDF_ID,IDVAR,NGATTS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'number of attributes = ',NGATTS +allocate(hname(1:NGATTS)) +! +ALLOCATE(ZVALU1D(1:NVARDIMLEN(NDIMS))) +ZVALU1D=0. +! +IF (KVARTYPE>=5) then + HACTION='get variable values (1D)' + status=nf_get_var_double(KCDF_ID,IDVAR,ZVALU1D(:)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +ENDIF +! +PVALU1D(:)=ZVALU1D(:) +! +IF (ALLOCATED(ZVALU1D )) DEALLOCATE(ZVALU1D) +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET1DCDF',1,ZHOOK_HANDLE) +! +END SUBROUTINE GET1DCDF +!------------------------------------------------------------------- +!------------------------------------------------------------------- +! #################### + SUBROUTINE GET2DCDF(KCDF_ID,IDVAR,PDIM1,HDIM1NAME,PDIM2,HDIM2NAME,& + PMISSVALUE,PVALU2D) +! #################### +USE MODD_SURF_PAR, ONLY : XUNDEF +! +IMPLICIT NONE +! +INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant +INTEGER,INTENT(IN) :: IDVAR !variable to read identifiant +REAL,DIMENSION(:),INTENT(OUT) :: PDIM1,PDIM2 !dimensions for PVALU2D array + CHARACTER(len=80),INTENT(OUT) :: HDIM1NAME,HDIM2NAME !dimensions names +REAL, INTENT(OUT) :: PMISSVALUE +REAL,DIMENSION(:,:),INTENT(OUT) :: PVALU2D !value array +! +integer :: status +character(len=80) :: HACTION +integer,save :: NDIMS=2 +integer :: KVARTYPE +integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM +integer :: JLOOP2, JLOOP, J1, J2 +integer :: NGATTS +character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME +real :: ZMISS1,ZMISS2 +real :: ZSCFA, ZOFFS +REAL,DIMENSION(:,:),ALLOCATABLE :: ZVALU2D !value array +INTEGER,DIMENSION(:,:),ALLOCATABLE :: IVALU2D +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +include 'netcdf.inc' +! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET2DCDF',0,ZHOOK_HANDLE) +PMISSVALUE=-9999.9 +ALLOCATE(NVARDIMID (NDIMS)) +ALLOCATE(NVARDIMLEN(NDIMS)) +ALLOCATE(NVARDIMNAM(NDIMS)) +NVARDIMID (:)=0 +NVARDIMLEN(:)=0 +NVARDIMNAM(:)=' ' +! +HACTION='get variable type' +status=nf_inq_vartype(KCDF_ID,IDVAR,KVARTYPE) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'variable type = ',KVARTYPE +! +HACTION='get variable dimensions identifiant' +status=nf_inq_vardimid(KCDF_ID,IDVAR,NVARDIMID) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +! +HACTION='get attributs' +status=nf_inq_varnatts(KCDF_ID,IDVAR,NGATTS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'number of attributes = ',NGATTS +allocate(hname(1:NGATTS)) +! +ZSCFA=1. +ZOFFS=0. +DO JLOOP=1,NGATTS + status=nf_inq_attname(KCDF_ID,IDVAR,JLOOP,hname(JLOOP)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'attributes names = ', hname(JLOOP) + if (TRIM(hname(JLOOP))=='missing_value') then + !write(0,*) 'missing value search ' + HACTION='get missing value' + status=nf_get_att_double(KCDF_ID,IDVAR,"missing_value",PMISSVALUE) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'missing value = ',PMISSVALUE + else + if (TRIM(hname(JLOOP))=='_FillValue') then + !write(0,*) 'missing value found ' + HACTION='get _FillValue' + status=nf_get_att_double(KCDF_ID,IDVAR,"_FillValue",PMISSVALUE) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'missing value = ',PMISSVALUE + endif + endif + if (TRIM(hname(JLOOP))=='scale_factor') then + !write(0,*) 'missing value found ' + HACTION='get scale factor' + status=nf_get_att_double(KCDF_ID,IDVAR,"scale_factor",ZSCFA) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'missing value = ',PMISSVALUE + endif + if (TRIM(hname(JLOOP))=='add_offset') then + !write(0,*) 'missing value found ' + HACTION='get offset' + status=nf_get_att_double(KCDF_ID,IDVAR,"add_offset",ZOFFS) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'missing value = ',PMISSVALUE + endif +ENDDO +! +! +DO JLOOP2=1,NDIMS + HACTION='get variable dimensions name' + status=nf_inq_dimname(KCDF_ID,NVARDIMID(JLOOP2),NVARDIMNAM(JLOOP2)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + HACTION='get variable dimensions length' + status=nf_inq_dimlen(KCDF_ID,NVARDIMID(JLOOP2),NVARDIMLEN(JLOOP2)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'variable dimension ',JLOOP2,' named ',NVARDIMNAM(JLOOP2),& + ! &'has a length of',NVARDIMLEN(JLOOP2) +ENDDO +! +IF (KVARTYPE>=5) then + ALLOCATE(ZVALU2D(1:NVARDIMLEN(1),1:NVARDIMLEN(2))) + ZVALU2D=0. + HACTION='get variable values (2D)' + status=nf_get_var_double(KCDF_ID,IDVAR,ZVALU2D(:,:)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +ELSE + ALLOCATE(IVALU2D(1:NVARDIMLEN(1),1:NVARDIMLEN(2))) + IVALU2D=0. + HACTION='get variable values (2D)' + status=nf_get_var_int(KCDF_ID,IDVAR,IVALU2D(:,:)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +ENDIF +PVALU2D(:,:)=XUNDEF +DO J1=1,NVARDIMLEN(1) + DO J2=1,NVARDIMLEN(2) + IF (KVARTYPE>=5) THEN + IF (ZVALU2D(J1,J2)/=PMISSVALUE) PVALU2D(J1,J2)=ZVALU2D(J1,J2)*ZSCFA+ZOFFS + ELSE + IF (ZVALU2D(J1,J2)/=PMISSVALUE) PVALU2D(J1,J2)=IVALU2D(J1,J2)*ZSCFA+ZOFFS + ENDIF + ENDDO +ENDDO +! + CALL GET1DCDF(KCDF_ID,NVARDIMID(1),ZMISS1,PDIM1) + CALL GET1DCDF(KCDF_ID,NVARDIMID(2),ZMISS2,PDIM2) +HDIM1NAME=NVARDIMNAM(1) +HDIM2NAME=NVARDIMNAM(2) +IF (ALLOCATED(ZVALU2D )) DEALLOCATE(ZVALU2D) +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET2DCDF',1,ZHOOK_HANDLE) +! +END SUBROUTINE GET2DCDF +!------------------------------------------------------------------- +!------------------------------------------------------------------- +! #################### + SUBROUTINE GET3DCDF(KCDF_ID,IDVAR,PDIM1,HDIM1NAME,PDIM2,HDIM2NAME,& + PDIM3,HDIM3NAME,PMISSVALUE,PVALU3D) +! #################### +USE MODD_SURF_PAR, ONLY : XUNDEF +! +IMPLICIT NONE +! +INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant +INTEGER,INTENT(IN) :: IDVAR !variable to read identifiant +REAL,DIMENSION(:),INTENT(OUT) :: PDIM1,PDIM2,PDIM3 !dimensions for PVALU2D array + CHARACTER(len=80),INTENT(OUT) :: HDIM1NAME,HDIM2NAME,HDIM3NAME !dimensions names +REAL, INTENT(OUT) :: PMISSVALUE +REAL,DIMENSION(:,:,:),INTENT(OUT) :: PVALU3D !value array +! +integer :: status +character(len=80) :: HACTION +integer,save :: NDIMS=3 +integer :: KVARTYPE +integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM +integer :: JLOOP2, JLOOP +integer :: J1,J2,J3 +integer :: NGATTS +character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME +real :: ZMISS1,ZMISS2,ZMISS3 +real :: ZSCFA, ZOFFS +REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZVALU3D !value array +INTEGER,DIMENSION(:,:,:),ALLOCATABLE :: IVALU3D +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +include 'netcdf.inc' +! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET3DCDF',0,ZHOOK_HANDLE) +PMISSVALUE=-9999.9 +ALLOCATE(NVARDIMID (NDIMS)) +ALLOCATE(NVARDIMLEN(NDIMS)) +ALLOCATE(NVARDIMNAM(NDIMS)) +NVARDIMID (:)=0 +NVARDIMLEN(:)=0 +NVARDIMNAM(:)=' ' +! +HACTION='get variable type' +status=nf_inq_vartype(KCDF_ID,IDVAR,KVARTYPE) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'variable type = ',KVARTYPE +! +HACTION='get variable dimensions identifiant' +status=nf_inq_vardimid(KCDF_ID,IDVAR,NVARDIMID) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'variable dimension identifiant ',NVARDIMID +! +HACTION='get attributs' +status=nf_inq_varnatts(KCDF_ID,IDVAR,NGATTS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'number of attributes = ',NGATTS +allocate(hname(1:NGATTS)) +! +ZSCFA=1. +ZOFFS=0. +DO JLOOP=1,NGATTS + status=nf_inq_attname(KCDF_ID,IDVAR,JLOOP,hname(JLOOP)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'attributes names = ', hname(JLOOP) + if (TRIM(hname(JLOOP))=='missing_value') then + !write(0,*) 'missing value found ' + HACTION='get missing value' + status=nf_get_att_double(KCDF_ID,IDVAR,"missing_value",PMISSVALUE) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'missing value = ',PMISSVALUE + else + if (TRIM(hname(JLOOP))=='_FillValue') then + !write(0,*) 'missing value found ' + HACTION='get _FillValue' + status=nf_get_att_double(KCDF_ID,IDVAR,"_FillValue",PMISSVALUE) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'missing value = ',PMISSVALUE + endif + endif + if (TRIM(hname(JLOOP))=='scale_factor') then + !write(0,*) 'missing value found ' + HACTION='get scale factor' + status=nf_get_att_double(KCDF_ID,IDVAR,"scale_factor",ZSCFA) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'missing value = ',PMISSVALUE + endif + if (TRIM(hname(JLOOP))=='add_offset') then + !write(0,*) 'missing value found ' + HACTION='get offset' + status=nf_get_att_double(KCDF_ID,IDVAR,"add_offset",ZOFFS) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'missing value = ',PMISSVALUE + endif +ENDDO +! +! +DO JLOOP2=1,NDIMS + HACTION='get variable dimensions name' + status=nf_inq_dimname(KCDF_ID,NVARDIMID(JLOOP2),NVARDIMNAM(JLOOP2)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + HACTION='get variable dimensions length' + status=nf_inq_dimlen(KCDF_ID,NVARDIMID(JLOOP2),NVARDIMLEN(JLOOP2)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'variable dimension ',JLOOP2,' named ',NVARDIMNAM(JLOOP2),& + ! &'has a length of',NVARDIMLEN(JLOOP2) +ENDDO +! +IF (KVARTYPE>=5) then + ALLOCATE(ZVALU3D(1:NVARDIMLEN(1),1:NVARDIMLEN(2),1:NVARDIMLEN(3))) + ZVALU3D=0. + HACTION='get variable values (3D)' + status=nf_get_var_double(KCDF_ID,IDVAR,ZVALU3D(:,:,:)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +ELSE + ALLOCATE(IVALU3D(1:NVARDIMLEN(1),1:NVARDIMLEN(2),1:NVARDIMLEN(3))) + IVALU3D=0. + HACTION='get variable values (3D)' + status=nf_get_var_int(KCDF_ID,IDVAR,IVALU3D(:,:,:)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +ENDIF +! +PVALU3D(:,:,:)=XUNDEF +DO J1=1,NVARDIMLEN(1) + DO J2=1,NVARDIMLEN(2) + DO J3=1,NVARDIMLEN(3) + IF (KVARTYPE>=5) THEN + IF (ZVALU3D(J1,J2,J3)/=PMISSVALUE) PVALU3D(J1,J2,J3)=ZVALU3D(J1,J2,J3)*ZSCFA+ZOFFS + ELSE + IF (IVALU3D(J1,J2,J3)/=PMISSVALUE) PVALU3D(J1,j2,J3)=IVALU3D(J1,J2,J3)*ZSCFA+ZOFFS + ENDIF + ENDDO + ENDDO +ENDDO +! + CALL GET1DCDF(KCDF_ID,NVARDIMID(1),ZMISS1,PDIM1) + CALL GET1DCDF(KCDF_ID,NVARDIMID(2),ZMISS2,PDIM2) + CALL GET1DCDF(KCDF_ID,NVARDIMID(3),ZMISS3,PDIM3) +HDIM1NAME=NVARDIMNAM(1) +HDIM2NAME=NVARDIMNAM(2) +HDIM3NAME=NVARDIMNAM(3) +IF (ALLOCATED(ZVALU3D )) DEALLOCATE(ZVALU3D) +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET3DCDF',1,ZHOOK_HANDLE) +! +END SUBROUTINE GET3DCDF +!-------------------------------------------------------------------- +!------------------------------------------------------------------- +!------------------------------------------------------------------------------ +!============================================================================== +! #################### + SUBROUTINE READ_DIM_CDF(HFILENAME,HNCVARNAME,KDIM) +! #################### +! +IMPLICIT NONE +! + CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. + CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file +INTEGER, INTENT(OUT):: KDIM ! value of dimension to get +! +integer :: status +integer :: kcdf_id +integer :: NBVARS +character(len=80) :: HACTION +character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME +integer ::JLOOP1,JLOOP +integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer ::NVARDIMS +integer,DIMENSION(2) ::NLEN2D +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +include 'netcdf.inc' +! +!* 1. Open the netcdf file +! -------------------- +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_DIM_CDF',0,ZHOOK_HANDLE) +HACTION='open netcdf' +status=NF_OPEN(HFILENAME,nf_nowrite,kcdf_id) +if (status/=NF_NOERR) then + CALL HANDLE_ERR_MER(status,HACTION) +!else +! write(0,*) 'netcdf file opened: ',HFILENAME +endif +! +!----------- +! +!* 2. get the number of variables in netcdf file +! ------------------------------------------ +HACTION='get number of variables' +status=NF_INQ_NVARS(kcdf_id,NBVARS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'nb vars', NBVARS +ALLOCATE(VARNAME(NBVARS)) +! +!----------- +! +!* 3. get the variables names in netcdf file +! -------------------------------------- +ID_VARTOGET1=0 +ID_VARTOGET2=0 +DO JLOOP1=1,NBVARS + HACTION='get variables names' + status=NF_INQ_VARNAME(kcdf_id,JLOOP1,VARNAME(JLOOP1)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'var',JLOOP1,' name: ',VARNAME(JLOOP1) + if (VARNAME(JLOOP1)==HNCVARNAME) then + !write(0,*) 'var',JLOOP1,' corresponding to variable required' + ID_VARTOGET1=JLOOP1 + endif + if (VARNAME(JLOOP1)/=HNCVARNAME) then + if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.& + (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then + !write(0,*) 'var',JLOOP1,VARNAME(JLOOP1),' could correspond to variable required ?' + !write(0,*) HNCVARNAME,' is variable required; only ',VARNAME(JLOOP1),' found' + ID_VARTOGET2=JLOOP1 + endif + endif +ENDDO +if (ID_VARTOGET1/=0) then + ID_VARTOGET=ID_VARTOGET1 +else + ID_VARTOGET=ID_VARTOGET2 +endif +if (ID_VARTOGET==0) then + HACTION='close netcdf' + status=nf_close(kcdf_id) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_DIM_CDF') +endif +!----------- +! +!* 4. get the total dimension of HNCVARNAME +! ------------------------------------- +! +! 4.1 get the variable dimensions number +! ----------------------------------- +! +HACTION='get variable dimensions number' +status=nf_inq_varndims(kcdf_id,ID_VARTOGET,NVARDIMS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'variable dimensions number = ',NVARDIMS +! +! 4.2 get the variable dimensions length +! ---------------------------------- +SELECT CASE (NVARDIMS) +!CAS 1D + CASE (1) + HACTION='get variable dimensions length' + status=nf_inq_dimlen(kcdf_id,ID_VARTOGET,KDIM) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +! +!CAS 2D + CASE (2) + KDIM=1 + DO JLOOP=1,NVARDIMS + HACTION='get variable dimensions length' + status=nf_inq_dimlen(kcdf_id,ID_VARTOGET,NLEN2D(JLOOP)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + KDIM=KDIM*NLEN2D(JLOOP) + ENDDO +END SELECT +!----------- +!* 10. Close the netcdf file +! --------------------- +HACTION='close netcdf' +status=nf_close(kcdf_id) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'OK: netcdf file closed: ',HFILENAME +! +!----------- +!* 11. Deallocate +! ---------- +IF (ALLOCATED(VARNAME )) DEALLOCATE(VARNAME) +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_DIM_CDF',1,ZHOOK_HANDLE) +! +END SUBROUTINE READ_DIM_CDF +!------------------------------------------------------------------- +!------------------------------------------------------------------- +! #################### + SUBROUTINE PREP_NETCDF_GRID(HFILENAME,HNCVARNAME) +! #################### +! +USE MODD_GRID_LATLONREGUL +USE MODD_SURF_PAR +! +IMPLICIT NONE +! + CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. + CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file +! +integer :: status +integer :: kcdf_id +integer :: NBVARS +character(len=80) :: HACTION +character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME +integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID +integer ::JLOOP1,JLOOP +integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer ::NVARDIMS +integer,DIMENSION(3) ::NDIMLEN +character(LEN=80),DIMENSION(3) :: NDIMNAM +integer :: IDIM +integer :: INLON +real :: ZZLAMISS,ZZLOMISS +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +include 'netcdf.inc' +! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:PREP_NETCDF_GRID',0,ZHOOK_HANDLE) +NINLAT =-NUNDEF +NINDEPTH=-NUNDEF +NILENGTH=-NUNDEF +! +XILAT1=XUNDEF +XILON1=XUNDEF +XILAT2=XUNDEF +XILON2=XUNDEF +!* 1. Open the netcdf file +! -------------------- +HACTION='open netcdf' +status=NF_OPEN(HFILENAME,nf_nowrite,kcdf_id) +if (status/=NF_NOERR) then + CALL HANDLE_ERR_MER(status,HACTION) +!else +! write(0,*) 'netcdf file opened: ',HFILENAME +endif +! +!----------- +! +!* 2. get the number of variables in netcdf file +! ------------------------------------------ +HACTION='get number of variables' +status=NF_INQ_NVARS(kcdf_id,NBVARS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'nb vars', NBVARS +ALLOCATE(VARNAME(NBVARS)) +! +!----------- +! +!* 3. get the variables names in netcdf file +! -------------------------------------- +ID_VARTOGET1=0 +ID_VARTOGET2=0 +DO JLOOP1=1,NBVARS + HACTION='get variables names' + status=NF_INQ_VARNAME(kcdf_id,JLOOP1,VARNAME(JLOOP1)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + if (VARNAME(JLOOP1)==HNCVARNAME) then + ID_VARTOGET1=JLOOP1 + endif + if (VARNAME(JLOOP1)/=HNCVARNAME) then + if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.& + (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then + !write(0,*) 'var',JLOOP1,VARNAME(JLOOP1),' could correspond to variable required ?' + !write(0,*) HNCVARNAME,' is variable required; only ',VARNAME(JLOOP1),' found' + ID_VARTOGET2=JLOOP1 + endif + endif +ENDDO +if (ID_VARTOGET1/=0) then + ID_VARTOGET=ID_VARTOGET1 +else + ID_VARTOGET=ID_VARTOGET2 +endif +if (ID_VARTOGET==0) then + HACTION='close netcdf' + status=nf_close(kcdf_id) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:PREP_NETCDF_GRID',1,ZHOOK_HANDLE) + RETURN +endif +NILENGTH=0 +!----------- +! +!* 4. get the total dimension of HNCVARNAME +! ------------------------------------- +! +! 4.1 get the variable dimensions number +! ----------------------------------- +! +HACTION='get variable dimensions number' +status=nf_inq_varndims(kcdf_id,ID_VARTOGET,NVARDIMS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'variable dimensions number = ',NVARDIMS +ALLOCATE(NVARDIMID(NVARDIMS)) +HACTION='get variable dimensions identifiant' +status=nf_inq_vardimid(kcdf_id,ID_VARTOGET,NVARDIMID) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +! +! 4.2 get the variable dimensions length +! ---------------------------------- +SELECT CASE (NVARDIMS) +!CAS 1D + CASE (1) + HACTION='get variable dimensions length' + status=nf_inq_dimlen(kcdf_id,ID_VARTOGET,IDIM) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +! +!CAS 2D,3D + CASE (2,3) + DO JLOOP=1,NVARDIMS + HACTION='get variable dimensions length' + status=nf_inq_dimlen(kcdf_id,NVARDIMID(JLOOP),NDIMLEN(JLOOP)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + HACTION='get variable dimensions names' + status=nf_inq_dimname(kcdf_id,NVARDIMID(JLOOP),NDIMNAM(JLOOP)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + if ((NDIMNAM(JLOOP)=='lat').OR.(NDIMNAM(JLOOP)=='latitude')) then + NINLAT=NDIMLEN(JLOOP) + if (.not.allocated(XILATARRAY)) allocate(XILATARRAY(NDIMLEN(JLOOP))) + if (.not.allocated(NINLON)) allocate(NINLON(NINLAT)) + CALL GET1DCDF(kcdf_id,NVARDIMID(JLOOP),ZZLAMISS,XILATARRAY(:)) + endif + if ((NDIMNAM(JLOOP)=='lon').OR.(NDIMNAM(JLOOP)=='longitude')) then + INLON=NDIMLEN(JLOOP) + if (.not.allocated(XILONARRAY)) allocate(XILONARRAY(NDIMLEN(JLOOP))) + CALL GET1DCDF(kcdf_id,NVARDIMID(JLOOP),ZZLOMISS,XILONARRAY(:)) + endif + if (NDIMNAM(JLOOP)=='depth') NINDEPTH=NDIMLEN(JLOOP) + ENDDO + NINLON(:)=INLON +END SELECT +!----------- +!* 10. Close the netcdf file +! --------------------- +HACTION='close netcdf' +status=nf_close(kcdf_id) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'OK: netcdf file closed: ',HFILENAME +! +!----------- +!GRID PARAM FOR HORIBL_SURF +DO JLOOP1=1,NINLAT + NILENGTH = NILENGTH + NINLON(JLOOP1) +ENDDO +XILAT1=XILATARRAY(1) +XILON1=XILONARRAY(1) +XILAT2=XILATARRAY(SIZE(XILATARRAY)) +XILON2=XILONARRAY(SIZE(XILONARRAY)) +! +!* 11. Deallocate +! ---------- +IF (ALLOCATED(VARNAME )) DEALLOCATE(VARNAME) +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:PREP_NETCDF_GRID',1,ZHOOK_HANDLE) +! +END SUBROUTINE PREP_NETCDF_GRID +!------------------------------------------------------------------------------ +!============================================================================== +! #################### + SUBROUTINE READ_Z1D_CDF(HFILENAME,HNCVARNAME,PVAL) +! #################### +! +IMPLICIT NONE +! + CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. + CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file +REAL, DIMENSION(:), INTENT(OUT) :: PVAL ! value to get +! +integer :: status +integer :: kcdf_id +integer :: NBVARS +character(len=80) :: HACTION +character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME +integer ::JLOOP1 +integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer ::NVARDIMS +integer ::NLEN +real,DIMENSION(:),ALLOCATABLE :: ZVALU +real :: ZMISS +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +include 'netcdf.inc' +! +!* 1. Open the netcdf file +! -------------------- +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_Z1D_CDF',0,ZHOOK_HANDLE) +status=-9999 +kcdf_id=-9999 +HACTION='open netcdf' +status=NF_OPEN(HFILENAME,nf_nowrite,kcdf_id) +if (status/=NF_NOERR) then + CALL HANDLE_ERR_MER(status,HACTION) +endif +!----------- +!* 2. get the number of variables in netcdf file +! ------------------------------------------ +HACTION='get number of variables' +status=NF_INQ_NVARS(kcdf_id,NBVARS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'nb vars', NBVARS +ALLOCATE(VARNAME(NBVARS)) +!----------- +!* 3. get the variables names in netcdf file +! -------------------------------------- +ID_VARTOGET1=0 +ID_VARTOGET2=0 +DO JLOOP1=1,NBVARS + HACTION='get variables names' + status=NF_INQ_VARNAME(kcdf_id,JLOOP1,VARNAME(JLOOP1)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + if (VARNAME(JLOOP1)==HNCVARNAME) then + ID_VARTOGET1=JLOOP1 + endif + if (VARNAME(JLOOP1)/=HNCVARNAME) then + if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.& + (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then + ID_VARTOGET2=JLOOP1 + endif + endif +ENDDO +if (ID_VARTOGET1/=0) then + ID_VARTOGET=ID_VARTOGET1 +else + ID_VARTOGET=ID_VARTOGET2 +endif +if (ID_VARTOGET==0) then + HACTION='close netcdf' + status=nf_close(kcdf_id) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_Z1D_CDF') +endif +!----------- +!* 4. get the variable in netcdf file +! ------------------------------- +! 4.1 get the variable dimensions number +! ----------------------------------- +HACTION='get variable dimensions number' +status=nf_inq_varndims(kcdf_id,ID_VARTOGET,NVARDIMS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +! +! 4.2 get the variable dimensions length and values +! ---------------------------------------------- +SELECT CASE (NVARDIMS) +!CAS 1D + CASE (1) + HACTION='get variable dimensions length' + status=nf_inq_dimlen(kcdf_id,ID_VARTOGET,NLEN) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + ALLOCATE(ZVALU(NLEN)) + !write(0,*) 'call GET1DCDF' + CALL GET1DCDF(kcdf_id,ID_VARTOGET,ZMISS,ZVALU) + PVAL(:)=ZVALU(:) +!CAS 2D + CASE (2) + write(0,*) 'YOU ARE TRYING TO READ A 2D FIELD FOR :', TRIM(HNCVARNAME) + CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_Z1D_CDF') +END SELECT +!----------- +!* 5. Close the netcdf file +! --------------------- +HACTION='close netcdf' +status=nf_close(kcdf_id) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!----------- +!* 6. Deallocate +! ---------- +IF (ALLOCATED(VARNAME )) DEALLOCATE(VARNAME) +IF (ALLOCATED(ZVALU )) DEALLOCATE(ZVALU ) +!! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_Z1D_CDF',1,ZHOOK_HANDLE) +END SUBROUTINE READ_Z1D_CDF +!------------------------------------------------------------------------------ +!============================================================================== +! #################### + SUBROUTINE READ_LATLONVAL_CDF(HFILENAME,HNCVARNAME,PLON,PLAT,PVAL) +! #################### +! +IMPLICIT NONE +! + CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. + CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file +REAL, DIMENSION(:), INTENT(OUT) :: PLON,PLAT ! Longitudes/latitudes in netcdf file +REAL, DIMENSION(:), INTENT(OUT) :: PVAL ! value to get +! +integer :: status +integer :: kcdf_id +integer :: NBVARS +character(len=80) :: HACTION +character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME +integer ::JLOOP1,JDIM1,JDIM2,JLOOP +integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer ::NVARDIMS +integer ::NLEN +integer,DIMENSION(2) ::NLEN2D +integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM +real,DIMENSION(:),ALLOCATABLE :: ZVALU +real,DIMENSION(:,:),ALLOCATABLE :: ZVALU2D +real :: ZMISS +real,DIMENSION(:),ALLOCATABLE :: ZDIM1 +real,DIMENSION(:),ALLOCATABLE :: ZDIM2 +character(len=80) :: YDIM1NAME,YDIM2NAME +integer :: ILONFOUND,ILATFOUND, IARG +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +include 'netcdf.inc' +! +! +! +!* 1. Open the netcdf file +! -------------------- +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_LATLONVAL_CDF',0,ZHOOK_HANDLE) +status=-9999 +kcdf_id=-9999 +HACTION='open netcdf' +status=NF_OPEN(HFILENAME,nf_nowrite,kcdf_id) +if (status/=NF_NOERR) then + CALL HANDLE_ERR_MER(status,HACTION) +!else +! write(0,*) 'netcdf file opened: ',HFILENAME +endif +! +!----------- +! +!* 2. get the number of variables in netcdf file +! ------------------------------------------ +HACTION='get number of variables' +status=NF_INQ_NVARS(kcdf_id,NBVARS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'nb vars', NBVARS +ALLOCATE(VARNAME(NBVARS)) +! +!----------- +! +!* 3. get the variables names in netcdf file +! -------------------------------------- +ID_VARTOGET1=0 +ID_VARTOGET2=0 +DO JLOOP1=1,NBVARS + HACTION='get variables names' + status=NF_INQ_VARNAME(kcdf_id,JLOOP1,VARNAME(JLOOP1)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'var',JLOOP1,' name: ',VARNAME(JLOOP1) + if (VARNAME(JLOOP1)==HNCVARNAME) then + ID_VARTOGET1=JLOOP1 + endif + if (VARNAME(JLOOP1)/=HNCVARNAME) then + if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.& + (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then + !write(0,*) 'var',JLOOP1,VARNAME(JLOOP1),' could correspond to variable required ?' + !write(0,*) HNCVARNAME,' is variable required; only ',VARNAME(JLOOP1),' found' + ID_VARTOGET2=JLOOP1 + endif + endif +ENDDO +if (ID_VARTOGET1/=0) then + ID_VARTOGET=ID_VARTOGET1 +else + ID_VARTOGET=ID_VARTOGET2 +endif +if (ID_VARTOGET==0) then + HACTION='close netcdf' + status=nf_close(kcdf_id) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_LATLONVAL_CDF') +endif +!----------- +! +!* 4. get the variable in netcdf file +! ------------------------------- +! +! 4.1 get the variable dimensions number +! ----------------------------------- +! +HACTION='get variable dimensions number' +status=nf_inq_varndims(kcdf_id,ID_VARTOGET,NVARDIMS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'variable dimensions number = ',NVARDIMS +! +! 4.2 get the variable dimensions length and values +! ---------------------------------------------- +SELECT CASE (NVARDIMS) +!CAS 1D + CASE (1) + HACTION='get variable dimensions length' + status=nf_inq_dimlen(kcdf_id,ID_VARTOGET,NLEN) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + ALLOCATE(ZVALU(NLEN)) + CALL GET1DCDF(kcdf_id,ID_VARTOGET,ZMISS,ZVALU) + PVAL(:)=ZVALU(:) +!CAS 2D + CASE (2) + DO JLOOP=1,NVARDIMS + HACTION='get variable dimensions length' + status=nf_inq_dimlen(kcdf_id,ID_VARTOGET,NLEN2D(JLOOP)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + ENDDO + ALLOCATE(ZVALU2D(NLEN2D(1),NLEN2D(2))) + ALLOCATE(ZDIM1(NLEN2D(1))) + ALLOCATE(ZDIM2(NLEN2D(2))) + CALL GET2DCDF(kcdf_id,ID_VARTOGET,ZDIM1,YDIM1NAME,ZDIM2,YDIM2NAME,& + ZMISS,ZVALU2D) + !write(0,*) 'YDIM1NAME: ',YDIM1NAME + !write(0,*) 'YDIM2NAME: ',YDIM2NAME + if ((YDIM1NAME=='lon').OR.(YDIM1NAME=='longitude')) ILONFOUND=1 + if ((YDIM2NAME=='lon').OR.(YDIM2NAME=='longitude')) ILONFOUND=2 + if ((YDIM1NAME=='lat').OR.(YDIM1NAME=='latitude')) ILATFOUND=1 + if ((YDIM2NAME=='lat').OR.(YDIM2NAME=='latitude')) ILATFOUND=2 + IARG=0 +! +! 4.3 complete arrays +! --------------- + IF ((ILONFOUND==1).AND.(ILATFOUND==2)) then + !write(0,*) 'ILONFOUND',ILONFOUND,'ILATFOUND',ILATFOUND + DO JDIM1=1,SIZE(ZDIM1) + DO JDIM2=1,SIZE(ZDIM2) + IARG=IARG+1 + PVAL(IARG)=ZVALU2D(JDIM1,JDIM2) + PLON(IARG)=ZDIM1(JDIM1) + PLAT(IARG)=ZDIM2(JDIM2) + ENDDO + ENDDO + ELSEIF ((ILONFOUND==2).AND.(ILATFOUND==1)) then + !write(0,*) 'ILONFOUND',ILONFOUND,'ILATFOUND',ILATFOUND + DO JDIM1=1,SIZE(ZDIM1) + DO JDIM2=1,SIZE(ZDIM2) + IARG=IARG+1 + PVAL(IARG)=ZVALU2D(JDIM1,JDIM2) + PLAT(IARG)=ZDIM1(JDIM1) + PLON(IARG)=ZDIM2(JDIM2) + ENDDO + ENDDO + ELSE + write(0,*) '*****WARNING*****: incompatible dimensions to lat/lon/value arrays' + ENDIF +! +END SELECT +! +! +!----------- +!* 10. Close the netcdf file +! --------------------- +HACTION='close netcdf' +status=nf_close(kcdf_id) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'OK: netcdf file closed: ',HFILENAME +! +!----------- +!* 11. Deallocate +! ---------- +IF (ALLOCATED(VARNAME )) DEALLOCATE(VARNAME) +IF (ALLOCATED(ZVALU )) DEALLOCATE(ZVALU ) +IF (ALLOCATED(ZVALU2D )) DEALLOCATE(ZVALU2D) +IF (ALLOCATED(ZDIM1 )) DEALLOCATE(ZDIM1 ) +IF (ALLOCATED(ZDIM2 )) DEALLOCATE(ZDIM2 ) +! +! +IF (ALLOCATED(NVARDIMID )) DEALLOCATE(NVARDIMID ) +IF (ALLOCATED(NVARDIMNAM )) DEALLOCATE(NVARDIMNAM) +IF (ALLOCATED(NVARDIMLEN )) DEALLOCATE(NVARDIMLEN) +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_LATLONVAL_CDF',1,ZHOOK_HANDLE) +END SUBROUTINE READ_LATLONVAL_CDF +!------------------------------------------------------------------------------ +!============================================================================== +! #################### + SUBROUTINE READ_LATLONDEPVAL_CDF(HFILENAME,HNCVARNAME,PLON,PLAT,PDEP,PVAL) +! #################### +! +IMPLICIT NONE +! + CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. + CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file +REAL, DIMENSION(:), INTENT(OUT) :: PLON,PLAT ! Longitudes/latitudes in netcdf file +REAL, DIMENSION(:), INTENT(OUT) :: PDEP ! depth in netcdf file +REAL, DIMENSION(:,:), INTENT(OUT) :: PVAL ! value to get +! +integer :: status +integer :: kcdf_id +integer :: NBVARS +character(len=80) :: HACTION +character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME +integer ::JLOOP1,JDIM1,JDIM2,JDIM3,JLOOP +!integer ::JLOOP2,JLOOP +integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer ::NVARDIMS +integer,DIMENSION(3) ::NLEN3D +integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM +real,DIMENSION(:,:,:),ALLOCATABLE :: ZVALU3D +real :: ZMISS +real,DIMENSION(:),ALLOCATABLE :: ZDIM1 +real,DIMENSION(:),ALLOCATABLE :: ZDIM2 +real,DIMENSION(:),ALLOCATABLE :: ZDIM3 +character(len=80) :: YDIM1NAME,YDIM2NAME,YDIM3NAME +integer :: ILONFOUND,ILATFOUND,IDEPFOUND +integer :: IARG +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +include 'netcdf.inc' +! +! +! +!* 1. Open the netcdf file +! -------------------- +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_LATLONDEPVAL_CDF',0,ZHOOK_HANDLE) +HACTION='open netcdf' +status=NF_OPEN(HFILENAME,nf_nowrite,kcdf_id) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'netcdf file opened: ',HFILENAME +! +!----------- +! +!* 2. get the number of variables in netcdf file +! ------------------------------------------ +HACTION='get number of variables' +status=NF_INQ_NVARS(kcdf_id,NBVARS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'nb vars', NBVARS +ALLOCATE(VARNAME(NBVARS)) +! +!----------- +! +!* 3. get the variables names in netcdf file +! -------------------------------------- +ID_VARTOGET1=0 +ID_VARTOGET2=0 +DO JLOOP1=1,NBVARS + HACTION='get variables names' + status=NF_INQ_VARNAME(kcdf_id,JLOOP1,VARNAME(JLOOP1)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + !write(0,*) 'var',JLOOP1,' name: ',VARNAME(JLOOP1) + if (VARNAME(JLOOP1)==HNCVARNAME) then + !write(0,*) 'var',JLOOP1,' corresponding to variable required' + ID_VARTOGET1=JLOOP1 + endif + if (VARNAME(JLOOP1)/=HNCVARNAME) then + if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.& + (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then + !write(0,*) 'var',JLOOP1,VARNAME(JLOOP1),' could correspond to variable required ?' + !write(0,*) HNCVARNAME,' is variable required; only ',VARNAME(JLOOP1),' found' + ID_VARTOGET2=JLOOP1 + endif + endif +ENDDO +if (ID_VARTOGET1/=0) then + ID_VARTOGET=ID_VARTOGET1 +else + ID_VARTOGET=ID_VARTOGET2 +endif +if (ID_VARTOGET==0) then + HACTION='close netcdf' + status=nf_close(kcdf_id) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_LATLONDEPVAL_CDF') +endif +!----------- +! +!* 4. get the variable in netcdf file +! ------------------------------- +! +! 4.1 get the variable dimensions number +! ----------------------------------- +! +HACTION='get variable dimensions number' +status=nf_inq_varndims(kcdf_id,ID_VARTOGET,NVARDIMS) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'variable dimensions number = ',NVARDIMS +ALLOCATE(NVARDIMID(NVARDIMS)) +HACTION='get variable dimensions identifiant' +status=nf_inq_vardimid(kcdf_id,ID_VARTOGET,NVARDIMID) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +! +! +! 4.2 get the variable dimensions length and values +! ---------------------------------------------- +SELECT CASE (NVARDIMS) +!CAS 1D, 2D + CASE (1,2) + write(0,*) '********************************************' + write(0,*) '* number of dimension to low: ',NVARDIMS,' *' + write(0,*) '* you need a 3-dimension variable *' + write(0,*) '********************************************' +!CAS 3D + CASE (3) + DO JLOOP=1,NVARDIMS + HACTION='get variable dimensions length' + status=nf_inq_dimlen(kcdf_id,NVARDIMID(JLOOP),NLEN3D(JLOOP)) + if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) + ENDDO + ALLOCATE(ZVALU3D(NLEN3D(1),NLEN3D(2),NLEN3D(3))) + ALLOCATE(ZDIM1(NLEN3D(1))) + ALLOCATE(ZDIM2(NLEN3D(2))) + ALLOCATE(ZDIM3(NLEN3D(3))) + !write(0,*) 'call GET3DCDF' + CALL GET3DCDF(kcdf_id,ID_VARTOGET,ZDIM1,YDIM1NAME,ZDIM2,YDIM2NAME,& + ZDIM3,YDIM3NAME,ZMISS,ZVALU3D) + !write(0,*) 'YDIM1NAME: ',YDIM1NAME + !write(0,*) 'YDIM2NAME: ',YDIM2NAME + !write(0,*) 'YDIM3NAME: ',YDIM3NAME + if ((YDIM1NAME=='lon').OR.(YDIM1NAME=='longitude')) ILONFOUND=1 + if ((YDIM2NAME=='lon').OR.(YDIM2NAME=='longitude')) ILONFOUND=2 + if ((YDIM3NAME=='lon').OR.(YDIM3NAME=='longitude')) ILONFOUND=3 + if ((YDIM1NAME=='lat').OR.(YDIM1NAME=='latitude')) ILATFOUND=1 + if ((YDIM2NAME=='lat').OR.(YDIM2NAME=='latitude')) ILATFOUND=2 + if ((YDIM3NAME=='lat').OR.(YDIM3NAME=='latitude')) ILATFOUND=3 + if (YDIM1NAME=='depth') IDEPFOUND=1 + if (YDIM2NAME=='depth') IDEPFOUND=2 + if (YDIM3NAME=='depth') IDEPFOUND=3 + IARG=0 + !write(0,*) 'ILONFOUND',ILONFOUND,'ILATFOUND',ILATFOUND,'IDEPFOUND',IDEPFOUND +!! +!! 4.3 complete arrays +!! --------------- + IF ((ILONFOUND==1).AND.(ILATFOUND==2).AND.(IDEPFOUND==3)) then + !write(0,*) 'SIZE LON=',SIZE(ZDIM1),'SIZE LAT',SIZE(ZDIM2),'SIZE DEP',SIZE(ZDIM3) + !write(0,*) 'SIZE PLON=',SIZE(PLON),'SIZE PLAT',SIZE(PLAT),'SIZE PDEP',SIZE(PDEP) + PDEP(:)=ZDIM3(:) + DO JDIM2=1,SIZE(ZDIM2) + DO JDIM1=1,SIZE(ZDIM1) + IARG=IARG+1 + PLON(IARG)=ZDIM1(JDIM1) + PLAT(IARG)=ZDIM2(JDIM2) + DO JDIM3=1,SIZE(ZDIM3) + PVAL(IARG,JDIM3)=ZVALU3D(JDIM1,JDIM2,JDIM3) + ENDDO + ENDDO + ENDDO + !write(0,*) 'END complete arrays' +! + ELSEIF ((ILONFOUND==2).AND.(ILATFOUND==1).AND.(IDEPFOUND==3)) then + PDEP(:)=ZDIM3(:) + DO JDIM1=1,SIZE(ZDIM1) + DO JDIM2=1,SIZE(ZDIM2) + IARG=IARG+1 + PLON(IARG)=ZDIM2(JDIM2) + PLAT(IARG)=ZDIM1(JDIM1) + DO JDIM3=1,SIZE(ZDIM3) + PVAL(IARG,JDIM3)=ZVALU3D(JDIM1,JDIM2,JDIM3) + ENDDO + ENDDO + ENDDO +! + ELSEIF ((ILONFOUND==1).AND.(ILATFOUND==3).AND.(IDEPFOUND==2)) then + PDEP(:)=ZDIM2(:) + DO JDIM3=1,SIZE(ZDIM3) + DO JDIM1=1,SIZE(ZDIM1) + IARG=IARG+1 + PLON(IARG)=ZDIM1(JDIM1) + PLAT(IARG)=ZDIM3(JDIM3) + DO JDIM2=1,SIZE(ZDIM2) + PVAL(IARG,JDIM2)=ZVALU3D(JDIM1,JDIM2,JDIM3) + ENDDO + ENDDO + ENDDO +! + ELSEIF ((ILATFOUND==1).AND.(ILONFOUND==3).AND.(IDEPFOUND==2)) then + PDEP(:)=ZDIM2(:) + DO JDIM1=1,SIZE(ZDIM1) + DO JDIM3=1,SIZE(ZDIM3) + IARG=IARG+1 + PLON(IARG)=ZDIM3(JDIM3) + PLAT(IARG)=ZDIM1(JDIM1) + DO JDIM2=1,SIZE(ZDIM2) + PVAL(IARG,JDIM2)=ZVALU3D(JDIM1,JDIM2,JDIM3) + ENDDO + ENDDO + ENDDO +! + ELSEIF ((ILONFOUND==2).AND.(ILATFOUND==3).AND.(IDEPFOUND==1)) then + PDEP(:)=ZDIM1(:) + DO JDIM3=1,SIZE(ZDIM3) + DO JDIM2=1,SIZE(ZDIM2) + IARG=IARG+1 + PLON(IARG)=ZDIM2(JDIM2) + PLAT(IARG)=ZDIM3(JDIM3) + DO JDIM1=1,SIZE(ZDIM1) + PVAL(IARG,JDIM1)=ZVALU3D(JDIM1,JDIM2,JDIM3) + ENDDO + ENDDO + ENDDO +! + ELSEIF ((ILATFOUND==2).AND.(ILONFOUND==3).AND.(IDEPFOUND==1)) then + PDEP(:)=ZDIM1(:) + DO JDIM2=1,SIZE(ZDIM2) + DO JDIM3=1,SIZE(ZDIM3) + IARG=IARG+1 + PLON(IARG)=ZDIM3(JDIM3) + PLAT(IARG)=ZDIM2(JDIM2) + DO JDIM1=1,SIZE(ZDIM1) + PVAL(IARG,JDIM1)=ZVALU3D(JDIM1,JDIM2,JDIM3) + ENDDO + ENDDO + ENDDO +! + ELSE + write(0,*) '*****WARNING*****: incompatible dimensions to lat/lon/value arrays' + ENDIF +! +END SELECT +! +!----------- +!* 10. Close the netcdf file +! --------------------- +HACTION='close netcdf' +!write(0,*) HACTION +status=nf_close(kcdf_id) +if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION) +!write(0,*) 'OK: netcdf file closed: ',HFILENAME +! +!----------- +!* 11. Deallocate +! ---------- +IF (ALLOCATED(VARNAME )) DEALLOCATE(VARNAME) +IF (ALLOCATED(ZVALU3D )) DEALLOCATE(ZVALU3D) +IF (ALLOCATED(ZDIM1 )) DEALLOCATE(ZDIM1 ) +IF (ALLOCATED(ZDIM2 )) DEALLOCATE(ZDIM2 ) +IF (ALLOCATED(ZDIM3 )) DEALLOCATE(ZDIM3 ) +! +! +IF (ALLOCATED(NVARDIMID )) DEALLOCATE(NVARDIMID ) +IF (ALLOCATED(NVARDIMNAM )) DEALLOCATE(NVARDIMNAM) +IF (ALLOCATED(NVARDIMLEN )) DEALLOCATE(NVARDIMLEN) +201 FORMAT(4(3X,F10.4)) +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_LATLONDEPVAL_CDF',1,ZHOOK_HANDLE) +END SUBROUTINE READ_LATLONDEPVAL_CDF +!------------------------------------------------------------------------------ +!============================================================================== +! #################### + SUBROUTINE READ_NETCDF_SST(HFILENAME,HNCVARNAME,PFIELD) +! #################### +! +USE MODD_GRID_LATLONREGUL, ONLY : NINDEPTH,NILENGTH +USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_CSTS, ONLY : XTT +USE MODD_PREP, ONLY : CINTERP_TYPE +! +IMPLICIT NONE +! + CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. + CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file +REAL, POINTER,DIMENSION(:) :: PFIELD ! value to get +! +REAL,DIMENSION(:), ALLOCATABLE :: ZLATI +REAL,DIMENSION(:), ALLOCATABLE :: ZLONG +REAL,TARGET,DIMENSION(:,:), ALLOCATABLE :: ZVALUE +REAL,DIMENSION(:), ALLOCATABLE :: ZDEPTH +REAL,TARGET,DIMENSION(:), ALLOCATABLE :: ZVAL +integer :: jloop +!PLM +REAL :: ZUNDEF=999. +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! +include 'netcdf.inc' +! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_SST',0,ZHOOK_HANDLE) +IF (NILENGTH<0) then + ALLOCATE(PFIELD(1)) + PFIELD(:)=XUNDEF + CINTERP_TYPE='UNIF ' !!prescribed uniform field +ELSEIF (NINDEPTH<0) THEN + ALLOCATE(ZLATI(NILENGTH) ) + ALLOCATE(ZLONG(NILENGTH) ) + ALLOCATE(ZVAL (NILENGTH) ) + CALL READ_LATLONVAL_CDF(HFILENAME,HNCVARNAME,ZLONG,ZLATI,ZVAL) + ALLOCATE(PFIELD(NILENGTH)) + PFIELD(:)=XUNDEF + PFIELD(:) = ZVAL(:) + IF (TRIM(HNCVARNAME) == 'temperature') THEN + WHERE (ZVAL(:)/=ZUNDEF .AND. ZVAL(:)<100.) PFIELD(:)=PFIELD(:)+XTT + ENDIF + CINTERP_TYPE='HORIBL' !!interpolation from gaussian, legendre or regular grid +! !!CINGRID_TYPE='GAUSS ' ou ='AROME ' +! !!CINGRID_TYPE='LATLON ' +ELSE + ALLOCATE(ZVALUE(NILENGTH,NINDEPTH)) + ALLOCATE(ZLATI(NILENGTH) ) + ALLOCATE(ZLONG(NILENGTH) ) + ALLOCATE(ZDEPTH(NINDEPTH)) +! + CALL READ_LATLONDEPVAL_CDF(HFILENAME,HNCVARNAME,ZLONG,ZLATI,ZDEPTH,ZVALUE) +! + ALLOCATE(PFIELD(NILENGTH)) + PFIELD(:)=XUNDEF + PFIELD(:)=ZVALUE(:,1) + IF (TRIM(HNCVARNAME) == 'temperature') THEN + WHERE (ZVALUE(:,1)/=ZUNDEF .AND. ZVALUE(:,1)<100.) PFIELD(:)=PFIELD(:)+XTT + ENDIF + CINTERP_TYPE='HORIBL' !!interpolation from gaussian, legendre or regular grid +! !!CINGRID_TYPE='GAUSS ' ou ='AROME ' +! !!CINGRID_TYPE='LATLON ' +ENDIF +! +IF (ALLOCATED(ZVALUE )) DEALLOCATE(ZVALUE ) +IF (ALLOCATED(ZLONG )) DEALLOCATE(ZLONG ) +IF (ALLOCATED(ZLATI )) DEALLOCATE(ZLATI ) +IF (ALLOCATED(ZDEPTH )) DEALLOCATE(ZDEPTH ) +IF (ALLOCATED(ZVAL )) DEALLOCATE(ZVAL ) +! +202 FORMAT(3(3X,F10.4)) +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_SST',1,ZHOOK_HANDLE) +! +END SUBROUTINE READ_NETCDF_SST +!------------------------------------------------------------------------------ +!============================================================================== +! #################### + SUBROUTINE READ_NETCDF_ZS_SEA(HFILENAME,HNCVARNAME,PFIELD) +! #################### +! +USE MODD_GRID_LATLONREGUL, ONLY : NINLAT,NINLON,NINDEPTH,NILENGTH +USE MODD_PREP, ONLY : CINTERP_TYPE +! +IMPLICIT NONE +! + CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. + CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file +REAL, POINTER, DIMENSION(:) :: PFIELD ! value to get +! +REAL,DIMENSION(:), ALLOCATABLE :: ZLATI +REAL,DIMENSION(:), ALLOCATABLE :: ZLONG +REAL,TARGET, DIMENSION(:), ALLOCATABLE:: ZVALUE +integer :: jloop +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! +include 'netcdf.inc' +! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_ZS_SEA',0,ZHOOK_HANDLE) +if(NINDEPTH>0) then + !write(0,*) '*****warning*****',HNCVARNAME,' is a 3D field' + ALLOCATE(PFIELD(1)) + PFIELD(:)=0. + CINTERP_TYPE='UNIF ' !!prescribed uniform field +elseif(NILENGTH>0) then + ALLOCATE(ZVALUE(NILENGTH)) + ALLOCATE(ZLATI(NILENGTH) ) + ALLOCATE(ZLONG(NILENGTH) ) +! + CALL READ_LATLONVAL_CDF(HFILENAME,HNCVARNAME,ZLONG,ZLATI,ZVALUE) + ALLOCATE(PFIELD(NILENGTH)) + PFIELD(:)=ZVALUE(:) + CINTERP_TYPE='HORIBL' !!interpolation from gaussian, legendre or regular grid +! !!CINGRID_TYPE='GAUSS ' ou ='AROME ' +! !!CINGRID_TYPE='LATLON ' +else + ALLOCATE(PFIELD(1)) + PFIELD(:)=0. + CINTERP_TYPE='UNIF ' !!prescribed uniform field +endif +! +IF (ALLOCATED(ZVALUE )) DEALLOCATE(ZVALUE ) +IF (ALLOCATED(ZLONG )) DEALLOCATE(ZLONG ) +IF (ALLOCATED(ZLATI )) DEALLOCATE(ZLATI ) +! +202 FORMAT(3(3X,F10.4)) +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_ZS_SEA',1,ZHOOK_HANDLE) +! +END SUBROUTINE READ_NETCDF_ZS_SEA +!------------------------------------------------------------------------------ +!============================================================================== +! #################### + SUBROUTINE READ_NETCDF_WAVE(HFILENAME,HNCVARNAME,PFIELD) +! #################### +! +USE MODD_GRID_LATLONREGUL, ONLY : NINLAT,NINLON,NINDEPTH,NILENGTH +USE MODD_PREP, ONLY : CINTERP_TYPE +! +IMPLICIT NONE +! + CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. + CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file +REAL, POINTER, DIMENSION(:) :: PFIELD ! value to get +! +REAL,DIMENSION(:), ALLOCATABLE :: ZLATI +REAL,DIMENSION(:), ALLOCATABLE :: ZLONG +REAL,TARGET, DIMENSION(:), ALLOCATABLE:: ZVALUE +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! +include 'netcdf.inc' +! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_WAVE',0,ZHOOK_HANDLE) +if(NINDEPTH>0) then + !write(0,*) '*****warning*****',HNCVARNAME,' is a 3D field' + ALLOCATE(PFIELD(1)) + PFIELD(:)=0. + CINTERP_TYPE='UNIF ' !!prescribed uniform field +elseif(NILENGTH>0) then + ALLOCATE(ZVALUE(NILENGTH)) + ALLOCATE(ZLATI(NILENGTH) ) + ALLOCATE(ZLONG(NILENGTH) ) +! + CALL READ_LATLONVAL_CDF(HFILENAME,HNCVARNAME,ZLONG,ZLATI,ZVALUE) + ALLOCATE(PFIELD(NILENGTH)) + PFIELD(:)=ZVALUE(:) + CINTERP_TYPE='HORIBL' !!interpolation from gaussian, legendre or regular grid +! !!CINGRID_TYPE='GAUSS ' ou ='AROME ' +! !!CINGRID_TYPE='LATLON ' +else + ALLOCATE(PFIELD(1)) + PFIELD(:)=0. + CINTERP_TYPE='UNIF ' !!prescribed uniform field +endif +! +IF (ALLOCATED(ZVALUE )) DEALLOCATE(ZVALUE ) +IF (ALLOCATED(ZLONG )) DEALLOCATE(ZLONG ) +IF (ALLOCATED(ZLATI )) DEALLOCATE(ZLATI ) +! +IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_WAVE',1,ZHOOK_HANDLE) +! +END SUBROUTINE READ_NETCDF_WAVE +! +!------------------------------------------------------------------------------ +!============================================================================== +END MODULE MODE_READ_NETCDF_MERCATOR diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/modn_prep_seaflux.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/modn_prep_seaflux.F90 new file mode 100644 index 0000000000000000000000000000000000000000..558eb3b5e24ddb903c3baa3e8a0321ad77ada205 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/modn_prep_seaflux.F90 @@ -0,0 +1,72 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. + +! ################## + MODULE MODN_PREP_SEAFLUX +! ################## +! +!!**** *MODN_PREP_SEAFLUX* - declaration of namelist NAM_PREP_SEAFLUX +!! +!! PURPOSE +!! ------- +! The purpose of this module is to specify the namelist NAM_PREP_SEAFLUX +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S.Malardel *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/2003 +!! Modified 07/2012, P. Le Moigne : CMO1D phasing +!! 07/2013, S. Senesi : handle seaice scheme +!! and uniform sea surface salinity and ice cover +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PREP_SEAFLUX, ONLY : CFILE_SEAFLX, CTYPE_SEAFLX, CFILEPGD_SEAFLX, CTYPEPGD, & + XSST_UNIF, XSSS_UNIF, XSIC_UNIF, & + CFILEWAVE_SEAFLX, CTYPEWAVE +! +IMPLICIT NONE +! +INTEGER :: NYEAR ! YEAR for surface +INTEGER :: NMONTH ! MONTH for surface +INTEGER :: NDAY ! DAY for surface +REAL :: XTIME ! TIME for surface +LOGICAL :: LSEA_SBL ! flag to use air layers inside the SBL +CHARACTER(LEN=6) :: CSEAICE_SCHEME ! name of the seaice scheme +LOGICAL :: LOCEAN_MERCATOR ! oceanic variables initialized from + ! MERCATOR if true +LOGICAL :: LOCEAN_CURRENT ! initial ocean state with current + ! (if false ucur=0, vcur=0) +REAL :: XTIME_REL ! relaxation time (s) +LOGICAL :: LCUR_REL ! If T, relax on current +LOGICAL :: LTS_REL ! If T, relax on T, S +LOGICAL :: LZERO_FLUX ! If T, relax on T, S +LOGICAL :: LCORR_FLUX ! If T, fluxes correction is made +REAL :: XCORFLX ! correction coefficient ( W.m-2.K-1) +LOGICAL :: LDIAPYC ! If T, fluxes correction is made +! +NAMELIST/NAM_PREP_SEAFLUX/CFILE_SEAFLX, CTYPE_SEAFLX, CFILEPGD_SEAFLX, CTYPEPGD, XSST_UNIF, & + CFILEWAVE_SEAFLX, CTYPEWAVE, & + XSSS_UNIF, XSIC_UNIF, NYEAR, NMONTH, NDAY, XTIME, LSEA_SBL, & + CSEAICE_SCHEME, LOCEAN_MERCATOR, LOCEAN_CURRENT, & + XTIME_REL,LCUR_REL,LTS_REL, & + LZERO_FLUX,XCORFLX,LCORR_FLUX, LDIAPYC +! +END MODULE MODN_PREP_SEAFLUX diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/modn_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/modn_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..a51c4509422b7af11f6afe026c7cca8b9f754cde --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/modn_seafluxn.F90 @@ -0,0 +1,323 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ################## + MODULE MODN_SEAFLUX_n +! ################## +! +!!**** *MODN_SEAFLUX_n* - declaration of namelist NAM_SEAFLUXn +!! +!! PURPOSE +!! ------- +! The purpose of this module is to specify the namelist NAM_SEAFLUX_n +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! Modified 01/2006 : sea flux parameterization. +!! Modified 08/2009 : LSURF_BUDGETC +!! Modified 01/2014 : S. Senesi : introduce sea-ice model +!! Modified 03/2014 : S. Belamari - add NZ0 (to choose PZ0SEA formulation) +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! + CHARACTER(LEN=6) :: CSEA_FLUX + CHARACTER(LEN=4) :: CSEA_ALB +REAL :: XTSTEP +REAL :: XOUT_TSTEP +REAL :: XDIAG_TSTEP +INTEGER :: N2M +LOGICAL :: L2M_MIN_ZS +LOGICAL :: LSURF_BUDGET +LOGICAL :: LRAD_BUDGET +LOGICAL :: LSURF_BUDGETC +LOGICAL :: LRESET_BUDGETC +LOGICAL :: LCOEF +LOGICAL :: LSURF_VARS +LOGICAL :: LPWG +LOGICAL :: LPRECIP +LOGICAL :: LPWEBB +LOGICAL :: LDIAG_OCEAN +LOGICAL :: LWAVEWIND +LOGICAL :: LDIAG_SEAICE +INTEGER :: NZ0 +INTEGER :: NGRVWAVES +REAL :: XICHCE + CHARACTER(LEN=6) :: CCH_DRY_DEP +LOGICAL :: LPROGSST +LOGICAL :: LPERTFLUX ! True = stochastic flux perturbation (default:False) +INTEGER :: NTIME_COUPLING +REAL :: XOCEAN_TSTEP + CHARACTER(LEN=6) :: CINTERPOL_SST + CHARACTER(LEN=6) :: CINTERPOL_SSS + CHARACTER(LEN=6) :: CINTERPOL_SIC + CHARACTER(LEN=6) :: CINTERPOL_SIT +REAL :: XFREEZING_SST +REAL :: XSIC_EFOLDING_TIME +REAL :: XSIT_EFOLDING_TIME +REAL :: XSEAICE_TSTEP +REAL :: XCD_ICE_CST +REAL :: XSI_FLX_DRV +! +NAMELIST/NAM_SEAFLUXn/CSEA_FLUX,CSEA_ALB, LPWG, LPRECIP, LPWEBB, NGRVWAVES, & + NZ0, LPROGSST, NTIME_COUPLING, XOCEAN_TSTEP, XICHCE, & + CINTERPOL_SST, CINTERPOL_SSS, LPERTFLUX, & + LWAVEWIND +NAMELIST/NAM_DIAG_SURFn/N2M,L2M_MIN_ZS,LSURF_BUDGET,LRAD_BUDGET, & + LSURF_BUDGETC,LRESET_BUDGETC,LCOEF,LSURF_VARS +NAMELIST/NAM_CH_SEAFLUXn/CCH_DRY_DEP +NAMELIST/NAM_DIAG_OCEANn/LDIAG_OCEAN +NAMELIST/NAM_SEAICEn/LDIAG_SEAICE, CINTERPOL_SIC, CINTERPOL_SIT, & + XFREEZING_SST, XSIC_EFOLDING_TIME, XSIT_EFOLDING_TIME,& + XSEAICE_TSTEP, XCD_ICE_CST, XSI_FLX_DRV +! +CONTAINS +! +SUBROUTINE INIT_NAM_SEAFLUXn (O, S) +! + USE MODD_OCEAN_n, ONLY : OCEAN_t + USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! + IMPLICIT NONE + +! + TYPE(OCEAN_t), INTENT(INOUT) :: O + TYPE(SEAFLUX_t), INTENT(INOUT) :: S + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_SEAFLUXN',0,ZHOOK_HANDLE) + XTSTEP = S%XTSTEP + XOUT_TSTEP = S%XOUT_TSTEP + CSEA_FLUX = S%CSEA_FLUX + CSEA_ALB = S%CSEA_ALB + LPWG = S%LPWG + LPRECIP = S%LPRECIP + CINTERPOL_SST = S%CINTERPOL_SST + CINTERPOL_SSS = S%CINTERPOL_SSS + LPWEBB = S%LPWEBB + NZ0 = S%NZ0 + NGRVWAVES = S%NGRVWAVES + LWAVEWIND = S%LWAVEWIND + LPROGSST = O%LPROGSST + NTIME_COUPLING = O%NTIME_COUPLING + XOCEAN_TSTEP = O%XOCEAN_TSTEP + XICHCE = S%XICHCE + LPERTFLUX = S%LPERTFLUX +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_SEAFLUXN',1,ZHOOK_HANDLE) +END SUBROUTINE INIT_NAM_SEAFLUXn + +SUBROUTINE UPDATE_NAM_SEAFLUXn (O, S) +! + USE MODD_OCEAN_n, ONLY : OCEAN_t + USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! + IMPLICIT NONE + +! + TYPE(OCEAN_t), INTENT(INOUT) :: O + TYPE(SEAFLUX_t), INTENT(INOUT) :: S + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_SEAFLUXN',0,ZHOOK_HANDLE) + S%XTSTEP = XTSTEP + S%XOUT_TSTEP = XOUT_TSTEP + S%CSEA_FLUX = CSEA_FLUX + S%CSEA_ALB = CSEA_ALB + S%LPWG = LPWG + S%LPRECIP = LPRECIP + S%CINTERPOL_SST = CINTERPOL_SST + S%CINTERPOL_SSS = CINTERPOL_SSS + S%LPWEBB = LPWEBB + S%NZ0 = NZ0 + S%NGRVWAVES = NGRVWAVES + S%LWAVEWIND = LWAVEWIND + O%LPROGSST = LPROGSST + O%NTIME_COUPLING = NTIME_COUPLING + O%XOCEAN_TSTEP = XOCEAN_TSTEP + S%XICHCE = XICHCE + S%LPERTFLUX = LPERTFLUX +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_SEAFLUXN',1,ZHOOK_HANDLE) +END SUBROUTINE UPDATE_NAM_SEAFLUXn +! +SUBROUTINE INIT_NAM_DIAG_SURFn (DGS) +! + USE MODD_DIAG_SEAFLUX_n, ONLY : DIAG_SEAFLUX_t +! + IMPLICIT NONE + +! + TYPE(DIAG_SEAFLUX_t), INTENT(INOUT) :: DGS + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_DIAG_SURFN',0,ZHOOK_HANDLE) + XDIAG_TSTEP = DGS%XDIAG_TSTEP + N2M = DGS%N2M + L2M_MIN_ZS = DGS%L2M_MIN_ZS + LSURF_BUDGET = DGS%LSURF_BUDGET + LRAD_BUDGET = DGS%LRAD_BUDGET + LSURF_BUDGETC = DGS%LSURF_BUDGETC + LRESET_BUDGETC = DGS%LRESET_BUDGETC + LCOEF = DGS%LCOEF + LSURF_VARS = DGS%LSURF_VARS +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_DIAG_SURFN',1,ZHOOK_HANDLE) +END SUBROUTINE INIT_NAM_DIAG_SURFn + +SUBROUTINE UPDATE_NAM_DIAG_SURFn (DGS) +! + USE MODD_DIAG_SEAFLUX_n, ONLY : DIAG_SEAFLUX_t +! + IMPLICIT NONE + +! + TYPE(DIAG_SEAFLUX_t), INTENT(INOUT) :: DGS + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_DIAG_SURFN',0,ZHOOK_HANDLE) + DGS%XDIAG_TSTEP = XDIAG_TSTEP + DGS%N2M = N2M + DGS%L2M_MIN_ZS = L2M_MIN_ZS + DGS%LSURF_BUDGET = LSURF_BUDGET + DGS%LRAD_BUDGET = LRAD_BUDGET + DGS%LSURF_BUDGETC = LSURF_BUDGETC + DGS%LRESET_BUDGETC = LRESET_BUDGETC + DGS%LCOEF = LCOEF + DGS%LSURF_VARS = LSURF_VARS +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_DIAG_SURFN',1,ZHOOK_HANDLE) +END SUBROUTINE UPDATE_NAM_DIAG_SURFn +! +SUBROUTINE INIT_NAM_CH_SEAFLUXn (CHS) +! + USE MODD_CH_SEAFLUX_n, ONLY : CH_SEAFLUX_t +! + IMPLICIT NONE + +! + TYPE(CH_SEAFLUX_t), INTENT(INOUT) :: CHS + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_CH_SEAFLUXN',0,ZHOOK_HANDLE) + CCH_DRY_DEP = CHS%CCH_DRY_DEP +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_CH_SEAFLUXN',1,ZHOOK_HANDLE) +END SUBROUTINE INIT_NAM_CH_SEAFLUXn + +SUBROUTINE UPDATE_NAM_CH_SEAFLUXn (CHS) +! + USE MODD_CH_SEAFLUX_n, ONLY : CH_SEAFLUX_t +! + IMPLICIT NONE + +! + TYPE(CH_SEAFLUX_t), INTENT(INOUT) :: CHS + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_CH_SEAFLUXN',0,ZHOOK_HANDLE) + CHS%CCH_DRY_DEP = CCH_DRY_DEP +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_CH_SEAFLUXN',1,ZHOOK_HANDLE) +END SUBROUTINE UPDATE_NAM_CH_SEAFLUXn + +SUBROUTINE INIT_NAM_DIAG_OCEANn (DGO) +! + USE MODD_DIAG_OCEAN_n, ONLY : DIAG_OCEAN_t +! + IMPLICIT NONE + +! + TYPE(DIAG_OCEAN_t), INTENT(INOUT) :: DGO + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_DIAG_OCEANN',0,ZHOOK_HANDLE) + LDIAG_OCEAN = DGO%LDIAG_OCEAN +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_DIAG_OCEANN',1,ZHOOK_HANDLE) +END SUBROUTINE INIT_NAM_DIAG_OCEANn + +SUBROUTINE UPDATE_NAM_DIAG_OCEANn (DGO) +! + USE MODD_DIAG_OCEAN_n, ONLY : DIAG_OCEAN_t +! + IMPLICIT NONE + +! + TYPE(DIAG_OCEAN_t), INTENT(INOUT) :: DGO + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_DIAG_OCEANN',0,ZHOOK_HANDLE) + DGO%LDIAG_OCEAN = LDIAG_OCEAN +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_DIAG_OCEANN',1,ZHOOK_HANDLE) +END SUBROUTINE UPDATE_NAM_DIAG_OCEANn + +SUBROUTINE INIT_NAM_SEAICEn (DGSI, S) +! + USE MODD_DIAG_SEAICE_n, ONLY : DIAG_SEAICE_t + USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! + IMPLICIT NONE + +! + TYPE(DIAG_SEAICE_t), INTENT(INOUT) :: DGSI + TYPE(SEAFLUX_t), INTENT(INOUT) :: S + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_SEAICEN',0,ZHOOK_HANDLE) + LDIAG_SEAICE = DGSI%LDIAG_SEAICE + CINTERPOL_SIC = S%CINTERPOL_SIC + CINTERPOL_SIT = S%CINTERPOL_SIT + XSIC_EFOLDING_TIME=S%XSIC_EFOLDING_TIME + XSIT_EFOLDING_TIME=S%XSIT_EFOLDING_TIME + XSEAICE_TSTEP=S%XSEAICE_TSTEP + XFREEZING_SST = S%XFREEZING_SST + XCD_ICE_CST = S%XCD_ICE_CST + XSI_FLX_DRV = S%XSI_FLX_DRV +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:INIT_NAM_SEAICEN',1,ZHOOK_HANDLE) +END SUBROUTINE INIT_NAM_SEAICEn + +SUBROUTINE UPDATE_NAM_SEAICEn (DGSI, S) +! + USE MODD_DIAG_SEAICE_n, ONLY : DIAG_SEAICE_t + USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! + IMPLICIT NONE + +! + TYPE(DIAG_SEAICE_t), INTENT(INOUT) :: DGSI + TYPE(SEAFLUX_t), INTENT(INOUT) :: S + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_SEAICEN',0,ZHOOK_HANDLE) + DGSI%LDIAG_SEAICE = LDIAG_SEAICE + S%CINTERPOL_SIC = CINTERPOL_SIC + S%CINTERPOL_SIT = CINTERPOL_SIT + S%XSIC_EFOLDING_TIME = XSIC_EFOLDING_TIME + S%XSIT_EFOLDING_TIME = XSIT_EFOLDING_TIME + S%XSEAICE_TSTEP = XSEAICE_TSTEP + S%XFREEZING_SST = XFREEZING_SST + S%XCD_ICE_CST = XCD_ICE_CST + S%XSI_FLX_DRV = XSI_FLX_DRV +IF (LHOOK) CALL DR_HOOK('MODN_SEAFLUX_N:UPDATE_NAM_SEAICEN',1,ZHOOK_HANDLE) +END SUBROUTINE UPDATE_NAM_SEAICEn + +END MODULE MODN_SEAFLUX_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/modn_sfx_oasis.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/modn_sfx_oasis.F90 new file mode 100755 index 0000000000000000000000000000000000000000..f01bcecd9c25a3717f0eafaac6da059a3528bd82 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/modn_sfx_oasis.F90 @@ -0,0 +1,176 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +!############### +MODULE MODN_SFX_OASIS +!############### +! +!!**** *MODN_SFX_OASIS - declaration of namelist for SFX-OASIS coupling +!! +!! PURPOSE +!! ------- +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/13 +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!! and surface pressure parameter for ocean coupling +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +REAL :: XTSTEP_CPL_LAND = -1.0 ! Coupling time step for land +REAL :: XTSTEP_CPL_SEA = -1.0 ! Coupling time step for sea +REAL :: XTSTEP_CPL_LAKE = -1.0 ! Coupling time step for lake +REAL :: XTSTEP_CPL_WAVE = -1.0 ! Coupling time step for wave +! +!------------------------------------------------------------------------------- +! +! * Land surface variables for Surfex - Oasis coupling +! +!------------------------------------------------------------------------------- +! +! Output variables +! + CHARACTER(LEN=8) :: CRUNOFF = ' ' ! Surface runoff + CHARACTER(LEN=8) :: CDRAIN = ' ' ! Deep drainage + CHARACTER(LEN=8) :: CCALVING = ' ' ! Calving flux + CHARACTER(LEN=8) :: CRECHARGE = ' ' ! groundwater recharge + CHARACTER(LEN=8) :: CSRCFLOOD = ' ' ! Floodplains freshwater flux +! +! Input variables +! + CHARACTER(LEN=8) :: CWTD = ' ' ! water table depth + CHARACTER(LEN=8) :: CFWTD = ' ' ! grid-cell fraction of water table rise + CHARACTER(LEN=8) :: CFFLOOD = ' ' ! Floodplains fraction + CHARACTER(LEN=8) :: CPIFLOOD = ' ' ! Flood potential infiltartion +! +!------------------------------------------------------------------------------- +! +! * Lake variables for Surfex - Oasis coupling +! +!------------------------------------------------------------------------------- +! +! Input variables +! + CHARACTER(LEN=8) :: CLAKE_EVAP = ' ' ! Evaporation over lake area + CHARACTER(LEN=8) :: CLAKE_RAIN = ' ' ! Rainfall over lake area + CHARACTER(LEN=8) :: CLAKE_SNOW = ' ' ! Snowfall over lake area + CHARACTER(LEN=8) :: CLAKE_WATF = ' ' ! Net freshwater flux +! +!------------------------------------------------------------------------------- +! +! * Sea variables for Surfex - Oasis coupling +! +!------------------------------------------------------------------------------- +! +! Sea Output variables +! + CHARACTER(LEN=8) :: CSEA_FWSU = ' ' ! zonal wind stress + CHARACTER(LEN=8) :: CSEA_FWSV = ' ' ! meridian wind stress + CHARACTER(LEN=8) :: CSEA_HEAT = ' ' ! Non solar net heat flux + CHARACTER(LEN=8) :: CSEA_SNET = ' ' ! Solar net heat flux + CHARACTER(LEN=8) :: CSEA_WIND = ' ' ! module of 10m wind speed + CHARACTER(LEN=8) :: CSEA_FWSM = ' ' ! module of wind stress + CHARACTER(LEN=8) :: CSEA_EVAP = ' ' ! Evaporation + CHARACTER(LEN=8) :: CSEA_RAIN = ' ' ! Rainfall + CHARACTER(LEN=8) :: CSEA_SNOW = ' ' ! Snowfall + CHARACTER(LEN=8) :: CSEA_EVPR = ' ' ! Evaporation - Preci. + CHARACTER(LEN=8) :: CSEA_WATF = ' ' ! Net freshwater flux + CHARACTER(LEN=8) :: CSEA_PRES = ' ' ! Surface pressure +! +! Sea-ice Output variables +! + CHARACTER(LEN=8) :: CSEAICE_HEAT = ' ' ! Sea-ice non solar net heat flux + CHARACTER(LEN=8) :: CSEAICE_SNET = ' ' ! Sea-ice solar net heat flux + CHARACTER(LEN=8) :: CSEAICE_EVAP = ' ' ! Sea-ice sublimation +! +! Sea Input variables +! + CHARACTER(LEN=8) :: CSEA_SST = ' ' ! Sea surface temperature + CHARACTER(LEN=8) :: CSEA_UCU = ' ' ! Sea u-current stress + CHARACTER(LEN=8) :: CSEA_VCU = ' ' ! Sea v-current stress +! +! Sea-ice Input variables +! + CHARACTER(LEN=8) :: CSEAICE_SIT = ' ' ! Sea-ice temperature + CHARACTER(LEN=8) :: CSEAICE_CVR = ' ' ! Sea-ice cover + CHARACTER(LEN=8) :: CSEAICE_ALB = ' ' ! Sea-ice albedo +! +!------------------------------------------------------------------------------- +! +! * Wave variables for Surfex - Oasis coupling +! +!------------------------------------------------------------------------------- +! +! Wave Output variables +! +CHARACTER(LEN=8) :: CWAVE_U10 = ' ' ! 10m u-wind speed +CHARACTER(LEN=8) :: CWAVE_V10 = ' ' ! 10m u-wind speed +! +! Wave Input variables +! +CHARACTER(LEN=8) :: CWAVE_CHA = ' ' ! Charnock coefficient +CHARACTER(LEN=8) :: CWAVE_UCU = ' ' ! Wave u-current velocity +CHARACTER(LEN=8) :: CWAVE_VCU = ' ' ! Wave v-current velocity +CHARACTER(LEN=8) :: CWAVE_HS = ' ' ! Significant wave height +CHARACTER(LEN=8) :: CWAVE_TP = ' ' ! Peak period +! +! Switch to add water into sea oasis mask +! +LOGICAL :: LWATER = .FALSE. +!------------------------------------------------------------------------------- +! +!* 1. NAMELISTS FOR LAND SURFACE FIELD +! ------------------------------------------------ +! +NAMELIST/NAM_SFX_LAND_CPL/XTSTEP_CPL_LAND, & + CRUNOFF,CDRAIN,CCALVING,CRECHARGE,CWTD,CFWTD, & + CFFLOOD,CPIFLOOD,CSRCFLOOD +! +! +!* 2. NAMELISTS FOR LAKE FIELD +! --------------------------------------------------------------- +! +NAMELIST/NAM_SFX_LAKE_CPL/XTSTEP_CPL_LAKE, & + CLAKE_EVAP,CLAKE_RAIN,CLAKE_SNOW,CLAKE_WATF +! +! +!* 3. NAMELISTS FOR OCEANIC FIELD +! --------------------------------------------------------------- +! +NAMELIST/NAM_SFX_SEA_CPL/XTSTEP_CPL_SEA, LWATER, & + CSEA_FWSU,CSEA_FWSV,CSEA_HEAT,CSEA_SNET,CSEA_WIND, & + CSEA_FWSM,CSEA_EVAP,CSEA_RAIN,CSEA_SNOW,CSEA_EVPR, & + CSEA_WATF,CSEA_PRES,CSEAICE_HEAT,CSEAICE_SNET, & + CSEAICE_EVAP,CSEA_SST,CSEA_UCU,CSEA_VCU, & + CSEAICE_SIT,CSEAICE_CVR,CSEAICE_ALB +! +! +!* 4. NAMELISTS FOR WAVE FIELD +! --------------------------------------------------------------- +! +NAMELIST/NAM_SFX_WAVE_CPL/XTSTEP_CPL_WAVE, & + CWAVE_U10, CWAVE_V10, & + CWAVE_CHA, CWAVE_UCU, CWAVE_VCU, CWAVE_HS, CWAVE_TP + +! +!------------------------------------------------------------------------------- +! +END MODULE MODN_SFX_OASIS diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_hor_seaflux_field.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_hor_seaflux_field.F90 new file mode 100644 index 0000000000000000000000000000000000000000..8fe516aa5257c8063283cdd85c623776e86b7e5b --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_hor_seaflux_field.F90 @@ -0,0 +1,196 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### +SUBROUTINE PREP_HOR_SEAFLUX_FIELD (DTCO, UG, U, & + DTS, O, OR, SG, S,GCP, & + HPROGRAM,HSURF,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) +! ################################################################################# +! +!!**** *PREP_HOR_SEAFLUX_FIELD* - reads, interpolates and prepares a sea field +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S. Malardel +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! P. Le Moigne 10/2005, Phasage Arome +!! P. Le Moigne 09/2007, sst from clim +!! S. Senesi 09/2013, extends to fields of SSS and SIC +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!!------------------------------------------------------------------ +! + +! +! +! +! +! +! +! +! +USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t +USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +! +USE MODD_DATA_SEAFLUX_n, ONLY : DATA_SEAFLUX_t +USE MODD_OCEAN_n, ONLY : OCEAN_t +USE MODD_OCEAN_REL_n, ONLY : OCEAN_REL_t +USE MODD_SEAFLUX_GRID_n, ONLY : SEAFLUX_GRID_t +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +USE MODD_GRID_CONF_PROJ, ONLY : GRID_CONF_PROJ_t +! +USE MODD_PREP, ONLY : CINGRID_TYPE, CINTERP_TYPE, XZS_LS, XLAT_OUT, XLON_OUT, & + XX_OUT, XY_OUT, CMASK +! +USE MODI_READ_PREP_SEAFLUX_CONF +USE MODI_PREP_SEAFLUX_GRIB +USE MODI_PREP_SEAFLUX_UNIF +USE MODI_PREP_SEAFLUX_BUFFER +USE MODI_PREP_SEAFLUX_NETCDF +USE MODI_HOR_INTERPOL +USE MODI_GET_LUOUT +USE MODI_PREP_SEAFLUX_EXTERN +USE MODI_PREP_SST_INIT +! +USE MODI_PREP_HOR_OCEAN_FIELDS +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +USE MODI_ABOR1_SFX +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +! +TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO +TYPE(SURF_ATM_GRID_t), INTENT(INOUT) :: UG +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +! +TYPE(DATA_SEAFLUX_t), INTENT(INOUT) :: DTS +TYPE(OCEAN_t), INTENT(INOUT) :: O +TYPE(OCEAN_REL_t), INTENT(INOUT) :: OR +TYPE(SEAFLUX_GRID_t), INTENT(INOUT) :: SG +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +TYPE(GRID_CONF_PROJ_t),INTENT(INOUT) :: GCP +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes + CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field + CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! name of the Atmospheric file + CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! type of the Atmospheric file + CHARACTER(LEN=28), INTENT(IN) :: HPGDFILE ! name of the Atmospheric file + CHARACTER(LEN=6), INTENT(IN) :: HPGDFILETYPE! type of the Atmospheric file +! +!* 0.2 declarations of local variables +! + CHARACTER(LEN=6) :: YFILETYPE ! type of input file + CHARACTER(LEN=28) :: YFILE ! name of file + CHARACTER(LEN=6) :: YFILEPGDTYPE ! type of input file + CHARACTER(LEN=28) :: YFILEPGD ! name of file +REAL, POINTER, DIMENSION(:,:) :: ZFIELDIN ! field to interpolate horizontally +REAL, ALLOCATABLE, DIMENSION(:,:) :: ZFIELDOUT ! field interpolated horizontally +INTEGER :: ILUOUT ! output listing logical unit +! +LOGICAL :: GUNIF ! flag for prescribed uniform field +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!------------------------------------------------------------------------------------- +! +! +!* 1. Reading of input file name and type +! +IF (LHOOK) CALL DR_HOOK('PREP_HOR_SEAFLUX_FIELD',0,ZHOOK_HANDLE) + CALL GET_LUOUT(HPROGRAM,ILUOUT) +! + CALL READ_PREP_SEAFLUX_CONF(O, & + HPROGRAM,HSURF,YFILE,YFILETYPE,YFILEPGD,YFILEPGDTYPE,& + HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,ILUOUT,GUNIF) +! +CMASK = 'SEA' +!--------------------------------------------------------------------- ---------------- +! +!* 2. Reading of input configuration (Grid and interpolation type) +! +IF (GUNIF) THEN + CALL PREP_SEAFLUX_UNIF(ILUOUT,HSURF,ZFIELDIN) +ELSE IF (YFILETYPE=='GRIB ') THEN + CALL PREP_SEAFLUX_GRIB(HPROGRAM,HSURF,YFILE,ILUOUT,ZFIELDIN) +ELSE IF (YFILETYPE=='MESONH' .OR. YFILETYPE=='ASCII ' .OR. YFILETYPE=='LFI '.OR. YFILETYPE=='FA ') THEN + CALL PREP_SEAFLUX_EXTERN(GCP,& + HPROGRAM,HSURF,YFILE,YFILETYPE,YFILEPGD,YFILEPGDTYPE,ILUOUT,ZFIELDIN) +ELSE IF (YFILETYPE=='BUFFER') THEN + CALL PREP_SEAFLUX_BUFFER(HPROGRAM,HSURF,ILUOUT,ZFIELDIN) +ELSE IF (YFILETYPE=='NETCDF') THEN + CALL PREP_SEAFLUX_NETCDF(HPROGRAM,HSURF,YFILE,ILUOUT,ZFIELDIN) +ELSE + CALL ABOR1_SFX('PREP_HOR_SEAFLUX_FIELD: data file type not supported : '//YFILETYPE) +END IF +! +! +!* 4. Horizontal interpolation +! +ALLOCATE(ZFIELDOUT(SIZE(SG%XLAT),SIZE(ZFIELDIN,2))) +! + CALL HOR_INTERPOL(DTCO, U,GCP, & + ILUOUT,ZFIELDIN,ZFIELDOUT) +! +!* 5. Return to historical variable +! +SELECT CASE (HSURF) + CASE('ZS ') + ALLOCATE(XZS_LS(SIZE(ZFIELDOUT,1))) + XZS_LS(:) = ZFIELDOUT(:,1) + CASE('SST ') + ALLOCATE(S%XSST(SIZE(ZFIELDOUT,1))) + S%XSST(:) = ZFIELDOUT(:,1) + IF (DTS%LSST_DATA) THEN + ! XSST is derived from array XDATA_SST from MODD_DATA_SEAFLUX, with time interpolation + CALL PREP_SST_INIT(DTS, S, & + S%XSST) + END IF + IF (O%LMERCATOR) THEN + ! Preparing input for ocean 1D model + CALL PREP_HOR_OCEAN_FIELDS(DTCO, UG, U, & + O, OR, SG, S,GCP, & + HPROGRAM,HSURF,YFILE,YFILETYPE,ILUOUT,GUNIF) + ENDIF + CASE('SSS ') + ALLOCATE(S%XSSS(SIZE(ZFIELDOUT,1))) + S%XSSS(:) = ZFIELDOUT(:,1) + CASE('SIC ') + ALLOCATE(S%XSIC(SIZE(ZFIELDOUT,1))) + S%XSIC(:) = ZFIELDOUT(:,1) + CASE('HS ') + ALLOCATE(S%XHS(SIZE(ZFIELDOUT,1))) + S%XHS(:) = ZFIELDOUT(:,1) + CASE('TP ') + ALLOCATE(S%XTP(SIZE(ZFIELDOUT,1))) + S%XTP(:) = ZFIELDOUT(:,1) +END SELECT +! +!------------------------------------------------------------------------------------- +! +!* 6. Deallocations +! +DEALLOCATE(ZFIELDIN ) +DEALLOCATE(ZFIELDOUT) +IF (LHOOK) CALL DR_HOOK('PREP_HOR_SEAFLUX_FIELD',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------------- +! +END SUBROUTINE PREP_HOR_SEAFLUX_FIELD diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_seaflux.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_seaflux.F90 new file mode 100644 index 0000000000000000000000000000000000000000..38663733c7478d7353b44603583c874ea97fe48b --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_seaflux.F90 @@ -0,0 +1,240 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### +SUBROUTINE PREP_SEAFLUX (DTCO, UG, U, SM,GCP, & + HPROGRAM,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) +! ################################################################################# +! +!!**** *PREP_SEAFLUX* - prepares variables for SEAFLUX scheme +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S. Malardel +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! S. Riette 06/2009 PREP_SEAFLUX_SBL has no more argument +!! Modified 07/2012, P. Le Moigne : CMO1D phasing +!! Modified 01/2014, S. Senesi : introduce sea-ice model +!! Modified 01/2015, R. Séférian : introduce ocean surface albedo +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!!------------------------------------------------------------------ +! +! +USE MODD_SURFEX_n, ONLY : SEAFLUX_MODEL_t +! +! +USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t +USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +USE MODD_GRID_CONF_PROJ, ONLY : GRID_CONF_PROJ_t +! +USE MODI_PREP_HOR_SEAFLUX_FIELD +USE MODI_PREP_VER_SEAFLUX +USE MODI_PREP_OUTPUT_GRID +USE MODI_PREP_SEAFLUX_SBL +USE MODI_PREP_SEAICE +USE MODI_GET_LUOUT +! +USE MODN_PREP_SEAFLUX +USE MODD_READ_NAMELIST, ONLY : LNAM_READ +USE MODD_PREP, ONLY : XZS_LS +USE MODD_SURF_ATM, ONLY : LVERTSHIFT +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +USE MODI_CLEAN_PREP_OUTPUT_GRID +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO +TYPE(SURF_ATM_GRID_t), INTENT(INOUT) :: UG +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +TYPE(SEAFLUX_MODEL_t), INTENT(INOUT) :: SM +TYPE(GRID_CONF_PROJ_t),INTENT(INOUT) :: GCP +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes + CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! name of the Atmospheric file + CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! type of the Atmospheric file + CHARACTER(LEN=28), INTENT(IN) :: HPGDFILE ! name of the Atmospheric file + CHARACTER(LEN=6), INTENT(IN) :: HPGDFILETYPE! type of the Atmospheric file +! +!* 0.2 declarations of local variables +! +INTEGER :: JMTH,INMTH +INTEGER :: ILUOUT +LOGICAL :: GFOUND ! Return code when searching namelist +INTEGER :: ILUNAM ! logical unit of namelist file +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +!------------------------------------------------------------------------------------- +! +!* 0. Default of configuration +! +! +IF (LHOOK) CALL DR_HOOK('PREP_SEAFLUX',0,ZHOOK_HANDLE) + CALL GET_LUOUT(HPROGRAM,ILUOUT) +! + CALL PREP_OUTPUT_GRID(UG, U, & + ILUOUT,SM%SG%CGRID,SM%SG%XGRID_PAR,SM%SG%XLAT,SM%SG%XLON) +! +!------------------------------------------------------------------------------------- +! +!* 1. Read namelist +! +SM%S%LSBL = LSEA_SBL +SM%O%LMERCATOR = LOCEAN_MERCATOR +SM%O%LCURRENT = LOCEAN_CURRENT +! Relaxation-forcing parameters +SM%OR%XTAU_REL = XTIME_REL +SM%OR%XQCORR = XCORFLX +! +SM%OR%LREL_CUR = LCUR_REL +SM%OR%LREL_TS = LTS_REL +SM%OR%LFLUX_NULL = LZERO_FLUX +SM%OR%LFLX_CORR = LCORR_FLUX +SM%OR%LDIAPYCNAL = LDIAPYC +! +!------------------------------------------------------------------------------------- +! +!* 2. Reading and horizontal interpolations +! +! +!* 2.0 Large scale orography +! + CALL PREP_HOR_SEAFLUX_FIELD(DTCO, UG, U, & + SM%DTS, SM%O, SM%OR, SM%SG, SM%S, GCP,& + HPROGRAM,'ZS ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) +! +!* 2.1.1 Temperature +! + CALL PREP_HOR_SEAFLUX_FIELD(DTCO, UG, U, & + SM%DTS, SM%O, SM%OR, SM%SG, SM%S,GCP, & + HPROGRAM,'SST ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) +! +!* 2.1.2 Salinity +! + + CALL PREP_HOR_SEAFLUX_FIELD(DTCO, UG, U, & + SM%DTS, SM%O, SM%OR, SM%SG, SM%S,GCP, & + HPROGRAM,'SSS ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) +! +!* 2.1.3 Sea-ice +! +IF (CSEAICE_SCHEME /= 'NONE ') THEN + CALL PREP_SEAICE(UG, & + DTCO, SM%DTS, SM%O, SM%OR, SM%SG, SM%S, U,GCP, & + HPROGRAM,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) +ENDIF +! +!* 2.2 Significant height and peak period +! + CALL PREP_HOR_SEAFLUX_FIELD(DTCO, UG, U, & + SM%DTS, SM%O, SM%OR, SM%SG, SM%S,GCP, & + HPROGRAM,'HS ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) + CALL PREP_HOR_SEAFLUX_FIELD(DTCO, UG, U, & + SM%DTS, SM%O, SM%OR, SM%SG, SM%S,GCP, & + HPROGRAM,'TP ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE) +! +! +!* 2.2 Roughness +! +ALLOCATE(SM%S%XZ0(SIZE(SM%S%XSST))) +SM%S%XZ0 = 0.001 +! +ALLOCATE(SM%S%XZ0H(SIZE(SM%S%XSST))) +SM%S%XZ0H = SM%S%XZ0 +! +!* 2.3 Ocean Surface Albedo +! +IF(SM%S%CSEA_ALB=='RS14')THEN + ALLOCATE(SM%S%XDIR_ALB(SIZE(SM%S%XSST))) + ALLOCATE(SM%S%XSCA_ALB(SIZE(SM%S%XSST))) + SM%S%XDIR_ALB = 0.065 + SM%S%XSCA_ALB = 0.065 +ENDIF +! +!------------------------------------------------------------------------------------- + CALL CLEAN_PREP_OUTPUT_GRID +!------------------------------------------------------------------------------------- +! +!* 3. Vertical interpolations of all variables +! +IF(LVERTSHIFT)THEN + CALL PREP_VER_SEAFLUX(SM%S) +ENDIF +! +DEALLOCATE(XZS_LS) +! +!------------------------------------------------------------------------------------- +! +!* 4. Preparation of optional interpolation of monthly sst +! +SM%S%LINTERPOL_SST=.FALSE. +IF(TRIM(SM%S%CINTERPOL_SST)/='NONE')THEN +! + SM%S%LINTERPOL_SST=.TRUE. +! +! Precedent, Current, Next, and Second-next Monthly SST + INMTH=4 +! + ALLOCATE(SM%S%XSST_MTH(SIZE(SM%S%XSST),INMTH)) + DO JMTH=1,INMTH + SM%S%XSST_MTH(:,JMTH)=SM%S%XSST(:) + ENDDO +! +ENDIF +! +!------------------------------------------------------------------------------------- +! +! +!* 5. Optional preparation of interpolation of monthly Sea Surface salinity +! +SM%S%LINTERPOL_SSS=.FALSE. +IF(TRIM(SM%S%CINTERPOL_SSS)/='NONE')THEN +! + SM%S%LINTERPOL_SSS=.TRUE. + ! + ! Precedent, Current, Next, and Second-next Monthly SSS + INMTH=4 + ! + ALLOCATE(SM%S%XSSS_MTH(SIZE(SM%S%XSSS),INMTH)) + DO JMTH=1,INMTH + SM%S%XSSS_MTH(:,JMTH)=SM%S%XSSS(:) + ENDDO + ! +ENDIF +! +!------------------------------------------------------------------------------------- +! +!* 6. Preparation of SBL air variables +! +! +IF (SM%S%LSBL) CALL PREP_SEAFLUX_SBL(SM%SG, SM%SSB) +! +!------------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('PREP_SEAFLUX',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------------- +! +END SUBROUTINE PREP_SEAFLUX diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_seaflux_netcdf.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_seaflux_netcdf.F90 new file mode 100644 index 0000000000000000000000000000000000000000..347693749b4e67aa7a5120703d070af723993338 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_seaflux_netcdf.F90 @@ -0,0 +1,127 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### +SUBROUTINE PREP_SEAFLUX_NETCDF(HPROGRAM,HSURF,HFILE,KLUOUT,PFIELD) +! ################################################################################# +! +!!**** *PREP_SEAFLUX_NETCDF* - prepares SEAFLUX fields from oceanic analyses in NETCDF +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! C. Lebeaupin Brossier +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2008 +!! Modified 09/2013 : S. Senesi : extends to SSS and SIC fields +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!!------------------------------------------------------------------ +! +USE MODE_READ_NETCDF_MERCATOR +! +!USE MODD_TYPE_DATE_SURF +! +USE MODD_PREP, ONLY : CINGRID_TYPE +USE MODD_GRID_LATLONREGUL, ONLY : NILENGTH +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes + CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field + CHARACTER(LEN=28), INTENT(IN) :: HFILE ! name of file +INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing +REAL,DIMENSION(:,:), POINTER :: PFIELD ! field to interpolate horizontally +! +!* 0.2 declarations of local variables +! +!TYPE (DATE_TIME) :: TZTIME_GRIB ! current date and time +!CHARACTER(LEN=6) :: YINMODEL ! model from which GRIB file originates +REAL, DIMENSION(:), POINTER :: ZFIELD ! field read + CHARACTER(LEN=28) :: YNCVAR +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------------- +! +!* 1. Grid type +! --------- +IF (LHOOK) CALL DR_HOOK('PREP_SEAFLUX_NETCDF',0,ZHOOK_HANDLE) +CINGRID_TYPE='LATLON ' +! +!* 2. Reading of field +! ---------------- +!----------------- +SELECT CASE(HSURF) +!----------------- +! +!* 2.1 Orography +! --------- +! + CASE('ZS ') + YNCVAR='topo' + CALL PREP_NETCDF_GRID(HFILE,YNCVAR) + CALL READ_NETCDF_ZS_SEA(HFILE,YNCVAR,ZFIELD) + ALLOCATE(PFIELD(MAX(1,NILENGTH),1)) + PFIELD(:,1) = ZFIELD(:) + DEALLOCATE(ZFIELD) +! +! +!* 2.2 Temperature profiles +! -------------------- +! + CASE('SST ','SSS ','SIC ') + IF ( HSURF == 'SST ') THEN + YNCVAR='temperature' + ELSE IF ( HSURF == 'SSS ') THEN + YNCVAR='sss' + ELSE IF ( HSURF == 'SIC ') THEN + YNCVAR='sic' + END IF + CALL PREP_NETCDF_GRID(HFILE,YNCVAR) + CALL READ_NETCDF_SST(HFILE,YNCVAR,ZFIELD) + ALLOCATE(PFIELD(MAX(1,NILENGTH),1)) + PFIELD(:,1) = ZFIELD(:) + DEALLOCATE(ZFIELD) +! +! +!* 2.3 Wave parameters +! -------------------- +! + CASE('HS ') + YNCVAR='significant_h' + CALL PREP_NETCDF_GRID(HFILE,YNCVAR) + CALL READ_NETCDF_WAVE(HFILE,YNCVAR,ZFIELD) + ALLOCATE(PFIELD(MAX(1,NILENGTH),1)) + PFIELD(:,1) = ZFIELD(:) + DEALLOCATE(ZFIELD) +! + CASE('TP ') + YNCVAR='peak_period' + CALL PREP_NETCDF_GRID(HFILE,YNCVAR) + CALL READ_NETCDF_WAVE(HFILE,YNCVAR,ZFIELD) + ALLOCATE(PFIELD(MAX(1,NILENGTH),1)) + PFIELD(:,1) = ZFIELD(:) + DEALLOCATE(ZFIELD) +! +END SELECT +IF (LHOOK) CALL DR_HOOK('PREP_SEAFLUX_NETCDF',1,ZHOOK_HANDLE) +!------------------------------------------------------------------------------------- +END SUBROUTINE PREP_SEAFLUX_NETCDF diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_seaflux_unif.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_seaflux_unif.F90 new file mode 100644 index 0000000000000000000000000000000000000000..7af8afcc85c3657e2f0979ed1ee0c9b925115e0b --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/prep_seaflux_unif.F90 @@ -0,0 +1,103 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### +SUBROUTINE PREP_SEAFLUX_UNIF(KLUOUT,HSURF,PFIELD) +! ################################################################################# +! +!!**** *PREP_SEAFLUX_UNIF* - prepares SEAFLUX field from prescribed values +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S. Malardel +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! Modified 09/2013 : S. Senesi : extends to SSS and SIC variables +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!!------------------------------------------------------------------ +! + +! +USE MODD_PREP, ONLY : CINTERP_TYPE +USE MODD_PREP_SEAFLUX, ONLY : XSST_UNIF, XSSS_UNIF, XSIC_UNIF +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KLUOUT ! output listing logical unit + CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field +REAL, POINTER, DIMENSION(:,:) :: PFIELD ! field to interpolate horizontally +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!* 0.2 declarations of local variables +! +! +!------------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('PREP_SEAFLUX_UNIF',0,ZHOOK_HANDLE) +SELECT CASE(HSURF) +! +!* 3.0 Orography +! + CASE('ZS ') + ALLOCATE(PFIELD(1,1)) + PFIELD = 0. +! +!* 3.1 Sea surface temperature +! + CASE('SST ') + ALLOCATE(PFIELD(1,1)) + PFIELD = XSST_UNIF +! +!* 3.2 Sea surface salinity +! + CASE('SSS ') + ALLOCATE(PFIELD(1,1)) + PFIELD = XSSS_UNIF +! +! +!* 3.3 Sea Ice Cover +! + CASE('SIC ') + ALLOCATE(PFIELD(1,1)) + PFIELD = XSIC_UNIF +! +!* 3.4 Wave parameters +! + CASE('HS ') + ALLOCATE(PFIELD(1,1)) + PFIELD = 1. +! + CASE('TP ') + ALLOCATE(PFIELD(1,1)) + PFIELD = 8. +END SELECT +! +!* 4. Interpolation method +! -------------------- +! +CINTERP_TYPE='UNIF ' +IF (LHOOK) CALL DR_HOOK('PREP_SEAFLUX_UNIF',1,ZHOOK_HANDLE) +! +! +!------------------------------------------------------------------------------------- +END SUBROUTINE PREP_SEAFLUX_UNIF diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/put_sfx_sea.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/put_sfx_sea.F90 new file mode 100644 index 0000000000000000000000000000000000000000..779c8076a1572b62ae115ef86e0a7a856d096bbe --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/put_sfx_sea.F90 @@ -0,0 +1,291 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE PUT_SFX_SEA (S, U, W, & + KLUOUT,OCPL_SEAICE,OWATER,PSEA_SST,PSEA_UCU, & + PSEA_VCU,PSEAICE_SIT,PSEAICE_CVR,PSEAICE_ALB ) +! #################################################### +! +!!**** *PUT_SFX_SEA* - routine to put some variables from +!! an oceanic general circulation model +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 08/2009 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +USE MODD_WATFLUX_n, ONLY : WATFLUX_t +! +USE MODD_SURF_PAR, ONLY : NUNDEF, XUNDEF +USE MODD_SFX_OASIS +USE MODD_CSTS, ONLY : XTT, XTTS, XICEC +! +! +USE MODI_PACK_SAME_RANK +USE MODI_ABOR1_SFX +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +TYPE(WATFLUX_t), INTENT(INOUT) :: W +! +INTEGER, INTENT(IN) :: KLUOUT +LOGICAL, INTENT(IN) :: OCPL_SEAICE +LOGICAL, INTENT(IN) :: OWATER +! +REAL, DIMENSION(:), INTENT(IN) :: PSEA_SST +REAL, DIMENSION(:), INTENT(IN) :: PSEA_UCU +REAL, DIMENSION(:), INTENT(IN) :: PSEA_VCU +REAL, DIMENSION(:), INTENT(IN) :: PSEAICE_SIT +REAL, DIMENSION(:), INTENT(IN) :: PSEAICE_CVR +REAL, DIMENSION(:), INTENT(IN) :: PSEAICE_ALB +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +! + CHARACTER(LEN=50) :: YCOMMENT +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_SEA',0,ZHOOK_HANDLE) +! +!* 1.0 Initialization +! -------------- +! +! +!* 2.0 Get variable over sea +! --------------------- +! +IF(U%NSIZE_SEA>0)THEN +! + CALL TREAT_SEA(U%NSIZE_SEA) +! +ENDIF +! +!* 3.0 Get variable over water without flake +! ------------------------------------- +! +IF(OWATER.AND.U%NSIZE_WATER>0)THEN +! + CALL TREAT_WATER(U%NSIZE_WATER) +! +ENDIF +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_SEA',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- + CONTAINS +!------------------------------------------------------------------------------- +! +SUBROUTINE TREAT_SEA(KLU) +! +USE MODI_PACK_SAME_RANK +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KLU +! +REAL, DIMENSION(KLU) :: ZSST ! sea surface temperature +REAL, DIMENSION(KLU) :: ZICE_FRAC! ice fraction +REAL :: ZTMIN ! Minimum temperature over this proc +REAL :: ZTMAX ! Maximum temperature over this proc + CHARACTER(LEN=50) :: YCOMMENT +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_SEA:TREAT_SEA',0,ZHOOK_HANDLE) +! +IF(NSEA_SST_ID/=NUNDEF)THEN + YCOMMENT='Sea surface temperature' + CALL PACK_SAME_RANK(U%NR_SEA(:),PSEA_SST(:),ZSST(:)) + WHERE (ZSST(:)/=0.0) S%XSST(:)=ZSST(:) + CALL CHECK_SEA(YCOMMENT,S%XSST(:)) +! + ZTMIN=MINVAL(S%XSST(:)) + ZTMAX=MAXVAL(S%XSST(:)) +! + IF(ZTMIN<=0.0.OR.ZTMAX>500.)THEN + WRITE(KLUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(KLUOUT,*)'SST from ocean model not define or not physic' + WRITE(KLUOUT,*)'SST MIN =',ZTMIN,'SST MAX =',ZTMAX + WRITE(KLUOUT,*)'There is certainly a problem between ' + WRITE(KLUOUT,*)'SURFEX and OASIS sea/land mask ' + WRITE(KLUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + CALL ABOR1_SFX('PUT_SFX_SEA: SST from ocean model not define or not physic') + ENDIF +ENDIF +! +IF(NSEA_UCU_ID/=NUNDEF)THEN + YCOMMENT='Sea u-current stress' + CALL PACK_SAME_RANK(U%NR_SEA(:),PSEA_UCU(:),S%XUMER(:)) + CALL CHECK_SEA(YCOMMENT,S%XUMER(:)) +ENDIF +! +IF(NSEA_VCU_ID/=NUNDEF)THEN + YCOMMENT='Sea v-current stress' + CALL PACK_SAME_RANK(U%NR_SEA(:),PSEA_VCU(:),S%XVMER(:)) + CALL CHECK_SEA(YCOMMENT,S%XVMER(:)) +ENDIF +! +IF(OCPL_SEAICE)THEN +! + YCOMMENT='Sea-ice Temperature' + CALL PACK_SAME_RANK(U%NR_SEA(:),PSEAICE_SIT(:),S%XTICE(:)) + CALL CHECK_SEA(YCOMMENT,S%XTICE(:)) +! + YCOMMENT='Sea-ice cover' + CALL PACK_SAME_RANK(U%NR_SEA(:),PSEAICE_CVR(:),ZICE_FRAC(:)) + CALL CHECK_SEA(YCOMMENT,ZICE_FRAC(:)) +! + WHERE(ZICE_FRAC(:)>=XICEC) + S%XSST(:) = MIN(S%XSST(:),XTTS-0.01) + ELSEWHERE + S%XSST(:) = MAX(S%XSST(:),XTTS) + ENDWHERE +! + YCOMMENT='Sea-ice albedo' + CALL PACK_SAME_RANK(U%NR_SEA(:),PSEAICE_ALB(:),S%XICE_ALB(:)) + CALL CHECK_SEA(YCOMMENT,S%XICE_ALB(:)) +! +! Fill the table with sea ice albedo where temperature is lower than the +! freezing point + WHERE(S%XSST(:) < XTTS) + S%XDIR_ALB(:)=S%XICE_ALB(:) + S%XSCA_ALB(:)=S%XICE_ALB(:) + ENDWHERE +! +ENDIF +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_SEA:TREAT_SEA',1,ZHOOK_HANDLE) +! +END SUBROUTINE TREAT_SEA +! +!------------------------------------------------------------------------------- +! +SUBROUTINE TREAT_WATER(KLU) +! +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KLU +! +REAL, DIMENSION(KLU) :: ZICE_FRAC! ice fraction +REAL :: ZTMIN ! Minimum temperature over this proc +REAL :: ZTMAX ! Maximum temperature over this proc + CHARACTER(LEN=50) :: YCOMMENT +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_SEA:TREAT_WATER',0,ZHOOK_HANDLE) +! +YCOMMENT='Water surface temperature' + CALL PACK_SAME_RANK(U%NR_WATER(:),PSEA_SST(:),W%XTS(:)) + CALL CHECK_SEA(YCOMMENT,W%XTS(:)) +! +ZTMIN=MINVAL(W%XTS(:)) +ZTMAX=MAXVAL(W%XTS(:)) +! +IF(ZTMIN<=0.0.OR.ZTMAX>500.)THEN + WRITE(KLUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(KLUOUT,*)'TS_WATER from ocean model not define or not physic' + WRITE(KLUOUT,*)'TS_WATER MIN =',ZTMIN,'TS_WATER MAX =',ZTMAX + WRITE(KLUOUT,*)'There is certainly a problem between ' + WRITE(KLUOUT,*)'SURFEX and OASIS sea/land mask ' + WRITE(KLUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + CALL ABOR1_SFX('PUT_SFX_SEA: SST from ocean model not define or not physic') +ENDIF +! +YCOMMENT='Water-ice Temperature' + CALL PACK_SAME_RANK(U%NR_WATER(:),PSEAICE_SIT(:),W%XTICE(:)) + CALL CHECK_SEA(YCOMMENT,W%XTICE(:)) +! +YCOMMENT='Water-ice cover' + CALL PACK_SAME_RANK(U%NR_WATER(:),PSEAICE_CVR(:),ZICE_FRAC(:)) + CALL CHECK_SEA(YCOMMENT,ZICE_FRAC(:)) +! +WHERE(ZICE_FRAC(:)>=XICEC) + W%XTS(:) = MIN(W%XTS(:),XTT-0.01) +ELSEWHERE + W%XTS(:) = MAX(W%XTS(:),XTT) +ENDWHERE +! +YCOMMENT='Water-ice albedo' + CALL PACK_SAME_RANK(U%NR_WATER(:),PSEAICE_ALB(:),W%XICE_ALB(:)) + CALL CHECK_SEA(YCOMMENT,W%XICE_ALB(:)) +! +! Fill the table with sea ice albedo where temperature is lower than the freezing +! point +WHERE(W%XTS(:) < XTT) + W%XDIR_ALB(:)=W%XICE_ALB(:) + W%XSCA_ALB(:)=W%XICE_ALB(:) +ENDWHERE +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_SEA:TREAT_WATER',1,ZHOOK_HANDLE) +! +END SUBROUTINE TREAT_WATER +! +!------------------------------------------------------------------------------- +! +SUBROUTINE CHECK_SEA(HCOMMENT,PFIELD) +! +IMPLICIT NONE +! + CHARACTER(LEN=*), INTENT(IN) :: HCOMMENT +REAL, DIMENSION(:), INTENT(IN) :: PFIELD +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_SEA:CHECK_SEA',0,ZHOOK_HANDLE) +! +IF(ANY(PFIELD(:)>=XUNDEF))THEN + WRITE(KLUOUT,*)'PUT_SFX_SEA: problem after get '//TRIM(HCOMMENT)//' from OASIS' + WRITE(KLUOUT,*)'PUT_SFX_SEA: some points not defined = ',COUNT(PFIELD(:)>=XUNDEF) + CALL ABOR1_SFX('PUT_SFX_SEA: problem after get '//TRIM(HCOMMENT)//' from OASIS') +ENDIF +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_SEA:CHECK_SEA',1,ZHOOK_HANDLE) +! +END SUBROUTINE CHECK_SEA +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE PUT_SFX_SEA diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/put_sfx_wave.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/put_sfx_wave.F90 new file mode 100755 index 0000000000000000000000000000000000000000..5b63f5948b50303b06b06207a8c766ad280d4a2c --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/put_sfx_wave.F90 @@ -0,0 +1,175 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE PUT_SFX_WAVE(S, U, & + KLUOUT,PWAVE_CHA,PWAVE_UCU,PWAVE_VCU,PWAVE_HS,PWAVE_TP) +! #################################################### +! +!!**** *PUT_SFX_WAVE* - routine to put some variables from +!! a wave model +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! J. Pianezze *LPO* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/2014 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +! +USE MODD_SURF_PAR, ONLY : NUNDEF, XUNDEF +USE MODD_SFX_OASIS +! +USE MODI_PACK_SAME_RANK +USE MODI_ABOR1_SFX +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +! +INTEGER, INTENT(IN) :: KLUOUT +! +REAL, DIMENSION(:), INTENT(IN) :: PWAVE_CHA +REAL, DIMENSION(:), INTENT(IN) :: PWAVE_UCU +REAL, DIMENSION(:), INTENT(IN) :: PWAVE_VCU +REAL, DIMENSION(:), INTENT(IN) :: PWAVE_HS +REAL, DIMENSION(:), INTENT(IN) :: PWAVE_TP +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +! +CHARACTER(LEN=50) :: YCOMMENT +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_WAVE',0,ZHOOK_HANDLE) +! +!* 1.0 Initialization +! -------------- +! +! +!* 2.0 Get variable over wave +! --------------------- +! +IF(U%NSIZE_SEA>0)THEN +! + CALL TREAT_WAVE(U%NSIZE_SEA) +! +ENDIF +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_WAVE',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +CONTAINS +!------------------------------------------------------------------------------- +! +SUBROUTINE TREAT_WAVE(KLU) +! +USE MODI_PACK_SAME_RANK +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KLU +! +CHARACTER(LEN=50) :: YCOMMENT +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_WAVE:TREAT_WAVE',0,ZHOOK_HANDLE) +! +IF(NWAVE_CHA_ID/=NUNDEF)THEN + YCOMMENT='Charnock coefficient' + CALL PACK_SAME_RANK(U%NR_SEA(:),PWAVE_CHA(:),S%XCHARN(:)) + CALL CHECK_WAVE(YCOMMENT,S%XCHARN(:)) +ENDIF +! +IF(NWAVE_UCU_ID/=NUNDEF)THEN + YCOMMENT='u-current velocity' + CALL PACK_SAME_RANK(U%NR_SEA(:),PWAVE_UCU(:),S%XUMER(:)) + CALL CHECK_WAVE(YCOMMENT,S%XUMER(:)) +ENDIF +! +IF(NWAVE_VCU_ID/=NUNDEF)THEN + YCOMMENT='v-current velocity' + CALL PACK_SAME_RANK(U%NR_SEA(:),PWAVE_VCU(:),S%XVMER(:)) + CALL CHECK_WAVE(YCOMMENT,S%XVMER(:)) +ENDIF +! +IF(NWAVE_HS_ID/=NUNDEF)THEN + YCOMMENT='Significant wave height' + CALL PACK_SAME_RANK(U%NR_SEA(:),PWAVE_HS(:),S%XHS(:)) + CALL CHECK_WAVE(YCOMMENT,S%XHS(:)) +ENDIF +! +IF(NWAVE_TP_ID/=NUNDEF)THEN + YCOMMENT='Peak period' + CALL PACK_SAME_RANK(U%NR_SEA(:),PWAVE_TP(:),S%XTP(:)) + CALL CHECK_WAVE(YCOMMENT,S%XTP(:)) +ENDIF +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_WAVE:TREAT_WAVE',1,ZHOOK_HANDLE) +! +END SUBROUTINE TREAT_WAVE +! +!------------------------------------------------------------------------------- +! +SUBROUTINE CHECK_WAVE(HCOMMENT,PFIELD) +! +IMPLICIT NONE +! +CHARACTER(LEN=*), INTENT(IN) :: HCOMMENT +REAL, DIMENSION(:), INTENT(IN) :: PFIELD +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_WAVE:CHECK_WAVE',0,ZHOOK_HANDLE) +! +IF(ANY(PFIELD(:)>=XUNDEF))THEN + WRITE(KLUOUT,*)'PUT_SFX_WAVE: problem after get '//TRIM(HCOMMENT)//' from OASIS' + WRITE(KLUOUT,*)'PUT_SFX_WAVE: some points not defined = ',COUNT(PFIELD(:)>=XUNDEF) + CALL ABOR1_SFX('PUT_SFX_WAVE: problem after get '//TRIM(HCOMMENT)//' from OASIS') +ENDIF +! +IF (LHOOK) CALL DR_HOOK('PUT_SFX_WAVE:CHECK_WAVE',1,ZHOOK_HANDLE) +! +END SUBROUTINE CHECK_WAVE +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE PUT_SFX_WAVE diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/put_sfxcpln.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/put_sfxcpln.F90 new file mode 100644 index 0000000000000000000000000000000000000000..32a3cabc22a39dd12711ca9e6afb66b523cf682e --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/put_sfxcpln.F90 @@ -0,0 +1,195 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### +SUBROUTINE PUT_SFXCPL_n (F, I, S, U, W, & + HPROGRAM,KI,KSW,PSW_BANDS,PZENITH, & + PLAND_WTD,PLAND_FWTD,PLAND_FFLOOD, & + PLAND_PIFLOOD,PSEA_SST,PSEA_UCU, & + PSEA_VCU,PSEAICE_SIT,PSEAICE_CVR, & + PSEAICE_ALB,PTSRAD, & + PDIR_ALB,PSCA_ALB,PEMIS,PTSURF, & + PWAVE_CHA,PWAVE_UCU,PWAVE_VCU, & + PWAVE_HS,PWAVE_TP ) +! ################################################################################################# +! +!!**** *PUT_SFXCPL_n* - routine to modify some variables in surfex from information coming +! from an ocean and/or a river routing model (but already on Surfex grid) +! +! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 08/2009 +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +! +! +! +! +! +USE MODD_FLAKE_n, ONLY : FLAKE_t +USE MODD_ISBA_n, ONLY : ISBA_t +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +USE MODD_WATFLUX_n, ONLY : WATFLUX_t +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +USE MODN_SFX_OASIS, ONLY : LWATER +USE MODD_SFX_OASIS, ONLY : LCPL_SEA, LCPL_SEAICE, & + LCPL_LAND, LCPL_GW, & + LCPL_FLOOD, LCPL_WAVE +! +USE MODI_GET_LUOUT +! +USE MODI_ABOR1_SFX +USE MODI_PUT_SFX_LAND +USE MODI_PUT_SFX_SEA +USE MODI_PUT_SFX_WAVE +USE MODI_UPDATE_ESM_SURF_ATM_n +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +TYPE(FLAKE_t), INTENT(INOUT) :: F +TYPE(ISBA_t), INTENT(INOUT) :: I +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +TYPE(WATFLUX_t), INTENT(INOUT) :: W +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM +INTEGER, INTENT(IN) :: KI ! number of points +INTEGER, INTENT(IN) :: KSW ! number of bands +! +REAL, DIMENSION(KI), INTENT(IN) :: PZENITH +REAL, DIMENSION(KSW), INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m) +! +REAL, DIMENSION(KI), INTENT(IN) :: PLAND_WTD ! Land water table depth (m) +REAL, DIMENSION(KI), INTENT(IN) :: PLAND_FWTD ! Land grid-cell fraction of water table rise (-) +REAL, DIMENSION(KI), INTENT(IN) :: PLAND_FFLOOD ! Land Floodplains fraction (-) +REAL, DIMENSION(KI), INTENT(IN) :: PLAND_PIFLOOD ! Land Potential flood infiltration (kg/m2) +! +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_SST ! Sea surface temperature (K) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_UCU ! Sea u-current stress (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_VCU ! Sea v-current stress (Pa) +! +REAL, DIMENSION(KI), INTENT(IN) :: PSEAICE_SIT ! Sea-ice Temperature (K) +REAL, DIMENSION(KI), INTENT(IN) :: PSEAICE_CVR ! Sea-ice cover (-) +REAL, DIMENSION(KI), INTENT(IN) :: PSEAICE_ALB ! Sea-ice albedo (-) +! +REAL, DIMENSION(KI), INTENT(IN) :: PWAVE_CHA ! Charnock coefficient (-) +REAL, DIMENSION(KI), INTENT(IN) :: PWAVE_UCU ! u-current velocity (m/s) +REAL, DIMENSION(KI), INTENT(IN) :: PWAVE_VCU ! v-current velocity (m/s) +REAL, DIMENSION(KI), INTENT(IN) :: PWAVE_HS ! Significant wave height (m) +REAL, DIMENSION(KI), INTENT(IN) :: PWAVE_TP ! Peak period (s) +! +REAL, DIMENSION(KI), INTENT(OUT) :: PTSRAD ! Total radiative temperature see by the atmosphere +REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! Total surface temperature see by the atmosphere +REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! Total emissivity see by the atmosphere +REAL, DIMENSION(KI,KSW), INTENT(OUT) :: PDIR_ALB ! Total direct albedo see by the atmosphere +REAL, DIMENSION(KI,KSW), INTENT(OUT) :: PSCA_ALB ! Total diffus albedo see by the atmosphere +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +! +INTEGER :: ILU, ILUOUT +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('PUT_SFXCL_N',0,ZHOOK_HANDLE) +! +CALL GET_LUOUT(HPROGRAM,ILUOUT) +!------------------------------------------------------------------------------- +! +! Global argument +! +IF(KI/=U%NSIZE_FULL)THEN + WRITE(ILUOUT,*) 'size of field from the coupler :', KI + WRITE(ILUOUT,*) 'size of field in SURFEX :', U%NSIZE_FULL + CALL ABOR1_SFX('PUT_SFXCPL_N: VECTOR SIZE NOT CORRECT FOR COUPLING') +ENDIF +! +!------------------------------------------------------------------------------- +! Put variable over land tile +!------------------------------------------------------------------------------- +! +IF(LCPL_LAND)THEN + CALL PUT_SFX_LAND(I, U, & + ILUOUT,LCPL_GW,LCPL_FLOOD,PLAND_WTD(:), & + PLAND_FWTD(:),PLAND_FFLOOD(:),PLAND_PIFLOOD(:)) +ENDIF +! +!------------------------------------------------------------------------------- +! Put variable over sea and/or water tile +!------------------------------------------------------------------------------- +! +IF(LCPL_SEA)THEN +! + CALL PUT_SFX_SEA(S, U, W, & + ILUOUT,LCPL_SEAICE,LWATER,PSEA_SST(:),PSEA_UCU(:), & + PSEA_VCU(:),PSEAICE_SIT(:),PSEAICE_CVR(:),PSEAICE_ALB(:) ) +! +ENDIF +! +!------------------------------------------------------------------------------- +! Put variable over sea and/or water tile for waves +!------------------------------------------------------------------------------- +! +IF(LCPL_WAVE)THEN +! + CALL PUT_SFX_WAVE(S, U, & + ILUOUT,PWAVE_CHA(:),PWAVE_UCU(:),PWAVE_VCU(:),PWAVE_HS(:),PWAVE_TP(:) ) +! +ENDIF +! +!------------------------------------------------------------------------------- +! Update radiative properties at time t+1 for radiative scheme +!------------------------------------------------------------------------------- +! +IF(LCPL_SEA.OR.LCPL_FLOOD)THEN + CALL UPDATE_ESM_SURF_ATM_n(F, I, S, U, W, & + HPROGRAM, KI, KSW, PZENITH, PSW_BANDS, & + PTSRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF ) +ENDIF +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('PUT_SFXCL_N',1,ZHOOK_HANDLE) +! +! +END SUBROUTINE PUT_SFXCPL_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/read_lcover.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_lcover.F90 new file mode 100644 index 0000000000000000000000000000000000000000..6855dbefa151938646e7f1bd3c8010fb434a2689 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_lcover.F90 @@ -0,0 +1,113 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE READ_LCOVER (& + HPROGRAM,OCOVER) +! ################################ +! +!!**** *READ_LCOVER* - routine to read a file for +!! physiographic data file of model _n +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialise the list of covers +!! +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/2008 +!! M. Moge 02/2015 parallelization +!! J. Pianezze 08/2016 replacement of MPI_COMM_WOLRD by NMNH_COMM_WORLD +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +#ifdef MNH_PARALLEL +USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD +#endif +! +USE MODD_DATA_COVER_PAR, ONLY : JPCOVER +! +USE MODI_READ_SURF +USE MODI_OLD_NAME +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +#ifndef NOMPI +INCLUDE "mpif.h" +#endif +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program +LOGICAL, DIMENSION(JPCOVER) :: OCOVER ! list of covers +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: IRESP ! Error code after redding + CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read +INTEGER :: IVERSION ! version of surfex file being read +LOGICAL, DIMENSION(:), ALLOCATABLE :: GCOVER ! cover list in the file +REAL(KIND=JPRB) :: ZHOOK_HANDLE +INTEGER :: IINFO +!------------------------------------------------------------------------------- +! +! +!* ascendant compatibility +IF (LHOOK) CALL DR_HOOK('READ_LCOVER',0,ZHOOK_HANDLE) +YRECFM='VERSION' + CALL READ_SURF(& + HPROGRAM,YRECFM,IVERSION,IRESP) +IF (IVERSION<=3) THEN + ALLOCATE(GCOVER(255)) +ELSE + ALLOCATE(GCOVER(JPCOVER)) +END IF + CALL OLD_NAME(& + HPROGRAM,'COVER_LIST ',YRECFM) + CALL READ_SURF(& + HPROGRAM,YRECFM,GCOVER(:),IRESP,HDIR='-') +! +OCOVER=.FALSE. +OCOVER(:SIZE(GCOVER))=GCOVER(:) +#ifndef NOMPI +#ifdef MNH_PARALLEL +CALL MPI_ALLREDUCE(GCOVER, OCOVER, SIZE(GCOVER),MPI_LOGICAL, MPI_LOR, NMNH_COMM_WORLD, IINFO) +#else +CALL MPI_ALLREDUCE(GCOVER, OCOVER, SIZE(GCOVER),MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, IINFO) +#endif +#endif +DEALLOCATE(GCOVER) +IF (LHOOK) CALL DR_HOOK('READ_LCOVER',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE READ_LCOVER diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/read_nam_prep_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_nam_prep_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..0249c23c120db5085f6577b16e11209405fa0ba6 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_nam_prep_seafluxn.F90 @@ -0,0 +1,64 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### +SUBROUTINE READ_NAM_PREP_SEAFLUX_n(HPROGRAM) +! ####################################################### +! +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!--------------------------------------- +! +USE MODD_SURF_PAR, ONLY : XUNDEF, NUNDEF +USE MODN_PREP_SEAFLUX + +USE MODI_DEFAULT_PREP_SEAFLUX +! +USE MODI_TEST_NAM_VAR_SURF +USE MODI_GET_LUOUT +USE MODI_OPEN_NAMELIST +USE MODI_CLOSE_NAMELIST +USE MODE_POS_SURF +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes +! +INTEGER :: ILUNAM ! logical unit of namelist file +INTEGER :: ILUOUT +LOGICAL :: GFOUND ! Return code when searching namelist +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!--------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('READ_NAM_PREP_SEAFLUX_N',0,ZHOOK_HANDLE) +NYEAR=NUNDEF +NMONTH=NUNDEF +NDAY=NUNDEF +XTIME=XUNDEF +! + CALL GET_LUOUT(HPROGRAM,ILUOUT) +! + CALL DEFAULT_PREP_SEAFLUX +! + CALL OPEN_NAMELIST(HPROGRAM,ILUNAM) + CALL POSNAM(ILUNAM,'NAM_PREP_SEAFLUX',GFOUND,ILUOUT) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PREP_SEAFLUX) + CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM) +! + CALL TEST_NAM_VAR_SURF(ILUOUT,'CTYPE_SEAFLX', CTYPE_SEAFLX, ' ','GRIB ','MESONH',& + 'ASCII ','NETCDF','LFI ','FA ') + CALL TEST_NAM_VAR_SURF(ILUOUT,'CTYPEPGD', CTYPEPGD, ' ','GRIB ','MESONH','ASCII ','LFI ','FA ') + CALL TEST_NAM_VAR_SURF(ILUOUT,'CSEAICE_SCHEME',CSEAICE_SCHEME,'GELATO','NONE ') + CALL TEST_NAM_VAR_SURF(ILUOUT,'CTYPEWAVE', CTYPEWAVE, ' ','GRIB ','MESONH','ASCII ',& + 'NETCDF','LFI ') +! +IF (LHOOK) CALL DR_HOOK('READ_NAM_PREP_SEAFLUX_N',1,ZHOOK_HANDLE) +!------------------------------------ +! +END SUBROUTINE READ_NAM_PREP_SEAFLUX_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/read_namelists_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_namelists_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..b781df3afd5d510f2b9dd41cd0faf8c1a3e0bcb5 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_namelists_seafluxn.F90 @@ -0,0 +1,71 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### +SUBROUTINE READ_NAMELISTS_SEAFLUX_n (SM, & + HPROGRAM,HINIT) +! ####################################################### +! +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!--------------------------------------------------------------------------- +! +! +! +USE MODD_SURFEX_n, ONLY : SEAFLUX_MODEL_t +! +USE MODN_SEAFLUX_n +! +USE MODI_DEFAULT_SEAFLUX +USE MODI_DEFAULT_CH_DEP +USE MODI_DEFAULT_DIAG_SEAFLUX +USE MODI_READ_DEFAULT_SEAFLUX_n +USE MODI_DEFAULT_SEAICE +USE MODI_READ_SEAFLUX_CONF_n +! +USE MODI_READ_NAM_PREP_SEAFLUX_n +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +! +TYPE(SEAFLUX_MODEL_t), INTENT(INOUT) :: SM +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes + CHARACTER(LEN=3), INTENT(IN) :: HINIT ! choice of fields to initialize +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!--------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('READ_NAMELISTS_SEAFLUX_N',0,ZHOOK_HANDLE) +! + CALL DEFAULT_SEAFLUX(XTSTEP,XOUT_TSTEP,CSEA_ALB,CSEA_FLUX,LPWG, & + LPRECIP,LPWEBB,NZ0,NGRVWAVES,LPROGSST, & + NTIME_COUPLING,XOCEAN_TSTEP,XICHCE,CINTERPOL_SST,& + CINTERPOL_SSS,LWAVEWIND) + CALL DEFAULT_SEAICE(HPROGRAM, CINTERPOL_SIC, CINTERPOL_SIT, & + XFREEZING_SST,XSEAICE_TSTEP, XSIC_EFOLDING_TIME, & + XSIT_EFOLDING_TIME, XCD_ICE_CST, XSI_FLX_DRV ) +! + CALL DEFAULT_CH_DEP(CCH_DRY_DEP) +! + CALL DEFAULT_DIAG_SEAFLUX(N2M,LSURF_BUDGET,L2M_MIN_ZS,LRAD_BUDGET,LCOEF,LSURF_VARS,& + LDIAG_OCEAN,LDIAG_SEAICE,LSURF_BUDGETC,LRESET_BUDGETC,XDIAG_TSTEP) +! + CALL READ_DEFAULT_SEAFLUX_n(SM%CHS, SM%DGO, SM%DGS, SM%DGSI, SM%O, SM%S, & + HPROGRAM) +! + CALL READ_SEAFLUX_CONF_n(SM%CHS, SM%DGO, SM%DGS, SM%DGSI, SM%O, SM%S, & + HPROGRAM) +! +IF (HINIT=='PRE') CALL READ_NAM_PREP_SEAFLUX_n(HPROGRAM) +! +IF (LHOOK) CALL DR_HOOK('READ_NAMELISTS_SEAFLUX_N',1,ZHOOK_HANDLE) +! +!--------------------------------------------------------------------------- +! +END SUBROUTINE READ_NAMELISTS_SEAFLUX_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/read_prep_seaflux_conf.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_prep_seaflux_conf.F90 new file mode 100644 index 0000000000000000000000000000000000000000..ec33a3379a8c859b38c08f5c3fe81bae284b83ed --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_prep_seaflux_conf.F90 @@ -0,0 +1,202 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE READ_PREP_SEAFLUX_CONF (O, & + HPROGRAM,HVAR,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE, & + HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,KLUOUT,OUNIF) +! ####################################################### +! +!!**** *READ_PREP_SEAFLUX_CONF* - routine to read the configuration for +!! SEAFLUX fields preparation +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S. Malardel *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2004 +!! P. Le Moigne 10/2005, Phasage Arome +!! C. Lebeaupin 01/2008 Add oceanic variables initialization +!! Modified 09/2013 S. Senesi : introduce variables for sea-ice scheme +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODD_OCEAN_n, ONLY : OCEAN_t +! +USE MODN_PREP_SEAFLUX +! +USE MODI_READ_PREP_SURF_ATM_CONF +USE MODI_PREP_OCEAN_MERCATORVERGRID +! +USE MODD_PREP_SEAFLUX, ONLY : CFILE_SEAFLX, CTYPE_SEAFLX, CFILEPGD_SEAFLX, CTYPEPGD, & + CFILEWAVE_SEAFLX, CTYPEWAVE, & + XSST_UNIF, XSSS_UNIF, XSIC_UNIF +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +USE MODI_ABOR1_SFX +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +TYPE(OCEAN_t), INTENT(INOUT) :: O +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling ISBA + CHARACTER(LEN=7), INTENT(IN) :: HVAR ! variable treated + CHARACTER(LEN=28), INTENT(OUT) :: HFILE ! file name + CHARACTER(LEN=6), INTENT(OUT) :: HFILETYPE! file type + CHARACTER(LEN=28), INTENT(OUT) :: HFILEPGD ! file name + CHARACTER(LEN=6), INTENT(OUT) :: HFILEPGDTYPE! file type + CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! atmospheric file name + CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! atmospheric file type + CHARACTER(LEN=28), INTENT(IN) :: HPGDFILE ! atmospheric file name + CHARACTER(LEN=6), INTENT(IN) :: HPGDFILETYPE! atmospheric file type +INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing +LOGICAL, INTENT(OUT) :: OUNIF ! flag for prescribed uniform field + +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: IRESP ! IRESP : return-code if a problem appears + ! at the open of the file in LFI routines +INTEGER :: ILUNAM ! Logical unit of namelist file +! + CHARACTER(LEN=28) :: YNAMELIST ! namelist file +! +LOGICAL :: GFOUND ! Return code when searching namelist +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!------------------------------------------------------------------------------- +! +! +IF (LHOOK) CALL DR_HOOK('READ_PREP_SEAFLUX_CONF',0,ZHOOK_HANDLE) +HFILE = ' ' +HFILETYPE = ' ' +! +HFILEPGD = ' ' +HFILEPGDTYPE = ' ' +! +OUNIF = .FALSE. +! +!------------------------------------------------------------------------------- +! +!* Select seaflux files if they are defined +! ----------------------------------------- +! +IF (HVAR .EQ. 'HS ' .OR. HVAR .EQ. 'TP ') THEN + IF (LEN_TRIM(HFILE)==0 .AND. LEN_TRIM(CFILEWAVE_SEAFLX)>0 .AND. LEN_TRIM(CTYPEWAVE)>0) THEN + HFILE = CFILEWAVE_SEAFLX + HFILETYPE = CTYPEWAVE + END IF +ELSE + IF (LEN_TRIM(HFILE)==0 .AND. LEN_TRIM(CFILE_SEAFLX)>0 .AND. LEN_TRIM(CTYPE_SEAFLX)>0) THEN + HFILE = CFILE_SEAFLX + HFILETYPE = CTYPE_SEAFLX + END IF +END IF +! +IF (LEN_TRIM(HFILEPGD)==0 .AND. LEN_TRIM(CFILEPGD_SEAFLX)>0 .AND. LEN_TRIM(CTYPEPGD)>0) THEN + HFILEPGD = CFILEPGD_SEAFLX + HFILEPGDTYPE = CTYPEPGD +END IF +! +!! If no file name in the scheme namelist, +!! try to find a name in NAM_SURF_ATM +! +IF (LEN_TRIM(HFILE)==0) THEN +! + CALL READ_PREP_SURF_ATM_CONF(HPROGRAM,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,& + HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,KLUOUT) +! +END IF +!------------------------------------------------------------------------------- +! +!* Is an uniform field prescribed? +! ------------------------------ +! +SELECT CASE (HVAR) + CASE ('SST ') + OUNIF = (XSST_UNIF/=XUNDEF) + CASE ('SSS ') + IF (CSEAICE_SCHEME == 'NONE '.AND. & + LEN_TRIM(HFILETYPE)==0.0 .AND. & + XSSS_UNIF==XUNDEF )THEN + XSSS_UNIF=0.0 + ENDIF + OUNIF = (XSSS_UNIF/=XUNDEF) + CASE ('SIC ') + OUNIF = (XSIC_UNIF/=XUNDEF) +END SELECT + +! +!------------------------------------------------------------------------------- +! +!* If no file and no uniform field is prescribed: error +! --------------------------------------------- +! +IF (HVAR=='DATE ' .OR. HVAR=='ZS ') THEN + OUNIF = (HFILETYPE==' ') + IF (LHOOK) CALL DR_HOOK('READ_PREP_SEAFLUX_CONF',1,ZHOOK_HANDLE) + RETURN +END IF +!------------------------------------------------------------------------------- +! +!* If no file and var == wave: uniform field +! --------------------------------------------- +IF (HVAR=='HS ' .OR. HVAR=='TP ') THEN + OUNIF = (HFILETYPE/='NETCDF') + IF (LHOOK) CALL DR_HOOK('READ_PREP_SEAFLUX_CONF',1,ZHOOK_HANDLE) + RETURN +END IF +!------------------------------------------------------------------------------- +! +IF (LEN_TRIM(HFILETYPE)==0 .AND. .NOT. OUNIF) THEN + CALL ABOR1_SFX('READ_PREP_SEAFLUX_CONF: AN INPUT VALUE IS REQUIRED FOR '//HVAR) +END IF +! +!------------------------------------------------------------------------------- +! +!* If 1D coupling: ocean variables initializing +! -------------------------------------------- +! +IF (O%LMERCATOR) THEN + WRITE(KLUOUT,*) 'LMERCATOR=T : initializing oceanic vertical grid' + CALL PREP_OCEAN_MERCATORVERGRID(HPROGRAM,OUNIF) +END IF +IF (LHOOK) CALL DR_HOOK('READ_PREP_SEAFLUX_CONF',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE READ_PREP_SEAFLUX_CONF diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/read_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..c65ac933c74c4c47d5e14991da10981b6a0c53e8 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/read_seafluxn.F90 @@ -0,0 +1,289 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE READ_SEAFLUX_n (DTCO, SG, S, U, & + HPROGRAM,KLUOUT) +! ######################################### +! +!!**** *READ_SEAFLUX_n* - read SEAFLUX varaibles +!! +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2003 +!! Modified 02/2008 Add oceanic variables initialisation +!! S. Belamari 04/2014 Suppress LMERCATOR +!! R. Séférian 01/2015 introduce new ocean surface albedo +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +! +! +USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t +USE MODD_SEAFLUX_GRID_n, ONLY : SEAFLUX_GRID_t +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +USE MODI_READ_SURF +USE MODI_INTERPOL_SST_MTH +! +USE MODI_GET_TYPE_DIM_n +USE MODI_ABOR1_SFX +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO +TYPE(SEAFLUX_GRID_t), INTENT(INOUT) :: SG +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program +INTEGER, INTENT(IN) :: KLUOUT +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JMTH, INMTH + CHARACTER(LEN=2 ) :: YMTH +! +INTEGER :: ILU ! 1D physical dimension +! +INTEGER :: IRESP ! Error code after redding +! + CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read +! +INTEGER :: IVERSION ! surface version +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +!* 1D physical dimension +! +IF (LHOOK) CALL DR_HOOK('READ_SEAFLUX_N',0,ZHOOK_HANDLE) +! +YRECFM='SIZE_SEA' + CALL GET_TYPE_DIM_n(DTCO, U, & + 'SEA ',ILU) +! +!* 2. Prognostic fields: +! ----------------- +! +!* water temperature +! +ALLOCATE(S%XSST(ILU)) +! +IF(S%LINTERPOL_SST)THEN +! +! Precedent, Current, Next, and Second-next Monthly SST + INMTH=4 +! + ALLOCATE(S%XSST_MTH(SIZE(S%XSST),INMTH)) + DO JMTH=1,INMTH + WRITE(YMTH,'(I2)') (JMTH-1) + YRECFM='SST_MTH'//ADJUSTL(YMTH(:LEN_TRIM(YMTH))) + CALL READ_SURF(& + HPROGRAM,YRECFM,S%XSST_MTH(:,JMTH),IRESP) + ENDDO +! + CALL INTERPOL_SST_MTH(S, & + S%TTIME%TDATE%YEAR,S%TTIME%TDATE%MONTH,S%TTIME%TDATE%DAY,'T',S%XSST) +! +ELSE +! + ALLOCATE(S%XSST_MTH(0,0)) +! + YRECFM='SST' + CALL READ_SURF(& + HPROGRAM,YRECFM,S%XSST(:),IRESP) +! +ENDIF +! +!* stochastic flux perturbation pattern +! +ALLOCATE(S%XPERTFLUX(ILU)) +IF( S%LPERTFLUX ) THEN + CALL READ_SURF(& + HPROGRAM,'PERTSEAFLUX',S%XPERTFLUX(:),IRESP) +ELSE + S%XPERTFLUX(:) = 0. +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 3. Semi-prognostic fields: +! ---------------------- +! +!* roughness length +! +ALLOCATE(S%XZ0(ILU)) +YRECFM='Z0SEA' +S%XZ0(:) = 0.001 + CALL READ_SURF(& + HPROGRAM,YRECFM,S%XZ0(:),IRESP) +! +!* flag to use or not the SeaIce model +! + CALL READ_SURF(& + HPROGRAM,'VERSION',IVERSION,IRESP) +IF (IVERSION <8) THEN + S%LHANDLE_SIC=.FALSE. +ELSE + CALL READ_SURF(& + HPROGRAM,'HANDLE_SIC',S%LHANDLE_SIC,IRESP) +ENDIF +! +! +! * sea surface salinity +! +ALLOCATE(S%XSSS(ILU)) +S%XSSS(:)=0.0 +! +!* Sea surface salinity nudging data +! +IF(S%LINTERPOL_SSS)THEN + ! + ! Precedent, Current, Next, and Second-next Monthly SSS + INMTH=4 + ! + ALLOCATE(S%XSSS_MTH(ILU,INMTH)) + DO JMTH=1,INMTH + WRITE(YMTH,'(I2)') (JMTH-1) + YRECFM='SSS_MTH'//ADJUSTL(YMTH(:LEN_TRIM(YMTH))) + CALL READ_SURF(& + HPROGRAM,YRECFM,S%XSSS_MTH(:,JMTH),IRESP) + CALL CHECK_SEA(YRECFM,S%XSSS_MTH(:,JMTH)) + ENDDO + ! + CALL INTERPOL_SST_MTH(S, & + S%TTIME%TDATE%YEAR,S%TTIME%TDATE%MONTH,S%TTIME%TDATE%DAY,'S',S%XSSS) + ! +ELSEIF (IVERSION>=8) THEN + ! + ALLOCATE(S%XSSS_MTH(0,0)) + ! + YRECFM='SSS' + CALL READ_SURF(& + HPROGRAM,YRECFM,S%XSSS,IRESP) + IF(S%LHANDLE_SIC)THEN + CALL CHECK_SEA(YRECFM,S%XSSS(:)) + ENDIF + ! +ENDIF +! +!* ocean surface albedo (direct and diffuse fraction) +! +ALLOCATE(S%XDIR_ALB (ILU)) +ALLOCATE(S%XSCA_ALB (ILU)) +! +IF(S%CSEA_ALB=='RS14')THEN +! + YRECFM='OSA_DIR' + CALL READ_SURF(& + HPROGRAM,YRECFM,S%XDIR_ALB(:),IRESP) +! + YRECFM='OSA_SCA' + CALL READ_SURF(& + HPROGRAM,YRECFM,S%XSCA_ALB(:),IRESP) +! +ELSE +! + S%XDIR_ALB(:)=0.065 + S%XSCA_ALB(:)=0.065 +! +ENDIF +! +!* Peak frequency and significant wave height +! +ALLOCATE(S%XHS(ILU)) +ALLOCATE(S%XTP(ILU)) +! +IF (.NOT.S%LWAVEWIND) THEN + YRECFM='HS' + CALL READ_SURF(HPROGRAM,YRECFM,S%XHS(:),IRESP) + YRECFM='TP' + CALL READ_SURF(HPROGRAM,YRECFM,S%XTP(:),IRESP) +ELSE + S%XHS(:)=XUNDEF + S%XTP(:)=XUNDEF +END IF +! +IF (LHOOK) CALL DR_HOOK('READ_SEAFLUX_N',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- + CONTAINS +!------------------------------------------------------------------------------- +! +SUBROUTINE CHECK_SEA(HFIELD,PFIELD) +! +! +IMPLICIT NONE +! + CHARACTER(LEN=12), INTENT(IN) :: HFIELD +REAL, DIMENSION(:), INTENT(IN) :: PFIELD +! +REAL :: ZMAX,ZMIN +INTEGER :: JI, IERRC +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('READ_SEAFLUX_N:CHECK_SEA',0,ZHOOK_HANDLE) +! +ZMIN=-1.0E10 +ZMAX=1.0E10 +! +IERRC=0 +! +DO JI=1,ILU + IF(PFIELD(JI)>ZMAX.OR.PFIELD(JI)<ZMIN)THEN + IERRC=IERRC+1 + WRITE(KLUOUT,*)'PROBLEM FIELD '//TRIM(HFIELD)//' =',PFIELD(JI),& + 'NOT REALISTIC AT LOCATION (LAT/LON)',SG%XLAT(JI),SG%XLON(JI) + ENDIF +ENDDO +! +IF(IERRC>0) CALL ABOR1_SFX('READ_SEAFLUX_N: FIELD '//TRIM(HFIELD)//' NOT REALISTIC') +! +IF (LHOOK) CALL DR_HOOK('READ_SEAFLUX_N:CHECK_SEA',1,ZHOOK_HANDLE) + +END SUBROUTINE CHECK_SEA +! +!------------------------------------------------------------------------------ +END SUBROUTINE READ_SEAFLUX_n diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_define.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_define.F90 new file mode 100755 index 0000000000000000000000000000000000000000..dc983ee547fd0ec26cb6c47ceff58d95cc78516e --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_define.F90 @@ -0,0 +1,477 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +!######### +SUBROUTINE SFX_OASIS_DEFINE (I, U, & + HPROGRAM,KNPTS,KPARAL) +!################################################### +! +!!**** *SFX_OASIS_DEFINE* - Definitions for exchange of coupling fields +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/2013 +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!! and surface pressure for ocean coupling +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +! +USE MODD_ISBA_n, ONLY : ISBA_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +! +USE MODD_SURF_PAR, ONLY : NUNDEF +! +USE MODN_SFX_OASIS +USE MODD_SFX_OASIS +! +USE MODI_GET_LUOUT +USE MODI_ABOR1_SFX +USE MODI_SFX_OASIS_CHECK +! +#ifdef CPLOASIS +USE MOD_OASIS +#endif +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +TYPE(ISBA_t), INTENT(INOUT) :: I +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes +INTEGER, INTENT(IN) :: KNPTS ! Number of grid point on this proc +INTEGER, DIMENSION(:), INTENT(IN) :: KPARAL +! +! +!* 0.2 Declarations of local parameter +! ------------------------------- +! +INTEGER, DIMENSION(2), PARAMETER :: IVAR_NODIMS = (/1,1/) ! rank and number of bundles in coupling field +! +! +!* 0.3 Declarations of local variables +! ------------------------------- +! +INTEGER, DIMENSION(2) :: IVAR_SHAPE ! indexes for the coupling field local dimension +! +INTEGER :: IPART_ID ! Local partition ID +INTEGER :: IERR ! Error info +! +INTEGER :: ILUOUT, IFLAG +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_DEFINE',0,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +#ifdef CPLOASIS +!------------------------------------------------------------------------------- +! +! +!* 0. Initialize : +! ------------ +! +CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +CALL SFX_OASIS_CHECK(I, U, & + ILUOUT) +! +!------------------------------------------------------------------------------- +! +!* 1. Define parallel partitions: +! --------------------------- +! +CALL OASIS_DEF_PARTITION(IPART_ID,KPARAL(:),IERR) +! +IF(IERR/=OASIS_OK)THEN + WRITE(ILUOUT,*)'SFX_OASIS_DEFINE: OASIS def partition problem, err = ',IERR + CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def partition problem') +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. Coupling fields shape : +! ----------------------- +! +IVAR_SHAPE(1)= 1 +IVAR_SHAPE(2)= KNPTS +! +!------------------------------------------------------------------------------- +! +!* 3. Sea variables for Surfex - Oasis coupling : +! ------------------------------------------- +! +IF(LCPL_SEA)THEN +! +! Sea output fields +! + IF(LEN_TRIM(CSEA_FWSU)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_FWSU_ID,CSEA_FWSU,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea zonal wind stress') + ELSE + NSEA_FWSU_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_FWSV)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_FWSV_ID,CSEA_FWSV,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea meridian wind stress') + ELSE + NSEA_FWSV_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_HEAT)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_HEAT_ID,CSEA_HEAT,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea Non solar net heat flux') + ELSE + NSEA_HEAT_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_SNET)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_SNET_ID,CSEA_SNET,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea Solar net heat') + ELSE + NSEA_SNET_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_WIND)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_WIND_ID,CSEA_WIND,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea 10m wind speed') + ELSE + NSEA_WIND_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_FWSM)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_FWSM_ID,CSEA_FWSM,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea wind stress') + ELSE + NSEA_FWSM_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_EVAP)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_EVAP_ID,CSEA_EVAP,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea Evaporation') + ELSE + NSEA_EVAP_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_RAIN)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_RAIN_ID,CSEA_RAIN,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea Rainfall rate') + ELSE + NSEA_RAIN_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_SNOW)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_SNOW_ID,CSEA_SNOW,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea Snowfall rate') + ELSE + NSEA_SNOW_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_EVPR)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_EVPR_ID,CSEA_EVPR,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea Evap.-Precip. rate') + ELSE + NSEA_EVPR_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_WATF)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_WATF_ID,CSEA_WATF,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea freshwater rate') + ELSE + NSEA_WATF_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_PRES)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_PRES_ID,CSEA_PRES,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for surface pressure') + ELSE + NSEA_PRES_ID=NUNDEF + ENDIF +! +! Sea intput fields +! + IF(LEN_TRIM(CSEA_SST)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_SST_ID,CSEA_SST,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for Sea surface temperature') + ELSE + NSEA_SST_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_UCU)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_UCU_ID,CSEA_UCU,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for Sea u-current stress') + ELSE + NSEA_UCU_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEA_VCU)/=0)THEN + CALL OASIS_DEF_VAR(NSEA_VCU_ID,CSEA_VCU,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for Sea v-current stress') + ELSE + NSEA_VCU_ID=NUNDEF + ENDIF +! +! Particular case due to Sea-ice +! + IF(LCPL_SEAICE)THEN +! +! Output fields +! + IF(LEN_TRIM(CSEAICE_HEAT)/=0)THEN + CALL OASIS_DEF_VAR(NSEAICE_HEAT_ID,CSEAICE_HEAT,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat') + ELSE + NSEAICE_HEAT_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEAICE_SNET)/=0)THEN + CALL OASIS_DEF_VAR(NSEAICE_SNET_ID,CSEAICE_SNET,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice solar net heat flux') + ELSE + NSEAICE_SNET_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CSEAICE_EVAP)/=0)THEN + CALL OASIS_DEF_VAR(NSEAICE_EVAP_ID,CSEAICE_EVAP,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice sublimation') + ELSE + NSEAICE_EVAP_ID=NUNDEF + ENDIF +! +! Intput fields +! + CALL OASIS_DEF_VAR(NSEAICE_SIT_ID,CSEAICE_SIT,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat') +! + CALL OASIS_DEF_VAR(NSEAICE_CVR_ID,CSEAICE_CVR,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat') +! + CALL OASIS_DEF_VAR(NSEAICE_ALB_ID,CSEAICE_ALB,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for Sea-ice non solar net heat') +! + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 4. Lake variables for Surfex - Oasis coupling : +! ------------------------------------------- +! +IF(LCPL_LAKE)THEN +! +! Output fields +! + IF(LEN_TRIM(CLAKE_EVAP)/=0)THEN + CALL OASIS_DEF_VAR(NLAKE_EVAP_ID,CLAKE_EVAP,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for lake Evaporation') + ELSE + NLAKE_EVAP_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CLAKE_RAIN)/=0)THEN + CALL OASIS_DEF_VAR(NLAKE_RAIN_ID,CLAKE_RAIN,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for lake Rainfall rate') + ELSE + NLAKE_RAIN_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CLAKE_SNOW)/=0)THEN + CALL OASIS_DEF_VAR(NLAKE_SNOW_ID,CLAKE_SNOW,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for lake Snowfall rate') + ELSE + NLAKE_SNOW_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CLAKE_WATF)/=0)THEN + CALL OASIS_DEF_VAR(NLAKE_WATF_ID,CLAKE_WATF,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for sea freshwater rate') + ELSE + NLAKE_WATF_ID=NUNDEF + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 5. Land surface variables for Surfex - Oasis coupling : +! ---------------------------------------------------- +! +IF(LCPL_LAND)THEN +! +! Output Surface runoff +! + CALL OASIS_DEF_VAR(NRUNOFF_ID,CRUNOFF,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for land Surface runoff') +! +! Output Calving flux +! + IF(LCPL_CALVING)THEN +! +! Output Calving flux + CALL OASIS_DEF_VAR(NCALVING_ID,CCALVING,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for land Calving flux') +! + ENDIF +! +! Output Deep drainage +! + CALL OASIS_DEF_VAR(NDRAIN_ID,CDRAIN,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for land Deep drainage') +! +! Particular case due to water table depth / surface coupling +! + IF(LCPL_GW)THEN +! +! Output groundwater recharge + CALL OASIS_DEF_VAR(NRECHARGE_ID,CRECHARGE,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for land groundwater recharge') +! +! Input Water table depth + CALL OASIS_DEF_VAR(NWTD_ID,CWTD,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for land Water table depth') +! +! Input grid-cell fraction of WTD to rise + CALL OASIS_DEF_VAR(NFWTD_ID,CFWTD,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for land fraction of WTD to rise') +! + ENDIF +! +! Particular case due to floodplains coupling +! + IF(LCPL_FLOOD)THEN +! +! Output Flood precip interception + CALL OASIS_DEF_VAR(NSRCFLOOD_ID,CSRCFLOOD,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for land Floodplains freshwater flux') +! +! Input floodplains fraction + CALL OASIS_DEF_VAR(NFFLOOD_ID,CFFLOOD,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for land Floodplains fraction') +! +! Input floodplains potential infiltration + CALL OASIS_DEF_VAR(NPIFLOOD_ID,CPIFLOOD,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_DOUBLE,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for land Floodplains potential infiltration') +! + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 6. Wave variables for Surfex - Oasis coupling : +! ------------------------------------------- +! +IF(LCPL_WAVE) THEN +! +! Wave output fields +! + IF(LEN_TRIM(CWAVE_U10)/=0)THEN + CALL OASIS_DEF_VAR(NWAVE_U10_ID,CWAVE_U10,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_REAL,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for U10') + ELSE + NWAVE_U10_ID=NUNDEF + ENDIF +! + IF(LEN_TRIM(CWAVE_V10)/=0)THEN + CALL OASIS_DEF_VAR(NWAVE_V10_ID,CWAVE_V10,IPART_ID,IVAR_NODIMS,OASIS_OUT,IVAR_SHAPE,OASIS_REAL,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for V10') + ELSE + NWAVE_V10_ID=NUNDEF + ENDIF +! +! Wave input fields +! + IF (LEN_TRIM(CWAVE_CHA)/=0)THEN + CALL OASIS_DEF_VAR(NWAVE_CHA_ID,CWAVE_CHA,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_REAL,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for CHA') + ELSE + NWAVE_CHA_ID=NUNDEF + ENDIF +! + IF (LEN_TRIM(CWAVE_UCU)/=0)THEN + CALL OASIS_DEF_VAR(NWAVE_UCU_ID,CWAVE_UCU,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_REAL,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for UCU') + ELSE + NWAVE_UCU_ID=NUNDEF + ENDIF +! + IF (LEN_TRIM(CWAVE_VCU)/=0)THEN + CALL OASIS_DEF_VAR(NWAVE_VCU_ID,CWAVE_VCU,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_REAL,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for VCU') + ELSE + NWAVE_VCU_ID=NUNDEF + ENDIF +! + IF (LEN_TRIM(CWAVE_HS)/=0)THEN + CALL OASIS_DEF_VAR(NWAVE_HS_ID,CWAVE_HS,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_REAL,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for HS') + ELSE + NWAVE_HS_ID=NUNDEF + ENDIF +! + IF (LEN_TRIM(CWAVE_TP)/=0)THEN + CALL OASIS_DEF_VAR(NWAVE_TP_ID,CWAVE_TP,IPART_ID,IVAR_NODIMS,OASIS_IN,IVAR_SHAPE,OASIS_REAL,IERR) + IF(IERR/=OASIS_OK) CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS def var problem for TP') + ELSE + NWAVE_TP_ID=NUNDEF + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 7. End of declaration phase: +! -------------- +! +CALL OASIS_ENDDEF(IERR) +! +IF(IERR/=OASIS_OK)THEN + WRITE(ILUOUT,*)'SFX_OASIS_DEFINE: OASIS enddef problem, err = ',IERR + CALL ABOR1_SFX('SFX_OASIS_DEFINE: OASIS enddef problem') +ENDIF +! +!------------------------------------------------------------------------------- +#endif +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_DEFINE',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE SFX_OASIS_DEFINE diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_init.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_init.F90 new file mode 100755 index 0000000000000000000000000000000000000000..28c4a8444b12adf33bbfde880941b24cadb62250 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_init.F90 @@ -0,0 +1,313 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +!######### +SUBROUTINE SFX_OASIS_INIT(HNAMELIST,KLOCAL_COMM,HINIT) +!! +!! +!! PURPOSE +!! -------- +!! +!! Initialize coupled mode communication +!! +!! +!! METHOD +!! ------ +!! +!! OASIS-MCT usage is controlled by environment variables +!! OASIS-MCT interface must be initialized before any DR_HOOK call +!! +!! +!! EXTERNAL +!! -------- +!! +!! +!! REFERENCE +!! --------- +!! +!! S. Valcke et al., 2013: OASIS-MCT User Guide +!! CERFACS, Toulouse, France, 50 pp. +!! https://verc.enes.org/oasis/oasis-dedicated-user-support-1/documentation/oasis3-mct-user-guide +!! +!! +!! AUTHOR +!! ------ +!! +!! B. Decharme, CNRM +!! +!! MODIFICATION +!! -------------- +!! +!! Original 10/2013 +!! Modified 11/2014 : J. Pianezze - add LOASIS_GRID flag +!! +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_SFX_OASIS, ONLY : LOASIS, LOASIS_GRID, XRUNTIME +! +#ifdef CPLOASIS +USE MOD_OASIS +#endif +! +IMPLICIT NONE +! +#ifdef CPLOASIS +INCLUDE 'mpif.h' +#endif +! +!* 0.1 Declarations of arguments +! ------------------------- +! +CHARACTER(LEN=28), INTENT(IN ) :: HNAMELIST +INTEGER, INTENT(OUT) :: KLOCAL_COMM ! value of local communicator +CHARACTER(LEN=3), INTENT(IN ), OPTIONAL :: HINIT ! choice of fields to initialize +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +CHARACTER(LEN=9) :: YWORD, YTIMERUN +CHARACTER(LEN=1000):: YLINE, YFOUND +INTEGER :: IERR, IWORK, IRANK +INTEGER :: ICOMP_ID +INTEGER :: ITIMERUN +LOGICAL :: GFOUND +CHARACTER(LEN=3) :: YINIT +! +! +!* 0.3 Declarations of namelist variables +! ---------------------------------- +! +CHARACTER(LEN=6) :: CMODEL_NAME ! component model name +! +NAMELIST/NAM_OASIS/LOASIS,LOASIS_GRID,CMODEL_NAME +! +!------------------------------------------------------------------------------- +! +! ATTENTION : Do not introduce DR_HOOK in this routine +! +!* 0. Initialization: +! --------------- +! +LOASIS = .FALSE. +LOASIS_GRID = .FALSE. +CMODEL_NAME = 'surfex' +XRUNTIME = 0.0 +! +YINIT = 'ALL' +IF(PRESENT(HINIT))YINIT=HINIT +! +!------------------------------------------------------------------------------- +! +!* 1. Read namelist: +! -------------- +! +IF(LEN_TRIM(HNAMELIST)/=0)THEN +! + OPEN(UNIT=11,FILE=HNAMELIST,ACTION='READ',FORM="FORMATTED",POSITION="REWIND",STATUS='OLD',IOSTAT=IERR) +! + IF (IERR /= 0) THEN + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(*,'(2A)')'SFX_OASIS_INIT: SFX NAMELIST NOT FOUND: ',TRIM(HNAMELIST) + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + CALL ABORT + STOP + ENDIF +! + READ (UNIT=11,NML=NAM_OASIS,IOSTAT=IERR) +! + CLOSE(UNIT=11) +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. Setup OASIS +! ----------- +! +IF(LOASIS)THEN +! +#ifdef CPLOASIS + CALL OASIS_INIT_COMP(ICOMP_ID,CMODEL_NAME,IERR) + IF (IERR/=OASIS_OK) THEN + WRITE(*,'(A)' )'SFX : Error initializing OASIS' + WRITE(*,'(A,I4)')'SFX : Return code from oasis_init_comp : ',IERR + CALL OASIS_ABORT(ICOMP_ID,CMODEL_NAME,'SFX_OASIS_INIT: Error initializing OASIS') + CALL ABORT + STOP + ENDIF + CALL MPI_COMM_RANK(MPI_COMM_WORLD,IRANK,IWORK) +#endif +! + IF(IRANK==0)THEN + WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(*,'(A)')'OASIS used for model : ',TRIM(CMODEL_NAME) + WRITE(*,'(A)')'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + ENDIF +! +ELSE +! + KLOCAL_COMM=0 + RETURN +! +ENDIF +!------------------------------------------------------------------------------- +! +!* 4. Get local communicator +! ---------------------- +! +#ifdef CPLOASIS +CALL OASIS_GET_LOCALCOMM(KLOCAL_COMM,IERR) +IF (IERR/=OASIS_OK) THEN + IF(IRANK==0)THEN + WRITE(*,'(A)' )'SFX : Error getting local communicator from OASIS' + WRITE(*,'(A,I4)')'SFX : Return code from oasis_get_local_comm : ',IERR + ENDIF + CALL OASIS_ABORT(ICOMP_ID,CMODEL_NAME,'SFX_OASIS_INIT: Error getting local communicator') + CALL ABORT + STOP +ENDIF +#endif +! +!------------------------------------------------------------------------------- +! +! +IF(YINIT=='PRE')THEN + RETURN +ENDIF +! +!* 5. Read total simulated time in namcouple +! -------------------------------------- +! +OPEN (UNIT=11,FILE ='namcouple',STATUS='OLD',FORM ='FORMATTED',POSITION="REWIND",IOSTAT=IERR) +IF (IERR /= 0) THEN + IF(IRANK==0)THEN + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(*,'(A)' )'SFX : OASIS namcouple not found' + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + ENDIF + CALL ABORT + STOP +ENDIF +! +YTIMERUN=' $RUNTIME' +ITIMERUN=-1 +! +DO WHILE (ITIMERUN==-1) + READ (UNIT = 11,FMT = '(A9)',IOSTAT=IERR) YWORD + IF(IERR/=0)THEN + IF(IRANK==0)THEN + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(*,'(A)' )'SFX : Problem $RUNTIME empty in namcouple' + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + ENDIF + CALL ABORT + STOP + ENDIF + IF (YWORD==YTIMERUN)THEN + READ (UNIT = 11,FMT = '(A1000)',IOSTAT=IERR) YLINE + IF(IERR/=0)THEN + IF(IRANK==0)THEN + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(*,'(A)' )'SFX : Problem looking for $RUNTIME in namcouple' + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + ENDIF + CALL ABORT + STOP + ENDIF + CALL FOUND_TIMERUN (YLINE, YFOUND, 1000, GFOUND) + IF (GFOUND) THEN + READ (YFOUND,FMT = '(I100)',IOSTAT=IERR) ITIMERUN + IF(IERR/=0)THEN + IF(IRANK==0)THEN + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(*,'(A)' )'SFX : Problem reading $RUNTIME in namcouple' + WRITE(*,'(2A)' )'$RUNTIME = ', TRIM(YFOUND) + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + ENDIF + CALL ABORT + STOP + ENDIF + ENDIF + ENDIF +ENDDO +CLOSE(11) +! +XRUNTIME = REAL(ITIMERUN) +! +WRITE(*,'(A)' )'-----------------------------' +! +!------------------------------------------------------------------------------- +CONTAINS +!------------------------------------------------------------------------------- +! +SUBROUTINE FOUND_TIMERUN(HIN, HOUT, KLEN, OFOUND) +! +IMPLICIT NONE +! +INTEGER , INTENT (IN ) :: KLEN +CHARACTER (LEN=*), INTENT (INOUT) :: HIN +CHARACTER (LEN=*), INTENT (INOUT) :: HOUT +LOGICAL, INTENT (OUT ) :: OFOUND +! +!* ---------------------------- Local declarations ------------------- +! +CHARACTER(LEN=1), PARAMETER :: YBLANK = ' ' +CHARACTER(LEN=1), PARAMETER :: YNADA = '#' + +CHARACTER(LEN=KLEN) :: YLINE +CHARACTER(LEN=KLEN) :: YWORK +! +INTEGER :: ILEN +INTEGER :: IERR +! +! +!* 1. Skip line if it is a comment +! ---------------------------- +! +DO WHILE (HIN(1:1)==YNADA) + READ (UNIT = 11, FMT = '(A9)',IOSTAT=IERR) YLINE + IF(IERR/=0)THEN + IF(IRANK==0)THEN + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(*,'(A)' )'SFX : Problem looking for $RUNTINE line in namcouple' + WRITE(*,'(A)' )'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + ENDIF + CALL ABORT + STOP + ENDIF + HIN(1:KLEN) = YLINE(1:KLEN) +ENDDO +! +!* Fill HOUT with blanks +! +HOUT = YBLANK +! +!* Fill temporary string and remove leading blanks +! +YWORK = ADJUSTL(HIN) +! +IF(LEN_TRIM(YWORK)<=0)THEN + OFOUND = .FALSE. + RETURN +ENDIF +! +!* Find the length of this set of characters +! +ILEN = INDEX(YWORK,YBLANK) - 1 +! +!* Copy to HOUT +! +HOUT(1:ILEN) = YWORK(1:ILEN) +! +OFOUND = .TRUE. +! +END SUBROUTINE FOUND_TIMERUN +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE SFX_OASIS_INIT diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_read_nam.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_read_nam.F90 new file mode 100755 index 0000000000000000000000000000000000000000..67d95fc476e67e23f85ccee5f102798a5977d7b8 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_read_nam.F90 @@ -0,0 +1,574 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +!######### +SUBROUTINE SFX_OASIS_READ_NAM(HPROGRAM,PTSTEP_SURF,HINIT) +!################################################################## +! +!!**** *SFX_OASIS_READ_NAM* - routine to read the configuration for SFX-OASIS coupling +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/2008 +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!! and surface pressure for ocean coupling +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODN_SFX_OASIS +! +USE MODD_SFX_OASIS, ONLY : LOASIS, XRUNTIME, & + LCPL_LAND, LCPL_GW, LCPL_FLOOD, & + LCPL_CALVING, LCPL_LAKE, & + LCPL_SEA, LCPL_SEAICE, & + LCPL_WAVE +! +USE MODE_POS_SURF +! +USE MODI_GET_LUOUT +USE MODI_OPEN_NAMELIST +USE MODI_CLOSE_NAMELIST +! +USE MODI_ABOR1_SFX +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes +REAL, INTENT(IN) :: PTSTEP_SURF ! Surfex time step +CHARACTER(LEN=3), INTENT(IN), OPTIONAL :: HINIT ! choice of fields to initialize +! +!* 0.2 Declarations of local parameter +! ------------------------------- +! +INTEGER, PARAMETER :: KIN = 1 +INTEGER, PARAMETER :: KOUT = 0 +CHARACTER(LEN=5), PARAMETER :: YLAND = 'land' +CHARACTER(LEN=5), PARAMETER :: YLAKE = 'lake' +CHARACTER(LEN=5), PARAMETER :: YSEA = 'ocean' +CHARACTER(LEN=5), PARAMETER :: YWAVE = 'wave' +! +!* 0.3 Declarations of local variables +! ------------------------------- +! +LOGICAL :: GFOUND ! Return code when searching namelist +INTEGER :: ILUOUT ! Listing id +INTEGER :: ILUNAM ! logical unit of namelist file +CHARACTER(LEN=20) :: YKEY +CHARACTER(LEN=50) :: YCOMMENT +CHARACTER(LEN=3) :: YINIT +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_READ_NAM',0,ZHOOK_HANDLE) +! +! +!* 0. Initialize : +! ------------ +! +LCPL_LAND = .FALSE. +LCPL_GW = .FALSE. +LCPL_FLOOD = .FALSE. +LCPL_CALVING = .FALSE. +LCPL_LAKE = .FALSE. +LCPL_SEA = .FALSE. +LCPL_SEAICE = .FALSE. +LCPL_WAVE = .FALSE. +! +IF(.NOT.LOASIS)THEN + IF (LHOOK) CALL DR_HOOK('SFX_OASIS_READ_NAM',1,ZHOOK_HANDLE) + RETURN +ENDIF +! +YINIT = 'ALL' +IF(PRESENT(HINIT))YINIT=HINIT +! +CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +!* 1. Read namelists and check status : +! -------------------------------- +! +CALL OPEN_NAMELIST(HPROGRAM,ILUNAM) +! +CALL POSNAM(ILUNAM,'NAM_SFX_LAND_CPL',GFOUND,ILUOUT) +! +IF (GFOUND) THEN + READ(UNIT=ILUNAM,NML=NAM_SFX_LAND_CPL) +ELSE + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'NAM_SFX_LAND_CPL not found : Surfex land not coupled with river routing' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +ENDIF +! +CALL POSNAM(ILUNAM,'NAM_SFX_SEA_CPL',GFOUND,ILUOUT) +! +IF (GFOUND) THEN + READ(UNIT=ILUNAM,NML=NAM_SFX_SEA_CPL) +ELSE + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'NAM_SFX_SEA_CPL not found : Surfex sea not coupled with ocean model' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +ENDIF +! + CALL POSNAM(ILUNAM,'NAM_SFX_LAKE_CPL',GFOUND,ILUOUT) +! +IF (GFOUND) THEN + READ(UNIT=ILUNAM,NML=NAM_SFX_LAKE_CPL) +ELSE + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'NAM_SFX_LAKE_CPL not found : Surfex lake not coupled with ocean model' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +ENDIF +! +CALL POSNAM(ILUNAM,'NAM_SFX_WAVE_CPL',GFOUND,ILUOUT) +! +IF (GFOUND) THEN + READ(UNIT=ILUNAM,NML=NAM_SFX_WAVE_CPL) +ELSE + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'NAM_SFX_WAVE_CPL not found : Surfex not coupled with wave model' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' + WRITE(ILUOUT,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +ENDIF +! +CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM) +! +IF(XTSTEP_CPL_LAND>0.0)LCPL_LAND=.TRUE. +IF(XTSTEP_CPL_LAKE>0.0)LCPL_LAKE=.TRUE. +IF(XTSTEP_CPL_SEA >0.0)LCPL_SEA =.TRUE. +IF(XTSTEP_CPL_WAVE>0.0)LCPL_WAVE=.TRUE. +! +IF(.NOT.LCPL_LAND.AND..NOT.LCPL_SEA.AND..NOT.LCPL_WAVE)THEN + CALL ABOR1_SFX('SFX_OASIS_READ_NAM: OASIS USED BUT NAMELIST NOT FOUND') +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. Check time step consistency +! --------------------------- +! +IF(YINIT/='PRE')THEN + IF(MOD(XRUNTIME,PTSTEP_SURF)/=0.)THEN + WRITE(ILUOUT,*)'! MOD(XRUNTIME,XTSTEP_SURF)/=0 !!!' + WRITE(ILUOUT,*)'! XTSTEP_SURF (model timestep) must be a multiple of $RUNTIME in oasis namcouple !!!' + CALL ABOR1_SFX('SFX_OASIS_READ_NAM: XTSTEP_SURF must be a multiple of $RUNTIME in oasis namcouple !!!') + ENDIF +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 3. Check status for Land surface fields +! ------------------------------------ +! +IF(LCPL_LAND)THEN +! + IF(YINIT/='PRE')THEN + IF(MOD(XTSTEP_CPL_LAND,PTSTEP_SURF)/=0.)THEN + WRITE(ILUOUT,*)'! MOD(XTSTEP_SURF,XTSTEP_CPL_LAND) /= 0 !' + WRITE(ILUOUT,*)'XTSTEP_SURF =',PTSTEP_SURF,'XTSTEP_CPL_LAND = ',XTSTEP_CPL_LAND + IF(PTSTEP_SURF>XTSTEP_CPL_LAND) & + WRITE(ILUOUT,*)'! XTSTEP_SURF (model timestep) is superiror to XTSTEP_CPL_LAND !' + CALL ABOR1_SFX('SFX_OASIS_READ_NAM: XTSTEP_SURF and XTSTEP_CPL_LAND not consistent !!!') + ENDIF + ENDIF +! +! Land Output variable +! + YKEY ='CRUNOFF' + YCOMMENT='Surface runoff' + CALL CHECK_FIELD(CRUNOFF,YKEY,YCOMMENT,YLAND,KOUT) +! + YKEY ='CDRAIN' + YCOMMENT='Deep drainage' + CALL CHECK_FIELD(CDRAIN,YKEY,YCOMMENT,YLAND,KOUT) +! +! Particular case due to calving case +! + IF(LEN_TRIM(CCALVING)>0)THEN + LCPL_CALVING = .TRUE. + ENDIF +! + IF(LCPL_CALVING)THEN + YKEY ='CCALVING' + YCOMMENT='Calving flux' + CALL CHECK_FIELD(CCALVING,YKEY,YCOMMENT,YLAND,KOUT) + ENDIF +! +! Particular case due to water table depth / surface coupling +! + IF(LEN_TRIM(CWTD)>0.OR.LEN_TRIM(CFWTD)>0.OR.LEN_TRIM(CRECHARGE)>0)THEN + LCPL_GW = .TRUE. + ENDIF +! + IF(LCPL_GW)THEN +! +! Output variable +! + YKEY ='CRECHARGE' + YCOMMENT='Groundwater recharge' + CALL CHECK_FIELD(CRECHARGE,YKEY,YCOMMENT,YLAND,KOUT) +! +! Input variable +! + YKEY ='CWTD' + YCOMMENT='Water table depth' + CALL CHECK_FIELD(CWTD,YKEY,YCOMMENT,YLAND,KIN) +! + YKEY ='CFWTD' + YCOMMENT='Fraction of WTD to rise' + CALL CHECK_FIELD(CFWTD,YKEY,YCOMMENT,YLAND,KIN) +! + ENDIF +! +! Particular case due to floodplains coupling +! + IF(LEN_TRIM(CSRCFLOOD)>0.OR.LEN_TRIM(CFFLOOD)>0.OR.LEN_TRIM(CPIFLOOD)>0)THEN + LCPL_FLOOD = .TRUE. + ENDIF +! + IF(LCPL_FLOOD)THEN +! +! Output variable +! + YKEY ='CSRCFLOOD' + YCOMMENT='flood freshwater flux' + CALL CHECK_FIELD(CSRCFLOOD,YKEY,YCOMMENT,YLAND,KOUT) +! +! Input variable +! + YKEY ='CFFLOOD' + YCOMMENT='Flood fraction' + CALL CHECK_FIELD(CFFLOOD,YKEY,YCOMMENT,YLAND,KIN) +! + YKEY ='CPIFLOOD' + YCOMMENT='Flood potential infiltration' + CALL CHECK_FIELD(CPIFLOOD,YKEY,YCOMMENT,YLAND,KIN) +! + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 4. Check status for Land surface fields +! ------------------------------------ +! +IF(LCPL_LAKE)THEN +! + IF(YINIT/='PRE')THEN + IF(MOD(XTSTEP_CPL_LAKE,PTSTEP_SURF)/=0.)THEN + WRITE(ILUOUT,*)'! MOD(XTSTEP_SURF,XTSTEP_CPL_LAKE) /= 0 !' + WRITE(ILUOUT,*)'XTSTEP_SURF =',PTSTEP_SURF,'XTSTEP_CPL_LAKE = ',XTSTEP_CPL_LAKE + IF(PTSTEP_SURF>XTSTEP_CPL_LAKE) & + WRITE(ILUOUT,*)'! XTSTEP_SURF (model timestep) is superiror to XTSTEP_CPL_LAKE !' + CALL ABOR1_SFX('SFX_OASIS_READ_NAM: XTSTEP_SURF and XTSTEP_CPL_LAKE not consistent !!!') + ENDIF + ENDIF +! +! Output variables +! + YKEY ='CLAKE_EVAP' + YCOMMENT='Evaporation rate' + CALL CHECK_FIELD(CLAKE_EVAP,YKEY,YCOMMENT,YLAKE,KOUT) +! + YKEY ='CLAKE_RAIN' + YCOMMENT='Rainfall rate' + CALL CHECK_FIELD(CLAKE_RAIN,YKEY,YCOMMENT,YLAKE,KOUT) +! + YKEY ='CLAKE_SNOW' + YCOMMENT='Snowfall rate' + CALL CHECK_FIELD(CLAKE_SNOW,YKEY,YCOMMENT,YLAKE,KOUT) +! + YKEY ='CLAKE_WATF' + YCOMMENT='Freshwater flux' + CALL CHECK_FIELD(CLAKE_WATF,YKEY,YCOMMENT,YLAKE,KOUT) +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 5. Check status for Sea fields +! --------------------------- +! +IF(LCPL_SEA)THEN +! + IF(YINIT/='PRE')THEN + IF(MOD(XTSTEP_CPL_SEA,PTSTEP_SURF)/=0.)THEN + WRITE(ILUOUT,*)'! MOD(XTSTEP_SURF,XTSTEP_CPL_SEA) /= 0 !' + WRITE(ILUOUT,*)'XTSTEP_SURF =',PTSTEP_SURF,'XTSTEP_CPL_SEA = ',XTSTEP_CPL_SEA + IF(PTSTEP_SURF>XTSTEP_CPL_SEA) & + WRITE(ILUOUT,*)'! XTSTEP_SURF (model timestep) is superiror to XTSTEP_CPL_SEA !' + CALL ABOR1_SFX('SFX_OASIS_READ_NAM: XTSTEP_SURF and XTSTEP_CPL_SEA not consistent !!!') + ENDIF + ENDIF +! +! Sea Output variables +! + YKEY ='CSEA_FWSU' + YCOMMENT='zonal wind stress' + CALL CHECK_FIELD(CSEA_FWSU,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_FWSV' + YCOMMENT='meridian wind stress' + CALL CHECK_FIELD(CSEA_FWSV,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_HEAT' + YCOMMENT='Non solar net heat flux' + CALL CHECK_FIELD(CSEA_HEAT,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_SNET' + YCOMMENT='Solar net heat flux' + CALL CHECK_FIELD(CSEA_SNET,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_WIND' + YCOMMENT='module of 10m wind speed' + CALL CHECK_FIELD(CSEA_WIND,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_FWSM' + YCOMMENT='module of wind stress' + CALL CHECK_FIELD(CSEA_FWSM,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_EVAP' + YCOMMENT='Evaporation rate' + CALL CHECK_FIELD(CSEA_EVAP,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_RAIN' + YCOMMENT='Rainfall rate' + CALL CHECK_FIELD(CSEA_RAIN,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_SNOW' + YCOMMENT='Snowfall rate' + CALL CHECK_FIELD(CSEA_SNOW,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_EVPR' + YCOMMENT='Evap. - Precip. rate' + CALL CHECK_FIELD(CSEA_EVPR,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_WATF' + YCOMMENT='Freshwater flux' + CALL CHECK_FIELD(CSEA_WATF,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEA_PRES' + YCOMMENT='Surface pressure' + CALL CHECK_FIELD(CSEA_PRES,YKEY,YCOMMENT,YSEA,KOUT) +! +! Sea Input variables +! + YKEY ='CSEA_SST' + YCOMMENT='Sea surface temperature' + CALL CHECK_FIELD(CSEA_SST,YKEY,YCOMMENT,YSEA,KIN) +! + YKEY ='CSEA_UCU' + YCOMMENT='Sea u-current stress' + CALL CHECK_FIELD(CSEA_UCU,YKEY,YCOMMENT,YSEA,KIN) +! + YKEY ='CSEA_VCU' + YCOMMENT='Sea v-current stress' + CALL CHECK_FIELD(CSEA_VCU,YKEY,YCOMMENT,YSEA,KIN) +! +! Sea-ice fluxes +! + IF(LEN_TRIM(CSEAICE_HEAT)>0.OR.LEN_TRIM(CSEAICE_SNET)>0.OR. & + LEN_TRIM(CSEAICE_EVAP)>0.OR.LEN_TRIM(CSEAICE_SIT )>0.OR. & + LEN_TRIM(CSEAICE_CVR )>0.OR.LEN_TRIM(CSEAICE_ALB )>0 )THEN + LCPL_SEAICE=.TRUE. + ENDIF +! + IF(LCPL_SEAICE)THEN +! +! Sea-ice Output variables +! + YKEY ='CSEAICE_HEAT' + YCOMMENT='Sea-ice non solar net heat flux' + CALL CHECK_FIELD(CSEAICE_HEAT,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEAICE_SNET' + YCOMMENT='Sea-ice solar net heat flux' + CALL CHECK_FIELD(CSEAICE_SNET,YKEY,YCOMMENT,YSEA,KOUT) +! + YKEY ='CSEAICE_EVAP' + YCOMMENT='Sea-ice sublimation' + CALL CHECK_FIELD(CSEAICE_EVAP,YKEY,YCOMMENT,YSEA,KOUT) +! +! Sea-ice Input variables +! + YKEY ='CSEAICE_SIT' + YCOMMENT='Sea-ice temperature' + CALL CHECK_FIELD(CSEAICE_SIT,YKEY,YCOMMENT,YSEA,KIN) +! + YKEY ='CSEAICE_CVR' + YCOMMENT='Sea-ice cover' + CALL CHECK_FIELD(CSEAICE_CVR,YKEY,YCOMMENT,YSEA,KIN) +! + YKEY ='CSEAICE_ALB' + YCOMMENT='Sea-ice albedo' + CALL CHECK_FIELD(CSEAICE_ALB,YKEY,YCOMMENT,YSEA,KIN) +! + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 6. Check status for Wave fields +! --------------------------- +! +IF(LCPL_WAVE)THEN +! + IF(YINIT/='PRE')THEN + IF(MOD(XTSTEP_CPL_WAVE,PTSTEP_SURF)/=0.)THEN + WRITE(ILUOUT,*)'! MOD(XTSTEP_SURF,XTSTEP_CPL_WAVE) /= 0 !' + WRITE(ILUOUT,*)'XTSTEP_SURF =',PTSTEP_SURF,'XTSTEP_CPL_WAVE = ',XTSTEP_CPL_WAVE + IF(PTSTEP_SURF>XTSTEP_CPL_WAVE) & + WRITE(ILUOUT,*)'! XTSTEP_SURF (model timestep) is superiror to XTSTEP_CPL_WAVE !' + CALL ABOR1_SFX('SFX_OASIS_READ_NAM: XTSTEP_SURF and XTSTEP_CPL_WAVE not consistent !!!') + ENDIF + ENDIF +! +! Wave Output variables +! + YKEY ='CWAVE_U10' + YCOMMENT='10m u-wind speed' + CALL CHECK_FIELD(CWAVE_U10,YKEY,YCOMMENT,YWAVE,KOUT) +! + YKEY ='CWAVE_V10' + YCOMMENT='10m v-wind speed' + CALL CHECK_FIELD(CWAVE_V10,YKEY,YCOMMENT,YWAVE,KOUT) +! +! Wave Input variables +! + YKEY ='CWAVE_CHA' + YCOMMENT='Charnock Coefficient' + CALL CHECK_FIELD(CWAVE_CHA,YKEY,YCOMMENT,YWAVE,KIN) +! + YKEY ='CWAVE_UCU' + YCOMMENT='u-current velocity' + CALL CHECK_FIELD(CWAVE_UCU,YKEY,YCOMMENT,YWAVE,KIN) +! + YKEY ='CWAVE_VCU' + YCOMMENT='v-current velocity' + CALL CHECK_FIELD(CWAVE_VCU,YKEY,YCOMMENT,YWAVE,KIN) +! + YKEY ='CWAVE_HS' + YCOMMENT='Significant wave height' + CALL CHECK_FIELD(CWAVE_HS,YKEY,YCOMMENT,YWAVE,KIN) +! + YKEY ='CWAVE_TP' + YCOMMENT='Peak period' + CALL CHECK_FIELD(CWAVE_TP,YKEY,YCOMMENT,YWAVE,KIN) +! +ENDIF +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_READ_NAM',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +CONTAINS +!------------------------------------------------------------------------------- +! +SUBROUTINE CHECK_FIELD(HFIELD,HKEY,HCOMMENT,HTYP,KID) +! +IMPLICIT NONE +! +CHARACTER(LEN=*), INTENT(IN) :: HFIELD +CHARACTER(LEN=*), INTENT(IN) :: HKEY +CHARACTER(LEN=*), INTENT(IN) :: HCOMMENT +CHARACTER(LEN=*), INTENT(IN) :: HTYP +INTEGER, INTENT(IN) :: KID +! +CHARACTER(LEN=20) :: YWORK +CHARACTER(LEN=20) :: YNAMELIST +CHARACTER(LEN=128) :: YCOMMENT1 +CHARACTER(LEN=128) :: YCOMMENT2 +LOGICAL :: LSTOP +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_READ_NAM:CHECK_FIELD',0,ZHOOK_HANDLE) +! +IF(LEN_TRIM(HFIELD)==0)THEN +! + IF(KID==0)THEN + YWORK=TRIM(HTYP)//' - SFX' + ELSE + YWORK='SFX - '//TRIM(HTYP) + ENDIF +! + SELECT CASE (HTYP) + CASE(YLAND) + YNAMELIST='NAM_SFX_LAND_CPL' + CASE(YSEA) + YNAMELIST='NAM_SFX_SEA_CPL' + CASE(YLAKE) + YNAMELIST='NAM_SFX_LAKE_CPL' + CASE(YWAVE) + YNAMELIST='NAM_SFX_WAVE_CPL' + CASE DEFAULT + CALL ABOR1_SFX('SFX_OASIS_READ_NAM: TYPE NOT SUPPORTED OR IMPLEMENTD : '//TRIM(HTYP)) + END SELECT +! + YCOMMENT1= 'SFX_OASIS_READ_NAM: '//TRIM(HCOMMENT)//' is not done for '//TRIM(YWORK)//' coupling' + YCOMMENT2= 'SFX_OASIS_READ_NAM: Namelist key '//TRIM(HKEY)//' is not in '//TRIM(YNAMELIST) +! + WRITE(ILUOUT,*)TRIM(YCOMMENT1) + WRITE(ILUOUT,*)TRIM(YCOMMENT2) +! +! For oceanic and wave coupling do not stop the model if a field from surfex to ocean/wave is +! not done because many particular case can be used +! + IF((KID==0.OR.KID==1).AND.HTYP/=YLAND)THEN + LSTOP=.FALSE. + ELSE + LSTOP=.TRUE. + ENDIF +! + IF(LSTOP)THEN + CALL ABOR1_SFX(YCOMMENT1) + ENDIF +! +ENDIF +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_READ_NAM:CHECK_FIELD',1,ZHOOK_HANDLE) +! +END SUBROUTINE CHECK_FIELD +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE SFX_OASIS_READ_NAM diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_recv.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_recv.F90 new file mode 100755 index 0000000000000000000000000000000000000000..bb174e0319ec7dcd5e7c3dcd1bcb747da40f19e3 --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_recv.F90 @@ -0,0 +1,327 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +!######### +SUBROUTINE SFX_OASIS_RECV(HPROGRAM,KI,KSW,PTIMEC, & + ORECV_LAND, ORECV_SEA, ORECV_WAVE, & + PLAND_WTD,PLAND_FWTD, & + PLAND_FFLOOD,PLAND_PIFLOOD, & + PSEA_SST,PSEA_UCU,PSEA_VCU, & + PSEAICE_SIT,PSEAICE_CVR,PSEAICE_ALB, & + PWAVE_CHA,PWAVE_UCU,PWAVE_VCU, & + PWAVE_HS,PWAVE_TP ) +!######################################## +! +!!**** *SFX_OASIS_RECV* - Receive coupling fields from oasis +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/2013 +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_SURF_PAR, ONLY : XUNDEF, NUNDEF +! +USE MODD_SFX_OASIS +! +USE MODD_SGH_PAR, ONLY : +! +USE MODI_GET_LUOUT +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +#ifdef CPLOASIS +USE MOD_OASIS +#endif +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +CHARACTER(LEN=*), INTENT(IN) :: HPROGRAM ! program calling surf. schemes +INTEGER, INTENT(IN) :: KI ! number of points on this proc +INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands +REAL, INTENT(IN) :: PTIMEC ! Cumulated run time step (s) +! +LOGICAL, INTENT(IN) :: ORECV_LAND +LOGICAL, INTENT(IN) :: ORECV_SEA +LOGICAL, INTENT(IN) :: ORECV_WAVE +! +REAL, DIMENSION(KI), INTENT(OUT) :: PLAND_WTD ! Land water table depth (m) +REAL, DIMENSION(KI), INTENT(OUT) :: PLAND_FWTD ! Land grid-cell fraction of water table rise (-) +REAL, DIMENSION(KI), INTENT(OUT) :: PLAND_FFLOOD ! Land Floodplains fraction (-) +REAL, DIMENSION(KI), INTENT(OUT) :: PLAND_PIFLOOD ! Land Potential flood infiltration (kg/m2/s) +! +REAL, DIMENSION(KI), INTENT(OUT) :: PSEA_SST ! Sea surface temperature (K) +REAL, DIMENSION(KI), INTENT(OUT) :: PSEA_UCU ! Sea u-current stress (Pa) +REAL, DIMENSION(KI), INTENT(OUT) :: PSEA_VCU ! Sea v-current stress (Pa) +! +REAL, DIMENSION(KI), INTENT(OUT) :: PSEAICE_SIT ! Sea-ice Temperature (K) +REAL, DIMENSION(KI), INTENT(OUT) :: PSEAICE_CVR ! Sea-ice cover (-) +REAL, DIMENSION(KI), INTENT(OUT) :: PSEAICE_ALB ! Sea-ice albedo (-) +! +REAL, DIMENSION(KI), INTENT(OUT) :: PWAVE_CHA ! Charnock coefficient (-) +REAL, DIMENSION(KI), INTENT(OUT) :: PWAVE_UCU ! u-current velocity (m/s) +REAL, DIMENSION(KI), INTENT(OUT) :: PWAVE_VCU ! v-current velocity (m/s) +REAL, DIMENSION(KI), INTENT(OUT) :: PWAVE_HS ! Significant wave height (m) +REAL, DIMENSION(KI), INTENT(OUT) :: PWAVE_TP ! Peak period (s) +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +REAL, DIMENSION(KI,1) :: ZREAD +! +INTEGER :: IDATE ! current coupling time step (s) +INTEGER :: IERR ! Error info +INTEGER :: ILUOUT +CHARACTER(LEN=50) :: YCOMMENT +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +#ifdef CPLOASIS +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_RECV',0,ZHOOK_HANDLE) +! +!* 1. Initialize : +! ------------ +! +CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +IDATE = INT(PTIMEC) +! +!------------------------------------------------------------------------------- +! +!* 2. Get Land surface variable : +! ------------------------------------ +! +IF(ORECV_LAND)THEN +! +! * Init river input fields +! + ZREAD(:,:) = XUNDEF +! + PLAND_WTD (:) = XUNDEF + PLAND_FWTD (:) = XUNDEF + PLAND_FFLOOD (:) = XUNDEF + PLAND_PIFLOOD(:) = XUNDEF +! +! * Receive river input fields +! + IF(LCPL_GW)THEN +! + YCOMMENT='water table depth' + CALL OASIS_GET(NWTD_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PLAND_WTD(:)=ZREAD(:,1) +! + YCOMMENT='fraction of water table rise' + CALL OASIS_GET(NFWTD_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PLAND_FWTD(:)=ZREAD(:,1) +! + ENDIF +! + IF(LCPL_FLOOD)THEN +! + YCOMMENT='Flood fraction' + CALL OASIS_GET(NFFLOOD_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PLAND_FFLOOD(:)=ZREAD(:,1) +! + YCOMMENT='Potential flood infiltration' + CALL OASIS_GET(NPIFLOOD_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PLAND_PIFLOOD(:)=ZREAD(:,1) +! + WHERE(PLAND_PIFLOOD(:)==0.0)PLAND_FFLOOD(:)=0.0 +! + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 3. Get Sea variables : +! ----------------------------- +! +! +IF(ORECV_SEA)THEN +! +! * Init ocean input fields +! + ZREAD(:,:) = XUNDEF +! + PSEA_SST (:) = XUNDEF + PSEA_UCU (:) = XUNDEF + PSEA_VCU (:) = XUNDEF +! + PSEAICE_SIT (:) = XUNDEF + PSEAICE_CVR (:) = XUNDEF + PSEAICE_ALB (:) = XUNDEF +! +! * Receive ocean input fields +! + IF(NSEA_SST_ID/=NUNDEF)THEN + YCOMMENT='Sea surface temperature' + CALL OASIS_GET(NSEA_SST_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PSEA_SST(:)=ZREAD(:,1) + ENDIF +! + IF(NSEA_UCU_ID/=NUNDEF)THEN + YCOMMENT='Sea u-current stress' + CALL OASIS_GET(NSEA_UCU_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PSEA_UCU(:)=ZREAD(:,1) + ENDIF +! + IF(NSEA_VCU_ID/=NUNDEF)THEN + YCOMMENT='Sea v-current stress' + CALL OASIS_GET(NSEA_VCU_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PSEA_VCU(:)=ZREAD(:,1) + ENDIF +! + IF(LCPL_SEAICE)THEN +! + YCOMMENT='Sea-ice Temperature' + CALL OASIS_GET(NSEAICE_SIT_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PSEAICE_SIT(:)=ZREAD(:,1) +! + YCOMMENT='Sea-ice cover' + CALL OASIS_GET(NSEAICE_CVR_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PSEAICE_CVR(:)=ZREAD(:,1) +! + YCOMMENT='Sea-ice albedo' + CALL OASIS_GET(NSEAICE_ALB_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PSEAICE_ALB(:)=ZREAD(:,1) +! + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 4. Get Wave variables : +! ----------------------------- +! +! +IF(ORECV_WAVE)THEN +! +! * Init ocean input fields +! + ZREAD(:,:) = XUNDEF +! + PWAVE_CHA (:) = XUNDEF + PWAVE_UCU (:) = XUNDEF + PWAVE_VCU (:) = XUNDEF + PWAVE_HS (:) = XUNDEF + PWAVE_TP (:) = XUNDEF +! +! * Receive wave input fields +! + IF(NWAVE_CHA_ID/=NUNDEF)THEN + YCOMMENT='Charnock coefficient' + CALL OASIS_GET(NWAVE_CHA_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PWAVE_CHA(:)=ZREAD(:,1) + ENDIF +! + IF(NWAVE_UCU_ID/=NUNDEF)THEN + YCOMMENT='u-current velocity' + CALL OASIS_GET(NWAVE_UCU_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PWAVE_UCU(:)=ZREAD(:,1) + ENDIF +! + IF(NWAVE_VCU_ID/=NUNDEF)THEN + YCOMMENT='v-current velocity' + CALL OASIS_GET(NWAVE_VCU_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PWAVE_VCU(:)=ZREAD(:,1) + ENDIF +! + IF(NWAVE_HS_ID/=NUNDEF)THEN + YCOMMENT='Significant wave height' + CALL OASIS_GET(NWAVE_HS_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PWAVE_HS(:)=ZREAD(:,1) + ENDIF +! + IF(NWAVE_TP_ID/=NUNDEF)THEN + YCOMMENT='Peak period' + CALL OASIS_GET(NWAVE_TP_ID,IDATE,ZREAD(:,:),IERR) + CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) + PWAVE_TP(:)=ZREAD(:,1) + ENDIF +! +ENDIF +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_RECV',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +CONTAINS +!------------------------------------------------------------------------------- +! +SUBROUTINE CHECK_RECV(KLUOUT,KERR,HCOMMENT) +! +USE MODI_ABOR1_SFX +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KLUOUT +INTEGER, INTENT(IN) :: KERR + CHARACTER(LEN=*), INTENT(IN) :: HCOMMENT +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_RECV:CHECK_RECV',0,ZHOOK_HANDLE) +! +IF (KERR/=OASIS_OK.AND.KERR<OASIS_RECVD) THEN + WRITE(KLUOUT,'(A,I4)')'Return OASIS code receiving '//TRIM(HCOMMENT)//' : ',KERR + CALL ABOR1_SFX('SFX_OASIS_RECV: problem receiving '//TRIM(HCOMMENT)//' from OASIS') +ENDIF +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_RECV:CHECK_RECV',1,ZHOOK_HANDLE) +! +END SUBROUTINE CHECK_RECV +! +!------------------------------------------------------------------------------- +#endif +!------------------------------------------------------------------------------- +! +END SUBROUTINE SFX_OASIS_RECV diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_send.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_send.F90 new file mode 100755 index 0000000000000000000000000000000000000000..013350350f299943eea681e66d60b3df22b1989b --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/sfx_oasis_send.F90 @@ -0,0 +1,423 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +!######### +SUBROUTINE SFX_OASIS_SEND(KLUOUT,KI,KDATE,OSEND_LAND,OSEND_LAKE,OSEND_SEA,OSEND_WAVE, & + PLAND_RUNOFF,PLAND_DRAIN,PLAND_CALVING,PLAND_RECHARGE,& + PLAND_SRCFLOOD, & + PLAKE_EVAP,PLAKE_RAIN,PLAKE_SNOW,PLAKE_WATF, & + PSEA_FWSU,PSEA_FWSV,PSEA_HEAT,PSEA_SNET,PSEA_WIND, & + PSEA_FWSM,PSEA_EVAP,PSEA_RAIN,PSEA_SNOW,PSEA_EVPR, & + PSEA_WATF,PSEA_PRES,PSEAICE_HEAT,PSEAICE_SNET, & + PSEAICE_EVAP,PWAVE_U10,PWAVE_V10 ) +!########################################### +! +!!**** *SFX_OASIS_SEND* - Send coupling fields +!! +!! PURPOSE +!! ------- +!! +!! Attention : all fields are sent in Pa, m/s, W/m2 or kg/m2/s +!! +!! +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! B. Decharme *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/2013 +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!! and surface pressure for ocean coupling +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODN_SFX_OASIS, ONLY : XTSTEP_CPL_SEA, XTSTEP_CPL_WAVE, XTSTEP_CPL_LAKE, & + XTSTEP_CPL_LAND +! +USE MODD_SURF_PAR, ONLY : XUNDEF, NUNDEF +! +USE MODD_SFX_OASIS +! +USE MODI_GET_LUOUT +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +#ifdef CPLOASIS +USE MOD_OASIS +#endif +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +INTEGER, INTENT(IN) :: KLUOUT +INTEGER, INTENT(IN) :: KI ! number of points +INTEGER, INTENT(IN) :: KDATE ! current coupling time step (s) +LOGICAL, INTENT(IN) :: OSEND_LAND +LOGICAL, INTENT(IN) :: OSEND_LAKE +LOGICAL, INTENT(IN) :: OSEND_SEA +LOGICAL, INTENT(IN) :: OSEND_WAVE +! +REAL, DIMENSION(KI), INTENT(IN) :: PLAND_RUNOFF ! Cumulated Surface runoff (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PLAND_DRAIN ! Cumulated Deep drainage (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PLAND_CALVING ! Cumulated Calving flux (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PLAND_RECHARGE ! Cumulated Recharge to groundwater (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PLAND_SRCFLOOD ! Cumulated flood freshwater flux (kg/m2) +! +REAL, DIMENSION(KI), INTENT(IN) :: PLAKE_EVAP ! Cumulated Evaporation (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PLAKE_RAIN ! Cumulated Rainfall rate (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PLAKE_SNOW ! Cumulated Snowfall rate (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PLAKE_WATF ! Cumulated freshwater flux (kg/m2) +! +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_FWSU ! Cumulated zonal wind stress (Pa.s) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_FWSV ! Cumulated meridian wind stress (Pa.s) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_HEAT ! Cumulated Non solar net heat flux (J/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_SNET ! Cumulated Solar net heat flux (J/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_WIND ! Cumulated 10m wind speed (m) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_FWSM ! Cumulated wind stress (Pa.s) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_EVAP ! Cumulated Evaporation (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_RAIN ! Cumulated Rainfall rate (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_SNOW ! Cumulated Snowfall rate (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_EVPR ! Evap. - Precip. rate (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_WATF ! Cumulated freshwater flux (kg/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PSEA_PRES ! Cumulated Surface pressure (Pa.s) +! +REAL, DIMENSION(KI), INTENT(IN) :: PSEAICE_HEAT ! Cumulated Sea-ice non solar net heat flux (J/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PSEAICE_SNET ! Cumulated Sea-ice solar net heat flux (J/m2) +REAL, DIMENSION(KI), INTENT(IN) :: PSEAICE_EVAP ! Cumulated Sea-ice sublimation (kg/m2) +! +REAL, DIMENSION(KI), INTENT(IN) :: PWAVE_U10 ! +REAL, DIMENSION(KI), INTENT(IN) :: PWAVE_V10 ! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +REAL, DIMENSION(KI,1) :: ZWRITE ! Mean flux send to OASIS (Pa, m/s, W/m2 or kg/m2/s) +! +CHARACTER(LEN=50) :: YCOMMENT +INTEGER :: IERR ! Error info +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +#ifdef CPLOASIS +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_SEND',0,ZHOOK_HANDLE) +! +!* 1. Initialize : +! ------------ +! +ZWRITE(:,:) = XUNDEF +! +!------------------------------------------------------------------------------- +! +!* 2. Send land fields to OASIS: +! -------------------------- +! +IF(OSEND_LAND)THEN +! +! * Send river output fields +! + YCOMMENT='Surface runoff over land' + CALL OUTVAR(PLAND_RUNOFF,XTSTEP_CPL_LAND,ZWRITE(:,1)) + CALL OASIS_PUT(NRUNOFF_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) +! + YCOMMENT='Deep drainage over land' + CALL OUTVAR(PLAND_DRAIN,XTSTEP_CPL_LAND,ZWRITE(:,1)) + CALL OASIS_PUT(NDRAIN_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) +! + IF(LCPL_CALVING)THEN + YCOMMENT='calving flux over land' + CALL OUTVAR(PLAND_CALVING,XTSTEP_CPL_LAND,ZWRITE(:,1)) + CALL OASIS_PUT(NCALVING_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(LCPL_GW)THEN + YCOMMENT='groundwater recharge over land' + CALL OUTVAR(PLAND_RECHARGE,XTSTEP_CPL_LAND,ZWRITE(:,1)) + CALL OASIS_PUT(NRECHARGE_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(LCPL_FLOOD)THEN + YCOMMENT='flood freshwater flux over land (P-E-I)' + CALL OUTVAR(PLAND_SRCFLOOD,XTSTEP_CPL_LAND,ZWRITE(:,1)) + CALL OASIS_PUT(NSRCFLOOD_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 3. Send lake fields to OASIS : +! -------------------------- +IF(OSEND_LAKE)THEN +! +! * Send output fields (in kg/m2/s) +! + IF(NLAKE_EVAP_ID/=NUNDEF)THEN + YCOMMENT='Evaporation over lake' + CALL OUTVAR(PLAKE_EVAP,XTSTEP_CPL_LAKE,ZWRITE(:,1)) + CALL OASIS_PUT(NLAKE_EVAP_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NLAKE_RAIN_ID/=NUNDEF)THEN + YCOMMENT='Rainfall rate over lake' + CALL OUTVAR(PLAKE_RAIN,XTSTEP_CPL_LAKE,ZWRITE(:,1)) + CALL OASIS_PUT(NLAKE_RAIN_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NLAKE_SNOW_ID/=NUNDEF)THEN + YCOMMENT='Snowfall rate over lake' + CALL OUTVAR(PLAKE_SNOW,XTSTEP_CPL_LAKE,ZWRITE(:,1)) + CALL OASIS_PUT(NLAKE_SNOW_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NLAKE_WATF_ID/=NUNDEF)THEN + YCOMMENT='Freshwater flux over lake (P-E)' + CALL OUTVAR(PLAKE_WATF,XTSTEP_CPL_LAKE,ZWRITE(:,1)) + CALL OASIS_PUT(NLAKE_WATF_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF + + +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 4. Send sea fields to OASIS : +! -------------------------- +! +IF(OSEND_SEA)THEN +! +! * Send sea output fields (in Pa, m/s, W/m2 or kg/m2/s) +! + IF(NSEA_FWSU_ID/=NUNDEF)THEN + YCOMMENT='zonal wind stress over sea' + CALL OUTVAR(PSEA_FWSU,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_FWSU_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_FWSV_ID/=NUNDEF)THEN + YCOMMENT='meridian wind stress over sea' + CALL OUTVAR(PSEA_FWSV,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_FWSV_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_HEAT_ID/=NUNDEF)THEN + YCOMMENT='Non solar net heat flux over sea' + CALL OUTVAR(PSEA_HEAT,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_HEAT_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_SNET_ID/=NUNDEF)THEN + YCOMMENT='Solar net heat flux over sea' + CALL OUTVAR(PSEA_SNET,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_SNET_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_WIND_ID/=NUNDEF)THEN + YCOMMENT='10m wind speed over sea' + CALL OUTVAR(PSEA_WIND,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_WIND_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_FWSM_ID/=NUNDEF)THEN + YCOMMENT='wind stress over sea' + CALL OUTVAR(PSEA_FWSM,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_FWSM_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_EVAP_ID/=NUNDEF)THEN + YCOMMENT='Evaporation over sea' + CALL OUTVAR(PSEA_EVAP,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_EVAP_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_RAIN_ID/=NUNDEF)THEN + YCOMMENT='Rainfall rate over sea' + CALL OUTVAR(PSEA_RAIN,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_RAIN_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_SNOW_ID/=NUNDEF)THEN + YCOMMENT='Snowfall rate over sea' + CALL OUTVAR(PSEA_SNOW,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_SNOW_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_EVPR_ID/=NUNDEF)THEN + YCOMMENT='Evap. - Precip. rate over sea' + CALL OUTVAR(PSEA_EVPR,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_EVPR_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_WATF_ID/=NUNDEF)THEN + YCOMMENT='Freshwater flux over sea (P-E)' + CALL OUTVAR(PSEA_WATF,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_WATF_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEA_PRES_ID/=NUNDEF)THEN + YCOMMENT='Surface pressure' + CALL OUTVAR(PSEA_PRES,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEA_PRES_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! +! * Sea-ice output fields (in W/m2 or kg/m2/s) +! + IF(LCPL_SEAICE)THEN +! + IF(NSEAICE_HEAT_ID/=NUNDEF)THEN + YCOMMENT='Sea-ice non solar net heat flux over sea-ice' + CALL OUTVAR(PSEAICE_HEAT,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEAICE_HEAT_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEAICE_SNET_ID/=NUNDEF)THEN + YCOMMENT='Sea-ice solar net heat flux over sea-ice' + CALL OUTVAR(PSEAICE_SNET,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEAICE_SNET_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NSEAICE_EVAP_ID/=NUNDEF)THEN + YCOMMENT='Sea-ice sublimation over sea-ice' + CALL OUTVAR(PSEAICE_EVAP,XTSTEP_CPL_SEA,ZWRITE(:,1)) + CALL OASIS_PUT(NSEAICE_EVAP_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + ENDIF +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 5. Send wave fields to OASIS : +! -------------------------- +IF(OSEND_WAVE)THEN +! +! * Send output fields +! + IF(NWAVE_U10_ID/=NUNDEF)THEN + YCOMMENT='10m u-wind speed' + ZWRITE(:,1) = PWAVE_U10(:) + CALL OASIS_PUT(NWAVE_U10_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! + IF(NWAVE_V10_ID/=NUNDEF)THEN + YCOMMENT='10m v-wind speed' + ZWRITE(:,1) = PWAVE_V10(:) + CALL OASIS_PUT(NWAVE_V10_ID,KDATE,ZWRITE(:,:),IERR) + CALL CHECK_SFX_SEND(KLUOUT,IERR,YCOMMENT,ZWRITE(:,1)) + ENDIF +! +ENDIF +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_SEND',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +CONTAINS +!------------------------------------------------------------------------------- +! +SUBROUTINE CHECK_SFX_SEND(KLUOUT,KERR,HCOMMENT,PWRITE) +! +USE MODI_ABOR1_SFX +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KLUOUT +INTEGER, INTENT(IN) :: KERR + CHARACTER(LEN=*), INTENT(IN) :: HCOMMENT +! +REAL, DIMENSION(:), INTENT(OUT):: PWRITE +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_SEND:CHECK_SFX_SEND',0,ZHOOK_HANDLE) +! +PWRITE(:) = XUNDEF +! +IF (KERR/=OASIS_OK.AND.KERR<OASIS_SENT) THEN + WRITE(KLUOUT,'(A,I4)')'Return OASIS code from sending '//TRIM(HCOMMENT)//' : ',KERR + CALL ABOR1_SFX('SFX_OASIS_SEND: problem sending '//TRIM(HCOMMENT)) +ENDIF +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_SEND:CHECK_SFX_SEND',1,ZHOOK_HANDLE) +! +END SUBROUTINE CHECK_SFX_SEND +! +!------------------------------------------------------------------------------- +! +SUBROUTINE OUTVAR(PIN,PDIV,PWRITE) +! +IMPLICIT NONE +! +REAL, DIMENSION(:), INTENT(IN) :: PIN +REAL, INTENT(IN) :: PDIV +! +REAL, DIMENSION(:), INTENT(OUT):: PWRITE +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_SEND:OUTVAR',0,ZHOOK_HANDLE) +! +WHERE(PIN(:)/=XUNDEF) + PWRITE(:)=PIN(:)/PDIV +ELSEWHERE + PWRITE(:)=XUNDEF +ENDWHERE +! +IF (LHOOK) CALL DR_HOOK('SFX_OASIS_SEND:OUTVAR',1,ZHOOK_HANDLE) +! +END SUBROUTINE OUTVAR +! +!------------------------------------------------------------------------------- +#endif +!------------------------------------------------------------------------------- +! +END SUBROUTINE SFX_OASIS_SEND diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/write_lcover.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/write_lcover.F90 new file mode 100644 index 0000000000000000000000000000000000000000..f4a6ec576d1d0cb014925a06fd7d13a63bb54fae --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/write_lcover.F90 @@ -0,0 +1,102 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE WRITE_LCOVER(DGU,U,HPROGRAM,OCOVER) +! ################################ +! +!!**** *READ_LCOVER* - routine to write a file for +!! physiographic data file of model _n +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to write the list of covers to a file in parallel using MPI +!! +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! M. Moge *LA - CNRS* +!! +!! MODIFICATIONS +!! ------------- +!! J. Pianezze 08/2016 replacement of MPI_COMM_WOLRD by NMNH_COMM_WORLD +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +#ifdef MNH_PARALLEL +USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD +#endif +! +USE MODD_DATA_COVER_PAR, ONLY : JPCOVER +USE MODD_DIAG_SURF_ATM_n, ONLY : DIAG_SURF_ATM_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +! +USE MODI_WRITE_SURF +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +#ifndef NOMPI +INCLUDE "mpif.h" +#endif +! +!* 0.1 Declarations of arguments +! ------------------------- +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program +LOGICAL, DIMENSION(JPCOVER) :: OCOVER ! list of covers +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +TYPE(DIAG_SURF_ATM_t), INTENT(INOUT) :: DGU +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +INTEGER :: IRESP ! Error code after reading +CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read +CHARACTER(LEN=100):: YCOMMENT ! Comment string +LOGICAL, DIMENSION(JPCOVER) :: GCOVER ! tmp list of covers +REAL(KIND=JPRB) :: ZHOOK_HANDLE +INTEGER :: IINFO +!------------------------------------------------------------------------------- +! +! +!* ascendant compatibility +IF (LHOOK) CALL DR_HOOK('WRITE_LCOVER',0,ZHOOK_HANDLE) +#ifndef NOMPI +#ifdef MNH_PARALLEL +CALL MPI_ALLREDUCE(OCOVER, GCOVER, SIZE(OCOVER),MPI_LOGICAL, MPI_LOR, NMNH_COMM_WORLD, IINFO) +#else +CALL MPI_ALLREDUCE(OCOVER, GCOVER, SIZE(OCOVER),MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, IINFO) +#endif +#endif +OCOVER(:)=GCOVER(:) +YRECFM='COVER_LIST' +YCOMMENT='(LOGICAL LIST)' +CALL WRITE_SURF(DGU,U,HPROGRAM,YRECFM,OCOVER(:),IRESP,HCOMMENT=YCOMMENT,HDIR='-') +! +IF (LHOOK) CALL DR_HOOK('WRITE_LCOVER',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE WRITE_LCOVER diff --git a/src/ARCH_SRC/CPL_WAVE/SURFEX/writesurf_seafluxn.F90 b/src/ARCH_SRC/CPL_WAVE/SURFEX/writesurf_seafluxn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..35f7469b99b35f51a0c29cadd4b2f0ee387bda8c --- /dev/null +++ b/src/ARCH_SRC/CPL_WAVE/SURFEX/writesurf_seafluxn.F90 @@ -0,0 +1,252 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE WRITESURF_SEAFLUX_n (DGU, U, & + O, OR, S, & + HPROGRAM) +! ######################################## +! +!!**** *WRITE_SEAFLUX_n* - writes SEAFLUX fields +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Masson *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/2003 +!! Modified 01/2014 : S. Senesi : handle seaice scheme +!! S. Belamari 03/2014 Include sea surface salinity XSSS +!! R. Séférian 01/2015 : introduce interactive ocean surface albedo +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!! Modified 11/2014 : J. Pianezze ! add currents and charnock coefficient +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +! +! +! +! +USE MODD_DIAG_SURF_ATM_n, ONLY : DIAG_SURF_ATM_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +! +USE MODD_OCEAN_n, ONLY : OCEAN_t +USE MODD_OCEAN_REL_n, ONLY : OCEAN_REL_t +USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t +! +USE MODD_SFX_OASIS, ONLY : LCPL_WAVE, LCPL_SEA +! +USE MODI_WRITE_SURF +USE MODI_WRITESURF_OCEAN_n +USE MODI_WRITESURF_SEAICE_N +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +! +! +TYPE(DIAG_SURF_ATM_t), INTENT(INOUT) :: DGU +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +! +TYPE(OCEAN_t), INTENT(INOUT) :: O +TYPE(OCEAN_REL_t), INTENT(INOUT) :: OR +TYPE(SEAFLUX_t), INTENT(INOUT) :: S +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling + +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JMTH, INMTH + CHARACTER(LEN=2 ) :: YMTH +! +INTEGER :: IRESP ! IRESP : return-code if a problem appears + CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read + CHARACTER(LEN=100):: YCOMMENT ! Comment string +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +! +IF (LHOOK) CALL DR_HOOK('WRITESURF_SEAFLUX_N',0,ZHOOK_HANDLE) +! + CALL WRITESURF_OCEAN_n(DGU, U, & + O, OR, & + HPROGRAM) +! +!* 2. Sea-ice prognostic fields: +! -------------------------- +! +!* flag to tell if Sea Ice model is used +! +YCOMMENT='flag to handle sea ice cover' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,'HANDLE_SIC',S%LHANDLE_SIC,IRESP,YCOMMENT) +! +IF (S%LHANDLE_SIC) CALL WRITESURF_SEAICE_n(DGU, U, & + S, & + HPROGRAM) +! +! +!* 3. Prognostic fields: +! ----------------- +! +!* water temperature +! +IF(S%LINTERPOL_SST)THEN +! + INMTH=SIZE(S%XSST_MTH,2) +! + DO JMTH=1,INMTH + WRITE(YMTH,'(I2)') (JMTH-1) + YRECFM='SST_MTH'//ADJUSTL(YMTH(:LEN_TRIM(YMTH))) + YCOMMENT='SST at month t'//ADJUSTL(YMTH(:LEN_TRIM(YMTH))) + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XSST_MTH(:,JMTH),IRESP,HCOMMENT=YCOMMENT) + ENDDO +! +ENDIF +! +YRECFM='SST' +YCOMMENT='SST' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XSST(:),IRESP,HCOMMENT=YCOMMENT) +! +!------------------------------------------------------------------------------- +! +!* 4. Semi-prognostic fields: +! ---------------------- +! +!* roughness length +! +YRECFM='Z0SEA' +YCOMMENT='Z0SEA (m)' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XZ0(:),IRESP,HCOMMENT=YCOMMENT) +! +!* significant height +! +YRECFM='HS' +YCOMMENT='HS (m)' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XHS(:),IRESP,HCOMMENT=YCOMMENT) +! +!* peak period +! +YRECFM='TP' +YCOMMENT='TP (s)' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XTP(:),IRESP,HCOMMENT=YCOMMENT) +! +! +IF (LCPL_WAVE) THEN + ! + !* Charnock coefficient + ! + YRECFM='CHARN' + YCOMMENT='CHARN (-)' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XCHARN(:),IRESP,HCOMMENT=YCOMMENT) + ! +END IF + +IF (LCPL_WAVE .OR. LCPL_SEA) THEN + ! + !* u-current velocity + ! + YRECFM='UMER' + YCOMMENT='UMER (m/s)' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XUMER(:),IRESP,HCOMMENT=YCOMMENT) + ! + !* v-current velocity + ! + YRECFM='VMER' + YCOMMENT='VMER (m/s)' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XVMER(:),IRESP,HCOMMENT=YCOMMENT) + ! +ENDIF +! +!* sea surface salinity +! +IF(S%LINTERPOL_SSS)THEN + ! + INMTH=SIZE(S%XSSS_MTH,2) + ! + DO JMTH=1,INMTH + WRITE(YMTH,'(I2)') (JMTH-1) + YRECFM='SSS_MTH'//ADJUSTL(YMTH(:LEN_TRIM(YMTH))) + YCOMMENT='Sea Surface Salinity at month t'//ADJUSTL(YMTH(:LEN_TRIM(YMTH))) + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XSSS_MTH(:,JMTH),IRESP,HCOMMENT=YCOMMENT) + ENDDO +! +ENDIF +! +YRECFM='SSS' +YCOMMENT='Sea Surface Salinity' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XSSS(:),IRESP,HCOMMENT=YCOMMENT) +! +! +!* ocean surface albedo (direct and diffuse fraction) +! +IF(S%CSEA_ALB=='RS14')THEN +! + YRECFM='OSA_DIR' + YCOMMENT='direct ocean surface albedo (-)' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XDIR_ALB(:),IRESP,HCOMMENT=YCOMMENT) +! + YRECFM='OSA_SCA' + YCOMMENT='diffuse ocean surface albedo (-)' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%XSCA_ALB(:),IRESP,HCOMMENT=YCOMMENT) +! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 5. Time +! ---- +! +YRECFM='DTCUR' +YCOMMENT='s' + CALL WRITE_SURF(DGU, U, & + HPROGRAM,YRECFM,S%TTIME,IRESP,HCOMMENT=YCOMMENT) +IF (LHOOK) CALL DR_HOOK('WRITESURF_SEAFLUX_N',1,ZHOOK_HANDLE) +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE WRITESURF_SEAFLUX_n diff --git a/src/LIB/oasis3-mct_v3.tar.gz b/src/LIB/oasis3-mct_v3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ad43bfa1f8c85456f4c2729a7d673399e2f9e15e --- /dev/null +++ b/src/LIB/oasis3-mct_v3.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1c19505b8b08320817335703214e49b065765e24f3fbea45e1985f9fc5bf300 +size 16900940 diff --git a/src/LIB/toy_v1-0.tar.gz b/src/LIB/toy_v1-0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..de54521d2bc4441f53e99fd72288db2fe8e5cb1e --- /dev/null +++ b/src/LIB/toy_v1-0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22757def28c47328b44de5f10029803ad2e01b1923c3e6defa3b403f20639040 +size 7607