source: trunk/SOURCES/ablation_mod.f90 @ 170

Last change on this file since 170 was 29, checked in by dumas, 8 years ago

Mise a jour pour etre compatible avec le code couple iLOVECLIM

File size: 11.5 KB
Line 
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
8module 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
36contains
37
38
39subroutine 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
49428 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.
76end subroutine init_ablation
77
78subroutine 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
300END SUBROUTINE ABLATION
301
302end module ablation_mod
Note: See TracBrowser for help on using the repository browser.