00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <stdio.h>
00036 #include <stdlib.h>
00037 #include <math.h>
00038 #include "az_aztec.h"
00039 #include "az_ifpack.h"
00040 void AZ_ifpack_prec_create(double *x, double *b,
00041 int *options, double *params,
00042 int *proc_config,
00043 AZ_MATRIX *Amat, AZ_PRECOND **Prec)
00044 {
00045 AZ_IFPACK *Prec_pass_data;
00046 void *precon, *bmat ;
00047 int nr, nc, *data_org;
00048 double rthresh, athresh;
00049
00050 Prec_pass_data = (AZ_IFPACK *) AZ_allocate(sizeof(AZ_IFPACK));
00051 az2ifp_blockmatrix(&bmat, Amat);
00052
00053
00054
00055 if (options[AZ_precond] == AZ_none)
00056 ifp_preconditioner(&precon, bmat, IFP_NONE,
00057 (double) options[AZ_graph_fill], 0.0,
00058 IFP_INVERSE, 0.0, 0.0);
00059
00060 else if (options[AZ_precond] == AZ_Jacobi)
00061 {
00062 rthresh = params[AZ_rthresh];
00063 athresh = params[AZ_athresh];
00064 ifp_preconditioner(&precon, bmat, IFP_BJACOBI, 0.0, 0.0,
00065 IFP_SVD, rthresh, athresh);
00066
00067 }
00068
00069 else if (options[AZ_precond] == AZ_dom_decomp &&
00070 options[AZ_subdomain_solve] == AZ_bilu_ifp)
00071 {
00072 rthresh = params[AZ_rthresh];
00073 athresh = params[AZ_athresh];
00074 ifp_preconditioner(&precon, bmat,
00075 IFP_BILUK, (double) options[AZ_graph_fill], 0.0,
00076 IFP_SVD, rthresh, athresh);
00077
00078
00079 }
00080 else
00081 {
00082 printf("Not a supported preconditioner in az_ifpack_prec_create\n");
00083 abort();
00084 }
00085
00086 (*Prec) = AZ_precond_create(Amat,AZ_ifpack_precon,NULL);
00087
00088
00089
00090 Prec_pass_data->precon = precon;
00091 Prec_pass_data->bmat = bmat;
00092
00093
00094
00095
00096 data_org = Amat->data_org;
00097 nr = data_org[AZ_N_internal] + data_org[AZ_N_border];
00098 nc = 1;
00099
00100
00101 Prec_pass_data->nr = nr;
00102 Prec_pass_data->nc = nc;
00103 (*Prec)->Pmat = Amat;
00104 Prec_pass_data->user_aux_ptr = (*Prec)->Pmat->aux_ptr;
00105 (*Prec)->Pmat->aux_ptr = (void *) Prec_pass_data;
00106 (*Prec)->prec_function = AZ_ifpack_precon;
00107 Prec_pass_data->user_precon = options[AZ_precond];
00108 options[AZ_precond] = AZ_user_precond;
00109 }