source: LMDZ5/branches/IPSLCM5A2.1_ISO/libf/phyiso/surf_landice_mod.F90

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

Add modification for isotopes

  • Property svn:executable set to *
File size: 18.0 KB
Line 
1!
2MODULE surf_landice_mod
3 
4  IMPLICIT NONE
5
6CONTAINS
7!
8!****************************************************************************************
9!
10  SUBROUTINE surf_landice(itime, dtime, knon, knindex, &
11       rlon, rlat, debut, lafin, &
12       rmu0, lwdownm, albedo, pphi1, &
13       swnet, lwnet, tsurf, p1lay, &
14       cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &
15       AcoefH, AcoefQ, BcoefH, BcoefQ, &
16       AcoefU, AcoefV, BcoefU, BcoefV, &
17       ps, u1, v1, gustiness, rugoro, pctsrf, &
18       snow, qsurf, qsol, agesno, &
19       tsoil, z0m, z0h, SFRWL, alb_dir, alb_dif, evap, fluxsens, fluxlat, &
20       tsurf_new, dflux_s, dflux_l, &
21       slope, cloudf, &
22       snowhgt, qsnow, to_ice, sissnow, &
23       alb3, runoff, &
24       flux_u1, flux_v1 &
25#ifdef ISO
26         &      ,xtprecip_rain, xtprecip_snow,xtspechum,Rland_ice &
27         &      ,xtsnow,xtsol,xtevap &
28#endif               
29           &    )
30
31    USE dimphy
32    USE surface_data,     ONLY : type_ocean, calice, calsno, ok_snow
33#ifdef ISO   
34    USE fonte_neige_mod,  ONLY : fonte_neige, run_off_lic, &
35    & xtrun_off_lic
36    USE infotrac_phy, ONLY : ntraciso,niso
37    USE isotopes_routines_mod, ONLY: calcul_iso_surf_lic_vectall
38#ifdef ISOVERIF
39    use isotopes_mod, ONLY: iso_eau,ridicule
40    use isotopes_verif_mod
41#endif
42#else 
43    USE fonte_neige_mod,  ONLY : fonte_neige, run_off_lic
44#endif   
45    USE cpl_mod,          ONLY : cpl_send_landice_fields
46    USE calcul_fluxs_mod
47    USE phys_output_var_mod
48#ifdef CPP_SISVAT
49    USE surf_sisvat_mod,  ONLY : surf_sisvat
50#endif
51    USE indice_sol_mod
52
53!    INCLUDE "indicesol.h"
54    INCLUDE "dimsoil.h"
55    INCLUDE "YOMCST.h"
56    INCLUDE "clesphys.h"
57
58! Input variables
59!****************************************************************************************
60    INTEGER, INTENT(IN)                           :: itime, knon
61    INTEGER, DIMENSION(klon), INTENT(in)          :: knindex
62    REAL, INTENT(in)                              :: dtime
63    REAL, DIMENSION(klon), INTENT(IN)             :: swnet ! net shortwave radiance
64    REAL, DIMENSION(klon), INTENT(IN)             :: lwnet ! net longwave radiance
65    REAL, DIMENSION(klon), INTENT(IN)             :: tsurf
66    REAL, DIMENSION(klon), INTENT(IN)             :: p1lay
67    REAL, DIMENSION(klon), INTENT(IN)             :: cdragh, cdragm
68    REAL, DIMENSION(klon), INTENT(IN)             :: precip_rain, precip_snow
69    REAL, DIMENSION(klon), INTENT(IN)             :: temp_air, spechum
70    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefH, AcoefQ
71    REAL, DIMENSION(klon), INTENT(IN)             :: BcoefH, BcoefQ
72    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefU, AcoefV, BcoefU, BcoefV
73    REAL, DIMENSION(klon), INTENT(IN)             :: ps
74    REAL, DIMENSION(klon), INTENT(IN)             :: u1, v1, gustiness
75    REAL, DIMENSION(klon), INTENT(IN)             :: rugoro
76    REAL, DIMENSION(klon,nbsrf), INTENT(IN)       :: pctsrf
77#ifdef ISO
78    REAL, DIMENSION(ntraciso,klon), INTENT(IN)        :: xtprecip_rain, xtprecip_snow
79    REAL, DIMENSION(ntraciso,klon), INTENT(IN)        :: xtspechum
80#endif   
81!! temporaire pour test
82!    REAL, DIMENSION(ntraciso,klon)        :: xtprecip_rain, xtprecip_snow
83!    REAL, DIMENSION(ntraciso,klon)        :: xtspechum   
84
85    LOGICAL,  INTENT(IN)                          :: debut   !true if first step
86    LOGICAL,  INTENT(IN)                          :: lafin   !true if last step
87    REAL, DIMENSION(klon), INTENT(IN)             :: rlon, rlat
88    REAL, DIMENSION(klon), INTENT(IN)             :: rmu0
89    REAL, DIMENSION(klon), INTENT(IN)             :: lwdownm !ylwdown
90    REAL, DIMENSION(klon), INTENT(IN)             :: albedo  !mean albedo
91    REAL, DIMENSION(klon), INTENT(IN)             :: pphi1   
92    REAL, DIMENSION(klon), INTENT(IN)             :: slope   !mean slope in grid box 
93    REAL, DIMENSION(klon), INTENT(IN)             :: cloudf  !total cloud fraction
94
95! In/Output variables
96!****************************************************************************************
97    REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsol
98    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
99    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
100#ifdef ISO
101    REAL, DIMENSION(niso,klon), INTENT(INOUT)          :: xtsnow, xtsol
102    REAL, DIMENSION(niso,klon), INTENT(INOUT)        :: Rland_ice
103#endif
104!    ! temporaire pour test
105!    REAL, DIMENSION(niso,klon)          :: xtsnow, xtsol
106!    REAL, DIMENSION(niso,klon)        :: Rland_ice
107
108! Output variables
109!****************************************************************************************
110    REAL, DIMENSION(klon), INTENT(OUT)            :: qsurf
111    REAL, DIMENSION(klon), INTENT(OUT)            :: z0m, z0h
112!albedo SB >>>
113!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb1  ! new albedo in visible SW interval
114!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb2  ! new albedo in near IR interval
115    REAL, DIMENSION(6), INTENT(IN)              ::SFRWL
116    REAL, DIMENSION(klon,nsw), INTENT(OUT)        ::alb_dir,alb_dif
117!albedo SB <<<
118    REAL, DIMENSION(klon), INTENT(OUT)            :: evap, fluxsens, fluxlat
119    REAL, DIMENSION(klon), INTENT(OUT)            :: tsurf_new
120    REAL, DIMENSION(klon), INTENT(OUT)            :: dflux_s, dflux_l     
121    REAL, DIMENSION(klon), INTENT(OUT)            :: flux_u1, flux_v1
122
123    REAL, DIMENSION(klon), INTENT(OUT)           :: alb3
124    REAL, DIMENSION(klon), INTENT(OUT)           :: qsnow   !column water in snow [kg/m2]
125    REAL, DIMENSION(klon), INTENT(OUT)           :: snowhgt !Snow height (m)
126    REAL, DIMENSION(klon), INTENT(OUT)           :: to_ice
127    REAL, DIMENSION(klon), INTENT(OUT)           :: sissnow
128    REAL, DIMENSION(klon), INTENT(OUT)           :: runoff  !Land ice runoff
129#ifdef ISO
130    REAL, DIMENSION(ntraciso,klon), INTENT(OUT)        :: xtevap     
131!    real, DIMENSION(niso,klon) :: xtrun_off_lic_0_diag ! est une variable globale de
132!    fonte_neige
133#endif
134 
135
136! Local variables
137!****************************************************************************************
138    REAL, DIMENSION(klon)    :: soilcap, soilflux
139    REAL, DIMENSION(klon)    :: cal, beta, dif_grnd
140    REAL, DIMENSION(klon)    :: zfra, alb_neig
141    REAL, DIMENSION(klon)    :: radsol
142    REAL, DIMENSION(klon)    :: u0, v0, u1_lay, v1_lay
143    INTEGER                  :: i,j
144#ifdef ISO       
145      real, parameter :: t_coup = 273.15
146      real, dimension(klon) :: fqfonte_diag
147      real, dimension(klon) :: fq_fonte_diag
148      real, dimension(klon) ::  snow_evap_diag
149      real, dimension(klon) ::  fqcalving_diag
150      real max_eau_sol_diag 
151      real, dimension(klon) ::  runoff_diag
152      real, dimension(klon) ::    run_off_lic_diag
153      real ::  coeff_rel_diag
154      integer ixt
155      REAL, DIMENSION(niso,klon) :: xtsnow_prec,xtsol_prec
156      REAL, DIMENSION(klon) :: snow_prec,qsol_prec
157!      real, DIMENSION(klon) :: run_off_lic_0_diag
158#endif
159!#ifdef ISO 
160
161    REAL, DIMENSION(klon)    :: emis_new                  !Emissivity
162    REAL, DIMENSION(klon)    :: swdown,lwdown
163    REAL, DIMENSION(klon)    :: precip_snow_adv, snow_adv !Snow Drift precip./advection
164    REAL, DIMENSION(klon)    :: bl_height, wind_velo      !height boundary layer, wind spd
165    REAL, DIMENSION(klon)    :: dens_air,  snow_cont_air  !air density; snow content air
166    REAL, DIMENSION(klon)    :: alb_soil                  !albedo of underlying ice
167    REAL, DIMENSION(klon)    :: pexner                    !Exner potential
168    REAL                     :: pref
169    REAL, DIMENSION(klon,nsoilmx) :: tsoil0 !modfi
170
171    CHARACTER (len = 20)                      :: modname = 'surf_landice'
172    CHARACTER (len = 80)                      :: abort_message
173
174!albedo SB >>>
175    real,dimension(klon) :: alb1,alb2
176!albedo SB <<<
177
178! End definition
179!****************************************************************************************
180#ifdef ISO
181#ifdef ISOVERIF
182!     write(*,*) 'surf_land_ice 1499'   
183     do i=1,knon
184        if (iso_eau.gt.0) then
185             call iso_verif_egalite_choix(xtsnow(iso_eau,i),snow(i), &
186    &            'surf_land_ice 126',errmax,errmaxrel)
187        endif !if (iso_eau.gt.0) then     
188      enddo !do i=1,knon 
189#endif
190#endif
191!
192! Initialize output variables
193    alb3(:) = 999999.
194    alb2(:) = 999999.
195    alb1(:) = 999999.
196   
197    runoff(:) = 0.
198!****************************************************************************************
199! Calculate total absorbed radiance at surface
200!
201!****************************************************************************************
202    radsol(:) = 0.0
203    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
204
205!****************************************************************************************
206!   ok_snow = TRUE  : prepare and call SISVAT snow model
207!   ok_snow = FALSE : soil_model, calcul_flux, fonte_neige, ...
208!
209!****************************************************************************************
210    IF (ok_snow) THEN
211#ifdef CPP_SISVAT
212       ! Prepare for calling SISVAT
213       
214       ! Calculate incoming flux for SW and LW interval: swdown, lwdown
215       swdown(:)        = 0.0
216       lwdown(:)        = 0.0
217       DO i = 1, knon
218          swdown(i)        = swnet(i)/(1-albedo(i))
219          lwdown(i)        = lwdownm(i)
220       END DO
221       
222       ! Set constants and compute some input for SISVAT
223       snow_adv(:)      = 0.                          ! no snow blown in for now
224       snow_cont_air(:) = 0.       
225       alb_soil(:)      = albedo(:)
226       pref             = 100000.                     ! = 1000 hPa
227       DO i = 1, knon
228          wind_velo(i)     = u1(i)**2 + v1(i)**2
229          wind_velo(i)     = wind_velo(i)**0.5
230          pexner(i)        = (p1lay(i)/pref)**(RD/RCPD)
231          dens_air(i)      = p1lay(i)/RD/temp_air(i)  ! dry air density
232          bl_height(i)     = pphi1(i)/RG             
233       END DO
234
235!****************************************************************************************
236! CALL to SISVAT interface
237!
238!****************************************************************************************
239       ! config: compute everything with SV but temperatures afterwards with soil/calculfluxs
240       DO i = 1, knon
241          tsoil0(i,:)=tsoil(i,:)
242       END DO
243           ! Martin
244           PRINT*, 'on appelle surf_sisvat'
245           ! Martin
246       CALL surf_sisvat(knon, rlon, rlat, knindex, itime, dtime, debut, lafin, &
247            rmu0, swdown, lwdown, pexner, ps, p1lay, &
248            precip_rain, precip_snow, precip_snow_adv, snow_adv, &
249            bl_height, wind_velo, temp_air, dens_air, spechum, tsurf, &
250            rugoro, snow_cont_air, alb_soil, slope, cloudf, &
251            radsol, qsol, tsoil0, snow, snowhgt, qsnow, to_ice,sissnow, agesno, &
252            AcoefH, AcoefQ, BcoefH, BcoefQ, cdragh, &
253            run_off_lic, evap, fluxsens, fluxlat, dflux_s, dflux_l, &       
254            tsurf_new, alb1, alb2, alb3, &
255            emis_new, z0m, qsurf)
256       z0h(1:knon)=z0m(1:knon) ! en attendant mieux
257       
258       ! Suppose zero surface speed
259       u0(:)            = 0.0
260       v0(:)            = 0.0
261       ! The calculation of heat/water fluxes, otherwise done by "CALL calcul_fluxs" is
262       ! integrated in SISVAT, using the same method. It can be found in "sisvat.f", in the
263       ! subroutine "SISVAT_TS2".
264       ! u0, v0=0., dif_grnd=0. and beta=1 are assumed there!
265       
266       CALL calcul_flux_wind(knon, dtime, &
267            u0, v0, u1, v1, gustiness, cdragm, &
268            AcoefU, AcoefV, BcoefU, BcoefV, &
269            p1lay, temp_air, &
270            flux_u1, flux_v1)
271#else
272       abort_message='Pb de coherence: ok_snow = .true. mais CPP_SISVAT = .false.'
273       CALL abort_physic(modname,abort_message,1)
274#endif
275#ifdef ISO
276       abort_message='surf_landice 267: isotopes pas prevus ici'
277       CALL abort_physic(modname,abort_message,1)
278#endif
279    ELSE ! ok_snow=FALSE
280
281!****************************************************************************************
282! Soil calculations
283!
284!****************************************************************************************
285    IF (soil_model) THEN
286       CALL soil(dtime, is_lic, knon, snow, tsurf, tsoil, soilcap, soilflux)
287       cal(1:knon) = RCPD / soilcap(1:knon)
288       radsol(1:knon)  = radsol(1:knon) + soilflux(1:knon)
289    ELSE
290       cal = RCPD * calice
291       WHERE (snow > 0.0) cal = RCPD * calsno
292    ENDIF
293
294
295!****************************************************************************************
296! Calulate fluxes
297!
298!****************************************************************************************
299    beta(:) = 1.0
300    dif_grnd(:) = 0.0
301
302! Suppose zero surface speed
303    u0(:)=0.0
304    v0(:)=0.0
305    u1_lay(:) = u1(:) - u0(:)
306    v1_lay(:) = v1(:) - v0(:)
307
308    CALL calcul_fluxs(knon, is_lic, dtime, &
309         tsurf, p1lay, cal, beta, cdragh, cdragh, ps, &
310         precip_rain, precip_snow, snow, qsurf,  &
311         radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, gustiness, &
312         1.,AcoefH, AcoefQ, BcoefH, BcoefQ, &
313         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
314
315#ifdef ISO
316   ! verif
317#ifdef ISOVERIF
318     write(*,*) 'surf_land_ice 1499'   
319     do i=1,knon
320       if (iso_eau.gt.0) then
321           if (snow(i).gt.ridicule) then
322             call iso_verif_egalite_choix(xtsnow(iso_eau,i),snow(i), &
323    &            'surf_land_ice 1151',errmax,errmaxrel)
324            endif !if ((snow(i).gt.ridicule)) then
325        endif !if (iso_eau.gt.0) then     
326      enddo !do i=1,knon 
327#endif
328!#ifdef ISOVERIF
329
330    do i=1,knon
331      snow_prec(i)=snow(i)
332      do ixt=1,niso
333      xtsnow_prec(ixt,i)=xtsnow(ixt,i)
334      enddo !do ixt=1,niso
335      ! initialisation:
336      fq_fonte_diag(i)=0.0
337      fqfonte_diag(i)=0.0
338      snow_evap_diag(i)=0.0
339    enddo !do i=1,knon
340#endif         
341!#ifdef ISO
342
343    CALL calcul_flux_wind(knon, dtime, &
344         u0, v0, u1, v1, gustiness, cdragm, &
345         AcoefU, AcoefV, BcoefU, BcoefV, &
346         p1lay, temp_air, &
347         flux_u1, flux_v1)
348
349!****************************************************************************************
350! Calculate snow height, age, run-off,..
351!   
352!****************************************************************************************
353    CALL fonte_neige( knon, is_lic, knindex, dtime, &
354         tsurf, precip_rain, precip_snow, &
355         snow, qsol, tsurf_new, evap &
356#ifdef ISO   
357     & ,fq_fonte_diag,fqfonte_diag,snow_evap_diag,fqcalving_diag   &
358     & ,max_eau_sol_diag,runoff_diag,run_off_lic_diag,coeff_rel_diag   &
359#endif
360     &   )
361
362
363#ifdef ISO
364#ifdef ISOVERIF
365      do i=1,knon 
366       if (iso_eau.gt.0) then 
367          call iso_verif_egalite_choix(Rland_ice(iso_eau,i),1.0, &
368     &         'surf_landice_mod 217',errmax,errmaxrel)
369       endif !if (iso_eau.gt.0) then   
370      enddo !do i=1,knon 
371#endif
372!#ifdef ISOVERIF
373
374       call calcul_iso_surf_lic_vectall(klon,knon, &
375     &           evap,snow_evap_diag,Tsurf_new,snow, &
376     &           fq_fonte_diag,fqfonte_diag,dtime,t_coup, &
377     &           precip_snow,xtprecip_snow,precip_rain,xtprecip_rain, snow_prec,xtsnow_prec, &
378     &           xtspechum,spechum,ps,Rland_ice, &
379     &           xtevap,xtsnow,fqcalving_diag, &
380     &           knindex,is_lic,run_off_lic_diag,coeff_rel_diag &
381     &  )
382
383!        call fonte_neige_export_xtrun_off_lic_0(knon,xtrun_off_lic_0_diag)
384
385#endif
386!#ifdef ISO
387
388!****************************************************************************************
389! Calculate albedo
390!
391!****************************************************************************************
392    CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 
393    WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0.
394    zfra(1:knon) = MAX(0.0,MIN(1.0,snow(1:knon)/(snow(1:knon)+10.0)))
395    alb1(1:knon) = alb_neig(1:knon)*zfra(1:knon) + &
396         0.6 * (1.0-zfra(1:knon))
397!
398!IM: plusieurs choix/tests sur l'albedo des "glaciers continentaux"
399!       alb1(1 : knon)  = 0.6 !IM cf FH/GK
400!       alb1(1 : knon)  = 0.82
401!       alb1(1 : knon)  = 0.77 !211003 Ksta0.77
402!       alb1(1 : knon)  = 0.8 !KstaTER0.8 & LMD_ARMIP5
403!IM: KstaTER0.77 & LMD_ARMIP6   
404
405! Attantion: alb1 and alb2 are the same!
406    alb1(1:knon)  = 0.77
407    alb2(1:knon)  = alb1(1:knon)
408
409
410!****************************************************************************************
411! Rugosity
412!
413!****************************************************************************************
414    z0m=1.e-3
415    z0h = z0m
416    z0m = SQRT(z0m**2+rugoro**2)
417
418    END IF ! ok_snow
419
420
421!****************************************************************************************
422! Send run-off on land-ice to coupler if coupled ocean.
423! run_off_lic has been calculated in fonte_neige or surf_sisvat
424!
425!****************************************************************************************
426    IF (type_ocean=='couple') THEN
427       CALL cpl_send_landice_fields(itime, knon, knindex, run_off_lic)
428    ENDIF
429
430 ! transfer runoff rate [kg/m2/s](!) to physiq for output
431    runoff(1:knon)=run_off_lic(1:knon)/dtime
432
433 
434!****************************************************************************************
435       snow_o=0.
436       zfra_o = 0.
437       DO j = 1, knon
438           i = knindex(j)
439           snow_o(i) = snow(j)
440           zfra_o(i) = zfra(j)
441       ENDDO
442
443!****************************************************************************************
444       snow_o=0.
445       zfra_o = 0.
446       DO j = 1, knon
447           i = knindex(j)
448           snow_o(i) = snow(j)
449           zfra_o(i) = zfra(j)
450       ENDDO
451
452
453!albedo SB >>>
454     select case(NSW)
455     case(2)
456       alb_dir(1:knon,1)=alb1(1:knon)
457       alb_dir(1:knon,2)=alb2(1:knon)
458     case(4)
459       alb_dir(1:knon,1)=alb1(1:knon)
460       alb_dir(1:knon,2)=alb2(1:knon)
461       alb_dir(1:knon,3)=alb2(1:knon)
462       alb_dir(1:knon,4)=alb2(1:knon)
463     case(6)
464       alb_dir(1:knon,1)=alb1(1:knon)
465       alb_dir(1:knon,2)=alb1(1:knon)
466       alb_dir(1:knon,3)=alb1(1:knon)
467       alb_dir(1:knon,4)=alb2(1:knon)
468       alb_dir(1:knon,5)=alb2(1:knon)
469       alb_dir(1:knon,6)=alb2(1:knon)
470     end select
471alb_dif=alb_dir
472!albedo SB <<<
473
474
475
476
477  END SUBROUTINE surf_landice
478!
479!****************************************************************************************
480!
481END MODULE surf_landice_mod
482
483
484
Note: See TracBrowser for help on using the repository browser.