source: trunk/SOURCES/climat-forcage-mois_mod-0.2.f90 @ 23

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

initial import GRISLI trunk

File size: 12.1 KB
Line 
1!> \file climat-forcage-mois_mod-0.2.f90
2!! Module pour forcage avec champs mensuels
3!<
4
5!> \namespace climat_forcage_mois_mod
6!!Module pour forcage avec champs mensuels
7!! \author ...
8!! \date ...
9!!@note  Ce qui a trait aux lacs proglaciaires passe dans un module separe.
10!! les tests sur geoplace sont enleves et sont remplaces par les
11!! lectures de fichers appropries.
12!! @note Used modules:
13!! @note   - use module3D_phy
14!! @note   - use printtable
15!<
16
17module climat_forcage_mois_mod                   
18
19  ! forcage avec champs mensuels
20  ! ce qui a trait aux lacs proglaciaires passe dans un module separe.
21  ! les tests sur geoplace sont enleves et sont remplacés par les
22  ! lectures de fichers appropries.
23
24
25
26  USE module3D_phy                     
27  USE printtable
28
29  implicit none
30
31  ! 1=decalaration variables
32  !-------------------------
33
34  integer :: nft                !<   NFT est le nombre de lignes a lire dans le fichier contenant le forcage climatique
35  integer :: mo,ti,tj,la
36
37  integer,parameter :: mois=12
38  integer,parameter :: NTR=1    !< nb of snapshot files : 1 pour stationnaire - ntr is now explicitely specified in the climat module
39  integer           :: itr        !< index of snapshot                         
40  real,dimension(:),allocatable :: TDATE                !< time for climate forcing
41  real,dimension(:),allocatable :: alphaT                 !< index temperature
42  real,dimension(:),allocatable :: alphaP                 !< index precipitation
43  real,dimension(:),allocatable :: SPERT                  !< sealevel forcing
44
45  real ttr(ntr)                                         !< la date des tranches (snapshots)  (len=ntr)
46
47  !real alphaTTR(ntr) ! Le alphaT de l'index glaciologiq. aux snapshots
48
49  real,dimension(nx,ny,ntr)      :: Ssnap                 !< altitude de surface dans le snapshot
50  real,dimension(nx,ny,mois,ntr) :: Tm                    !< temperature mensuelle de chaque tranche
51  real,dimension(nx,ny,mois,ntr) :: Pm                    !< precipitation mensuelle
52
53  real,dimension(nx,ny,mois) :: Tm_time                   !< temperature mensuelle au temps time (non corrige altitude)
54  real,dimension(nx,ny,mois) :: Pm_time                   !< precipitation mensuelle au temps time
55
56  real,dimension(nx,ny,mois+1) :: Tm_surf                 !< surface temperature (after topo. correction)
57  !< 13 mois pour       modulo
58  real,dimension(nx,ny,mois+1) :: Pm_surf                 !< surface precipitation (after topo. correction)
59
60  real,dimension(nx,ny,mois) :: lapserate                 !< lapse rate
61
62  character(len=100)  :: filin                            !< nom temporaire
63  character (len=100) :: file_temporel                    !< forcage temporel
64  character (len=100) :: filtr_t(ntr), filtr_p(ntr),filtr_t1, filtr_p1 !snapshot file name (len=ntr)
65
66  real :: T_surf_ref                                      !< variable de travail
67  real :: mincoefbmelt                                    !< butoirs pour coefbmshelf
68  real :: maxcoefbmelt   
69
70contains
71
72  ! 2=lecture des inputs
73  !--------------------
74  !> SUBROUTINE: input_clim
75  !! Routine qui permet d'initialiser les variables climatiques
76  !>
77  subroutine input_clim                                         ! routine qui permet d'initialiser les variables climatiques
78
79    ! fichiers snapshots
80    namelist/snap_forcage_mois_1/filtr_t1,filtr_p1      ! ce bloc est a dupliquer pour chaque snapshot en changeant                                                                                   ! la numerotation. ntr snapshots
81
82    ! forcage temporel
83    !------------------
84    namelist/forc_temporel/file_temporel,mincoefbmelt,maxcoefbmelt
85
86    ! variables locales
87    !-------------------
88
89    implicit none
90
91    character(len=8) :: control                         !label to check clim. forc. file (filin) is usable
92    integer :: l                                                !In snapshot files:the first column is the mask, read but not used
93
94
95    ! lecture par namelist
96    !---------------------
97
98    ! formats pour les ecritures dans 42
99428 format(A)
100
101    rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
102    read(num_param,snap_forcage_mois_1)
103
104    filtr_t(1)=filtr_t1
105    filtr_p(1)=filtr_p1
106
107    write(num_rep_42,428)'!___________________________________________________________' 
108    write(num_rep_42,428) '&snap_forcage_mois_1                            ! module climat_forcage_mois_mod'
109    write(num_rep_42,'(A,A)')   'filtr_t1 =', filtr_t(1)
110    write(num_rep_42,'(A,A)')   'filtr_p1 =', filtr_p(1)
111    write(num_rep_42,*)'/'                     
112    write(num_rep_42,428) '! fichiers temperature et precip : 12 mois'
113    write(num_rep_42,428) '! faire un bloc namelist par snapshot'
114    write(num_rep_42,*)
115
116    call lect_lapserate_months                               ! lit les lasperate mensuels
117    ! pour une version spatialisee ecrire une autre routine
118
119
120
121    ! lecture des fichiers snapshots pour tout geoplace
122    ! -------------------------------------------------
123    write(6,*) 'fichiers snapshots'
124    do k=1,ntr
125
126       !temperature
127       filin=trim(dirnameinp)//trim(filtr_t(k))
128       write(6,*) filin
129
130       open(20,file=filin)
131       do j=1,ny
132          do i=1,nx
133             read(20,*) ti, tj, (Tm(i,j,mo,k),mo=1,12)
134          end do
135       end do
136       close(20)
137
138       !precipitation
139       filin=trim(dirnameinp)//trim(filtr_p(k))
140       write(6,*) filin
141
142       open(20,file=filin)
143       do j=1,ny
144          do i=1,nx
145             read(20,*) ti, tj, (Pm(i,j,mo,k),mo=1,12)
146          end do
147       end do
148       close(20)
149    end do
150
151    !  Correction d'altitude pour que la temperature des snapshots soit celle
152    !  sur l'altitude de reference S0
153
154    !  ATTENTION. Pour l'instant Ssnap(:,:,itr)= S topo initiale
155    !  ensuite il faudra lire Ssnap dans le  fichier forcage
156
157    ! corrections liees a la difference d'altitude
158    ! Les champs sont remis a l'altitude de reference S0 (souvent c'est l'actuel)
159
160    do itr=1,ntr           ! boucle sur les snapshot
161       do j=1,ny
162          do i=1,nx
163
164             do mo=1,mois
165
166                T_surf_ref = - lapserate(i,j,mo) * (Ssnap(i,j,itr)-S0(i,j)) & ! T_surf_ref T a la surface de reference S0
167                     + Tm(i,j,mo,itr)         
168
169                Pm(i,j,mo,itr)= Pm(i,j,mo,itr)*exp(0.05*(T_surf_ref-Tm(i,j,mo,itr)))
170
171                Tm(i,j,mo,itr)=T_surf_ref
172
173             end do
174          end do
175       end do
176
177
178       ! fichiers donnant l'evolution temporelle
179       ! ---------------------------- ------------
180
181       rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
182       read(num_param,forc_temporel)
183
184       write(num_rep_42,428)'!___________________________________________________________' 
185       write(num_rep_42,428) '&forc_temporel                            ! module climat_forcage_mois_mod'
186       write(num_rep_42,'(A,A)')   'file_temporel =', file_temporel
187       write(num_rep_42,*)     'mincoefbmelt      =', mincoefbmelt 
188       write(num_rep_42,*)     'maxcoefbmelt      =', maxcoefbmelt 
189       write(num_rep_42,*)'/'                     
190       write(num_rep_42,428) '!fichier forcage temporel pour snapshot'
191       write(num_rep_42,*)
192
193       file_temporel=trim(dirforcage)//trim(file_temporel)
194
195       open(20,file=file_temporel,status='old')
196
197       read(20,*) control,nft
198
199       print*,'control',control,nft
200
201       ! Determination of file size (line nb), allocation of perturbation array
202       if (control.ne.'nb_lines') then
203          write(6,*) file_temporel,'indiquer le nb de ligne en debut de fichier:'
204          write(6,*) 'le nb de lignes et le label de control nb_lines'
205          stop
206       endif
207
208       if (.not.allocated(tdate)) then
209
210          allocate(TDATE(nft),stat=err)
211          if (err/=0) then
212             print *,"Erreur à l'allocation du tableau TDATE",err
213             stop 4
214          end if
215       end if
216
217       if (.not.allocated(alphat)) then
218
219          allocate(alphaT(nft),stat=err)
220          if (err/=0) then
221             print *,"Erreur à l'allocation du tableau alphaT",err
222             stop 4
223          end if
224       end if
225
226       if (.not.allocated(alphap)) then
227
228          allocate(alphap(nft),stat=err)
229          if (err/=0) then
230             print *,"Erreur à l'allocation du tableau alphap",err
231             stop 4
232          end if
233       end if
234
235
236       if (.not.allocated(spert)) THEN
237
238          allocate(spert(nft),stat=err)
239          if (err/=0) then
240             print *,"Erreur à l'allocation du tableau SPERT",err
241             stop 4
242          end if
243       end if
244
245       do I=1,nft
246          read(20,*) TDATE(I),alphaT(I),SPERT(I)           ! forc inso
247       end do
248
249    end do
250
251
252  end subroutine input_clim
253  !--------------------------------------------------------------------------------
254  !> SUBROUTINE: input_climat_ref
255  !! Routine pour définir le climat de reference
256  !! @note Quand on traite en absolu, pas besoin du climat de reference
257  !>
258  subroutine input_climat_ref
259    ! quand on traite en absolu, pas besoin du climat de reference
260
261  end subroutine input_climat_ref
262  !> SUBROUTINE: init_forclim
263  !!  Routine d'initialisation du clacul du climat au cours du temps
264  !>
265  SUBROUTINE init_forclim
266
267    alphaP(:)=1.0
268
269  end subroutine init_forclim
270  !---------------------------------------------------------------------
271  !> SUBROUTINE: forclim
272  !!  Routine calcul le forcage climatique au cours du temps
273  !>
274  subroutine forclim
275
276    implicit none
277
278    real COEFT,COEFP       !
279    integer l              !< dumm index for loops on snapshots files  l=ITR,NTR-1
280    integer itr            !< index of the current snapshot file (change with time)
281
282    integer ii,jj
283
284    ! debut boucle sur itr ?
285    !=========================
286    ! Pour les runs avec plusieurs snapshots, il faudra utiliser alpha_t et alpha_p
287    ! pour definir Tm_time comme une combinaison lineaire de 2 snapshots
288
289    ! ex: Tm_time = alpha_T * Tm(:,:,itr) + (1-alpha_T) * Tm(:,:,itr+1)
290    ! dans cet exemple alpha=0 pour le present
291
292
293    ! run mensuels stationnaires pour le snapshot itr
294
295    do mo=1,mois
296       Tm_time(:,:,mo)=Tm(:,:,mo,itr)
297       Pm_time(:,:,mo)=Pm(:,:,mo,itr)
298    end do
299
300    ! fin de la boucle sur les itr
301
302    ! coefbmshelf coefficient pour la fusion basale sous les ice shelves
303
304    coefbmshelf=max(coefbmshelf,mincoefbmelt)
305    coefbmshelf=min(coefbmshelf,maxcoefbmelt)
306
307
308
309    !  Correction d'altitude pour la temperature y compris sur les lacs
310    ! Zs est l'altitude de la surface qu'elle soit mer, glace ou lac
311    do j=1,ny
312       do i=1,nx
313          ZS(I,J)=max(slv(i,j),S(I,J))
314          do mo=1,mois
315             Tm_surf(i,j,mo)= - lapserate(i,j,mo) * (Zs(i,j)-S0(i,j)) & ! correction d'altitude T
316                  + Tm_time(i,j,mo) 
317
318             Pm_surf(i,j,mo)= Pm_time(i,j,mo)*exp(0.05*(Tm_surf(i,j,mo)-Tm_time(i,j,mo)))
319
320          end do
321       end do
322    end do
323
324    ! POur les modulos
325
326    Tm_surf(:,:,mois+1)=Tm_surf(:,:,1)
327    Pm_surf(:,:,mois+1)=Pm_surf(:,:,1)
328
329
330    call accum_month()                ! dans SOURCES
331    call ablation_month()
332
333
334
335  END subroutine forclim
336
337  !------------------------------------------------------------------------------------------------------------
338   !> SUBROUTINE: lect_lapserate_months
339  !!  Routine de lecture des lapserates mensuels
340  !!  @note Lapserates mensuels mais uniformes spatialement
341  !>
342  subroutine lect_lapserate_months  ! lapserates mensuels mais uniformes spatialement
343
344    implicit none
345    real,dimension(12) :: lect_lapse       ! pour la lecture
346
347    namelist/lapse_month/lect_lapse
348
349    ! lecture de la namelist
350
351    ! formats pour les ecritures dans 42
352428 format(A)
353
354    rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
355    read(num_param,lapse_month)
356
357    write(num_rep_42,428)'!___________________________________________________________' 
358    write(num_rep_42,428) '&lapse_month                                          !  module climat_forcage_mois_mod'
359    write(num_rep_42,'(A,12(f0.2,","))')  'lapse_month  = ', lect_lapse
360    write(num_rep_42,*)'/'                     
361    write(num_rep_42,428) '! laspe rates janvier -> decembre en deg/km'
362
363
364    ! pour repasser en deg/m et copier dans lapserate
365
366    do j=1,ny
367       do i=1,nx
368          lapserate(i,j,:)=lect_lapse(:)/1000.
369       end do
370    end do
371  end subroutine lect_lapserate_months
372  !--------------------------------------------------------------------------------------------------------
373
374end module climat_forcage_mois_mod
Note: See TracBrowser for help on using the repository browser.