source: trunk/SOURCES/Ant40_files/lect-anteis_mod.f90 @ 86

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

Bug correction in flottab : call to determin_tache suppressed | sealevel added in Netcdf output class 1

File size: 9.3 KB
Line 
1!> \file lect-anteis_mod.f90
2!!Module pour la lecture de la topographie
3!<
4
5!> \namespace lect_topo_anteis
6!! Module pour la lecture de la topographie
7!! \author ...
8!! \date ...
9!! @note Used module
10!! @note   - use module3D_phy
11!! @note   - use param_phy_mod
12!<
13module lect_topo_anteis
14
15  use module3D_phy
16  use interface_input
17  use io_netcdf_grisli
18
19  implicit none
20
21  character(len=100) :: topo_dep       ! Topo de départ
22  character(len=100) :: topo_ref       ! Topo de référence
23  character(len=100) :: grid_topo      ! fichier grille
24  character(len=100) :: ghf_fich       ! fichier grille
25  character(len=100) :: filin
26  character(len=100) :: file_ncdf      !< fichier netcdf issue des fichiers .dat
27
28!  character(len=100) :: file1
29!  character(len=100) :: file2
30
31  real, dimension(nx,ny,5) :: bidon          ! pour l'appel a courbure
32  real :: sealevel0
33
34contains
35 
36  subroutine input_topo
37
38    integer :: ios
39    ! pour les lectures ncdf
40    real*8, dimension(:,:),   pointer    :: tab               !< tableau 2d real pointer
41
42    namelist/topo_file/topo_ref,topo_dep,grid_topo,ghf_fich
43    rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
44    read(num_param,topo_file)
45    ! formats pour les ecritures dans 42
46428 format(A)
47    write(num_rep_42,428)'!___________________________________________________________' 
48    write(num_rep_42,428) '&topo_file                                  !  input_topo  '
49    write(num_rep_42,'(A,A)') 'topo_ref = ', topo_ref
50    write(num_rep_42,'(A,A)') 'topo_dep = ', topo_dep
51    write(num_rep_42,'(A,A)') 'grid_topo =', grid_topo
52    write(num_rep_42,'(A,A)') 'ghf_fich = ', ghf_fich
53    write(num_rep_42,*)'/'                     
54    write(num_rep_42,428) '! topo_ref= topo ref isostasie'
55    write(num_rep_42,428) '! topo_dep= topo de depart'
56    write(num_rep_42,428) '! grid_topo : fichier i,j,x,y,lon,lat'
57    write(num_rep_42,428) '! ghf_fich  : fichier flux geothermique' 
58    write(num_rep_42,*)
59
60    topo_ref=trim(dirnameinp)//trim(topo_ref) 
61    topo_dep=trim(dirnameinp)//trim(topo_dep) 
62    grid_topo=trim(dirnameinp)//trim(grid_topo)
63    ghf_fich=trim(dirnameinp)//trim(ghf_fich)
64
65
66    ! lecture adaptee aux fichiers intercomparaison EISMINT
67    nxx=nx
68    nyy=ny
69
70!!$!     lecture de la topo actuelle
71!!$!     ---------------------------
72!!$     open (20,file=TRIM(DIRNAMEINP)//file2,status='old')
73!!$       
74!!$     read(20,'(A80)') TITRE
75!!$     read(20,*) NI,NJ,NXX,NYY,STEP
76!!$     read(20,*)
77!!$         do J=1,ny
78!!$          do I=1,nx
79!!$             read (20,*)  S0(I,J),H0(I,J),BSOC0(I,J)
80!!$             S0(i,j)=max(S0(i,j),0.)
81!!$          end do
82!!$        end do
83!!$     close(20)
84!!$
85!!$     
86!!$!     lecture de la topo de depart
87!!$!     ---------------------------
88!!$     open (20,file=TRIM(DIRNAMEINP)//file1,status='old')
89!!$!         open (20,file='../INPUT-DATA/hemin.g50')
90!!$     read(20,'(A80)') TITRE
91!!$     read(20,*) NI,NJ,NXX,NYY,STEP
92!!$     read(20,*)
93!!$         do J=1,ny
94!!$          do I=1,nx
95!!$             read (20,*) S(I,J),H(I,J),BSOC(I,J)
96!!$          end do
97!!$        end do
98!!$     close(20)
99
100    !     lecture de la topo de référence
101    !     -------------------------------
102    ! Cette topo sert a calculer le socle de reference pour l'isostasie
103    ! voir init_iso et a avoir une surface de reference pour les temperatures
104    ! lecture adaptee aux fichiers ZBL.dat ou netcdf ou grd
105!    call lect_input(1,'Bsoc',1,Bsoc0,topo_ref,file_ncdf)    ! socle
106!    call lect_input(1,'S',1,S0,topo_ref,file_ncdf)          ! surface
107!    call lect_input(1,'H',1,H0,topo_ref,file_ncdf)          ! epaisseur
108
109! lecture pour eviter plantage avec compile -O0
110     call Read_Ncdf_var('Bsoc',topo_ref,tab)
111     Bsoc0(:,:)  = tab(:,:)
112     call Read_Ncdf_var('S',topo_ref,tab)
113     S0(:,:)  = tab(:,:)
114     call Read_Ncdf_var('H',topo_ref,tab)
115     H0(:,:)  = tab(:,:)
116!~ !cdc correction de 3 pts qui posent probleme (pente tres forte):
117!~      S0(38,53)=1400.
118!~      Bsoc0(38,53)=-1000.
119!~      H0(38,53)=S0(38,53)-Bsoc0(38,53)
120!~     
121!~      S0(35,53)=1300.
122!~      Bsoc0(35,53)=-1000.
123!~      H0(35,53)=S0(35,53)-Bsoc0(35,53)
124!~     
125!~      S0(35,56)=1200.
126!~      Bsoc0(35,56)=-1000.
127!~      H0(35,56)=S0(35,56)-Bsoc0(35,56)
128
129!cdc correction point pole sud :
130!    S0(71,71)=(S0(71,70)+S0(71,72)+S0(70,71)+S0(72,71))/4.
131!    Bsoc0(71,71)=(Bsoc0(71,70)+Bsoc0(71,72)+Bsoc0(70,71)+Bsoc0(72,71))/4.
132
133
134!    where (S0(:,:).GT.0)
135!       H0(:,:)=S0(:,:)-BSOC0(:,:)
136!    elsewhere
137!       H0(:,:)=1.
138!    endwhere
139
140
141    where (BSOC(:,:).LT.-9999.)
142       BSOC(:,:)=-9999.
143    endwhere
144
145    sealevel0=0.  ! voir a passer dans le fichier parametre
146    S0(:,:)=max(S0(:,:),sealevel0)   ! pour etre au niveau des mers : ATTENTION si SEALEV <0
147    mk0(:,:) = 1                   ! mk0=0 pour les zones interdites
148
149    !     lecture de la topo de depart
150    !     ---------------------------
151    ! lecture adaptee aux fichiers ZBL.dat ou netcdf ou grd
152!    call lect_input(1,'Bsoc',1,Bsoc,topo_dep,file_ncdf)    ! socle
153!    call lect_input(1,'S',1,S,topo_dep,file_ncdf)          ! surface
154!    call lect_input(1,'H',1,H,topo_dep,file_ncdf)          ! epaisseur
155    ! lecture pour eviter plantage avec compile -O0
156     call Read_Ncdf_var('Bsoc',topo_dep,tab)
157     Bsoc(:,:)  = tab(:,:)
158     call Read_Ncdf_var('S',topo_dep,tab)
159     S(:,:)  = tab(:,:)
160     call Read_Ncdf_var('H',topo_dep,tab)
161     H(:,:)  = tab(:,:)
162     
163!~ !cdc correction de 3 pts qui posent probleme (pente tres forte):
164!~      S(39,54)=1400.
165!~      Bsoc(39,54)=-1000.
166!~      H(39,54)=S(39,54)-Bsoc(39,54)
167!~     
168!~      S(36,54)=1300.
169!~      Bsoc(36,54)=-1000.
170!~      H(36,54)=S(36,54)-Bsoc(36,54)
171!~     
172!~      S(36,57)=1200.
173!~      Bsoc(36,57)=-1000.
174!~      H(36,57)=S(36,57)-Bsoc(36,57)
175   
176!    S(71,71)=(S(71,70)+S(71,72)+S(70,71)+S(72,71))/4.
177!    Bsoc(71,71)=(Bsoc(71,70)+Bsoc(71,72)+Bsoc(70,71)+Bsoc(72,71))/4.
178!    where (S(:,:).GT.0)
179!       H(:,:)=S(:,:)-BSOC(:,:)
180!    elsewhere
181!       H(:,:)=1.
182!    endwhere
183    S(:,:)=max(S(:,:),0.)   ! pour etre au niveau des mers : ATTENTION si SEALEV <0
184    H(:,:)=max(H(:,:),1.)   ! pour avoir au moins 1 m
185
186
187!!$
188!!$    ! socle
189!!$    filin='bedelev-2000-40km.dat'
190!!$    call lect_eis(nx,ny,BSOC,filin,DIRNAMEINP)
191!!$    write(num_rep_42,*) 'fichier BSOC (socle) : ', filin
192!!$    Bsoc0(:,:)=Bsoc(:,:)
193!!$    !  surface
194!!$    filin='surface-2000-40km.dat'
195!!$    call lect_eis(nx,ny,S,filin,DIRNAMEINP)
196!!$    write(num_rep_42,*) 'fichier surface : ', filin
197!!$
198!!$    !     epaisseur
199!!$    filin='icethic-2000-40km.dat'
200!!$    call lect_eis(nx,ny,H,filin,DIRNAMEINP)
201!!$    write(num_rep_42,*) 'fichier epaisseur : ', filin
202!!$    H0(:,:)=H(:,:)
203!!$
204!!$
205!!$    !     masque
206!!$    filin='maskHUY40km.dat'
207!!$    call lect_ieis(nx,ny,MK0,filin,DIRNAMEINP)
208!!$    write(num_rep_42,*) 'fichier masque : ', filin
209!!$
210!!$    !     enlever les epaisseurs fictives de Philippe
211!!$    do I=1,NX
212!!$       do J=1,NY
213!!$          !     attention les valeurs de masque de Philippe sont differentes
214!!$          if ((MK0(I,J).gt.1).and.(H(i,j).le.218.00)) then ! mer libre
215!!$             H(i,j)=1.
216!!$             S(I,J)=H(i,j)-(RO/ROW)*H(i,j)
217!!$          endif
218!!$       end do
219!!$    end do
220
221
222!    S0(:,:)=S(:,:)
223
224    ! pour l'Antarctique masque mko vrai partout (version 2006)
225    MK0(:,:)=1
226
227    ! determination des flot
228    do J=1,NY
229       do I=1,NX
230          if (((BSOC(I,J)+H(I,J)*RO/ROW -SEALEVEL).LT.0.).and.(H(I,J).gt.1.E-3)) then
231             FLOT(I,J)=.TRUE.
232          else
233             FLOT(I,J)=.FALSE.
234          endif
235       enddo
236    enddo
237
238
239! calcul des courbures du socle
240
241!     call courbure(nx,ny,dx,Bsoc,bidon(:,:,1),bidon(:,:,2),bidon(:,:,3), &
242!          bidon(:,:,4),socle_cry,bidon(:,:,5))
243!     socle_cry(:,:)=socle_cry(:,:)*dx*dx
244
245    ! lecture des coordonnées geographiques
246!    filin=TRIM(DIRNAMEINP)//'coord-Ant-40km.dat'
247
248    ! les coordonnees sont calculees en °dec avec GMT,
249    ! les longitudes sont comprises entre -180 et +180 (negative a l'Ouest de
250    ! Greenwich et positive a l'Est)
251    open(unit=2004,file=grid_topo,iostat=ios)
252    do k=1,nx*ny
253       read(2004,*) i,j,xcc(i,j),ycc(i,j),Xlong(i,j),Ylat(i,j)
254    enddo
255    close(2004)
256
257    xmin=xcc(1,1)/1000.
258    ymin=ycc(1,1)/1000.
259    xmax=xcc(nx,ny)/1000.
260    ymax=ycc(nx,ny)/1000.
261
262!!$    !     lecture du fichier de reference pour le calcul du niveau des mers : etat actuel
263!!$    open(88,file=TRIM(DIRNAMEINP)//'grzone56-k000.pl')
264!!$
265!!$    read(88,*)
266!!$    read(88,*)
267!!$    read(88,*)
268!!$    do j=1,ny
269!!$       do i=1,nx
270!!$          read(88,*) S_sealev(i,j),H_sealev(i,j),B_sealev(i,j),M_sealev(i,j)
271!!$       enddo
272!!$    enddo
273!!$    close(88)
274!!$
275!!$    write(num_rep_42,*) 'fichier reference pour le niveau des mers : ', &
276!!$         TRIM(DIRNAMEINP)//'grzone56-k000.pl'
277
278    ! lecture du flux geothermique de Shapiro
279    open(88,file=ghf_fich)
280
281!    write(num_rep_42,*) 'flux geothermique Shapiro : ', TRIM(DIRNAMEINP)//'ijphi-40km-ant.dat'
282!    do k=1,nx*ny
283!       read(88,*) i,j,ghf(i,j)
284!    end do
285!    close(88)
286
287!    call lect_input(1,'ghf',1,ghf,ghf_fich,file_ncdf)
288    ! pour eviter plantage -O0
289    call Read_Ncdf_var('ghf',ghf_fich,tab)
290    ghf(:,:)  = tab(:,:)
291
292    ! pour passer les flux des mW/m2 au J/m2/an     
293    ghf(:,:)=-SECYEAR/1000.*ghf(:,:)
294
295!------------------------------------------------
296! mko vrai partout (version 2006)
297    MK0(:,:)=1
298
299!------------------------------------------------
300
301
302  end subroutine input_topo
303
304
305end module lect_topo_anteis
Note: See TracBrowser for help on using the repository browser.