SURFEX v8.1
General documentation of Surfex
mode_pos_surf.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 !! ###############
6  MODULE mode_pos_surf
7 !! ###############
8 !!
9 USE modi_abor1_sfx
10 !
11 USE yomhook ,ONLY : lhook, dr_hook
12 USE parkind1 ,ONLY : jprb
13 !
14 INTERFACE pos
15 !!
16 MODULE PROCEDURE posnam
17 MODULE PROCEDURE poskey
18 !!
19 END INTERFACE
20 !!
21 !!
22  CONTAINS
23 !!
24 !! ##############################################
25  SUBROUTINE posnam(KULNAM,HDNAML,OFOUND,KLUOUT)
26 !! ##############################################
27 !!
28 !!*** *POSNAM*
29 !!
30 !! PURPOSE
31 !! -------
32 ! To position namelist file at correct place for reading
33 ! namelist CDNAML.
34 !!
35 !!** METHOD
36 !! ------
37 !!
38 !! EXTERNAL
39 !! --------
40 !!
41 !! IMPLICIT ARGUMENT
42 !! -----------------
43 !!
44 !! REFERENCE
45 !! ----------
46 !! ECMWF Research Department documentation of the IFS (Hamrud)
47 !!
48 !! AUTHOR
49 !! -------
50 !! I. Mallet 15/10/01
51 !!
52 !! MODIFICATIONS
53 !! --------------
54 !! I. Mallet 15/10/01 adaptation to MesoNH (F90 norm)
55 !------------------------------------------------------------------------------
56 !
57 IMPLICIT NONE
58 !
59 !* 0. DECLARATIONS
60 ! ------------
61 !
62 !* 0.1 Declarations of arguments
63 !
64 INTEGER, INTENT(IN) :: KULNAM
65  CHARACTER(LEN=*), INTENT(IN) :: HDNAML
66 LOGICAL, INTENT(OUT):: OFOUND
67 INTEGER, OPTIONAL,INTENT(IN) :: KLUOUT
68 !
69 !* 0.2 Declarations of local variables
70 !
71  CHARACTER(LEN=120) :: YLINE
72  CHARACTER(LEN=1) :: YLTEST
73 INTEGER :: ILEN,ILEY,INDL,IND1,IRET
74 INTEGER :: J,JA, JFILE
75 LOGICAL :: LLOPENED
76 !
77  CHARACTER(LEN=1),DIMENSION(26) :: YLO=(/'a','b','c','d','e','f','g','h', &
78  'i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'/)
79  CHARACTER(LEN=1),DIMENSION(26) :: YUP=(/'A','B','C','D','E','F','G','H', &
80  'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'/)
81 REAL(KIND=JPRB) :: ZHOOK_HANDLE
82 !
83 !* 1. POSITION FILE
84 ! -------------
85 !
86 IF (lhook) CALL dr_hook('MODE_POS_SURF:POSNAM',0,zhook_handle)
87 ofound=.false.
88 ilen=len(hdnaml)
89 !
90 ! CONTINUE READING THE FILE, THEN REWIND IF NOT FOUND
91 DO jfile=1,2
92  search_nam : DO
93  yline=' '
94  READ(unit=kulnam,fmt='(A)',iostat=iret,end=100) yline
95 
96 ! If file does not exist, most compilers would just create it and jump
97 ! to the END label ; but a few of them would report an error:
98  IF (iret /=0 ) THEN
99  INQUIRE(kulnam,opened=llopened)
100  IF (llopened) THEN
101  IF (PRESENT(kluout)) THEN
102  WRITE(kluout,fmt=*) 'MODE_POS_SURF : error reading from unit ',&
103  kulnam,' file ',hdnaml,' line ',yline
104  CALL flush(kluout)
105  ENDIF
106  CALL abor1_sfx('MODE_POS_SURF: read error in namelist file')
107  ELSE
108  EXIT search_nam
109  END IF
110  ELSE
111 ! FIRST SEARCH for "&" IN THE LINE, THEN CORRECT LINE AND TEST :
112  indl=index(yline,'&')
113  IF (indl .NE. 0 ) THEN
114  iley=len(yline)
115  DO j=1,iley
116  DO ja=1,26
117  IF (yline(j:j)==ylo(ja)) yline(j:j)=yup(ja)
118  END DO
119  END DO
120  ind1=index(yline,'&'//hdnaml)
121  IF(ind1.NE.0) THEN
122  yltest=yline(ind1+ilen+1:ind1+ilen+1)
123  IF(yltest == ' ') THEN
124 ! NAMELIST FOUND : RETURN
125  backspace(kulnam)
126  ofound=.true.
127  IF (PRESENT(kluout)) WRITE(kluout,fmt=*) '-- namelist ',hdnaml,' read'
128  IF (lhook) CALL dr_hook('MODE_POS_SURF:POSNAM',1,zhook_handle)
129  RETURN
130  ENDIF
131  ENDIF
132  ENDIF
133  ENDIF
134  ENDDO search_nam
135  100 CONTINUE
136  IF(jfile == 1) rewind(kulnam)
137 ENDDO
138 
139 backspace(kulnam)
140 ! end of file: namelist name not found
141 IF (PRESENT(kluout)) &
142 WRITE(kluout,fmt=*) &
143 '-- namelist ',hdnaml,' not found: default values used if required'
144 IF (lhook) CALL dr_hook('MODE_POS_SURF:POSNAM',1,zhook_handle)
145 !------------------------------------------------------------------
146 END SUBROUTINE posnam
147 !!
148 !!
149 !! ################################################
150  SUBROUTINE poskey(KULNAM,KLUOUT,HKEYWD1,HKEYWD2)
151 !! ################################################
152 !!
153 !!*** *POSKEY*
154 !!
155 !! PURPOSE
156 !! -------
157 ! To position namelist file at correct place after reading
158 ! keyword HKEYWD
159 !!
160 !!** METHOD
161 !! ------
162 !!
163 !! EXTERNAL
164 !! --------
165 !!
166 !! IMPLICIT ARGUMENT
167 !! -----------------
168 !!
169 !! REFERENCE
170 !! ----------
171 !!
172 !! AUTHOR
173 !! -------
174 !! I. Mallet *Meteo-France*
175 !!
176 !! MODIFICATIONS
177 !! --------------
178 !! Original : 15/10/01
179 !------------------------------------------------------------------------------
180 !
181 IMPLICIT NONE
182 !
183 !* 0. DECLARATIONS
184 ! ------------
185 !
186 !* 0.1 Declarations of arguments
187 !
188 INTEGER, INTENT(IN) :: KULNAM
189 INTEGER, INTENT(IN) :: KLUOUT
190  CHARACTER(LEN=*), INTENT(IN) :: HKEYWD1
191  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HKEYWD2
192 !
193 !* 0.2 Declarations of local variables
194 !
195  CHARACTER(LEN=120) :: YLINE
196 INTEGER :: ILEN1,ILEN2,IRET
197 REAL(KIND=JPRB) :: ZHOOK_HANDLE
198 !
199 !* 1. POSITION FILE
200 ! -------------
201 !
202 IF (lhook) CALL dr_hook('MODE_POS_SURF:POSKEY',0,zhook_handle)
203 rewind(kulnam)
204 ilen1=len(hkeywd1)
205 IF (PRESENT(hkeywd2)) ilen2=len(hkeywd2)
206 !
207 search_key : DO
208  yline=' '
209  READ(unit=kulnam,fmt='(A)',iostat=iret,end=100) yline
210  IF (iret /=0 ) THEN
211  WRITE(kluout,fmt=*) '-> error when reading line from unit ',kulnam
212  ELSE
213  yline=adjustl(yline)
214  IF (yline(1:ilen1) .EQ. hkeywd1(1:ilen1)) EXIT search_key
215  ENDIF
216 ENDDO search_key
217 !
218 WRITE(kluout,fmt=*) '-- keyword ',hkeywd1,' found'
219 !
220 IF (lhook) CALL dr_hook('MODE_POS_SURF:POSKEY',1,zhook_handle)
221 RETURN
222 !
223 ! end of file: keyword not found
224 100 CONTINUE
225 IF (.NOT.PRESENT(hkeywd2)) THEN
226  CALL abor1_sfx('MODE_POS_SURF: KEYWORD NOT FOUND: '//hkeywd1)
227 ELSE
228 !
229 !* 2. SECOND KEYWORD: POSITION FILE
230 ! -----------------------------
231 !
232  rewind(kulnam)
233  search_key2 : DO
234  yline=' '
235  READ(unit=kulnam,fmt='(A)',iostat=iret,end=101) yline
236  IF (iret /=0 ) THEN
237  WRITE(kluout,fmt=*) '-> error when reading line from unit ',kulnam
238  ELSE
239  yline=adjustl(yline)
240  IF (yline(1:ilen2) .EQ. hkeywd2(1:ilen2)) EXIT search_key2
241  ENDIF
242  ENDDO search_key2
243  WRITE(kluout,fmt=*) '-- keyword ',hkeywd2,' found'
244  IF (lhook) CALL dr_hook('MODE_POS_SURF:POSKEY',1,zhook_handle)
245  RETURN
246 END IF
247 ! end of file: scd keyword not found
248 101 CONTINUE
249  CALL abor1_sfx('MODE_POS_SURF: KEYWORD NOT FOUND: '//hkeywd2)
250 IF (lhook) CALL dr_hook('MODE_POS_SURF:POSKEY',1,zhook_handle)
251 !------------------------------------------------------------------
252 END SUBROUTINE poskey
253 !
254 END MODULE mode_pos_surf
subroutine poskey(KULNAM, KLUOUT, HKEYWD1, HKEYWD2)
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
ERROR in index
Definition: ecsort_shared.h:90