source: trunk/SOURCES/ablation_month_lapsecouche.f90 @ 25

Last change on this file since 25 was 4, checked in by dumas, 10 years ago

initial import GRISLI trunk

File size: 8.7 KB
Line 
1module ablation_month_lapsecouche
2
3use declare_month_lapsecouche
4use printtable
5
6implicit none
7
8! parametres pour le bilan de masse
9
10real,dimension(nx,ny) :: snow, melt
11real                  :: frac, frac_min, frac_tot
12integer               :: meth_abl_vi
13! dimensionnements locaux
14real ::  dtp                   ! integrating step for positive degree days (degrees)
15real ::  pddct                 ! ct for PDD calculation
16real ::  py                    ! ct for PDD calculation
17real ::  s22                   ! ct for PDD calculation
18real ::  nyear                 ! number of months in 1 year, st. dev. for temp *)
19
20! parametres qui seront lus dans le fichier param
21
22real ::  sigma                 ! variabilite Tday
23real ::  CSI                   ! proportion of melted water that can refreeze *)
24real ::  Cice                  ! melting factors for ice
25real ::  Csnow                 ! melting factors for snow
26
27!!$! aurel (greeneem) : pour comparer les deux approches de calcul de pdd ->
28!!$real,dimension(nx,ny) :: pddann
29!!$real,dimension(nx,ny) :: bmann
30
31
32contains
33!--------------------------------------------------------------------------------
34subroutine init_ablation
35
36namelist/ablation_month/Cice,Csnow,csi,sigma
37
38! lecture des parametres
39
40rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
41read(num_param,ablation_month)
42
43write(num_rep_42,*)'!___________________________________________________________'
44write(num_rep_42,*)'!              ablation_month     PDD base Tann et Tjuly'
45write(num_rep_42,ablation_month)                   ! pour ecrire les parametres lus
46write(num_rep_42,*)
47write(num_rep_42,*)
48write(num_rep_42,*)'! Cice and Csnow, melting factors for ice and snow '
49write(num_rep_42,*)'! sigma variabilite Tday'
50write(num_rep_42,*)'! csi proportion of melted water that can refreeze '
51
52! attribution des parametres lies a la methode de calcul
53dtp=2.0
54nyear=12
55s22=0.5/sigma/sigma
56py=2*pi/nyear
57pddct=dtp/sigma/sqrt(2.*pi)/nyear*365.
58
59end subroutine init_ablation
60
61!-------------------------------------------------------
62
63subroutine ablation
64
65if (itracebug.eq.1) write(num_tracebug,*)' passage dans ablation_month'
66
67!------ Mass balance options
68
69        meth_abl_vi=1    ! pdd Reeh
70        !meth_abl_vi=2    ! Parametrization Thompson and Pollard 1997
71
72
73
74! Calcul du PDD
75!----------------------------
76do i=1,nx
77   do j=1,ny
78        summ=0.0
79
80! On a deja calcule Tm_surf(i,j,m) : temperature moyenne de chaque mois
81
82        month: do mo=1,mois                    ! boucle sur les mois
83
84            temp=0.0                             ! variable d'integration
85            average_day: do k=1,50               ! pdd d'un jour par mois
86               if (temp.gt.tm_surf(i,j,mo)+2.5*sigma) goto 209
87
88               summ=summ+temp* &
89                    exp(-((temp-tm_surf(i,j,mo))*(temp-tm_surf(i,j,mo)))*s22)
90               
91               temp=temp+dtp                   ! pdtp pas d'integration
92
93            end do average_day
94
95209         continue
96
97        end do month                             !  boucle sur le mois
98
99        pdd(i,j)=summ*pddct                      ! pdd pour toute l'annee
100
101  end do
102end do
103debug_3d(:,:,58)=pdd(:,:)   
104
105!!$
106!!$!_____________________________________________________________
107!!$!
108!!$! aurel : je rajoute un calcul de PDD avec Tann et Tjuly pour comparer les deux approches
109!!$! positive degree day
110!!$do j=1,ny
111!!$   do i=1,nx
112!!$        summ=0.0
113!!$        do nday=1,nyear   
114!!$           tt(nday)=tann_par(i,j)+(tjuly_par(i,j)-tann_par(i,j))*cos(py*nday)
115!!$           temp=0.0
116!!$           do k=1,50
117!!$              if (temp.gt.tt(nday)+2.5*sigma) goto 205
118!!$              summ=summ+temp*exp(-(temp-tt(nday))*(temp-tt(nday))*s22)
119!!$              temp=temp+dtp
120!!$           end do
121!!$205        continue
122!!$        end do
123!!$        pddann(i,j)=summ*pddct
124!!$     end do
125!!$  end do
126!!$
127!!$!sorties debug3d
128!!$debug_3d(:,:,43)=pdd(:,:)     
129!!$debug_3d(:,:,44)=pdd(:,:)-pddann(:,:)
130
131
132!-----------------------
133
134! calcul du bilan de masse :
135!
136
137do i=1,nx
138   do j=1,ny
139
140!        Positive degrees required to melt the snow layer
141!
142     snow(i,j)=precip(i,j)           ! voir routine accum_month
143
144     pds=snow(i,j)/Csnow             ! nombre de pdd pour fondre cette neige
145
146     simax=snow(i,j)*csi             ! csi defini dans initial-phy-2.F90 (0.6)
147                                      ! simax : Maximum amount of super. ice that can be formed
148
149     pdsi=simax/cice                 ! Pos. degrees required to melt the superimposed ice
150
151
152
153!-------- Ablation et Bilan de masse Reeh (1991)
154!-----------------------------------------------------------------
155
156     if (meth_abl_vi==1) then
157
158! aurel 11/09 on rajoute l'impact du regel sur la temperature de surface.
159        if (pdd(i,j).le.csi*pds) then
160           sif=pdd(i,j)*csnow
161        else
162           sif=simax 
163        endif
164!     impact of refreesing on surface temperature
165        ts(i,j)=(tann(i,j)+26.6*sif)
166        ts(i,j)=min(0.0,ts(i,j))
167        tshelf(i,j)=ts(i,j)
168
169
170           ! if pdd*csnow < thickness of melted snow that refreze: no ablation
171           if (pdd(i,j).le.csi*pds) &
172              bm(i,j)=acc(i,j)                                  ! toute la neige fondue regele
173
174           ! if melted snow that refreze < pdd*csnow < snow
175           if ((csi*pds.lt.pdd(i,j)).and.(pdd(i,j).le.pds))  &
176              bm(i,j)=acc(i,j)+simax-pdd(i,j)*csnow             ! simax regel, le reste s'en va
177
178           ! if snow < pdd*csnow <snow (pds) + surimposed ice (pdsi)
179           if ((pds.lt.pdd(i,j)).and.(pdd(i,j).le.pds+pdsi)) &
180              bm(i,j)=simax-(pdd(i,j)-pds)*cice                 ! attaque la glace de regele
181
182           ! melting of old ice bm<0 with the remaining pdd
183           if (pds+pdsi.le.pdd(i,j)) &
184              bm(i,j)=(pds+pdsi-pdd(i,j))*cice                  ! attaque la vieille glace
185
186
187           abl(i,j) = acc(i,j) - bm(i,j)                        ! Ablation
188           frac=0.6
189
190
191!-------- Energy surface mass balance (Thompson and Pollard 1997)
192!----------------------------------------------------------------
193
194    else if (meth_abl_vi==2) then               ! abla vince 2006
195
196! aurel 11/09 on rajoute l'impact du regel sur la temperature de surface.
197        if (pdd(i,j).le.csi*pds) then
198           sif=pdd(i,j)*csnow
199        else
200           sif=simax 
201        endif
202!     impact of refreesing on surface temperature
203        ts(i,j)=(tann(i,j)+26.6*sif)
204        ts(i,j)=min(0.0,ts(i,j))
205        tshelf(i,j)=ts(i,j)
206
207        melt(i,j)=pdd(i,j)*Csnow
208        melt(i,j)=min(snow(i,j),melt(i,j))
209
210!----- refreezing fraction of precipiations (liquid and solid)
211
212        if (snow(i,j)==0.) then
213           frac=1
214        else
215           frac=1-((melt(i,j)/snow(i,j))-.7)/.3
216           frac_min=min(1.,frac)
217           frac_tot=max(0.,frac_min)
218
219        endif
220
221!------ Ablation
222
223        if (frac_tot.lt.1.) then
224           abl(i,j)= frac_tot*melt(i,j)
225
226           if (pdd(i,j).gt.pds ) then   ! enough pdd to totaly melt the snow
227
228              melt(i,j) = melt(i,j)+(pdd(i,j)-pds)*cice
229              abl(i,j)  = abl(i,j)+(pdd(i,j)-pds)*cice
230
231           endif
232
233        else
234           abl(i,j)=melt(i,j)
235        endif
236
237!------ Accumulation and mass balance
238
239    acc(i,j)=snow(i,j)
240
241       if (frac_tot.lt.1. .and. frac_tot.gt.0.) then
242          acc(i,j)= acc(i,j) + (precip(i,j)-snow(i,j))
243          !acc(i,j)= acc(i,j) + (precip(i,j)*48-precip(i,j))*(1-frac_tot)  ! voir la routine accum_month
244       endif
245
246    bm(i,j) = acc(i,j) - abl(i,j)
247
248    endif
249
250  end do
251end do
252
253!!$!_____________________________________________________________
254!!$!
255!!$! aurel : je rajoute un calcul de bm avec Tann et Tjuly pour comparer les deux approches
256!!$do j=1,ny
257!!$   do i=1,nx
258!!$      pds=acc(i,j)/csnow        !  positive degrees required to melt the snow laye
259!!$      simax=acc(i,j)*csi        !  maximum amount of super. ice that can be formed
260!!$      pdsi=simax/cice           !  pos. degrees required to melt the superimposed ice
261!!$      if (pddann(i,j).le.csi*pds) then
262!!$         sif=pddann(i,j)*csnow
263!!$      else
264!!$         sif=simax
265!!$      endif
266!!$!      mass balance
267!!$        if (pddann(i,j).le.csi*pds)  bmann(i,j)=acc(i,j)
268!!$        if ((csi*pds.lt.pddann(i,j)).and.(pddann(i,j).le.pds))       &
269!!$             bmann(i,j)=acc(i,j)+simax-pddann(i,j)*csnow
270!!$        if ((pds.lt.pddann(i,j)).and.(pddann(i,j).le.pds+pdsi))      &
271!!$             bmann(i,j)=simax-(pddann(i,j)-pds)*cice
272!!$        if (pds+pdsi.le.pddann(i,j))   bmann(i,j)=(pds+pdsi-pddann(i,j))*cice
273!!$     end do
274!!$  end do
275!!$! sortie debug
276!!$debug_3d(:,:,45)=bm(:,:)-bmann(:,:)
277
278
279!!$!aurel : pour experience de calibration : je force avec les donnees de bilan de masse MAR
280!!$do j=1,ny
281!!$   do i=1,nx
282!!$      bm(i,j)=sum(bm_mar(i,j,:))/12
283!!$   end do
284!!$end do
285
286
287end subroutine ablation
288
289end module ablation_month_lapsecouche
Note: See TracBrowser for help on using the repository browser.