diff --git a/src/Makefile.MESONH.mk b/src/Makefile.MESONH.mk index f9cb11bfcfbf9da73eda4d78d8b237902f0758f4..405e511f1acdf06104ce1376c62854c4d426d692 100644 --- a/src/Makefile.MESONH.mk +++ b/src/Makefile.MESONH.mk @@ -31,9 +31,6 @@ endif # Source MNH # ########################################################## ifdef VER_OASIS -DIR_SURFEX += OASIS/SURFEX -DIR_MNH += OASIS/MNH -DIR_SURCOUCHE += OASIS/SURCOUCHE CPPFLAGS += -DCPLOASIS endif # PRE_BUG TEST !!! diff --git a/src/SURFEX/coare30_flux.F90 b/src/SURFEX/coare30_flux.F90 index f8f6724ceba0f8140e025e9dfd19447a602b6156..ac88af8c3f88e436e24aff26cbc1d5ecfbc7971b 100644 --- a/src/SURFEX/coare30_flux.F90 +++ b/src/SURFEX/coare30_flux.F90 @@ -5,7 +5,7 @@ ! ######### 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) + PRESA,PRAIN,PZ0HSEA,PHS,PTP) ! ####################################################################### ! ! @@ -50,10 +50,12 @@ !! 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 -!! J.Escobar 06/2013 for REAL4/8 add EPSILON management +!! 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 +!! 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 @@ -67,6 +69,8 @@ USE MODD_CSTS, ONLY : XKARMAN, XG, XSTEFAN, XRD, XRV, XPI, & 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 ! @@ -102,6 +106,8 @@ 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 ! @@ -307,6 +313,12 @@ 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) @@ -316,16 +328,30 @@ DO J=1,SIZE(PTA) ELSE ITERMAX(J) = 3 !number of iterations ENDIF + IF (ZVMOD(J)<=1.) THEN + ITERMAX(J) = 10 + ENDIF ! - !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 + 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 ! ------------------------------------------- ! - ZHWAVE(J) = 0.018*ZVMOD(J)*ZVMOD(J)*(1.+0.015*ZVMOD(J)) - ZTWAVE(J) = 0.729*ZVMOD(J) + 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) ! @@ -494,7 +520,7 @@ ENDDO ! ! ZDIRCOSZW(:) = 1. -CALL SURFACE_RI(PSST,PQSAT,PEXNS,PEXNA,ZTA,ZQASAT,& + CALL SURFACE_RI(PSST,PQSAT,PEXNS,PEXNA,ZTA,ZQASAT,& PZREF,PUREF,ZDIRCOSZW,PVMOD,PRI ) ! ! 5.2 Aerodynamical conductance and resistance @@ -506,6 +532,8 @@ PRESA(:) = 1. / MAX(ZAC(:),XSURF_EPSILON) ! PZ0SEA(:) = ZCHARN(:) * ZUSTAR2(:) / XG + XVZ0CM * PCD(:) / PCDN(:) ! +PZ0SEA(:) = MAX(MIN(ZO(:),0.05),10E-6) +! PZ0HSEA(:) = PZ0SEA(:) ! IF (LHOOK) CALL DR_HOOK('COARE30_FLUX',1,ZHOOK_HANDLE) diff --git a/src/SURFEX/coare30_seaflux.F90 b/src/SURFEX/coare30_seaflux.F90 index ef0768ae35b2c059510a09fa2f7de0b038ca1b5d..4dd0ea977cc39925c4ef584851cf5637f9f376aa 100644 --- a/src/SURFEX/coare30_seaflux.F90 +++ b/src/SURFEX/coare30_seaflux.F90 @@ -7,7 +7,7 @@ PTA,PEXNA,PRHOA,PSST,PEXNS,PQA, & PRAIN,PSNOW,PVMOD,PZREF,PUREF,PPS, & PQSAT,PSFTH,PSFTQ,PUSTAR, & - PCD,PCDN,PCH,PCE,PRI,PRESA,PZ0HSEA ) + PCD,PCDN,PCH,PCE,PRI,PRESA,PZ0HSEA ) ! ################################################################## ! ! @@ -38,7 +38,7 @@ !! !! AUTHOR !! ------ -!! C. Lebeaupin *Météo-France* +!! C. Lebeaupin *Météo-France* !! !! MODIFICATIONS !! ------------- @@ -46,6 +46,7 @@ !! 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 @@ -172,6 +173,8 @@ REAL, DIMENSION(SIZE(KMASK)) :: ZW_VMOD ! module of wind at atm. wind level 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) @@ -207,6 +210,8 @@ DO JJ=1, SIZE(KMASK) ZW_ZREF(JJ) = PZREF(KMASK(JJ)) ZW_UREF(JJ) = PUREF(KMASK(JJ)) ZW_SST(JJ) = PSST(KMASK(JJ)) + ZW_TP(JJ) = S%XTP(KMASK(JJ)) + ZW_HS(JJ) = S%XHS(KMASK(JJ)) ZW_EXNS(JJ) = PEXNS(KMASK(JJ)) ZW_PS(JJ) = PPS(KMASK(JJ)) ZW_RAIN(JJ) = PRAIN(KMASK(JJ)) @@ -230,7 +235,7 @@ 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_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 ! diff --git a/src/SURFEX/coupling_seafluxn.F90 b/src/SURFEX/coupling_seafluxn.F90 index b908374152ef74ca243d1810e1ac1e29f2e5b8e5..5ea7b516c971576bf25a3d80fa24f72ba2f7690c 100644 --- a/src/SURFEX/coupling_seafluxn.F90 +++ b/src/SURFEX/coupling_seafluxn.F90 @@ -47,6 +47,8 @@ SUBROUTINE COUPLING_SEAFLUX_n (CHS, DTS, DGS, O, OR, G, S, DST, SLT, & !! 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 !! !!--------------------------------------------------------------------- ! @@ -66,7 +68,7 @@ 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_SEA, LCPL_SEAICE +USE MODD_SFX_OASIS, ONLY : LCPL_WAVE, LCPL_SEA, LCPL_SEAICE USE MODD_WATER_PAR, ONLY : XEMISWAT, XEMISWATICE ! USE MODD_WATER_PAR, ONLY : XALBSEAICE @@ -299,7 +301,7 @@ ZSCA_ALB (:,:) = XUNDEF ZEXNS(:) = (PPS(:)/XP00)**(XRD/XCPD) ZEXNA(:) = (PPA(:)/XP00)**(XRD/XCPD) ! -IF(LCPL_SEA)THEN +IF(LCPL_SEA .OR. LCPL_WAVE)THEN !Sea currents are taken into account ZU(:)=PU(:)-S%XUMER(:) ZV(:)=PV(:)-S%XVMER(:) @@ -690,27 +692,38 @@ REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux 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(:)*PPEW_B_COEF(:)) / & - (1.0-PRHOA(:)*PCD(:)*ZWIND(:)*PPEW_A_COEF(:)) + ZUSTAR2(:) = (PCD(:)*ZWIND(:)*ZPEW_B_COEF(:)) / & + (1.0-PRHOA(:)*PCD(:)*ZWIND(:)*ZPEW_A_COEF(:)) ELSE ! new implicitation (m2/s2) - ZUSTAR2(:) = (PCD(:)*ZWIND(:)*(2.*PPEW_B_COEF(:)-ZWIND(:))) /& - (1.0-2.0*PRHOA(:)*PCD(:)*ZWIND(:)*PPEW_A_COEF(:)) + ZUSTAR2(:) = (PCD(:)*ZWIND(:)*(2.*ZPEW_B_COEF(:)-ZWIND(:))) /& + (1.0-2.0*PRHOA(:)*PCD(:)*ZWIND(:)*ZPEW_A_COEF(:)) ! - ZWORK(:) = PRHOA(:)*PPEW_A_COEF(:)*ZUSTAR2(:) + PPEW_B_COEF(:) + ZWORK(:) = PRHOA(:)*PPEW_A_COEF(:)*ZUSTAR2(:) + ZPEW_B_COEF(:) ZWORK(:) = MAX(ZWORK(:),0.) ! - WHERE(PPEW_A_COEF(:)/= 0.) - ZUSTAR2(:) = MAX( ( ZWORK(:) - PPEW_B_COEF(:) ) / (PRHOA(:)*PPEW_A_COEF(:)), 0.) + WHERE(ZPEW_A_COEF(:)/= 0.) + ZUSTAR2(:) = MAX( ( ZWORK(:) - PPEW_B_COEF(:) ) / (PRHOA(:)*ZPEW_A_COEF(:)), 0.) ENDWHERE ! ENDIF diff --git a/src/SURFEX/default_prep_seaflux.F90 b/src/SURFEX/default_prep_seaflux.F90 index d8819dfd195606d37b982748306beef34bc2b5f0..8d898603107898a66832c87b6daf164fb628d3e2 100644 --- a/src/SURFEX/default_prep_seaflux.F90 +++ b/src/SURFEX/default_prep_seaflux.F90 @@ -37,13 +37,15 @@ !! 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 + 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, & @@ -74,6 +76,9 @@ IF (LHOOK) CALL DR_HOOK('DEFAULT_PREP_SEAFLUX',0,ZHOOK_HANDLE) CFILE_SEAFLX = ' ' CTYPE_SEAFLX = 'GRIB ' ! +CFILEWAVE_SEAFLX = ' ' +CTYPEWAVE = ' ' +! CFILEPGD_SEAFLX = ' ' CTYPEPGD = ' ' ! diff --git a/src/SURFEX/default_seaflux.F90 b/src/SURFEX/default_seaflux.F90 index bfa89dc0863aa84d7315b69f095a503d2511b859..1141c6aa797b8f8fa2867fa6045455562718ceb1 100644 --- a/src/SURFEX/default_seaflux.F90 +++ b/src/SURFEX/default_seaflux.F90 @@ -6,7 +6,8 @@ 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 ) + PICHCE, HINTERPOL_SST, HINTERPOL_SSS, & + OWAVEWIND ) ! ######################################################################## ! !!**** *DEFAULT_SEAFLUX* - routine to set default values for the configuration for SEAFLUX scheme @@ -37,7 +38,8 @@ !! 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 @@ -70,6 +72,7 @@ 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 @@ -88,6 +91,7 @@ HSEA_ALB = "TA96" OPWG = .FALSE. OPRECIP = .FALSE. OPWEBB = .FALSE. +OWAVEWIND = .TRUE. ! KZ0 = 0 KGRVWAVES = 0 diff --git a/src/SURFEX/diag_cpl_esm_sea.F90 b/src/SURFEX/diag_cpl_esm_sea.F90 index cdb0dbe4922cab64e8540c1500c079966ddfc695..835d46a87c0d55f9a1b5203e6ce09fab0fa754f0 100644 --- a/src/SURFEX/diag_cpl_esm_sea.F90 +++ b/src/SURFEX/diag_cpl_esm_sea.F90 @@ -4,7 +4,7 @@ !SFX_LIC for details. version 1. ! ######### SUBROUTINE DIAG_CPL_ESM_SEA (S, D, DI, PTSTEP, PSFTQ, PRAIN, PSNOW, & - PLW, PSFTH_ICE, PSFTQ_ICE, PDIR_SW, PSCA_SW, OSIC) + PLW, PPS, PSFTH_ICE, PSFTQ_ICE, PDIR_SW, PSCA_SW, OSIC) ! ################################################################### ! !!**** *DIAG_CPL_ESM_SEA * - Computes diagnostics over sea for @@ -30,6 +30,7 @@ !! 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_DIAG_n, ONLY : DIAG_t @@ -57,6 +58,7 @@ 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):: PDIR_SW ! direct solar radiation (on horizontal surf.) @@ -107,6 +109,14 @@ S%XCPL_SEA_EVAP(:) = S%XCPL_SEA_EVAP(:) + PTSTEP * PSFTQ(:) 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 !------------------------------------------------------------------------------------- diff --git a/src/SURFEX/diag_inline_seafluxn.F90 b/src/SURFEX/diag_inline_seafluxn.F90 index 9d263279ef315a9585bade545e52800bc57a34d2..30b0c96dcaf61300ab9196a2c248dacda0e81f08 100644 --- a/src/SURFEX/diag_inline_seafluxn.F90 +++ b/src/SURFEX/diag_inline_seafluxn.F90 @@ -40,6 +40,7 @@ SUBROUTINE DIAG_INLINE_SEAFLUX_n (DGO, D, DC, DI, DIC, DGMSI, S, & !! 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_n, ONLY : DIAG_t, DIAG_OPTIONS_t @@ -298,7 +299,7 @@ GSIC=(S%LHANDLE_SIC.AND.(S%CSEAICE_SCHEME /= 'NONE ')) IF (LCPL_SEA.OR.GSIC) THEN ! CALL DIAG_CPL_ESM_SEA(S, D, DI, PTSTEP, PSFTQ, PRAIN, PSNOW, & - PLW, PSFTH_ICE, PSFTQ_ICE, PDIR_SW, PSCA_SW, GSIC ) + PLW, PPS, PSFTH_ICE, PSFTQ_ICE, PDIR_SW, PSCA_SW, GSIC ) ! ENDIF IF (LHOOK) CALL DR_HOOK('DIAG_INLINE_SEAFLUX_N',1,ZHOOK_HANDLE) diff --git a/src/SURFEX/diag_seaflux_initn.F90 b/src/SURFEX/diag_seaflux_initn.F90 index 65cadc124bda74b6d7e0864117435700e8a7d758..daa9db0c1ddcb7119a3b38d65e43fbb8a397d5a4 100644 --- a/src/SURFEX/diag_seaflux_initn.F90 +++ b/src/SURFEX/diag_seaflux_initn.F90 @@ -37,6 +37,7 @@ !! 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 @@ -202,7 +203,9 @@ IF(LCPL_SEA.OR.S%LHANDLE_SIC)THEN 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 @@ -210,8 +213,10 @@ IF(LCPL_SEA.OR.S%LHANDLE_SIC)THEN S%XCPL_SEA_HEAT(:) = 0.0 S%XCPL_SEA_EVAP(:) = 0.0 S%XCPL_SEA_RAIN(:) = 0.0 + S%XCPL_SEA_EVPR(:) = 0.0 S%XCPL_SEA_SNOW(:) = 0.0 S%XCPL_SEA_FWSM(:) = 0.0 + S%XCPL_SEA_PRES(:) = 0.0 ! ELSE ALLOCATE(S%XCPL_SEA_WIND(0)) @@ -222,7 +227,9 @@ ELSE 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 (LHOOK) CALL DR_HOOK('DIAG_SEAFLUX_INIT_N',1,ZHOOK_HANDLE) diff --git a/src/SURFEX/get_sfx_sea.F90 b/src/SURFEX/get_sfx_sea.F90 index 7f7b63d875056ef189351d5bdf12864e2b2dfd54..4778ff7315112242d8b0d8dec0d63c944b318b79 100644 --- a/src/SURFEX/get_sfx_sea.F90 +++ b/src/SURFEX/get_sfx_sea.F90 @@ -4,10 +4,10 @@ !SFX_LIC for details. version 1. ! ######### SUBROUTINE GET_SFX_SEA (S, U, W, & - OCPL_SEAICE,OWATER, & + OCPL_SEAICE,OWATER, & PSEA_FWSU,PSEA_FWSV,PSEA_HEAT,PSEA_SNET, & PSEA_WIND,PSEA_FWSM,PSEA_EVAP,PSEA_RAIN, & - PSEA_SNOW,PSEA_WATF, & + PSEA_SNOW,PSEA_EVPR,PSEA_WATF,PSEA_PRES, & PSEAICE_HEAT,PSEAICE_SNET,PSEAICE_EVAP ) ! ############################################################################ ! @@ -37,6 +37,7 @@ !! MODIFICATIONS !! ------------- !! Original 10/2013 +!! Modified 11/2014 : J. Pianezze - Add surface pressure coupling parameter !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -79,7 +80,9 @@ REAL, DIMENSION(:), INTENT(OUT) :: PSEA_FWSM ! Cumulated wind stress 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) @@ -153,7 +156,9 @@ IF(U%NSIZE_SEA>0)THEN 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 @@ -162,7 +167,9 @@ IF(U%NSIZE_SEA>0)THEN 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) diff --git a/src/SURFEX/get_sfxcpln.F90 b/src/SURFEX/get_sfxcpln.F90 index 23747c21a8f9a953ae57607d8bfa168918d61690..32a566ddac320824863c626b40a043db84141752 100644 --- a/src/SURFEX/get_sfxcpln.F90 +++ b/src/SURFEX/get_sfxcpln.F90 @@ -5,8 +5,8 @@ ! ######### SUBROUTINE GET_SFXCPL_n (IM, S, U, W, & HPROGRAM,KI,PRUI,PWIND,PFWSU,PFWSV,PSNET, & - PHEAT,PEVAP,PRAIN,PSNOW,PICEFLUX,PFWSM, & - PHEAT_ICE,PEVAP_ICE,PSNET_ICE) + PHEAT,PEVAP,PRAIN,PSNOW,PEVPR,PICEFLUX, & + PFWSM,PPS,PHEAT_ICE,PEVAP_ICE,PSNET_ICE) ! ################################################################### ! !!**** *GETSFXCPL_n* - routine to get some variables from surfex into @@ -42,6 +42,7 @@ !! ------------- !! Original 08/2009 !! 10/2016 B. Decharme : bug surface/groundwater coupling +!! Modified 11/2014 : J. Pianezze - Add surface pressure coupling parameter !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -95,8 +96,10 @@ 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 @@ -118,7 +121,9 @@ 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) @@ -184,6 +189,7 @@ IF(LCPL_SEA)THEN ZSEA_RAIN (:) = XUNDEF ZSEA_SNOW (:) = XUNDEF ZSEA_WATF (:) = XUNDEF + ZSEA_PRES (:) = XUNDEF ! ZSEAICE_HEAT (:) = XUNDEF ZSEAICE_SNET (:) = XUNDEF @@ -195,7 +201,7 @@ IF(LCPL_SEA)THEN LCPL_SEAICE,LWATER, & ZSEA_FWSU,ZSEA_FWSV,ZSEA_HEAT,ZSEA_SNET, & ZSEA_WIND,ZSEA_FWSM,ZSEA_EVAP,ZSEA_RAIN, & - ZSEA_SNOW,ZSEA_WATF, & + ZSEA_SNOW,ZSEA_EVPR,ZSEA_WATF,ZSEA_PRES, & ZSEAICE_HEAT,ZSEAICE_SNET,ZSEAICE_EVAP ) ! ! * Assign sea output fields diff --git a/src/SURFEX/init_seafluxn.F90 b/src/SURFEX/init_seafluxn.F90 index e951f0d5cbe8fd4563f638731afbd2dc37453b86..e718fd1bb427005982e90dbe0ee87809549620d1 100644 --- a/src/SURFEX/init_seafluxn.F90 +++ b/src/SURFEX/init_seafluxn.F90 @@ -45,6 +45,9 @@ !! 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 @@ -57,7 +60,7 @@ 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_n, ONLY : GRID_CONF_PROJ_t ! -USE MODD_SFX_OASIS, ONLY : LCPL_SEA, LCPL_SEAICE +USE MODD_SFX_OASIS, ONLY : LCPL_WAVE, LCPL_SEA, LCPL_SEAICE ! USE MODD_READ_NAMELIST, ONLY : LNAM_READ USE MODD_CSTS, ONLY : XTTS @@ -185,7 +188,7 @@ IF (LNAM_READ) THEN 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%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, & @@ -344,13 +347,13 @@ ENDWHERE ! (Sea current and Sea-ice temperature) ! ----------------------------------------------------------------- ! -IF(LCPL_SEA.OR.SM%S%LHANDLE_SIC)THEN +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 (:)=XUNDEF - SM%S%XVMER (:)=XUNDEF + SM%S%XUMER (:)=0. + SM%S%XVMER (:)=0. ! ELSE ! @@ -359,6 +362,13 @@ ELSE ! 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)) diff --git a/src/SURFEX/modd_prep_seaflux.F90 b/src/SURFEX/modd_prep_seaflux.F90 index 3f42fc84221b3f283b5646f026bbad98ba11afcf..9b034aea44417479d0b9acab8451416043729f9b 100644 --- a/src/SURFEX/modd_prep_seaflux.F90 +++ b/src/SURFEX/modd_prep_seaflux.F90 @@ -28,6 +28,8 @@ !! ------------- !! 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 ! ------------ @@ -37,10 +39,12 @@ IMPLICIT NONE SAVE !-------------------------------------------------------------------------- ! - CHARACTER(LEN=28) :: CFILE_SEAFLX ! input file name - CHARACTER(LEN=6) :: CTYPE_SEAFLX ! input file type - CHARACTER(LEN=28) :: CFILEPGD_SEAFLX ! input file name - CHARACTER(LEN=6) :: CTYPEPGD ! input file type +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 diff --git a/src/SURFEX/modd_seafluxn.F90 b/src/SURFEX/modd_seafluxn.F90 index 14b77ef10899d55a5a92071b414b49948773a051..360b12c622831e0780e6b0d7dffcdb069cc85c9f 100644 --- a/src/SURFEX/modd_seafluxn.F90 +++ b/src/SURFEX/modd_seafluxn.F90 @@ -29,6 +29,9 @@ !! 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 ! ------------ @@ -84,6 +87,7 @@ TYPE SEAFLUX_t ! 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 ! @@ -91,6 +95,8 @@ TYPE SEAFLUX_t ! 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 @@ -109,6 +115,8 @@ TYPE SEAFLUX_t 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 @@ -117,8 +125,10 @@ TYPE SEAFLUX_t 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 @@ -168,6 +178,8 @@ IF (LHOOK) CALL DR_HOOK("MODD_SEAFLUX_N:SEAFLUX_INIT",0,ZHOOK_HANDLE) 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) @@ -191,8 +203,10 @@ IF (LHOOK) CALL DR_HOOK("MODD_SEAFLUX_N:SEAFLUX_INIT",0,ZHOOK_HANDLE) 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) @@ -221,6 +235,7 @@ YSEAFLUX%LPRECIP=.FALSE. YSEAFLUX%LPWEBB=.FALSE. YSEAFLUX%NZ0=0 YSEAFLUX%NGRVWAVES=0 +YSEAFLUX%LWAVEWIND=.TRUE. YSEAFLUX%XICHCE=0. YSEAFLUX%LPERTFLUX=.FALSE. YSEAFLUX%JSX=0 diff --git a/src/SURFEX/modd_sfx_oasis.F90 b/src/SURFEX/modd_sfx_oasis.F90 index 89807f8ea16933996ae8c6eca610a5e442b7fdd8..3d8bc24bda17e3f2885c2136b9f7bba838c2fa31 100644 --- a/src/SURFEX/modd_sfx_oasis.F90 +++ b/src/SURFEX/modd_sfx_oasis.F90 @@ -26,8 +26,9 @@ MODULE MODD_SFX_OASIS !! MODIFICATIONS !! ------------- !! Original 10/13 +!! Modified 11/2014 : J. Pianezze - add wave coupling and creation of OASIS grids !! S.Senesi 08/2015 : add CMODEL_NAME -!! 10/2016 B. Decharme : bug surface/groundwater coupling +!! 10/2016 B. Decharme : bug surface/groundwater coupling ! !* 0. DECLARATIONS ! ------------ @@ -42,6 +43,8 @@ IMPLICIT NONE ! LOGICAL :: LOASIS = .FALSE. ! To use oasis coupler or not ! +LOGICAL :: LOASIS_GRID = .FALSE. ! To define oasis grids, areas and masks during simulation +! CHARACTER(LEN=6) :: CMODEL_NAME ! component model name (i.e. name under which ! ! Surfex is declared to Oasis) ! @@ -107,7 +110,9 @@ 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 ! @@ -129,4 +134,25 @@ 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/SURFEX/mode_read_netcdf_mercator.F90 b/src/SURFEX/mode_read_netcdf_mercator.F90 index 7af09341899f5c889446965cd557fde8a0e04d5d..ad51a19ab58e80f12d7665714cf91ada168f0a3a 100644 --- a/src/SURFEX/mode_read_netcdf_mercator.F90 +++ b/src/SURFEX/mode_read_netcdf_mercator.F90 @@ -7,6 +7,9 @@ !! MODULE MODE_READ_NETCDF_MERCATOR !!!============================================================================= +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source +!! ! + correction of 2 bugs !------------------------------------------------------------------------------- ! ! @@ -76,7 +79,6 @@ NVARDIMNAM(:)=' ' HACTION='get variable type' status=nf90_inquire_variable(KCDF_ID,IDVAR,XTYPE=KVARTYPE) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'variable type = ',KVARTYPE ! status=nf90_inquire_variable(KCDF_ID,IDVAR,DIMIDS=NDIMID) HACTION='get variable dimensions name' @@ -86,13 +88,11 @@ if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) HACTION='get variable dimensions length' status=nf90_inquire_dimension(KCDF_ID,NDIMID(NDIMS),LEN=NVARDIMLEN(NDIMS)) if (status/=NF90_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=nf90_inquire_variable(KCDF_ID,IDVAR,NATTS=NGATTS) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'number of attributes = ',NGATTS allocate(hname(1:NGATTS)) ! ALLOCATE(ZVALU1D(1:NVARDIMLEN(NDIMS))) @@ -157,7 +157,6 @@ NVARDIMNAM(:)=' ' HACTION='get variable type' status=nf90_inquire_variable(KCDF_ID,IDVAR,XTYPE=KVARTYPE) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'variable type = ',KVARTYPE ! HACTION='get variable dimensions identifiant' status=nf90_inquire_variable(KCDF_ID,IDVAR,DIMIDS=NVARDIMID) @@ -166,7 +165,6 @@ if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) HACTION='get attributs' status=nf90_inquire_variable(KCDF_ID,IDVAR,NATTS=NGATTS) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'number of attributes = ',NGATTS allocate(hname(1:NGATTS)) ! ZSCFA=1. @@ -174,35 +172,26 @@ ZOFFS=0. DO JLOOP=1,NGATTS status=nf90_inq_attname(KCDF_ID,IDVAR,JLOOP,hname(JLOOP)) if (status/=NF90_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=nf90_get_att(KCDF_ID,IDVAR,"missing_value",PMISSVALUE) if (status/=NF90_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=nf90_get_att(KCDF_ID,IDVAR,"_FillValue",PMISSVALUE) if (status/=NF90_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=nf90_get_att(KCDF_ID,IDVAR,"scale_factor",ZSCFA) if (status/=NF90_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=nf90_get_att(KCDF_ID,IDVAR,"add_offset",ZOFFS) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) - !write(0,*) 'missing value = ',PMISSVALUE endif ENDDO ! @@ -214,8 +203,6 @@ DO JLOOP2=1,NDIMS HACTION='get variable dimensions length' status=nf90_inquire_dimension(KCDF_ID,NVARDIMID(JLOOP2),LEN=NVARDIMLEN(JLOOP2)) if (status/=NF90_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 @@ -298,17 +285,14 @@ NVARDIMNAM(:)=' ' HACTION='get variable type' status=nf90_inquire_variable(KCDF_ID,IDVAR,XTYPE=KVARTYPE) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'variable type = ',KVARTYPE ! HACTION='get variable dimensions identifiant' status=nf90_inquire_variable(KCDF_ID,IDVAR,DIMIDS=NVARDIMID) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'variable dimension identifiant ',NVARDIMID ! HACTION='get attributs' status=nf90_inquire_variable(KCDF_ID,IDVAR,NATTS=NGATTS) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'number of attributes = ',NGATTS allocate(hname(1:NGATTS)) ! ZSCFA=1. @@ -316,35 +300,26 @@ ZOFFS=0. DO JLOOP=1,NGATTS status=nf90_inq_attname(KCDF_ID,IDVAR,JLOOP,hname(JLOOP)) if (status/=NF90_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=nf90_get_att(KCDF_ID,IDVAR,"missing_value",PMISSVALUE) if (status/=NF90_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=nf90_get_att(KCDF_ID,IDVAR,"_FillValue",PMISSVALUE) if (status/=NF90_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=nf90_get_att(KCDF_ID,IDVAR,"scale_factor",ZSCFA) if (status/=NF90_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=nf90_get_att(KCDF_ID,IDVAR,"add_offset",ZOFFS) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) - !write(0,*) 'missing value = ',PMISSVALUE endif ENDDO ! @@ -356,8 +331,6 @@ DO JLOOP2=1,NDIMS HACTION='get variable dimensions length' status=nf90_inquire_dimension(KCDF_ID,NVARDIMID(JLOOP2),LEN=NVARDIMLEN(JLOOP2)) if (status/=NF90_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 @@ -431,11 +404,8 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_DIM_CDF',0,ZHOOK_HANDLE) HACTION='open netcdf' status=NF90_OPEN(HFILENAME,nf90_nowrite,kcdf_id) -!write(0,*) 'identifiant de ',HFILENAME,'=',kcdf_id if (status/=NF90_NOERR) then CALL HANDLE_ERR_MER(status,HACTION) -!else -! write(0,*) 'netcdf file opened: ',HFILENAME endif ! !----------- @@ -445,7 +415,6 @@ endif HACTION='get number of variables' status=NF90_INQUIRE(kcdf_id,NVARIABLES=NBVARS) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'nb vars', NBVARS ALLOCATE(YVARNAME(NBVARS)) ! !----------- @@ -458,16 +427,12 @@ DO JLOOP1=1,NBVARS HACTION='get variables names' status=NF90_INQUIRE_VARIABLE(kcdf_id,JLOOP1,NAME=YVARNAME(JLOOP1)) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) - !write(0,*) 'var',JLOOP1,' name: ',YVARNAME(JLOOP1) if (YVARNAME(JLOOP1)==HNCVARNAME) then - !write(0,*) 'var',JLOOP1,' corresponding to variable required' ID_VARTOGET1=JLOOP1 endif if (YVARNAME(JLOOP1)/=HNCVARNAME) then if((LGT(TRIM(YVARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.& (SCAN(TRIM(YVARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then - !write(0,*) 'var',JLOOP1,YVARNAME(JLOOP1),' could correspond to variable required ?' - !write(0,*) HNCVARNAME,' is variable required; only ',YVARNAME(JLOOP1),' found' ID_VARTOGET2=JLOOP1 endif endif @@ -494,7 +459,6 @@ endif HACTION='get variable dimensions number' status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,NDIMS=NVARDIMS) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'variable dimensions number = ',NVARDIMS ! ! 4.2 get the variable dimensions length ! ---------------------------------- @@ -523,7 +487,6 @@ END SELECT HACTION='close netcdf' status=nf90_close(kcdf_id) if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION) -!write(0,*) 'OK: netcdf file closed: ',HFILENAME ! !----------- !* 11. Deallocate @@ -541,7 +504,7 @@ END SUBROUTINE READ_DIM_CDF USE MODD_SURFEX_MPI, ONLY : WLOG_MPI, NRANK, NPIO, NPROC, NCOMM USE MODD_HORIBL, ONLY : LGLOBLON, LGLOBS, LGLOBN, XILO1H, XILO2H, NINLOH, & XLA, XOLA, XOLO, NP, XLOPH, NO -USE MODD_PREP, ONLY : XLAT_OUT, XLON_OUT, LINTERP +USE MODD_PREP, ONLY : XLAT_OUT, XLON_OUT, LINTERP, XX_OUT, XY_OUT ! USE MODD_GRID_LATLONREGUL USE MODD_SURF_PAR @@ -1509,4 +1472,57 @@ IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_ZS_SEA',1,ZHOOK_H 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/SURFEX/modn_prep_seaflux.F90 b/src/SURFEX/modn_prep_seaflux.F90 index 362549929926f65aed33e98fcb6a242a5d1e5333..7aaec327cf6b86f2c02c9b8e1fd4a1a166c4e7a0 100644 --- a/src/SURFEX/modn_prep_seaflux.F90 +++ b/src/SURFEX/modn_prep_seaflux.F90 @@ -31,13 +31,15 @@ !! 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 + XSST_UNIF, XSSS_UNIF, XSIC_UNIF, CFILEWAVE_SEAFLX, CTYPEWAVE ! IMPLICIT NONE ! @@ -60,6 +62,7 @@ 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, & diff --git a/src/SURFEX/modn_seafluxn.F90 b/src/SURFEX/modn_seafluxn.F90 index 43fa0d24616fd63247b0b4ddd2d26bbd84f4307b..cd647ff24fa6e8ebbe9ff8ef328c063e21d43049 100644 --- a/src/SURFEX/modn_seafluxn.F90 +++ b/src/SURFEX/modn_seafluxn.F90 @@ -31,6 +31,8 @@ !! 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 @@ -61,6 +63,7 @@ LOGICAL :: LPWG LOGICAL :: LPRECIP LOGICAL :: LPWEBB LOGICAL :: LDIAG_OCEAN +LOGICAL :: LWAVEWIND LOGICAL :: LDIAG_MISC_SEAICE INTEGER :: NZ0 INTEGER :: NGRVWAVES @@ -83,7 +86,7 @@ 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 + 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 @@ -118,6 +121,7 @@ SUBROUTINE INIT_NAM_SEAFLUXn (O, S) 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 @@ -150,6 +154,7 @@ SUBROUTINE UPDATE_NAM_SEAFLUXn (O, S) 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 diff --git a/src/SURFEX/modn_sfx_oasis.F90 b/src/SURFEX/modn_sfx_oasis.F90 index 017fd42f26c424c78a93ccf3e7ea43d3a58e452a..5572ee6ceb36cff8da4fa04e31285e88fd91cc8c 100644 --- a/src/SURFEX/modn_sfx_oasis.F90 +++ b/src/SURFEX/modn_sfx_oasis.F90 @@ -27,6 +27,8 @@ MODULE MODN_SFX_OASIS !! ------------- !! Original 10/13 !! 10/2016 B. Decharme : bug surface/groundwater coupling +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!! and surface pressure parameter for ocean coupling ! !* 0. DECLARATIONS ! ------------ @@ -37,6 +39,7 @@ 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 ! !------------------------------------------------------------------------------- ! @@ -90,7 +93,9 @@ 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 ! @@ -110,6 +115,25 @@ 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. @@ -135,11 +159,18 @@ NAMELIST/NAM_SFX_LAKE_CPL/XTSTEP_CPL_LAKE, & ! 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_WATF, & - CSEAICE_HEAT,CSEAICE_SNET,CSEAICE_EVAP, & - CSEA_SST,CSEA_UCU,CSEA_VCU, & + 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/SURFEX/prep_hor_seaflux_field.F90 b/src/SURFEX/prep_hor_seaflux_field.F90 index 65922f9fa1ee26b0b1408933e85fd90103decf30..9864abbd4b251c4a27c051b4807e95466b75818e 100644 --- a/src/SURFEX/prep_hor_seaflux_field.F90 +++ b/src/SURFEX/prep_hor_seaflux_field.F90 @@ -30,6 +30,8 @@ SUBROUTINE PREP_HOR_SEAFLUX_FIELD (DTCO, UG, U, GCP, DTS, O, OR, KLAT, S, & !! P. Le Moigne 09/2007, sst from clim !! S. Senesi 09/2013, extends to fields of SSS and SIC !! P. Marguinaud10/2014, Support for a 2-part PREP +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source !!------------------------------------------------------------------ ! USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t @@ -44,7 +46,8 @@ USE MODD_SEAFLUX_n, ONLY : SEAFLUX_t ! USE MODD_TYPE_DATE_SURF, ONLY : DATE_TIME USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, NCOMM, NPROC -USE MODD_PREP, ONLY : CINGRID_TYPE, CINTERP_TYPE, XZS_LS, CMASK +USE MODD_PREP, ONLY : CINGRID_TYPE, CINTERP_TYPE, XZS_LS, XLAT_OUT, XLON_OUT, & + XX_OUT, XY_OUT, CMASK ! USE MODD_GRID_GRIB, ONLY : CINMODEL ! @@ -205,6 +208,12 @@ IF (YDCTL%LPART5) THEN 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 ! ENDIF diff --git a/src/SURFEX/prep_seaflux.F90 b/src/SURFEX/prep_seaflux.F90 index 76a05e2476832cbfc5c214ce50343a11a72fe934..b136269e817f93727f825c7b254f755780055438 100644 --- a/src/SURFEX/prep_seaflux.F90 +++ b/src/SURFEX/prep_seaflux.F90 @@ -31,6 +31,8 @@ SUBROUTINE PREP_SEAFLUX (DTCO, UG, U, GCP, SG, SB, S, DTS, O, OR, & !! Modified 01/2014, S. Senesi : introduce sea-ice model !! Modified 01/2015, R. Séférian : introduce ocean surface albedo !! P. Marguinaud10/2014, Support for a 2-part PREP +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source !!------------------------------------------------------------------ ! USE MODD_SFX_GRID_n, ONLY : GRID_t @@ -151,6 +153,16 @@ IF (CSEAICE_SCHEME /= 'NONE ') THEN CALL PREP_SEAICE(UG, DTCO, DTS, O, OR, SIZE(SG%XLAT), S, U, GCP, & HPROGRAM,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,YDCTL) ENDIF +! +! +!* 2.2 Significant height and peak period +! + CALL PREP_HOR_SEAFLUX_FIELD(DTCO, UG, U, GCP, DTS, O, OR, SIZE(SG%XLAT), S, & + HPROGRAM,'HS ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,YDCTL) +! + CALL PREP_HOR_SEAFLUX_FIELD(DTCO, UG, U, GCP, DTS, O, OR, SIZE(SG%XLAT), S, & + HPROGRAM,'TP ',HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,YDCTL) +! ! CALL CLEAN_PREP_OUTPUT_GRID diff --git a/src/SURFEX/prep_seaflux_netcdf.F90 b/src/SURFEX/prep_seaflux_netcdf.F90 index 78c8a5f1b357eb45fb0fde3fb9973e08a5bb21ce..3fdd63de806130a474dbdd6e46c3e8a3bbb4f6a8 100644 --- a/src/SURFEX/prep_seaflux_netcdf.F90 +++ b/src/SURFEX/prep_seaflux_netcdf.F90 @@ -25,7 +25,9 @@ SUBROUTINE PREP_SEAFLUX_NETCDF(HPROGRAM,HSURF,HFILE,KLUOUT,PFIELD) !! MODIFICATIONS !! ------------- !! Original 01/2008 -!! Modified 09/2013 : S. Senesi : extends to SSS and SIC fields +!! 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 @@ -111,6 +113,26 @@ SELECT CASE(HSURF) DEALLOCATE(ZFIELD) ENDIF ! +! +!* 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 (NPROC>1) THEN diff --git a/src/SURFEX/prep_seaflux_unif.F90 b/src/SURFEX/prep_seaflux_unif.F90 index 220cc03e2564bbf251219dccbf00adb4cd3835bc..7af8afcc85c3657e2f0979ed1ee0c9b925115e0b 100644 --- a/src/SURFEX/prep_seaflux_unif.F90 +++ b/src/SURFEX/prep_seaflux_unif.F90 @@ -26,6 +26,8 @@ SUBROUTINE PREP_SEAFLUX_UNIF(KLUOUT,HSURF,PFIELD) !! ------------- !! 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 !!------------------------------------------------------------------ ! @@ -79,6 +81,15 @@ SELECT CASE(HSURF) 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 diff --git a/src/SURFEX/put_sfx_sea.F90 b/src/SURFEX/put_sfx_sea.F90 index d08c045811f619cc0f93ac657ebcc198173dfbe6..36d61886a43c716e769258054f2f94cdbbce90e3 100644 --- a/src/SURFEX/put_sfx_sea.F90 +++ b/src/SURFEX/put_sfx_sea.F90 @@ -43,7 +43,8 @@ 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 MODD_SFX_OASIS +USE MODD_SURF_PAR, ONLY : XUNDEF, NUNDEF USE MODD_CSTS, ONLY : XTT, XTTS, XICEC ! ! @@ -132,31 +133,37 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE ! IF (LHOOK) CALL DR_HOOK('PUT_SFX_SEA:TREAT_SEA',0,ZHOOK_HANDLE) ! -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') +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 ! -YCOMMENT='Sea u-current stress' -CALL PACK_SAME_RANK(U%NR_SEA(:),PSEA_UCU(:),S%XUMER(:)) -CALL CHECK_SEA(YCOMMENT,S%XUMER(:)) +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 ! -YCOMMENT='Sea v-current stress' -CALL PACK_SAME_RANK(U%NR_SEA(:),PSEA_VCU(:),S%XVMER(:)) -CALL CHECK_SEA(YCOMMENT,S%XVMER(:)) +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 ! diff --git a/src/SURFEX/put_sfxcpln.F90 b/src/SURFEX/put_sfxcpln.F90 index 3f24c258a1f265d76ee63e099544b313f1a219c4..99066282d4ac41d11fe03c71e90ec7747611f926 100644 --- a/src/SURFEX/put_sfxcpln.F90 +++ b/src/SURFEX/put_sfxcpln.F90 @@ -9,7 +9,9 @@ SUBROUTINE PUT_SFXCPL_n (F, IM, S, U, W, & PLAND_PIFLOOD,PSEA_SST,PSEA_UCU, & PSEA_VCU,PSEAICE_SIT,PSEAICE_CVR, & PSEAICE_ALB,PTSRAD, & - PDIR_ALB,PSCA_ALB,PEMIS,PTSURF ) + 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 @@ -40,6 +42,7 @@ SUBROUTINE PUT_SFXCPL_n (F, IM, S, U, W, & !! MODIFICATIONS !! ------------- !! Original 08/2009 +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -56,13 +59,14 @@ 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_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 @@ -100,6 +104,12 @@ 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 @@ -149,6 +159,17 @@ IF(LCPL_SEA)THEN 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 !------------------------------------------------------------------------------- ! diff --git a/src/SURFEX/read_lcover.F90 b/src/SURFEX/read_lcover.F90 index 575b0ba0bbd2b53fec731b3ecf37bf815910b371..0d60f0e6191727e652f2534e92e4a24d9c8c9b40 100644 --- a/src/SURFEX/read_lcover.F90 +++ b/src/SURFEX/read_lcover.F90 @@ -37,13 +37,15 @@ !! ------------- !! Original 10/2008 !! M. Moge 02/2015 parallelization for mésonh +!! 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 ! @@ -103,6 +105,8 @@ OCOVER(:SIZE(GCOVER))=GCOVER(:) ! #ifdef MNH_PARALLEL #ifndef NOMPI +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 diff --git a/src/SURFEX/read_nam_prep_seafluxn.F90 b/src/SURFEX/read_nam_prep_seafluxn.F90 index 8d6a54218f96e51d90752e72fad63b042f684f44..0f294e65ae5e02d0d067b233e59126acaf51d4d4 100644 --- a/src/SURFEX/read_nam_prep_seafluxn.F90 +++ b/src/SURFEX/read_nam_prep_seafluxn.F90 @@ -6,6 +6,8 @@ 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 @@ -53,6 +55,8 @@ CALL TEST_NAM_VAR_SURF(ILUOUT,'CTYPE_SEAFLX', CTYPE_SEAFLX, ' ','GRIB '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) !------------------------------------ diff --git a/src/SURFEX/read_namelists_seafluxn.F90 b/src/SURFEX/read_namelists_seafluxn.F90 index 0a6bb1e652fc99ac8ac27eed852ab07a8c8f0b47..0630335e0ac98cc26586c5fc0fcd30b57c5c5435 100644 --- a/src/SURFEX/read_namelists_seafluxn.F90 +++ b/src/SURFEX/read_namelists_seafluxn.F90 @@ -7,6 +7,8 @@ SUBROUTINE READ_NAMELISTS_SEAFLUX_n (SM, & HPROGRAM,HINIT) ! ####################################################### ! +!! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters +!! ! from external source !--------------------------------------------------------------------------- ! ! @@ -44,7 +46,7 @@ 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) + 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 ) diff --git a/src/SURFEX/read_prep_seaflux_conf.F90 b/src/SURFEX/read_prep_seaflux_conf.F90 index 83e5bc1fe124f049a1f13d4980b212bd7282a211..d0d819072847eb84bb5e25dbfe9123652640b6ea 100644 --- a/src/SURFEX/read_prep_seaflux_conf.F90 +++ b/src/SURFEX/read_prep_seaflux_conf.F90 @@ -38,6 +38,8 @@ !! 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 @@ -52,7 +54,7 @@ USE MODI_READ_PREP_SURF_ATM_CONF USE MODI_PREP_OCEAN_MERCATORVERGRID ! USE MODD_PREP_SEAFLUX, ONLY : CFILE_SEAFLX, CTYPE_SEAFLX, CFILEPGD_SEAFLX, CTYPEPGD, & - XSST_UNIF, XSSS_UNIF, XSIC_UNIF + CFILEWAVE_SEAFLX, CTYPEWAVE, XSST_UNIF, XSSS_UNIF, XSIC_UNIF ! USE MODD_SURF_PAR, ONLY : XUNDEF ! @@ -111,9 +113,16 @@ OUNIF = .FALSE. !* Select seaflux files if they are defined ! ----------------------------------------- ! -IF (LEN_TRIM(HFILE)==0 .AND. LEN_TRIM(CFILE_SEAFLX)>0 .AND. LEN_TRIM(CTYPE_SEAFLX)>0) THEN - HFILE = CFILE_SEAFLX - HFILETYPE = CTYPE_SEAFLX +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 @@ -161,6 +170,19 @@ IF (HVAR=='DATE ' .OR. HVAR=='ZS ') THEN 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 diff --git a/src/SURFEX/read_seafluxn.F90 b/src/SURFEX/read_seafluxn.F90 index 64ed006a2f44eb7ec9052eaae6668bf8aeb93b17..bf2ea39c6ee8cde0bdc1455dc27807b4bf0576b1 100644 --- a/src/SURFEX/read_seafluxn.F90 +++ b/src/SURFEX/read_seafluxn.F90 @@ -35,7 +35,9 @@ !! 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 +!! 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 @@ -214,6 +216,21 @@ ELSE ! 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) ! !------------------------------------------------------------------------------- diff --git a/src/SURFEX/sfx_oasis_define.F90 b/src/SURFEX/sfx_oasis_define.F90 index 54a71c19f593534ff16c2832332bc449d7d9b470..d7de437d282ce119a311e37d98f4fd63bd3bb952 100644 --- a/src/SURFEX/sfx_oasis_define.F90 +++ b/src/SURFEX/sfx_oasis_define.F90 @@ -33,6 +33,8 @@ SUBROUTINE SFX_OASIS_DEFINE (IO, U, HPROGRAM,KNPTS,KPARAL) !! ------------- !! Original 10/2013 !! 10/2016 B. Decharme : bug surface/groundwater coupling +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!! and surface pressure for ocean coupling !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -198,6 +200,13 @@ IF(LCPL_SEA)THEN 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) @@ -205,17 +214,36 @@ IF(LCPL_SEA)THEN 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 ! - 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') + 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 ! - 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') + 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 ! - 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') + 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 ! @@ -361,6 +389,68 @@ 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 +! +!------------------------------------------------------------------------------- +! !* 6. End of declaration phase: ! -------------- ! diff --git a/src/SURFEX/sfx_oasis_init.F90 b/src/SURFEX/sfx_oasis_init.F90 index 022a8c4d9987ebe406e75734d7e241b3af973bd1..2a0e3486056e1db803b8ace56e2b5cfbb2be0bb1 100644 --- a/src/SURFEX/sfx_oasis_init.F90 +++ b/src/SURFEX/sfx_oasis_init.F90 @@ -48,13 +48,14 @@ SUBROUTINE SFX_OASIS_INIT(HNAMELIST,KLOCAL_COMM,HINIT) !! Original 10/2013 !! S.Sénési 08/2015 - handle XIOS !! B.Decharme 09/2016 - no CALL ABORT if no namelist in Arpege +!! Modified 11/2014 : J. Pianezze - add LOASIS_GRID flag !! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_SFX_OASIS, ONLY : LOASIS, CMODEL_NAME, XRUNTIME +USE MODD_SFX_OASIS, ONLY : LOASIS, LOASIS_GRID, CMODEL_NAME, XRUNTIME USE MODI_ABOR1_SFX ! USE MODD_XIOS , ONLY : LXIOS ! Should we call XIOS_INITIALIZE instead of OASIS_GET_LOCAL_COMM @@ -95,7 +96,7 @@ LOGICAL :: GFOUND !* 0.3 Declarations of namelist variables ! ---------------------------------- ! -NAMELIST/NAM_OASIS/LOASIS,CMODEL_NAME +NAMELIST/NAM_OASIS/LOASIS,LOASIS_GRID,CMODEL_NAME ! !------------------------------------------------------------------------------- ! @@ -105,6 +106,7 @@ NAMELIST/NAM_OASIS/LOASIS,CMODEL_NAME ! --------------- ! LOASIS = .FALSE. +LOASIS_GRID = .FALSE. CMODEL_NAME = 'surfex' XRUNTIME = 0.0 ! diff --git a/src/SURFEX/sfx_oasis_read_nam.F90 b/src/SURFEX/sfx_oasis_read_nam.F90 index 41346a2378f6dcc7f3904b3d1372591e4fc6d85d..c1b5b596df7dba6138354948c8b3ac1e16a82ec8 100644 --- a/src/SURFEX/sfx_oasis_read_nam.F90 +++ b/src/SURFEX/sfx_oasis_read_nam.F90 @@ -33,6 +33,8 @@ SUBROUTINE SFX_OASIS_READ_NAM(HPROGRAM,PTSTEP_SURF,HINIT) !! ------------- !! Original 05/2008 !! 10/2016 B. Decharme : bug surface/groundwater coupling +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!! and surface pressure for ocean coupling !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -43,7 +45,7 @@ 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_SEA, LCPL_SEAICE, LCPL_WAVE ! USE MODE_POS_SURF ! @@ -73,6 +75,7 @@ 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 ! ------------------------------- @@ -101,6 +104,7 @@ 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) @@ -153,13 +157,26 @@ ELSE 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)THEN +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 ! @@ -354,10 +371,18 @@ IF(LCPL_SEA)THEN 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 ! @@ -415,6 +440,57 @@ IF(LCPL_SEA)THEN ! 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) ! !------------------------------------------------------------------------------- @@ -455,7 +531,9 @@ IF(LEN_TRIM(HFIELD)==0)THEN CASE(YSEA) YNAMELIST='NAM_SFX_SEA_CPL' CASE(YLAKE) - YNAMELIST='NAM_SFX_LAKE_CPL' + 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 @@ -469,7 +547,7 @@ IF(LEN_TRIM(HFIELD)==0)THEN ! For oceanic coupling do not stop the model if a field from surfex to ocean is ! not done because many particular case can be used ! - IF(KID==0.AND.HTYP/=YLAND)THEN + IF((KID==0.OR.KID==1).AND.HTYP/=YLAND)THEN LSTOP=.FALSE. ELSE LSTOP=.TRUE. diff --git a/src/SURFEX/sfx_oasis_recv.F90 b/src/SURFEX/sfx_oasis_recv.F90 index 124cb30850b055279085f5ea2343da275ebce010..8aa18215e9c2c9215bcdc6835e5392087c62bf91 100644 --- a/src/SURFEX/sfx_oasis_recv.F90 +++ b/src/SURFEX/sfx_oasis_recv.F90 @@ -4,11 +4,13 @@ !SFX_LIC for details. version 1. !######### SUBROUTINE SFX_OASIS_RECV(HPROGRAM,KI,KSW,PTIMEC, & - ORECV_LAND, ORECV_SEA, & + ORECV_LAND, ORECV_SEA, ORECV_WAVE, & PLAND_WTD,PLAND_FWTD, & - PLAND_FFLOOD, PLAND_PIFLOOD, & + PLAND_FFLOOD,PLAND_PIFLOOD, & PSEA_SST,PSEA_UCU,PSEA_VCU, & - PSEAICE_SIT,PSEAICE_CVR,PSEAICE_ALB ) + PSEAICE_SIT,PSEAICE_CVR,PSEAICE_ALB, & + PWAVE_CHA,PWAVE_UCU,PWAVE_VCU, & + PWAVE_HS,PWAVE_TP ) !######################################## ! !!**** *SFX_OASIS_RECV* - Receive coupling fields from oasis @@ -37,12 +39,14 @@ SUBROUTINE SFX_OASIS_RECV(HPROGRAM,KI,KSW,PTIMEC, & !! MODIFICATIONS !! ------------- !! Original 10/2013 +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_SURF_PAR, ONLY : XUNDEF, NUNDEF ! USE MODD_SFX_OASIS ! @@ -67,6 +71,7 @@ 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 (-) @@ -81,6 +86,11 @@ 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 ! ------------------------------- @@ -179,20 +189,26 @@ IF(ORECV_SEA)THEN ! ! * Receive ocean input fields ! - YCOMMENT='Sea surface temperature' - CALL OASIS_GET(NSEA_SST_ID,IDATE,ZREAD(:,:),IERR) - CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) - PSEA_SST(:)=ZREAD(:,1) + 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 ! - YCOMMENT='Sea u-current stress' - CALL OASIS_GET(NSEA_UCU_ID,IDATE,ZREAD(:,:),IERR) - CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) - PSEA_UCU(:)=ZREAD(:,1) + 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 ! - YCOMMENT='Sea v-current stress' - CALL OASIS_GET(NSEA_VCU_ID,IDATE,ZREAD(:,:),IERR) - CALL CHECK_RECV(ILUOUT,IERR,YCOMMENT) - PSEA_VCU(:)=ZREAD(:,1) + 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 ! @@ -216,6 +232,62 @@ IF(ORECV_SEA)THEN 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) ! !------------------------------------------------------------------------------- diff --git a/src/SURFEX/sfx_oasis_send.F90 b/src/SURFEX/sfx_oasis_send.F90 index c1982c5d8710156055801198121d4eb0ae19556b..6d20b477c2be3f3a1710c43b12bb6a02930ee04e 100644 --- a/src/SURFEX/sfx_oasis_send.F90 +++ b/src/SURFEX/sfx_oasis_send.F90 @@ -3,13 +3,14 @@ !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, & +SUBROUTINE SFX_OASIS_SEND(KLUOUT,KI,KDATE,OSEND_LAND,OSEND_LAKE,OSEND_SEA,OSEND_WAVE, & PLAND_RUNOFF,PLAND_DRAIN,PLAND_CALVING, & 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_WATF, & - PSEAICE_HEAT,PSEAICE_SNET,PSEAICE_EVAP ) + 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 @@ -42,13 +43,15 @@ SUBROUTINE SFX_OASIS_SEND(KLUOUT,KI,KDATE,OSEND_LAND,OSEND_LAKE,OSEND_SEA, !! MODIFICATIONS !! ------------- !! Original 10/2013 -!! 10/2016 B. Decharme : bug surface/groundwater coupling +!! Modified 11/2014 : J. Pianezze - add wave coupling parameters +!! and surface pressure for ocean coupling +!! 10/2016 B. Decharme : bug surface/groundwater coupling !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODN_SFX_OASIS, ONLY : XTSTEP_CPL_SEA, XTSTEP_CPL_LAKE, & +USE MODN_SFX_OASIS, ONLY : XTSTEP_CPL_SEA, XTSTEP_CPL_WAVE, XTSTEP_CPL_LAKE, & XTSTEP_CPL_LAND ! USE MODD_SURF_PAR, ONLY : XUNDEF, NUNDEF @@ -75,6 +78,7 @@ 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) @@ -95,12 +99,17 @@ REAL, DIMENSION(KI), INTENT(IN) :: PSEA_FWSM ! Cumulated wind stress 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 ! ------------------------------- ! @@ -267,6 +276,13 @@ IF(OSEND_SEA)THEN 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)' @@ -274,6 +290,13 @@ IF(OSEND_SEA)THEN 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) ! @@ -304,6 +327,30 @@ IF(OSEND_SEA)THEN ! 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) ! !------------------------------------------------------------------------------- diff --git a/src/SURFEX/write_lcover.F90 b/src/SURFEX/write_lcover.F90 index 19168745136360459a008d278df571e7184d046a..32a1be568e9eb8aac8db7094671173300b7423fa 100644 --- a/src/SURFEX/write_lcover.F90 +++ b/src/SURFEX/write_lcover.F90 @@ -35,12 +35,17 @@ !! !! 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 MODI_WRITE_SURF @@ -77,14 +82,12 @@ INTEGER :: IINFO ! !* ascendant compatibility IF (LHOOK) CALL DR_HOOK('WRITE_LCOVER',0,ZHOOK_HANDLE) -! #ifdef MNH_PARALLEL #ifndef NOMPI -CALL MPI_ALLREDUCE(OCOVER, GCOVER, SIZE(OCOVER),MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, IINFO) +CALL MPI_ALLREDUCE(OCOVER, GCOVER, SIZE(OCOVER),MPI_LOGICAL, MPI_LOR, NMNH_COMM_WORLD, IINFO) OCOVER(:)=GCOVER(:) #endif #endif -! YRECFM='COVER_LIST' YCOMMENT='(LOGICAL LIST)' CALL WRITE_SURF(HSELECT,HPROGRAM,YRECFM,OCOVER(:),IRESP,HCOMMENT=YCOMMENT,HDIR='-') diff --git a/src/SURFEX/writesurf_seafluxn.F90 b/src/SURFEX/writesurf_seafluxn.F90 index ea47e0a8d7d25bd3776974b2a3ff47fc7a0fd389..69bb0a844d4362d66800fafdd4cbce380cf3f649 100644 --- a/src/SURFEX/writesurf_seafluxn.F90 +++ b/src/SURFEX/writesurf_seafluxn.F90 @@ -36,6 +36,9 @@ !! S. Belamari 03/2014 Include sea surface salinity XSSS !! R. Séférian 01/2015 : introduce interactive ocean surface albedo !! S. Senesi 08/2015 : fix units in some HCOMMENTs +!! 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 @@ -48,9 +51,11 @@ 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 MODI_WRITESURF_SEAICE_n ! USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB @@ -130,7 +135,45 @@ YCOMMENT='SST (K)' YRECFM='Z0SEA' YCOMMENT='Z0SEA (m)' CALL WRITE_SURF(HSELECT, HPROGRAM,YRECFM,S%XZ0(:),IRESP,HCOMMENT=YCOMMENT) -! + ! +!* significant height +! +YRECFM='HS' +YCOMMENT='HS (m)' + CALL WRITE_SURF(HSELECT,HPROGRAM,YRECFM,S%XHS(:),IRESP,HCOMMENT=YCOMMENT) +! +!* peak period +! +YRECFM='TP' +YCOMMENT='TP (s)' + CALL WRITE_SURF(HSELECT,HPROGRAM,YRECFM,S%XTP(:),IRESP,HCOMMENT=YCOMMENT) +! +! +IF (LCPL_WAVE) THEN + ! + !* Charnock coefficient + ! + YRECFM='CHARN' + YCOMMENT='CHARN (-)' + CALL WRITE_SURF(HSELECT,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(HSELECT,HPROGRAM,YRECFM,S%XUMER(:),IRESP,HCOMMENT=YCOMMENT) + ! + !* v-current velocity + ! + YRECFM='VMER' + YCOMMENT='VMER (m/s)' + CALL WRITE_SURF(HSELECT,HPROGRAM,YRECFM,S%XVMER(:),IRESP,HCOMMENT=YCOMMENT) + ! +ENDIF ! !* sea surface salinity !