/[lmdze]/trunk/Sources/phylmd/Interface_surf/interfsurf_hq.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/Interface_surf/interfsurf_hq.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 221 by guez, Thu Apr 20 14:44:47 2017 UTC revision 222 by guez, Tue Apr 25 15:31:48 2017 UTC
# Line 4  module interfsurf_hq_m Line 4  module interfsurf_hq_m
4    
5  contains  contains
6    
7    SUBROUTINE interfsurf_hq(dtime, julien, rmu0, nisurf, knon, knindex, debut, &    SUBROUTINE interfsurf_hq(dtime, julien, rmu0, nisurf, knindex, debut, &
8         tsoil, qsol, u1_lay, v1_lay, temp_air, spechum, tq_cdrag, petAcoef, &         tsoil, qsol, u1_lay, v1_lay, temp_air, spechum, tq_cdrag, petAcoef, &
9         peqAcoef, petBcoef, peqBcoef, precip_rain, precip_snow, fder, rugos, &         peqAcoef, petBcoef, peqBcoef, precip_rain, precip_snow, fder, rugos, &
10         rugoro, snow, qsurf, ts, p1lay, ps, radsol, evap, flux_t, fluxlat, &         rugoro, snow, qsurf, ts, p1lay, ps, radsol, evap, flux_t, fluxlat, &
# Line 36  contains Line 36  contains
36      integer, intent(IN):: julien ! jour dans l'annee en cours      integer, intent(IN):: julien ! jour dans l'annee en cours
37      real, intent(IN):: rmu0(klon) ! cosinus de l'angle solaire zenithal      real, intent(IN):: rmu0(klon) ! cosinus de l'angle solaire zenithal
38      integer, intent(IN):: nisurf ! index de la surface a traiter      integer, intent(IN):: nisurf ! index de la surface a traiter
     integer, intent(IN):: knon ! nombre de points de la surface a traiter  
39    
40      integer, intent(in):: knindex(:) ! (knon)      integer, intent(in):: knindex(:) ! (knon)
41      ! index des points de la surface a traiter      ! index des points de la surface a traiter
# Line 69  contains Line 68  contains
68      real, intent(IN):: precip_snow(klon)      real, intent(IN):: precip_snow(klon)
69      ! precipitation, solid water mass flux (kg / m2 / s), positive down      ! precipitation, solid water mass flux (kg / m2 / s), positive down
70    
71      REAL, INTENT(INOUT):: fder(klon) ! derivee des flux (pour le couplage)      REAL, INTENT(INOUT):: fder(:) ! (knon) derivee des flux (pour le couplage)
72      real, intent(IN):: rugos(klon) ! rugosite      real, intent(IN):: rugos(klon) ! rugosite
73      real, intent(IN):: rugoro(klon) ! rugosite orographique      real, intent(IN):: rugoro(klon) ! rugosite orographique
74      real, intent(INOUT):: snow(:) ! (knon)      real, intent(INOUT):: snow(:) ! (knon)
# Line 77  contains Line 76  contains
76      real, intent(IN):: ts(:) ! (knon) temp\'erature de surface      real, intent(IN):: ts(:) ! (knon) temp\'erature de surface
77      real, intent(IN):: p1lay(klon) ! pression 1er niveau (milieu de couche)      real, intent(IN):: p1lay(klon) ! pression 1er niveau (milieu de couche)
78      real, dimension(klon), intent(IN):: ps ! pression au sol      real, dimension(klon), intent(IN):: ps ! pression au sol
79        REAL, INTENT(INOUT):: radsol(:) ! (knon) rayonnement net au sol (LW + SW)
     REAL, DIMENSION(klon), INTENT(INOUT):: radsol  
     ! rayonnement net au sol (LW + SW)  
   
80      real, intent(OUT):: evap(:) ! (knon) evaporation totale      real, intent(OUT):: evap(:) ! (knon) evaporation totale
81    
82      real, intent(OUT):: flux_t(:) ! (knon) flux de chaleur sensible      real, intent(OUT):: flux_t(:) ! (knon) flux de chaleur sensible
83      ! (Cp T) à la surface, positif vers le bas, W / m2      ! (Cp T) à la surface, positif vers le bas, W / m2
84            
85      real, intent(OUT):: fluxlat(:) ! (knon) flux de chaleur latente      real, intent(OUT):: fluxlat(:) ! (knon) flux de chaleur latente
86      real, dimension(klon), intent(OUT):: dflux_l, dflux_s      real, intent(OUT):: dflux_l(:), dflux_s(:) ! (knon)
87      real, intent(OUT):: tsurf_new(:) ! (knon) temp\'erature au sol      real, intent(OUT):: tsurf_new(:) ! (knon) temp\'erature au sol
88      real, intent(OUT):: albedo(:) ! (knon) albedo      real, intent(OUT):: albedo(:) ! (knon) albedo
89      real, intent(OUT):: z0_new(klon) ! surface roughness      real, intent(OUT):: z0_new(klon) ! surface roughness
# Line 108  contains Line 104  contains
104      ! run_off_lic_0 runoff glacier du pas de temps precedent      ! run_off_lic_0 runoff glacier du pas de temps precedent
105    
106      ! Local:      ! Local:
107      REAL soilcap(knon)      integer knon ! nombre de points de la surface a traiter
108      REAL soilflux(knon)      REAL soilcap(size(knindex)) ! (knon)
109        REAL soilflux(size(knindex)) ! (knon)
110      logical:: first_call = .true.      logical:: first_call = .true.
111      integer ii      integer ii
112      real cal(knon)      real cal(size(knindex)) ! (knon)
113      real beta(klon) ! evap reelle      real beta(size(knindex)) ! (knon) evap reelle
114      real dif_grnd(klon), capsol(klon)      real dif_grnd(klon), capsol(klon)
115      real, parameter:: calice = 1. / (5.1444e6 * 0.15), tau_gl = 86400. * 5.      real, parameter:: calice = 1. / (5.1444e6 * 0.15), tau_gl = 86400. * 5.
116      real, parameter:: calsno = 1. / (2.3867e6 * 0.15)      real, parameter:: calsno = 1. / (2.3867e6 * 0.15)
117      real tsurf_temp(knon)      real tsurf(size(knindex)) ! (knon)
118      real alb_neig(knon)      real alb_neig(size(knindex)) ! (knon)
119      real zfra(knon)      real zfra(size(knindex)) ! (knon)
120      REAL, PARAMETER:: fmagic = 1. ! facteur magique pour r\'egler l'alb\'edo      REAL, PARAMETER:: fmagic = 1. ! facteur magique pour r\'egler l'alb\'edo
121    
122      !-------------------------------------------------------------      !-------------------------------------------------------------
123    
124        knon = size(knindex)
125        
126      ! On doit commencer par appeler les schemas de surfaces continentales      ! On doit commencer par appeler les schemas de surfaces continentales
127      ! car l'ocean a besoin du ruissellement qui est y calcule      ! car l'ocean a besoin du ruissellement qui est y calcule
128    
# Line 150  contains Line 149  contains
149    
150      ffonte(1:knon) = 0.      ffonte(1:knon) = 0.
151      fqcalving(1:knon) = 0.      fqcalving(1:knon) = 0.
     cal = 999999.  
     beta = 999999.  
152      dif_grnd = 999999.      dif_grnd = 999999.
153      capsol = 999999.      capsol = 999999.
154      z0_new = 999999.      z0_new = 999999.
# Line 170  contains Line 167  contains
167         call interfsur_lim(dtime, julien, knindex, debut, albedo, z0_new)         call interfsur_lim(dtime, julien, knindex, debut, albedo, z0_new)
168    
169         ! Calcul de snow et qsurf, hydrologie adapt\'ee         ! Calcul de snow et qsurf, hydrologie adapt\'ee
170         CALL calbeta(is_ter, snow, qsol(:knon), beta(:knon), &         CALL calbeta(is_ter, snow, qsol(:knon), beta, capsol(:knon), &
171              capsol(:knon), dif_grnd(:knon))              dif_grnd(:knon))
172    
173         IF (soil_model) THEN         IF (soil_model) THEN
174            CALL soil(dtime, is_ter, snow, ts, tsoil, soilcap, soilflux)            CALL soil(dtime, is_ter, snow, ts, tsoil, soilcap, soilflux)
175            cal = RCPD / soilcap            cal = RCPD / soilcap
176            radsol(1:knon) = radsol(1:knon) + soilflux            radsol = radsol + soilflux
177         ELSE         ELSE
178            cal = RCPD * capsol(:knon)            cal = RCPD * capsol(:knon)
179         ENDIF         ENDIF
180    
181         CALL calcul_fluxs(dtime, ts, p1lay(:knon), cal, beta(:knon), &         CALL calcul_fluxs(dtime, ts, p1lay(:knon), cal, beta, tq_cdrag(:knon), &
182              tq_cdrag(:knon), ps(:knon), qsurf(:knon), radsol(:knon), &              ps(:knon), qsurf(:knon), radsol, dif_grnd(:knon), &
183              dif_grnd(:knon), temp_air(:knon), spechum(:knon), u1_lay(:knon), &              temp_air(:knon), spechum(:knon), u1_lay(:knon), v1_lay(:knon), &
184              v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), &              petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), &
185              peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, &              peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, dflux_s, dflux_l)
             dflux_s(:knon), dflux_l(:knon))  
