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

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