source: trunk/LMDZ.VENUS/libf/phyvenus/interface_surf.F90 @ 3877

Last change on this file since 3877 was 3877, checked in by emillour, 4 months ago

Venus PCM:
Code tidying: get rid of dimsoil.h. Parameter nsoilmx is now
stored in soil.F as a module variable.
EM

File size: 10.8 KB
Line 
1!
2! $Header: /home/cvsroot/LMDZ4/libf/phylmd/interface_surf.F90,v 1.6 2005/02/24 09:58:18 fairhead Exp $
3!
4
5  MODULE interface_surf
6
7! Ce module regroupe toutes les routines gerant l'interface entre le modele
8! atmospherique et les modeles de surface (sols continentaux, oceans, glaces)
9! Les routines sont les suivantes:
10!
11!   interfsurf_*: routines d'aiguillage vers les interfaces avec les
12!                 differents modeles de surface
13!
14! L. Fairhead, LMD, 02/2000
15
16  USE ioipsl
17
18  IMPLICIT none
19
20  PRIVATE
21  PUBLIC :: interfsurf,interfsurf_hq
22
23  INTERFACE interfsurf
24    module procedure interfsurf_hq
25  END INTERFACE
26
27#include "YOMCST.h"
28
29  CONTAINS
30!
31!############################################################################
32!
33! ADAPTATION GCM POUR CP(T)
34  SUBROUTINE interfsurf_hq(itime, dtime, rmu0, &
35      & klon, iim, jjm, knon, &
36      & rlon, rlat, cufi, cvfi, &
37      & debut, lafin, soil_model, nsoilmx, tsoil, &
38      & zlev,  u1_lay, v1_lay, temp_air, epot_air, &
39      & tq_cdrag, petAcoef, petBcoef, &
40      & sollw, sollwdown, swnet, swdown, &
41      & fder, taux, tauy, &
42      & albedo, &
43      & tsurf, pkh1, p1lay, radsol, &
44      & fluxsens, dflux_s, &             
45      & tsol_rad, tsurf_new, alb_new)
46
47      use write_field_phy
48      use cpdet_phy_mod, only: cpdet
49      use soil_mod, only: soil
50
51      IMPLICIT none
52
53! Cette routine sert d'aiguillage entre l'atmosphere et la surface en general
54! (sols continentaux, oceans, glaces) pour les fluxs de chaleur et d'humidite.
55! En pratique l'interface se fait entre la couche limite du modele
56! atmospherique (clmain.F) et les routines de surface (sechiba, oasis, ...)
57!
58!
59! L.Fairhead 02/2000
60!
61! input:
62!   itime        numero du pas de temps
63!   klon         nombre total de points de grille
64!   iim, jjm     nbres de pts de grille
65!   dtime        pas de temps de la physique (en s)
66!   rmu0         cosinus de l'angle solaire zenithal
67!   knon         nombre de points de la surface a traiter
68!   rlon         longitudes
69!   rlat         latitudes
70!   cufi,cvfi    resolution des mailles en x et y (m)
71!   debut        logical: 1er appel a la physique
72!   lafin        logical: dernier appel a la physique
73!   zlev         hauteur de la premiere couche
74!   u1_lay       vitesse u 1ere couche
75!   v1_lay       vitesse v 1ere couche
76!   temp_air     temperature de l'air 1ere couche
77!   epot_air     temp potentielle de l'air
78!   tq_cdrag     cdrag
79!   petAcoef     coeff. A de la resolution de la CL pour t
80!   petBcoef     coeff. B de la resolution de la CL pour t
81!   sollw        flux IR net a la surface
82!   sollwdown    flux IR descendant a la surface
83!   swnet        flux solaire net
84!   swdown       flux solaire entrant a la surface
85!   albedo       albedo de la surface
86!   tsurf        temperature de surface
87!   pkh1         fct Exner à la surface: RCPD*(paprs(1)/preff)**RKAPPA
88!   p1lay        pression 1er niveau (milieu de couche)
89!   radsol       rayonnement net aus sol (LW + SW)
90!   fder         derivee des flux (pour le couplage)
91!   taux, tauy   tension de vents
92!
93! output:
94!   fluxsens     flux de chaleur sensible
95!   tsol_rad     
96!   tsurf_new    temperature au sol
97!   alb_new      albedo
98
99#include "iniprint.h"
100
101
102! Parametres d'entree
103  integer, intent(IN) :: itime
104  integer, intent(IN) :: iim, jjm
105  integer, intent(IN) :: klon
106  real, intent(IN) :: dtime
107  real, intent(IN)    :: rmu0(klon)
108  integer, intent(IN) :: knon
109  logical, intent(IN) :: debut, lafin
110  real, dimension(klon), intent(IN) :: rlon, rlat
111  real, dimension(klon), intent(IN) :: cufi, cvfi
112  real, dimension(klon), intent(INOUT) :: tq_cdrag
113  real, dimension(klon), intent(IN) :: zlev
114  real, dimension(klon), intent(IN) :: u1_lay, v1_lay
115  real, dimension(klon), intent(IN) :: temp_air
116  real, dimension(klon), intent(IN) :: epot_air
117  real, dimension(klon), intent(IN) :: petAcoef
118  real, dimension(klon), intent(IN) :: petBcoef
119  real, dimension(klon), intent(IN) :: sollw, sollwdown, swnet, swdown
120  real, dimension(klon), intent(IN) :: albedo
121  real, dimension(klon), intent(IN) :: tsurf, pkh1, p1lay
122  REAL, DIMENSION(klon), INTENT(INOUT) :: radsol,fder
123  real, dimension(klon), intent(IN) :: taux, tauy
124!! PB ajout pour soil
125  logical          :: soil_model
126  integer          :: nsoilmx
127  REAL, DIMENSION(klon, nsoilmx) :: tsoil
128  REAL, dimension(klon)          :: soilcap
129  REAL, dimension(klon)          :: soilflux
130! Parametres de sortie
131  real, dimension(klon), intent(OUT):: fluxsens
132  real, dimension(klon), intent(OUT):: tsol_rad, tsurf_new, alb_new
133  real, dimension(klon), intent(OUT):: dflux_s
134
135! Local
136  character (len = 20),save :: modname = 'interfsurf_hq'
137  character (len = 80) :: abort_message
138  integer, save        :: error
139  integer              :: ii, index
140  logical,save              :: check = .false.
141  real, dimension(klon):: cal, beta, capsol
142  real, dimension(klon):: tsurf_temp, zcp
143  INTEGER,dimension(1) :: iloc
144  INTEGER                 :: isize
145  real, dimension(klon):: fder_prev
146
147  if (check) write(*,*) 'Entree ', modname
148
149! Initialisations diverses
150!
151  cal = 999999. ; beta = 999999. ; capsol = 999999.
152  alb_new = albedo
153  tsurf_new = 999999.
154
155! ADAPTATION GCM POUR CP(T)
156       do ii=1,klon
157         zcp(ii)=cpdet(tsurf(ii))
158       enddo
159
160       IF (soil_model) THEN
161           CALL soil(dtime, knon, tsurf, tsoil,soilcap, soilflux)
162           cal(1:knon) = zcp(1:knon) / soilcap(1:knon)
163! for tests:
164!  call writefield_phy('interfsurf_hq_zcp',zcp,1)
165!  call writefield_phy('interfsurf_hq_cal',cal,1)
166!  call writefield_phy('interfsurf_hq_soilcap',soilcap,1)
167!       print*,"DIAGNOSTIC SOIL"
168!       print*,"soilcap=",soilcap
169!       print*,"soilflux=",soilflux
170!       print*,"radsol=",radsol(knon/2)
171           radsol(1:knon) = radsol(1:knon)  + soilflux(1:knon)
172       ELSE
173!           abort_message = "PAS DE MODELE DE SOL: CALCUL SOILCAP!!"
174!           call abort_gcm(modname,abort_message,1)
175! VENUS: Valeur pour inertie = 200:
176           soilcap = 14735.
177           print*,"PAS DE MODELE DE SOL, soilcap=",soilcap
178           cal(1:knon) = zcp(1:knon) / soilcap(1:knon)
179       ENDIF
180! ADAPTATION GCM POUR CP(T)
181       CALL calcul_fluxs( klon, knon, dtime, &
182     &   tsurf, zcp, pkh1, p1lay, cal, beta, tq_cdrag, &
183     &   radsol, temp_air, u1_lay, v1_lay, &
184     &   petAcoef, petBcoef, &
185     &   tsurf_new, fluxsens, dflux_s )
186
187  END SUBROUTINE interfsurf_hq
188
189!
190!#########################################################################
191!
192  SUBROUTINE calcul_fluxs( klon, knon, dtime, &
193! ADAPTATION GCM POUR CP(T)
194     & tsurf, zcp, pkh1, p1lay, cal, beta, coef1lay, &
195     & radsol, t1lay, u1lay, v1lay, &
196     & petAcoef, petBcoef, &
197     & tsurf_new, fluxsens, dflux_s)
198
199  use write_field_phy
200  use cpdet_phy_mod, only: t2tpot, tpot2t
201
202  IMPLICIT none
203
204! Cette routine calcule les fluxs en h a l'interface et eventuellement
205! une temperature de surface (au cas ou ok_veget = false)
206!
207! L. Fairhead 4/2000
208!
209! input:
210!   knon         nombre de points a traiter
211!   tsurf        temperature de surface
212!   zcp          Cp(Tsurf)             
213!   pkh1         fct Exner à la surface: RCPD*(paprs(1)/preff)**RKAPPA
214!   p1lay        pression 1er niveau (milieu de couche)
215!   cal          capacite calorifique du sol
216!   beta         evap reelle
217!   coef1lay     coefficient d'echange
218!   petAcoef     coeff. A de la resolution de la CL pour t
219!   petBcoef     coeff. B de la resolution de la CL pour t
220!   radsol       rayonnement net aus sol (LW + SW)
221!
222! output:
223!   tsurf_new    temperature au sol
224!   fluxsens     flux de chaleur sensible
225!   dflux_s      derivee du flux de chaleur sensible / Ts
226!
227
228! Parametres d'entree
229  integer, intent(IN) :: knon, klon
230  real   , intent(IN) :: dtime
231  real, dimension(klon), intent(IN) :: petAcoef
232  real, dimension(klon), intent(IN) :: petBcoef
233! ADAPTATION GCM POUR CP(T)
234  real, dimension(klon), intent(IN) :: tsurf,pkh1,zcp
235  real, dimension(klon), intent(IN) :: p1lay, cal, beta, coef1lay
236  real, dimension(klon), intent(IN) :: radsol
237  real, dimension(klon), intent(IN) :: t1lay, u1lay, v1lay
238
239! Parametres sorties
240  real, dimension(klon), intent(OUT):: tsurf_new, fluxsens
241  real, dimension(klon), intent(OUT):: dflux_s
242
243! Variables locales
244  integer :: i
245  real, dimension(klon) :: zx_mh, zx_nh, zx_oh
246  real, dimension(klon) :: zx_coef
247  real, dimension(klon) :: ztetasurf,ztetasurf_new
248  real, dimension(klon) :: zx_k1
249  real, dimension(klon) :: zx_q_0 , d_ts
250  real                  :: zdelta, zcvm5, zcor
251!
252  logical, save         :: check = .false.
253  character (len = 20)  :: modname = 'calcul_fluxs'
254  character (len = 80) :: abort_message
255  logical,save         :: first = .true.,second=.false.
256
257  if (check) write(*,*)'Entree ', modname
258
259  IF (check) THEN
260      WRITE(*,*)' radsol (min, max)' &
261         &     , MINVAL(radsol(1:knon)), MAXVAL(radsol(1:knon))
262      CALL flush(6)
263  ENDIF
264
265!
266! Initialisation
267!
268  fluxsens=0.
269  dflux_s = 0.
270!
271  DO i = 1, knon
272
273    zx_coef(i) = coef1lay(i) &
274     & * SQRT(u1lay(i)**2+v1lay(i)**2) &
275     & * p1lay(i)/(RD*t1lay(i))
276
277  ENDDO
278
279
280! === Calcul de la temperature de surface ===
281!
282! MODIF VENUS:
283! Le calcul se fait en temperature potentielle
284
285  call t2tpot(knon,tsurf,ztetasurf,pkh1)
286
287  do i = 1, knon
288    zx_k1(i) = zx_coef(i)
289  enddo
290
291
292  do i = 1, knon
293
294! H
295    zx_oh(i) = 1. - (zx_k1(i) * petBcoef(i) * dtime)
296    zx_mh(i) = zx_k1(i) * petAcoef(i) / zx_oh(i)
297! Derives des flux dF/d(teta)s:
298    zx_nh(i) = - (zx_k1(i) * zcp(i))/ zx_oh(i)
299! Derives des flux dF/dTs (W m-2 K-1):      version Terre
300!   zx_nh(i) = - (zx_k1(i) * RCPD * zx_pkh(i))/ zx_oh(i)
301
302! Tsurface  Version Terre
303!
304!   tsurf_new(i) = (tsurf(i) + cal(i)/(RCPD * zx_pkh(i)) * dtime * &
305!    &             (radsol(i) + zx_mh(i)) &
306!    &                 + dif_grnd(i) * t_grnd * dtime)/ &
307!    &          ( 1. - dtime * cal(i)/(RCPD * zx_pkh(i)) * &
308!    &                       zx_nh(i) & 
309!    &                     + dtime * dif_grnd(i))
310!
311!   d_ts(i) = tsurf_new(i) - tsurf(i)
312!   fluxsens(i) = zx_mh(i) + zx_nh(i) * tsurf_new(i)
313! Derives des flux dF/dTs (W m-2 K-1):
314!   dflux_s(i) = zx_nh(i)
315
316! MODIF VENUS  : on vire dif_grnd (=0) et t_grnd
317!                et on travaille en teta
318
319    ztetasurf_new(i) = (ztetasurf(i) + cal(i)/zcp(i) * dtime * &
320     &                  (radsol(i) + zx_mh(i)) &
321     &             ) / &
322     &             ( 1.      - cal(i)/zcp(i) * dtime * &
323     &                      zx_nh(i) )
324  ENDDO
325
326    call tpot2t(knon,ztetasurf_new,tsurf_new,pkh1)
327
328  do i = 1, knon
329    d_ts(i) = tsurf_new(i) - tsurf(i)
330    fluxsens(i) = zx_mh(i) + zx_nh(i) * ztetasurf_new(i)
331! Derives des flux dF/dTs (W m-2 K-1):
332    dflux_s(i) = zx_nh(i)*ztetasurf(i)/tsurf(i)
333  ENDDO
334
335! for tests: write output fields...
336!  call writefield_phy('calcul_fluxs_d_ts',d_ts,1)
337!  call writefield_phy('calcul_fluxs_fluxsens',fluxsens,1)
338!  call writefield_phy('calcul_fluxs_dflux_s',dflux_s,1)
339
340  END SUBROUTINE calcul_fluxs
341!
342!#########################################################################
343!
344  END MODULE interface_surf
Note: See TracBrowser for help on using the repository browser.