SURFEX v8.1
General documentation of Surfex
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
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(ysc%DTCO, ysc%U, 'ASCII ','FULL ','SURF ','READ ')
105 
106  CALL read_surf('ASCII ','DIM_FULL', ini, iret)
107  CALL read_surf('ASCII ','GRID_TYPE', cgrid_type, iret)
108  CALL read_surf('ASCII ','DIM_NATURE', ini_n, iret)
109 
110  CALL end_io_surf_n('ASCII ')
111 
112  nfull = ini
113 
114  IF (ini_n.NE.0) THEN
115  CALL init_io_surf_n(ysc%DTCO, ysc%U, 'ASCII ','NATURE','SURF ','READ ')
116 
117  CALL read_surf('ASCII ','PATCH_NUMBER', ipatch, iret)
118 
119  CALL end_io_surf_n('ASCII ')
120  ENDIF
121 
122  !=====================================================================
123  !*
124  !** get domain size and read latitudes and longitudes
125  !*
126  !=====================================================================
127  CALL init_io_surf_n(ysc%DTCO, ysc%U, 'ASCII ','FULL ','SURF ','READ ')
128 
129  OPEN(unit=45,file='SXPOST.nam',form='FORMATTED')
130  READ(45,*)ifield
131 
132  INQUIRE(file='LONLAT.dat',exist=lcoord)
133  ALLOCATE(xlon(ini))
134  ALLOCATE(xlat(ini))
135  OPEN(unit=30,file='LONLAT.dat',form='FORMATTED')
136 
137  IF (lcoord) THEN
138  DO ip=1,ini
139  READ(30,*)xlon(ip),xlat(ip)
140  ENDDO
141  ELSE
142  WRITE(*,*) 'LONLAT.DAT file missing !'
143  IF (cgrid_type=='GAUSS ') THEN
144  CALL posnam(nunit,'FULL '//' '//'LONGAUSS',gfound,nluout)
145  ELSE
146  CALL posnam(nunit,'FULL '//' '//'XLON',gfound,nluout)
147  ENDIF
148 
149  IF (.NOT.gfound) THEN
150  CALL err_stop('XLON ',cfilein,nluout)
151  ELSE
152  READ(nunit,fmt=*)
153  READ(nunit,fmt='(A50)') ycomment
154  READ(nunit,fmt=*,err=100) xlon(:)
155 
156  IF (cgrid_type=='GAUSS ') THEN
157  CALL posnam(nunit,'FULL '//' '//'LATGAUSS',gfound,nluout)
158  ELSE
159  CALL posnam(nunit,'FULL '//' '//'XLAT',gfound,nluout)
160  ENDIF
161 
162  READ(nunit,fmt=*)
163  READ(nunit,fmt='(A50)') ycomment
164  READ(nunit,fmt=*,err=100) xlat(:)
165 
166  DO ip=1,ini
167  WRITE(30,*)xlon(ip),xlat(ip)
168  ENDDO
169  ENDIF
170  ENDIF
171 
172  CALL end_io_surf_n('ASCII ')
173 
174  IF (ifield==0) stop
175 
176  !=====================================================================
177  !*
178  !** read 2d fields from PGD.txt or PREP.txt if exists
179  !*
180  !=====================================================================
181 
182  ! Search var first in PREP file
183  ic=0
184 
185  DO if=1,ifield
186 
187  READ(45,'(A1,1X,A6,1X,A16)') patchflag,cmask,hrec
188  cmask_save = cmask
189 
190  IF (patchflag == '+') THEN
191  inj = ini * ipatch
192  ELSE IF (patchflag == '-') THEN
193  inj = ini
194  ELSE
195  print*,' '
196  print*,' WRONG PATCHFLAG IN SXPOST.nam '
197  print*,' USE + FOR PATCHED VARIABLES '
198  print*,' USE - FOR UNPATCHED VARIABLES '
199  print*,' '
200  print*,' SYNTAX OF SXPOST.nam SHOULD LOOK: '
201  print*,' '
202  print*,'2 '
203  print*,'- FULL ZS '
204  print*,'+ NATURE TG1 '
205  print*,' '
206  CALL abor1_sfx('SXPOST: WRONG PATCHFLAG')
207  ENDIF
208 
209  ALLOCATE(zwrk(inj))
210  ic=ic+1
211 
212  IF (linitp) cfilein = 'PREP.txt'
213  CALL init_io_surf_n(ysc%DTCO, ysc%U, 'ASCII ',cmask_save,'SURF ','READ ')
214  CALL posnam(nunit,cmask//' '//hrec,gfound,nluout)
215  IF (.NOT.gfound .AND. linitp)THEN
216  ! Search now in PGD file
217  CALL end_io_surf_n('ASCII ')
218  cfilein = 'PGD.txt'
219  CALL init_io_surf_n(ysc%DTCO, ysc%U, 'ASCII ',cmask_save,'SURF ','READ ')
220  CALL posnam(nunit,cmask//' '//hrec,gfound,nluout)
221  ENDIF
222  IF (.NOT.gfound) CALL err_stop(hrec,cfilein,nluout)
223 
224  READ(nunit,fmt='(A50)') nom_article
225  READ(nunit,fmt='(A50)') ycomment
226  READ(nunit,fmt=*,err=100) zwrk
227  ALLOCATE(zloc(inj))
228  zloc(:)=zwrk(:)
229  WHERE(zloc(:)==999.) zloc(:)=-999.
230 
231  print*,cmask,' ',hrec,' ','MINVAL = ',minval(zwrk(:)),&
232  ' MAXVAL = ',maxval(zloc(:))
233  DEALLOCATE(zloc)
234 
235  iwfield=1
236  IF (patchflag == '+') THEN
237  DO jpatch=1,ipatch
238  WRITE(ypas,'(I2)') jpatch
239  ylvl=adjustl(ypas(:len_trim(ypas)))
240  OPEN(unit=30,file=trim(hrec)//'_p'//trim(ylvl)//'.dat',form='FORMATTED')
241  ibeg=ini*(jpatch-1)+1
242  iend=ini*jpatch
243  IF (lgeo) THEN
244  DO ip=1,ini
245  !IF (ZWRK(IP)/=XUNDEF) THEN
246  WRITE(30,*)xlon(ip),xlat(ip),zwrk(ini*(jpatch-1)+ip)
247  !ENDIF
248  ENDDO
249  ELSE
250  WRITE(30,*)nom_article
251  WRITE(30,*)ycomment
252  DO ip=1,ini
253  WRITE(30,*)zwrk(ip)
254  ENDDO
255  !WRITE(30,*)INI
256  !WRITE(30,'(60F16.8)')ZWRK(IBEG:IEND)
257  ENDIF
258  CLOSE(30)
259  ENDDO
260  ELSE
261  OPEN(unit=30,file=trim(hrec)//'.dat',form='FORMATTED')
262  IF (lgeo) THEN
263  DO ip=1,ini
264  !IF (ZWRK(IP)/=XUNDEF) THEN
265  WRITE(30,*)xlat(ip),xlon(ip),zwrk(ip)
266  !ENDIF
267  ENDDO
268  ELSE
269  WRITE(30,*)nom_article
270  WRITE(30,*)ycomment
271  DO ip=1,ini
272  WRITE(30,*)zwrk(ip)
273  ENDDO
274  !WRITE(30,*)INI
275  !WRITE(30,'(60F16.8)')ZWRK(:)
276  ENDIF
277  CLOSE(30)
278  ENDIF
279 
280  DEALLOCATE(zwrk)
281  CALL end_io_surf_n('ASCII ')
282 
283  ENDDO
284 
285  CLOSE(nluout)
286  CALL surfex_deallo_list
287  IF (lhook) CALL dr_hook('SXPOST',1,zhook_handle)
288 
289 
290  stop
291  100 CONTINUE
292  WRITE(nluout,*) ' '
293  WRITE(nluout,*) ' ERROR WHEN READING ARTICLE',hrec
294  WRITE(nluout,*) ' '
295  CLOSE(nluout)
296  IF (lhook) CALL dr_hook('SXPOST',1,zhook_handle)
297 
298  CONTAINS
299 
300  SUBROUTINE err_stop(HREC,CFILEIN,NLUOUT)
301  CHARACTER(LEN=12) :: HREC
302  CHARACTER(LEN=*) :: CFILEIN
303  INTEGER :: NLUOUT
304  REAL(KIND=JPRB) :: ZHOOK_HANDLE
305  IF (lhook) CALL dr_hook('ERR_STOP',0,zhook_handle)
306  WRITE(nluout,*) ' '
307  WRITE(nluout,*) ' ARTICLE ',trim(hrec),' NOT FOUND IN FILE ', cfilein
308  WRITE(nluout,*) ' '
309  WRITE(*,*) ' '
310  WRITE(*,*) ' ARTICLE ',trim(hrec),' NOT FOUND IN FILE ', cfilein
311  WRITE(*,*) ' '
312  CALL abor1_sfx('SXPOST: ARTICLE '//hrec//' NOT FOUND')
313  IF (lhook) CALL dr_hook('ERR_STOP',1,zhook_handle)
314  END SUBROUTINE err_stop
315 
316  END PROGRAM sxpost
character(len=6) cmask
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
subroutine err_stop(HREC, CFILEIN, NLUOUT)
Definition: ncpost.F90:200
subroutine goto_model(KMODEL)
subroutine surfex_deallo_list
integer, parameter jprb
Definition: parkind1.F90:32
program sxpost
Definition: sxpost.F90:6
type(surfex_t), pointer ysc
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:7
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine surfex_alloc_list(KMODEL)
character(len=28), save cfilein
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION