source: trunk/SOURCES/out_horiz_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: 11.3 KB
Line 
1!> \file out_horiz_mod.f90
2!! Module avec les routines d'ecriture et de lecture de fichiers horizontaux
3!<
4
5!> \namespace out_hz
6!! This module gathers routines to read and write horizontal files
7!! \author ...
8!! \date ...
9!! @note Used module
10!! @note   - use geography
11!! @note   - use runparam
12!<
13
14module out_hz
15
16use geography     ! permet d'avoir nx et ny et geoplace
17use runparam       ! permet d'avoir tbegin,tend,runname,dirout
18 
19implicit none
20
21integer, parameter :: ncol=50           !< nombre maxi de colonnes de sortie
22integer,parameter :: nvar=100           !< nombre maxi de variables dans LISTE-VAR-HZ.dat
23integer  :: ndtsortie   !< nombre de dtsortie
24integer  :: npredeft    !< nombre de temps de sortie predefinis
25integer  :: iglob_hz=0
26integer :: ivar         !< index representant le numer d'une variable dans  LISTE-VAR-HZ.dat
27integer :: npos=0       !< position dans xxx, initialise a 0
28
29
30! tableaux dont l'indice est npos (position en numero de colonne)
31
32real,dimension(nx,ny,ncol) ::  xxx         !< tableau qui va contenir les variables à sortir
33integer,dimension(ncol) :: varnumber    !< numero de la variable en position npos
34character(len=8),dimension(ncol) :: formatcol !< le format de sortie pour une colonne
35character(len=6),dimension(ncol) :: colname   !< le nom de la variable pour une colonne
36
37
38! Pour chaque variable (definies dans  LISTE-VAR-HZ.dat)
39! tableaux "caracteristiques de sortie" attachées a la variable
40! indice dans ces tableaux : ivar=varnumber(npos)
41
42integer,dimension(nvar) :: isortie=0    !< si isortie=0, pas de sortie du tout.
43integer,dimension(nvar) :: isort_time   !< 1 si sortie au temps time
44integer,dimension(nvar) :: interv       !< entier qui code quel dtsortie utiliser
45real,dimension(nvar) :: dtsortvar       !< pas de temps de sortie de chaque variable
46
47real,dimension(nvar) :: coefsortvar     !< coefficient multiplicateur des sorties
48real,dimension(nvar) :: minvar          !< valeur minimu de la variable    !pour éviter des ***
49real,dimension(nvar) :: maxvar          !< valeur maximum de la variable   ! dans le format f
50character(len=6),dimension(nvar) :: varname   !< le nom de la variable
51character(len=8),dimension(nvar) :: formatvar !< le format de sortie
52
53
54
55double precision, dimension(:),allocatable :: dtsortie_hz  !< tableau des dtsortie : dimension (ndtsortie)
56real,dimension(:),allocatable :: predef_tsort  !< tableau des temps predefinis pour sorties :
57                                               !< dimension (npredft)
58
59
60
61character(len=10) :: comment 
62character (len=6) :: varchar
63
64         
65contains
66
67!__________________________________________________________________________
68!> SUBROUTINE: init_out_hz
69!! Initialise les tableaux pour les sorties horizontaux
70!>
71  subroutine init_out_hz
72
73    implicit none
74    integer :: err   !< recuperation d'erreur
75    integer :: ivar
76    integer :: i2
77    integer :: i3
78    integer  :: i,j,k !< indices de travail
79
80    integer :: num_dat = 21
81
82    ! initialise les tableaux
83    !----------------------------
84    ! dtsortie_hz, predef_tsort 
85    ! isortie,interv,dtsortvar,coefsortvar,varname,formatvar
86
87    ! lecture des pas de temps de sortie
88    !------------------------------------
89    open(num_dat,file='../'//trim(dirsource)//'/Fichiers-parametres/TEMPS-HZ.dat')
90
91    ! passe les commentaires qui se terminent par une ligne de ~~~
92    comment1: do k=1,500
93       read(num_dat,'(a10)') comment
94
95       if (comment.eq.'~~~~~~~~~~') exit comment1
96    end do comment1
97
98
99    ! lecture frequences de sortie
100    read(num_dat,*) ndtsortie
101
102    if (.not.allocated(dtsortie_hz)) THEN
103       allocate(dtsortie_hz(ndtsortie),stat=err)
104       if (err/=0) then
105          print *,"Erreur à l'allocation du tableau dtsortie_hz ",err
106          stop 4
107       end if
108    end if
109
110    do k=1,ndtsortie
111       read(num_dat,*) dtsortie_hz(k)
112    end do
113
114    read(num_dat,*)  ! saute une ligne
115
116    ! lecture pas de temps predefinis
117    read(num_dat,*) npredeft
118
119
120    if (.not.allocated(predef_tsort)) THEN
121       allocate(predef_tsort(npredeft),stat=err)
122       if (err/=0) then
123          print *,"Erreur à l'allocation du tableau dt-out_hz ",err
124          stop 4
125       end if
126    end if
127
128    do k=1,npredeft
129       read(num_dat,*) predef_tsort(k)
130    end do
131    close(num_dat)
132
133    ! Lecture des variables et de leur frequence de sortie
134    !-----------------------------------------------------------
135
136    open(num_dat,file='../'//trim(dirsource)//'/Fichiers-parametres/LISTE-VAR-HZ.dat')
137
138    !saute les commentaires
139    comment2: do k=1,500
140       read(num_dat,'(a10)') comment
141       if (comment.eq.'~~~~~~~~~~') exit comment2
142    end do comment2
143
144
145    do k=1,100
146       read(num_dat,'(a6)',end=500,err=500) varchar
147       read(num_dat,*,end=500,err=500) ivar,i2,i3
148
149       varname(ivar)=' '//varchar
150       isortie(ivar)=i2
151       interv(ivar)=i3
152
153       if ((i3.gt.0).and.(i3.le.ndtsortie)) then
154          dtsortvar(ivar)=dtsortie_hz(i3)
155       else
156          dtsortvar(ivar)=1.e10
157       endif
158
159       read(num_dat,'(a8)',end=500,err=500) formatvar(ivar)
160       !  call minmax_format(minvar(ivar),maxvar(ivar),formatvar(ivar))
161
162       read(num_dat,*,end=500,err=500) coefsortvar(ivar)
163       !  print*,'k=',k,ivar,varname(ivar),interv(ivar),dtsortvar(ivar),formatvar(ivar),coefsortvar(ivar)
164       read(num_dat,*,end=500,err=500)
165    end do
166
167    goto 510
168500 continue
169    !    write(6,*) 'nombre de variables dans liste_var',k
170510 continue
171
172
173    close (num_dat)
174    return
175  end subroutine init_out_hz
176
177!> SUBROUTINE: testsort_time
178!! Teste variable par variable si la sortie hz est faite à ce temps là
179!! \param tsortie temps de sortie
180!>
181
182subroutine testsort_time(tsortie)
183
184implicit none
185double precision :: dbltime
186real :: tsortie
187real :: difftime  !< difference  tsortie-predef_tsort(npr)
188real :: debtime   !< difference abs(tsortie-tbegin)
189real :: fintime   !< difference abs(tsortie-tend)
190integer   :: ipredef
191integer   :: ideb
192integer   :: ifin
193integer   :: npr
194integer  :: i,j,k ! indices de travail
195
196
197!
198!           exemple.  si dt_out_hz=(1000,5000,10000)
199!                    interv=2        la sortie se fera tous les 5000 ans
200!                    interv=0        la sortie se fera seulement sur les pas de temps predefinis
201!                    interv=-1       la sortie ne se fait qu'aux premier  pas de temps
202!                    interv=-2       la sortie ne se fait qu'au premier et au dernier pas de temps
203
204
205        isort_time(:)=0
206        dbltime=dble(tsortie)
207! recherche si ce pas de temps est un pas de temps predefini
208        ipredef=0
209        ideb=0
210        ifin=0
211       
212
213predef:  do npr=1,npredeft
214           difftime=abs(tsortie-predef_tsort(npr))
215           if (difftime.lt.dttest) then
216              ipredef=1
217              exit predef
218           end if
219           debtime=abs(tsortie-tbegin)
220           fintime=abs(tsortie-tend)
221
222           if ((debtime.lt.dttest).or.(nt.eq.1)) ideb=1
223           if (fintime.lt.dttest) ifin=1
224
225        end do predef
226
227! boucle sur les numeros de variables
228boucle_var: do i=1,nvar
229
230                if (isortie(i).eq.0) then  ! variables non attribuees et
231                                           ! variables ou isortie est explicitement 0
232                   isort_time(i)=0
233
234                else                       ! variables dont on veut la sortie
235
236                   if ((interv(i).ge.0).and.(ipredef.eq.1)) then   ! pas de temps predefini
237                     isort_time(i)=1
238
239                   else if ((interv(i).le.-1).and.(ideb.eq.1)) then ! sortie a Tbegin
240                      isort_time(i)=1
241                     
242                   else if ((interv(i).eq.-2).and.(ifin.eq.1)) then ! sortie a Tend
243                      isort_time(i)=1
244
245                   else if (mod(abs(dbltime),dtsortvar(i)).lt.dble(dttest)) then
246                      isort_time(i)=1
247
248                                            ! le test est en dble car quand le temps est tres
249                                            ! grand, on peut avoir des problemes d'arrondi
250                   endif
251
252                endif
253
254             end do  boucle_var
255
256! initialise npos et iglob_hz
257     npos=0
258     iglob_hz=maxval(isort_time)
259
260return
261
262end subroutine testsort_time
263!--------------------------------------------------------------------------
264!> SUBROUTINE: rempli_xxx
265!! Rempli la colonne npos des tableaux xxx,varnumber,formatcol,colname
266!! \param numvar  Le numero de la variable
267!! \param Var     Nom de variable Var dans la liste LISTE-VAR-HZ.dat
268!>
269subroutine rempli_xxx(numvar,Var)
270! rempli la colonne npos des tableaux xxx,varnumber,formatcol,colname
271! numvar est le numero de la variable Var dans LISTE-VAR-HZ.dat
272!
273
274implicit none
275
276integer :: numvar
277real,dimension(nx,ny) :: var
278real :: mincol
279real :: maxcol
280real :: coef
281 integer  :: i,j,k ! indices de travail
282
283npos=npos+1
284coef=coefsortvar(numvar) ! coefficient multiplicateur
285mincol=minvar(numvar)
286maxcol=maxvar(numvar)
287varnumber(npos)=numvar
288formatcol(npos)=formatvar(numvar)
289colname(npos)=varname(numvar)
290
291
292xxx(:,:,npos)=var(:,:)*coef 
293
294! applique les minmax
295!do j=1,ny
296!   do i=1,nx
297!      xxx(i,j,npos)=min(xxx(i,j,npos),maxcol)
298!      xxx(i,j,npos)=max(xxx(i,j,npos),mincol)
299!   end do
300!end do   
301
302return
303end subroutine rempli_xxx
304!---------------------------------------------------------------------------
305!> SUBROUTINE: hz_output()
306!! Remplace plotoutput. Ecrit le tableau xxx dans un fichier avec le nom runname//snapname//.hz
307!! \param tsortie  temps de sortie
308!>
309
310subroutine hz_output(tsortie)
311
312 implicit none
313 real tsortie
314
315 character(len=1000) :: filout
316 character(len=4) :: sep      !< pour le format de sortie
317 character(len=1) :: fin      !< pour le format de sortie
318 character(len=1) :: deb      !< pour le format de sortie
319 character(len=1000) :: fmtxxx       !< pour le format de sortie xxx
320 character(len=1000) :: fmtcolname   !< pour le format colname
321 character(len=1000) :: fmtvarnumber !< pour le format varnumber
322 character(len=3) :: charncol   
323 character(len=30) :: snapname
324 integer  :: i,j,k ! indices de travail
325      integer :: num_forc = 20
326
327!write(6,*) 'hz_output  time=', tsortie,'npos=',npos
328
329if (npos.eq.0) goto 900
330
331! nom du fichier
332call snaptime(tsortie,snapname)
333      filout =trim(runname)//trim(snapname)//'.hz'
334      filout = TRIM(DIRNAMEOUT)//TRIM(filout)
335
336!write(6,*) 'sortie hz pour time=',tsortie,'nb colonnes=',npos
337
338open(num_forc,file=filout)
339
340! ecriture de la ligne format pour xxx
341 sep=',1x,'
342 deb='('
343 fin=')'
344 fmtxxx=deb
345
346 do k=1,npos-1
347  fmtxxx=trim(fmtxxx)//trim(formatcol(k))//sep 
348 end do
349
350 fmtxxx=trim(fmtxxx)//trim(formatcol(npos))//fin
351
352! met npos dans un character pour faire le format
353
354 write(charncol,fmt='(i3)') npos
355 charncol=adjustl( charncol) ! justifie a gauche
356
357! format pour varname
358 fmtcolname=deb//trim(charncol)//deb//'a6'//',1x),1x'//fin
359
360! format pour varnumber
361 fmtvarnumber=deb//trim(charncol)//deb//'i3'//',1x),1x'//fin
362
363 
364! ecriture dans le fichier sortie
365  write(num_forc,*) tsortie, geoplace, '       time, geoplace'
366  write(num_forc,'(10(i0,1x),a46)') nx*ny,npos,nx,ny,nint(dx/1000.),nint(seasea),xmin,xmax,ymin,ymax,& 
367            'nx*ny,ncol,nx,ny,dx,sealev,xmin,xmax,ymin,ymax'
368  write(num_forc,fmt=trim(fmtvarnumber)) (varnumber(k),k=1,npos)
369  write(num_forc,fmt=trim(fmtcolname)) (colname(k),k=1,npos)
370
371 do j=1,ny
372  do i=1,nx
373     write(num_forc,fmt=trim(fmtxxx)) (xxx(i,j,k),k=1,npos)
374  end do
375 end do
376 close(num_forc)
377
378900 continue
379 return
380
381end subroutine  hz_output
382 
383
384!--------------------------------------------------------------------------
385
386
387end module out_hz
388     
Note: See TracBrowser for help on using the repository browser.