1 | !******************************************************************** |
---|
2 | ! Module pour le calcul de l'ablation |
---|
3 | ! lecture dans le fichier param de la methode de caclul du BM a utiliser |
---|
4 | ! pdd_type : defini le type de pdd utilise |
---|
5 | ! pdd_type=0 ! pdd reeh standard |
---|
6 | ! pdd_type=1 ! pdd fausto |
---|
7 | ! pdd_type=2 ! pdd Tarasov |
---|
8 | module ablation_mod |
---|
9 | |
---|
10 | use geography, only : nx,ny |
---|
11 | |
---|
12 | implicit none |
---|
13 | integer :: pdd_type ! type de calcul du PDD utilise |
---|
14 | logical :: annual ! T = annuel, F = mensuel |
---|
15 | |
---|
16 | real :: sigma_ice ! variabilite Tday |
---|
17 | real :: Cice ! melting factors for ice |
---|
18 | real :: Csnow ! melting factors for snow |
---|
19 | real :: csi ! proportion of melted water that can refreeze *) |
---|
20 | |
---|
21 | real, dimension(nx,ny) :: Cice_2D ! melting factors for ice 2D |
---|
22 | real, dimension(nx,ny) :: Csnow_2D ! melting factors for snow 2D |
---|
23 | real, dimension(nx,ny) :: csi_2D ! proportion of melted water that can refreeze 2D |
---|
24 | REAL, dimension(nx,ny) :: sigma_ice_2D ! sigma fn altitude 2D |
---|
25 | |
---|
26 | REAL, PARAMETER :: PI_L= 3.1415926 |
---|
27 | REAL, PARAMETER :: DTP=2.0 ! integrating step for positive degree days (degrees) |
---|
28 | |
---|
29 | REAL, dimension(nx,ny) :: S22 |
---|
30 | INTEGER, PARAMETER :: NYEAR = 12, NYEAR2 = 360 ! number of months/days in 1 year, st. dev. for temp *) |
---|
31 | real, parameter :: PYG=2*PI_L/NYEAR ! ct for PDD calculation (PYG remplace PY qui existe dans CLIMBER |
---|
32 | REAL, dimension(nx,ny) :: PDDCT ! ct for PDD calculation |
---|
33 | REAL, dimension(nx,ny) :: PDDCT2 ! ct for PDD calculation |
---|
34 | integer :: methode_abl=0 ! selection methode pdd (0) ou van den Berg 2008 (1) |
---|
35 | |
---|
36 | contains |
---|
37 | |
---|
38 | |
---|
39 | subroutine init_ablation |
---|
40 | |
---|
41 | use module3d_phy,only:num_param,num_rep_42 |
---|
42 | |
---|
43 | real :: Cice, Csnow, csi |
---|
44 | |
---|
45 | ! fichiers snapshots |
---|
46 | namelist/ablation/pdd_type,annual,Cice,Csnow,csi,sigma_ice |
---|
47 | |
---|
48 | ! formats pour les ecritures dans 42 |
---|
49 | 428 format(A) |
---|
50 | rewind(num_param) ! pour revenir au debut du fichier param_list.dat |
---|
51 | read(num_param,ablation) |
---|
52 | write(num_rep_42,428)'!___________________________________________________________' |
---|
53 | write(num_rep_42,428) '&ablation ! module ablation_mod' |
---|
54 | write(num_rep_42,'(A,I2)') 'pdd_type = ',pdd_type |
---|
55 | write(num_rep_42,'(A,L7)') 'annual = ',annual |
---|
56 | write(num_rep_42,'(A,F12.6)') 'Cice = ',Cice |
---|
57 | write(num_rep_42,'(A,F12.6)') 'Csnow = ',Csnow |
---|
58 | write(num_rep_42,'(A,F12.6)') 'csi = ',csi |
---|
59 | write(num_rep_42,'(A,F12.6)') 'sigma_ice = ',sigma_ice |
---|
60 | write(num_rep_42,*)'/' |
---|
61 | write(num_rep_42,428) '! pdd_type : 0 reeh, 1 Fausto, 2 Tarasov' |
---|
62 | write(num_rep_42,428) '! annual : T = annuel, F = mensuel' |
---|
63 | write(num_rep_42,428)'! Cice and Csnow, melting factors for ice and snow ' |
---|
64 | write(num_rep_42,428)'! sigma variabilite Tday' |
---|
65 | write(num_rep_42,428)'! csi proportion of melted water that can refreeze ' |
---|
66 | write(num_rep_42,*) |
---|
67 | |
---|
68 | ! initialisation des variables 2D : |
---|
69 | Cice_2D(:,:)=Cice |
---|
70 | Csnow_2D(:,:)=Csnow |
---|
71 | csi_2D(:,:)=csi |
---|
72 | sigma_ice_2D(:,:)=sigma_ice |
---|
73 | S22=0.5/sigma_ice/sigma_ice |
---|
74 | PDDCT=DTP/sigma_ice/SQRT(2.*PI_L)/NYEAR*365. |
---|
75 | PDDCT2=DTP/sigma_ice/SQRT(2.*PI_L)/NYEAR2*365. |
---|
76 | end subroutine init_ablation |
---|
77 | |
---|
78 | subroutine ablation |
---|
79 | ! calcul de l'ablation avec methode annuelle ou mensuelle (flag dans fichier param) |
---|
80 | ! remplace l'ancienne subroutine ablation-0.2.f |
---|
81 | ! ********************************************************* |
---|
82 | ! (******** ABLATION ********) |
---|
83 | ! ********************************************************* |
---|
84 | |
---|
85 | |
---|
86 | USE module3d_phy,only:Tjuly,Tann,Tmois,acc,pdd,TS,Tshelf,precip,BM,Abl,S,dice,cl |
---|
87 | |
---|
88 | IMPLICIT NONE |
---|
89 | |
---|
90 | real, dimension(nx,ny) :: pds, simax, pdsi, sif |
---|
91 | integer :: i,j,k,mo,nday |
---|
92 | real :: summ |
---|
93 | real :: temp |
---|
94 | real,dimension(365) :: TT !< air temperature yearly cycle, for PDD |
---|
95 | !- SC- Uniquement pour pdd Tarasov |
---|
96 | REAL, DIMENSION(nx,ny) :: pr_ice_eq, snowmelt, cpsurf |
---|
97 | REAL, DIMENSION(nx,ny) :: refr2, refreezed_ice |
---|
98 | |
---|
99 | |
---|
100 | ! pour pdd fausto calcul Cice_2D, csnow_2D, csi_2D,sigma_ice_2D |
---|
101 | IF (pdd_type.eq.1) THEN |
---|
102 | WHERE (Tjuly(:,:).GE.10.) |
---|
103 | Cice_2D(:,:)=7. |
---|
104 | Csnow_2D(:,:)=3. |
---|
105 | ELSEWHERE ((-1.LE.Tjuly(:,:)).AND.(Tjuly(:,:).LT.10.)) |
---|
106 | Cice_2D(:,:)=7.+((15.-7.)/((10.+1)**3))*((10.-Tjuly(:,:))**3) |
---|
107 | Csnow_2D(:,:)=3. |
---|
108 | ELSEWHERE |
---|
109 | Cice_2D(:,:)=15. |
---|
110 | Csnow_2D(:,:)=3. |
---|
111 | ENDWHERE |
---|
112 | ! pour etre en m/an : |
---|
113 | Cice_2D(:,:)=Cice_2D(:,:)/1000. |
---|
114 | Csnow_2D(:,:)=Csnow_2D(:,:)/1000. |
---|
115 | !cdc version std |
---|
116 | sigma_ice_2D(:,:)=1.574+0.0012224*S(:,:) |
---|
117 | ! calcul de S22, PDDCT et PDDCT2 |
---|
118 | S22(:,:)=0.5/SIGMA_ICE_2D(:,:)/SIGMA_ICE_2D(:,:) |
---|
119 | PDDCT(:,:)=DTP/SIGMA_ICE_2D(:,:)/SQRT(2.*PI_L)/NYEAR*365. |
---|
120 | PDDCT2(:,:)=DTP/SIGMA_ICE_2D(:,:)/SQRT(2.*PI_L)/NYEAR2*365. |
---|
121 | |
---|
122 | ! calcul du tx de regel |
---|
123 | WHERE (S(:,:).LE.800) |
---|
124 | CSI_2D(:,:)=0. |
---|
125 | ELSEWHERE ((800.LT.S(:,:)).AND.(S(:,:).LT.2000.)) |
---|
126 | CSI_2D(:,:)=(S(:,:)-800.)*0.000833 |
---|
127 | ELSEWHERE |
---|
128 | CSI_2D(:,:)=1. |
---|
129 | ENDWHERE |
---|
130 | |
---|
131 | ELSEIF (pdd_type.EQ.2) THEN ! pdd Tarasov |
---|
132 | |
---|
133 | where (TJULY(:,:).gt.10.) |
---|
134 | Cice_2D(:,:) = 8.3*1e-3 |
---|
135 | Csnow_2D(:,:) = 4.3*1e-3 |
---|
136 | endwhere |
---|
137 | where(TJULY(:,:).gt.-1..and.TJULY(:,:).lt.10.) |
---|
138 | Cice_2D(:,:) = 1e-3*(8.3+0.0067*(10.-TJULY(:,:))**3) |
---|
139 | Csnow_2D(:,:) = 1e-3*(2.8+0.15*TJULY(:,:)) |
---|
140 | endwhere |
---|
141 | where(TJULY(:,:).le.-1.) |
---|
142 | Cice_2D(:,:) = 17.22*1e-3 |
---|
143 | Csnow_2D(:,:) = 2.65*1e-3 |
---|
144 | endwhere |
---|
145 | |
---|
146 | sigma_ice_2D(:,:)=sigma_ice |
---|
147 | ENDIF |
---|
148 | |
---|
149 | |
---|
150 | |
---|
151 | IF (annual) THEN |
---|
152 | ! (*** positive degree days Tann et Tjuly***) |
---|
153 | DO i=1,nx |
---|
154 | DO j=1,ny |
---|
155 | summ=0.0 |
---|
156 | month_reconstr: DO nday=1,nyear ! reconstitution du cycle annuel |
---|
157 | tt(nday)=tann(i,j)+(tjuly(i,j)-tann(i,j))*COS(pyg*nday) |
---|
158 | temp=0.0 |
---|
159 | k=1 |
---|
160 | average_day_reconstr: DO WHILE ((temp.LE.tt(nday)+2.5*sigma_ice_2D(i,j)).AND.k.LE.50) ! pdd d'un jour par mois |
---|
161 | summ=summ+temp*EXP(-(temp-tt(nday))*(temp-tt(nday))*s22(i,j)) |
---|
162 | temp=temp+dtp |
---|
163 | k=k+1 |
---|
164 | END DO average_day_reconstr |
---|
165 | END DO month_reconstr |
---|
166 | pdd(i,j)=summ*pddct(i,j) |
---|
167 | END DO |
---|
168 | END DO |
---|
169 | ELSE ! pdd mensuel |
---|
170 | DO i=1,nx |
---|
171 | DO j=1,ny |
---|
172 | summ=0.0 |
---|
173 | ! On a deja calcule Tmois(i,j,m) : temperature moyenne de chaque mois |
---|
174 | month: DO mo=1,12 ! boucle sur les mois |
---|
175 | temp=0.0 ! variable d'integration |
---|
176 | k=1 |
---|
177 | average_day: DO WHILE ((temp.LE.Tmois(i,j,mo)+2.5*sigma_ice_2D(i,j)).AND.k.LE.50) ! pdd d'un jour par mois |
---|
178 | summ=summ+temp*EXP(-((temp-Tmois(i,j,mo))*(temp-Tmois(i,j,mo)))*s22(i,j)) |
---|
179 | temp=temp+dtp ! pdtp pas d'integration |
---|
180 | k= k+1 |
---|
181 | END DO average_day |
---|
182 | END DO month ! boucle sur le mois |
---|
183 | pdd(i,j)=summ*pddct(i,j) ! pdd pour toute l'annee |
---|
184 | END DO |
---|
185 | END DO |
---|
186 | ENDIF |
---|
187 | |
---|
188 | |
---|
189 | ! calcul du Bilan de masse |
---|
190 | IF (methode_abl.EQ.0) THEN |
---|
191 | IF (pdd_type.EQ.1) THEN |
---|
192 | PDS(:,:)=ACC(:,:)/Csnow_2D(:,:) |
---|
193 | SIMAX(:,:)=ACC(:,:)*CSI_2D(:,:) |
---|
194 | PDSI(:,:)=SIMAX(:,:)/Cice_2D(:,:) |
---|
195 | ! avec regel de 60% puis fonte (2 premiers where) : |
---|
196 | ! WHERE (PDD(:,:).LE.CSI_2D*PDS(:,:)) |
---|
197 | ! BM(:,:)=ACC(:,:) |
---|
198 | ! SIF(:,:)=PDD(:,:)*Csnow_2D(:,:) |
---|
199 | ! endwhere |
---|
200 | ! WHERE ((CSI_2D*PDS(:,:).LT.PDD(:,:)).AND.(PDD(:,:).LE.PDS(:,:))) |
---|
201 | ! BM(:,:)=ACC(:,:)+SIMAX(:,:)-PDD(:,:)*Csnow_2D |
---|
202 | ! SIF(:,:)=SIMAX(:,:) |
---|
203 | ! endwhere |
---|
204 | WHERE (PDD(:,:).LE.PDS(:,:)) ! test avec regel de 60% progressif |
---|
205 | BM(:,:)=ACC(:,:)-PDD(:,:)*Csnow_2D*(1-CSI_2D(:,:)) |
---|
206 | SIF(:,:)=PDD(:,:)*Csnow_2D(:,:)*(1-CSI_2D(:,:)) |
---|
207 | endwhere |
---|
208 | WHERE ((PDS(:,:).LT.PDD(:,:)).AND.(PDD(:,:).LE.PDS(:,:)+PDSI(:,:))) |
---|
209 | BM(:,:)=SIMAX(:,:)-(PDD(:,:)-PDS(:,:))*Cice_2D |
---|
210 | SIF(:,:)=SIMAX(:,:) |
---|
211 | endwhere |
---|
212 | WHERE (PDS(:,:)+PDSI(:,:).LE.PDD(:,:)) |
---|
213 | BM(:,:)=(PDS(:,:)+PDSI(:,:)-PDD(:,:))*Cice_2D |
---|
214 | SIF(:,:)=SIMAX(:,:) |
---|
215 | endwhere |
---|
216 | ELSEIF (PDD_type.EQ.2) THEN ! PDD Tarasov |
---|
217 | PDS(:,:)=ACC(:,:)/Csnow_2D(:,:) |
---|
218 | pr_ice_eq(:,:) = amax1(0.,((PRECIP(:,:)/DICE)-ACC(:,:))) ! precipe liquide (ice equivalent) |
---|
219 | |
---|
220 | WHERE (PDD(:,:).LE.PDS(:,:)) |
---|
221 | snowmelt(:,:) = Csnow_2D(:,:)*PDD(:,:) |
---|
222 | ELSEWHERE |
---|
223 | snowmelt(:,:) = Csnow_2D(:,:)*PDS(:,:) + Cice_2D(:,:)*(PDD(:,:)-PDS(:,:)) |
---|
224 | ENDWHERE |
---|
225 | |
---|
226 | snowmelt(:,:) = amin1(snowmelt(:,:),ACC(:,:)) |
---|
227 | |
---|
228 | ! Deux formules possibles pour la capacité calorifique (en J/kg.K): |
---|
229 | ! Formule 1 correspond à celle figurant dans prop-thermiques_mod.f90 |
---|
230 | ! Formule 2 : celle de Tarasov |
---|
231 | cpsurf(:,:) = 2115.3+7.79293*TANN(:,:) ! Formule Catherine |
---|
232 | ! cpsurf(:,:) = 152.5 + 7.122*TANN(:,:) ! Formule Tarasov |
---|
233 | |
---|
234 | ! where(snowmelt(:,:).lt.ACC(:,:)) |
---|
235 | refr2(:,:) = 2.2*(ACC(:,:)-snowmelt(:,:))-(cpsurf(:,:)/CL)*amin1(TANN(:,:),0.) |
---|
236 | refreezed_ice(:,:) = amin1(pr_ice_eq(:,:)+snowmelt(:,:),refr2(:,:)) |
---|
237 | ! elsewhere |
---|
238 | ! refr2(:,:) = -(cpsurf(:,:)/CL)*amin1(TANN(:,:),0.) |
---|
239 | ! refreezed_ice(:,:) = amin1(pr_ice_eq(:,:)+snowmelt(:,:),refr2(:,:)) |
---|
240 | ! endwhere |
---|
241 | SIMAX(:,:)=refreezed_ice(:,:) |
---|
242 | PDSI(:,:)=SIMAX(:,:)/Cice_2D(:,:) |
---|
243 | WHERE (PDD(:,:).LE.PDS(:,:)) |
---|
244 | BM(:,:)=ACC(:,:)-PDD(:,:)*Csnow_2D(:,:) + SIMAX(:,:) |
---|
245 | SIF(:,:)=PDD(:,:)*Csnow_2D(:,:)*(1-SIMAX(:,:)) |
---|
246 | endwhere |
---|
247 | WHERE ((PDS(:,:).LT.PDD(:,:)).AND.(PDD(:,:).LE.PDS(:,:)+PDSI(:,:))) |
---|
248 | BM(:,:)=SIMAX(:,:)-(PDD(:,:)-PDS(:,:))*Cice_2D(:,:) |
---|
249 | SIF(:,:)=SIMAX(:,:) |
---|
250 | endwhere |
---|
251 | WHERE (PDS(:,:)+PDSI(:,:).LE.PDD(:,:)) |
---|
252 | BM(:,:)=(PDS(:,:)+PDSI(:,:)-PDD(:,:))*Cice_2D(:,:) |
---|
253 | SIF(:,:)=SIMAX(:,:) |
---|
254 | endwhere |
---|
255 | |
---|
256 | ELSE ! pdd standard reeh |
---|
257 | ! (* Positive degrees required to melt the snow layer *) |
---|
258 | PDS(:,:)=ACC(:,:)/Csnow_2D(:,:) |
---|
259 | ! (* Maximum amount of super. ice that can be formed *) |
---|
260 | SIMAX(:,:)=ACC(:,:)*CSI_2D(:,:) |
---|
261 | ! (* Pos. degrees required to melt the superimposed ice *) |
---|
262 | PDSI(:,:)=SIMAX(:,:)/Cice_2D(:,:) |
---|
263 | ! avec regel de 60% puis fonte (2 premiers where) : |
---|
264 | WHERE (PDD(:,:).LE.CSI_2D*PDS(:,:)) |
---|
265 | BM(:,:)=ACC(:,:) |
---|
266 | SIF(:,:)=PDD(:,:)*Csnow_2D(:,:) |
---|
267 | endwhere |
---|
268 | WHERE ((CSI_2D*PDS(:,:).LT.PDD(:,:)).AND.(PDD(:,:).LE.PDS(:,:))) |
---|
269 | BM(:,:)=ACC(:,:)+SIMAX(:,:)-PDD(:,:)*Csnow_2D |
---|
270 | SIF(:,:)=SIMAX(:,:) |
---|
271 | endwhere |
---|
272 | ! WHERE (PDD(:,:).LE.PDS(:,:)) ! test avec regel de 60% progressif| |
---|
273 | ! BM(:,:)=ACC(:,:)-PDD(:,:)*Csnow_2D*(1-CSI_2D) ! remplace les 2 premiers where | |
---|
274 | ! SIF(:,:)=PDD(:,:)*Csnow_2D(:,:)*(1-CSI_2D(:,:)) !----------------------------------| |
---|
275 | ! endwhere |
---|
276 | WHERE ((PDS(:,:).LT.PDD(:,:)).AND.(PDD(:,:).LE.PDS(:,:)+PDSI(:,:))) |
---|
277 | BM(:,:)=SIMAX(:,:)-(PDD(:,:)-PDS(:,:))*Cice_2D |
---|
278 | SIF(:,:)=SIMAX(:,:) |
---|
279 | endwhere |
---|
280 | WHERE (PDS(:,:)+PDSI(:,:).LE.PDD(:,:)) |
---|
281 | BM(:,:)=(PDS(:,:)+PDSI(:,:)-PDD(:,:))*Cice_2D |
---|
282 | SIF(:,:)=SIMAX(:,:) |
---|
283 | endwhere |
---|
284 | ENDIF |
---|
285 | ELSEIF ( methode_abl.EQ.1 ) THEN ! Insolation Temperature Melt equation, van den Berg, 2008 |
---|
286 | SIMAX(:,:)=ACC(:,:)*CSI |
---|
287 | SIF(:,:)=SIMAX(:,:) |
---|
288 | ELSE |
---|
289 | print*,'ablation.f90 : pb methode calcul BM' |
---|
290 | print*,'ATTENTION methode_abl > 1 NON COMPATIBLE AVEC iLOVECLIM' |
---|
291 | stop |
---|
292 | ENDIF |
---|
293 | |
---|
294 | ! calcul de la temperature de surface (utilisee dans icetemp) : |
---|
295 | TS(:,:)=(TANN(:,:)+26.6*SIF(:,:)) |
---|
296 | TS(:,:)=min(0.0,TS(:,:)) |
---|
297 | tshelf(:,:)=TS(:,:) |
---|
298 | Abl(:,:)=BM(:,:)-Acc(:,:) |
---|
299 | |
---|
300 | END SUBROUTINE ABLATION |
---|
301 | |
---|
302 | end module ablation_mod |
---|