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

Last change on this file since 1543 was 1017, checked in by emillour, 11 years ago

Common dynamics: (and collateral adaptations in Venus physics)
Improved cpdet routines in and additional sponge mode:

  • Additionnal sponge mode (trigered with "callsponge" flag), in line with the one used in the Generic and Martian GCM. This sponge is called whenever there is a dissipation step.
  • Improvement of the cpdet routines : created routines tpot2t_glo_p and t2tpot_glo_p which handle fields on the whole dynamics (scaler) grid, which are more efficient than calling tpot2t_p or t2tpot_p with slabs of data (generated use of intermediate copies of these chunks of data at every call)
  • Turned cpdet.F into a module cpdet_mod.F90 (and correspondingly adapted all routines in the Venus physics).

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