[9] | 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 | |
---|
[11] | 10 | use geography, only : nx,ny |
---|
| 11 | |
---|
[9] | 12 | implicit none |
---|
| 13 | integer :: pdd_type ! type de calcul du PDD utilise |
---|
| 14 | logical :: annual ! T = annuel, F = mensuel |
---|
| 15 | |
---|
[11] | 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 *) |
---|
[9] | 20 | |
---|
[11] | 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 |
---|
[31] | 33 | REAL, dimension(nx,ny) :: PDDCT2 ! ct for PDD calculation |
---|
[32] | 34 | integer,target :: methode_abl ! selection methode pdd ou van den Berg 2008 |
---|
[11] | 35 | |
---|
[9] | 36 | contains |
---|
| 37 | |
---|
| 38 | |
---|
| 39 | subroutine init_ablation |
---|
| 40 | |
---|
| 41 | use module3d_phy,only:num_param,num_rep_42 |
---|
[11] | 42 | |
---|
| 43 | real :: Cice, Csnow, csi |
---|
[9] | 44 | |
---|
| 45 | ! fichiers snapshots |
---|
[11] | 46 | namelist/ablation/pdd_type,annual,Cice,Csnow,csi,sigma_ice |
---|
[9] | 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' |
---|
[11] | 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 |
---|
[9] | 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' |
---|
[11] | 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 ' |
---|
[9] | 66 | write(num_rep_42,*) |
---|
[11] | 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. |
---|
[9] | 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 | |
---|
[31] | 86 | USE module3d_phy,only:Tjuly,Tann,Tmois,acc,pdd,TS,Tshelf,precip,BM,Abl,S,dice,cl |
---|
[9] | 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.) |
---|
[11] | 103 | Cice_2D(:,:)=7. |
---|
| 104 | Csnow_2D(:,:)=3. |
---|
[9] | 105 | ELSEWHERE ((-1.LE.Tjuly(:,:)).AND.(Tjuly(:,:).LT.10.)) |
---|
[11] | 106 | Cice_2D(:,:)=7.+((15.-7.)/((10.+1)**3))*((10.-Tjuly(:,:))**3) |
---|
| 107 | Csnow_2D(:,:)=3. |
---|
[9] | 108 | ELSEWHERE |
---|
[11] | 109 | Cice_2D(:,:)=15. |
---|
| 110 | Csnow_2D(:,:)=3. |
---|
[9] | 111 | ENDWHERE |
---|
| 112 | ! pour etre en m/an : |
---|
[11] | 113 | Cice_2D(:,:)=Cice_2D(:,:)/1000. |
---|
| 114 | Csnow_2D(:,:)=Csnow_2D(:,:)/1000. |
---|
[9] | 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) |
---|
[11] | 124 | CSI_2D(:,:)=0. |
---|
[9] | 125 | ELSEWHERE ((800.LT.S(:,:)).AND.(S(:,:).LT.2000.)) |
---|
[11] | 126 | CSI_2D(:,:)=(S(:,:)-800.)*0.000833 |
---|
[9] | 127 | ELSEWHERE |
---|
[11] | 128 | CSI_2D(:,:)=1. |
---|
[9] | 129 | ENDWHERE |
---|
| 130 | |
---|
[31] | 131 | ELSEIF (pdd_type.EQ.2) THEN ! pdd Tarasov |
---|
[9] | 132 | |
---|
| 133 | where (TJULY(:,:).gt.10.) |
---|
[31] | 134 | Cice_2D(:,:) = 8.3*1e-3 |
---|
| 135 | Csnow_2D(:,:) = 4.3*1e-3 |
---|
[9] | 136 | endwhere |
---|
| 137 | where(TJULY(:,:).gt.-1..and.TJULY(:,:).lt.10.) |
---|
[31] | 138 | Cice_2D(:,:) = 1e-3*(8.3+0.0067*(10.-TJULY(:,:))**3) |
---|
| 139 | Csnow_2D(:,:) = 1e-3*(2.8+0.15*TJULY(:,:)) |
---|
[9] | 140 | endwhere |
---|
| 141 | where(TJULY(:,:).le.-1.) |
---|
[31] | 142 | Cice_2D(:,:) = 17.22*1e-3 |
---|
| 143 | Csnow_2D(:,:) = 2.65*1e-3 |
---|
[9] | 144 | endwhere |
---|
| 145 | |
---|
| 146 | sigma_ice_2D(:,:)=sigma_ice |
---|
[31] | 147 | ENDIF |
---|
[9] | 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 |
---|
[31] | 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(:,:) |
---|
[9] | 195 | ! avec regel de 60% puis fonte (2 premiers where) : |
---|
[11] | 196 | ! WHERE (PDD(:,:).LE.CSI_2D*PDS(:,:)) |
---|
[9] | 197 | ! BM(:,:)=ACC(:,:) |
---|
[11] | 198 | ! SIF(:,:)=PDD(:,:)*Csnow_2D(:,:) |
---|
[9] | 199 | ! endwhere |
---|
[11] | 200 | ! WHERE ((CSI_2D*PDS(:,:).LT.PDD(:,:)).AND.(PDD(:,:).LE.PDS(:,:))) |
---|
| 201 | ! BM(:,:)=ACC(:,:)+SIMAX(:,:)-PDD(:,:)*Csnow_2D |
---|
[9] | 202 | ! SIF(:,:)=SIMAX(:,:) |
---|
| 203 | ! endwhere |
---|
[31] | 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 |
---|
[11] | 217 | PDS(:,:)=ACC(:,:)/Csnow_2D(:,:) |
---|
[9] | 218 | pr_ice_eq(:,:) = amax1(0.,((PRECIP(:,:)/DICE)-ACC(:,:))) ! precipe liquide (ice equivalent) |
---|
| 219 | |
---|
| 220 | WHERE (PDD(:,:).LE.PDS(:,:)) |
---|
[11] | 221 | snowmelt(:,:) = Csnow_2D(:,:)*PDD(:,:) |
---|
[9] | 222 | ELSEWHERE |
---|
[11] | 223 | snowmelt(:,:) = Csnow_2D(:,:)*PDS(:,:) + Cice_2D(:,:)*(PDD(:,:)-PDS(:,:)) |
---|
[9] | 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(:,:)) |
---|
[31] | 235 | refr2(:,:) = 2.2*(ACC(:,:)-snowmelt(:,:))-(cpsurf(:,:)/CL)*amin1(TANN(:,:),0.) |
---|
| 236 | refreezed_ice(:,:) = amin1(pr_ice_eq(:,:)+snowmelt(:,:),refr2(:,:)) |
---|
[9] | 237 | ! elsewhere |
---|
| 238 | ! refr2(:,:) = -(cpsurf(:,:)/CL)*amin1(TANN(:,:),0.) |
---|
| 239 | ! refreezed_ice(:,:) = amin1(pr_ice_eq(:,:)+snowmelt(:,:),refr2(:,:)) |
---|
| 240 | ! endwhere |
---|
| 241 | SIMAX(:,:)=refreezed_ice(:,:) |
---|
[11] | 242 | PDSI(:,:)=SIMAX(:,:)/Cice_2D(:,:) |
---|
| 243 | WHERE (PDD(:,:).LE.PDS(:,:)) |
---|
| 244 | BM(:,:)=ACC(:,:)-PDD(:,:)*Csnow_2D(:,:) + SIMAX(:,:) |
---|
| 245 | SIF(:,:)=PDD(:,:)*Csnow_2D(:,:)*(1-SIMAX(:,:)) |
---|
[9] | 246 | endwhere |
---|
| 247 | WHERE ((PDS(:,:).LT.PDD(:,:)).AND.(PDD(:,:).LE.PDS(:,:)+PDSI(:,:))) |
---|
[11] | 248 | BM(:,:)=SIMAX(:,:)-(PDD(:,:)-PDS(:,:))*Cice_2D(:,:) |
---|
[9] | 249 | SIF(:,:)=SIMAX(:,:) |
---|
| 250 | endwhere |
---|
| 251 | WHERE (PDS(:,:)+PDSI(:,:).LE.PDD(:,:)) |
---|
[11] | 252 | BM(:,:)=(PDS(:,:)+PDSI(:,:)-PDD(:,:))*Cice_2D(:,:) |
---|
[9] | 253 | SIF(:,:)=SIMAX(:,:) |
---|
| 254 | endwhere |
---|
| 255 | |
---|
[31] | 256 | ELSE ! pdd standard reeh |
---|
[9] | 257 | ! (* Positive degrees required to melt the snow layer *) |
---|
[11] | 258 | PDS(:,:)=ACC(:,:)/Csnow_2D(:,:) |
---|
[9] | 259 | ! (* Maximum amount of super. ice that can be formed *) |
---|
[11] | 260 | SIMAX(:,:)=ACC(:,:)*CSI_2D(:,:) |
---|
[9] | 261 | ! (* Pos. degrees required to melt the superimposed ice *) |
---|
[11] | 262 | PDSI(:,:)=SIMAX(:,:)/Cice_2D(:,:) |
---|
[9] | 263 | ! avec regel de 60% puis fonte (2 premiers where) : |
---|
[31] | 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 |
---|
[11] | 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(:,:)) !----------------------------------| |
---|
[9] | 275 | ! endwhere |
---|
[31] | 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 |
---|
[9] | 292 | ENDIF |
---|
| 293 | |
---|
| 294 | ! calcul de la temperature de surface (utilisee dans icetemp) : |
---|
[31] | 295 | TS(:,:)=(TANN(:,:)+26.6*SIF(:,:)) |
---|
| 296 | TS(:,:)=min(0.0,TS(:,:)) |
---|
| 297 | tshelf(:,:)=TS(:,:) |
---|
| 298 | Abl(:,:)=BM(:,:)-Acc(:,:) |
---|
[9] | 299 | |
---|
| 300 | END SUBROUTINE ABLATION |
---|
| 301 | |
---|
| 302 | end module ablation_mod |
---|