source: branches/iLoveclim/SOURCES/out_horiz_mod.f90 @ 89

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

Merge branche iLOVECLIM sur rev 76

File size: 11.5 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  :: 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    !open(num_dat,file=trim(dirsource)//'/Fichiers-parametres/TEMPS-HZ.dat')
91    open(num_dat,file=trim(dirsource)//'/TEMPS-HZ.dat')
92
93    ! passe les commentaires qui se terminent par une ligne de ~~~
94    comment1: do k=1,500
95       read(num_dat,'(a10)') comment
96
97       if (comment.eq.'~~~~~~~~~~') exit comment1
98    end do comment1
99
100
101    ! lecture frequences de sortie
102    read(num_dat,*) ndtsortie
103
104    if (.not.allocated(dtsortie_hz)) THEN
105       allocate(dtsortie_hz(ndtsortie),stat=err)
106       if (err/=0) then
107          print *,"Erreur à l'allocation du tableau dtsortie_hz ",err
108          stop 4
109       end if
110    end if
111
112    do k=1,ndtsortie
113       read(num_dat,*) dtsortie_hz(k)
114    end do
115
116    read(num_dat,*)  ! saute une ligne
117
118    ! lecture pas de temps predefinis
119    read(num_dat,*) npredeft
120
121
122    if (.not.allocated(predef_tsort)) THEN
123       allocate(predef_tsort(npredeft),stat=err)
124       if (err/=0) then
125          print *,"Erreur à l'allocation du tableau dt-out_hz ",err
126          stop 4
127       end if
128    end if
129
130    do k=1,npredeft
131       read(num_dat,*) predef_tsort(k)
132    end do
133    close(num_dat)
134
135    ! Lecture des variables et de leur frequence de sortie
136    !-----------------------------------------------------------
137
138    ! open(num_dat,file='../'//trim(dirsource)//'/Fichiers-parametres/LISTE-VAR-HZ.dat')
139    !open(num_dat,file=trim(dirsource)//'/Fichiers-parametres/LISTE-VAR-HZ.dat')
140    open(num_dat,file=trim(dirsource)//'/LISTE-VAR-HZ.dat')
141
142
143    !saute les commentaires
144    comment2: do k=1,500
145       read(num_dat,'(a10)') comment
146       if (comment.eq.'~~~~~~~~~~') exit comment2
147    end do comment2
148
149
150    do k=1,100
151       read(num_dat,'(a6)',end=500,err=500) varchar
152       read(num_dat,*,end=500,err=500) ivar,i2,i3
153
154       varname(ivar)=' '//varchar
155       isortie(ivar)=i2
156       interv(ivar)=i3
157
158       if ((i3.gt.0).and.(i3.le.ndtsortie)) then
159          dtsortvar(ivar)=dtsortie_hz(i3)
160       else
161          dtsortvar(ivar)=1.e10
162       endif
163
164       read(num_dat,'(a8)',end=500,err=500) formatvar(ivar)
165       !  call minmax_format(minvar(ivar),maxvar(ivar),formatvar(ivar))
166
167       read(num_dat,*,end=500,err=500) coefsortvar(ivar)
168       !  print*,'k=',k,ivar,varname(ivar),interv(ivar),dtsortvar(ivar),formatvar(ivar),coefsortvar(ivar)
169       read(num_dat,*,end=500,err=500)
170    end do
171
172    goto 510
173500 continue
174    !    write(6,*) 'nombre de variables dans liste_var',k
175510 continue
176
177
178    close (num_dat)
179    return
180  end subroutine init_out_hz
181
182!> SUBROUTINE: testsort_time
183!! Teste variable par variable si la sortie hz est faite à ce temps là
184!! \param tsortie temps de sortie
185!>
186
187subroutine testsort_time(tsortie)
188
189implicit none
190double precision :: dbltime
191real :: tsortie
192real :: difftime  !< difference  tsortie-predef_tsort(npr)
193real :: debtime   !< difference abs(tsortie-tbegin)
194real :: fintime   !< difference abs(tsortie-tend)
195integer   :: ipredef
196integer   :: ideb
197integer   :: ifin
198integer   :: npr
199integer  :: i ! indices de travail
200
201
202!
203!           exemple.  si dt_out_hz=(1000,5000,10000)
204!                    interv=2        la sortie se fera tous les 5000 ans
205!                    interv=0        la sortie se fera seulement sur les pas de temps predefinis
206!                    interv=-1       la sortie ne se fait qu'aux premier  pas de temps
207!                    interv=-2       la sortie ne se fait qu'au premier et au dernier pas de temps
208
209
210        isort_time(:)=0
211        dbltime=dble(tsortie)
212! recherche si ce pas de temps est un pas de temps predefini
213        ipredef=0
214        ideb=0
215        ifin=0
216       
217
218predef:  do npr=1,npredeft
219           difftime=abs(tsortie-predef_tsort(npr))
220           if (difftime.lt.dttest) then
221              ipredef=1
222              exit predef
223           end if
224           debtime=abs(tsortie-tbegin)
225           fintime=abs(tsortie-tend)
226
227           if ((debtime.lt.dttest).or.(nt.eq.1)) ideb=1
228           if (fintime.lt.dttest) ifin=1
229
230        end do predef
231
232! boucle sur les numeros de variables
233boucle_var: do i=1,nvar
234
235                if (isortie(i).eq.0) then  ! variables non attribuees et
236                                           ! variables ou isortie est explicitement 0
237                   isort_time(i)=0
238
239                else                       ! variables dont on veut la sortie
240
241                   if ((interv(i).ge.0).and.(ipredef.eq.1)) then   ! pas de temps predefini
242                     isort_time(i)=1
243
244                   else if ((interv(i).le.-1).and.(ideb.eq.1)) then ! sortie a Tbegin
245                      isort_time(i)=1
246                     
247                   else if ((interv(i).eq.-2).and.(ifin.eq.1)) then ! sortie a Tend
248                      isort_time(i)=1
249
250                   else if (mod(abs(dbltime),dtsortvar(i)).lt.dble(dttest)) then
251                      isort_time(i)=1
252
253                                            ! le test est en dble car quand le temps est tres
254                                            ! grand, on peut avoir des problemes d'arrondi
255                   endif
256
257                endif
258
259             end do  boucle_var
260
261! initialise npos et iglob_hz
262     npos=0
263     iglob_hz=maxval(isort_time)
264
265return
266
267end subroutine testsort_time
268!--------------------------------------------------------------------------
269!> SUBROUTINE: rempli_xxx
270!! Rempli la colonne npos des tableaux xxx,varnumber,formatcol,colname
271!! \param numvar  Le numero de la variable
272!! \param Var     Nom de variable Var dans la liste LISTE-VAR-HZ.dat
273!>
274subroutine rempli_xxx(numvar,Var)
275! rempli la colonne npos des tableaux xxx,varnumber,formatcol,colname
276! numvar est le numero de la variable Var dans LISTE-VAR-HZ.dat
277!
278
279implicit none
280
281integer :: numvar
282real,dimension(nx,ny) :: var
283real :: mincol
284real :: maxcol
285real :: coef
286
287npos=npos+1
288coef=coefsortvar(numvar) ! coefficient multiplicateur
289mincol=minvar(numvar)
290maxcol=maxvar(numvar)
291varnumber(npos)=numvar
292formatcol(npos)=formatvar(numvar)
293colname(npos)=varname(numvar)
294
295
296xxx(:,:,npos)=var(:,:)*coef 
297
298! applique les minmax
299!do j=1,ny
300!   do i=1,nx
301!      xxx(i,j,npos)=min(xxx(i,j,npos),maxcol)
302!      xxx(i,j,npos)=max(xxx(i,j,npos),mincol)
303!   end do
304!end do   
305
306return
307end subroutine rempli_xxx
308!---------------------------------------------------------------------------
309!> SUBROUTINE: hz_output()
310!! Remplace plotoutput. Ecrit le tableau xxx dans un fichier avec le nom runname//snapname//.hz
311!! \param tsortie  temps de sortie
312!>
313
314subroutine hz_output(tsortie)
315
316 implicit none
317 real tsortie
318
319 character(len=1000) :: filout
320 character(len=4) :: sep      !< pour le format de sortie
321 character(len=1) :: fin      !< pour le format de sortie
322 character(len=1) :: deb      !< pour le format de sortie
323 character(len=1000) :: fmtxxx       !< pour le format de sortie xxx
324 character(len=1000) :: fmtcolname   !< pour le format colname
325 character(len=1000) :: fmtvarnumber !< pour le format varnumber
326 character(len=3) :: charncol   
327 character(len=30) :: snapname
328 integer  :: i,j,k ! indices de travail
329      integer :: num_forc = 20
330
331!write(6,*) 'hz_output  time=', tsortie,'npos=',npos
332
333if (npos.eq.0) goto 900
334
335! nom du fichier
336call snaptime(tsortie,snapname)
337      filout =trim(runname)//trim(snapname)//'.hz'
338      filout = TRIM(DIRNAMEOUT)//TRIM(filout)
339
340!write(6,*) 'sortie hz pour time=',tsortie,'nb colonnes=',npos
341
342open(num_forc,file=filout)
343
344! ecriture de la ligne format pour xxx
345 sep=',1x,'
346 deb='('
347 fin=')'
348 fmtxxx=deb
349
350 do k=1,npos-1
351  fmtxxx=trim(fmtxxx)//trim(formatcol(k))//sep 
352 end do
353
354 fmtxxx=trim(fmtxxx)//trim(formatcol(npos))//fin
355
356! met npos dans un character pour faire le format
357
358 write(charncol,fmt='(i3)') npos
359 charncol=adjustl( charncol) ! justifie a gauche
360
361! format pour varname
362 fmtcolname=deb//trim(charncol)//deb//'a6'//',1x),1x'//fin
363
364! format pour varnumber
365 fmtvarnumber=deb//trim(charncol)//deb//'i3'//',1x),1x'//fin
366
367 
368! ecriture dans le fichier sortie
369  write(num_forc,*) tsortie, geoplace, '       time, geoplace'
370  write(num_forc,'(10(i0,1x),a46)') nx*ny,npos,nx,ny,nint(dx/1000.),nint(seasea),xmin,xmax,ymin,ymax,& 
371            'nx*ny,ncol,nx,ny,dx,sealev,xmin,xmax,ymin,ymax'
372  write(num_forc,fmt=trim(fmtvarnumber)) (varnumber(k),k=1,npos)
373  write(num_forc,fmt=trim(fmtcolname)) (colname(k),k=1,npos)
374
375 do j=1,ny
376  do i=1,nx
377     write(num_forc,fmt=trim(fmtxxx)) (xxx(i,j,k),k=1,npos)
378  end do
379 end do
380 close(num_forc)
381
382900 continue
383 return
384
385end subroutine  hz_output
386 
387
388!--------------------------------------------------------------------------
389
390
391end module out_hz
392     
Note: See TracBrowser for help on using the repository browser.