SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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, &
7  ptstep,pzon10m,pmer10m,psfu,psfv, &
8  pswd,pswu,pgflux,psftq,prain,psnow, &
9  plw,ptice,psfth_ice,psftq_ice, &
10  pdir_sw,psca_sw,pswu_ice,plwu_ice, &
11  osic )
12 ! ###################################################################
13 !
14 !!**** *DIAG_CPL_ESM_SEA * - Computes diagnostics over sea for
15 !! Earth system model coupling or embedded seaice scheme
16 !!
17 !! PURPOSE
18 !! -------
19 !
20 !!** METHOD
21 !! ------
22 !!
23 !! REFERENCE
24 !! ---------
25 !!
26 !!
27 !! AUTHOR
28 !! ------
29 !! B. Decharme
30 !!
31 !! MODIFICATIONS
32 !! -------------
33 !! Original 08/2009
34 !! S.Senesi 01/2014 Adapt to embedded seaice scheme (SWU and LWU
35 !! for seaice are provided as inputs)
36 !! A.Voldoire 04/2015 Add LCPL_SEAICE test
37 !!------------------------------------------------------------------
38 !
39 !
40 USE modd_seaflux_n, ONLY : seaflux_t
41 !
42 USE modd_csts, ONLY : xstefan, xlstt
43 USE modd_water_par, ONLY : xemiswatice
44 !
45 USE modd_sfx_oasis, ONLY : lcpl_seaice
46 !
47 USE yomhook ,ONLY : lhook, dr_hook
48 USE parkind1 ,ONLY : jprb
49 !
50 IMPLICIT NONE
51 !
52 !* 0.1 declarations of arguments
53 !
54 !
55 TYPE(seaflux_t), INTENT(INOUT) :: s
56 !
57 REAL, INTENT(IN) :: ptstep ! atmospheric time-step
58 REAL, DIMENSION(:), INTENT(IN) :: pzon10m ! zonal wind
59 REAL, DIMENSION(:), INTENT(IN) :: pmer10m ! meridian wind
60 REAL, DIMENSION(:), INTENT(IN) :: psfu ! zonal wind stress
61 REAL, DIMENSION(:), INTENT(IN) :: psfv ! meridian wind stress
62 REAL, DIMENSION(:), INTENT(IN) :: pswd ! total incoming short wave radiation
63 REAL, DIMENSION(:), INTENT(IN) :: pswu ! total upward short wave radiation
64 REAL, DIMENSION(:), INTENT(IN) :: pgflux ! storage flux
65 REAL, DIMENSION(:), INTENT(IN) :: psftq ! water flux
66 REAL, DIMENSION(:), INTENT(IN) :: prain ! Rainfall
67 REAL, DIMENSION(:), INTENT(IN) :: psnow ! Snowfall
68 REAL, DIMENSION(:), INTENT(IN) :: plw ! longwave radiation (on horizontal surf.)
69 REAL, DIMENSION(:), INTENT(IN) :: psfth_ice ! heat flux (W/m2)
70 REAL, DIMENSION(:), INTENT(IN) :: psftq_ice ! water flux (kg/m2/s)
71 REAL, DIMENSION(:), INTENT(IN) :: ptice ! Ice Surface Temperature
72 REAL, DIMENSION(:,:),INTENT(IN):: pdir_sw ! direct solar radiation (on horizontal surf.)
73 REAL, DIMENSION(:,:),INTENT(IN):: psca_sw ! diffuse solar radiation (on horizontal surf.)
74 REAL, DIMENSION(:), INTENT(IN) :: pswu_ice ! upward short wave radiation on seaice
75 REAL, DIMENSION(:), INTENT(IN) :: plwu_ice ! upward long wave radiation on seaice
76 LOGICAL, INTENT(IN) :: osic
77 !
78 !* 0.2 declarations of local variables
79 !
80 REAL, DIMENSION(SIZE(S%XICE_ALB)) :: zswu, ztice4
81 !
82 INTEGER :: iswb ! number of SW bands
83 INTEGER :: jswb ! loop counter on number of SW bands
84 INTEGER :: ini ! number of points
85 INTEGER :: ji ! loop counter on number of points
86 !
87 REAL(KIND=JPRB) :: zhook_handle
88 !
89 IF (lhook) CALL dr_hook('DIAG_CPL_ESM_SEA',0,zhook_handle)
90 !
91 !-------------------------------------------------------------------------------------
92 ! Total or free-ice sea flux
93 !-------------------------------------------------------------------------------------
94 !
95 !* 10m wind speed (m)
96 !
97 s%XCPL_SEA_WIND(:) = s%XCPL_SEA_WIND(:) + ptstep * sqrt(pzon10m(:)**2+pmer10m(:)**2)
98 !
99 !* wind stress (Pa.s)
100 !
101 s%XCPL_SEA_FWSU(:) = s%XCPL_SEA_FWSU(:) + ptstep * psfu(:)
102 s%XCPL_SEA_FWSV(:) = s%XCPL_SEA_FWSV(:) + ptstep * psfv(:)
103 s%XCPL_SEA_FWSM(:) = s%XCPL_SEA_FWSM(:) + ptstep * sqrt(psfu(:)**2+psfv(:)**2)
104 !
105 !* Solar net heat flux (J/m2)
106 !
107 s%XCPL_SEA_SNET(:) = s%XCPL_SEA_SNET(:) + ptstep * (pswd(:) - pswu(:))
108 !
109 !* Non solar heat flux (J/m2)
110 !
111 s%XCPL_SEA_HEAT(:) = s%XCPL_SEA_HEAT(:) + ptstep * (pgflux(:) + pswu(:) - pswd(:))
112 !
113 !* Evaporation (kg/m2)
114 !
115 s%XCPL_SEA_EVAP(:) = s%XCPL_SEA_EVAP(:) + ptstep * psftq(:)
116 !
117 !* Precip (kg/m2)
118 !
119 s%XCPL_SEA_RAIN(:) = s%XCPL_SEA_RAIN(:) + ptstep * prain(:)
120 s%XCPL_SEA_SNOW(:) = s%XCPL_SEA_SNOW(:) + ptstep * psnow(:)
121 !
122 !-------------------------------------------------------------------------------------
123 ! Ice flux
124 !-------------------------------------------------------------------------------------
125 IF (lcpl_seaice.OR.osic) THEN
126 !
127  ini = SIZE(pdir_sw,1)
128  iswb = SIZE(pdir_sw,2)
129 !
130 !* Solar net heat flux (J/m2)
131 !
132  IF (osic) THEN
133  zswu(:)=pswu_ice(:)
134  ELSE
135  zswu(:)=0.0
136  DO jswb=1,iswb
137  DO ji=1,ini
138  zswu(ji) = zswu(ji) + (pdir_sw(ji,jswb)+psca_sw(ji,jswb)) * s%XICE_ALB(ji)
139  ENDDO
140  ENDDO
141  ENDIF
142 !
143  s%XCPL_SEAICE_SNET(:) = s%XCPL_SEAICE_SNET(:) + ptstep * (pswd(:) - zswu(:))
144 !
145 !* Non solar heat flux (J/m2)
146 !
147  IF (osic) THEN
148  s%XCPL_SEAICE_HEAT(:) = s%XCPL_SEAICE_HEAT(:) + ptstep * &
149  ( plw(:) - plwu_ice(:) - psfth_ice(:) - xlstt*psftq_ice(:) )
150  ELSE
151  ztice4(:)=ptice(:)**4
152  s%XCPL_SEAICE_HEAT(:) = s%XCPL_SEAICE_HEAT(:) + ptstep * ( xemiswatice*(plw(:)-xstefan*ztice4(:)) &
153  - psfth_ice(:) - xlstt*psftq_ice(:) )
154  ENDIF
155 !
156 !* Sublimation (kg/m2)
157 !
158  s%XCPL_SEAICE_EVAP(:) = s%XCPL_SEAICE_EVAP(:) + ptstep * psftq_ice(:)
159 !
160 ENDIF
161 !
162 IF (lhook) CALL dr_hook('DIAG_CPL_ESM_SEA',1,zhook_handle)
163 !
164 !-------------------------------------------------------------------------------------
165 !
166 END SUBROUTINE diag_cpl_esm_sea
subroutine diag_cpl_esm_sea(S, PTSTEP, PZON10M, PMER10M, PSFU, PSFV, PSWD, PSWU, PGFLUX, PSFTQ, PRAIN, PSNOW, PLW, PTICE, PSFTH_ICE, PSFTQ_ICE, PDIR_SW, PSCA_SW, PSWU_ICE, PLWU_ICE, OSIC)