source: LMDZ5/branches/IPSLCM5A2.1_ISO/libf/phyiso/surf_land_bucket_mod.F90 @ 3363

Last change on this file since 3363 was 3331, checked in by acozic, 6 years ago

Add modification for isotopes

  • Property svn:executable set to *
File size: 12.3 KB
Line 
1!
2MODULE surf_land_bucket_mod
3!
4! Surface land bucket module
5!
6! This module is used when no external land model is choosen.
7!
8  IMPLICIT NONE
9
10CONTAINS
11
12  SUBROUTINE surf_land_bucket(itime, jour, knon, knindex, debut, dtime,&
13       tsurf, p1lay, tq_cdrag, precip_rain, precip_snow, temp_air, &
14       spechum, petAcoef, peqAcoef, petBcoef, peqBcoef, pref, &
15       u1, v1, gustiness, rugoro, swnet, lwnet, &
16       snow, qsol, agesno, tsoil, &
17       qsurf, z0_new, alb1_new, alb2_new, evap, &
18       fluxsens, fluxlat, tsurf_new, dflux_s, dflux_l &
19#ifdef ISO
20       ,xtprecip_rain, xtprecip_snow,xtspechum, &
21       xtsnow, xtsol,xtevap,h1, &
22       runoff_diag,xtrunoff_diag,Rland_ice &
23#endif           
24            )
25
26    USE limit_read_mod
27    USE surface_data
28    USE fonte_neige_mod
29    USE calcul_fluxs_mod
30    USE cpl_mod
31    USE dimphy
32    USE geometry_mod, ONLY: latitude
33    USE mod_grid_phy_lmdz
34    USE mod_phys_lmdz_para
35    USE indice_sol_mod
36#ifdef ISO
37    use infotrac_phy, ONLY: ntraciso,niso
38    USE isotopes_mod, ONLY: iso_eau, iso_HDO, iso_O18, iso_O17, &
39        ridicule_qsol
40    USE isotopes_routines_mod, ONLY: calcul_iso_surf_ter_vectall
41#ifdef ISOVERIF
42    USE isotopes_verif_mod, ONLY: errmax,errmaxrel,iso_verif_noNaN, &
43        iso_verif_aberrant_o17,iso_verif_egalite_choix,iso_verif_egalite
44#endif
45#endif
46!****************************************************************************************
47! Bucket calculations for surface.
48!
49    INCLUDE "clesphys.h"
50    INCLUDE "dimsoil.h"
51    INCLUDE "YOMCST.h"
52
53! Input variables 
54!****************************************************************************************
55    INTEGER, INTENT(IN)                     :: itime, jour, knon
56    INTEGER, DIMENSION(klon), INTENT(IN)    :: knindex
57    LOGICAL, INTENT(IN)                     :: debut
58    REAL, INTENT(IN)                        :: dtime
59    REAL, DIMENSION(klon), INTENT(IN)       :: tsurf
60    REAL, DIMENSION(klon), INTENT(IN)       :: p1lay
61    REAL, DIMENSION(klon), INTENT(IN)       :: tq_cdrag
62    REAL, DIMENSION(klon), INTENT(IN)       :: precip_rain, precip_snow
63    REAL, DIMENSION(klon), INTENT(IN)       :: temp_air, spechum
64    REAL, DIMENSION(klon), INTENT(IN)       :: petAcoef, peqAcoef
65    REAL, DIMENSION(klon), INTENT(IN)       :: petBcoef, peqBcoef
66    REAL, DIMENSION(klon), INTENT(IN)       :: pref
67    REAL, DIMENSION(klon), INTENT(IN)       :: u1, v1, gustiness
68    REAL, DIMENSION(klon), INTENT(IN)       :: rugoro
69    REAL, DIMENSION(klon), INTENT(IN)       :: swnet, lwnet
70#ifdef ISO
71    REAL, DIMENSION(ntraciso,klon), INTENT(IN)       :: xtprecip_rain, xtprecip_snow
72    REAL, DIMENSION(ntraciso,klon), INTENT(IN)       :: xtspechum   
73#endif
74
75! In/Output variables
76!****************************************************************************************
77    REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsol
78    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
79    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
80#ifdef ISO
81    REAL, DIMENSION(niso,klon), INTENT(INOUT)       :: xtsnow,xtsol
82#endif
83
84! Output variables
85!****************************************************************************************
86    REAL, DIMENSION(klon), INTENT(OUT)       :: qsurf
87    REAL, DIMENSION(klon), INTENT(OUT)       :: z0_new
88    REAL, DIMENSION(klon), INTENT(OUT)       :: alb1_new, alb2_new
89    REAL, DIMENSION(klon), INTENT(OUT)       :: evap, fluxsens, fluxlat
90    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
91    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l         
92#ifdef ISO
93    REAL, DIMENSION(ntraciso,klon), INTENT(OUT)       :: xtevap
94    REAL, DIMENSION(klon), INTENT(OUT)       :: h1
95    REAL, DIMENSION(niso,klon), INTENT(OUT)       :: xtrunoff_diag
96    REAL, DIMENSION(klon), INTENT(OUT)       :: runoff_diag
97    REAL, DIMENSION(niso,klon), INTENT(IN)        :: Rland_ice
98#endif
99
100! Local variables
101!****************************************************************************************
102    REAL, DIMENSION(klon) :: soilcap, soilflux
103    REAL, DIMENSION(klon) :: cal, beta, dif_grnd, capsol
104    REAL, DIMENSION(klon) :: alb_neig, alb_lim
105    REAL, DIMENSION(klon) :: zfra
106    REAL, DIMENSION(klon) :: radsol       ! total net radiance at surface
107    REAL, DIMENSION(klon) :: u0, v0, u1_lay, v1_lay
108    REAL, DIMENSION(klon) :: dummy_riverflow,dummy_coastalflow
109    INTEGER               :: i
110
111#ifdef ISO
112    integer ixt
113    REAL, DIMENSION(niso,klon) :: xtsnow_prec,xtsol_prec
114    REAL, DIMENSION(klon) :: snow_prec,qsol_prec
115    real, parameter :: t_coup = 273.15
116    real, dimension(klon) :: fq_fonte_diag
117    real, dimension(klon) :: fqfonte_diag
118    real, dimension(klon) ::  snow_evap_diag
119    real, dimension(klon) ::  fqcalving_diag
120    real max_eau_sol_diag 
121    real, dimension(klon) ::  P_vegetation
122    real, dimension(klon) ::  run_off_lic_diag
123    real :: coeff_rel_diag
124!    real, dimension(klon), intent(out) ::  runoff_diag   
125#endif       
126!
127!****************************************************************************************
128
129#ifdef ISO
130#ifdef ISOVERIF
131        write(*,*) 'surf_land_bucket 152'
132        do i=1,knon
133          if (iso_eau.gt.0) then
134            call iso_verif_egalite_choix(precip_snow(i), &
135     &          xtprecip_snow(iso_eau,i),'surf_land_bucket 131', &
136     &          errmax,errmaxrel)
137            call iso_verif_egalite_choix(qsol(i), &
138     &          xtsol(iso_eau,i),'surf_land_bucket 134', &
139     &          errmax,errmaxrel)
140          endif 
141        enddo
142#endif
143#ifdef ISOVERIF
144        do i=1,knon
145         do ixt=1,niso
146          call iso_verif_noNaN(xtsol(ixt,i),'surf_land_mod_bucket 142')
147         enddo !do ixt=1,niso
148        enddo !do i=1,knon
149        write(*,*) 'surf_land_bucket 152'
150#endif
151#endif
152
153!
154!* Read from limit.nc : albedo(alb_lim), length of rugosity(z0_new)
155!
156    CALL limit_read_rug_alb(itime, dtime, jour,&
157         knon, knindex, &
158         z0_new, alb_lim &
159#ifdef ISO
160     &  ,P_vegetation  &
161#endif     
162     & )
163!        write(*,*) 'surf_land_bucket 166'
164!
165!* Calcultaion of fluxes
166!
167
168! calculate total absorbed radiance at surface
169       radsol(:) = 0.0
170       radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
171
172! calculate constants
173!        write(*,*) 'surf_land_bucket 176'
174    CALL calbeta(dtime, is_ter, knon, snow, qsol, beta, capsol, dif_grnd)
175    if (type_veget=='betaclim') then
176       CALL calbeta_clim(knon,jour,latitude(knindex(1:knon)),beta)
177    endif
178       
179! calculate temperature, heat capacity and conduction flux in soil
180!        write(*,*) 'surf_land_bucket 183: soil_model=',soil_model
181    IF (soil_model) THEN
182!       write(*,*) 'surf_land_bucket 185'
183       CALL soil(dtime, is_ter, knon, snow, tsurf, tsoil, soilcap, soilflux)
184!       write(*,*) 'surf_land_bucket 187'
185       DO i=1, knon
186          cal(i) = RCPD / soilcap(i)
187          radsol(i) = radsol(i)  + soilflux(i)
188       END DO
189    ELSE
190       cal(:) = RCPD * capsol(:)
191       IF (klon_glo .EQ. 1) THEN
192         cal(:) = 0.
193       ENDIF
194    ENDIF
195   
196! Suppose zero surface speed
197!        write(*,*) 'surf_land_bucket 198'
198    u0(:)=0.0
199    v0(:)=0.0
200    u1_lay(:) = u1(:) - u0(:)
201    v1_lay(:) = v1(:) - v0(:)
202
203!        write(*,*) 'surf_land_bucket 201'
204    CALL calcul_fluxs(knon, is_ter, dtime, &
205         tsurf, p1lay, cal, beta, tq_cdrag, tq_cdrag, pref, &
206         precip_rain, precip_snow, snow, qsurf,  &
207         radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, gustiness, &
208         1.,petAcoef, peqAcoef, petBcoef, peqBcoef, &
209         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
210   
211
212
213#ifdef ISO
214   ! verif
215#ifdef ISOVERIF
216    write(*,*) 'surf_land_bucket 211'
217    do i=1,knon
218      if (iso_eau.gt.0) then
219        call iso_verif_egalite_choix(xtsnow(iso_eau,i), &
220     &           snow(i),'surf_land_bucket 522', &
221     &           errmax,errmaxrel)
222       endif !if (iso_eau.gt.0) then
223    enddo !do i=1,knon
224#endif
225   ! end verif
226#endif         
227#ifdef ISO
228    do i=1,knon
229      snow_prec(i)=snow(i)
230      qsol_prec(i)=qsol(i)
231      do ixt=1,niso
232        xtsnow_prec(ixt,i)=xtsnow(ixt,i)
233        xtsol_prec(ixt,i)=xtsol(ixt,i)
234      enddo !do ixt=1,niso
235      ! initialisation:
236      fqfonte_diag(i)=0.0
237      fq_fonte_diag(i)=0.0
238      snow_evap_diag(i)=0.0
239   enddo !do i=1,knon
240#ifdef ISOVERIF
241        write(*,*) 'surf_land_bucket 235'
242       do i=1,knon 
243        if (iso_eau.gt.0) then
244            call iso_verif_egalite(qsol_prec(i),xtsol_prec(iso_eau,i), &
245    &            'surf_land_bucket 141')
246        endif
247      enddo !do i=1,knon
248        write(*,*) 'snow_prec(1)=',snow_prec(1)
249        write(*,*) 'xtsnow(:,1)=',xtsnow(:,1)
250#endif   
251#endif   
252!
253!* Calculate snow height, run_off, age of snow
254!     
255    CALL fonte_neige( knon, is_ter, knindex, dtime, &
256         tsurf, precip_rain, precip_snow, &
257         snow, qsol, tsurf_new, evap &
258#ifdef ISO   
259     & ,fq_fonte_diag,fqfonte_diag,snow_evap_diag,fqcalving_diag   &
260     & ,max_eau_sol_diag,runoff_diag,run_off_lic_diag,coeff_rel_diag   &
261#endif
262     &   )
263
264#ifdef ISO
265#ifdef ISOVERIF
266        write(*,*) 'surf_land_bucket 258'
267        write(*,*) 'snow_prec(1)=',snow_prec(1)
268        write(*,*) 'xtsnow(:,1)=',xtsnow(:,1)
269        do i=1,knon
270         do ixt=1,niso
271          call iso_verif_noNaN(xtsol_prec(ixt,i),'surf_land_burcket 237')
272         enddo
273        enddo
274#endif
275#ifdef ISOVERIF
276        write(*,*) 'surf_land_bucket 235'
277        do i=1,knon
278          if (iso_eau.gt.0) then
279            call iso_verif_egalite_choix(qsol_prec(i), &
280     &          xtsol_prec(iso_eau,i),'surf_land_bucket 628', &
281     &          errmax,errmaxrel)
282            call iso_verif_egalite_choix(precip_snow(i), &
283     &          xtprecip_snow(iso_eau,i),'surf_land_bucket 227', &
284     &          errmax,errmaxrel)
285             ! attention, dans fonte_neige, on modifie snow sans modifier
286             ! xtsnow
287             ! c'est fait plus tard dans gestion_neige
288!            write(*,*) 'surf_land_bucket 287: i=',i
289!            write(*,*) 'snow(i)=',snow(i)
290            call iso_verif_egalite_choix(xtsnow(iso_eau,i), &
291     &           snow_prec(i),'surf_land_bucket 245', &
292     &           errmax,errmaxrel)
293          endif 
294          if ((iso_O17.gt.0).and.(iso_O18.gt.0)) then
295              if (qsol_prec(i).gt.ridicule_qsol) then
296                call iso_verif_aberrant_o17(xtsol_prec(iso_O17,i) &
297     &           /qsol_prec(i),xtsol_prec(iso_O18,i) &
298     &           /qsol_prec(i),'surf_land_bucket 642')
299              endif !if ((qsol_prec(i).gt.ridicule_qsol) &
300          endif !if ((iso_O17.gt.0).and.(iso_O18.gt.0)) then
301        enddo  !do i=1,knon   
302#endif         
303        write(*,*) 'surf_land_mod 291'
304        call calcul_iso_surf_ter_vectall(klon,knon, &
305     &           evap,snow_evap_diag,snow, &
306     &           fq_fonte_diag,fqfonte_diag,dtime,precip_rain,xtprecip_rain, &
307     &           precip_snow,xtprecip_snow, snow_prec,xtsnow_prec, &
308     &           tsurf_new,xtspechum,pref,spechum,t_coup,u1_lay,v1_lay,p1lay, &
309     &           qsol,xtsol,qsol_prec,xtsol_prec,P_vegetation, &
310     &           max_eau_sol_diag, &
311     &           xtevap,xtsnow,h1,runoff_diag,xtrunoff_diag,fqcalving_diag, &
312     &           knindex,is_ter,run_off_lic_diag,coeff_rel_diag,Rland_ice &
313     &   )
314!#ifdef ISOVERIF
315        write(*,*) 'surf_land_bucket 303'
316!#endif
317#endif
318
319!
320!* Calculate the age of snow
321!
322    CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 
323   
324    WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0.
325   
326    DO i=1, knon
327       zfra(i) = MAX(0.0,MIN(1.0, snow(i)/(snow(i)+10.0)))
328       alb_lim(i)  = alb_neig(i) *zfra(i) + alb_lim(i)*(1.0-zfra(i))
329    END DO
330
331!
332!* Return albedo :
333!    alb1_new and alb2_new are here given the same values
334!
335    alb1_new(:) = 0.0
336    alb2_new(:) = 0.0
337    alb1_new(1:knon) = alb_lim(1:knon)
338    alb2_new(1:knon) = alb_lim(1:knon)
339       
340!
341!* Calculate the rugosity
342!
343    DO i = 1, knon
344       z0_new(i) = MAX(1.5e-05,SQRT(z0_new(i)**2 + rugoro(i)**2))
345    END DO
346
347!* Send to coupler
348!  The run-off from river and coast are not calculated in the bucket modele.
349!  For testing purpose of the coupled modele we put the run-off to zero.
350    IF (type_ocean=='couple') THEN
351       dummy_riverflow(:)   = 0.0
352       dummy_coastalflow(:) = 0.0
353       CALL cpl_send_land_fields(itime, knon, knindex, &
354            dummy_riverflow, dummy_coastalflow)
355    ENDIF
356
357!
358!* End
359!
360  END SUBROUTINE surf_land_bucket
361!
362!****************************************************************************************
363!
364END MODULE surf_land_bucket_mod
Note: See TracBrowser for help on using the repository browser.