SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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 ! If file does not exist, most compilers would just create it and jump
96 ! to the END label ; but a few of them would report an error:
97  IF (iret /=0 ) THEN
98  INQUIRE(kulnam,opened=llopened)
99  IF (llopened) THEN
100  IF (present(kluout)) &
101  WRITE(kluout,fmt=*) 'MODE_POS_SURF : error reading from unit ',&
102  kulnam,' file ',hdnaml,' line ',yline
103  CALL abor1_sfx('MODE_POS_SURF: read error in namelist file')
104  ELSE
105  EXIT search_nam
106  END IF
107  ELSE
108 ! FIRST SEARCH for "&" IN THE LINE, THEN CORRECT LINE AND TEST :
109  indl=index(yline,'&')
110  IF (indl .NE. 0 ) THEN
111  iley=len(yline)
112  DO j=1,iley
113  DO ja=1,26
114  IF (yline(j:j)==ylo(ja)) yline(j:j)=yup(ja)
115  END DO
116  END DO
117  ind1=index(yline,'&'//hdnaml)
118  IF(ind1.NE.0) THEN
119  yltest=yline(ind1+ilen+1:ind1+ilen+1)
120  IF(yltest == ' ') THEN
121 ! NAMELIST FOUND : RETURN
122  backspace(kulnam)
123  ofound=.true.
124  IF (present(kluout)) WRITE(kluout,fmt=*) '-- namelist ',hdnaml,' read'
125  IF (lhook) CALL dr_hook('MODE_POS_SURF:POSNAM',1,zhook_handle)
126  RETURN
127  ENDIF
128  ENDIF
129  ENDIF
130  ENDIF
131  ENDDO search_nam
132  100 CONTINUE
133  IF(jfile == 1) rewind(kulnam)
134 ENDDO
135 
136 backspace(kulnam)
137 ! end of file: namelist name not found
138 IF (present(kluout)) &
139 WRITE(kluout,fmt=*) &
140 '-- namelist ',hdnaml,' not found: default values used if required'
141 IF (lhook) CALL dr_hook('MODE_POS_SURF:POSNAM',1,zhook_handle)
142 !------------------------------------------------------------------
143 END SUBROUTINE posnam
144 !!
145 !!
146 !! ################################################
147  SUBROUTINE poskey(KULNAM,KLUOUT,HKEYWD1,HKEYWD2)
148 !! ################################################
149 !!
150 !!*** *POSKEY*
151 !!
152 !! PURPOSE
153 !! -------
154 ! To position namelist file at correct place after reading
155 ! keyword HKEYWD
156 !!
157 !!** METHOD
158 !! ------
159 !!
160 !! EXTERNAL
161 !! --------
162 !!
163 !! IMPLICIT ARGUMENT
164 !! -----------------
165 !!
166 !! REFERENCE
167 !! ----------
168 !!
169 !! AUTHOR
170 !! -------
171 !! I. Mallet *Meteo-France*
172 !!
173 !! MODIFICATIONS
174 !! --------------
175 !! Original : 15/10/01
176 !------------------------------------------------------------------------------
177 !
178 IMPLICIT NONE
179 !
180 !* 0. DECLARATIONS
181 ! ------------
182 !
183 !* 0.1 Declarations of arguments
184 !
185 INTEGER, INTENT(IN) :: kulnam
186 INTEGER, INTENT(IN) :: kluout
187  CHARACTER(LEN=*), INTENT(IN) :: hkeywd1
188  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: hkeywd2
189 !
190 !* 0.2 Declarations of local variables
191 !
192  CHARACTER(LEN=120) :: yline
193 INTEGER :: ilen1,ilen2,iret
194 REAL(KIND=JPRB) :: zhook_handle
195 !
196 !* 1. POSITION FILE
197 ! -------------
198 !
199 IF (lhook) CALL dr_hook('MODE_POS_SURF:POSKEY',0,zhook_handle)
200 rewind(kulnam)
201 ilen1=len(hkeywd1)
202 IF (present(hkeywd2)) ilen2=len(hkeywd2)
203 !
204 search_key : DO
205  yline=' '
206  READ(unit=kulnam,fmt='(A)',iostat=iret,end=100) yline
207  IF (iret /=0 ) THEN
208  WRITE(kluout,fmt=*) '-> error when reading line from unit ',kulnam
209  ELSE
210  yline=adjustl(yline)
211  IF (yline(1:ilen1) .EQ. hkeywd1(1:ilen1)) EXIT search_key
212  ENDIF
213 ENDDO search_key
214 !
215 WRITE(kluout,fmt=*) '-- keyword ',hkeywd1,' found'
216 !
217 IF (lhook) CALL dr_hook('MODE_POS_SURF:POSKEY',1,zhook_handle)
218 RETURN
219 !
220 ! end of file: keyword not found
221 100 CONTINUE
222 IF (.NOT.present(hkeywd2)) THEN
223  CALL abor1_sfx('MODE_POS_SURF: KEYWORD NOT FOUND: '//hkeywd1)
224 ELSE
225 !
226 !* 2. SECOND KEYWORD: POSITION FILE
227 ! -----------------------------
228 !
229  rewind(kulnam)
230  search_key2 : DO
231  yline=' '
232  READ(unit=kulnam,fmt='(A)',iostat=iret,end=101) yline
233  IF (iret /=0 ) THEN
234  WRITE(kluout,fmt=*) '-> error when reading line from unit ',kulnam
235  ELSE
236  yline=adjustl(yline)
237  IF (yline(1:ilen2) .EQ. hkeywd2(1:ilen2)) EXIT search_key2
238  ENDIF
239  ENDDO search_key2
240  WRITE(kluout,fmt=*) '-- keyword ',hkeywd2,' found'
241  IF (lhook) CALL dr_hook('MODE_POS_SURF:POSKEY',1,zhook_handle)
242  RETURN
243 END IF
244 ! end of file: scd keyword not found
245 101 CONTINUE
246  CALL abor1_sfx('MODE_POS_SURF: KEYWORD NOT FOUND: '//hkeywd2)
247 IF (lhook) CALL dr_hook('MODE_POS_SURF:POSKEY',1,zhook_handle)
248 !------------------------------------------------------------------
249 END SUBROUTINE poskey
250 !
251 END MODULE mode_pos_surf
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine poskey(KULNAM, KLUOUT, HKEYWD1, HKEYWD2)