source: trunk/SOURCES/Greeneem_files/lect-clim-act-greeneem_mois_lapsecouche_mod.f90 @ 237

Last change on this file since 237 was 237, checked in by aquiquet, 6 years ago

Sealevel is now treated as a 2D variable (sealevel_2d while sealevel remains the eustatic sea level), results should remain identical as sealevel_2d is equal to sealevel in this revision.

File size: 8.0 KB
Line 
1module lect_clim_act_greeneem_mois_lapsecouche                   
2
3
4use module3D_phy                       
5use printtable
6use declare_month_lapsecouche
7use climat_perturb_mois_lapsecouche_mod
8
9
10implicit none
11
12
13
14contains
15
16
17subroutine input_climat_ref()           ! routine qui permet d'initialiser les variables climatiques
18
19
20
21
22real,dimension(nx,ny,mois) :: Tm       ! temperature mensuelle sur la calotte de ref
23real,dimension(nx,ny,mois) :: Pm       ! precipitation mensuelle sur la calotte de ref
24
25
26character(len=200)  :: filin                            ! nom temporaire
27character (len=200) :: filtr_topo, filtr_t, filtr_p
28real :: T_surf_ref                                      ! variable de travail
29real :: zel                                             ! variable de travail
30real :: ti, tj                     ! variable provisoire de lecture
31
32
33namelist/clim_init_mois/filtr_topo,filtr_t,filtr_p   
34
35! lecture par namelist
36!---------------------
37
38
39! formats pour les ecritures dans 42
40428 format(A)
41
42rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
43read(num_param,clim_init_mois)
44
45
46write(num_rep_42,428)'!___________________________________________________________' 
47write(num_rep_42,428) '&clim_perturb_mois                            ! module climat_perturb_mois_mod'
48write(num_rep_42,'(A,A)')   'filtr_topo =', filtr_topo
49write(num_rep_42,'(A,A)')   'filtr_t =', filtr_t
50write(num_rep_42,'(A,A)')   'filtr_p =', filtr_p
51write(num_rep_42,*)'/'                     
52write(num_rep_42,428) '! fichiers temperature et precip : 12 mois'
53write(num_rep_42,428) '! faire un bloc namelist par snapshot'
54write(num_rep_42,*)
55
56
57
58call lect_lapserate_months       ! lit les lasperate
59                                 ! version actuelle : on utilise un
60                                 ! lapserate parametre homogene annuel
61                                 ! on le passe en mensuel avec un cosinus
62
63
64
65! lecture des fichiers snapshots pour tout geoplace
66! -------------------------------------------------
67write(6,*) 'fichiers snapshots'
68
69    ! lecture de la topo de surface de reference du GCM
70   filin=trim(dirnameinp)//trim(filtr_topo)
71   write(6,*) filin
72   open(20,file=filin)
73   do j=1,ny 
74      do i=1,nx
75         read (20,*) S0CLIM(i,j)
76         S0CLIM(i,j)=max(S0CLIM(i,j),0.)   ! pour etre au niveau des mers
77      end do
78   end do
79   close(20)
80
81   ! temperature : temperature a l'altitude de la calotte de ref (MAR)
82   filin=trim(dirnameinp)//trim(filtr_t)
83   write(6,*) filin
84   open(20,file=filin)
85   do j=1,ny
86      do i=1,nx
87         read(20,*) ti, tj, (Tm(i,j,mo),mo=1,12)
88      end do
89   end do
90   close(20)
91
92! test: on garde la temp parametree ->
93!!$   do mo=1,12
94!!$      Tm(:,:,mo)=Tm_surf(:,:,mo)
95!!$   end do
96
97
98   ! precipitation a l'altitude de la calotte de ref (MAR)
99   filin=trim(dirnameinp)//trim(filtr_p)
100   write(6,*) filin
101   open(20,file=filin)
102   do j=1,ny
103      do i=1,nx
104         read(20,*) ti, tj, (Pm(i,j,mo),mo=1,12)
105      end do
106   end do
107   close(20)
108
109
110
111   do j=1,ny
112      do i=1,nx
113         do mo=1,mois
114            Tm_0(i,j,mo)=Tm(i,j,mo)      ! temp sur la calotte du GCM a l'instant initial
115           
116            zel=max(sealevel_2d(i,j),S0CLIM(i,j))
117! on calcule une temperature au sol a partir de la temperature sur la calotte de ref du GCM
118
119
120            if(zel.gt.3000) then
121               Tsol(i,j,mo)=Tm(i,j,mo)-(lapserate(mo,4)*(zel-3000)+lapserate(mo,3)*1000+lapserate(mo,2)*1000+lapserate(mo,1)*1000)
122            end if
123            if ((zel.le.3000).and.(zel.gt.2000)) then
124               Tsol(i,j,mo)=Tm(i,j,mo)-(lapserate(mo,3)*(zel-2000)+lapserate(mo,2)*1000+lapserate(mo,1)*1000)
125            end if
126            if ((zel.le.2000).and.(zel.gt.1000)) then
127               Tsol(i,j,mo)=Tm(i,j,mo)-(lapserate(mo,2)*(zel-1000)+lapserate(mo,1)*1000)
128            end if
129            if (zel.le.1000) then
130               Tsol(i,j,mo)=Tm(i,j,mo)-lapserate(mo,1)*zel
131            end if
132
133            !zel=max(sealevel_2d(i,j),S(i,j))   
134            zel=max(0.,S(i,j))   
135! puis on calcule la temperature sur la calotte S
136
137            if(zel.gt.3000) then
138               T_surf_ref=Tsol(i,j,mo)+(lapserate(mo,4)*(zel-3000)+lapserate(mo,3)*1000+lapserate(mo,2)*1000+lapserate(mo,1)*1000)
139            end if
140            if((zel.le.3000).and.(zel.gt.2000)) then
141               T_surf_ref=Tsol(i,j,mo)+(lapserate(mo,3)*(zel-2000)+lapserate(mo,2)*1000+lapserate(mo,1)*1000)
142            end if
143            if ((zel.le.2000).and.(zel.gt.1000)) then
144               T_surf_ref=Tsol(i,j,mo)+(lapserate(mo,2)*(zel-1000)+lapserate(mo,1)*1000)
145            end if
146            if (zel.le.1000) then
147               T_surf_ref=Tsol(i,j,mo)+lapserate(mo,1)*zel
148            end if
149
150            if(retroac.eq.1) then      ! full retroaction acc.
151               Pm_surf(i,j,mo)= Pm(i,j,mo)*exp(rappact*(T_surf_ref-Tm(i,j,mo)))
152            else if (retroac.eq.0) then
153               Pm_surf(i,j,mo)=Pm(i,j,mo)
154            end if
155
156            Tm_surf(i,j,mo)=T_surf_ref
157           
158         end do
159      end do
160   end do
161
162
163
164
165Tm_surf(:,:,mois+1)=Tm_surf(:,:,1)
166!Tm_0(:,:,mois+1)=Tm_0(:,:,1)
167Pm_surf(:,:,mois+1)=Pm_surf(:,:,1)
168Tsol(:,:,mois+1)=Tsol(:,:,1)
169
170do j=1,ny
171   do i=1,nx
172      Tann(i,j)=(sum(Tm_surf(i,j,:))-Tm_surf(i,j,1))/12 ! janvier compte en double (modulo)
173      Tjuly(i,j)=Tm_surf(i,j,7)
174      !Tjuly(i,j)=(Tm_surf(i,j,6)+Tm_surf(i,j,7)+Tm_surf(i,j,8))/3 ! en fait un Tjja
175   end do
176end do
177
178!!$do j=25,40
179!!$do i=20,30
180!!$print*, 'ecart annuel ', i, j, Tann(i,j),Tann(i,j)-(sum(Tm(i,j,:))-Tm(i,j,1))/12
181!!$end do
182!!$end do
183
184print*, 'fini input_climat_ref'
185
186
187
188end subroutine input_climat_ref
189
190
191
192
193!------------------------------------------------------------------------------------------------------------
194subroutine lect_lapserate_months  ! lapserates mensuels mais uniformes spatialement
195! cette routine est susceptible de changer en fonction de la facon de lire les lapserates.
196! pour le moment : on peut lire un fichier contenant les lapserates non homogènes spatiallement.
197
198
199character (len=200) :: filtr_lr
200integer :: k
201
202real l1ann,l2ann,l3ann,l4ann
203real l1july,l2july,l3july,l4july
204
205!!$namelist/lapse_month/filtr_lr
206!!$
207!!$! lecture de la namelist
208!!$! formats pour les ecritures dans 42
209!!$428 format(A)
210!!$
211!!$rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
212!!$read(num_param,lapse_month)
213!!$
214!!$write(num_rep_42,428)'!___________________________________________________________'
215!!$write(num_rep_42,428) '&lapse_month                                          ! module climat_perturb_mois_mod'
216!!$write(num_rep_42,'(A,A)')   'filtr_t =', filtr_lr
217!!$write(num_rep_42,*)'/'                     
218!!$write(num_rep_42,428) '! lapse rates janvier -> decembre en deg/m'
219!!$write(num_rep_42,*)
220!!$
221!!$
222!!$! 3 colonnes de 12 valeurs (mois)
223!!$! les 3 colonnes correspondent aux 3 tranches d'altitude
224!!$! 0-1000m // 1000m-2000m // 2000m-++
225!!$open(20,file=trim(dirnameinp)//trim(filtr_lr))
226!!$do mo=1,mois
227!!$      read(20,*) (lapserate(mo,k),k=1,3) ! en deg/m
228!!$      ! test aurel pour supprimer la correction d'alti
229!!$      !do k=1,3
230!!$      !   lapserate(mo,k)=0.
231!!$      !enddo
232!!$      ! fin test aurel sur lapse
233!!$end do
234!!$close(20)
235
236! le fichier n'ayant pas specialement des bonnes valeurs
237! on utilise plutot les valeurs de Gherard
238! 4 tranches <1000, 1000-2000, 2000-3000, >3000 (l1, l2, l3, l4)
239
240l1ann=-5.3/1000.   ! <1000
241l2ann=-5.9/1000.   ! 1000-2000
242l3ann=-8.1/1000.   ! 2000-3000
243l4ann=-7.9/1000.   ! > 3000
244! on suppose que le gradient de juillet est plus faible que l'annuel
245! le 14% vient de Fausto et al. 2009
246l1july=l1ann-l1ann*0.14
247l2july=l2ann-l2ann*0.14
248l3july=l3ann-l3ann*0.14
249l4july=l4ann-l4ann*0.14
250
251
252do mo=1,12
253   lapserate(mo,1)=l1ann+(l1july-l1ann)*cos(2*pi*(mo+5)/12) 
254   lapserate(mo,2)=l2ann+(l2july-l2ann)*cos(2*pi*(mo+5)/12) 
255   lapserate(mo,3)=l3ann+(l3july-l3ann)*cos(2*pi*(mo+5)/12) 
256   lapserate(mo,4)=l4ann+(l4july-l4ann)*cos(2*pi*(mo+5)/12)
257end do
258
259
260end subroutine lect_lapserate_months
261!--------------------------------------------------------------------------------------------------------
262
263
264
265end module lect_clim_act_greeneem_mois_lapsecouche
Note: See TracBrowser for help on using the repository browser.