SURFEX v8.1
General documentation of Surfex
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, PSEABATHY)
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 !
36 !
38 !
39 USE modd_surf_par, ONLY : xundef
40 !
41 !
42 USE yomhook ,ONLY : lhook, dr_hook
43 USE parkind1 ,ONLY : jprb
44 !
45 IMPLICIT NONE
46 !
47 !* 0.1 declarations of arguments
48 !
49 !
50 !* 0.2 declarations of local variables
51 !
52 !
53 TYPE(diag_ocean_t), INTENT(INOUT) :: DGO
54 TYPE(ocean_t), INTENT(INOUT) :: O
55 REAL, DIMENSION(:), INTENT(IN) :: PSEABATHY
56 !
57 REAL, DIMENSION(SIZE(O%XSEAT(:,1)),NOCKMIN:NOCKMAX) :: ZSEADENS
58 REAL, DIMENSION(SIZE(O%XSEAT(:,1))) :: ZRHO0,ZRHOCMO,ZDRHOX,ZTCMO
59 REAL, DIMENSION(SIZE(O%XSEAT(:,1))) :: ZTMOY,ZSMOY,ZUMOY,ZVMOY,ZDMOY
60 INTEGER, DIMENSION(SIZE(O%XSEAT(:,1))) :: IHMOLEVEL
61 INTEGER :: INBPTS, IK1, IK2
62 INTEGER :: J,JPT
63 REAL(KIND=JPRB) :: ZHOOK_HANDLE
64 !
65 !-------------------------------------------------------------------------------------
66 !
67 IF (lhook) CALL dr_hook('DIAG_INLINE_OCEAN_N',0,zhook_handle)
68 IF (dgo%LDIAG_OCEAN) THEN
69 !
70  ik1=nockmin+1
71  ik2=nockmin+2
72 !
73  inbpts=SIZE(o%XSEAT(:,1))
74 !
75  zseadens(:,:)=xrhoswref + &
76  (o%XSEAT(:,:)-13.5)*(-0.19494-0.49038e-2*(o%XSEAT(:,:)-13.5))&
77  +0.77475*(o%XSEAS(:,:)-32.6)
78 !
79  DO jpt=1,inbpts
80 !
81 ! 3. Oceanic mixed layer depth calculation
82 !
83 ! -------------------------------------
84  o%XSEAHMO(jpt)=-xzhoc(nockmin+2)
85  ztcmo(jpt)=o%XSEAT(jpt,ik1)-0.5
86  zrhocmo(jpt)=xrhoswref+drhocompute(ztcmo(jpt),o%XSEAS(jpt,ik1))
87  DO j=ik2,nockmax-1
88  zrho0(jpt)=xrhoswref+drhocompute(o%XSEAT(jpt,j),o%XSEAS(jpt,j))
89  zdrhox(jpt)=zrho0(jpt)-zrhocmo(jpt)
90  IF ((zdrhox(jpt)<0.).AND.(o%XSEABATH(jpt,j)/=0.)) THEN
91  o%XSEAHMO(jpt)=o%XSEAHMO(jpt)+xdz1(j)
92  ELSE
93  EXIT
94  ENDIF
95  ENDDO
96  o%XSEAHMO(jpt)=min(o%XSEAHMO(jpt),-pseabathy(jpt))
97 !
98  ihmolevel(jpt)=nockmax
99 !
100  DO j=ik1,nockmax
101  IF (-xzhoc(j)>o%XSEAHMO(jpt)) THEN
102  ihmolevel(jpt)=j-1
103  EXIT
104  ENDIF
105  ENDDO
106 !
107 ! 4. Thermal and haline contents verification
108 ! ----------------------------------------
109  IF (ihmolevel(jpt)<=1) THEN
110  dgo%XTOCMOY(jpt)=o%XSEAT(jpt,ik1)
111  dgo%XSOCMOY(jpt)=o%XSEAS(jpt,ik1)
112  dgo%XUOCMOY(jpt)=o%XSEAU(jpt,ik1)
113  dgo%XVOCMOY(jpt)=o%XSEAV(jpt,ik1)
114  dgo%XDOCMOY(jpt)=zseadens(jpt,ik1)
115  ELSE !IHMOLEVEL>=2
116  ztmoy(jpt)=o%XSEAT(jpt,ik1)
117  zsmoy(jpt)=o%XSEAS(jpt,ik1)
118  zumoy(jpt)=o%XSEAU(jpt,ik1)
119  zvmoy(jpt)=o%XSEAV(jpt,ik1)
120  zdmoy(jpt)=zseadens(jpt,ik1)
121  DO j=ik2,ihmolevel(jpt)
122  ztmoy(jpt)=ztmoy(jpt)+o%XSEAT(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
123  zsmoy(jpt)=zsmoy(jpt)+o%XSEAS(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
124  zumoy(jpt)=zumoy(jpt)+o%XSEAU(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
125  zvmoy(jpt)=zvmoy(jpt)+o%XSEAV(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
126  zdmoy(jpt)=zdmoy(jpt)+zseadens(jpt,j)*(-xzhoc(j)+xzhoc(j-1))
127  ENDDO
128  dgo%XTOCMOY(jpt)=ztmoy(jpt)/(-xzhoc(ihmolevel(jpt)))
129  dgo%XSOCMOY(jpt)=zsmoy(jpt)/(-xzhoc(ihmolevel(jpt)))
130  dgo%XUOCMOY(jpt)=zumoy(jpt)/(-xzhoc(ihmolevel(jpt)))
131  dgo%XVOCMOY(jpt)=zvmoy(jpt)/(-xzhoc(ihmolevel(jpt)))
132  dgo%XDOCMOY(jpt)=zdmoy(jpt)/(-xzhoc(ihmolevel(jpt)))
133  ENDIF
134 !
135  ENDDO
136 !
137 ENDIF
138 !-------------------------------------------------------------------------------------
139 !
140 IF (lhook) CALL dr_hook('DIAG_INLINE_OCEAN_N',1,zhook_handle)
141 CONTAINS
142 !
143 !
144 !! #########################################
145  FUNCTION drhocompute(T,S) RESULT(R)
146 ! ##########################################
147 !
148 !!**** *DRHOCOMPUTE*
149 !!
150 !! PURPOSE
151 !! -------
152 !!
153 !!** METHOD
154 !! ------
155 !
156 !! EXTERNAL
157 !! --------
158 !!
159 !! IMPLICIT ARGUMENTS
160 !! ------------------
161 !!
162 !! REFERENCE
163 !! ---------
164 !!
165 !!
166 !! AUTHOR
167 !! ------
168 !! C. Lebeaupin *Meteo-France*
169 !!
170 !! MODIFICATIONS
171 !! -------------
172 !! Original 27/02/2005
173 !!
174 !-------------------------------------------------------------------------------
175 !* 0. DECLARATIONS
176 ! ------------
177 !* 0.1 declaration of arguments and results
178 !
179 REAL :: T,S ! oceanic temperature and salinity
180 REAL :: R ! density
181 !
182 !* 0.2 local variables
183 !
184 REAL :: DET,DES
185 REAL(KIND=JPRB) :: ZHOOK_HANDLE
186 !-------------------------------------------------------------------------------
187 !* 1. COMPUTE R
188 ! ---------
189 !
190 IF (lhook) CALL dr_hook('DRHOCOMPUTE',0,zhook_handle)
191 det = t-13.5
192 des = s-32.6
193 r = det*(-0.19494-0.49038e-2*det)+0.77475*des
194 IF (lhook) CALL dr_hook('DRHOCOMPUTE',1,zhook_handle)
195 !
196 END FUNCTION drhocompute
197 !
198 END SUBROUTINE diag_inline_ocean_n
real, dimension(:), pointer xzhoc
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine diag_inline_ocean_n(DGO, O, PSEABATHY)
logical lhook
Definition: yomhook.F90:15
integer, save nockmax
real, dimension(:), pointer xdz1
integer, save nockmin
real, save xrhoswref
real function drhocompute(T, S)