source: trunk/libf/phyvenus/interface_surf.F90 @ 4

Last change on this file since 4 was 3, checked in by slebonnois, 15 years ago

Creation de repertoires:

  • chantiers : pour communiquer sur nos projets de modifs
  • documentation : pour stocker les docs

Ajout de:

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