122 class(ImsLinearSettingsType) :: this
123 type(BlockParserType) :: parser
126 logical(LGP) :: block_found, end_of_block
128 character(len=LINELENGTH) :: errmsg
129 character(len=LINELENGTH) :: warnmsg
130 character(len=LINELENGTH) :: keyword
131 integer(I4B) :: iscaling, iordering
133 call parser%GetBlock(
'LINEAR', block_found, ierr, supportopenclose=.true., &
134 blockrequired=.false.)
136 if (block_found)
then
137 write (iout,
'(/1x,a)')
'PROCESSING LINEAR DATA'
139 call parser%GetNextLine(end_of_block)
140 if (end_of_block)
exit
141 call parser%GetStringCaps(keyword)
143 select case (keyword)
144 case (
'INNER_DVCLOSE')
145 this%dvclose = parser%GetDouble()
146 case (
'INNER_RCLOSE')
147 this%rclose = parser%GetDouble()
149 call parser%GetStringCaps(keyword)
150 if (keyword ==
'STRICT')
then
152 else if (keyword ==
'L2NORM_RCLOSE')
then
154 else if (keyword ==
'RELATIVE_RCLOSE')
then
156 else if (keyword ==
'L2NORM_RELATIVE_RCLOSE')
then
159 case (
'INNER_MAXIMUM')
160 this%iter1 = parser%GetInteger()
161 case (
'LINEAR_ACCELERATION')
162 call parser%GetStringCaps(keyword)
163 if (keyword .eq.
'CG')
then
165 else if (keyword .eq.
'BICGSTAB')
then
169 write (errmsg,
'(3a)') &
170 'Unknown IMSLINEAR LINEAR_ACCELERATION method (', &
172 call store_error(errmsg)
174 case (
'SCALING_METHOD')
175 call parser%GetStringCaps(keyword)
177 if (keyword .eq.
'NONE')
then
179 else if (keyword .eq.
'DIAGONAL')
then
181 else if (keyword .eq.
'L2NORM')
then
184 write (errmsg,
'(3a)') &
185 'Unknown IMSLINEAR SCALING_METHOD (', trim(keyword),
').'
186 call store_error(errmsg)
189 case (
'RED_BLACK_ORDERING')
191 case (
'REORDERING_METHOD')
192 call parser%GetStringCaps(keyword)
194 if (keyword ==
'NONE')
then
196 else if (keyword ==
'RCM')
then
198 else if (keyword ==
'MD')
then
201 write (errmsg,
'(3a)') &
202 'Unknown IMSLINEAR REORDERING_METHOD (', trim(keyword),
').'
203 call store_error(errmsg)
205 this%iord = iordering
206 case (
'NUMBER_ORTHOGONALIZATIONS')
207 this%north = parser%GetInteger()
208 case (
'RELAXATION_FACTOR')
209 this%relax = parser%GetDouble()
210 case (
'PRECONDITIONER_LEVELS')
211 this%level = parser%GetInteger()
212 if (this%level < 0)
then
213 write (errmsg,
'(a,1x,a)') &
214 'IMSLINEAR PRECONDITIONER_LEVELS must be greater than', &
216 call store_error(errmsg)
218 case (
'PRECONDITIONER_DROP_TOLERANCE')
219 this%droptol = parser%GetDouble()
220 if (this%droptol < dzero)
then
221 write (errmsg,
'(a,1x,a)') &
222 'IMSLINEAR PRECONDITIONER_DROP_TOLERANCE', &
223 'must be greater than or equal to zero'
224 call store_error(errmsg)
228 case (
'INNER_HCLOSE')
229 this%dvclose = parser%GetDouble()
232 write (warnmsg,
'(a)') &
233 'SETTING INNER_DVCLOSE TO INNER_HCLOSE VALUE'
236 call deprecation_warning(
'LINEAR',
'INNER_HCLOSE',
'6.1.1', &
237 warnmsg, parser%GetUnit())
241 write (errmsg,
'(3a)') &
242 'Unknown IMSLINEAR keyword (', trim(keyword),
').'
243 call store_error(errmsg)
246 write (iout,
'(1x,a)')
'END OF LINEAR DATA'
248 if (this%ifdparam == 0)
THEN
249 write (errmsg,
'(a)')
'NO LINEAR block detected.'
250 call store_error(errmsg)