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

Last change on this file since 894 was 892, checked in by slebonnois, 12 years ago

SL: Important commit ! Adaptation of Venus physics to parallel computation / template for arch on the LMD servers using ifort / documentation for 1D column physics and for parallel computations

File size: 10.2 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
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! Parametres d'entree
213  integer, intent(IN) :: knon, klon
214  real   , intent(IN) :: dtime
215  real, dimension(klon), intent(IN) :: petAcoef
216  real, dimension(klon), intent(IN) :: petBcoef
217! ADAPTATION GCM POUR CP(T)
218  real, dimension(klon), intent(IN) :: tsurf,pkh1,zcp
219  real, dimension(klon), intent(IN) :: p1lay, cal, beta, coef1lay
220  real, dimension(klon), intent(IN) :: radsol
221  real, dimension(klon), intent(IN) :: t1lay, u1lay, v1lay
222
223! Parametres sorties
224  real, dimension(klon), intent(OUT):: tsurf_new, fluxsens
225  real, dimension(klon), intent(OUT):: dflux_s
226
227! Variables locales
228  integer :: i
229  real, dimension(klon) :: zx_mh, zx_nh, zx_oh
230  real, dimension(klon) :: zx_coef
231  real, dimension(klon) :: ztetasurf,ztetasurf_new
232  real, dimension(klon) :: zx_k1
233  real, dimension(klon) :: zx_q_0 , d_ts
234  real                  :: zdelta, zcvm5, zcor
235!
236  logical, save         :: check = .false.
237  character (len = 20)  :: modname = 'calcul_fluxs'
238  character (len = 80) :: abort_message
239  logical,save         :: first = .true.,second=.false.
240
241  if (check) write(*,*)'Entree ', modname
242
243  IF (check) THEN
244      WRITE(*,*)' radsol (min, max)' &
245         &     , MINVAL(radsol(1:knon)), MAXVAL(radsol(1:knon))
246      CALL flush(6)
247  ENDIF
248
249!
250! Initialisation
251!
252  fluxsens=0.
253  dflux_s = 0.
254!
255  DO i = 1, knon
256
257    zx_coef(i) = coef1lay(i) &
258     & * SQRT(u1lay(i)**2+v1lay(i)**2) &
259     & * p1lay(i)/(RD*t1lay(i))
260
261  ENDDO
262
263
264! === Calcul de la temperature de surface ===
265!
266! MODIF VENUS:
267! Le calcul se fait en temperature potentielle
268
269  call t2tpot(knon,tsurf,ztetasurf,pkh1)
270
271  do i = 1, knon
272    zx_k1(i) = zx_coef(i)
273  enddo
274
275
276  do i = 1, knon
277
278! H
279    zx_oh(i) = 1. - (zx_k1(i) * petBcoef(i) * dtime)
280    zx_mh(i) = zx_k1(i) * petAcoef(i) / zx_oh(i)
281! Derives des flux dF/d(teta)s:
282    zx_nh(i) = - (zx_k1(i) * zcp(i))/ zx_oh(i)
283! Derives des flux dF/dTs (W m-2 K-1):      version Terre
284!   zx_nh(i) = - (zx_k1(i) * RCPD * zx_pkh(i))/ zx_oh(i)
285
286! Tsurface  Version Terre
287!
288!   tsurf_new(i) = (tsurf(i) + cal(i)/(RCPD * zx_pkh(i)) * dtime * &
289!    &             (radsol(i) + zx_mh(i)) &
290!    &                 + dif_grnd(i) * t_grnd * dtime)/ &
291!    &          ( 1. - dtime * cal(i)/(RCPD * zx_pkh(i)) * &
292!    &                       zx_nh(i) & 
293!    &                     + dtime * dif_grnd(i))
294!
295!   d_ts(i) = tsurf_new(i) - tsurf(i)
296!   fluxsens(i) = zx_mh(i) + zx_nh(i) * tsurf_new(i)
297! Derives des flux dF/dTs (W m-2 K-1):
298!   dflux_s(i) = zx_nh(i)
299
300! MODIF VENUS  : on vire dif_grnd (=0) et t_grnd
301!                et on travaille en teta
302
303    ztetasurf_new(i) = (ztetasurf(i) + cal(i)/zcp(i) * dtime * &
304     &                  (radsol(i) + zx_mh(i)) &
305     &             ) / &
306     &             ( 1.      - cal(i)/zcp(i) * dtime * &
307     &                      zx_nh(i) )
308  ENDDO
309
310    call tpot2t(knon,ztetasurf_new,tsurf_new,pkh1)
311
312  do i = 1, knon
313    d_ts(i) = tsurf_new(i) - tsurf(i)
314    fluxsens(i) = zx_mh(i) + zx_nh(i) * ztetasurf_new(i)
315! Derives des flux dF/dTs (W m-2 K-1):
316    dflux_s(i) = zx_nh(i)*ztetasurf(i)/tsurf(i)
317  ENDDO
318
319  END SUBROUTINE calcul_fluxs
320!
321!#########################################################################
322!
323  END MODULE interface_surf
Note: See TracBrowser for help on using the repository browser.