134 class(ImsLinearSettingsType) :: this
135 type(BlockParserType) :: parser
138 logical(LGP) :: block_found, end_of_block
140 character(len=LINELENGTH) :: errmsg
141 character(len=LINELENGTH) :: warnmsg
142 character(len=LINELENGTH) :: keyword
143 integer(I4B) :: iscaling, iordering
145 call parser%GetBlock(
'LINEAR', block_found, ierr, supportopenclose=.true., &
146 blockrequired=.false.)
148 if (block_found)
then
149 write (iout,
'(/1x,a)')
'PROCESSING LINEAR DATA'
151 call parser%GetNextLine(end_of_block)
152 if (end_of_block)
exit
153 call parser%GetStringCaps(keyword)
155 select case (keyword)
156 case (
'INNER_DVCLOSE')
157 this%dvclose = parser%GetDouble()
158 case (
'INNER_RCLOSE')
159 this%rclose = parser%GetDouble()
161 call parser%GetStringCaps(keyword)
162 if (keyword ==
'STRICT')
then
164 else if (keyword ==
'L2NORM_RCLOSE')
then
166 else if (keyword ==
'RELATIVE_RCLOSE')
then
168 else if (keyword ==
'L2NORM_RELATIVE_RCLOSE')
then
171 case (
'INNER_MAXIMUM')
172 this%iter1 = parser%GetInteger()
173 case (
'LINEAR_ACCELERATION')
174 call parser%GetStringCaps(keyword)
175 if (keyword .eq.
'CG')
then
177 else if (keyword .eq.
'BICGSTAB')
then
181 write (errmsg,
'(3a)') &
182 'Unknown IMSLINEAR LINEAR_ACCELERATION method (', &
184 call store_error(errmsg)
186 case (
'SCALING_METHOD')
187 call parser%GetStringCaps(keyword)
189 if (keyword .eq.
'NONE')
then
191 else if (keyword .eq.
'DIAGONAL')
then
193 else if (keyword .eq.
'L2NORM')
then
196 write (errmsg,
'(3a)') &
197 'Unknown IMSLINEAR SCALING_METHOD (', trim(keyword),
').'
198 call store_error(errmsg)
201 case (
'RED_BLACK_ORDERING')
203 case (
'REORDERING_METHOD')
204 call parser%GetStringCaps(keyword)
206 if (keyword ==
'NONE')
then
208 else if (keyword ==
'RCM')
then
210 else if (keyword ==
'MD')
then
213 write (errmsg,
'(3a)') &
214 'Unknown IMSLINEAR REORDERING_METHOD (', trim(keyword),
').'
215 call store_error(errmsg)
217 this%iord = iordering
218 case (
'NUMBER_ORTHOGONALIZATIONS')
219 this%north = parser%GetInteger()
220 case (
'RELAXATION_FACTOR')
221 this%relax = parser%GetDouble()
222 case (
'PRECONDITIONER_LEVELS')
223 this%level = parser%GetInteger()
224 if (this%level < 0)
then
225 write (errmsg,
'(a,1x,a)') &
226 'IMSLINEAR PRECONDITIONER_LEVELS must be greater than', &
228 call store_error(errmsg)
230 case (
'PRECONDITIONER_DROP_TOLERANCE')
231 this%droptol = parser%GetDouble()
232 if (this%droptol < dzero)
then
233 write (errmsg,
'(a,1x,a)') &
234 'IMSLINEAR PRECONDITIONER_DROP_TOLERANCE', &
235 'must be greater than or equal to zero'
236 call store_error(errmsg)
240 case (
'INNER_HCLOSE')
241 this%dvclose = parser%GetDouble()
244 write (warnmsg,
'(a)') &
245 'SETTING INNER_DVCLOSE TO INNER_HCLOSE VALUE'
248 call deprecation_warning(
'LINEAR',
'INNER_HCLOSE',
'6.1.1', &
249 warnmsg, parser%GetUnit())
253 write (errmsg,
'(3a)') &
254 'Unknown IMSLINEAR keyword (', trim(keyword),
').'
255 call store_error(errmsg)
258 write (iout,
'(1x,a)')
'END OF LINEAR DATA'
260 if (this%ifdparam == 0)
THEN
261 write (errmsg,
'(a)')
'NO LINEAR block detected.'
262 call store_error(errmsg)