@@ -38,6 +38,7 @@ subroutine read_value_integer_mesh(iunit,ignore_junk,value_to_read, name, ier)
3838 integer , intent (inout ) :: value_to_read
3939 integer , intent (inout ) :: ier
4040 character (len=* ), intent (in ) :: name
41+ ! local parameters
4142 character (len= MAX_STRING_LEN) :: string_read
4243
4344 call unused_string(name)
@@ -50,6 +51,53 @@ subroutine read_value_integer_mesh(iunit,ignore_junk,value_to_read, name, ier)
5051
5152 end subroutine read_value_integer_mesh
5253
54+ !- -------------------
55+
56+ subroutine read_value_integer_mesh_optional (iunit , value_to_read , name , ier )
57+
58+ ! reads an optional integer parameter value if found by name
59+
60+ use constants, only: MAX_STRING_LEN
61+
62+ implicit none
63+
64+ integer , intent (in ) :: iunit
65+ integer , intent (inout ) :: value_to_read
66+ character (len=* ), intent (in ) :: name
67+ integer , intent (inout ) :: ier
68+ ! local parameters
69+ character (len= MAX_STRING_LEN) :: string_read
70+ integer :: index_equal_sign
71+
72+ ! reads full line (with parameter name)
73+ call read_next_line(iunit,.false. ,string_read,ier)
74+ if (ier /= 0 ) return
75+
76+ ! debug
77+ ! print *,'optional line: ***',trim(string_read),'*** integer name index: ',index(string_read,trim(name))
78+
79+ ! reads parameter value if current line contains name string
80+ if (index (string_read,trim (name)) > 0 ) then
81+ ! suppress leading parameter name (up to the first equal sign, included)
82+ index_equal_sign = index (string_read,' =' )
83+ if (index_equal_sign <= 1 .or. index_equal_sign == len_trim (string_read)) then
84+ print * ,' Error reading Mesh_Par_file of optional parameter ' ,trim (name),' in line: ' ,trim (string_read)
85+ stop ' Error incorrect syntax detected in Mesh_Par_file'
86+ else
87+ string_read = string_read((index_equal_sign + 1 ):len_trim (string_read))
88+ endif
89+
90+ ! reads parameter value
91+ read (string_read,* ,iostat= ier) value_to_read
92+
93+ else
94+ ! line contains another new parameter
95+ ! reverts back file pointer to previous line for the next read statements
96+ backspace (iunit)
97+ endif
98+
99+ end subroutine read_value_integer_mesh_optional
100+
53101!- -------------------
54102
55103 subroutine read_value_dble_precision_mesh (iunit ,ignore_junk ,value_to_read , name , ier )
@@ -63,6 +111,7 @@ subroutine read_value_dble_precision_mesh(iunit,ignore_junk,value_to_read, name,
63111 double precision , intent (inout ) :: value_to_read
64112 integer , intent (inout ) :: ier
65113 character (len=* ), intent (in ) :: name
114+ ! local parameters
66115 character (len= MAX_STRING_LEN) :: string_read
67116
68117 call unused_string(name)
@@ -88,6 +137,7 @@ subroutine read_value_logical_mesh(iunit,ignore_junk,value_to_read, name, ier)
88137 integer , intent (in ) :: iunit
89138 integer , intent (inout ) :: ier
90139 character (len=* ), intent (in ) :: name
140+ ! local parameters
91141 character (len= MAX_STRING_LEN) :: string_read
92142
93143 call unused_string(name)
@@ -100,6 +150,53 @@ subroutine read_value_logical_mesh(iunit,ignore_junk,value_to_read, name, ier)
100150
101151 end subroutine read_value_logical_mesh
102152
153+ !- -------------------
154+
155+ subroutine read_value_logical_mesh_optional (iunit , value_to_read , name , ier )
156+
157+ ! reads an optional parameter value if found by name
158+
159+ use constants, only: MAX_STRING_LEN
160+
161+ implicit none
162+
163+ logical , intent (inout ) :: value_to_read
164+ integer , intent (in ) :: iunit
165+ integer , intent (inout ) :: ier
166+ character (len=* ), intent (in ) :: name
167+ ! local parameters
168+ character (len= MAX_STRING_LEN) :: string_read
169+ integer :: index_equal_sign
170+
171+ ! reads full line (with parameter name)
172+ call read_next_line(iunit,.false. ,string_read,ier)
173+ if (ier /= 0 ) return
174+
175+ ! debug
176+ ! print *,'optional line: ***',trim(string_read),'*** logical name index: ',index(string_read,trim(name))
177+
178+ ! reads parameter value if current line contains name string
179+ if (index (string_read,trim (name)) > 0 ) then
180+ ! suppress leading parameter name (up to the first equal sign, included)
181+ index_equal_sign = index (string_read,' =' )
182+ if (index_equal_sign <= 1 .or. index_equal_sign == len_trim (string_read)) then
183+ print * ,' Error reading Mesh_Par_file of optional parameter ' ,trim (name),' in line: ' ,trim (string_read)
184+ stop ' Error incorrect syntax detected in Mesh_Par_file'
185+ else
186+ string_read = string_read((index_equal_sign + 1 ):len_trim (string_read))
187+ endif
188+
189+ ! reads parameter value
190+ read (string_read,* ,iostat= ier) value_to_read
191+
192+ else
193+ ! line contains another new parameter
194+ ! reverts back file pointer to previous line for the next read statements
195+ backspace (iunit)
196+ endif
197+
198+ end subroutine read_value_logical_mesh_optional
199+
103200!- -------------------
104201
105202 subroutine read_value_string_mesh (iunit ,ignore_junk ,value_to_read , name , ier )
@@ -113,6 +210,7 @@ subroutine read_value_string_mesh(iunit,ignore_junk,value_to_read, name, ier)
113210 character (len=* ), intent (inout ) :: value_to_read
114211 integer , intent (inout ) :: ier
115212 character (len=* ), intent (in ) :: name
213+ ! local parameters
116214 character (len= MAX_STRING_LEN) :: string_read
117215
118216 call unused_string(name)
@@ -233,6 +331,7 @@ subroutine read_interface_parameters(iunit,SUPPRESS_UTM_PROJECTION,interface_fil
233331 double precision :: orig_x_interface,orig_y_interface
234332 double precision :: spacing_x_interface,spacing_y_interface
235333 character (len= MAX_STRING_LEN) :: interface_file
334+ ! local parameters
236335 character (len= MAX_STRING_LEN) :: string_read
237336
238337 ier = 0
@@ -564,7 +663,7 @@ subroutine read_next_line(iunit,suppress_junk,string_read, ier)
564663 endif
565664
566665 ! suppress leading white spaces, if any
567- string_read = adjustl (string_read)
666+ string_read = trim ( adjustl (string_read) )
568667
569668 ! suppress trailing carriage return (ASCII code 13) if any (e.g. if input text file coming from Windows/DOS)
570669 if (index (string_read,achar (13 )) > 0 ) string_read = string_read(1 :index (string_read,achar (13 ))- 1 )
0 commit comments