source: trunk/SOURCES/Greeneem_files/lect-clim-act-greeneem_mois_mod.f90 @ 4

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

initial import GRISLI trunk

File size: 8.0 KB
Line 
1module lect_clim_act_greeneem_mois                   
2
3
4use module3D_phy                       
5use printtable
6use declare_month
7use climat_perturb_mois_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
29
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),slv(i,j))   ! pour etre au niveau des mers
77      end do
78   end do
79   close(20)
80
81
82   ! temperature : temperature a l'altitude de la calotte de ref (MAR)
83   filin=trim(dirnameinp)//trim(filtr_t)
84   write(6,*) filin
85   open(20,file=filin)
86   do j=1,ny
87      do i=1,nx
88         read(20,*) ti, tj, (Tm(i,j,mo),mo=1,12)
89      end do
90   end do
91   close(20)
92
93! test aurel: on garde la temp parametree ->
94!!$   do mo=1,12
95!!$      Tm(:,:,mo)=Tm_surf(:,:,mo)
96!!$   end do
97
98
99   ! precipitation a l'altitude de la calotte de ref (MAR)
100   filin=trim(dirnameinp)//trim(filtr_p)
101   write(6,*) filin
102   open(20,file=filin)
103   do j=1,ny
104      do i=1,nx
105         read(20,*) ti, tj, (Pm(i,j,mo),mo=1,12)
106      end do
107   end do
108   close(20)
109
110!!$! test aurel pour restreindre les precipes a la calotte
111!!$   do j=1,ny
112!!$      do i=1,nx
113!!$         if(H(i,j).le.1.) then
114!!$            Pm(i,j,:)=0.
115!!$         end if
116!!$      end do
117!!$   end do
118
119   do j=1,ny
120      do i=1,nx
121! Zs est l'altitude de la surface qu'elle soit mer, glace ou lac
122         ZS(i,j)=max(slv(i,j),S0CLIM(I,J)) !slv=sealev pour nolake
123
124         do mo=1,mois
125            Tm_0(i,j,mo)=Tm(i,j,mo)      ! temp sur la calotte de ref du GCM a l'instant initial
126
127! on corrige la temperature initiale par l'altitude
128            T_surf_ref = Tm(i,j,mo) + lapserate(i,j,mo) * (ZS(i,j)-S0CLIM(i,j))
129
130! on applique le forcage
131            T_surf_ref = T_surf_ref+Tafor
132
133            if(retroac.eq.1) then
134! on suppose que les precipes sont fournies a la meme altitude que les temperatures
135               Pm(i,j,mo)= Pm(i,j,mo)*exp(rappact*(T_surf_ref-Tm(i,j,mo)))
136            else if (retroac.eq.0) then
137               Pm(i,j,mo)=Pm(i,j,mo)
138            end if
139
140            Tm(i,j,mo)=T_surf_ref
141
142         end do
143      end do
144   end do
145
146
147
148do mo =1,12
149   Tm_surf(:,:,mo)=Tm(:,:,mo)
150   Pm_surf(:,:,mo)=Pm(:,:,mo)
151end do
152Tm_surf(:,:,mois+1)=Tm_surf(:,:,1)
153!Tm_0(:,:,mois+1)=Tm_0(:,:,1)
154Pm_surf(:,:,mois+1)=Pm_surf(:,:,1)
155
156do j=1,ny
157   do i=1,nx
158      Tann(i,j)=(sum(Tm_surf(i,j,:))-Tm_surf(i,j,1))/12 ! janvier compte en double
159      Tjuly(i,j)=Tm_surf(i,j,7)
160      !Tjuly(i,j)=(Tm_surf(i,j,6)+Tm_surf(i,j,7)+Tm_surf(i,j,8))/3 ! en fait un Tjja
161   end do
162end do
163
164call massb_perturb_mois  !modif aurel 16 juil 2010
165
166print*, 'fini input_climat_ref'
167
168
169
170end subroutine input_climat_ref
171
172
173
174
175!------------------------------------------------------------------------------------------------------------
176subroutine lect_lapserate_months  ! lapserates mensuels mais uniformes spatialement
177! cette routine est susceptible de changer en fonction de la facon de lire les lapserates.
178! pour le moment : on peut lire un fichier contenant les lapserates non homogènes spatiallement.
179
180
181
182character (len=200) :: filtr_lr
183integer :: k
184
185! pour la parametrisation de Fausto et al. 2009
186real :: d_ann, gamma_ann, c_ann, kappa_ann
187real :: d_july, gamma_july, c_july, kappa_july
188
189integer :: gmint  ! choix de la parametrisation temperature
190                  ! 0 -> Fausto et al. 2009
191                  ! autre -> ancienne version Gmint
192
193real :: ti, tj                     ! variable provisoire de lecture
194
195
196gmint=0
197!gmint=1
198
199! on laisse la possibilite ed lire un fichier avec une carte de lapserate
200! mais en realite pas encore operationnel ->
201! on utilise la parametrisation de Fausto et al. 2009
202namelist/lapse_month/filtr_lr
203
204
205! lecture de la namelist
206! formats pour les ecritures dans 42
207428 format(A)
208
209rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
210read(num_param,lapse_month)
211
212write(num_rep_42,428)'!___________________________________________________________' 
213write(num_rep_42,428) '&lapse_month                                          ! module climat_perturb_mois_mod'
214write(num_rep_42,'(A,A)')   'filtr_lr =', filtr_lr
215write(num_rep_42,*)'/'                     
216write(num_rep_42,428) '! lapse rates janvier -> decembre en deg/m'
217write(num_rep_42,*)
218
219
220open(20,file=trim(dirnameinp)//trim(filtr_lr))
221do j=1,ny
222   do i=1,nx
223      read(20,*) ti, tj, (lapserate(i,j,mo),mo=1,12) ! en deg/m
224   end do
225end do
226close(20)
227
228! les runs avec un lapserate non homogène donnent de mauvais résultats
229! on choisit des lapserates de Fausto et al. 2009 (actualisation de gmint)
230! T = d + gamma x z + c x lat + kappa x long
231!annuel et juillet (resp) :
232!d (°C)           41.83              14.70
233!gamma  (°/km)        -6.309             -5.426
234!c (°C/°N)           -0.7189            -0.1585
235!kappa (°C/°W)        0.0672             0.0518
236! sinon on peut utiliser l'ancienne parametrisation eismint
237
238if(gmint.eq.0) then
239d_ann = 41.83
240d_july = 14.70
241gamma_ann = -6.309/1000
242gamma_july = -5.426/1000
243c_ann = -0.7189
244c_july = -0.1585
245kappa_ann = 0.0672 
246kappa_july = 0.0518
247
248else
249! gmint :
250d_ann=49.13
251d_july=30.78
252gamma_ann=-7.992/1000
253gamma_july=-6.277/1000
254c_ann=-0.7576
255c_july=-0.3262
256kappa_ann = 0. 
257kappa_july = 0.
258end if
259
260! attention aux longitudes, dans Fausto elles sont en °W
261do j=1,ny
262   do i=1,nx
263      ZS(i,j)=max(slv(i,j),S(i,j))
264      Tann(i,j)=d_ann+gamma_ann*S(i,j)+c_ann*ylat(i,j)+kappa_ann*(360-xlong(i,j))
265      Tjuly(i,j)=d_july+gamma_july*S(i,j)+c_july*ylat(i,j)+kappa_july*(360-xlong(i,j))
266   end do
267end do
268
269
270!!$! TEST DE SENSIBILITE SUR LE LAPSERATE :
271!!$! JE GARDE LA TEMP PARAMETREE FAUSTO MAIS JE MODIFIE ENSUITE LE GAMMA
272!!$gamma_ann = gamma_ann+gamma_ann*30/100 !-6.309/1000
273!!$gamma_july = gamma_july+gamma_july*30/100     !-5.426/1000
274!!$print*, 'lapse ann et july  ', gamma_ann, gamma_july
275
276! il faut mensualiser maintenant
277do mo=1,12
278   do j=1,ny
279      do i=1,nx
280         Tm_surf(:,:,mo)=tann(:,:)+(tjuly(:,:)-tann(:,:))*cos(2*pi*(mo+5)/12) 
281         ! on calcule aussi lapserate mensuel, mais homogene spatialement
282         lapserate(:,:,mo)=gamma_ann+(gamma_july-gamma_ann)*cos(2*pi*(mo+5)/12)
283      end do
284   end do
285end do
286
287!aurel test : pas de lapse
288!lapserate(:,:,:)=0.
289! pour les modulos
290
291
292end subroutine lect_lapserate_months
293!--------------------------------------------------------------------------------------------------------
294
295
296
297end module lect_clim_act_greeneem_mois
Note: See TracBrowser for help on using the repository browser.