source: branches/iLoveclim/SOURCES/climat_coupl_atm_mod.f90 @ 90

Last change on this file since 90 was 89, checked in by aquiquet, 8 years ago

minor GRISLI-iLOVECLIM compatibility corrections + ifort as default compiler

File size: 7.6 KB
Line 
1module climat_coupl_atm_mod                   
2
3! forcage avec champs mensuels
4! equilibre climatique avec 1 seul snapshot climatique
5! lecture fichiers snapshots climat Temp et Precip mensuels (2 fichiers)
6! nouvelle version avec liste des variables utilisées par le module
7! C. Dumas 02/2015
8
9USE module3D_phy,only:nx,ny,sealevel,seasea,Tann,Tjuly,Tmois,Pmois,acc,coefbmshelf,ro,num_param,num_rep_42,dirforcage,num_forc,time
10!use netcdf
11!use io_netcdf_grisli
12!USE printtable
13       
14implicit none
15real :: mincoefbmelt            ! butoirs mini
16real :: maxcoefbmelt            ! butoirs maxi de coefbmshelf
17character(len=80) :: filforc    ! nom du fichier forcage
18real,dimension(:),allocatable :: tdate          ! time for climate forcing
19real,dimension(:),allocatable :: spert          ! sea level perturbation
20integer :: nft             !   nft nbr lignes a lire dans le fichier contenant le forcage climatique
21
22integer,parameter :: nbmois=12
23logical :: snow ! Flag pour selectionner precip liq ou acc neige
24
25
26real,dimension(nx,ny,nbmois) :: Tm                    ! temperature mensuelle
27real,dimension(nx,ny,nbmois) :: Pm                    ! precipitation mensuelle
28
29real,dimension(nx,ny,nbmois) :: Tm_surf                 ! surface temperature (after topo. correction) 13 nbmois pour modulo
30real,dimension(nx,ny,nbmois) :: Pm_surf                 ! surface precipitation (after topo. correction)
31
32real,dimension(nx,ny) :: ZS                             !< surface topography above sea level
33
34real,dimension(nx,ny,nbmois) :: lapserate                 ! lapse rate
35real :: psolid=2.                                      ! temp limit between liquid and solid precip
36
37character(len=200)  :: filin                            ! nom temporaire
38!character(len=100) :: file_temporel                    ! forcage temporel
39!character(len=100),dimension(ntr) :: filtr_t, filtr_p   ! snapshot file name
40character(len=100) :: filtr_t1,filtr_p1                 ! snapshot file name
41
42
43contains
44
45! 2=lecture des inputs
46!--------------------
47
48subroutine input_clim                                   ! routine qui permet d'initialiser les variables climatiques
49
50! variables locales
51!-------------------
52
53  implicit none
54  integer :: i,j,mo,ti,tj 
55  character(len=8) :: control   ! label to check clim. forc. file (filin) is usable
56  integer :: l                  ! In snapshot files:the first column is the mask, read but not used
57  real :: T_surf_ref            ! variable de travail calcul temp a l'instant t a la surface S
58  integer :: err                ! pour allocation tableaux
59  real :: toto
60 
61
62! fichiers donnant l'evolution temporelle
63! -----------------------------------------
64! Pour rappel hemin40 :
65! fichier forcage : signal-cycle-hemin.dat
66! Pour anteis :
67! fichier forcage : forcmodif4cycles.dat
68  filin=trim(dirforcage)//trim(filforc) 
69
70! lecture des fichiers d'evolution pour tout geoplace
71! ----------------------------------------------------
72  open(num_forc,file=filin,status='old')
73!        print*,nft
74  read(num_forc,*) control,nft
75  print*,'control',control,nft
76! determination of file size (line nb), allocation of perturbation array
77
78if (control.ne.'nb_lines') then
79         write(6,*) filin,'indiquer le nb de ligne en debut de fichier:'
80         write(6,*) 'le nb de lignes et le label de control nb_lines'
81         stop
82endif
83
84      if (.not.allocated(tdate)) THEN
85       allocate(tdate(nft),stat=err)
86         if (err/=0) then
87           print *,"erreur à l'allocation du tableau tdate",err
88           stop 4
89         end if
90    end if
91
92      if (.not.allocated(spert)) THEN
93       allocate(spert(nft),stat=err)
94         if (err/=0) then
95           print *,"erreur à l'allocation du tableau spert",err
96           stop 4
97         end if
98    end if
99       
100         do i=1,nft
101           read(num_forc,*) tdate(i),toto,toto,spert(i)
102!          print*,tdate(i),alphat(i),alphap(i),spert(i)
103         end do
104
105      close(num_forc)
106 
107end subroutine input_clim
108
109
110
111!-------------------------------------------------------------------------------
112! lecture de la namelist
113subroutine init_forclim
114
115  real,dimension(12) :: lect_lapse       ! lecture lapse rate
116  integer :: mo
117
118
119  namelist/clim_coupl_atm/mincoefbmelt,maxcoefbmelt,filforc,snow
120  namelist/lapse_month/lect_lapse
121
122rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
123read(num_param,clim_coupl_atm)
124
125! formats pour les ecritures dans 42
126428 format(A)
127
128write(num_rep_42,428)'!___________________________________________________________' 
129write(num_rep_42,428) '&clim_coupl_atm                              ! nom du bloc '
130write(num_rep_42,*)
131write(num_rep_42,*) 'mincoefbmelt = ', mincoefbmelt
132write(num_rep_42,*) 'maxcoefbmelt = ', maxcoefbmelt
133write(num_rep_42,'(A,A)') ' filforc      = ', filforc
134write(num_rep_42,*) 'snow = ', snow
135write(num_rep_42,*)'/'
136write(num_rep_42,*)'! mincoefbmelt : borne mini de coefbmshelf'
137write(num_rep_42,*)'! maxcoefbmelt : borne maxi de coefbmshelf'
138write(num_rep_42,*)'! filforc : fichier de forcage nivx des mers'
139write(num_rep_42,*)'! snow   : .true. si neige, .false. si precip'       
140write(num_rep_42,*)
141
142
143! lapserate
144!  namelist/lapse_month/lect_lapse
145  rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
146  read(num_param,lapse_month)
147  write(num_rep_42,428)'!___________________________________________________________' 
148  write(num_rep_42,428) '&lapse_month                                   !  module climat_forcage_mois_mod'
149  write(num_rep_42,'(A,12(f0.2,","))')  'lapse_month  = ', lect_lapse
150  write(num_rep_42,*)'/'                     
151  write(num_rep_42,428) '! laspe rates janvier -> decembre en deg/km'
152  write(num_rep_42,*)
153
154! pour repasser en deg/m et copier dans lapserate
155  do mo=1,nbmois
156     lapserate(:,:,mo)=lect_lapse(mo)/1000.
157  enddo
158
159! coefbmshelf coefficient pour la fusion basale sous les ice shelves
160! ici pas d'evolution temporelle donc coefbmshelf est fixe
161  coefbmshelf=1.
162
163end subroutine init_forclim
164
165
166!---------------------------------------------------------------------
167!forcage climatique au cours du temps
168subroutine forclim
169
170implicit none
171
172  integer i,ift
173 
174 
175 if(time.le.tdate(1)) then   ! time avant le debut du fichier forcage
176   sealevel=spert(1)
177   ift=1
178else if (time.ge.tdate(nft)) then     ! time apres la fin du fichier forcage
179   sealevel=spert(nft)
180   ift=nft
181else                         ! time en general
182   
183   ift = 1     
184   do i=ift,nft-1  ! interpolation entre i et i+1
185
186      if((time.ge.tdate(i)).and.(time.lt.tdate(i+1))) then  ! cas general
187          sealevel=spert(i)+(spert(i+1)-spert(i))*    &
188                 (time-tdate(i))/(tdate(i+1)-tdate(i))
189          ift=i
190          goto 100
191       endif
192
193    end do
194endif
195100   continue
196
197
198coefbmshelf=1. ! modif pour test de sensibilite (tof 20 avril 01)
199coefbmshelf=max(coefbmshelf,mincoefbmelt)
200coefbmshelf=min(coefbmshelf,maxcoefbmelt)
201
202!~ !**********************************************************************
203!~ ! transmission des champs climatiques de iLOVECLIM via pointeurs Tann, Acc, Tjuly, Tmois, Pmois, Bm
204!~ ! Temperatures Annuels, jja et accumulation de neige
205!~ !**********************************************************************
206!~ ! calcul de l'accumulation si on utilise les precips liquides :
207!~ if (.not.snow) then
208!~ !    if (annual.eq.1) then ! la version avec Tann et Tjuly est obsolete !
209!~ !       call accum_annual ! calcul acc a partir de Tann et Tjuly
210!~ !    else if (annual.eq.2) then
211!~       acc(:,:)=sum(Pmois,dim=3,mask=Tmois < psolid) ! /12.
212!~       acc(:,:)=acc(:,:)*1000./ro ! m de glace/an
213!~ !    endif
214!~ endif
215!~     Tann(:,:)=SUM(Tmois(:,:,:),dim=3)/12.
216!~     Tjuly(:,:)=Tmois(:,:,7)
217
218seasea=sealevel        ! pour les sorties
219
220END subroutine forclim
221
222
223end module climat_coupl_atm_mod
Note: See TracBrowser for help on using the repository browser.