186         CALL fonte_neige(is_ter, dtime, precip_rain(:knon), &         CALL fonte_neige(is_ter, dtime, precip_rain(:knon), &
187              precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, &              precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, &
188              fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon))              fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon))
# Line 199  contains Line 195  contains
195      case (is_oce)      case (is_oce)
196         ! Surface "oc\'ean", appel \`a l'interface avec l'oc\'ean         ! Surface "oc\'ean", appel \`a l'interface avec l'oc\'ean
197    
198         call read_sst(julien, knindex, tsurf_temp)         call read_sst(julien, knindex, tsurf)
199         cal = 0.         cal = 0.
200         beta = 1.         beta = 1.
201         dif_grnd = 0.         dif_grnd = 0.
202           call calcul_fluxs(dtime, tsurf, p1lay(:knon), cal, beta, &
203                tq_cdrag(:knon), ps(:knon), qsurf(:knon), radsol, &
204                dif_grnd(:knon), temp_air(:knon), spechum(:knon), u1_lay(:knon), &
205                v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), &
206                peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, dflux_s, dflux_l)
207         agesno = 0.         agesno = 0.
        call calcul_fluxs(dtime, tsurf_temp, p1lay(:knon), cal, &  
             beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), &  
             radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), &  
             u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), &  
             petBcoef(:knon), peqBcoef(:knon), tsurf_new, evap, &  
             fluxlat, flux_t, dflux_s(:knon), dflux_l(:knon))  
208         fder = fder + dflux_s + dflux_l         fder = fder + dflux_s + dflux_l
209         albedo = alboc_cd(rmu0(knindex)) * fmagic         albedo = alboc_cd(rmu0(knindex)) * fmagic
210         z0_new = sqrt(rugos**2 + rugoro**2)         z0_new = sqrt(rugos**2 + rugoro**2)
# Line 226  contains Line 221  contains
221            endif            endif
222         enddo         enddo
223    
224         CALL calbeta(is_sic, snow, qsol(:knon), beta(:knon), &         CALL calbeta(is_sic, snow, qsol(:knon), beta, capsol(:knon), &
225              capsol(:knon), dif_grnd(:knon))              dif_grnd(:knon))
226    
227         IF (soil_model) THEN         IF (soil_model) THEN
228            CALL soil(dtime, is_sic, snow, tsurf_new, tsoil, soilcap, &            CALL soil(dtime, is_sic, snow, tsurf_new, tsoil, soilcap, &
229                 soilflux)                 soilflux)
230            cal = RCPD / soilcap            cal = RCPD / soilcap
231            radsol(1:knon) = radsol(1:knon) + soilflux            radsol = radsol + soilflux
232            dif_grnd = 0.            dif_grnd = 0.
233         ELSE         ELSE
234            dif_grnd = 1. / tau_gl            dif_grnd = 1. / tau_gl
235            cal = RCPD * calice            cal = RCPD * calice
236            WHERE (snow > 0.) cal = RCPD * calsno            WHERE (snow > 0.) cal = RCPD * calsno
237         ENDIF         ENDIF
238         tsurf_temp = tsurf_new         tsurf = tsurf_new
239         beta = 1.         beta = 1.
240    
241         CALL calcul_fluxs(dtime, tsurf_temp, p1lay(:knon), cal, &         CALL calcul_fluxs(dtime, tsurf, p1lay(:knon), cal, beta, &
242              beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), &              tq_cdrag(:knon), ps(:knon), qsurf(:knon), radsol, &
243              radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), &              dif_grnd(:knon), temp_air(:knon), spechum(:knon), u1_lay(:knon), &
244              u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), &              v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), &
245              petBcoef(:knon), peqBcoef(:knon), tsurf_new, evap, &              peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, dflux_s, dflux_l)
             fluxlat, flux_t, dflux_s(:knon), dflux_l(:knon))  
246         CALL fonte_neige(is_sic, dtime, precip_rain(:knon), &         CALL fonte_neige(is_sic, dtime, precip_rain(:knon), &
247              precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, &              precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, &
248              fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon))              fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon))
# Line 268  contains Line 262  contains
262         IF (soil_model) THEN         IF (soil_model) THEN
263            CALL soil(dtime, is_lic, snow, ts, tsoil, soilcap, soilflux)            CALL soil(dtime, is_lic, snow, ts, tsoil, soilcap, soilflux)
264            cal = RCPD / soilcap            cal = RCPD / soilcap
265            radsol(1:knon) = radsol(1:knon) + soilflux            radsol = radsol + soilflux
266         ELSE         ELSE
267            cal = RCPD * calice            cal = RCPD * calice
268            WHERE (snow > 0.) cal = RCPD * calsno            WHERE (snow > 0.) cal = RCPD * calsno
# Line 276  contains Line 270  contains
270         beta = 1.         beta = 1.
271         dif_grnd = 0.         dif_grnd = 0.
272    
273         call calcul_fluxs(dtime, ts, p1lay(:knon), cal, &         call calcul_fluxs(dtime, ts, p1lay(:knon), cal, beta, tq_cdrag(:knon), &
274              beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), &              ps(:knon), qsurf(:knon), radsol, dif_grnd(:knon), &
275              radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), &              temp_air(:knon), spechum(:knon), u1_lay(:knon), v1_lay(:knon), &
276              u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), &              petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), &
277              petBcoef(:knon), peqBcoef(:knon), tsurf_new, evap, &              peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, dflux_s, dflux_l)
             fluxlat, flux_t, dflux_s(:knon), dflux_l(:knon))  
278         call fonte_neige(is_lic, dtime, precip_rain(:knon), &         call fonte_neige(is_lic, dtime, precip_rain(:knon), &
279              precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, &              precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, &
280              fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon))              fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon))

Legend:
Removed from v.221  
changed lines
  Added in v.222

  ViewVC Help
Powered by ViewVC 1.1.21