SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
sxpost.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! ######spl
6  PROGRAM sxpost
7 !
8 !! MODIFICATIONS
9 !! -------------
10 !! B. Decharme : partition pgd/prep (grid attributes are only in the PGD file)
11 !!
12 !-------------------------------------------------------------------------------
13 !
15 !
17  USE modd_surf_par
18  USE modi_read_surf
19  USE modi_get_luout
20  USE mode_pos_surf
21  USE modd_io_surf_ol, ONLY : xstart,xcount,xstride,lpartr
22 
23 !
24  USE yomhook ,ONLY : lhook, dr_hook
25  USE parkind1 ,ONLY : jprb
26 !
27  USE modi_abor1_sfx
28 !
29  USE modi_get_luout
30 !
31  USE modi_end_io_surf_n
32  USE modi_init_io_surf_n
33 !
34  IMPLICIT NONE
35 
36  REAL, ALLOCATABLE, DIMENSION(:) :: zloc
37  REAL, ALLOCATABLE, DIMENSION(:) :: zwrk
38  REAL, ALLOCATABLE, DIMENSION(:) :: xlon
39  REAL, ALLOCATABLE, DIMENSION(:) :: xlat
40  INTEGER, ALLOCATABLE, DIMENSION(:):: iwrk2
41  CHARACTER(LEN=50) :: ycomment
42  CHARACTER(LEN=50) :: nom_article
43  CHARACTER(LEN=12) :: hrec
44  CHARACTER(LEN=1) :: patchflag
45  CHARACTER(LEN=2) :: ypas,ylvl
46  CHARACTER(LEN=10) :: cgrid_type
47  CHARACTER(LEN=6) :: cmask_save
48  LOGICAL :: gfound
49  LOGICAL :: linits ! true if PGD has been run
50  LOGICAL :: linitp ! true if PREP has been run
51  LOGICAL :: lsxnam ! true if SXPOST.nam present
52  LOGICAL :: lcoord ! true if LONLAT.dat present
53  LOGICAL :: lgeo=.true. !
54 
55  CHARACTER(LEN=28) :: yluout ='LISTING_SXPOST ' ! name of listing
56 
57  INTEGER :: iret
58  INTEGER :: ini, ini_n
59  INTEGER :: inj
60  INTEGER :: if, ic, ip
61  INTEGER :: ifield, iwfield
62  INTEGER :: ipatch, jpatch
63  INTEGER :: ibeg, iend
64  REAL(KIND=JPRB) :: zhook_handle
65 
66 
67  !=====================================================================
68  !*
69  !** check if file exists
70  !*
71  !=====================================================================
72  IF (lhook) CALL dr_hook('SXPOST',0,zhook_handle)
73  CALL surfex_alloc_list(1)
74 
75  CALL get_luout('ASCII ',nluout)
76  OPEN(unit=nluout,file=adjustl(adjustr(yluout)//'.txt'),&
77  form='FORMATTED',action='WRITE')
78 
79  INQUIRE(file='SXPOST.nam', exist=lsxnam)
80  IF (.NOT.lsxnam) THEN
81  WRITE(*,*)' > SXPOST.nam missing'
82  CALL abor1_sfx('SXPOST: NAMELIST SXPOST.nam MISSING')
83  ENDIF
84 
85  INQUIRE(file='PGD.txt', exist=linits)
86  INQUIRE(file='PREP.txt', exist=linitp)
87 
88  IF (.NOT. linitp .AND. .NOT. linits) THEN
89  WRITE(*,*)' NO INPUT FILE FOUND FOR SXPOST'
90  WRITE(*,*)' YOU SHOULD AT LEAST RUN PGD! '
91  CALL abor1_sfx('SXPOST: NO INPUT FILE')
92  ENDIF
93 
94  cfilein = 'PGD.txt'
95 
96  !=====================================================================
97  !*
98  !** get number of patches
99  !*
100  !=====================================================================
101 
102  CALL goto_model(1)
103 
104  CALL init_io_surf_n(ysurf_cur%DTCO, ysurf_cur%DGU, ysurf_cur%U, &
105  'ASCII ','FULL ','SURF ','READ ')
106 
107  CALL read_surf(&
108  'ASCII ','DIM_FULL', ini, iret)
109  CALL read_surf(&
110  'ASCII ','GRID_TYPE', cgrid_type, iret)
111  CALL read_surf(&
112  'ASCII ','DIM_NATURE', ini_n, iret)
113 
114  CALL end_io_surf_n('ASCII ')
115 
116  nfull = ini
117 
118  IF (ini_n.NE.0) THEN
119  CALL init_io_surf_n(ysurf_cur%DTCO, ysurf_cur%DGU, ysurf_cur%U, &
120  'ASCII ','NATURE','SURF ','READ ')
121 
122  CALL read_surf(&
123  'ASCII ','PATCH_NUMBER', ipatch, iret)
124 
125  CALL end_io_surf_n('ASCII ')
126  ENDIF
127 
128  !=====================================================================
129  !*
130  !** get domain size and read latitudes and longitudes
131  !*
132  !=====================================================================
133  CALL init_io_surf_n(ysurf_cur%DTCO, ysurf_cur%DGU, ysurf_cur%U, &
134  'ASCII ','FULL ','SURF ','READ ')
135 
136  OPEN(unit=45,file='SXPOST.nam',form='FORMATTED')
137  READ(45,*)ifield
138 
139  INQUIRE(file='LONLAT.dat',exist=lcoord)
140  ALLOCATE(xlon(ini))
141  ALLOCATE(xlat(ini))
142  OPEN(unit=30,file='LONLAT.dat',form='FORMATTED')
143 
144  IF (lcoord) THEN
145  DO ip=1,ini
146  READ(30,*)xlon(ip),xlat(ip)
147  ENDDO
148  ELSE
149  WRITE(*,*) 'LONLAT.DAT file missing !'
150  IF (cgrid_type=='GAUSS ') THEN
151  CALL posnam(nunit,'FULL '//' '//'LONGAUSS',gfound,nluout)
152  ELSE
153  CALL posnam(nunit,'FULL '//' '//'XLON',gfound,nluout)
154  ENDIF
155 
156  IF (.NOT.gfound) THEN
157  CALL err_stop('XLON ',cfilein,nluout)
158  ELSE
159  READ(nunit,fmt=*)
160  READ(nunit,fmt='(A50)') ycomment
161  READ(nunit,fmt=*,err=100) xlon(:)
162 
163  IF (cgrid_type=='GAUSS ') THEN
164  CALL posnam(nunit,'FULL '//' '//'LATGAUSS',gfound,nluout)
165  ELSE
166  CALL posnam(nunit,'FULL '//' '//'XLAT',gfound,nluout)
167  ENDIF
168 
169  READ(nunit,fmt=*)
170  READ(nunit,fmt='(A50)') ycomment
171  READ(nunit,fmt=*,err=100) xlat(:)
172 
173  DO ip=1,ini
174  WRITE(30,*)xlon(ip),xlat(ip)
175  ENDDO
176  ENDIF
177  ENDIF
178 
179  CALL end_io_surf_n('ASCII ')
180 
181  IF (ifield==0) stop
182 
183  !=====================================================================
184  !*
185  !** read 2d fields from PGD.txt or PREP.txt if exists
186  !*
187  !=====================================================================
188 
189  ! Search var first in PREP file
190  ic=0
191 
192  DO if=1,ifield
193 
194  READ(45,'(A1,1X,A6,1X,A16)') patchflag,cmask,hrec
195  cmask_save = cmask
196 
197  IF (patchflag == '+') THEN
198  inj = ini * ipatch
199  ELSE IF (patchflag == '-') THEN
200  inj = ini
201  ELSE
202  print*,' '
203  print*,' WRONG PATCHFLAG IN SXPOST.nam '
204  print*,' USE + FOR PATCHED VARIABLES '
205  print*,' USE - FOR UNPATCHED VARIABLES '
206  print*,' '
207  print*,' SYNTAX OF SXPOST.nam SHOULD LOOK: '
208  print*,' '
209  print*,'2 '
210  print*,'- FULL ZS '
211  print*,'+ NATURE TG1 '
212  print*,' '
213  CALL abor1_sfx('SXPOST: WRONG PATCHFLAG')
214  ENDIF
215 
216  ALLOCATE(zwrk(inj))
217  ic=ic+1
218 
219  IF (linitp) cfilein = 'PREP.txt'
220  CALL init_io_surf_n(ysurf_cur%DTCO, ysurf_cur%DGU, ysurf_cur%U, &
221  'ASCII ',cmask_save,'SURF ','READ ')
222  CALL posnam(nunit,cmask//' '//hrec,gfound,nluout)
223  IF (.NOT.gfound .AND. linitp)THEN
224  ! Search now in PGD file
225  CALL end_io_surf_n('ASCII ')
226  cfilein = 'PGD.txt'
227  CALL init_io_surf_n(ysurf_cur%DTCO, ysurf_cur%DGU, ysurf_cur%U, &
228  'ASCII ',cmask_save,'SURF ','READ ')
229  CALL posnam(nunit,cmask//' '//hrec,gfound,nluout)
230  ENDIF
231  IF (.NOT.gfound) CALL err_stop(hrec,cfilein,nluout)
232 
233  READ(nunit,fmt='(A50)') nom_article
234  READ(nunit,fmt='(A50)') ycomment
235  READ(nunit,fmt=*,err=100) zwrk
236  ALLOCATE(zloc(inj))
237  zloc(:)=zwrk(:)
238  WHERE(zloc(:)==999.) zloc(:)=-999.
239 
240  print*,cmask,' ',hrec,' ','MINVAL = ',minval(zwrk(:)),&
241  ' MAXVAL = ',maxval(zloc(:))
242  DEALLOCATE(zloc)
243 
244  iwfield=1
245  IF (patchflag == '+') THEN
246  DO jpatch=1,ipatch
247  WRITE(ypas,'(I2)') jpatch
248  ylvl=adjustl(ypas(:len_trim(ypas)))
249  OPEN(unit=30,file=trim(hrec)//'_p'//trim(ylvl)//'.dat',form='FORMATTED')
250  ibeg=ini*(jpatch-1)+1
251  iend=ini*jpatch
252  IF (lgeo) THEN
253  DO ip=1,ini
254  !IF (ZWRK(IP)/=XUNDEF) THEN
255  WRITE(30,*)xlon(ip),xlat(ip),zwrk(ini*(jpatch-1)+ip)
256  !ENDIF
257  ENDDO
258  ELSE
259  WRITE(30,*)nom_article
260  WRITE(30,*)ycomment
261  DO ip=1,ini
262  WRITE(30,*)zwrk(ip)
263  ENDDO
264  !WRITE(30,*)INI
265  !WRITE(30,'(60F16.8)')ZWRK(IBEG:IEND)
266  ENDIF
267  CLOSE(30)
268  ENDDO
269  ELSE
270  OPEN(unit=30,file=trim(hrec)//'.dat',form='FORMATTED')
271  IF (lgeo) THEN
272  DO ip=1,ini
273  !IF (ZWRK(IP)/=XUNDEF) THEN
274  WRITE(30,*)xlat(ip),xlon(ip),zwrk(ip)
275  !ENDIF
276  ENDDO
277  ELSE
278  WRITE(30,*)nom_article
279  WRITE(30,*)ycomment
280  DO ip=1,ini
281  WRITE(30,*)zwrk(ip)
282  ENDDO
283  !WRITE(30,*)INI
284  !WRITE(30,'(60F16.8)')ZWRK(:)
285  ENDIF
286  CLOSE(30)
287  ENDIF
288 
289  DEALLOCATE(zwrk)
290  CALL end_io_surf_n('ASCII ')
291 
292  ENDDO
293 
294  CLOSE(nluout)
295  CALL surfex_deallo_list
296  IF (lhook) CALL dr_hook('SXPOST',1,zhook_handle)
297 
298 
299  stop
300  100 CONTINUE
301  WRITE(nluout,*) ' '
302  WRITE(nluout,*) ' ERROR WHEN READING ARTICLE',hrec
303  WRITE(nluout,*) ' '
304  CLOSE(nluout)
305  IF (lhook) CALL dr_hook('SXPOST',1,zhook_handle)
306 
307  CONTAINS
308 
309  SUBROUTINE err_stop(HREC,CFILEIN,NLUOUT)
310  CHARACTER(LEN=12) :: hrec
311  CHARACTER(LEN=*) :: cfilein
312  INTEGER :: nluout
313  REAL(KIND=JPRB) :: zhook_handle
314  IF (lhook) CALL dr_hook('ERR_STOP',0,zhook_handle)
315  WRITE(nluout,*) ' '
316  WRITE(nluout,*) ' ARTICLE ',trim(hrec),' NOT FOUND IN FILE ', cfilein
317  WRITE(nluout,*) ' '
318  WRITE(*,*) ' '
319  WRITE(*,*) ' ARTICLE ',trim(hrec),' NOT FOUND IN FILE ', cfilein
320  WRITE(*,*) ' '
321  CALL abor1_sfx('SXPOST: ARTICLE '//hrec//' NOT FOUND')
322  IF (lhook) CALL dr_hook('ERR_STOP',1,zhook_handle)
323  END SUBROUTINE err_stop
324 
325  END PROGRAM sxpost
subroutine init_io_surf_n(DTCO, DGU, U, HPROGRAM, HMASK, HSCHEME, HACTION)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine err_stop(HREC, CFILEIN, NLUOUT)
Definition: ncpost.F90:210
program sxpost
Definition: sxpost.F90:6
subroutine surfex_deallo_list
subroutine goto_model(KMODEL)
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:6
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine surfex_alloc_list(KMODEL)