SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
diag_inline_oceann.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_inline_ocean_n (DGO, O, S)
7 ! ###############################################################################
8 !
9 !!**** *DIAG_INLINE_SEAFLUX_n * - computes diagnostics during SEAFLUX time-step
10 !!
11 !! PURPOSE
12 !! -------
13 !
14 !!** METHOD
15 !! ------
16 !!
17 !! REFERENCE
18 !! ---------
19 !!
20 !!
21 !! AUTHOR
22 !! ------
23 !! V. Masson
24 !!
25 !! MODIFICATIONS
26 !! -------------
27 !! Original 02/2008
28 !! Modified 07/2012, P. Le Moigne : CMO1D phasing
29 !!------------------------------------------------------------------
30 !
31 !
33 USE modd_ocean_n, ONLY : ocean_t
34 USE modd_seaflux_n, ONLY : seaflux_t
35 !
37 !
39 !
40 USE modd_surf_par, ONLY : xundef
41 !
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 !* 0.2 declarations of local variables
52 !
53 !
54 TYPE(diag_ocean_t), INTENT(INOUT) :: dgo
55 TYPE(ocean_t), INTENT(INOUT) :: o
56 TYPE(seaflux_t), INTENT(INOUT) :: s
57 !
58 REAL, DIMENSION(SIZE(O%XSEAT(:,1)),NOCKMIN:NOCKMAX) :: zseadens
59 REAL, DIMENSION(SIZE(O%XSEAT(:,1))) :: zrho0,zrhocmo,zdrhox,ztcmo
60 REAL, DIMENSION(SIZE(O%XSEAT(:,1))) :: ztmoy,zsmoy,zumoy,zvmoy,zdmoy
61 INTEGER, DIMENSION(SIZE(O%XSEAT(:,1))) :: ihmolevel
62 INTEGER :: inbpts, ik1, ik2
63 INTEGER :: j,jpt
64 REAL(KIND=JPRB) :: zhook_handle
65 !
66 !-------------------------------------------------------------------------------------
67 !
68 IF (lhook) CALL dr_hook('DIAG_INLINE_OCEAN_N',0,zhook_handle)
69 IF (dgo%LDIAG_OCEAN) THEN
70 !
71  ik1=nockmin+1
72  ik2=nockmin+2
73 !
74  inbpts=SIZE(o%XSEAT(:,1))
75 !
76  zseadens(:,:)=xrhoswref + &
77  (o%XSEAT(:,:)-13.5)*(-0.19494-0.49038e-2*(o%XSEAT(:,:)-13.5))&
78  +0.77475*(o%XSEAS(:,:)-32.6)
79 !
80  DO jpt=1,inbpts
81 !
82 ! 3. Oceanic mixed layer depth calculation
83 !
84 ! -------------------------------------
85  o%XSEAHMO(jpt)=-xzhoc(nockmin+2)
86  ztcmo(jpt)=o%XSEAT(jpt,ik1)-0.5
87  zrhocmo(jpt)=xrhoswref+drhocompute(ztcmo(jpt),o%XSEAS(jpt,ik1))
88  DO j=ik2,nockmax-1
89  zrho0(jpt)=xrhoswref+drhocompute(o%XSEAT(jpt,j),o%XSEAS(jpt,j))
90  zdrhox(jpt)=zrho0(jpt)-zrhocmo(jpt)
91  IF ((zdrhox(jpt)<0.).AND.(o%XSEABATH(jpt,j)/=0.)) THEN
92  o%XSEAHMO(jpt)=o%XSEAHMO(jpt)+xdz1(j)
93  ELSE
94  EXIT
95  ENDIF
96  ENDDO
97  o%XSEAHMO(jpt)=min(o%XSEAHMO(jpt),-s%XSEABATHY(jpt))
98 !
99  ihmolevel(jpt)=nockmax
100 !
101  DO j=ik1,nockmax
102  IF (-xzhoc(j)>o%XSEAHMO(jpt)) THEN
103  ihmolevel(jpt)=j-1
104  EXIT
105  ENDIF
106  ENDDO
107 !
108 ! 4. Thermal and haline contents verification
109 ! ----------------------------------------
110  IF (ihmolevel(jpt)<=1) THEN
111  dgo%XTOCMOY(jpt)=o%XSEAT(jpt,ik1)
112  dgo%XSOCMOY(jpt)=o%XSEAS(jpt,ik1)
113  dgo%XUOCMOY(jpt)=o%XSEAU(jpt,ik1)
114  dgo%XVOCMOY(jpt)=o%XSEAV(jpt,ik1)
115  dgo%XDOCMOY(jpt)=zseadens(jpt,ik1)
116  ELSE !IHMOLEVEL>=2
117  ztmoy(jpt)=o%XSEAT(jpt,ik1)
118  zsmoy(jpt)=o%XSEAS(jpt,ik1)
119  zumoy(jpt)=o%XSEAU(jpt,ik1)
120  zvmoy(jpt)=o%XSEAV(jpt,ik1)
121  zdmoy(jpt)=zseadens(jpt,ik1)
122  DO j=ik2,ihmolevel(jpt)
123  ztmoy(jpt)=ztmoy(jpt)+o%XSEAT(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
124  zsmoy(jpt)=zsmoy(jpt)+o%XSEAS(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
125  zumoy(jpt)=zumoy(jpt)+o%XSEAU(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
126  zvmoy(jpt)=zvmoy(jpt)+o%XSEAV(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
127  zdmoy(jpt)=zdmoy(jpt)+zseadens(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
128  ENDDO
129  dgo%XTOCMOY(jpt)=ztmoy(jpt)/(-xzhoc(ihmolevel(jpt)))
130  dgo%XSOCMOY(jpt)=zsmoy(jpt)/(-xzhoc(ihmolevel(jpt)))
131  dgo%XUOCMOY(jpt)=zumoy(jpt)/(-xzhoc(ihmolevel(jpt)))
132  dgo%XVOCMOY(jpt)=zvmoy(jpt)/(-xzhoc(ihmolevel(jpt)))
133  dgo%XDOCMOY(jpt)=zdmoy(jpt)/(-xzhoc(ihmolevel(jpt)))
134  ENDIF
135 !
136  ENDDO
137 !
138 ENDIF
139 !-------------------------------------------------------------------------------------
140 !
141 IF (lhook) CALL dr_hook('DIAG_INLINE_OCEAN_N',1,zhook_handle)
142  CONTAINS
143 !
144 !
145 !! #########################################
146  FUNCTION drhocompute(T,S) RESULT(R)
147 ! ##########################################
148 !
149 !!**** *DRHOCOMPUTE*
150 !!
151 !! PURPOSE
152 !! -------
153 !!
154 !!** METHOD
155 !! ------
156 !
157 !! EXTERNAL
158 !! --------
159 !!
160 !! IMPLICIT ARGUMENTS
161 !! ------------------
162 !!
163 !! REFERENCE
164 !! ---------
165 !!
166 !!
167 !! AUTHOR
168 !! ------
169 !! C. Lebeaupin *Meteo-France*
170 !!
171 !! MODIFICATIONS
172 !! -------------
173 !! Original 27/02/2005
174 !!
175 !-------------------------------------------------------------------------------
176 !* 0. DECLARATIONS
177 ! ------------
178 !* 0.1 declaration of arguments and results
179 !
180 REAL :: t,s ! oceanic temperature and salinity
181 REAL :: r ! density
182 !
183 !* 0.2 local variables
184 !
185 REAL :: det,des
186 REAL(KIND=JPRB) :: zhook_handle
187 !-------------------------------------------------------------------------------
188 !* 1. COMPUTE R
189 ! ---------
190 !
191 IF (lhook) CALL dr_hook('DRHOCOMPUTE',0,zhook_handle)
192 det = t-13.5
193 des = s-32.6
194 r = det*(-0.19494-0.49038e-2*det)+0.77475*des
195 IF (lhook) CALL dr_hook('DRHOCOMPUTE',1,zhook_handle)
196 !
197 END FUNCTION drhocompute
198 !
199 END SUBROUTINE diag_inline_ocean_n
subroutine diag_inline_ocean_n(DGO, O, S)
real function drhocompute(T, S)