SURFEX v8.1
General documentation of Surfex
diag_cpl_esm_sea.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE diag_cpl_esm_sea (S, D, DI, PTSTEP, PSFTQ, PRAIN, PSNOW, &
7  PLW, PSFTH_ICE, PSFTQ_ICE, PDIR_SW, PSCA_SW, OSIC)
8 ! ###################################################################
9 !
10 !!**** *DIAG_CPL_ESM_SEA * - Computes diagnostics over sea for
11 !! Earth system model coupling or embedded seaice scheme
12 !!
13 !! PURPOSE
14 !! -------
15 !
16 !!** METHOD
17 !! ------
18 !!
19 !! REFERENCE
20 !! ---------
21 !!
22 !!
23 !! AUTHOR
24 !! ------
25 !! B. Decharme
26 !!
27 !! MODIFICATIONS
28 !! -------------
29 !! Original 08/2009
30 !! S.Senesi 01/2014 Adapt to embedded seaice scheme (SWU and LWU
31 !! for seaice are provided as inputs)
32 !! A.Voldoire 04/2015 Add LCPL_SEAICE test
33 !!------------------------------------------------------------------
34 !
35 USE modd_diag_n, ONLY : diag_t
36 USE modd_seaflux_n, ONLY : seaflux_t
37 !
38 USE modd_csts, ONLY : xstefan, xlstt
39 USE modd_water_par, ONLY : xemiswatice
40 !
41 USE modd_sfx_oasis, ONLY : lcpl_seaice
42 !
43 USE yomhook ,ONLY : lhook, dr_hook
44 USE parkind1 ,ONLY : jprb
45 !
46 IMPLICIT NONE
47 !
48 !* 0.1 declarations of arguments
49 !
50 !
51 TYPE(seaflux_t), INTENT(INOUT) :: S
52 TYPE(diag_t), INTENT(INOUT) :: D
53 TYPE(diag_t), INTENT(INOUT) :: DI
54 !
55 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step
56 REAL, DIMENSION(:), INTENT(IN) :: PSFTQ ! water flux
57 REAL, DIMENSION(:), INTENT(IN) :: PRAIN ! Rainfall
58 REAL, DIMENSION(:), INTENT(IN) :: PSNOW ! Snowfall
59 REAL, DIMENSION(:), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.)
60 REAL, DIMENSION(:), INTENT(IN) :: PSFTH_ICE ! heat flux (W/m2)
61 REAL, DIMENSION(:), INTENT(IN) :: PSFTQ_ICE ! water flux (kg/m2/s)
62 REAL, DIMENSION(:,:),INTENT(IN):: PDIR_SW ! direct solar radiation (on horizontal surf.)
63 REAL, DIMENSION(:,:),INTENT(IN):: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
64 LOGICAL, INTENT(IN) :: OSIC
65 !
66 !* 0.2 declarations of local variables
67 !
68 REAL, DIMENSION(SIZE(S%XICE_ALB)) :: ZSWU, ZTICE4
69 !
70 INTEGER :: ISWB ! number of SW bands
71 INTEGER :: JSWB ! loop counter on number of SW bands
72 INTEGER :: INI ! number of points
73 INTEGER :: JI ! loop counter on number of points
74 !
75 REAL(KIND=JPRB) :: ZHOOK_HANDLE
76 !
77 IF (lhook) CALL dr_hook('DIAG_CPL_ESM_SEA',0,zhook_handle)
78 !
79 !-------------------------------------------------------------------------------------
80 ! Total or free-ice sea flux
81 !-------------------------------------------------------------------------------------
82 !
83 !* 10m wind speed (m)
84 !
85 s%XCPL_SEA_WIND(:) = s%XCPL_SEA_WIND(:) + ptstep * sqrt(d%XZON10M(:)**2+d%XMER10M(:)**2)
86 !
87 !* wind stress (Pa.s)
88 !
89 s%XCPL_SEA_FWSU(:) = s%XCPL_SEA_FWSU(:) + ptstep * d%XFMU(:)
90 s%XCPL_SEA_FWSV(:) = s%XCPL_SEA_FWSV(:) + ptstep * d%XFMV(:)
91 s%XCPL_SEA_FWSM(:) = s%XCPL_SEA_FWSM(:) + ptstep * sqrt(d%XFMU(:)**2+d%XFMV(:)**2)
92 !
93 !* Solar net heat flux (J/m2)
94 !
95 s%XCPL_SEA_SNET(:) = s%XCPL_SEA_SNET(:) + ptstep * (d%XSWD(:) - d%XSWU(:))
96 !
97 !* Non solar heat flux (J/m2)
98 !
99 s%XCPL_SEA_HEAT(:) = s%XCPL_SEA_HEAT(:) + ptstep * (d%XGFLUX(:) + d%XSWU(:) - d%XSWD(:))
100 !
101 !* Evaporation (kg/m2)
102 !
103 s%XCPL_SEA_EVAP(:) = s%XCPL_SEA_EVAP(:) + ptstep * psftq(:)
104 !
105 !* Precip (kg/m2)
106 !
107 s%XCPL_SEA_RAIN(:) = s%XCPL_SEA_RAIN(:) + ptstep * prain(:)
108 s%XCPL_SEA_SNOW(:) = s%XCPL_SEA_SNOW(:) + ptstep * psnow(:)
109 !
110 !-------------------------------------------------------------------------------------
111 ! Ice flux
112 !-------------------------------------------------------------------------------------
113 IF (lcpl_seaice.OR.osic) THEN
114 !
115  ini = SIZE(pdir_sw,1)
116  iswb = SIZE(pdir_sw,2)
117 !
118 !* Solar net heat flux (J/m2)
119 !
120  IF (osic) THEN
121  zswu(:)=di%XSWU(:)
122  ELSE
123  zswu(:)=0.0
124  DO jswb=1,iswb
125  DO ji=1,ini
126  zswu(ji) = zswu(ji) + (pdir_sw(ji,jswb)+psca_sw(ji,jswb)) * s%XICE_ALB(ji)
127  ENDDO
128  ENDDO
129  ENDIF
130 !
131  s%XCPL_SEAICE_SNET(:) = s%XCPL_SEAICE_SNET(:) + ptstep * (d%XSWD(:) - zswu(:))
132 !
133 !* Non solar heat flux (J/m2)
134 !
135  IF (osic) THEN
136  s%XCPL_SEAICE_HEAT(:) = s%XCPL_SEAICE_HEAT(:) + ptstep * &
137  ( plw(:) - di%XLWU(:) - psfth_ice(:) - xlstt*psftq_ice(:) )
138  ELSE
139  ztice4(:)=s%XTICE(:)**4
140  s%XCPL_SEAICE_HEAT(:) = s%XCPL_SEAICE_HEAT(:) + ptstep * ( xemiswatice*(plw(:)-xstefan*ztice4(:)) &
141  - psfth_ice(:) - xlstt*psftq_ice(:) )
142  ENDIF
143 !
144 !* Sublimation (kg/m2)
145 !
146  s%XCPL_SEAICE_EVAP(:) = s%XCPL_SEAICE_EVAP(:) + ptstep * psftq_ice(:)
147 !
148 ENDIF
149 !
150 IF (lhook) CALL dr_hook('DIAG_CPL_ESM_SEA',1,zhook_handle)
151 !
152 !-------------------------------------------------------------------------------------
153 !
154 END SUBROUTINE diag_cpl_esm_sea
subroutine diag_cpl_esm_sea(S, D, DI, PTSTEP, PSFTQ, PRAIN, PSNOW, PLW, PSFTH_ICE, PSFTQ_ICE, PDIR_SW, PSCA_SW, OSIC)
real, save xstefan
Definition: modd_csts.F90:59
real, save xemiswatice
real, save xlstt
Definition: modd_csts.F90:71
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15