source: branches/iLoveclim/SOURCES/bilan_eau_mod.f90 @ 254

Last change on this file since 254 was 254, checked in by aquiquet, 5 years ago

Grisli-iloveclim branch merged to trunk at revision 253 + some corrections for water conservation

File size: 5.9 KB
Line 
1!> \file bilan_eau.f90
2!! Clacul du bilan d'eau sur la calotte
3!<
4     
5
6!> MODULE: bilan_eau
7!! Calcule le bilan d'eau sur la grille GRISLI
8!! \author C. Dumas
9!! \date 20/02/2017
10!! @note Permet de vérifier que le bilan d'eau est ok et qu'il n'y a pas de fuite.
11!>
12
13! bilan d'eau :
14! ce qui tombe : Acc
15! ce qui sort : Bmelt, Abl, calving, ablbord
16! ce qui est stocké : masse de glace
17! le total de tous ces termes doit être constant (sur la grille, pas localement)
18
19module bilan_eau_mod
20
21
22use module3D_phy
23implicit none
24
25real :: sum_H
26
27
28real,dimension(nx,ny) :: tot_water    !< bilan d'eau
29real,dimension(nx,ny) :: H_beau_old, diff_H_2D, diff_H_water_bilan
30real,dimension(nx,ny) :: Bm_dtt       !< mass balance on ice points accumulated during dtt
31real,dimension(nx,ny) :: Bmelt_dtt    !< basal melting on ice points accumulated during dtt
32real,dimension(nx,ny) :: calv_dtt     !< calving sur dtt (pour calcul bilan d'eau)
33real,dimension(nx,ny) :: archimtab    ! point pose si > 0
34real,dimension(nx,ny) :: grline_dtt   ! grounding line flux during dtt
35
36real :: sum_H_old
37real :: diff_H
38real :: alpha_flot                      ! ro/row
39
40real,dimension(nx,ny) :: bm_dt,bmelt_dt
41
42
43contains
44
45subroutine init_bilan_eau
46 ! initialisation des variables
47        diff_H=0.
48        sum_H_old = sum(H(2:nx-1,2:ny-1),mask=ice(2:nx-1,2:ny-1)==1)
49        H_beau_old(:,:)=H(:,:)
50        tot_water(:,:)=0.
51        bm_dt(:,:)=0.
52        bmelt_dt(:,:)=0.
53        alpha_flot=ro/row
54        archimtab(:,:) = Bsoc(:,:)+H(:,:)*alpha_flot - sealevel_2d(:,:)
55        gr_line(:,:)=0
56        do j=1,ny
57           do i=1,nx
58              !afq    if ((H(i,j).gt.0.).and.(archimtab(i,j).GE.0.).and.(Bsoc(i,j).LE.sealevel_2d(i,j))) then ! grounded with ice
59              if ((H(i,j).gt.0.).and.(archimtab(i,j).GE.0.)) then ! grounded with ice
60                 if (archimtab(i-1,j).LT.0..and.Uxbar(i,j).LT.0..and..not.flot_marais(i-1,j)) gr_line(i,j)=1
61                 if (archimtab(i+1,j).LT.0..and.Uxbar(i+1,j).GT.0..and..not.flot_marais(i+1,j)) gr_line(i,j)=1
62                 if (archimtab(i,j-1).LT.0..and.Uybar(i,j).LT.0..and..not.flot_marais(i,j-1)) gr_line(i,j)=1
63                 if (archimtab(i,j+1).LT.0..and.Uybar(i,j+1).GT.0..and..not.flot_marais(i,j+1)) gr_line(i,j)=1
64              endif
65           enddo
66        enddo
67
68! iLOVECLIM initialisation of water conservation related variables
69  trendWAC=0.
70  smbWAC(:,:)=0.
71  bmeltWAC(:,:)=0.
72  calvingWAC(:,:)=0.
73end subroutine init_bilan_eau
74
75
76
77
78subroutine bilan_eau
79
80tot_water(:,:)=0.
81
82bm_dt(:,:)=0.
83bmelt_dt(:,:)=0.
84
85bm_dt(2:nx-1,2:ny-1)=bm(2:nx-1,2:ny-1)*dt
86bmelt_dt(2:nx-1,2:ny-1)=bmelt(2:nx-1,2:ny-1)*dt
87!~ where (Bm(:,:).lt.0.)
88!~      bm_dt(:,:)=max(Bm(:,:)*dt,-H(:,:))
89!~ elsewhere
90!~      bm_dt(:,:)=bm(:,:)*dt
91!~ endwhere
92
93!~ where (Bmelt(:,:).lt.0.)
94!~      bmelt_dt(:,:)=max(Bmelt(:,:)*dt,-H(:,:))
95!~ elsewhere
96!~      bmelt_dt(:,:)=bmelt(:,:)*dt
97!~ endwhere
98
99
100! on fait la somme sur la grille en excluant les bords :
101
102sum_H = sum(H(2:nx-1,2:ny-1),mask=ice(2:nx-1,2:ny-1)==1)
103
104diff_H = diff_H + (sum_H - sum_H_old) ! on calcul la variation de volume a chaque dt
105
106diff_H_2D(2:nx-1,2:ny-1)=H(2:nx-1,2:ny-1)-H_beau_old(2:nx-1,2:ny-1)
107
108where (ice(2:nx-1,2:ny-1).eq.1)
109        Bm_dtt(2:nx-1,2:ny-1) = Bm_dtt(2:nx-1,2:ny-1) + Bm_dt(2:nx-1,2:ny-1) !* dt ! somme Bm sur dt
110        bmelt_dtt(2:nx-1,2:ny-1) = bmelt_dtt(2:nx-1,2:ny-1) + bmelt_dt(2:nx-1,2:ny-1) ! * dt ! somme bmelt sur dt
111endwhere
112
113archimtab(:,:) = Bsoc(:,:)+H(:,:)*alpha_flot - sealevel_2d(:,:)
114gr_line(:,:)=0
115do j=1,ny
116  do i=1,nx
117     !afq    if ((H(i,j).gt.0.).and.(archimtab(i,j).GE.0.).and.(Bsoc(i,j).LE.sealevel_2d(i,j))) then ! grounded with ice
118     if ((H(i,j).gt.0.).and.(archimtab(i,j).GE.0.)) then ! grounded with ice
119      if (archimtab(i-1,j).LT.0..and.Uxbar(i,j).LT.0..and..not.flot_marais(i-1,j)) gr_line(i,j)=1
120      if (archimtab(i+1,j).LT.0..and.Uxbar(i+1,j).GT.0..and..not.flot_marais(i+1,j)) gr_line(i,j)=1
121      if (archimtab(i,j-1).LT.0..and.Uybar(i,j).LT.0..and..not.flot_marais(i,j-1)) gr_line(i,j)=1
122      if (archimtab(i,j+1).LT.0..and.Uybar(i,j+1).GT.0..and..not.flot_marais(i,j+1)) gr_line(i,j)=1
123    endif
124  enddo
125enddo
126
127where (gr_line(:,:).eq.1)
128!~   grline_dtt(:,:)= (((uxbar(:,:)+eoshift(uxbar(:,:),shift=1,boundary=0.,dim=1))**2+ &
129!~                     (uybar(:,:)+eoshift(uybar(:,:),shift=1,boundary=0.,dim=2))**2)**0.5)*0.5 &
130!~                     *H(:,:) + grline_dtt(:,:)
131   grline_dtt(:,:)= - sqrt(                                                                        &
132                           ( (uxbar(:,:)+eoshift(uxbar(:,:),shift=1,boundary=0.,dim=1))*dy/2. )**2 +  &
133                           ( (uybar(:,:)+eoshift(uybar(:,:),shift=1,boundary=0.,dim=2))*dx/2. )**2 )  &
134                           * H(:,:) * dt + grline_dtt(:,:)
135endwhere
136
137
138!afq -- if (isynchro.eq.1) then
139if ((isynchro.eq.1).or.(nt.eq.1)) then
140
141! on raisonne en bilan annuel pour simplifier :
142!~      where (ice(2:nx-1,2:ny-1).eq.1)
143!~              tot_water(2:nx-1,2:ny-1) = (Bm_dtt(2:nx-1,2:ny-1) - Bmelt_dtt(2:nx-1,2:ny-1) + calv_dtt(2:nx-1,2:ny-1) - ablbord_dtt(2:nx-1,2:ny-1)) / dtt
144!~              elsewhere
145!~              tot_water(2:nx-1,2:ny-1) = (calv_dtt(2:nx-1,2:ny-1) - ablbord_dtt(2:nx-1,2:ny-1)) / dtt
146!~      endwhere
147!cdc pas besoin du test sur ice ici, il a ete fait avant (et le masque ice varie a chaque dt)   
148  tot_water(2:nx-1,2:ny-1) = (Bm_dtt(2:nx-1,2:ny-1) - Bmelt_dtt(2:nx-1,2:ny-1) + calv_dtt(2:nx-1,2:ny-1) - ablbord_dtt(2:nx-1,2:ny-1)) / dtt
149   
150! bilan d'eau sur la grille :
151        water_bilan=sum(tot_water(:,:))
152        diff_H = diff_H/dtt
153
154!999 format(f0.2,1x,e15.8,1x,i10,8(1x,e15.8))
155!       write(6,999),time,sum_H,count(ice(:,:)==1),diff_H,water_bilan,sum(calv_dtt(:,:))/dtt,sum(ablbord_dtt(:,:))/dtt,sum(bmelt_dtt(:,:),mask=ice(:,:)==1)/dtt,sum(bm(:,:),mask=ice(:,:)==1),sum(Bm_dtt(:,:))/dtt,sum(bmelt_dtt(:,:))/dtt
156        diff_H_water_bilan(2:nx-1,2:ny-1)=tot_water(2:nx-1,2:ny-1)-diff_H_2D(2:nx-1,2:ny-1)
157
158endif
159sum_H_old=sum_H
160
161H_beau_old(:,:)=H(:,:)
162
163end subroutine bilan_eau
164
165end module bilan_eau_mod
Note: See TracBrowser for help on using the repository browser.