Fast Auxiliary Space Preconditioning 2.7.7 Aug/28/2022
AuxInput.c
Go to the documentation of this file.
1
14#include "fasp.h"
15#include "fasp_functs.h"
16
17/*---------------------------------*/
18/*-- Public Functions --*/
19/*---------------------------------*/
20
34{
35 SHORT status = FASP_SUCCESS;
36
37 if ( inparam->problem_num<0
38 || inparam->solver_type<0
39 || inparam->solver_type>50
40 || inparam->precond_type<0
41 || inparam->decoup_type<0
42 || inparam->itsolver_tol<0
43 || inparam->itsolver_maxit<0
44 || inparam->stop_type<=0
45 || inparam->stop_type>3
46 || inparam->restart<0
47 || inparam->ILU_type<=0
48 || inparam->ILU_type>3
49 || inparam->ILU_lfil<0
50 || inparam->ILU_droptol<=0
51 || inparam->ILU_relax<0
52 || inparam->ILU_permtol<0
53 || inparam->SWZ_mmsize<0
54 || inparam->SWZ_maxlvl<0
55 || inparam->SWZ_type<0
56 || inparam->SWZ_blksolver<0
57 || inparam->AMG_type<=0
58 || inparam->AMG_type>3
59 || inparam->AMG_cycle_type<=0
60 || inparam->AMG_levels<0
61 || inparam->AMG_ILU_levels<0
62 || inparam->AMG_coarse_dof<=0
63 || inparam->AMG_tol<0
64 || inparam->AMG_maxit<0
65 || inparam->AMG_coarsening_type<=0
66 || inparam->AMG_coarsening_type>4
67 || inparam->AMG_coarse_solver<0
68 || inparam->AMG_interpolation_type<0
69 || inparam->AMG_interpolation_type>5
70 || inparam->AMG_smoother<0
71 || inparam->AMG_smoother>20
72 || inparam->AMG_strong_threshold<0.0
73 || inparam->AMG_strong_threshold>0.9999
74 || inparam->AMG_truncation_threshold<0.0
75 || inparam->AMG_truncation_threshold>0.9999
76 || inparam->AMG_max_row_sum<0.0
77 || inparam->AMG_presmooth_iter<0
78 || inparam->AMG_postsmooth_iter<0
79 || inparam->AMG_amli_degree<0
80 || inparam->AMG_aggressive_level<0
81 || inparam->AMG_aggressive_path<0
82 || inparam->AMG_aggregation_type<0
83 || inparam->AMG_pair_number<0
84 || inparam->AMG_strong_coupled<0
85 || inparam->AMG_max_aggregation<=0
86 || inparam->AMG_tentative_smooth<0
87 || inparam->AMG_smooth_filter<0
88 || inparam->AMG_smooth_restriction<0
89 || inparam->AMG_smooth_restriction>1
90 ) status = ERROR_INPUT_PAR;
91
92 return status;
93}
94
112void fasp_param_input (const char *fname,
113 input_param *inparam)
114{
115 char buffer[STRLEN]; // Note: max number of char for each line!
116 int val;
117 SHORT status = FASP_SUCCESS;
118 FILE *fp;
119
120 // set default input parameters
121 fasp_param_input_init(inparam);
122
123 // if input file is not specified, use the default values
124 if (fname==NULL) return;
125
126 fp = fopen(fname,"r");
127 if (fp==NULL) fasp_chkerr(ERROR_OPEN_FILE, __FUNCTION__);
128
129 while ( status == FASP_SUCCESS ) {
130 int ibuff;
131 double dbuff;
132 char sbuff[STRLEN];
133
134 val = fscanf(fp,"%s",buffer);
135 if (val==EOF) break;
136 if (val!=1) { status = ERROR_INPUT_PAR; break; }
137 if (buffer[0]=='[' || buffer[0]=='%' || buffer[0]=='|') {
138 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
139 continue;
140 }
141
142 // match keyword and scan for value
143 if (strcmp(buffer,"workdir")==0) {
144 val = fscanf(fp,"%s",buffer);
145 if (val!=1 || strcmp(buffer,"=")!=0) {
146 status = ERROR_INPUT_PAR; break;
147 }
148 val = fscanf(fp,"%s",sbuff);
149 if (val!=1) { status = ERROR_INPUT_PAR; break; }
150 memcpy(inparam->workdir,sbuff,STRLEN);
151 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
152 }
153
154 else if (strcmp(buffer,"problem_num")==0) {
155 val = fscanf(fp,"%s",buffer);
156 if (val!=1 || strcmp(buffer,"=")!=0) {
157 status = ERROR_INPUT_PAR; break;
158 }
159 val = fscanf(fp,"%d",&ibuff);
160 if (val!=1) { status = ERROR_INPUT_PAR; break; }
161 inparam->problem_num=ibuff;
162 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
163 }
164
165 else if (strcmp(buffer,"print_level")==0) {
166 val = fscanf(fp,"%s",buffer);
167 if (val!=1 || strcmp(buffer,"=")!=0) {
168 status = ERROR_INPUT_PAR; break;
169 }
170 val = fscanf(fp,"%d",&ibuff);
171 if (val!=1) { status = ERROR_INPUT_PAR; break; }
172 inparam->print_level = ibuff;
173 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
174 }
175
176 else if (strcmp(buffer,"output_type")==0) {
177 val = fscanf(fp,"%s",buffer);
178 if (val!=1 || strcmp(buffer,"=")!=0) {
179 status = ERROR_INPUT_PAR; break;
180 }
181 val = fscanf(fp,"%d",&ibuff);
182 if (val!=1) { status = ERROR_INPUT_PAR; break; }
183 inparam->output_type = ibuff;
184 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
185 }
186
187 else if (strcmp(buffer,"solver_type")==0) {
188 val = fscanf(fp,"%s",buffer);
189 if (val!=1 || strcmp(buffer,"=")!=0) {
190 status = ERROR_INPUT_PAR; break;
191 }
192 val = fscanf(fp,"%d",&ibuff);
193 if (val!=1) { status = ERROR_INPUT_PAR; break; }
194 inparam->solver_type = ibuff;
195 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
196 }
197
198 else if (strcmp(buffer,"stop_type")==0) {
199 val = fscanf(fp,"%s",buffer);
200 if (val!=1 || strcmp(buffer,"=")!=0) {
201 status = ERROR_INPUT_PAR; break;
202 }
203 val = fscanf(fp,"%d",&ibuff);
204 if (val!=1) { status = ERROR_INPUT_PAR; break; }
205 inparam->stop_type = ibuff;
206 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
207 }
208
209 else if (strcmp(buffer,"decoup_type")==0) {
210 val = fscanf(fp,"%s",buffer);
211 if (val!=1 || strcmp(buffer,"=")!=0) {
212 status = ERROR_INPUT_PAR; break;
213 }
214 val = fscanf(fp,"%d",&ibuff);
215 if (val!=1) { status = ERROR_INPUT_PAR; break; }
216 inparam->decoup_type = ibuff;
217 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
218 }
219
220 else if (strcmp(buffer,"precond_type")==0) {
221 val = fscanf(fp,"%s",buffer);
222 if (val!=1 || strcmp(buffer,"=")!=0) {
223 status = ERROR_INPUT_PAR; break;
224 }
225 val = fscanf(fp,"%d",&ibuff);
226 if (val!=1) { status = ERROR_INPUT_PAR; break; }
227 inparam->precond_type = ibuff;
228 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
229 }
230
231 else if (strcmp(buffer,"itsolver_tol")==0) {
232 val = fscanf(fp,"%s",buffer);
233 if (val!=1 || strcmp(buffer,"=")!=0) {
234 status = ERROR_INPUT_PAR; break;
235 }
236 val = fscanf(fp,"%lf",&dbuff);
237 if (val!=1) { status = ERROR_INPUT_PAR; break; }
238 inparam->itsolver_tol = dbuff;
239 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
240 }
241
242 else if (strcmp(buffer,"itsolver_maxit")==0) {
243 val = fscanf(fp,"%s",buffer);
244 if (val!=1 || strcmp(buffer,"=")!=0) {
245 status = ERROR_INPUT_PAR; break;
246 }
247 val = fscanf(fp,"%d",&ibuff);
248 if (val!=1) { status = ERROR_INPUT_PAR; break; }
249 inparam->itsolver_maxit = ibuff;
250 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
251 }
252
253 else if (strcmp(buffer,"AMG_ILU_levels")==0) {
254 val = fscanf(fp,"%s",buffer);
255 if (val!=1 || strcmp(buffer,"=")!=0) {
256 status = ERROR_INPUT_PAR; break;
257 }
258 val = fscanf(fp,"%d",&ibuff);
259 if (val!=1) { status = ERROR_INPUT_PAR; break; }
260 inparam->AMG_ILU_levels = ibuff;
261 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
262 }
263
264 else if (strcmp(buffer,"AMG_SWZ_levels")==0) {
265 val = fscanf(fp,"%s",buffer);
266 if (val!=1 || strcmp(buffer,"=")!=0) {
267 status = ERROR_INPUT_PAR; break;
268 }
269 val = fscanf(fp,"%d",&ibuff);
270 if (val!=1) { status = ERROR_INPUT_PAR; break; }
271 inparam->AMG_SWZ_levels = ibuff;
272 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
273 }
274
275 else if (strcmp(buffer,"itsolver_restart")==0) {
276 val = fscanf(fp,"%s",buffer);
277 if (val!=1 || strcmp(buffer,"=")!=0) {
278 status = ERROR_INPUT_PAR; break;
279 }
280 val = fscanf(fp,"%d",&ibuff);
281 if (val!=1) { status = ERROR_INPUT_PAR; break; }
282 inparam->restart = ibuff;
283 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
284 }
285
286 else if (strcmp(buffer,"AMG_type")==0) {
287 val = fscanf(fp,"%s",buffer);
288 if (val!=1 || strcmp(buffer,"=")!=0) {
289 status = ERROR_INPUT_PAR; break;
290 }
291 val = fscanf(fp,"%s",buffer);
292 if (val!=1) { status = ERROR_INPUT_PAR; break; }
293
294 if ((strcmp(buffer,"C")==0)||(strcmp(buffer,"c")==0))
295 inparam->AMG_type = CLASSIC_AMG;
296 else if ((strcmp(buffer,"SA")==0)||(strcmp(buffer,"sa")==0))
297 inparam->AMG_type = SA_AMG;
298 else if ((strcmp(buffer,"UA")==0)||(strcmp(buffer,"ua")==0))
299 inparam->AMG_type = UA_AMG;
300 else
301 { status = ERROR_INPUT_PAR; break; }
302 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
303 }
304
305 else if (strcmp(buffer,"AMG_strong_coupled")==0) {
306 val = fscanf(fp,"%s",buffer);
307 if (val!=1 || strcmp(buffer,"=")!=0) {
308 status = ERROR_INPUT_PAR; break;
309 }
310 val = fscanf(fp,"%lf",&dbuff);
311 if (val!=1) { status = ERROR_INPUT_PAR; break; }
312 inparam->AMG_strong_coupled = dbuff;
313 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
314 }
315
316 else if (strcmp(buffer,"AMG_max_aggregation")==0) {
317 val = fscanf(fp,"%s",buffer);
318 if (val!=1 || strcmp(buffer,"=")!=0) {
319 status = ERROR_INPUT_PAR; break;
320 }
321 val = fscanf(fp,"%d",&ibuff);
322 if (val!=1) { status = ERROR_INPUT_PAR; break; }
323 inparam->AMG_max_aggregation = ibuff;
324 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
325 }
326
327 else if (strcmp(buffer,"AMG_tentative_smooth")==0) {
328 val = fscanf(fp,"%s",buffer);
329 if (val!=1 || strcmp(buffer,"=")!=0) {
330 status = ERROR_INPUT_PAR; break;
331 }
332 val = fscanf(fp,"%lf",&dbuff);
333 if (val!=1) { status = ERROR_INPUT_PAR; break; }
334 inparam->AMG_tentative_smooth = dbuff;
335 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
336 }
337
338 else if (strcmp(buffer,"AMG_smooth_filter")==0) {
339 val = fscanf(fp,"%s",buffer);
340 if (val!=1 || strcmp(buffer,"=")!=0) {
341 status = ERROR_INPUT_PAR; break;
342 }
343 val = fscanf(fp,"%s",buffer);
344 if (val!=1) { status = ERROR_INPUT_PAR; break; }
345
346 if ((strcmp(buffer,"ON")==0)||(strcmp(buffer,"on")==0)||
347 (strcmp(buffer,"On")==0)||(strcmp(buffer,"oN")==0)) {
348 inparam->AMG_smooth_filter = ON;
349 }
350 else if ((strcmp(buffer,"OFF")==0)||(strcmp(buffer,"off")==0)||
351 (strcmp(buffer,"ofF")==0)||(strcmp(buffer,"oFf")==0)||
352 (strcmp(buffer,"Off")==0)||(strcmp(buffer,"oFF")==0)||
353 (strcmp(buffer,"OfF")==0)||(strcmp(buffer,"OFf")==0)) {
354 inparam->AMG_smooth_filter = OFF;
355 }
356 else
357 { status = ERROR_INPUT_PAR; break; }
358 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
359 }
360
361 else if (strcmp(buffer,"AMG_smooth_restriction")==0) {
362 val = fscanf(fp,"%s",buffer);
363 if (val!=1 || strcmp(buffer,"=")!=0) {
364 status = ERROR_INPUT_PAR; break;
365 }
366 val = fscanf(fp,"%s",buffer);
367 if (val!=1) { status = ERROR_INPUT_PAR; break; }
368
369 if ((strcmp(buffer,"ON")==0)||(strcmp(buffer,"on")==0)||
370 (strcmp(buffer,"On")==0)||(strcmp(buffer,"oN")==0)) {
371 inparam->AMG_smooth_restriction = ON;
372 }
373 else if ((strcmp(buffer,"OFF")==0)||(strcmp(buffer,"off")==0)||
374 (strcmp(buffer,"ofF")==0)||(strcmp(buffer,"oFf")==0)||
375 (strcmp(buffer,"Off")==0)||(strcmp(buffer,"oFF")==0)||
376 (strcmp(buffer,"OfF")==0)||(strcmp(buffer,"OFf")==0)) {
377 inparam->AMG_smooth_restriction = OFF;
378 }
379 else
380 { status = ERROR_INPUT_PAR; break; }
381 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
382 }
383
384 else if (strcmp(buffer,"AMG_coarse_solver")==0) {
385 val = fscanf(fp,"%s",buffer);
386 if (val!=1 || strcmp(buffer,"=")!=0) {
387 status = ERROR_INPUT_PAR; break;
388 }
389 val = fscanf(fp,"%d",&ibuff);
390 if (val!=1) { status = ERROR_INPUT_PAR; break; }
391 inparam->AMG_coarse_solver = ibuff;
392 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
393 }
394
395 else if (strcmp(buffer,"AMG_coarse_scaling")==0) {
396 val = fscanf(fp,"%s",buffer);
397 if (val!=1 || strcmp(buffer,"=")!=0) {
398 status = ERROR_INPUT_PAR; break;
399 }
400 val = fscanf(fp,"%s",buffer);
401 if (val!=1) { status = ERROR_INPUT_PAR; break; }
402
403 if ((strcmp(buffer,"ON")==0)||(strcmp(buffer,"on")==0)||
404 (strcmp(buffer,"On")==0)||(strcmp(buffer,"oN")==0)) {
405 inparam->AMG_coarse_scaling = ON;
406 }
407 else if ((strcmp(buffer,"OFF")==0)||(strcmp(buffer,"off")==0)||
408 (strcmp(buffer,"ofF")==0)||(strcmp(buffer,"oFf")==0)||
409 (strcmp(buffer,"Off")==0)||(strcmp(buffer,"oFF")==0)||
410 (strcmp(buffer,"OfF")==0)||(strcmp(buffer,"OFf")==0)) {
411 inparam->AMG_coarse_scaling = OFF;
412 }
413 else
414 { status = ERROR_INPUT_PAR; break; }
415 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
416 }
417
418 else if (strcmp(buffer,"AMG_levels")==0) {
419 val = fscanf(fp,"%s",buffer);
420 if (val!=1 || strcmp(buffer,"=")!=0) {
421 status = ERROR_INPUT_PAR; break;
422 }
423 val = fscanf(fp,"%d",&ibuff);
424 if (val!=1) { status = ERROR_INPUT_PAR; break; }
425 inparam->AMG_levels = ibuff;
426 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
427 }
428
429 else if (strcmp(buffer,"AMG_tol")==0) {
430 val = fscanf(fp,"%s",buffer);
431 if (val!=1 || strcmp(buffer,"=")!=0) {
432 status = ERROR_INPUT_PAR; break;
433 }
434 val = fscanf(fp,"%lf",&dbuff);
435 if (val!=1) { status = ERROR_INPUT_PAR; break; }
436 inparam->AMG_tol = dbuff;
437 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
438 }
439
440 else if (strcmp(buffer,"AMG_maxit")==0) {
441 val = fscanf(fp,"%s",buffer);
442 if (val!=1 || strcmp(buffer,"=")!=0) {
443 status = ERROR_INPUT_PAR; break;
444 }
445 val = fscanf(fp,"%d",&ibuff);
446 if (val!=1) { status = ERROR_INPUT_PAR; break; }
447 inparam->AMG_maxit = ibuff;
448 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
449 }
450
451 else if (strcmp(buffer,"AMG_coarse_dof")==0) {
452 val = fscanf(fp,"%s",buffer);
453 if (val!=1 || strcmp(buffer,"=")!=0) {
454 status = ERROR_INPUT_PAR; break;
455 }
456 val = fscanf(fp,"%d",&ibuff);
457 if (val!=1) { status = ERROR_INPUT_PAR; break; }
458 inparam->AMG_coarse_dof = ibuff;
459 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
460 }
461
462 else if (strcmp(buffer,"AMG_cycle_type")==0) {
463 val = fscanf(fp,"%s",buffer);
464 if (val!=1 || strcmp(buffer,"=")!=0) {
465 status = ERROR_INPUT_PAR; break;
466 }
467 val = fscanf(fp,"%s",buffer);
468 if (val!=1) { status = ERROR_INPUT_PAR; break; }
469
470 if ((strcmp(buffer,"V")==0)||(strcmp(buffer,"v")==0))
471 inparam->AMG_cycle_type = V_CYCLE;
472 else if ((strcmp(buffer,"W")==0)||(strcmp(buffer,"w")==0))
473 inparam->AMG_cycle_type = W_CYCLE;
474 else if ((strcmp(buffer,"A")==0)||(strcmp(buffer,"a")==0))
475 inparam->AMG_cycle_type = AMLI_CYCLE;
476 else if ((strcmp(buffer,"NA")==0)||(strcmp(buffer,"na")==0))
477 inparam->AMG_cycle_type = NL_AMLI_CYCLE;
478 else if ((strcmp(buffer,"VW")==0)||(strcmp(buffer,"vw")==0))
479 inparam->AMG_cycle_type = VW_CYCLE;
480 else if ((strcmp(buffer,"WV")==0)||(strcmp(buffer,"wv")==0))
481 inparam->AMG_cycle_type = WV_CYCLE;
482 else
483 { status = ERROR_INPUT_PAR; break; }
484 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
485 }
486
487 else if (strcmp(buffer,"AMG_smoother")==0) {
488 val = fscanf(fp,"%s",buffer);
489 if (val!=1 || strcmp(buffer,"=")!=0) {
490 status = ERROR_INPUT_PAR; break;
491 }
492 val = fscanf(fp,"%s",buffer);
493 if (val!=1) { status = ERROR_INPUT_PAR; break; }
494
495 if ((strcmp(buffer,"JACOBI")==0)||(strcmp(buffer,"jacobi")==0))
496 inparam->AMG_smoother = SMOOTHER_JACOBI;
497 else if ((strcmp(buffer,"GS")==0)||(strcmp(buffer,"gs")==0))
498 inparam->AMG_smoother = SMOOTHER_GS;
499 else if ((strcmp(buffer,"SGS")==0)||(strcmp(buffer,"sgs")==0))
500 inparam->AMG_smoother = SMOOTHER_SGS;
501 else if ((strcmp(buffer,"CG")==0)||(strcmp(buffer,"cg")==0))
502 inparam->AMG_smoother = SMOOTHER_CG;
503 else if ((strcmp(buffer,"SOR")==0)||(strcmp(buffer,"sor")==0))
504 inparam->AMG_smoother = SMOOTHER_SOR;
505 else if ((strcmp(buffer,"SSOR")==0)||(strcmp(buffer,"ssor")==0))
506 inparam->AMG_smoother = SMOOTHER_SSOR;
507 else if ((strcmp(buffer,"GSOR")==0)||(strcmp(buffer,"gsor")==0))
508 inparam->AMG_smoother = SMOOTHER_GSOR;
509 else if ((strcmp(buffer,"SGSOR")==0)||(strcmp(buffer,"sgsor")==0))
510 inparam->AMG_smoother = SMOOTHER_SGSOR;
511 else if ((strcmp(buffer,"POLY")==0)||(strcmp(buffer,"poly")==0))
512 inparam->AMG_smoother = SMOOTHER_POLY;
513 else if ((strcmp(buffer,"L1DIAG")==0)||(strcmp(buffer,"l1diag")==0))
514 inparam->AMG_smoother = SMOOTHER_L1DIAG;
515 else if ((strcmp(buffer,"BLKOIL")==0)||(strcmp(buffer,"blkoil")==0))
516 inparam->AMG_smoother = SMOOTHER_BLKOIL;
517 else if ((strcmp(buffer,"SPETEN")==0)||(strcmp(buffer,"speten")==0))
518 inparam->AMG_smoother = SMOOTHER_SPETEN;
519 else
520 { status = ERROR_INPUT_PAR; break; }
521 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
522 }
523
524 else if (strcmp(buffer,"AMG_smooth_order")==0) {
525 val = fscanf(fp,"%s",buffer);
526 if (val!=1 || strcmp(buffer,"=")!=0) {
527 status = ERROR_INPUT_PAR; break;
528 }
529 val = fscanf(fp,"%s",buffer);
530 if (val!=1) { status = ERROR_INPUT_PAR; break; }
531
532 if ((strcmp(buffer,"NO")==0)||(strcmp(buffer,"no")==0))
533 inparam->AMG_smooth_order = NO_ORDER;
534 else if ((strcmp(buffer,"CF")==0)||(strcmp(buffer,"cf")==0))
535 inparam->AMG_smooth_order = CF_ORDER;
536 else
537 { status = ERROR_INPUT_PAR; break; }
538 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
539 }
540
541 else if (strcmp(buffer,"AMG_coarsening_type")==0) {
542 val = fscanf(fp,"%s",buffer);
543 if (val!=1 || strcmp(buffer,"=")!=0) {
544 status = ERROR_INPUT_PAR; break;
545 }
546 val = fscanf(fp,"%d",&ibuff);
547 if (val!=1) { status = ERROR_INPUT_PAR; break; }
548 inparam->AMG_coarsening_type = ibuff;
549 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
550 }
551
552 else if (strcmp(buffer,"AMG_interpolation_type")==0) {
553 val = fscanf(fp,"%s",buffer);
554 if (val!=1 || strcmp(buffer,"=")!=0) {
555 status = ERROR_INPUT_PAR; break;
556 }
557 val = fscanf(fp,"%d",&ibuff);
558 if (val!=1) { status = ERROR_INPUT_PAR; break; }
559 inparam->AMG_interpolation_type = ibuff;
560 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
561 }
562
563 else if (strcmp(buffer,"AMG_aggregation_type")==0) {
564 val = fscanf(fp,"%s",buffer);
565 if (val!=1 || strcmp(buffer,"=")!=0) {
566 status = ERROR_INPUT_PAR; break;
567 }
568 val = fscanf(fp,"%d",&ibuff);
569 if (val!=1) { status = ERROR_INPUT_PAR; break; }
570 inparam->AMG_aggregation_type = ibuff;
571 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
572 }
573
574 else if (strcmp(buffer,"AMG_pair_number")==0) {
575 val = fscanf(fp,"%s",buffer);
576 if (val!=1 || strcmp(buffer,"=")!=0) {
577 status = ERROR_INPUT_PAR; break;
578 }
579 val = fscanf(fp,"%d",&ibuff);
580 if (val!=1) { status = ERROR_INPUT_PAR; break; }
581 inparam->AMG_pair_number = ibuff;
582 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
583 }
584
585 else if (strcmp(buffer,"AMG_quality_bound")==0) {
586 val = fscanf(fp,"%s",buffer);
587 if (val!=1 || strcmp(buffer,"=")!=0) {
588 status = ERROR_INPUT_PAR; break;
589 }
590 val = fscanf(fp,"%lf",&dbuff);
591 if (val!=1) { status = ERROR_INPUT_PAR; break; }
592 inparam->AMG_quality_bound = dbuff;
593 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
594 }
595
596 else if (strcmp(buffer,"AMG_aggressive_level")==0) {
597 val = fscanf(fp,"%s",buffer);
598 if (val!=1 || strcmp(buffer,"=")!=0) {
599 status = ERROR_INPUT_PAR; break;
600 }
601 val = fscanf(fp,"%d",&ibuff);
602 if (val!=1) { status = ERROR_INPUT_PAR; break; }
603 inparam->AMG_aggressive_level = ibuff;
604 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
605 }
606
607 else if (strcmp(buffer,"AMG_aggressive_path")==0) {
608 val = fscanf(fp,"%s",buffer);
609 if (val!=1 || strcmp(buffer,"=")!=0) {
610 status = ERROR_INPUT_PAR; break;
611 }
612 val = fscanf(fp,"%d",&ibuff);
613 if (val!=1) { status = ERROR_INPUT_PAR; break; }
614 inparam->AMG_aggressive_path = ibuff;
615 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
616 }
617
618 else if (strcmp(buffer,"AMG_presmooth_iter")==0) {
619 val = fscanf(fp,"%s",buffer);
620 if (val!=1 || strcmp(buffer,"=")!=0) {
621 status = ERROR_INPUT_PAR; break;
622 }
623 val = fscanf(fp,"%d",&ibuff);
624 if (val!=1) { status = ERROR_INPUT_PAR; break; }
625 inparam->AMG_presmooth_iter = ibuff;
626 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
627 }
628
629 else if (strcmp(buffer,"AMG_postsmooth_iter")==0) {
630 val = fscanf(fp,"%s",buffer);
631 if (val!=1 || strcmp(buffer,"=")!=0) {
632 status = ERROR_INPUT_PAR; break;
633 }
634 val = fscanf(fp,"%d",&ibuff);
635 if (val!=1) { status = ERROR_INPUT_PAR; break; }
636 inparam->AMG_postsmooth_iter = ibuff;
637 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
638 }
639
640 else if (strcmp(buffer,"AMG_relaxation")==0) {
641 val = fscanf(fp,"%s",buffer);
642 if (val!=1 || strcmp(buffer,"=")!=0) {
643 status = ERROR_INPUT_PAR; break;
644 }
645 val = fscanf(fp,"%lf",&dbuff);
646 if (val!=1) { status = ERROR_INPUT_PAR; break; }
647 inparam->AMG_relaxation=dbuff;
648 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
649 }
650
651 else if (strcmp(buffer,"AMG_polynomial_degree")==0) {
652 val = fscanf(fp,"%s",buffer);
653 if (val!=1 || strcmp(buffer,"=")!=0) {
654 status = ERROR_INPUT_PAR; break;
655 }
656 val = fscanf(fp,"%d",&ibuff);
657 if (val!=1) { status = ERROR_INPUT_PAR; break; }
658 inparam->AMG_polynomial_degree = ibuff;
659 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
660 }
661
662 else if (strcmp(buffer,"AMG_strong_threshold")==0) {
663 val = fscanf(fp,"%s",buffer);
664 if (val!=1 || strcmp(buffer,"=")!=0) {
665 status = ERROR_INPUT_PAR; break;
666 }
667 val = fscanf(fp,"%lf",&dbuff);
668 if (val!=1) { status = ERROR_INPUT_PAR; break; }
669 inparam->AMG_strong_threshold = dbuff;
670 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
671 }
672
673 else if (strcmp(buffer,"AMG_truncation_threshold")==0) {
674 val = fscanf(fp,"%s",buffer);
675 if (val!=1 || strcmp(buffer,"=")!=0) {
676 status = ERROR_INPUT_PAR; break;
677 }
678 val = fscanf(fp,"%lf",&dbuff);
679 if (val!=1) { status = ERROR_INPUT_PAR; break; }
680 inparam->AMG_truncation_threshold = dbuff;
681 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
682 }
683
684 else if (strcmp(buffer,"AMG_max_row_sum")==0) {
685 val = fscanf(fp,"%s",buffer);
686 if (val!=1 || strcmp(buffer,"=")!=0) {
687 status = ERROR_INPUT_PAR; break;
688 }
689 val = fscanf(fp,"%lf",&dbuff);
690 if (val!=1) { status = ERROR_INPUT_PAR; break; }
691 inparam->AMG_max_row_sum = dbuff;
692 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
693 }
694
695 else if (strcmp(buffer,"AMG_amli_degree")==0) {
696 val = fscanf(fp,"%s",buffer);
697 if (val!=1 || strcmp(buffer,"=")!=0) {
698 status = ERROR_INPUT_PAR; break;
699 }
700 val = fscanf(fp,"%d",&ibuff);
701 if (val!=1) { status = ERROR_INPUT_PAR; break; }
702 inparam->AMG_amli_degree = ibuff;
703 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
704 }
705
706 else if (strcmp(buffer,"AMG_nl_amli_krylov_type")==0) {
707 val = fscanf(fp,"%s",buffer);
708 if (val!=1 || strcmp(buffer,"=")!=0) {
709 status = ERROR_INPUT_PAR; break;
710 }
711 val = fscanf(fp,"%d",&ibuff);
712 if (val!=1) { status = ERROR_INPUT_PAR; break; }
713 inparam->AMG_nl_amli_krylov_type = ibuff;
714 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
715 }
716
717 else if (strcmp(buffer,"ILU_type")==0) {
718 val = fscanf(fp,"%s",buffer);
719 if (val!=1 || strcmp(buffer,"=")!=0) {
720 status = ERROR_INPUT_PAR; break;
721 }
722 val = fscanf(fp,"%d",&ibuff);
723 if (val!=1) { status = ERROR_INPUT_PAR; break; }
724 inparam->ILU_type = ibuff;
725 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
726 }
727
728 else if (strcmp(buffer,"ILU_lfil")==0) {
729 val = fscanf(fp,"%s",buffer);
730 if (val!=1 || strcmp(buffer,"=")!=0) {
731 status = ERROR_INPUT_PAR; break;
732 }
733 val = fscanf(fp,"%d",&ibuff);
734 if (val!=1) { status = ERROR_INPUT_PAR; break; }
735 inparam->ILU_lfil = ibuff;
736 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
737 }
738
739 else if (strcmp(buffer,"ILU_droptol")==0) {
740 val = fscanf(fp,"%s",buffer);
741 if (val!=1 || strcmp(buffer,"=")!=0) {
742 status = ERROR_INPUT_PAR; break;
743 }
744 val = fscanf(fp,"%lf",&dbuff);
745 if (val!=1) { status = ERROR_INPUT_PAR; break; }
746 inparam->ILU_droptol = dbuff;
747 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
748 }
749
750 else if (strcmp(buffer,"ILU_relax")==0) {
751 val = fscanf(fp,"%s",buffer);
752 if (val!=1 || strcmp(buffer,"=")!=0) {
753 status = ERROR_INPUT_PAR; break;
754 }
755 val = fscanf(fp,"%lf",&dbuff);
756 if (val!=1) { status = ERROR_INPUT_PAR; break; }
757 inparam->ILU_relax = dbuff;
758 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
759 }
760
761 else if (strcmp(buffer,"ILU_permtol")==0) {
762 val = fscanf(fp,"%s",buffer);
763 if (val!=1 || strcmp(buffer,"=")!=0) {
764 status = ERROR_INPUT_PAR; break;
765 }
766 val = fscanf(fp,"%lf",&dbuff);
767 if (val!=1) { status = ERROR_INPUT_PAR; break; }
768 inparam->ILU_permtol = dbuff;
769 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
770 }
771
772 else if (strcmp(buffer,"SWZ_mmsize")==0) {
773 val = fscanf(fp,"%s",buffer);
774 if (val!=1 || strcmp(buffer,"=")!=0) {
775 status = ERROR_INPUT_PAR; break;
776 }
777 val = fscanf(fp,"%d",&ibuff);
778 if (val!=1) { status = ERROR_INPUT_PAR; break; }
779 inparam->SWZ_mmsize = ibuff;
780 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
781 }
782
783 else if (strcmp(buffer,"SWZ_maxlvl")==0) {
784 val = fscanf(fp,"%s",buffer);
785 if (val!=1 || strcmp(buffer,"=")!=0) {
786 status = ERROR_INPUT_PAR; break;
787 }
788 val = fscanf(fp,"%d",&ibuff);
789 if (val!=1) {status = ERROR_INPUT_PAR; break; }
790 inparam->SWZ_maxlvl = ibuff;
791 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
792 }
793
794 else if (strcmp(buffer,"SWZ_type")==0) {
795 val = fscanf(fp,"%s",buffer);
796 if (val!=1 || strcmp(buffer,"=")!=0) {
797 status = ERROR_INPUT_PAR; break;
798 }
799 val = fscanf(fp,"%d",&ibuff);
800 if (val!=1) { status = ERROR_INPUT_PAR; break; }
801 inparam->SWZ_type = ibuff;
802 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
803 }
804
805 else if (strcmp(buffer,"SWZ_blksolver")==0) {
806 val = fscanf(fp,"%s",buffer);
807 if (val!=1 || strcmp(buffer,"=")!=0) {
808 status = ERROR_INPUT_PAR; break;
809 }
810 val = fscanf(fp,"%d",&ibuff);
811 if (val!=1) { status = ERROR_INPUT_PAR; break; }
812 inparam->SWZ_blksolver = ibuff;
813 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
814 }
815
816 else {
817 printf("### WARNING: Unknown input keyword %s!\n", buffer);
818 if (fscanf(fp, "%*[^\n]")) {/* skip rest of line and do nothing */ };
819 }
820 }
821
822 fclose(fp);
823
824 // if meet unexpected input, stop the program
825 fasp_chkerr(status, __FUNCTION__);
826
827 // sanity checks
828 status = fasp_param_check(inparam);
829
830#if DEBUG_MODE > 1
831 printf("### DEBUG: Reading input status = %d\n", status);
832#endif
833
834 fasp_chkerr(status, __FUNCTION__);
835}
836
837/*---------------------------------*/
838/*-- End of File --*/
839/*---------------------------------*/
SHORT fasp_param_check(input_param *inparam)
Simple check on input parameters.
Definition: AuxInput.c:33
void fasp_param_input(const char *fname, input_param *inparam)
Read input parameters from disk file.
Definition: AuxInput.c:112
void fasp_chkerr(const SHORT status, const char *fctname)
Check error status and print out error messages before quit.
Definition: AuxMessage.c:213
void fasp_param_input_init(input_param *iniparam)
Initialize input parameters.
Definition: AuxParam.c:325
Main header file for the FASP project.
#define STRLEN
Definition: fasp.h:69
#define SHORT
FASP integer and floating point numbers.
Definition: fasp.h:63
#define AMLI_CYCLE
Definition: fasp_const.h:179
#define SMOOTHER_CG
Definition: fasp_const.h:190
#define SMOOTHER_SOR
Definition: fasp_const.h:191
#define SMOOTHER_BLKOIL
Definition of specialized smoother types.
Definition: fasp_const.h:201
#define ERROR_OPEN_FILE
Definition: fasp_const.h:22
#define NL_AMLI_CYCLE
Definition: fasp_const.h:180
#define SMOOTHER_JACOBI
Definition of standard smoother types.
Definition: fasp_const.h:187
#define SMOOTHER_SPETEN
Definition: fasp_const.h:202
#define OFF
Definition: fasp_const.h:68
#define SMOOTHER_GSOR
Definition: fasp_const.h:193
#define FASP_SUCCESS
Definition of return status and error messages.
Definition: fasp_const.h:19
#define SMOOTHER_L1DIAG
Definition: fasp_const.h:196
#define VW_CYCLE
Definition: fasp_const.h:181
#define V_CYCLE
Definition of cycle types.
Definition: fasp_const.h:177
#define WV_CYCLE
Definition: fasp_const.h:182
#define SMOOTHER_SGSOR
Definition: fasp_const.h:194
#define SMOOTHER_GS
Definition: fasp_const.h:188
#define SA_AMG
Definition: fasp_const.h:163
#define W_CYCLE
Definition: fasp_const.h:178
#define CF_ORDER
Definition: fasp_const.h:234
#define SMOOTHER_SGS
Definition: fasp_const.h:189
#define ERROR_INPUT_PAR
Definition: fasp_const.h:24
#define SMOOTHER_POLY
Definition: fasp_const.h:195
#define CLASSIC_AMG
Definition of AMG types.
Definition: fasp_const.h:162
#define ON
Definition of switch.
Definition: fasp_const.h:67
#define SMOOTHER_SSOR
Definition: fasp_const.h:192
#define NO_ORDER
Definition of smoothing order.
Definition: fasp_const.h:233
#define UA_AMG
Definition: fasp_const.h:164
Input parameters.
Definition: fasp.h:1111
INT AMG_coarse_dof
Definition: fasp.h:1155
INT ILU_lfil
Definition: fasp.h:1133
REAL ILU_relax
Definition: fasp.h:1135
INT SWZ_mmsize
Definition: fasp.h:1139
SHORT AMG_smooth_order
Definition: fasp.h:1149
SHORT print_level
Definition: fasp.h:1114
REAL AMG_quality_bound
Definition: fasp.h:1174
INT SWZ_maxlvl
Definition: fasp.h:1140
INT AMG_SWZ_levels
Definition: fasp.h:1162
SHORT AMG_levels
Definition: fasp.h:1146
SHORT AMG_coarsening_type
Definition: fasp.h:1165
SHORT AMG_cycle_type
Definition: fasp.h:1147
INT AMG_pair_number
Definition: fasp.h:1173
REAL AMG_strong_threshold
Definition: fasp.h:1168
REAL AMG_truncation_threshold
Definition: fasp.h:1169
SHORT AMG_polynomial_degree
Definition: fasp.h:1151
SHORT AMG_coarse_solver
Definition: fasp.h:1158
SHORT precond_type
Definition: fasp.h:1125
SHORT AMG_type
Definition: fasp.h:1145
SHORT AMG_smooth_filter
Definition: fasp.h:1180
char workdir[STRLEN]
Definition: fasp.h:1119
SHORT output_type
Definition: fasp.h:1115
REAL AMG_tentative_smooth
Definition: fasp.h:1179
SHORT AMG_smoother
Definition: fasp.h:1148
REAL AMG_strong_coupled
Definition: fasp.h:1177
INT AMG_max_aggregation
Definition: fasp.h:1178
SHORT decoup_type
Definition: fasp.h:1124
SHORT ILU_type
Definition: fasp.h:1132
SHORT AMG_amli_degree
Definition: fasp.h:1160
INT restart
Definition: fasp.h:1129
SHORT AMG_smooth_restriction
Definition: fasp.h:1181
INT SWZ_blksolver
Definition: fasp.h:1142
INT SWZ_type
Definition: fasp.h:1141
REAL ILU_droptol
Definition: fasp.h:1134
INT AMG_aggressive_path
Definition: fasp.h:1172
SHORT AMG_nl_amli_krylov_type
Definition: fasp.h:1161
SHORT AMG_postsmooth_iter
Definition: fasp.h:1153
INT AMG_aggressive_level
Definition: fasp.h:1171
REAL AMG_max_row_sum
Definition: fasp.h:1170
SHORT AMG_presmooth_iter
Definition: fasp.h:1152
INT itsolver_maxit
Definition: fasp.h:1128
REAL AMG_tol
Definition: fasp.h:1154
SHORT stop_type
Definition: fasp.h:1126
INT problem_num
Definition: fasp.h:1120
SHORT AMG_interpolation_type
Definition: fasp.h:1167
SHORT AMG_ILU_levels
Definition: fasp.h:1157
REAL ILU_permtol
Definition: fasp.h:1136
REAL itsolver_tol
Definition: fasp.h:1127
INT AMG_maxit
Definition: fasp.h:1156
SHORT AMG_coarse_scaling
Definition: fasp.h:1159
REAL AMG_relaxation
Definition: fasp.h:1150
SHORT solver_type
Definition: fasp.h:1123
SHORT AMG_aggregation_type
Definition: fasp.h:1166